Compare commits
8 Commits
master
...
BARCODE-PO
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8ca97c9770 | ||
|
|
5b41cb3805 | ||
|
|
e695eaa789 | ||
|
|
301c31eb9c | ||
|
|
49e92c7aea | ||
|
|
16a39a987a | ||
|
|
48e6acf2fb | ||
|
|
58f5ee26bb |
|
|
@ -1,198 +1 @@
|
||||||
codice_ricetta,stampa_etichetta_abilitata,modello_etichetta,pressione_di_test_2,codice_a_barre,tempo_pre_riempimento_2,pressione_pre_riempimento_2,tempo_di_test,riempimento_continuo_free_fall,prova_tenuta_abilitata_2,tempo_pre_riempimento,pressione_riempimento_free_fall,pressione_di_test,prova_tenuta_abilitata,cliente,pid_pressure_correction,tempo_riempimento_free_fall,tempo_di_test_2,prova_pervieta_abilitata,part_number,pressione_min_free_fall,pressione_pre_riempimento,verifica_codice_a_barre_abilitata,pressione_max_free_fall
|
prova_tenuta_abilitata,pressione_di_test_2,tempo_pre_riempimento,tempo_di_test,pressione_riempimento_free_fall,codice_a_barre,pressione_min_free_fall,tempo_di_test_2,modello_etichetta,tempo_pre_riempimento_2,part_number,codice_ricetta,verifica_codice_a_barre_abilitata,pid_pressure_correction,pressione_max_free_fall,riempimento_continuo_free_fall,prova_pervieta_abilitata,cliente,pressione_pre_riempimento_2,stampa_etichetta_abilitata,pressione_di_test,prova_tenuta_abilitata_2,pressione_pre_riempimento,tempo_riempimento_free_fall
|
||||||
PY83-6B747-BA,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,0,x,specificare cliente,100,,10,,PY83-6B747-BA,,0,x,
|
|
||||||
PY83-6B748-BA,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,0,x,specificare cliente,100,,10,,PY83-6B748-BA,,0,x,
|
|
||||||
16FC246CP REV1,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,1000,x,MCLAREN,100,,10,,16FC246CP REV1,,0,x,
|
|
||||||
MY83-6L694-AB,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,0,x,specificare cliente,100,,10,,MY83-6L694-AB,,0,x,
|
|
||||||
16FC250CP REV02,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,200,x,MCLAREN,100,,10,,16FC250CP REV02,,0,x,
|
|
||||||
5801970064 REV2,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,8000,x,IVECO,100,,10,,5801970064 REV2,,0,x,
|
|
||||||
5801970067 REV1,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,IVECO,100,,10,,5801970067 REV1,,0,x,
|
|
||||||
5801384839 REV1,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,8000,x,IVECO,100,,10,,5801384839 REV1,,0,x,
|
|
||||||
5801384838 REV1,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,8000,x,IVECO,100,,10,,5801384838 REV1,,0,x,
|
|
||||||
5801384842 REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,8000,x,IVECO,100,,10,,5801384842 REV01,,0,x,
|
|
||||||
5801970063 REV2,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,8000,x,IVECO,100,,10,,5801970063 REV2,,0,x,
|
|
||||||
16L0059CP REV03,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16L0059CP REV03,,0,x,
|
|
||||||
16LA259CP REV03,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA259CP REV03,,0,x,
|
|
||||||
16LA336CP REV02,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16LA336CP REV02,,0,x,
|
|
||||||
16LA490CP REV02,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA490CP REV02,,0,x,
|
|
||||||
16LA579CP REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA579CP REV01,,0,x,
|
|
||||||
16LA615CP REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA615CP REV01,,0,x,
|
|
||||||
16LA642CP REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,3500,x,MCLAREN,100,,10,,16LA642CP REV01,,0,x,
|
|
||||||
16LA643CP REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA643CP REV01,,0,x,
|
|
||||||
5801970066 REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,8000,x,IVECO,100,,10,,5801970066 REV01,,0,x,
|
|
||||||
5801970021 REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,8000,x,IVECO,100,,10,,5801970021 REV01,,0,x,
|
|
||||||
5801970065 REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,8000,x,IVECO,100,,10,,5801970065 REV01,,0,x,
|
|
||||||
MY83-6B748-BA,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,0,x,specificare cliente,100,,10,,MY83-6B748-BA,,0,x,
|
|
||||||
16LA459CP REV02,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA459CP REV02,,0,x,
|
|
||||||
MY83-6B747-BA,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,0,x,specificare cliente,100,,10,,MY83-6B747-BA,,0,x,
|
|
||||||
16LA459CP REV1,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA459CP REV1,,0,x,
|
|
||||||
16LA735CP REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,3500,x,MCLAREN,100,,10,,16LA735CP REV01,,0,x,
|
|
||||||
5802915822,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,0,x,IVECO,100,,10,,5802915822,,0,x,
|
|
||||||
5802889710 REV3,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,IVECO,100,,10,,5802889710 REV3,,0,x,
|
|
||||||
5801384838,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,IVECO,100,,10,,5801384838,,0,x,
|
|
||||||
5803103147 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,IVECO,100,,10,,5803103147 REV0,,0,x,
|
|
||||||
5803103150 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,IVECO,100,,10,,5803103150 REV0,,0,x,
|
|
||||||
5801970063 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,0,x,IVECO,100,,10,,5801970063 REV0,,0,x,
|
|
||||||
5801384842 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,IVECO,100,,10,,5801384842 REV0,,0,x,
|
|
||||||
5801970066 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,IVECO,100,,10,,5801970066 REV0,,0,x,
|
|
||||||
5801970064 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,0,x,IVECO,100,,10,,5801970064 REV0,,0,x,
|
|
||||||
60192056 REV1,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,specificare cliente,100,,10,,60192056 REV1,,0,x,
|
|
||||||
5801970065 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,0,x,IVECO,100,,10,,5801970065 REV0,,0,x,
|
|
||||||
5801384839 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,IVECO,100,,10,,5801384839 REV0,,0,x,
|
|
||||||
5803018239,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,0,x,IVECO,100,,10,,5803018239,,0,x,
|
|
||||||
5803018238,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,0,x,IVECO,100,,10,,5803018238,,0,x,
|
|
||||||
5803018244,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,0,x,IVECO,100,,10,,5803018244,,0,x,
|
|
||||||
5803018243,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,0,x,IVECO,100,,10,,5803018243,,0,x,
|
|
||||||
NESSUN NOME,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,1,,x,0,,0,x,specificare cliente,100,,10,,NESSUN NOME,,0,x,
|
|
||||||
5802991065,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,0,x,IVECO,100,,10,,5802991065,,0,x,
|
|
||||||
TENUTA 20 bar,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,0,x,specificare cliente,100,,10,,TENUTA 20 bar,,0,x,
|
|
||||||
16LA353CP REV02,x,MCLAREN_353.prn,15000,,0,1000,10,,x,0,,3500,x,MCLAREN,100,,10,,16LA353CP REV02,,0,x,
|
|
||||||
504321531,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,0,x,specificare cliente,100,,10,,504321531,,0,x,
|
|
||||||
16L0046CP REV03,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,3500,x,MCLAREN,100,,10,,16L0046CP REV03,,0,x,
|
|
||||||
16LA397CP REV02,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA397CP REV02,,0,x,
|
|
||||||
16LA573CP REV01,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16LA573CP REV01,,0,x,
|
|
||||||
5801616061,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,0,x,IVECO,100,,10,,5801616061,,0,x,
|
|
||||||
16LA449CP REV02,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA449CP REV02,,0,x,
|
|
||||||
16LA773CP REV01,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA773CP REV01,,0,x,
|
|
||||||
16LA461CP REV02,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,3000,x,MCLAREN,100,,10,,16LA461CP REV02,,0,x,
|
|
||||||
200116-09-1320,x,ETA30x16_203dpi.prn,15000,,0,1000,10,,x,0,,3000,x,MULTIMATIC,100,,10,,200116-09-1320,,1000,x,
|
|
||||||
5803112815,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,0,x,IVECO,100,,10,,5803112815,,0,x,
|
|
||||||
5803112815 REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,5000,x,IVECO,100,,10,,5803112815 REV01,,0,x,
|
|
||||||
5803112816,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,5000,x,IVECO,100,,10,,5803112816,,0,x,
|
|
||||||
5803112816 REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,5000,x,IVECO,100,,10,,5803112816 REV01,,0,x,
|
|
||||||
16LA584CP REV01,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA584CP REV01,,0,x,
|
|
||||||
16L0058CP REV02,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16L0058CP REV02,,0,x,
|
|
||||||
16LA027SP REV02,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA027SP REV02,,0,x,
|
|
||||||
16L0043CP REV02,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16L0043CP REV02,,0,x,
|
|
||||||
5802729983 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,8000,x,IVECO,100,,10,,5802729983 REV0,,0,x,
|
|
||||||
5802980014 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,25,,x,0,,7000,x,IVECO,100,,10,,5802980014 REV0,,0,x,
|
|
||||||
16LA586CP REV01,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,3000,x,MCLAREN,100,,10,,16LA586CP REV01,,0,x,
|
|
||||||
16LA695CP REV02,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16LA695CP REV02,,0,x,
|
|
||||||
16LA765CP REV01,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,3500,x,MCLAREN,100,,10,,16LA765CP REV01,,0,x,
|
|
||||||
16L0045CP REV02,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16L0045CP REV02,,0,x,
|
|
||||||
5801862227 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,IVECO,100,,10,,5801862227 REV0,,0,x,
|
|
||||||
5801862227 REV00,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,8000,x,IVECO,100,,10,,5801862227 REV00,,0,x,
|
|
||||||
16FA026SP REV1,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,200,x,MCLAREN,100,,10,,16FA026SP REV1,,0,x,
|
|
||||||
16FA026SP,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16FA026SP,,0,x,
|
|
||||||
5801384841 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,IVECO,100,,10,,5801384841 REV0,,0,x,
|
|
||||||
5801384841 REV01,x,ETA30x16.prn,15000,,0,1000,20,,x,0,,8000,x,IVECO,100,,10,,5801384841 REV01,,0,x,
|
|
||||||
5801384840 REV01,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,8000,x,IVECO,100,,10,,5801384840 REV01,,0,x,
|
|
||||||
12970-13-2388,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,7000,x,specificare cliente,100,,10,,12970-13-2388,,0,x,
|
|
||||||
12970-13-2386,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,specificare cliente,100,,10,,12970-13-2386,,0,x,
|
|
||||||
12970-13-2384,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,specificare cliente,100,,10,,12970-13-2384,,0,x,
|
|
||||||
12970-13-2382,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,specificare cliente,100,,10,,12970-13-2382,,0,x,
|
|
||||||
112247,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,7000,x,specificare cliente,100,,10,,112247,,1000,x,
|
|
||||||
055045415,x,ferrari_flag_qr_only.prn,15000,,0,1000,30,,x,0,,2100,x,Ferrari,100,,10,,055045415,,1000,x,
|
|
||||||
98FB342CP,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,200,x,MCLAREN,100,,10,,98FB342CP,,0,x,
|
|
||||||
16LA680CP REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,0,x,MCLAREN,100,,10,,16LA680CP REV01,,0,x,
|
|
||||||
000991211,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,2000,x,FERRARI,100,,10,,000991211,,1000,x,
|
|
||||||
5802170779 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,8000,x,IVECO,100,,10,,5802170779 REV0,,0,x,
|
|
||||||
MY83-6L701-AB,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,0,x,specificare cliente,100,,10,,MY83-6L701-AB,,0,x,
|
|
||||||
000990701,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,2000,x,FERRARI,100,,10,,000990701,,1000,x,
|
|
||||||
055019161,x,ferrari_30x16_203.prn,15000,,0,1000,20,,x,0,,1500,x,FERRARI F250,100,,10,,055019161,,1000,x,
|
|
||||||
16FA026SP REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,200,x,MCLAREN,100,,10,,16FA026SP REV01,,0,x,
|
|
||||||
16FC056CX REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,1000,x,MCLAREN,100,,10,,16FC056CX REV01,,0,x,
|
|
||||||
16FC201CX REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,300,x,MCLAREN,100,,10,,16FC201CX REV01,,0,x,
|
|
||||||
16FC446CP REV01,x,Mclaren_barcode.prn,1000,,0,1000,20,,x,0,,200,x,MCLAREN ,100,,10,,16FC446CP REV01,,0,x,
|
|
||||||
16FC541CT REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,200,x,MCLAREN,100,,10,,16FC541CT REV01,,0,x,
|
|
||||||
16L0145CP REV03,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16L0145CP REV03,,0,x,
|
|
||||||
16L0154CP REV03,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16L0154CP REV03,,0,x,
|
|
||||||
16L0161CP REV04,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16L0161CP REV04,,0,x,
|
|
||||||
16L0164CP REV02,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16L0164CP REV02,,0,x,
|
|
||||||
16L0167CP REV02,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16L0167CP REV02,,0,x,
|
|
||||||
16L0170CP REV03,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16L0170CP REV03,,0,x,
|
|
||||||
16L0174CP REV02,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16L0174CP REV02,,0,x,
|
|
||||||
16L0177CP REV03,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16L0177CP REV03,,0,x,
|
|
||||||
16L0180CP REV04,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16L0180CP REV04,,0,x,
|
|
||||||
16LA372CP REV01,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16LA372CP REV01,,0,x,
|
|
||||||
16LA452CP REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA452CP REV01,,0,x,
|
|
||||||
16LA515CP REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA515CP REV01,,0,x,
|
|
||||||
98FA644CP,x,MCLAREN_353.prn,15000,,0,1000,20,,x,5,,2000,x,RICARDO,100,,10,,98FA644CP,,3500,x,
|
|
||||||
000990708,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,5000,x,FERRARI,100,,10,,000990708,,1000,x,
|
|
||||||
5802889709 REV3,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,IVECO,100,,10,,5802889709 REV3,,0,x,
|
|
||||||
16LA648CP REV01,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA648CP REV01,,0,x,
|
|
||||||
TEST FUGA 7 BAR,x,ETA30x16.prn,15000,,0,1000,5,,x,0,,7000,x,specificare cliente,100,,10,,TEST FUGA 7 BAR,,0,x,
|
|
||||||
dev test,x,MCLAREN_353.prn,15000,,0,1000,10,,x,0,,7000,x,specificare cliente,100,,10,,dev test,,1000,x,
|
|
||||||
16FB157CP REV03,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,1000,x,MCLAREN,100,,10,,16FB157CP REV03,,0,x,
|
|
||||||
16FB394CP REV04,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,3000,x,RICARDO,100,,10,,16FB394CP REV04,,0,x,
|
|
||||||
16FC069CP REV01,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,1000,x,RICARDO,100,,10,,16FC069CP REV01,,0,x,
|
|
||||||
16FC084CP REV02,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,3000,x,RICARDO,100,,10,,16FC084CP REV02,,0,x,
|
|
||||||
16L0002CP REV03,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16L0002CP REV03,,0,x,
|
|
||||||
16L0007CP REV03,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16L0007CP REV03,,0,x,
|
|
||||||
16LA661CP REV01,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,3500,x,MCLAREN,100,,10,,16LA661CP REV01,,0,x,
|
|
||||||
16FA849CP REV05,x,Mclaren_barcode.prn,15000,,0,1000,20,,x,0,,1000,x,MCLAREN,100,,10,,16FA849CP REV05,,0,x,
|
|
||||||
5802953113 REV.,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,IVECO,100,,10,,5802953113 REV.,,0,x,
|
|
||||||
5802980014 REV.,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,IVECO,100,,10,,5802980014 REV.,,0,x,
|
|
||||||
5802981174 REV.,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,60,,x,0,,0,x,IVECO,100,,10,,5802981174 REV.,,0,x,
|
|
||||||
5803112815 R.1,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,0,x,IVECO,100,,10,,5803112815 R.1,,0,x,
|
|
||||||
5803112816 R.1,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,10,,x,0,,0,x,IVECO,100,,10,,5803112816 R.1,,0,x,
|
|
||||||
590.2.418.1A,x,ETA30x16_203dpi.prn,15000,,0,1000,5,,x,0,,1000,x,DUCATI,100,,10,,590.2.418.1A,,1000,x,
|
|
||||||
16FC469CP REV01,x,Mclaren_barcode.prn,15000,,0,1000,20,,x,0,,200,x,MCLAREN,100,,10,,16FC469CP REV01,,0,x,
|
|
||||||
98FA186CP,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,3000,x,RICARDO,100,,10,,98FA186CP,,1000,x,
|
|
||||||
5802170804 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,8000,x,IVECO,100,,10,,5802170804 REV0,,0,x,
|
|
||||||
98FB080CP,x,MCLAREN_353.prn,15000,98FB080CP-20B{N11},0,1000,20,,x,0,,200,x,MCLAREN,100,,10,,98FB080CP,,0,x,
|
|
||||||
98FB080CP-20B,x,label_interoperazione.prn,15000,,0,1000,10,,x,0,,3000,x,MCLAREN,100,,10,,98FB080CP-20B,,0,x,
|
|
||||||
98FB081CP,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,200,x,MCLAREN,100,,10,,98FB081CP,,0,x,
|
|
||||||
16JA605CP,x,ETA30x16_203dpi.prn,15000,,0,1000,10,,x,10,,0,x,MCLAREN,100,,10,,16JA605CP,,500,x,
|
|
||||||
16FC256CP REV01,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,1000,x,MCLAREN,100,,10,,16FC256CP REV01,,0,x,
|
|
||||||
055055934,x,ETA30x16_203dpi.prn,15000,,0,1000,20,,x,0,,6800,x,FERRARI,100,,10,,055055934,,1000,x,
|
|
||||||
055038417,x,ETA30x16_203dpi.prn,15000,,0,1000,20,,x,0,,2000,x,FERRARI,100,,10,,055038417,,1000,x,
|
|
||||||
055038405,x,ETA30x16_203dpi.prn,15000,,0,1000,20,,x,0,,2000,x,FERRARI,100,,10,,055038405,,1000,x,
|
|
||||||
16LA668CP REV01,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA668CP REV01,,0,x,
|
|
||||||
16LA617CP REV01,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA617CP REV01,,0,x,
|
|
||||||
16L0075CP REV03,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16L0075CP REV03,,0,x,
|
|
||||||
60175799 REV0,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,specificare cliente,100,,10,,60175799 REV0,,0,x,
|
|
||||||
000746453,x,ERRECINQUE_flag_qr_only.prn,15000,,0,1000,30,,x,0,,0,x,MCLAREN,100,,10,,000746453,,0,x,
|
|
||||||
000904357,x,ETA30x16_203dpi.prn,15000,,0,1000,20,,x,0,,4100,x,FERRARI,100,,10,,000904357,,1000,x,
|
|
||||||
000952005,x,ferrari_30x16_203.prn,15000,,0,1000,20,,x,0,,2000,x,FERRARI F250,100,,10,,000952005,,1000,x,
|
|
||||||
000952022,x,ferrari_30x16_203.prn,15000,,0,1000,20,,x,0,,2000,x,FERRARI F250,100,,10,,000952022,,1000,x,
|
|
||||||
000960275,x,ERRECINQUE_flag_qr_only.prn,15000,,0,1000,30,,x,0,,2500,x,Ferrari,100,,10,,000960275,,0,x,
|
|
||||||
000960281,x,ERRECINQUE_flag_qr_only.prn,15000,,0,1000,30,,x,0,,2500,x,Ferrari,100,,10,,000960281,,0,x,
|
|
||||||
000960322,x,ERRECINQUE_flag_qr_only.prn,15000,,0,1000,30,,x,0,,2500,x,Ferrari,100,,10,,000960322,,0,x,
|
|
||||||
000987571,x,ferrari_30x16_203.prn,15000,,0,1000,0,,x,0,,0,x,ferrari,100,,10,,000987571,,0,x,
|
|
||||||
000987572,x,ferrari_30x16_203.prn,15000,,0,1000,0,,x,0,,0,x,ferrari,100,,10,,000987572,,0,x,
|
|
||||||
000987923,x,ferrari_30x16_203.prn,0,,0,0,10,,x,0,,2100,x,FERRARI,100,,10,,000987923,,0,x,
|
|
||||||
000987924,x,ferrari_30x16_203.prn,0,,0,0,10,,x,0,,2100,x,FERRARI,100,,10,,000987924,,0,x,
|
|
||||||
000990679,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,2000,x,FERRARI,100,,10,,000990679,,1000,x,
|
|
||||||
000990680,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,2000,x,FERRARI,100,,10,,000990680,,1000,x,
|
|
||||||
000990681,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,2000,x,FERRARI,100,,10,,000990681,,1000,x,
|
|
||||||
000990684,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,2000,x,FERRARI,100,,10,,000990684,,1000,x,
|
|
||||||
000990685,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,2000,x,FERRARI,100,,10,,000990685,,1000,x,
|
|
||||||
000990686,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,2000,x,FERRARI,100,,10,,000990686,,1000,x,
|
|
||||||
000990687,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,5000,x,FERRARI,100,,10,,000990687,,1000,x,
|
|
||||||
000990688,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,2000,x,FERRARI,100,,10,,000990688,,1000,x,
|
|
||||||
000990690,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,2000,x,FERRARI,100,,10,,000990690,,1000,x,
|
|
||||||
000990691,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,2000,x,FERRARI,100,,10,,000990691,,1000,x,
|
|
||||||
000990692,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,2000,x,FERRARI,100,,10,,000990692,,1000,x,
|
|
||||||
000990696,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,2000,x,FERRARI,100,,10,,000990696,,1000,x,
|
|
||||||
000990700,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,2000,x,FERRARI,100,,10,,000990700,,1000,x,
|
|
||||||
18FA535CP,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,500,x,MCLAREN,100,,10,,18FA535CP,,1000,x,
|
|
||||||
SY9Y-2976-AB,x,MCLAREN_353.prn,15000,,0,1000,10,,x,0,,3000,x,ASTON MARTIN,100,,10,,SY9Y-2976-AB,,1000,x,
|
|
||||||
SY9Y-2976-AC,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,ASTON MARTIN,100,,10,,SY9Y-2976-AC,,1000,x,
|
|
||||||
SY9Y-2976-BB,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,ASTON MARTIN,100,,10,,SY9Y-2976-BB,,1000,x,
|
|
||||||
SY9Y-2976-BC,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,ASTON MARTIN,100,,10,,SY9Y-2976-BC,,1000,x,
|
|
||||||
SY9Y-9S331-AB,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,ASTON MARTIN,100,,10,,SY9Y-9S331-AB,,1000,x,
|
|
||||||
SY9Y-9S331-BB,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,ASTON MARTIN,100,,10,,SY9Y-9S331-BB,,1000,x,
|
|
||||||
16LA518CP REV02,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,3000,x,MCLAREN,100,,10,,16LA518CP REV02,,0,x,
|
|
||||||
16LA718CP REV02,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16LA718CP REV02,,0,x,
|
|
||||||
18JB918CP,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,18JB918CP,,1000,x,
|
|
||||||
18JB921CP,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,18JB921CP,,1000,x,
|
|
||||||
18JB916CP,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,18JB916CP,,1000,x,
|
|
||||||
18JB927CP,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,18JB927CP,,1000,x,
|
|
||||||
16L0151CP REV03,x,MCLAREN_353.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,16L0151CP REV03,,0,x,
|
|
||||||
16LA451CP REV01,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,30,,x,0,,3500,x,MCLAREN,100,,10,,16LA451CP REV01,,0,x,
|
|
||||||
18JB951CP,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,18JB951CP,,1000,x,
|
|
||||||
18JB925CP,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,18JB925CP,,1000,x,
|
|
||||||
18FA126CP,x,MCLAREN_353.prn,15000,,0,1000,20,,x,0,,500,x,MCLAREN,100,,10,,18FA126CP,,0,x,
|
|
||||||
18JB926CP,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,,3000,x,MCLAREN,100,,10,,18JB926CP,,1000,x,
|
|
||||||
000960324,x,ERRECINQUE_flag_qr_only.prn,15000,,0,1000,30,,x,10,,2500,x,Ferrari,100,,10,,000960324,,3000,x,
|
|
||||||
5803217628 REV.,x,EtichettaR5_Montaggio_1prova.prn,15000,,0,1000,20,,x,0,,0,x,IVECO,100,,10,,5803217628 REV.,,0,x,
|
|
||||||
07N131597A,x,Lamborghini_30x16.prn,15000,,0,1000,30,,x,0,,1000,x,LAMBORGHINI,100,,10,,07N131597A,,0,x,
|
|
||||||
07N131628A,x,Lamborghini_30x16.prn,15000,,0,1000,10,,x,0,,200,x,LAMBORGHINI,100,,10,,07N131628A,,0,x,
|
|
||||||
18JA708CP,x,ERRECINQUE_flag_qr_only.prn,15000,,0,1000,30,x,x,0,1000,3000,x,AVL,100,10,10,,18JA708CP,5,1000,x,35
|
|
||||||
18JA709CP,x,ETA30x16_203dpi.prn,15000,,0,1000,30,,x,0,,3000,x,AVL,100,,10,,18JA709CP,,1000,x,
|
|
||||||
18JA710CP,x,ETA30x16_203dpi.prn,15000,,0,1000,30,,x,0,,3000,x,AVL,100,,10,,18JA710CP,,1000,x,
|
|
||||||
18JA712CP,x,ETA30x16_203dpi.prn,15000,,0,1000,30,,x,0,,3000,x,AVL,100,,10,,18JA712CP,,1000,x,
|
|
||||||
18JA713CP,x,ETA30x16_203dpi.prn,15000,,0,1000,30,,x,0,,3000,x,AVL,100,,10,,18JA713CP,,1000,x,
|
|
||||||
18JA750CP,x,ETA30x16_203dpi.prn,15000,,0,1000,30,,x,0,,3000,x,AVL,100,,10,,18JA750CP,,1000,x,
|
|
||||||
18JA757CP,x,ETA30x16_203dpi.prn,15000,,0,1000,30,,x,0,,3000,x,AVL,100,,10,,18JA757CP,,1000,x,
|
|
||||||
18JB923CP,x,ferrari_30x16_203.prn,15000,,0,1000,30,,x,0,0,3000,x,MCLAREN,100,15,10,,18JB923CP,5,1000,x,150
|
|
||||||
|
|
|
||||||
|
|
|
@ -41,6 +41,7 @@ recipe_name_field: codice_ricetta
|
||||||
part_number_field: codice_ricetta
|
part_number_field: codice_ricetta
|
||||||
label_template_field: modello_etichetta
|
label_template_field: modello_etichetta
|
||||||
description_field: descrizione
|
description_field: descrizione
|
||||||
|
codice_dima_field:
|
||||||
|
|
||||||
[recipes_defaults]
|
[recipes_defaults]
|
||||||
tester_discharge_enable: yes
|
tester_discharge_enable: yes
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,11 @@ import subprocess
|
||||||
import tarfile
|
import tarfile
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
import cv2
|
# OpenCV is optional: only needed for commented image endpoints; avoid hard dependency at import time
|
||||||
|
try:
|
||||||
|
import cv2 # noqa: F401
|
||||||
|
except Exception:
|
||||||
|
cv2 = None # type: ignore
|
||||||
from bottle import post, request, response, route, run
|
from bottle import post, request, response, route, run
|
||||||
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot
|
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot
|
||||||
from PyQt5.QtWidgets import QMessageBox
|
from PyQt5.QtWidgets import QMessageBox
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,14 @@ from src.lib.nfc.clf import RemoteTarget
|
||||||
|
|
||||||
|
|
||||||
class RFID_PN532(Component):
|
class RFID_PN532(Component):
|
||||||
|
"""
|
||||||
|
Windows note:
|
||||||
|
Some environments on Windows have a known issue where writing log output to the
|
||||||
|
console can raise AttributeError: characters_written (typically from win32console
|
||||||
|
when wrapped by certain stream handlers). To prevent this from crashing the
|
||||||
|
component, we route such errors through a safe logger that falls back to
|
||||||
|
printing to stderr.
|
||||||
|
"""
|
||||||
new_id_signal = pyqtSignal(str)
|
new_id_signal = pyqtSignal(str)
|
||||||
rfid_error_signal = pyqtSignal(bool)
|
rfid_error_signal = pyqtSignal(bool)
|
||||||
|
|
||||||
|
|
@ -30,10 +38,34 @@ class RFID_PN532(Component):
|
||||||
self._fail_log_limit = 10
|
self._fail_log_limit = 10
|
||||||
self._fail_log_suppressed = False
|
self._fail_log_suppressed = False
|
||||||
|
|
||||||
|
def _safe_log(self, level, msg, exc: Exception = None):
|
||||||
|
try:
|
||||||
|
if exc is not None:
|
||||||
|
msg = f"{msg}: {exc}"
|
||||||
|
getattr(self.log, level)(msg)
|
||||||
|
except AttributeError as ae:
|
||||||
|
# Workaround for Windows console logger bug: AttributeError: characters_written
|
||||||
|
if str(ae) == 'characters_written':
|
||||||
|
try:
|
||||||
|
import sys as _sys
|
||||||
|
_sys.stderr.write(f"[RFID_PN532:{level}] {msg}\n")
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
def open_device(self):
|
def open_device(self):
|
||||||
self.clf = src.lib.nfc.ContactlessFrontend()
|
self.clf = src.lib.nfc.ContactlessFrontend()
|
||||||
for dev in self.dev_list:
|
for dev in self.dev_list:
|
||||||
self.connected = self.clf.open(dev)
|
try:
|
||||||
|
self.connected = self.clf.open(dev)
|
||||||
|
except Exception as e:
|
||||||
|
self.connected = False
|
||||||
|
msg = "RFID open failed"
|
||||||
|
# Make timeout on Windows (WinError 10060) more explicit
|
||||||
|
if '10060' in str(e):
|
||||||
|
msg = "RFID open timed out (WinError 10060). Check COM port and PN532 wiring/power."
|
||||||
|
self._safe_log('info', f"{msg} on {dev}", e)
|
||||||
if self.connected:
|
if self.connected:
|
||||||
# Reset failure log suppression on successful connection
|
# Reset failure log suppression on successful connection
|
||||||
self._fail_log_count = 0
|
self._fail_log_count = 0
|
||||||
|
|
@ -100,7 +132,7 @@ class RFID_PN532(Component):
|
||||||
self.rfid_error_signal.emit(self.connected)
|
self.rfid_error_signal.emit(self.connected)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.log.info(f"{e}")
|
self._safe_log('info', 'RFID runtime error', e)
|
||||||
self.connected = False
|
self.connected = False
|
||||||
finally:
|
finally:
|
||||||
if not self.connected:
|
if not self.connected:
|
||||||
|
|
@ -135,7 +167,7 @@ class RFID_PN532(Component):
|
||||||
else:
|
else:
|
||||||
self.log.debug("No tag present for writing")
|
self.log.debug("No tag present for writing")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.log.error(f"Error during tag writing: {e}")
|
self._safe_log('error', 'Error during tag writing', e)
|
||||||
finally:
|
finally:
|
||||||
# Move closing outside the try block
|
# Move closing outside the try block
|
||||||
self.mutex.unlock() # Unlock mutex always
|
self.mutex.unlock() # Unlock mutex always
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,11 @@ import shutil
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import cv2
|
# OpenCV is optional; only needed when saving frames
|
||||||
|
try:
|
||||||
|
import cv2 # noqa: F401
|
||||||
|
except Exception:
|
||||||
|
cv2 = None # type: ignore
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
from .component import Component
|
from .component import Component
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,14 @@ models_reference = {
|
||||||
db.connect()
|
db.connect()
|
||||||
db.create_tables(list(models_reference.values()))
|
db.create_tables(list(models_reference.values()))
|
||||||
|
|
||||||
|
# Ensure schema migrations for new fields
|
||||||
|
try:
|
||||||
|
cols = [r[1] for r in db.execute_sql("PRAGMA table_info(recipes)").fetchall()]
|
||||||
|
if "codice_dima" not in cols:
|
||||||
|
db.execute_sql("ALTER TABLE recipes ADD COLUMN codice_dima TEXT")
|
||||||
|
except Exception as e:
|
||||||
|
logging.getLogger("db").warning(f"Schema check/update failed: {e}")
|
||||||
|
|
||||||
log = logging.getLogger("db")
|
log = logging.getLogger("db")
|
||||||
|
|
||||||
@db.atomic()
|
@db.atomic()
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ class Recipes(BaseModel):
|
||||||
name = TextField(primary_key=True, unique=True, null=False, default=lambda: uuid().hex)
|
name = TextField(primary_key=True, unique=True, null=False, default=lambda: uuid().hex)
|
||||||
client = TextField(null=True)
|
client = TextField(null=True)
|
||||||
part_number = TextField(null=False)
|
part_number = TextField(null=False)
|
||||||
|
codice_dima = TextField(null=True) # New column: Codice Dima
|
||||||
spec = JSONField(null=False)
|
spec = JSONField(null=False)
|
||||||
description = TextField(null=True)
|
description = TextField(null=True)
|
||||||
archived = BooleanField(null=False, default=False)
|
archived = BooleanField(null=False, default=False)
|
||||||
|
|
|
||||||
|
|
@ -206,6 +206,7 @@ def import_recipes(config, csv_path=None, defaults=None, unsupported_steps=None,
|
||||||
recipe_name_field = config.get("recipe", {}).get("recipe_name_field", "codice_ricetta").strip()
|
recipe_name_field = config.get("recipe", {}).get("recipe_name_field", "codice_ricetta").strip()
|
||||||
part_number_field = config.get("recipe", {}).get("part_number_field", "part_number").strip()
|
part_number_field = config.get("recipe", {}).get("part_number_field", "part_number").strip()
|
||||||
description_field = config.get("recipe", {}).get("description_field", "descrizione").strip()
|
description_field = config.get("recipe", {}).get("description_field", "descrizione").strip()
|
||||||
|
codice_dima_field = config.get("recipe", {}).get("codice_dima_field", "codice_dima").strip()
|
||||||
barcode_enable_field = config.get(
|
barcode_enable_field = config.get(
|
||||||
"recipe", {}
|
"recipe", {}
|
||||||
).get("barcode_enable_field", "verifica_codice_a_barre_abilitata").strip()
|
).get("barcode_enable_field", "verifica_codice_a_barre_abilitata").strip()
|
||||||
|
|
@ -237,6 +238,8 @@ def import_recipes(config, csv_path=None, defaults=None, unsupported_steps=None,
|
||||||
recipe.client = row.get("cliente", defaults["cliente"])
|
recipe.client = row.get("cliente", defaults["cliente"])
|
||||||
recipe.part_number = row.get(part_number_field, defaults["part_number"])
|
recipe.part_number = row.get(part_number_field, defaults["part_number"])
|
||||||
recipe.description = row.get(description_field, defaults["descrizione"])
|
recipe.description = row.get(description_field, defaults["descrizione"])
|
||||||
|
# New field: Codice Dima (supports mapping and common variants)
|
||||||
|
recipe.codice_dima = (row.get(codice_dima_field) or row.get("codice_dima") or row.get("codice dima") or None)
|
||||||
|
|
||||||
# Recipe specifications
|
# Recipe specifications
|
||||||
steps = {}
|
steps = {}
|
||||||
|
|
@ -325,6 +328,7 @@ def export_recipes(config, csv_path=None, logger=None):
|
||||||
os.makedirs(os.path.dirname(csv_path), exist_ok=True)
|
os.makedirs(os.path.dirname(csv_path), exist_ok=True)
|
||||||
|
|
||||||
recipe_name_field = config.get("recipe", {}).get("recipe_name_field", "codice_ricetta").strip()
|
recipe_name_field = config.get("recipe", {}).get("recipe_name_field", "codice_ricetta").strip()
|
||||||
|
codice_dima_field = config.get("recipe", {}).get("codice_dima_field", "codice_dima").strip()
|
||||||
barcode_enable_field = config.get("recipe", {}).get("barcode_enable_field",
|
barcode_enable_field = config.get("recipe", {}).get("barcode_enable_field",
|
||||||
"verifica_codice_a_barre_abilitata").strip()
|
"verifica_codice_a_barre_abilitata").strip()
|
||||||
barcode_serial_field = config.get("recipe", {}).get("barcode_serial_field", "codice_a_barre").strip()
|
barcode_serial_field = config.get("recipe", {}).get("barcode_serial_field", "codice_a_barre").strip()
|
||||||
|
|
@ -343,10 +347,11 @@ def export_recipes(config, csv_path=None, logger=None):
|
||||||
recipe_name_field: recipe.name,
|
recipe_name_field: recipe.name,
|
||||||
"cliente": recipe.client,
|
"cliente": recipe.client,
|
||||||
"part_number": recipe.part_number,
|
"part_number": recipe.part_number,
|
||||||
|
codice_dima_field: getattr(recipe, "codice_dima", None),
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add base fields to the fieldnames
|
# Add base fields to the fieldnames
|
||||||
fieldnames.update([recipe_name_field, "cliente", "part_number"])
|
fieldnames.update([recipe_name_field, "cliente", "part_number", codice_dima_field])
|
||||||
|
|
||||||
# Check and add steps conditionally
|
# Check and add steps conditionally
|
||||||
if "connector" in steps:
|
if "connector" in steps:
|
||||||
|
|
|
||||||
|
|
@ -20,4 +20,5 @@ requests
|
||||||
#tensorflow
|
#tensorflow
|
||||||
#tflite-runtime
|
#tflite-runtime
|
||||||
zebra
|
zebra
|
||||||
pylibdmtx~=0.1.10
|
pylibdmtx~=0.1.10
|
||||||
|
opencv-python
|
||||||
|
|
@ -6,9 +6,9 @@ import weakref
|
||||||
from glob import glob
|
from glob import glob
|
||||||
|
|
||||||
from lib.db import Recipes, Users, db
|
from lib.db import Recipes, Users, db
|
||||||
from PyQt5.QtCore import QTimer, pyqtSignal
|
from PyQt5.QtCore import QTimer, pyqtSignal, Qt
|
||||||
from PyQt5.QtGui import QKeySequence
|
from PyQt5.QtGui import QKeySequence
|
||||||
from PyQt5.QtWidgets import QFileDialog, QMessageBox, QShortcut
|
from PyQt5.QtWidgets import QFileDialog, QMessageBox, QShortcut, QInputDialog, QDialog, QVBoxLayout, QLabel, QLineEdit, QDialogButtonBox
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
from lib.helpers.recipe_manager import export_recipes, import_recipes, recipe_manager_signals, backup_current_recipes
|
from lib.helpers.recipe_manager import export_recipes, import_recipes, recipe_manager_signals, backup_current_recipes
|
||||||
|
|
@ -57,6 +57,7 @@ class Recipe_Selection(Widget):
|
||||||
"name": "Ricetta",
|
"name": "Ricetta",
|
||||||
"client": "Cliente",
|
"client": "Cliente",
|
||||||
"part_number": "N° disegno",
|
"part_number": "N° disegno",
|
||||||
|
"codice_dima": "Codice Dima",
|
||||||
"spec": "Specifica",
|
"spec": "Specifica",
|
||||||
"description": "Descrizione",
|
"description": "Descrizione",
|
||||||
}
|
}
|
||||||
|
|
@ -67,6 +68,7 @@ class Recipe_Selection(Widget):
|
||||||
"name": "Ricetta",
|
"name": "Ricetta",
|
||||||
"client": "Cliente",
|
"client": "Cliente",
|
||||||
"part_number": "N° disegno",
|
"part_number": "N° disegno",
|
||||||
|
"codice_dima": "Codice Dima",
|
||||||
"spec": "Specifica",
|
"spec": "Specifica",
|
||||||
"description": "Descrizione",
|
"description": "Descrizione",
|
||||||
}
|
}
|
||||||
|
|
@ -309,7 +311,112 @@ class Recipe_Selection(Widget):
|
||||||
|
|
||||||
def select(self):
|
def select(self):
|
||||||
if self.selected is not None:
|
if self.selected is not None:
|
||||||
self.ok.emit(self.crud.db.table_model.get_by_id(self.selected))
|
# Get the initially selected recipe
|
||||||
|
selected_recipe = self.crud.db.table_model.get_by_id(self.selected)
|
||||||
|
|
||||||
|
# If there are other recipes with the same codice_dima, ask for a QR/barcode to disambiguate
|
||||||
|
try:
|
||||||
|
codice_dima_value = getattr(selected_recipe, 'codice_dima', None)
|
||||||
|
except Exception:
|
||||||
|
codice_dima_value = None
|
||||||
|
|
||||||
|
final_recipe = selected_recipe
|
||||||
|
|
||||||
|
if codice_dima_value:
|
||||||
|
try:
|
||||||
|
candidates = list(Recipes.select().where(
|
||||||
|
(Recipes.codice_dima == codice_dima_value) & (Recipes.archived == False)
|
||||||
|
))
|
||||||
|
except Exception:
|
||||||
|
candidates = [selected_recipe]
|
||||||
|
|
||||||
|
if len(candidates) > 1:
|
||||||
|
# Prompt for a QR/barcode. If it contains or matches a recipe name among candidates, use that; else abort.
|
||||||
|
text, ok = self._prompt_qr_for_dima()
|
||||||
|
if not (ok and text):
|
||||||
|
# Cancelled or empty: do nothing
|
||||||
|
return
|
||||||
|
user_in = str(text).strip()
|
||||||
|
user_in_low = user_in.lower()
|
||||||
|
|
||||||
|
# 1) Exact match on full content
|
||||||
|
exact = next((r for r in candidates if str(r.name).strip().lower() == user_in_low), None)
|
||||||
|
if exact is not None:
|
||||||
|
final_recipe = exact
|
||||||
|
else:
|
||||||
|
# 2) Substring containment (QR contains the recipe name)
|
||||||
|
contains = [r for r in candidates if str(r.name).strip().lower() in user_in_low]
|
||||||
|
if len(contains) == 1:
|
||||||
|
final_recipe = contains[0]
|
||||||
|
elif len(contains) > 1:
|
||||||
|
QMessageBox.warning(self, 'Ambiguità QR', 'Il QR corrisponde a più ricette. Riprovare o selezionare manualmente.')
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
# 3) Try to parse common token formats from QR (key=value, JSON-like, space/newline separated)
|
||||||
|
try:
|
||||||
|
import re
|
||||||
|
tokens = re.split(r'[^A-Za-z0-9_\-]+', user_in)
|
||||||
|
tokens_low = [t.lower() for t in tokens if t]
|
||||||
|
name_map = {str(r.name).strip().lower(): r for r in candidates}
|
||||||
|
found = None
|
||||||
|
for t in tokens_low:
|
||||||
|
if t in name_map:
|
||||||
|
found = name_map[t]
|
||||||
|
break
|
||||||
|
if found is not None:
|
||||||
|
final_recipe = found
|
||||||
|
else:
|
||||||
|
QMessageBox.warning(self, 'QR non valido', 'Il QR non contiene un nome ricetta valido per il Codice Dima selezionato.')
|
||||||
|
return
|
||||||
|
except Exception:
|
||||||
|
QMessageBox.warning(self, 'Errore', 'Impossibile elaborare il QR. Riprovare.')
|
||||||
|
return
|
||||||
|
|
||||||
|
# Emit the resolved recipe (either the originally selected one or the matched one)
|
||||||
|
self.ok.emit(final_recipe)
|
||||||
|
|
||||||
|
def _prompt_qr_for_dima(self):
|
||||||
|
"""Show a larger dialog to disambiguate recipes when multiple share the same Codice Dima.
|
||||||
|
Returns (text, ok) like QInputDialog.getText.
|
||||||
|
"""
|
||||||
|
dlg = QDialog(self)
|
||||||
|
dlg.setWindowTitle('Selezione tramite QR')
|
||||||
|
layout = QVBoxLayout(dlg)
|
||||||
|
|
||||||
|
# Highly visible warning requested by user
|
||||||
|
warn = QLabel('SCANSIONARE IL FOGLIO DI LAVORO PER SELZIONARE IL CODICE DA COLLAUDARE', dlg)
|
||||||
|
warn.setWordWrap(True)
|
||||||
|
warn.setAlignment(Qt.AlignCenter)
|
||||||
|
warn.setStyleSheet('font-size: 26px; font-weight: 700; color: red; background-color: yellow; padding: 12px;')
|
||||||
|
layout.addWidget(warn)
|
||||||
|
|
||||||
|
edit = QLineEdit(dlg)
|
||||||
|
edit.setPlaceholderText('Scansiona o digita qui e premi Invio...')
|
||||||
|
layout.addWidget(edit)
|
||||||
|
|
||||||
|
buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, parent=dlg)
|
||||||
|
layout.addWidget(buttons)
|
||||||
|
|
||||||
|
buttons.accepted.connect(dlg.accept)
|
||||||
|
buttons.rejected.connect(dlg.reject)
|
||||||
|
edit.returnPressed.connect(dlg.accept)
|
||||||
|
|
||||||
|
# Enlarge dialog by 50% for better visibility
|
||||||
|
dlg.setModal(True)
|
||||||
|
dlg.adjustSize()
|
||||||
|
sh = dlg.sizeHint()
|
||||||
|
try:
|
||||||
|
dlg.resize(int(sh.width() * 1.5), int(sh.height() * 1.5))
|
||||||
|
except Exception:
|
||||||
|
# Fallback to a reasonable minimum size if sizeHint is unavailable
|
||||||
|
dlg.resize(700, 400)
|
||||||
|
|
||||||
|
edit.setFocus()
|
||||||
|
result = dlg.exec_()
|
||||||
|
if result == QDialog.Accepted:
|
||||||
|
return edit.text(), True
|
||||||
|
else:
|
||||||
|
return '', False
|
||||||
|
|
||||||
def get_def(self, dict, key):
|
def get_def(self, dict, key):
|
||||||
val = dict.get(key, self.defaults[key])
|
val = dict.get(key, self.defaults[key])
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ from datetime import datetime, timedelta
|
||||||
#from distutils.util import change_root
|
#from distutils.util import change_root
|
||||||
|
|
||||||
from PyQt5.QtCore import QTimer, pyqtSlot, pyqtSignal
|
from PyQt5.QtCore import QTimer, pyqtSlot, pyqtSignal
|
||||||
from PyQt5.QtWidgets import QMessageBox
|
from PyQt5.QtWidgets import QMessageBox, QInputDialog
|
||||||
from lib.db import Archive, Recipes, Users
|
from lib.db import Archive, Recipes, Users
|
||||||
from lib.helpers import get_shift
|
from lib.helpers import get_shift
|
||||||
from lib.helpers.step import Step
|
from lib.helpers.step import Step
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user