Compare commits
74 Commits
feature/pb
...
feature/oe
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5db43dd065 | ||
|
|
53be0bbc1a | ||
|
|
bfcc03850b | ||
|
|
65402c1420 | ||
|
|
b462b2fa03 | ||
|
|
0c26b90591 | ||
|
|
f8f2384c54 | ||
|
|
ef18cf0718 | ||
|
|
9d35fc85ad | ||
|
|
e98f9763fd | ||
|
|
95e5385cd1 | ||
|
|
46abf01366 | ||
|
|
87f06425e1 | ||
|
|
45ab7543d5 | ||
|
|
120e4fc94c | ||
|
|
fed16efd10 | ||
|
|
ea6277c586 | ||
|
|
49bf461c36 | ||
|
|
696781c857 | ||
|
|
5540872f62 | ||
|
|
dac53a56c3 | ||
|
|
69690f0184 | ||
|
|
f11a4c93ac | ||
|
|
d74870812e | ||
|
|
9eed33b5f2 | ||
|
|
55b7715e1c | ||
|
|
c129b5ba8c | ||
|
|
efc2844d99 | ||
|
|
ab38f85d38 | ||
|
|
81eccba393 | ||
|
|
b3b49fd4ca | ||
|
|
b7a08db4e7 | ||
|
|
2d63c3d576 | ||
|
|
5f4a2392af | ||
|
|
f6fe8be7c4 | ||
|
|
89af6d23e8 | ||
|
|
7e1431d65e | ||
|
|
d50e845ba0 | ||
|
|
6796c35e5b | ||
|
|
4a68a10005 | ||
|
|
17088b3025 | ||
|
|
4e3c659b6d | ||
|
|
6afcf82cc4 | ||
|
|
f4ddb40bde | ||
|
|
6017e2172e | ||
|
|
bef9e64bf8 | ||
|
|
e8d95bdb68 | ||
|
|
10fb7d9d96 | ||
|
|
2ec196e664 | ||
|
|
1f38b98bfd | ||
|
|
a7c76386bc | ||
|
|
042b67c531 | ||
|
|
2e72ed3698 | ||
|
|
bc01f46388 | ||
|
|
74f791541f | ||
|
|
84c7fdba5a | ||
|
|
630fa23f6c | ||
|
|
8f58f09c8c | ||
|
|
a0922f2944 | ||
|
|
b8f001625b | ||
|
|
53394efebf | ||
|
|
d8296e1d01 | ||
|
|
2c00e5ee79 | ||
|
|
34e220dcad | ||
|
|
fa1fffd8b9 | ||
|
|
67eb430ff9 | ||
|
|
ff53355b4a | ||
|
|
331b2c517b | ||
|
|
05d9f20a66 | ||
|
|
9e3a2e920d | ||
|
|
1511b87959 | ||
|
|
9c3e4b7b83 | ||
|
|
b718f49071 | ||
|
|
e7157119ae |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -112,3 +112,4 @@ firebase/.env
|
|||||||
.elasticbeanstalk/*
|
.elasticbeanstalk/*
|
||||||
!.elasticbeanstalk/*.cfg.yml
|
!.elasticbeanstalk/*.cfg.yml
|
||||||
!.elasticbeanstalk/*.global.yml
|
!.elasticbeanstalk/*.global.yml
|
||||||
|
logs/oAuthClient-log.log
|
||||||
|
|||||||
@@ -4304,6 +4304,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>md_email_cc</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>
|
||||||
<folder_node>
|
<folder_node>
|
||||||
<name>md_hour_split</name>
|
<name>md_hour_split</name>
|
||||||
<children>
|
<children>
|
||||||
@@ -8103,6 +8124,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>filehandlers</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>insurancecos</name>
|
<name>insurancecos</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -8664,6 +8706,27 @@
|
|||||||
<folder_node>
|
<folder_node>
|
||||||
<name>validation</name>
|
<name>validation</name>
|
||||||
<children>
|
<children>
|
||||||
|
<concept_node>
|
||||||
|
<name>centermustexist</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>larsplit</name>
|
<name>larsplit</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -17491,6 +17554,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>changefilehandler</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>changelaborrate</name>
|
<name>changelaborrate</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -19737,6 +19821,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>date_next_contact</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>date_open</name>
|
<name>date_open</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -29272,6 +29377,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>noattachedjobs</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>
|
||||||
@@ -29424,6 +29550,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>recentonly</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>selectmedia</name>
|
<name>selectmedia</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -30627,6 +30774,27 @@
|
|||||||
<folder_node>
|
<folder_node>
|
||||||
<name>errors</name>
|
<name>errors</name>
|
||||||
<children>
|
<children>
|
||||||
|
<concept_node>
|
||||||
|
<name>associatedbills</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>backordering</name>
|
<name>backordering</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -30669,6 +30837,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>oec</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>
|
||||||
@@ -31162,6 +31351,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>oec</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>orderhistory</name>
|
<name>orderhistory</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -32874,6 +33084,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>ab_proof_of_loss</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>appointment_confirmation</name>
|
<name>appointment_confirmation</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -33231,6 +33462,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>individual_job_note</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>invoice_customer_payable</name>
|
<name>invoice_customer_payable</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -34050,6 +34302,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>worksheet_sorted_by_operation_type</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>
|
||||||
@@ -34662,6 +34935,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>settings</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>
|
||||||
@@ -34730,6 +35024,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>ats</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>bodyhours</name>
|
<name>bodyhours</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -34772,6 +35087,69 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>cardsettings</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>clm_no</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>compact</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>detailpriority</name>
|
<name>detailpriority</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -34793,6 +35171,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>employeeassignments</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>employeesearch</name>
|
<name>employeesearch</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -34814,6 +35213,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>ins_co_nm</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>jobdetail</name>
|
<name>jobdetail</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -34835,6 +35255,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>laborhrs</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>note</name>
|
<name>note</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -34856,6 +35297,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>ownr_nm</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>paintpriority</name>
|
<name>paintpriority</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -34877,6 +35339,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>production_note</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>refinishhours</name>
|
<name>refinishhours</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -34898,6 +35381,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>scheduled_completion</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>selectview</name>
|
<name>selectview</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -36465,6 +36969,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>open_orders_status</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>parts_backorder</name>
|
<name>parts_backorder</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
|
|||||||
@@ -2,74 +2,74 @@
|
|||||||
"name": "bodyshop",
|
"name": "bodyshop",
|
||||||
"version": "0.1.1",
|
"version": "0.1.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"proxy": "http://localhost:5000",
|
"proxy": "http://localhost:4000",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@apollo/client": "^3.4.16",
|
"@apollo/client": "^3.4.17",
|
||||||
|
"@asseinfo/react-kanban": "^2.2.0",
|
||||||
"@craco/craco": "^6.4.0",
|
"@craco/craco": "^6.4.0",
|
||||||
"@fingerprintjs/fingerprintjs": "^3.3.0",
|
"@fingerprintjs/fingerprintjs": "^3.3.0",
|
||||||
"@lourenci/react-kanban": "^2.1.0",
|
"@openreplay/tracker": "^3.4.7",
|
||||||
"@openreplay/tracker": "^3.4.4",
|
|
||||||
"@openreplay/tracker-assist": "^3.4.4",
|
"@openreplay/tracker-assist": "^3.4.4",
|
||||||
"@openreplay/tracker-graphql": "^3.0.0",
|
"@openreplay/tracker-graphql": "^3.0.0",
|
||||||
"@openreplay/tracker-redux": "^3.0.0",
|
"@openreplay/tracker-redux": "^3.0.0",
|
||||||
"@sentry/react": "^6.13.3",
|
"@sentry/react": "^6.14.3",
|
||||||
"@sentry/tracing": "^6.13.3",
|
"@sentry/tracing": "^6.14.3",
|
||||||
"@splitsoftware/splitio-react": "^1.3.0",
|
"@splitsoftware/splitio-react": "^1.3.0",
|
||||||
"@stripe/react-stripe-js": "^1.6.0",
|
"@stripe/react-stripe-js": "^1.6.0",
|
||||||
"@stripe/stripe-js": "^1.20.2",
|
"@stripe/stripe-js": "^1.21.1",
|
||||||
"@tanem/react-nprogress": "^3.0.81",
|
"@tanem/react-nprogress": "^3.0.82",
|
||||||
"antd": "^4.16.13",
|
"antd": "^4.16.13",
|
||||||
"apollo-link-logger": "^2.0.0",
|
"apollo-link-logger": "^2.0.0",
|
||||||
"axios": "^0.23.0",
|
"axios": "^0.24.0",
|
||||||
"craco-less": "^1.20.0",
|
"craco-less": "^1.20.0",
|
||||||
"dinero.js": "^1.9.1",
|
"dinero.js": "^1.9.1",
|
||||||
"dotenv": "^10.0.0",
|
"dotenv": "^10.0.0",
|
||||||
"enquire-js": "^0.2.1",
|
"enquire-js": "^0.2.1",
|
||||||
"env-cmd": "^10.1.0",
|
"env-cmd": "^10.1.0",
|
||||||
"exifr": "^7.1.3",
|
"exifr": "^7.1.3",
|
||||||
"firebase": "^9.1.3",
|
"firebase": "^9.4.1",
|
||||||
"graphql": "^15.6.1",
|
"graphql": "^16.0.1",
|
||||||
"i18next": "^21.3.3",
|
"i18next": "^21.4.2",
|
||||||
"i18next-browser-languagedetector": "^6.1.2",
|
"i18next-browser-languagedetector": "^6.1.2",
|
||||||
"jsoneditor": "^9.5.6",
|
"jsoneditor": "^9.5.7",
|
||||||
"jsreport-browser-client-dist": "^1.3.0",
|
"jsreport-browser-client-dist": "^1.3.0",
|
||||||
"libphonenumber-js": "^1.9.38",
|
"libphonenumber-js": "^1.9.42",
|
||||||
"logrocket": "^2.1.1",
|
"logrocket": "^2.1.1",
|
||||||
"markerjs2": "^2.15.0",
|
"markerjs2": "^2.17.0",
|
||||||
"moment-business-days": "^1.2.0",
|
"moment-business-days": "^1.2.0",
|
||||||
"phone": "^3.1.8",
|
"phone": "^3.1.9",
|
||||||
"preval.macro": "^5.0.0",
|
"preval.macro": "^5.0.0",
|
||||||
"prop-types": "^15.7.2",
|
"prop-types": "^15.7.2",
|
||||||
"query-string": "^7.0.1",
|
"query-string": "^7.0.1",
|
||||||
"rc-queue-anim": "^2.0.0",
|
"rc-queue-anim": "^2.0.0",
|
||||||
"rc-scroll-anim": "^2.7.6",
|
"rc-scroll-anim": "^2.7.6",
|
||||||
"react": "^17.0.1",
|
"react": "^17.0.1",
|
||||||
"react-big-calendar": "^0.38.0",
|
"react-big-calendar": "^0.38.1",
|
||||||
"react-color": "^2.19.3",
|
"react-color": "^2.19.3",
|
||||||
"react-cookie": "^4.1.1",
|
"react-cookie": "^4.1.1",
|
||||||
"react-dom": "^17.0.1",
|
"react-dom": "^17.0.1",
|
||||||
"react-drag-listview": "^0.1.8",
|
"react-drag-listview": "^0.1.8",
|
||||||
"react-grid-gallery": "^0.5.5",
|
"react-grid-gallery": "^0.5.5",
|
||||||
"react-grid-layout": "^1.3.0",
|
"react-grid-layout": "^1.3.0",
|
||||||
"react-i18next": "^11.12.0",
|
"react-i18next": "^11.14.2",
|
||||||
"react-icons": "^4.3.1",
|
"react-icons": "^4.3.1",
|
||||||
"react-number-format": "^4.7.3",
|
"react-number-format": "^4.8.0",
|
||||||
"react-redux": "^7.2.5",
|
"react-redux": "^7.2.6",
|
||||||
"react-resizable": "^3.0.4",
|
"react-resizable": "^3.0.4",
|
||||||
"react-router-dom": "^5.3.0",
|
"react-router-dom": "^5.3.0",
|
||||||
"react-scripts": "^4.0.3",
|
"react-scripts": "^4.0.3",
|
||||||
"react-sublime-video": "^0.2.5",
|
"react-sublime-video": "^0.2.5",
|
||||||
"react-virtualized": "^9.22.3",
|
"react-virtualized": "^9.22.3",
|
||||||
"recharts": "^2.1.5",
|
"recharts": "^2.1.6",
|
||||||
"redux": "^4.1.1",
|
"redux": "^4.1.2",
|
||||||
"redux-persist": "^6.0.0",
|
"redux-persist": "^6.0.0",
|
||||||
"redux-saga": "^1.1.3",
|
"redux-saga": "^1.1.3",
|
||||||
"redux-state-sync": "^3.1.2",
|
"redux-state-sync": "^3.1.2",
|
||||||
"reselect": "^4.0.0",
|
"reselect": "^4.1.2",
|
||||||
"sass": "^1.43.3",
|
"sass": "^1.43.4",
|
||||||
"socket.io-client": "^4.3.2",
|
"socket.io-client": "^4.3.2",
|
||||||
"styled-components": "^5.3.3",
|
"styled-components": "^5.3.3",
|
||||||
"subscriptions-transport-ws": "^0.9.18",
|
"subscriptions-transport-ws": "^0.11.0",
|
||||||
"web-vitals": "^2.1.2",
|
"web-vitals": "^2.1.2",
|
||||||
"workbox-background-sync": "^6.3.0",
|
"workbox-background-sync": "^6.3.0",
|
||||||
"workbox-broadcast-update": "^6.3.0",
|
"workbox-broadcast-update": "^6.3.0",
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ export const tracker = new Tracker({
|
|||||||
onStart: async ({ sessionID }) => {
|
onStart: async ({ sessionID }) => {
|
||||||
const user = await getCurrentUser();
|
const user = await getCurrentUser();
|
||||||
if (user) tracker.setUserID(user.email);
|
if (user) tracker.setUserID(user.email);
|
||||||
console.log("ORS SESSION ", sessionID, user && user.email);
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,6 @@ export function App({ checkUserSession, currentUser, online, setOnline }) {
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
window.addEventListener("offline", function (e) {
|
window.addEventListener("offline", function (e) {
|
||||||
console.log("Internet connection lost.");
|
|
||||||
setOnline(false);
|
setOnline(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -157,16 +157,6 @@ export function BillEnterModalLinesComponent({
|
|||||||
billlines: getFieldsValue("billlines").billlines.map(
|
billlines: getFieldsValue("billlines").billlines.map(
|
||||||
(item, idx) => {
|
(item, idx) => {
|
||||||
if (idx === index) {
|
if (idx === index) {
|
||||||
console.log(
|
|
||||||
"Found and setting.",
|
|
||||||
!!item.actual_cost
|
|
||||||
? item.actual_cost
|
|
||||||
: Math.round(
|
|
||||||
(parseFloat(e.target.value) * (1 - discount) +
|
|
||||||
Number.EPSILON) *
|
|
||||||
100
|
|
||||||
) / 100
|
|
||||||
);
|
|
||||||
return {
|
return {
|
||||||
...item,
|
...item,
|
||||||
actual_cost: !!item.actual_cost
|
actual_cost: !!item.actual_cost
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ const BillLineSearchSelect = ({ options, disabled, ...restProps }, ref) => {
|
|||||||
showSearch
|
showSearch
|
||||||
// optionFilterProp="line_desc"
|
// optionFilterProp="line_desc"
|
||||||
filterOption={(inputValue, option) => {
|
filterOption={(inputValue, option) => {
|
||||||
console.log(inputValue);
|
|
||||||
return (
|
return (
|
||||||
(option.line_desc &&
|
(option.line_desc &&
|
||||||
option.line_desc
|
option.line_desc
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ export function ChatNewConversation({ openChatByPhone }) {
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
const handleFinish = (values) => {
|
const handleFinish = (values) => {
|
||||||
console.log("values :>> ", values);
|
|
||||||
openChatByPhone({ phone_num: values.phoneNumber });
|
openChatByPhone({ phone_num: values.phoneNumber });
|
||||||
form.resetFields();
|
form.resetFields();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { ShrinkOutlined } from "@ant-design/icons";
|
import { ShrinkOutlined, InfoCircleOutlined } from "@ant-design/icons";
|
||||||
import { Col, Row, Typography } from "antd";
|
import { Col, Row, Tooltip, Typography } 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 { connect } from "react-redux";
|
||||||
@@ -31,6 +31,9 @@ export function ChatPopupComponent({
|
|||||||
{t("messaging.labels.messaging")}
|
{t("messaging.labels.messaging")}
|
||||||
</Typography.Title>
|
</Typography.Title>
|
||||||
<ChatNewConversation />
|
<ChatNewConversation />
|
||||||
|
<Tooltip title={t("messaging.labels.recentonly")}>
|
||||||
|
<InfoCircleOutlined />
|
||||||
|
</Tooltip>
|
||||||
</div>
|
</div>
|
||||||
<ShrinkOutlined
|
<ShrinkOutlined
|
||||||
onClick={() => toggleChatVisible()}
|
onClick={() => toggleChatVisible()}
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ export default function ContractFormComponent({
|
|||||||
<ContractStatusSelector />
|
<ContractStatusSelector />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("contracts.fields.start")}
|
label={t("contracts.fields.start")}
|
||||||
name="start"
|
name="start"
|
||||||
|
|||||||
@@ -86,10 +86,7 @@ export function DashboardGridComponent({ currentUser, bodyshop }) {
|
|||||||
const handleRemoveComponent = (key) => {
|
const handleRemoveComponent = (key) => {
|
||||||
logImEXEvent("dashboard_remove_component", { name: key });
|
logImEXEvent("dashboard_remove_component", { name: key });
|
||||||
const idxToRemove = state.items.findIndex((i) => i.i === key);
|
const idxToRemove = state.items.findIndex((i) => i.i === key);
|
||||||
console.log(
|
|
||||||
"🚀 ~ file: dashboard-grid.component.jsx ~ line 81 ~ idxToRemove",
|
|
||||||
idxToRemove
|
|
||||||
);
|
|
||||||
const items = _.cloneDeep(state.items);
|
const items = _.cloneDeep(state.items);
|
||||||
|
|
||||||
items.splice(idxToRemove, 1);
|
items.splice(idxToRemove, 1);
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { Button } from "antd";
|
import { Button } from "antd";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
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";
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
//currentUser: selectCurrentUser
|
//currentUser: selectCurrentUser
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -19,11 +19,11 @@ export function DmsCdkMakesRefetch({ bodyshop, form, socket }) {
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const handleRefetch = async () => {
|
const handleRefetch = async () => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
const response = await axios.post("/cdk/getvehicles", {
|
await axios.post("/cdk/getvehicles", {
|
||||||
cdk_dealerid: bodyshop.cdk_dealerid,
|
cdk_dealerid: bodyshop.cdk_dealerid,
|
||||||
bodyshopid: bodyshop.id,
|
bodyshopid: bodyshop.id,
|
||||||
});
|
});
|
||||||
console.log(response);
|
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Button, Table, Col , Checkbox} from "antd";
|
import { Button, Table, Col, Checkbox } from "antd";
|
||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
@@ -23,15 +23,26 @@ export function DmsCustomerSelector({ bodyshop }) {
|
|||||||
const [customerList, setcustomerList] = useState([]);
|
const [customerList, setcustomerList] = useState([]);
|
||||||
const [visible, setVisible] = useState(false);
|
const [visible, setVisible] = useState(false);
|
||||||
const [selectedCustomer, setSelectedCustomer] = useState(null);
|
const [selectedCustomer, setSelectedCustomer] = useState(null);
|
||||||
|
const [dmsType, setDmsType] = useState("cdk");
|
||||||
|
|
||||||
socket.on("cdk-select-customer", (customerList, callback) => {
|
socket.on("cdk-select-customer", (customerList, callback) => {
|
||||||
setVisible(true);
|
setVisible(true);
|
||||||
|
setDmsType("cdk");
|
||||||
setcustomerList(customerList);
|
setcustomerList(customerList);
|
||||||
});
|
});
|
||||||
|
socket.on("pbs-select-customer", (customerList, callback) => {
|
||||||
|
setVisible(true);
|
||||||
|
setDmsType("pbs");
|
||||||
|
setcustomerList(customerList);
|
||||||
|
console.log(
|
||||||
|
"🚀 ~ file: dms-customer-selector.component.jsx ~ line 37 ~ socket.on ~ customerList",
|
||||||
|
customerList
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
const onUseSelected = () => {
|
const onUseSelected = () => {
|
||||||
setVisible(false);
|
setVisible(false);
|
||||||
socket.emit("cdk-selected-customer", selectedCustomer);
|
socket.emit(`${dmsType}-selected-customer`, selectedCustomer);
|
||||||
setSelectedCustomer(null);
|
setSelectedCustomer(null);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -50,7 +61,7 @@ export function DmsCustomerSelector({ bodyshop }) {
|
|||||||
setSelectedCustomer(null);
|
setSelectedCustomer(null);
|
||||||
};
|
};
|
||||||
|
|
||||||
const columns = [
|
const cdkColumns = [
|
||||||
{
|
{
|
||||||
title: t("jobs.fields.dms.id"),
|
title: t("jobs.fields.dms.id"),
|
||||||
dataIndex: ["id", "value"],
|
dataIndex: ["id", "value"],
|
||||||
@@ -60,13 +71,14 @@ export function DmsCustomerSelector({ bodyshop }) {
|
|||||||
title: t("jobs.fields.dms.vinowner"),
|
title: t("jobs.fields.dms.vinowner"),
|
||||||
dataIndex: "vinOwner",
|
dataIndex: "vinOwner",
|
||||||
key: "vinOwner",
|
key: "vinOwner",
|
||||||
render: (text, record) => <Checkbox disabled checked={record.vinOwner}/>
|
render: (text, record) => <Checkbox disabled checked={record.vinOwner} />,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("jobs.fields.dms.name1"),
|
title: t("jobs.fields.dms.name1"),
|
||||||
dataIndex: ["name1", "fullName"],
|
dataIndex: ["name1", "fullName"],
|
||||||
key: "name1",
|
key: "name1",
|
||||||
sorter: (a, b) => alphaSort(a.name1?.fullName, b.name1?.fullName),
|
sorter: (a, b) =>
|
||||||
|
alphaSort(a.name1 && a.name1.fullName, b.name1 && b.name1.fullName),
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -74,11 +86,43 @@ export function DmsCustomerSelector({ bodyshop }) {
|
|||||||
//dataIndex: ["name2", "fullName"],
|
//dataIndex: ["name2", "fullName"],
|
||||||
key: "address",
|
key: "address",
|
||||||
render: (record, value) =>
|
render: (record, value) =>
|
||||||
`${record?.address?.addressLine[0]}, ${record.address?.city} ${record.address?.stateOrProvince} ${record.address?.postalCode}`,
|
`${record.address && record.address.addressLine[0]}, ${
|
||||||
|
record.address && record.address.city
|
||||||
|
} ${record.address && record.address.stateOrProvince} ${
|
||||||
|
record.address && record.address.postalCode
|
||||||
|
}`,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
if (!visible) return <></>;
|
const pbsColumns = [
|
||||||
|
{
|
||||||
|
title: t("jobs.fields.dms.id"),
|
||||||
|
dataIndex: "ContactId",
|
||||||
|
key: "ContactId",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t("jobs.fields.dms.vinowner"),
|
||||||
|
dataIndex: "vinOwner",
|
||||||
|
key: "vinOwner",
|
||||||
|
render: (text, record) => <Checkbox disabled checked={record.vinOwner} />,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t("jobs.fields.dms.name1"),
|
||||||
|
key: "name1",
|
||||||
|
sorter: (a, b) => alphaSort(a.LastName, b.LastName),
|
||||||
|
render: (text, record) =>
|
||||||
|
`${record.FirstName || ""} ${record.LastName || ""}`,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: t("jobs.fields.dms.address"),
|
||||||
|
key: "address",
|
||||||
|
render: (record, value) =>
|
||||||
|
`${record.Address}, ${record.City} ${record.State} ${record.ZipCode}`,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
if (!visible) return null;
|
||||||
return (
|
return (
|
||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<Table
|
<Table
|
||||||
@@ -104,13 +148,17 @@ export function DmsCustomerSelector({ bodyshop }) {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
pagination={{ position: "top" }}
|
pagination={{ position: "top" }}
|
||||||
columns={columns}
|
columns={dmsType === "cdk" ? cdkColumns : pbsColumns}
|
||||||
rowKey={(record) => record.id.value}
|
rowKey={(record) =>
|
||||||
|
dmsType === "cdk" ? record.id.value : record.ContactId
|
||||||
|
}
|
||||||
dataSource={customerList}
|
dataSource={customerList}
|
||||||
//onChange={handleTableChange}
|
//onChange={handleTableChange}
|
||||||
rowSelection={{
|
rowSelection={{
|
||||||
onSelect: (props) => {
|
onSelect: (record) => {
|
||||||
setSelectedCustomer(props.id.value);
|
setSelectedCustomer(
|
||||||
|
dmsType === "cdk" ? record.id.value : record.ContactId
|
||||||
|
);
|
||||||
},
|
},
|
||||||
type: "radio",
|
type: "radio",
|
||||||
selectedRowKeys: [selectedCustomer],
|
selectedRowKeys: [selectedCustomer],
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export function DmsLogEvents({ socket, logs, bodyshop }) {
|
|||||||
<Timeline.Item key={idx} color={LogLevelHierarchy(log.level)}>
|
<Timeline.Item key={idx} color={LogLevelHierarchy(log.level)}>
|
||||||
<Space wrap align="start" style={{}}>
|
<Space wrap align="start" style={{}}>
|
||||||
<Tag color={LogLevelHierarchy(log.level)}>{log.level}</Tag>
|
<Tag color={LogLevelHierarchy(log.level)}>{log.level}</Tag>
|
||||||
<span>{moment(log.timestamp).format("MM/DD/YYYY HH:MM:ss")}</span>
|
<span>{moment(log.timestamp).format("MM/DD/YYYY HH:mm:ss")}</span>
|
||||||
<Divider type="vertical" />
|
<Divider type="vertical" />
|
||||||
<span>{log.message}</span>
|
<span>{log.message}</span>
|
||||||
</Space>
|
</Space>
|
||||||
|
|||||||
@@ -119,33 +119,35 @@ export function DmsPostForm({ bodyshop, socket, job }) {
|
|||||||
</Form.Item>
|
</Form.Item>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
|
|
||||||
<LayoutFormRow style={{ justifyContent: "center" }} grow>
|
{bodyshop.cdk_dealerid && (
|
||||||
<Form.Item
|
<LayoutFormRow style={{ justifyContent: "center" }} grow>
|
||||||
name="dms_make"
|
<Form.Item
|
||||||
label={t("jobs.fields.dms.dms_make")}
|
name="dms_make"
|
||||||
rules={[
|
label={t("jobs.fields.dms.dms_make")}
|
||||||
{
|
rules={[
|
||||||
required: true,
|
{
|
||||||
},
|
required: true,
|
||||||
]}
|
},
|
||||||
>
|
]}
|
||||||
<Input disabled />
|
>
|
||||||
</Form.Item>
|
<Input disabled />
|
||||||
<Form.Item
|
</Form.Item>
|
||||||
name="dms_model"
|
<Form.Item
|
||||||
label={t("jobs.fields.dms.dms_model")}
|
name="dms_model"
|
||||||
rules={[
|
label={t("jobs.fields.dms.dms_model")}
|
||||||
{
|
rules={[
|
||||||
required: true,
|
{
|
||||||
},
|
required: true,
|
||||||
]}
|
},
|
||||||
>
|
]}
|
||||||
<Input disabled />
|
>
|
||||||
</Form.Item>
|
<Input disabled />
|
||||||
|
</Form.Item>
|
||||||
|
|
||||||
<DmsCdkMakes form={form} socket={socket} job={job} />
|
<DmsCdkMakes form={form} socket={socket} job={job} />
|
||||||
<DmsCdkMakesRefetch />
|
<DmsCdkMakesRefetch />
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
|
)}
|
||||||
<Form.Item
|
<Form.Item
|
||||||
name="story"
|
name="story"
|
||||||
label={t("jobs.fields.dms.story")}
|
label={t("jobs.fields.dms.story")}
|
||||||
@@ -157,6 +159,7 @@ export function DmsPostForm({ bodyshop, socket, job }) {
|
|||||||
>
|
>
|
||||||
<Input.TextArea maxLength={240} />
|
<Input.TextArea maxLength={240} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|
||||||
<Divider />
|
<Divider />
|
||||||
<Form.List name={["payers"]}>
|
<Form.List name={["payers"]}>
|
||||||
{(fields, { add, remove }) => {
|
{(fields, { add, remove }) => {
|
||||||
|
|||||||
@@ -58,11 +58,9 @@ export function DocumentEditorComponent({ currentUser, bodyshop, document }) {
|
|||||||
if (imgRef.current !== null) {
|
if (imgRef.current !== null) {
|
||||||
// create a marker.js MarkerArea
|
// create a marker.js MarkerArea
|
||||||
markerArea.current = new markerjs2.MarkerArea(imgRef.current);
|
markerArea.current = new markerjs2.MarkerArea(imgRef.current);
|
||||||
console.log(`markerArea.current`, markerArea.current);
|
|
||||||
// attach an event handler to assign annotated image back to our image element
|
// attach an event handler to assign annotated image back to our image element
|
||||||
markerArea.current.addCloseEventListener((closeEvent) => {
|
markerArea.current.addCloseEventListener((closeEvent) => {});
|
||||||
console.log("Close Event", closeEvent);
|
|
||||||
});
|
|
||||||
|
|
||||||
markerArea.current.addRenderEventListener((dataUrl) => {
|
markerArea.current.addRenderEventListener((dataUrl) => {
|
||||||
imgRef.current.src = dataUrl;
|
imgRef.current.src = dataUrl;
|
||||||
|
|||||||
@@ -14,8 +14,6 @@ var cleanAxios = axios.create();
|
|||||||
cleanAxios.interceptors.request.eject(axiosAuthInterceptorId);
|
cleanAxios.interceptors.request.eject(axiosAuthInterceptorId);
|
||||||
|
|
||||||
export const handleUpload = (ev, context) => {
|
export const handleUpload = (ev, context) => {
|
||||||
console.log("Handling Upload", ev);
|
|
||||||
|
|
||||||
logImEXEvent("document_upload", { filetype: ev.file.type });
|
logImEXEvent("document_upload", { filetype: ev.file.type });
|
||||||
|
|
||||||
const { onError, onSuccess, onProgress } = ev;
|
const { onError, onSuccess, onProgress } = ev;
|
||||||
@@ -61,7 +59,7 @@ export const uploadToCloudinary = async (
|
|||||||
// let eager = process.env.REACT_APP_CLOUDINARY_THUMB_TRANSFORMATIONS;
|
// let eager = process.env.REACT_APP_CLOUDINARY_THUMB_TRANSFORMATIONS;
|
||||||
|
|
||||||
//Get the signed url.
|
//Get the signed url.
|
||||||
console.log("fileType", fileType);
|
|
||||||
const upload_preset = fileType.startsWith("video")
|
const upload_preset = fileType.startsWith("video")
|
||||||
? "incoming_upload_video"
|
? "incoming_upload_video"
|
||||||
: "incoming_upload";
|
: "incoming_upload";
|
||||||
@@ -74,7 +72,6 @@ export const uploadToCloudinary = async (
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (signedURLResponse.status !== 200) {
|
if (signedURLResponse.status !== 200) {
|
||||||
console.log("Error Getting Signed URL", signedURLResponse.statusText);
|
|
||||||
if (!!onError) onError(signedURLResponse.statusText);
|
if (!!onError) onError(signedURLResponse.statusText);
|
||||||
notification["error"]({
|
notification["error"]({
|
||||||
message: i18n.t("documents.errors.getpresignurl", {
|
message: i18n.t("documents.errors.getpresignurl", {
|
||||||
@@ -113,13 +110,8 @@ export const uploadToCloudinary = async (
|
|||||||
...options,
|
...options,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
console.log("Upload Response", cloudinaryUploadResponse.data);
|
|
||||||
|
|
||||||
if (cloudinaryUploadResponse.status !== 200) {
|
if (cloudinaryUploadResponse.status !== 200) {
|
||||||
console.log(
|
|
||||||
"Error uploading to cloudinary.",
|
|
||||||
cloudinaryUploadResponse.statusText
|
|
||||||
);
|
|
||||||
if (!!onError) onError(cloudinaryUploadResponse.statusText);
|
if (!!onError) onError(cloudinaryUploadResponse.statusText);
|
||||||
notification["error"]({
|
notification["error"]({
|
||||||
message: i18n.t("documents.errors.insert", {
|
message: i18n.t("documents.errors.insert", {
|
||||||
|
|||||||
@@ -35,10 +35,6 @@ export function EmailDocumentsComponent({
|
|||||||
},
|
},
|
||||||
skip: !emailConfig.jobid,
|
skip: !emailConfig.jobid,
|
||||||
});
|
});
|
||||||
console.log(
|
|
||||||
"🚀 ~ file: email-documents.component.jsx ~ line 38 ~ emailConfig",
|
|
||||||
emailConfig
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -1,15 +1,71 @@
|
|||||||
import { UploadOutlined } from "@ant-design/icons";
|
import { UploadOutlined, UserAddOutlined } from "@ant-design/icons";
|
||||||
import { Divider, Form, Input, Select, Tabs, Upload } from "antd";
|
import {
|
||||||
|
Divider,
|
||||||
|
Form,
|
||||||
|
Input,
|
||||||
|
Select,
|
||||||
|
Tabs,
|
||||||
|
Upload,
|
||||||
|
Space,
|
||||||
|
Menu,
|
||||||
|
Dropdown,
|
||||||
|
} from "antd";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import EmailDocumentsComponent from "../email-documents/email-documents.component";
|
import EmailDocumentsComponent from "../email-documents/email-documents.component";
|
||||||
|
import _ from "lodash";
|
||||||
|
import { connect } from "react-redux";
|
||||||
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
|
const mapStateToProps = createStructuredSelector({
|
||||||
|
bodyshop: selectBodyshop,
|
||||||
|
});
|
||||||
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
|
//setUserLanguage: language => dispatch(setUserLanguage(language))
|
||||||
|
});
|
||||||
|
export default connect(
|
||||||
|
mapStateToProps,
|
||||||
|
mapDispatchToProps
|
||||||
|
)(EmailOverlayComponent);
|
||||||
|
|
||||||
export default function EmailOverlayComponent({ form, selectedMediaState }) {
|
export function EmailOverlayComponent({ form, selectedMediaState, bodyshop }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
const handleClick = ({ item, key, keyPath }) => {
|
||||||
|
const email = item.props.value;
|
||||||
|
form.setFieldsValue({ to: _.uniq([...form.getFieldValue("to"), email]) });
|
||||||
|
};
|
||||||
|
|
||||||
|
const menu = (
|
||||||
|
<div>
|
||||||
|
<Menu onClick={handleClick}>
|
||||||
|
{bodyshop.employees
|
||||||
|
.filter((e) => e.user_email)
|
||||||
|
.map((e, idx) => (
|
||||||
|
<Menu.Item value={e.user_email} key={idx}>
|
||||||
|
{`${e.first_name} ${e.last_name}`}
|
||||||
|
</Menu.Item>
|
||||||
|
))}
|
||||||
|
</Menu>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("emails.fields.to")}
|
label={
|
||||||
|
<Space>
|
||||||
|
{t("emails.fields.to")}
|
||||||
|
<Dropdown overlay={menu}>
|
||||||
|
<a
|
||||||
|
className="ant-dropdown-link"
|
||||||
|
href=" #"
|
||||||
|
onClick={(e) => e.preventDefault()}
|
||||||
|
>
|
||||||
|
<UserAddOutlined />
|
||||||
|
</a>
|
||||||
|
</Dropdown>
|
||||||
|
</Space>
|
||||||
|
}
|
||||||
name="to"
|
name="to"
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -111,7 +111,6 @@ export function EmailOverlayContainer({
|
|||||||
notification["success"]({ message: t("emails.successes.sent") });
|
notification["success"]({ message: t("emails.successes.sent") });
|
||||||
toggleEmailOverlayVisible();
|
toggleEmailOverlayVisible();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(JSON.stringify(error));
|
|
||||||
notification["error"]({
|
notification["error"]({
|
||||||
message: t("emails.errors.notsent", { message: error.message }),
|
message: t("emails.errors.notsent", { message: error.message }),
|
||||||
});
|
});
|
||||||
@@ -149,6 +148,18 @@ export function EmailOverlayContainer({
|
|||||||
html: response.data,
|
html: response.data,
|
||||||
fileList: [],
|
fileList: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (
|
||||||
|
bodyshop.md_email_cc[emailConfig.template.name] &&
|
||||||
|
bodyshop.md_email_cc[emailConfig.template.name].length > 0
|
||||||
|
) {
|
||||||
|
form.setFieldsValue({
|
||||||
|
cc: [
|
||||||
|
...(form.getFieldValue("cc") || []),
|
||||||
|
...bodyshop.md_email_cc[emailConfig.template.name],
|
||||||
|
],
|
||||||
|
});
|
||||||
|
}
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -7,10 +7,12 @@ import { selectCurrentUser } from "../../redux/user/user.selectors";
|
|||||||
import { GenerateDocument } from "../../utils/RenderTemplate";
|
import { GenerateDocument } from "../../utils/RenderTemplate";
|
||||||
import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component";
|
import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component";
|
||||||
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||||
|
import moment from "moment";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
currentUser: selectCurrentUser,
|
currentUser: selectCurrentUser,
|
||||||
});
|
});
|
||||||
|
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
setEmailOptions: (e) => dispatch(setEmailOptions(e)),
|
setEmailOptions: (e) => dispatch(setEmailOptions(e)),
|
||||||
});
|
});
|
||||||
@@ -19,14 +21,24 @@ export function EmailTestComponent({ currentUser, setEmailOptions }) {
|
|||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
|
|
||||||
const handleFinish = (values) => {
|
const handleFinish = (values) => {
|
||||||
console.log("values", values);
|
|
||||||
GenerateDocument(
|
GenerateDocument(
|
||||||
{
|
{
|
||||||
name: values.key,
|
name: values.key,
|
||||||
variables: {
|
variables: {
|
||||||
|
...(values.start
|
||||||
|
? {
|
||||||
|
start: moment(values.start).startOf("day").format("YYYY-MM-DD"),
|
||||||
|
}
|
||||||
|
: {}),
|
||||||
|
...(values.end
|
||||||
|
? { end: moment(values.end).endOf("day").format("YYYY-MM-DD") }
|
||||||
|
: {}),
|
||||||
|
...(values.start
|
||||||
|
? { starttz: moment(values.start).startOf("day") }
|
||||||
|
: {}),
|
||||||
|
...(values.end ? { endtz: moment(values.end).endOf("day") } : {}),
|
||||||
|
|
||||||
...(values.id ? { id: values.id } : {}),
|
...(values.id ? { id: values.id } : {}),
|
||||||
...(values.start ? { start: values.start } : {}),
|
|
||||||
...(values.end ? { end: values.end } : {}),
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -46,12 +46,16 @@ import {
|
|||||||
} from "../../redux/application/application.selectors";
|
} from "../../redux/application/application.selectors";
|
||||||
import { setModalContext } from "../../redux/modals/modals.actions";
|
import { setModalContext } from "../../redux/modals/modals.actions";
|
||||||
import { signOutStart } from "../../redux/user/user.actions";
|
import { signOutStart } from "../../redux/user/user.actions";
|
||||||
import { selectCurrentUser } from "../../redux/user/user.selectors";
|
import {
|
||||||
|
selectBodyshop,
|
||||||
|
selectCurrentUser,
|
||||||
|
} from "../../redux/user/user.selectors";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
currentUser: selectCurrentUser,
|
currentUser: selectCurrentUser,
|
||||||
recentItems: selectRecentItems,
|
recentItems: selectRecentItems,
|
||||||
selectedHeader: selectSelectedHeader,
|
selectedHeader: selectSelectedHeader,
|
||||||
|
bodyshop: selectBodyshop,
|
||||||
});
|
});
|
||||||
|
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
@@ -69,6 +73,7 @@ const mapDispatchToProps = (dispatch) => ({
|
|||||||
function Header({
|
function Header({
|
||||||
handleMenuClick,
|
handleMenuClick,
|
||||||
currentUser,
|
currentUser,
|
||||||
|
bodyshop,
|
||||||
selectedHeader,
|
selectedHeader,
|
||||||
signOutStart,
|
signOutStart,
|
||||||
setBillEnterContext,
|
setBillEnterContext,
|
||||||
@@ -237,16 +242,26 @@ function Header({
|
|||||||
{t("menus.header.accounting-receivables")}
|
{t("menus.header.accounting-receivables")}
|
||||||
</Link>
|
</Link>
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item key="payables">
|
{!(
|
||||||
<Link to="/manage/accounting/payables">
|
(bodyshop && bodyshop.cdk_dealerid) ||
|
||||||
{t("menus.header.accounting-payables")}
|
(bodyshop && bodyshop.pbs_serialnumber)
|
||||||
</Link>
|
) && (
|
||||||
</Menu.Item>
|
<Menu.Item key="payables">
|
||||||
<Menu.Item key="payments">
|
<Link to="/manage/accounting/payables">
|
||||||
<Link to="/manage/accounting/payments">
|
{t("menus.header.accounting-payables")}
|
||||||
{t("menus.header.accounting-payments")}
|
</Link>
|
||||||
</Link>
|
</Menu.Item>
|
||||||
</Menu.Item>
|
)}
|
||||||
|
{!(
|
||||||
|
(bodyshop && bodyshop.cdk_dealerid) ||
|
||||||
|
(bodyshop && bodyshop.pbs_serialnumber)
|
||||||
|
) && (
|
||||||
|
<Menu.Item key="payments">
|
||||||
|
<Link to="/manage/accounting/payments">
|
||||||
|
{t("menus.header.accounting-payments")}
|
||||||
|
</Link>
|
||||||
|
</Menu.Item>
|
||||||
|
)}
|
||||||
<Menu.Item key="export-logs">
|
<Menu.Item key="export-logs">
|
||||||
<Link to="/manage/accounting/exportlogs">
|
<Link to="/manage/accounting/exportlogs">
|
||||||
{t("menus.header.export-logs")}
|
{t("menus.header.export-logs")}
|
||||||
|
|||||||
@@ -10,15 +10,11 @@ export default function HelpRescue() {
|
|||||||
var bodyFormData = new FormData();
|
var bodyFormData = new FormData();
|
||||||
bodyFormData.append("Code", code);
|
bodyFormData.append("Code", code);
|
||||||
bodyFormData.append("hostederrorhandling", 1);
|
bodyFormData.append("hostederrorhandling", 1);
|
||||||
const res1 = await fetch(
|
await fetch("https://secure.logmeinrescue.com/Customer/Code.aspx", {
|
||||||
"https://secure.logmeinrescue.com/Customer/Code.aspx",
|
mode: "no-cors",
|
||||||
{
|
method: "POST",
|
||||||
mode: "no-cors",
|
body: bodyFormData,
|
||||||
method: "POST",
|
});
|
||||||
body: bodyFormData,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
console.log("handleClick -> res1", await res1.text());
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -40,7 +36,6 @@ export default function HelpRescue() {
|
|||||||
method="post"
|
method="post"
|
||||||
id="logmeinsupport"
|
id="logmeinsupport"
|
||||||
onSubmit={(...props) => {
|
onSubmit={(...props) => {
|
||||||
console.log(`props`, props);
|
|
||||||
alert();
|
alert();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ export function Jobd3RdPartyModal({ bodyshop, jobId }) {
|
|||||||
};
|
};
|
||||||
const handleFinish = (values) => {
|
const handleFinish = (values) => {
|
||||||
const { sendtype, ...restVals } = values;
|
const { sendtype, ...restVals } = values;
|
||||||
console.log(restVals);
|
|
||||||
GenerateDocument(
|
GenerateDocument(
|
||||||
{
|
{
|
||||||
name: TemplateList("job_special").thirdpartypayer.key,
|
name: TemplateList("job_special").thirdpartypayer.key,
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ export function ScheduleEventColor({ bodyshop, event }) {
|
|||||||
<Menu.Item key={"null"}>{t("general.actions.clear")}</Menu.Item>
|
<Menu.Item key={"null"}>{t("general.actions.clear")}</Menu.Item>
|
||||||
</Menu>
|
</Menu>
|
||||||
);
|
);
|
||||||
console.log(`event`, event);
|
|
||||||
return (
|
return (
|
||||||
<Dropdown overlay={menu}>
|
<Dropdown overlay={menu}>
|
||||||
<a href=" #" onClick={(e) => e.preventDefault()}>
|
<a href=" #" onClick={(e) => e.preventDefault()}>
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ export function ScheduleEventComponent({
|
|||||||
t("appointments.labels.reminder", {
|
t("appointments.labels.reminder", {
|
||||||
shopname: bodyshop.shopname,
|
shopname: bodyshop.shopname,
|
||||||
date: moment(event.start).format("MM/DD/YYYY"),
|
date: moment(event.start).format("MM/DD/YYYY"),
|
||||||
time: moment(event.start).format("HH:MM a"),
|
time: moment(event.start).format("HH:mm a"),
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
setVisible(false);
|
setVisible(false);
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ export default function JobBillsTotalComponent({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (il.deductedfromlbr) {
|
if (il.deductedfromlbr) {
|
||||||
console.log(i, "Deducting from labor.");
|
|
||||||
lbrAdjustments = lbrAdjustments.add(
|
lbrAdjustments = lbrAdjustments.add(
|
||||||
Dinero({
|
Dinero({
|
||||||
amount: Math.round((il.actual_price || 0) * 100),
|
amount: Math.round((il.actual_price || 0) * 100),
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ export default function JobIntakeTemplateList({ templates }) {
|
|||||||
const renderAllTemplates = async () => {
|
const renderAllTemplates = async () => {
|
||||||
logImEXEvent("checklist_render_all_templates");
|
logImEXEvent("checklist_render_all_templates");
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
console.log("templates :>> ", templates);
|
|
||||||
await GenerateDocuments(
|
await GenerateDocuments(
|
||||||
templates.map((key) => {
|
templates.map((key) => {
|
||||||
return { name: key, variables: { id: jobId } };
|
return { name: key, variables: { id: jobId } };
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ export function JobCostingModalContainer({
|
|||||||
async function getData() {
|
async function getData() {
|
||||||
if (jobId && visible) {
|
if (jobId && visible) {
|
||||||
const { data } = await axios.post("/job/costing", { jobid: jobId });
|
const { data } = await axios.post("/job/costing", { jobid: jobId });
|
||||||
console.log(data);
|
|
||||||
setCostingData(data);
|
setCostingData(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,6 @@ export default function JobCostingPartsTable({ data, summaryData }) {
|
|||||||
.includes(searchText.toLowerCase())
|
.includes(searchText.toLowerCase())
|
||||||
);
|
);
|
||||||
|
|
||||||
console.log("data :>> ", data);
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<Table
|
<Table
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ export const reconcileByPrice = (
|
|||||||
|
|
||||||
jobLines.forEach((jl) => {
|
jobLines.forEach((jl) => {
|
||||||
const matchingBillLineIds = billLines
|
const matchingBillLineIds = billLines
|
||||||
.filter((bl) => bl.actual_price === jl.act_price && !jl.removed)
|
.filter((bl) => bl.actual_price === jl.act_price && bl.quantity === jl.part_qty && !jl.removed)
|
||||||
.map((bl) => bl.id);
|
.map((bl) => bl.id);
|
||||||
|
|
||||||
if (matchingBillLineIds.length > 1) {
|
if (matchingBillLineIds.length > 1) {
|
||||||
|
|||||||
@@ -42,9 +42,7 @@ export default function ScoreboardAddButton({
|
|||||||
}, [visibility, job.id, callQuery]);
|
}, [visibility, job.id, callQuery]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
console.log("UE", entryData);
|
|
||||||
if (entryData && entryData.scoreboard && entryData.scoreboard[0]) {
|
if (entryData && entryData.scoreboard && entryData.scoreboard[0]) {
|
||||||
console.log("Setting FOrm");
|
|
||||||
form.setFieldsValue(entryData.scoreboard[0]);
|
form.setFieldsValue(entryData.scoreboard[0]);
|
||||||
}
|
}
|
||||||
}, [entryData, form]);
|
}, [entryData, form]);
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ export function JobsAdminClass({ bodyshop, job }) {
|
|||||||
const [updateJob] = useMutation(UPDATE_JOB);
|
const [updateJob] = useMutation(UPDATE_JOB);
|
||||||
|
|
||||||
const handleFinish = async (values) => {
|
const handleFinish = async (values) => {
|
||||||
console.log(values);
|
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
const result = await updateJob({
|
const result = await updateJob({
|
||||||
variables: { jobId: job.id, job: values },
|
variables: { jobId: job.id, job: values },
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ export default function JobsAdminDatesChange({ job }) {
|
|||||||
const [updateJob] = useMutation(UPDATE_JOB);
|
const [updateJob] = useMutation(UPDATE_JOB);
|
||||||
|
|
||||||
const handleFinish = async (values) => {
|
const handleFinish = async (values) => {
|
||||||
console.log(values);
|
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
const result = await updateJob({
|
const result = await updateJob({
|
||||||
variables: { jobId: job.id, job: values },
|
variables: { jobId: job.id, job: values },
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ export default function JobAdminOwnerReassociate({ job }) {
|
|||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
const [updateJob] = useMutation(UPDATE_JOB);
|
const [updateJob] = useMutation(UPDATE_JOB);
|
||||||
const handleFinish = async (values) => {
|
const handleFinish = async (values) => {
|
||||||
console.log(values);
|
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
const result = await updateJob({
|
const result = await updateJob({
|
||||||
variables: { jobId: job.id, job: { ownerid: values.ownerid } },
|
variables: { jobId: job.id, job: { ownerid: values.ownerid } },
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ export default function JobAdminOwnerReassociate({ job }) {
|
|||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
const [updateJob] = useMutation(UPDATE_JOB);
|
const [updateJob] = useMutation(UPDATE_JOB);
|
||||||
const handleFinish = async (values) => {
|
const handleFinish = async (values) => {
|
||||||
console.log(values);
|
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
const result = await updateJob({
|
const result = await updateJob({
|
||||||
variables: { jobId: job.id, job: { vehicleid: values.vehicleid } },
|
variables: { jobId: job.id, job: { vehicleid: values.vehicleid } },
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ import { gql } from "@apollo/client";
|
|||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
|
|
||||||
export const GetSupplementDelta = async (client, jobId, newLines) => {
|
export const GetSupplementDelta = async (client, jobId, newLines) => {
|
||||||
console.log("-----Begin Supplement-----");
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
data: { joblines: existingLinesFromDb },
|
data: { joblines: existingLinesFromDb },
|
||||||
} = await client.query({
|
} = await client.query({
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ export function JobsCloseAutoAllocate({ bodyshop, joblines, form, disabled }) {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const overlay = bodyshop.cdk_dealerid && (
|
const overlay = (bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
|
||||||
<Menu onClick={handleMenuClick}>
|
<Menu onClick={handleMenuClick}>
|
||||||
{bodyshop.md_responsibility_centers.dms_defaults.map((mapping) => (
|
{bodyshop.md_responsibility_centers.dms_defaults.map((mapping) => (
|
||||||
<Menu.Item key={mapping.name}>{mapping.name}</Menu.Item>
|
<Menu.Item key={mapping.name}>{mapping.name}</Menu.Item>
|
||||||
@@ -69,7 +69,7 @@ export function JobsCloseAutoAllocate({ bodyshop, joblines, form, disabled }) {
|
|||||||
</Menu>
|
</Menu>
|
||||||
);
|
);
|
||||||
|
|
||||||
return bodyshop.cdk_dealerid ? (
|
return bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber ? (
|
||||||
<Dropdown overlay={overlay}>
|
<Dropdown overlay={overlay}>
|
||||||
<Button disabled={disabled}>{t("jobs.actions.dmsautoallocate")}</Button>
|
<Button disabled={disabled}>{t("jobs.actions.dmsautoallocate")}</Button>
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import { DownOutlined } from "@ant-design/icons";
|
import { DownOutlined } from "@ant-design/icons";
|
||||||
import { Dropdown, Menu } from "antd";
|
import { Dropdown, Menu } from "antd";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
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";
|
||||||
@@ -11,8 +10,6 @@ const mapStateToProps = createStructuredSelector({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export function JobsDetailChangeEstimator({ disabled, form, bodyshop }) {
|
export function JobsDetailChangeEstimator({ disabled, form, bodyshop }) {
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const handleClick = ({ item, key, keyPath }) => {
|
const handleClick = ({ item, key, keyPath }) => {
|
||||||
const est = item.props.value;
|
const est = item.props.value;
|
||||||
form.setFieldsValue(est);
|
form.setFieldsValue(est);
|
||||||
@@ -37,7 +34,7 @@ export function JobsDetailChangeEstimator({ disabled, form, bodyshop }) {
|
|||||||
href=" #"
|
href=" #"
|
||||||
onClick={(e) => e.preventDefault()}
|
onClick={(e) => e.preventDefault()}
|
||||||
>
|
>
|
||||||
{t("jobs.actions.changestimator")} <DownOutlined />
|
<DownOutlined />
|
||||||
</a>
|
</a>
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
import { DownOutlined } from "@ant-design/icons";
|
||||||
|
import { Dropdown, Menu } from "antd";
|
||||||
|
import React from "react";
|
||||||
|
import { connect } from "react-redux";
|
||||||
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
|
|
||||||
|
const mapStateToProps = createStructuredSelector({
|
||||||
|
bodyshop: selectBodyshop,
|
||||||
|
});
|
||||||
|
|
||||||
|
export function JobsDetailChangeFilehandler({ disabled, form, bodyshop }) {
|
||||||
|
const handleClick = ({ item, key, keyPath }) => {
|
||||||
|
const est = item.props.value;
|
||||||
|
form.setFieldsValue(est);
|
||||||
|
};
|
||||||
|
|
||||||
|
const menu = (
|
||||||
|
<div>
|
||||||
|
<Menu onClick={handleClick}>
|
||||||
|
{bodyshop.md_filehandlers.map((est, idx) => (
|
||||||
|
<Menu.Item value={est} key={idx}>
|
||||||
|
{`${est.ins_ct_fn} ${est.ins_ct_ln}`}
|
||||||
|
</Menu.Item>
|
||||||
|
))}
|
||||||
|
</Menu>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Dropdown overlay={menu} disabled={disabled}>
|
||||||
|
<a
|
||||||
|
className="ant-dropdown-link"
|
||||||
|
href=" #"
|
||||||
|
onClick={(e) => e.preventDefault()}
|
||||||
|
>
|
||||||
|
<DownOutlined />
|
||||||
|
</a>
|
||||||
|
</Dropdown>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default connect(mapStateToProps, null)(JobsDetailChangeFilehandler);
|
||||||
@@ -75,6 +75,12 @@ export function JobsDetailDatesComponent({ jobRO, job, bodyshop }) {
|
|||||||
>
|
>
|
||||||
<DateTimePicker />
|
<DateTimePicker />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("jobs.fields.date_next_contact")}
|
||||||
|
name="date_next_contact"
|
||||||
|
>
|
||||||
|
<DateTimePicker />
|
||||||
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.scheduled_completion")}
|
label={t("jobs.fields.scheduled_completion")}
|
||||||
name="scheduled_completion"
|
name="scheduled_completion"
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import {
|
|||||||
InputNumber,
|
InputNumber,
|
||||||
Row,
|
Row,
|
||||||
Select,
|
Select,
|
||||||
|
Space,
|
||||||
Switch,
|
Switch,
|
||||||
} from "antd";
|
} from "antd";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
@@ -23,7 +24,7 @@ import FormItemPhone, {
|
|||||||
import Car from "../job-damage-visual/job-damage-visual.component";
|
import Car from "../job-damage-visual/job-damage-visual.component";
|
||||||
import JobsDetailChangeEstimator from "../jobs-detail-change-estimator/jobs-detail-change-estimator.component";
|
import JobsDetailChangeEstimator from "../jobs-detail-change-estimator/jobs-detail-change-estimator.component";
|
||||||
import FormRow from "../layout-form-row/layout-form-row.component";
|
import FormRow from "../layout-form-row/layout-form-row.component";
|
||||||
|
import JobsDetailChangeFileHandler from "../jobs-detail-change-filehandler/jobs-detail-change-filehandler.component";
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
jobRO: selectJobReadOnly,
|
jobRO: selectJobReadOnly,
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -85,7 +86,15 @@ export function JobsDetailGeneral({ bodyshop, jobRO, job, form }) {
|
|||||||
<Form.Item label={t("jobs.fields.ins_city")} name="ins_city">
|
<Form.Item label={t("jobs.fields.ins_city")} name="ins_city">
|
||||||
<Input disabled={jobRO} />
|
<Input disabled={jobRO} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item label={t("jobs.fields.ins_ct_ln")} name="ins_ct_ln">
|
<Form.Item
|
||||||
|
label={
|
||||||
|
<Space>
|
||||||
|
{t("jobs.fields.ins_ct_ln")}
|
||||||
|
<JobsDetailChangeFileHandler form={form} disabled={jobRO} />
|
||||||
|
</Space>
|
||||||
|
}
|
||||||
|
name="ins_ct_ln"
|
||||||
|
>
|
||||||
<Input disabled={jobRO} />
|
<Input disabled={jobRO} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item label={t("jobs.fields.ins_ct_fn")} name="ins_ct_fn">
|
<Form.Item label={t("jobs.fields.ins_ct_fn")} name="ins_ct_fn">
|
||||||
@@ -135,7 +144,7 @@ export function JobsDetailGeneral({ bodyshop, jobRO, job, form }) {
|
|||||||
label={t("jobs.fields.referral_source_extra")}
|
label={t("jobs.fields.referral_source_extra")}
|
||||||
name="referral_source_extra"
|
name="referral_source_extra"
|
||||||
>
|
>
|
||||||
<Input />
|
<Input disabled={jobRO} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item label={t("jobs.fields.alt_transport")} name="alt_transport">
|
<Form.Item label={t("jobs.fields.alt_transport")} name="alt_transport">
|
||||||
<Select disabled={jobRO} allowClear>
|
<Select disabled={jobRO} allowClear>
|
||||||
@@ -219,12 +228,19 @@ export function JobsDetailGeneral({ bodyshop, jobRO, job, form }) {
|
|||||||
{t("jobs.forms.appraiserinfo")}
|
{t("jobs.forms.appraiserinfo")}
|
||||||
</Divider>
|
</Divider>
|
||||||
|
|
||||||
<JobsDetailChangeEstimator form={form} disabled={jobRO} />
|
|
||||||
<FormRow noDivider>
|
<FormRow noDivider>
|
||||||
<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">
|
||||||
<Input disabled={jobRO} />
|
<Input disabled={jobRO} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item label={t("jobs.fields.est_ct_fn")} name="est_ct_fn">
|
<Form.Item
|
||||||
|
label={
|
||||||
|
<Space>
|
||||||
|
{t("jobs.fields.est_ct_fn")}
|
||||||
|
<JobsDetailChangeEstimator form={form} disabled={jobRO} />
|
||||||
|
</Space>
|
||||||
|
}
|
||||||
|
name="est_ct_fn"
|
||||||
|
>
|
||||||
<Input disabled={jobRO} />
|
<Input disabled={jobRO} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item label={t("jobs.fields.est_ct_ln")} name="est_ct_ln">
|
<Form.Item label={t("jobs.fields.est_ct_ln")} name="est_ct_ln">
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ export default async function DuplicateJob(
|
|||||||
variables: { id: jobId },
|
variables: { id: jobId },
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log("res", res);
|
|
||||||
const { jobs_by_pk } = res.data;
|
const { jobs_by_pk } = res.data;
|
||||||
const existingJob = _.cloneDeep(jobs_by_pk);
|
const existingJob = _.cloneDeep(jobs_by_pk);
|
||||||
delete existingJob.__typename;
|
delete existingJob.__typename;
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ export function JobsDocumentsGalleryReassign({ bodyshop, galleryImages }) {
|
|||||||
|
|
||||||
const updateImage = async (i, jobid) => {
|
const updateImage = async (i, jobid) => {
|
||||||
//Move the cloudinary image
|
//Move the cloudinary image
|
||||||
console.log(i);
|
|
||||||
|
|
||||||
//Update it in the database.
|
//Update it in the database.
|
||||||
const result = await updateDocument({
|
const result = await updateDocument({
|
||||||
|
|||||||
@@ -3,17 +3,17 @@ import { notification } from "antd";
|
|||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
//import SpinComponent from "../../components/loading-spinner/loading-spinner.component";
|
//import SpinComponent from "../../components/loading-spinner/loading-spinner.component";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { connect } from "react-redux";
|
||||||
|
import { createStructuredSelector } from "reselect";
|
||||||
import AlertComponent from "../../components/alert/alert.component";
|
import AlertComponent from "../../components/alert/alert.component";
|
||||||
import { logImEXEvent } from "../../firebase/firebase.utils";
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
import {
|
import {
|
||||||
DELETE_NOTE,
|
DELETE_NOTE,
|
||||||
QUERY_NOTES_BY_JOB_PK,
|
QUERY_NOTES_BY_JOB_PK,
|
||||||
} from "../../graphql/notes.queries";
|
} from "../../graphql/notes.queries";
|
||||||
import JobNotesComponent from "./jobs.notes.component";
|
|
||||||
import { insertAuditTrail } from "../../redux/application/application.actions";
|
import { insertAuditTrail } from "../../redux/application/application.actions";
|
||||||
import { connect } from "react-redux";
|
|
||||||
import { createStructuredSelector } from "reselect";
|
|
||||||
import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
||||||
|
import JobNotesComponent from "./jobs.notes.component";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
//currentUser: selectCurrentUser
|
//currentUser: selectCurrentUser
|
||||||
@@ -63,6 +63,7 @@ export function JobNotesContainer({ jobId, insertAuditTrail }) {
|
|||||||
refetch={refetch}
|
refetch={refetch}
|
||||||
deleteLoading={deleteLoading}
|
deleteLoading={deleteLoading}
|
||||||
handleNoteDelete={handleNoteDelete}
|
handleNoteDelete={handleNoteDelete}
|
||||||
|
ro_number={data ? data.jobs_by_pk.ro_number : null}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,9 @@ import { createStructuredSelector } from "reselect";
|
|||||||
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
||||||
import { setModalContext } from "../../redux/modals/modals.actions";
|
import { setModalContext } from "../../redux/modals/modals.actions";
|
||||||
import { DateTimeFormatter } from "../../utils/DateFormatter";
|
import { DateTimeFormatter } from "../../utils/DateFormatter";
|
||||||
|
import { TemplateList } from "../../utils/TemplateConstants";
|
||||||
import NoteUpsertModal from "../note-upsert-modal/note-upsert-modal.container";
|
import NoteUpsertModal from "../note-upsert-modal/note-upsert-modal.container";
|
||||||
|
import PrintWrapperComponent from "../print-wrapper/print-wrapper.component";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
jobRO: selectJobReadOnly,
|
jobRO: selectJobReadOnly,
|
||||||
@@ -33,8 +35,12 @@ export function JobNotesComponent({
|
|||||||
jobId,
|
jobId,
|
||||||
setNoteUpsertContext,
|
setNoteUpsertContext,
|
||||||
deleteLoading,
|
deleteLoading,
|
||||||
|
ro_number,
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
const Templates = TemplateList("job_special", {
|
||||||
|
ro_number,
|
||||||
|
});
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
@@ -107,6 +113,18 @@ export function JobNotesComponent({
|
|||||||
>
|
>
|
||||||
<EditFilled />
|
<EditFilled />
|
||||||
</Button>
|
</Button>
|
||||||
|
<PrintWrapperComponent
|
||||||
|
emailOnly
|
||||||
|
templateObject={{
|
||||||
|
name: Templates.individual_job_note.key,
|
||||||
|
|
||||||
|
variables: { id: record.id },
|
||||||
|
}}
|
||||||
|
messageObject={{
|
||||||
|
subject: Templates.individual_job_note.subject,
|
||||||
|
}}
|
||||||
|
id={record.id}
|
||||||
|
/>
|
||||||
</Space>
|
</Space>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ export function PartnerPingComponent({ setPartnerVersion }) {
|
|||||||
//if (process.env.NODE_ENV === "development") return;
|
//if (process.env.NODE_ENV === "development") return;
|
||||||
const PartnerResponse = await axios.post("http://localhost:1337/ping/");
|
const PartnerResponse = await axios.post("http://localhost:1337/ping/");
|
||||||
const { appver, qbpath } = PartnerResponse.data;
|
const { appver, qbpath } = PartnerResponse.data;
|
||||||
console.log("SETTING PARTNER VERSION.");
|
|
||||||
setPartnerVersion(appver);
|
setPartnerVersion(appver);
|
||||||
console.log({ appver, qbpath });
|
console.log({ appver, qbpath });
|
||||||
if (!qbpath) {
|
if (!qbpath) {
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ export function PartsOrderListTableComponent({
|
|||||||
</Button>
|
</Button>
|
||||||
<Popconfirm
|
<Popconfirm
|
||||||
title={t("parts_orders.labels.confirmdelete")}
|
title={t("parts_orders.labels.confirmdelete")}
|
||||||
disabled={jobRO || !record.return}
|
disabled={jobRO}
|
||||||
onConfirm={async () => {
|
onConfirm={async () => {
|
||||||
//Delete the parts return.!
|
//Delete the parts return.!
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ export function PartsOrderListTableComponent({
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Button disabled={jobRO || !record.return}>
|
<Button disabled={jobRO}>
|
||||||
<DeleteFilled />
|
<DeleteFilled />
|
||||||
</Button>
|
</Button>
|
||||||
</Popconfirm>
|
</Popconfirm>
|
||||||
|
|||||||
@@ -164,6 +164,7 @@ export default function PartsOrderModalComponent({
|
|||||||
<Radio value={"none"}>{t("general.labels.none")}</Radio>
|
<Radio value={"none"}>{t("general.labels.none")}</Radio>
|
||||||
<Radio value={"e"}>{t("parts_orders.labels.email")}</Radio>
|
<Radio value={"e"}>{t("parts_orders.labels.email")}</Radio>
|
||||||
<Radio value={"p"}>{t("parts_orders.labels.print")}</Radio>
|
<Radio value={"p"}>{t("parts_orders.labels.print")}</Radio>
|
||||||
|
<Radio value={"oec"}>{t("parts_orders.labels.oec")}</Radio>
|
||||||
</Radio.Group>
|
</Radio.Group>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
import { useMutation, useQuery } from "@apollo/client";
|
import { useMutation, useQuery, useApolloClient } from "@apollo/client";
|
||||||
import { Form, Modal, notification } from "antd";
|
import { Form, Modal, notification } from "antd";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
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";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { logImEXEvent } from "../../firebase/firebase.utils";
|
import { logImEXEvent, auth } from "../../firebase/firebase.utils";
|
||||||
import { UPDATE_JOB_LINE_STATUS } from "../../graphql/jobs-lines.queries";
|
import { UPDATE_JOB_LINE_STATUS } from "../../graphql/jobs-lines.queries";
|
||||||
import { INSERT_NEW_PARTS_ORDERS } from "../../graphql/parts-orders.queries";
|
import {
|
||||||
|
INSERT_NEW_PARTS_ORDERS,
|
||||||
|
QUERY_PARTS_ORDER_OEC,
|
||||||
|
} from "../../graphql/parts-orders.queries";
|
||||||
import { QUERY_ALL_VENDORS_FOR_ORDER } from "../../graphql/vendors.queries";
|
import { QUERY_ALL_VENDORS_FOR_ORDER } from "../../graphql/vendors.queries";
|
||||||
import { insertAuditTrail } from "../../redux/application/application.actions";
|
import { insertAuditTrail } from "../../redux/application/application.actions";
|
||||||
import { setEmailOptions } from "../../redux/email/email.actions";
|
import { setEmailOptions } from "../../redux/email/email.actions";
|
||||||
@@ -26,6 +29,7 @@ import { TemplateList } from "../../utils/TemplateConstants";
|
|||||||
import AlertComponent from "../alert/alert.component";
|
import AlertComponent from "../alert/alert.component";
|
||||||
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
||||||
import PartsOrderModalComponent from "./parts-order-modal.component";
|
import PartsOrderModalComponent from "./parts-order-modal.component";
|
||||||
|
import axios from "axios";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
currentUser: selectCurrentUser,
|
currentUser: selectCurrentUser,
|
||||||
@@ -52,7 +56,7 @@ export function PartsOrderModalContainer({
|
|||||||
insertAuditTrail,
|
insertAuditTrail,
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
const client = useApolloClient();
|
||||||
const { visible, context, actions } = partsOrderModal;
|
const { visible, context, actions } = partsOrderModal;
|
||||||
const {
|
const {
|
||||||
jobId,
|
jobId,
|
||||||
@@ -175,7 +179,7 @@ export function PartsOrderModalContainer({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (refetch) refetch();
|
if (refetch) refetch();
|
||||||
toggleModalVisible();
|
|
||||||
const Templates = TemplateList("partsorder", context);
|
const Templates = TemplateList("partsorder", context);
|
||||||
|
|
||||||
if (sendType === "e") {
|
if (sendType === "e") {
|
||||||
@@ -215,7 +219,50 @@ export function PartsOrderModalContainer({
|
|||||||
{},
|
{},
|
||||||
"p"
|
"p"
|
||||||
);
|
);
|
||||||
|
} else if (sendType === "oec") {
|
||||||
|
//Send to Partner OEC.
|
||||||
|
try {
|
||||||
|
const partsOrder = await client.query({
|
||||||
|
query: QUERY_PARTS_ORDER_OEC,
|
||||||
|
variables: {
|
||||||
|
id: insertResult.data.insert_parts_orders.returning[0].id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const oecResponse = await axios.post(
|
||||||
|
"http://localhost:1337/oec/",
|
||||||
|
|
||||||
|
partsOrder.data.parts_orders_by_pk,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${await auth.currentUser.getIdToken()}`,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (oecResponse.data && oecResponse.data.success === false) {
|
||||||
|
notification.open({
|
||||||
|
type: "error",
|
||||||
|
message: t("parts_orders.errors.oec", {
|
||||||
|
error: oecResponse.data.error,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.log("Error OEC.", error);
|
||||||
|
notification["error"]({
|
||||||
|
message: t("parts_orders.errors.oec", {
|
||||||
|
error: JSON.stringify(error.message),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toggleModalVisible();
|
||||||
};
|
};
|
||||||
|
|
||||||
const initialValues = {
|
const initialValues = {
|
||||||
|
|||||||
@@ -60,12 +60,10 @@ export function PartsStatusPie({ bodyshop, joblines_status }) {
|
|||||||
[pieColor, t]
|
[pieColor, t]
|
||||||
);
|
);
|
||||||
|
|
||||||
const memoizedData = useMemo(() => Calculatedata(joblines_status), [
|
const memoizedData = useMemo(
|
||||||
joblines_status,
|
() => Calculatedata(joblines_status),
|
||||||
Calculatedata,
|
[joblines_status, Calculatedata]
|
||||||
]);
|
);
|
||||||
|
|
||||||
console.log("PartsStatusPie -> memoizedData", memoizedData);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ export default function PrintWrapperComponent({
|
|||||||
messageObject = {},
|
messageObject = {},
|
||||||
children,
|
children,
|
||||||
id,
|
id,
|
||||||
|
emailOnly = false,
|
||||||
}) {
|
}) {
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const handlePrint = async (type) => {
|
const handlePrint = async (type) => {
|
||||||
@@ -19,7 +20,7 @@ export default function PrintWrapperComponent({
|
|||||||
return (
|
return (
|
||||||
<Space>
|
<Space>
|
||||||
{children || null}
|
{children || null}
|
||||||
<PrinterFilled onClick={() => handlePrint("p")} />
|
{!emailOnly && <PrinterFilled onClick={() => handlePrint("p")} />}
|
||||||
<MailFilled onClick={() => handlePrint("e")} />
|
<MailFilled onClick={() => handlePrint("e")} />
|
||||||
{loading && <Spin />}
|
{loading && <Spin />}
|
||||||
</Space>
|
</Space>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Input, PageHeader, Space, Spin } from "antd";
|
import { Input, Space, Spin } 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 { connect } from "react-redux";
|
||||||
@@ -26,8 +26,7 @@ export function ProductionBoardFilters({
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageHeader
|
|
||||||
extra={
|
|
||||||
<Space wrap>
|
<Space wrap>
|
||||||
{loading && <Spin />}
|
{loading && <Spin />}
|
||||||
<Input.Search
|
<Input.Search
|
||||||
@@ -46,7 +45,6 @@ export function ProductionBoardFilters({
|
|||||||
allowClear
|
allowClear
|
||||||
/>
|
/>
|
||||||
</Space>
|
</Space>
|
||||||
}
|
|
||||||
></PageHeader>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,106 +1,171 @@
|
|||||||
|
import { CalendarOutlined, EyeFilled } from "@ant-design/icons";
|
||||||
|
import { Card, Col, Row, Space } from "antd";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { Card, Row, Col, Dropdown } from "antd";
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
import { DateTimeFormatter } from "../../utils/DateFormatter";
|
import { DateTimeFormatter } from "../../utils/DateFormatter";
|
||||||
import ProductionAlert from "../production-list-columns/production-list-columns.alert.component";
|
import ProductionAlert from "../production-list-columns/production-list-columns.alert.component";
|
||||||
import { EyeFilled } from "@ant-design/icons";
|
|
||||||
import { Link } from "react-router-dom";
|
|
||||||
import "./production-board-card.styles.scss";
|
|
||||||
import ProductionRemoveButton from "../production-remove-button/production-remove-button.component";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
import ProductionSubletsManageComponent from "../production-sublets-manage/production-sublets-manage.component";
|
|
||||||
import ProductionListColumnProductionNote from "../production-list-columns/production-list-columns.productionnote.component";
|
import ProductionListColumnProductionNote from "../production-list-columns/production-list-columns.productionnote.component";
|
||||||
|
import ProductionSubletsManageComponent from "../production-sublets-manage/production-sublets-manage.component";
|
||||||
|
import "./production-board-card.styles.scss";
|
||||||
|
|
||||||
export default function ProductionBoardCard(technician, card) {
|
export default function ProductionBoardCard(
|
||||||
|
technician,
|
||||||
|
card,
|
||||||
|
bodyshop,
|
||||||
|
cardSettings
|
||||||
|
) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const menu = (
|
|
||||||
<div>
|
let employee_body, employee_prep, employee_refinish; //employee_csr;
|
||||||
<Card title={t("general.labels.actions")}>
|
if (card.employee_body) {
|
||||||
<ProductionRemoveButton jobId={card.id} />
|
employee_body = bodyshop.employees.find((e) => e.id === card.employee_body);
|
||||||
</Card>
|
}
|
||||||
</div>
|
if (card.employee_prep) {
|
||||||
);
|
employee_prep = bodyshop.employees.find((e) => e.id === card.employee_prep);
|
||||||
|
}
|
||||||
|
if (card.employee_refinish) {
|
||||||
|
employee_refinish = bodyshop.employees.find(
|
||||||
|
(e) => e.id === card.employee_refinish
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// if (card.employee_csr) {
|
||||||
|
// employee_csr = bodyshop.employees.find((e) => e.id === card.employee_csr);
|
||||||
|
// }
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Dropdown overlay={menu} trigger={["contextMenu"]}>
|
<Card
|
||||||
<Card
|
className="react-kanban-card imex-kanban-card"
|
||||||
className="react-kanban-card imex-kanban-card tight-antd-rows"
|
size="small"
|
||||||
//style={{ margin: ".2rem 0rem" }}
|
title={
|
||||||
title={`${card.ro_number || t("general.labels.na")} - ${
|
<Space>
|
||||||
card.v_model_yr
|
<ProductionAlert record={card} key="alert" />
|
||||||
} ${card.v_make_desc || ""} ${card.v_model_desc || ""}`}
|
<span style={{ fontWeight: "bolder" }}>
|
||||||
>
|
{card.ro_number || t("general.labels.na")}
|
||||||
<Row>
|
</span>
|
||||||
|
</Space>
|
||||||
|
}
|
||||||
|
extra={
|
||||||
|
technician ? (
|
||||||
|
<Link to={`/tech/joblookup?selected=${card.id}`}>
|
||||||
|
<EyeFilled />
|
||||||
|
</Link>
|
||||||
|
) : (
|
||||||
|
<Link to={`/manage/jobs/${card.id}`}>
|
||||||
|
<EyeFilled />
|
||||||
|
</Link>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<Row>
|
||||||
|
{cardSettings && cardSettings.ownr_nm && (
|
||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<div className="ellipses">{`${card.ownr_fn || ""} ${
|
{cardSettings && cardSettings.compact ? (
|
||||||
card.ownr_ln || ""
|
<div className="ellipses">{`${card.ownr_ln || ""} ${
|
||||||
} ${card.ownr_co_nm || ""}`}</div>
|
card.ownr_co_nm || ""
|
||||||
|
}`}</div>
|
||||||
|
) : (
|
||||||
|
<div className="ellipses">{`${card.ownr_ln || ""}, ${
|
||||||
|
card.ownr_fn || ""
|
||||||
|
} ${card.ownr_co_nm || ""}`}</div>
|
||||||
|
)}
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
)}
|
||||||
<Row>
|
<Col span={24}>
|
||||||
<Col span={12}>
|
<div className="ellipses">{`${card.v_model_yr || ""} ${
|
||||||
<div className="ellipses">{card.clm_no || ""}</div>
|
card.v_make_desc || ""
|
||||||
</Col>
|
} ${card.v_model_desc || ""}`}</div>
|
||||||
<Col span={12}>
|
</Col>
|
||||||
|
{cardSettings && cardSettings.ins_co_nm && card.ins_co_nm && (
|
||||||
|
<Col span={cardSettings && cardSettings.compact ? 24 : 12}>
|
||||||
<div className="ellipses">{card.ins_co_nm || ""}</div>
|
<div className="ellipses">{card.ins_co_nm || ""}</div>
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
)}
|
||||||
<Row>
|
{cardSettings && cardSettings.clm_no && card.clm_no && (
|
||||||
|
<Col span={cardSettings && cardSettings.compact ? 24 : 12}>
|
||||||
|
<div className="ellipses">{card.clm_no || ""}</div>
|
||||||
|
</Col>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{cardSettings && cardSettings.employeeassignments && (
|
||||||
<Col span={24}>
|
<Col span={24}>
|
||||||
<div className="imex-flex-row imex-flex-row__flex-space-around">
|
<Row>
|
||||||
<div className="mex-flex-row__margin">
|
<Col span={cardSettings && cardSettings.compact ? 24 : 12}>{`B: ${
|
||||||
<div>{`B: ${card.labhrs.aggregate.sum.mod_lb_hrs || "?"}`}</div>
|
employee_body
|
||||||
<div>{`R: ${card.larhrs.aggregate.sum.mod_lb_hrs || "?"}`}</div>
|
? `${employee_body.first_name.substr(
|
||||||
</div>
|
0,
|
||||||
<div className="mex-flex-row__margin">
|
3
|
||||||
<div>{`B: ${
|
)} ${employee_body.last_name.charAt(0)}`
|
||||||
card.employee_body_rel
|
: ""
|
||||||
? `${card.employee_body_rel.first_name} ${card.employee_body_rel.last_name}`
|
} ${card.labhrs.aggregate.sum.mod_lb_hrs || "?"}h`}</Col>
|
||||||
: ""
|
<Col span={cardSettings && cardSettings.compact ? 24 : 12}>{`P: ${
|
||||||
}`}</div>
|
employee_prep
|
||||||
<div>{`P: ${
|
? `${employee_prep.first_name.substr(
|
||||||
card.employee_prep_rel
|
0,
|
||||||
? `${card.employee_prep_rel.first_name} ${card.employee_prep_rel.last_name}`
|
3
|
||||||
: ""
|
)} ${employee_prep.last_name.charAt(0)}`
|
||||||
}`}</div>
|
: ""
|
||||||
<div>{`R: ${
|
}`}</Col>
|
||||||
card.employee_refinish_rel
|
<Col span={cardSettings && cardSettings.compact ? 24 : 12}>{`R: ${
|
||||||
? `${card.employee_refinish_rel.first_name} ${card.employee_refinish_rel.last_name}`
|
employee_refinish
|
||||||
: ""
|
? `${employee_refinish.first_name.substr(
|
||||||
}`}</div>
|
0,
|
||||||
<div>{`CSR: ${
|
3
|
||||||
card.employee_csr_rel
|
)} ${employee_refinish.last_name.charAt(0)}`
|
||||||
? `${card.employee_csr_rel.first_name} ${card.employee_csr_rel.last_name}`
|
: ""
|
||||||
: ""
|
} ${card.larhrs.aggregate.sum.mod_lb_hrs || "?"}h`}</Col>
|
||||||
}`}</div>
|
{/* <Col span={cardSettings && cardSettings.compact ? 24 : 12}>{`C: ${
|
||||||
</div>
|
employee_csr
|
||||||
</div>
|
? `${employee_csr.first_name} ${employee_csr.last_name}`
|
||||||
|
: ""
|
||||||
|
}`}</Col> */}
|
||||||
|
</Row>
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
)}
|
||||||
<Row>
|
{/* {cardSettings && cardSettings.laborhrs && (
|
||||||
<Col span={18}>
|
<Col span={24}>
|
||||||
<DateTimeFormatter>{card.scheduled_completion}</DateTimeFormatter>
|
<Row>
|
||||||
|
<Col span={cardSettings && cardSettings.compact ? 24 : 12}>{`B: ${
|
||||||
|
card.labhrs.aggregate.sum.mod_lb_hrs || "?"
|
||||||
|
} hrs`}</Col>
|
||||||
|
<Col span={cardSettings && cardSettings.compact ? 24 : 12}>{`R: ${
|
||||||
|
card.larhrs.aggregate.sum.mod_lb_hrs || "?"
|
||||||
|
} hrs`}</Col>
|
||||||
|
</Row>
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={6}>
|
)} */}
|
||||||
|
{cardSettings &&
|
||||||
|
cardSettings.scheduled_completion &&
|
||||||
|
card.scheduled_completion && (
|
||||||
|
<Col span={cardSettings && cardSettings.compact ? 24 : 12}>
|
||||||
|
<Space>
|
||||||
|
<CalendarOutlined />
|
||||||
|
<DateTimeFormatter format="MM/DD">
|
||||||
|
{card.scheduled_completion}
|
||||||
|
</DateTimeFormatter>
|
||||||
|
</Space>
|
||||||
|
</Col>
|
||||||
|
)}
|
||||||
|
{cardSettings && cardSettings.ats && card.alt_transport && (
|
||||||
|
<Col span={12}>
|
||||||
<div>{card.alt_transport || ""}</div>
|
<div>{card.alt_transport || ""}</div>
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
)}
|
||||||
<div>
|
{cardSettings && cardSettings.sublets && (
|
||||||
<ProductionListColumnProductionNote record={card} />
|
<Col span={12}>
|
||||||
</div>
|
<ProductionSubletsManageComponent
|
||||||
<div className="imex-flex-row imex-flex-row__flex-space-around">
|
subletJobLines={card.subletLines}
|
||||||
<ProductionAlert record={card} key="alert" />
|
/>
|
||||||
<ProductionSubletsManageComponent subletJobLines={card.subletLines} />
|
</Col>
|
||||||
{technician ? (
|
)}
|
||||||
<Link to={`/tech/joblookup?selected=${card.id}`}>
|
{cardSettings && cardSettings.production_note && (
|
||||||
<EyeFilled />
|
<Col span={24}>
|
||||||
</Link>
|
{cardSettings && cardSettings.production_note && (
|
||||||
) : (
|
<ProductionListColumnProductionNote record={card} />
|
||||||
<Link to={`/manage/jobs/${card.id}`}>
|
)}
|
||||||
<EyeFilled />
|
</Col>
|
||||||
</Link>
|
)}
|
||||||
)}
|
</Row>
|
||||||
</div>
|
</Card>
|
||||||
</Card>
|
|
||||||
</Dropdown>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,154 @@
|
|||||||
|
import { useMutation } from "@apollo/client";
|
||||||
|
import {
|
||||||
|
Button,
|
||||||
|
Card,
|
||||||
|
Col,
|
||||||
|
Form,
|
||||||
|
notification,
|
||||||
|
Popover,
|
||||||
|
Row,
|
||||||
|
Switch,
|
||||||
|
} from "antd";
|
||||||
|
import React, { useEffect, useState } from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { UPDATE_KANBAN_SETTINGS } from "../../graphql/user.queries";
|
||||||
|
|
||||||
|
export default function ProductionBoardKanbanCardSettings({
|
||||||
|
associationSettings,
|
||||||
|
}) {
|
||||||
|
const [form] = Form.useForm();
|
||||||
|
const [visible, setVisible] = useState(false);
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
const [updateKbSettings] = useMutation(UPDATE_KANBAN_SETTINGS);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
form.setFieldsValue(
|
||||||
|
associationSettings && associationSettings.kanban_settings
|
||||||
|
);
|
||||||
|
}, [form, associationSettings, visible]);
|
||||||
|
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const handleFinish = async (values) => {
|
||||||
|
setLoading(true);
|
||||||
|
const result = await updateKbSettings({
|
||||||
|
variables: {
|
||||||
|
id: associationSettings && associationSettings.id,
|
||||||
|
ks: values,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (result.errors) {
|
||||||
|
notification.open({
|
||||||
|
type: "error",
|
||||||
|
message: t("production.errors.settings", {
|
||||||
|
error: JSON.stringify(result.errors),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
setVisible(false);
|
||||||
|
setLoading(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
const overlay = (
|
||||||
|
<div>
|
||||||
|
<Card>
|
||||||
|
<Form form={form} onFinish={handleFinish} layout="vertical">
|
||||||
|
<Row gutter={[16, 16]}>
|
||||||
|
<Col span={12}>
|
||||||
|
<Form.Item
|
||||||
|
label={t("production.labels.compact")}
|
||||||
|
name="compact"
|
||||||
|
valuePropName="checked"
|
||||||
|
>
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
valuePropName="checked"
|
||||||
|
label={t("production.labels.ownr_nm")}
|
||||||
|
name="ownr_nm"
|
||||||
|
>
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
valuePropName="checked"
|
||||||
|
label={t("production.labels.clm_no")}
|
||||||
|
name="clm_no"
|
||||||
|
>
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
valuePropName="checked"
|
||||||
|
label={t("production.labels.ins_co_nm")}
|
||||||
|
name="ins_co_nm"
|
||||||
|
>
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
{/* <Form.Item
|
||||||
|
valuePropName="checked"
|
||||||
|
label={t("production.labels.laborhrs")}
|
||||||
|
name="laborhrs"
|
||||||
|
>
|
||||||
|
<Switch />
|
||||||
|
</Form.Item> */}
|
||||||
|
<Form.Item
|
||||||
|
valuePropName="checked"
|
||||||
|
label={t("production.labels.employeeassignments")}
|
||||||
|
name="employeeassignments"
|
||||||
|
>
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
</Col>
|
||||||
|
<Col span={12}>
|
||||||
|
<Form.Item
|
||||||
|
valuePropName="checked"
|
||||||
|
label={t("production.labels.scheduled_completion")}
|
||||||
|
name="scheduled_completion"
|
||||||
|
>
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
valuePropName="checked"
|
||||||
|
label={t("production.labels.ats")}
|
||||||
|
name="ats"
|
||||||
|
>
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
valuePropName="checked"
|
||||||
|
label={t("production.labels.production_note")}
|
||||||
|
name="production_note"
|
||||||
|
>
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
{/* <Form.Item
|
||||||
|
valuePropName='checked' label={t("production.labels.alert")} name="alert">
|
||||||
|
<Switch/>
|
||||||
|
</Form.Item> */}
|
||||||
|
<Form.Item
|
||||||
|
valuePropName="checked"
|
||||||
|
label={t("production.labels.sublets")}
|
||||||
|
name="sublets"
|
||||||
|
>
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</Form>
|
||||||
|
<Button
|
||||||
|
onClick={() => {
|
||||||
|
form.submit();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{t("general.actions.save")}
|
||||||
|
</Button>
|
||||||
|
</Card>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
return (
|
||||||
|
<Popover content={overlay} visible={visible}>
|
||||||
|
<Button loading={loading} onClick={() => setVisible(true)}>
|
||||||
|
{t("production.labels.cardsettings")}
|
||||||
|
</Button>
|
||||||
|
</Popover>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
import { useApolloClient } from "@apollo/client";
|
import { useApolloClient } from "@apollo/client";
|
||||||
import Board, { moveCard } from "@lourenci/react-kanban";
|
import Board, { moveCard } from "@asseinfo/react-kanban";
|
||||||
import "@lourenci/react-kanban/dist/styles.css";
|
//import "@asseinfo/react-kanban/dist/styles.css";
|
||||||
import { notification } from "antd";
|
import "./production-board-kanban.styles.scss";
|
||||||
|
import { Grid, notification, PageHeader, Space, Statistic } 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";
|
||||||
@@ -16,6 +17,8 @@ import ProductionBoardFilters from "../production-board-filters/production-board
|
|||||||
import { selectTechnician } from "../../redux/tech/tech.selectors";
|
import { selectTechnician } from "../../redux/tech/tech.selectors";
|
||||||
import { insertAuditTrail } from "../../redux/application/application.actions";
|
import { insertAuditTrail } from "../../redux/application/application.actions";
|
||||||
import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
||||||
|
import ProductionBoardKanbanCardSettings from "./production-board-kanban.card-settings.component";
|
||||||
|
import styled from "styled-components";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -32,6 +35,7 @@ export function ProductionBoardKanbanComponent({
|
|||||||
bodyshop,
|
bodyshop,
|
||||||
technician,
|
technician,
|
||||||
insertAuditTrail,
|
insertAuditTrail,
|
||||||
|
associationSettings,
|
||||||
}) {
|
}) {
|
||||||
const [boardLanes, setBoardLanes] = useState({
|
const [boardLanes, setBoardLanes] = useState({
|
||||||
columns: [{ id: "Loading...", title: "Loading...", cards: [] }],
|
columns: [{ id: "Loading...", title: "Loading...", cards: [] }],
|
||||||
@@ -116,6 +120,7 @@ export function ProductionBoardKanbanComponent({
|
|||||||
newChildCard ? newChildCard.id : null,
|
newChildCard ? newChildCard.id : null,
|
||||||
newChildCardNewParent
|
newChildCardNewParent
|
||||||
),
|
),
|
||||||
|
// TODO: optimisticResponse
|
||||||
});
|
});
|
||||||
insertAuditTrail({
|
insertAuditTrail({
|
||||||
jobid: card.id,
|
jobid: card.id,
|
||||||
@@ -131,24 +136,115 @@ export function ProductionBoardKanbanComponent({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const totalHrs = data
|
||||||
|
.reduce(
|
||||||
|
(acc, val) =>
|
||||||
|
acc +
|
||||||
|
(val.labhrs?.aggregate?.sum?.mod_lb_hrs || 0) +
|
||||||
|
(val.larhrs?.aggregate?.sum?.mod_lb_hrs || 0),
|
||||||
|
0
|
||||||
|
)
|
||||||
|
.toFixed(1);
|
||||||
|
const selectedBreakpoint = Object.entries(Grid.useBreakpoint())
|
||||||
|
.filter((screen) => !!screen[1])
|
||||||
|
.slice(-1)[0];
|
||||||
|
|
||||||
|
const standardSizes = {
|
||||||
|
xs: "250",
|
||||||
|
sm: "250",
|
||||||
|
md: "250",
|
||||||
|
lg: "250",
|
||||||
|
xl: "250",
|
||||||
|
xxl: "250",
|
||||||
|
};
|
||||||
|
const compactSizes = {
|
||||||
|
xs: "150",
|
||||||
|
sm: "150",
|
||||||
|
md: "150",
|
||||||
|
lg: "150",
|
||||||
|
xl: "155",
|
||||||
|
xxl: "155",
|
||||||
|
};
|
||||||
|
|
||||||
|
const width = selectedBreakpoint
|
||||||
|
? associationSettings &&
|
||||||
|
associationSettings.kanban_settings &&
|
||||||
|
associationSettings.kanban_settings.compact
|
||||||
|
? compactSizes[selectedBreakpoint[0]]
|
||||||
|
: standardSizes[selectedBreakpoint[0]]
|
||||||
|
: "250";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<Container width={width}>
|
||||||
<IndefiniteLoading loading={isMoving} />
|
<IndefiniteLoading loading={isMoving} />
|
||||||
<ProductionBoardFilters
|
<PageHeader
|
||||||
filter={filter}
|
title={
|
||||||
setFilter={setFilter}
|
<Space>
|
||||||
loading={isMoving}
|
<Statistic
|
||||||
|
title={t("dashboard.titles.productionhours")}
|
||||||
|
value={totalHrs}
|
||||||
|
/>
|
||||||
|
<Statistic
|
||||||
|
title={t("appointments.labels.inproduction")}
|
||||||
|
value={data && data.length}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
}
|
||||||
|
extra={
|
||||||
|
<Space wrap>
|
||||||
|
<ProductionBoardFilters
|
||||||
|
filter={filter}
|
||||||
|
setFilter={setFilter}
|
||||||
|
loading={isMoving}
|
||||||
|
/>
|
||||||
|
<ProductionBoardKanbanCardSettings
|
||||||
|
associationSettings={associationSettings}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Board
|
<Board
|
||||||
children={boardLanes}
|
children={boardLanes}
|
||||||
disableCardDrag={isMoving}
|
disableCardDrag={isMoving}
|
||||||
renderCard={(card) => ProductionBoardCard(technician, card)}
|
renderCard={(card) =>
|
||||||
|
ProductionBoardCard(
|
||||||
|
technician,
|
||||||
|
card,
|
||||||
|
bodyshop,
|
||||||
|
associationSettings &&
|
||||||
|
associationSettings.kanban_settings &&
|
||||||
|
Object.keys(associationSettings.kanban_settings).length > 0
|
||||||
|
? associationSettings.kanban_settings
|
||||||
|
: {
|
||||||
|
ats: true,
|
||||||
|
clm_no: true,
|
||||||
|
compact: false,
|
||||||
|
ownr_nm: true,
|
||||||
|
sublets: true,
|
||||||
|
ins_co_nm: true,
|
||||||
|
production_note: true,
|
||||||
|
employeeassignments: true,
|
||||||
|
scheduled_completion: true,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
onCardDragEnd={handleDragEnd}
|
onCardDragEnd={handleDragEnd}
|
||||||
/>
|
/>
|
||||||
</div>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
export default connect(
|
export default connect(
|
||||||
mapStateToProps,
|
mapStateToProps,
|
||||||
mapDispatchToProps
|
mapDispatchToProps
|
||||||
)(ProductionBoardKanbanComponent);
|
)(ProductionBoardKanbanComponent);
|
||||||
|
|
||||||
|
const Container = styled.div`
|
||||||
|
.react-kanban-card-skeleton,
|
||||||
|
.react-kanban-card,
|
||||||
|
.react-kanban-card-adder-form {
|
||||||
|
box-sizing: border-box;
|
||||||
|
max-width: ${(props) => props.width}px;
|
||||||
|
min-width: ${(props) => props.width}px;
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|||||||
@@ -1,25 +1,40 @@
|
|||||||
import { useSubscription } from "@apollo/client";
|
import { useQuery, useSubscription } from "@apollo/client";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { SUBSCRIPTION_JOBS_IN_PRODUCTION } from "../../graphql/jobs.queries";
|
import { SUBSCRIPTION_JOBS_IN_PRODUCTION } from "../../graphql/jobs.queries";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { QUERY_KANBAN_SETTINGS } from "../../graphql/user.queries";
|
||||||
|
import {
|
||||||
|
selectBodyshop,
|
||||||
|
selectCurrentUser,
|
||||||
|
} from "../../redux/user/user.selectors";
|
||||||
import ProductionBoardKanbanComponent from "./production-board-kanban.component";
|
import ProductionBoardKanbanComponent from "./production-board-kanban.component";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
|
currentUser: selectCurrentUser,
|
||||||
});
|
});
|
||||||
|
|
||||||
export function ProductionBoardKanbanContainer({ bodyshop }) {
|
export function ProductionBoardKanbanContainer({ bodyshop, currentUser }) {
|
||||||
const { loading, data } = useSubscription(
|
const { loading, data } = useSubscription(
|
||||||
SUBSCRIPTION_JOBS_IN_PRODUCTION,
|
SUBSCRIPTION_JOBS_IN_PRODUCTION,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const { loading: associationSettingsLoading, data: associationSettings } =
|
||||||
|
useQuery(QUERY_KANBAN_SETTINGS, {
|
||||||
|
variables: { email: currentUser.email },
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ProductionBoardKanbanComponent
|
<ProductionBoardKanbanComponent
|
||||||
loading={loading}
|
loading={loading || associationSettingsLoading}
|
||||||
data={data ? data.jobs : []}
|
data={data ? data.jobs : []}
|
||||||
|
associationSettings={
|
||||||
|
associationSettings && associationSettings.associations[0]
|
||||||
|
? associationSettings.associations[0]
|
||||||
|
: null
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
.react-kanban-board {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
.react-kanban-card {
|
||||||
|
border-radius: 3px;
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 4px;
|
||||||
|
margin-bottom: 7px;
|
||||||
|
}
|
||||||
|
// .react-kanban-card-skeleton,
|
||||||
|
// .react-kanban-card,
|
||||||
|
// .react-kanban-card-adder-form {
|
||||||
|
// box-sizing: border-box;
|
||||||
|
// max-width: 145px;
|
||||||
|
// min-width: 145px;
|
||||||
|
// }
|
||||||
|
|
||||||
|
.react-kanban-card--dragging {
|
||||||
|
box-shadow: 2px 2px grey;
|
||||||
|
}
|
||||||
|
.react-kanban-card__description {
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
.react-kanban-card__title {
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
font-weight: bold;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
.react-kanban-column {
|
||||||
|
padding: 10px;
|
||||||
|
border-radius: 2px;
|
||||||
|
background-color: #eee;
|
||||||
|
margin: 5px;
|
||||||
|
}
|
||||||
|
.react-kanban-column input:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
.react-kanban-card-adder-form {
|
||||||
|
border-radius: 3px;
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 10px;
|
||||||
|
margin-bottom: 7px;
|
||||||
|
}
|
||||||
|
.react-kanban-card-adder-form input {
|
||||||
|
border: 0px;
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
.react-kanban-card-adder-button {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 5px;
|
||||||
|
background-color: transparent;
|
||||||
|
cursor: pointer;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
transition: 0.3s;
|
||||||
|
border-radius: 3px;
|
||||||
|
font-size: 20px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.react-kanban-card-adder-button:hover {
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
|
.react-kanban-card-adder-form__title {
|
||||||
|
font-weight: bold;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
font-weight: bold;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
.react-kanban-card-adder-form__title:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
.react-kanban-card-adder-form__description {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
.react-kanban-card-adder-form__description:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
.react-kanban-card-adder-form__button {
|
||||||
|
background-color: #eee;
|
||||||
|
border: none;
|
||||||
|
padding: 5px;
|
||||||
|
width: 45%;
|
||||||
|
margin-top: 5px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.react-kanban-card-adder-form__button:hover {
|
||||||
|
transition: 0.3s;
|
||||||
|
cursor: pointer;
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
|
.react-kanban-column-header {
|
||||||
|
padding-bottom: 10px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.react-kanban-column-header input:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
.react-kanban-column-header__button {
|
||||||
|
color: #333333;
|
||||||
|
background-color: #ffffff;
|
||||||
|
border-color: #cccccc;
|
||||||
|
}
|
||||||
|
.react-kanban-column-header__button:hover,
|
||||||
|
.react-kanban-column-header__button:focus,
|
||||||
|
.react-kanban-column-header__button:active {
|
||||||
|
background-color: #e6e6e6;
|
||||||
|
}
|
||||||
|
.react-kanban-column-adder-button {
|
||||||
|
border: 2px dashed #eee;
|
||||||
|
height: 132px;
|
||||||
|
margin: 5px;
|
||||||
|
}
|
||||||
|
.react-kanban-column-adder-button:hover {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import i18n from "i18next";
|
import i18n from "i18next";
|
||||||
|
import moment from "moment";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import CurrencyFormatter from "../../utils/CurrencyFormatter";
|
import CurrencyFormatter from "../../utils/CurrencyFormatter";
|
||||||
@@ -11,11 +12,11 @@ import ProductionListColumnBodyPriority from "./production-list-columns.bodyprio
|
|||||||
import ProductionListDate from "./production-list-columns.date.component";
|
import ProductionListDate from "./production-list-columns.date.component";
|
||||||
import ProductionListColumnDetailPriority from "./production-list-columns.detailpriority.component";
|
import ProductionListColumnDetailPriority from "./production-list-columns.detailpriority.component";
|
||||||
import ProductionListEmployeeAssignment from "./production-list-columns.empassignment.component";
|
import ProductionListEmployeeAssignment from "./production-list-columns.empassignment.component";
|
||||||
|
import ProductionListLastContacted from "./production-list-columns.lastcontacted.component";
|
||||||
import ProductionListColumnPaintPriority from "./production-list-columns.paintpriority.component";
|
import ProductionListColumnPaintPriority from "./production-list-columns.paintpriority.component";
|
||||||
import ProductionListColumnNote from "./production-list-columns.productionnote.component";
|
import ProductionListColumnNote from "./production-list-columns.productionnote.component";
|
||||||
import ProductionListColumnStatus from "./production-list-columns.status.component";
|
import ProductionListColumnStatus from "./production-list-columns.status.component";
|
||||||
import ProductionlistColumnTouchTime from "./prodution-list-columns.touchtime.component";
|
import ProductionlistColumnTouchTime from "./prodution-list-columns.touchtime.component";
|
||||||
import ProductionListLastContacted from "./production-list-columns.lastcontacted.component";
|
|
||||||
|
|
||||||
const r = ({ technician, state, activeStatuses }) => {
|
const r = ({ technician, state, activeStatuses }) => {
|
||||||
return [
|
return [
|
||||||
@@ -109,6 +110,29 @@ const r = ({ technician, state, activeStatuses }) => {
|
|||||||
state.sortedInfo.order,
|
state.sortedInfo.order,
|
||||||
render: (text, record) => <ProductionListLastContacted record={record} />,
|
render: (text, record) => <ProductionListLastContacted record={record} />,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: i18n.t("jobs.fields.date_next_contact"),
|
||||||
|
dataIndex: "date_next_contact",
|
||||||
|
key: "date_next_contact",
|
||||||
|
ellipsis: true,
|
||||||
|
sorter: (a, b) => dateSort(a.date_next_contact, b.date_next_contact),
|
||||||
|
sortOrder:
|
||||||
|
state.sortedInfo.columnKey === "date_next_contact" &&
|
||||||
|
state.sortedInfo.order,
|
||||||
|
render: (text, record) => (
|
||||||
|
<span
|
||||||
|
style={{
|
||||||
|
color:
|
||||||
|
record.date_next_contact &&
|
||||||
|
moment(record.date_next_contact).isBefore(moment())
|
||||||
|
? "red"
|
||||||
|
: "",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<ProductionListDate record={record} field="date_next_contact" time />
|
||||||
|
</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: i18n.t("jobs.fields.scheduled_delivery"),
|
title: i18n.t("jobs.fields.scheduled_delivery"),
|
||||||
dataIndex: "scheduled_delivery",
|
dataIndex: "scheduled_delivery",
|
||||||
@@ -332,7 +356,7 @@ const r = ({ technician, state, activeStatuses }) => {
|
|||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<ProductionListEmployeeAssignment
|
<ProductionListEmployeeAssignment
|
||||||
record={record}
|
record={record}
|
||||||
type="employee_body_rel"
|
type="employee_body"
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
@@ -343,7 +367,7 @@ const r = ({ technician, state, activeStatuses }) => {
|
|||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<ProductionListEmployeeAssignment
|
<ProductionListEmployeeAssignment
|
||||||
record={record}
|
record={record}
|
||||||
type="employee_prep_rel"
|
type="employee_prep"
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
@@ -352,10 +376,7 @@ const r = ({ technician, state, activeStatuses }) => {
|
|||||||
dataIndex: "employee_csr",
|
dataIndex: "employee_csr",
|
||||||
key: "employee_csr",
|
key: "employee_csr",
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<ProductionListEmployeeAssignment
|
<ProductionListEmployeeAssignment record={record} type="employee_csr" />
|
||||||
record={record}
|
|
||||||
type="employee_csr_rel"
|
|
||||||
/>
|
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -365,7 +386,7 @@ const r = ({ technician, state, activeStatuses }) => {
|
|||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<ProductionListEmployeeAssignment
|
<ProductionListEmployeeAssignment
|
||||||
record={record}
|
record={record}
|
||||||
type="employee_refinish_rel"
|
type="employee_refinish"
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ export function ProductionListEmpAssignment({
|
|||||||
const result = await updateJob({
|
const result = await updateJob({
|
||||||
variables: { jobId: record.id, job: { [empAssignment]: employeeid } },
|
variables: { jobId: record.id, job: { [empAssignment]: employeeid } },
|
||||||
|
|
||||||
awaitRefetchQueries: true,
|
// awaitRefetchQueries: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
insertAuditTrail({
|
insertAuditTrail({
|
||||||
@@ -145,13 +145,18 @@ export function ProductionListEmpAssignment({
|
|||||||
</Row>
|
</Row>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let theEmployee;
|
||||||
|
|
||||||
|
if (record[type])
|
||||||
|
theEmployee = bodyshop.employees.find((e) => e.id === record[type]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Popover destroyTooltipOnHide content={popContent} visible={visibility}>
|
<Popover destroyTooltipOnHide content={popContent} visible={visibility}>
|
||||||
<Spin spinning={loading}>
|
<Spin spinning={loading}>
|
||||||
{record[type] ? (
|
{record[type] ? (
|
||||||
<div>
|
<div>
|
||||||
<span>{`${record[type].first_name || ""} ${
|
<span>{`${theEmployee.first_name || ""} ${
|
||||||
record[type].last_name || ""
|
theEmployee.last_name || ""
|
||||||
}`}</span>
|
}`}</span>
|
||||||
<DeleteFilled
|
<DeleteFilled
|
||||||
style={iconStyle}
|
style={iconStyle}
|
||||||
@@ -174,13 +179,13 @@ export function ProductionListEmpAssignment({
|
|||||||
|
|
||||||
const determineFieldName = (operation) => {
|
const determineFieldName = (operation) => {
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
case "employee_body_rel":
|
case "employee_body":
|
||||||
return "employee_body";
|
return "employee_body";
|
||||||
case "employee_prep_rel":
|
case "employee_prep":
|
||||||
return "employee_prep";
|
return "employee_prep";
|
||||||
case "employee_refinish_rel":
|
case "employee_refinish":
|
||||||
return "employee_refinish";
|
return "employee_refinish";
|
||||||
case "employee_csr_rel":
|
case "employee_csr":
|
||||||
return "employee_csr";
|
return "employee_csr";
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -29,7 +29,11 @@ export function ProductionLastContacted({ currentUser, record }) {
|
|||||||
const [visible, setVisible] = useState(false);
|
const [visible, setVisible] = useState(false);
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
const handleFinish = async ({ date_last_contacted, note }) => {
|
const handleFinish = async ({
|
||||||
|
date_last_contacted,
|
||||||
|
date_next_contact,
|
||||||
|
note,
|
||||||
|
}) => {
|
||||||
logImEXEvent("production_last_contacted");
|
logImEXEvent("production_last_contacted");
|
||||||
|
|
||||||
//e.stopPropagation();
|
//e.stopPropagation();
|
||||||
@@ -38,6 +42,7 @@ export function ProductionLastContacted({ currentUser, record }) {
|
|||||||
jobId: record.id,
|
jobId: record.id,
|
||||||
job: {
|
job: {
|
||||||
date_last_contacted,
|
date_last_contacted,
|
||||||
|
...(date_next_contact ? { date_next_contact } : {}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -98,7 +103,16 @@ export function ProductionLastContacted({ currentUser, record }) {
|
|||||||
onClick={(e) => e.stopPropagation()}
|
onClick={(e) => e.stopPropagation()}
|
||||||
>
|
>
|
||||||
<Form form={form} onFinish={handleFinish} layout="vertical">
|
<Form form={form} onFinish={handleFinish} layout="vertical">
|
||||||
<Form.Item name="date_last_contacted">
|
<Form.Item
|
||||||
|
name="date_last_contacted"
|
||||||
|
label={t("jobs.fields.date_last_contacted")}
|
||||||
|
>
|
||||||
|
<FormDateTimePickerComponent />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
name="date_next_contact"
|
||||||
|
label={t("jobs.fields.date_next_contact")}
|
||||||
|
>
|
||||||
<FormDateTimePickerComponent />
|
<FormDateTimePickerComponent />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item label={t("notes.labels.notetoadd")} name="note">
|
<Form.Item label={t("notes.labels.notetoadd")} name="note">
|
||||||
|
|||||||
@@ -182,10 +182,16 @@ export function ProductionListTable({
|
|||||||
<div>
|
<div>
|
||||||
<PageHeader
|
<PageHeader
|
||||||
title={
|
title={
|
||||||
<Statistic
|
<Space>
|
||||||
title={t("dashboard.titles.productionhours")}
|
<Statistic
|
||||||
value={totalHrs}
|
title={t("dashboard.titles.productionhours")}
|
||||||
/>
|
value={totalHrs}
|
||||||
|
/>
|
||||||
|
<Statistic
|
||||||
|
title={t("appointments.labels.inproduction")}
|
||||||
|
value={dataSource && dataSource.length}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
}
|
}
|
||||||
extra={
|
extra={
|
||||||
<Space wrap>
|
<Space wrap>
|
||||||
|
|||||||
@@ -56,7 +56,10 @@ export default function ProductionSubletsManageComponent({ subletJobLines }) {
|
|||||||
<Button
|
<Button
|
||||||
key="complete"
|
key="complete"
|
||||||
loading={loading}
|
loading={loading}
|
||||||
onClick={() => handleSubletMark(s, "complete")}
|
onClick={(e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
handleSubletMark(s, "complete");
|
||||||
|
}}
|
||||||
type={s.sublet_completed ? "primary" : "ghost"}
|
type={s.sublet_completed ? "primary" : "ghost"}
|
||||||
>
|
>
|
||||||
<CheckCircleFilled
|
<CheckCircleFilled
|
||||||
@@ -66,7 +69,10 @@ export default function ProductionSubletsManageComponent({ subletJobLines }) {
|
|||||||
<Button
|
<Button
|
||||||
key="sublet"
|
key="sublet"
|
||||||
loading={loading}
|
loading={loading}
|
||||||
onClick={() => handleSubletMark(s, "ignore")}
|
onClick={(e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
handleSubletMark(s, "ignore");
|
||||||
|
}}
|
||||||
type={s.sublet_ignored ? "primary" : "ghost"}
|
type={s.sublet_ignored ? "primary" : "ghost"}
|
||||||
>
|
>
|
||||||
<EyeInvisibleFilled
|
<EyeInvisibleFilled
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ export function ReportCenterModalComponent({ reportCenterModal }) {
|
|||||||
const start = values.dates[0];
|
const start = values.dates[0];
|
||||||
const end = values.dates[1];
|
const end = values.dates[1];
|
||||||
const { id } = values;
|
const { id } = values;
|
||||||
console.log("values", values);
|
|
||||||
await GenerateDocument(
|
await GenerateDocument(
|
||||||
{
|
{
|
||||||
name: values.key,
|
name: values.key,
|
||||||
|
|||||||
@@ -5,9 +5,8 @@ import {
|
|||||||
Input,
|
Input,
|
||||||
Row,
|
Row,
|
||||||
Select,
|
Select,
|
||||||
Space,
|
Space, Switch,
|
||||||
Switch,
|
Typography
|
||||||
Typography,
|
|
||||||
} from "antd";
|
} from "antd";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
@@ -75,6 +74,12 @@ export function ScheduleJobModalComponent({
|
|||||||
return (
|
return (
|
||||||
<Row gutter={[16, 16]}>
|
<Row gutter={[16, 16]}>
|
||||||
<Col span={12}>
|
<Col span={12}>
|
||||||
|
<Space>
|
||||||
|
<Typography.Title level={3}>{lbrHrsData?.jobs_by_pk?.ro_number}</Typography.Title>
|
||||||
|
<Typography.Title
|
||||||
|
level={4}
|
||||||
|
>{`B/R Hrs:${lbrHrsData?.jobs_by_pk.labhrs?.aggregate.sum.mod_lb_hrs}/${lbrHrsData?.jobs_by_pk.larhrs?.aggregate.sum.mod_lb_hrs}`}</Typography.Title>
|
||||||
|
</Space>
|
||||||
<LayoutFormRow grow>
|
<LayoutFormRow grow>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
name="start"
|
name="start"
|
||||||
|
|||||||
@@ -101,7 +101,6 @@ export function ScheduleJobModalContainer({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (existingAppointments.data.appointments.length > 0) {
|
if (existingAppointments.data.appointments.length > 0) {
|
||||||
console.log("Cancelling all previous appts.");
|
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
existingAppointments.data.appointments.map((app) => {
|
existingAppointments.data.appointments.map((app) => {
|
||||||
return cancelAppointment({
|
return cancelAppointment({
|
||||||
|
|||||||
@@ -3,12 +3,9 @@ import { Form } from "antd";
|
|||||||
import ConfigFormComponents from "../config-form-components/config-form-components.component";
|
import ConfigFormComponents from "../config-form-components/config-form-components.component";
|
||||||
|
|
||||||
export default function ShopCsiConfigForm({ selectedCsi }) {
|
export default function ShopCsiConfigForm({ selectedCsi }) {
|
||||||
console.log("ShopCsiConfigForm -> selectedCsi", selectedCsi);
|
|
||||||
const readOnly = !!selectedCsi;
|
const readOnly = !!selectedCsi;
|
||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
const handleFinish = (values) => {
|
const handleFinish = (values) => {};
|
||||||
console.log("values :>> ", values);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -467,6 +467,19 @@ export default function ShopInfoGeneral({ form }) {
|
|||||||
>
|
>
|
||||||
<Switch />
|
<Switch />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
name={["md_email_cc", "parts_order"]}
|
||||||
|
label={t("bodyshop.fields.md_email_cc", { template: "parts_order" })}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
//message: t("general.validation.required"),
|
||||||
|
type: "array",
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Select mode="tags" />
|
||||||
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
name={["tt_allow_post_to_invoiced"]}
|
name={["tt_allow_post_to_invoiced"]}
|
||||||
label={t("bodyshop.fields.tt_allow_post_to_invoiced")}
|
label={t("bodyshop.fields.tt_allow_post_to_invoiced")}
|
||||||
@@ -848,6 +861,88 @@ export default function ShopInfoGeneral({ form }) {
|
|||||||
}}
|
}}
|
||||||
</Form.List>
|
</Form.List>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
|
<LayoutFormRow grow header={t("bodyshop.labels.filehandlers")}>
|
||||||
|
<Form.List name={["md_filehandlers"]}>
|
||||||
|
{(fields, { add, remove, move }) => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{fields.map((field, index) => (
|
||||||
|
<Form.Item key={field.key}>
|
||||||
|
<LayoutFormRow noDivider>
|
||||||
|
<Form.Item
|
||||||
|
label={t("jobs.fields.ins_ct_fn")}
|
||||||
|
key={`${index}ins_ct_fn`}
|
||||||
|
name={[field.name, "ins_ct_fn"]}
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("jobs.fields.ins_ct_ln")}
|
||||||
|
key={`${index}ins_ct_ln`}
|
||||||
|
name={[field.name, "ins_ct_ln"]}
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("jobs.fields.ins_ph1")}
|
||||||
|
key={`${index}ins_ph1`}
|
||||||
|
name={[field.name, "ins_ph1"]}
|
||||||
|
rules={[
|
||||||
|
({ getFieldValue }) =>
|
||||||
|
PhoneItemFormatterValidation(getFieldValue, [
|
||||||
|
field.name,
|
||||||
|
"ins_ph",
|
||||||
|
]),
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("jobs.fields.ins_ea")}
|
||||||
|
key={`${index}ins_ea`}
|
||||||
|
name={[field.name, "ins_ea"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
type: "email",
|
||||||
|
message: "This is not a valid email address.",
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<FormItemEmail
|
||||||
|
email={form.getFieldValue([field.name, "ins_ea"])}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
<Space>
|
||||||
|
<DeleteFilled
|
||||||
|
onClick={() => {
|
||||||
|
remove(field.name);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<FormListMoveArrows
|
||||||
|
move={move}
|
||||||
|
index={index}
|
||||||
|
total={fields.length}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
</LayoutFormRow>
|
||||||
|
</Form.Item>
|
||||||
|
))}
|
||||||
|
<Form.Item>
|
||||||
|
<Button
|
||||||
|
type="dashed"
|
||||||
|
onClick={() => {
|
||||||
|
add();
|
||||||
|
}}
|
||||||
|
style={{ width: "100%" }}
|
||||||
|
>
|
||||||
|
{t("general.actions.add")}
|
||||||
|
</Button>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
</Form.List>
|
||||||
|
</LayoutFormRow>
|
||||||
<LayoutFormRow grow header={t("bodyshop.fields.md_ccc_rates")}>
|
<LayoutFormRow grow header={t("bodyshop.fields.md_ccc_rates")}>
|
||||||
<Form.List name={["md_ccc_rates"]}>
|
<Form.List name={["md_ccc_rates"]}>
|
||||||
{(fields, { add, remove, move }) => {
|
{(fields, { add, remove, move }) => {
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -344,10 +344,6 @@ export default function ShopInfoROStatusComponent({ form }) {
|
|||||||
|
|
||||||
const ColorPicker = ({ value, onChange, style, ...restProps }) => {
|
const ColorPicker = ({ value, onChange, style, ...restProps }) => {
|
||||||
const handleChange = (color) => {
|
const handleChange = (color) => {
|
||||||
console.log(
|
|
||||||
"🚀 ~ file: shop-info.rostatus.component.jsx ~ line 345 ~ color",
|
|
||||||
color
|
|
||||||
);
|
|
||||||
if (onChange) onChange(color.rgb);
|
if (onChange) onChange(color.rgb);
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -116,11 +116,10 @@ export function TimeTicketModalComponent({
|
|||||||
<EmployeeSearchSelect
|
<EmployeeSearchSelect
|
||||||
options={employeeAutoCompleteOptions}
|
options={employeeAutoCompleteOptions}
|
||||||
onSelect={(value) => {
|
onSelect={(value) => {
|
||||||
console.log(value);
|
|
||||||
const emps =
|
const emps =
|
||||||
employeeAutoCompleteOptions &&
|
employeeAutoCompleteOptions &&
|
||||||
employeeAutoCompleteOptions.filter((e) => e.id === value)[0];
|
employeeAutoCompleteOptions.filter((e) => e.id === value)[0];
|
||||||
console.log(emps);
|
|
||||||
form.setFieldsValue({ flat_rate: emps && emps.flat_rate });
|
form.setFieldsValue({ flat_rate: emps && emps.flat_rate });
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -37,10 +37,9 @@ export function UserValidatePwReset({
|
|||||||
async function checkCodeValid() {
|
async function checkCodeValid() {
|
||||||
try {
|
try {
|
||||||
const codeValid = await checkActionCode(auth, oobCode);
|
const codeValid = await checkActionCode(auth, oobCode);
|
||||||
console.log("codeValid :>> ", codeValid);
|
|
||||||
setCodeValid({ loading: false, ...codeValid });
|
setCodeValid({ loading: false, ...codeValid });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log("error :>> ", error);
|
|
||||||
setCodeValid({ loading: false, ...error });
|
setCodeValid({ loading: false, ...error });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ export function VendorsPhonebookAdd({ form, bodyshop, disabled }) {
|
|||||||
"zip",
|
"zip",
|
||||||
"country",
|
"country",
|
||||||
]);
|
]);
|
||||||
console.log(`VendorValues`, VendorValues);
|
|
||||||
const result = await insertPhonebook({
|
const result = await insertPhonebook({
|
||||||
variables: {
|
variables: {
|
||||||
phonebook_entry: [
|
phonebook_entry: [
|
||||||
|
|||||||
@@ -98,7 +98,10 @@ export const QUERY_BODYSHOP = gql`
|
|||||||
md_ded_notes
|
md_ded_notes
|
||||||
pbs_configuration
|
pbs_configuration
|
||||||
pbs_serialnumber
|
pbs_serialnumber
|
||||||
|
md_filehandlers
|
||||||
|
md_email_cc
|
||||||
employees {
|
employees {
|
||||||
|
user_email
|
||||||
id
|
id
|
||||||
active
|
active
|
||||||
first_name
|
first_name
|
||||||
@@ -192,6 +195,8 @@ export const UPDATE_SHOP = gql`
|
|||||||
md_ded_notes
|
md_ded_notes
|
||||||
pbs_configuration
|
pbs_configuration
|
||||||
pbs_serialnumber
|
pbs_serialnumber
|
||||||
|
md_filehandlers
|
||||||
|
md_email_cc
|
||||||
employees {
|
employees {
|
||||||
id
|
id
|
||||||
first_name
|
first_name
|
||||||
@@ -199,6 +204,7 @@ export const UPDATE_SHOP = gql`
|
|||||||
last_name
|
last_name
|
||||||
employee_number
|
employee_number
|
||||||
rates
|
rates
|
||||||
|
user_email
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { gql } from "@apollo/client";
|
|||||||
|
|
||||||
export const QUERY_EMPLOYEES = gql`
|
export const QUERY_EMPLOYEES = gql`
|
||||||
query QUERY_EMPLOYEES {
|
query QUERY_EMPLOYEES {
|
||||||
employees {
|
employees(order_by: { employee_number: asc }) {
|
||||||
last_name
|
last_name
|
||||||
id
|
id
|
||||||
first_name
|
first_name
|
||||||
|
|||||||
@@ -125,6 +125,7 @@ export const SUBSCRIPTION_JOBS_IN_PRODUCTION = gql`
|
|||||||
scheduled_completion
|
scheduled_completion
|
||||||
scheduled_delivery
|
scheduled_delivery
|
||||||
date_last_contacted
|
date_last_contacted
|
||||||
|
date_next_contact
|
||||||
ins_co_nm
|
ins_co_nm
|
||||||
clm_total
|
clm_total
|
||||||
ownr_ph1
|
ownr_ph1
|
||||||
@@ -134,39 +135,10 @@ export const SUBSCRIPTION_JOBS_IN_PRODUCTION = gql`
|
|||||||
production_vars
|
production_vars
|
||||||
kanbanparent
|
kanbanparent
|
||||||
alt_transport
|
alt_transport
|
||||||
joblines_status {
|
|
||||||
part_type
|
|
||||||
count
|
|
||||||
status
|
|
||||||
}
|
|
||||||
employee_body
|
employee_body
|
||||||
employee_body_rel {
|
|
||||||
id
|
|
||||||
first_name
|
|
||||||
last_name
|
|
||||||
}
|
|
||||||
employee_refinish
|
employee_refinish
|
||||||
employee_refinish_rel {
|
|
||||||
id
|
|
||||||
first_name
|
|
||||||
last_name
|
|
||||||
}
|
|
||||||
employee_prep
|
employee_prep
|
||||||
employee_prep_rel {
|
employee_csr
|
||||||
id
|
|
||||||
first_name
|
|
||||||
last_name
|
|
||||||
}
|
|
||||||
employee_csr_rel {
|
|
||||||
id
|
|
||||||
first_name
|
|
||||||
last_name
|
|
||||||
}
|
|
||||||
partcount: joblines_aggregate(where: { removed: { _eq: false } }) {
|
|
||||||
nodes {
|
|
||||||
status
|
|
||||||
}
|
|
||||||
}
|
|
||||||
labhrs: joblines_aggregate(
|
labhrs: joblines_aggregate(
|
||||||
where: {
|
where: {
|
||||||
_and: [{ mod_lbr_ty: { _neq: "LAR" } }, { removed: { _eq: false } }]
|
_and: [{ mod_lbr_ty: { _neq: "LAR" } }, { removed: { _eq: false } }]
|
||||||
@@ -208,6 +180,7 @@ export const QUERY_LBR_HRS_BY_PK = gql`
|
|||||||
query QUERY_LBR_HRS_BY_PK($id: uuid!) {
|
query QUERY_LBR_HRS_BY_PK($id: uuid!) {
|
||||||
jobs_by_pk(id: $id) {
|
jobs_by_pk(id: $id) {
|
||||||
id
|
id
|
||||||
|
ro_number
|
||||||
labhrs: joblines_aggregate(
|
labhrs: joblines_aggregate(
|
||||||
where: {
|
where: {
|
||||||
_and: [{ mod_lbr_ty: { _neq: "LAR" } }, { removed: { _eq: false } }]
|
_and: [{ mod_lbr_ty: { _neq: "LAR" } }, { removed: { _eq: false } }]
|
||||||
@@ -518,6 +491,7 @@ export const GET_JOB_BY_PK = gql`
|
|||||||
date_scheduled
|
date_scheduled
|
||||||
date_invoiced
|
date_invoiced
|
||||||
date_last_contacted
|
date_last_contacted
|
||||||
|
date_next_contact
|
||||||
date_exported
|
date_exported
|
||||||
status
|
status
|
||||||
owner_owing
|
owner_owing
|
||||||
@@ -535,6 +509,7 @@ export const GET_JOB_BY_PK = gql`
|
|||||||
unq_seq
|
unq_seq
|
||||||
line_ind
|
line_ind
|
||||||
line_desc
|
line_desc
|
||||||
|
line_ref
|
||||||
part_type
|
part_type
|
||||||
oem_partno
|
oem_partno
|
||||||
db_price
|
db_price
|
||||||
@@ -760,6 +735,7 @@ export const QUERY_JOB_CARD_DETAILS = gql`
|
|||||||
scheduled_delivery
|
scheduled_delivery
|
||||||
date_invoiced
|
date_invoiced
|
||||||
date_last_contacted
|
date_last_contacted
|
||||||
|
date_next_contact
|
||||||
date_open
|
date_open
|
||||||
date_exported
|
date_exported
|
||||||
|
|
||||||
@@ -846,6 +822,7 @@ export const QUERY_TECH_JOB_DETAILS = gql`
|
|||||||
scheduled_delivery
|
scheduled_delivery
|
||||||
date_invoiced
|
date_invoiced
|
||||||
date_last_contacted
|
date_last_contacted
|
||||||
|
date_next_contact
|
||||||
date_open
|
date_open
|
||||||
date_exported
|
date_exported
|
||||||
voided
|
voided
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ export const QUERY_NOTES_BY_JOB_PK = gql`
|
|||||||
query QUERY_NOTES_BY_JOB_PK($id: uuid!) {
|
query QUERY_NOTES_BY_JOB_PK($id: uuid!) {
|
||||||
jobs_by_pk(id: $id) {
|
jobs_by_pk(id: $id) {
|
||||||
id
|
id
|
||||||
|
ro_number
|
||||||
notes {
|
notes {
|
||||||
created_at
|
created_at
|
||||||
created_by
|
created_by
|
||||||
|
|||||||
@@ -11,6 +11,278 @@ export const INSERT_NEW_PARTS_ORDERS = gql`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export const QUERY_PARTS_ORDER_OEC = gql`
|
||||||
|
query QUERY_PARTS_ORDER_OEC($id: uuid!) {
|
||||||
|
parts_orders_by_pk(id: $id) {
|
||||||
|
parts_order_lines {
|
||||||
|
jobline {
|
||||||
|
tran_code
|
||||||
|
act_price
|
||||||
|
db_ref
|
||||||
|
db_price
|
||||||
|
db_hrs
|
||||||
|
glass_flag
|
||||||
|
id
|
||||||
|
lbr_amt
|
||||||
|
lbr_hrs_j
|
||||||
|
lbr_inc
|
||||||
|
lbr_op
|
||||||
|
lbr_op_j
|
||||||
|
lbr_tax
|
||||||
|
lbr_typ_j
|
||||||
|
line_desc
|
||||||
|
line_ind
|
||||||
|
line_no
|
||||||
|
line_ref
|
||||||
|
location
|
||||||
|
misc_amt
|
||||||
|
misc_sublt
|
||||||
|
misc_tax
|
||||||
|
mod_lb_hrs
|
||||||
|
mod_lbr_ty
|
||||||
|
oem_partno
|
||||||
|
op_code_desc
|
||||||
|
paint_stg
|
||||||
|
paint_tone
|
||||||
|
part_qty
|
||||||
|
part_type
|
||||||
|
price_inc
|
||||||
|
price_j
|
||||||
|
prt_dsmk_m
|
||||||
|
prt_dsmk_p
|
||||||
|
tax_part
|
||||||
|
unq_seq
|
||||||
|
alt_co_id
|
||||||
|
alt_overrd
|
||||||
|
alt_part_i
|
||||||
|
alt_partm
|
||||||
|
alt_partno
|
||||||
|
bett_amt
|
||||||
|
bett_pctg
|
||||||
|
bett_tax
|
||||||
|
bett_type
|
||||||
|
cert_part
|
||||||
|
est_seq
|
||||||
|
}
|
||||||
|
act_price
|
||||||
|
id
|
||||||
|
db_price
|
||||||
|
line_desc
|
||||||
|
quantity
|
||||||
|
}
|
||||||
|
job {
|
||||||
|
bodyshop{
|
||||||
|
shopname
|
||||||
|
bill_tax_rates
|
||||||
|
}
|
||||||
|
ro_number
|
||||||
|
clm_no
|
||||||
|
asgn_no
|
||||||
|
asgn_date
|
||||||
|
state_tax_rate
|
||||||
|
area_of_damage
|
||||||
|
asgn_no
|
||||||
|
asgn_type
|
||||||
|
ciecaid
|
||||||
|
clm_addr1
|
||||||
|
clm_city
|
||||||
|
clm_addr2
|
||||||
|
clm_ct_fn
|
||||||
|
clm_ct_ln
|
||||||
|
clm_ct_ph
|
||||||
|
clm_ct_phx
|
||||||
|
clm_ctry
|
||||||
|
clm_ea
|
||||||
|
clm_fax
|
||||||
|
clm_faxx
|
||||||
|
clm_ofc_id
|
||||||
|
clm_ofc_nm
|
||||||
|
clm_ph1
|
||||||
|
clm_ph1x
|
||||||
|
clm_ph2
|
||||||
|
clm_ph2x
|
||||||
|
clm_st
|
||||||
|
clm_title
|
||||||
|
clm_total
|
||||||
|
clm_zip
|
||||||
|
ded_amt
|
||||||
|
est_addr1
|
||||||
|
est_addr2
|
||||||
|
est_city
|
||||||
|
est_co_nm
|
||||||
|
est_ct_fn
|
||||||
|
est_ctry
|
||||||
|
est_ct_ln
|
||||||
|
est_ea
|
||||||
|
est_ph1
|
||||||
|
est_st
|
||||||
|
est_zip
|
||||||
|
g_bett_amt
|
||||||
|
id
|
||||||
|
ins_addr1
|
||||||
|
ins_city
|
||||||
|
ins_addr2
|
||||||
|
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
|
||||||
|
job_totals
|
||||||
|
loss_cat
|
||||||
|
loss_date
|
||||||
|
loss_desc
|
||||||
|
loss_of_use
|
||||||
|
loss_type
|
||||||
|
ownr_addr1
|
||||||
|
ownr_addr2
|
||||||
|
ownr_city
|
||||||
|
ownr_co_nm
|
||||||
|
ownr_ctry
|
||||||
|
ownr_ea
|
||||||
|
ownr_fax
|
||||||
|
ownr_faxx
|
||||||
|
ownr_ph1
|
||||||
|
ownr_fn
|
||||||
|
ownr_ln
|
||||||
|
ownr_ph1x
|
||||||
|
ownr_ph2
|
||||||
|
ownr_ph2x
|
||||||
|
ownr_st
|
||||||
|
ownr_title
|
||||||
|
ownr_zip
|
||||||
|
parts_tax_rates
|
||||||
|
pay_amt
|
||||||
|
pay_date
|
||||||
|
pay_type
|
||||||
|
pay_chknm
|
||||||
|
payee_nms
|
||||||
|
plate_no
|
||||||
|
plate_st
|
||||||
|
po_number
|
||||||
|
policy_no
|
||||||
|
tax_lbr_rt
|
||||||
|
tax_levies_rt
|
||||||
|
tax_paint_mat_rt
|
||||||
|
tax_predis
|
||||||
|
tax_prethr
|
||||||
|
tax_pstthr
|
||||||
|
tax_registration_number
|
||||||
|
tax_str_rt
|
||||||
|
tax_shop_mat_rt
|
||||||
|
tax_sub_rt
|
||||||
|
tax_thramt
|
||||||
|
tax_tow_rt
|
||||||
|
theft_ind
|
||||||
|
tlos_ind
|
||||||
|
towin
|
||||||
|
v_color
|
||||||
|
v_make_desc
|
||||||
|
v_model_desc
|
||||||
|
v_model_yr
|
||||||
|
v_vin
|
||||||
|
vehicle {
|
||||||
|
v_bstyle
|
||||||
|
v_type
|
||||||
|
v_trimcode
|
||||||
|
v_tone
|
||||||
|
v_stage
|
||||||
|
v_prod_dt
|
||||||
|
v_options
|
||||||
|
v_paint_codes
|
||||||
|
v_model_yr
|
||||||
|
v_model_desc
|
||||||
|
v_mldgcode
|
||||||
|
v_makecode
|
||||||
|
v_make_desc
|
||||||
|
v_engine
|
||||||
|
v_cond
|
||||||
|
v_color
|
||||||
|
trim_color
|
||||||
|
shopid
|
||||||
|
plate_no
|
||||||
|
plate_st
|
||||||
|
db_v_code
|
||||||
|
v_vin
|
||||||
|
}
|
||||||
|
agt_zip
|
||||||
|
agt_st
|
||||||
|
agt_ph2x
|
||||||
|
agt_ph2
|
||||||
|
agt_ph1x
|
||||||
|
agt_ph1
|
||||||
|
agt_lic_no
|
||||||
|
agt_faxx
|
||||||
|
agt_fax
|
||||||
|
agt_ea
|
||||||
|
agt_ctry
|
||||||
|
agt_ct_phx
|
||||||
|
agt_ct_ph
|
||||||
|
agt_ct_ln
|
||||||
|
agt_ct_fn
|
||||||
|
agt_co_nm
|
||||||
|
agt_co_id
|
||||||
|
agt_city
|
||||||
|
agt_addr1
|
||||||
|
agt_addr2
|
||||||
|
adj_g_disc
|
||||||
|
rate_matd
|
||||||
|
rate_mash
|
||||||
|
rate_mapa
|
||||||
|
rate_mahw
|
||||||
|
rate_macs
|
||||||
|
rate_mabl
|
||||||
|
rate_ma3s
|
||||||
|
rate_ma2t
|
||||||
|
rate_ma2s
|
||||||
|
rate_lau
|
||||||
|
rate_las
|
||||||
|
rate_lar
|
||||||
|
rate_lam
|
||||||
|
rate_lag
|
||||||
|
rate_laf
|
||||||
|
rate_lae
|
||||||
|
rate_lad
|
||||||
|
rate_lab
|
||||||
|
rate_laa
|
||||||
|
rate_la4
|
||||||
|
rate_la3
|
||||||
|
rate_la2
|
||||||
|
rate_la1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
export const DELETE_PARTS_ORDER = gql`
|
export const DELETE_PARTS_ORDER = gql`
|
||||||
mutation DELETE_PARTS_ORDER($partsOrderId: uuid!) {
|
mutation DELETE_PARTS_ORDER($partsOrderId: uuid!) {
|
||||||
delete_parts_orders_by_pk(id: $partsOrderId) {
|
delete_parts_orders_by_pk(id: $partsOrderId) {
|
||||||
|
|||||||
@@ -69,3 +69,25 @@ export const UPDATE_FCM_TOKEN = gql`
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export const QUERY_KANBAN_SETTINGS = gql`
|
||||||
|
query QUERY_KANBAN_SETTINGS($email: String!) {
|
||||||
|
associations(
|
||||||
|
where: { _and: { useremail: { _eq: $email }, active: { _eq: true } } }
|
||||||
|
) {
|
||||||
|
id
|
||||||
|
kanban_settings
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
export const UPDATE_KANBAN_SETTINGS = gql`
|
||||||
|
mutation UPDATE_KANBAN_SETTINGS($id: uuid!, $ks: jsonb) {
|
||||||
|
update_associations_by_pk(
|
||||||
|
pk_columns: { id: $id }
|
||||||
|
_set: { kanban_settings: $ks }
|
||||||
|
) {
|
||||||
|
id
|
||||||
|
kanban_settings
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ export default class Home extends React.Component {
|
|||||||
}, 500);
|
}, 500);
|
||||||
}
|
}
|
||||||
/* 如果不是 dva 2.0 请删除 end */
|
/* 如果不是 dva 2.0 请删除 end */
|
||||||
console.log("Setting $crisp segments", ["lead"]);
|
|
||||||
window.$crisp.push(["set", "session:segments", [["lead"]]]);
|
window.$crisp.push(["set", "session:segments", [["lead"]]]);
|
||||||
window.$crisp.push([
|
window.$crisp.push([
|
||||||
"set",
|
"set",
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { Button, Col, PageHeader, Row } from "antd";
|
import { Button, Col, PageHeader, Row, Space, Form, Switch } from "antd";
|
||||||
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import ContractCarsContainer from "../../components/contract-cars/contract-cars.container";
|
import ContractCarsContainer from "../../components/contract-cars/contract-cars.container";
|
||||||
@@ -13,14 +14,25 @@ export default function ContractCreatePageComponent({
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const CreateButton = (
|
const CreateButton = (
|
||||||
<Button
|
<Space size="large">
|
||||||
disabled={!selectedJobState[0] || !selectedCarState[0]}
|
{selectedJobState[0] && selectedCarState[0] && (
|
||||||
type="primary"
|
<Form.Item
|
||||||
onClick={() => form.submit()}
|
label={t("jobs.actions.addtoproduction")}
|
||||||
loading={loading}
|
name="addtoproduction"
|
||||||
>
|
valuePropName="checked"
|
||||||
{t("general.actions.create")}
|
>
|
||||||
</Button>
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
)}
|
||||||
|
<Button
|
||||||
|
disabled={!selectedJobState[0] || !selectedCarState[0]}
|
||||||
|
type="primary"
|
||||||
|
onClick={() => form.submit()}
|
||||||
|
loading={loading}
|
||||||
|
>
|
||||||
|
{t("general.actions.create")}
|
||||||
|
</Button>
|
||||||
|
</Space>
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { useHistory, useLocation } from "react-router-dom";
|
|||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
|
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
|
||||||
import { INSERT_NEW_CONTRACT } from "../../graphql/cccontracts.queries";
|
import { INSERT_NEW_CONTRACT } from "../../graphql/cccontracts.queries";
|
||||||
|
import { UPDATE_JOB } from "../../graphql/jobs.queries";
|
||||||
import {
|
import {
|
||||||
setBreadcrumbs,
|
setBreadcrumbs,
|
||||||
setSelectedHeader,
|
setSelectedHeader,
|
||||||
@@ -37,8 +38,9 @@ export function ContractCreatePageContainer({
|
|||||||
(location.state && location.state.jobId) || null
|
(location.state && location.state.jobId) || null
|
||||||
);
|
);
|
||||||
const [insertContract] = useMutation(INSERT_NEW_CONTRACT);
|
const [insertContract] = useMutation(INSERT_NEW_CONTRACT);
|
||||||
|
const [intakeJob] = useMutation(UPDATE_JOB);
|
||||||
|
|
||||||
const handleFinish = async (values) => {
|
const handleFinish = async ({ addtoproduction, ...values }) => {
|
||||||
if (!!selectedCarState[0] && !!selectedJobState[0]) {
|
if (!!selectedCarState[0] && !!selectedJobState[0]) {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
const result = await insertContract({
|
const result = await insertContract({
|
||||||
@@ -54,12 +56,35 @@ export function ContractCreatePageContainer({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!result.errors) {
|
if (!result.errors) {
|
||||||
//Update the courtesy car to have the damage.
|
//Update the courtesy car to have the damage.
|
||||||
notification["success"]({
|
notification["success"]({
|
||||||
message: t("contracts.successes.saved"),
|
message: t("contracts.successes.saved"),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//Intake the job if required
|
||||||
|
if (addtoproduction) {
|
||||||
|
const result2 = await intakeJob({
|
||||||
|
variables: {
|
||||||
|
jobId: selectedJobState[0],
|
||||||
|
job: {
|
||||||
|
actual_in: new Date(),
|
||||||
|
inproduction: true,
|
||||||
|
status: bodyshop.md_ro_statuses.default_arrived,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (result2.errors) {
|
||||||
|
notification["error"]({
|
||||||
|
message: t("jobs.errors.saving", {
|
||||||
|
error: JSON.stringify(!result2.errors),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
form.resetFields();
|
form.resetFields();
|
||||||
form.resetFields();
|
form.resetFields();
|
||||||
history.push(
|
history.push(
|
||||||
|
|||||||
@@ -124,11 +124,6 @@ export function ContractDetailPageContainer({
|
|||||||
if (loading) return <LoadingSpinner />;
|
if (loading) return <LoadingSpinner />;
|
||||||
|
|
||||||
if (!!!data.cccontracts_by_pk) return <NotFound />;
|
if (!!!data.cccontracts_by_pk) return <NotFound />;
|
||||||
console.log(
|
|
||||||
"data.cccontracts_by_pk",
|
|
||||||
!!!data.cccontracts_by_pk,
|
|
||||||
data.cccontracts_by_pk
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<RbacWrapper action="contracts:detail">
|
<RbacWrapper action="contracts:detail">
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ export function CsiContainerPage({ currentUser }) {
|
|||||||
/>
|
/>
|
||||||
</Layout>
|
</Layout>
|
||||||
);
|
);
|
||||||
console.log(bodyshop);
|
|
||||||
return (
|
return (
|
||||||
<Layout
|
<Layout
|
||||||
style={{ height: "100vh", display: "flex", flexDirection: "column" }}
|
style={{ height: "100vh", display: "flex", flexDirection: "column" }}
|
||||||
|
|||||||
@@ -120,7 +120,11 @@ export function DmsContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) {
|
|||||||
if (loading) return <LoadingSpinner />;
|
if (loading) return <LoadingSpinner />;
|
||||||
if (error) return <AlertComponent message={error.message} type="error" />;
|
if (error) return <AlertComponent message={error.message} type="error" />;
|
||||||
|
|
||||||
if (!jobId || !bodyshop.cdk_dealerid || !(data && data.jobs_by_pk))
|
if (
|
||||||
|
!jobId ||
|
||||||
|
!(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) ||
|
||||||
|
!(data && data.jobs_by_pk)
|
||||||
|
)
|
||||||
return <Result status="404" />;
|
return <Result status="404" />;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ export function JobsCloseComponent({ job, bodyshop, jobRO }) {
|
|||||||
>
|
>
|
||||||
<DateTimePicker disabled={jobRO} />
|
<DateTimePicker disabled={jobRO} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
{bodyshop.cdk_dealerid && (
|
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.kmin")}
|
label={t("jobs.fields.kmin")}
|
||||||
name="kmin"
|
name="kmin"
|
||||||
@@ -221,7 +221,7 @@ export function JobsCloseComponent({ job, bodyshop, jobRO }) {
|
|||||||
<InputNumber precision={0} disabled={jobRO} />
|
<InputNumber precision={0} disabled={jobRO} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
)}
|
)}
|
||||||
{bodyshop.cdk_dealerid && (
|
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.kmout")}
|
label={t("jobs.fields.kmout")}
|
||||||
name="kmout"
|
name="kmout"
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ export default function MobilePaymentComponent() {
|
|||||||
const [paymentRequest, setPaymentRequest] = useState(null);
|
const [paymentRequest, setPaymentRequest] = useState(null);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (stripe) {
|
if (stripe) {
|
||||||
console.log("in useeff");
|
|
||||||
const pr = stripe.paymentRequest({
|
const pr = stripe.paymentRequest({
|
||||||
country: "CA",
|
country: "CA",
|
||||||
displayItems: [{ label: "Deductible", amount: 1 }],
|
displayItems: [{ label: "Deductible", amount: 1 }],
|
||||||
@@ -23,10 +22,8 @@ export default function MobilePaymentComponent() {
|
|||||||
requestPayerEmail: true,
|
requestPayerEmail: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log("pr", pr);
|
|
||||||
// Check the availability of the Payment Request API.
|
// Check the availability of the Payment Request API.
|
||||||
pr.canMakePayment().then((result) => {
|
pr.canMakePayment().then((result) => {
|
||||||
console.log("result", result);
|
|
||||||
if (result) {
|
if (result) {
|
||||||
setPaymentRequest(pr);
|
setPaymentRequest(pr);
|
||||||
} else {
|
} else {
|
||||||
@@ -45,7 +42,7 @@ export default function MobilePaymentComponent() {
|
|||||||
|
|
||||||
if (paymentRequest) {
|
if (paymentRequest) {
|
||||||
paymentRequest.on("paymentmethod", async (ev) => {
|
paymentRequest.on("paymentmethod", async (ev) => {
|
||||||
//Call server side to get the client secret
|
//Call server side to get the client secret
|
||||||
// Confirm the PaymentIntent without handling potential next actions (yet).
|
// Confirm the PaymentIntent without handling potential next actions (yet).
|
||||||
const { error: confirmError } = await stripe.confirmCardPayment(
|
const { error: confirmError } = await stripe.confirmCardPayment(
|
||||||
"clientSecret",
|
"clientSecret",
|
||||||
@@ -63,14 +60,14 @@ export default function MobilePaymentComponent() {
|
|||||||
// it to close the browser payment method collection interface.
|
// it to close the browser payment method collection interface.
|
||||||
ev.complete("success");
|
ev.complete("success");
|
||||||
// Let Stripe.js handle the rest of the payment flow.
|
// Let Stripe.js handle the rest of the payment flow.
|
||||||
const { error, paymentIntent } = await stripe.confirmCardPayment(
|
const { error, //paymentIntent
|
||||||
|
} = await stripe.confirmCardPayment(
|
||||||
"clientSecret"
|
"clientSecret"
|
||||||
);
|
);
|
||||||
if (error) {
|
if (error) {
|
||||||
// The payment failed -- ask your customer for a new payment method.
|
// The payment failed -- ask your customer for a new payment method.
|
||||||
} else {
|
} else {
|
||||||
// The payment has succeeded.
|
// The payment has succeeded.
|
||||||
console.log('paymentIntent', paymentIntent)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import React from "react";
|
|
||||||
import MobilePaymentComponent from "./mobile-payment.component";
|
|
||||||
import { Elements } from "@stripe/react-stripe-js";
|
import { Elements } from "@stripe/react-stripe-js";
|
||||||
import { loadStripe } from "@stripe/stripe-js";
|
import { loadStripe } from "@stripe/stripe-js";
|
||||||
|
import React from "react";
|
||||||
|
import MobilePaymentComponent from "./mobile-payment.component";
|
||||||
|
|
||||||
const stripePromise = new Promise((resolve, reject) => {
|
const stripePromise = new Promise((resolve, reject) => {
|
||||||
resolve(
|
resolve(
|
||||||
|
|||||||
@@ -120,8 +120,6 @@ export function* calculateScheduleLoad({ payload: end }) {
|
|||||||
|
|
||||||
yield put(scheduleLoadSuccess(load));
|
yield put(scheduleLoadSuccess(load));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
//console.log("Error in sendEmailFailure saga.", error.message);
|
|
||||||
console.log("error", error);
|
|
||||||
yield put(scheduleLoadFailure(error));
|
yield put(scheduleLoadFailure(error));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -139,14 +137,7 @@ export function* insertAuditTrailSaga({
|
|||||||
const state = yield select();
|
const state = yield select();
|
||||||
const bodyshop = state.user.bodyshop;
|
const bodyshop = state.user.bodyshop;
|
||||||
const currentUser = state.user.currentUser;
|
const currentUser = state.user.currentUser;
|
||||||
console.log(
|
|
||||||
"Inserting audit trail for",
|
|
||||||
bodyshop.shopname,
|
|
||||||
currentUser.email,
|
|
||||||
jobid,
|
|
||||||
billid,
|
|
||||||
operation
|
|
||||||
);
|
|
||||||
const variables = {
|
const variables = {
|
||||||
auditObj: {
|
auditObj: {
|
||||||
bodyshopid: bodyshop.id,
|
bodyshopid: bodyshop.id,
|
||||||
|
|||||||
@@ -178,13 +178,13 @@ export function* signInSuccessSaga({ payload }) {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// window.$crisp.push(["set", "user:email", [payload.email]]);
|
// window.$crisp.push(["set", "user:email", [payload.email]]);
|
||||||
console.log("$crisp set nickname", [payload.displayName || payload.email]);
|
|
||||||
window.$crisp.push([
|
window.$crisp.push([
|
||||||
"set",
|
"set",
|
||||||
"user:nickname",
|
"user:nickname",
|
||||||
[payload.displayName || payload.email],
|
[payload.displayName || payload.email],
|
||||||
]);
|
]);
|
||||||
console.log("Setting $crisp segments", ["user"]);
|
|
||||||
window.$crisp.push(["set", "session:segments", [["user"]]]);
|
window.$crisp.push(["set", "session:segments", [["user"]]]);
|
||||||
|
|
||||||
Sentry.setUser({
|
Sentry.setUser({
|
||||||
@@ -235,7 +235,6 @@ export function* validatePasswordResetStart({ payload: { password, code } }) {
|
|||||||
yield confirmPasswordReset(auth, code, password);
|
yield confirmPasswordReset(auth, code, password);
|
||||||
yield put(validatePasswordResetSuccess());
|
yield put(validatePasswordResetSuccess());
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log("function*validatePasswordResetStart -> error", error);
|
|
||||||
yield put(validatePasswordResetFailure(error.message));
|
yield put(validatePasswordResetFailure(error.message));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -267,7 +266,6 @@ export function* SetAuthLevelFromShopDetails({ payload }) {
|
|||||||
try {
|
try {
|
||||||
window.$crisp.push(["set", "user:company", [payload.shopname]]);
|
window.$crisp.push(["set", "user:company", [payload.shopname]]);
|
||||||
if (authRecord[0] && authRecord[0].user.validemail) {
|
if (authRecord[0] && authRecord[0].user.validemail) {
|
||||||
console.log("$crisp user email", authRecord[0].user.email);
|
|
||||||
window.$crisp.push(["set", "user:email", [authRecord[0].user.email]]);
|
window.$crisp.push(["set", "user:email", [authRecord[0].user.email]]);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -271,6 +271,7 @@
|
|||||||
"md_ccc_rates": "Courtesy Car Contract Rate Presets",
|
"md_ccc_rates": "Courtesy Car Contract Rate Presets",
|
||||||
"md_classes": "Classes",
|
"md_classes": "Classes",
|
||||||
"md_ded_notes": "Deductible Notes",
|
"md_ded_notes": "Deductible Notes",
|
||||||
|
"md_email_cc": "Auto Email CC: $t(printcenter.subjects.jobs.{{template}})",
|
||||||
"md_hour_split": {
|
"md_hour_split": {
|
||||||
"paint": "Paint Hour Split",
|
"paint": "Paint Hour Split",
|
||||||
"prep": "Prep Hour Split"
|
"prep": "Prep Hour Split"
|
||||||
@@ -503,6 +504,7 @@
|
|||||||
"emaillater": "Email Later",
|
"emaillater": "Email Later",
|
||||||
"employees": "Employees",
|
"employees": "Employees",
|
||||||
"estimators": "Estimators",
|
"estimators": "Estimators",
|
||||||
|
"filehandlers": "File Handlers",
|
||||||
"insurancecos": "Insurance Companies",
|
"insurancecos": "Insurance Companies",
|
||||||
"intakechecklist": "Intake Checklist",
|
"intakechecklist": "Intake Checklist",
|
||||||
"jobstatuses": "Job Statuses",
|
"jobstatuses": "Job Statuses",
|
||||||
@@ -535,6 +537,7 @@
|
|||||||
"save": "Shop configuration saved successfully. "
|
"save": "Shop configuration saved successfully. "
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
"centermustexist": "The chosen responsibility center does not exist.",
|
||||||
"larsplit": "Refinish hour split must add up to 1.",
|
"larsplit": "Refinish hour split must add up to 1.",
|
||||||
"useremailmustexist": "This email is not a valid user."
|
"useremailmustexist": "This email is not a valid user."
|
||||||
}
|
}
|
||||||
@@ -1091,6 +1094,7 @@
|
|||||||
"addtoscoreboard": "Add to Scoreboard",
|
"addtoscoreboard": "Add to Scoreboard",
|
||||||
"allocate": "Allocate",
|
"allocate": "Allocate",
|
||||||
"autoallocate": "Auto Allocate",
|
"autoallocate": "Auto Allocate",
|
||||||
|
"changefilehandler": "Change File Handler",
|
||||||
"changelaborrate": "Change Labor Rate",
|
"changelaborrate": "Change Labor Rate",
|
||||||
"changestatus": "Change Status",
|
"changestatus": "Change Status",
|
||||||
"changestimator": "Change Estimator",
|
"changestimator": "Change Estimator",
|
||||||
@@ -1205,6 +1209,7 @@
|
|||||||
"date_exported": "Exported",
|
"date_exported": "Exported",
|
||||||
"date_invoiced": "Invoiced",
|
"date_invoiced": "Invoiced",
|
||||||
"date_last_contacted": "Last Contacted Date",
|
"date_last_contacted": "Last Contacted Date",
|
||||||
|
"date_next_contact": "Next Contact Date",
|
||||||
"date_open": "Open",
|
"date_open": "Open",
|
||||||
"date_scheduled": "Scheduled",
|
"date_scheduled": "Scheduled",
|
||||||
"ded_amt": "Deductible",
|
"ded_amt": "Deductible",
|
||||||
@@ -1725,7 +1730,8 @@
|
|||||||
"new": "New Conversation"
|
"new": "New Conversation"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"invalidphone": "The phone number is invalid. Unable to open conversation. "
|
"invalidphone": "The phone number is invalid. Unable to open conversation. ",
|
||||||
|
"noattachedjobs": "No jobs have been associated to this conversation. "
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"archive": "Archive",
|
"archive": "Archive",
|
||||||
@@ -1735,6 +1741,7 @@
|
|||||||
"nojobs": "Not associated to any job.",
|
"nojobs": "Not associated to any job.",
|
||||||
"phonenumber": "Phone #",
|
"phonenumber": "Phone #",
|
||||||
"presets": "Presets",
|
"presets": "Presets",
|
||||||
|
"recentonly": "Only your most recent 50 conversations will be shown here. If you are looking for an older conversation, find the related contact and click their phone number to view the conversation.",
|
||||||
"selectmedia": "Select Media",
|
"selectmedia": "Select Media",
|
||||||
"sentby": "Sent by {{by}} at {{time}}",
|
"sentby": "Sent by {{by}} at {{time}}",
|
||||||
"typeamessage": "Send a message...",
|
"typeamessage": "Send a message...",
|
||||||
@@ -1824,8 +1831,10 @@
|
|||||||
"receivebill": "Receive Bill"
|
"receivebill": "Receive Bill"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
|
"associatedbills": "This parts order cannot",
|
||||||
"backordering": "Error backordering part {{message}}.",
|
"backordering": "Error backordering part {{message}}.",
|
||||||
"creating": "Error encountered when creating parts order. "
|
"creating": "Error encountered when creating parts order. ",
|
||||||
|
"oec": "Error creating EMS files for OEC. {{error}}"
|
||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"act_price": "Price",
|
"act_price": "Price",
|
||||||
@@ -1849,10 +1858,11 @@
|
|||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"allpartsto": "All Parts Location",
|
"allpartsto": "All Parts Location",
|
||||||
"confirmdelete": "Are you sure you want to delete this item? It cannot be recovered. ",
|
"confirmdelete": "Are you sure you want to delete this item? It cannot be recovered. Job line statuses will not be updated and may require manual review. ",
|
||||||
"email": "Send by Email",
|
"email": "Send by Email",
|
||||||
"inthisorder": "Parts in this Order",
|
"inthisorder": "Parts in this Order",
|
||||||
"newpartsorder": "New Parts Order",
|
"newpartsorder": "New Parts Order",
|
||||||
|
"oec": "Order via OEC",
|
||||||
"orderhistory": "Order History",
|
"orderhistory": "Order History",
|
||||||
"parts_orders": "Parts Orders",
|
"parts_orders": "Parts Orders",
|
||||||
"print": "Show Printed Form",
|
"print": "Show Printed Form",
|
||||||
@@ -1968,6 +1978,7 @@
|
|||||||
"zip": "Postal Code/Zip"
|
"zip": "Postal Code/Zip"
|
||||||
},
|
},
|
||||||
"3rdpartypayer": "Invoice to Third Party Payer",
|
"3rdpartypayer": "Invoice to Third Party Payer",
|
||||||
|
"ab_proof_of_loss": "AB - Proof of Loss",
|
||||||
"appointment_confirmation": "Appointment Confirmation",
|
"appointment_confirmation": "Appointment Confirmation",
|
||||||
"appointment_reminder": "Appointment Reminder",
|
"appointment_reminder": "Appointment Reminder",
|
||||||
"casl_authorization": "CASL Authorization",
|
"casl_authorization": "CASL Authorization",
|
||||||
@@ -1985,6 +1996,7 @@
|
|||||||
"fippa_authorization": "FIPPA Authorization",
|
"fippa_authorization": "FIPPA Authorization",
|
||||||
"glass_express_checklist": "Glass Express Checklist",
|
"glass_express_checklist": "Glass Express Checklist",
|
||||||
"guarantee": "Repair Guarantee",
|
"guarantee": "Repair Guarantee",
|
||||||
|
"individual_job_note": "Job Note RO # {{ro_number}}",
|
||||||
"invoice_customer_payable": "Invoice (Customer Payable)",
|
"invoice_customer_payable": "Invoice (Customer Payable)",
|
||||||
"invoice_total_payable": "Invoice (Total Payable)",
|
"invoice_total_payable": "Invoice (Total Payable)",
|
||||||
"iou_form": "IOU Form",
|
"iou_form": "IOU Form",
|
||||||
@@ -2023,7 +2035,8 @@
|
|||||||
"worksheet_by_line_number": "Worksheet by Line Number",
|
"worksheet_by_line_number": "Worksheet by Line Number",
|
||||||
"worksheet_sorted_by_operation": "Worksheet by Operation",
|
"worksheet_sorted_by_operation": "Worksheet by Operation",
|
||||||
"worksheet_sorted_by_operation_no_hours": "Worksheet by Operation (No Hours)",
|
"worksheet_sorted_by_operation_no_hours": "Worksheet by Operation (No Hours)",
|
||||||
"worksheet_sorted_by_operation_part_type": "Worksheet by Operation & Part Type"
|
"worksheet_sorted_by_operation_part_type": "Worksheet by Operation & Part Type",
|
||||||
|
"worksheet_sorted_by_operation_type": "Worksheet by Operation Type"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"groups": {
|
"groups": {
|
||||||
@@ -2068,20 +2081,31 @@
|
|||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"boardupdate": "Error encountered updating job. {{message}}",
|
"boardupdate": "Error encountered updating job. {{message}}",
|
||||||
"removing": "Error removing from production board. {{error}}"
|
"removing": "Error removing from production board. {{error}}",
|
||||||
|
"settings": "Error saving board settings: {{error}}"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"alert": "Alert",
|
"alert": "Alert",
|
||||||
"alertoff": "Remove alert from job",
|
"alertoff": "Remove alert from job",
|
||||||
"alerton": "Add alert to job",
|
"alerton": "Add alert to job",
|
||||||
|
"ats": "Alternative Transportation",
|
||||||
"bodyhours": "B",
|
"bodyhours": "B",
|
||||||
"bodypriority": "B/P",
|
"bodypriority": "B/P",
|
||||||
|
"cardsettings": "Card Settings",
|
||||||
|
"clm_no": "Claim Number",
|
||||||
|
"compact": "Compact Cards",
|
||||||
"detailpriority": "D/P",
|
"detailpriority": "D/P",
|
||||||
|
"employeeassignments": "Employee Assignments",
|
||||||
"employeesearch": "Employee Search",
|
"employeesearch": "Employee Search",
|
||||||
|
"ins_co_nm": "Insurance Company Name",
|
||||||
"jobdetail": "Job Details",
|
"jobdetail": "Job Details",
|
||||||
|
"laborhrs": "Labor Hours",
|
||||||
"note": "Production Note",
|
"note": "Production Note",
|
||||||
|
"ownr_nm": "Owner Name",
|
||||||
"paintpriority": "P/P",
|
"paintpriority": "P/P",
|
||||||
|
"production_note": "Production Note",
|
||||||
"refinishhours": "R",
|
"refinishhours": "R",
|
||||||
|
"scheduled_completion": "Scheduled Completion",
|
||||||
"selectview": "Select a View",
|
"selectview": "Select a View",
|
||||||
"sublets": "Sublets",
|
"sublets": "Sublets",
|
||||||
"totalhours": "Total Hrs ",
|
"totalhours": "Total Hrs ",
|
||||||
@@ -2176,6 +2200,7 @@
|
|||||||
"open_orders_csr": "Open Orders by CSR",
|
"open_orders_csr": "Open Orders by CSR",
|
||||||
"open_orders_estimator": "Open Orders by Estimator",
|
"open_orders_estimator": "Open Orders by Estimator",
|
||||||
"open_orders_ins_co": "Open Orders by Insurance Company",
|
"open_orders_ins_co": "Open Orders by Insurance Company",
|
||||||
|
"open_orders_status": "Open Orders by Status",
|
||||||
"parts_backorder": "Backordered Parts",
|
"parts_backorder": "Backordered Parts",
|
||||||
"parts_not_recieved": "Parts Not Received",
|
"parts_not_recieved": "Parts Not Received",
|
||||||
"payments_by_date": "Payments by Date",
|
"payments_by_date": "Payments by Date",
|
||||||
|
|||||||
@@ -271,6 +271,7 @@
|
|||||||
"md_ccc_rates": "",
|
"md_ccc_rates": "",
|
||||||
"md_classes": "",
|
"md_classes": "",
|
||||||
"md_ded_notes": "",
|
"md_ded_notes": "",
|
||||||
|
"md_email_cc": "",
|
||||||
"md_hour_split": {
|
"md_hour_split": {
|
||||||
"paint": "",
|
"paint": "",
|
||||||
"prep": ""
|
"prep": ""
|
||||||
@@ -503,6 +504,7 @@
|
|||||||
"emaillater": "",
|
"emaillater": "",
|
||||||
"employees": "",
|
"employees": "",
|
||||||
"estimators": "",
|
"estimators": "",
|
||||||
|
"filehandlers": "",
|
||||||
"insurancecos": "",
|
"insurancecos": "",
|
||||||
"intakechecklist": "",
|
"intakechecklist": "",
|
||||||
"jobstatuses": "",
|
"jobstatuses": "",
|
||||||
@@ -535,6 +537,7 @@
|
|||||||
"save": ""
|
"save": ""
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
"centermustexist": "",
|
||||||
"larsplit": "",
|
"larsplit": "",
|
||||||
"useremailmustexist": ""
|
"useremailmustexist": ""
|
||||||
}
|
}
|
||||||
@@ -1091,6 +1094,7 @@
|
|||||||
"addtoscoreboard": "",
|
"addtoscoreboard": "",
|
||||||
"allocate": "",
|
"allocate": "",
|
||||||
"autoallocate": "",
|
"autoallocate": "",
|
||||||
|
"changefilehandler": "",
|
||||||
"changelaborrate": "",
|
"changelaborrate": "",
|
||||||
"changestatus": "Cambiar Estado",
|
"changestatus": "Cambiar Estado",
|
||||||
"changestimator": "",
|
"changestimator": "",
|
||||||
@@ -1205,6 +1209,7 @@
|
|||||||
"date_exported": "Exportado",
|
"date_exported": "Exportado",
|
||||||
"date_invoiced": "Facturado",
|
"date_invoiced": "Facturado",
|
||||||
"date_last_contacted": "",
|
"date_last_contacted": "",
|
||||||
|
"date_next_contact": "",
|
||||||
"date_open": "Abierto",
|
"date_open": "Abierto",
|
||||||
"date_scheduled": "Programado",
|
"date_scheduled": "Programado",
|
||||||
"ded_amt": "Deducible",
|
"ded_amt": "Deducible",
|
||||||
@@ -1725,7 +1730,8 @@
|
|||||||
"new": ""
|
"new": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"invalidphone": ""
|
"invalidphone": "",
|
||||||
|
"noattachedjobs": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"archive": "",
|
"archive": "",
|
||||||
@@ -1735,6 +1741,7 @@
|
|||||||
"nojobs": "",
|
"nojobs": "",
|
||||||
"phonenumber": "",
|
"phonenumber": "",
|
||||||
"presets": "",
|
"presets": "",
|
||||||
|
"recentonly": "",
|
||||||
"selectmedia": "",
|
"selectmedia": "",
|
||||||
"sentby": "",
|
"sentby": "",
|
||||||
"typeamessage": "Enviar un mensaje...",
|
"typeamessage": "Enviar un mensaje...",
|
||||||
@@ -1824,8 +1831,10 @@
|
|||||||
"receivebill": ""
|
"receivebill": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
|
"associatedbills": "",
|
||||||
"backordering": "",
|
"backordering": "",
|
||||||
"creating": "Se encontró un error al crear el pedido de piezas."
|
"creating": "Se encontró un error al crear el pedido de piezas.",
|
||||||
|
"oec": ""
|
||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"act_price": "",
|
"act_price": "",
|
||||||
@@ -1853,6 +1862,7 @@
|
|||||||
"email": "Enviar por correo electrónico",
|
"email": "Enviar por correo electrónico",
|
||||||
"inthisorder": "Partes en este pedido",
|
"inthisorder": "Partes en este pedido",
|
||||||
"newpartsorder": "",
|
"newpartsorder": "",
|
||||||
|
"oec": "",
|
||||||
"orderhistory": "Historial de pedidos",
|
"orderhistory": "Historial de pedidos",
|
||||||
"parts_orders": "",
|
"parts_orders": "",
|
||||||
"print": "Mostrar formulario impreso",
|
"print": "Mostrar formulario impreso",
|
||||||
@@ -1968,6 +1978,7 @@
|
|||||||
"zip": ""
|
"zip": ""
|
||||||
},
|
},
|
||||||
"3rdpartypayer": "",
|
"3rdpartypayer": "",
|
||||||
|
"ab_proof_of_loss": "",
|
||||||
"appointment_confirmation": "",
|
"appointment_confirmation": "",
|
||||||
"appointment_reminder": "",
|
"appointment_reminder": "",
|
||||||
"casl_authorization": "",
|
"casl_authorization": "",
|
||||||
@@ -1985,6 +1996,7 @@
|
|||||||
"fippa_authorization": "",
|
"fippa_authorization": "",
|
||||||
"glass_express_checklist": "",
|
"glass_express_checklist": "",
|
||||||
"guarantee": "",
|
"guarantee": "",
|
||||||
|
"individual_job_note": "",
|
||||||
"invoice_customer_payable": "",
|
"invoice_customer_payable": "",
|
||||||
"invoice_total_payable": "",
|
"invoice_total_payable": "",
|
||||||
"iou_form": "",
|
"iou_form": "",
|
||||||
@@ -2023,7 +2035,8 @@
|
|||||||
"worksheet_by_line_number": "",
|
"worksheet_by_line_number": "",
|
||||||
"worksheet_sorted_by_operation": "",
|
"worksheet_sorted_by_operation": "",
|
||||||
"worksheet_sorted_by_operation_no_hours": "",
|
"worksheet_sorted_by_operation_no_hours": "",
|
||||||
"worksheet_sorted_by_operation_part_type": ""
|
"worksheet_sorted_by_operation_part_type": "",
|
||||||
|
"worksheet_sorted_by_operation_type": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"groups": {
|
"groups": {
|
||||||
@@ -2068,20 +2081,31 @@
|
|||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"boardupdate": "",
|
"boardupdate": "",
|
||||||
"removing": ""
|
"removing": "",
|
||||||
|
"settings": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"alert": "",
|
"alert": "",
|
||||||
"alertoff": "",
|
"alertoff": "",
|
||||||
"alerton": "",
|
"alerton": "",
|
||||||
|
"ats": "",
|
||||||
"bodyhours": "",
|
"bodyhours": "",
|
||||||
"bodypriority": "",
|
"bodypriority": "",
|
||||||
|
"cardsettings": "",
|
||||||
|
"clm_no": "",
|
||||||
|
"compact": "",
|
||||||
"detailpriority": "",
|
"detailpriority": "",
|
||||||
|
"employeeassignments": "",
|
||||||
"employeesearch": "",
|
"employeesearch": "",
|
||||||
|
"ins_co_nm": "",
|
||||||
"jobdetail": "",
|
"jobdetail": "",
|
||||||
|
"laborhrs": "",
|
||||||
"note": "",
|
"note": "",
|
||||||
|
"ownr_nm": "",
|
||||||
"paintpriority": "",
|
"paintpriority": "",
|
||||||
|
"production_note": "",
|
||||||
"refinishhours": "",
|
"refinishhours": "",
|
||||||
|
"scheduled_completion": "",
|
||||||
"selectview": "",
|
"selectview": "",
|
||||||
"sublets": "",
|
"sublets": "",
|
||||||
"totalhours": "",
|
"totalhours": "",
|
||||||
@@ -2176,6 +2200,7 @@
|
|||||||
"open_orders_csr": "",
|
"open_orders_csr": "",
|
||||||
"open_orders_estimator": "",
|
"open_orders_estimator": "",
|
||||||
"open_orders_ins_co": "",
|
"open_orders_ins_co": "",
|
||||||
|
"open_orders_status": "",
|
||||||
"parts_backorder": "",
|
"parts_backorder": "",
|
||||||
"parts_not_recieved": "",
|
"parts_not_recieved": "",
|
||||||
"payments_by_date": "",
|
"payments_by_date": "",
|
||||||
|
|||||||
@@ -271,6 +271,7 @@
|
|||||||
"md_ccc_rates": "",
|
"md_ccc_rates": "",
|
||||||
"md_classes": "",
|
"md_classes": "",
|
||||||
"md_ded_notes": "",
|
"md_ded_notes": "",
|
||||||
|
"md_email_cc": "",
|
||||||
"md_hour_split": {
|
"md_hour_split": {
|
||||||
"paint": "",
|
"paint": "",
|
||||||
"prep": ""
|
"prep": ""
|
||||||
@@ -503,6 +504,7 @@
|
|||||||
"emaillater": "",
|
"emaillater": "",
|
||||||
"employees": "",
|
"employees": "",
|
||||||
"estimators": "",
|
"estimators": "",
|
||||||
|
"filehandlers": "",
|
||||||
"insurancecos": "",
|
"insurancecos": "",
|
||||||
"intakechecklist": "",
|
"intakechecklist": "",
|
||||||
"jobstatuses": "",
|
"jobstatuses": "",
|
||||||
@@ -535,6 +537,7 @@
|
|||||||
"save": ""
|
"save": ""
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
|
"centermustexist": "",
|
||||||
"larsplit": "",
|
"larsplit": "",
|
||||||
"useremailmustexist": ""
|
"useremailmustexist": ""
|
||||||
}
|
}
|
||||||
@@ -1091,6 +1094,7 @@
|
|||||||
"addtoscoreboard": "",
|
"addtoscoreboard": "",
|
||||||
"allocate": "",
|
"allocate": "",
|
||||||
"autoallocate": "",
|
"autoallocate": "",
|
||||||
|
"changefilehandler": "",
|
||||||
"changelaborrate": "",
|
"changelaborrate": "",
|
||||||
"changestatus": "Changer le statut",
|
"changestatus": "Changer le statut",
|
||||||
"changestimator": "",
|
"changestimator": "",
|
||||||
@@ -1205,6 +1209,7 @@
|
|||||||
"date_exported": "Exportés",
|
"date_exported": "Exportés",
|
||||||
"date_invoiced": "Facturé",
|
"date_invoiced": "Facturé",
|
||||||
"date_last_contacted": "",
|
"date_last_contacted": "",
|
||||||
|
"date_next_contact": "",
|
||||||
"date_open": "Ouvrir",
|
"date_open": "Ouvrir",
|
||||||
"date_scheduled": "Prévu",
|
"date_scheduled": "Prévu",
|
||||||
"ded_amt": "Déductible",
|
"ded_amt": "Déductible",
|
||||||
@@ -1725,7 +1730,8 @@
|
|||||||
"new": ""
|
"new": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"invalidphone": ""
|
"invalidphone": "",
|
||||||
|
"noattachedjobs": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"archive": "",
|
"archive": "",
|
||||||
@@ -1735,6 +1741,7 @@
|
|||||||
"nojobs": "",
|
"nojobs": "",
|
||||||
"phonenumber": "",
|
"phonenumber": "",
|
||||||
"presets": "",
|
"presets": "",
|
||||||
|
"recentonly": "",
|
||||||
"selectmedia": "",
|
"selectmedia": "",
|
||||||
"sentby": "",
|
"sentby": "",
|
||||||
"typeamessage": "Envoyer un message...",
|
"typeamessage": "Envoyer un message...",
|
||||||
@@ -1824,8 +1831,10 @@
|
|||||||
"receivebill": ""
|
"receivebill": ""
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
|
"associatedbills": "",
|
||||||
"backordering": "",
|
"backordering": "",
|
||||||
"creating": "Erreur rencontrée lors de la création de la commande de pièces."
|
"creating": "Erreur rencontrée lors de la création de la commande de pièces.",
|
||||||
|
"oec": ""
|
||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"act_price": "",
|
"act_price": "",
|
||||||
@@ -1853,6 +1862,7 @@
|
|||||||
"email": "Envoyé par email",
|
"email": "Envoyé par email",
|
||||||
"inthisorder": "Pièces dans cette commande",
|
"inthisorder": "Pièces dans cette commande",
|
||||||
"newpartsorder": "",
|
"newpartsorder": "",
|
||||||
|
"oec": "",
|
||||||
"orderhistory": "Historique des commandes",
|
"orderhistory": "Historique des commandes",
|
||||||
"parts_orders": "",
|
"parts_orders": "",
|
||||||
"print": "Afficher le formulaire imprimé",
|
"print": "Afficher le formulaire imprimé",
|
||||||
@@ -1968,6 +1978,7 @@
|
|||||||
"zip": ""
|
"zip": ""
|
||||||
},
|
},
|
||||||
"3rdpartypayer": "",
|
"3rdpartypayer": "",
|
||||||
|
"ab_proof_of_loss": "",
|
||||||
"appointment_confirmation": "",
|
"appointment_confirmation": "",
|
||||||
"appointment_reminder": "",
|
"appointment_reminder": "",
|
||||||
"casl_authorization": "",
|
"casl_authorization": "",
|
||||||
@@ -1985,6 +1996,7 @@
|
|||||||
"fippa_authorization": "",
|
"fippa_authorization": "",
|
||||||
"glass_express_checklist": "",
|
"glass_express_checklist": "",
|
||||||
"guarantee": "",
|
"guarantee": "",
|
||||||
|
"individual_job_note": "",
|
||||||
"invoice_customer_payable": "",
|
"invoice_customer_payable": "",
|
||||||
"invoice_total_payable": "",
|
"invoice_total_payable": "",
|
||||||
"iou_form": "",
|
"iou_form": "",
|
||||||
@@ -2023,7 +2035,8 @@
|
|||||||
"worksheet_by_line_number": "",
|
"worksheet_by_line_number": "",
|
||||||
"worksheet_sorted_by_operation": "",
|
"worksheet_sorted_by_operation": "",
|
||||||
"worksheet_sorted_by_operation_no_hours": "",
|
"worksheet_sorted_by_operation_no_hours": "",
|
||||||
"worksheet_sorted_by_operation_part_type": ""
|
"worksheet_sorted_by_operation_part_type": "",
|
||||||
|
"worksheet_sorted_by_operation_type": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"groups": {
|
"groups": {
|
||||||
@@ -2068,20 +2081,31 @@
|
|||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"boardupdate": "",
|
"boardupdate": "",
|
||||||
"removing": ""
|
"removing": "",
|
||||||
|
"settings": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"alert": "",
|
"alert": "",
|
||||||
"alertoff": "",
|
"alertoff": "",
|
||||||
"alerton": "",
|
"alerton": "",
|
||||||
|
"ats": "",
|
||||||
"bodyhours": "",
|
"bodyhours": "",
|
||||||
"bodypriority": "",
|
"bodypriority": "",
|
||||||
|
"cardsettings": "",
|
||||||
|
"clm_no": "",
|
||||||
|
"compact": "",
|
||||||
"detailpriority": "",
|
"detailpriority": "",
|
||||||
|
"employeeassignments": "",
|
||||||
"employeesearch": "",
|
"employeesearch": "",
|
||||||
|
"ins_co_nm": "",
|
||||||
"jobdetail": "",
|
"jobdetail": "",
|
||||||
|
"laborhrs": "",
|
||||||
"note": "",
|
"note": "",
|
||||||
|
"ownr_nm": "",
|
||||||
"paintpriority": "",
|
"paintpriority": "",
|
||||||
|
"production_note": "",
|
||||||
"refinishhours": "",
|
"refinishhours": "",
|
||||||
|
"scheduled_completion": "",
|
||||||
"selectview": "",
|
"selectview": "",
|
||||||
"sublets": "",
|
"sublets": "",
|
||||||
"totalhours": "",
|
"totalhours": "",
|
||||||
@@ -2176,6 +2200,7 @@
|
|||||||
"open_orders_csr": "",
|
"open_orders_csr": "",
|
||||||
"open_orders_estimator": "",
|
"open_orders_estimator": "",
|
||||||
"open_orders_ins_co": "",
|
"open_orders_ins_co": "",
|
||||||
|
"open_orders_status": "",
|
||||||
"parts_backorder": "",
|
"parts_backorder": "",
|
||||||
"parts_not_recieved": "",
|
"parts_not_recieved": "",
|
||||||
"payments_by_date": "",
|
"payments_by_date": "",
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ export function DateFormatter(props) {
|
|||||||
|
|
||||||
export function DateTimeFormatter(props) {
|
export function DateTimeFormatter(props) {
|
||||||
return props.children
|
return props.children
|
||||||
? moment(props.children).format("MM/DD/YYYY hh:mm a")
|
? moment(props.children).format(
|
||||||
|
props.format ? props.format : "MM/DD/YYYY hh:mm a"
|
||||||
|
)
|
||||||
: null;
|
: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -195,7 +195,6 @@ export const GenerateDocuments = async (templates) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const fetchContextData = async (templateObject) => {
|
const fetchContextData = async (templateObject) => {
|
||||||
console.log("Fetching context data", templateObject);
|
|
||||||
const bodyshop = store.getState().user.bodyshop;
|
const bodyshop = store.getState().user.bodyshop;
|
||||||
|
|
||||||
jsreport.headers["Authorization"] =
|
jsreport.headers["Authorization"] =
|
||||||
|
|||||||
@@ -182,6 +182,18 @@ export const TemplateList = (type, context) => {
|
|||||||
disabled: false,
|
disabled: false,
|
||||||
group: "worksheet",
|
group: "worksheet",
|
||||||
},
|
},
|
||||||
|
worksheet_sorted_by_operation_type: {
|
||||||
|
title: i18n.t(
|
||||||
|
"printcenter.jobs.worksheet_sorted_by_operation_type"
|
||||||
|
),
|
||||||
|
description: "All Jobs Notes",
|
||||||
|
subject: i18n.t(
|
||||||
|
"printcenter.jobs.worksheet_sorted_by_operation_type"
|
||||||
|
),
|
||||||
|
key: "worksheet_sorted_by_operation_type",
|
||||||
|
disabled: false,
|
||||||
|
group: "worksheet",
|
||||||
|
},
|
||||||
worksheet_sorted_by_operation: {
|
worksheet_sorted_by_operation: {
|
||||||
title: i18n.t("printcenter.jobs.worksheet_sorted_by_operation"),
|
title: i18n.t("printcenter.jobs.worksheet_sorted_by_operation"),
|
||||||
description: "All Jobs Notes",
|
description: "All Jobs Notes",
|
||||||
@@ -407,6 +419,17 @@ export const TemplateList = (type, context) => {
|
|||||||
CA_MB: true,
|
CA_MB: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
ab_proof_of_loss: {
|
||||||
|
title: i18n.t("printcenter.jobs.ab_proof_of_loss"),
|
||||||
|
description: "Thank You Letter by RO",
|
||||||
|
key: "ab_proof_of_loss",
|
||||||
|
subject: i18n.t("printcenter.jobs.ab_proof_of_loss"),
|
||||||
|
disabled: false,
|
||||||
|
group: "pre",
|
||||||
|
regions: {
|
||||||
|
CA_AB: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
// parts_label_multi: {
|
// parts_label_multi: {
|
||||||
// title: i18n.t("printcenter.jobs.parts_label_multi"),
|
// title: i18n.t("printcenter.jobs.parts_label_multi"),
|
||||||
// description: "Thank You Letter by RO",
|
// description: "Thank You Letter by RO",
|
||||||
@@ -440,6 +463,15 @@ export const TemplateList = (type, context) => {
|
|||||||
subject: i18n.t("printcenter.jobs.csi_invitation_action"),
|
subject: i18n.t("printcenter.jobs.csi_invitation_action"),
|
||||||
disabled: false,
|
disabled: false,
|
||||||
},
|
},
|
||||||
|
individual_job_note: {
|
||||||
|
title: i18n.t("printcenter.jobs.individual_job_note"),
|
||||||
|
description: "CSI invite",
|
||||||
|
key: "individual_job_note",
|
||||||
|
subject: i18n.t("printcenter.jobs.individual_job_note", {
|
||||||
|
ro_number: (context && context.ro_number) || "",
|
||||||
|
}),
|
||||||
|
disabled: false,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
: {}),
|
: {}),
|
||||||
...(!type || type === "appointment"
|
...(!type || type === "appointment"
|
||||||
@@ -1181,6 +1213,19 @@ export const TemplateList = (type, context) => {
|
|||||||
},
|
},
|
||||||
group: "jobs",
|
group: "jobs",
|
||||||
},
|
},
|
||||||
|
open_orders_status: {
|
||||||
|
title: i18n.t("reportcenter.templates.open_orders_status"),
|
||||||
|
description: "",
|
||||||
|
subject: i18n.t("reportcenter.templates.open_orders_status"),
|
||||||
|
key: "open_orders_status",
|
||||||
|
//idtype: "vendor",
|
||||||
|
disabled: false,
|
||||||
|
rangeFilter: {
|
||||||
|
object: i18n.t("reportcenter.labels.objects.jobs"),
|
||||||
|
field: i18n.t("jobs.fields.date_open"),
|
||||||
|
},
|
||||||
|
group: "jobs",
|
||||||
|
},
|
||||||
open_orders_csr: {
|
open_orders_csr: {
|
||||||
title: i18n.t("reportcenter.templates.open_orders_csr"),
|
title: i18n.t("reportcenter.templates.open_orders_csr"),
|
||||||
description: "",
|
description: "",
|
||||||
|
|||||||
2144
client/yarn.lock
2144
client/yarn.lock
File diff suppressed because it is too large
Load Diff
@@ -203,6 +203,7 @@
|
|||||||
- authlevel
|
- authlevel
|
||||||
- default_prod_list_view
|
- default_prod_list_view
|
||||||
- id
|
- id
|
||||||
|
- kanban_settings
|
||||||
- qbo_realmId
|
- qbo_realmId
|
||||||
- shopid
|
- shopid
|
||||||
- useremail
|
- useremail
|
||||||
@@ -217,6 +218,7 @@
|
|||||||
- active
|
- active
|
||||||
- authlevel
|
- authlevel
|
||||||
- default_prod_list_view
|
- default_prod_list_view
|
||||||
|
- kanban_settings
|
||||||
- qbo_realmId
|
- qbo_realmId
|
||||||
filter:
|
filter:
|
||||||
bodyshop:
|
bodyshop:
|
||||||
@@ -827,7 +829,9 @@
|
|||||||
- md_ccc_rates
|
- md_ccc_rates
|
||||||
- md_classes
|
- md_classes
|
||||||
- md_ded_notes
|
- md_ded_notes
|
||||||
|
- md_email_cc
|
||||||
- md_estimators
|
- md_estimators
|
||||||
|
- md_filehandlers
|
||||||
- md_hour_split
|
- md_hour_split
|
||||||
- md_ins_cos
|
- md_ins_cos
|
||||||
- md_jobline_presets
|
- md_jobline_presets
|
||||||
@@ -905,7 +909,9 @@
|
|||||||
- md_ccc_rates
|
- md_ccc_rates
|
||||||
- md_classes
|
- md_classes
|
||||||
- md_ded_notes
|
- md_ded_notes
|
||||||
|
- md_email_cc
|
||||||
- md_estimators
|
- md_estimators
|
||||||
|
- md_filehandlers
|
||||||
- md_hour_split
|
- md_hour_split
|
||||||
- md_ins_cos
|
- md_ins_cos
|
||||||
- md_jobline_presets
|
- md_jobline_presets
|
||||||
@@ -2154,6 +2160,7 @@
|
|||||||
- sublet_completed
|
- sublet_completed
|
||||||
- sublet_ignored
|
- sublet_ignored
|
||||||
- tax_part
|
- tax_part
|
||||||
|
- tran_code
|
||||||
- unq_seq
|
- unq_seq
|
||||||
- updated_at
|
- updated_at
|
||||||
select_permissions:
|
select_permissions:
|
||||||
@@ -2215,6 +2222,7 @@
|
|||||||
- sublet_completed
|
- sublet_completed
|
||||||
- sublet_ignored
|
- sublet_ignored
|
||||||
- tax_part
|
- tax_part
|
||||||
|
- tran_code
|
||||||
- unq_seq
|
- unq_seq
|
||||||
- updated_at
|
- updated_at
|
||||||
filter:
|
filter:
|
||||||
@@ -2287,6 +2295,7 @@
|
|||||||
- sublet_completed
|
- sublet_completed
|
||||||
- sublet_ignored
|
- sublet_ignored
|
||||||
- tax_part
|
- tax_part
|
||||||
|
- tran_code
|
||||||
- unq_seq
|
- unq_seq
|
||||||
- updated_at
|
- updated_at
|
||||||
filter:
|
filter:
|
||||||
@@ -2299,7 +2308,16 @@
|
|||||||
_eq: X-Hasura-User-Id
|
_eq: X-Hasura-User-Id
|
||||||
- active:
|
- active:
|
||||||
_eq: true
|
_eq: true
|
||||||
check: null
|
check:
|
||||||
|
job:
|
||||||
|
bodyshop:
|
||||||
|
associations:
|
||||||
|
_and:
|
||||||
|
- user:
|
||||||
|
authid:
|
||||||
|
_eq: X-Hasura-User-Id
|
||||||
|
- active:
|
||||||
|
_eq: true
|
||||||
delete_permissions:
|
delete_permissions:
|
||||||
- role: user
|
- role: user
|
||||||
permission:
|
permission:
|
||||||
@@ -2590,6 +2608,7 @@
|
|||||||
- date_exported
|
- date_exported
|
||||||
- date_invoiced
|
- date_invoiced
|
||||||
- date_last_contacted
|
- date_last_contacted
|
||||||
|
- date_next_contact
|
||||||
- date_open
|
- date_open
|
||||||
- date_scheduled
|
- date_scheduled
|
||||||
- ded_amt
|
- ded_amt
|
||||||
@@ -2841,6 +2860,7 @@
|
|||||||
- date_exported
|
- date_exported
|
||||||
- date_invoiced
|
- date_invoiced
|
||||||
- date_last_contacted
|
- date_last_contacted
|
||||||
|
- date_next_contact
|
||||||
- date_open
|
- date_open
|
||||||
- date_scheduled
|
- date_scheduled
|
||||||
- ded_amt
|
- ded_amt
|
||||||
@@ -3102,6 +3122,7 @@
|
|||||||
- date_exported
|
- date_exported
|
||||||
- date_invoiced
|
- date_invoiced
|
||||||
- date_last_contacted
|
- date_last_contacted
|
||||||
|
- date_next_contact
|
||||||
- date_open
|
- date_open
|
||||||
- date_scheduled
|
- date_scheduled
|
||||||
- ded_amt
|
- ded_amt
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
-- Could not auto-generate a down migration.
|
||||||
|
-- Please write an appropriate down migration for the SQL below:
|
||||||
|
-- alter table "public"."bodyshops" add column "md_filehandlers" jsonb
|
||||||
|
-- null default jsonb_build_array();
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
alter table "public"."bodyshops" add column "md_filehandlers" jsonb
|
||||||
|
null default jsonb_build_array();
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user