Refactored capturing of resp. centers. + added auto allocate BOD-131

This commit is contained in:
Patrick Fic
2020-05-20 16:21:17 -07:00
parent 0dbacf0b9e
commit d8a4c87d3a
24 changed files with 3251 additions and 203 deletions

View File

@@ -1340,6 +1340,48 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>mapa</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>mash</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>paa</name> <name>paa</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -1508,6 +1550,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>pas</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>tow</name> <name>tow</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -1828,6 +1891,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>default_returned</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>default_scheduled</name> <name>default_scheduled</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -6640,6 +6724,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>autoallocate</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>changestatus</name> <name>changestatus</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -7889,6 +7994,132 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>la1</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>la2</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>la3</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>la4</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>laa</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>lab</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>labor_rate_desc</name> <name>labor_rate_desc</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -7910,6 +8141,174 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>lad</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>lae</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>laf</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>lag</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>lam</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>lar</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>las</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>lau</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>loss_date</name> <name>loss_date</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -7952,6 +8351,48 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>mapa</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>mash</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>other_amount_payable</name> <name>other_amount_payable</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -8057,6 +8498,174 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>paa</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>pal</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>pam</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>pan</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>pao</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>pap</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>par</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>pas</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>pay_date</name> <name>pay_date</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -10109,6 +10718,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>suspense</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>total_repairs</name> <name>total_repairs</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>

View File

