diff --git a/config/csv_import/EXTRACTIONS/T3LP20RR SN 030022040361 09 10 2024.csv b/config/csv_import/EXTRACTIONS/T3LP20RR SN 030022040361 09 10 2024.csv
new file mode 100644
index 0000000..892c91f
--- /dev/null
+++ b/config/csv_import/EXTRACTIONS/T3LP20RR SN 030022040361 09 10 2024.csv
@@ -0,0 +1,308 @@
+codice_ricetta,part_number,tempo_pre_riempimento,pressione_pre_riempimento,tempo_riempimento,tempo_assestamento,percentuale_minima_pressione_assestamento,percentuale_massima_pressione_assestamento,tempo_di_test,pressione_di_test_delta_minimo,pressione_di_test,pressione_di_test_delta_massimo,tempo_svuotamento,pressione_svuotamento,template_di_stampa,campo1,campo2
+TEST FUGA 7 BAR,B1619X,0.0,0,5.0,10.0,10,10,5.0,12.0,0,8.0,0.0,0,,DA 14.4 A 21.6 ,
+5803217628 REV.,UNIT GASOIL PIPE,0.0,0,5.0,10.0,10,10,20.0,20.0,0,0.0,0.0,0,,UNITE GASOIL PI,IVECO
+5802915822,COMPL.MAN,0.0,0,5.0,15.0,15,15,10.0,20.0,0,10.0,1.0,100,,5802915822 R.02,5802915822 R.02
+PY83-6B747-BA,ENGINE OIL ASSY,0.0,0,5.0,15.0,10,10,30.0,20.0,0,10.0,0.1,1,"
+",PY83-6B747-BA,ASTON MARTIN
+PY83-6B748-BA,ENGINE OIL ASSY,0.0,0,5.0,15.0,10,10,30.0,20.0,0,10.0,0.1,1,"
+",PY83-6B748-BA,ASTON MARTIN
+MY83-6B747-BA,ENGINE OIL ASSY,0.0,0,30.0,20.0,10,10,30.0,20.0,0,10.0,0.1,1,"
+",MY83-6B747-BA,ASTON MARTIN
+MY83-6B748-BA,ENGINE OIL ASSY,0.0,0,5.0,15.0,10,10,30.0,20.0,0,10.0,0.1,1,"
+",MY83-6B748-BA,ASTON MARTIN
+MY83-6L701-AB, ENGINE OIL ASSY,0.0,0,10.0,10.0,10,10,30.0,20.0,0,10.0,0.1,1,,MY83-6L701-AB,ASTON MARTIN
+MY83-6L694-AB,ENGINE OIL ASSY,0.0,0,10.0,10.0,10,10,30.0,25.0,0,10.0,0.1,1,"
+",MY83-6L694-AB,ASTON MARTIN
+000746453,000746453,0.0,0,10.0,20.0,10,10,20.0,25.0,0,5.0,0.1,0, ,000746453 REV05,FERRARI
+5802889710 REV3,FUEL HOSE,0.0,0,20.0,25.0,10,10,20.0,20.0,0,0.0,0.1,0,,FUEL HOSE,IVECO
+5802953113 REV.,FUEL HOSE,0.0,0,5.0,25.0,10,10,20.0,20.0,0,0.0,0.0,0,,FUEL HOSE,IVECO
+5802980014 REV.,UNIT GASOIL PIPE,0.0,0,15.0,10.0,10,10,20.0,20.0,0,0.0,0.0,0,,UNITE GASOIL PI,IVECO
+5802981174 REV.,UNIT GASOIL PIPE,0.0,0,5.0,20.0,10,10,60.0,20.0,0,0.0,0.0,0,,UNIT GASOIL PIP,IVECO
+5802889709 REV3,FUEL HOSE,0.0,0,25.0,30.0,10,10,20.0,20.0,0,0.0,0.0,0,,FUEL HOSE,IVECO
+12970-13-2382,TUBE-ASSY-CLUTCH,0.0,0,10.0,5.0,10,10,20.0,30.0,0,5.0,0.0,0,,12970-13-2382,MULTIMATIC
+12970-13-2384,TUBE-ASSY-CLUTCH,0.0,0,10.0,5.0,10,10,20.0,20.0,0,5.0,0.0,0,,12970-13-2384,MULTIMATIC
+12970-13-2386,TUBEASSY-CLUTCH,0.0,0,10.0,5.0,10,10,20.0,20.0,0,5.0,0.0,0,,12970-13-2386,MULTIMATIC
+5801384838,full hose,0.0,0,10.0,5.0,10,10,20.0,20.0,0,5.0,0.0,0,,5801384838,lancia bz
+16L0043CP REV02,,0.0,0,5.0,10.0,10,10,30.0,20.0,0,0.0,0.0,0,,PIPE-OUTLET-PRE,P16
+16LA027SP REV02,,0.0,0,15.0,15.0,10,10,30.0,30.0,0,0.0,0.0,0,,HOSE-LH WCAC AN,P16
+16LA648CP REV01,,0.0,0,5.0,10.0,10,10,30.0,20.0,0,0.0,0.0,0,,HOSE-RH-LTR-OUT,P16
+ 16LA661CP REV1,HOSE-RH-HT-RADIATOR-BOT,0.0,0,20.0,20.0,20,20,30.0,20.0,0,5.0,1.0,1,,HOSE-RH-HT-RADI,P16
+ 16LA449CP REV2,,0.0,0,5.0,10.0,10,10,30.0,30.0,0,0.0,0.0,0,,HOSE-ENGINE-TO-,P16
+ 16L0045CP REV2,,0.0,0,10.0,10.0,10,10,30.0,20.0,0,10.0,0.0,0,,HOSE-HT-RADIATO,P16
+16LA718CP REV02,MCLAREN,0.0,0,10.0,10.0,10,10,30.0,20.0,0,10.0,0.0,0,,HOSE-E-MOTOR-OU,P16
+ 16L0075CP REV3,,0.0,0,5.0,10.0,10,10,20.0,30.0,0,0.0,0.0,0,,HOSE-HEADER-TAN,P16
+5803112815 R.1,COMPL.MAN,0.0,0,5.0,5.0,15,15,10.0,30.0,0,5.0,1.0,1000,,5803112815 R1,
+5803112816 R.1,COMPL.MAN,0.0,0,5.0,5.0,15,15,10.0,20.0,0,10.0,1.0,100,, 5803112816 R.1,
+16LA397CP REV02,,0.0,0,5.0,5.0,10,10,20.0,20.0,0,5.0,0.0,0,,HOSE-HT-RADIATO,P16
+16LA765CP REV01,,0.0,0,5.0,5.0,10,10,30.0,20.0,0,0.0,0.0,0,,HOSE-WCACS LINK,P16
+16LA695CP REV02,,0.0,0,15.0,15.0,10,10,30.0,20.0,0,0.0,0.0,0,,HOSE PRE COOLER,P16
+5801384840 REV0,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,0,5.0,0.0,0,,5801384840 REV0,LANCIA BOLZANO
+60175799 REV0,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,0,5.0,0.0,0,,60175799 REV0,LANCIA BOLZANO
+5803103147 REV0,UNIT GASOIL PIPE FILTER,0.0,0,25.0,30.0,10,10,20.0,20.0,0,0.0,0.0,0,,UNIT GASOIL PIL,IVECO
+5803103150 REV0,UNIT GASOIL PIPE FILTER,0.0,0,20.0,30.0,10,10,20.0,20.0,0,10.0,0.0,0,,UNIT GASOIL PIL,IVECO
+5801970063 REV0,,0.0,0,5.0,10.0,10,10,30.0,30.0,0,10.0,0.0,0,,5801970063,"LANCIA,BOLZANO"
+5801616061,,0.0,0,5.0,10.0,10,10,30.0,30.0,0,10.0,0.0,0,"
+",5801616061,"LANCIA,BOLZANO"
+ 16LA584CP REV1,,0.0,0,5.0,10.0,10,10,30.0,20.0,0,0.0,0.0,0,,HOSE-TRANS HX-R,P16
+5801384842 REV0,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,0,5.0,0.0,0,,5801384842 REV0,LANCIA BOLZANO
+5801970066 REV0,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,0,5.0,0.0,0,,5801970066,LANCIA BOLZANO
+16LA372CP REV01,MCLAREN,0.0,0,5.0,10.0,10,10,30.0,20.0,0,10.0,0.0,0,,PIPE-IN-PRE-COO,P16
+16LA518CP REV02,P16,0.0,0,5.0,10.0,10,10,20.0,20.0,0,10.0,0.0,0,,HOSE-TO-E-MOTOR,P16
+16LA680CP REV01,,0.0,0,20.0,10.0,10,10,30.0,20.0,0,0.0,0.0,0,,HOSE-TRANS- HX-,P16
+16FB157CP REV 3,MCLAREN,0.0,0,15.0,5.0,10,10,30.0,50.0,0,2.0,0.0,0,,ASSY CCV-OIL TA,P16
+16FC256CP REV01,ASSY CCV,0.0,17000,15.0,10.0,20,20,20.0,50.0,0,2.0,0.0,0,,ASSY MAKE UP AI,P16
+16L0151CP REV03,,0.0,0,20.0,25.0,10,10,30.0,20.0,0,5.0,0.0,0,,HOSE-IPU-OUTLET,P16
+16L0170CP REV03,,0.0,0,5.0,10.0,10,10,30.0,25.0,0,5.0,0.0,0,,HOSE-IPU-OUTLET,P16
+16L0161CP REV04,,0.0,0,15.0,15.0,10,10,30.0,20.0,0,5.0,0.0,0,,HOSE-WCACS-TO-M,P16
+16L0167CP REV02,,0.0,0,10.0,20.0,10,10,30.0,20.0,0,5.0,0.0,0,,HOSE-TO-MCU,16L0167CP REV02
+504321531,,0.0,0,5.0,10.0,10,10,30.0,30.0,0,10.0,0.0,0,"
+",504321531,"LANCIA,BOLZANO"
+16L0180CP REV04,,0.0,0,15.0,10.0,10,10,30.0,20.0,0,0.0,1.0,0,,HOSE-LH-LTR-OUT,P16
+16L0154CP REV03,,0.0,0,15.0,25.0,10,10,30.0,20.0,0,5.0,1.0,0,,HOSE-RH-LTR-OUT,P16
+5801970064 REV0,,0.0,0,5.0,10.0,10,10,30.0,30.0,0,10.0,0.0,0,,5801970064 REV0,"LANCIA,BOLZANO"
+16FC446CP REV01,ASSY CCV,0.0,17000,5.0,5.0,20,20,20.0,50.0,0,2.0,0.0,0,,FED,T16C-Z0800-001
+ 16LA397CP REV2,,0.0,0,5.0,5.0,10,10,30.0,20.0,0,0.0,0.0,0,,HOSE-HT-RADIATO,P16
+16L0164CP REV02,,0.0,0,10.0,15.0,10,10,30.0,20.0,0,0.0,0.0,0,,HOSE-LH-LTR-OUT,P16
+16LA461CP REV02,,0.0,0,10.0,10.0,10,10,20.0,20.0,0,0.0,0.0,0,,ASSY-HOSE-HT-RT,P16
+16L0177CP REV03,,0.0,0,15.0,10.0,10,10,30.0,20.0,0,0.0,1.0,0,,HOSE-JNCTN TO W,P16
+16L0007CP RE3,,0.0,0,5.0,5.0,10,10,30.0,20.0,0,5.0,0.0,0,,HOSE-IPU-JNCTN-,P16
+16LA586CP REV1,,0.0,0,15.0,15.0,10,10,30.0,20.0,0,0.0,0.0,0,,HOSE PRE COOLER,P16
+16FA849CP REV02,,0.0,17000,5.0,5.0,20,20,20.0,50.0,0,2.0,0.0,0,,ASSY OIL FILL,P16
+16FC084CP REV2,,0.0,0,5.0,5.0,10,10,20.0,50.0,0,0.0,0.0,0,,BALANCE PIPE-IN,P16
+16LA573CP REV01,,0.0,0,5.0,10.0,10,10,30.0,20.0,0,0.0,0.0,0,,HOSE MCU-TO-MOT,P16
+16L0145CP REV3,,0.0,0,5.0,15.0,10,10,30.0,20.0,0,0.0,0.0,0,,HOSE-HOSE-PUMP-,P16
+16FB394CP REV04,,0.0,0,5.0,5.0,10,10,30.0,30.0,0,5.0,0.0,0,,ASSY INLET PURG,P16
+16FC069CP REV1,,0.0,0,10.0,15.0,10,10,20.0,50.0,0,5.0,0.0,0,,ASSY CCV-INTAKE,P16
+60192056 REV1,FUEL HOSE,0.0,0,20.0,10.0,10,10,20.0,20.0,0,5.0,0.0,0,,60192056 REV1,LANCIA BOLZANO
+5801970065 REV0,,0.0,0,20.0,20.0,10,10,30.0,30.0,0,0.0,0.0,0,,5801970065 RE0,"LANCIA,BOLZANO"
+5801384841 REV0,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,0,5.0,0.0,0,,5801384841 REV0,LANCIA BOLZANO
+5801384839 REV0,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,0,5.0,0.0,0,,5801384839 REV0,LANCIA BOLZANO
+5803112815 R.1,COMPL.MAN,0.0,0,5.0,5.0,15,15,10.0,30.0,0,5.0,1.0,1000,,5803112815 R1,
+16JA605CP,,10.0,500,10.0,30.0,10,10,10.0,20.0,0,10.0,0.0,0,,16JA603CP,
+5803112815,,0.0,0,5.0,5.0,5,10,10.0,30.0,0,5.0,0.0,0,,5803112816,
+5801970067 REV1,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,0,5.0,0.0,0,,5801970067 REV0,LANCIA BOLZANO
+000746453,000746453,0.0,0,10.0,20.0,10,10,30.0,30.0,0,10.0,0.0,0,,,
+5801862227 REV0,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,0,5.0,0.0,0,,5801862227 REV0,LANCIA BOLZANO
+5803018239,PIPE,0.0,0,5.0,10.0,10,10,10.0,10.0,0,5.0,0.0,0,,5803018239,PIPE
+5803018238,PIPE,0.0,0,5.0,10.0,10,10,10.0,10.0,0,5.0,0.0,0,,5803018238,PIPE
+5803018244,PIPE,0.0,0,5.0,10.0,10,10,10.0,10.0,0,5.0,0.0,0,,5803018244,PIPE
+5803018243,PIPE,0.0,0,5.0,10.0,10,10,10.0,10.0,0,5.0,0.0,0,,5803018243,PIPE
+16LA668CP REV01,,0.0,0,15.0,15.0,10,10,30.0,30.0,0,0.0,0.0,0,,HOSE-LH WCAC AN,P16
+16LA773CP REV01,,0.0,0,20.0,10.0,10,10,30.0,20.0,0,0.0,0.0,0,,HOSE-TRANS- HX-,P16
+98FA644CP,,10.0,2000,10.0,10.0,20,20,20.0,150.0,0,0.0,0.0,0,,,P98
+ 16LA353CP REV2,HOSE-RH-HT-RADIATOR-TOP,0.0,0,20.0,15.0,20,20,30.0,20.0,0,5.0,2.0,1,,HOSE-RH-HT-RADI,P16
+ 98FB081CP REV1,,0.0,0,10.0,10.0,10,10,20.0,10.0,0,10.0,0.0,0,,ASSY-PIPE-CCV-T,
+98FB342CP,,0.0,0,10.0,10.0,10,10,20.0,10.0,0,0.0,0.0,0,,18FB342CP,
+16L0046CP REV3,HOSE-RH-HT-RADIATOR-BOT,0.0,0,20.0,10.0,10,10,20.0,20.0,0,5.0,1.0,1,,HOSE-LH-HT-RADI,P16
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+NESSUN NOME,,0.0,0,1.0,1.0,10,10,1.0,0.0,0,0.0,0.0,0,,,
+98FB080CP,,0.0,0,10.0,10.0,10,10,20.0,10.0,0,20.0,0.0,0,,98FB080CP,
+98FA186CP,98FA186CP,0.0,0,5.0,10.0,10,10,20.0,15.0,0,15.0,0.0,0,,98FA186CP,
+5802991065,,0.0,0,5.0,5.0,10,10,10.0,30.0,0,5.0,0.0,0,,IVECO,
+TENUTA 20 bar,,0.0,0,5.0,40.0,10,10,10.0,1.0,0,1.0,2.0,0,,,
+FUGA,,0.0,0,5.0,40.0,10,10,5.0,5.0,0,0.0,2.0,0,,,
+112247,j112247,0.0,1000,15.0,15.0,5,5,10.0,30.0,7000,30.0,1.0,100,,112247,
diff --git a/config/csv_import/EXTRACTIONS/T3LP20RR SN030022100512 4 11 2024.csv b/config/csv_import/EXTRACTIONS/T3LP20RR SN030022100512 4 11 2024.csv
new file mode 100644
index 0000000..b0d73ef
--- /dev/null
+++ b/config/csv_import/EXTRACTIONS/T3LP20RR SN030022100512 4 11 2024.csv
@@ -0,0 +1,303 @@
+codice_ricetta,codice_prodotto,tempo_pre_riempimento,pressione_pre_riempimento,tempo_riempimento,tempo_assestamento,percentuale_minima_pressione_assestamento,percentuale_massima_pressione_assestamento,tempo_di_test,pressione_di_test_delta_minimo,pressione_di_test,pressione_di_test_delta_massimo,tempo_svuotamento,pressione_svuotamento,modello_etichetta,testo_etich_1,testo_etich_2
+07N.131.628.A,,10,200,20,20,10,10,10,5,200,5,20,0,ferrari_30x16_203.prn,07N.131.628.A,
+V04.030.057.BE,P18 BATTERY COOLING,0,0,20,20,10,10,20,5,4100,5,1,0,ferrari_30x16_203.prn,V04.030.057.BE,
+000990502,,0,0,10,10,10,10,10,30,1500,20,0,0,ferrari_30x16_203.prn,000990502,
+98FA644CP,,0,0,5,10,10,10,20,15,3000,15,0,0,ferrari_30x16_203.prn,98FA644CP,
+5803158246,CPLGASOLIO LP,5,2000,5,10,10,10,20,30,2000,0,0,0,ferrari_30x16_203.prn,5803158246,C9 CCM FPT
+BLOW BY WOKO,000781499,10,1000,10,10,99,99,10,600,1000,20,0,0,ferrari_30x16_203.prn,000781499,
+SY9Y-2976-B,SY9Y-2976-A,0,5000,10,10,10,10,10,20,3000,15,10,0,ferrari_30x16_203.prn,SY9Y-2976-B,
+SY9Y-2976-A,SY9Y-2976-A,0,0,10,10,10,10,10,20,3000,0,0,0,ferrari_30x16_203.prn,SY9Y-2976-A,
+SY9Y-9S331-B,SY9Y-9S331-B,10,0,10,10,10,10,10,20,3000,15,0,0,ferrari_30x16_203.prn,SY9Y-9S331-B,
+SY9Y-9S331-A,SY9Y-9S331-A,10,0,10,10,10,10,10,20,3000,0,0,0,ferrari_30x16_203.prn,SY9Y-9S331-A,
+18JA708CP,,0,0,5,5,10,10,30,20,3000,20,0,0,ferrari_30x16_203.prn,18JA708CP,
+18JA757CP,,0,0,5,5,10,10,30,20,3000,20,0,0,ferrari_30x16_203.prn,18JA757CP,
+18JA750CP,,0,0,5,5,10,10,30,20,3000,20,0,0,ferrari_30x16_203.prn,18JA750CP,
+18JA712CP,,0,0,5,5,10,10,30,20,3000,20,0,0,ferrari_30x16_203.prn,18JA712CP,
+18JA710CP,,0,0,5,5,10,10,30,20,3000,20,0,0,ferrari_30x16_203.prn,18JA710CP,
+18JA718CP,,0,5,5,5,10,10,30,20,3000,20,30,0,ferrari_30x16_203.prn,18JA718CP,
+18JA713CP,,0,0,5,5,10,10,30,20,3000,20,0,0,ferrari_30x16_203.prn,18JA713CP,
+18JA709CP,,0,0,5,5,10,10,30,20,3000,20,0,0,ferrari_30x16_203.prn,18JA709CP,
+000904357,,0,0,10,10,10,10,20,20,4200,20,0,0,ferrari_30x16_203.prn,000904357,
+05534288,,0,0,10,10,10,10,20,20,6900,20,0,0,ferrari_30x16_203.prn,05534288,
+5802031904,,0,0,5,5,10,10,20,20,2100,20,0,0,ferrari_30x16_203.prn,5802031904,
+000894372,,10,0,5,5,10,10,30,20,2100,20,0,0,ferrari_30x16_203.prn,000894372,
+000957630,,0,0,10,10,10,10,10,30,3400,10,0,0,ferrari_30x16_203.prn,000957630,
+000957631,,0,0,10,10,10,10,10,30,3400,10,0,0,ferrari_30x16_203.prn,000957631,
+000958439,,0,0,5,10,10,10,30,30,2200,10,0,0,ferrari_30x16_203.prn,000958439,
+000986619,,0,0,5,15,10,10,10,30,1600,10,0,0,ferrari_30x16_203.prn,000986619,
+S3130E132,,0,0,7,15,10,10,5,2,4100,1,0,0,ferrari_30x16_203.prn,S3130E132,
+18KA144CT,,0,0,5,5,10,10,30,10,3100,10,0,0,ferrari_30x16_203.prn,18KA144CT,
+5803148261,,2,5000,5,10,10,10,10,30,5000,15,1,0,ferrari_30x16_203.prn,5803148261,
+98FB080CP,,5,200,10,10,10,10,20,10,200,15,30,1,ferrari_30x16_203.prn,98FB080CP,
+590.2.418.1A,,0,5000,3,5,10,10,5,5,1000,15,0,0,ferrari_30x16_203.prn,590.2.418.1A,
+055000044,,0,3000,5,5,10,10,30,20,2100,15,0,0,ferrari_30x16_203.prn,055000044,
+000975576,TUBO INLET,5,2000,30,80,10,10,10,0,2000,1,0,0,ferrari_30x16_203.prn,000975576,
+000975575,TUBO OUTLET,5,2000,10,80,10,10,10,0,2000,1,0,0,ferrari_30x16_203.prn,000975575,
+5803223742,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803223742,
+5803223740,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803223740,
+5803223741,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803223741,
+5803223736,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803223736,
+5803223745,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803223745,
+000884945,,0,0,10,5,10,10,10,30,1500,0,0,0,ferrari_30x16_203.prn,000884945,
+5803223739,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803223739,
+000960322,000960322,0,0,5,10,10,10,10,20,1600,20,0,0,ferrari_30x16_203.prn,000960322,
+000960324,000960324,0,0,5,10,10,10,10,20,1600,20,0,0,ferrari_30x16_203.prn,000960324,
+000960275,000960275,0,0,5,10,10,10,10,20,1600,20,0,0,ferrari_30x16_203.prn,000960275,
+000960281,000960281,0,0,5,10,10,10,10,20,1600,20,0,0,ferrari_30x16_203.prn,000960281,
+055055934,,0,0,10,10,10,10,20,20,6800,20,0,0,ferrari_30x16_203.prn,055055934,
+5803228585,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803228585,
+5803223755,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803223755,
+5803120375,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803120375,
+5803083634,,0,5000,5,10,10,10,10,30,3000,15,0,0,ferrari_30x16_203.prn,5803083634,
+742722-15,742722-15,0,0,5,10,10,10,20,30,6000,10,0,0,ferrari_30x16_203.prn,74222-15,
+90383952,90383952,0,10,5,10,10,10,20,30,6100,0,0,0,ferrari_30x16_203.prn,90383952,
+90383805,90383805,0,0,5,20,10,20,20,30,6100,0,0,0,ferrari_30x16_203.prn,90383805,
+90459069,90459069,0,0,5,10,10,10,20,30,5100,0,0,0,ferrari_30x16_203.prn,90459069,
+001031-R5,,0,0,10,30,10,10,30,10,5100,5,0,0,ferrari_30x16_203.prn,001031-R5,
+5803036739,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803036739,
+000990010,000990010,2,200,10,10,10,10,10,20,200,20,0,0,ferrari_30x16_203.prn,000990010,
+SY9Y-18D553AAM1,,0,0,5,5,10,10,30,20,7000,20,0,0,ferrari_30x16_203.prn,SY9Y-18D553AAM1,
+SY9Y-18D552AAM1,,10,7000,5,5,10,10,30,20,7100,20,0,0,ferrari_30x16_203.prn,SY9Y-18D552AAM1,
+5803037202,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803037202,
+5803108366,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5703108366,
+5803108365,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803108365,
+PT00051126,,2,800,5,10,10,10,10,30,800,15,0,0,ferrari_30x16_203.prn,PT00051126,
+000985807,,0,0,5,10,10,10,10,30,1600,10,0,0,ferrari_30x16_203.prn,000985807,
+055038005,,0,300,5,10,40,40,10,20,200,20,10,0,ferrari_30x16_203.prn,055038005,
+5803034811,,0,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803034811,
+5803037201,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803037201,
+5803223749,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803223749,
+5803223748,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803223748,
+055000045,,0,0,5,5,10,10,30,20,2100,20,0,0,ferrari_30x16_203.prn,055000045,
+5803223747,,0,0,5,10,10,10,10,30,5000,30,0,0,ferrari_30x16_203.prn,5803223747,
+5803223746,,0,0,5,10,10,10,10,30,5000,30,0,0,ferrari_30x16_203.prn,5803223746,
+000951612,,0,0,5,5,10,10,30,20,2200,20,0,0,ferrari_30x16_203.prn,000951612,
+000951613,,0,0,5,5,10,10,30,20,2200,20,0,0,ferrari_30x16_203.prn,000951613,
+5803223750,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803223750,
+5803223751,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803223751,
+5803223752,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803223752,
+5803223753,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803223753,
+014093,014093,5,6000,10,1,10,10,10,30,6000,15,0,0,ferrari_30x16_203.prn,014093,
+7076213,7076213,0,0,10,1,10,10,10,30,6000,15,0,0,ferrari_30x16_203.prn,7026213,
+M28090912174,M280909-12174,0,0,5,10,10,10,10,30,6000,15,0,0,ferrari_30x16_203.prn,M28090912174,
+M28O90912174ECL,,0,0,1,1,10,10,1,0,0,0,0,0,ferrari_flag_qr_only.prn,,
+5802815391,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5802815391,
+5803101541,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803101541,
+5803101542,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803101542,
+5803406514,,2,5000,5,10,10,10,10,30,5000,15,1,0,ferrari_30x16_203.prn,5803406514,
+5803108310,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803108310,
+5803101537,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803101537,
+5803101538,,2,5000,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803101538,
+SY9Y-7F113AAM1,,10,7000,5,5,10,10,30,20,7100,20,0,0,ferrari_30x16_203.prn,SY9Y-7F113AAM1,
+SY9Y-7F114AAM1,,10,7000,5,5,10,10,30,20,7100,20,0,0,ferrari_30x16_203.prn,SY9Y-7F114AAM1,
+5803108305,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803108305,
+5803108311,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803108311,
+5802932524,,0,0,5,25,10,10,10,50,5000,50,0,0,ferrari_30x16_203.prn,5802932524,
+200116-13-1610,,5,5000,10,10,10,10,10,30,7000,0,0,0,ferrari_30x16_203.prn,200116-13-1610,
+5803108369,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803108369,
+ ENT.791.057.MT,,0,8000,5,5,10,10,10,30,8000,32,0,0,ferrari_30x16_203.prn,ENT.791.057.MT,
+ ENT.791.057.MR,,0,8000,5,5,10,10,10,30,8000,32,0,0,ferrari_30x16_203.prn,ENT.791.057.MR,
+5803036736,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803036736,
+5803036738,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803036738,
+A46107017000,,0,0,10,10,10,10,15,10,5100,15,0,0,ferrari_30x16_203.prn,A46107017000,
+000975406,,0,0,5,5,10,10,30,20,2100,20,0,0,ferrari_30x16_203.prn,000975406,
+000982127,,0,0,5,5,10,10,30,20,2100,20,0,0,ferrari_30x16_203.prn,000982127,
+98KA125CT,,0,0,5,5,10,10,30,50,3000,50,0,0,ferrari_30x16_203.prn,98KA125CT,
+000976097,,0,0,5,5,10,10,10,30,3500,30,0,0,ferrari_30x16_203.prn,000976097,
+000904357,,0,0,10,10,10,10,20,20,4100,20,0,0,ferrari_30x16_203.prn,000904357,
+TEST F250,,0,0,10,10,10,10,30,10,6000,0,0,0,ferrari_flag_qr_only.prn,,
+000779625,,0,0,5,5,10,10,30,20,2100,20,0,0,ferrari_30x16_203.prn,000779625,
+000951611,,0,0,5,5,10,10,30,20,2200,20,0,0,ferrari_30x16_203.prn,000951611,
+000748845,,0,0,5,5,10,10,30,20,2100,20,0,0,ferrari_30x16_203.prn,000748845,
+ 055034288,,0,6800,10,10,10,10,20,20,6800,20,0,0,ferrari_30x16_203.prn, 055034288,
+5803223735,,0,0,5,10,10,10,10,30,5100,15,0,0,ferrari_30x16_203.prn,5803223735,
+LIEBHERR R55240,,0,0,10,40,10,10,10,30,5000,30,0,0,ferrari_flag_qr_only.prn,,
+000298261,,0,0,3,3,10,10,3,30,6000,30,0,0,ferrari_30x16_203.prn,000298261,
+18LB033CT,,0,0,10,10,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB033CT,
+18LA995CT,,0,0,10,10,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LA995CT,
+18LA994CT,,0,0,10,10,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LA994CT,
+5803120373,,0,0,5,10,10,10,10,30,5100,15,0,0,ferrari_30x16_203.prn,5803120373,
+18LB034CT,,0,0,10,10,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB034CT,
+18LB069CT,,0,0,10,10,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB069CT,
+18LB032CT,,0,0,10,10,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB032CT,
+5803025117,,0,0,5,10,10,10,10,30,5100,15,0,0,ferrari_30x16_203.prn,583025117,
+5803025116,,5,2000,10,10,10,10,10,30,5100,15,0,0,ferrari_30x16_203.prn,5803025116,
+000990688,,0,0,5,5,10,10,30,20,2000,20,0,0,ferrari_30x16_203.prn,000990688,
+000990696,,0,0,5,5,10,10,30,20,2000,20,0,0,ferrari_30x16_203.prn,000990696,
+000990684,,0,0,5,5,10,10,30,20,2000,20,0,0,ferrari_30x16_203.prn,000990684,
+000990685,,0,0,5,5,10,10,30,20,2000,20,0,0,ferrari_30x16_203.prn,000990685,
+000990679,,0,0,5,5,10,10,30,20,2000,20,0,0,ferrari_30x16_203.prn,000990679,
+0000825276,,0,0,5,10,10,10,10,30,1500,30,0,0,ferrari_30x16_203.prn,0000825276,
+000990691,,0,0,5,10,10,10,10,20,3000,20,0,0,ferrari_30x16_203.prn,000990691,
+000990704,,0,0,5,10,10,10,10,20,1500,20,0,0,ferrari_30x16_203.prn,000990704,
+000990700,,0,0,5,10,10,10,30,20,2100,20,0,0,ferrari_30x16_203.prn,000990700,
+000990681,,0,0,5,10,10,10,30,20,2100,20,0,0,ferrari_30x16_203.prn,000990681,
+000990703,,0,0,5,10,10,10,30,20,1500,20,0,0,ferrari_30x16_203.prn,000990703,
+000990692,,0,0,5,10,10,10,30,20,2100,20,0,0,ferrari_30x16_203.prn,000990692,
+000990690,,0,0,5,10,10,10,30,20,2100,20,0,0,ferrari_30x16_203.prn,000990690,
+000990708,,0,0,10,10,10,10,30,20,5000,20,0,0,ferrari_30x16_203.prn,000990708,
+055045415,,0,0,5,5,10,10,30,20,2100,20,0,0,ferrari_30x16_203.prn,055045415,
+000990686,,0,0,5,5,10,10,30,20,2000,20,0,0,ferrari_30x16_203.prn,000990686,
+18LB058CT,,0,0,10,10,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB058CT,
+000990680,,0,0,5,10,10,10,30,20,2100,20,0,0,ferrari_30x16_203.prn,000990680,
+000990687,,0,0,10,10,10,10,30,20,5000,20,0,0,ferrari_30x16_203.prn,000990687,
+000907313,000907313,0,0,10,10,10,10,10,20,2100,20,0,0,ferrari_30x16_203.prn,000907313,
+000987924,,5,0,10,10,10,10,10,20,2100,20,0,0,ferrari_30x16_203.prn,000987924,
+18LB051CT,,0,0,10,10,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB051CT,
+18LB044CT,,0,0,10,10,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB044CT,
+000987923,,0,0,10,10,10,10,10,20,2100,20,0,0,ferrari_30x16_203.prn,000987923,
+000987571,,0,0,10,10,10,10,10,20,2100,20,0,0,ferrari_30x16_203.prn,000987571,
+000987572,,0,0,10,10,10,10,10,20,2100,20,0,0,ferrari_30x16_203.prn,000987572,
+18LB027CT,,0,0,10,10,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB027CT,
+18LA990CT,,0,0,30,30,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LA990CT,
+18LB561CT,,0,0,30,30,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB561CT,
+000990702,,0,0,5,5,10,10,10,20,1600,20,0,0,ferrari_30x16_203.prn,000990702,
+000991064,,0,0,5,5,10,10,10,20,1600,20,0,0,ferrari_30x16_203.prn,000991064,
+000991211,,0,0,5,5,10,10,10,20,1600,20,0,0,ferrari_30x16_203.prn,000991211,
+000990689,,0,0,5,5,10,10,30,20,1600,20,0,0,ferrari_30x16_203.prn,000990689,
+000991211,,0,0,10,10,10,10,30,20,2100,20,0,0,ferrari_30x16_203.prn,000991211,
+000991064,,0,0,10,10,10,10,30,20,1500,20,0,0,ferrari_30x16_203.prn,000991064,
+000990689,,0,0,10,10,10,10,30,20,1500,20,0,0,ferrari_30x16_203.prn,000990689,
+055000046,,0,0,5,10,10,10,30,20,2150,20,0,0,ferrari_30x16_203.prn,055000046,
+000990701,,0,0,10,10,10,10,30,20,2000,20,0,0,ferrari_30x16_203.prn,000990701,
+000990706,,0,0,10,10,10,10,30,20,1500,20,0,0,ferrari_30x16_203.prn,000990706,
+000990697,,0,0,10,10,10,10,30,20,1500,20,0,0,ferrari_30x16_203.prn,000990697,
+BUCHER 7076213,7076213,0,0,10,30,10,10,10,30,5000,30,0,0,ferrari_30x16_203.prn,7076213,
+000990694,,0,0,5,10,10,10,30,20,1500,20,0,0,ferrari_30x16_203.prn,000990694,
+000990699,,0,0,10,10,10,10,30,20,1500,20,0,0,ferrari_30x16_203.prn,000990699,
+SP031.053-R2,,0,0,5,10,10,10,10,30,3100,10,0,0,ferrari_30x16_203.prn,SP031.053-R2,
+SP031.051-R2,SP031.051-R2,0,0,5,10,10,10,10,30,3100,10,0,0,ferrari_30x16_203.prn,SP031.051-R2,
+SP031.050-R3,,0,0,5,10,10,10,10,30,3100,10,0,0,ferrari_30x16_203.prn,SP031.050-R3,
+SP031.052-R2,,0,0,5,10,10,10,10,30,3100,10,0,0,ferrari_30x16_203.prn,SP031.052-R2,
+16JA603CP,,10,500,10,30,10,10,10,20,500,10,0,0,ferrari_30x16_203.prn,16JA603CP,
+16JA605CP,,10,500,10,30,10,10,10,20,500,10,0,0,ferrari_30x16_203.prn,16JA605CP,
+18LB348CT,,0,0,10,10,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB348CT,
+18LB347CT,,0,0,10,10,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB347CT,
+18LB349CT,,0,0,20,20,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB349CT,
+18LB348CT,,0,0,30,30,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB348CT,
+18LB349CT,,0,0,30,30,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB349CT,
+18LB347CT,,0,0,30,30,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB347CT,
+000990693,,0,0,5,10,10,10,30,20,1500,20,0,0,ferrari_30x16_203.prn,000990693,
+18LB346CT,,0,0,30,30,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB346CT,
+18LB350CT,,0,0,30,30,10,10,30,20,3500,20,0,0,ferrari_30x16_203.prn,18LB350CT,
+000990698,,0,0,10,10,10,10,30,20,1500,20,0,0,ferrari_30x16_203.prn,000990698,
+000990695,,0,0,10,10,10,10,30,20,1500,20,0,0,ferrari_30x16_203.prn,000990695,
+000990707,,0,0,5,10,10,10,30,20,1500,20,0,0,ferrari_30x16_203.prn,000990707,
+ 055017119,,0,0,5,10,10,10,10,4,2600,10,0,0,ferrari_30x16_203.prn, 055017119,
+3915370,,0,0,10,10,10,10,20,4,3500,15,0,0,ferrari_30x16_203.prn, 3915370,
+055017118,,0,0,5,10,10,10,10,4,2600,10,0,0,ferrari_30x16_203.prn, 055017118,
+055017120,,0,0,5,10,10,10,60,3,2500,10,0,0,ferrari_30x16_203.prn, 055017120,
+055017125,,0,0,5,10,10,10,60,3,2600,10,0,0,ferrari_30x16_203.prn, 055017125,
+000990705,,0,0,10,10,10,10,30,20,1500,20,0,0,ferrari_30x16_203.prn,000990705,
+055024035,,0,0,5,10,10,10,20,5,2600,10,0,0,ferrari_30x16_203.prn, 055024035,
+R56414,,0,0,5,10,10,10,10,10,3000,10,0,0,ferrari_30x16_203.prn,R56414,
+R56418,,0,0,5,10,10,10,10,10,3000,10,0,0,ferrari_30x16_203.prn,R56418,
+R56413,,0,0,5,10,10,10,10,10,3000,10,0,0,ferrari_30x16_203.prn,R56413,
+R56405,,0,0,5,10,10,10,10,10,3000,10,0,0,ferrari_30x16_203.prn,R56405,
+R56411,,0,0,5,10,10,10,10,10,3000,10,0,0,ferrari_30x16_203.prn,R56411,
+R56410,,0,0,5,10,10,10,10,10,3000,10,0,0,ferrari_30x16_203.prn,R56410,
+07N.131.597.A,,5,4000,10,10,10,10,10,30,3000,10,0,0,ferrari_30x16_203.prn,07N.131.597.A,
+000784883,,0,0,5,5,10,10,10,30,1600,10,0,0,ferrari_30x16_203.prn, 000784883,
+000985807,,0,0,5,5,10,10,10,30,1600,10,0,0,ferrari_30x16_203.prn, 000985807,
+SP031.077R1,,0,0,7,15,10,10,5,30,4100,30,0,0,ferrari_30x16_203.prn,SP031.077-R1,
+800.P.850.1A,,0,0,5,10,10,10,10,30,4000,30,0,0,ferrari_30x16_203.prn,800.P.850.1A,
+800.P.851.1A,,0,0,5,10,10,10,10,30,4000,30,0,0,ferrari_30x16_203.prn,800.P.851.1A,
+055018630,,0,200,5,5,10,10,10,50,2000,50,10,0,ferrari_30x16_203.prn,055018630,
+5803229239,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803229239,
+000952005,,0,0,5,10,10,10,10,30,2100,15,0,0,ferrari_30x16_203.prn,000952005,
+92172962,,0,0,10,20,10,10,10,30,2000,30,0,0,ferrari_30x16_203.prn,92172962,
+5803229240,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803229240,
+PROVA VA0017,,0,0,2,3,10,10,5,0,4000,5,0,0,ferrari_30x16_203.prn,VA0017,
+V04.030.057.AD,,0,0,5,10,10,10,10,20,200,20,0,0,ferrari_30x16_203.prn,V04.030.057.AD,
+5803184400,,0,0,5,10,10,10,10,20,5000,20,0,0,ferrari_30x16_203.prn,5803184400,
+5803329396,,0,0,5,10,10,10,10,30,5000,30,0,0,ferrari_30x16_203.prn,5803329396,
+5803329398,,0,0,5,10,10,10,10,30,5000,30,0,0,ferrari_30x16_203.prn,5803329398,
+5803329442,,0,0,5,10,10,10,10,30,5000,30,0,0,ferrari_30x16_203.prn,5803329442,
+5803329443,,0,0,5,10,10,10,10,30,5000,30,0,0,ferrari_30x16_203.prn,5803329443,
+5803313275,,0,0,5,10,10,10,10,30,5000,30,0,0,ferrari_30x16_203.prn,5803313275,
+5803330518,,0,0,5,10,10,10,10,30,5000,30,0,0,ferrari_30x16_203.prn,5803330518,
+5803313274,,0,0,5,10,10,10,10,30,5000,30,0,0,ferrari_30x16_203.prn,5803313274,
+000742336,,0,0,5,5,10,10,10,20,2100,20,0,0,ferrari_30x16_203.prn,000742336,
+000742332,,0,0,5,5,10,10,10,20,2100,20,0,0,ferrari_30x16_203.prn,000742332,
+5803293153,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293153,
+5803293154,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293154,
+5803293158,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293158,
+5803293162,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293162,
+5803293142,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293142,
+5803293141,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293141,
+5803293149,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293149,
+5803293157,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293157,
+5803229244,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803229244,
+5803229245,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803229245,
+5803293143,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293143,
+5803293144,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293144,
+5803293147,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293147,
+5803293148,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293148,
+5803293149,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293149,
+PROVA RIMAC,,0,0,5,10,10,10,20,20,3000,20,0,0,ferrari_30x16_203.prn,PROVA RIMAC,
+5803293151,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293151,
+5803293150,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293150,
+5803293155,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293155,
+5803293159,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293159,
+055019161,,0,0,5,10,10,10,10,20,1500,20,0,0,ferrari_30x16_203.prn,055019161,
+5803293156,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293156,
+5803293161,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293161,
+5803293160,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293160,
+5803328789,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803328789,
+5803328788,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803328788,
+5803439351,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803439351,
+5803442534,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803442534,
+5803439352,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803439352,
+5803442535,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803442535,
+5803328907,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803328907,
+5803328906,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803328906,
+5803293145,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293145,
+5803293155,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293155,
+5803293152,,0,0,5,10,10,10,10,30,5000,15,0,0,ferrari_30x16_203.prn,5803293152,
+PT00044318,,0,0,5,10,10,10,10,30,1000,15,0,0,ferrari_30x16_203.prn,PT00044318,
+PT00045408,,0,0,5,10,10,10,10,30,1000,15,0,0,ferrari_30x16_203.prn,PT00045408,
+5803311633,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803311633,
+5803312417,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803312417,
+5803312373,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803312373,
+5803312291,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803312291,
+5803311634,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803311634,
+5803311630,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803311630,
+5803311632,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803311632,
+5803311636,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803311636,
+5803312839,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803312839,
+5803312781,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803312781,
+5803316610,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803316610,
+5803316729,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803316729,
+5803316718,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803316718,
+5803317742,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803317742,
+5803321O38,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803321038,
+5803311635,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803311635,
+5803311631,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803311631,
+PT00049591,,0,0,5,10,10,10,10,30,1000,15,0,0,ferrari_30x16_203.prn,PT00049591,
+PT00049590,,0,0,5,10,10,10,10,30,1000,15,0,0,ferrari_30x16_203.prn,PT00049590,
+1636050157,,0,0,5,10,10,10,10,30,6000,0,0,0,ferrari_30x16_203.prn,1636050157,
+580051500,,0,0,5,5,10,10,10,30,6100,30,0,0,ferrari_30x16_203.prn,580051500,
+5803350485,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803350485,
+5803315085,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803315085,
+5803350411,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803350411,
+5803350392,,0,0,5,5,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803350392,
+580051376,,0,0,5,10,10,10,10,30,6100,30,0,0,ferrari_30x16_203.prn,580051376,
+055020340,,0,0,5,10,10,10,10,20,2000,20,0,0,ferrari_30x16_203.prn,055020340,
+G04-030-057-BF,VO4-030-057-BF,0,0,5,5,10,10,10,30,2100,30,0,0,ferrari_30x16_203.prn,V04-030-057-BF,
+5803350506,,0,0,5,10,10,10,10,30,6100,15,0,0,ferrari_30x16_203.prn,5803350506,
+5803350485,,0,0,5,10,10,10,10,30,6100,15,0,0,ferrari_30x16_203.prn,5803350485,
+1636050164,,0,0,5,10,10,10,10,30,6000,15,0,0,ferrari_30x16_203.prn,1636050164,
+1636050159,,0,0,5,10,10,10,10,30,6000,15,0,0,ferrari_30x16_203.prn,1636050159,
+1636050042,,0,0,5,10,10,10,10,30,6000,15,0,0,ferrari_30x16_203.prn,1636050042,
+403/S2662,,0,0,10,10,10,10,10,10,2000,10,0,0,ferrari_30x16_203.prn,403/S2662,
+1636050042,,0,0,5,1,10,10,10,30,6000,15,0,0,ferrari_30x16_203.prn,1636050042,
+1636050162,,0,0,5,10,10,10,10,30,6000,15,0,0,ferrari_30x16_203.prn,1636050162,
+1636050158,,0,0,5,10,10,10,10,30,6000,15,0,0,ferrari_30x16_203.prn,1636050158,
+98FA186CP,98FA186CP,0,2000,5,5,10,10,20,15,3000,15,0,0,ferrari_30x16_203.prn,98FA186CP,
+5803358645,,0,5000,5,10,10,10,10,30,5100,30,0,0,ferrari_30x16_203.prn,5803358646,
+5803158291,CPL GASOLIO LP,5,2000,5,10,10,10,20,30,2000,0,0,0,ferrari_30x16_203.prn,5803158291,C9 CCM FPT
+000784883,,0,0,5,5,10,10,30,20,1500,20,0,0,ferrari_30x16_203.prn,000784883,
+ FUGA CAL 7 BAR,24001,0,0,5,5,10,10,10,9,7000,6,20,1,ferrari_30x16_203.prn,FUGA 24001 8MBA,
+5802814210 R.3,j5802814210 R.3,5,3000,5,10,20,20,20,30,3000,30,10,100,ferrari_flag_qr_only.prn,5802814210 R.3,
+403/S2664,j5802814210 R.3,5,3000,5,10,5,5,10,10,2000,10,10,100,ferrari_30x16_203.prn,"",
+403/S2666,jcb,0,3000,5,10,5,5,10,10,2000,10,10,100,ferrari_30x16_203.prn,"",
diff --git a/config/csv_import/EXTRACTIONS/T3P20RR SN 20060720 09 10 2024.csv b/config/csv_import/EXTRACTIONS/T3P20RR SN 20060720 09 10 2024.csv
new file mode 100644
index 0000000..7fdc224
--- /dev/null
+++ b/config/csv_import/EXTRACTIONS/T3P20RR SN 20060720 09 10 2024.csv
@@ -0,0 +1,102 @@
+codice_ricetta,part_number,tempo_pre_riempimento,pressione_pre_riempimento,tempo_riempimento,tempo_assestamento,percentuale_minima_pressione_assestamento,percentuale_massima_pressione_assestamento,tempo_di_test,pressione_di_test_delta_minimo,pressione_di_test,pressione_di_test_delta_massimo,tempo_svuotamento,pressione_svuotamento,template_di_stampa,campo1,campo2
+TEST FUGA 7 BAR,B1619X,0.0,1400,5.0,10.0,10,10,5.0,16.8,7000,11.200000000000001,0.1,0,,DA 11.2 A 16.8 M,
+16LA773CP REV01,,0.0,0,10.0,15.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-TRANS HX-RT,P16
+5803112815 REV01,COMPL.MAN,0.0,0,5.0,5.0,15,15,10.0,30.0,5000,1.0,0.0,0,,5803112815 REV01,
+5803112816 REV01,COMPL.MAN,0.0,0,5.0,5.0,15,15,10.0,30.0,5000,1.0,0.1,0,,5803112816 REV01,
+PY83-6B747-BA,ENGINE OIL ASSY,0.0,0,10.0,10.0,10,10,30.0,20.0,7000,10.0,0.0,0,,PY83-6B747-BA,ASTON MARTIN
+PY83-6B748-BA,ENGINE OIL ASSY,0.0,0,10.0,10.0,10,10,30.0,20.0,7000,5.0,0.0,0,,PY83-6B748-BA,ASTON MARTIN
+5802729983 REV0,,0.0,0,5.0,5.0,10,10,10.0,20.0,8000,0.0,0.0,0,,,
+MY83-6L701-AB,TRASMISSION OIL,0.0,0,5.0,5.0,10,10,20.0,20.0,7000,5.0,0.0,0,,MY83-6L701-AB,ASTON MARTIN
+16FC246CP REV1,,0.0,0,10.0,5.0,10,10,20.0,20.0,1000,5.0,0.0,0,,ASSY-OIL FILL,P16
+MY83-6L694-AB,TRASMISSION OIL,0.0,0,5.0,5.0,10,10,20.0,20.0,7000,5.0,0.0,0,,MY83-6L694-AB,ASTON MARTIN
+16FC250CP REV02,ASSY CCV,0.0,0,5.0,5.0,20,20,20.0,50.0,200,2.0,0.0,0,,ASSY CCV - PCV,T16C-Z0800-001
+5801970064 REV2,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5801970064 REV2,LANCIA BOLZANO
+5801970067 REV1,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5801970067 REV1,LANCIA BOLZANO
+5801384839 REV1,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5801384839 REV1,LANCIA BOLZANO
+5801384838 REV1,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5801384838 REV1,LANCIA BOLZANO
+12970-13-2382,TUBEASSY-CLUTCH,0.0,0,10.0,5.0,10,10,20.0,20.0,7000,5.0,0.0,0,,12970-13-2382,MULTIMATIC
+12970-13-2384,TUBEASSY-CLUTCH,0.0,0,10.0,5.0,10,10,20.0,20.0,7000,5.0,0.0,0,,12970-13-2384,MULTIMATIC
+12970-13-2386,TUBEASSY-CLUTCH,0.0,0,10.0,5.0,10,10,20.0,20.0,7000,5.0,0.0,0,,12970-13-2386,MULTIMATIC
+12970-13-2388,TUBEASSY-CLUTCH,0.0,0,10.0,5.0,10,10,20.0,20.0,7000,5.0,0.0,0,,12970-13-2388,MULTIMATIC
+16FC256CP REV01,,0.0,0,5.0,5.0,10,10,20.0,20.0,1000,5.0,0.0,0,,ASSY-MAKE UP AIR,P16
+5801384841 REV01,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5801384841 REV01,LANCIA BOLZANO
+5801384842 REV01,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5801384842 REV01,LANCIA BOLZANO
+5801970063 REV2,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5801970063 REV2,LANCIA BOLZANO
+ 16FB157CP REV03,,0.0,0,5.0,5.0,10,10,20.0,50.0,1000,2.0,0.0,0,,ASSY CCV-OIL TAN,P16
+ 16L0002CP REV03,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-RH-HT-RADIA,P16
+ 16L0007CP REV03,,0.0,0,5.0,5.0,10,10,30.0,20.0,3000,4.0,0.0,0,,HOSE-IPU-JNCTN-T,P16
+16L0043CP REV02,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,PIPE-OUTLET-PRE-,P16
+16L0045CP REV02,,0.0,0,5.0,5.0,10,10,30.0,20.0,3000,0.0,0.0,0,,HOSE-HT-RADIATOR,P16
+16L0046CP REV03,,0.0,0,15.0,10.0,10,10,20.0,20.0,3500,5.0,0.0,0,,HOSE-LH-HT-RADIA,P16
+16L0058CP REV02,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,5.0,0.0,0,,HOSE-LT-TUNNEL-T,P16
+16L0059CP REV03,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-COOLANT-FIL,P16
+16L0075CP REVO3,,0.0,0,20.0,15.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-HEADER-TANK,P16
+16L0145CP REV03,,0.0,0,5.0,15.0,10,10,30.0,20.0,3000,0.0,0.0,0,,HOSE-HOSE-PUMP-T,P16
+16L0151CP REV03,,0.0,0,5.0,15.0,10,10,30.0,20.0,3000,0.0,0.0,0,,HOSE-IPU-OUTLET-,P16
+16L0154CP REV03,,0.0,0,10.0,20.0,10,10,30.0,20.0,3000,0.0,0.0,0,,HOSE-RH-LTR-OUTL,P16
+16L0161CP REV04,,0.0,0,5.0,15.0,10,10,30.0,20.0,3000,0.0,0.0,0,,HOSE-WCACS-TO-ME,P16
+16L0164CP REV02,,0.0,0,10.0,15.0,10,10,30.0,20.0,3000,0.0,0.0,0,,HOSE-LH-LTR-OUT,P16
+16L0167CP REV02,,0.0,0,10.0,20.0,10,10,30.0,20.0,3000,0.0,0.0,0,,HOSE-TO-MCU,P16
+16L0170CP REV03,,0.0,0,10.0,10.0,10,10,30.0,20.0,3000,0.0,0.0,0,,HOSE-IPU-OUTLET-,P16
+16L0174CP REV02,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-WCACS LINK,P16
+16L0177CP REV03,,0.0,0,5.0,10.0,10,10,30.0,20.0,3000,0.0,0.0,0,,HOSE-JNCTN TO WC,P16
+16L0180CP REV04,,0.0,0,15.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-LH-LTR-OUTL,P16
+16LA259CP REV03,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-LT-MECH-PUM,P16
+16LA336CP REV02,,0.0,0,5.0,10.0,10,10,30.0,20.0,3000,0.0,0.0,0,,HOSE-E-MOTOR-OUT,P16
+16LA353CP REV02,,0.0,0,20.0,15.0,5,20,10.0,20.0,3500,5.0,0.0,0,,HOSE-RH-HT-RADIA,P16
+16LA372CP REV01,,0.0,0,5.0,10.0,10,10,30.0,20.0,3000,0.0,0.0,0,,PIPE-IN-PRE-COOL,P16
+16LA397CP REV02,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-HT-RADIATOR,P16
+16LA449CP REV02,,0.0,0,15.0,15.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-ENGINE-TO-P,P16
+16LA451CP REV01,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE PRE COOLER ,P16
+16LA648CP REV01,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-RH-LTR-OUT-,P16
+16LA452CP REV01,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE PRE COOLERS,P16
+16LA461CP REV02,,0.0,0,5.0,10.0,10,10,20.0,20.0,3000,0.0,0.0,0,,ASSY-HOSE-HT-RTN,P16
+16LA680CP REV01,,0.0,0,10.0,15.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-TRANS HX-RT,P16
+16LA490CP REV02,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-RH-LTR-OUT-,P16
+16LA515CP REV01,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-TRANS HX-RT,P16
+16LA518CP REV02,,0.0,0,5.0,10.0,10,10,20.0,20.0,3000,0.0,0.0,0,,HOSE-TO-E-MOTOR,P16
+16LA573CP REV01,,0.0,0,5.0,10.0,10,10,30.0,20.0,3000,0.0,0.0,0,,HOSE-MCU-TO-MOTO,P16
+16LA579CP REV01,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-WCACS LINK ,P16
+16LA668CP REV01,,0.0,0,10.0,20.0,10,10,30.0,20.0,3500,5.0,0.0,0,,HOSE-LH WCAC AND,P16
+16LA615CP REV01,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-RH WCAC HOS,P16
+16LA584CP REV01,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-TRANS HX-RT,P16
+16LA695CP REV02,,0.0,0,5.0,10.0,10,10,30.0,20.0,3000,1.0,0.0,0,,HOSE PRE COOLERS,P16
+16LA586CP REV01,,0.0,0,5.0,10.0,10,10,20.0,20.0,3000,0.0,0.0,0,,HOSE PRE COOLERS,P16
+16LA642CP REV01,,0.0,0,5.0,5.0,10,10,20.0,20.0,3500,0.0,0.0,0,,HOSE-WCACS LINK ,P16
+16LA643CP REV01,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-WCACS LINK ,P16
+ 16FC069CP REV01,,0.0,0,10.0,15.0,10,10,20.0,50.0,1000,5.0,0.0,0,,ASSY CCV-INTAKE,P16
+ 16FC084CP REV02,,0.0,0,5.0,5.0,10,10,20.0,50.0,3000,0.0,0.0,0,,BALANCE PIPE-INL,P16
+ 16FB394CP REV04,,0.0,0,5.0,5.0,10,10,20.0,50.0,3000,5.0,0.0,0,,ASSY INLET PURGE,P16
+5801970066 REV01,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5801970066 REV01,LANCIA BOLZANO
+5801970021 REV01,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5801970021 REV01,LANCIA BOLZANO
+5801862227 REV00,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5801862227 REV00,LANCIA BOLZANO
+ 16LA661CP REV01,,0.0,0,5.0,10.0,10,10,20.0,20.0,3500,0.0,0.0,0,,HOSE-RH-HT-RADIA,P16
+16FC056CX REV01,,0.0,0,5.0,5.0,10,10,20.0,20.0,1000,5.0,0.0,0,,ASSY-MAKE UP AIR,P16
+16FC201CX REV01, ASSY CCV-PCV,0.0,0,5.0,5.0,20,20,20.0,50.0,300,2.0,0.0,0,"
+",ASSY CCV - PCV,T16C-Z0800-001
+16LA718CP REV02,,0.0,0,5.0,10.0,10,10,30.0,20.0,3000,0.0,0.0,0,,HOSE-E-MOTOR-OUT,P16
+16FA849CP REV02,,0.0,0,10.0,5.0,10,10,20.0,20.0,1000,5.0,0.0,0,,ASSY-OIL FILL,P16
+5803112815,COMPL.MAN,0.0,0,5.0,10.0,15,15,10.0,30.0,5000,1.0,0.1,0,,5803112815,
+5801970065 REV01,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5801970065 REV01,LANCIA BOLZANO
+MY83-6B748-BA,TRASMISSION OIL,0.0,0,10.0,10.0,10,10,20.0,20.0,7000,5.0,0.0,0,,MY83-6B748-BA,ASTON MARTIN
+16FC256CP REV01,,0.0,0,5.0,5.0,10,10,20.0,20.0,1000,5.0,0.0,0,,ASSY-MAKE UP AIR,P16
+5803112816,COMPL.MAN,0.0,0,5.0,10.0,15,15,10.0,30.0,5000,1.0,0.1,0,,5803112816,
+16LA459CP REV02,,0.0,0,5.0,10.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-TRANS HX-RT,P16
+MY83-6B747-BA,TRASMISSION OIL,0.0,0,10.0,10.0,10,10,20.0,20.0,7000,5.0,0.0,0,,MY83-6B747-BA,ASTON MARTIN
+16FA849CP REV02,,0.0,0,10.0,5.0,10,10,20.0,20.0,1000,5.0,0.0,0,,ASSY-OIL FILL,
+16FA849CX REV01,,0.0,0,10.0,5.0,10,10,20.0,20.0,1000,5.0,0.0,0,,ASSY-OIL FILL,
+16LA027SP REV02,,0.0,0,20.0,30.0,10,10,30.0,20.0,3500,5.0,0.0,0,,HOSE-LH WCAC AND,P16
+5801970065 REV01,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5801970065 REV01,LANCIA BOLZANO
+16FA026SP REV1,OIL FIL LINE-FED,0.0,0,5.0,5.0,20,20,20.0,50.0,200,2.0,0.0,0,,FED,T16C-Z0800-001
+5801384840 REV01,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5801384840 REV01,LANCIA BOLZANO
+16FC446CP REV01,ASSY CCV,0.0,0,5.0,5.0,20,20,20.0,50.0,200,2.0,0.0,0,,FED,T16C-Z0800-001
+16FA026SP,,0.0,0,5.0,10.0,10,10,30.0,20.0,3000,0.0,0.0,0,,FED,P16
+5802170779 REV0,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5802170779 REV0,LANCIA BOLZANO
+16FC469CP REV.01,ASSY CCV,0.0,0,5.0,5.0,20,20,20.0,50.0,200,2.0,0.0,0,,FED,T16C-Z0800-001
+5802170804 REV0,FUEL HOSE,0.0,0,10.0,5.0,10,10,20.0,20.0,8000,5.0,0.0,0,,5802170804 REV0,LANCIA BOLZANO
+16LA459CP REV1,,0.0,0,10.0,15.0,10,10,30.0,20.0,3500,0.0,0.0,0,,HOSE-TRANS HX-RT,P16
+16FC541CT REV01,ASSY CCV,0.0,0,5.0,5.0,20,20,20.0,50.0,200,2.0,0.0,0,,FED,T16C-Z0800-001
+16LA735CP REV01,,0.0,0,5.0,5.0,10,10,20.0,20.0,3500,0.0,0.0,0,,HOSE-WCACS LINK ,P16
+16FA026SP REV01,ASSY CCV,0.0,0,5.0,5.0,20,20,20.0,50.0,200,2.0,0.0,0,,FED,T16C-Z0800-001
+5802980014 REV0,,0.0,0,15.0,10.0,10,10,25.0,20.0,7000,0.0,0.0,0,,UNITE GASOIL PI,IVECO
+16LA765CP REV1,,0.0,0,5.0,5.0,10,10,20.0,20.0,3500,0.0,0.0,0,,HOSE-WCACS LINK ,P16
diff --git a/config/csv_import/ST-TEN-6.csv b/config/csv_import/manual_csv_import/ST-TEN-6.csv
similarity index 100%
rename from config/csv_import/ST-TEN-6.csv
rename to config/csv_import/manual_csv_import/ST-TEN-6.csv
diff --git a/config/csv_import/Tabella Tubi riscaldati - COMPLETA rev09_27-10-2022.csv b/config/csv_import/manual_csv_import/Tabella Tubi riscaldati - COMPLETA rev09_27-10-2022.csv
similarity index 100%
rename from config/csv_import/Tabella Tubi riscaldati - COMPLETA rev09_27-10-2022.csv
rename to config/csv_import/manual_csv_import/Tabella Tubi riscaldati - COMPLETA rev09_27-10-2022.csv
diff --git a/config/csv_import/Tabella Tubi riscaldati - COMPLETA rev19_29-12-2022.csv b/config/csv_import/manual_csv_import/Tabella Tubi riscaldati - COMPLETA rev19_29-12-2022.csv
similarity index 100%
rename from config/csv_import/Tabella Tubi riscaldati - COMPLETA rev19_29-12-2022.csv
rename to config/csv_import/manual_csv_import/Tabella Tubi riscaldati - COMPLETA rev19_29-12-2022.csv
diff --git a/config/csv_import/Tabella Tubi riscaldati - COMPLETA rev19_29-12-2022.xlsx b/config/csv_import/manual_csv_import/Tabella Tubi riscaldati - COMPLETA rev19_29-12-2022.xlsx
similarity index 100%
rename from config/csv_import/Tabella Tubi riscaldati - COMPLETA rev19_29-12-2022.xlsx
rename to config/csv_import/manual_csv_import/Tabella Tubi riscaldati - COMPLETA rev19_29-12-2022.xlsx
diff --git a/config/csv_import/Tabella Tubi riscaldati - COMPLETA rev46_13-03-2024.xlsx - Tubi riscaldati costampati.csv b/config/csv_import/manual_csv_import/Tabella Tubi riscaldati - COMPLETA rev46_13-03-2024.xlsx - Tubi riscaldati costampati.csv
similarity index 100%
rename from config/csv_import/Tabella Tubi riscaldati - COMPLETA rev46_13-03-2024.xlsx - Tubi riscaldati costampati.csv
rename to config/csv_import/manual_csv_import/Tabella Tubi riscaldati - COMPLETA rev46_13-03-2024.xlsx - Tubi riscaldati costampati.csv
diff --git a/config/csv_import/Tabella Tubi riscaldati - COMPLETA rev49_19-04-2024.xlsx - Tubi riscaldati costampati.csv b/config/csv_import/manual_csv_import/Tabella Tubi riscaldati - COMPLETA rev49_19-04-2024.xlsx - Tubi riscaldati costampati.csv
similarity index 100%
rename from config/csv_import/Tabella Tubi riscaldati - COMPLETA rev49_19-04-2024.xlsx - Tubi riscaldati costampati.csv
rename to config/csv_import/manual_csv_import/Tabella Tubi riscaldati - COMPLETA rev49_19-04-2024.xlsx - Tubi riscaldati costampati.csv
diff --git a/config/csv_import/Tabella Tubi riscaldati - COMPLETA rev50_07-05-2024.xlsx - Tubi riscaldati costampati.csv b/config/csv_import/manual_csv_import/Tabella Tubi riscaldati - COMPLETA rev50_07-05-2024.xlsx - Tubi riscaldati costampati.csv
similarity index 100%
rename from config/csv_import/Tabella Tubi riscaldati - COMPLETA rev50_07-05-2024.xlsx - Tubi riscaldati costampati.csv
rename to config/csv_import/manual_csv_import/Tabella Tubi riscaldati - COMPLETA rev50_07-05-2024.xlsx - Tubi riscaldati costampati.csv
diff --git a/config/csv_import/Tabella Tubi riscaldati - COMPLETA rev50_13-05-2024.xlsx - Tubi riscaldati costampati.csv b/config/csv_import/manual_csv_import/Tabella Tubi riscaldati - COMPLETA rev50_13-05-2024.xlsx - Tubi riscaldati costampati.csv
similarity index 100%
rename from config/csv_import/Tabella Tubi riscaldati - COMPLETA rev50_13-05-2024.xlsx - Tubi riscaldati costampati.csv
rename to config/csv_import/manual_csv_import/Tabella Tubi riscaldati - COMPLETA rev50_13-05-2024.xlsx - Tubi riscaldati costampati.csv
diff --git a/config/csv_import/Tabella Tubi riscaldati - campi extra.csv b/config/csv_import/manual_csv_import/Tabella Tubi riscaldati - campi extra.csv
similarity index 100%
rename from config/csv_import/Tabella Tubi riscaldati - campi extra.csv
rename to config/csv_import/manual_csv_import/Tabella Tubi riscaldati - campi extra.csv
diff --git a/config/csv_import/Tabella_e_daily.csv b/config/csv_import/manual_csv_import/Tabella_e_daily.csv
similarity index 100%
rename from config/csv_import/Tabella_e_daily.csv
rename to config/csv_import/manual_csv_import/Tabella_e_daily.csv
diff --git a/config/csv_import/importazione da banco montaggio.ods b/config/csv_import/manual_csv_import/importazione da banco montaggio.ods
similarity index 100%
rename from config/csv_import/importazione da banco montaggio.ods
rename to config/csv_import/manual_csv_import/importazione da banco montaggio.ods
diff --git a/config/csv_import/importazione da banco preformatura.csv b/config/csv_import/manual_csv_import/importazione da banco preformatura.csv
similarity index 100%
rename from config/csv_import/importazione da banco preformatura.csv
rename to config/csv_import/manual_csv_import/importazione da banco preformatura.csv
diff --git a/config/csv_import/ricette MULTIMATIC.csv b/config/csv_import/manual_csv_import/ricette MULTIMATIC.csv
similarity index 100%
rename from config/csv_import/ricette MULTIMATIC.csv
rename to config/csv_import/manual_csv_import/ricette MULTIMATIC.csv
diff --git a/config/csv_import/manual_csv_import/ricette prototipi.csv b/config/csv_import/manual_csv_import/ricette prototipi.csv
new file mode 100644
index 0000000..0dcc407
--- /dev/null
+++ b/config/csv_import/manual_csv_import/ricette prototipi.csv
@@ -0,0 +1,305 @@
+codice_ricetta,codice_prodotto,tempo_pre_riempimento,pressione_di_test,tempo_di_test,tempo_assestamento,percentuale_minima_pressione_assestamento,percentuale_massima_pressione_assestamento,tempo_di_test,pressione_di_test_delta_minimo,pressione_pre_rimepimento,pressione_di_test_delta_massimo,tempo_svuotamento,pressione_svuotamento,template_di_stampa,descrizione,campo2
+07N.131.628.A,,10,200,20,20,10,10,10,5,0,5,2,0,,07N.131.628.A,
+V04.030.057.BE,P18 BATTERY COOLING,0,0,20,20,10,10,20,5,0,5,0,0,,V04.030.057.BE,
+000990502,,0,0,10,10,10,10,10,30,0,20,0,0,,000990502,
+98FA644CP,,0,0,5,10,10,10,20,15,0,15,0,0,,98FA644CP,
+5803158246,CPLGASOLIO LP,5,2000,5,10,10,10,20,30,0,0,0,0,,5803158246,C9 CCM FPT
+BLOW BY WOKO,000781499,10,1000,10,10,99,99,10,600,0,20,0,0,,000781499,
+SY9Y-2976-B,SY9Y-2976-A,0,5000,10,10,10,10,10,20,0,15,1,0,,SY9Y-2976-B,
+SY9Y-2976-A,SY9Y-2976-A,0,0,10,10,10,10,10,20,0,0,0,0,,SY9Y-2976-A,
+SY9Y-9S331-B,SY9Y-9S331-B,10,0,10,10,10,10,10,20,0,15,0,0,,SY9Y-9S331-B,
+SY9Y-9S331-A,SY9Y-9S331-A,10,0,10,10,10,10,10,20,0,0,0,0,,SY9Y-9S331-A,
+18JA708CP,,0,0,5,5,10,10,30,20,0,20,0,0,,18JA708CP,
+18JA757CP,,0,0,5,5,10,10,30,20,0,20,0,0,,18JA757CP,
+18JA750CP,,0,0,5,5,10,10,30,20,0,20,0,0,,18JA750CP,
+18JA712CP,,0,0,5,5,10,10,30,20,0,20,0,0,,18JA712CP,
+18JA710CP,,0,0,5,5,10,10,30,20,0,20,0,0,,18JA710CP,
+18JA718CP,,0,5,5,5,10,10,30,20,0,20,3,0,,18JA718CP,
+18JA713CP,,0,0,5,5,10,10,30,20,0,20,0,0,,18JA713CP,
+18JA709CP,,0,0,5,5,10,10,30,20,0,20,0,0,,18JA709CP,
+000904357,,0,0,10,10,10,10,20,20,0,20,0,0,,000904357,
+05534288,,0,0,10,10,10,10,20,20,0,20,0,0,,05534288,
+5802031904,,0,0,5,5,10,10,20,20,0,20,0,0,,5802031904,
+000894372,,10,0,5,5,10,10,30,20,0,20,0,0,,000894372,
+000957630,,0,0,10,10,10,10,10,30,0,10,0,0,,000957630,
+000957631,,0,0,10,10,10,10,10,30,0,10,0,0,,000957631,
+000958439,,0,0,5,10,10,10,30,30,0,10,0,0,,000958439,
+000986619,,0,0,5,15,10,10,10,30,0,10,0,0,,000986619,
+S3130E132,,0,0,7,15,10,10,5,2,0,1,0,0,,S3130E132,
+18KA144CT,,0,0,5,5,10,10,30,10,0,10,0,0,,18KA144CT,
+5803148261,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803148261,
+98FB080CP,,5,200,10,10,10,10,20,10,0,15,3,1,,98FB080CP,
+590.2.418.1A,,0,5000,3,5,10,10,5,5,0,15,0,0,,590.2.418.1A,
+055000044,,0,3000,5,5,10,10,30,20,0,15,0,0,,055000044,
+000975576,TUBO INLET,5,2000,30,80,10,10,10,1,0,1,0,0,,000975576,
+000975575,TUBO OUTLET,5,2000,10,80,10,10,10,1,0,1,0,0,,000975575,
+5803223742,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803223742,
+5803223740,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803223740,
+5803223741,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803223741,
+5803223736,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803223736,
+5803223745,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803223745,
+000884945,,0,0,10,5,10,10,10,30,0,0,0,0,,000884945,
+5803223739,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803223739,
+000960322,000960322,0,0,5,10,10,10,10,20,0,20,0,0,,000960322,
+000960324,000960324,0,0,5,10,10,10,10,20,0,20,0,0,,000960324,
+000960275,000960275,0,0,5,10,10,10,10,20,0,20,0,0,,000960275,
+000960281,000960281,0,0,5,10,10,10,10,20,0,20,0,0,,000960281,
+055055934,,0,0,10,10,10,10,20,20,0,20,0,0,,055055934,
+5803228585,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803228585,
+5803223755,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803223755,
+5803120375,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803120375,
+5803083634,,0,5000,5,10,10,10,10,30,0,15,0,0,,5803083634,
+742722-15,742722-15,0,0,5,10,10,10,20,30,0,10,0,0,,74222-15,
+90383952,90383952,0,10,5,10,10,10,20,30,0,0,0,0,,90383952,
+90383805,90383805,0,0,5,20,10,20,20,30,0,0,0,0,,90383805,
+90459069,90459069,0,0,5,10,10,10,20,30,0,0,0,0,,90459069,
+001031-R5,,0,0,10,30,10,10,30,10,0,5,0,0,,001031-R5,
+5803036739,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803036739,
+000990010,000990010,2,200,10,10,10,10,10,20,0,20,0,0,,000990010,
+SY9Y-18D553AAM1,,0,0,5,5,10,10,30,20,0,20,0,0,,SY9Y-18D553AAM1,
+SY9Y-18D552AAM1,,10,7000,5,5,10,10,30,20,0,20,0,0,,SY9Y-18D552AAM1,
+5803037202,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803037202,
+5803108366,,2,5000,5,10,10,10,10,30,0,15,0,0,,5703108366,
+5803108365,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803108365,
+PT00051126,,2,800,5,10,10,10,10,30,0,15,0,0,,PT00051126,
+000985807,,0,0,5,10,10,10,10,30,0,10,0,0,,000985807,
+055038005,,0,300,5,10,40,40,10,20,0,20,1,0,,055038005,
+5803034811,,0,5000,5,10,10,10,10,30,0,15,0,0,,5803034811,
+5803037201,,0,0,5,10,10,10,10,30,0,15,0,0,,5803037201,
+5803223749,,0,0,5,10,10,10,10,30,0,15,0,0,,5803223749,
+5803223748,,0,0,5,10,10,10,10,30,0,15,0,0,,5803223748,
+055000045,,0,0,5,5,10,10,30,20,0,20,0,0,,055000045,
+5803223747,,0,0,5,10,10,10,10,30,0,30,0,0,,5803223747,
+5803223746,,0,0,5,10,10,10,10,30,0,30,0,0,,5803223746,
+000951612,,0,0,5,5,10,10,30,20,0,20,0,0,,000951612,
+000951613,,0,0,5,5,10,10,30,20,0,20,0,0,,000951613,
+5803223750,,0,0,5,10,10,10,10,30,0,15,0,0,,5803223750,
+5803223751,,0,0,5,10,10,10,10,30,0,15,0,0,,5803223751,
+5803223752,,0,0,5,10,10,10,10,30,0,15,0,0,,5803223752,
+5803223753,,0,0,5,10,10,10,10,30,0,15,0,0,,5803223753,
+014093,014093,5,6000,10,1,10,10,10,30,0,15,0,0,,014093,
+7076213,7076213,0,0,10,1,10,10,10,30,0,15,0,0,,7026213,
+M28090912174,M280909-12174,0,0,5,10,10,10,10,30,0,15,0,0,,M28090912174,
+M28O90912174ECL,,0,0,1,1,10,10,1,0,0,0,0,0,,,
+5802815391,,0,0,5,10,10,10,10,30,0,15,0,0,,5802815391,
+5803101541,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803101541,
+5803101542,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803101542,
+5803406514,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803406514,
+5803108310,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803108310,
+5803101537,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803101537,
+5803101538,,2,5000,5,10,10,10,10,30,0,15,0,0,,5803101538,
+SY9Y-7F113AAM1,,10,7000,5,5,10,10,30,20,0,20,0,0,,SY9Y-7F113AAM1,
+SY9Y-7F114AAM1,,10,7000,5,5,10,10,30,20,0,20,0,0,,SY9Y-7F114AAM1,
+5803108305,,0,0,5,10,10,10,10,30,0,15,0,0,,5803108305,
+5803108311,,0,0,5,10,10,10,10,30,0,15,0,0,,5803108311,
+5802932524,,0,0,5,25,10,10,10,50,0,50,0,0,,5802932524,
+200116-13-1610,,5,5000,10,10,10,10,10,30,0,0,0,0,,200116-13-1610,
+5803108369,,0,0,5,10,10,10,10,30,0,15,0,0,,5803108369,
+ ENT.791.057.MT,,0,8000,5,5,10,10,10,30,0,32,0,0,,ENT.791.057.MT,
+ ENT.791.057.MR,,0,8000,5,5,10,10,10,30,0,32,0,0,,ENT.791.057.MR,
+5803036736,,0,0,5,10,10,10,10,30,0,15,0,0,,5803036736,
+5803036738,,0,0,5,10,10,10,10,30,0,15,0,0,,5803036738,
+A46107017000,,0,0,10,10,10,10,15,10,0,15,0,0,,A46107017000,
+000975406,,0,0,5,"5
+",10,10,30,20,0,20,0,0,,000975406,
+000982127,,0,0,5,"5
+",10,10,30,20,0,20,0,0,,000982127,
+98KA125CT,,0,0,5,"5
+",10,10,30,50,0,50,0,0,,98KA125CT,
+000976097,,0,0,5,"5
+",10,10,10,30,0,30,0,0,,000976097,
+000904357,,0,0,10,10,10,10,20,20,0,20,0,0,,000904357,
+TEST F250,,0,0,10,10,10,10,30,10,0,0,0,0,,,
+000779625,,0,0,5,5,10,10,30,20,0,20,0,0,,000779625,
+000951611,,0,0,5,5,10,10,30,20,0,20,0,0,,000951611,
+000748845,,0,0,5,5,10,10,30,20,0,20,0,0,,000748845,
+ 055034288,,0,6800,10,10,10,10,20,20,0,20,0,0,, 055034288,
+5803223735,,0,0,5,10,10,10,10,30,0,15,0,0,,5803223735,
+LIEBHERR R55240,,0,0,10,40,10,10,10,30,0,30,0,0,,,
+000298261,,0,0,3,3,10,10,3,30,0,30,0,0,,000298261,
+18LB033CT,,0,0,10,10,10,10,30,20,0,20,0,0,,18LB033CT,
+18LA995CT,,0,0,10,10,10,10,30,20,0,20,0,0,,18LA995CT,
+18LA994CT,,0,0,10,10,10,10,30,20,0,20,0,0,,18LA994CT,
+5803120373,,0,0,5,10,10,10,10,30,0,15,0,0,,5803120373,
+18LB034CT,,0,0,10,10,10,10,30,20,0,20,0,0,,18LB034CT,
+18LB069CT,,0,0,10,10,10,10,30,20,0,20,0,0,,18LB069CT,
+18LB032CT,,0,0,10,10,10,10,30,20,0,20,0,0,,18LB032CT,
+5803025117,,0,0,5,10,10,10,10,30,0,15,0,0,,583025117,
+5803025116,,5,2000,10,10,10,10,10,30,0,15,0,0,,5803025116,
+000990688,,0,0,5,5,10,10,30,20,0,20,0,0,,000990688,
+000990696,,0,0,5,5,10,10,30,20,0,20,0,0,,000990696,
+000990684,,0,0,5,5,10,10,30,20,0,20,0,0,,000990684,
+000990685,,0,0,5,5,10,10,30,20,0,20,0,0,,000990685,
+000990679,,0,0,5,5,10,10,30,20,0,20,0,0,,000990679,
+0000825276,,0,0,5,10,10,10,10,30,0,30,0,0,,0000825276,
+000990691,,0,0,5,10,10,10,10,20,0,20,0,0,,000990691,
+000990704,,0,0,5,10,10,10,10,20,0,20,0,0,,000990704,
+000990700,,0,0,5,10,10,10,30,20,0,20,0,0,,000990700,
+000990681,,0,0,5,10,10,10,30,20,0,20,0,0,,000990681,
+000990703,,0,0,5,10,10,10,30,20,0,20,0,0,,000990703,
+000990692,,0,0,5,10,10,10,30,20,0,20,0,0,,000990692,
+000990690,,0,0,5,10,10,10,30,20,0,20,0,0,,000990690,
+000990708,,0,0,10,10,10,10,30,20,0,20,0,0,,000990708,
+055045415,,0,0,5,5,10,10,30,20,0,20,0,0,,055045415,
+000990686,,0,0,5,5,10,10,30,20,0,20,0,0,,000990686,
+18LB058CT,,0,0,10,10,10,10,30,20,0,20,0,0,,18LB058CT,
+000990680,,0,0,5,10,10,10,30,20,0,20,0,0,,000990680,
+000990687,,0,0,10,10,10,10,30,20,0,20,0,0,,000990687,
+000907313,000907313,0,0,10,10,10,10,10,20,0,20,0,0,,000907313,
+000987924,,5,0,10,10,10,10,10,20,0,20,0,0,,000987924,
+18LB051CT,,0,0,10,10,10,10,30,20,0,20,0,0,,18LB051CT,
+18LB044CT,,0,0,10,10,10,10,30,20,0,20,0,0,,18LB044CT,
+000987923,,0,0,10,10,10,10,10,20,0,20,0,0,,000987923,
+000987571,,0,0,10,10,10,10,10,20,0,20,0,0,,000987571,
+000987572,,0,0,10,10,10,10,10,20,0,20,0,0,,000987572,
+18LB027CT,,0,0,10,10,10,10,30,20,0,20,0,0,,18LB027CT,
+18LA990CT,,0,0,30,30,10,10,30,20,0,20,0,0,,18LA990CT,
+18LB561CT,,0,0,30,30,10,10,30,20,0,20,0,0,,18LB561CT,
+000990702,,0,0,5,5,10,10,10,20,0,20,0,0,,000990702,
+000991064,,0,0,5,5,10,10,10,20,0,20,0,0,,000991064,
+000991211,,0,0,5,5,10,10,10,20,0,20,0,0,,000991211,
+000990689,,0,0,5,5,10,10,30,20,0,20,0,0,,000990689,
+000991211,,0,0,10,10,10,10,30,20,0,20,0,0,,000991211,
+000991064,,0,0,10,10,10,10,30,20,0,20,0,0,,000991064,
+000990689,,0,0,10,10,10,10,30,20,0,20,0,0,,000990689,
+055000046,,0,0,5,10,10,10,30,20,0,20,0,0,,055000046,
+000990701,,0,0,10,10,10,10,30,20,0,20,0,0,,000990701,
+000990706,,0,0,10,10,10,10,30,20,0,20,0,0,,000990706,
+000990697,,0,0,10,10,10,10,30,20,0,20,0,0,,000990697,
+BUCHER 7076213,7076213,0,0,10,30,10,10,10,30,0,30,0,0,,7076213,
+000990694,,0,0,5,10,10,10,30,20,0,20,0,0,,000990694,
+000990699,,0,0,10,10,10,10,30,20,0,20,0,0,,000990699,
+SP031.053-R2,,0,0,5,10,10,10,10,30,0,10,0,0,,SP031.053-R2,
+SP031.051-R2,SP031.051-R2,0,0,5,10,10,10,10,30,0,10,0,0,,SP031.051-R2,
+SP031.050-R3,,0,0,5,10,10,10,10,30,0,10,0,0,,SP031.050-R3,
+SP031.052-R2,,0,0,5,10,10,10,10,30,0,10,0,0,,SP031.052-R2,
+16JA603CP,,10,500,10,30,10,10,10,20,0,10,0,0,,16JA603CP,
+16JA605CP,,10,500,10,30,10,10,10,20,0,10,0,0,,16JA605CP,
+18LB348CT,,0,0,10,10,10,10,30,20,0,20,0,0,,18LB348CT,
+18LB347CT,,0,0,10,10,10,10,30,20,0,20,0,0,,18LB347CT,
+18LB349CT,,0,0,20,20,10,10,30,20,0,20,0,0,,18LB349CT,
+18LB348CT,,0,0,30,30,10,10,30,20,0,20,0,0,,18LB348CT,
+18LB349CT,,0,0,30,30,10,10,30,20,0,20,0,0,,18LB349CT,
+18LB347CT,,0,0,30,30,10,10,30,20,0,20,0,0,,18LB347CT,
+000990693,,0,0,5,10,10,10,30,20,0,20,0,0,,000990693,
+18LB346CT,,0,0,30,30,10,10,30,20,0,20,0,0,,18LB346CT,
+18LB350CT,,0,0,30,30,10,10,30,20,0,20,0,0,,18LB350CT,
+000990698,,0,0,10,10,10,10,30,20,0,20,0,0,,000990698,
+000990695,,0,0,10,10,10,10,30,20,0,20,0,0,,000990695,
+000990707,,0,0,5,10,10,10,30,20,0,20,0,0,,000990707,
+ 055017119,,0,0,5,10,10,10,10,4,0,10,0,0,, 055017119,
+3915370,,0,0,10,10,10,10,20,4,0,15,0,0,, 3915370,
+055017118,,0,0,5,10,10,10,10,4,0,10,0,0,, 055017118,
+055017120,,0,0,5,10,10,10,60,3,0,10,0,0,, 055017120,
+055017125,,0,0,5,10,10,10,60,3,0,10,0,0,, 055017125,
+000990705,,0,0,10,10,10,10,30,20,0,20,0,0,,000990705,
+055024035,,0,0,5,10,10,10,20,5,0,10,0,0,, 055024035,
+R56414,,0,0,5,10,10,10,10,10,0,10,0,0,,R56414,
+R56418,,0,0,5,10,10,10,10,10,0,10,0,0,,R56418,
+R56413,,0,0,5,10,10,10,10,10,0,10,0,0,,R56413,
+R56405,,0,0,5,10,10,10,10,10,0,10,0,0,,R56405,
+R56411,,0,0,5,10,10,10,10,10,0,10,0,0,,R56411,
+R56410,,0,0,5,10,10,10,10,10,0,10,0,0,,R56410,
+07N.131.597.A,,5,4000,10,10,10,10,10,30,0,10,0,0,,07N.131.597.A,
+000784883,,0,0,5,5,10,10,10,30,0,10,0,0,, 000784883,
+000985807,,0,0,5,5,10,10,10,30,0,10,0,0,, 000985807,
+SP031.077R1,,0,0,7,15,10,10,5,30,0,30,0,0,,SP031.077-R1,
+800.P.850.1A,,0,0,5,10,10,10,10,30,0,30,0,0,,800.P.850.1A,
+800.P.851.1A,,0,0,5,10,10,10,10,30,0,30,0,0,,800.P.851.1A,
+055018630,,0,200,5,5,10,10,10,50,0,50,1,0,,055018630,
+5803229239,,0,0,5,10,10,10,10,30,0,15,0,0,,5803229239,
+000952005,,0,0,5,10,10,10,10,30,0,15,0,0,,000952005,
+92172962,,0,0,10,20,10,10,10,30,0,30,0,0,,92172962,
+5803229240,,0,0,5,10,10,10,10,30,0,15,0,0,,5803229240,
+PROVA VA0017,,0,0,2,3,10,10,5,0,0,5,0,0,,VA0017,
+V04.030.057.AD,,0,0,5,10,10,10,10,20,0,20,0,0,,V04.030.057.AD,
+5803184400,,0,0,5,10,10,10,10,20,0,20,0,0,,5803184400,
+5803329396,,0,0,5,10,10,10,10,30,0,30,0,0,,5803329396,
+5803329398,,0,0,5,10,10,10,10,30,0,30,0,0,,5803329398,
+5803329442,,0,0,5,10,10,10,10,30,0,30,0,0,,5803329442,
+5803329443,,0,0,5,10,10,10,10,30,0,30,0,0,,5803329443,
+5803313275,,0,0,5,10,10,10,10,30,0,30,0,0,,5803313275,
+5803330518,,0,0,5,10,10,10,10,30,0,30,0,0,,5803330518,
+5803313274,,0,0,5,10,10,10,10,30,0,30,0,0,,5803313274,
+000742336,,0,0,5,5,10,10,10,20,0,20,0,0,,000742336,
+000742332,,0,0,5,5,10,10,10,20,0,20,0,0,,000742332,
+5803293153,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293153,
+5803293154,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293154,
+5803293158,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293158,
+5803293162,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293162,
+5803293142,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293142,
+5803293141,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293141,
+5803293149,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293149,
+5803293157,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293157,
+5803229244,,0,0,5,10,10,10,10,30,0,15,0,0,,5803229244,
+5803229245,,0,0,5,10,10,10,10,30,0,15,0,0,,5803229245,
+5803293143,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293143,
+5803293144,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293144,
+5803293147,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293147,
+5803293148,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293148,
+5803293149,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293149,
+PROVA RIMAC,,0,0,5,10,10,10,20,20,0,20,0,0,,PROVA RIMAC,
+5803293151,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293151,
+5803293150,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293150,
+5803293155,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293155,
+5803293159,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293159,
+055019161,,0,0,5,10,10,10,10,20,0,20,0,0,,055019161,
+5803293156,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293156,
+5803293161,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293161,
+5803293160,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293160,
+5803328789,,0,0,5,10,10,10,10,30,0,15,0,0,,5803328789,
+5803328788,,0,0,5,10,10,10,10,30,0,15,0,0,,5803328788,
+5803439351,,0,0,5,10,10,10,10,30,0,15,0,0,,5803439351,
+5803442534,,0,0,5,10,10,10,10,30,0,15,0,0,,5803442534,
+5803439352,,0,0,5,10,10,10,10,30,0,15,0,0,,5803439352,
+5803442535,,0,0,5,10,10,10,10,30,0,15,0,0,,5803442535,
+5803328907,,0,0,5,10,10,10,10,30,0,15,0,0,,5803328907,
+5803328906,,0,0,5,10,10,10,10,30,0,15,0,0,,5803328906,
+5803293145,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293145,
+5803293155,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293155,
+5803293152,,0,0,5,10,10,10,10,30,0,15,0,0,,5803293152,
+PT00044318,,0,0,5,10,10,10,10,30,0,15,0,0,,PT00044318,
+PT00045408,,0,0,5,10,10,10,10,30,0,15,0,0,,PT00045408,
+5803311633,,0,0,5,5,10,10,10,30,0,30,0,0,,5803311633,
+5803312417,,0,0,5,5,10,10,10,30,0,30,0,0,,5803312417,
+5803312373,,0,0,5,5,10,10,10,30,0,30,0,0,,5803312373,
+5803312291,,0,0,5,5,10,10,10,30,0,30,0,0,,5803312291,
+5803311634,,0,0,5,5,10,10,10,30,0,30,0,0,,5803311634,
+5803311630,,0,0,5,5,10,10,10,30,0,30,0,0,,5803311630,
+5803311632,,0,0,5,5,10,10,10,30,0,30,0,0,,5803311632,
+5803311636,,0,0,5,5,10,10,10,30,0,30,0,0,,5803311636,
+5803312839,,0,0,5,5,10,10,10,30,0,30,0,0,,5803312839,
+5803312781,,0,0,5,5,10,10,10,30,0,30,0,0,,5803312781,
+5803316610,,0,0,5,5,10,10,10,30,0,30,0,0,,5803316610,
+5803316729,,0,0,5,5,10,10,10,30,0,30,0,0,,5803316729,
+5803316718,,0,0,5,5,10,10,10,30,0,30,0,0,,5803316718,
+5803317742,,0,0,5,5,10,10,10,30,0,30,0,0,,5803317742,
+5803321O38,,0,0,5,5,10,10,10,30,0,30,0,0,,5803321038,
+5803311635,,0,0,5,5,10,10,10,30,0,30,0,0,,5803311635,
+5803311631,,0,0,5,5,10,10,10,30,0,30,0,0,,5803311631,
+PT00049591,,0,0,5,10,10,10,10,30,0,15,0,0,,PT00049591,
+PT00049590,,0,0,5,10,10,10,10,30,0,15,0,0,,PT00049590,
+1636050157,,0,0,5,10,10,10,10,30,0,0,0,0,,1636050157,
+580051500,,0,0,5,5,10,10,10,30,0,30,0,0,,580051500,
+5803350485,,0,0,5,5,10,10,10,30,0,30,0,0,,5803350485,
+5803315085,,0,0,5,5,10,10,10,30,0,30,0,0,,5803315085,
+5803350411,,0,0,5,5,10,10,10,30,0,30,0,0,,5803350411,
+5803350392,,0,0,5,5,10,10,10,30,0,30,0,0,,5803350392,
+580051376,,0,0,5,10,10,10,10,30,0,30,0,0,,580051376,
+055020340,,0,0,5,10,10,10,10,20,0,20,0,0,,055020340,
+G04-030-057-BF,VO4-030-057-BF,0,0,5,5,10,10,10,30,0,30,0,0,,V04-030-057-BF,
+5803350506,,0,0,5,10,10,10,10,30,0,15,0,0,,5803350506,
+5803350485,,0,0,5,10,10,10,10,30,0,15,0,0,,5803350485,
+1636050164,,0,0,5,10,10,10,10,30,0,15,0,0,,1636050164,
+1636050159,,0,0,5,10,10,10,10,30,0,15,0,0,,1636050159,
+1636050042,,0,0,5,10,10,10,10,30,0,15,0,0,,1636050042,
+403/S2662,,0,0,10,10,10,10,10,10,0,10,0,0,,403/S2662,
+1636050042,,0,0,5,1,10,10,10,30,0,15,0,0,,1636050042,
+1636050162,,0,0,5,10,10,10,10,30,0,15,0,0,,1636050162,
+1636050158,,0,0,5,10,10,10,10,30,0,15,0,0,,1636050158,
+98FA186CP,98FA186CP,0,2000,5,5,10,10,20,15,0,15,0,0,,98FA186CP,
+5803358645,,0,5000,5,10,10,10,10,30,0,30,0,0,,5803358646,
+5803158291,CPL GASOLIO LP,5,2000,5,10,10,10,20,30,0,0,0,0,,5803158291,C9 CCM FPT
+000784883,,0,0,5,5,10,10,30,20,0,20,0,0,,000784883,
+ FUGA CAL 7 BAR,24001,0,0,5,5,10,10,10,10,0,6,2,1,,FUGA 24001 8MBA,
+5802814210 R.3,j5802814210 R.3,5,3000,5,10,20,20,20,30,3000,30,1,100,,5802814210 R.3,
diff --git a/config/csv_import/ricette st-ten-8 19-09-2024.csv b/config/csv_import/manual_csv_import/ricette st-ten-8 19-09-2024.csv
similarity index 100%
rename from config/csv_import/ricette st-ten-8 19-09-2024.csv
rename to config/csv_import/manual_csv_import/ricette st-ten-8 19-09-2024.csv
diff --git a/config/csv_import/manual_csv_import/ricette.stten6csv.csv b/config/csv_import/manual_csv_import/ricette.stten6csv.csv
new file mode 100644
index 0000000..2010777
--- /dev/null
+++ b/config/csv_import/manual_csv_import/ricette.stten6csv.csv
@@ -0,0 +1,291 @@
+codice_ricetta,cliente,codice_prodotto,dimensione_lotto_abilitata,dimensione_lotto,verifica_connettore_abilitata,connettore,verifica_codice_a_barre_abilitata,codice_a_barre,verifica_resistenza_connettore_abilitata,scala_resistenza,r nominale,tolleranza_resistenza_pos,tolleranza_resistenza_neg,avvitatura_abilitata,viti,prova_tenuta_abilitata,tempo_pre_riempimento,pressione_pre_riempimento,tempo_riempimento,tempo_assestamento,percentuale_minima_pressione_assestamento,percentuale_massima_pressione_assestamento,tempo_di_test,pressione_di_test_delta_minimo,pressione_di_test,pressione_di_test_delta_massimo,tempo_svuotamento,pressione_svuotamento,prova_tenuta_abilitata_2,tempo_pre_riempimento_2,pressione_pre_riempimento_2,tempo_riempimento_2,tempo_assestamento_2,percentuale_minima_pressione_assestamento_2,percentuale_massima_pressione_assestamento_2,tempo_di_test_2,pressione_di_test_delta_minimo_2,pressione_di_test_2,pressione_di_test_delta_massimo_2,tempo_svuotamento_2,pressione_svuotamento_2,test_visione_abilitato,ricetta_visione,stampa_etichetta_abilitata,modello_etichetta
+5801615767,IRISBUS,5801615767,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801615768,IRISBUS,5801615768,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801616061,IRISBUS,5801616061,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802278738,IVECO,5802278738,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802307397,IVECO,5802307397,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802783283,IVECO,5802783283,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820557,IVECO,5802820557,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802981174,IVECO BUS,5802981174,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+6614258A2,argo,6614258A2,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+6645424A2,ARGO TRACTRORS,6645424A2,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+6694527A1,ARGO-TRACTORS,6694527A1,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+8626311,ROSENBAUR,8626311,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+8626312,ROSENBAUR,8626312,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+6671546A3,ARGO TRACTOR,6671546A3,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+6703589A,AVONI,6703589A,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+BR5PLH3000,BIMOTOR,BR5PLH3000,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+BR5PLH2500,BIMOTOR,BR5PLH2500,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+BR5PLH1500,BIMOTOR,BR5PLH1500,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+BR5PLH1000,BIMOTOR,BR5PLH1000,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+BR5SLH1500,BIMOTOR,BR5SLH1500,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+BR5SLH1000,BIMOTOR,BR5SLH1000,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+BR5BLH2500,BIMOTOR,BR5BLH2500,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+BR5BLH1000,BIMOTOR,BR5BLH1000,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+BR5BLH3500,BIMOTOR,BR5BLH3500,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+BR5SLH345,BIMOTOR,BR5SLH345,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+BR5BLH345,BIMOTOR,BR5BLH345,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+7064710,BUCHER,7064710,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+7076215,BUCHER,7076215,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+POS.050-R53581,BUCHER,POS.050-R53581,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+CHF-6157,SUTPHEN,CHF-6157,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+CHF-6158,SUTPHEN,CHF-6158,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+47723585,CNH,47723585,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+47723590,CNH,47723590,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802866956,iveco BRASILE,5802866956,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802867195,IVECO-BRASILE,5802867195,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820701,IVECO BRESC,5802820701,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820711,iveco BRESC,5802820711,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802845278,IVECO,5802845278,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801363631,IVECO,5801363631,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820457,IVECO,5802820457,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820464,IVECO,5802820464,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820493,IVECO,5802820493,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820512,IVECO,5802820512,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820516,IVECO,5802820516,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820525,IVECO,5802820525,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820534,IVECO,5802820534,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820538,IVECO,5802820538,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820548,IVECO,5802820548,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820590,IVECO,5802820590,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820596,IVECO,5802820596,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820681,IVECO,5802820681,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820697,IVECO,5802820697,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802820732,IVECO,5802820732,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801364872,IVECO,5801364872,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801402694,IVECO,5801402694,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801457865,IVECO,5801457865,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801521202,IVECO,5801521202,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+53020608,MANITOU,53020608,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+53020610,MANITOU,53020610,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+53020612,MANITOU,53020612,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+80143869,MANITOWOC,80143869,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+80143870,MANITOWOC,80143870,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+80143871,MANITOWOC,80143871,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+117346,MERLO,117346,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+117347,MERLO,117347,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+117536,MERLO,117536,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+117537,MERLO,117537,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+13-2382,MULTIMATIC,13-2382,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+13-2384,MULTIMATIC,13-2384,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+13-2386,MULTIMATIC,13-2386,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+13-2388,MULTIMATIC,13-2388,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+B6336,MV AGUSTA,B6336,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+B8702,MV AGUSTA,B8702,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+32251,OTOKAR,32251,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+1B001316,PIAGGIO,1B001316,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+2B000116,PIAGGIO,2B000116,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+FUG CALIB3,TEST CIVETTA,FUG CALIB3,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802513111,PREGNANA,5802513111,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+CHF-6156,SUTPHEN,CHF-6156,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+CHF-6157-200,SUTPHEN,CHF-6157-200,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+CHF-6158-200,SUTPHEN,CHF-6158-200,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801919616,SUZZARA,5801919616,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+46628006,ANTONIO CARRARO,46628006,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+46628008,ANTONIO CARRARO,46628008,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+6623494A4,argo,6623494A4,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+6628897A3,argo,6628897A3,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+6671549A3,ARGO TRACTOR,6671549A3,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+6673612A2,ARGO-TRACTORS,6673612A2,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+6688903A2,ARGO TRACTOR,6688903A2,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+6688904A2,ARGO TRACTOR,6688904A2,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+6693686A3,ARGO TRACTOR,6693686A3,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+6693687A3,ARGO TRACTOR,6693687A3,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+16L0167CP,mclaren,16L0167CP,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+MY83-6B747-BA,ASTON MARTIN,MY83-6B747-BA,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+MY83-6B748-BA,ASTON MARTIN,MY83-6B748-BA,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+MY83-6L694-AB,ASTON MARTIN,MY83-6L694-AB,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+MY83-6L701-AB,ASTON MARTIN,MY83-6L701-AB,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+MY83-6L694-AA,ASTON MARTIN,MY83-6L694-AA,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+1636031851,ATLASCOPCO,1636031851,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+1636031854,ATLASCOPCO,1636031854,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+1636031855,ATLASCOPCO,1636031855,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R53221,AUTOMARK,R53221,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+R53222,AUTOMARK,R53222,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+670053160,BEST HOSES,670053160,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+PR321.39-R1,BUGATTI,PR321.39-R1,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+PR499-33-R3,BUGATTI,PR499-33-R3,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+PR499-40-R3,BUGATTI,PR499-40-R3,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+PR499-41-R3,BUGATTI,PR499-41-R3,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+PR499-42-R3,BUGATTI,PR499-42-R3,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+PR499-73-R2,BUGATTI,PR499-73-R2,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+145-3810,CRANE CARRIER,145-3810,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+145-3811,CRANE CARRIER,145-3811,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+145-3812,CRANE CARRIER,145-3812,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+145-3813,CRANE CARRIER,145-3813,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+52607933,MANITOU,52607933,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+52607935,MANITOU,52607935,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+52607941,MANITOU,52607941,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+52631209,MANITOU,52631209,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+52631210,MANITOU,52631210,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+52631211,MANITOU,52631211,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+125584,MERLO,125584,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+128551,MERLO,128551,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+19P003_364,MERLO,19P003_364,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+19P003_365,MERLO,19P003_365,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R52444,MERLO,R52444,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R52445,MERLO,R52445,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+13M26-32252-AA,OTOKAR,13M26-32252-AA,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+13R00-32252-AA,OTOKAR,13R00-32252-AA,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802513100,PREGNANA,5802513100,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802513109,PREGNANA,5802513109,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802513113,PREGNANA,5802513113,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802513114,PREGNANA,5802513114,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+28026890,PRINOTH,28026890,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+28026891,PRINOTH,28026891,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+28026892,PRINOTH,28026892,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+28026893,PRINOTH,28026893,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+28026894,PRINOTH,28026894,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+28026895,PRINOTH,28026895,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+28026896,PRINOTH,28026896,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+28026897,PRINOTH,28026897,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+28026898,PRINOTH,28026898,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+28054871,PRINOTH,28054871,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+52706151,MANITOU,52706151,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+52706152,MANITOU,52706152,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+52706153,MANITOU,52706153,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+63403,MAGNI,63403,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+180.3.827,VENIERI,180.3.827,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+180.3.828,VENIERI,180.3.828,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+180.3.829,VENIERI,180.3.829,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+180.3.830,VENIERI,180.3.830,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+180.3.831,VENIERI,180.3.831,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+180.3.832,VENIERI,180.3.832,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+180.3.838,VENIERI,180.3.838,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+180.3.839,VENIERI,180.3.839,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+A89020507,TECNOGEN,A89020507,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+A89090500,TECNOGEN,A89090500,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+A89100500,TECNOGEN,A89100500,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11K0210CP,MCLAREN,11K0210CP,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11K0235RT,MCLAREN,11K0235RT,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11K0236RT,MCLAREN,11K0236RT,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11K0237RT,MCLAREN,11K0237RT,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+122109,MERLO,122109,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+128551-R54268,MERLO,128551-R54268,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+12970-13-8212,MULTIMATIC,12970-13-8212,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+12KO243CP,MCLAREN,12KO243CP,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+47723530,CNH,47723530,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+504385052,FPT,504385052,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801402690,IVECO,5801402690,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+5801283144,IVECO,5801283144,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+5801354164,Iveco,5801354164,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801355177,IVECO,5801355177,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+5801376020,IVECO,5801376020,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+5801372024,IVECO,5801372024,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+5801436969,IVECO,5801436969,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801503729,IVECO,5801503729,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801615766,IRISBUS,5801615766,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5E.R52814,DIECI,5E.R52814,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+5801668147,IVECO,5801668147,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801668141,IVECO,5801668141,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+117345,MERLO,117345,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+117344,MERLO,117344,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R55205,DEUTZ,R55205,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R55204,DEUTZ,R55204,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R54893,ATLAS COPCO,R54893,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R54822,BIMOTOR,R54822,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R54800,ANDREOLI,R54800,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R54762,ATLAS COPCO,R54762,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R54761/ECL4,ATLAS COPCO,R54761/ECL4,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+R54258,BIMOTOR,R54258,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R54026-1,AVONI,R54026-1,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R54026,ARGO TRACTOR,R54026,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R54021,ARGO TRACTOR,R54021,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R54020,ARGO TRACTOR,R54020,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R53963,SOREMA,R53963,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R53961,SOREMA,R53961,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R53959,SOREMA,R53959,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R53957,SOREMA,R53957,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R53927,MERLO,R53927,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R53861,ARGO TRACTOR,R53861,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R53849,ARGO TRACTOR,R53849,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R53848,ARGO TRACTOR,R53848,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R53847,ARGO TRACTOR,R53847,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R53390,DIECI,R53390,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R53293,KAHA,R53293,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R53223,AUTOMARK,R53223,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+5802951920,IVECO,5802951920,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+5801690154,IVECO,5801690154,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801690155,IVECO,5801690155,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+B4901,MV AGUSTA,B4901,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+503146253,MAGIRUS,503146253,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+503146900 DX,MAGIRUS,503146900 DX,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+125637,MERLO,125637,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+13H30-32256-AA,OTOKAR,13H30-32256-AA,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+13M26-32256-AA,OTOKAR,13M26-32256-AA,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+503146256 SX,MAGIRUS,503146256 SX,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+6703586A1,ARGO,6703586A1,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+19901416000,INTERPUMP,19901416000,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,2000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+36001,TEREX,36001,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+36002,TEREX,36002,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801460021,IVECO,5801460021,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801460025,IVECO,5801460025,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802845277,IVECO,5802845277,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,10000,30,1,100,x,0,1000,10,10,5,5,10,30,10000,30,3,100,False,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R55145,DEUTZ,R55145,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5803018238,IVECO,5803018238,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,10,10,10,30,18000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+5803018239,IVECO,5803018239,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,10,10,10,30,18000,30,1,100,,0,1000,10,10,5,5,10,30,18000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+5803018244,IVECO,5803018244,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,10,10,10,30,18000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+7064708,BUCHER,7064708,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+7067082,BUCHER,7067082,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+7080623,BUCHER,7080623,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+53027246,MANITOU,53027246,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+53027247,MANITOU,53027247,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+53027248,MANITOU,53027248,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+53027252,MANITOU,53027252,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+53027253,MANITOU,53027253,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802527206,PREGNANA,5802527206,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+7081272-ECL3,BUCHER,7081272-ECL3,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_2prove.prn
+11K0218CP,MCLAREN,11K0218CP,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+51513901,CNH-LECCE,51513901,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+51513904,CNH-LECCE,51513904,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5801395749,IVECO,5801395749,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+6603139A4,ARGO-TRACTORS,6603139A4,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,20,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802540646,IVECO,5802540646,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,10,10,10,10,10,10,10,3,4300,30,0,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+5802845274,IVECO,5802845274,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+5802915400,IVECO,5802915400,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+6658115A2,ARGO-TRACTORS,6658115A2,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+6658115A4,ARGO-TRACTORS,6658115A4,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,15,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+125583,MERLO,125583,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+6683267A2,ARGO-TRACTORS,6683267A2,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,15,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+47886643,CNH-LECCE,47886643,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,20,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+R56763,STERKI,R56763,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+R56759,STERKI,R56759,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+6703537A2,ARGO,6703537A2,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+5802752024,IVECO,5802752024,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5802754968,PREGNANA,5802754968,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+5802845275,IVECO,5802845275,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+131295,MERLO,131295,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,15,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+5803143177,IVECO,5803143177,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,2500,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+5802845276,IVECO FRANCE,5802845276,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+R52763,AUTOMARK,R52763,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+R52764,AUTOMARK,R52764,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+R52765,AUTOMARK,R52765,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_1prova.prn
+5802892528,IVECO FRANCE,5802892528,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+5802892531,IVECO FRANCE,5802892531,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+19872.00.35,DELL ORTO,19872.00.35,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,20,30,9000,30,0,100,,0,1000,10,10,5,5,20,30,9000,5,1,100,False,000952054.ini,x,ETA30x16_203dpi.prn
+19799.00.35,DELL ORTO,19799.00.35,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,20,30,9000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,ETA30x16_203dpi.prn
+000746453,FERRARI,000746453,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,10500,30,1,100,,0,1000,10,10,5,5,10,30,10000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+10005330,CAPACITY TRUCKS,10005330,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+10006718,CAPACITY TRUCKS,10006718,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+112247,MERLO,112247,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+112248,MERLO,112248,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11519588,VAN HOOL,11519588,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11519589,VAN HOOL,11519589,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11519590,VAN HOOL,11519590,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11556236,VAN HOOL,11556236,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11556237,VAN HOOL,11556237,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11578030,VAN HOOL,11578030,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,000952054.ini,x,EtichettaR5_Montaggio_1prova.prn
+11585242,VAN HOOL,11585242,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11604514,VAN HOOL,11604514,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,30,30,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11607305,VAN HOOL,11607305,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11627962,VAN HOOL,11627962,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,20,10,5,5,10,30,7000,30,1,100,x,0,1000,20,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11642860,VAN HOOL,11642860,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11642861,VAN HOOL,11642861,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11650475,VAN HOOL,11650475,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11650477,VAN HOOL,11650477,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11650478,VAN HOOL,11650478,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11650479,VAN HOOL,11650479,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11650481,VAN HOOL,11650481,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+11650484,VAN HOOL,11650484,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+117342,MERLO,117342,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,7000,30,1,100,x,0,1000,10,10,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,EtichettaR5_Montaggio_2prove.prn
+117343,MERLO,117343,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,20,30,9000,30,1,100,,0,1000,10,10,5,5,10,30,15000,30,1,100,False,termorestringente_923578.ini,x,ETA30x16_203dpi.prn
diff --git a/config/csv_import/st-ten-11.csv b/config/csv_import/manual_csv_import/st-ten-11.csv
similarity index 100%
rename from config/csv_import/st-ten-11.csv
rename to config/csv_import/manual_csv_import/st-ten-11.csv
diff --git a/config/csv_import/st-ten-8.csv b/config/csv_import/manual_csv_import/st-ten-8.csv
similarity index 100%
rename from config/csv_import/st-ten-8.csv
rename to config/csv_import/manual_csv_import/st-ten-8.csv
diff --git a/config/csv_import/st-ten-9.csv b/config/csv_import/manual_csv_import/st-ten-9.csv
similarity index 100%
rename from config/csv_import/st-ten-9.csv
rename to config/csv_import/manual_csv_import/st-ten-9.csv
diff --git a/config/csv_import/test_doppia_prova_tenuta.csv b/config/csv_import/manual_csv_import/test_doppia_prova_tenuta.csv
similarity index 100%
rename from config/csv_import/test_doppia_prova_tenuta.csv
rename to config/csv_import/manual_csv_import/test_doppia_prova_tenuta.csv
diff --git a/config/csv_import/test_import_himatic my24.csv b/config/csv_import/manual_csv_import/test_import_himatic my24.csv
similarity index 100%
rename from config/csv_import/test_import_himatic my24.csv
rename to config/csv_import/manual_csv_import/test_import_himatic my24.csv
diff --git a/config/csv_import/test_import_himatic.csv b/config/csv_import/manual_csv_import/test_import_himatic.csv
similarity index 100%
rename from config/csv_import/test_import_himatic.csv
rename to config/csv_import/manual_csv_import/test_import_himatic.csv
diff --git a/config/csv_import/test_import_himatic.xlsx b/config/csv_import/manual_csv_import/test_import_himatic.xlsx
similarity index 100%
rename from config/csv_import/test_import_himatic.xlsx
rename to config/csv_import/manual_csv_import/test_import_himatic.xlsx
diff --git a/config/csv_import/test_import_leak_only.csv b/config/csv_import/manual_csv_import/test_import_leak_only.csv
similarity index 100%
rename from config/csv_import/test_import_leak_only.csv
rename to config/csv_import/manual_csv_import/test_import_leak_only.csv
diff --git a/config/csv_import/test_tecna_upload.csv b/config/csv_import/manual_csv_import/test_tecna_upload.csv
similarity index 100%
rename from config/csv_import/test_tecna_upload.csv
rename to config/csv_import/manual_csv_import/test_tecna_upload.csv
diff --git a/config/csv_import/tst.csv b/config/csv_import/manual_csv_import/tst.csv
similarity index 100%
rename from config/csv_import/tst.csv
rename to config/csv_import/manual_csv_import/tst.csv
diff --git a/config/csv_import/test.py b/config/csv_import/test.py
deleted file mode 100644
index cf35294..0000000
--- a/config/csv_import/test.py
+++ /dev/null
@@ -1,12 +0,0 @@
-import csv
-import itertools
-
-# DOES NOT WORK
-def lower_first(iterator):
- return itertools.chain([next(iterator).lower()], iterator)
-
-with open("Tabella Tubi riscaldati - COMPLETA rev19_29-12-2022.csv", 'rU') as datafile:
- csvDict = csv.DictReader(lower_first(datafile))
- for ucrow in csvDict:
- row = dict((k.lower(), v) for k, v in ucrow.items()) # WORKS
- print(row)
\ No newline at end of file
diff --git a/config/instruction_images/generic/DEFAULT.svg b/config/instruction_images/generic/DEFAULT.svg
new file mode 100644
index 0000000..facc0bb
--- /dev/null
+++ b/config/instruction_images/generic/DEFAULT.svg
@@ -0,0 +1,49 @@
+
+
+
+
diff --git a/config/instruction_images/st-ten-11/07N131628.svg b/config/instruction_images/st-ten-11/07N131628.svg
index 332702c..b62724a 100644
--- a/config/instruction_images/st-ten-11/07N131628.svg
+++ b/config/instruction_images/st-ten-11/07N131628.svg
@@ -4,9 +4,9 @@
diff --git a/config/instruction_images/st-ten-11/18JA708CP.svg b/config/instruction_images/st-ten-11/18JA708CP.svg
new file mode 100644
index 0000000..ee32042
--- /dev/null
+++ b/config/instruction_images/st-ten-11/18JA708CP.svg
@@ -0,0 +1,68 @@
+
+
+
+
diff --git a/config/instruction_images/st-ten-11/18JA709CP.svg b/config/instruction_images/st-ten-11/18JA709CP.svg
new file mode 100644
index 0000000..a91c6be
--- /dev/null
+++ b/config/instruction_images/st-ten-11/18JA709CP.svg
@@ -0,0 +1,80 @@
+
+
+
+
diff --git a/config/instruction_images/st-ten-11/18JA710CP.svg b/config/instruction_images/st-ten-11/18JA710CP.svg
new file mode 100644
index 0000000..2c2b0b9
--- /dev/null
+++ b/config/instruction_images/st-ten-11/18JA710CP.svg
@@ -0,0 +1,48 @@
+
+
+
+
diff --git a/config/instruction_images/st-ten-11/18JA712CP.svg b/config/instruction_images/st-ten-11/18JA712CP.svg
new file mode 100644
index 0000000..8343eb1
--- /dev/null
+++ b/config/instruction_images/st-ten-11/18JA712CP.svg
@@ -0,0 +1,70 @@
+
+
+
+
diff --git a/config/instruction_images/st-ten-11/18JA713CP.svg b/config/instruction_images/st-ten-11/18JA713CP.svg
new file mode 100644
index 0000000..7739628
--- /dev/null
+++ b/config/instruction_images/st-ten-11/18JA713CP.svg
@@ -0,0 +1,128 @@
+
+
+
+
diff --git a/config/instruction_images/st-ten-11/18JA718CP.svg b/config/instruction_images/st-ten-11/18JA718CP.svg
new file mode 100644
index 0000000..3cf3f24
--- /dev/null
+++ b/config/instruction_images/st-ten-11/18JA718CP.svg
@@ -0,0 +1,48 @@
+
+
+
+
diff --git a/config/instruction_images/st-ten-11/18JA750CP.svg b/config/instruction_images/st-ten-11/18JA750CP.svg
new file mode 100644
index 0000000..0b3bb27
--- /dev/null
+++ b/config/instruction_images/st-ten-11/18JA750CP.svg
@@ -0,0 +1,48 @@
+
+
+
+
diff --git a/config/instruction_images/st-ten-11/18JA757CP.svg b/config/instruction_images/st-ten-11/18JA757CP.svg
new file mode 100644
index 0000000..ba538cb
--- /dev/null
+++ b/config/instruction_images/st-ten-11/18JA757CP.svg
@@ -0,0 +1,48 @@
+
+
+
+
diff --git a/config/label_designs/FERRARI/ferrari_flag_qr_only.nlbl b/config/label_designs/FERRARI/ferrari_flag_qr_only.nlbl
new file mode 100644
index 0000000..0975990
Binary files /dev/null and b/config/label_designs/FERRARI/ferrari_flag_qr_only.nlbl differ
diff --git a/config/label_designs/LAMBORGHINI/Lamborghini_label.nlbl b/config/label_designs/LAMBORGHINI/Lamborghini_label.nlbl
new file mode 100644
index 0000000..3644cb5
Binary files /dev/null and b/config/label_designs/LAMBORGHINI/Lamborghini_label.nlbl differ
diff --git a/config/label_designs/LAMBORGHINI/Lamborghini_test.nlbl b/config/label_designs/LAMBORGHINI/Lamborghini_test.nlbl
new file mode 100644
index 0000000..d2c10ba
Binary files /dev/null and b/config/label_designs/LAMBORGHINI/Lamborghini_test.nlbl differ
diff --git a/config/label_designs/MCLAREN/MCLAREN_TEMPLATE.nlbl b/config/label_designs/MCLAREN/MCLAREN_TEMPLATE.nlbl
new file mode 100644
index 0000000..4343446
Binary files /dev/null and b/config/label_designs/MCLAREN/MCLAREN_TEMPLATE.nlbl differ
diff --git a/config/label_designs/PROTOTIPI/ERRECINQUE_flag_qr_only.nlbl b/config/label_designs/PROTOTIPI/ERRECINQUE_flag_qr_only.nlbl
new file mode 100644
index 0000000..447cfa9
Binary files /dev/null and b/config/label_designs/PROTOTIPI/ERRECINQUE_flag_qr_only.nlbl differ
diff --git a/config/label_templates/ERRECINQUE_flag_qr_only.prn b/config/label_templates/ERRECINQUE_flag_qr_only.prn
new file mode 100644
index 0000000..1bb6d79
--- /dev/null
+++ b/config/label_templates/ERRECINQUE_flag_qr_only.prn
@@ -0,0 +1,20 @@
+CT~~CD,~CC^~CT~
+^XA~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR2,2~SD25^JUS^LRN^CI0^XZ
+^XA
+^MMT
+^PW320
+^LL1039
+^LS0
+^FO32,128^GFA,06144,06144,00032,:Z64:
+eJzt10Fr5DYUAGAZw+gSoj2mNKC/sF1f9lDQsX8jS6H9FyuHwM4lsNfCHvI39laXwOZimp+wDoXtsQ65qCD0+mTLHrl+stIuhbZEF8/4G9vvSU+Sh7Gn9i9opdl2nrl+x54lpPj9snq4/XDvdg/vPpSMA4D1p/EIw5OLyxcvW1694dXXwU1wF/zspD2u2HH1si2ZCF7Ofn/5rbltK3ZUPW93ay8eTr+/37dV4/147aw6/fRV3Vb26LvnrSPu//Dbr79ctWen4tOry/H6Prgdeubu529urk7OjuSbVz/smAw+5Tn2Qc3Y6QljJ0e0++8G/Qub9h4v/jLt//G2y7jYVM3kVT18KlZ1zMGV0AnoeS+vjQAGcNOrt52WQz+iW44Ihht0CXXw1wcXiPgrIy+MgmZyNbv0P3HcomvoBheNCy4Gl8Fx8AD2XeSssPInKy2g73vHe6b2nUbHIQ+uzq2yWjg1ea9Fh95NXlvlBr+3pXejRT97aby/VwLwQj/R1QUARs1EN8Zv/P2feefeNZz7LsOQZy+sZkp8/DF4icnErr1r8RGCY5eLtctbwCdyzB+D9ymPjpWPrka/M3gLnzyGxGQT4h/cyZvJ5egieK99ik7unbiz+IjRzXQ971+jXzt5ge5kx0DeWXU9OQ4zuh8idBy8a3D4RWHUMLnzbuS5k83gQ3JLx/pS3jVckM6h8yE2CnvWdy6WFEA9eufKvoBaMSsbYdCZNoWvk3qz6J/aqg2bCrYm4Tx4l3ARPLUZTu4yDjlPBCjGGxdhZVh7WPF1IkAeApOJAHkoKZEorTIEVqYCnJasVIDaLo9/bvKRAfJkgN3imAqQfXaAiSF8bIBFNsDEECq7PK4ChMcG2PzDASaGcApMJAIUmQDVdoDFPDs1OcR8fi1SZAJynp2C7GE1512SCR7mdkF5PDOoDoiz1oTHvabqtUu77SrqFNmsXXcZr7c9zkmsfdEnhJf285ybjPfbLmIn8htfif6+L04R45P1+JRe++ISor5iLyiPPlP1HTsn5kfskvC4pKkFxHs5bYLE/PXONzZJ7/MmWmc8d32XeX4i/uklg/r7FedP7XGL/s04OX51/LB624n6Wnqz8kX95eo754vJQpzKOf/rvpj/lJttL3Nut32x/uWcyH+5vhIejznpzeEztX6rbttl1AHU/hJvmkT94eQ5fKb2v+jNkqrveP+k5gfedD5LrT9+/4aN+Tvu/+n1J5r9iX8JxcEbyqMASN5cXhYR1gl/ak/t/9P+AGyhc1w=:83DC
+^FT293,614^A0I,25,21^FH\^FD{DD}/{MO}/{YY}^FS
+^FT145,614^A0I,25,21^FH\^FD{HH}:{MI}:{SS}^FS
+^FT291,952^A0I,25,24^FH\^FDNumero Disegno^FS
+^FT293,645^A0I,25,24^FH\^FDData/Ora Prova^FS
+^FT293,691^A0I,25,24^FH\^FDN. Pezzo:^FS
+^FT185,690^A0I,25,24^FH\^FD{SN5}^FS
+^BY120,120^FT289,803^BXI,6,200,0,0,1,~
+^FH\^FD{PART}{MO}{YY}{SN5}^FS
+^FT291,752^A0I,25,24^FH\^FD{PART}{MO}{YY}{SN5}^FS
+^FT293,558^A0I,25,24^FH\^FDEsito : CONFORME^FS
+^PQ1,0,1,Y^XZ
diff --git a/config/label_templates/ETA30x16_203dpi.prn b/config/label_templates/ETA30x16_203dpi.prn
new file mode 100644
index 0000000..4612fb0
--- /dev/null
+++ b/config/label_templates/ETA30x16_203dpi.prn
@@ -0,0 +1,14 @@
+CT~~CD,~CC^~CT~
+^XA~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR2,2~SD20^JUS^LRN^CI0^XZ
+^XA
+^MMT
+^PW256
+^LL0144
+^LS0
+^FT148,125^BQN,2,4
+^FH\^FDLA,{PART}^FS
+^FT19,40^A0N,23,21^FH\^FD{PART}^FS
+^FT19,71^A0N,23,21^FH\^FDNum:{SN5}^FS
+^FT19,101^A0N,23,21^FH\^FD{DATE}^FS
+^FT19,126^A0N,23,21^FH\^FD{TIME}^FS
+^PQ1,0,1,Y^XZ
diff --git a/config/label_templates/F164F169_203.prn b/config/label_templates/F164F169_203.prn
new file mode 100644
index 0000000..e28cda1
--- /dev/null
+++ b/config/label_templates/F164F169_203.prn
@@ -0,0 +1,53 @@
+CT~~CD,~CC^~CT~
+^XA
+~TA000
+~JSN
+^LT0
+^MNW
+^MTT
+^PON
+^PMN
+^LH0,0
+^JMA
+^PR2,2
+~SD15
+^JUS
+^LRN
+^CI27
+^PA0,1,1,0
+^XZ
+^XA
+^MMT
+^PW320
+^LL1119
+^LS0
+^FT27,493^A0N,25,23^FH\^CI28^FD{DD}/{MO}/{YY}^FS^CI27
+^FT175,493^A0N,25,23^FH\^CI28^FD{HH}:{MI}:{SS}^FS^CI27
+^FT18,1013^A0N,31,30^FH\^CI28^FDESITO:^FS^CI27
+^FT144,1013^A0N,31,30^FH\^CI28^FDCONFORME^FS^CI27
+^FT29,87^A0N,25,25^FH\^CI28^FDNumero Disegno^FS^CI27
+^FT27,462^A0N,25,25^FH\^CI28^FDData/Ora Prova^FS^CI27
+^FT27,530^A0N,25,25^FH\^CI28^FDStazione: {STATION}^FS^CI27
+^FT27,416^A0N,25,25^FH\^CI28^FDN. Pezzo:^FS^CI27
+^FT135,417^A0N,25,25^FH\^CI28^FD{SN5}^FS^CI27
+^FT27,562^A0N,25,25^FH\^CI28^FDOPERATORE: {OPERATOR}^FS^CI27
+^FO52,649^GB215,0,8^FS
+^FT19,705^A0N,25,25^FH\^CI28^FDP. prova:^FS^CI27
+^FT19,737^A0N,25,25^FH\^CI28^FDP. rilevata:^FS^CI27
+^FT145,737^A0N,25,25^FH\^CI28^FD{RESPSET}mbar^FS^CI27
+^FT19,764^A0N,25,25^FH\^CI28^FDCaduta ammessa:^FS^CI27
+^FT206,764^A0N,25,25^FH\^CI28^FD{PMIN} mbar^FS^CI27
+^FT19,797^A0N,25,25^FH\^CI28^FDCaduta rilevata:^FS^CI27
+^FT179,797^A0N,25,25^FH\^CI28^FD{RESLEAK} mbar^FS^CI27
+^FT19,908^A0N,25,25^FH\^CI28^FDT.Prova^FS^CI27
+^FT207,912^A0N,25,25^FH\^CI28^FD{TTEST} s^FS^CI27
+^FT18,864^A0N,25,25^FH\^CI28^FDT.Riempim.^FS^CI27
+^FT207,864^A0N,25,25^FH\^CI28^FD{TFILL} s^FS^CI27
+^FT19,886^A0N,25,25^FH\^CI28^FDT.Stabilizzazione^FS^CI27
+^FT207,888^A0N,25,25^FH\^CI28^FD{TSET} s^FS^CI27
+^FT145,705^A0N,25,25^FH\^CI28^FD{PTEST} mbar^FS^CI27
+^FT31,236^BXN,6,200,0,0,1,_,1
+^FH\^FD{PART}{MO}{YY}{SN5}^FS
+^FT29,287^A0N,25,25^FH\^CI28^FD{PART}{MO}{YY}{SN5}^FS^CI27
+^PQ1,0,1,Y
+^XZ
diff --git a/config/label_templates/ferrari_flag_qr_only.prn b/config/label_templates/ferrari_flag_qr_only.prn
new file mode 100644
index 0000000..bb80f3f
--- /dev/null
+++ b/config/label_templates/ferrari_flag_qr_only.prn
@@ -0,0 +1,34 @@
+CT~~CD,~CC^~CT~
+^XA
+~TA000
+~JSN
+^LT0
+^MNW
+^MTT
+^PON
+^PMN
+^LH0,0
+^JMA
+^PR2,2
+~SD15
+^JUS
+^LRN
+^CI27
+^PA0,1,1,0
+^XZ
+^XA
+^MMT
+^PW320
+^LL1119
+^LS0
+^FT27,425^A0N,25,23^FH\^CI28^FD{DD}/{MO}/{YY}^FS^CI27
+^FT175,425^A0N,25,23^FH\^CI28^FD{HH}:{MI}:{SS}^FS^CI27
+^FT29,87^A0N,25,25^FH\^CI28^FDNumero Disegno^FS^CI27
+^FT27,394^A0N,25,25^FH\^CI28^FDData/Ora Prova^FS^CI27
+^FT27,348^A0N,25,25^FH\^CI28^FDN. Pezzo:^FS^CI27
+^FT135,349^A0N,25,25^FH\^CI28^FD{SN5}^FS^CI27
+^FT31,236^BXN,6,200,0,0,1,_,1
+^FH\^FD{PART}{MO}{YY}{SN5}^FS
+^FT29,287^A0N,25,25^FH\^CI28^FD{PART}{MO}{YY}{SN5}^FS^CI27
+^PQ1,0,1,Y
+^XZ
diff --git a/config/label_templates/st-ten-11/Lamborghini_label.prn b/config/label_templates/st-ten-11/Lamborghini_label.prn
new file mode 100644
index 0000000..fc7b766
--- /dev/null
+++ b/config/label_templates/st-ten-11/Lamborghini_label.prn
@@ -0,0 +1,29 @@
+CT~~CD,~CC^~CT~
+^XA
+~TA000
+~JSN
+^LT0
+^MNW
+^MTT
+^PON
+^PMN
+^LH0,0
+^JMA
+^PR2,2
+~SD20
+^JUS
+^LRN
+^CI27
+^PA0,1,1,0
+^XZ
+^XA
+^MMT
+^PW192
+^LL240
+^LS0
+^FT19,173^BXN,7,200,0,0,1,_,1
+^FH\^FD#{RECIPE}###{DD}{MO}{YY}*\0D\0A^FS
+^FT20,205^A0N,25,25^FH\^CI28^FD#{RECIPE}###^FS^CI27
+^FT19,230^A0N,22,23^FH\^CI28^FD{DD}/{MO}/{YY}*^FS^CI27
+^PQ1,0,1,Y
+^XZ
diff --git a/config/label_templates/st-ten-11/Lamborghini_lable.prn b/config/label_templates/st-ten-11/Lamborghini_lable.prn
new file mode 100644
index 0000000..7349e8b
--- /dev/null
+++ b/config/label_templates/st-ten-11/Lamborghini_lable.prn
@@ -0,0 +1,34 @@
+CT~~CD,~CC^~CT~
+^XA
+~TA000
+~JSN
+^LT0
+^MNW
+^MTT
+^PON
+^PMN
+^LH0,0
+^JMA
+^PR2,2
+~SD20
+^JUS
+^LRN
+^CI27
+^PA0,1,1,0
+^XZ
+^XA
+^MMT
+^PW192
+^LL240
+^LS0
+^FT19,173^BXN,7,200,0,0,1,_,1
+^FH\^FD#{RECIPE}###{DD}{MO}{YY}*\0D\0A^FS
+^FT9,204^A0N,24,23^FH\^CI28^FD#^FS^CI27
+^FT20,205^A0N,25,25^FH\^CI28^FD{RECIPE}^FS^CI27
+^FT118,204^A0N,24,23^FH\^CI28^FD#^FS^CI27
+^FT129,204^A0N,24,23^FH\^CI28^FD#^FS^CI27
+^FT141,204^A0N,24,23^FH\^CI28^FD#^FS^CI27
+^FT2,227^A0N,22,23^FH\^CI28^FD{DD}/{MO}/{YY}^FS^CI27
+^FT170,232^A0N,28,28^FH\^CI28^FD*^FS^CI27
+^PQ1,0,1,Y
+^XZ
diff --git a/config/label_templates/st-ten-11/Mclaren_label.prn b/config/label_templates/st-ten-11/Mclaren_label.prn
new file mode 100644
index 0000000..df7df02
--- /dev/null
+++ b/config/label_templates/st-ten-11/Mclaren_label.prn
@@ -0,0 +1,29 @@
+CT~~CD,~CC^~CT~
+^XA
+~TA000
+~JSN
+^LT0
+^MNW
+^MTT
+^PON
+^PMN
+^LH0,0
+^JMA
+^PR2,2
+~SD25
+^JUS
+^LRN
+^CI27
+^PA0,1,1,0
+^XZ
+^XA
+^MMT
+^PW320
+^LL1039
+^LS0
+^FO73,37^GFA,329,672,24,:Z64:eJx10D2OhDAMBWBGKVLmCBwlR0s6rkXHNWC2SItEAVJM3jzzs6PVBhDNZ+I8u2lqj52r3ECq7B48oNTYoO7uwf2DA9V7zYO7aFCb63KzNTz1+nMSPXchauaft8IKfvih8b0vhhgi04oTg0U9hjHgcD0jXjyy+oQFGFjnWC9IEJy+YAUS0G86heD2zIm0NI6Mg50v+zN4hpOWPmkc/rJDcwbk4sSvEqZ4LG89XPsUrjiJfzNOSJebywfxo8YckHbEr3eHG3QYdo2Sv32OOBZdxZ2wIr9ub283W6yE0xcu7fbZcp8tdcO51DS3HOsDi7sZvg==:29D1
+^FT91,110^A0N,31,30^FH\^CI28^FD{PART}^FS^CI27
+^FT97,152^A0N,32,33^FH\^CI28^FD{YY} T {JJJ}^FS^CI27
+^FT12,222^A0N,32,25^FH\^CI28^FDLEAK RESULT {RESULT}^FS^CI27
+^PQ1,0,1,Y
+^XZ
diff --git a/config/label_templates/st-ten-11/ferrari_30x16_203.prn b/config/label_templates/st-ten-11/ferrari_30x16_203.prn
new file mode 100644
index 0000000..53b6b78
--- /dev/null
+++ b/config/label_templates/st-ten-11/ferrari_30x16_203.prn
@@ -0,0 +1,30 @@
+CT~~CD,~CC^~CT~
+^XA
+~TA000
+~JSN
+^LT0
+^MNW
+^MTT
+^PON
+^PMN
+^LH0,0
+^JMA
+^PR2,2
+~SD15
+^JUS
+^LRN
+^CI27
+^PA0,1,1,0
+^XZ
+^XA
+^MMT
+^PW256
+^LL144
+^LS0
+^FT21,129^BQN,2,4
+^FH\^FDLA,{PART}{SN5}{MO}{YY}^FS
+^FT234,104^A0I,23,23^FH\^CI28^FD{PART}^FS^CI27
+^FT234,50^A0I,23,23^FH\^CI28^FDN:{SN5}^FS^CI27
+^FT234,23^A0I,23,23^FH\^CI28^FD{DD}/{MO}/{YY}^FS^CI27
+^PQ1,0,1,Y
+^XZ
diff --git a/config/machine_settings/defaults.ini b/config/machine_settings/defaults.ini
index 1182755..37534a4 100644
--- a/config/machine_settings/defaults.ini
+++ b/config/machine_settings/defaults.ini
@@ -50,6 +50,18 @@ minimum_disk_free_space_gb: 20
resize_resolution: 612x512
[archive_synchronizer]
+portal_address: https://r5portal.it/
+archive_root:api/st-ten-save/
+status_root:api/device-info-update/
+download_root:media/uploads/
+
+images_path: data/images
+poll_time: 60
+hold_time: 30
+service_account_json: config/machine_settings/gcloud_default.json
+bucket_id: st_ten_img
+
+[archive_synchronizer_extra]
archive_endpoint: https://r5portal.it/api/st-ten-save/
images_path: data/images
poll_time: 60
diff --git a/config/machine_settings/hostnames.ini b/config/machine_settings/hostnames.ini
index dfdc1c7..481d08c 100644
--- a/config/machine_settings/hostnames.ini
+++ b/config/machine_settings/hostnames.ini
@@ -12,4 +12,6 @@ st-ten-10: st-ten-10
st-ten-11: st-ten-11
st-ten-12: st-ten-12
st-ten-13: st-ten-13
+st-ten-14: st-ten-14
+test-linux: test-linux
diff --git a/config/machine_settings/st-ten-1-linux.ini b/config/machine_settings/st-ten-1-linux.ini
index 7561095..b88254e 100644
--- a/config/machine_settings/st-ten-1-linux.ini
+++ b/config/machine_settings/st-ten-1-linux.ini
@@ -1,66 +1,107 @@
[machine]
-description = ST-TEN-2 - COLLAUDO TUBI RISCALDATI VOLPIANO
-instruction_folder = st-ten-2
-image_for_warning= st-ten-2
+description = ST-TEN-1
+instruction_folder = st-ten-1
+image_for_warning= st-ten-1
[hardware_config]
archive_synchronizer: present
+galaxy_camera: absent
+uvc_camera: absent
label_printer: present
+neo_pixels: absent
remote_api: absent
tecna_t3: present
-
-[digital_io]
-# OUTPUT MAP FOR EXTERNAL FLUSH/BLOW UNIT
-id_flush_blow: USB-5860,BID#0
-blow_on: 0 # INPUT VALVE TO SERVICE AIR
-flush_on: 1 # OUTPUT VALVE TO DIRT COLLECTOR
-blow_led:2 # CLEAN INDICATOR
-test_on_led:3 # LEAK TEST ACTIVE INDICATOR
-flush_led:4 # FLUSH INDICATOR
+vision_saver: absent
+vision: absent
+screwdriver: absent
+fixture_id: absent
+digital_io: present
+external_flush_blow: absent
[tecna_t3]
port: /dev/ttyUSB0
+model: t3l
+
+[fixture_rfid]
+port: COM5
+
+[digital_io]
+# OUTPUT MAP FOR FIXTURE CONNECTOR
+id_fixture: USB-5862,BID#0
+discard_idx:12 # BIT NUMBER OF THE I/0 MODULE USED FOR DISCARD SENSING
[recipe]
-recipe_name_field: cod finito cliente
-part_number_field: cod finito r5
-barcode_enable_field: verifica_codice_a_barre_abilitata
-barcode_serial_field: codice_a_barre
-label_template_field: etichetta
-description_field: cod semilavorato costampato
+recipe_name_field: codice_ricetta
+part_number_field: codice_prodotto
+label_template_field: modello_etichetta
+description_field: descrizione
+
+[label_printer]
+platform: windows
+printer: zd420
[recipes_defaults]
-prova_tenuta_abilitata: x
+tester_discharge_enable: yes
+codice_ricetta: specificare ricetta
+cliente: IVECO
+part_number: specificare part number
+canale_di_prova: 0
warning_img:
+
+dimensione_lotto_abilitata:
n_componenti:1
+istruzione_abilitata: x
+numero nastri (n):0
+numero sensori anello (sa):0
+numero sensori presenza (sp):0
+
+prova_tenuta_abilitata: x
tempo_pre_riempimento: 0
-pressione_pre_riempimento: 1000
-tempo_riempimento: 10
+pressione_pre_riempimento: 5000
+tempo_riempimento: 5
tempo_assestamento: 10
percentuale_minima_pressione_assestamento: 5
percentuale_massima_pressione_assestamento: 5
tempo_di_test: 10
pressione_di_test_delta_minimo: 30
-pressione_di_test: 15000
+pressione_di_test: 5000
pressione_di_test_delta_massimo: 30
tempo_svuotamento: 1
pressione_svuotamento: 100
-canale_di_prova: 0
-tester_discharge_enable: yes
+
+prova_tenuta_abilitata_2:
+tempo_pre_riempimento_2: 0
+pressione_pre_riempimento_2: 1000
+tempo_riempimento_2: 5
+tempo_assestamento_2: 5
+percentuale_minima_pressione_assestamento_2: 5
+percentuale_massima_pressione_assestamento_2: 5
+tempo_di_test_2: 5
+pressione_di_test_delta_minimo_2: 200
+pressione_di_test_2: 1000
+pressione_di_test_delta_massimo_2: 200
+tempo_svuotamento_2: 1
+pressione_svuotamento_2: 100
+
+stampa_etichetta_abilitata: x
+modello_etichetta: ETA30x16_203dpi.prn
+descrizione: inserire descrizione ricetta
[autotest_leak]
enabled: true
pre_filling_time: 0
pre_filling_pressure: 1000
-filling_time: 5
+filling_time: 10
settling_time: 10
settling_pressure_min_percent: 5
settling_pressure_max_percent: 5
+test_pressure: 7000
test_time: 10
-test_pressure_qneg: 5
-test_pressure: 9000
-test_pressure_qpos: 5
+test_pressure_qpos: 10 #Q+ Upper test leak limit
+test_pressure_qneg: 30 #Q- Lower test leak limit
+test_pressure_tt_qpos: 1 # Q+ Upper test leak limit (tube-tube)
+test_pressure_tt_qneg: 5 # Q- Lower test leak limit (tube-tube)
flush_time: 1
flush_pressure: 100
relay_config: 1
\ No newline at end of file
diff --git a/config/machine_settings/st-ten-1.ini b/config/machine_settings/st-ten-1.ini
index 034f829..063f5c1 100644
--- a/config/machine_settings/st-ten-1.ini
+++ b/config/machine_settings/st-ten-1.ini
@@ -14,7 +14,7 @@ tecna_t3: present
vision_saver: absent
vision: absent
screwdriver: absent
-fixture_id: present
+#fixture_id: present
digital_io: present
external_flush_blow: absent
diff --git a/config/machine_settings/st-ten-10.ini b/config/machine_settings/st-ten-10.ini
index da5870c..f33dd28 100644
--- a/config/machine_settings/st-ten-10.ini
+++ b/config/machine_settings/st-ten-10.ini
@@ -83,18 +83,3 @@ tester_discharge_enable: yes
[autotest_leak]
enabled: false
-pre_filling_time: 0
-pre_filling_pressure: 0
-filling_time: 10
-settling_time: 10
-settling_pressure_min_percent: 5
-settling_pressure_max_percent: 5
-test_pressure: 5000
-test_time: 10
-test_pressure_qpos: 10 #Q+ Upper test leak limit
-test_pressure_qneg: 30 #Q- Lower test leak limit
-test_pressure_tt_qpos: 1 # Q+ Upper test leak limit (tube-tube)
-test_pressure_tt_qneg: 5 # Q- Lower test leak limit (tube-tube)
-flush_time: 1
-flush_pressure: 100
-relay_config: 1
diff --git a/config/machine_settings/st-ten-14.ini b/config/machine_settings/st-ten-14.ini
new file mode 100644
index 0000000..c30cbc9
--- /dev/null
+++ b/config/machine_settings/st-ten-14.ini
@@ -0,0 +1,93 @@
+[machine]
+description = ST-TEN-14
+instruction_folder = st-ten-14
+image_for_warning= st-ten-14
+
+[hardware_config]
+archive_synchronizer: present
+uvc_camera: absent
+label_printer: present
+neo_pixels: absent
+remote_api: absent
+tecna_t3: present
+vision_saver: absent
+vision: absent
+screwdriver: absent
+digital_io: absent
+barcode_recipe_selection: absent
+fixture_id: absent
+discard_box: absent
+enforce_piece_removal: no
+
+[tecna_t3]
+port: /dev/ttyUSB0
+model: t3l
+
+[label_printer]
+platform: linux
+printer: ZTC-ZD421-203dpi-ZPL
+
+[digital_io]
+# OUTPUT MAP FOR FIXTURE CONNECTOR
+id: USB-5860,BID#0
+
+[fixture_rfid]
+port: dev/ttyUSB1
+
+[recipe]
+recipe_name_field: codice_ricetta
+part_number_field: codice_prodotto
+label_template_field: modello_etichetta
+description_field: descrizione
+
+[recipes_defaults]
+tester_discharge_enable: yes
+dimensione_lotto_abilitata: x
+tempo_pre_riempimento: 0
+pressione_pre_riempimento: 1000
+tempo_riempimento: 15
+tempo_assestamento: 15
+tempo_di_test: 10
+n_componenti:1
+percentuale_minima_pressione_assestamento: 5
+percentuale_massima_pressione_assestamento: 5
+pressione_di_test_delta_minimo: 30
+pressione_di_test: 7000
+pressione_di_test_delta_massimo: 30
+tempo_svuotamento: 0
+pressione_svuotamento: 100
+canale_di_prova: 1
+prova_tenuta_abilitata_2:
+tempo_pre_riempimento_2: 0
+pressione_pre_riempimento_2: 1000
+tempo_riempimento_2: 20
+tempo_assestamento_2: 20
+tempo_di_test_2: 10
+percentuale_minima_pressione_assestamento_2: 5
+percentuale_massima_pressione_assestamento_2: 5
+pressione_di_test_delta_minimo_2: 30
+pressione_di_test_2: 15000
+pressione_di_test_delta_massimo_2: 30
+tempo_svuotamento_2: 0
+pressione_svuotamento_2: 100
+canale_di_prova_2: 2
+modello_etichetta: EtichettaR5_Montaggio_1prova.prn
+pid_pressure_correction: 100
+
+[autotest_leak]
+enabled: true
+pre_filling_time: 0
+pre_filling_pressure: 1000
+filling_time: 10
+settling_time: 10
+settling_pressure_min_percent: 5
+settling_pressure_max_percent: 5
+test_pressure: 5000
+test_time: 10
+test_pressure_qpos: 3 #Q+ Upper test leak limit
+test_pressure_qneg: 10 #Q- Lower test leak limit
+test_pressure_tt_qpos: 1 # Q+ Upper test leak limit (tube-tube)
+test_pressure_tt_qneg: 5 # Q- Lower test leak limit (tube-tube)
+flush_time: 1
+flush_pressure: 100
+relay_config: 1
\ No newline at end of file
diff --git a/config/machine_settings/st-ten-6.ini b/config/machine_settings/st-ten-6.ini
index fb9a248..4e3807f 100644
--- a/config/machine_settings/st-ten-6.ini
+++ b/config/machine_settings/st-ten-6.ini
@@ -13,22 +13,31 @@ tecna_t3: present
vision_saver: absent
vision: absent
screwdriver: absent
+#digital_io: present
digital_io_flush_blow: present
second_leak_test: present
external_flush_blow: present # EXTERNAL BOX CONTROLLING MULTI-CHANNEL TEST (IF PRESENT), BLOW-CLEANING AND EXTERNAL FLUSH
dual_channel: present
+#fixture_id: present
[tecna_t3]
port: COM4
model: t3l
[neo_pixels]
+port: COM6
+
+[fixture_rfid]
port: COM5
[label_printer]
platform: windows
printer: zd421
+[digital_io]
+# OUTPUT MAP FOR FIXTURE CONNECTOR
+id: USB-5860,BID#0
+
[digital_io_flush_blow]
id: USB-5860,BID#0
# OUTPUT MAP FOR EXTERNAL FLUSH/BLOW UNIT
@@ -79,6 +88,7 @@ tempo_svuotamento_2: 1
pressione_svuotamento_2: 100
canale_di_prova_2: 1
modello_etichetta: EtichettaR5_Montaggio_1prova.prn
+pid_pressure_correction: 0
[autotest_leak]
enabled: true
diff --git a/config/machine_settings/test-linux.ini b/config/machine_settings/test-linux.ini
new file mode 100644
index 0000000..01e148a
--- /dev/null
+++ b/config/machine_settings/test-linux.ini
@@ -0,0 +1,113 @@
+[machine]
+description = TEST-LINUX
+#instruction_folder = st-ten-1
+image_for_warning= st-ten-1
+
+
+[hardware_config]
+archive_synchronizer: present
+galaxy_camera: absent
+uvc_camera: absent
+label_printer: present
+neo_pixels: absent
+remote_api: absent
+tecna_t3: present
+vision_saver: absent
+vision: absent
+screwdriver: absent
+fixture_id: absent
+digital_io: present
+external_flush_blow: absent
+
+[archive_synchronizer]
+archive_endpoint: https://dev.r5portal.it/api/st-ten-save/
+status_endpoint: https://dev.r5portal.it/api/device-info-update/
+poll_time: 10
+hold_time: 10
+
+[tecna_t3]
+port: /dev/ttyUSB0
+model: t3p
+
+[fixture_rfid]
+port: COM5
+
+[digital_io]
+# OUTPUT MAP FOR VALVE CONTROL UNITS
+id: USB-5862,BID#0
+discard_idx:12 # BIT NUMBER OF THE I/0 MODULE USED FOR DISCARD SENSING
+
+[recipe]
+recipe_name_field: codice_ricetta
+part_number_field: codice_prodotto
+label_template_field: modello_etichetta
+description_field: descrizione
+
+[label_printer]
+platform: linux
+printer: Zebra_Technologies_ZTC_ZD421-203dpi_ZPL
+
+[recipes_defaults]
+tester_discharge_enable: yes
+codice_ricetta: specificare ricetta
+cliente: IVECO
+part_number: specificare part number
+canale_di_prova: 0
+warning_img:
+pid_pressure_correction: 105
+dimensione_lotto_abilitata:
+n_componenti:1
+istruzione_abilitata: x
+numero nastri (n):0
+numero sensori anello (sa):0
+numero sensori presenza (sp):0
+
+prova_tenuta_abilitata: x
+tempo_pre_riempimento: 0
+pressione_pre_riempimento: 5000
+tempo_riempimento: 5
+tempo_assestamento: 10
+percentuale_minima_pressione_assestamento: 5
+percentuale_massima_pressione_assestamento: 5
+tempo_di_test: 10
+pressione_di_test_delta_minimo: 30
+pressione_di_test: 5000
+pressione_di_test_delta_massimo: 30
+tempo_svuotamento: 1
+pressione_svuotamento: 100
+
+prova_tenuta_abilitata_2:
+tempo_pre_riempimento_2: 0
+pressione_pre_riempimento_2: 1000
+tempo_riempimento_2: 5
+tempo_assestamento_2: 5
+percentuale_minima_pressione_assestamento_2: 5
+percentuale_massima_pressione_assestamento_2: 5
+tempo_di_test_2: 5
+pressione_di_test_delta_minimo_2: 200
+pressione_di_test_2: 1000
+pressione_di_test_delta_massimo_2: 200
+tempo_svuotamento_2: 1
+pressione_svuotamento_2: 100
+
+stampa_etichetta_abilitata: x
+modello_etichetta: ETA30x16_203dpi.prn
+descrizione: inserire descrizione ricetta
+
+[autotest_leak]
+enabled: true
+pre_filling_time: 0
+pre_filling_pressure: 1000
+filling_time: 10
+settling_time: 10
+settling_pressure_min_percent: 5
+settling_pressure_max_percent: 5
+test_pressure: 7000
+test_time: 10
+test_pressure_qpos: 10 #Q+ Upper test leak limit
+test_pressure_qneg: 30 #Q- Lower test leak limit
+test_pressure_tt_qpos: 1 # Q+ Upper test leak limit (tube-tube)
+test_pressure_tt_qneg: 5 # Q- Lower test leak limit (tube-tube)
+flush_time: 1
+flush_pressure: 100
+relay_config: 1
\ No newline at end of file
diff --git a/config/machine_settings/test-windows.ini b/config/machine_settings/test-windows.ini
new file mode 100644
index 0000000..6a5d5e9
--- /dev/null
+++ b/config/machine_settings/test-windows.ini
@@ -0,0 +1,107 @@
+[machine]
+description = TEST-WINDOWS
+instruction_folder = st-ten-1
+image_for_warning= st-ten-1
+
+
+[hardware_config]
+archive_synchronizer: absent
+galaxy_camera: absent
+uvc_camera: absent
+label_printer: present
+neo_pixels: absent
+remote_api: absent
+tecna_t3: present
+vision_saver: absent
+vision: absent
+screwdriver: absent
+fixture_id: absent
+digital_io: absent
+external_flush_blow: absent
+
+[tecna_t3]
+port: COM4
+model: t3p
+
+[fixture_rfid]
+port: COM5
+
+[digital_io]
+# OUTPUT MAP FOR FIXTURE CONNECTOR
+id_fixture: USB-5862,BID#0
+discard_idx:12 # BIT NUMBER OF THE I/0 MODULE USED FOR DISCARD SENSING
+
+[recipe]
+recipe_name_field: codice_ricetta
+part_number_field: codice_prodotto
+label_template_field: modello_etichetta
+description_field: descrizione
+
+[label_printer]
+platform: windows
+printer: zd421
+
+[recipes_defaults]
+tester_discharge_enable: yes
+codice_ricetta: specificare ricetta
+cliente: IVECO
+part_number: specificare part number
+canale_di_prova: 0
+warning_img:
+
+dimensione_lotto_abilitata:
+n_componenti:1
+istruzione_abilitata: x
+numero nastri (n):0
+numero sensori anello (sa):0
+numero sensori presenza (sp):0
+
+prova_tenuta_abilitata: x
+tempo_pre_riempimento: 0
+pressione_pre_riempimento: 5000
+tempo_riempimento: 5
+tempo_assestamento: 10
+percentuale_minima_pressione_assestamento: 5
+percentuale_massima_pressione_assestamento: 5
+tempo_di_test: 10
+pressione_di_test_delta_minimo: 30
+pressione_di_test: 5000
+pressione_di_test_delta_massimo: 30
+tempo_svuotamento: 1
+pressione_svuotamento: 100
+
+prova_tenuta_abilitata_2:
+tempo_pre_riempimento_2: 0
+pressione_pre_riempimento_2: 1000
+tempo_riempimento_2: 5
+tempo_assestamento_2: 5
+percentuale_minima_pressione_assestamento_2: 5
+percentuale_massima_pressione_assestamento_2: 5
+tempo_di_test_2: 5
+pressione_di_test_delta_minimo_2: 200
+pressione_di_test_2: 1000
+pressione_di_test_delta_massimo_2: 200
+tempo_svuotamento_2: 1
+pressione_svuotamento_2: 100
+
+stampa_etichetta_abilitata: x
+modello_etichetta: ETA30x16_203dpi.prn
+descrizione: inserire descrizione ricetta
+
+[autotest_leak]
+enabled: true
+pre_filling_time: 0
+pre_filling_pressure: 1000
+filling_time: 10
+settling_time: 10
+settling_pressure_min_percent: 5
+settling_pressure_max_percent: 5
+test_pressure: 7000
+test_time: 10
+test_pressure_qpos: 10 #Q+ Upper test leak limit
+test_pressure_qneg: 30 #Q- Lower test leak limit
+test_pressure_tt_qpos: 1 # Q+ Upper test leak limit (tube-tube)
+test_pressure_tt_qneg: 5 # Q- Lower test leak limit (tube-tube)
+flush_time: 1
+flush_pressure: 100
+relay_config: 1
\ No newline at end of file
diff --git a/designer.sh b/designer.sh
index 1fdd748..4062f94 100755
--- a/designer.sh
+++ b/designer.sh
@@ -1 +1,14 @@
-pyqt5-tools designer
+#!/bin/bash
+
+# Path to your virtual environment
+VENV_PATH=/home/edo-neo/PycharmProjects/st-ten-1/venv
+
+# Set environment variables
+export LD_LIBRARY_PATH=$VENV_PATH/lib/python3.11/site-packages/PyQt5/Qt5/lib:/usr/lib/x86_64-linux-gnu
+export PYQTDESIGNERPATH=$VENV_PATH/lib/python3.11/site-packages
+export PYTHONPATH=$VENV_PATH/bin:$PYTHONPATH
+export PATH=$VENV_PATH/bin:$PATH
+export QT_PLUGIN_PATH=$VENV_PATH/lib/python3.11/site-packages/PyQt5/Qt5/plugins
+
+# Execute Qt Designer
+$VENV_PATH/lib/python3.11/site-packages/qt5_applications/Qt/bin/designer
\ No newline at end of file
diff --git a/init.sh b/init.sh
index 9b612e6..dc2528c 100755
--- a/init.sh
+++ b/init.sh
@@ -2,6 +2,7 @@
set -x
here="$(realpath "$(dirname "$0")")"
cd "$here"
+mkdir -p "$here/tmp"
echo "---------- initialize venv ----------"
sudo apt-get install python3 python3-venv python-is-python3 python3-pip
@@ -30,8 +31,6 @@ source "./venv/bin/activate" || source "./venv/Scripts/activate" || :
# # echo "deb [arch=amd64 signed-by=/usr/share/keyrings/bazel-archive-keyring.gpg] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
# # sudo apt-get update
# sudo apt install -y build-essential docker # bazel libusb-1.0-0-dev libabsl-dev libflatbuffers-dev
-# mkdir -p "$here/tmp"
-# cd "$here/tmp"
# # git clone https://github.com/tensorflow/tensorflow || :
# # cd tensorflow
# # git pull
@@ -61,4 +60,11 @@ source "./venv/bin/activate" || source "./venv/Scripts/activate" || :
#python3 setup.py install
#cd "$here"
+echo "---------- INSTALL ADVANTECH DAQNAVI DRIVER ----------"
+cd "$here/tmp"
+wget --continue "https://advdownload.advantech.com/productfile/Downloadfile5/1-2MULY66/DAQ_Linux_4.0.11.0_64bit.run"
+chmod +x DAQ_Linux_4.0.11.0_64bit.run
+sudo ./DAQ_Linux_4.0.11.0_64bit.run
+
+echo "---------- INIT DONE ----------"
cd "$here"
diff --git a/make_desktop_file.sh b/make_desktop_file.sh
new file mode 100644
index 0000000..14a4fdc
--- /dev/null
+++ b/make_desktop_file.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# Define the temporary file name for the .desktop file
+SCRIPT="/tmp/shortcut-$(date +%s).desktop"
+
+# Create the .desktop file with the required content
+echo "[Desktop Entry]" >> $SCRIPT
+echo "Version=1.0" >> $SCRIPT
+echo "Name=AVVIO PROGRAMMA COLLAUDO" >> $SCRIPT
+echo "Comment=Shortcut to AVVIO PROGRAMMA COLLAUDO" >> $SCRIPT
+echo "Exec=$HOME/PycharmProjects/st-ten-1/runme.sh" >> $SCRIPT
+echo "Icon=$HOME/PycharmProjects/st-ten-1/src/ui/imgs/neo.ico" >> $SCRIPT
+echo "Terminal=false" >> $SCRIPT
+echo "Type=Application" >> $SCRIPT
+echo "Categories=Utility;" >> $SCRIPT
+
+# Prompt for sudo password and copy the .desktop file to the user's Desktop
+sudo cp $SCRIPT "$HOME/Desktop/AVVIO PROGRAMMA COLLAUDO.desktop"
+
+# Make the .desktop file executable
+sudo chmod +x "$HOME/Desktop/AVVIO PROGRAMMA COLLAUDO.desktop"
+
+# Remove the temporary .desktop file
+rm $SCRIPT
+
+echo "Shortcut created on Desktop"
\ No newline at end of file
diff --git a/make_desktop_file_noautotest.sh b/make_desktop_file_noautotest.sh
new file mode 100644
index 0000000..fccb42f
--- /dev/null
+++ b/make_desktop_file_noautotest.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# Define the temporary file name for the .desktop file
+SCRIPT="/tmp/shortcut-$(date +%s).desktop"
+
+# Create the .desktop file with the required content
+echo "[Desktop Entry]" >> $SCRIPT
+echo "Version=1.0" >> $SCRIPT
+echo "Name=AVVIO PROGRAMMA COLLAUDO" >> $SCRIPT
+echo "Comment=Shortcut to AVVIO PROGRAMMA COLLAUDO" >> $SCRIPT
+echo "Exec=$HOME/PycharmProjects/st-ten-1/runmenoautotest.sh" >> $SCRIPT
+echo "Icon=$HOME/PycharmProjects/st-ten-1/src/ui/imgs/neo_red.ico" >> $SCRIPT
+echo "Terminal=false" >> $SCRIPT
+echo "Type=Application" >> $SCRIPT
+echo "Categories=Utility;" >> $SCRIPT
+
+# Prompt for sudo password and copy the .desktop file to the user's Desktop
+sudo cp $SCRIPT "$HOME/Desktop/AVVIO PROGRAMMA COLLAUDO NO AUTOTEST.desktop"
+
+# Make the .desktop file executable
+sudo chmod +x "$HOME/Desktop/AVVIO PROGRAMMA COLLAUDO NO AUTOTEST.desktop"
+
+# Remove the temporary .desktop file
+rm $SCRIPT
+
+echo "Shortcut created on Desktop"
\ No newline at end of file
diff --git a/runmenoautotest.sh b/runmenoautotest.sh
new file mode 100755
index 0000000..c0b63c8
--- /dev/null
+++ b/runmenoautotest.sh
@@ -0,0 +1,4 @@
+#!/bin/bash -e
+cd "$(dirname "$0")"
+source "./venv/bin/activate" || source "./venv/Scripts/activate" || :
+python -O "./src/main.py" --no-edgetpu --no-tflite --no-autotest $*
diff --git a/src/components/archive_synchronizer.py b/src/components/archive_synchronizer.py
index f68a693..6e22717 100644
--- a/src/components/archive_synchronizer.py
+++ b/src/components/archive_synchronizer.py
@@ -4,12 +4,15 @@ import re
import sys
import threading
import time
+from pathlib import Path
+
import requests
import traceback
-
import requests
from google.api_core.exceptions import Forbidden
from google.cloud import storage
+from requests import JSONDecodeError
+
from lib.db import Archive, db
from PyQt5.QtCore import QThread
from requests.adapters import HTTPAdapter, Retry
@@ -18,21 +21,26 @@ from urllib3.exceptions import InsecureRequestWarning
from .component import Component
# Suppress insecure request warning
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
+
+
class ArchiveSynchronizer(Component):
- machine_status = "offline"
def __init__(self, config=None, name=None, period=1, lazy=True, paused=False, threaded=True):
super().__init__(config=config, name=name, period=period, lazy=lazy, paused=paused, threaded=threaded)
self.simulate = "--sim-archiver" in sys.argv
- self.status= ArchiveSynchronizer.machine_status
+ self.machine_status = "logged-in"
+ self.machine_id = None
def config_changed(self):
self.machine_id = self.config.machine_id
if "--dev-portal" in sys.argv:
- self.archive_endpoint =f"https://dev.r5portal.it/api/st-ten-save/"
+ self.archive_endpoint = f"https://dev.r5portal.it/api/st-ten-save/"
+ self.status_endpoint = f"https://dev.r5portal.it/api/device-info-update/"
+ self.download_endpoint = f"https://dev.r5portal.it/media/uploads/"
else:
- self.archive_endpoint = self.config[self.name]["archive_endpoint"]
- #self.status_endpoint = f"https://dev.r5portal.it/api/device-info-update?machine-id={self.machine_id_endpoint}&status={self.status}"
- # self.images_path = self.config[self.name]["images_path"]
+ self.download_endpoint = self.config[self.name]["portal_address"] + self.config[self.name]["download_root"]
+ self.archive_endpoint = self.config[self.name]["portal_address"] + self.config[self.name]["archive_root"]
+ self.status_endpoint = self.config[self.name]["portal_address"] + self.config[self.name]["status_root"]
+
self._do_set_period({"period": float(self.config[self.name]["poll_time"])})
self.hold_time = round(float(self.config[self.name]["hold_time"]) * 1000)
self.gcs_client = storage.Client.from_service_account_json(self.config[self.name]["service_account_json"])
@@ -55,46 +63,69 @@ class ArchiveSynchronizer(Component):
if self.hold_time > 0:
QThread.msleep(self.hold_time)
self.gcs_bucket = None
- if "--dev-portal" in sys.argv:
- self.update_machine_status()
+
+ # UPDATE MACHINE STATUS
+ self.machine_status="working"
+
super()._get()
+ self.update_machine_status()
def update_machine_status(self):
- self.status = ArchiveSynchronizer.machine_status
- #print(f"machine_status_global: {ArchiveSynchronizer.machine_status}") # TESTING
- self.status_endpoint = f"https://dev.r5portal.it/api/device-info-update?machine-id={self.machine_id.upper()}&status={self.status}"
-
- if self.status not in ["working", "logged-in", "logged-out"]:
- status_dict = {"last_status": "offline"}
- else:
- status_dict = {"last_status": self.status}
+ status_call = f"{self.status_endpoint}?machine-id={self.machine_id.upper()}&status={self.machine_status}"
response = None
try:
if not self.simulate:
with requests.Session() as s:
s.mount("", HTTPAdapter(max_retries=Retry(total=0))) # this disables retries
- response = requests.post(self.status_endpoint, json=status_dict, timeout=5, verify=False)
+ response = s.post(status_call, timeout=5, verify=False)
if response.status_code != 200:
raise AssertionError("bad status response")
+ else:
+ self.parse_response_and_execute(response)
except AssertionError as e:
self.log.warning(
- f"Status: {self.status}: failed to update machine status: {str(e)}: {response.status_code if response else 'no response'}: {response.content if response else 'no response'}"
+ f"Status: {self.machine_status}: failed to update machine status: {str(e)}: {response.status_code if response else 'no response'}: {response.content if response else 'no response'}"
)
return False
except (requests.ConnectionError, requests.Timeout) as e:
self.log.warning(
- f"Status: {self.status}: failed to update machine status, archive_endpoint might be unreachable: {str(e)}"
+ f"Status: {self.machine_status}: failed to update machine status, archive_endpoint might be unreachable: {str(e)}"
)
return False
except Exception:
self.log.error(
- f"Status: {self.status}: failed to update machine status:\n{traceback.format_exc()}:\n{response.status_code if response else 'no response'}: {response.content if response else 'no response'}"
+ f"Status: {self.machine_status}: failed to update machine status:\n{traceback.format_exc()}:\n{response.status_code if response else 'no response'}: {response.content if response else 'no response'}"
)
return False
- self.log.info(f"Status: {self.status}: Machine Status Updated Successfully")
+ self.log.info(f"Status: {self.machine_status}: Machine Status Updated Successfully")
return True
+
+ def parse_response_and_execute(self, response):
+ try:
+ data = response.json()
+ if not isinstance(data, dict):
+ raise ValueError("Parsed response is not a dictionary")
+
+ actions = data.get("ACTIONS_TO_DO", [])
+
+ # Ensure actions is a list
+ if isinstance(actions, dict):
+ actions = [actions]
+
+ for action in actions:
+ remote_path = action.get("remote_path")
+ local_path = action.get("local_path")
+ self.log.info(f"Executing remote fetch with remote_path: {remote_path} and local_path: {local_path}")
+ result = self.remote_fetch(remote_path=remote_path, local_path=local_path)
+ self.log.info(f"Remote fetch result: {result}")
+
+ except json.JSONDecodeError:
+ self.log.error("Failed to decode JSON response")
+ except Exception as e:
+ self.log.error(f"An unexpected error occurred while parsing response: {str(e)}")
+
def remote_archive(self, record):
r = None
try:
@@ -153,3 +184,63 @@ class ArchiveSynchronizer(Component):
self.log.error(f"id: {record.id}: failed to store remotely:\n{traceback.format_exc()}")
self.log.info(f"id: {record.id}: stored remotely")
return True
+
+ def remote_fetch(self, remote_path=None, local_path=None):
+ """
+ download a single file from the server.
+
+ :param remote_path: path of where to download the file from
+ :param local_path: path of where to save the file to
+ :return: a dictionary with errors if any occur.
+ """
+ if remote_path is None:
+ raise ValueError("remote_path cannot be None")
+ if local_path is None:
+ raise ValueError("local_path cannot be None")
+
+ call_url = f"https://dev.r5portal.it/{remote_path}"
+ try:
+ if not self.simulate:
+ with requests.Session() as s:
+ self.log.info(f"Fetching file from: {call_url}")
+
+ # Make the HTTP GET request to fetch the file
+ response = s.get(call_url, timeout=5, verify=False)
+
+ # Log response details
+ self.log.info(f"HTTP Status Code: {response.status_code}")
+ #self.log.info(f"Response Headers: {response.headers}")
+ #self.log.info(f"Response Content: {response.content}")
+
+ # Handle HTTP errors
+ if response.status_code == 404:
+ self.log.warning(f"File not found: {call_url}. Please check the URL path.")
+ return {"error": "File not found"}
+ elif response.status_code == 403 or response.status_code == 401:
+ self.log.warning(f"Access forbidden or not logged in for file: {call_url}")
+ return {"error": "Access forbidden or not logged in"}
+ elif response.status_code != 200:
+ self.log.error(f"Unexpected HTTP response status: {response.status_code} for URL: {call_url}")
+ return {"error": "Unexpected HTTP response status"}
+
+ # Ensure the directory exists
+ os.makedirs(local_path, exist_ok=True)
+
+ # Save the file to the local path
+ local_file_path = os.path.join(local_path, os.path.basename(remote_path))
+ with open(local_file_path, "wb") as f:
+ f.write(response.content)
+
+ self.log.info(f"File downloaded successfully: {local_file_path}")
+ return {"downloaded_file": local_file_path}
+
+ except requests.ConnectionError as e:
+ self.log.error(f"Connection error occurred while fetching the file: {str(e)}")
+ return {"error": "Connection error"}
+ except requests.Timeout as e:
+ self.log.error(f"Timeout error occurred while fetching the file: {str(e)}")
+ return {"error": "Timeout error"}
+ except Exception as e:
+ self.log.error(f"An unexpected error occurred: {str(e)}")
+ return {"error": "Unexpected error"}
+
diff --git a/src/components/modbus_component.py b/src/components/modbus_component.py
index 1c34453..a4cbe35 100644
--- a/src/components/modbus_component.py
+++ b/src/components/modbus_component.py
@@ -1,5 +1,8 @@
import sys
import traceback
+import warnings
+
+from PyQt5.QtWidgets import QMessageBox
if "--sim-serial" in sys.argv:
from components.dummies.serial import serial
@@ -48,7 +51,10 @@ class ModbusComponent(Component):
strict=False,
)
if not self.client.connect():
- raise ConnectionError("device not reachable (could not connect): {} ({})".format(self.name, self.port))
+ QMessageBox.critical(None, "ERRORE", f"ERRORE TECNA - VERIFICARE CONNESSIONE USB")
+ exit(-1)
+ #raise ConnectionError("device not reachable (could not connect): {} ({})".format(self.name, self.port))
+
if not self.client.is_socket_open():
raise ConnectionError("device not reachable (socket not open): {} ({})".format(self.name, self.port))
self.lock.unlock()
diff --git a/src/components/tecna_marposs_provaset_t3.py b/src/components/tecna_marposs_provaset_t3.py
index 201e681..617f7a6 100644
--- a/src/components/tecna_marposs_provaset_t3.py
+++ b/src/components/tecna_marposs_provaset_t3.py
@@ -1,4 +1,4 @@
-from lib.db import Recipes, Steps, db
+from lib.db import Recipes, db
from PyQt5.QtCore import QSemaphore, pyqtSignal
from PyQt5.QtWidgets import QMessageBox
@@ -333,7 +333,7 @@ class TecnaMarpossProvasetT3(ModbusComponent):
recipes = []
for recipe in list(Recipes.select().order_by(Recipes.name.asc())):
# if recipe.spec["leak_1"]:
- recipes.append([recipe, Steps.get_by_id(recipe.spec["available_steps"]["leak_1"])])
+ recipes.append([recipe, recipe.spec["steps"]["leak_1"]])
# reverve last for our recipe control
if len(recipes) > max(self.max_program_number - 1, 0):
self.log.warning(f"too many recipes ({len(recipes)}), saving only first {max(self.max_program_number - 1, 0)}")
@@ -360,3 +360,89 @@ class TecnaMarpossProvasetT3(ModbusComponent):
self.write_recipe(recipe, step, table=i)
self.log.info(f"saved {min(len(recipes), max(self.max_program_number - 1, 0))} recipes")
self._store_recipes_lock.release(1)
+
+ # SELECT & READ RECIPE FROM TECNA MEMORY
+
+ def read_recipe(self, recipe_number):
+ spec = {
+ **{(719 - 1 + i) : f"R{i}" for i in range(8)},
+ **{(727 - 1 + i) : f"C{i}" for i in range(12)},
+ **{(761 - 1 + i) : f"F1_{i}" for i in range(8)},
+ **{(769 - 1 + i) : f"F2_{i}" for i in range(8)},
+ "T0 - Pre-filling time": "pre_filling_time",
+ "P0 - Pre-filling pressure": "pre_filling_pressure",
+ "T1 - Filling time": "filling_time",
+ "T2 - Settling time": "settling_time",
+ "PR- - Min pressure tolerance %": "settling_pressure_min_percent",
+ "PR+ - Max pressure tolerance % (P+)": "settling_pressure_max_percent",
+ "T3 - Measure time": "test_time",
+ "Q- Lower test leak limit": "test_pressure_qneg",
+ "Q+ Upper test leak limit": "test_pressure_qpos",
+ "FST - Discharge time": "flush_time",
+ "FSL - Discharge limit": "flush_pressure",
+ "Print options": "print_options"
+ }
+ if self.model == "t3p":
+ spec.update({
+ "PREL - Nominal test pressure": "test_pressure",
+ })
+ elif self.model == "t3l":
+ spec.update({
+ "PREL - Nominal test pressure": "test_pressure",
+ })
+ else:
+ raise NotImplementedError(f"tecna t3 model {self.model!r} not implemented.")
+
+ # SET RECIPE NUMBER
+ #self.write("Source of test program number selection", "FROM PARAMETER (SET BY LCD OR SERIAL LINE)")
+ #self.write("Selected program", recipe_number)
+ self.write("Test program for read/write operation", recipe_number)
+
+ recipe_data = {}
+ # READ ALL PARAMETERS
+ for register_name, field_name in spec.items():
+ recipe_data[field_name] = self.read(register_name)
+ recipe_name=self.int_array_to_str([recipe_data[f"R{wn}"] for wn in range(8)])
+ recipe_code=self.int_array_to_str([recipe_data[f"C{wn}"] for wn in range(12)])
+ recipe_f1=self.int_array_to_str([recipe_data[f"F1_{wn}"] for wn in range(8)])
+ recipe_f2=self.int_array_to_str([recipe_data[f"F2_{wn}"] for wn in range(8)])
+ recipe_data["recipe_name"]=recipe_name
+ recipe_data["recipe_code"]=recipe_code
+ recipe_data["recipe_f1"]=recipe_f1
+ recipe_data["recipe_f2"]=recipe_f2
+ recipe_data["print_template"] = int(recipe_data["print_options"] & 0xFF)
+ if self.model == "t3p":
+ recipe_data["test_time"]=int(recipe_data["test_time"]/10)
+ recipe_data["pre_filling_time"] = int(recipe_data["pre_filling_time"] / 10)
+ recipe_data["filling_time"] = int(recipe_data["filling_time"] / 10)
+ recipe_data["settling_time"] = int(recipe_data["settling_time"] / 10)
+ recipe_data["test_pressure_qneg"] = int(recipe_data["test_pressure_qneg"] / 100)
+ recipe_data["test_pressure_qpos"] = int(recipe_data["test_pressure_qpos"] / 100)
+
+ return recipe_data
+
+ @staticmethod
+ def int_array_to_str(arr):
+ """
+ Translates an array of 16-bit integers, where each integer contains 2 ASCII characters,
+ into a string.
+
+ Args:
+ arr: The array of 16-bit integers.
+
+ Returns:
+ The translated string.
+ """
+ result = ""
+ for value in arr:
+ char1 = chr(value & 0xFF)
+ char2 = chr(value >> 8)
+
+ # Stop if we encounter a null byte
+ if char1 == '\0':
+ break
+ result+=char1
+ if char2 == '\0':
+ break
+ result+=char2
+ return result
diff --git a/src/components/usb_586x.py b/src/components/usb_586x.py
index c4a954b..93d0272 100644
--- a/src/components/usb_586x.py
+++ b/src/components/usb_586x.py
@@ -9,21 +9,14 @@ from PyQt5.QtWidgets import QMessageBox, QApplication
from .component import Component
-is_win = platform.system().lower() == "windows"
-
if "--sim-io" not in sys.argv:
- if is_win:
- from components.Automation.BDaq import *
- from components.Automation.BDaq.InstantDoCtrl import InstantDoCtrl
- from components.Automation.BDaq.InstantDiCtrl import InstantDiCtrl
- else:
- libbiodaq = ctypes.CDLL("/opt/advantech/libs/libbiodaq.so")
+ from components.Automation.BDaq import *
+ from components.Automation.BDaq.InstantDoCtrl import InstantDoCtrl
+ from components.Automation.BDaq.InstantDiCtrl import InstantDiCtrl
else:
from components.dummies.Automation.BDaq import *
from components.dummies.Automation.BDaq.InstantDoCtrl import InstantDoCtrl
from components.dummies.Automation.BDaq.InstantDiCtrl import InstantDiCtrl
- #is_win=False
- #import components.dummies.libbiodaq as libbiodaq
from components.dummies.libbiodaq import ErrorCode
class USB_586x(Component):
@@ -44,7 +37,7 @@ class USB_586x(Component):
self.mutex = QMutex()
self.simulate="--sim-io" in sys.argv
# DEVICE INFORMATION
- self.id=config["digital_io"]["id"]
+ self.id=config[self.name]["id"]
if "5860" in self.id:
self.type = "5860"
self.in_size = 1
@@ -77,52 +70,19 @@ class USB_586x(Component):
# DIGITAL I/O CLASS
if not self.simulate:
self.log.info("OPENING USB MODULE...")
- if is_win:
- try:
- self.di_ctrl = InstantDiCtrl(self.info.Description)
- self.do_ctrl = InstantDoCtrl(self.info.Description)
- self.di_read = self.di_ctrl.readAny
- self.do_write_bit = self.do_ctrl.writeBit
- self.buffer = ctypes.create_string_buffer(2)
- self.io_ok=True
- except ValueError:
- QMessageBox.critical(None, "ERRORE", f"ERRORE I/O DIGITALE - VERIFICARE CONNESSIONE USB")
- exit(-1)
- self.io_ok = False
-
- time.sleep(1)
- else:
- self.di_create = libbiodaq.AdxInstantDiCtrlCreate
- self.di_create.restype = ctypes.c_void_p
- self.di_setSelectedDevice = libbiodaq.InstantDiCtrl_setSelectedDevice
- self.di_setSelectedDevice.argtypes = [ctypes.c_void_p, ctypes.POINTER(self.DeviceInformation)]
- self.di_setSelectedDevice.restype = ctypes.c_uint32
- # DIGITAL INPUTS READ FUNCTION
- self.di_read = libbiodaq.InstantDiCtrl_ReadAny
- self.di_read.argtypes = [ctypes.c_void_p, ctypes.c_int32, ctypes.c_int32, ctypes.c_char_p]
- self.di_read.restype = ctypes.c_int32
- # DIGITAL OUTPUTS CLASS
- self.do_create = libbiodaq.AdxInstantDoCtrlCreate
- self.do_create.restype = ctypes.c_void_p
- # SET SELECTED DEVICE
- self.do_setSelectedDevice = libbiodaq.InstantDoCtrl_setSelectedDevice
- self.do_setSelectedDevice.argtypes = [ctypes.c_void_p, ctypes.POINTER(self.DeviceInformation)]
- self.do_setSelectedDevice.restype = ctypes.c_uint32
- # get ports
- self.get_ports = libbiodaq.InstantDoCtrl_getPortDirection
- self.get_ports.argtypes = [ctypes.c_void_p]
- self.get_ports.restype = ctypes.POINTER(ctypes.c_void_p)
- # DIGITAL OUTPUTS WRITE FUNCTION
- self.do_write_bit = libbiodaq.InstantDoCtrl_WriteBit
- self.do_write_bit.argtypes = [ctypes.c_void_p, ctypes.c_int32, ctypes.c_int32, ctypes.c_char]
- self.do_write_bit.restype = ctypes.c_int32
+ try:
+ self.di_ctrl = InstantDiCtrl(self.info.Description)
+ self.do_ctrl = InstantDoCtrl(self.info.Description)
+ self.di_read = self.di_ctrl.readAny
+ self.do_write_bit = self.do_ctrl.writeBit
self.buffer = ctypes.create_string_buffer(2)
- # INIT OBJECTS
- self.di_ctrl = self.di_create()
- self.do_ctrl = self.do_create()
- self.di_init_status = self.di_setSelectedDevice(self.di_ctrl, ctypes.byref(self.info))
- self.do_init_status = self.do_setSelectedDevice(self.do_ctrl, ctypes.byref(self.info))
- self.io_ok = True
+ self.io_ok=True
+ except ValueError:
+ QMessageBox.critical(None, "ERRORE", f"ERRORE I/O DIGITALE - VERIFICARE CONNESSIONE USB")
+ exit(-1)
+ self.io_ok = False
+
+ time.sleep(1)
else:
self.di_ctrl = InstantDiCtrl(self.info.Description)
self.do_ctrl = InstantDoCtrl(self.info.Description)
@@ -177,38 +137,30 @@ class USB_586x(Component):
max_retry = 3
while retry < max_retry:
- if is_win or self.simulate:
- if self.simulate:
- read = self.sim_in
+ if self.simulate:
+ read = self.sim_in
+ break
+ else:
+ if self.io_ok:
+ ret = self.di_read(0, self.in_size)
+ if ret[0].value == ErrorCode.Success.value:
+ self.buffer = ret[1]
+ for byte_num in range(len(self.buffer)):
+ byte = self.buffer[byte_num]
+ read.append([bool(byte & m) for m in self.masks])
+ else:
+ self.buffer = None
+ self.log.error(f"READ ERROR")
+ self.di_ctrl.dispose()
+ self.do_ctrl.dispose()
+ self.io_ok = False
+
+
+ if self.io_ok:
break
else:
- if self.io_ok:
- ret = self.di_read(0, self.in_size)
- if ret[0].value == ErrorCode.Success.value:
- self.buffer = ret[1]
- for byte_num in range(len(self.buffer)):
- byte = self.buffer[byte_num]
- read.append([bool(byte & m) for m in self.masks])
- else:
- self.buffer = None
- self.log.error(f"READ ERROR")
- self.di_ctrl.dispose()
- self.do_ctrl.dispose()
- self.io_ok = False
-
-
- if self.io_ok:
- break
- else:
- time.sleep(1)
- self.open_device()
- else:
- self.di_read(self.di_ctrl, 0, self.in_size, self.buffer)
-
- for byte_num in range(len(self.buffer)):
- byte = int.from_bytes(self.buffer[byte_num], "little")
- read.append([bool(byte & m) for m in self.masks])
-
+ time.sleep(1)
+ self.open_device()
self.mutex.unlock()
return read
@@ -239,10 +191,7 @@ class USB_586x(Component):
# print("set", byte, bit, not val, flush=True)
if self.io_ok:
if not self.simulate:
- if is_win:
- ret=self.do_write_bit(byte, bit, int(val))
- else:
- ret=self.do_write_bit(self.do_ctrl, byte, bit, int(val))
+ ret=self.do_write_bit(byte, bit, int(val))
else:
ret = ErrorCode.Success
diff --git a/src/lib/db/__init__.py b/src/lib/db/__init__.py
index fb0510d..bad5971 100644
--- a/src/lib/db/__init__.py
+++ b/src/lib/db/__init__.py
@@ -6,13 +6,12 @@ import re
from playhouse.sqlite_ext import JSONField
-from .models import Archive, Log, Recipes, Session, Steps, Users, db
+from .models import Archive, Log, Recipes, Session, Users, db
models_reference = {
"archive": Archive,
"log": Log,
"recipes": Recipes,
- "steps": Steps,
"users": Users,
}
@@ -49,57 +48,6 @@ def init_db():
except FileNotFoundError:
pass
- # try:
- # with open("src/lib/db/imports/connectors.csv", "r") as f:
- # log.info("importing connectors")
- # reader = csv.DictReader(f)
- # count = 0
- # for row in reader:
- # steps = {}
- # for step_type, step_spec in {
- # "connector": {"connector": row["connector"]},
- # "barcodes": {"serial": ""},
- # "resistance": {"scale": 500, "expected": float(row["resistance_expected"]), "tolerance": float(row["resistance_tolerance"])},
- # "leak_1": {"pre_filling_time": 1, "pre_filling_pressure": 1000, "filling_time": 1, "settling_time": 1, "settling_pressure_min_percent": 5, "settling_pressure_max_percent": 5, "test_time": 5, "test_pressure_qneg": 100, "test_pressure": 1000, "test_pressure_qpos": 100, "flush_time": 1, "flush_pressure": 100},
- # "leak_2": {"pre_filling_time": 1, "pre_filling_pressure": 1000, "filling_time": 1, "settling_time": 1, "settling_pressure_min_percent": 5, "settling_pressure_max_percent": 5, "test_time": 5, "test_pressure_qneg": 100, "test_pressure": 1000, "test_pressure_qpos": 100, "flush_time": 1, "flush_pressure": 100},
- # "vision": {"recipe": "termorestringente_923578.ini"},
- # "print": {"template": "EtichettaR5.prn", },
- # }.items():
- # steps[step_type] = Steps(
- # type=re.sub(r"^(.*)_[0-9]+$", r"\1", step_type),
- # spec=step_spec,
- # )
- # steps[step_type].save(force_insert=True)
- # recipe = Recipes(
- # name=row["name"],
- # client=row["client"],
- # part_number=row["part_number"],
- # spec={
- # "connector": True,
- # "barcodes": True,
- # "resistance": True,
- # "leak_1": False,
- # "leak_2": False,
- # "vision": False,
- # "print": True,
- # "steps": [steps["connector"].name, steps["resistance"].name, steps["print"].name, ], # pks of the enabled steps
- # "available_steps": {
- # "connector": steps["connector"].name,
- # "barcodes": steps["barcodes"].name,
- # "resistance": steps["resistance"].name,
- # "leak_1": steps["leak_1"].name,
- # "leak_2": steps["leak_2"].name,
- # "vision": steps["vision"].name,
- # "print": steps["print"].name,
- # },
- # },
- # )
- # recipe.save(force_insert=True)
- # count += 1
- # log.info(f"connectors: imported {count} rows.")
- # except FileNotFoundError:
- # pass
-
init_db()
diff --git a/src/lib/db/models/__init__.py b/src/lib/db/models/__init__.py
index ee3118a..d26cab3 100644
--- a/src/lib/db/models/__init__.py
+++ b/src/lib/db/models/__init__.py
@@ -2,5 +2,4 @@ from .archive import Archive
from .base_model import db
from .log import Log
from .recipes import Recipes
-from .steps import Steps
from .users import Session, Users
diff --git a/src/lib/db/models/recipes.py b/src/lib/db/models/recipes.py
index 14c7ccc..fb0e37a 100644
--- a/src/lib/db/models/recipes.py
+++ b/src/lib/db/models/recipes.py
@@ -1,49 +1,40 @@
+import json
from uuid import uuid4 as uuid
from peewee import BooleanField, TextField
from playhouse.sqlite_ext import JSONField
from .base_model import BaseModel
-from .steps import Steps
+from ...helpers.step import Step
class Recipes(BaseModel):
name = TextField(primary_key=True, unique=True, null=False, default=lambda: uuid().hex)
client = TextField(null=True)
part_number = TextField(null=False)
- spec = JSONField(null=False) # keys inside spec must not overlap withthe model
+ spec = JSONField(null=False)
description = TextField(null=True)
archived = BooleanField(null=False, default=False)
def get_steps(self):
steps = []
- for step_pk in self.spec.get("steps", []):
- steps.append(Steps.get_by_id(step_pk))
+ for step_name, enabled in self.spec.items():
+ if enabled in (True, 1):
+ steps.append(Step(step_type=step_name,spec=self.spec["steps"][step_name]))
return steps
- def delete_associated_steps(self):
- return Steps.delete().where(Steps._meta.primary_key << list(self.spec.get("available_steps", {}).values())).execute()
-
def get_steps_map(self):
steps = {}
- for step_name, step_pk in self.spec.get("available_steps", {}).items():
- steps[step_name] = Steps.get_by_id(step_pk)
+ for step_name, step_pk in self.spec.get("steps", {}).items():
+ steps[step_name] = Step(step_type=step_name,spec=self.spec["steps"][step_name])
return steps
@classmethod
def crud_delete(cls, deleted_rows):
- # return cls.delete().where(self._meta.primary_key << deleted_rows).execute()
recipes = list(cls.select().where(cls._meta.primary_key << deleted_rows).execute())
for recipe in recipes:
- recipe.delete_associated_steps()
recipe.delete_instance()
return len(recipes)
- # @classmethod
- # def delete(cls, *args, **kwargs):
- # # OVERRIDE DELETION
- # # so that deleting a user will only archive it
- # return cls.update(archived=True)
-
class Meta:
table_name = "recipes"
diff --git a/src/lib/db/models/steps.py b/src/lib/db/models/steps.py
deleted file mode 100644
index 4baa839..0000000
--- a/src/lib/db/models/steps.py
+++ /dev/null
@@ -1,23 +0,0 @@
-from uuid import uuid4 as uuid
-
-from peewee import BooleanField, TextField
-from playhouse.sqlite_ext import JSONField
-
-from .base_model import BaseModel
-
-
-class Steps(BaseModel):
- name = TextField(primary_key=True, unique=True, null=False, default=lambda: uuid().hex)
- type = TextField(null=False)
- spec = JSONField(null=False) # keys inside spec must not overlap withthe model
- description = TextField(null=True)
- archived = BooleanField(null=False, default=False)
-
- # @classmethod
- # def delete(cls, *args, **kwargs):
- # # OVERRIDE DELETION
- # # so that deleting a user will only archive it
- # return cls.update(archived=True)
-
- class Meta:
- table_name = "steps"
diff --git a/src/lib/helpers/step.py b/src/lib/helpers/step.py
new file mode 100644
index 0000000..9429943
--- /dev/null
+++ b/src/lib/helpers/step.py
@@ -0,0 +1,8 @@
+
+
+class Step(object):
+ step_type = None
+ spec = {}
+ def __init__(self,step_type=None,spec=dict):
+ self.step_type = step_type
+ self.spec = spec
diff --git a/src/main.py b/src/main.py
index 90c30a0..5ae3806 100644
--- a/src/main.py
+++ b/src/main.py
@@ -279,7 +279,7 @@ try:
app = QApplication(sys.argv)
with SingleProcess() as single_process_lock:
- if not single_process_lock:
+ if not single_process_lock and "--no-lock" not in sys.argv:
logging.error(f"Program already opened, exiting...")
QMessageBox.critical(None, "ERRORE", "IL PROGRAMMA E' GIA' IN ESECUZIONE")
exit(0)
diff --git a/src/requirements.txt b/src/requirements.txt
index 214557b..72f5f29 100644
--- a/src/requirements.txt
+++ b/src/requirements.txt
@@ -10,9 +10,9 @@ opencv-python-headless
peewee
pillow
pycoral
-pymodbus
+pymodbus~=3.6.8
pyqt5
-pyqt5-tools
+#pyqt5-tools
pyserial
pyserial-asyncio
qrcode
diff --git a/src/scripts/print_labels.py b/src/scripts/print_labels.py
index 0c39fb0..da03acc 100644
--- a/src/scripts/print_labels.py
+++ b/src/scripts/print_labels.py
@@ -6,24 +6,24 @@ from PyQt5.QtWidgets import QApplication
from src.components.os_label_printer import *
from src.lib.helpers import ConfigReader
-SYSTEM_ID = "ST-TEN-1"
+SYSTEM_ID = "test-windows"
START_SN=1
-STOP_SN=40
-TEMPLATE="ferrari_30x16_203.prn"
-PRINTER_NAME="Zebra_Technologies_ZTC_ZD421-203dpi_ZPL"
-
+STOP_SN=6
+TEMPLATE="ferrari_flag_qr_only.prn"
+PRINTER_NAME="zd421"
+PN="055015378"
config = ConfigReader(system_id=SYSTEM_ID)
-config["label_printer"]["printer"] = PRINTER_NAME
printer=Os_Label_Printer(config=config,name="label_printer")
-timenow = datetime.now()
+# timenow = datetime.now()
app = QApplication(sys.argv)
for sn in range(START_SN,STOP_SN+1):
+ timenow = datetime.now()
print(f"PRINTING LABEL # {sn}")
context = {
# RECIPE DATA
- "PART": "000825276",
+ "PART": PN,
# SERIAL DEFINITION
"SN": str(sn),
"SN4": f"{sn:0>4}",
diff --git a/src/scripts/print_labels_csv.py b/src/scripts/print_labels_csv.py
new file mode 100644
index 0000000..e126191
--- /dev/null
+++ b/src/scripts/print_labels_csv.py
@@ -0,0 +1,54 @@
+import csv
+import time
+from datetime import datetime
+
+from PyQt5.QtWidgets import QApplication
+
+from src.components.os_label_printer import *
+from src.lib.helpers import ConfigReader
+
+SYSTEM_ID = "test-linux"
+CSV_PATH="tmp/ferrari_labels5.csv"
+TEMPLATE="ferrari_flag_qr_only.prn"
+config = ConfigReader(system_id=SYSTEM_ID)
+printer=Os_Label_Printer(config=config,name="label_printer")
+
+
+# timenow = datetime.now()
+app = QApplication(sys.argv)
+
+with open(CSV_PATH, "r", encoding="utf-8-sig") as f:
+ reader = csv.DictReader(f)
+ for row in reader:
+ START_SN = 1
+ STOP_SN = int(row["quantity"])
+ PN = row["part_number"]
+ print(f"PART NUMBER # {PN}")
+ input("Press Enter to continue...")
+ for sn in range(START_SN,STOP_SN+2):
+ timenow = datetime.now()
+ print(f"PRINTING LABEL # {sn}")
+ context = {
+ # RECIPE DATA
+ "PART": PN,
+ # SERIAL DEFINITION
+ "SN": str(sn),
+ "SN4": f"{sn:0>4}",
+ "SN5": f"{sn:0>5}",
+ "SN6": f"{sn:0>6}",
+ # TIME DEFINITION
+ "DATETIME": timenow.strftime("%d/%m/%Y %H:%M:%S"),
+ "DATE": timenow.strftime("%d/%m/%Y"),
+ "TIME": timenow.strftime("%H:%M:%S"),
+ "YYYY": timenow.strftime("%Y"),
+ "YY": timenow.strftime("%y"),
+ "MO": timenow.strftime("%m"),
+ "DD": timenow.strftime("%d"),
+ "HH": timenow.strftime("%H"),
+ "MI": timenow.strftime("%M"),
+ "SS": timenow.strftime("%S"),
+ "JJJ": timenow.strftime("%j"),
+ }
+ printer.print_label(TEMPLATE,context)
+
+ time.sleep(1)
\ No newline at end of file
diff --git a/src/scripts/save_tecna_recipes_to_csv.py b/src/scripts/save_tecna_recipes_to_csv.py
new file mode 100644
index 0000000..2d41a96
--- /dev/null
+++ b/src/scripts/save_tecna_recipes_to_csv.py
@@ -0,0 +1,211 @@
+#!/usr/bin/env python3
+import argparse
+import csv
+import faulthandler
+import logging
+import os
+import platform
+import signal
+import sys
+sys.argv.append("--sim-io")
+#sys.argv.append("--system-id=test-windows")
+
+if platform.system().lower() == "windows":
+ sys.path.append(f"{os.getcwd()}\src\components")
+ sys.path.append(f"{os.getcwd()}\src")
+else:
+ sys.path.append(f"{os.getcwd()}/src/components")
+
+import traceback
+import weakref
+from datetime import datetime
+from pathlib import Path
+from ui.diagnostics import Diagnostics
+from lib.helpers.single_process import SingleProcess
+
+
+app = None
+
+parser = argparse.ArgumentParser(prog='ST-TEN', description='Leak test system')
+parser.add_argument('-s', '--system-id')
+args, unspec = parser.parse_known_args()
+
+def quit_app(signalnum=None, handler=None):
+ logging.info(f"quitting app. signal: {signalnum!r}, handler: {handler!r}")
+ global app
+ if app is not None:
+ app.quit()
+ quit()
+
+
+# SETUP QUITTING ON CTRL+C
+signal.signal(signal.SIGINT, quit_app)
+
+# SETUP FAULTHANDLER
+faulthandler.enable(file=sys.stderr, all_threads=True)
+
+# SETUP LOGS
+logs_dir = Path(".") / "data" / "logs"
+os.makedirs(logs_dir, exist_ok=True)
+logging.basicConfig(
+ format="{asctime}:{name}:{levelname}:{message}",
+ datefmt="%Y-%m-%d_%H-%M-%S",
+ style="{",
+ level="DEBUG" if "--debug" in sys.argv else "INFO",
+ handlers=[
+ logging.StreamHandler(stream=sys.stderr),
+ logging.FileHandler(
+ logs_dir / f"{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.log",
+ mode="a",
+ encoding="utf-8",
+ delay=False,
+ **({"errors": "surrogateescape"} if sys.version_info.major >= 3 and sys.version_info.minor >= 10 else {}),
+ ),
+ ],
+ force=True,
+ **({"encoding": "utf-8"} if sys.version_info.major >= 3 and sys.version_info.minor >= 10 else {}),
+ **({"errors": "surrogateescape"} if sys.version_info.major >= 3 and sys.version_info.minor >= 10 else {}),
+)
+
+try:
+ # IMPORT PROJECT ONLY AFTER SETTING UP SIGNAL, FAULTHANDLER AND LOGGING
+ from components import TecnaMarpossProvasetT3
+ from lib.db import Users
+ from lib.helpers import ConfigReader
+ from PyQt5.QtCore import QObject, QThread, pyqtSignal, pyqtSlot
+ from PyQt5.QtWidgets import QApplication, QMessageBox, QFileDialog
+ from ui import About, Archive, Login, Main_Window, Test, Users_Management, Recipe_Selection, \
+ Barcode_Recipe_Selection
+
+
+
+ class Main(QObject):
+
+ def __init__(self, parent=None):
+ # print(f"MAIN {int(QThread.currentThreadId())}", flush=True)
+ super().__init__()
+ self.recipes = None
+ try:
+ # READ CONFIG
+
+ system_id = args.system_id if "system_id" in args else None
+
+ self.config = ConfigReader(system_id=system_id)
+ logging.info(f"STARTING SESSION ON MACHINE {self.config['machine']['description']}")
+ # INIT COMPONENT
+ self.components_specs = {
+ "tecna_t3": {"c": TecnaMarpossProvasetT3, "k": {"paused": True}},
+ }
+
+ self.components = {}
+ self.threads = {}
+ for component_name, spec in self.components_specs.items():
+ self.components[component_name] = spec["c"](*spec.get("a", []), config=self.config,
+ name=component_name, **spec.get("k", {}))
+ if spec.get("t", True):
+ self.threads[component_name] = QThread()
+ self.threads[component_name].setTerminationEnabled(True)
+ self.components[component_name].moveToThread(self.threads[component_name])
+
+ for component_name, thread in self.threads.items():
+ component = self.components[component_name]
+ thread.started.connect(component.start)
+ thread.start()
+ # DEBUGGER WORKAROUND
+ QApplication.processEvents()
+ QThread.msleep(1000)
+ QApplication.processEvents()
+ component.wait_completion()
+
+ except Exception as e:
+ logging.exception(traceback.format_exc())
+ QMessageBox.critical(None, "Errore", f"Errore di avvio del programma di collaudo:\n\n{e}")
+ quit()
+
+ def read_recipes(self):
+ self.recipes = {}
+ max_num_recipes=self.components["tecna_t3"].max_program_number
+ max_num_recipes=300
+ logging.info(f"NUMBER OF RECIPES TO BE READ: {max_num_recipes}")
+ for recipe_num in range(1, max_num_recipes+1):
+ logging.info(f"READING RECIPE #{recipe_num}")
+ self.recipes[recipe_num] = self.components["tecna_t3"].read_recipe(recipe_num)
+
+ def export_recipes(self, csv_path=None):
+ if csv_path is None:
+ csv_path, _ = QFileDialog.getSaveFileName(
+ None,
+ "Esportazione ricette",
+ "ricette.csv",
+ "CSV data (*.csv);;All Files (*)",
+ )
+ csv_path = str(csv_path)
+ if not len(csv_path):
+ return
+ if not csv_path.lower().endswith(".csv"):
+ csv_path += ".csv"
+ csv_dir = os.path.dirname(csv_path)
+ if len(csv_dir):
+ os.makedirs(csv_dir, exist_ok=True)
+ data = []
+ fieldnames = [
+ "codice_ricetta",
+ "part_number",
+ "tempo_pre_riempimento",
+ "pressione_pre_riempimento",
+ "tempo_riempimento",
+ "tempo_assestamento",
+ "percentuale_minima_pressione_assestamento",
+ "percentuale_massima_pressione_assestamento",
+ "tempo_di_test",
+ "pressione_di_test_delta_minimo",
+ "pressione_di_test",
+ "pressione_di_test_delta_massimo",
+ "tempo_svuotamento",
+ "pressione_svuotamento",
+ "template_di_stampa",
+ "campo1",
+ "campo2"
+ ]
+ for num,recipe in self.recipes.items():
+ exportable = {
+ "codice_ricetta": recipe["recipe_name"],
+ "part_number": recipe["recipe_code"],
+ "campo1": recipe["recipe_f1"],
+ "campo2": recipe["recipe_f2"],
+ "tempo_pre_riempimento": recipe["pre_filling_time"],
+ "pressione_pre_riempimento": recipe["pre_filling_pressure"],
+ "tempo_riempimento": recipe["filling_time"],
+ "tempo_assestamento": recipe["settling_time"],
+ "percentuale_minima_pressione_assestamento": recipe["settling_pressure_min_percent"],
+ "percentuale_massima_pressione_assestamento": recipe["settling_pressure_max_percent"],
+ "tempo_di_test": recipe["test_time"],
+ "pressione_di_test_delta_minimo": recipe["test_pressure_qneg"],
+ "pressione_di_test": recipe["test_pressure"],
+ "pressione_di_test_delta_massimo": recipe["test_pressure_qpos"],
+ "tempo_svuotamento": recipe["flush_time"],
+ "pressione_svuotamento": recipe["flush_pressure"],
+ "template_di_stampa": recipe["print_template"],
+ }
+ data.append(exportable)
+ if len(data):
+ logging.info(f"recipes: exporting recipes to {csv_path}")
+ with open(csv_path, "w", newline="") as f:
+ w = csv.DictWriter(f, fieldnames, extrasaction="ignore")
+ w.writeheader()
+ w.writerows(data)
+ logging.info(f"recipes: exported {len(data)} rows.")
+
+
+ if __name__ == "__main__":
+ app = QApplication(sys.argv)
+
+ with SingleProcess() as single_process_lock:
+
+ main = Main()
+ main.read_recipes()
+ main.export_recipes()
+
+
+except Exception:
+ logging.exception(traceback.format_exc())
diff --git a/src/test/data/database/sqlite.db b/src/test/data/database/sqlite.db
new file mode 100644
index 0000000..e0b04d9
Binary files /dev/null and b/src/test/data/database/sqlite.db differ
diff --git a/src/test/label_printer_ferrari.py b/src/test/label_printer_ferrari.py
new file mode 100644
index 0000000..e598921
--- /dev/null
+++ b/src/test/label_printer_ferrari.py
@@ -0,0 +1,50 @@
+import sys
+from datetime import datetime
+from PyQt5.QtWidgets import QApplication
+
+from components import Os_Label_Printer
+from lib.helpers import ConfigReader
+
+config = ConfigReader(system_id="test-windows")
+time =datetime.now()
+context = {
+ # RECIPE DATA
+ "RECIPE": "000948653",
+ "PART": "000948653",
+ "TFILL": "5",
+ "TSET": "10",
+ "TTEST": "10",
+ "PSETMINP_A": "4750",
+ "PSETMAXP_A": "5250",
+ "PTEST": "1500",
+ "PMIN": "30",
+ "RESPSET": "1512",
+ "RESLEAK": "12.34",
+ "SN4": "1234",
+ "SN5": "12345",
+ # TIME DEFINITION
+ "DATETIME": time.strftime("%d/%m/%Y %H:%M:%S"),
+ "DATE": time.strftime("%d/%m/%Y"),
+ "TIME": time.strftime("%H:%M:%S"),
+ "YYYY": time.strftime("%Y"),
+ "YY": time.strftime("%y"),
+ "MO": time.strftime("%m"),
+ "DD": time.strftime("%d"),
+ "HH": time.strftime("%H"),
+ "MI": time.strftime("%M"),
+ "SS": time.strftime("%S"),
+ "JJJ": time.strftime("%j"),
+ # EXTRA DATA
+ "SHIFT": "1",
+ "STATION": "ST-TEN-1",
+ "OPERATOR": "MARIO",
+ "BADGE_NUM": "999",
+
+}
+
+app = QApplication(sys.argv)
+
+# TEST STANDARD PRINTER
+printer = Os_Label_Printer(config=config, name="label_printer")
+printer.config_changed()
+printer.print_label("ferrari_30x16_203.prn", context=context)
diff --git a/src/test/remote_fetch_test.py b/src/test/remote_fetch_test.py
new file mode 100644
index 0000000..c9db1f3
--- /dev/null
+++ b/src/test/remote_fetch_test.py
@@ -0,0 +1,150 @@
+import unittest
+from unittest.mock import patch, Mock
+import requests
+import json
+import os
+
+from components import ArchiveSynchronizer
+
+
+class TestArchiveSynchronizer(unittest.TestCase):
+ def setUp(self):
+ self.synchronizer = ArchiveSynchronizer(config=Mock(), name=None)
+ self.synchronizer.archive_endpoint = "https://dev.r5portal.it/api/st-ten-save/"
+ self.synchronizer.status_endpoint = "https://dev.r5portal.it/api/device-info-update/"
+ self.synchronizer.download_endpoint = "https://dev.r5portal.it/media/uploads/"
+ self.synchronizer.machine_id = "st-ten-1"
+ self.synchronizer.log = Mock()
+
+ @patch('requests.Session')
+ @patch('os.makedirs')
+ @patch('builtins.open', new_callable=unittest.mock.mock_open)
+ def test_remote_fetch_success(self, mock_open, mock_makedirs, mock_session):
+ remote_path = "img-025.png"
+ local_path = "config/warning_images"
+
+ mock_response = Mock()
+ mock_response.status_code = 200
+ mock_response.content = b'Test content'
+ mock_session.return_value.__enter__.return_value.get.return_value = mock_response
+
+ result = self.synchronizer.remote_fetch(remote_path, local_path)
+
+ self.assertEqual(result, {"downloaded_file": f"{local_path}/{remote_path}"})
+ mock_open.assert_called_with(f"{local_path}/{remote_path}", "wb")
+ mock_open().write.assert_called_with(b'Test content')
+
+ @patch('requests.Session')
+ def test_remote_fetch_not_found(self, mock_session):
+ remote_path = "img-025.png"
+ local_path = "config/warning_images"
+
+ mock_response = Mock()
+ mock_response.status_code = 404
+ mock_session.return_value.__enter__.return_value.get.return_value = mock_response
+
+ result = self.synchronizer.remote_fetch(remote_path, local_path)
+ self.assertEqual(result, {"error": "File not found"})
+
+ @patch('requests.Session')
+ def test_remote_fetch_forbidden(self, mock_session):
+ remote_path = "img-025.png"
+ local_path = "config/warning_images"
+
+ mock_response = Mock()
+ mock_response.status_code = 403
+ mock_session.return_value.__enter__.return_value.get.return_value = mock_response
+
+ result = self.synchronizer.remote_fetch(remote_path, local_path)
+ self.assertEqual(result, {"error": "Access forbidden or not logged in"})
+
+ @patch('requests.Session')
+ @patch('requests.Session.get', side_effect=requests.ConnectionError("Connection error"))
+ def test_remote_fetch_connection_error(self, mock_get, mock_session):
+ remote_path = "img-025.png"
+ local_path = "config/warning_images"
+
+ result = self.synchronizer.remote_fetch(remote_path, local_path)
+ self.assertEqual(result, {"error": "Connection error"})
+ self.synchronizer.log.error.assert_called_with(
+ "Connection error occurred while fetching the file: Connection error")
+
+ @patch('requests.Session')
+ @patch('requests.Session.get', side_effect=requests.Timeout("Timeout error"))
+ def test_remote_fetch_timeout_error(self, mock_get, mock_session):
+ remote_path = "img-025.png"
+ local_path = "config/warning_images"
+
+ result = self.synchronizer.remote_fetch(remote_path, local_path)
+ self.assertEqual(result, {"error": "Timeout error"})
+ self.synchronizer.log.error.assert_called_with("Timeout error occurred while fetching the file: Timeout error")
+
+ @patch('requests.Session')
+ def test_parse_response_and_execute_success(self, mock_session):
+ mock_response = Mock()
+ mock_response.json.return_value = {
+ "STATUS": "OK",
+ "ACTIONS_TO_DO": [
+ {"remote_path": "img-025.png", "local_path": "config/warning_images"}
+ ]
+ }
+
+ with patch.object(self.synchronizer, 'remote_fetch',
+ return_value={"downloaded_file": "config/warning_images/img-025.png"}) as mock_rf:
+ self.synchronizer.parse_response_and_execute(mock_response)
+ mock_rf.assert_called_once_with(remote_path="img-025.png", local_path="config/warning_images")
+
+ def test_parse_response_and_execute_json_error(self):
+ mock_response = Mock()
+ mock_response.json.side_effect = json.JSONDecodeError("Expecting value", "doc", 0)
+
+ self.synchronizer.parse_response_and_execute(mock_response)
+ self.synchronizer.log.error.assert_called_with("Failed to decode JSON response")
+
+ @patch('requests.Session')
+ @patch.object(ArchiveSynchronizer, 'parse_response_and_execute')
+ def test_update_machine_status_success(self, mock_parse_response, mock_session):
+ mock_response = Mock()
+ mock_response.status_code = 200
+ mock_session.return_value.__enter__.return_value.post.return_value = mock_response
+
+ self.synchronizer.machine_status = "running"
+ result = self.synchronizer.update_machine_status()
+ self.assertTrue(result)
+ mock_parse_response.assert_called_once_with(mock_response)
+ self.synchronizer.log.info.assert_called_with("Status: running: Machine Status Updated Successfully")
+
+ @patch('requests.Session')
+ def test_update_machine_status_bad_status_response(self, mock_session):
+ mock_response = Mock()
+ mock_response.status_code = 500
+ mock_session.return_value.__enter__.return_value.post.return_value = mock_response
+
+ self.synchronizer.machine_status = "idle"
+ result = self.synchronizer.update_machine_status()
+ self.assertFalse(result)
+ self.synchronizer.log.warning.assert_called_with(
+ "Status: idle: failed to update machine status: bad status response: 500: no response"
+ )
+
+ @patch('requests.Session', side_effect=requests.ConnectionError("Connection error"))
+ def test_update_machine_status_connection_error(self, mock_session):
+ self.synchronizer.machine_status = "offline"
+ result = self.synchronizer.update_machine_status()
+ self.assertFalse(result)
+ self.synchronizer.log.warning.assert_called_with(
+ "Status: offline: failed to update machine status, archive_endpoint might be unreachable: Connection error"
+ )
+
+ @patch('requests.Session', side_effect=requests.Timeout("Timeout error"))
+ def test_update_machine_status_timeout_error(self, mock_session):
+ self.synchronizer.machine_status = "offline"
+ result = self.synchronizer.update_machine_status()
+ self.assertFalse(result)
+ self.synchronizer.log.warning.assert_called_with(
+ "Status: offline: failed to update machine status, archive_endpoint might be unreachable: Timeout error"
+ )
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/src/test_usb586x.py b/src/test_usb586x.py
index 0d55c44..b055474 100644
--- a/src/test_usb586x.py
+++ b/src/test_usb586x.py
@@ -9,7 +9,7 @@ from src.components.usb_586x import USB_586x
from lib.helpers import ConfigReader
-test_config = ConfigReader()
+test_config = ConfigReader(system_id="test-linux")
if "USB-5862" in test_config["digital_io"]["id"]:
out_size = in_size = 16
diff --git a/src/ui/barcodes_step_editor/barcodes_step_editor.ui b/src/ui/barcodes_step_editor/barcodes_step_editor.ui
index c65c4b8..8a09e06 100644
--- a/src/ui/barcodes_step_editor/barcodes_step_editor.ui
+++ b/src/ui/barcodes_step_editor/barcodes_step_editor.ui
@@ -6,8 +6,8 @@
0
0
- 538
- 234
+ 1004
+ 300
@@ -29,102 +29,102 @@
- 10
- 33
- 52
- 16
+ 20
+ 50
+ 81
+ 20
- Seriale-1
+ Barcode 1
- 68
- 33
- 133
- 22
+ 100
+ 40
+ 321
+ 36
- 68
- 68
- 133
- 22
+ 100
+ 80
+ 321
+ 36
- 10
- 68
- 52
- 16
+ 20
+ 90
+ 81
+ 20
- Seriale-2
+ Barcode 2
- 68
- 103
- 133
- 22
+ 100
+ 120
+ 321
+ 36
- 10
- 103
- 52
- 16
+ 20
+ 130
+ 81
+ 20
- Seriale-3
+ Barcode 3
- 68
- 138
- 133
- 22
+ 100
+ 160
+ 321
+ 36
- 10
- 138
- 52
- 16
+ 20
+ 170
+ 81
+ 20
- Seriale-4
+ Barcode 4
- 297
- 33
- 133
- 22
+ 610
+ 40
+ 321
+ 36
@@ -134,9 +134,9 @@
- 207
- 33
- 84
+ 480
+ 50
+ 131
16
@@ -147,10 +147,10 @@
- 68
- 173
- 133
- 22
+ 100
+ 200
+ 321
+ 36
@@ -160,14 +160,14 @@
- 10
- 173
- 52
- 16
+ 20
+ 210
+ 81
+ 20
- Seriale-4
+ Barcode 5
diff --git a/src/ui/crud/crud.py b/src/ui/crud/crud.py
index 6eb3e3d..583bf4b 100755
--- a/src/ui/crud/crud.py
+++ b/src/ui/crud/crud.py
@@ -1,5 +1,6 @@
import ast
import json
+import logging
import traceback
import weakref
from datetime import datetime
@@ -40,6 +41,7 @@ class Cell:
modified = pyqtSignal(bool)
def __init__(self, action=None, readonly=True, autocomplete=None, field_name=None, field_alias=None, field=None, row_number=None, crud=None):
+ self.log = logging.getLogger(f"{self.__class__.__name__} ({id(self)})")
self.readonly = readonly
self.autocomplete = autocomplete
self.field_name = field_name
@@ -73,7 +75,7 @@ class Cell:
self.render(data, *args, **kwargs)
if not self.connected_modified:
# only connect after first render
- # to avoid false modified signals trigghered by autocomplete
+ # to avoid false modified signals triggered by autocomplete
self.connect_modified()
self.connected_modified = True
@@ -221,11 +223,6 @@ class Json_External_Dialog_Editor_Cell_Widget(QPushButton, Cell):
def render(self, data, field_name=None, row_number=None, crud=None):
self.editor.render(data, field_name=field_name, row_number=row_number, crud=crud)
- # def _parse(self, action=None, row_number=None, crud=None):
- # if action != "commit" and self.connected_modified and not self.is_modified:
- # return self.value
- # return self.editor.parse(action=action, row_number=row_number, crud=crud)
-
def parse(self, action=None, row_number=None, crud=None):
return self.editor.parse(row_number=row_number, crud=crud)
@@ -275,7 +272,7 @@ class Crud(Widget):
self.filter_delay = QTimer()
self.filter_delay.setSingleShot(True)
self.filter_delay.setInterval(500)
- self.filter_delay.timeout.connect(lambda self=weakref.ref(self): self().do_filter(self().filter_cn))
+ self.filter_delay.timeout.connect(lambda selfi=weakref.ref(self): selfi().do_filter(selfi().filter_cn))
self.db_tw.crud = self
self.refresh("init")
self.db_tw.horizontalHeader().sectionClicked.connect(self.toggle_sort)
@@ -288,13 +285,13 @@ class Crud(Widget):
else:
self.db_tw.setSelectionMode(QAbstractItemView.ExtendedSelection)
self.db_tw.itemSelectionChanged.connect(self.show_selection)
- self.revert_b.clicked.connect(lambda checked, self=weakref.ref(self): self().refresh("revert"))
+ self.revert_b.clicked.connect(lambda checked, selfi=weakref.ref(self): selfi().refresh("revert"))
if self.pagination is not False:
- self.start_b.clicked.connect(lambda checked, self=weakref.ref(self): self().refresh("pagination", page=0))
- self.previous_b.clicked.connect(lambda checked, self=weakref.ref(self): self().refresh("pagination", page=max(self().page - 1, 0)))
- self.page_n_sb.valueChanged.connect(lambda page, self=weakref.ref(self): self().refresh("pagination", page=page - 1))
- self.next_b.clicked.connect(lambda checked, self=weakref.ref(self): self().refresh("pagination", page=self().page + 1))
- self.end_b.clicked.connect(lambda checked, self=weakref.ref(self): self().refresh("pagination", page=-1))
+ self.start_b.clicked.connect(lambda checked, selfi=weakref.ref(self): selfi().refresh("pagination", page=0))
+ self.previous_b.clicked.connect(lambda checked, selfi=weakref.ref(self): selfi().refresh("pagination", page=max(selfi().page - 1, 0)))
+ self.page_n_sb.valueChanged.connect(lambda page, selfi=weakref.ref(self): selfi().refresh("pagination", page=page - 1))
+ self.next_b.clicked.connect(lambda checked, selfi=weakref.ref(self): selfi().refresh("pagination", page=selfi().page + 1))
+ self.end_b.clicked.connect(lambda checked, selfi=weakref.ref(self): selfi().refresh("pagination", page=-1))
else:
self.next_b.setHidden(True)
self.previous_b.setHidden(True)
@@ -473,8 +470,8 @@ class Crud(Widget):
if fn in self.db.table_fields:
w.setPlaceholderText("Filtro")
w.setText(self.filters.get(fn, None))
- w.editingFinished.connect(lambda cn=cn, self=weakref.ref(self): self().do_filter(cn))
- w.textChanged.connect(lambda text, cn=cn, self=weakref.ref(self): self().filter_edited(cn))
+ w.editingFinished.connect(lambda cni=cn, selfi=weakref.ref(self): selfi().do_filter(cni))
+ w.textChanged.connect(lambda text, cni=cn, selfi=weakref.ref(self): selfi().filter_edited(cni))
else:
w.setPlaceholderText("Non filtrabile")
w.setEnabled(False)
diff --git a/src/ui/login/login.py b/src/ui/login/login.py
index dbded52..f101a71 100755
--- a/src/ui/login/login.py
+++ b/src/ui/login/login.py
@@ -21,8 +21,7 @@ class Login(Widget):
super().__init__()
self.welcome_l.setText("BENVENUTO, PER INIZIARE IL COLLAUDO, EFFETTUA L'ACCESSO:")
self.user_cb.addItems(Users.get_usernames())
-
- ArchiveSynchronizer.machine_status = "logged-in"
+ self.archive_synch= ArchiveSynchronizer()
QShortcut(QKeySequence("Return"), self).activated.connect(self.login_b.click)
QShortcut(QKeySequence("Enter"), self).activated.connect(self.login_b.click)
@@ -59,7 +58,6 @@ class Login(Widget):
login_count += 1
# /TESTING
self.successful_login.emit()
- ArchiveSynchronizer.machine_status = "logged-in"
def show_osk(self):
self.password_le.setFocus()
diff --git a/src/ui/recipe_selection/recipe_selection.py b/src/ui/recipe_selection/recipe_selection.py
index 94791ec..9fc4f1b 100755
--- a/src/ui/recipe_selection/recipe_selection.py
+++ b/src/ui/recipe_selection/recipe_selection.py
@@ -5,15 +5,17 @@ import sys
import weakref
from glob import glob
-from lib.db import Recipes, Steps, Users, db
+from lib.db import Recipes, Users, db
from PyQt5.QtCore import QTimer, pyqtSignal
from PyQt5.QtGui import QKeySequence
from PyQt5.QtWidgets import QFileDialog, QMessageBox, QShortcut
+import shutil
from ui.crud import Crud, Json_External_Dialog_Editor_Cell_Widget
from ui.helpers import replace_widget
from ui.recipe_spec_and_step_editor import Recipe_Spec_And_Step_Editor
from ui.widget import Widget
+from datetime import datetime
class Noner:
def __getitem__(self, key):
@@ -33,8 +35,6 @@ class Recipe_Selection(Widget):
self.second_leak_test_enabled = self.config["hardware_config"]["second_leak_test"] == "present"
self.defaults = self.config.get("recipes_defaults", noner)
self.unsupported_steps = unsupported_steps
- if not self.second_leak_test_enabled:
- self.unsupported_steps.add("leak_2")
session = Users.get_session()
if session.is_admin:
readonly = False
@@ -94,7 +94,6 @@ class Recipe_Selection(Widget):
self.config.get("recipes_defaults", noner)["verifica_resistenza_connettore_abilitata"]) and "resistance" not in self.unsupported_steps,
"screws": len(self.config.get("recipes_defaults", noner)["avvitatura_abilitata"]) and "screws" not in self.unsupported_steps,
"instruction": len(self.config.get("recipes_defaults", noner)["istruzione_abilitata"]) and "instruction" not in self.unsupported_steps,
- "instruction_extra": len(self.config.get("recipes_defaults", noner)["istruzione_abilitata_extra"]) and "instruction_extra" not in self.unsupported_steps,
"leak_1": len(self.config.get("recipes_defaults", noner)["prova_tenuta_abilitata"]) and "leak_1" not in self.unsupported_steps,
"leak_2": len(self.config.get("recipes_defaults", noner)["prova_tenuta_abilitata_2"]) and "leak_2" not in self.unsupported_steps,
"vision": len(self.config.get("recipes_defaults", noner)["test_visione_abilitato"]) and "vision" not in self.unsupported_steps,
@@ -137,6 +136,7 @@ class Recipe_Selection(Widget):
self.import_b.setVisible(False)
self.export_b.setVisible(False)
self.delete_all_b.setVisible(False)
+
# TESTING
if "--auto-select" in sys.argv:
recipe = "R56738/1"
@@ -181,6 +181,7 @@ class Recipe_Selection(Widget):
val = dict.get(key, self.defaults[key])
return val if val != "" else self.defaults[key]
+ # READ RECIPE STEPS FROM CSV ROW
def read_steps(self, row, defaults=None):
if defaults is None:
global noner
@@ -272,26 +273,27 @@ class Recipe_Selection(Widget):
},
}
+ # IMPORT RECIPES FROM CSV FILE TO DATABASE
def import_recipes(self, csv_path=None, defaults=None):
if defaults is None:
global noner
defaults = self.config.get("recipes_defaults", noner)
-
- if 'codice_prodotto' not in defaults:
- defaults['codice_prodotto'] = "VALORE_PREDEFINITO"
if csv_path is None:
+ options = QFileDialog.Options()
+ options |= QFileDialog.DontUseNativeDialog
csv_path, _ = QFileDialog.getOpenFileName(
- None,
- "Esportazione ricette",
+ self,
+ "Importazione ricette",
"ricette.csv",
"CSV data (*.csv);;All Files (*)",
+ options=options,
)
csv_path = str(csv_path)
if not len(csv_path):
return
self.log.info(f"recipes: importing recipes from {csv_path}")
recipe_name_field = self.config.get("recipe", {}).get("recipe_name_field", "codice_ricetta").strip()
- part_number_field = self.config.get("recipe", {}).get("part_number_field", "part number").strip()
+ part_number_field = self.config.get("recipe", {}).get("part_number_field", "part_number").strip()
description_field = self.config.get("recipe", {}).get("description_field", "descrizione").strip()
barcode_enable_field = self.config.get("recipe", {}).get("barcode_enable_field", "verifica_codice_a_barre_abilitata").strip()
@@ -302,6 +304,8 @@ class Recipe_Selection(Widget):
row = dict((k.lower(), v) for k, v in ucrow.items())
recipe_name = row.get(recipe_name_field, defaults["codice_ricetta"])
steps_specs = self.read_steps(row, defaults=defaults)
+
+ # create recipe or update existing one in DB
try:
recipe = Recipes.get_by_id(recipe_name)
steps = recipe.get_steps_map()
@@ -309,21 +313,12 @@ class Recipe_Selection(Widget):
except Recipes.DoesNotExist:
recipe = Recipes(name=recipe_name, part_number="TEMPORARY")
steps = {}
- for step_type, step_spec in steps_specs.items():
- step = Steps()
- steps[step_type] = step
+ for step_name, step_spec in steps_specs.items():
+ if step_name not in self.unsupported_steps:
+ steps[step_name] = step_spec
recipe_is_new = True
- for step_name, step_spec in steps_specs.items():
- step = steps[step_name]
- # step.type = re.sub(r"^(.*)_[0-9]+$", r"\1", step_name)
- step.type = step_name
- step.spec = step_spec
- if recipe_is_new:
- step.save(force_insert=True)
- else:
- step.save()
recipe.client = row.get("cliente", defaults["cliente"])
- recipe.part_number = row.get(part_number_field, defaults["codice_prodotto"])
+ recipe.part_number = row.get(part_number_field, defaults["part_number"])
recipe.description = row.get(description_field, defaults["descrizione"])
recipe.spec = {
"count": len(row.get("dimensione_lotto_abilitata", defaults["dimensione_lotto_abilitata"])) and "count" not in self.unsupported_steps,
@@ -338,23 +333,9 @@ class Recipe_Selection(Widget):
"leak_2": len(row.get("prova_tenuta_abilitata_2", defaults["prova_tenuta_abilitata_2"])) and "leak_2" not in self.unsupported_steps,
"vision": len(row.get("test_visione_abilitato", defaults["test_visione_abilitato"])) and "vision" not in self.unsupported_steps,
"print": len(row.get("stampa_etichetta_abilitata", defaults["stampa_etichetta_abilitata"])) and "print" not in self.unsupported_steps,
- "steps": [], # should be pks of the enabled steps
- "available_steps": {
- "count": steps["count"].get_id(),
- "connector": steps["connector"].get_id(),
- "barcodes": steps["barcodes"].get_id(),
- "resistance": steps["resistance"].get_id(),
- "screws": steps["screws"].get_id(),
- "instruction": steps["instruction"].get_id(),
- "leak_1": steps["leak_1"].get_id(),
- "leak_2": steps["leak_2"].get_id(),
- "vision": steps["vision"].get_id(),
- "print": steps["print"].get_id(),
- },
+ "steps": steps,
}
- for step_name, step in recipe.spec["available_steps"].items():
- if recipe.spec[step_name]:
- recipe.spec["steps"].append(step)
+ recipe.spec["steps"]=steps_specs
if recipe_is_new:
recipe.save(force_insert=True)
else:
@@ -364,13 +345,17 @@ class Recipe_Selection(Widget):
self.log.info(f"recipes: imported {count} rows.")
self.crud.refresh()
+ # EXPORT RECIPES TABLE TO CSV FILE
def export_recipes(self, csv_path=None):
if csv_path is None:
+ options = QFileDialog.Options()
+ options |= QFileDialog.DontUseNativeDialog
csv_path, _ = QFileDialog.getSaveFileName(
- None,
+ self,
"Esportazione ricette",
"ricette.csv",
"CSV data (*.csv);;All Files (*)",
+ options=options,
)
csv_path = str(csv_path)
if not len(csv_path):
@@ -381,121 +366,135 @@ class Recipe_Selection(Widget):
if len(csv_dir):
os.makedirs(csv_dir, exist_ok=True)
recipe_name_field = self.config.get("recipe", {}).get("recipe_name_field", "codice_ricetta").strip()
- part_number_field = self.config.get("recipe", {}).get("part_number_field", "codice_prodotto").strip()
- description_field = self.config.get("recipe", {}).get("description_field", "descrizione").strip()
barcode_enable_field = self.config.get("recipe", {}).get("barcode_enable_field", "verifica_codice_a_barre_abilitata").strip()
barcode_serial_field = self.config.get("recipe", {}).get("barcode_serial_field", "codice_a_barre").strip()
print_template_field = self.config.get("recipe", {}).get("label_template_field", "modello_etichetta").strip()
data = []
- fieldnames = [
- recipe_name_field,
- "cliente",
- part_number_field,
- description_field,
- "dimensione_lotto_abilitata",
- "dimensione_lotto",
- "verifica_connettore_abilitata",
- "connettore",
- barcode_enable_field,
- barcode_serial_field,
- "verifica_resistenza_connettore_abilitata",
- "scala_resistenza",
- "r nominale",
- "tolleranza_resistenza_pos",
- "tolleranza_resistenza_neg",
- "avvitatura_abilitata",
- "viti",
- "prova_tenuta_abilitata",
- "tempo_pre_riempimento",
- "pressione_pre_riempimento",
- "tempo_riempimento",
- "tempo_assestamento",
- "percentuale_minima_pressione_assestamento",
- "percentuale_massima_pressione_assestamento",
- "tempo_di_test",
- "pressione_di_test_delta_minimo",
- "pressione_di_test",
- "pressione_di_test_delta_massimo",
- "tempo_svuotamento",
- "pressione_svuotamento",
- "prova_tenuta_abilitata_2",
- "tempo_pre_riempimento_2",
- "pressione_pre_riempimento_2",
- "tempo_riempimento_2",
- "tempo_assestamento_2",
- "percentuale_minima_pressione_assestamento_2",
- "percentuale_massima_pressione_assestamento_2",
- "tempo_di_test_2",
- "pressione_di_test_delta_minimo_2",
- "pressione_di_test_2",
- "pressione_di_test_delta_massimo_2",
- "tempo_svuotamento_2",
- "pressione_svuotamento_2",
- "test_visione_abilitato",
- "ricetta_visione",
- "stampa_etichetta_abilitata",
- print_template_field,
- ]
+ fieldnames = set() # Use a set to avoid duplicates
for recipe in list(Recipes.select()):
steps = recipe.get_steps_map()
exportable = {
+ # BASE SECTION
recipe_name_field: recipe.name,
"cliente": recipe.client,
- part_number_field: recipe.part_number,
- description_field: recipe.description,
- # "dimensione_lotto_abilitata": "x" if recipe.spec["count"] else "",
- # "dimensione_lotto": steps["count"].spec["amount"],
- "verifica_connettore_abilitata": "x" if recipe.spec["connector"] else "",
- "connettore": steps["connector"].spec["connector"],
- barcode_enable_field: "x" if recipe.spec["barcodes"] else "",
- barcode_serial_field: steps["barcodes"].spec["serial"],
- "verifica_resistenza_connettore_abilitata": "x" if recipe.spec["resistance"] else "",
- "scala_resistenza": steps["resistance"].spec["scale"],
- "r nominale": steps["resistance"].spec["expected"],
- "tolleranza_resistenza_pos": steps["resistance"].spec["tolerance_pos"],
- "tolleranza_resistenza_neg": steps["resistance"].spec["tolerance_neg"],
- # "avvitatura_abilitata": "x" if recipe.spec["screws"] else "",
- # "viti": steps["screws"].spec["quantity"],
- "prova_tenuta_abilitata": "x" if recipe.spec["leak_1"] else "",
- "tempo_pre_riempimento": steps["leak_1"].spec["pre_filling_time"],
- "pressione_pre_riempimento": steps["leak_1"].spec["pre_filling_pressure"],
- "tempo_riempimento": steps["leak_1"].spec["filling_time"],
- "tempo_assestamento": steps["leak_1"].spec["settling_time"],
- "percentuale_minima_pressione_assestamento": steps["leak_1"].spec["settling_pressure_min_percent"],
- "percentuale_massima_pressione_assestamento": steps["leak_1"].spec["settling_pressure_max_percent"],
- "tempo_di_test": steps["leak_1"].spec["test_time"],
- "pressione_di_test_delta_minimo": steps["leak_1"].spec["test_pressure_qneg"],
- "pressione_di_test": steps["leak_1"].spec["test_pressure"],
- "pressione_di_test_delta_massimo": steps["leak_1"].spec["test_pressure_qpos"],
- "tempo_svuotamento": steps["leak_1"].spec["flush_time"],
- "pressione_svuotamento": steps["leak_1"].spec["flush_pressure"],
- "prova_tenuta_abilitata_2": "x" if recipe.spec["leak_2"] else "",
- "tempo_pre_riempimento_2": steps["leak_2"].spec["pre_filling_time"],
- "pressione_pre_riempimento_2": steps["leak_2"].spec["pre_filling_pressure"],
- "tempo_riempimento_2": steps["leak_2"].spec["filling_time"],
- "tempo_assestamento_2": steps["leak_2"].spec["settling_time"],
- "percentuale_minima_pressione_assestamento_2": steps["leak_2"].spec["settling_pressure_min_percent"],
- "percentuale_massima_pressione_assestamento_2": steps["leak_2"].spec["settling_pressure_max_percent"],
- "tempo_di_test_2": steps["leak_2"].spec["test_time"],
- "pressione_di_test_delta_minimo_2": steps["leak_2"].spec["test_pressure_qneg"],
- "pressione_di_test_2": steps["leak_2"].spec["test_pressure"],
- "pressione_di_test_delta_massimo_2": steps["leak_2"].spec["test_pressure_qpos"],
- "tempo_svuotamento_2": steps["leak_2"].spec["flush_time"],
- "pressione_svuotamento_2": steps["leak_2"].spec["flush_pressure"],
- "test_visione_abilitato": recipe.spec["vision"],
- "ricetta_visione": steps["vision"].spec["recipe"],
- "stampa_etichetta_abilitata": "x" if recipe.spec["print"] else "",
- print_template_field: steps["print"].spec["template"],
+ "part_number": recipe.part_number,
}
+
+ # Add base fields to the fieldnames
+ fieldnames.update([recipe_name_field, "cliente", "part_number"])
+
+ # Check and add fields conditionally for each section
+ if "connector" in steps:
+ exportable.update({
+ "verifica_connettore_abilitata": "x",
+ "connettore": steps["connector"].spec["connector"]
+ })
+ fieldnames.update(["verifica_connettore_abilitata", "connettore"])
+
+ if "resistance" in steps:
+ exportable.update({
+ "verifica_resistenza_connettore_abilitata": "x",
+ "scala_resistenza": steps["resistance"].spec["scale"],
+ "r nominale": steps["resistance"].spec["expected"],
+ "tolleranza_resistenza_pos": steps["resistance"].spec["tolerance_pos"],
+ "tolleranza_resistenza_neg": steps["resistance"].spec["tolerance_neg"]
+ })
+ fieldnames.update(["verifica_resistenza_connettore_abilitata", "scala_resistenza", "r nominale",
+ "tolleranza_resistenza_pos", "tolleranza_resistenza_neg"])
+
+ if "barcodes" in steps:
+ exportable.update({
+ barcode_enable_field: "x",
+ barcode_serial_field: steps["barcodes"].spec["serial"]
+ })
+ fieldnames.update([barcode_enable_field, barcode_serial_field])
+
+ if recipe.spec.get("steps", {}).get("screws") and "screws" in steps:
+ exportable.update({
+ "avvitatura_abilitata": "x",
+ "viti": steps["screws"].spec["quantity"]
+ })
+ fieldnames.update(["avvitatura_abilitata", "viti"])
+
+ if "leak_1" in steps:
+ exportable.update({
+ "prova_tenuta_abilitata": "x",
+ "tempo_pre_riempimento": steps["leak_1"].spec["pre_filling_time"],
+ "pressione_pre_riempimento": steps["leak_1"].spec["pre_filling_pressure"],
+ "tempo_riempimento": steps["leak_1"].spec["filling_time"],
+ "tempo_assestamento": steps["leak_1"].spec["settling_time"],
+ "percentuale_minima_pressione_assestamento": steps["leak_1"].spec["settling_pressure_min_percent"],
+ "percentuale_massima_pressione_assestamento": steps["leak_1"].spec["settling_pressure_max_percent"],
+ "tempo_di_test": steps["leak_1"].spec["test_time"],
+ "pressione_di_test_delta_minimo": steps["leak_1"].spec["test_pressure_qneg"],
+ "pressione_di_test": steps["leak_1"].spec["test_pressure"],
+ "pressione_di_test_delta_massimo": steps["leak_1"].spec["test_pressure_qpos"],
+ "tempo_svuotamento": steps["leak_1"].spec["flush_time"],
+ "pressione_svuotamento": steps["leak_1"].spec["flush_pressure"],
+ })
+ fieldnames.update(["prova_tenuta_abilitata", "tempo_pre_riempimento", "pressione_pre_riempimento",
+ "tempo_riempimento", "tempo_assestamento",
+ "percentuale_minima_pressione_assestamento",
+ "percentuale_massima_pressione_assestamento", "tempo_di_test",
+ "pressione_di_test_delta_minimo",
+ "pressione_di_test", "pressione_di_test_delta_massimo", "tempo_svuotamento",
+ "pressione_svuotamento"])
+
+ if "leak_2" in steps:
+ exportable.update({
+ "prova_tenuta_abilitata_2": "x",
+ "tempo_pre_riempimento_2": steps["leak_2"].spec["pre_filling_time"],
+ "pressione_pre_riempimento_2": steps["leak_2"].spec["pre_filling_pressure"],
+ "tempo_riempimento_2": steps["leak_2"].spec["filling_time"],
+ "tempo_assestamento_2": steps["leak_2"].spec["settling_time"],
+ "percentuale_minima_pressione_assestamento_2": steps["leak_2"].spec[
+ "settling_pressure_min_percent"],
+ "percentuale_massima_pressione_assestamento_2": steps["leak_2"].spec[
+ "settling_pressure_max_percent"],
+ "tempo_di_test_2": steps["leak_2"].spec["test_time"],
+ "pressione_di_test_delta_minimo_2": steps["leak_2"].spec["test_pressure_qneg"],
+ "pressione_di_test_2": steps["leak_2"].spec["test_pressure"],
+ "pressione_di_test_delta_massimo_2": steps["leak_2"].spec["test_pressure_qpos"],
+ "tempo_svuotamento_2": steps["leak_2"].spec["flush_time"],
+ "pressione_svuotamento_2": steps["leak_2"].spec["flush_pressure"],
+ })
+ fieldnames.update(["prova_tenuta_abilitata_2", "tempo_pre_riempimento_2", "pressione_pre_riempimento_2",
+ "tempo_riempimento_2", "tempo_assestamento_2",
+ "percentuale_minima_pressione_assestamento_2",
+ "percentuale_massima_pressione_assestamento_2", "tempo_di_test_2",
+ "pressione_di_test_delta_minimo_2", "pressione_di_test_2",
+ "pressione_di_test_delta_massimo_2",
+ "tempo_svuotamento_2", "pressione_svuotamento_2"])
+
+ if "vision" in steps:
+ exportable.update({
+ "test_visione_abilitato": recipe.spec["vision"],
+ "ricetta_visione": steps["vision"].spec["recipe"]
+ })
+ fieldnames.update(["test_visione_abilitato", "ricetta_visione"])
+
+ if "print" in steps:
+ exportable.update({
+ "stampa_etichetta_abilitata": "x",
+ print_template_field: steps["print"].spec["template"],
+ "etichette_supplementari": steps["print"].spec["extra_label"]
+ })
+ fieldnames.update(["stampa_etichetta_abilitata", print_template_field, "etichette_supplementari"])
+
+ # Append the exportable dictionary to the data list
data.append(exportable)
+
+ # Convert the set to a list for CSV writing
+ fieldnames = list(fieldnames)
+
+ # Export to CSV if there is data
if len(data):
self.log.info(f"recipes: exporting recipes to {csv_path}")
with open(csv_path, "w", newline="") as f:
- w = csv.DictWriter(f, fieldnames, extrasaction="ignore")
+ w = csv.DictWriter(f, fieldnames=fieldnames, extrasaction="ignore")
w.writeheader()
w.writerows(data)
self.log.info(f"recipes: exported {len(data)} rows.")
-
def delete_recipes(self):
ret = QMessageBox.warning(
None,
@@ -506,5 +505,41 @@ class Recipe_Selection(Widget):
)
if ret == QMessageBox.Ok:
Recipes.delete().execute()
- Steps.delete().execute()
self.crud.refresh()
+ def backup_current_recipes(self):
+ # Define the backup directory and file name
+ backup_dir = os.path.join('config', 'csv_import', 'backup_csv')
+ timestamp = datetime.now().strftime("%d%m%y%H%M%S")
+ backup_file = f"backup_{timestamp}.csv"
+ backup_path = os.path.join(backup_dir, backup_file)
+
+ # Ensure the backup directory exists
+ os.makedirs(backup_dir, exist_ok=True)
+
+ # Export current recipes to backup file
+ self.export_recipes(csv_path=backup_path)
+
+ def move_imported_csv(self, csv_path):
+ # Move the imported CSV to the 'imported_csv' directory
+ imported_dir = os.path.join('config', 'csv_import', 'imported_csv')
+ os.makedirs(imported_dir, exist_ok=True)
+ imported_path = os.path.join(imported_dir, os.path.basename(csv_path))
+ shutil.move(csv_path, imported_path)
+ self.log.info(f"Imported CSV moved to {imported_path}")
+ return imported_path
+
+ def check_and_import_auto_csv(self):
+ # Define the directory to check
+ auto_import_dir = os.path.join('config', 'csv_import', 'auto_csv_import')
+
+ # Check if the directory exists and is not empty
+ if os.path.exists(auto_import_dir) and os.listdir(auto_import_dir):
+ # Perform backup
+ self.backup_current_recipes()
+
+ # Move and import each CSV file in the directory
+ for csv_file in os.listdir(auto_import_dir):
+ csv_path = os.path.join(auto_import_dir, csv_file)
+ if os.path.isfile(csv_path) and csv_file.endswith(".csv"):
+ self.import_recipes(csv_path=csv_path)
+ self.move_imported_csv(csv_path)
diff --git a/src/ui/recipe_spec_and_step_editor/recipe_spec_and_step_editor.py b/src/ui/recipe_spec_and_step_editor/recipe_spec_and_step_editor.py
index c42b30d..006c17c 100644
--- a/src/ui/recipe_spec_and_step_editor/recipe_spec_and_step_editor.py
+++ b/src/ui/recipe_spec_and_step_editor/recipe_spec_and_step_editor.py
@@ -1,4 +1,3 @@
-from lib.db import Steps
from peewee import IntegrityError
from ui.barcodes_step_editor import Barcodes_Step_Editor
from ui.connector_step_editor import Connector_Step_Editor
@@ -16,7 +15,8 @@ from ui.instruction_step_editor import Instruction_Step_Editor
class Recipe_Spec_And_Step_Editor(Editor):
def __init__(self, action=None, cell_widget=None, unsupported_steps=None):
super().__init__(action=action, cell_widget=cell_widget)
- self.map = {
+ self.crud = None
+ self.steps_map = {
"count": {
"type": "count",
"enable": self.count_enabled_cb,
@@ -97,20 +97,20 @@ class Recipe_Spec_And_Step_Editor(Editor):
},
}
for step_name in unsupported_steps:
- self.map.get(step_name, {})["hidden"] = True
- self.spec.update({step_name: map["enable"] for step_name, map in self.map.items()})
- for map in self.map.values():
+ self.steps_map.get(step_name, {})["hidden"] = True
+ self.spec.update({step_name: map["enable"] for step_name, map in self.steps_map.items()})
+ for map in self.steps_map.values():
editor = map.get("editor", None)
if editor is not None:
replace_widget(self, map["widget"], editor)
self.steps_tw.setTabVisible(self.steps_tw.indexOf(map["tab"]), not map.get("hidden", False))
self.save_steps_b.clicked.connect(self.save_steps)
self.reset_steps_b.clicked.connect(self.reset_steps)
- self.available_steps = {}
+ self.recipe = None
def set_readonly(self, readonly=True):
super().set_readonly(readonly=readonly)
- for map in self.map.values():
+ for map in self.steps_map.values():
editor = map.get("editor", None)
if editor is not None:
editor.set_readonly(readonly=readonly)
@@ -123,84 +123,58 @@ class Recipe_Spec_And_Step_Editor(Editor):
step_editors_autocomplete = autocomplete.get("step_editors", None)
super().do_autocomplete(autocomplete)
if step_editors_autocomplete is not None:
- for step_name, map in self.map.items():
+ for step_name, map in self.steps_map.items():
editor = map.get("editor", None)
if editor is not None:
editor.do_autocomplete(step_editors_autocomplete.get(step_name, None))
- def init(self, action=None):
- self.get_steps()
- if action == "add":
- self.save_steps()
-
def showing_dialog(self):
self.reset_steps()
- # def connect_modified(self, check_modified):
- # super().connect_modified(check_modified)
- # for map in self.map.values():
- # editor = map.get("editor", None)
- # if editor is not None:
- # editor.connect_modified(check_modified)
-
def render(self, data, field_name=None, row_number=None, crud=None):
super().render(data, field_name=field_name, row_number=row_number, crud=crud)
- self.available_steps = data.get("available_steps", None)
- self.get_steps()
- steps = set(data.get("steps", set()))
- for map in self.map.values():
- step = map.get("step", None)
- if step is not None:
- map["enable"].setChecked(step.name in steps and not map.get("hidden", False))
+ self.crud = crud
+ steps_data = data.get("steps", {})
+
+ for step_name, step_def in self.steps_map.items():
+ if not step_def.get("hidden", False):
+ step_enabled = data.get(step_name, {}) in (True, 1, "x")
+ step_def["enable"].setChecked(step_enabled)
+ step_def["spec"] = steps_data.get(step_name, {})
+
self.render_steps()
def parse(self, action=None, row_number=None, crud=None):
- # if action == "commit":
- # self.save_steps()
ret = super().parse(row_number=row_number, crud=crud)
- ret["steps"] = []
- ret["available_steps"] = {}
- for step_name, map in self.map.items():
- ret["available_steps"][step_name] = map["step"].name
- if map["enable"].isChecked() and not map.get("hidden", False):
- ret["steps"].append(map["step"].name)
+ ret["steps"] = {}
+ #self.save_steps()
+ for step_name, step_map in self.steps_map.items():
+ if not step_map.get("hidden", False):
+ ret["steps"][step_name]=self.steps_map[step_name]["spec"]
return ret
- def get_steps(self):
- for step_name, map in self.map.items():
- if step_name in self.available_steps:
- try:
- map["step"] = Steps.get_by_id(self.available_steps[step_name])
- map["step_is_new"] = False
- except Steps.DoesNotExist:
- map["step"] = Steps(name=self.available_steps[step_name], type=map["type"], spec={})
- map["step_is_new"] = True
- elif map.get("step", None) is None:
- map["step"] = Steps(type=map["type"], spec={})
- map["step_is_new"] = True
-
def render_steps(self):
- for step_name, map in self.map.items():
- step = map.get("step", None)
- if step is not None:
- editor = map.get("editor", None)
+ for step_name, step_map in self.steps_map.items():
+ spec = step_map.get("spec", None)
+ if spec is not None:
+ editor = step_map.get("editor", None)
if editor is not None:
- editor.render(step.spec)
+ editor.render(spec)
def reset_steps(self):
- self.get_steps()
self.render_steps()
def save_steps(self):
- for map in self.map.values():
- step = map.get("step", None)
- if step is not None:
- editor = map.get("editor", None)
+ for step_name,step_map in self.steps_map.items():
+ if not step_map.get("hidden", False):
+ editor = step_map.get("editor", None)
if editor is not None:
- step.spec = editor.parse()
- if map["step_is_new"]:
- step.save(force_insert=True)
+ step_dict = editor.parse()
+ self.steps_map[step_name]["spec"]=step_dict
else:
- step.save()
- map["step_is_new"] = False
+ self.steps_map[step_name]["spec"] = {}
+ if self.crud is not None:
+ self.crud.set_modified()
+ parsed_value=self.parse()
+ self.cell_widget().value = parsed_value
self.reset_steps()
diff --git a/src/ui/test/test.py b/src/ui/test/test.py
index 1c08976..1107316 100755
--- a/src/ui/test/test.py
+++ b/src/ui/test/test.py
@@ -4,11 +4,11 @@ import os
import sys
import weakref
from datetime import datetime, timedelta
-from components import ArchiveSynchronizer
from PyQt5.QtCore import QTimer, pyqtSlot
from PyQt5.QtWidgets import QMessageBox
-from lib.db import Archive, Steps, Users
+from lib.db import Archive, Recipes, Users
from lib.helpers import get_shift
+from lib.helpers.step import Step
from playhouse.shortcuts import model_to_dict
from ui.barcode_recipe_selection import Barcode_Recipe_Selection
from ui.helpers import replace_widget
@@ -26,6 +26,7 @@ from ui.test_screws import Test_Screws
from ui.test_vision import Test_Vision
from ui.test_warning_img import Test_Warning_Img
from ui.widget import Widget
+from components import ArchiveSynchronizer
class Test(Widget):
@@ -50,6 +51,8 @@ class Test(Widget):
self.refresh_time(init=True)
# INIT RECIPE
self.recipe = None
+ self.auto_import = Recipe_Selection
+ self.archive_synch = ArchiveSynchronizer(config=config)
if self.config["hardware_config"]["barcode_recipe_selection"] == "present":
@@ -181,6 +184,7 @@ class Test(Widget):
self.next_timer.timeout.connect(self.next)
self.next()
+
def refresh_time(self, init=False):
if init:
self.time_timer = QTimer()
@@ -236,7 +240,13 @@ class Test(Widget):
if self.autotest_period is not None:
self.autotest_timer.start(self.autotest_period)
reason = "boot"
- self.autotest_request = reason
+
+ if self.config["autotest_leak"]["enabled"] == "true":
+ self.autotest_request = reason
+ else:
+ self.autotest_request = False
+ else:
+ self.log.info(f"Autotest request ignored (reason: {reason!r}) --no-autotest flag detected")
if reason == "logout":
self.next(action="abort")
@@ -245,13 +255,10 @@ class Test(Widget):
def next(self, action=None):
if self.step is not None:
- self.log.info(f"cycle step: {model_to_dict(self.step)!r} action: {action!r} current index:{self.cycle_index}")
+ self.log.info(f"cycle step: {self.step.step_type!r} action: {action!r} current index:{self.cycle_index}")
else:
self.log.info(f"cycle step: {self.step!r} action: {action!r} current index:{self.cycle_index}")
- ArchiveSynchronizer.machine_status = "working"
- # print(f"{ArchiveSynchronizer.machine_status}")#testing
-
current_w = self.centralWidget
if hasattr(current_w, "stop"):
current_w.stop()
@@ -261,7 +268,7 @@ class Test(Widget):
if self.config["hardware_config"]["tecna_t3"] == "present" or self.config["hardware_config"]["furness_controls"] == "present":
self.cycle_available_steps["leak_1"].widget.recipe_written = False
self.cycle_available_steps["leak_2"].widget.recipe_written = False
- self.step = Steps(type="select_recipe")
+ self.step = Step(step_type="select_recipe")
self.cycle_index = -1
self.recipe = None
self.cycle_steps = None
@@ -271,7 +278,7 @@ class Test(Widget):
elif action in ("fail", "abort"):
self.log.info(f"cycle next: action: {action!r}")
# FAIL AND RESTART TEST
- self.step = Steps(type="fail")
+ self.step = Step(step_type="fail")
self.cycle_index = -1
# COUNT FAIL
if action == "fail":
@@ -284,10 +291,11 @@ class Test(Widget):
# if recipe not set: select_recipe
if self.recipe_selection_mode == "barcode":
self.log.info(f"returning to barcode recipe selection")
- self.step = Steps(type="barcode_recipe_selection")
+ self.step = Step(step_type="barcode_recipe_selection")
else:
self.log.info(f"returning to recipe selection table")
- self.step = Steps(type="select_recipe")
+ self.step = Step(step_type="select_recipe")
+
elif action is None:
if self.autotest_request is not False and self.autotest_cycle_steps is not None and not self.autotesting and (self.cycle_index == -1 or self.cycle_index + 1 >= len(self.cycle_steps)):
# if autotest was requested
@@ -295,6 +303,7 @@ class Test(Widget):
self.autotesting = True
self.autotesting_reason = self.autotest_request
self.autotest_request = False
+ self.log.info(f"Autotest requested (reason: {self.autotesting_reason})")
if self.autotest_period is not None: # reset periodic autotest timer
self.time_timer.start(self.autotest_period)
self.require_discard_piece = False
@@ -326,25 +335,25 @@ class Test(Widget):
else:
self.cycle_index = -1
- self.step = Steps(type=None)
+ self.step = Step(step_type=None)
# enable/disable cycle controls
self.change_recipe_b.setEnabled(self.recipe is not None)
- self.cancel_b.setEnabled(self.step.type is not None and self.step.type not in {
+ self.cancel_b.setEnabled(self.step.step_type is not None and self.step.step_type not in {
"emergency",
"fail",
"select_recipe",
"wait",
})
- self.log.info(f"next cycle step: {model_to_dict(self.step)!r}")
+ self.log.info(f"next cycle step: {self.step.step_type!r}")
# INIT TEST DATA IF STARTING CYCLE LOOP OR IF RESET IS NEEDED
if self.cycle_index == 0:
self.data = {"ok": True, "overridden": False}
self.archived = None
if self.recipe is not None and "recipe" not in self.data:
self.data["recipe"] = model_to_dict(self.recipe)
- w = self.cycle_available_steps[self.step.type]
+ w = self.cycle_available_steps[self.step.step_type]
show = None
- if self.step.type == "leak_2":
+ if self.step.step_type == "leak_2":
self.setCentralWidget(w) # NEED TO PRESHOW UI
if hasattr(w, "start"):
show = w.start(recipe=self.recipe, step=self.step, pieces=self.pieces)
@@ -352,16 +361,16 @@ class Test(Widget):
self.setCentralWidget(w)
elif show is False:
self.next_timer.start(0)
- if self.step.type == "done":
+ if self.step.step_type == "done":
self.archived = self.done()
self.last_label = copy.deepcopy(self.archived)
self.next_timer.start(500)
- elif self.step.type == "print":
+ elif self.step.step_type == "print":
compiled_label = self.print(self.archived, self.step.spec.get("template", "EtichettaR5"))
self.archived.label = compiled_label
self.archived.save()
self.next_timer.start(500)
- elif self.step.type == "wait":
+ elif self.step.step_type == "wait":
self.next_timer.start(500)
# UPDATE COUNT DISPLAY
self.update_count_display()
@@ -390,7 +399,7 @@ class Test(Widget):
# create step sequence list
barcode_names = ['serial', 'barcode_input_2', 'barcode_input_3', 'barcode_input_4', 'barcode_input_5']
for i, step in enumerate(steps):
- if step.type == "barcodes":
+ if step.step_type == "barcodes":
n_pieces = int(step.spec.get("n_pieces", 1))
n_pieces_adapted = n_pieces
if n_pieces_adapted == 1:
@@ -403,63 +412,63 @@ class Test(Widget):
steps.insert(i + 1, new_barcode_step)
if i in skip:
continue
- if step.type == "vision":
+ if step.step_type == "vision":
self.components["vision"].config_changed(vision_recipe=self.recipe.name)
- if step.type == "count":
+ if step.step_type == "count":
count_found = True
if "warning_img" in step.spec:
if step.spec["warning_img"]:
- steps.insert(i, Steps(type="warning_img", spec={"warning_img": step.spec["warning_img"]}))
+ steps.insert(i, Step(step_type="warning_img", spec={"warning_img": step.spec["warning_img"]}))
skip.add(i + 1)
if "assembly" in step.spec:
if step.spec["assembly"]:
- steps.insert(i, Steps(type="instructions", spec={}))
+ steps.insert(i, Step(step_type="instructions", spec={}))
skip.add(i + 1)
if "require_discard_piece" in step.spec:
if step.spec["require_discard_piece"]:
self.require_discard_piece = True
- if step.type == "resistance": # ADD STEP TO ENSURE REMOVAL OF CONNECTOR
- steps.insert(i + 1, Steps(type="resistance", spec={
+ if step.step_type == "resistance": # ADD STEP TO ENSURE REMOVAL OF CONNECTOR
+ steps.insert(i + 1, Step(step_type="resistance", spec={
"scale": 500,
"expected": float("+inf"),
"tolerance_pos": 0,
"tolerance_neg": 0,
}))
skip.add(i + 1)
- if step.type == "print":
+ if step.step_type == "print":
if print_found:
continue
- steps.insert(i, Steps(type="done"))
+ steps.insert(i, Step(step_type="done"))
print_found = True
self.print_step = step
if self.config["hardware_config"].get("enforce_piece_removal", "no") == "yes":
- steps.append(Steps(type="piece_removal"))
+ steps.append(Step(step_type="piece_removal"))
if count_found:
- steps.append(Steps(type="count_end"))
- if step.type in ("leak_1", "leak_2"):
+ steps.append(Step(step_type="count_end"))
+ if step.step_type in ("leak_1", "leak_2"):
self.leak_step = step
- step_types = [step.type for step in steps]
+ step_types = [step.step_type for step in steps]
if "leak_1" in step_types and "leak_2" in step_types:
leak1_index = step_types.index("leak_1")
leak2_index = step_types.index("leak_2")
if leak1_index + 1 == leak2_index: # Ensure 'leak_1' is immediately followed by 'leak_2'
- steps.insert(leak2_index, Steps(type="instruction_extra", spec={}))
+ steps.insert(leak2_index, Step(step_type="instruction_extra", spec={}))
inserted_instruction = True
# Insert 'instruction_extra' after the first 'instructions' if not inserted between leaks
if not inserted_instruction:
for i, step in enumerate(steps):
- if step.type == "instructions":
- steps.insert(i + 1, Steps(type="instruction_extra", spec={}))
+ if step.step_type == "instructions":
+ steps.insert(i + 1, Step(step_type="instruction_extra", spec={}))
inserted_instruction = True
break
if not print_found:
- steps.append(Steps(type="done"))
+ steps.append(Step(step_type="done"))
if count_found:
- steps.append(Steps(type="count_end"))
- steps.append(Steps(type="wait"))
+ steps.append(Step(step_type="count_end"))
+ steps.append(Step(step_type="wait"))
self.cycle_steps = steps
self.check_steps_dependencies(self.cycle_steps)
leak_autotest_steps = []
@@ -475,32 +484,32 @@ class Test(Widget):
l_at_2["test_pressure_qneg"] = l_at_2["test_pressure_tt_qneg"]
l_at_2["test_pressure_qpos"] = l_at_2["test_pressure_tt_qpos"]
l_at_2["autotest"] = "ok_check"
- leak_autotest_steps = [Steps(type="leak_1", spec=l_at_1), Steps(type="leak_1", spec=l_at_2)]
+ leak_autotest_steps = [Step(step_type="leak_1", spec=l_at_1), Step(step_type="leak_1", spec=l_at_2)]
self.autotest_cycle_steps = [
*([
- Steps(type="resistance", spec={
+ Step(step_type="resistance", spec={
"scale": 500,
"expected": 1,
"tolerance_pos": 5,
"tolerance_neg": 5,
"autotest": True,
}),
- Steps(type="resistance", spec={
+ Step(step_type="resistance", spec={
"scale": 500,
"expected": float("+inf"),
"tolerance_pos": 0,
"tolerance_neg": 0,
"autotest": True,
}),
- Steps(type="resistance", spec={
+ Step(step_type="resistance", spec={
"scale": 500,
"expected": 10,
"tolerance_pos": 1,
"tolerance_neg": 1,
"autotest": True,
}),
- Steps(type="resistance", spec={
+ Step(step_type="resistance", spec={
"scale": 500,
"expected": float("+inf"),
"tolerance_pos": 0,
@@ -509,15 +518,15 @@ class Test(Widget):
}),
] if "resistance" not in self.unsupported_steps else []),
*(leak_autotest_steps),
- Steps(type="done"),
- Steps(type="wait"),
+ Step(step_type="done"),
+ Step(step_type="wait"),
]
for w in self.cycle_available_steps.values():
if hasattr(w, "reset"):
w.reset()
# UPDATE RECIPE DISPLAY
if self.recipe is not None:
- self.log.info(f"set recipe: {model_to_dict(self.recipe)!r} cycle steps: {[model_to_dict(s) for s in self.cycle_steps]}")
+ self.log.info(f"set recipe: {model_to_dict(self.recipe)!r} cycle steps: {[s.step_type for s in self.cycle_steps]}")
self.recipe_l.setText(self.recipe.name)
self.recipe_l.setStyleSheet("")
self.cycle_index = -1
@@ -531,13 +540,13 @@ class Test(Widget):
unsupported_steps = set()
missing_components = set()
for step in steps:
- if step.type in self.unsupported_steps or step.type not in self.cycle_available_steps:
- unsupported_steps.add(step.type)
+ if step.step_type in self.unsupported_steps or step.step_type not in self.cycle_available_steps:
+ unsupported_steps.add(step.step_type)
else:
- for dependency in self.steps_dependencies.get(step.type, []):
+ for dependency in self.steps_dependencies.get(step.step_type, []):
if isinstance(dependency, tuple):
if all([d not in self.components for d in dependency]):
- unsupported_steps.add(step.type)
+ unsupported_steps.add(step.step_type)
else:
unready = set()
for d in dependency:
@@ -552,7 +561,7 @@ class Test(Widget):
missing_components.add(" or ".join(dependency))
else:
if dependency not in self.components:
- unsupported_steps.add(step.type)
+ unsupported_steps.add(step.step_type)
else:
if not self.components[dependency].ready:
self.components[dependency].reconfigure()
@@ -571,7 +580,7 @@ class Test(Widget):
if step_name not in self.data:
self.data[step_name] = {}
if data is not None:
- data["step"] = model_to_dict(self.step)
+ data["step"] = self.step.spec
data["step"].pop("name", None)
# MAKE ARRAY ONLY IF MORE THAN ONE TEST OF SAME TYPE
@@ -589,7 +598,6 @@ class Test(Widget):
# remove useless info
self.data.get("recipe", {}).get("spec", {}).pop("steps", None)
- self.data.get("recipe", {}).get("spec", {}).pop("available_steps", None)
for leak in ["leak_1", "leak_2"]:
if leak in self.data.keys():
results = {k: self.data[leak]["results"][self.tester_component][k] for k in ["Running test: result"]}
@@ -680,31 +688,31 @@ class Test(Widget):
"DESCRIPTION": self.labellify(recipe.get("description", "-")),
"RECIPE_TO_PRINT": self.labellify(self.print_step.spec.get("labeltxt_5", "-").replace('{N11}', '')),
# STEP SPEC
- "TPREFILL": self.labellify(leak_test_1_step_spec.get("pre_filling_time", "-")),
- "PPREFILL": self.labellify(leak_test_1_step_spec.get("pre_filling_pressure", "-")),
- "TFILL": self.labellify(leak_test_1_step_spec.get("filling_time", "-")),
- "TSET": self.labellify(leak_test_1_step_spec.get("settling_time", "-")),
- "TPREFILL2": self.labellify(leak_test_2_step_spec.get("pre_filling_time", "-")),
- "PPREFILL2": self.labellify(leak_test_2_step_spec.get("pre_filling_pressure", "-")),
- "TFILL2": self.labellify(leak_test_2_step_spec.get("filling_time", "-")),
- "TSET2": self.labellify(leak_test_2_step_spec.get("settling_time", "-")),
- "PSETMINP": self.labellify(leak_test_1_step_spec.get("settling_pressure_min_percent", " -")),
- "PSETMAXP": self.labellify(leak_test_1_step_spec.get("settling_pressure_max_percent", " -")),
- "PSETMINP2": self.labellify(leak_test_2_step_spec.get("settling_pressure_min_percent", " -")),
- "PSETMAXP2": self.labellify(leak_test_2_step_spec.get("settling_pressure_max_percent", " -")),
+ "TPREFILL": self.labellify(leak_test_1_step.get("pre_filling_time", "-")),
+ "PPREFILL": self.labellify(leak_test_1_step.get("pre_filling_pressure", "-")),
+ "TFILL": self.labellify(leak_test_1_step.get("filling_time", "-")),
+ "TSET": self.labellify(leak_test_1_step.get("settling_time", "-")),
+ "TPREFILL2": self.labellify(leak_test_2_step.get("pre_filling_time", "-")),
+ "PPREFILL2": self.labellify(leak_test_2_step.get("pre_filling_pressure", "-")),
+ "TFILL2": self.labellify(leak_test_2_step.get("filling_time", "-")),
+ "TSET2": self.labellify(leak_test_2_step.get("settling_time", "-")),
+ "PSETMINP": self.labellify(leak_test_1_step.get("settling_pressure_min_percent", " -")),
+ "PSETMAXP": self.labellify(leak_test_1_step.get("settling_pressure_max_percent", " -")),
+ "PSETMINP2": self.labellify(leak_test_2_step.get("settling_pressure_min_percent", " -")),
+ "PSETMAXP2": self.labellify(leak_test_2_step.get("settling_pressure_max_percent", " -")),
"PSETMINP_A": self.labellify(psetminp_a),
"PSETMAXP_A": self.labellify(psetmaxp_a),
"PSETMINP2_A": self.labellify(psetminp2_a),
"PSETMAXP2_A": self.labellify(psetmaxp2_a),
- "TTEST": self.labellify(leak_test_1_step_spec.get("test_time", "-")),
- "TTEST2": self.labellify(leak_test_2_step_spec.get("test_time", "-")),
- "PMIN": self.labellify(leak_test_1_step_spec.get("test_pressure_qneg", "-")),
- "PMIN2": self.labellify(leak_test_2_step_spec.get("test_pressure_qneg", "-")),
- "PTEST": self.labellify(leak_test_1_step_spec.get("test_pressure", "-")),
- "PTEST2": self.labellify(leak_test_2_step_spec.get("test_pressure", "-")),
- "PMAX": self.labellify(leak_test_1_step_spec.get("test_pressure_qpos", "-")),
- "TFLUSH": self.labellify(leak_test_1_step_spec.get("flush_time", "-")),
- "PFLUSH": self.labellify(leak_test_1_step_spec.get("flush_pressure", "-")),
+ "TTEST": self.labellify(leak_test_1_step.get("test_time", "-")),
+ "TTEST2": self.labellify(leak_test_2_step.get("test_time", "-")),
+ "PMIN": self.labellify(leak_test_1_step.get("test_pressure_qneg", "-")),
+ "PMIN2": self.labellify(leak_test_2_step.get("test_pressure_qneg", "-")),
+ "PTEST": self.labellify(leak_test_1_step.get("test_pressure", "-")),
+ "PTEST2": self.labellify(leak_test_2_step.get("test_pressure", "-")),
+ "PMAX": self.labellify(leak_test_1_step.get("test_pressure_qpos", "-")),
+ "TFLUSH": self.labellify(leak_test_1_step.get("flush_time", "-")),
+ "PFLUSH": self.labellify(leak_test_1_step.get("flush_pressure", "-")),
# ACTUAL TESTED VALUES
"RESPFILL": self.labellify(leak_test_1_results.get("Running test: filling pressure", "-")),
"RESPFILL2": self.labellify(leak_test_2_results.get("Running test: filling pressure", "-")),
@@ -742,7 +750,7 @@ class Test(Widget):
# RESULT
"RESULT": str("CONFORME" if leak_test_1.get("ok", False) else "SCARTO") + str(" FORZATO" if self.data.get("overridden", False) else ""),
"RESULT_L1": "ESITO" + str(" FORZATO" if self.data.get("overridden", False) else ""),
- "RESULT_L2": str("CONFORME" if leak_test_1_results.get("ok", False) else "SCARTO"),
+ "RESULT_L2": str("CONFORME" if leak_test_1.get("ok", False) else "SCARTO"),
}
#TESTING BROTHER
label_brother = context.get("RECIPE_TO_PRINT", "-") + context.get("DD","-") + context.get("MO","-") + context.get("YY","-") + context.get("SN5","-")
@@ -775,7 +783,7 @@ class Test(Widget):
def load_recipe_from_rfid(self, data):
if data not in(None,''):
self.tag_loaded_recipe = data
- if self.step.type == "barcode_recipe_selection":
+ if self.step.step_type == "barcode_recipe_selection":
if data is not None:
self.cycle_available_steps["barcode_recipe_selection"].widget.get(data)
else:
diff --git a/src/ui/test_instructions/test_instructions.py b/src/ui/test_instructions/test_instructions.py
index f87bce7..4b58ec7 100644
--- a/src/ui/test_instructions/test_instructions.py
+++ b/src/ui/test_instructions/test_instructions.py
@@ -28,7 +28,7 @@ class Test_Instructions(Test_Test):
self.layout = QVBoxLayout()
self.layout.addWidget(self.svg_widget)
self.svg_w.setLayout(self.layout)
- self.svg_path=os.path.join("config","instruction_images",self.config["machine"]["instruction_folder"],"")
+ self.svg_path=os.path.join("config","instruction_images",self.config["machine"].get("instruction_folder","generic"),"")
self.timer = QTimer()
self.timer.timeout.connect(self.toggle_icons)
self.expected_input_state=True
@@ -48,9 +48,9 @@ class Test_Instructions(Test_Test):
self.get_connection = self.components["digital_io"].out.connect(self.get)
if step is not None:
- if step.type == "instruction":
+ if step.step_type == "instruction":
svg_path = f"{self.svg_path}{self.recipe}.svg"
- elif step.type == "instruction_extra":
+ elif step.step_type == "instruction_extra":
svg_path = f"{self.svg_path}{self.recipe}-extra.svg"
if not os.path.exists(svg_path):
@@ -58,7 +58,7 @@ class Test_Instructions(Test_Test):
self.svg_root = etree.parse(svg_path)
self.svg_str = etree.tostring(self.svg_root)
self.svg_str=etree.tostring(self.svg_root)
- self.expected_input_state = True if step.type == "instruction" else False
+ self.expected_input_state = True if step.step_type == "instruction" else False
self.monitored_ids=self.svg_root.xpath(f'''.//*[starts-with(@id, 'sensor_')]''')
@@ -156,7 +156,7 @@ class Test_Instructions(Test_Test):
QApplication.processEvents()
def get(self, data=None, override=False):
- if self.parent_assembly_widget().parent().step.type == "select_recipe":
+ if self.parent_assembly_widget().parent().step.step_type == "select_recipe":
self.stop()
return
if self.done: # avoid proccessing if completed
diff --git a/src/ui/test_leak/test_leak.py b/src/ui/test_leak/test_leak.py
index 4fc8bd1..992727a 100644
--- a/src/ui/test_leak/test_leak.py
+++ b/src/ui/test_leak/test_leak.py
@@ -44,7 +44,7 @@ class Test_Leak(Test_Test):
def start_test(self):
# print extra labels
- if self.step.type == "leak_1":
+ if self.step.step_type == "leak_1":
self.parent.print_extra_labels()
# SELECT TEST CHANNEL
@@ -94,8 +94,8 @@ class Test_Leak(Test_Test):
if show is False:
return show
- if "leak_2" in [s.type for s in self.parent.cycle_steps]:
- if self.step.type=="leak_1":
+ if "leak_2" in [s.step_type for s in self.parent.cycle_steps]:
+ if self.step.step_type=="leak_1":
self.test_num_l.setText("1/2")
else:
self.test_num_l.setText("2/2")
@@ -144,8 +144,8 @@ class Test_Leak(Test_Test):
time.sleep(2)
# AUTO START SECOND TEST
- if step.type == "leak_2":
- if self.config["hardware_config"].get("dual_chanel","absent") == "present":
+ if step.step_type == "leak_2":
+ if self.config["hardware_config"].get("dual_chanel", "absent") == "present":
self.recipe_written = False
time.sleep(1)
self.start_b.setEnabled(True)