Minor fixed + refactored job details screens based on review.

This commit is contained in:
Patrick Fic
2020-08-18 16:43:04 -07:00
parent 9b9feffdfa
commit 534e0a0398
79 changed files with 4119 additions and 909 deletions

View File

@@ -9,7 +9,6 @@ const authProvider = {
password password
); );
const token = await user.getIdToken(true); const token = await user.getIdToken(true);
console.log("token", token);
localStorage.setItem("token", token); localStorage.setItem("token", token);
return Promise.resolve(); return Promise.resolve();
} catch (error) { } catch (error) {
@@ -23,23 +22,17 @@ const authProvider = {
return Promise.resolve(); return Promise.resolve();
}, },
checkAuth: async (params) => { checkAuth: async (params) => {
console.log("Check Auth", params);
const user = await getCurrentUser(); const user = await getCurrentUser();
if (!!user) { if (!!user) {
console.log("AuthProvider => checkAuth => Authorized");
return Promise.resolve(); return Promise.resolve();
} else { } else {
console.log("AuthProvider => checkAuth => Unauthorized");
return Promise.reject(); return Promise.reject();
} }
}, },
checkError: (error) => { checkError: (error) => {
console.log("Check error");
return Promise.resolve(); return Promise.resolve();
}, },
getPermissions: (params) => { getPermissions: (params) => {
console.log("get permissions", params);
return Promise.resolve(); return Promise.resolve();
}, },
}; };

View File

@@ -10625,6 +10625,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>category</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>ccc</name> <name>ccc</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -10772,6 +10793,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>class</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>clm_no</name> <name>clm_no</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -13129,6 +13171,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>tax_registration_number</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>towing_payable</name> <name>towing_payable</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -13302,27 +13365,6 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>dedinfo</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>estdates</name> <name>estdates</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -13344,27 +13386,6 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>inscoinfo</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>laborrates</name> <name>laborrates</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -13407,6 +13428,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>other</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>repairdates</name> <name>repairdates</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -14372,6 +14414,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>labortotals</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>lines</name> <name>lines</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -16172,28 +16235,7 @@
</translations> </translations>
</concept_node> </concept_node>
<concept_node> <concept_node>
<name>financials</name> <name>general</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>insurance</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
<description></description> <description></description>
<comment></comment> <comment></comment>
@@ -16255,6 +16297,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>rates</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>repairdata</name> <name>repairdata</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -16276,6 +16339,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>totals</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>
</children> </children>
</folder_node> </folder_node>
<folder_node> <folder_node>

View File

@@ -41,7 +41,7 @@ export function App({ checkUserSession, currentUser }) {
}, [checkUserSession]); }, [checkUserSession]);
const b = Grid.useBreakpoint(); const b = Grid.useBreakpoint();
console.log("Breakpoints:", b); // console.log("Breakpoints:", b);
const { t } = useTranslation(); const { t } = useTranslation();

View File