@@ -28,165 +28,167 @@ export function JobsTotalsTableComponent({ bodyshop, job }) {
<Row> <Row>
<Descriptions <Descriptions
bordered bordered
size='small' size="small"
column={3} column={3}
title={t("jobs.labels.rates")}> title={t("jobs.labels.rates")}
>
<Descriptions.Item label={t("jobs.fields.rate_laa")}> <Descriptions.Item label={t("jobs.fields.rate_laa")}>
<Statistic <Statistic
value={totals.rates.rate_laa.total.toFormat()} value={totals.rates.laa.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_laa.hours.toFixed( suffix={`(${totals.rates.laa.hours.toFixed(2)} @ ${
2 totals.rates.laa.rate
)} @ ${totals.rates.rate_laa.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.fields.rate_lab")}> <Descriptions.Item label={t("jobs.fields.rate_lab")}>
<Statistic <Statistic
value={totals.rates.rate_lab.total.toFormat()} value={totals.rates.lab.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_lab.hours.toFixed( suffix={`(${totals.rates.lab.hours.toFixed(2)} @ ${
2 totals.rates.lab.rate
)} @ ${totals.rates.rate_lab.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.fields.rate_lad")}> <Descriptions.Item label={t("jobs.fields.rate_lad")}>
<Statistic <Statistic
value={totals.rates.rate_lad.total.toFormat()} value={totals.rates.lad.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_lad.hours.toFixed( suffix={`(${totals.rates.lad.hours.toFixed(2)} @ ${
2 totals.rates.lad.rate
)} @ ${totals.rates.rate_lad.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.fields.rate_lae")}> <Descriptions.Item label={t("jobs.fields.rate_lae")}>
<Statistic <Statistic
value={totals.rates.rate_lae.total.toFormat()} value={totals.rates.lae.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_lae.hours.toFixed( suffix={`(${totals.rates.lae.hours.toFixed(2)} @ ${
2 totals.rates.lae.rate
)} @ ${totals.rates.rate_lae.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.fields.rate_laf")}> <Descriptions.Item label={t("jobs.fields.rate_laf")}>
<Statistic <Statistic
value={totals.rates.rate_laf.total.toFormat()} value={totals.rates.laf.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_laf.hours.toFixed( suffix={`(${totals.rates.laf.hours.toFixed(2)} @ ${
2 totals.rates.laf.rate
)} @ ${totals.rates.rate_laf.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.fields.rate_lag")}> <Descriptions.Item label={t("jobs.fields.rate_lag")}>
<Statistic <Statistic
value={totals.rates.rate_lag.total.toFormat()} value={totals.rates.lag.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_lag.hours.toFixed( suffix={`(${totals.rates.lag.hours.toFixed(2)} @ ${
2 totals.rates.lag.rate
)} @ ${totals.rates.rate_lag.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.fields.rate_lam")}> <Descriptions.Item label={t("jobs.fields.rate_lam")}>
<Statistic <Statistic
value={totals.rates.rate_lam.total.toFormat()} value={totals.rates.lam.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_lam.hours.toFixed( suffix={`(${totals.rates.lam.hours.toFixed(2)} @ ${
2 totals.rates.lam.rate
)} @ ${totals.rates.rate_lam.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.fields.rate_lar")}> <Descriptions.Item label={t("jobs.fields.rate_lar")}>
<Statistic <Statistic
value={totals.rates.rate_lar.total.toFormat()} value={totals.rates.lar.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_lar.hours.toFixed( suffix={`(${totals.rates.lar.hours.toFixed(2)} @ ${
2 totals.rates.lar.rate
)} @ ${totals.rates.rate_lar.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.fields.rate_las")}> <Descriptions.Item label={t("jobs.fields.rate_las")}>
<Statistic <Statistic
value={totals.rates.rate_las.total.toFormat()} value={totals.rates.las.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_las.hours.toFixed( suffix={`(${totals.rates.las.hours.toFixed(2)} @ ${
2 totals.rates.las.rate
)} @ ${totals.rates.rate_las.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.fields.rate_lau")}> <Descriptions.Item label={t("jobs.fields.rate_lau")}>
<Statistic <Statistic
value={totals.rates.rate_lau.total.toFormat()} value={totals.rates.lau.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_lau.hours.toFixed( suffix={`(${totals.rates.lau.hours.toFixed(2)} @ ${
2 totals.rates.lau.rate
)} @ ${totals.rates.rate_lau.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.fields.rate_la1")}> <Descriptions.Item label={t("jobs.fields.rate_la1")}>
<Statistic <Statistic
value={totals.rates.rate_la1.total.toFormat()} value={totals.rates.la1.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_la1.hours.toFixed( suffix={`(${totals.rates.la1.hours.toFixed(2)} @ ${
2 totals.rates.la1.rate
)} @ ${totals.rates.rate_la1.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.fields.rate_la2")}> <Descriptions.Item label={t("jobs.fields.rate_la2")}>
<Statistic <Statistic
value={totals.rates.rate_la2.total.toFormat()} value={totals.rates.la2.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_la2.hours.toFixed( suffix={`(${totals.rates.la2.hours.toFixed(2)} @ ${
2 totals.rates.la2.rate
)} @ ${totals.rates.rate_la2.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.fields.rate_la3")}> <Descriptions.Item label={t("jobs.fields.rate_la3")}>
<Statistic <Statistic
value={totals.rates.rate_la3.total.toFormat()} value={totals.rates.la3.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_la3.hours.toFixed( suffix={`(${totals.rates.la3.hours.toFixed(2)} @ ${
2 totals.rates.la3.rate
)} @ ${totals.rates.rate_la3.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.fields.rate_la4")}> <Descriptions.Item label={t("jobs.fields.rate_la4")}>
<Statistic <Statistic
value={totals.rates.rate_la4.total.toFormat()} value={totals.rates.la4.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_la4.hours.toFixed( suffix={`(${totals.rates.la4.hours.toFixed(2)} @ ${
2 totals.rates.la4.rate
)} @ ${totals.rates.rate_la4.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.fields.rate_atp")}> <Descriptions.Item label={t("jobs.fields.rate_atp")}>
<Statistic <Statistic
value={totals.rates.rate_atp.total.toFormat()} value={totals.rates.atp.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.rate_atp.hours.toFixed( suffix={`(${totals.rates.atp.hours.toFixed(2)} @ ${
2 totals.rates.atp.rate
)} @ ${totals.rates.rate_atp.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.labels.paint_mat")}> <Descriptions.Item label={t("jobs.labels.mapa")}>
<Statistic <Statistic
value={totals.rates.paint_mat.total.toFormat()} value={totals.rates.mapa.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.paint_mat.hours.toFixed( suffix={`(${totals.rates.mapa.hours.toFixed(2)} @ ${
2 totals.rates.mapa.rate
)} @ ${totals.rates.paint_mat.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item label={t("jobs.labels.shop_mat")}> <Descriptions.Item label={t("jobs.labels.shop_mat")}>
<Statistic <Statistic
value={totals.rates.shop_mat.total.toFormat()} value={totals.rates.mash.total.toFormat()}
precision={2} precision={2}
suffix={`(${totals.rates.shop_mat.hours.toFixed( suffix={`(${totals.rates.mash.hours.toFixed(2)} @ ${
2 totals.rates.mash.rate
)} @ ${totals.rates.shop_mat.rate})`} })`}
/> />
</Descriptions.Item> </Descriptions.Item>
<Descriptions.Item <Descriptions.Item
style={{ color: "red" }} style={{ color: "red" }}
label={t("jobs.labels.rates_subtotal")}> label={t("jobs.labels.rates_subtotal")}
>
<Statistic value={totals.rates.subtotal.toFormat()} /> <Statistic value={totals.rates.subtotal.toFormat()} />
</Descriptions.Item> </Descriptions.Item>
</Descriptions> </Descriptions>
@@ -195,9 +197,10 @@ export function JobsTotalsTableComponent({ bodyshop, job }) {
<Col span={8}> <Col span={8}>
<Descriptions <Descriptions
bordered bordered
size='small' size="small"
column={1} column={1}
title={t("jobs.labels.partssubletstotal")}> title={t("jobs.labels.partssubletstotal")}
>
<Descriptions.Item label={t("jobs.labels.partstotal")}> <Descriptions.Item label={t("jobs.labels.partstotal")}>
<Statistic <Statistic
value={totals.parts.parts.total.toFormat()} value={totals.parts.parts.total.toFormat()}
@@ -216,9 +219,10 @@ export function JobsTotalsTableComponent({ bodyshop, job }) {
<Col span={8}> <Col span={8}>
<Descriptions <Descriptions
bordered bordered
size='small' size="small"
column={1} column={1}
title={t("jobs.labels.totals")}> title={t("jobs.labels.totals")}
>
<Descriptions.Item label={t("jobs.labels.subtotal")}> <Descriptions.Item label={t("jobs.labels.subtotal")}>
<Statistic value={totals.totals.subtotal.toFormat()} /> <Statistic value={totals.totals.subtotal.toFormat()} />
</Descriptions.Item> </Descriptions.Item>

View File

@@ -23,7 +23,7 @@ function CalculateTaxesTotals(job, otherTotals) {
if (!!!val.tax_part) return acc; if (!!!val.tax_part) return acc;
if (!!job.parts_tax_rates[val.part_type]) { if (!!job.parts_tax_rates[val.part_type]) {
return acc.add( return acc.add(
Dinero({ amount: val.act_price * 100 }) Dinero({ amount: Math.round(val.act_price * 100) })
.multiply(val.part_qty) .multiply(val.part_qty)
.percentage( .percentage(
(job.parts_tax_rates[val.part_type].prt_tax_rt || 0) * 100 (job.parts_tax_rates[val.part_type].prt_tax_rt || 0) * 100
@@ -43,18 +43,18 @@ function CalculateTaxesTotals(job, otherTotals) {
otherTotals.rates.rates_subtotal.percentage((job.tax_lbr_rt || 0) * 100) otherTotals.rates.rates_subtotal.percentage((job.tax_lbr_rt || 0) * 100)
) )
.add( .add(
Dinero({ amount: (job.towing_payable || 0) * 100 }).percentage( Dinero({
(job.tax_tow_rt || 0) * 100 amount: Math.round((job.towing_payable || 0) * 100),
) }).percentage((job.tax_tow_rt || 0) * 100)
) )
.add( .add(
Dinero({ amount: (job.storage_payable || 0) * 100 }).percentage( Dinero({
(job.tax_str_rt || 0) * 100 amount: Math.round((job.storage_payable || 0) * 100),
) }).percentage((job.tax_str_rt || 0) * 100)
) )
.add( .add(
otherTotals.rates.paint_mat.total otherTotals.rates.mapa.total
.add(otherTotals.rates.shop_mat.total) .add(otherTotals.rates.mash.total)
.percentage((job.tax_paint_mat_rt || 0) * 100) .percentage((job.tax_paint_mat_rt || 0) * 100)
), ),
local_tax: subtotal.percentage((job.local_tax_rate || 0) * 100), local_tax: subtotal.percentage((job.local_tax_rate || 0) * 100),
@@ -74,91 +74,91 @@ function CalculateRatesTotals(ratesList, shoprates) {
const jobLines = ratesList.joblines; const jobLines = ratesList.joblines;
let ret = { let ret = {
rate_la1: { la1: {
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LA1") .filter((item) => item.mod_lbr_ty === "LA1")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
rate: ratesList.rate_la1 || 0, rate: ratesList.rate_la1 || 0,
}, },
rate_la2: { la2: {
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LA2") .filter((item) => item.mod_lbr_ty === "LA2")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
rate: ratesList.rate_la2 || 0, rate: ratesList.rate_la2 || 0,
}, },
rate_la3: { la3: {
rate: ratesList.rate_la3 || 0, rate: ratesList.rate_la3 || 0,
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LA3") .filter((item) => item.mod_lbr_ty === "LA3")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
}, },
rate_la4: { la4: {
rate: ratesList.rate_la4 || 0, rate: ratesList.rate_la4 || 0,
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LA4") .filter((item) => item.mod_lbr_ty === "LA4")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
}, },
rate_laa: { laa: {
rate: ratesList.rate_laa || 0, rate: ratesList.rate_laa || 0,
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAA") .filter((item) => item.mod_lbr_ty === "LAA")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
}, },
rate_lab: { lab: {
rate: ratesList.rate_lab || 0, rate: ratesList.rate_lab || 0,
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAB") .filter((item) => item.mod_lbr_ty === "LAB")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
}, },
rate_lad: { lad: {
rate: ratesList.rate_lad || 0, rate: ratesList.rate_lad || 0,
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAD") .filter((item) => item.mod_lbr_ty === "LAD")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
}, },
rate_lae: { lae: {
rate: ratesList.rate_lae || 0, rate: ratesList.rate_lae || 0,
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAE") .filter((item) => item.mod_lbr_ty === "LAE")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
}, },
rate_laf: { laf: {
rate: ratesList.rate_laf || 0, rate: ratesList.rate_laf || 0,
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAF") .filter((item) => item.mod_lbr_ty === "LAF")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
}, },
rate_lag: { lag: {
rate: ratesList.rate_lag || 0, rate: ratesList.rate_lag || 0,
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAG") .filter((item) => item.mod_lbr_ty === "LAG")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
}, },
rate_lam: { lam: {
rate: ratesList.rate_lam || 0, rate: ratesList.rate_lam || 0,
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAM") .filter((item) => item.mod_lbr_ty === "LAM")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
}, },
rate_lar: { lar: {
rate: ratesList.rate_lar || 0, rate: ratesList.rate_lar || 0,
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAR") .filter((item) => item.mod_lbr_ty === "LAR")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
}, },
rate_las: { las: {
rate: ratesList.rate_las || 0, rate: ratesList.rate_las || 0,
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAS") .filter((item) => item.mod_lbr_ty === "LAS")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
}, },
rate_lau: { lau: {
rate: ratesList.rate_lau || 0, rate: ratesList.rate_lau || 0,
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAU") .filter((item) => item.mod_lbr_ty === "LAU")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
}, },
rate_atp: { atp: {
rate: shoprates.rate_atp || 0, rate: shoprates.rate_atp || 0,
hours: hours:
jobLines.filter((item) => item.line_desc.includes("ATS Amount")) jobLines.filter((item) => item.line_desc.includes("ATS Amount"))
@@ -178,13 +178,13 @@ function CalculateRatesTotals(ratesList, shoprates) {
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0) .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0)
: 0, : 0,
}, },
paint_mat: { mapa: {
rate: ratesList.rate_mapa || 0, rate: ratesList.rate_mapa || 0,
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty === "LAR") .filter((item) => item.mod_lbr_ty === "LAR")
.reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0),
}, },
shop_mat: { mash: {
rate: ratesList.rate_mash || 0, rate: ratesList.rate_mash || 0,
hours: jobLines hours: jobLines
.filter((item) => item.mod_lbr_ty !== "LAR") .filter((item) => item.mod_lbr_ty !== "LAR")
@@ -200,8 +200,8 @@ function CalculateRatesTotals(ratesList, shoprates) {
.divide(10); .divide(10);
subtotal = subtotal.add(ret[property].total); subtotal = subtotal.add(ret[property].total);
if ( if (
property !== "paint_mat" && property !== "mapa" &&
property !== "shop_mat" property !== "mash"
//&& property !== "rate_atp" //&& property !== "rate_atp"
) )
rates_subtotal = rates_subtotal.add(ret[property].total); rates_subtotal = rates_subtotal.add(ret[property].total);
@@ -236,19 +236,19 @@ function CalculatePartsTotals(jobLines) {
acc.parts.list[value.part_type].total acc.parts.list[value.part_type].total
? { ? {
total: acc.parts.list[value.part_type].total.add( total: acc.parts.list[value.part_type].total.add(
Dinero({ amount: value.act_price * 100 }).multiply( Dinero({
value.part_qty amount: Math.round((value.act_price || 0) * 100),
) }).multiply(value.part_qty || 1)
), ),
} }
: { : {
total: Dinero({ total: Dinero({
amount: (value.act_price || 0) * 100, amount: Math.round((value.act_price || 0) * 100),
}).multiply(value.part_qty), }).multiply(value.part_qty || 1),
}, },
}, },
subtotal: acc.parts.subtotal.add( subtotal: acc.parts.subtotal.add(
Dinero({ amount: value.act_price * 100 }).multiply( Dinero({ amount: Math.round(value.act_price * 100) }).multiply(
value.part_qty value.part_qty
) )
), ),
@@ -262,7 +262,7 @@ function CalculatePartsTotals(jobLines) {
sublets: { sublets: {
...acc.sublets, ...acc.sublets,
subtotal: acc.sublets.subtotal.add( subtotal: acc.sublets.subtotal.add(
Dinero({ amount: value.act_price * 100 }) Dinero({ amount: Math.round(value.act_price * 100) })
), ),
//TODO Add Adjustments in //TODO Add Adjustments in
}, },

View File

@@ -1,7 +1,7 @@
import { PlusCircleFilled, CloseCircleFilled } from "@ant-design/icons"; import { PlusCircleFilled, CloseCircleFilled } from "@ant-design/icons";
import { Button, InputNumber, Select } from "antd"; import { Button, InputNumber, Select } from "antd";
import Dinero from "dinero.js"; import Dinero from "dinero.js";
import React, { useState } from "react"; import React, { useState, useEffect } from "react";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
@@ -14,6 +14,7 @@ const mapStateToProps = createStructuredSelector({
const { Option } = Select; const { Option } = Select;
export function JobsCloseLabmatAllocationButton({ export function JobsCloseLabmatAllocationButton({
remainingAmount,
allocationKey, allocationKey,
allocation, allocation,
setAllocations, setAllocations,
@@ -27,20 +28,19 @@ export function JobsCloseLabmatAllocationButton({
const existingIndex = allocation.allocations.findIndex( const existingIndex = allocation.allocations.findIndex(
(e) => e.center === state.center (e) => e.center === state.center
); );
console.log("handleAllocate -> existingIndex", existingIndex);
const newAllocations = allocation.allocations.slice(0); const newAllocations = allocation.allocations.slice(0);
if (existingIndex > -1) { if (existingIndex > -1) {
newAllocations[existingIndex] = { newAllocations[existingIndex] = {
center: state.center, center: state.center,
amount: newAllocations[existingIndex].amount.add( amount: newAllocations[existingIndex].amount.add(
Dinero({ amount: state.amount * 100 }) Dinero({ amount: (state.amount || 0) * 100 })
), ),
}; };
} else { } else {
newAllocations.push({ newAllocations.push({
center: state.center, center: state.center,
amount: Dinero({ amount: state.amount * 100 }), amount: Dinero({ amount: (state.amount || 0) * 100 }),
}); });
} }
@@ -56,7 +56,11 @@ export function JobsCloseLabmatAllocationButton({
setState({ center: "", amount: 0 }); setState({ center: "", amount: 0 });
}; };
const showAllocation = allocation.total.getAmount() > 0; const showAllocation = allocation.total.getAmount() > 0;
useEffect(() => {
if (remainingAmount === 0) setVisible(false);
}, [remainingAmount, setVisible]);
if (!showAllocation) return null; if (!showAllocation) return null;
return ( return (
@@ -78,11 +82,13 @@ export function JobsCloseLabmatAllocationButton({
min={0} min={0}
value={state.amount} value={state.amount}
onChange={(val) => setState({ ...state, amount: val })} onChange={(val) => setState({ ...state, amount: val })}
max={allocation.total.getAmount() / 100} max={remainingAmount / 100}
/> />
<Button <Button
onClick={handleAllocate} onClick={handleAllocate}
disabled={state.amount === 0 || state.center === ""} disabled={
state.amount === 0 || state.center === "" || remainingAmount === 0
}
> >
{t("jobs.actions.allocate")} {t("jobs.actions.allocate")}
</Button> </Button>

View File

@@ -11,6 +11,7 @@ export default function JobsCloseLabMatAllocationTags({
<Tag <Tag
closable closable
visible visible
color='green'
onClose={() => { onClose={() => {
setAllocations((state) => { setAllocations((state) => {
return { return {

View File

@@ -0,0 +1,67 @@
import React from "react";
import { Button } from "antd";
import { selectBodyshop } from "../../redux/user/user.selectors";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { useTranslation } from "react-i18next";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
});
export function JobsCloseAutoAllocate({
bodyshop,
labmatAllocations,
setLabmatAllocations,
partsAllocations,
setPartsAllocations,
}) {
const { t } = useTranslation();
const handleAllocate = () => {
const { defaults } = bodyshop.md_responsibility_centers;
Object.keys(labmatAllocations).forEach((i) => {
const defaultProfitCenter = defaults.profits[i.toUpperCase()];
if (!!defaultProfitCenter && labmatAllocations[i].total.getAmount() > 0) {
setLabmatAllocations((st) => {
return {
...st,
[i]: {
...labmatAllocations[i],
allocations: [
{
center: defaultProfitCenter,
amount: labmatAllocations[i].total,
},
],
},
};
});
}
});
Object.keys(partsAllocations).forEach((i) => {
const defaultProfitCenter = defaults.profits[i.toUpperCase()];
if (!!defaultProfitCenter && partsAllocations[i].total.getAmount() > 0) {
setPartsAllocations((st) => {
return {
...st,
[i]: {
...partsAllocations[i],
allocations: [
{
center: defaultProfitCenter,
amount: partsAllocations[i].total,
},
],
},
};
});
}
});
};
return <Button onClick={handleAllocate}>{t("jobs.actions.autoallocate")}</Button>;
}
export default connect(mapStateToProps, null)(JobsCloseAutoAllocate);

View File

@@ -4,16 +4,13 @@ import { useTranslation } from "react-i18next";
import AllocationButton from "../jobs-close-allocation-button/jobs-close-allocation-button.component"; import AllocationButton from "../jobs-close-allocation-button/jobs-close-allocation-button.component";
import AllocationTags from "../jobs-close-allocation-tags/jobs-close-allocation-tags.component"; import AllocationTags from "../jobs-close-allocation-tags/jobs-close-allocation-tags.component";
export default function JobCloseLabMatAllocation({ export default function JobCloseLabMatAllocation({
labmatAllocations, labmatAllocations,
setLabmatAllocations, setLabmatAllocations,
labMatTotalAllocation labMatTotalAllocation,
}) { }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<div style={{ display: "flex" }}> <div style={{ display: "flex" }}>
<table> <table>
@@ -53,6 +50,18 @@ export default function JobCloseLabMatAllocation({
<td> <td>
<AllocationButton <AllocationButton
allocationKey={alloc} allocationKey={alloc}
remainingAmount={labmatAllocations[alloc].total
.subtract(
Dinero({
amount: labmatAllocations[alloc].allocations.reduce(
(acc, val) => {
return acc + val.amount.getAmount();
},
0
),
})
)
.getAmount()}
allocation={labmatAllocations[alloc]} allocation={labmatAllocations[alloc]}
setAllocations={setLabmatAllocations} setAllocations={setLabmatAllocations}
/> />
@@ -71,9 +80,9 @@ export default function JobCloseLabMatAllocation({
<tr> <tr>
<td></td> <td></td>
<td>{labmatAllocations.subtotal.toFormat()}</td> <td>{labmatAllocations.subtotal.toFormat()}</td>
<td></td>
<td></td>
<td>{labMatTotalAllocation.toFormat()}</td> <td>{labMatTotalAllocation.toFormat()}</td>
<td></td>
<td></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -28,7 +28,7 @@ export default function JobsClosePartsAllocation({
{Object.keys(partsAllocations).map((alloc, idx) => { {Object.keys(partsAllocations).map((alloc, idx) => {
return ( return (
<tr key={idx}> <tr key={idx}>
<td>{t(`jobs.fields.${alloc}`)}</td> <td>{t(`jobs.fields.${alloc.toLowerCase()}`)}</td>
<td> <td>
{partsAllocations[alloc].total && {partsAllocations[alloc].total &&
partsAllocations[alloc].total.toFormat()} partsAllocations[alloc].total.toFormat()}
@@ -50,6 +50,18 @@ export default function JobsClosePartsAllocation({
<td> <td>
<AllocationButton <AllocationButton
allocationKey={alloc} allocationKey={alloc}
remainingAmount={partsAllocations[alloc].total
.subtract(
Dinero({
amount: partsAllocations[alloc].allocations.reduce(
(acc, val) => {
return acc + val.amount.getAmount();
},
0
),
})
)
.getAmount()}
allocation={partsAllocations[alloc]} allocation={partsAllocations[alloc]}
setAllocations={setPartsAllocations} setAllocations={setPartsAllocations}
/> />
@@ -74,9 +86,9 @@ export default function JobsClosePartsAllocation({
}, 0), }, 0),
}).toFormat()} }).toFormat()}
</td> </td>
<td></td>
<td></td>
<td>{partsAllocatedTotal.toFormat()}</td> <td>{partsAllocatedTotal.toFormat()}</td>
<td></td>
<td></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -50,6 +50,13 @@ export default function JobsCloseTotals({
/> />
<Statistic <Statistic
title={t("jobs.labels.suspense")} title={t("jobs.labels.suspense")}
valueStyle={{
color:
jobTotals.totals.subtotal.subtract(labMatTotal).subtract(partsTotal)
.getAmount() === 0
? "green"
: "red",
}}
value={jobTotals.totals.subtotal value={jobTotals.totals.subtotal
.subtract(labMatTotal) .subtract(labMatTotal)
.subtract(partsTotal) .subtract(partsTotal)

View File

@@ -6,9 +6,9 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
import JobsClosePartsAllocation from "../../components/jobs-close-parts-allocation/jobs-close-parts-allocation.component"; import JobsClosePartsAllocation from "../../components/jobs-close-parts-allocation/jobs-close-parts-allocation.component";
import Dinero from "dinero.js"; import Dinero from "dinero.js";
import JobsCloseTotals from "../../components/jobs-close-totals/jobs-close-totals.component"; import JobsCloseTotals from "../../components/jobs-close-totals/jobs-close-totals.component";
import JobsCloseAutoAllocate from "../../components/jobs-close-auto-allocate/jobs-close-auto-allocate.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
}); });
@@ -22,7 +22,6 @@ export function JobsCloseComponent({ job, bodyshop, jobTotals }) {
return acc; return acc;
}, {}) }, {})
); );
console.log("JobsCloseComponent -> labmatAllocations", labmatAllocations);
const [partsAllocations, setPartsAllocations] = useState({ const [partsAllocations, setPartsAllocations] = useState({
...Object.keys(jobTotals.parts.parts.list).reduce((acc, val) => { ...Object.keys(jobTotals.parts.parts.list).reduce((acc, val) => {
@@ -30,14 +29,12 @@ export function JobsCloseComponent({ job, bodyshop, jobTotals }) {
return acc; return acc;
}, {}), }, {}),
sublet: { pas: {
...jobTotals.parts.sublets, ...jobTotals.parts.sublets,
allocations: [], allocations: [],
}, },
}); });
console.log("JobsCloseComponent -> partsAllocations", partsAllocations);
const labmatAllocatedTotalsArray = Object.keys(labmatAllocations) const labmatAllocatedTotalsArray = Object.keys(labmatAllocations)
.filter((i) => !i.includes("subtotal")) .filter((i) => !i.includes("subtotal"))
.map((i) => labmatAllocations[i].allocations) .map((i) => labmatAllocations[i].allocations)
@@ -66,6 +63,12 @@ export function JobsCloseComponent({ job, bodyshop, jobTotals }) {
labMatTotal={labmatAllocatedTotal} labMatTotal={labmatAllocatedTotal}
partsTotal={partsAllocatedTotal} partsTotal={partsAllocatedTotal}
/> />
<JobsCloseAutoAllocate
labmatAllocations={labmatAllocations}
setLabmatAllocations={setLabmatAllocations}
partsAllocations={partsAllocations}
setPartsAllocations={setPartsAllocations}
/>
<JobsCloseLaborMaterialAllocation <JobsCloseLaborMaterialAllocation
labmatAllocations={labmatAllocations} labmatAllocations={labmatAllocations}
setLabmatAllocations={setLabmatAllocations} setLabmatAllocations={setLabmatAllocations}

View File

@@ -13,7 +13,6 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
import JobsCloseComponent from "./jobs-close.component"; import JobsCloseComponent from "./jobs-close.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
}); });

View File

@@ -90,7 +90,7 @@
"responsibilitycenter_accountnumber": "Account Number", "responsibilitycenter_accountnumber": "Account Number",
"responsibilitycenters": { "responsibilitycenters": {
"atp": "ATP", "atp": "ATP",
"lab": "Labor", "lab": "Body",
"lad": "Diagnostic", "lad": "Diagnostic",
"lae": "Electrical", "lae": "Electrical",
"laf": "Frame", "laf": "Frame",
@@ -99,6 +99,8 @@
"lar": "Refinish", "lar": "Refinish",
"las": "Structural", "las": "Structural",
"lau": "Detail", "lau": "Detail",
"mapa": "Paint Materials",
"mash": "Shop Materials",
"paa": "Aftermarket", "paa": "Aftermarket",
"pac": "Chrome", "pac": "Chrome",
"pal": "LKQ", "pal": "LKQ",
@@ -107,6 +109,7 @@
"pao": "Other", "pao": "Other",
"pap": "OEM Partial", "pap": "OEM Partial",
"par": "Recored", "par": "Recored",
"pas": "Sublet",
"tow": "Towing" "tow": "Towing"
}, },
"shopname": "Shop Name", "shopname": "Shop Name",
@@ -124,6 +127,7 @@
"default_invoiced": "Default Invoiced Status", "default_invoiced": "Default Invoiced Status",
"default_ordered": "Default Ordered Status", "default_ordered": "Default Ordered Status",
"default_received": "Default Received Status", "default_received": "Default Received Status",
"default_returned": "Default Returned",
"default_scheduled": "Default Scheduled Status", "default_scheduled": "Default Scheduled Status",
"open_statuses": "Open Statuses" "open_statuses": "Open Statuses"
}, },
@@ -458,6 +462,7 @@
"addNote": "Add Note", "addNote": "Add Note",
"addtoproduction": "Add to Production", "addtoproduction": "Add to Production",
"allocate": "Allocate", "allocate": "Allocate",
"autoallocate": "Auto Allocate",
"changestatus": "Change Status", "changestatus": "Change Status",
"convert": "Convert", "convert": "Convert",
"gotojob": "Go to Job", "gotojob": "Go to Job",
@@ -521,14 +526,38 @@
"ins_ph1": "File Handler Phone #", "ins_ph1": "File Handler Phone #",
"kmin": "Mileage In", "kmin": "Mileage In",
"kmout": "Mileage Out", "kmout": "Mileage Out",
"la1": "LA1",
"la2": "LA2",
"la3": "LA3",
"la4": "LA4",
"laa": "Aluminum ",
"lab": "Body",
"labor_rate_desc": "Labor Rate Name", "labor_rate_desc": "Labor Rate Name",
"lad": "Diagnostic",
"lae": "Electrical",
"laf": "Frame",
"lag": "Glass",
"lam": "Mechanical",
"lar": "Refinish",
"las": "Structural",
"lau": "LAU",
"loss_date": "Loss Date", "loss_date": "Loss Date",
"loss_desc": "Loss of Use", "loss_desc": "Loss of Use",
"mapa": "Paint Materials",
"mash": "Shop Materials",
"other_amount_payable": "Other Amount Payable", "other_amount_payable": "Other Amount Payable",
"owner": "Owner", "owner": "Owner",
"owner_owing": "Cust. Owes", "owner_owing": "Cust. Owes",
"ownr_ea": "Email", "ownr_ea": "Email",
"ownr_ph1": "Phone 1", "ownr_ph1": "Phone 1",
"paa": "Aftermarket",
"pal": "LKQ",
"pam": "Remanufactured",
"pan": "OEM/New",
"pao": "Other",
"pap": "EOM Partial",
"par": "Re-cored",
"pas": "Sublet",
"pay_date": "Inspection Date", "pay_date": "Inspection Date",
"phoneshort": "PH", "phoneshort": "PH",
"policy_no": "Policy #", "policy_no": "Policy #",
@@ -632,6 +661,7 @@
"state_tax_amt": "State/Provincial Taxes", "state_tax_amt": "State/Provincial Taxes",
"subletstotal": "Sublets Total", "subletstotal": "Sublets Total",
"subtotal": "Subtotal", "subtotal": "Subtotal",
"suspense": "Suspense",
"total_repairs": "Total Repairs", "total_repairs": "Total Repairs",
"totals": "Totals", "totals": "Totals",
"vehicle_info": "Vehicle" "vehicle_info": "Vehicle"

View File

@@ -99,6 +99,8 @@
"lar": "", "lar": "",
"las": "", "las": "",
"lau": "", "lau": "",
"mapa": "",
"mash": "",
"paa": "", "paa": "",
"pac": "", "pac": "",
"pal": "", "pal": "",
@@ -107,6 +109,7 @@
"pao": "", "pao": "",
"pap": "", "pap": "",
"par": "", "par": "",
"pas": "",
"tow": "" "tow": ""
}, },
"shopname": "", "shopname": "",
@@ -124,6 +127,7 @@
"default_invoiced": "", "default_invoiced": "",
"default_ordered": "", "default_ordered": "",
"default_received": "", "default_received": "",
"default_returned": "",
"default_scheduled": "", "default_scheduled": "",
"open_statuses": "" "open_statuses": ""
}, },
@@ -458,6 +462,7 @@
"addNote": "Añadir la nota", "addNote": "Añadir la nota",
"addtoproduction": "", "addtoproduction": "",
"allocate": "", "allocate": "",
"autoallocate": "",
"changestatus": "Cambiar Estado", "changestatus": "Cambiar Estado",
"convert": "Convertir", "convert": "Convertir",
"gotojob": "", "gotojob": "",
@@ -521,14 +526,38 @@
"ins_ph1": "File Handler Phone #", "ins_ph1": "File Handler Phone #",
"kmin": "Kilometraje en", "kmin": "Kilometraje en",
"kmout": "Kilometraje", "kmout": "Kilometraje",
"la1": "",
"la2": "",
"la3": "",
"la4": "",
"laa": "",
"lab": "",
"labor_rate_desc": "Nombre de la tasa laboral", "labor_rate_desc": "Nombre de la tasa laboral",
"lad": "",
"lae": "",
"laf": "",
"lag": "",
"lam": "",
"lar": "",
"las": "",
"lau": "",
"loss_date": "Fecha de pérdida", "loss_date": "Fecha de pérdida",
"loss_desc": "Perdida de uso", "loss_desc": "Perdida de uso",
"mapa": "",
"mash": "",
"other_amount_payable": "Otra cantidad a pagar", "other_amount_payable": "Otra cantidad a pagar",
"owner": "Propietario", "owner": "Propietario",
"owner_owing": "Cust. Debe", "owner_owing": "Cust. Debe",
"ownr_ea": "Email", "ownr_ea": "Email",
"ownr_ph1": "Teléfono 1", "ownr_ph1": "Teléfono 1",
"paa": "",
"pal": "",
"pam": "",
"pan": "",
"pao": "",
"pap": "",
"par": "",
"pas": "",
"pay_date": "Fecha de inspección", "pay_date": "Fecha de inspección",
"phoneshort": "PH", "phoneshort": "PH",
"policy_no": "Política #", "policy_no": "Política #",
@@ -632,6 +661,7 @@
"state_tax_amt": "", "state_tax_amt": "",
"subletstotal": "", "subletstotal": "",
"subtotal": "", "subtotal": "",
"suspense": "",
"total_repairs": "", "total_repairs": "",
"totals": "", "totals": "",
"vehicle_info": "Vehículo" "vehicle_info": "Vehículo"

View File

@@ -99,6 +99,8 @@
"lar": "", "lar": "",
"las": "", "las": "",
"lau": "", "lau": "",
"mapa": "",
"mash": "",
"paa": "", "paa": "",
"pac": "", "pac": "",
"pal": "", "pal": "",
@@ -107,6 +109,7 @@
"pao": "", "pao": "",
"pap": "", "pap": "",
"par": "", "par": "",
"pas": "",
"tow": "" "tow": ""
}, },
"shopname": "", "shopname": "",
@@ -124,6 +127,7 @@
"default_invoiced": "", "default_invoiced": "",
"default_ordered": "", "default_ordered": "",
"default_received": "", "default_received": "",
"default_returned": "",
"default_scheduled": "", "default_scheduled": "",
"open_statuses": "" "open_statuses": ""
}, },
@@ -458,6 +462,7 @@
"addNote": "Ajouter une note", "addNote": "Ajouter une note",
"addtoproduction": "", "addtoproduction": "",
"allocate": "", "allocate": "",
"autoallocate": "",
"changestatus": "Changer le statut", "changestatus": "Changer le statut",
"convert": "Convertir", "convert": "Convertir",
"gotojob": "", "gotojob": "",
@@ -521,14 +526,38 @@
"ins_ph1": "Numéro de téléphone du gestionnaire de fichiers", "ins_ph1": "Numéro de téléphone du gestionnaire de fichiers",
"kmin": "Kilométrage en", "kmin": "Kilométrage en",
"kmout": "Kilométrage hors", "kmout": "Kilométrage hors",
"la1": "",
"la2": "",
"la3": "",
"la4": "",
"laa": "",
"lab": "",
"labor_rate_desc": "Nom du taux de main-d'œuvre", "labor_rate_desc": "Nom du taux de main-d'œuvre",
"lad": "",
"lae": "",
"laf": "",
"lag": "",
"lam": "",
"lar": "",
"las": "",
"lau": "",
"loss_date": "Date de perte", "loss_date": "Date de perte",
"loss_desc": "Perte d'usage", "loss_desc": "Perte d'usage",
"mapa": "",
"mash": "",
"other_amount_payable": "Autre montant à payer", "other_amount_payable": "Autre montant à payer",
"owner": "Propriétaire", "owner": "Propriétaire",
"owner_owing": "Cust. Owes", "owner_owing": "Cust. Owes",
"ownr_ea": "Email", "ownr_ea": "Email",
"ownr_ph1": "Téléphone 1", "ownr_ph1": "Téléphone 1",
"paa": "",
"pal": "",
"pam": "",
"pan": "",
"pao": "",
"pap": "",
"par": "",
"pas": "",
"pay_date": "Date d'inspection", "pay_date": "Date d'inspection",
"phoneshort": "PH", "phoneshort": "PH",
"policy_no": "Politique #", "policy_no": "Politique #",
@@ -632,6 +661,7 @@
"state_tax_amt": "", "state_tax_amt": "",
"subletstotal": "", "subletstotal": "",
"subtotal": "", "subtotal": "",
"suspense": "",
"total_repairs": "", "total_repairs": "",
"totals": "", "totals": "",
"vehicle_info": "Véhicule" "vehicle_info": "Véhicule"

View File

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

View File

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

View File

@@ -0,0 +1,256 @@
- 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
- 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_date
- job_totals
- 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
- statusid
- 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
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: jobs
schema: public
type: create_insert_permission

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
- 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
- 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
- statusid
- 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
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: jobs
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,254 @@
- 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
- 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_date
- job_totals
- 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
- statusid
- 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,255 @@
- 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
- 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
- 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
- statusid
- 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,256 @@
- 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
- 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_date
- job_totals
- 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
- statusid
- 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
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: jobs
schema: public
type: create_update_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
- 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
- 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
- statusid
- 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
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: jobs
schema: public
type: create_update_permission

View File

@@ -1812,6 +1812,7 @@ tables:
- insd_title - insd_title
- insd_zip - insd_zip
- intakechecklist - intakechecklist
- invoice_allocation
- invoice_date - invoice_date
- job_totals - job_totals
- kmin - kmin
@@ -2045,6 +2046,7 @@ tables:
- insd_title - insd_title
- insd_zip - insd_zip
- intakechecklist - intakechecklist
- invoice_allocation
- invoice_date - invoice_date
- job_totals - job_totals
- kmin - kmin
@@ -2288,6 +2290,7 @@ tables:
- insd_title - insd_title
- insd_zip - insd_zip
- intakechecklist - intakechecklist
- invoice_allocation
- invoice_date - invoice_date
- job_totals - job_totals
- kmin - kmin