@@ -15,7 +15,7 @@ describe("AllocationsAssignmentComponent component", () => {
assignment: {}, assignment: {},
setAssignment: jest.fn(), setAssignment: jest.fn(),
visibilityState: [false, jest.fn()], visibilityState: [false, jest.fn()],
maxHours: 4 maxHours: 4,
}; };
wrapper = mount(<AllocationsAssignmentComponent {...mockProps} />); wrapper = mount(<AllocationsAssignmentComponent {...mockProps} />);
@@ -27,7 +27,6 @@ describe("AllocationsAssignmentComponent component", () => {
it("should render a list of employees", () => { it("should render a list of employees", () => {
const empList = wrapper.find("#employeeSelector"); const empList = wrapper.find("#employeeSelector");
console.log(empList.debug());
expect(empList.children()).to.have.lengthOf(2); expect(empList.children()).to.have.lengthOf(2);
}); });

View File

@@ -6,7 +6,7 @@ import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop bodyshop: selectBodyshop,
}); });
export default connect( export default connect(
@@ -18,12 +18,11 @@ export default connect(
handleAssignment, handleAssignment,
assignment, assignment,
setAssignment, setAssignment,
visibilityState visibilityState,
}) { }) {
const { t } = useTranslation(); const { t } = useTranslation();
const onChange = e => { const onChange = (e) => {
console.log("e", e);
setAssignment({ ...assignment, employeeid: e }); setAssignment({ ...assignment, employeeid: e });
}; };
@@ -34,13 +33,14 @@ export default connect(
<Select <Select
showSearch showSearch
style={{ width: 200 }} style={{ width: 200 }}
placeholder='Select a person' placeholder="Select a person"
optionFilterProp='children' optionFilterProp="children"
onChange={onChange} onChange={onChange}
filterOption={(input, option) => filterOption={(input, option) =>
option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0 option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
}> }
{bodyshop.employees.map(emp => ( >
{bodyshop.employees.map((emp) => (
<Select.Option value={emp.id} key={emp.id}> <Select.Option value={emp.id} key={emp.id}>
{`${emp.first_name} ${emp.last_name}`} {`${emp.first_name} ${emp.last_name}`}
</Select.Option> </Select.Option>
@@ -48,9 +48,10 @@ export default connect(
</Select> </Select>
<Button <Button
type='primary' type="primary"
disabled={!assignment.employeeid} disabled={!assignment.employeeid}
onClick={handleAssignment}> onClick={handleAssignment}
>
Assign Assign
</Button> </Button>
<Button onClick={() => setVisibility(false)}>Close</Button> <Button onClick={() => setVisibility(false)}>Close</Button>

View File

@@ -12,13 +12,11 @@ export default function ContractLicenseDecodeButton({ form }) {
const [modalVisible, setModalVisible] = useState(false); const [modalVisible, setModalVisible] = useState(false);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [decodedBarcode, setDecodedBarcode] = useState(null); const [decodedBarcode, setDecodedBarcode] = useState(null);
console.log("form", form);
const handleDecode = (e) => { const handleDecode = (e) => {
logImEXEvent("contract_license_decode"); logImEXEvent("contract_license_decode");
setLoading(true); setLoading(true);
const aamvaParse = aamva.parse(e.currentTarget.value); const aamvaParse = aamva.parse(e.currentTarget.value);
console.log("AAMVA", aamvaParse);
setDecodedBarcode(aamvaParse); setDecodedBarcode(aamvaParse);
setLoading(false); setLoading(false);
}; };
@@ -61,7 +59,8 @@ export default function ContractLicenseDecodeButton({ form }) {
okText={t("contracts.actions.senddltoform")} okText={t("contracts.actions.senddltoform")}
onOk={handleInsertForm} onOk={handleInsertForm}
okButtonProps={{ disabled: !!!decodedBarcode }} okButtonProps={{ disabled: !!!decodedBarcode }}
onCancel={handleCancel}> onCancel={handleCancel}
>
<div> <div>
<div> <div>
<Input <Input

View File

@@ -38,7 +38,6 @@ const mapDispatchToProps = (dispatch) => ({
export function DashboardGridComponent({ currentUser, bodyshop }) { export function DashboardGridComponent({ currentUser, bodyshop }) {
const { loading, error, data } = useQuery(QUERY_DASHBOARD_DETAILS); const { loading, error, data } = useQuery(QUERY_DASHBOARD_DETAILS);
console.log("DashboardGridComponent -> data", data)
const { t } = useTranslation(); const { t } = useTranslation();
const [state, setState] = useState({ const [state, setState] = useState({
layout: bodyshop.associations[0].user.dashboardlayout || [ layout: bodyshop.associations[0].user.dashboardlayout || [
@@ -70,7 +69,6 @@ export function DashboardGridComponent({ currentUser, bodyshop }) {
const idxToRemove = state.layout.findIndex((i) => i.i === key); const idxToRemove = state.layout.findIndex((i) => i.i === key);
const newLayout = state.layout; const newLayout = state.layout;
newLayout.splice(idxToRemove, 1); newLayout.splice(idxToRemove, 1);
console.log(newLayout);
handleLayoutChange(newLayout); handleLayoutChange(newLayout);
}; };
@@ -100,14 +98,15 @@ export function DashboardGridComponent({ currentUser, bodyshop }) {
<Menu.Item <Menu.Item
key={key} key={key}
value={key} value={key}
disabled={existingLayoutKeys.includes(key)}> disabled={existingLayoutKeys.includes(key)}
>
{componentList[key].label} {componentList[key].label}
</Menu.Item> </Menu.Item>
))} ))}
</Menu> </Menu>
); );
if (error) return <AlertComponent message={error.message} type='error' />; if (error) return <AlertComponent message={error.message} type="error" />;
return ( return (
<div> <div>
@@ -115,12 +114,13 @@ export function DashboardGridComponent({ currentUser, bodyshop }) {
<Button>{t("dashboard.actions.addcomponent")}</Button> <Button>{t("dashboard.actions.addcomponent")}</Button>
</Dropdown> </Dropdown>
<ResponsiveReactGridLayout <ResponsiveReactGridLayout
className='layout' className="layout"
breakpoints={{ lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }} breakpoints={{ lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }}
cols={{ lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }} cols={{ lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }}
width='100%' width="100%"
onLayoutChange={handleLayoutChange} onLayoutChange={handleLayoutChange}
onBreakpointChange={onBreakpointChange}> onBreakpointChange={onBreakpointChange}
>
{state.layout.map((item, index) => { {state.layout.map((item, index) => {
const TheComponent = componentList[item.i].component; const TheComponent = componentList[item.i].component;
return ( return (
@@ -139,8 +139,8 @@ export function DashboardGridComponent({ currentUser, bodyshop }) {
onClick={() => handleRemoveComponent(item.i)} onClick={() => handleRemoveComponent(item.i)}
/> />
<TheComponent <TheComponent
className='dashboard-card' className="dashboard-card"
size='small' size="small"
style={{ height: "100%", width: "100%" }} style={{ height: "100%", width: "100%" }}
/> />
</LoadingSkeleton> </LoadingSkeleton>

View File

@@ -62,7 +62,6 @@ export function EmailOverlayContainer({
}; };
attachments.push(t); attachments.push(t);
}); });
console.log("messageOptions", messageOptions);
setSending(true); setSending(true);
try { try {

View File

@@ -21,7 +21,6 @@ export default function FormsFieldChanged({ form }) {
<Prompt <Prompt
when={true} when={true}
message={(location) => { message={(location) => {
//console.log("location", location);
if (loc.pathname === location.pathname) return false; if (loc.pathname === location.pathname) return false;
return t("general.messages.unsavedchangespopup"); return t("general.messages.unsavedchangespopup");
}} }}

View File

@@ -38,8 +38,6 @@ function InvoiceEnterModalContainer({
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const handleFinish = (values) => { const handleFinish = (values) => {
console.log("handleFinish -> values", values);
setLoading(true); setLoading(true);
const { upload, ...remainingValues } = values; const { upload, ...remainingValues } = values;
insertInvoice({ insertInvoice({
@@ -48,11 +46,6 @@ function InvoiceEnterModalContainer({
Object.assign({}, remainingValues, { Object.assign({}, remainingValues, {
invoicelines: { invoicelines: {
data: remainingValues.invoicelines.map((i) => { data: remainingValues.invoicelines.map((i) => {
console.log(
"Initial insert value",
i.joblineid,
i.joblineid === "noline"
);
return { return {
...i, ...i,
joblineid: i.joblineid === "noline" ? null : i.joblineid, joblineid: i.joblineid === "noline" ? null : i.joblineid,

View File

@@ -42,7 +42,6 @@ export function InvoiceExportAllButton({
}, },
} }
); );
console.log("handle -> XML", QbXmlResponse);
} catch (error) { } catch (error) {
console.log("Error getting QBXML from Server.", error); console.log("Error getting QBXML from Server.", error);
notification["error"]({ notification["error"]({
@@ -121,7 +120,8 @@ export function InvoiceExportAllButton({
onClick={handleQbxml} onClick={handleQbxml}
loading={loading} loading={loading}
disabled={disabled} disabled={disabled}
type='dashed'> type="dashed"
>
{t("jobs.actions.exportselected")} {t("jobs.actions.exportselected")}
</Button> </Button>
); );

View File

@@ -41,7 +41,6 @@ export function InvoiceExportButton({
}, },
} }
); );
console.log("handle -> XML", QbXmlResponse);
} catch (error) { } catch (error) {
console.log("Error getting QBXML from Server.", error); console.log("Error getting QBXML from Server.", error);
notification["error"]({ notification["error"]({
@@ -118,7 +117,8 @@ export function InvoiceExportButton({
onClick={handleQbxml} onClick={handleQbxml}
loading={loading} loading={loading}
disabled={disabled} disabled={disabled}
type='dashed'> type="dashed"
>
{t("jobs.actions.export")} {t("jobs.actions.export")}
</Button> </Button>
); );

View File

@@ -159,7 +159,6 @@ export default function InvoiceFormComponent({
style={{ display: invoiceEdit ? "none" : null }} style={{ display: invoiceEdit ? "none" : null }}
valuePropName="fileList" valuePropName="fileList"
getValueFromEvent={(e) => { getValueFromEvent={(e) => {
console.log("Upload event:", e);
if (Array.isArray(e)) { if (Array.isArray(e)) {
return e; return e;
} }

View File

@@ -208,19 +208,12 @@ export function InvoicesListTableComponent({
]; ];
const handleOnInvoiceRowclick = (selectedRows) => { const handleOnInvoiceRowclick = (selectedRows) => {
console.log("selectedRows", selectedRows);
console.log("record.id", record.id);
setSelectedInvoiceLinesByInvoice({ setSelectedInvoiceLinesByInvoice({
...selectedInvoiceLinesByInvoice, ...selectedInvoiceLinesByInvoice,
[record.id]: selectedRows.map((r) => r.id), [record.id]: selectedRows.map((r) => r.id),
}); });
}; };
console.log(
"selectedInvoiceLinesByInvoice[record.id]",
selectedInvoiceLinesByInvoice[record.id]
);
return ( return (
<div> <div>
<Typography.Title level={3}>{`${t("invoices.fields.invoice_number")} ${ <Typography.Title level={3}>{`${t("invoices.fields.invoice_number")} ${

View File

@@ -20,11 +20,6 @@ export function JobCostingModalComponent({ bodyshop, job }) {
const jobLineTotalsByProfitCenter = job.joblines.reduce( const jobLineTotalsByProfitCenter = job.joblines.reduce(
(acc, val) => { (acc, val) => {
const laborProfitCenter = defaultProfits[val.mod_lbr_ty] || "?"; const laborProfitCenter = defaultProfits[val.mod_lbr_ty] || "?";
// if (!!!laborProfitCenter)
// console.log(
// "Unknown cost/profit center mapping for labor.",
// val.mod_lbr_ty
// );
const rateName = `rate_${(val.mod_lbr_ty || "").toLowerCase()}`; const rateName = `rate_${(val.mod_lbr_ty || "").toLowerCase()}`;
const laborAmount = Dinero({ const laborAmount = Dinero({

View File

@@ -15,7 +15,6 @@ export default function JobDetailCardsPartsComponent({ loading, data }) {
joblines_status, joblines_status,
]); ]);
console.log("memoizedData :>> ", memoizedData);
const [state, setState] = useState({ activeIndex: 0 }); const [state, setState] = useState({ activeIndex: 0 });
const onPieEnter = (data, index) => { const onPieEnter = (data, index) => {
@@ -47,8 +46,6 @@ export default function JobDetailCardsPartsComponent({ loading, data }) {
} }
const Calculatedata = (data) => { const Calculatedata = (data) => {
console.log("calculating data", data);
if (data.length > 0) { if (data.length > 0) {
const statusMapping = {}; const statusMapping = {};
data.map((i) => { data.map((i) => {

View File

@@ -267,7 +267,6 @@ export function JobLinesComponent({
]; ];
const handleTableChange = (pagination, filters, sorter) => { const handleTableChange = (pagination, filters, sorter) => {
console.log("filters", filters);
setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
}; };

View File

@@ -67,62 +67,77 @@ export function JobEmployeeAssignments({
return ( return (
<div> <div>
<Popover destroyTooltipOnHide content={popContent} visible={visibility}> <Popover destroyTooltipOnHide content={popContent} visible={visibility}>
<DataLabel label={t("jobs.fields.employee_body")}> <div style={{ display: "flex" }}>
{body ? ( <DataLabel
<div> label={t("jobs.fields.employee_body")}
<span>{`${body.first_name || ""} ${body.last_name || ""}`}</span> style={{ margin: "0rem .5rem" }}
<MinusOutlined >
operation="body" {body ? (
onClick={() => handleRemove("body")} <div>
<span>{`${body.first_name || ""} ${
body.last_name || ""
}`}</span>
<MinusOutlined
operation="body"
onClick={() => handleRemove("body")}
/>
</div>
) : (
<PlusCircleFilled
onClick={() => {
setAssignment({ operation: "body" });
setVisibility(true);
}}
/> />
</div> )}
) : ( </DataLabel>
<PlusCircleFilled <DataLabel
onClick={() => { label={t("jobs.fields.employee_prep")}
setAssignment({ operation: "body" }); style={{ margin: "0rem .5rem" }}
setVisibility(true); >
}} {prep ? (
/> <div>
)} <span>{`${prep.first_name || ""} ${
</DataLabel> prep.last_name || ""
<DataLabel label={t("jobs.fields.employee_prep")}> }`}</span>
{prep ? ( <MinusOutlined
<div> operation="prep"
<span>{`${prep.first_name || ""} ${prep.last_name || ""}`}</span> onClick={() => handleRemove("prep")}
<MinusOutlined />
operation="prep" </div>
onClick={() => handleRemove("prep")} ) : (
<PlusCircleFilled
onClick={() => {
setAssignment({ operation: "prep" });
setVisibility(true);
}}
/> />
</div> )}
) : ( </DataLabel>
<PlusCircleFilled <DataLabel
onClick={() => { label={t("jobs.fields.employee_refinish")}
setAssignment({ operation: "prep" }); style={{ margin: "0rem .5rem" }}
setVisibility(true); >
}} {refinish ? (
/> <div>
)} <span>{`${refinish.first_name || ""} ${
</DataLabel> refinish.last_name || ""
<DataLabel label={t("jobs.fields.employee_refinish")}> }`}</span>
{refinish ? ( <MinusOutlined
<div> operation="refinish"
<span>{`${refinish.first_name || ""} ${ onClick={() => handleRemove("refinish")}
refinish.last_name || "" />
}`}</span> </div>
<MinusOutlined ) : (
operation="refinish" <PlusCircleFilled
onClick={() => handleRemove("refinish")} onClick={() => {
setAssignment({ operation: "refinish" });
setVisibility(true);
}}
/> />
</div> )}
) : ( </DataLabel>
<PlusCircleFilled </div>
onClick={() => {
setAssignment({ operation: "refinish" });
setVisibility(true);
}}
/>
)}
</DataLabel>
</Popover> </Popover>
</div> </div>
); );

View File

@@ -30,7 +30,6 @@ export function JobIntakeForm({ formItems, bodyshop }) {
const search = queryString.parse(useLocation().search); const search = queryString.parse(useLocation().search);
const handleFinish = async (values) => { const handleFinish = async (values) => {
console.log("values", values);
setLoading(true); setLoading(true);
logImEXEvent("job_complete_intake"); logImEXEvent("job_complete_intake");
@@ -71,7 +70,6 @@ export function JobIntakeForm({ formItems, bodyshop }) {
}), }),
}); });
} }
console.log("handleFinish -> result", result);
setLoading(false); setLoading(false);
}; };

View File

@@ -16,11 +16,6 @@ export default function JobReconciliationModalComponent({ job, invoices }) {
) )
.flat() || []; .flat() || [];
console.log(
"JobReconciliationModalComponent -> invoiceLineData",
invoiceLineData
);
const jobLineData = job.joblines.filter((j) => j.part_type !== null); const jobLineData = job.joblines.filter((j) => j.part_type !== null);
return ( return (

View File

@@ -1,4 +1,4 @@
import { Statistic } from "antd"; import { Statistic, Typography, Row, Col } from "antd";
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { connect } from "react-redux"; import { connect } from "react-redux";
@@ -13,6 +13,11 @@ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
}); });
const colSpan = {
md: { span: 24 },
lg: { span: 12 },
};
export function JobsTotalsTableComponent({ bodyshop, job }) { export function JobsTotalsTableComponent({ bodyshop, job }) {
const { t } = useTranslation(); const { t } = useTranslation();
const [totals, setTotals] = useState(null); const [totals, setTotals] = useState(null);
@@ -26,194 +31,251 @@ export function JobsTotalsTableComponent({ bodyshop, job }) {
} }
return ( return (
<div className='job-totals-container'> <div>
<div className='job-totals-tables'> <Row gutter={[32, 32]}>
<table className='job-totals-rates-table'> <Col {...colSpan}>
<thead> <div className="job-totals-half">
<tr> <Typography.Title level={4}>
<th>{t("jobs.labels.rates")}</th> {t("jobs.labels.labortotals")}
<th>$</th> </Typography.Title>
<th></th> <table>
</tr> <tbody>
</thead> <tr>
<tbody> <td>{t("jobs.fields.rate_laa")}</td>
<tr> <td className="currency">
<td>{t("jobs.fields.rate_laa")}</td> {totals.rates.laa.total.toFormat()}
<td>{totals.rates.laa.total.toFormat()}</td> </td>
<td>{`(${totals.rates.laa.hours.toFixed(2)} @ ${ <td>{`(${totals.rates.laa.hours.toFixed(2)} @ ${
totals.rates.laa.rate totals.rates.laa.rate
})`}</td> })`}</td>
</tr> </tr>
<tr> <tr>
<td>{t("jobs.fields.rate_lab")}</td> <td>{t("jobs.fields.rate_lab")}</td>
<td>{totals.rates.lab.total.toFormat()}</td> <td className="currency">
<td>{`(${totals.rates.lab.hours.toFixed(2)} @ ${ {totals.rates.lab.total.toFormat()}
totals.rates.lab.rate </td>
})`}</td> <td>{`(${totals.rates.lab.hours.toFixed(2)} @ ${
</tr> totals.rates.lab.rate
<tr> })`}</td>
<td>{t("jobs.fields.rate_lad")}</td> </tr>
<td>{totals.rates.lad.total.toFormat()}</td> <tr>
<td>{`(${totals.rates.lad.hours.toFixed(2)} @ ${ <td>{t("jobs.fields.rate_lad")}</td>
totals.rates.lad.rate <td className="currency">
})`}</td> {totals.rates.lad.total.toFormat()}
</tr> </td>
<tr> <td>{`(${totals.rates.lad.hours.toFixed(2)} @ ${
<td>{t("jobs.fields.rate_lae")}</td> totals.rates.lad.rate
<td>{totals.rates.lae.total.toFormat()}</td> })`}</td>
<td>{`(${totals.rates.lae.hours.toFixed(2)} @ ${ </tr>
totals.rates.lae.rate <tr>
})`}</td> <td>{t("jobs.fields.rate_lae")}</td>
</tr> <td className="currency">
<tr> {totals.rates.lae.total.toFormat()}
<td>{t("jobs.fields.rate_laf")}</td> </td>
<td>{totals.rates.laf.total.toFormat()}</td> <td>{`(${totals.rates.lae.hours.toFixed(2)} @ ${
<td>{`(${totals.rates.laf.hours.toFixed(2)} @ ${ totals.rates.lae.rate
totals.rates.laf.rate })`}</td>
})`}</td> </tr>
</tr> <tr>
<tr> <td>{t("jobs.fields.rate_laf")}</td>
<td>{t("jobs.fields.rate_lag")}</td> <td className="currency">
<td>{totals.rates.lag.total.toFormat()}</td> {totals.rates.laf.total.toFormat()}
<td>{`(${totals.rates.lag.hours.toFixed(2)} @ ${ </td>
totals.rates.lag.rate <td>{`(${totals.rates.laf.hours.toFixed(2)} @ ${
})`}</td> totals.rates.laf.rate
</tr> })`}</td>
<tr> </tr>
<td>{t("jobs.fields.rate_lam")}</td> <tr>
<td>{totals.rates.lam.total.toFormat()}</td> <td>{t("jobs.fields.rate_lag")}</td>
<td>{`(${totals.rates.lam.hours.toFixed(2)} @ ${ <td className="currency">
totals.rates.lam.rate {totals.rates.lag.total.toFormat()}
})`}</td> </td>
</tr> <td>{`(${totals.rates.lag.hours.toFixed(2)} @ ${
<tr> totals.rates.lag.rate
<td>{t("jobs.fields.rate_lar")}</td> })`}</td>
<td>{totals.rates.lar.total.toFormat()}</td> </tr>
<td>{`(${totals.rates.lar.hours.toFixed(2)} @ ${ <tr>
totals.rates.lar.rate <td>{t("jobs.fields.rate_lam")}</td>
})`}</td> <td className="currency">
</tr> {totals.rates.lam.total.toFormat()}
<tr> </td>
<td>{t("jobs.fields.rate_las")}</td> <td>{`(${totals.rates.lam.hours.toFixed(2)} @ ${
<td>{totals.rates.las.total.toFormat()}</td> totals.rates.lam.rate
<td>{`(${totals.rates.las.hours.toFixed(2)} @ ${ })`}</td>
totals.rates.las.rate </tr>
})`}</td> <tr>
</tr> <td>{t("jobs.fields.rate_lar")}</td>
<tr> <td className="currency">
<td>{t("jobs.fields.rate_lau")}</td> {totals.rates.lar.total.toFormat()}
<td>{totals.rates.lau.total.toFormat()}</td> </td>
<td>{`(${totals.rates.lau.hours.toFixed(2)} @ ${ <td>{`(${totals.rates.lar.hours.toFixed(2)} @ ${
totals.rates.lau.rate totals.rates.lar.rate
})`}</td> })`}</td>
</tr> </tr>
<tr> <tr>
<td>{t("jobs.fields.rate_la1")}</td> <td>{t("jobs.fields.rate_las")}</td>
<td>{totals.rates.la1.total.toFormat()}</td> <td className="currency">
<td>{`(${totals.rates.la1.hours.toFixed(2)} @ ${ {totals.rates.las.total.toFormat()}
totals.rates.la1.rate </td>
})`}</td> <td>{`(${totals.rates.las.hours.toFixed(2)} @ ${
</tr> totals.rates.las.rate
<tr> })`}</td>
<td>{t("jobs.fields.rate_la2")}</td> </tr>
<td>{totals.rates.la2.total.toFormat()}</td> <tr>
<td>{`(${totals.rates.la2.hours.toFixed(2)} @ ${ <td>{t("jobs.fields.rate_lau")}</td>
totals.rates.la2.rate <td className="currency">
})`}</td> {totals.rates.lau.total.toFormat()}
</tr> </td>
<tr> <td>{`(${totals.rates.lau.hours.toFixed(2)} @ ${
<td>{t("jobs.fields.rate_la3")}</td> totals.rates.lau.rate
<td>{totals.rates.la3.total.toFormat()}</td> })`}</td>
<td>{`(${totals.rates.la3.hours.toFixed(2)} @ ${ </tr>
totals.rates.la3.rate <tr>
})`}</td> <td>{t("jobs.fields.rate_la1")}</td>
</tr> <td className="currency">
<tr> {totals.rates.la1.total.toFormat()}
<td>{t("jobs.fields.rate_la4")}</td> </td>
<td>{totals.rates.la4.total.toFormat()}</td> <td>{`(${totals.rates.la1.hours.toFixed(2)} @ ${
<td>{`(${totals.rates.la4.hours.toFixed(2)} @ ${ totals.rates.la1.rate
totals.rates.la4.rate })`}</td>
})`}</td> </tr>
</tr> <tr>
<tr> <td>{t("jobs.fields.rate_la2")}</td>
<td>{t("jobs.fields.rate_atp")}</td> <td className="currency">
<td>{totals.rates.atp.total.toFormat()}</td> {totals.rates.la2.total.toFormat()}
<td>{`(${totals.rates.atp.hours.toFixed(2)} @ ${ </td>
totals.rates.atp.rate <td>{`(${totals.rates.la2.hours.toFixed(2)} @ ${
})`}</td> totals.rates.la2.rate
</tr> })`}</td>
<tr> </tr>
<td>{t("jobs.labels.mapa")}</td> <tr>
<td>{totals.rates.mapa.total.toFormat()}</td> <td>{t("jobs.fields.rate_la3")}</td>
<td>{`(${totals.rates.mapa.hours.toFixed(2)} @ ${ <td className="currency">
totals.rates.mapa.rate {totals.rates.la3.total.toFormat()}
})`}</td> </td>
</tr> <td>{`(${totals.rates.la3.hours.toFixed(2)} @ ${
<tr> totals.rates.la3.rate
<td>{t("jobs.labels.mash")}</td> })`}</td>
<td>{totals.rates.mash.total.toFormat()}</td> </tr>
<td>{`(${totals.rates.mash.hours.toFixed(2)} @ ${ <tr>
totals.rates.mash.rate <td>{t("jobs.fields.rate_la4")}</td>
})`}</td> <td className="currency">
</tr> {totals.rates.la4.total.toFormat()}
<tr> </td>
<td>{t("jobs.labels.rates_subtotal")}</td> <td>{`(${totals.rates.la4.hours.toFixed(2)} @ ${
<td>{totals.rates.subtotal.toFormat()}</td> totals.rates.la4.rate
<td></td> })`}</td>
</tr> </tr>
</tbody> <tr>
</table> <td>{t("jobs.fields.rate_atp")}</td>
<table className='job-totals-parts-table'> <td className="currency">
<tbody> {totals.rates.atp.total.toFormat()}
<tr> </td>
<td>{t("jobs.labels.partstotal")}</td> <td>{`(${totals.rates.atp.hours.toFixed(2)} @ ${
<td>{totals.parts.parts.total.toFormat()}</td> totals.rates.atp.rate
<td>{`(${totals.parts.parts.subtotal.toFormat()} ± ${totals.parts.parts.adjustments.toFormat()})`}</td> })`}</td>
</tr> </tr>
<tr>
<td>{t("jobs.labels.subletstotal")}</td> <tr>
<td>{totals.parts.sublets.total.toFormat()}</td> <td>{t("jobs.labels.rates_subtotal")}</td>
<td>{`(${totals.parts.sublets.subtotal.toFormat()} ± ${totals.parts.sublets.adjustments.toFormat()})`}</td> <td>{totals.rates.subtotal.toFormat()}</td>
</tr> <td></td>
</tbody> </tr>
</table> </tbody>
</div> </table>
<div </div>
className='job-totals-stats' </Col>
onClick={(e) => { <Col {...colSpan}>
if (e.detail === 3) { <div className="job-totals-half">
try { <table>
console.log("Job", job); <tbody>
} catch { <tr>
console.log("Unable to show job."); <td>{t("jobs.labels.partstotal")}</td>
} <td className="currency">
} {totals.parts.parts.total.toFormat()}
}}> </td>
<Statistic <td>{`(${totals.parts.parts.subtotal.toFormat()} ± ${totals.parts.parts.adjustments.toFormat()})`}</td>
title={t("jobs.labels.subtotal")} </tr>
value={totals.totals.subtotal.toFormat()} <tr>
/> <td>{t("jobs.labels.subletstotal")}</td>
<Statistic <td className="currency">
title={t("jobs.labels.state_tax_amt")} {totals.parts.sublets.total.toFormat()}
value={totals.totals.state_tax.toFormat()} </td>
/> <td>{`(${totals.parts.sublets.subtotal.toFormat()} ± ${totals.parts.sublets.adjustments.toFormat()})`}</td>
<Statistic </tr>
title={t("jobs.labels.local_tax_amt")} <tr>
value={totals.totals.local_tax.toFormat()} <td>{t("jobs.labels.mapa")}</td>
/> <td className="currency">
<Statistic {totals.rates.mapa.total.toFormat()}
title={t("jobs.labels.federal_tax_amt")} </td>
value={totals.totals.federal_tax.toFormat()} <td>{`(${totals.rates.mapa.hours.toFixed(2)} @ ${
/> totals.rates.mapa.rate
<Statistic })`}</td>
title={t("jobs.labels.total_repairs")} </tr>
value={totals.totals.total_repairs.toFormat()} <tr>
/> <td>{t("jobs.labels.mash")}</td>
<Statistic <td className="currency">
title={t("jobs.labels.net_repairs")} {totals.rates.mash.total.toFormat()}
value={totals.totals.net_repairs.toFormat()} </td>
/> <td>{`(${totals.rates.mash.hours.toFixed(2)} @ ${
</div> totals.rates.mash.rate
})`}</td>
</tr>
</tbody>
</table>
<div
className="job-totals-stats"
onClick={(e) => {
if (e.detail === 3) {
try {
console.log("Job", job);
} catch {
console.log("Unable to show job.");
}
}
}}
>
<Statistic
title={t("jobs.labels.state_tax_amt")}
value={totals.totals.state_tax.toFormat()}
/>
<Statistic
title={t("jobs.labels.local_tax_amt")}
value={totals.totals.local_tax.toFormat()}
/>
<Statistic
title={t("jobs.labels.federal_tax_amt")}
value={totals.totals.federal_tax.toFormat()}
/>
</div>
<div
className="job-totals-stats"
onClick={(e) => {
if (e.detail === 3) {
try {
console.log("Job", job);
} catch {
console.log("Unable to show job.");
}
}
}}
>
<Statistic
title={t("jobs.labels.subtotal")}
value={totals.totals.subtotal.toFormat()}
/>
<Statistic
title={t("jobs.labels.total_repairs")}
value={totals.totals.total_repairs.toFormat()}
/>
<Statistic
title={t("jobs.labels.net_repairs")}
value={totals.totals.net_repairs.toFormat()}
/>
</div>
</div>
</Col>
</Row>
</div> </div>
); );
} }

View File

@@ -1,24 +1,38 @@
.job-totals-container { .job-totals-half {
display: flex;
flex-flow: wrap;
}
.job-totals-tables {
flex: 1; flex: 1;
display: block; display: flex;
} flex-direction: column;
align-items: center;
.job-totals-rates-table, table {
.job-totals-parts-table { border: 1px solid #ccc;
border: black; border-collapse: collapse;
width: 100%; margin: 0;
padding: 0;
width: 80%;
table-layout: fixed;
}
table tr {
//background-color: #f8f8f8;
border: 1px solid #ddd;
padding: 0.35em;
}
table th,
table td {
padding: 0.625em;
//text-align: center;
}
table td.currency {
text-align: right;
}
} }
.job-totals-stats { .job-totals-stats {
margin: 1rem; margin: 1rem;
display: flex; display: flex;
flex-direction: column; width: 100%;
align-content: center; //flex-direction: column;
.ant-statistic { justify-content: space-evenly;
margin: 0.5rem;
}
} }

View File

@@ -67,7 +67,6 @@ export function JobsAvailableSupplementContainer({
} else { } else {
//create upsert job //create upsert job
let supp = estData.data.available_jobs_by_pk.est_data; let supp = estData.data.available_jobs_by_pk.est_data;
console.log("supp before", supp);
delete supp.owner; delete supp.owner;
delete supp.vehicle; delete supp.vehicle;
@@ -140,11 +139,12 @@ export function JobsAvailableSupplementContainer({
setSelectedJob(null); setSelectedJob(null);
}; };
if (error) return <AlertComponent type='error' message={error.message} />; if (error) return <AlertComponent type="error" message={error.message} />;
return ( return (
<LoadingSpinner <LoadingSpinner
loading={insertLoading} loading={insertLoading}
message={t("jobs.labels.creating_new_job")}> message={t("jobs.labels.creating_new_job")}
>
<JobsAvailableSupplementComponent <JobsAvailableSupplementComponent
loading={loading} loading={loading}
data={data} data={data}

View File

@@ -1,66 +0,0 @@
import { Form, Input, InputNumber, Switch, Select } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import FormRow from "../layout-form-row/layout-form-row.component";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors";
const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser
bodyshop: selectBodyshop,
});
const mapDispatchToProps = (dispatch) => ({
//setUserLanguage: language => dispatch(setUserLanguage(language))
});
export function JobsDetailClaims({ bodyshop, job }) {
const { t } = useTranslation();
return (
<div>
<FormRow>
<Form.Item label={t("jobs.fields.csr")} name="csr">
<Input />
</Form.Item>
<Form.Item label={t("jobs.fields.ponumber")} name="po_number">
<Input />
</Form.Item>
<Form.Item label={t("jobs.fields.unitnumber")} name="unit_number">
<Input />
</Form.Item>
<Form.Item label={t("jobs.fields.kmin")} name="kmin">
<InputNumber precision={1} />
</Form.Item>
<Form.Item label={t("jobs.fields.kmout")} name="kmout">
<InputNumber precision={1} />
</Form.Item>
<Form.Item
label={t("jobs.fields.exempt")}
valuePropName="checked"
name="exempt"
>
<Switch />
</Form.Item>
<Form.Item
label={t("jobs.fields.specialcoveragepolicy")}
valuePropName="checked"
name="special_coverage_policy"
>
<Switch />
</Form.Item>
</FormRow>
<Form.Item label={t("jobs.fields.referralsource")} name="referral_source">
<Select>
{bodyshop.md_referral_sources.map((s) => (
<Select.Option key={s} value={s}>
{s}
</Select.Option>
))}
</Select>
</Form.Item>
</div>
);
}
export default connect(mapStateToProps, mapDispatchToProps)(JobsDetailClaims);

View File

@@ -1,215 +0,0 @@
import { Col, Divider, Form, Row, Select } 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";
import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { DateTimeFormatter } from "../../utils/DateFormatter";
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
import JobTotalsTable from "../job-totals-table/job-totals-table.component";
import FormRow from "../layout-form-row/layout-form-row.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
});
const stripeTestEnv = process.env.REACT_APP_STRIPE_PUBLIC_KEY; //.includes("test");
export function JobsDetailFinancials({ job, bodyshop }) {
const { t } = useTranslation();
const colSpan = {
sm: { span: 24 },
lg: { span: 12 },
};
return (
<div>
<Row>
<Col span={24}>
<FormRow header={t("payments.labels.title")}>
<table style={{ width: "100%" }}>
<thead>
<tr>
<th>{t("payments.fields.created_at")}</th>
<th>{t("payments.fields.payer")}</th>
<th>{t("payments.fields.amount")}</th>
<th>{t("payments.fields.memo")}</th>
<th>{t("payments.fields.type")}</th>
<th>{t("payments.fields.transactionid")}</th>
<th>{t("payments.fields.stripeid")}</th>
</tr>
</thead>
<tbody>
{job.payments.map((p, idx) => (
<tr key={idx}>
<td>
<DateTimeFormatter>{p.created_at}</DateTimeFormatter>
</td>
<td>{p.payer}</td>
<td>
<CurrencyFormatter>{p.amount}</CurrencyFormatter>
</td>
<td>{p.memo}</td>
<td>{p.type}</td>
<td>{p.transactionid}</td>
<td>
{p.stripeid ? (
<a
href={
stripeTestEnv
? `https://dashboard.stripe.com/${bodyshop.stripe_acct_id}/test/payments/${p.stripeid}`
: `https://dashboard.stripe.com/${bodyshop.stripe_acct_id}/payments/${p.stripeid}`
}
>
{p.stripeid}
</a>
) : null}
</td>
</tr>
))}
</tbody>
</table>
</FormRow>
</Col>
</Row>
<Divider />
<Row gutter={[32, 32]}>
<Col {...colSpan}>
<FormRow header={t("jobs.forms.dedinfo")}>
<Form.Item label={t("jobs.fields.ded_status")} name="ded_status">
<Select>
<Select.Option value="W">
{t("jobs.labels.deductible.waived")}
</Select.Option>
<Select.Option value="Y">
{t("jobs.labels.deductible.yes")}
</Select.Option>
<Select.Option value="N">
{t("jobs.labels.deductible.no")}
</Select.Option>
</Select>
</Form.Item>
<Form.Item label={t("jobs.fields.ded_amt")} name="ded_amt">
<CurrencyInput />
</Form.Item>
</FormRow>
<FormRow>
<Form.Item
label={t("jobs.fields.depreciation_taxes")}
name="depreciation_taxes"
>
<CurrencyInput />
</Form.Item>
<Form.Item
label={t("jobs.fields.other_amount_payable")}
name="other_amount_payable"
>
<CurrencyInput />
</Form.Item>
<Form.Item
label={t("jobs.fields.towing_payable")}
name="towing_payable"
>
<CurrencyInput />
</Form.Item>
<Form.Item
label={t("jobs.fields.storage_payable")}
name="storage_payable"
>
<CurrencyInput />
</Form.Item>
<Form.Item
label={t("jobs.fields.federal_tax_payable")}
name="federal_tax_payable"
>
<CurrencyInput />
</Form.Item>
<Form.Item
label={t("jobs.fields.adjustment_bottom_line")}
name="adjustment_bottom_line"
>
<CurrencyInput />
</Form.Item>
</FormRow>
<FormRow header={t("jobs.forms.laborrates")}>
<Form.Item label={t("jobs.fields.rate_laa")} name="rate_laa">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_lab")} name="rate_lab">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_lad")} name="rate_lad">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_lae")} name="rate_lae">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_lar")} name="rate_lar">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_las")} name="rate_las">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_laf")} name="rate_laf">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_lam")} name="rate_lam">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_lag")} name="rate_lag">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_la1")} name="rate_la1">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_la2")} name="rate_la2">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_la3")} name="rate_la3">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_la4")} name="rate_la4">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_atp")} name="rate_atp">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_lau")} name="rate_lau">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_mapa")} name="rate_mapa">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_mash")} name="rate_mash">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_mahw")} name="rate_mahw">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_ma2s")} name="rate_ma2s">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_ma3s")} name="rate_ma3s">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_mabl")} name="rate_mabl">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_macs")} name="rate_macs">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_matd")} name="rate_matd">
<CurrencyInput />
</Form.Item>
</FormRow>
</Col>
<Col {...colSpan}>
<JobTotalsTable job={job} />
</Col>
</Row>
</div>
);
}
export default connect(mapStateToProps, null)(JobsDetailFinancials);

View File

@@ -1,19 +1,56 @@
import { Form, Input } from "antd"; import { Form, Input, InputNumber, Select, Switch } 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 { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors";
import FormDatePicker from "../form-date-picker/form-date-picker.component"; import FormDatePicker from "../form-date-picker/form-date-picker.component";
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
import FormItemEmail from "../form-items-formatted/email-form-item.component"; import FormItemEmail from "../form-items-formatted/email-form-item.component";
import FormItemPhone from "../form-items-formatted/phone-form-item.component"; import FormItemPhone from "../form-items-formatted/phone-form-item.component";
import Car from "../job-damage-visual/job-damage-visual.component"; import Car from "../job-damage-visual/job-damage-visual.component";
import FormRow from "../layout-form-row/layout-form-row.component"; import FormRow from "../layout-form-row/layout-form-row.component";
export default function JobsDetailInsurance({ job, form }) { const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser
bodyshop: selectBodyshop,
});
const mapDispatchToProps = (dispatch) => ({
//setUserLanguage: language => dispatch(setUserLanguage(language))
});
export function JobsDetailGeneral({ bodyshop, job, form }) {
const { getFieldValue } = form; const { getFieldValue } = form;
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<div> <div>
<FormRow header={t("jobs.forms.inscoinfo")}> <FormRow header={t("jobs.forms.claiminfo")}>
<Form.Item label={t("jobs.fields.clm_no")} name="clm_no">
<Input />
</Form.Item>
<Form.Item label={t("jobs.fields.ded_status")} name="ded_status">
<Select>
<Select.Option value="W">
{t("jobs.labels.deductible.waived")}
</Select.Option>
<Select.Option value="Y">
{t("jobs.labels.deductible.yes")}
</Select.Option>
<Select.Option value="N">
{t("jobs.labels.deductible.no")}
</Select.Option>
</Select>
</Form.Item>
<Form.Item label={t("jobs.fields.ded_amt")} name="ded_amt">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.policy_no")} name="policy_no">
<Input />
</Form.Item>
<Form.Item label={t("jobs.fields.regie_number")} name="regie_number">
<Input />
</Form.Item>
<Form.Item label={t("jobs.fields.ins_co_id")} name="ins_co_id"> <Form.Item label={t("jobs.fields.ins_co_id")} name="ins_co_id">
<Input /> <Input />
</Form.Item> </Form.Item>
@@ -47,19 +84,21 @@ export default function JobsDetailInsurance({ job, form }) {
> >
<FormItemEmail email={getFieldValue("ins_ea")} /> <FormItemEmail email={getFieldValue("ins_ea")} />
</Form.Item> </Form.Item>
</FormRow> <Form.Item
<FormRow header={t("jobs.forms.claiminfo")}> label={t("jobs.fields.referralsource")}
<Form.Item label={t("jobs.fields.clm_no")} name="clm_no"> name="referral_source"
<Input /> >
</Form.Item> <Select>
<Form.Item label={t("jobs.fields.policy_no")} name="policy_no"> {bodyshop.md_referral_sources.map((s) => (
<Input /> <Select.Option key={s} value={s}>
</Form.Item> {s}
<Form.Item label={t("jobs.fields.regie_number")} name="regie_number"> </Select.Option>
<Input /> ))}
</Select>
</Form.Item> </Form.Item>
</FormRow> </FormRow>
<FormRow header={t("jobs.forms.lossinfo")}>
<FormRow header={t("jobs.forms.lossinfo")} grow>
<div style={{ display: "inline", height: "8rem" }}> <div style={{ display: "inline", height: "8rem" }}>
{job.area_of_damage ? ( {job.area_of_damage ? (
<Car <Car
@@ -76,6 +115,31 @@ export default function JobsDetailInsurance({ job, form }) {
<Form.Item label={t("jobs.fields.loss_date")} name="loss_date"> <Form.Item label={t("jobs.fields.loss_date")} name="loss_date">
<FormDatePicker /> <FormDatePicker />
</Form.Item> </Form.Item>
<Form.Item label={t("jobs.fields.kmin")} name="kmin">
<InputNumber precision={1} />
</Form.Item>
<Form.Item label={t("jobs.fields.kmout")} name="kmout">
<InputNumber precision={1} />
</Form.Item>
<Form.Item label={t("jobs.fields.ponumber")} name="po_number">
<Input />
</Form.Item>
<Form.Item label={t("jobs.fields.unitnumber")} name="unit_number">
<Input />
</Form.Item>
<Form.Item
label={t("jobs.fields.specialcoveragepolicy")}
valuePropName="checked"
name="special_coverage_policy"
>
<Switch />
</Form.Item>
<Form.Item
label={t("jobs.fields.tax_registration_number")}
name="tax_registration_number"
>
<Input />
</Form.Item>
</FormRow> </FormRow>
<FormRow header={t("jobs.forms.appraiserinfo")}> <FormRow header={t("jobs.forms.appraiserinfo")}>
<Form.Item label={t("jobs.fields.est_co_nm")} name="est_co_nm"> <Form.Item label={t("jobs.fields.est_co_nm")} name="est_co_nm">
@@ -103,10 +167,15 @@ export default function JobsDetailInsurance({ job, form }) {
<FormItemEmail email={getFieldValue("est_ea")} /> <FormItemEmail email={getFieldValue("est_ea")} />
</Form.Item> </Form.Item>
</FormRow> </FormRow>
<FormRow header="TODO: TO BE PLACED"> <FormRow header={t("jobs.forms.other")}>
<Form.Item label={t("jobs.fields.pay_date")} name="pay_date"> <Form.Item label={t("jobs.fields.csr")} name="csr">
<Input /> <Input />
</Form.Item> </Form.Item>
<Form.Item label={t("jobs.fields.category")} name="category">
<Select />
</Form.Item>
<Form.Item <Form.Item
label={t("jobs.fields.selling_dealer")} label={t("jobs.fields.selling_dealer")}
name="selling_dealer" name="selling_dealer"
@@ -131,8 +200,8 @@ export default function JobsDetailInsurance({ job, form }) {
> >
<Input /> <Input />
</Form.Item> </Form.Item>
TODO: Adding servicing/selling dealer contact info?
</FormRow> </FormRow>
</div> </div>
); );
} }
export default connect(mapStateToProps, mapDispatchToProps)(JobsDetailGeneral);

View File

@@ -39,8 +39,6 @@ export default function DuplicateJob(
variables: { job: [existingJob] }, variables: { job: [existingJob] },
}) })
.then((res2) => { .then((res2) => {
console.log("res2", res2);
if (completionCallback) if (completionCallback)
completionCallback(res2.data.insert_jobs.returning[0].id); completionCallback(res2.data.insert_jobs.returning[0].id);
}); });

View File

@@ -1,19 +1,8 @@
import { DownCircleFilled, PrinterFilled } from "@ant-design/icons"; import { DownCircleFilled, PrinterFilled } from "@ant-design/icons";
import { import { Button, Dropdown, Menu, notification, PageHeader, Tag } from "antd";
Button,
Checkbox,
Descriptions,
Dropdown,
Menu,
notification,
PageHeader,
Tag,
} from "antd";
import React from "react"; import React from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import Moment from "react-moment";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { Link } from "react-router-dom";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import { setModalContext } from "../../redux/modals/modals.actions"; import { setModalContext } from "../../redux/modals/modals.actions";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
@@ -21,9 +10,8 @@ import CurrencyFormatter from "../../utils/CurrencyFormatter";
import JobsDetailHeaderActions from "../jobs-detail-header-actions/jobs-detail-header-actions.component"; import JobsDetailHeaderActions from "../jobs-detail-header-actions/jobs-detail-header-actions.component";
import OwnerTagPopoverComponent from "../owner-tag-popover/owner-tag-popover.component"; import OwnerTagPopoverComponent from "../owner-tag-popover/owner-tag-popover.component";
import VehicleTagPopoverComponent from "../vehicle-tag-popover/vehicle-tag-popover.component"; import VehicleTagPopoverComponent from "../vehicle-tag-popover/vehicle-tag-popover.component";
import JobEmployeeAssignments from "../job-employee-assignments/job-employee-assignments.container";
import "./jobs-detail-header.styles.scss"; import "./jobs-detail-header.styles.scss";
import { DateTimeFormatter } from "../../utils/DateFormatter"; import JobEmployeeAssignments from "../job-employee-assignments/job-employee-assignments.container";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
@@ -136,67 +124,22 @@ export function JobsDetailHeader({
> >
{t("jobs.labels.inproduction")} {t("jobs.labels.inproduction")}
</Tag>, </Tag>,
<Tag title={t("jobs.fields.repairtotal")} key="total" color="green">
<CurrencyFormatter>{job.clm_total}</CurrencyFormatter>
</Tag>,
<Tag
title={t("jobs.fields.customerowing")}
key="custowing"
color="green"
>
<CurrencyFormatter>{job.owner_owing}</CurrencyFormatter>
</Tag>,
]} ]}
extra={menuExtra} extra={menuExtra}
> >
<Descriptions <div style={{ display: "flex", justifyContent: "flex-end" }}>
size="small" <JobEmployeeAssignments job={job} />
column={{ xs: 1, sm: 1, md: 2, lg: 3, xl: 3, xxl: 6 }} </div>
>
<Descriptions.Item key="total" label={t("jobs.fields.repairtotal")}>
<CurrencyFormatter>{job.clm_total}</CurrencyFormatter>
</Descriptions.Item>
<Descriptions.Item
key="custowing"
label={t("jobs.fields.customerowing")}
>
<CurrencyFormatter>{job.owner_owing}</CurrencyFormatter>
</Descriptions.Item>
<Descriptions.Item
key="scp"
label={t("jobs.fields.specialcoveragepolicy")}
>
<Checkbox checked={job.special_coverage_policy} />
</Descriptions.Item>
<Descriptions.Item
key="sched_comp"
label={t("jobs.fields.scheduled_completion")}
>
{job.scheduled_completion ? (
<Moment format="MM/DD/YYYY">{job.scheduled_completion}</Moment>
) : null}
</Descriptions.Item>
<Descriptions.Item key="servicecar" label={t("jobs.fields.servicecar")}>
{job.cccontracts &&
job.cccontracts.map((item) => (
<Link
key={item.id}
to={`/manage/courtesycars/contracts/${item.id}`}
>
<div>
<div>{`${item.courtesycar.year} ${item.courtesycar.make} ${item.courtesycar.model} (${item.courtesycar.plate})`}</div>
<div style={{ display: "inline-block" }}>
<DateTimeFormatter>{item.start}</DateTimeFormatter>
<span> -- </span>
<DateTimeFormatter>
{item.scheduledreturn}
</DateTimeFormatter>
</div>
</div>
</Link>
))}
</Descriptions.Item>
<Descriptions.Item
key="assignments"
label={t("jobs.labels.employeeassignments")}
>
<JobEmployeeAssignments job={job} />
</Descriptions.Item>
</Descriptions>
</PageHeader> </PageHeader>
); );
} }

View File

@@ -0,0 +1,139 @@
import { Col, Divider, Form, Row, Select } 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";
import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { DateTimeFormatter } from "../../utils/DateFormatter";
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
import JobTotalsTable from "../job-totals-table/job-totals-table.component";
import FormRow from "../layout-form-row/layout-form-row.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
});
const stripeTestEnv = process.env.REACT_APP_STRIPE_PUBLIC_KEY; //.includes("test");
export function JobsDetailRates({ job, bodyshop }) {
const { t } = useTranslation();
return (
<div>
<FormRow>
<Form.Item label={t("jobs.fields.class")} name="class">
<Select disabled={true} />
</Form.Item>
<Form.Item
label={t("jobs.fields.depreciation_taxes")}
name="depreciation_taxes"
>
<CurrencyInput />
</Form.Item>
<Form.Item
label={t("jobs.fields.other_amount_payable")}
name="other_amount_payable"
>
<CurrencyInput />
</Form.Item>
<Form.Item
label={t("jobs.fields.towing_payable")}
name="towing_payable"
>
<CurrencyInput />
</Form.Item>
<Form.Item
label={t("jobs.fields.storage_payable")}
name="storage_payable"
>
<CurrencyInput />
</Form.Item>
<Form.Item
label={t("jobs.fields.federal_tax_payable")}
name="federal_tax_payable"
>
<CurrencyInput />
</Form.Item>
<Form.Item
label={t("jobs.fields.adjustment_bottom_line")}
name="adjustment_bottom_line"
>
<CurrencyInput />
</Form.Item>
</FormRow>
<FormRow header={t("jobs.forms.laborrates")}>
<Form.Item label={t("jobs.fields.rate_laa")} name="rate_laa">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_lab")} name="rate_lab">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_lad")} name="rate_lad">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_lae")} name="rate_lae">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_lar")} name="rate_lar">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_las")} name="rate_las">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_laf")} name="rate_laf">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_lam")} name="rate_lam">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_lag")} name="rate_lag">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_la1")} name="rate_la1">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_la2")} name="rate_la2">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_la3")} name="rate_la3">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_la4")} name="rate_la4">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_atp")} name="rate_atp">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_lau")} name="rate_lau">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_mapa")} name="rate_mapa">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_mash")} name="rate_mash">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_mahw")} name="rate_mahw">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_ma2s")} name="rate_ma2s">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_ma3s")} name="rate_ma3s">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_mabl")} name="rate_mabl">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_macs")} name="rate_macs">
<CurrencyInput />
</Form.Item>
<Form.Item label={t("jobs.fields.rate_matd")} name="rate_matd">
<CurrencyInput />
</Form.Item>
</FormRow>
</div>
);
}
export default connect(mapStateToProps, null)(JobsDetailRates);

View File

@@ -0,0 +1,81 @@
import { Col, Divider, Form, Row, Select, Typography } 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";
import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { DateTimeFormatter } from "../../utils/DateFormatter";
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
import JobTotalsTable from "../job-totals-table/job-totals-table.component";
import FormRow from "../layout-form-row/layout-form-row.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
});
const stripeTestEnv = process.env.REACT_APP_STRIPE_PUBLIC_KEY; //.includes("test");
export function JobsDetailTotals({ job, bodyshop }) {
const { t } = useTranslation();
const colSpan = {
sm: { span: 24 },
lg: { span: 12 },
};
return (
<div>
<Typography.Title level={4}>
{t("payments.labels.title")}
</Typography.Title>
<table style={{ width: "100%" }}>
<thead>
<tr>
<th>{t("payments.fields.created_at")}</th>
<th>{t("payments.fields.payer")}</th>
<th>{t("payments.fields.amount")}</th>
<th>{t("payments.fields.memo")}</th>
<th>{t("payments.fields.type")}</th>
<th>{t("payments.fields.transactionid")}</th>
<th>{t("payments.fields.stripeid")}</th>
</tr>
</thead>
<tbody>
{job.payments.map((p, idx) => (
<tr key={idx}>
<td>
<DateTimeFormatter>{p.created_at}</DateTimeFormatter>
</td>
<td>{p.payer}</td>
<td>
<CurrencyFormatter>{p.amount}</CurrencyFormatter>
</td>
<td>{p.memo}</td>
<td>{p.type}</td>
<td>{p.transactionid}</td>
<td>
{p.stripeid ? (
<a
href={
stripeTestEnv
? `https://dashboard.stripe.com/${bodyshop.stripe_acct_id}/test/payments/${p.stripeid}`
: `https://dashboard.stripe.com/${bodyshop.stripe_acct_id}/payments/${p.stripeid}`
}
>
{p.stripeid}
</a>
) : null}
</td>
</tr>
))}
</tbody>
</table>
<Divider />
<JobTotalsTable job={job} />
</div>
);
}
export default connect(mapStateToProps, null)(JobsDetailTotals);

View File

@@ -38,7 +38,6 @@ export function JobsExportAllButton({
}, },
} }
); );
console.log("handle -> XML", QbXmlResponse);
} catch (error) { } catch (error) {
console.log("Error getting QBXML from Server.", error); console.log("Error getting QBXML from Server.", error);
notification["error"]({ notification["error"]({

View File

@@ -113,7 +113,6 @@ export function PartsOrderModalContainer({
}); });
if (values.vendorid === bodyshop.inhousevendorid) { if (values.vendorid === bodyshop.inhousevendorid) {
console.log("Inhouse Invoice needs to be psoted.");
logImEXEvent("parts_order_inhouse_invoice"); logImEXEvent("parts_order_inhouse_invoice");
let invoiceToPost = { let invoiceToPost = {

View File

@@ -13,7 +13,6 @@ export default function PartsStatusPie({ partsList }) {
: {}; : {};
const pieData = Object.keys(result).map((i) => { const pieData = Object.keys(result).map((i) => {
console.log("i", i);
return { return {
id: i, id: i,
label: i, label: i,

View File

@@ -23,7 +23,6 @@ export function PaymentFormComponent({
const { t } = useTranslation(); const { t } = useTranslation();
const handleStripeChange = (e) => { const handleStripeChange = (e) => {
console.log("e", e);
setStripeState({ error: e.error, cardComplete: e.complete }); setStripeState({ error: e.error, cardComplete: e.complete });
}; };

View File

@@ -88,7 +88,6 @@ function InvoiceEnterModalContainer({
}, },
} }
); );
console.log("handleFinish -> stripePayment", stripePayment);
if (stripePayment.paymentIntent.status === "succeeded") { if (stripePayment.paymentIntent.status === "succeeded") {
notification["success"]({ message: t("payments.successes.stripe") }); notification["success"]({ message: t("payments.successes.stripe") });
@@ -172,13 +171,15 @@ function InvoiceEnterModalContainer({
okButtonProps={{ okButtonProps={{
loading: loading, loading: loading,
}} }}
destroyOnClose> destroyOnClose
>
<Form <Form
onFinish={handleFinish} onFinish={handleFinish}
autoComplete={"off"} autoComplete={"off"}
form={form} form={form}
layout='vertical' layout="vertical"
initialValues={{ jobid: context.jobId }}> initialValues={{ jobid: context.jobId }}
>
<PaymentForm form={form} stripeStateArr={stripeStateArr} /> <PaymentForm form={form} stripeStateArr={stripeStateArr} />
</Form> </Form>
</Modal> </Modal>

View File

@@ -38,7 +38,6 @@ export function PaymentsExportAllButton({
}, },
} }
); );
console.log("handle -> XML", QbXmlResponse);
} catch (error) { } catch (error) {
console.log("Error getting QBXML from Server.", error); console.log("Error getting QBXML from Server.", error);
notification["error"]({ notification["error"]({

View File

@@ -80,13 +80,13 @@ export function ProductionBoardKanbanComponent({ data, bodyshop }) {
let movedCardNewKanbanParent; let movedCardNewKanbanParent;
if (movedCardWillBeFirst) { if (movedCardWillBeFirst) {
console.log("==> New Card is first."); //console.log("==> New Card is first.");
movedCardNewKanbanParent = "-1"; movedCardNewKanbanParent = "-1";
} else if (movedCardWillBeLast) { } else if (movedCardWillBeLast) {
console.log("==> New Card is last."); // console.log("==> New Card is last.");
movedCardNewKanbanParent = lastCardInDestinationColumn.id; movedCardNewKanbanParent = lastCardInDestinationColumn.id;
} else if (!!newChildCard) { } else if (!!newChildCard) {
console.log("==> New Card is somewhere in the middle"); // console.log("==> New Card is somewhere in the middle");
movedCardNewKanbanParent = newChildCard.kanbanparent; movedCardNewKanbanParent = newChildCard.kanbanparent;
} else { } else {
throw new Error("==> !!!!!!Couldn't find a parent.!!!! <=="); throw new Error("==> !!!!!!Couldn't find a parent.!!!! <==");

View File

@@ -85,7 +85,6 @@ export const createBoardData = (AllStatuses, Jobs, filter) => {
}; };
const CheckSearch = (search, job) => { const CheckSearch = (search, job) => {
console.log("job", job, search);
return ( return (
(job.ro_number || "").toLowerCase().includes(search.toLowerCase()) || (job.ro_number || "").toLowerCase().includes(search.toLowerCase()) ||
(job.est_number || "") (job.est_number || "")

View File

@@ -41,7 +41,6 @@ export function ProductionListSaveConfigButton({
}, },
}).then((response) => { }).then((response) => {
const shopDetails = response.data.update_bodyshops.returning[0]; const shopDetails = response.data.update_bodyshops.returning[0];
console.log("handleSaveConfig -> shopDetails", shopDetails);
}); });
}; };

View File

@@ -29,7 +29,6 @@ export default function ScheduleJobModalComponent({
}, },
} }
); );
console.log("response", response);
setAppData({ ...appData, smartDates: response.data }); setAppData({ ...appData, smartDates: response.data });
} catch (error) { } catch (error) {
console.log("error", error, error.message); console.log("error", error, error.message);
@@ -60,7 +59,6 @@ export default function ScheduleJobModalComponent({
className="imex-flex-row__margin" className="imex-flex-row__margin"
key={idx} key={idx}
onClick={() => { onClick={() => {
console.log("new Date(d)", new Date(d));
setAppData({ setAppData({
...appData, ...appData,
start: new moment(d).add(8, "hours"), start: new moment(d).add(8, "hours"),

View File

@@ -8,7 +8,6 @@ export default function ScoreboardDisplayComponent({ scoreboardSubscription }) {
const { data } = scoreboardSubscription; const { data } = scoreboardSubscription;
const scoreBoardlist = (data && data.scoreboard) || []; const scoreBoardlist = (data && data.scoreboard) || [];
console.log("ScoreboardDisplayComponent -> scoreBoardlist", scoreBoardlist);
const sbEntriesByDate = {}; const sbEntriesByDate = {};
@@ -20,7 +19,6 @@ export default function ScoreboardDisplayComponent({ scoreboardSubscription }) {
sbEntriesByDate[entryDate].push(i); sbEntriesByDate[entryDate].push(i);
}); });
console.log("ScoreboardDisplayComponent -> sbEntriesByDate", sbEntriesByDate);
return ( return (
<div> <div>
<ScoreboardTargetsTable /> <ScoreboardTargetsTable />

View File

@@ -52,7 +52,6 @@ function ShopEmployeesContainer({ bodyshop }) {
}; };
const handleFinish = (values) => { const handleFinish = (values) => {
console.log("values", values);
if (employeeState[0].id) { if (employeeState[0].id) {
//Update a record. //Update a record.
logImEXEvent("shop_employee_update"); logImEXEvent("shop_employee_update");
@@ -98,7 +97,7 @@ function ShopEmployeesContainer({ bodyshop }) {
} }
}; };
if (error) return <AlertComponent message={error.message} type='error' />; if (error) return <AlertComponent message={error.message} type="error" />;
return ( return (
<ShopEmployeeComponent <ShopEmployeeComponent

View File

@@ -18,7 +18,6 @@ export default function ShopTemplateSaveButton({
logImEXEvent("shop_template_update"); logImEXEvent("shop_template_update");
emailEditorRef.current.exportHtml(async (data) => { emailEditorRef.current.exportHtml(async (data) => {
console.log(data.html);
inlineCss(data.html, { inlineCss(data.html, {
url: `${window.location.protocol}://${window.location.host}`, url: `${window.location.protocol}://${window.location.host}`,
}).then(async function (inlineHtml) { }).then(async function (inlineHtml) {

View File

@@ -27,14 +27,11 @@ export default function ShopTemplateEditorComponent({
const exportJson = (props) => { const exportJson = (props) => {
emailEditorRef.current.saveDesign((js) => { emailEditorRef.current.saveDesign((js) => {
seteditorContent({ ...editorContent, JSON: js }); seteditorContent({ ...editorContent, JSON: js });
console.log(js);
}); });
}; };
const exportHtml = (props) => { const exportHtml = (props) => {
emailEditorRef.current.exportHtml((js) => { emailEditorRef.current.exportHtml((js) => {});
console.log(js);
});
}; };
return ( return (

View File

@@ -101,12 +101,7 @@ export default function TimeTicketModalComponent({
}, },
]} ]}
> >
<Select <Select style={{ width: "150px" }}>
style={{ width: "150px" }}
onChange={() => {
console.log("Changed.");
}}
>
{responsibilityCenters.costs.map((item) => ( {responsibilityCenters.costs.map((item) => (
<Select.Option key={item.name}>{item.name}</Select.Option> <Select.Option key={item.name}>{item.name}</Select.Option>
))} ))}

View File

@@ -31,7 +31,6 @@ export function TimeTicektShiftContainer({
const handleFinish = async (values) => { const handleFinish = async (values) => {
setLoading(true); setLoading(true);
console.log(values);
const theTime = moment((await axios.post("/utils/time")).data); const theTime = moment((await axios.post("/utils/time")).data);
const result = await insertTimeTicket({ const result = await insertTimeTicket({
@@ -71,12 +70,13 @@ export function TimeTicektShiftContainer({
<div> <div>
<Form <Form
form={form} form={form}
layout='vertical' layout="vertical"
autoComplete='no' autoComplete="no"
onFinish={handleFinish} onFinish={handleFinish}
initialValues={{ cost_center: t("timetickets.labels.shift") }}> initialValues={{ cost_center: t("timetickets.labels.shift") }}
>
<TimeTicektShiftComponent form={form} /> <TimeTicektShiftComponent form={form} />
<Button htmlType='submit' loading={loading}> <Button htmlType="submit" loading={loading}>
{t("timetickets.actions.clockin")} {t("timetickets.actions.clockin")}
</Button> </Button>
</Form> </Form>

View File

@@ -78,8 +78,6 @@ export function TimeTicketsSummaryEmployees({
displayTemplateInWindow(html); displayTemplateInWindow(html);
}; };
console.log("jobTickets", jobTickets);
return ( return (
<div> <div>
<List <List
@@ -96,8 +94,6 @@ export function TimeTicketsSummaryEmployees({
.map((i) => i.cost_center) .map((i) => i.cost_center)
.filter(onlyUnique); .filter(onlyUnique);
console.log("employeeCostCenters", employeeCostCenters);
return employeeCostCenters.map((costCenter) => { return employeeCostCenters.map((costCenter) => {
const actHrs = item.tickets const actHrs = item.tickets
.filter((ticket) => ticket.cost_center === costCenter) .filter((ticket) => ticket.cost_center === costCenter)

View File

@@ -11,21 +11,24 @@ export default function VehicleTagPopoverComponent({ job }) {
<Col span={12}> <Col span={12}>
<Descriptions <Descriptions
title={t("owners.labels.fromclaim")} title={t("owners.labels.fromclaim")}
size='small' size="small"
column={1}> column={1}
<Descriptions.Item key='1' label={t("jobs.fields.vehicle")}> >
{`${job.v_model_yr || t("general.labels.na")} <Descriptions.Item key="1" label={t("jobs.fields.vehicle")}>
{`${job.v_model_yr || t("general.labels.na")} ${
job.v_color || ""
}
${job.v_make_desc || t("general.labels.na")} ${job.v_make_desc || t("general.labels.na")}
${job.v_model_desc || t("general.labels.na")}`} ${job.v_model_desc || t("general.labels.na")}`}
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item key='2' label={t("vehicles.fields.plate_no")}> <Descriptions.Item key="2" label={t("vehicles.fields.plate_no")}>
{`${job.plate_no || t("general.labels.na")}`} {`${job.plate_no || t("general.labels.na")}`}
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item key='3' label={t("vehicles.fields.plate_st")}> <Descriptions.Item key="3" label={t("vehicles.fields.plate_st")}>
{`${job.plate_st || t("general.labels.na")}`} {`${job.plate_st || t("general.labels.na")}`}
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item key='4' label={t("vehicles.fields.v_vin")}> <Descriptions.Item key="4" label={t("vehicles.fields.v_vin")}>
{`${job.v_vin || t("general.labels.na")}`} {`${job.v_vin || t("general.labels.na")}`}
</Descriptions.Item> </Descriptions.Item>
</Descriptions> </Descriptions>
@@ -33,21 +36,22 @@ export default function VehicleTagPopoverComponent({ job }) {
<Col span={12}> <Col span={12}>
<Descriptions <Descriptions
title={t("owners.labels.fromowner")} title={t("owners.labels.fromowner")}
size='small' size="small"
column={1}> column={1}
<Descriptions.Item key='1' label={t("jobs.fields.vehicle")}> >
<Descriptions.Item key="1" label={t("jobs.fields.vehicle")}>
{`${job.vehicle.v_model_yr || t("general.labels.na")} {`${job.vehicle.v_model_yr || t("general.labels.na")}
${job.vehicle.v_make_desc || t("general.labels.na")} ${job.vehicle.v_make_desc || t("general.labels.na")}
${job.vehicle.v_model_desc || t("general.labels.na")}`} ${job.vehicle.v_model_desc || t("general.labels.na")}`}
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item key='2' label={t("vehicles.fields.plate_no")}> <Descriptions.Item key="2" label={t("vehicles.fields.plate_no")}>
{`${job.vehicle.plate_no || t("general.labels.na")}`} {`${job.vehicle.plate_no || t("general.labels.na")}`}
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item key='3' label={t("vehicles.fields.plate_st")}> <Descriptions.Item key="3" label={t("vehicles.fields.plate_st")}>
{`${job.vehicle.plate_st || t("general.labels.na")}`} {`${job.vehicle.plate_st || t("general.labels.na")}`}
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item key='4' label={t("vehicles.fields.v_vin")}> <Descriptions.Item key="4" label={t("vehicles.fields.v_vin")}>
{`${job.vehicle.v_vin || t("general.labels.na")}`} {`${job.vehicle.v_vin || t("general.labels.na")}`}
</Descriptions.Item> </Descriptions.Item>
</Descriptions> </Descriptions>
@@ -60,11 +64,11 @@ export default function VehicleTagPopoverComponent({ job }) {
); );
return ( return (
<Popover placement='bottom' content={content}> <Popover placement="bottom" content={content}>
<Tag color='green'> <Tag color="blue">
{job.vehicleid ? ( {job.vehicleid ? (
<Link to={`/manage/vehicles/${job.vehicleid}`}> <Link to={`/manage/vehicles/${job.vehicleid}`}>
{`${job.v_model_yr || ""} {`${job.v_model_yr || ""} ${job.v_color || ""}
${job.v_make_desc || ""} ${job.v_make_desc || ""}
${job.v_model_desc || ""} | ${job.v_model_desc || ""} |
${job.plate_no || ""}`} ${job.plate_no || ""}`}

View File

@@ -51,7 +51,7 @@ export const QUERY_ALL_ACTIVE_JOBS = gql`
`; `;
export const SUBSCRIPTION_JOBS_IN_PRODUCTION = gql` export const SUBSCRIPTION_JOBS_IN_PRODUCTION = gql`
subscription SUBSCRIPTION_JOBS_IN_PRODUCTION($statusList: [String!]!) { subscription SUBSCRIPTION_JOBS_IN_PRODUCTION {
jobs(where: { inproduction: { _eq: true } }) { jobs(where: { inproduction: { _eq: true } }) {
id id
status status
@@ -367,6 +367,9 @@ export const GET_JOB_BY_PK = gql`
date_exported date_exported
status status
owner_owing owner_owing
tax_registration_number
class
category
joblines(where: { jobid: { _eq: $id } }, order_by: { line_no: asc }) { joblines(where: { jobid: { _eq: $id } }, order_by: { line_no: asc }) {
id id
line_no line_no

View File

@@ -13,39 +13,35 @@ import { useTranslation } from "react-i18next";
import { import {
FaHardHat, FaHardHat,
FaHistory, FaHistory,
FaInfo,
FaRegStickyNote, FaRegStickyNote,
FaShieldAlt, FaShieldAlt,
} from "react-icons/fa"; } from "react-icons/fa";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom"; import { useHistory, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import FormFieldsChanged from "../../components/form-fields-changed-alert/form-fields-changed-alert.component";
import { CalculateJob } from "../../components/job-totals-table/job-totals.utility"; import { CalculateJob } from "../../components/job-totals-table/job-totals.utility";
import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import FormFieldsChanged from "../../components/form-fields-changed-alert/form-fields-changed-alert.component";
const JobsLinesContainer = lazy(() => const JobsLinesContainer = lazy(() =>
import("../../components/job-detail-lines/job-lines.container") import("../../components/job-detail-lines/job-lines.container")
); );
const JobsDetailClaims = lazy(() =>
import("../../components/jobs-detail-claims/jobs-detail-claims.component")
);
const JobsDetailDatesComponent = lazy(() => const JobsDetailDatesComponent = lazy(() =>
import("../../components/jobs-detail-dates/jobs-detail-dates.component") import("../../components/jobs-detail-dates/jobs-detail-dates.component")
); );
const JobsDetailFinancials = lazy(() => const JobsDetailTotals = lazy(() =>
import( import("../../components/jobs-detail-totals/jobs-detail-totals.component")
"../../components/jobs-detail-financial/jobs-detail-financial.component" );
) const JobsDetailRates = lazy(() =>
import("../../components/jobs-detail-rates/jobs-detail-rates.component")
); );
const JobsDetailHeader = lazy(() => const JobsDetailHeader = lazy(() =>
import("../../components/jobs-detail-header/jobs-detail-header.component") import("../../components/jobs-detail-header/jobs-detail-header.component")
); );
const JobsDetailInsurance = lazy(() => const JobsDetailGeneral = lazy(() =>
import( import("../../components/jobs-detail-general/jobs-detail-general.component")
"../../components/jobs-detail-insurance/jobs-detail-insurance.component"
)
); );
const JobsDocumentsGalleryContainer = lazy(() => const JobsDocumentsGalleryContainer = lazy(() =>
import( import(
@@ -157,27 +153,16 @@ export function JobsDetailPage({
defaultActiveKey={search.tab} defaultActiveKey={search.tab}
onChange={(key) => history.push({ search: `?tab=${key}` })} onChange={(key) => history.push({ search: `?tab=${key}` })}
> >
<Tabs.TabPane
tab={
<span>
<Icon component={FaInfo} />
{t("menus.jobsdetail.claimdetail")}
</span>
}
key="claimdetail"
>
<JobsDetailClaims job={job} />
</Tabs.TabPane>
<Tabs.TabPane <Tabs.TabPane
tab={ tab={
<span> <span>
<Icon component={FaShieldAlt} /> <Icon component={FaShieldAlt} />
{t("menus.jobsdetail.insurance")} {t("menus.jobsdetail.general")}
</span> </span>
} }
key="insurance" key="general"
> >
<JobsDetailInsurance job={job} form={form} /> <JobsDetailGeneral job={job} form={form} />
</Tabs.TabPane> </Tabs.TabPane>
<Tabs.TabPane <Tabs.TabPane
tab={ tab={
@@ -198,12 +183,23 @@ export function JobsDetailPage({
tab={ tab={
<span> <span>
<DollarCircleOutlined /> <DollarCircleOutlined />
{t("menus.jobsdetail.financials")} {t("menus.jobsdetail.rates")}
</span> </span>
} }
key="financials" key="rates"
> >
<JobsDetailFinancials job={job} /> <JobsDetailRates job={job} />
</Tabs.TabPane>
<Tabs.TabPane
tab={
<span>
<DollarCircleOutlined />
{t("menus.jobsdetail.totals")}
</span>
}
key="totals"
>
<JobsDetailTotals job={job} />
</Tabs.TabPane> </Tabs.TabPane>
<Tabs.TabPane <Tabs.TabPane
tab={ tab={

View File

@@ -4,6 +4,7 @@
padding: 0.25rem 1rem 0rem 1rem; padding: 0.25rem 1rem 0rem 1rem;
border-radius: 4px; border-radius: 4px;
background: #fff; background: #fff;
padding-bottom: 3rem;
} }
.layout-container { .layout-container {

View File

@@ -29,7 +29,7 @@ export function ProductionBoardContainer({ setBreadcrumbs, bodyshop }) {
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs]);
return ( return (
<RbacWrapper action="production-board"> <RbacWrapper action="production:board">
<ProductionBoardComponent /> <ProductionBoardComponent />
</RbacWrapper> </RbacWrapper>
); );

View File

@@ -26,7 +26,7 @@ export function ProductionListContainer({ setBreadcrumbs, bodyshop }) {
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs]);
return ( return (
<RbacWrapper action="production-list"> <RbacWrapper action="production:list">
<ProductionListComponent /> <ProductionListComponent />
</RbacWrapper> </RbacWrapper>
); );

View File

@@ -124,7 +124,7 @@ export function* setInstanceIdSaga({ payload: uid }) {
yield put(setLocalFingerprint(fingerprint)); yield put(setLocalFingerprint(fingerprint));
yield delay(5 * 60 * 1000); yield delay(5 * 60 * 1000);
yield put(checkInstanceId(uid)); if (process.env.NODE_ENV === "production") yield put(checkInstanceId(uid));
} catch (error) { } catch (error) {
console.log("error", error); console.log("error", error);
//yield put(signOutFailure(error.message)); //yield put(signOutFailure(error.message));

View File

@@ -683,6 +683,7 @@
"actual_delivery": "Actual Delivery", "actual_delivery": "Actual Delivery",
"actual_in": "Actual In", "actual_in": "Actual In",
"adjustment_bottom_line": "Adjustments", "adjustment_bottom_line": "Adjustments",
"category": "Category",
"ccc": "CC Cleaning", "ccc": "CC Cleaning",
"ccd": "CC Damage Waiver", "ccd": "CC Damage Waiver",
"ccdr": "CC Daily Rate", "ccdr": "CC Daily Rate",
@@ -690,6 +691,7 @@
"ccm": "CC Mileage", "ccm": "CC Mileage",
"cieca_id": "CIECA ID", "cieca_id": "CIECA ID",
"claim_total": "Claim Total", "claim_total": "Claim Total",
"class": "Class",
"clm_no": "Claim #", "clm_no": "Claim #",
"clm_total": "Claim Total", "clm_total": "Claim Total",
"csr": "Customer Service Rep.", "csr": "Customer Service Rep.",
@@ -746,7 +748,7 @@
"las": "Structural", "las": "Structural",
"lau": "LAU", "lau": "LAU",
"loss_date": "Loss Date", "loss_date": "Loss Date",
"loss_desc": "Loss of Use", "loss_desc": "Loss Description",
"mapa": "Paint Materials", "mapa": "Paint Materials",
"mash": "Shop Materials", "mash": "Shop Materials",
"other_amount_payable": "Other Amount Payable", "other_amount_payable": "Other Amount Payable",
@@ -767,28 +769,28 @@
"policy_no": "Policy #", "policy_no": "Policy #",
"ponumber": "PO Number", "ponumber": "PO Number",
"rate_atp": "ATP", "rate_atp": "ATP",
"rate_la1": "LA1 Rate", "rate_la1": "LA1",
"rate_la2": "LA2 Rate", "rate_la2": "LA2",
"rate_la3": "LA3 Rate", "rate_la3": "LA3",
"rate_la4": "LA4 Rate", "rate_la4": "LA4",
"rate_laa": "Aluminum Rate", "rate_laa": "Aluminum",
"rate_lab": "Body Rate", "rate_lab": "Body",
"rate_lad": "Diagnostic Rate", "rate_lad": "Diagnostic",
"rate_lae": "Electrical Rate", "rate_lae": "Electrical",
"rate_laf": "Frame Rate", "rate_laf": "Frame",
"rate_lag": "Glass Rate", "rate_lag": "Glass",
"rate_lam": "Mechanical Rate", "rate_lam": "Mechanical",
"rate_lar": "Refinish Rate", "rate_lar": "Refinish",
"rate_las": "Sublet Rate", "rate_las": "Sublet",
"rate_lau": "Aluminum Rate", "rate_lau": "Aluminum",
"rate_ma2s": "2 Stage Paint Rate", "rate_ma2s": "2 Stage Paint",
"rate_ma3s": "3 Stage Paint Rate", "rate_ma3s": "3 Stage Paint",
"rate_mabl": "MABL??", "rate_mabl": "MABL??",
"rate_macs": "MACS??", "rate_macs": "MACS??",
"rate_mahw": "Hazardous Waste Rate", "rate_mahw": "Hazardous Waste",
"rate_mapa": "Paint Materials Rate", "rate_mapa": "Paint Materials",
"rate_mash": "Shop Material Rate", "rate_mash": "Shop Material",
"rate_matd": "Tire Disposal Rate", "rate_matd": "Tire Disposal",
"referralsource": "Referral Source", "referralsource": "Referral Source",
"regie_number": "Registration #", "regie_number": "Registration #",
"repairtotal": "Repair Total", "repairtotal": "Repair Total",
@@ -804,6 +806,7 @@
"specialcoveragepolicy": "Special Coverage Policy", "specialcoveragepolicy": "Special Coverage Policy",
"status": "Job Status", "status": "Job Status",
"storage_payable": "Storage/PVRT", "storage_payable": "Storage/PVRT",
"tax_registration_number": "Tax Registration Number",
"towing_payable": "Towing Payable", "towing_payable": "Towing Payable",
"unitnumber": "Unit #", "unitnumber": "Unit #",
"updated_at": "Updated At", "updated_at": "Updated At",
@@ -814,11 +817,10 @@
"admindates": "Administrative Dates", "admindates": "Administrative Dates",
"appraiserinfo": "Appraiser Info", "appraiserinfo": "Appraiser Info",
"claiminfo": "Claim Information", "claiminfo": "Claim Information",
"dedinfo": "Deductible Info",
"estdates": "Estimate Dates", "estdates": "Estimate Dates",
"inscoinfo": "Insurance Company Information",
"laborrates": "Labor Rates", "laborrates": "Labor Rates",
"lossinfo": "Loss Information", "lossinfo": "Loss Information",
"other": "Other",
"repairdates": "Repair Dates", "repairdates": "Repair Dates",
"scheddates": "Schedule Dates" "scheddates": "Schedule Dates"
}, },
@@ -872,6 +874,7 @@
"job": "Job Details", "job": "Job Details",
"jobcosting": "Job Costing", "jobcosting": "Job Costing",
"laborallocations": "Labor Allocations", "laborallocations": "Labor Allocations",
"labortotals": "Labor Totals",
"lines": "Estimate Lines", "lines": "Estimate Lines",
"local_tax_amt": "Local Taxes", "local_tax_amt": "Local Taxes",
"mapa": "Paint Materials", "mapa": "Paint Materials",
@@ -970,11 +973,12 @@
"jobsdetail": { "jobsdetail": {
"claimdetail": "Claim Details", "claimdetail": "Claim Details",
"dates": "Dates", "dates": "Dates",
"financials": "Financials", "general": "General",
"insurance": "Insurance",
"labor": "Labor", "labor": "Labor",
"partssublet": "Parts/Sublet", "partssublet": "Parts/Sublet",
"repairdata": "Repair Data" "rates": "Rates",
"repairdata": "Repair Data",
"totals": "Totals"
}, },
"profilesidebar": { "profilesidebar": {
"profile": "My Profile", "profile": "My Profile",

View File

@@ -683,6 +683,7 @@
"actual_delivery": "Entrega real", "actual_delivery": "Entrega real",
"actual_in": "Real en", "actual_in": "Real en",
"adjustment_bottom_line": "Ajustes", "adjustment_bottom_line": "Ajustes",
"category": "",
"ccc": "", "ccc": "",
"ccd": "", "ccd": "",
"ccdr": "", "ccdr": "",
@@ -690,6 +691,7 @@
"ccm": "", "ccm": "",
"cieca_id": "CIECA ID", "cieca_id": "CIECA ID",
"claim_total": "Reclamar total", "claim_total": "Reclamar total",
"class": "",
"clm_no": "Reclamación #", "clm_no": "Reclamación #",
"clm_total": "Reclamar total", "clm_total": "Reclamar total",
"csr": "Representante de servicio al cliente.", "csr": "Representante de servicio al cliente.",
@@ -746,7 +748,7 @@
"las": "", "las": "",
"lau": "", "lau": "",
"loss_date": "Fecha de pérdida", "loss_date": "Fecha de pérdida",
"loss_desc": "Perdida de uso", "loss_desc": "",
"mapa": "", "mapa": "",
"mash": "", "mash": "",
"other_amount_payable": "Otra cantidad a pagar", "other_amount_payable": "Otra cantidad a pagar",
@@ -804,6 +806,7 @@
"specialcoveragepolicy": "Política de cobertura especial", "specialcoveragepolicy": "Política de cobertura especial",
"status": "Estado del trabajo", "status": "Estado del trabajo",
"storage_payable": "Almacenamiento / PVRT", "storage_payable": "Almacenamiento / PVRT",
"tax_registration_number": "",
"towing_payable": "Remolque a pagar", "towing_payable": "Remolque a pagar",
"unitnumber": "Unidad #", "unitnumber": "Unidad #",
"updated_at": "Actualizado en", "updated_at": "Actualizado en",
@@ -814,11 +817,10 @@
"admindates": "", "admindates": "",
"appraiserinfo": "", "appraiserinfo": "",
"claiminfo": "", "claiminfo": "",
"dedinfo": "",
"estdates": "", "estdates": "",
"inscoinfo": "",
"laborrates": "", "laborrates": "",
"lossinfo": "", "lossinfo": "",
"other": "",
"repairdates": "", "repairdates": "",
"scheddates": "" "scheddates": ""
}, },
@@ -872,6 +874,7 @@
"job": "", "job": "",
"jobcosting": "", "jobcosting": "",
"laborallocations": "", "laborallocations": "",
"labortotals": "",
"lines": "Líneas estimadas", "lines": "Líneas estimadas",
"local_tax_amt": "", "local_tax_amt": "",
"mapa": "", "mapa": "",
@@ -970,11 +973,12 @@
"jobsdetail": { "jobsdetail": {
"claimdetail": "Detalles de la reclamación", "claimdetail": "Detalles de la reclamación",
"dates": "fechas", "dates": "fechas",
"financials": "finanzas", "general": "",
"insurance": "Seguro",
"labor": "Labor", "labor": "Labor",
"partssublet": "Piezas / Subarrendamiento", "partssublet": "Piezas / Subarrendamiento",
"repairdata": "Datos de reparación" "rates": "",
"repairdata": "Datos de reparación",
"totals": ""
}, },
"profilesidebar": { "profilesidebar": {
"profile": "Mi perfil", "profile": "Mi perfil",

View File

@@ -683,6 +683,7 @@
"actual_delivery": "Livraison réelle", "actual_delivery": "Livraison réelle",
"actual_in": "En réel", "actual_in": "En réel",
"adjustment_bottom_line": "Ajustements", "adjustment_bottom_line": "Ajustements",
"category": "",
"ccc": "", "ccc": "",
"ccd": "", "ccd": "",
"ccdr": "", "ccdr": "",
@@ -690,6 +691,7 @@
"ccm": "", "ccm": "",
"cieca_id": "CIECA ID", "cieca_id": "CIECA ID",
"claim_total": "Total réclamation", "claim_total": "Total réclamation",
"class": "",
"clm_no": "Prétendre #", "clm_no": "Prétendre #",
"clm_total": "Total réclamation", "clm_total": "Total réclamation",
"csr": "représentant du service à la clientèle", "csr": "représentant du service à la clientèle",
@@ -746,7 +748,7 @@
"las": "", "las": "",
"lau": "", "lau": "",
"loss_date": "Date de perte", "loss_date": "Date de perte",
"loss_desc": "Perte d'usage", "loss_desc": "",
"mapa": "", "mapa": "",
"mash": "", "mash": "",
"other_amount_payable": "Autre montant à payer", "other_amount_payable": "Autre montant à payer",
@@ -804,6 +806,7 @@
"specialcoveragepolicy": "Politique de couverture spéciale", "specialcoveragepolicy": "Politique de couverture spéciale",
"status": "Statut de l'emploi", "status": "Statut de l'emploi",
"storage_payable": "Stockage / PVRT", "storage_payable": "Stockage / PVRT",
"tax_registration_number": "",
"towing_payable": "Remorquage à payer", "towing_payable": "Remorquage à payer",
"unitnumber": "Unité #", "unitnumber": "Unité #",
"updated_at": "Mis à jour à", "updated_at": "Mis à jour à",
@@ -814,11 +817,10 @@
"admindates": "", "admindates": "",
"appraiserinfo": "", "appraiserinfo": "",
"claiminfo": "", "claiminfo": "",
"dedinfo": "",
"estdates": "", "estdates": "",
"inscoinfo": "",
"laborrates": "", "laborrates": "",
"lossinfo": "", "lossinfo": "",
"other": "",
"repairdates": "", "repairdates": "",
"scheddates": "" "scheddates": ""
}, },
@@ -872,6 +874,7 @@
"job": "", "job": "",
"jobcosting": "", "jobcosting": "",
"laborallocations": "", "laborallocations": "",
"labortotals": "",
"lines": "Estimer les lignes", "lines": "Estimer les lignes",
"local_tax_amt": "", "local_tax_amt": "",
"mapa": "", "mapa": "",
@@ -970,11 +973,12 @@
"jobsdetail": { "jobsdetail": {
"claimdetail": "Détails de la réclamation", "claimdetail": "Détails de la réclamation",
"dates": "Rendez-vous", "dates": "Rendez-vous",
"financials": "Financiers", "general": "",
"insurance": "Assurance",
"labor": "La main d'oeuvre", "labor": "La main d'oeuvre",
"partssublet": "Pièces / Sous-location", "partssublet": "Pièces / Sous-location",
"repairdata": "Données de réparation" "rates": "",
"repairdata": "Données de réparation",
"totals": ""
}, },
"profilesidebar": { "profilesidebar": {
"profile": "Mon profil", "profile": "Mon profil",

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."jobs" DROP COLUMN "tax_registration_number";
type: run_sql

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."jobs" ADD COLUMN "tax_registration_number" text NULL;
type: run_sql

View File

@@ -0,0 +1,257 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_insert_permission
- args:
permission:
check:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- actual_completion
- actual_delivery
- actual_in
- adj_g_disc
- adj_strdis
- adj_towdis
- adjustment_bottom_line
- agt_addr1
- agt_addr2
- agt_city
- agt_co_id
- agt_co_nm
- agt_ct_fn
- agt_ct_ln
- agt_ct_ph
- agt_ct_phx
- agt_ctry
- agt_ea
- agt_fax
- agt_faxx
- agt_lic_no
- agt_ph1
- agt_ph1x
- agt_ph2
- agt_ph2x
- agt_st
- agt_zip
- area_of_damage
- asgn_date
- asgn_no
- asgn_type
- cat_no
- cieca_stl
- cieca_ttl
- ciecaid
- clm_addr1
- clm_addr2
- clm_city
- clm_ct_fn
- clm_ct_ln
- clm_ct_ph
- clm_ct_phx
- clm_ctry
- clm_ea
- clm_fax
- clm_faxx
- clm_no
- clm_ofc_id
- clm_ofc_nm
- clm_ph1
- clm_ph1x
- clm_ph2
- clm_ph2x
- clm_st
- clm_title
- clm_total
- clm_zip
- converted
- created_at
- csr
- cust_pr
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- ded_amt
- ded_status
- depreciation_taxes
- employee_body
- employee_prep
- employee_refinish
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- federal_tax_payable
- federal_tax_rate
- g_bett_amt
- id
- inproduction
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- insd_addr1
- insd_addr2
- insd_city
- insd_co_nm
- insd_ctry
- insd_ea
- insd_fax
- insd_faxx
- insd_fn
- insd_ln
- insd_ph1
- insd_ph1x
- insd_ph2
- insd_ph2x
- insd_st
- insd_title
- insd_zip
- intakechecklist
- invoice_allocation
- invoice_date
- job_totals
- kanbanparent
- kmin
- kmout
- labor_rate_desc
- labor_rate_id
- local_tax_rate
- loss_cat
- loss_date
- loss_desc
- loss_type
- other_amount_payable
- owner_owing
- ownerid
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_co_nm
- ownr_ctry
- ownr_ea
- ownr_fax
- ownr_faxx
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph1x
- ownr_ph2
- ownr_ph2x
- ownr_st
- ownr_title
- ownr_zip
- parts_tax_rates
- pay_amt
- pay_chknm
- pay_date
- pay_type
- payee_nms
- plate_no
- plate_st
- po_number
- policy_no
- production_vars
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_laa
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- referral_source
- regie_number
- ro_number
- scheduled_completion
- scheduled_delivery
- scheduled_in
- selling_dealer
- selling_dealer_contact
- servicing_dealer
- servicing_dealer_contact
- shopid
- special_coverage_policy
- state_tax_rate
- status
- storage_payable
- tax_lbr_rt
- tax_levies_rt
- tax_paint_mat_rt
- tax_predis
- tax_prethr
- tax_pstthr
- tax_str_rt
- tax_sub_rt
- tax_thramt
- tax_tow_rt
- theft_ind
- tlos_ind
- towing_payable
- unit_number
- updated_at
- v_color
- v_make_desc
- v_model_desc
- v_model_yr
- v_vin
- vehicleid
set: {}
role: user
table:
name: jobs
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,258 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_insert_permission
- args:
permission:
check:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- actual_completion
- actual_delivery
- actual_in
- adj_g_disc
- adj_strdis
- adj_towdis
- adjustment_bottom_line
- agt_addr1
- agt_addr2
- agt_city
- agt_co_id
- agt_co_nm
- agt_ct_fn
- agt_ct_ln
- agt_ct_ph
- agt_ct_phx
- agt_ctry
- agt_ea
- agt_fax
- agt_faxx
- agt_lic_no
- agt_ph1
- agt_ph1x
- agt_ph2
- agt_ph2x
- agt_st
- agt_zip
- area_of_damage
- asgn_date
- asgn_no
- asgn_type
- cat_no
- cieca_stl
- cieca_ttl
- ciecaid
- clm_addr1
- clm_addr2
- clm_city
- clm_ct_fn
- clm_ct_ln
- clm_ct_ph
- clm_ct_phx
- clm_ctry
- clm_ea
- clm_fax
- clm_faxx
- clm_no
- clm_ofc_id
- clm_ofc_nm
- clm_ph1
- clm_ph1x
- clm_ph2
- clm_ph2x
- clm_st
- clm_title
- clm_total
- clm_zip
- converted
- created_at
- csr
- cust_pr
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- ded_amt
- ded_status
- depreciation_taxes
- employee_body
- employee_prep
- employee_refinish
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- federal_tax_payable
- federal_tax_rate
- g_bett_amt
- id
- inproduction
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- insd_addr1
- insd_addr2
- insd_city
- insd_co_nm
- insd_ctry
- insd_ea
- insd_fax
- insd_faxx
- insd_fn
- insd_ln
- insd_ph1
- insd_ph1x
- insd_ph2
- insd_ph2x
- insd_st
- insd_title
- insd_zip
- intakechecklist
- invoice_allocation
- invoice_date
- job_totals
- kanbanparent
- kmin
- kmout
- labor_rate_desc
- labor_rate_id
- local_tax_rate
- loss_cat
- loss_date
- loss_desc
- loss_type
- other_amount_payable
- owner_owing
- ownerid
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_co_nm
- ownr_ctry
- ownr_ea
- ownr_fax
- ownr_faxx
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph1x
- ownr_ph2
- ownr_ph2x
- ownr_st
- ownr_title
- ownr_zip
- parts_tax_rates
- pay_amt
- pay_chknm
- pay_date
- pay_type
- payee_nms
- plate_no
- plate_st
- po_number
- policy_no
- production_vars
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_laa
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- referral_source
- regie_number
- ro_number
- scheduled_completion
- scheduled_delivery
- scheduled_in
- selling_dealer
- selling_dealer_contact
- servicing_dealer
- servicing_dealer_contact
- shopid
- special_coverage_policy
- state_tax_rate
- status
- storage_payable
- tax_lbr_rt
- tax_levies_rt
- tax_paint_mat_rt
- tax_predis
- tax_prethr
- tax_pstthr
- tax_registration_number
- tax_str_rt
- tax_sub_rt
- tax_thramt
- tax_tow_rt
- theft_ind
- tlos_ind
- towing_payable
- unit_number
- updated_at
- v_color
- v_make_desc
- v_model_desc
- v_model_yr
- v_vin
- vehicleid
set: {}
role: user
table:
name: jobs
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,258 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: true
columns:
- actual_completion
- actual_delivery
- actual_in
- adj_g_disc
- adj_strdis
- adj_towdis
- adjustment_bottom_line
- agt_addr1
- agt_addr2
- agt_city
- agt_co_id
- agt_co_nm
- agt_ct_fn
- agt_ct_ln
- agt_ct_ph
- agt_ct_phx
- agt_ctry
- agt_ea
- agt_fax
- agt_faxx
- agt_lic_no
- agt_ph1
- agt_ph1x
- agt_ph2
- agt_ph2x
- agt_st
- agt_zip
- area_of_damage
- asgn_date
- asgn_no
- asgn_type
- cat_no
- cieca_stl
- cieca_ttl
- ciecaid
- clm_addr1
- clm_addr2
- clm_city
- clm_ct_fn
- clm_ct_ln
- clm_ct_ph
- clm_ct_phx
- clm_ctry
- clm_ea
- clm_fax
- clm_faxx
- clm_no
- clm_ofc_id
- clm_ofc_nm
- clm_ph1
- clm_ph1x
- clm_ph2
- clm_ph2x
- clm_st
- clm_title
- clm_total
- clm_zip
- converted
- created_at
- csr
- cust_pr
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- ded_amt
- ded_status
- depreciation_taxes
- employee_body
- employee_prep
- employee_refinish
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- federal_tax_payable
- federal_tax_rate
- g_bett_amt
- id
- inproduction
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- insd_addr1
- insd_addr2
- insd_city
- insd_co_nm
- insd_ctry
- insd_ea
- insd_fax
- insd_faxx
- insd_fn
- insd_ln
- insd_ph1
- insd_ph1x
- insd_ph2
- insd_ph2x
- insd_st
- insd_title
- insd_zip
- intakechecklist
- invoice_allocation
- invoice_date
- job_totals
- kanbanparent
- kmin
- kmout
- labor_rate_desc
- labor_rate_id
- local_tax_rate
- loss_cat
- loss_date
- loss_desc
- loss_type
- other_amount_payable
- owner_owing
- ownerid
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_co_nm
- ownr_ctry
- ownr_ea
- ownr_fax
- ownr_faxx
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph1x
- ownr_ph2
- ownr_ph2x
- ownr_st
- ownr_title
- ownr_zip
- parts_tax_rates
- pay_amt
- pay_chknm
- pay_date
- pay_type
- payee_nms
- plate_no
- plate_st
- po_number
- policy_no
- production_vars
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_laa
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- referral_source
- regie_number
- ro_number
- scheduled_completion
- scheduled_delivery
- scheduled_in
- selling_dealer
- selling_dealer_contact
- servicing_dealer
- servicing_dealer_contact
- shopid
- special_coverage_policy
- state_tax_rate
- status
- storage_payable
- tax_lbr_rt
- tax_levies_rt
- tax_paint_mat_rt
- tax_predis
- tax_prethr
- tax_pstthr
- tax_str_rt
- tax_sub_rt
- tax_thramt
- tax_tow_rt
- theft_ind
- tlos_ind
- towing_payable
- unit_number
- updated_at
- v_color
- v_make_desc
- v_model_desc
- v_model_yr
- v_vin
- vehicleid
computed_fields: []
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: jobs
schema: public
type: create_select_permission

View File

@@ -0,0 +1,259 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: true
columns:
- actual_completion
- actual_delivery
- actual_in
- adj_g_disc
- adj_strdis
- adj_towdis
- adjustment_bottom_line
- agt_addr1
- agt_addr2
- agt_city
- agt_co_id
- agt_co_nm
- agt_ct_fn
- agt_ct_ln
- agt_ct_ph
- agt_ct_phx
- agt_ctry
- agt_ea
- agt_fax
- agt_faxx
- agt_lic_no
- agt_ph1
- agt_ph1x
- agt_ph2
- agt_ph2x
- agt_st
- agt_zip
- area_of_damage
- asgn_date
- asgn_no
- asgn_type
- cat_no
- cieca_stl
- cieca_ttl
- ciecaid
- clm_addr1
- clm_addr2
- clm_city
- clm_ct_fn
- clm_ct_ln
- clm_ct_ph
- clm_ct_phx
- clm_ctry
- clm_ea
- clm_fax
- clm_faxx
- clm_no
- clm_ofc_id
- clm_ofc_nm
- clm_ph1
- clm_ph1x
- clm_ph2
- clm_ph2x
- clm_st
- clm_title
- clm_total
- clm_zip
- converted
- created_at
- csr
- cust_pr
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- ded_amt
- ded_status
- depreciation_taxes
- employee_body
- employee_prep
- employee_refinish
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- federal_tax_payable
- federal_tax_rate
- g_bett_amt
- id
- inproduction
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- insd_addr1
- insd_addr2
- insd_city
- insd_co_nm
- insd_ctry
- insd_ea
- insd_fax
- insd_faxx
- insd_fn
- insd_ln
- insd_ph1
- insd_ph1x
- insd_ph2
- insd_ph2x
- insd_st
- insd_title
- insd_zip
- intakechecklist
- invoice_allocation
- invoice_date
- job_totals
- kanbanparent
- kmin
- kmout
- labor_rate_desc
- labor_rate_id
- local_tax_rate
- loss_cat
- loss_date
- loss_desc
- loss_type
- other_amount_payable
- owner_owing
- ownerid
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_co_nm
- ownr_ctry
- ownr_ea
- ownr_fax
- ownr_faxx
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph1x
- ownr_ph2
- ownr_ph2x
- ownr_st
- ownr_title
- ownr_zip
- parts_tax_rates
- pay_amt
- pay_chknm
- pay_date
- pay_type
- payee_nms
- plate_no
- plate_st
- po_number
- policy_no
- production_vars
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_laa
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- referral_source
- regie_number
- ro_number
- scheduled_completion
- scheduled_delivery
- scheduled_in
- selling_dealer
- selling_dealer_contact
- servicing_dealer
- servicing_dealer_contact
- shopid
- special_coverage_policy
- state_tax_rate
- status
- storage_payable
- tax_lbr_rt
- tax_levies_rt
- tax_paint_mat_rt
- tax_predis
- tax_prethr
- tax_pstthr
- tax_registration_number
- tax_str_rt
- tax_sub_rt
- tax_thramt
- tax_tow_rt
- theft_ind
- tlos_ind
- towing_payable
- unit_number
- updated_at
- v_color
- v_make_desc
- v_model_desc
- v_model_yr
- v_vin
- vehicleid
computed_fields: []
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: jobs
schema: public
type: create_select_permission

View File

@@ -0,0 +1,257 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_update_permission
- args:
permission:
columns:
- actual_completion
- actual_delivery
- actual_in
- adj_g_disc
- adj_strdis
- adj_towdis
- adjustment_bottom_line
- agt_addr1
- agt_addr2
- agt_city
- agt_co_id
- agt_co_nm
- agt_ct_fn
- agt_ct_ln
- agt_ct_ph
- agt_ct_phx
- agt_ctry
- agt_ea
- agt_fax
- agt_faxx
- agt_lic_no
- agt_ph1
- agt_ph1x
- agt_ph2
- agt_ph2x
- agt_st
- agt_zip
- area_of_damage
- asgn_date
- asgn_no
- asgn_type
- cat_no
- cieca_stl
- cieca_ttl
- ciecaid
- clm_addr1
- clm_addr2
- clm_city
- clm_ct_fn
- clm_ct_ln
- clm_ct_ph
- clm_ct_phx
- clm_ctry
- clm_ea
- clm_fax
- clm_faxx
- clm_no
- clm_ofc_id
- clm_ofc_nm
- clm_ph1
- clm_ph1x
- clm_ph2
- clm_ph2x
- clm_st
- clm_title
- clm_total
- clm_zip
- converted
- created_at
- csr
- cust_pr
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- ded_amt
- ded_status
- depreciation_taxes
- employee_body
- employee_prep
- employee_refinish
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- federal_tax_payable
- federal_tax_rate
- g_bett_amt
- id
- inproduction
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- insd_addr1
- insd_addr2
- insd_city
- insd_co_nm
- insd_ctry
- insd_ea
- insd_fax
- insd_faxx
- insd_fn
- insd_ln
- insd_ph1
- insd_ph1x
- insd_ph2
- insd_ph2x
- insd_st
- insd_title
- insd_zip
- intakechecklist
- invoice_allocation
- invoice_date
- job_totals
- kanbanparent
- kmin
- kmout
- labor_rate_desc
- labor_rate_id
- local_tax_rate
- loss_cat
- loss_date
- loss_desc
- loss_type
- other_amount_payable
- owner_owing
- ownerid
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_co_nm
- ownr_ctry
- ownr_ea
- ownr_fax
- ownr_faxx
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph1x
- ownr_ph2
- ownr_ph2x
- ownr_st
- ownr_title
- ownr_zip
- parts_tax_rates
- pay_amt
- pay_chknm
- pay_date
- pay_type
- payee_nms
- plate_no
- plate_st
- po_number
- policy_no
- production_vars
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_laa
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- referral_source
- regie_number
- ro_number
- scheduled_completion
- scheduled_delivery
- scheduled_in
- selling_dealer
- selling_dealer_contact
- servicing_dealer
- servicing_dealer_contact
- shopid
- special_coverage_policy
- state_tax_rate
- status
- storage_payable
- tax_lbr_rt
- tax_levies_rt
- tax_paint_mat_rt
- tax_predis
- tax_prethr
- tax_pstthr
- tax_str_rt
- tax_sub_rt
- tax_thramt
- tax_tow_rt
- theft_ind
- tlos_ind
- towing_payable
- unit_number
- updated_at
- v_color
- v_make_desc
- v_model_desc
- v_model_yr
- v_vin
- vehicleid
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
set: {}
role: user
table:
name: jobs
schema: public
type: create_update_permission

View File

@@ -0,0 +1,258 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_update_permission
- args:
permission:
columns:
- actual_completion
- actual_delivery
- actual_in
- adj_g_disc
- adj_strdis
- adj_towdis
- adjustment_bottom_line
- agt_addr1
- agt_addr2
- agt_city
- agt_co_id
- agt_co_nm
- agt_ct_fn
- agt_ct_ln
- agt_ct_ph
- agt_ct_phx
- agt_ctry
- agt_ea
- agt_fax
- agt_faxx
- agt_lic_no
- agt_ph1
- agt_ph1x
- agt_ph2
- agt_ph2x
- agt_st
- agt_zip
- area_of_damage
- asgn_date
- asgn_no
- asgn_type
- cat_no
- cieca_stl
- cieca_ttl
- ciecaid
- clm_addr1
- clm_addr2
- clm_city
- clm_ct_fn
- clm_ct_ln
- clm_ct_ph
- clm_ct_phx
- clm_ctry
- clm_ea
- clm_fax
- clm_faxx
- clm_no
- clm_ofc_id
- clm_ofc_nm
- clm_ph1
- clm_ph1x
- clm_ph2
- clm_ph2x
- clm_st
- clm_title
- clm_total
- clm_zip
- converted
- created_at
- csr
- cust_pr
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- ded_amt
- ded_status
- depreciation_taxes
- employee_body
- employee_prep
- employee_refinish
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- federal_tax_payable
- federal_tax_rate
- g_bett_amt
- id
- inproduction
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- insd_addr1
- insd_addr2
- insd_city
- insd_co_nm
- insd_ctry
- insd_ea
- insd_fax
- insd_faxx
- insd_fn
- insd_ln
- insd_ph1
- insd_ph1x
- insd_ph2
- insd_ph2x
- insd_st
- insd_title
- insd_zip
- intakechecklist
- invoice_allocation
- invoice_date
- job_totals
- kanbanparent
- kmin
- kmout
- labor_rate_desc
- labor_rate_id
- local_tax_rate
- loss_cat
- loss_date
- loss_desc
- loss_type
- other_amount_payable
- owner_owing
- ownerid
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_co_nm
- ownr_ctry
- ownr_ea
- ownr_fax
- ownr_faxx
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph1x
- ownr_ph2
- ownr_ph2x
- ownr_st
- ownr_title
- ownr_zip
- parts_tax_rates
- pay_amt
- pay_chknm
- pay_date
- pay_type
- payee_nms
- plate_no
- plate_st
- po_number
- policy_no
- production_vars
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_laa
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- referral_source
- regie_number
- ro_number
- scheduled_completion
- scheduled_delivery
- scheduled_in
- selling_dealer
- selling_dealer_contact
- servicing_dealer
- servicing_dealer_contact
- shopid
- special_coverage_policy
- state_tax_rate
- status
- storage_payable
- tax_lbr_rt
- tax_levies_rt
- tax_paint_mat_rt
- tax_predis
- tax_prethr
- tax_pstthr
- tax_registration_number
- tax_str_rt
- tax_sub_rt
- tax_thramt
- tax_tow_rt
- theft_ind
- tlos_ind
- towing_payable
- unit_number
- updated_at
- v_color
- v_make_desc
- v_model_desc
- v_model_yr
- v_vin
- vehicleid
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
set: {}
role: user
table:
name: jobs
schema: public
type: create_update_permission

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."jobs" DROP COLUMN "class";
type: run_sql

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."jobs" ADD COLUMN "class" text NULL;
type: run_sql

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."jobs" DROP COLUMN "category";
type: run_sql

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."jobs" ADD COLUMN "category" text NULL;
type: run_sql

View File

@@ -0,0 +1,258 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_insert_permission
- args:
permission:
check:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- actual_completion
- actual_delivery
- actual_in
- adj_g_disc
- adj_strdis
- adj_towdis
- adjustment_bottom_line
- agt_addr1
- agt_addr2
- agt_city
- agt_co_id
- agt_co_nm
- agt_ct_fn
- agt_ct_ln
- agt_ct_ph
- agt_ct_phx
- agt_ctry
- agt_ea
- agt_fax
- agt_faxx
- agt_lic_no
- agt_ph1
- agt_ph1x
- agt_ph2
- agt_ph2x
- agt_st
- agt_zip
- area_of_damage
- asgn_date
- asgn_no
- asgn_type
- cat_no
- cieca_stl
- cieca_ttl
- ciecaid
- clm_addr1
- clm_addr2
- clm_city
- clm_ct_fn
- clm_ct_ln
- clm_ct_ph
- clm_ct_phx
- clm_ctry
- clm_ea
- clm_fax
- clm_faxx
- clm_no
- clm_ofc_id
- clm_ofc_nm
- clm_ph1
- clm_ph1x
- clm_ph2
- clm_ph2x
- clm_st
- clm_title
- clm_total
- clm_zip
- converted
- created_at
- csr
- cust_pr
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- ded_amt
- ded_status
- depreciation_taxes
- employee_body
- employee_prep
- employee_refinish
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- federal_tax_payable
- federal_tax_rate
- g_bett_amt
- id
- inproduction
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- insd_addr1
- insd_addr2
- insd_city
- insd_co_nm
- insd_ctry
- insd_ea
- insd_fax
- insd_faxx
- insd_fn
- insd_ln
- insd_ph1
- insd_ph1x
- insd_ph2
- insd_ph2x
- insd_st
- insd_title
- insd_zip
- intakechecklist
- invoice_allocation
- invoice_date
- job_totals
- kanbanparent
- kmin
- kmout
- labor_rate_desc
- labor_rate_id
- local_tax_rate
- loss_cat
- loss_date
- loss_desc
- loss_type
- other_amount_payable
- owner_owing
- ownerid
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_co_nm
- ownr_ctry
- ownr_ea
- ownr_fax
- ownr_faxx
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph1x
- ownr_ph2
- ownr_ph2x
- ownr_st
- ownr_title
- ownr_zip
- parts_tax_rates
- pay_amt
- pay_chknm
- pay_date
- pay_type
- payee_nms
- plate_no
- plate_st
- po_number
- policy_no
- production_vars
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_laa
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- referral_source
- regie_number
- ro_number
- scheduled_completion
- scheduled_delivery
- scheduled_in
- selling_dealer
- selling_dealer_contact
- servicing_dealer
- servicing_dealer_contact
- shopid
- special_coverage_policy
- state_tax_rate
- status
- storage_payable
- tax_lbr_rt
- tax_levies_rt
- tax_paint_mat_rt
- tax_predis
- tax_prethr
- tax_pstthr
- tax_registration_number
- tax_str_rt
- tax_sub_rt
- tax_thramt
- tax_tow_rt
- theft_ind
- tlos_ind
- towing_payable
- unit_number
- updated_at
- v_color
- v_make_desc
- v_model_desc
- v_model_yr
- v_vin
- vehicleid
set: {}
role: user
table:
name: jobs
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,260 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_insert_permission
- args:
permission:
check:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- actual_completion
- actual_delivery
- actual_in
- adj_g_disc
- adj_strdis
- adj_towdis
- adjustment_bottom_line
- agt_addr1
- agt_addr2
- agt_city
- agt_co_id
- agt_co_nm
- agt_ct_fn
- agt_ct_ln
- agt_ct_ph
- agt_ct_phx
- agt_ctry
- agt_ea
- agt_fax
- agt_faxx
- agt_lic_no
- agt_ph1
- agt_ph1x
- agt_ph2
- agt_ph2x
- agt_st
- agt_zip
- area_of_damage
- asgn_date
- asgn_no
- asgn_type
- cat_no
- category
- cieca_stl
- cieca_ttl
- ciecaid
- class
- clm_addr1
- clm_addr2
- clm_city
- clm_ct_fn
- clm_ct_ln
- clm_ct_ph
- clm_ct_phx
- clm_ctry
- clm_ea
- clm_fax
- clm_faxx
- clm_no
- clm_ofc_id
- clm_ofc_nm
- clm_ph1
- clm_ph1x
- clm_ph2
- clm_ph2x
- clm_st
- clm_title
- clm_total
- clm_zip
- converted
- created_at
- csr
- cust_pr
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- ded_amt
- ded_status
- depreciation_taxes
- employee_body
- employee_prep
- employee_refinish
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- federal_tax_payable
- federal_tax_rate
- g_bett_amt
- id
- inproduction
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- insd_addr1
- insd_addr2
- insd_city
- insd_co_nm
- insd_ctry
- insd_ea
- insd_fax
- insd_faxx
- insd_fn
- insd_ln
- insd_ph1
- insd_ph1x
- insd_ph2
- insd_ph2x
- insd_st
- insd_title
- insd_zip
- intakechecklist
- invoice_allocation
- invoice_date
- job_totals
- kanbanparent
- kmin
- kmout
- labor_rate_desc
- labor_rate_id
- local_tax_rate
- loss_cat
- loss_date
- loss_desc
- loss_type
- other_amount_payable
- owner_owing
- ownerid
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_co_nm
- ownr_ctry
- ownr_ea
- ownr_fax
- ownr_faxx
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph1x
- ownr_ph2
- ownr_ph2x
- ownr_st
- ownr_title
- ownr_zip
- parts_tax_rates
- pay_amt
- pay_chknm
- pay_date
- pay_type
- payee_nms
- plate_no
- plate_st
- po_number
- policy_no
- production_vars
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_laa
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- referral_source
- regie_number
- ro_number
- scheduled_completion
- scheduled_delivery
- scheduled_in
- selling_dealer
- selling_dealer_contact
- servicing_dealer
- servicing_dealer_contact
- shopid
- special_coverage_policy
- state_tax_rate
- status
- storage_payable
- tax_lbr_rt
- tax_levies_rt
- tax_paint_mat_rt
- tax_predis
- tax_prethr
- tax_pstthr
- tax_registration_number
- tax_str_rt
- tax_sub_rt
- tax_thramt
- tax_tow_rt
- theft_ind
- tlos_ind
- towing_payable
- unit_number
- updated_at
- v_color
- v_make_desc
- v_model_desc
- v_model_yr
- v_vin
- vehicleid
set: {}
role: user
table:
name: jobs
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,259 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: true
columns:
- actual_completion
- actual_delivery
- actual_in
- adj_g_disc
- adj_strdis
- adj_towdis
- adjustment_bottom_line
- agt_addr1
- agt_addr2
- agt_city
- agt_co_id
- agt_co_nm
- agt_ct_fn
- agt_ct_ln
- agt_ct_ph
- agt_ct_phx
- agt_ctry
- agt_ea
- agt_fax
- agt_faxx
- agt_lic_no
- agt_ph1
- agt_ph1x
- agt_ph2
- agt_ph2x
- agt_st
- agt_zip
- area_of_damage
- asgn_date
- asgn_no
- asgn_type
- cat_no
- cieca_stl
- cieca_ttl
- ciecaid
- clm_addr1
- clm_addr2
- clm_city
- clm_ct_fn
- clm_ct_ln
- clm_ct_ph
- clm_ct_phx
- clm_ctry
- clm_ea
- clm_fax
- clm_faxx
- clm_no
- clm_ofc_id
- clm_ofc_nm
- clm_ph1
- clm_ph1x
- clm_ph2
- clm_ph2x
- clm_st
- clm_title
- clm_total
- clm_zip
- converted
- created_at
- csr
- cust_pr
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- ded_amt
- ded_status
- depreciation_taxes
- employee_body
- employee_prep
- employee_refinish
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- federal_tax_payable
- federal_tax_rate
- g_bett_amt
- id
- inproduction
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- insd_addr1
- insd_addr2
- insd_city
- insd_co_nm
- insd_ctry
- insd_ea
- insd_fax
- insd_faxx
- insd_fn
- insd_ln
- insd_ph1
- insd_ph1x
- insd_ph2
- insd_ph2x
- insd_st
- insd_title
- insd_zip
- intakechecklist
- invoice_allocation
- invoice_date
- job_totals
- kanbanparent
- kmin
- kmout
- labor_rate_desc
- labor_rate_id
- local_tax_rate
- loss_cat
- loss_date
- loss_desc
- loss_type
- other_amount_payable
- owner_owing
- ownerid
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_co_nm
- ownr_ctry
- ownr_ea
- ownr_fax
- ownr_faxx
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph1x
- ownr_ph2
- ownr_ph2x
- ownr_st
- ownr_title
- ownr_zip
- parts_tax_rates
- pay_amt
- pay_chknm
- pay_date
- pay_type
- payee_nms
- plate_no
- plate_st
- po_number
- policy_no
- production_vars
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_laa
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- referral_source
- regie_number
- ro_number
- scheduled_completion
- scheduled_delivery
- scheduled_in
- selling_dealer
- selling_dealer_contact
- servicing_dealer
- servicing_dealer_contact
- shopid
- special_coverage_policy
- state_tax_rate
- status
- storage_payable
- tax_lbr_rt
- tax_levies_rt
- tax_paint_mat_rt
- tax_predis
- tax_prethr
- tax_pstthr
- tax_registration_number
- tax_str_rt
- tax_sub_rt
- tax_thramt
- tax_tow_rt
- theft_ind
- tlos_ind
- towing_payable
- unit_number
- updated_at
- v_color
- v_make_desc
- v_model_desc
- v_model_yr
- v_vin
- vehicleid
computed_fields: []
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: jobs
schema: public
type: create_select_permission

View File

@@ -0,0 +1,261 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: true
columns:
- actual_completion
- actual_delivery
- actual_in
- adj_g_disc
- adj_strdis
- adj_towdis
- adjustment_bottom_line
- agt_addr1
- agt_addr2
- agt_city
- agt_co_id
- agt_co_nm
- agt_ct_fn
- agt_ct_ln
- agt_ct_ph
- agt_ct_phx
- agt_ctry
- agt_ea
- agt_fax
- agt_faxx
- agt_lic_no
- agt_ph1
- agt_ph1x
- agt_ph2
- agt_ph2x
- agt_st
- agt_zip
- area_of_damage
- asgn_date
- asgn_no
- asgn_type
- cat_no
- category
- cieca_stl
- cieca_ttl
- ciecaid
- class
- clm_addr1
- clm_addr2
- clm_city
- clm_ct_fn
- clm_ct_ln
- clm_ct_ph
- clm_ct_phx
- clm_ctry
- clm_ea
- clm_fax
- clm_faxx
- clm_no
- clm_ofc_id
- clm_ofc_nm
- clm_ph1
- clm_ph1x
- clm_ph2
- clm_ph2x
- clm_st
- clm_title
- clm_total
- clm_zip
- converted
- created_at
- csr
- cust_pr
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- ded_amt
- ded_status
- depreciation_taxes
- employee_body
- employee_prep
- employee_refinish
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- federal_tax_payable
- federal_tax_rate
- g_bett_amt
- id
- inproduction
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- insd_addr1
- insd_addr2
- insd_city
- insd_co_nm
- insd_ctry
- insd_ea
- insd_fax
- insd_faxx
- insd_fn
- insd_ln
- insd_ph1
- insd_ph1x
- insd_ph2
- insd_ph2x
- insd_st
- insd_title
- insd_zip
- intakechecklist
- invoice_allocation
- invoice_date
- job_totals
- kanbanparent
- kmin
- kmout
- labor_rate_desc
- labor_rate_id
- local_tax_rate
- loss_cat
- loss_date
- loss_desc
- loss_type
- other_amount_payable
- owner_owing
- ownerid
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_co_nm
- ownr_ctry
- ownr_ea
- ownr_fax
- ownr_faxx
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph1x
- ownr_ph2
- ownr_ph2x
- ownr_st
- ownr_title
- ownr_zip
- parts_tax_rates
- pay_amt
- pay_chknm
- pay_date
- pay_type
- payee_nms
- plate_no
- plate_st
- po_number
- policy_no
- production_vars
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_laa
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- referral_source
- regie_number
- ro_number
- scheduled_completion
- scheduled_delivery
- scheduled_in
- selling_dealer
- selling_dealer_contact
- servicing_dealer
- servicing_dealer_contact
- shopid
- special_coverage_policy
- state_tax_rate
- status
- storage_payable
- tax_lbr_rt
- tax_levies_rt
- tax_paint_mat_rt
- tax_predis
- tax_prethr
- tax_pstthr
- tax_registration_number
- tax_str_rt
- tax_sub_rt
- tax_thramt
- tax_tow_rt
- theft_ind
- tlos_ind
- towing_payable
- unit_number
- updated_at
- v_color
- v_make_desc
- v_model_desc
- v_model_yr
- v_vin
- vehicleid
computed_fields: []
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: jobs
schema: public
type: create_select_permission

View File

@@ -0,0 +1,258 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_update_permission
- args:
permission:
columns:
- actual_completion
- actual_delivery
- actual_in
- adj_g_disc
- adj_strdis
- adj_towdis
- adjustment_bottom_line
- agt_addr1
- agt_addr2
- agt_city
- agt_co_id
- agt_co_nm
- agt_ct_fn
- agt_ct_ln
- agt_ct_ph
- agt_ct_phx
- agt_ctry
- agt_ea
- agt_fax
- agt_faxx
- agt_lic_no
- agt_ph1
- agt_ph1x
- agt_ph2
- agt_ph2x
- agt_st
- agt_zip
- area_of_damage
- asgn_date
- asgn_no
- asgn_type
- cat_no
- cieca_stl
- cieca_ttl
- ciecaid
- clm_addr1
- clm_addr2
- clm_city
- clm_ct_fn
- clm_ct_ln
- clm_ct_ph
- clm_ct_phx
- clm_ctry
- clm_ea
- clm_fax
- clm_faxx
- clm_no
- clm_ofc_id
- clm_ofc_nm
- clm_ph1
- clm_ph1x
- clm_ph2
- clm_ph2x
- clm_st
- clm_title
- clm_total
- clm_zip
- converted
- created_at
- csr
- cust_pr
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- ded_amt
- ded_status
- depreciation_taxes
- employee_body
- employee_prep
- employee_refinish
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- federal_tax_payable
- federal_tax_rate
- g_bett_amt
- id
- inproduction
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- insd_addr1
- insd_addr2
- insd_city
- insd_co_nm
- insd_ctry
- insd_ea
- insd_fax
- insd_faxx
- insd_fn
- insd_ln
- insd_ph1
- insd_ph1x
- insd_ph2
- insd_ph2x
- insd_st
- insd_title
- insd_zip
- intakechecklist
- invoice_allocation
- invoice_date
- job_totals
- kanbanparent
- kmin
- kmout
- labor_rate_desc
- labor_rate_id
- local_tax_rate
- loss_cat
- loss_date
- loss_desc
- loss_type
- other_amount_payable
- owner_owing
- ownerid
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_co_nm
- ownr_ctry
- ownr_ea
- ownr_fax
- ownr_faxx
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph1x
- ownr_ph2
- ownr_ph2x
- ownr_st
- ownr_title
- ownr_zip
- parts_tax_rates
- pay_amt
- pay_chknm
- pay_date
- pay_type
- payee_nms
- plate_no
- plate_st
- po_number
- policy_no
- production_vars
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_laa
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- referral_source
- regie_number
- ro_number
- scheduled_completion
- scheduled_delivery
- scheduled_in
- selling_dealer
- selling_dealer_contact
- servicing_dealer
- servicing_dealer_contact
- shopid
- special_coverage_policy
- state_tax_rate
- status
- storage_payable
- tax_lbr_rt
- tax_levies_rt
- tax_paint_mat_rt
- tax_predis
- tax_prethr
- tax_pstthr
- tax_registration_number
- tax_str_rt
- tax_sub_rt
- tax_thramt
- tax_tow_rt
- theft_ind
- tlos_ind
- towing_payable
- unit_number
- updated_at
- v_color
- v_make_desc
- v_model_desc
- v_model_yr
- v_vin
- vehicleid
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
set: {}
role: user
table:
name: jobs
schema: public
type: create_update_permission

View File

@@ -0,0 +1,260 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_update_permission
- args:
permission:
columns:
- actual_completion
- actual_delivery
- actual_in
- adj_g_disc
- adj_strdis
- adj_towdis
- adjustment_bottom_line
- agt_addr1
- agt_addr2
- agt_city
- agt_co_id
- agt_co_nm
- agt_ct_fn
- agt_ct_ln
- agt_ct_ph
- agt_ct_phx
- agt_ctry
- agt_ea
- agt_fax
- agt_faxx
- agt_lic_no
- agt_ph1
- agt_ph1x
- agt_ph2
- agt_ph2x
- agt_st
- agt_zip
- area_of_damage
- asgn_date
- asgn_no
- asgn_type
- cat_no
- category
- cieca_stl
- cieca_ttl
- ciecaid
- class
- clm_addr1
- clm_addr2
- clm_city
- clm_ct_fn
- clm_ct_ln
- clm_ct_ph
- clm_ct_phx
- clm_ctry
- clm_ea
- clm_fax
- clm_faxx
- clm_no
- clm_ofc_id
- clm_ofc_nm
- clm_ph1
- clm_ph1x
- clm_ph2
- clm_ph2x
- clm_st
- clm_title
- clm_total
- clm_zip
- converted
- created_at
- csr
- cust_pr
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- ded_amt
- ded_status
- depreciation_taxes
- employee_body
- employee_prep
- employee_refinish
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- federal_tax_payable
- federal_tax_rate
- g_bett_amt
- id
- inproduction
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- insd_addr1
- insd_addr2
- insd_city
- insd_co_nm
- insd_ctry
- insd_ea
- insd_fax
- insd_faxx
- insd_fn
- insd_ln
- insd_ph1
- insd_ph1x
- insd_ph2
- insd_ph2x
- insd_st
- insd_title
- insd_zip
- intakechecklist
- invoice_allocation
- invoice_date
- job_totals
- kanbanparent
- kmin
- kmout
- labor_rate_desc
- labor_rate_id
- local_tax_rate
- loss_cat
- loss_date
- loss_desc
- loss_type
- other_amount_payable
- owner_owing
- ownerid
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_co_nm
- ownr_ctry
- ownr_ea
- ownr_fax
- ownr_faxx
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph1x
- ownr_ph2
- ownr_ph2x
- ownr_st
- ownr_title
- ownr_zip
- parts_tax_rates
- pay_amt
- pay_chknm
- pay_date
- pay_type
- payee_nms
- plate_no
- plate_st
- po_number
- policy_no
- production_vars
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_laa
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- referral_source
- regie_number
- ro_number
- scheduled_completion
- scheduled_delivery
- scheduled_in
- selling_dealer
- selling_dealer_contact
- servicing_dealer
- servicing_dealer_contact
- shopid
- special_coverage_policy
- state_tax_rate
- status
- storage_payable
- tax_lbr_rt
- tax_levies_rt
- tax_paint_mat_rt
- tax_predis
- tax_prethr
- tax_pstthr
- tax_registration_number
- tax_str_rt
- tax_sub_rt
- tax_thramt
- tax_tow_rt
- theft_ind
- tlos_ind
- towing_payable
- unit_number
- updated_at
- v_color
- v_make_desc
- v_model_desc
- v_model_yr
- v_vin
- vehicleid
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
set: {}
role: user
table:
name: jobs
schema: public
type: create_update_permission

View File

@@ -2101,9 +2101,11 @@ tables:
- asgn_no - asgn_no
- asgn_type - asgn_type
- cat_no - cat_no
- category
- cieca_stl - cieca_stl
- cieca_ttl - cieca_ttl
- ciecaid - ciecaid
- class
- clm_addr1 - clm_addr1
- clm_addr2 - clm_addr2
- clm_city - clm_city
@@ -2287,6 +2289,7 @@ tables:
- tax_predis - tax_predis
- tax_prethr - tax_prethr
- tax_pstthr - tax_pstthr
- tax_registration_number
- tax_str_rt - tax_str_rt
- tax_sub_rt - tax_sub_rt
- tax_thramt - tax_thramt
@@ -2338,9 +2341,11 @@ tables:
- asgn_no - asgn_no
- asgn_type - asgn_type
- cat_no - cat_no
- category
- cieca_stl - cieca_stl
- cieca_ttl - cieca_ttl
- ciecaid - ciecaid
- class
- clm_addr1 - clm_addr1
- clm_addr2 - clm_addr2
- clm_city - clm_city
@@ -2524,6 +2529,7 @@ tables:
- tax_predis - tax_predis
- tax_prethr - tax_prethr
- tax_pstthr - tax_pstthr
- tax_registration_number
- tax_str_rt - tax_str_rt
- tax_sub_rt - tax_sub_rt
- tax_thramt - tax_thramt
@@ -2585,9 +2591,11 @@ tables:
- asgn_no - asgn_no
- asgn_type - asgn_type
- cat_no - cat_no
- category
- cieca_stl - cieca_stl
- cieca_ttl - cieca_ttl
- ciecaid - ciecaid
- class
- clm_addr1 - clm_addr1
- clm_addr2 - clm_addr2
- clm_city - clm_city
@@ -2771,6 +2779,7 @@ tables:
- tax_predis - tax_predis
- tax_prethr - tax_prethr
- tax_pstthr - tax_pstthr
- tax_registration_number
- tax_str_rt - tax_str_rt
- tax_sub_rt - tax_sub_rt
- tax_thramt - tax_thramt

View File

@@ -1,6 +1,11 @@
var admin = require("firebase-admin"); var admin = require("firebase-admin");
const path = require("path"); const path = require("path");
require("dotenv").config({ path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || 'development'}`) }); require("dotenv").config({
path: path.resolve(
process.cwd(),
`.env.${process.env.NODE_ENV || "development"}`
),
});
var serviceAccount = require(process.env.FIREBASE_ADMINSDK_JSON); var serviceAccount = require(process.env.FIREBASE_ADMINSDK_JSON);
@@ -12,8 +17,6 @@ admin.initializeApp({
exports.admin = admin; exports.admin = admin;
exports.sendNotification = (req, res) => { exports.sendNotification = (req, res) => {
console.log("Firebase Send.");
var registrationToken = var registrationToken =
"fqIWg8ENDFyrRrMWJ1sItR:APA91bHirdZ05Zo66flMlvala97SMXoiQGwP4oCvMwd-vVrSauD_WoNim3kXHGqyP-bzENjkXwA5icyUAReFbeHn6dIaPcbpcsXuY73-eJAXvZiu1gIsrd1BOsnj3dEMT7Q4F6mTPth1"; "fqIWg8ENDFyrRrMWJ1sItR:APA91bHirdZ05Zo66flMlvala97SMXoiQGwP4oCvMwd-vVrSauD_WoNim3kXHGqyP-bzENjkXwA5icyUAReFbeHn6dIaPcbpcsXuY73-eJAXvZiu1gIsrd1BOsnj3dEMT7Q4F6mTPth1";
var message = { var message = {

View File

@@ -13,8 +13,7 @@ const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY);
exports.payment = async (req, res) => { exports.payment = async (req, res) => {
const { amount, stripe_acct_id } = req.body; const { amount, stripe_acct_id } = req.body;
console.log("exports.payment -> amount", amount);
console.log("exports.payment -> stripe_acct_id", stripe_acct_id);
try { try {
await stripe.paymentIntents await stripe.paymentIntents
.create( .create(
@@ -47,8 +46,7 @@ exports.payment = async (req, res) => {
exports.mobile_payment = async (req, res) => { exports.mobile_payment = async (req, res) => {
const { amount, stripe_acct_id } = req.body; const { amount, stripe_acct_id } = req.body;
console.log("exports.payment -> amount", amount);
console.log("exports.payment -> stripe_acct_id", stripe_acct_id);
try { try {
await stripe.paymentIntents await stripe.paymentIntents
.create( .create(

View File

@@ -11,26 +11,18 @@ require("dotenv").config({
exports.techLogin = async (req, res) => { exports.techLogin = async (req, res) => {
const { shopid, employeeid, pin } = req.body; const { shopid, employeeid, pin } = req.body;
console.log(
"exports.techLogin -> shopid, employeeid, password",
shopid,
employeeid,
pin
);
try { try {
const result = await client.request(queries.QUERY_EMPLOYEE_PIN, { const result = await client.request(queries.QUERY_EMPLOYEE_PIN, {
shopId: shopid, shopId: shopid,
employeeId: employeeid, employeeId: employeeid,
}); });
console.log("exports.techLogin -> result", result);
let valid = false; let valid = false;
let error; let error;
let technician; let technician;
if (result.employees && result.employees[0]) { if (result.employees && result.employees[0]) {
const dbRecord = result.employees[0]; const dbRecord = result.employees[0];
console.log("exports.techLogin -> dbRecord", dbRecord);
if (dbRecord.pin === pin) { if (dbRecord.pin === pin) {
valid = true; valid = true;
delete dbRecord.pin; delete dbRecord.pin;