Compare commits

...

408 Commits

Author SHA1 Message Date
2f54b375b9 Finish v1.50.04(553)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-12-10 18:51:24 +01:00
9aa9b9121f -> v1.50.04 (553) 2025-12-10 18:51:16 +01:00
268ce9fce9 Sistemato dialog caricamento in accettazione merce 2025-12-10 18:49:56 +01:00
4861d53031 Finish v1.50.03(552) 2025-12-10 13:38:02 +01:00
e27a4e840a Finish v1.50.03(552)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-12-10 13:38:01 +01:00
cc67ac5f47 -> v1.50.03 (552) 2025-12-10 13:37:53 +01:00
8e2d110792 Rimosso da VerificaGiacenze il carcamento di tutta la gacenza dopo aver scansionato il deposito 2025-12-10 13:33:44 +01:00
9924165362 Finish v1.50.02(551) 2025-12-09 17:04:35 +01:00
0904388ffe Finish v1.50.02(551)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-12-09 17:04:34 +01:00
f86296d2a1 -> v1.50.02(551) 2025-12-09 17:04:27 +01:00
4d01a52590 Finish v1.50.01(550) 2025-12-09 16:15:28 +01:00
638e8650ee Finish v1.50.01(550)
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-12-09 16:15:27 +01:00
36061faeeb -> v1.50.01 (550) 2025-12-09 16:15:19 +01:00
a88ddab405 Finish v1.50.00(549) 2025-12-09 13:32:22 +01:00
9fb18215e3 Finish v1.50.00(549)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-12-09 13:32:21 +01:00
2e3af6d1b3 -> v1.50.00 (549) 2025-12-09 13:32:09 +01:00
663d172edf Aggiornato AGP 8.13.1 2025-12-05 17:30:32 +01:00
092fbd69b6 Finish v1.49.04(548) 2025-12-05 13:19:07 +01:00
878584a619 Finish v1.49.04(548)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-12-05 13:19:06 +01:00
5d52e2df46 -> v1.49.04 (548) 2025-12-05 13:19:02 +01:00
809d4ef5af Migliorata gestione aggiornamento obbligatorio 2025-12-05 13:05:05 +01:00
faa45cd096 In accettazione bolla aggiunta possibilità di segnare la bolla come consegnata 2025-12-05 12:23:26 +01:00
1ab9b10a13 Migliorie UI dark accettazione 2025-12-05 11:01:18 +01:00
cce4d2dbb2 Finish v1.49.03(547) 2025-12-04 19:26:13 +01:00
db246e6a94 Finish v1.49.03(547)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-12-04 19:26:12 +01:00
37ce428bf0 -> v1.49.03 (547) 2025-12-04 19:26:08 +01:00
bb1867b1c8 Aggiunto supporto per approvvigionamento linee nella gestione delle spedizioni 2025-12-04 17:55:35 +01:00
c104313d89 Migliorie UI 2025-12-04 10:04:16 +01:00
c8cc56bfd6 Fix su color dark mode 2025-12-02 12:25:08 +01:00
80b5b8db34 Finish v1.49.02(546) 2025-11-26 13:28:38 +01:00
e0b86db09d Finish v1.49.02(546)
Some checks failed
WMS - Android (New)/pipeline/head Something is wrong with the build of this commit
2025-11-26 13:28:37 +01:00
9d871f3ae4 -> v1.49.02 (546) 2025-11-26 13:28:32 +01:00
e025b234a7 Aggiunto deposito reale nell'header di ogni richiesta 2025-11-26 13:27:50 +01:00
809ef43445 Finish v1.49.01(545) 2025-11-24 17:20:23 +01:00
1079c38a5f Finish v1.49.01(545)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-11-24 17:20:22 +01:00
f6388eff1c -> v1.49.01 (545) 2025-11-24 17:20:18 +01:00
495a8dae92 Mini migrazione di dataCollo a LocalDate 2025-11-24 13:11:55 +01:00
ed938815bb Finish v1.49.00(544) 2025-11-24 09:38:12 +01:00
539e8b7c31 Finish v1.49.00(544)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-11-24 09:38:11 +01:00
92da8cde53 -> v1.49.00 (544) 2025-11-24 09:37:54 +01:00
3d0f7f16f9 Finish v1.48.03(543)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-11-21 13:32:21 +01:00
501ca404ff Finish v1.48.03(543) 2025-11-21 13:32:21 +01:00
5ad4fd7821 -> v1.48.03 (543) 2025-11-21 13:32:10 +01:00
1ba2fb96ba Finish v1.48.02(542) 2025-11-20 11:43:17 +01:00
ffdd1a1df5 Finish v1.48.02(542)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-11-20 11:43:16 +01:00
0205255f7d -> v1.48.02 (542) 2025-11-20 11:43:03 +01:00
c21e856a0f Finish v1.48.01(541) 2025-11-19 10:59:03 +01:00
b673940dd6 Finish v1.48.01(541)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-11-19 10:59:03 +01:00
b0ce11cbf7 -> v1.48.01 (541) 2025-11-19 10:58:54 +01:00
4ef2c209c8 Finish v1.48.00(540) 2025-11-18 10:22:03 +01:00
41d77b806f Finish v1.48.00(540)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-11-18 10:22:02 +01:00
6b65c4a570 -> v1.48.00 (540) 2025-11-18 10:21:46 +01:00
4d5c0e5509 In DtbDoct sostituite date in localDate 2025-11-11 11:50:01 +01:00
21af5fc0a9 In accettazione aggiunta proposta lotto se presente nell'ordine 2025-11-07 13:28:14 +01:00
09b984f5d0 Passato barcode di etichetta anonima in fase di creazione collo 2025-11-06 09:49:18 +01:00
dd473412cc Finish v1.47.26#2 2025-10-29 15:51:00 +01:00
4f0c5bf6dd Finish v1.47.26#2
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-10-29 15:50:59 +01:00
90e4e2e464 Fix Jenkinsfile 2025-10-29 15:50:24 +01:00
50e2605ea5 Finish v1.47.26(539)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-10-29 11:11:43 +01:00
4752e3a3a2 Finish v1.47.26(539) 2025-10-29 11:11:43 +01:00
3fe903cc12 -> v1.47.26 (539) 2025-10-29 11:11:32 +01:00
3f95a70039 Fix addEmsApi in restConsumer 2025-10-29 11:10:11 +01:00
067443698a In Rientro merce, quando si effettua un carico è stato aggiunta la richiesta di versamento automatico 2025-10-28 16:37:23 +01:00
990a4d1538 Finish v1.47.25(538)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-10-28 11:33:12 +01:00
55c16e602d Finish v1.47.25(538) 2025-10-28 11:33:12 +01:00
6097a7f736 -> v1.47.25 (538) 2025-10-28 11:32:05 +01:00
f8b92901fd Attivato di default l'http interceptor 2025-10-28 10:38:52 +01:00
6c6daa4809 Finish v1.47.24(537) 2025-10-21 18:33:28 +02:00
de8b48d938 Finish v1.47.24(537)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-10-21 18:33:27 +02:00
bfa69ca78b -> v1.47.24 (537) 2025-10-21 18:33:17 +02:00
bffb471015 Fix null in spedizione 2025-10-21 18:32:15 +02:00
087e3e261c Finish v1.47.23(536)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-10-15 11:14:03 +02:00
2eff03dee6 Finish v1.47.23(536) 2025-10-15 11:14:03 +02:00
fc34a555bd -> v1.47.23 (536) 2025-10-15 11:13:55 +02:00
0bf21c046f Migliorie UI Dark per Documenti Interni 2025-10-15 11:13:17 +02:00
473ed536fb Finish v1.47.22(535)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-10-08 19:29:27 +02:00
dc342c1fee Finish v1.47.22(535) 2025-10-08 19:29:27 +02:00
81507938b1 -> v1.47.22 (535) 2025-10-08 19:29:23 +02:00
cff52140bd Fix UI Dark.
Fix separatore virgola nel dialog input quantity.
2025-10-08 19:28:34 +02:00
24d90b58f9 Implementato popup di Device in end of life 2025-10-02 18:02:13 +02:00
b5d049aa1d Rimosso style AppTheme.NewMaterial.Text.Medium e rimpiazzato con Material 2025-10-02 11:49:59 +02:00
01028f9888 Rimossa tab bar dal main fragment 2025-10-02 11:29:48 +02:00
2774eaecbf Aggiornato Jenkinsfile
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-10-02 10:45:31 +02:00
648a572752 Finish v1.47.21(534) 2025-10-01 18:29:07 +02:00
022a56a584 Finish v1.47.21(534)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-10-01 18:29:06 +02:00
ea97e8f249 -> v1.47.21 (534) 2025-10-01 18:29:01 +02:00
571ad1590f .gitignore 2025-10-01 18:28:30 +02:00
03c02d6625 Migliorie dark mode 2025-10-01 18:22:10 +02:00
ba1118fdd8 Fix decodifica barcode in recupero materiale 2025-10-01 17:45:26 +02:00
7878748548 Miglioramenti UI dark mode 2025-10-01 16:36:34 +02:00
172a8256b6 Aggiornato style AppBar 2025-10-01 14:45:25 +02:00
c16f5c1747 Aggiornato style di alcune textbox 2025-10-01 12:50:02 +02:00
33860a0cfe Finish v1.47.20(533)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-09-30 17:44:40 +02:00
15a946dfb6 Finish v1.47.20(533) 2025-09-30 17:44:40 +02:00
62adf49157 -> v1.47.20 (533) 2025-09-30 17:44:34 +02:00
64fcb7ccc8 Fix tara pedana nulla in Bottom Sheet Fragment 2025-09-30 17:42:47 +02:00
3ebdc72642 Finish v1.47.19(532) 2025-09-23 18:03:02 +02:00
aacf5ca76e Finish v1.47.19(532)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-09-23 18:03:01 +02:00
4f134bfc8e -> v1.47.19 (532) 2025-09-23 18:02:52 +02:00
6bd1e62190 Fix errori multipli quando il menu non viene caricato 2025-09-18 17:43:44 +02:00
f9f02452d7 Finish v1.47.18(531)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-09-17 15:22:44 +02:00
b653ae39af Finish v1.47.18(531) 2025-09-17 15:22:44 +02:00
63d1d9ecf0 -> v1.47.18 (531) 2025-09-17 15:22:40 +02:00
9c72a2a628 Fix su retrieve degli ultimi versamenti di materiale 2025-09-17 15:09:01 +02:00
5f1b7ef4a4 Finish v1.47.17(530)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-09-16 17:41:52 +02:00
c36bc9d8c2 Finish v1.47.17(530) 2025-09-16 17:41:52 +02:00
ba9da26ca0 -> v1.47.17 (530) 2025-09-16 17:41:48 +02:00
b2ad4fdb62 Migliorata gestione file di log 2025-09-16 17:40:15 +02:00
60e725f554 Fix su caricamento durante il chiudi ordini spedizione 2025-09-16 12:28:52 +02:00
2f6f9b54c2 Finish v1.47.16(529)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-09-16 10:05:39 +02:00
a2ef35e353 Finish v1.47.16(529) 2025-09-16 10:05:39 +02:00
b06f058ecf -> v1.47.16 (529) 2025-09-16 10:05:35 +02:00
e67cbd3760 Merge remote-tracking branch 'origin/develop' into develop 2025-09-15 17:42:12 +02:00
ce9d304043 Aggiunto invio del file raw del log nel caso in cui vada in eccezione il parsine 2025-09-15 17:36:37 +02:00
fc30b8253d Finish v1.47.15(528) 2025-09-11 13:37:26 +02:00
e8da16cb8a Finish v1.47.15(528)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-09-11 13:37:25 +02:00
dff725ea92 -> v1.47.15 (528) 2025-09-11 13:37:14 +02:00
e4248c8c48 Fix postValue in recupero materiale 2025-09-11 13:35:57 +02:00
819cc97113 Finish v1.47.14(527) 2025-09-10 16:36:08 +02:00
05d806f9f2 Finish v1.47.14(527)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-09-10 16:36:08 +02:00
6fdadffe77 -> v1.47.14 (527) 2025-09-10 16:36:04 +02:00
5ae9371c51 Fix su loading che appare sul popup di conferma chiusura ordine 2025-09-10 16:31:50 +02:00
4861c689d7 Fix su codMdep non ricevuto nel caso di picking Extra Item in Spedizione 2025-09-10 15:50:02 +02:00
1c63908b3b Finish v1.47.13(526) 2025-09-05 11:25:31 +02:00
a622e89058 Finish v1.47.13(526)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-09-05 11:25:30 +02:00
ac4500e2a2 -> v1.47.13 (526) 2025-09-05 11:25:26 +02:00
6ebcbc2d6c Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	app/build.gradle
2025-09-05 11:24:48 +02:00
150be3cae2 Rimosso minify 2025-09-05 11:24:37 +02:00
72edf5228a Rimosso minify 2025-09-05 11:24:11 +02:00
b72a3321d9 Finish v1.47.12(525)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-09-05 11:03:49 +02:00
5bf71a1b0c Finish v1.47.12(525) 2025-09-05 11:03:49 +02:00
ee10427048 -> v1.47.12 (525) 2025-09-05 11:03:45 +02:00
7fb7cbf8ec Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	app/proguard-rules.pro
2025-09-05 11:02:17 +02:00
3a43e9238b Aggiunta esclusione classi JJWT dall'obfuscation 2025-09-05 11:01:58 +02:00
007d58a17e Aggiunta esclusione classi JJWT dall'obfuscation 2025-09-05 11:00:48 +02:00
998a59cffc Finish v1.47.11(524)#3 2025-09-05 10:37:51 +02:00
11b353a91d Finish v1.47.11(524)#3
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-09-05 10:37:50 +02:00
8772d11e02 Aggiunto upload simboli su Firebase 2025-09-05 10:37:36 +02:00
3d772e3722 Finish v1.47.11(524)#2 2025-09-05 10:36:55 +02:00
41cfbc273e Finish v1.47.11(524)#2
Some checks failed
WMS - Android (New)/pipeline/head Something is wrong with the build of this commit
2025-09-05 10:36:54 +02:00
bc67098ae0 Aggiunto upload simboli su Firebase 2025-09-05 10:36:33 +02:00
0e49c93678 Finish v1.47.11(524)#1
Some checks failed
WMS - Android (New)/pipeline/head Something is wrong with the build of this commit
2025-09-05 10:35:58 +02:00
ed93b88ee8 Finish v1.47.11(524)#1 2025-09-05 10:35:58 +02:00
2cb184f24b Aggiunto upload simboli su Firebase 2025-09-05 10:35:40 +02:00
126846aef2 Finish v1.47.11(524)
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-09-05 10:26:20 +02:00
8ac595c6c5 Finish v1.47.11(524) 2025-09-05 10:26:20 +02:00
fc2c0fbe0c -> v1.47.11 (524) 2025-09-05 10:26:15 +02:00
0aa0b09afa Fix su null della variabile Server in Login 2025-09-05 09:47:11 +02:00
9436236eaa Fix postValue in Rientro Merce 2025-09-03 16:51:48 +02:00
fc5568a046 Finish v1.47.10(523) 2025-09-03 13:25:30 +02:00
590e9ec24e Finish v1.47.10(523)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-09-03 13:25:29 +02:00
984a4a156b -> v1.47.10 (523) 2025-09-03 13:25:25 +02:00
04afb4cfca Aggiunti serialized name nei DTO del dialog di selezione cliente 2025-09-03 13:24:51 +02:00
81eda94fe0 Finish v1.47.09(522) 2025-09-03 13:01:53 +02:00
8f02dfbee4 Finish v1.47.09(522)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-09-03 13:01:52 +02:00
75e1447a54 -> v1.47.09 (522) 2025-09-03 13:01:48 +02:00
d8f9886f82 Aggiornamenti librerie 2025-09-01 18:04:45 +02:00
3279c4e2af Merge remote-tracking branch 'origin/develop' into develop 2025-09-01 17:05:15 +02:00
6f070e6998 Migliorie varie 2025-09-01 17:04:50 +02:00
df4bfcc955 Finish v1.47.08(521) 2025-08-27 12:37:31 +02:00
c1983cf73c Finish v1.47.08(521)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-08-27 12:37:30 +02:00
da9bbd0b1c -> v1.47.08 (521) 2025-08-27 12:37:16 +02:00
cd84d3e9a8 Fix gestione errori in spedizione 2025-08-27 12:34:39 +02:00
595f4a8797 Finish v1.47.07(520) 2025-08-26 15:11:00 +02:00
388f08a02f Finish v1.47.07(520)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-08-26 15:10:59 +02:00
c562735661 -> v1.47.07 (520) 2025-08-26 15:10:50 +02:00
ab137ad828 Aggiunto controllo della lunghezza di 13 per il barcode nella verifica dell'eanPeso 2025-08-26 15:09:38 +02:00
b56f209084 Modificato il toString del fornitore per il DialogSelectDocInfo 2025-08-26 15:08:42 +02:00
5107897888 Finish v1.47.06(519)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-08-06 10:42:50 +02:00
d91eaf3412 Finish v1.47.06(519) 2025-08-06 10:42:50 +02:00
caa6a7cd75 -> v1.47.06 (519) 2025-08-06 10:42:44 +02:00
567b288e4d Migliorata registrazione errore di ExportLog 2025-08-06 10:41:54 +02:00
86121bfa93 Finish v1.47.05(518)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-07-29 11:21:53 +02:00
669a38732f Finish v1.47.05(518) 2025-07-29 11:21:53 +02:00
e3e7a7d7c6 -> v1.47.05 (518) 2025-07-29 11:21:47 +02:00
75914ab9c9 Finish v1.47.04(517) 2025-07-28 17:52:40 +02:00
d1976f3e21 Finish v1.47.04(517)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-07-28 17:52:39 +02:00
5ef5c4b28a -> v1.47.04 (517) 2025-07-28 17:52:34 +02:00
2c3d4bbc22 Finish v1.47.03(516) 2025-07-14 16:14:39 +02:00
fd8bb8e7da Finish v1.47.03(516)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-07-14 16:14:38 +02:00
60a088a7f4 -> v1.47.03 (516) 2025-07-14 16:14:31 +02:00
8ca5207a58 Aggiornato AGP a 8.11.1 2025-07-14 16:13:56 +02:00
f2cc31e08a Finish v1.47.02(515)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-07-08 16:18:50 +02:00
e541031efe Finish v1.47.02(515) 2025-07-08 16:18:50 +02:00
d4b220d1e6 -> v1.47.02 (515) 2025-07-08 16:18:46 +02:00
798835cb4c Finish v1.47.01(514)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-07-08 12:00:28 +02:00
ba72284c87 Finish v1.47.01(514) 2025-07-08 12:00:28 +02:00
603c5dd8b7 -> v1.47.01 (514) 2025-07-08 12:00:24 +02:00
43fc8be493 Aggiornato AGP a 8.11.0 2025-07-08 11:59:48 +02:00
22bace2402 Finish v1.47.00(513)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-07-02 17:22:13 +02:00
3b86460f48 Finish v1.47.00(513) 2025-07-02 17:22:13 +02:00
ddac54b513 -> v1.47.00 (513) 2025-07-02 17:22:08 +02:00
a385b01584 In verifica giagenza gestito salvataggio online per ogni riga 2025-07-01 15:40:02 +02:00
7920166110 Gestita setup per mostrare o no il cambio deposito 2025-06-30 15:31:48 +02:00
e6f4cc9d6d Finish v1.46.24(512)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-06-26 11:41:01 +02:00
13d9c40119 Finish v1.46.24(512) 2025-06-26 11:41:01 +02:00
1d7125a821 -> v1.46.24 (512) 2025-06-26 11:40:57 +02:00
deb4d77203 Rimossa eliminazione del primo carattere (se 0) da SSCC durante la decodifica ean128 2025-06-26 11:40:08 +02:00
520a1cb07a Finish v1.46.23(511) 2025-06-24 16:49:12 +02:00
c620e9cb96 Finish v1.46.23(511)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-06-24 16:49:11 +02:00
6ef4961074 -> v1.46.23 (511) 2025-06-24 16:49:07 +02:00
688a8e4bad Finish v1.46.22(510) 2025-06-20 18:49:21 +02:00
12796b11e5 Finish v1.46.22(510)
Some checks failed
WMS - Android (New)/pipeline/head Something is wrong with the build of this commit
2025-06-20 18:49:21 +02:00
f7dc857587 -> v1.46.22 (510) 2025-06-20 18:49:16 +02:00
f99c0e5514 Aggiornato Jenkinsfile 2025-06-20 11:58:45 +02:00
f1c304eaeb Finish v1.46.21(509) 2025-06-09 09:48:01 +02:00
7b3fde1d71 Finish v1.46.21(509)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-06-09 09:48:00 +02:00
3c337fc138 -> v1.46.21 (509) 2025-06-09 09:47:57 +02:00
021f6974f1 Aggiornato Jenkinsfile
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-06-03 09:49:13 +02:00
92abfe1da4 Finish v1.46.20(508) 2025-06-03 09:47:38 +02:00
6338c1dfa6 Finish v1.46.20(508)
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-06-03 09:47:37 +02:00
657d85be86 -> v1.46.20 (508) 2025-06-03 09:47:33 +02:00
97c907c992 Aggiornato build.gradle
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-05-28 13:41:10 +02:00
caed709b64 Aggiornato build.gradle 2025-05-28 13:32:06 +02:00
13800eecab Aggiornato build.gradle
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-05-28 13:03:55 +02:00
c4357f662c Finish v1.46.19(507) 2025-05-28 12:51:09 +02:00
67a8ca94db Finish v1.46.19(507)
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-05-28 12:51:09 +02:00
0bfd56c011 -> v1.46.19 (507) 2025-05-28 12:51:05 +02:00
eead844ac1 Aggiunte definizioni di @SerializedName per evitare minify di Proguard 2025-05-28 12:50:21 +02:00
65cfadcb6e Finish v1.46.18(506)
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-05-28 12:29:40 +02:00
00067ca1c9 Finish v1.46.18(506) 2025-05-28 12:29:40 +02:00
73ca8bb366 -> v1.46.18 (506) 2025-05-28 12:29:36 +02:00
3ffdb2c220 Fix AuthInterceptor 2025-05-28 12:28:13 +02:00
a5479595c7 Aggiornato build.gradle
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-05-28 12:24:24 +02:00
cff971bef8 Merge branch 'master' into develop
# Conflicts:
#	Jenkinsfile.groovy
2025-05-28 11:47:20 +02:00
a5d3388665 Aggiornato build.gradle
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-05-28 11:45:51 +02:00
22ad23c5b7 Aggiornato build.gradle
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-05-28 11:44:41 +02:00
b1d5e10db4 Aggiornato build.gradle 2025-05-28 11:32:35 +02:00
bde41d21be Modificato Jenkinsfile
Some checks failed
WMS - Android (New)/pipeline/head Something is wrong with the build of this commit
2025-05-28 11:26:12 +02:00
9d8228419c Modificato Jenkinsfile
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-05-28 11:25:14 +02:00
ad7d9059c0 Modificato Jenkinsfile
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-05-28 11:19:57 +02:00
4831a7ce19 Modificato Jenkinsfile
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-05-28 11:19:10 +02:00
552b82feda Modificato Jenkinsfile
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-05-28 11:10:39 +02:00
6d62a7b10e Modificato Jenkinsfile
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good
2025-05-28 10:57:42 +02:00
667f4aea74 Modificato Jenkinsfile
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-05-28 10:53:55 +02:00
f80225b7bf Modificato Jenkinsfile
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-05-28 10:47:00 +02:00
7a02e1d8ad Modificato Jenkinsfile
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-05-28 10:46:25 +02:00
9cc70f4ee6 Modificato Jenkinsfile
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-05-28 10:42:51 +02:00
7c4c5da1d6 Modificato Jenkinsfile
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-05-28 10:41:32 +02:00
b960b6319a Modificato Jenkinsfile
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-05-28 10:40:47 +02:00
08ddaa7a11 Modificato Jenkinsfile
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-05-28 10:39:56 +02:00
bcce40094c Modificato Jenkinsfile
Some checks failed
WMS - Android (New)/pipeline/head There was a failure building this commit
2025-05-28 10:33:59 +02:00
960388adf8 Modificato Jenkinsfile 2025-05-28 10:31:48 +02:00
e76722018f Fix AuthInterceptor in caso di AccessToken nullo 2025-05-28 10:30:19 +02:00
fc30017021 Finish v1.46.17(505) 2025-05-28 10:18:03 +02:00
e1dd4f2140 Finish v1.46.17(505) 2025-05-28 10:18:03 +02:00
67a0679de7 -> v1.46.17 (505) 2025-05-28 10:17:58 +02:00
dfc87f7aec Fix AuthInterceptor in caso di AccessToken nullo 2025-05-28 10:17:09 +02:00
886ef6ba08 Finish v1.46.16(504) 2025-05-27 18:44:03 +02:00
fe77f90a7a Finish v1.46.16(504) 2025-05-27 18:44:02 +02:00
7a1f0d6cf6 -> v1.46.16 (504) 2025-05-27 18:43:56 +02:00
004bc3b926 Migliorie sulla gestione dell'access token nell'interceptor e durante il refresh.
Migliorie al loading popup durante il chiudi ordine in spedizione.
2025-05-27 18:43:01 +02:00
5a0b45c6f9 Finish v1.46.15(503) 2025-05-27 17:48:12 +02:00
be5ebb89d7 Finish v1.46.15(503) 2025-05-27 17:48:12 +02:00
f81d61c4c5 -> v1.46.15 (503) 2025-05-27 17:47:59 +02:00
634bc502ce Fix null dovuto alla getBancaliGiaRegistratiSynchronized 2025-05-27 17:45:24 +02:00
d13dbf1ad3 Finish v1.46.14(502) 2025-05-26 09:44:01 +02:00
2f9ee642da Finish v1.46.14(502) 2025-05-26 09:44:00 +02:00
afecc11364 -> v1.46.14 (502) 2025-05-26 09:43:55 +02:00
b33d566abd Implementato servizio di retrieve uds già registrate 2025-05-20 15:25:48 +02:00
69d880b587 Finish v1.46.13(501) 2025-05-15 18:30:56 +02:00
aeadea42e1 Finish v1.46.13(501) 2025-05-15 18:30:56 +02:00
f5c3dcfdc9 -> v1.46.13 (501) 2025-05-15 18:30:52 +02:00
d30af1e2a6 In VerificaGiacenze abilitato OverflowOrderQuantity 2025-05-15 12:53:12 +02:00
71a18e9ffa Fix scansione barcode alternativi in VerificaGiacenze 2025-05-15 12:52:42 +02:00
40e1fb4f83 Finish v1.46.12(500) 2025-05-14 12:05:35 +02:00
f3f0fd8fd8 Finish v1.46.12(500) 2025-05-14 12:05:35 +02:00
ed53b9e3b4 -> v1.46.12 (500) 2025-05-14 12:05:30 +02:00
37ac05b8ab Aggiornato gradle e librerie 2025-05-14 12:04:49 +02:00
823d0d7a33 Finish v1.46.11(499) 2025-05-07 12:01:10 +02:00
5b07ff5efa Finish v1.46.11(499) 2025-05-07 12:01:09 +02:00
c5639a643a -> v1.46.11 (499) 2025-05-07 12:01:00 +02:00
012f75198b Fix null sitArts 2025-05-07 12:00:17 +02:00
d7e0e858d2 Finish v1.46.10(498) 2025-05-05 17:00:41 +02:00
339a5e5b68 Finish v1.46.10(498) 2025-05-05 17:00:40 +02:00
02a13911d8 -> v1.46.10 (498) 2025-05-05 17:00:34 +02:00
b6f51971f1 Fix su DialogChooseArtFromListaArts 2025-05-05 16:59:43 +02:00
57079c0062 Finish v1.46.09(497) 2025-04-29 11:50:02 +02:00
63c353a83c Finish v1.46.09(497) 2025-04-29 11:50:02 +02:00
c069d21cbf -> v1.46.09 (497) 2025-04-29 11:49:53 +02:00
afeb9ecc23 Fix thread picking libero 2025-04-29 11:48:36 +02:00
2ff8d80da3 In verifica giacenza permettere di caricare 0 nella quantità 2025-04-28 17:13:19 +02:00
891e2641fa Aggiunta possibilità di rendere non editabile qtaTot in accettazione bolla 2025-04-28 17:08:30 +02:00
ca79107809 Finish v1.46.08(496) 2025-04-28 13:08:20 +02:00
5c37b986ce Finish v1.46.08(496) 2025-04-28 13:08:19 +02:00
c426250cd5 -> v1.46.08 (496) 2025-04-28 13:08:04 +02:00
f090c11146 Fix scan barcode in verifica giacenze 2025-04-28 13:06:03 +02:00
5c90f22a49 Finish V1.46.07(495) 2025-04-16 12:54:27 +02:00
f1ddaa1fca Finish V1.46.07(495) 2025-04-16 12:54:27 +02:00
8490553a32 -> v1.46.07 (495) 2025-04-16 12:54:15 +02:00
66824fccb1 Fix thread scanBarcode in DialogInputQuantity 2025-04-16 12:53:13 +02:00
39dce4d23f Merge remote-tracking branch 'origin/develop' into develop 2025-04-16 10:36:30 +02:00
c1dbbde905 Cambiato barcode di creazione UL in DialogScanOrCreateLUViewModel 2025-04-16 10:36:17 +02:00
8d2d0ad195 Finish v1.46.06(494) 2025-04-15 18:41:01 +02:00
927b14c9fc Finish v1.46.06(494) 2025-04-15 18:41:01 +02:00
f342cd0e5f -> v1.46.06 (494) 2025-04-15 18:40:53 +02:00
c287852ce6 Fix modal BatchLotSelection 2025-04-15 18:39:38 +02:00
edc9470e9b Finish v1.46.05(493) 2025-04-10 10:21:37 +02:00
7adeee589e Finish v1.46.05(493) 2025-04-10 10:21:37 +02:00
52a393c260 -> 1.46.05 (493) 2025-04-10 10:21:29 +02:00
60a405536c Fix thread su creaUl in PickingResi e su DialogBasket 2025-04-10 10:20:19 +02:00
5f5117c0f6 Finish v1.46.04(492) 2025-04-09 15:32:17 +02:00
0740faa964 Finish v1.46.04(492) 2025-04-09 15:32:16 +02:00
2f40302791 -> v1.46.04 (492) 2025-04-09 15:32:03 +02:00
13b3d5e63b Refactor dialog choose art form list Arts 2025-04-09 15:29:59 +02:00
58521997c1 Fix su popup filtro resi Acquisto/Vendita 2025-04-09 14:53:10 +02:00
af64ca04f9 Iniziata migrazione del nuovo versamento materiali 2025-04-09 09:29:44 +02:00
1e9d048264 Finish v1.46.03(491) 2025-04-08 15:54:57 +02:00
6f202c0c7a Finish v1.46.03(491) 2025-04-08 15:54:56 +02:00
94a9690045 -> v1.46.03 (491) 2025-04-08 15:54:52 +02:00
2b4aa11021 Fix su Spedizione e picking libero 2025-04-08 15:49:39 +02:00
f2d5bb76c5 Fix su loop nel caso di ricerca barcode kit in accettazione da bolla 2025-04-08 15:49:19 +02:00
7bdb9b47f4 Fix su qtaCnfOrd in VerificaGiacenze 2025-04-01 17:27:36 +02:00
68bf6767b9 Implementato servizio di changePosizione 2025-04-01 16:52:24 +02:00
184d1f759c Finish v1.46.00(488) 2025-03-31 10:36:19 +02:00
2a26236d94 Finish v1.46.00(488) 2025-03-31 10:36:18 +02:00
71a00ac140 Finish v1.46.00/488) 2025-03-31 10:35:44 +02:00
f10aaaba6b Finish v1.46.00/488) 2025-03-31 10:35:43 +02:00
296675f0b0 -> v1.46.00 (488) 2025-03-31 10:35:39 +02:00
7f365be53d Finish FastPickingSpedizione 2025-03-31 10:33:46 +02:00
9e85204d04 Merge branch 'develop' into feature/FastPickingSpedizione 2025-03-27 10:35:31 +01:00
d5d80e71e7 Finish v1.45.05(487) 2025-03-27 10:34:52 +01:00
73b360f427 Finish v1.45.05(487) 2025-03-27 10:34:52 +01:00
722094bc3e -> v1.45.05 (487) 2025-03-27 10:34:47 +01:00
645b2cfe5d Cambiato servizio di retrieve giacenza in VerificaGiacenze 2025-03-27 10:32:41 +01:00
afcaa82069 Finish v1.45.04(486) 2025-03-19 18:22:08 +01:00
393bffe14c Finish v1.45.04(486) 2025-03-19 18:22:08 +01:00
d44b6f00c6 -> v1.45.04 (486) 2025-03-19 18:22:03 +01:00
de68c3b49f Merge remote-tracking branch 'origin/develop' into develop 2025-03-19 18:20:07 +01:00
0591b60fad Rimossa randomizzazione dati Verifica Giacenze 2025-03-19 18:18:42 +01:00
a6cebccad9 Merge branch 'develop' into feature/FastPickingSpedizione 2025-03-18 17:54:49 +01:00
4186d90a32 Finish v1.45.03(485) 2025-03-18 17:54:28 +01:00
bb21441c3d Finish v1.45.03(485) 2025-03-18 17:54:27 +01:00
12b1b89713 -> v1.45.03 (485) 2025-03-18 17:54:15 +01:00
26512f5dc1 Merge branch 'develop' into feature/FastPickingSpedizione 2025-03-18 17:51:36 +01:00
4d29e2ab41 In accettazione bolla sitemato ordinamento righe e aggiunto controllo anomalie 2025-03-18 17:50:48 +01:00
6c6fd38482 Merge branch 'develop' into feature/FastPickingSpedizione
# Conflicts:
#	app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java
#	app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneModule.java
#	app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java
2025-03-18 12:20:54 +01:00
2e37e874c3 Finish v1.45.02(484) 2025-03-18 12:17:24 +01:00
c99e32998b Finish v1.45.02(484) 2025-03-18 12:17:23 +01:00
22ce078c74 -> v1.45.02 (484) 2025-03-18 12:17:19 +01:00
a93d80b2e2 Fix su handler in spedizione 2025-03-18 12:16:41 +01:00
1b4df1ecd1 Implementato flag che abilita/disabilita il fast-picking 2025-03-17 18:59:47 +01:00
ce5ab1cfc2 Resa synchronized l'init iniziale dell'app 2025-03-17 18:31:45 +01:00
3ac021d7ef Merge branch 'develop' into feature/FastPickingSpedizione 2025-03-17 11:51:44 +01:00
fa7d561189 Finish v1.45.01(483) 2025-03-17 11:51:25 +01:00
2c59e9beec Finish v1.45.01(483) 2025-03-17 11:51:24 +01:00
01af72bd2f -> v1.45.01 (483) 2025-03-17 11:51:18 +01:00
2f42958394 Fix su Rettifica Giacenze 2025-03-17 11:50:41 +01:00
4613f13eae Merge branch 'develop' into feature/FastPickingSpedizione 2025-03-14 18:20:18 +01:00
fba3801994 Finish v1.45.00(482) 2025-03-14 18:20:01 +01:00
7ec722fc26 Finish v1.45.00(482) 2025-03-14 18:20:00 +01:00
64295d565a -> v1.45.00 (482) 2025-03-14 18:19:57 +01:00
2db0027fff Correzioni Verifica Giacenze 2025-03-14 18:19:09 +01:00
71f077a617 Fix after merge 2025-03-14 13:25:40 +01:00
a80cf53f08 Merge branch 'develop' into feature/FastPickingSpedizione
# Conflicts:
#	app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java
#	app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ArticoloRESTConsumer.java
#	app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoViewModel.java
#	app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java
2025-03-14 13:23:32 +01:00
80dac639da Completata gestione verifica giacenze 2025-03-14 13:12:16 +01:00
ff73a124f0 Merge branch 'develop' into feature/FastPickingSpedizione
# Conflicts:
#	app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java
2025-03-12 19:30:44 +01:00
a4fcc87088 Finish v1.44.12(481) 2025-03-12 19:29:55 +01:00
be1b993239 Finish v1.44.12(481) 2025-03-12 19:29:55 +01:00
63f9912347 -> v1.44.12 (481) 2025-03-12 19:29:49 +01:00
b887172032 Fix caricamento in closeOrder Spedizione 2025-03-12 19:28:18 +01:00
18937a3315 Fix vari su Synchronized e MainThread 2025-03-12 19:26:45 +01:00
fb6a74aef8 Merge branch 'develop' into feature/FastPickingSpedizione
# Conflicts:
#	app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtView.java
2025-03-12 18:16:07 +01:00
cd89ce917e Fix vari su Synchronized e MainThread 2025-03-12 18:11:53 +01:00
6229a1a4b1 Aggiornato DialogScanArt 2025-03-06 12:16:38 +01:00
eb5ae8443d Merge branch 'develop' into feature/FastPickingSpedizione 2025-03-04 11:02:46 +01:00
a9028e65d9 Finish v1.44.11(480) 2025-03-04 11:02:32 +01:00
ba413e4d05 Finish v1.44.11(480) 2025-03-04 11:02:31 +01:00
6f759d969d -> v1.44.11 (480) 2025-03-04 11:02:26 +01:00
044bcbd852 Fix after merge 2025-03-04 11:01:38 +01:00
53ba5a962b Merge branch 'develop' into feature/FastPickingSpedizione
# Conflicts:
#	app/src/main/java/it/integry/integrywmsnative/view/dialogs/ask_position_of_lu/DialogAskPositionOfLUView.java
#	app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_or_create_lu/DialogScanOrCreateLUView.java
2025-03-04 10:58:15 +01:00
6f06eaf0a0 Rimosso vecchio dialog livello posizione 2025-03-04 10:57:35 +01:00
993191c083 Aggiornati dialog ask posizione e fixati problemi sul dismiss dei dialog 2025-03-04 10:56:19 +01:00
db178ce991 Merge branch 'develop' into feature/FastPickingSpedizione
# Conflicts:
#	app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoViewModel.java
2025-03-03 18:10:13 +01:00
329d53f8d0 Migliorato controllo di generazione documenti carico/scarico durante il picking libero. 2025-03-03 18:09:39 +01:00
7c35e19ed4 Fix vari 2025-03-03 17:50:18 +01:00
326a3a00b2 Fix check deposito 2025-03-03 13:30:43 +01:00
086597985b Merge branch 'develop' into feature/FastPickingSpedizione
# Conflicts:
#	app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java
2025-03-03 12:35:33 +01:00
c3c3d32dfe Finish v1.44.10(479) 2025-03-03 11:52:21 +01:00
1756124b89 Finish v1.44.10(479) 2025-03-03 11:52:21 +01:00
5bc3619d6b -> v1.44.10 (479) 2025-03-03 11:52:17 +01:00
7ec04ac8da Fix su dialog caricamento in accettazione ordini 2025-03-03 11:51:31 +01:00
8d93f3bb61 Finish v1.44.09(478) 2025-03-03 10:12:14 +01:00
b31ea475c6 Finish v1.44.09(478) 2025-03-03 10:12:14 +01:00
a7e8ec4d99 -> v1.44.09 (478) 2025-03-03 10:12:08 +01:00
677ee127ff Fix su dismiss di dialog input quantity 2025-03-03 10:11:11 +01:00
d238cb1d88 Merge branch 'develop' into feature/FastPickingSpedizione 2025-02-28 17:01:03 +01:00
a02035e9b8 Finish v1.44.08(477) 2025-02-28 16:58:53 +01:00
b61948dac3 Finish v1.44.08(477) 2025-02-28 16:58:53 +01:00
deee26d55b -> v1.44.08 (477) 2025-02-28 16:58:48 +01:00
00443b46c8 Fix su dialog info aggiuntive in accettazione 2025-02-28 16:57:57 +01:00
5694d8bd1c Migliorata gestione callback e chiamate in background per Picking Libero 2025-02-28 15:26:02 +01:00
e5a4cf59c4 Merge branch 'develop' into feature/FastPickingSpedizione
# Conflicts:
#	app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java
#	app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoFragment.java
#	app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java
2025-02-28 11:56:58 +01:00
9228eaf01b Finish v1.44.07(476) 2025-02-28 11:51:16 +01:00
12fe5059a6 Merge branch 'master-beta' into feature/FastPickingSpedizione 2025-02-26 19:10:48 +01:00
e75121b0bd Refactor: Improve data recovery in MainFragment
- Replaced the previous data recovery mechanism with an ExecutorService-based approach.
- This allows for concurrent recovery operations, improving overall efficiency.
- Improved error handling by removing unnecessary callbacks and handling exceptions directly.
- Replaced cyclic recursion with a simpler iterative loop for session recovery.
2025-02-26 19:10:30 +01:00
0312f972bc Refactor: Update weight input dialog and LU closing logic
- Changed `DialogInputPesoLUView` to use `BindableBigDecimal` for weight fields.
- Updated `DialogInputPesoLUView` to invoke onComplete only after user confirmation
- Refactored `SpedizioneViewModel` to correctly set values coming from the weight input dialog
- Removed commented-out code in `SpedizioneViewModel`
- Added handling for null values in weight fields.
- `SpedizioneActivity` changed to pass current values to `DialogInputPesoLUView`
- Fixed recovery mode UI not collapsing
2025-02-26 19:01:04 +01:00
9d48fec426 Aggiunto controllo su deposito in fase di picking uscita 2025-02-26 18:36:17 +01:00
645045b492 Fix su filtri ordini uscita 2025-02-26 13:50:20 +01:00
1988fae4f9 Aggiunto profiler recyclerview solo in caso di debug 2025-02-26 13:12:00 +01:00
6c621d5ca8 Migliorie sul caricamento della lista di ordini di uscita 2025-02-26 13:06:56 +01:00
b8c8a9d8ea Merge branch 'develop' into feature/FastPickingSpedizione 2025-02-26 11:05:52 +01:00
002e855d82 Merge branch 'feature/GestioneDocumentiLavorazione' into feature/FastPickingSpedizione 2025-02-26 10:29:35 +01:00
1c6de11e04 Merge branch 'develop' into feature/FastPickingSpedizione
# Conflicts:
#	app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java
#	app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumer.java
2025-02-26 10:27:27 +01:00
ce3dfca6e0 Rimosso parametro inutilizzato in build.gradle 2025-02-24 18:55:45 +01:00
706878b1e4 Migliorato adapter avantielenco ordini di uscita 2025-02-24 18:35:17 +01:00
6c59e22101 Merge branch 'develop' into feature/FastPickingSpedizione 2025-02-24 15:31:40 +01:00
2d48f6687c Aggiunta logica di fast picking in spedizione, scansionando un barcode di una UL all'interno di DialogInputQuantity verrà automaticamente chiusa l'ul attuale e riavviato il processo di scansione del barcode 2025-02-24 12:05:39 +01:00
461 changed files with 14959 additions and 7097 deletions

3
.gitignore vendored
View File

@@ -149,3 +149,6 @@ crashlytics.properties
crashlytics-build.properties
### AndroidStudio Patch ###
!/gradle/wrapper/gradle-wrapper.jar
copilot.*.xml
/.idea/dataSources.xml

6
.idea/AndroidProjectSystem.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>

View File

@@ -1,5 +1,40 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JavaCodeStyleSettings>
<option name="IMPORT_LAYOUT_TABLE">
<value>
<package name="" withSubpackages="true" static="false" module="true" />
<package name="android" withSubpackages="true" static="true" />
<package name="androidx" withSubpackages="true" static="true" />
<package name="com" withSubpackages="true" static="true" />
<package name="junit" withSubpackages="true" static="true" />
<package name="net" withSubpackages="true" static="true" />
<package name="org" withSubpackages="true" static="true" />
<package name="java" withSubpackages="true" static="true" />
<package name="javax" withSubpackages="true" static="true" />
<package name="" withSubpackages="true" static="true" />
<emptyLine />
<package name="android" withSubpackages="true" static="false" />
<emptyLine />
<package name="androidx" withSubpackages="true" static="false" />
<emptyLine />
<package name="com" withSubpackages="true" static="false" />
<emptyLine />
<package name="junit" withSubpackages="true" static="false" />
<emptyLine />
<package name="net" withSubpackages="true" static="false" />
<emptyLine />
<package name="org" withSubpackages="true" static="false" />
<emptyLine />
<package name="java" withSubpackages="true" static="false" />
<emptyLine />
<package name="javax" withSubpackages="true" static="false" />
<emptyLine />
<package name="" withSubpackages="true" static="false" />
<emptyLine />
</value>
</option>
</JavaCodeStyleSettings>
<JetCodeStyleSettings>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>

View File

@@ -4,10 +4,10 @@
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2025-01-27T15:42:06.256113400Z">
<DropdownSelection timestamp="2025-10-02T11:26:10.944286600Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="PhysicalDevice" identifier="serial=21088B8EFD" />
<DeviceId pluginId="PhysicalDevice" identifier="serial=7da0808" />
</handle>
</Target>
</DropdownSelection>

View File

@@ -122,5 +122,10 @@ Create the following layout resource file [dialog_${dashName}.xml]
alertDialog.setOnShowListener(this);
return alertDialog;
}
@Override
public void dismiss() {
if(getDialog() != null) getDialog().dismiss();
}
}

View File

@@ -1,6 +1,7 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="app" type="AndroidRunConfigurationType" factoryName="Android App">
<module name="WMS.app.main" />
<module name="WMS.app" />
<option name="ANDROID_RUN_CONFIGURATION_SCHEMA_VERSION" value="1" />
<option name="DEPLOY" value="true" />
<option name="DEPLOY_APK_FROM_BUNDLE" value="false" />
<option name="DEPLOY_AS_INSTANT" value="false" />
@@ -8,14 +9,17 @@
<option name="PM_INSTALL_OPTIONS" value="" />
<option name="ALL_USERS" value="false" />
<option name="ALWAYS_INSTALL_WITH_PM" value="false" />
<option name="ALLOW_ASSUME_VERIFIED" value="false" />
<option name="CLEAR_APP_STORAGE" value="false" />
<option name="DYNAMIC_FEATURES_DISABLED_LIST" value="" />
<option name="ACTIVITY_EXTRA_FLAGS" value="" />
<option name="MODE" value="default_activity" />
<option name="RESTORE_ENABLED" value="false" />
<option name="RESTORE_FILE" value="" />
<option name="RESTORE_FRESH_INSTALL_ONLY" value="false" />
<option name="CLEAR_LOGCAT" value="false" />
<option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
<option name="INSPECTION_WITHOUT_ACTIVITY_RESTART" value="false" />
<option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
<option name="TARGET_SELECTION_MODE" value="DEVICE_AND_SNAPSHOT_COMBO_BOX" />
<option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
<option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
<option name="DEBUGGER_TYPE" value="Auto" />
@@ -59,6 +63,7 @@
<option name="NATIVE_MEMORY_SAMPLE_RATE_BYTES" value="2048" />
</Profilers>
<option name="DEEP_LINK" value="" />
<option name="ACTIVITY" value="" />
<option name="ACTIVITY_CLASS" value="" />
<option name="SEARCH_ACTIVITY_IN_GLOBAL_SCOPE" value="false" />
<option name="SKIP_ACTIVITY_VALIDATION" value="false" />

72
Jenkinsfile.groovy Normal file
View File

@@ -0,0 +1,72 @@
pipeline {
agent {
label 'master'
}
options {
buildDiscarder(logRotator(numToKeepStr: '30', artifactNumToKeepStr: '10'))
disableConcurrentBuilds()
}
environment {
// ANDROID_HOME = "/usr/local/android/sdk" // Cambia in base al tuo sistema
JAVA_HOME = tool 'JDK 17.0.6 x64' // Nome dello strumento configurato in Jenkins
PATH = "${env.JAVA_HOME}\\bin;${env.PATH}"
}
stages {
stage('Preparing') {
when {
expression {
return env.GIT_BRANCH == "master-beta"
}
}
steps {
bat "./gradlew addBetaSuffix"
}
}
stage('Build') {
steps {
bat "./gradlew assembleRelease"
archiveArtifacts artifacts: 'app/build/outputs/apk/release/', onlyIfSuccessful: true
}
}
stage('Publish') {
steps {
azureUpload allowAnonymousAccess: true, fileShareName: 'storage-ci', filesPath: 'app/build/outputs/apk/release/*.apk,app/build/outputs/apk/release/*.txt', removePrefixPath: 'app/build/outputs/apk/release/', storageCredentialId: '83a86793-c1d6-4776-b20f-1ff652a57fee', storageType: 'filestorage', uploadArtifactsOnlyIfSuccessful: true, verbose: true, virtualPath: 'wms'
}
}
}
post {
success {
script {
bat 'curl -k "https://devservices.studioml.it/ems-api/updateWMSApp?overrideForced=false"'
bat 'curl -k "https://devservices.studioml.it/ems-api/updateWMSApp?overrideForced=false&suffix=beta"'
bat 'curl -k "https://services.studioml.it/ems-api/updateWMSApp?overrideForced=false"'
bat 'curl -k "https://services.studioml.it/ems-api/updateWMSApp?overrideForced=false&suffix=beta"'
if (env.GIT_BRANCH == "master" || env.GIT_BRANCH == "master-beta") {
office365ConnectorSend adaptiveCards: true, color: '#008000', message: 'WMS è stato compilato con successo', status: 'SUCCESS', webhookUrl: 'https://default0b9c060c159c4e5f82a77459a72572.16.environment.api.powerplatform.com:443/powerautomate/automations/direct/workflows/a73f903a4044474c84ad9a0d68a9a479/triggers/manual/paths/invoke?api-version=1&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=gXc43FQXqIq7Xpfvis2XgFoPl8lpg0Sf5HtuxZG_jeI'
}
}
}
unstable {
script {
if (env.GIT_BRANCH == "master" || env.GIT_BRANCH == "master-beta") {
office365ConnectorSend adaptiveCards: true, color: '#FFDE21', message: 'WMS è INSTABILE', status: 'UNSTABLE', webhookUrl: 'https://default0b9c060c159c4e5f82a77459a72572.16.environment.api.powerplatform.com:443/powerautomate/automations/direct/workflows/a73f903a4044474c84ad9a0d68a9a479/triggers/manual/paths/invoke?api-version=1&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=gXc43FQXqIq7Xpfvis2XgFoPl8lpg0Sf5HtuxZG_jeI'
}
}
}
failure {
script {
if (env.GIT_BRANCH == "master" || env.GIT_BRANCH == "master-beta") {
office365ConnectorSend adaptiveCards: true, color: '#FF2C2C', message: 'Errore di compilazione su WMS', status: 'FAILURE', webhookUrl: 'https://default0b9c060c159c4e5f82a77459a72572.16.environment.api.powerplatform.com:443/powerautomate/automations/direct/workflows/a73f903a4044474c84ad9a0d68a9a479/triggers/manual/paths/invoke?api-version=1&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=gXc43FQXqIq7Xpfvis2XgFoPl8lpg0Sf5HtuxZG_jeI'
}
}
}
}
}

View File

@@ -8,10 +8,11 @@ apply plugin: 'com.google.firebase.crashlytics'
//apply plugin: 'kotlin-android'
apply plugin: 'com.google.gms.google-services'
android {
def appVersionCode = 476
def appVersionName = '1.44.07'
def appVersionCode = 553
def appVersionName = '1.50.04'
signingConfigs {
release {
@@ -34,7 +35,7 @@ android {
defaultConfig {
applicationId "it.integry.integrywmsnative"
minSdkVersion 21
targetSdkVersion 35
targetSdk 36
versionCode appVersionCode
versionName appVersionName
// testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -51,17 +52,26 @@ android {
buildTypes {
debug {
ext.enableCrashlytics = false
// minifyEnabled true // Abilita la minimizzazione del codice
// shrinkResources true // Rimuove risorse non utilizzate
// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled false
// minifyEnabled true // Abilita la minimizzazione del codice
// shrinkResources true // Rimuove risorse non utilizzate
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
firebaseCrashlytics {
mappingFileUploadEnabled true
}
}
}
android.buildFeatures.dataBinding true
android.buildFeatures.buildConfig true
android.dataBinding.enabledForTests true
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
@@ -72,12 +82,7 @@ android {
}
build {
doLast {
delete "$projectDir/build/outputs/apk/release/version.txt"
file("$projectDir/build/outputs/apk/release/version.txt").text = appVersionCode + '\n' + appVersionName + '\n' + 'forced=true'
}
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile.class).tap {
@@ -90,7 +95,7 @@ android {
abortOnError false
}
namespace 'it.integry.integrywmsnative'
compileSdk 35
compileSdk 36
}
configurations {
@@ -99,35 +104,33 @@ configurations {
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5'
implementation fileTree(include: ['*.jar'], dir: 'libs')
// androidTestImplementation('androidx.test.espresso:espresso-core:3.6.1', {
// exclude group: 'com.android.support', module: 'support-annotations'
// })
// implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'com.github.lupaulus:logger:2.3.2'
//Firebase
// Import the Firebase BoM
implementation platform('com.google.firebase:firebase-bom:33.8.0')
implementation platform('com.google.firebase:firebase-bom:33.16.0')
implementation 'com.google.firebase:firebase-analytics'
implementation 'com.google.firebase:firebase-crashlytics'
implementation 'com.google.firebase:firebase-perf'
implementation 'com.google.android.gms:play-services-basement:18.5.0'
implementation 'com.google.android.gms:play-services-basement:18.7.1'
//JJWT
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
implementation 'io.jsonwebtoken:jjwt-api:0.13.0'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.13.0'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.13.0'
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.appcompat:appcompat:1.7.1'
implementation 'com.google.android.material:material:1.12.0'
implementation 'androidx.constraintlayout:constraintlayout:2.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.4.0'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
implementation('androidx.preference:preference-ktx:1.2.1') {
exclude group: 'androidx.lifecycle', module: 'lifecycle-viewmodel'
@@ -135,20 +138,18 @@ dependencies {
}
implementation "androidx.slidingpanelayout:slidingpanelayout:1.2.0"
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:retrofit:3.0.0'
implementation 'com.squareup.retrofit2:converter-gson:3.0.0'
implementation 'com.annimon:stream:1.2.2'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.7'
// implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'org.apache.commons:commons-text:1.9'
implementation 'androidx.lifecycle:lifecycle-runtime:2.9.3'
implementation 'org.apache.commons:commons-text:1.14.0'
//MVVM
def dagger2_version = '2.55'
api "com.google.dagger:dagger:$dagger2_version"
def dagger2_version = '2.57.1'
implementation "com.google.dagger:dagger:$dagger2_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger2_version"
api "com.google.dagger:dagger-android:$dagger2_version"
api "com.google.dagger:dagger-android-support:$dagger2_version"
implementation "com.google.dagger:dagger-android:$dagger2_version"
implementation "com.google.dagger:dagger-android-support:$dagger2_version"
// if you use the support libraries
annotationProcessor "com.google.dagger:dagger-android-processor:$dagger2_version"
@@ -160,7 +161,7 @@ dependencies {
implementation 'com.github.pedromassango:doubleClick:3.0'
//SQLite ROOM
def room_version = "2.6.1"
def room_version = "2.7.2"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
@@ -186,13 +187,13 @@ dependencies {
implementation 'com.github.harry1453:android-bluetooth-serial:v1.1.2'
// RxJava is also required.
implementation 'io.reactivex.rxjava2:rxjava:2.1.12'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'org.greenrobot:eventbus:3.3.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.21'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
//Barcode generator
implementation group: 'com.google.zxing', name: 'core', version: '3.5.3'
implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
implementation("org.javatuples:javatuples:1.2")
}
repositories {
@@ -200,3 +201,49 @@ repositories {
google()
maven { url 'https://jitpack.io' }
}
tasks.register('addBetaSuffix') {
doLast {
def gradleFile = file("build.gradle")
def content = gradleFile.text
// Modifica appVersionName
content = content.replaceAll(/appVersionName\s*=\s*'(.*?)'/) { fullMatch, version ->
"appVersionName = '${version}-beta'"
}
// Modifica outputFileName
content = content.replaceAll(/output\.outputFileName\s*=\s*"(.*?)"/) { fullMatch, filename ->
"output.outputFileName = \"${filename.replace('.apk', '-beta.apk')}\""
}
// Modifica direttamente la riga che crea 'version.txt' in 'version-beta.txt'
content = content.replace(
"def versionFile = new File(outputDir, \"version.txt\")",
"def versionFile = new File(outputDir, \"version-beta.txt\")"
)
// Sovrascrivi il file
gradleFile.write(content)
}
}
tasks.register('createVersionFile') {
doLast {
def outputDir = file("${projectDir}/build/outputs/apk/release")
def versionFile = new File(outputDir, "version.txt")
// Cancella il file se esiste
if (versionFile.exists()) {
versionFile.delete()
}
// Crea il file con i contenuti desiderati
versionFile.write("${android.defaultConfig.versionCode}\n${android.defaultConfig.versionName}\nforced=true")
}
}
afterEvaluate {
tasks.assembleRelease.finalizedBy createVersionFile
}

View File

@@ -23,3 +23,26 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
# Prevent R8 from leaving Data object members always null
-keepclasseswithmembers class * {
<init>(...);
@com.google.gson.annotations.SerializedName <fields>;
}
# Per JJWT
-keep class io.jsonwebtoken.** { *; }
-keepnames class io.jsonwebtoken.* { *; }
-keepnames interface io.jsonwebtoken.* { *; }
# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken
-keep class it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse { *; }
-keep class * extends it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse { *; }

File diff suppressed because it is too large Load Diff

View File

@@ -89,6 +89,8 @@ import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.selectArt
import it.integry.integrywmsnative.gest.pv_ordini_acquisto.PVOrdiniAcquistoGrigliaComponent;
import it.integry.integrywmsnative.gest.pv_ordini_acquisto.PVOrdiniAcquistoGrigliaModule;
import it.integry.integrywmsnative.gest.pv_ordini_acquisto.dialogs.DialogScanGrigliaAcquistoComponent;
import it.integry.integrywmsnative.gest.pv_verifica_giacenze.VerificaGiacenzeComponent;
import it.integry.integrywmsnative.gest.pv_verifica_giacenze.VerificaGiacenzeModule;
import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeComponent;
import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeModule;
import it.integry.integrywmsnative.gest.settings.MainSettingsComponent;
@@ -114,8 +116,14 @@ import it.integry.integrywmsnative.view.bottom_sheet__mtb_colr_edit.BottomSheetM
import it.integry.integrywmsnative.view.dialogs.ask_cliente.DialogAskClienteComponent;
import it.integry.integrywmsnative.view.dialogs.ask_cliente.DialogAskClienteModule;
import it.integry.integrywmsnative.view.dialogs.ask_commessa.DialogAskCommessaComponent;
import it.integry.integrywmsnative.view.dialogs.ask_deposito.DialogAskDepositoComponent;
import it.integry.integrywmsnative.view.dialogs.ask_deposito.DialogAskDepositoModule;
import it.integry.integrywmsnative.view.dialogs.ask_linea_prod.DialogAskLineaProdComponent;
import it.integry.integrywmsnative.view.dialogs.ask_linea_prod.DialogAskLineaProdModule;
import it.integry.integrywmsnative.view.dialogs.ask_livello_posizione.DialogAskLivelloPosizioneComponent;
import it.integry.integrywmsnative.view.dialogs.ask_livello_posizione.DialogAskLivelloPosizioneModule;
import it.integry.integrywmsnative.view.dialogs.ask_position_of_lu.DialogAskPositionOfLUComponent;
import it.integry.integrywmsnative.view.dialogs.ask_position_of_lu.DialogAskPositionOfLUModule;
import it.integry.integrywmsnative.view.dialogs.ask_unknown_barcode_notes.DialogAskUnknownBarcodeNotesComponent;
import it.integry.integrywmsnative.view.dialogs.ask_unknown_barcode_notes.DialogAskUnknownBarcodeNotesModule;
import it.integry.integrywmsnative.view.dialogs.ask_vettore.DialogAskVettoreComponent;
@@ -124,6 +132,8 @@ import it.integry.integrywmsnative.view.dialogs.basket_lu.DialogBasketLUComponen
import it.integry.integrywmsnative.view.dialogs.basket_lu.DialogBasketLUModule;
import it.integry.integrywmsnative.view.dialogs.bind_product_barcode_with_package.DialogBindProductBarcodeWithPackageComponent;
import it.integry.integrywmsnative.view.dialogs.bind_product_barcode_with_package.DialogBindProductBarcodeWithPackageModule;
import it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_arts.DialogChooseArtFromListaArtsComponent;
import it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_arts.DialogChooseArtFromListaArtsModule;
import it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts.DialogChooseArtsFromMtbAartListComponent;
import it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts.DialogChooseArtsFromMtbAartListModule;
import it.integry.integrywmsnative.view.dialogs.choose_arts_from_mtbcolr_list.DialogChooseArtsFromMtbColrListComponent;
@@ -132,6 +142,10 @@ import it.integry.integrywmsnative.view.dialogs.choose_batch_lot.DialogChooseBat
import it.integry.integrywmsnative.view.dialogs.choose_batch_lot.DialogChooseBatchLotModule;
import it.integry.integrywmsnative.view.dialogs.create_new_art.DialogCreateNewArtComponent;
import it.integry.integrywmsnative.view.dialogs.create_new_art.DialogCreateNewArtModule;
import it.integry.integrywmsnative.view.dialogs.device_end_of_life.DialogDeviceEndOfLifeComponent;
import it.integry.integrywmsnative.view.dialogs.device_end_of_life.DialogDeviceEndOfLifeModule;
import it.integry.integrywmsnative.view.dialogs.extra_info.DialogExtraInfoComponent;
import it.integry.integrywmsnative.view.dialogs.extra_info.DialogExtraInfoModule;
import it.integry.integrywmsnative.view.dialogs.info_aggiuntive_lu.DialogInfoAggiuntiveLUComponent;
import it.integry.integrywmsnative.view.dialogs.info_aggiuntive_lu.DialogInfoAggiuntiveLUModule;
import it.integry.integrywmsnative.view.dialogs.input_lu_prod.DialogInputLUProdComponent;
@@ -233,7 +247,14 @@ import it.integry.integrywmsnative.view.dialogs.update_available.DialogUpdateAva
DialogAskVettoreModule.class,
DialogCreateNewArtModule.class,
DialogSwitchUserDepoModule.class,
DialogUpdateAvailableModule.class
DialogUpdateAvailableModule.class,
DialogAskPositionOfLUModule.class,
DialogAskLivelloPosizioneModule.class,
VerificaGiacenzeModule.class,
DialogExtraInfoModule.class,
DialogAskDepositoModule.class,
DialogChooseArtFromListaArtsModule.class,
DialogDeviceEndOfLifeModule.class
})
public interface MainApplicationComponent {
@@ -392,6 +413,20 @@ public interface MainApplicationComponent {
DialogUpdateAvailableComponent.Factory dialogUpdateAvailableComponent();
DialogAskPositionOfLUComponent.Factory dialogAskPositionOfLUComponent();
DialogAskLivelloPosizioneComponent.Factory dialogAskLivelloPosizioneComponent();
VerificaGiacenzeComponent.Factory verificaGiacenzeComponent();
DialogExtraInfoComponent.Factory dialogExtraInfoComponent();
DialogAskDepositoComponent.Factory dialogAskDepositoComponent();
DialogChooseArtFromListaArtsComponent.Factory dialogChooseArtFromListaArtsComponent();
DialogDeviceEndOfLifeComponent.Factory dialogDeviceEndOfLifeComponent();
void inject(MainApplication mainApplication);
void inject(AppContext mainApplication);

View File

@@ -33,6 +33,7 @@ import it.integry.integrywmsnative.core.rest.consumers.DepositoRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.DocumentRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.EntityRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.GestSetupRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.GiacenzaPvRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.GiacenzaRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.ImballiRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.MagazzinoAutomaticoRESTConsumer;
@@ -48,13 +49,13 @@ import it.integry.integrywmsnative.core.rest.consumers.ProductionLinesRESTConsum
import it.integry.integrywmsnative.core.rest.consumers.ProduzioneRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.VettoriRESTConsumer;
import it.integry.integrywmsnative.core.rest.watcher.ServerStatusChecker;
import it.integry.integrywmsnative.core.services.inventario.InventarioService;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.sound.SoundAlertService;
import it.integry.integrywmsnative.core.update.UpdatesManager;
import it.integry.integrywmsnative.gest.contab_doc_interni.rest.DocInterniRESTConsumer;
import it.integry.integrywmsnative.gest.login.rest.AuthenticationRESTConsumer;
import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.rest.ProdFabbisognoLineeProdRESTConsumer;
import it.integry.integrywmsnative.view.dialogs.DialogProgressView;
import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2View;
@@ -99,8 +100,14 @@ public class MainApplicationModule {
@Provides
@Singleton
MainContext providesMainContextNew(MenuService menuService, AppDatabase appDatabase, SystemRESTConsumer systemRESTConsumer, AuthenticationRESTConsumer authenticationRESTConsumer) {
return new MainContext(mApplication.getApplicationContext(), menuService, appDatabase, systemRESTConsumer, authenticationRESTConsumer);
ServerStatusChecker providesServerStatusChecker(Handler handler) {
return new ServerStatusChecker(handler);
}
@Provides
@Singleton
MainContext providesMainContextNew(MenuService menuService, AppDatabase appDatabase, AuthenticationRESTConsumer authenticationRESTConsumer, ExecutorService executorService, Handler handler, ServerStatusChecker serverStatusChecker) {
return new MainContext(mApplication.getApplicationContext(), menuService, appDatabase, authenticationRESTConsumer, executorService, handler, serverStatusChecker);
}
@Provides
@@ -150,8 +157,8 @@ public class MainApplicationModule {
@Provides
@Singleton
OrdiniRESTConsumer provideOrdiniRESTConsumer(RESTBuilder restBuilder, SystemRESTConsumer systemRESTConsumer, EntityRESTConsumer entityRESTConsumer) {
return new OrdiniRESTConsumer(restBuilder, systemRESTConsumer, entityRESTConsumer);
OrdiniRESTConsumer provideOrdiniRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService, SystemRESTConsumer systemRESTConsumer, EntityRESTConsumer entityRESTConsumer) {
return new OrdiniRESTConsumer(restBuilder, executorService, systemRESTConsumer, entityRESTConsumer);
}
@Provides
@@ -162,20 +169,20 @@ public class MainApplicationModule {
@Provides
@Singleton
ArticoloRESTConsumer provideArticoloRESTConsumer(RESTBuilder restBuilder, SystemRESTConsumer systemRESTConsumer) {
return new ArticoloRESTConsumer(restBuilder, systemRESTConsumer);
ArticoloRESTConsumer provideArticoloRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService, SystemRESTConsumer systemRESTConsumer) {
return new ArticoloRESTConsumer(restBuilder, executorService, systemRESTConsumer);
}
@Provides
@Singleton
CommessaRESTConsumer provideCommessaRESTConsumer(SystemRESTConsumer systemRESTConsumer) {
return new CommessaRESTConsumer(systemRESTConsumer);
CommessaRESTConsumer provideCommessaRESTConsumer(ExecutorService executorService, SystemRESTConsumer systemRESTConsumer) {
return new CommessaRESTConsumer(executorService, systemRESTConsumer);
}
@Provides
@Singleton
DepositoRESTConsumer provideDepositoRESTConsumer(EntityRESTConsumer entityRESTConsumer, SystemRESTConsumer systemRESTConsumer) {
return new DepositoRESTConsumer(entityRESTConsumer, systemRESTConsumer);
DepositoRESTConsumer provideDepositoRESTConsumer(ExecutorService executorService, SystemRESTConsumer systemRESTConsumer) {
return new DepositoRESTConsumer(executorService, systemRESTConsumer);
}
@Provides
@@ -198,18 +205,19 @@ public class MainApplicationModule {
@Provides
@Singleton
EntityRESTConsumer provideEntityRESTConsumer(RESTBuilder restBuilder) {
return new EntityRESTConsumer(restBuilder);
EntityRESTConsumer provideEntityRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService) {
return new EntityRESTConsumer(restBuilder, executorService);
}
@Provides
@Singleton
ColliMagazzinoRESTConsumer provideColliMagazzinoRESTConsumer(RESTBuilder restBuilder,
ColliMagazzinoRESTConsumer provideColliMagazzinoRESTConsumer(ExecutorService executorService,
RESTBuilder restBuilder,
SystemRESTConsumer systemRESTConsumer,
ArticoloRESTConsumer articoloRESTConsumer,
EntityRESTConsumer entityRESTConsumer,
SettingsManager settingsManager) {
return new ColliMagazzinoRESTConsumer(restBuilder, systemRESTConsumer, articoloRESTConsumer, entityRESTConsumer, settingsManager);
return new ColliMagazzinoRESTConsumer(executorService, restBuilder, systemRESTConsumer, articoloRESTConsumer, entityRESTConsumer, settingsManager);
}
@Provides
@@ -238,8 +246,8 @@ public class MainApplicationModule {
@Provides
@Singleton
SystemRESTConsumer provideSystemRESTConsumer(ExecutorService executorService, RESTBuilder restBuilder) {
return new SystemRESTConsumer(executorService, restBuilder);
SystemRESTConsumer provideSystemRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService) {
return new SystemRESTConsumer(restBuilder, executorService);
}
@Provides
@@ -250,14 +258,8 @@ public class MainApplicationModule {
@Provides
@Singleton
PosizioniRESTConsumer providesPosizioniRESTConsumer(RESTBuilder restBuilder, SystemRESTConsumer systemRESTConsumer) {
return new PosizioniRESTConsumer(restBuilder, systemRESTConsumer);
}
@Provides
@Singleton
ProdFabbisognoLineeProdRESTConsumer providesProdFabbisognoLineeProdRESTConsumer(RESTBuilder restBuilder, SystemRESTConsumer systemRESTConsumer) {
return new ProdFabbisognoLineeProdRESTConsumer(restBuilder, systemRESTConsumer);
PosizioniRESTConsumer providesPosizioniRESTConsumer(RESTBuilder restBuilder, SystemRESTConsumer systemRESTConsumer, ExecutorService executorService) {
return new PosizioniRESTConsumer(restBuilder, systemRESTConsumer, executorService);
}
@Provides
@@ -268,8 +270,14 @@ public class MainApplicationModule {
@Provides
@Singleton
GiacenzaRESTConsumer provideGiacenzaRESTConsumer(RESTBuilder restBuilder, ArticoloRESTConsumer articoloRESTConsumer) {
return new GiacenzaRESTConsumer(restBuilder, articoloRESTConsumer);
GiacenzaRESTConsumer provideGiacenzaRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService, ArticoloRESTConsumer articoloRESTConsumer) {
return new GiacenzaRESTConsumer(restBuilder, executorService, articoloRESTConsumer);
}
@Provides
@Singleton
GiacenzaPvRESTConsumer provideGiacenzaPvRESTConsumer(RESTBuilder restBuilder) {
return new GiacenzaPvRESTConsumer(restBuilder);
}
@Provides
@@ -298,8 +306,8 @@ public class MainApplicationModule {
@Provides
@Singleton
DocumentRESTConsumer provideDocumentiRESTConsumer(RESTBuilder restBuilder) {
return new DocumentRESTConsumer(restBuilder);
DocumentRESTConsumer provideDocumentiRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService) {
return new DocumentRESTConsumer(restBuilder, executorService);
}
@Provides
@@ -310,20 +318,20 @@ public class MainApplicationModule {
@Provides
@Singleton
ColliSpedizioneRESTConsumer provideColliSpedizioneRESTConsumer(RESTBuilder restBuilder) {
return new ColliSpedizioneRESTConsumer(restBuilder);
ColliSpedizioneRESTConsumer provideColliSpedizioneRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService) {
return new ColliSpedizioneRESTConsumer(restBuilder, executorService);
}
@Provides
@Singleton
ColliLavorazioneRESTConsumer provideColliLavorazioneRESTConsumer(RESTBuilder restBuilder, SettingsManager settingsManager) {
return new ColliLavorazioneRESTConsumer(restBuilder, settingsManager);
ColliLavorazioneRESTConsumer provideColliLavorazioneRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService, SettingsManager settingsManager) {
return new ColliLavorazioneRESTConsumer(restBuilder, executorService, settingsManager);
}
@Provides
@Singleton
MagazzinoAutomaticoRESTConsumer provideMagazzinoAutomaticoRESTConsumer(RESTBuilder restBuilder) {
return new MagazzinoAutomaticoRESTConsumer(restBuilder);
MagazzinoAutomaticoRESTConsumer provideMagazzinoAutomaticoRESTConsumer(ExecutorService executorService, RESTBuilder restBuilder) {
return new MagazzinoAutomaticoRESTConsumer(executorService, restBuilder);
}
@Provides

View File

@@ -4,15 +4,19 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.text.SpannableString;
import android.text.Spanned;
import android.view.LayoutInflater;
import androidx.databinding.DataBindingUtil;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import javax.inject.Inject;
@@ -26,6 +30,7 @@ import it.integry.integrywmsnative.databinding.ActivitySplashBinding;
import it.integry.integrywmsnative.gest.login.LoginActivity;
import it.integry.integrywmsnative.gest.main.MainActivity;
import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView;
import it.integry.integrywmsnative.view.dialogs.device_end_of_life.DialogDeviceEndOfLifeView;
public class SplashActivity extends BaseActivity implements MainContext.Listener {
@@ -37,6 +42,9 @@ public class SplashActivity extends BaseActivity implements MainContext.Listener
@Inject
MainContext mainContext;
@Inject
Handler handler;
private RunnableArgsss<Integer, String[], List<Integer>> onRequestPermissionResult;
public static void startActivity(Context context) {
@@ -61,9 +69,24 @@ public class SplashActivity extends BaseActivity implements MainContext.Listener
UtilityContext.initMainActivity(this);
LocalDate endSupportDate = LocalDate.of(2026, 1, 31);
initAppVersion();
initPermissions(this::init);
boolean isOldAndroid = Build.VERSION.SDK_INT < Build.VERSION_CODES.O;
executorService.execute(() -> {
if (isOldAndroid)
showDeviceEndOfLifeMessage();
handler.post(() -> {
if (LocalDate.now().isBefore(endSupportDate) || !isOldAndroid) {
initAppVersion();
initPermissions(this::init);
} else {
this.finish();
}
});
});
}
private void initAppVersion() {
@@ -101,14 +124,29 @@ public class SplashActivity extends BaseActivity implements MainContext.Listener
}
}
private void showDeviceEndOfLifeMessage() {
CountDownLatch latch = new CountDownLatch(1);
DialogDeviceEndOfLifeView.newInstance(latch::countDown)
.show(this.getSupportFragmentManager(), "dialog_device_end_of_life");
try {
latch.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
@Override
public void onDBDataLoading(String item) {
runOnUiThread(() -> mBinding.loadingInfoTextview.setText("Caricamento " + item));
handler.post(() -> mBinding.loadingInfoTextview.setText("Caricamento " + item));
}
@Override
public void onMenuLoading() {
runOnUiThread(() -> mBinding.loadingInfoTextview.setText("Caricamento menù"));
handler.post(() -> mBinding.loadingInfoTextview.setText("Caricamento menù"));
}
@Override
@@ -151,11 +189,13 @@ public class SplashActivity extends BaseActivity implements MainContext.Listener
@Override
public void onError(Spanned message) {
handler.post(() -> {
DialogSimpleMessageView.makeErrorDialog(
message, null, this::finish, R.string.logout, () -> {
this.mainContext.logout(MainApplication::exit);
})
.show(this.getSupportFragmentManager(), "tag");
DialogSimpleMessageView.makeErrorDialog(
message, null, this::finish, R.string.logout, () -> {
this.mainContext.logout(MainApplication::exit);
})
.show(this.getSupportFragmentManager(), "tag");
});
}
}

View File

@@ -24,19 +24,4 @@ public class CommonConst {
public static String RECOVER_COLLO_FILE = "recover_ul.json";
}
public static class Mail {
public static String[] forErrorsDebug = {
"g.scorrano@integry.it",
"v.castellana@integry.it"
};
public static String[] forErrors = {
// "syslogs@integry.it",
"g.scorrano@integry.it",
"v.castellana@integry.it"
};
}
}

View File

@@ -11,11 +11,11 @@ public class JwtUtils {
private final static String SIGNING_KEY = "gICy3bjD56i/YFnBZZKe5ibiz3Snsp08nybGGziCV4ZcvyXBbyqWUnJ2wTrRXhOuf/xdljPXX0yBaqdAgvKthQ==";
public static Claims parseJwt(String token) {
Jws<Claims> jws = Jwts.parserBuilder()
.setSigningKey(Keys.hmacShaKeyFor(Decoders.BASE64.decode(SIGNING_KEY)))
Jws<Claims> jws = Jwts.parser()
.verifyWith(Keys.hmacShaKeyFor(Decoders.BASE64.decode(SIGNING_KEY)))
.build()
.parseClaimsJws(token);
.parseSignedClaims(token);
return jws.getBody();
return jws.getPayload();
}
}

View File

@@ -7,6 +7,7 @@ public class BarcodeCallbackDTO {
private int ID = -1;
private boolean enabled = true;
private RunnableArgs<BarcodeScanDTO> onScanSuccessfull;
private RunnableArgs<Exception> onScanFailed;
@@ -19,6 +20,15 @@ public class BarcodeCallbackDTO {
return this;
}
public boolean isEnabled() {
return enabled;
}
public BarcodeCallbackDTO setEnabled(boolean enabled) {
this.enabled = enabled;
return this;
}
public RunnableArgs<BarcodeScanDTO> getOnScanSuccessfull() {
return onScanSuccessfull;
}

View File

@@ -24,10 +24,15 @@ public class BarcodeManager {
private static BarcodeReaderInterface mCurrentBarcodeInterface;
private static final List<BarcodeCallbackDTO> mBarcodeCallbacksStacktrace = new ArrayList<>();
private static boolean mEnabled = true;
// private static boolean mEnabled = true;
private static final Class<? extends BarcodeReaderInterface>[] registeredBarcodeReaderInterfaces = new Class[]{PointMobileBarcodeReader.class, ZebraBarcodeReader.class, HoneyWellBarcodeReader.class, KeyboardEmulatorBarcodeReader.class};
private static final Class<? extends BarcodeReaderInterface>[] registeredBarcodeReaderInterfaces = new Class[]{
PointMobileBarcodeReader.class,
ZebraBarcodeReader.class,
HoneyWellBarcodeReader.class,
KeyboardEmulatorBarcodeReader.class
};
public static void init(Context applicationContext) throws Exception {
@@ -56,12 +61,12 @@ public class BarcodeManager {
mCurrentBarcodeInterface.register(data -> {
BarcodeCallbackDTO callback = getValidCallback();
if (callback != null && mEnabled) {
if (callback != null && callback.isEnabled()) {
callback.getOnScanSuccessfull().run(data);
}
}, ex -> {
BarcodeCallbackDTO callback = getValidCallback();
if (callback != null && mEnabled) {
if (callback != null && callback.isEnabled()) {
callback.getOnScanFailed().run(ex);
}
});
@@ -103,7 +108,6 @@ public class BarcodeManager {
}
public static int addCallback(BarcodeCallbackDTO barcodeCallbackDTO) {
int newID = -1;
if (!mBarcodeCallbacksStacktrace.isEmpty()) {
@@ -133,18 +137,39 @@ public class BarcodeManager {
}
public static void disable() {
mEnabled = false;
// UtilityLogger.info("Barcode reader disabled");
public static void disable(int instanceId) {
mBarcodeCallbacksStacktrace.stream().filter(x -> x.getID() == instanceId)
.findFirst().ifPresent(x -> x.setEnabled(false));
}
public static void enable() {
mEnabled = true;
// UtilityLogger.info("Barcode reader enabled");
public static void disableLastCallback() {
BarcodeCallbackDTO validCallback = getValidCallback();
if (validCallback != null) {
validCallback.setEnabled(false);
}
}
public static boolean isEnabled() {
return mEnabled;
public static void enable(int instanceId) {
mBarcodeCallbacksStacktrace.stream().filter(x -> x.getID() == instanceId)
.findFirst().ifPresent(x -> x.setEnabled(true));
}
public static void enableLastCallback() {
BarcodeCallbackDTO validCallback = getValidCallback();
if (validCallback != null) {
validCallback.setEnabled(true);
}
}
public static boolean isEnabled(int instanceId) {
return mBarcodeCallbacksStacktrace.stream().filter(x -> x.getID() == instanceId)
.findFirst()
.map(BarcodeCallbackDTO::isEnabled)
.orElse(false);
}
public static boolean isLastCallbackEnabled() {
return getValidCallback() != null && getValidCallback().isEnabled();
}
public static void changeSettings(List<Pair<String, Object>> settings) {

View File

@@ -19,6 +19,7 @@ import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.ProdRiposi
import it.integry.integrywmsnative.gest.prod_versamento_materiale.ProdVersamentoMaterialeFragment;
import it.integry.integrywmsnative.gest.prod_versamento_materiale_su_mag_prossimita.ProdVersamentoMaterialeInBufferFragment;
import it.integry.integrywmsnative.gest.pv_ordini_acquisto.PVOrdiniAcquistoGrigliaFragment;
import it.integry.integrywmsnative.gest.pv_verifica_giacenze.VerificaGiacenzeFragment;
import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeFragment;
import it.integry.integrywmsnative.gest.spedizione.dialogs.row_info.info_situazione_articolo.DialogInfoSituazioneArticoloView;
import it.integry.integrywmsnative.gest.ultime_consegne_cliente.UltimeConsegneClienteFragment;
@@ -242,6 +243,7 @@ public class MenuConfiguration extends BaseMenuConfiguration {
.setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_purchase_orders_pv)
.setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_purchase_orders_pv)
.setFragmentFactory(PVOrdiniAcquistoGrigliaFragment::newInstance))
.addItem(new MenuItem()
.setCodMenu("MG058")
.setID(it.integry.integrywmsnative.R.id.nav_pv_doc_interni)
@@ -250,6 +252,14 @@ public class MenuConfiguration extends BaseMenuConfiguration {
.setDrawerIcon(R.drawable.ic_documents_outline)
.setFragmentFactory(DocInterniFragment::newInstance))
.addItem(new MenuItem()
.setCodMenu("MG075")
.setID(it.integry.integrywmsnative.R.id.nav_pv_verifica_giacenze)
.setTitleText(R.string.verifica_giacenze_menu)
.setTitleIcon(R.drawable.ic_dashboard_verifica_giacenze)
.setDrawerIcon(R.drawable.ic_drawer_verifica_giacenze)
.setFragmentFactory(VerificaGiacenzeFragment::newInstance))
// .addItem(new MenuItem()
// .setID(it.integry.integrywmsnative.R.id.nav_pv_ordini_acquisto_trasmessi)
// .setTitleText(it.integry.integrywmsnative.R.string.transmitted_orders)

View File

@@ -89,11 +89,25 @@ public class AppContext {
private void initLogger() {
Logger.addLogAdapter(new AndroidLogAdapter());
logsFolder = new File(mApplicationContext.getExternalFilesDir(null).getAbsolutePath());
int maxBytesSize = 5 * 1024 * 1024;
Logger.addLogAdapter(new DiskLogAdapter(logsFolder, maxBytesSize));
File dataDir = mApplicationContext.getExternalFilesDir(null);
logsFolder = new File(dataDir, "logs");
if (!logsFolder.exists())
logsFolder.mkdirs();
//Temporary clean
File[] wrongFilesToBeDeleted = dataDir.listFiles((file, s) -> s.startsWith("logs_"));
if (wrongFilesToBeDeleted != null)
for (File fileToDelete : wrongFilesToBeDeleted) {
fileToDelete.delete();
}
removeOldLogs(logsFolder);
int maxBytesSize = 5 * 1024 * 1024;
Logger.addLogAdapter(new DiskLogAdapter(logsFolder, maxBytesSize));
}
private void removeOldLogs(File logsFolder) {

View File

@@ -1,6 +1,7 @@
package it.integry.integrywmsnative.core.context;
import android.content.Context;
import android.os.Handler;
import android.text.Html;
import android.text.SpannableString;
import android.text.Spanned;
@@ -9,16 +10,15 @@ import android.text.SpannedString;
import com.google.firebase.installations.FirebaseInstallations;
import java.net.ConnectException;
import java.util.concurrent.ExecutorService;
import javax.inject.Singleton;
import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager;
import it.integry.integrywmsnative.core.data_store.db.AppDatabase;
import it.integry.integrywmsnative.core.menu.MenuService;
import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer;
import it.integry.integrywmsnative.core.rest.watcher.ServerStatusChecker;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityThread;
import it.integry.integrywmsnative.gest.login.rest.AuthenticationRESTConsumer;
@Singleton
@@ -27,17 +27,21 @@ public class MainContext {
private final Context applicationContext;
private final MenuService menuService;
private final AppDatabase appDatabase;
private final SystemRESTConsumer systemRESTConsumer;
private final AuthenticationRESTConsumer authenticationRESTConsumer;
private final ExecutorService executorService;
private final Handler handler;
private final ServerStatusChecker serverStatusChecker;
private Listener mListener;
public MainContext(Context applicationContext, MenuService menuService, AppDatabase appDatabase, SystemRESTConsumer systemRESTConsumer, AuthenticationRESTConsumer authenticationRESTConsumer) {
public MainContext(Context applicationContext, MenuService menuService, AppDatabase appDatabase, AuthenticationRESTConsumer authenticationRESTConsumer, ExecutorService executorService, Handler handler, ServerStatusChecker serverStatusChecker) {
this.applicationContext = applicationContext;
this.menuService = menuService;
this.appDatabase = appDatabase;
this.systemRESTConsumer = systemRESTConsumer;
this.authenticationRESTConsumer = authenticationRESTConsumer;
this.executorService = executorService;
this.handler = handler;
this.serverStatusChecker = serverStatusChecker;
}
public void init() {
@@ -48,34 +52,31 @@ public class MainContext {
}
//this.initAuthSession(() -> {
this.initDeviceId(() -> {
this.initDBData(() -> {
this.initMenu(() -> {
executorService.execute(() -> {
if (mListener != null) mListener.onContextInitialized();
});
});
try {
this.initDBData();
this.initMenu();
serverStatusChecker.init();
if (mListener != null) mListener.onContextInitialized();
} catch (Exception ex) {
Spanned message = null;
if (ex.getCause() != null && ex.getCause() instanceof ConnectException) {
message = Html.fromHtml("Impossibile collegarsi all'host <b>" + SettingsManager.i().getServer().getHost() + ":" + SettingsManager.i().getServer().getPort() + "</b>. Riprovare più tardi.");
} else if (ex.getMessage().startsWith("Status 404:")) {
message = Html.fromHtml("Errore 404. Non è stato possibile soddisfare la richiesta sull'host <b>" + SettingsManager.i().getServer().getHost() + ":" + SettingsManager.i().getServer().getPort() + "</b>. Riprovare più tardi.");
} else {
message = new SpannableString(ex.getMessage());
}
if (mListener != null) mListener.onError(message);
}
});
//});
this.initServerStatusChecker();
// EventBus.getDefault().register(this);
}
// @Subscribe(threadMode = ThreadMode.MAIN)
// public void onSessionExpired(SessionExpiredEvent event) {
// DialogSimpleMessageView.makeErrorDialog(
// new SpannedString("La sessione è scaduta. Effettua nuovamente la login"),
// null,
// () -> {
// logout(MainApplication::exit);
// })
// .show(activity.getSupportFragmentManager(), "expired-session-error");
// }
private void initAuthSession(Runnable onComplete) {
this.authenticationRESTConsumer.me(obj -> {
@@ -96,59 +97,37 @@ public class MainContext {
SettingsManager.i().getUserSession().setDeviceId(fid.getResult());
SettingsManager.update();
systemRESTConsumer.registerDevice(onComplete, ex -> {
if (mListener != null) mListener.onError(new SpannedString(ex.getMessage()));
});
// systemRESTConsumer.registerDevice(onComplete, ex -> {
// if (mListener != null) mListener.onError(new SpannedString(ex.getMessage()));
// });
});
}
public void logout(Runnable onLoggedOut) {
menuService.invalidateCache();
UtilityThread.executeParallel(() -> {
executorService.execute(() -> {
SettingsManager.i().setUser(null);
SettingsManager.i().setUserSession(null);
SettingsManager.update();
appDatabase.clearAllTables();
onLoggedOut.run();
}, true);
handler.post(() -> {
onLoggedOut.run();
});
});
}
private void initServerStatusChecker() {
ServerStatusChecker.init();
}
private void initDBData(Runnable onComplete) {
private void initDBData() throws Exception {
SettingsManager.loadDBVariables(item -> {
if (mListener != null) mListener.onDBDataLoading(item);
},
onComplete,
ex -> {
Spanned message = null;
if (ex.getCause() != null && ex.getCause() instanceof ConnectException) {
message = Html.fromHtml("Impossibile collegarsi all'host <b>" + SettingsManager.i().getServer().getHost() + ":" + SettingsManager.i().getServer().getPort() + "</b>. Riprovare più tardi.");
} else if (ex.getMessage().startsWith("Status 404:")) {
message = Html.fromHtml("Errore 404. Non è stato possibile soddisfare la richiesta sull'host <b>" + SettingsManager.i().getServer().getHost() + ":" + SettingsManager.i().getServer().getPort() + "</b>. Riprovare più tardi.");
} else {
message = new SpannableString(ex.getMessage());
}
if (mListener != null) mListener.onError(message);
}
);
if (mListener != null) mListener.onDBDataLoading(item);
});
}
private void initMenu(Runnable onComplete) {
private void initMenu() throws Exception {
if (mListener != null) mListener.onMenuLoading();
this.menuService.init(onComplete, ex -> {
if (mListener != null) mListener.onError(new SpannedString(ex.getMessage()));
});
this.menuService.init();
}

View File

@@ -1,5 +1,6 @@
package it.integry.integrywmsnative.core.data_recover;
import java.time.LocalDate;
import java.util.List;
import it.integry.integrywmsnative.core.model.MtbColt;
@@ -10,7 +11,7 @@ public class ColliDataRecoverDTO {
private int id;
private int numCollo;
private String serCollo;
private String dataCollo;
private LocalDate dataCollo;
private String gestioneCollo;
private String filtro;
@@ -43,11 +44,11 @@ public class ColliDataRecoverDTO {
return this;
}
public String getDataCollo() {
public LocalDate getDataCollo() {
return dataCollo;
}
public ColliDataRecoverDTO setDataCollo(String dataCollo) {
public ColliDataRecoverDTO setDataCollo(LocalDate dataCollo) {
this.dataCollo = dataCollo;
return this;
}

View File

@@ -2,7 +2,6 @@ package it.integry.integrywmsnative.core.data_recover;
import android.content.Context;
import com.annimon.stream.Optional;
import com.annimon.stream.Stream;
import com.google.android.gms.common.util.IOUtils;
import com.google.gson.Gson;
@@ -14,6 +13,7 @@ import java.io.InputStream;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import javax.inject.Inject;
@@ -65,9 +65,9 @@ public class ColliDataRecoverService {
}
private ColliDataRecoverDTO getIfExists(int id) {
Optional<ColliDataRecoverDTO> recoverDTOOptional = Stream.of(mtbColtsSessions)
Optional<ColliDataRecoverDTO> recoverDTOOptional = mtbColtsSessions.stream()
.filter(x -> x.getId() == id)
.findSingle();
.findFirst();
return recoverDTOOptional.isPresent() ? recoverDTOOptional.get() : null;
@@ -85,7 +85,7 @@ public class ColliDataRecoverService {
ColliDataRecoverDTO recoverDTO = new ColliDataRecoverDTO()
.setId(newId)
.setDataCollo(mtbColtSession.getDataColloS())
.setDataCollo(mtbColtSession.getDataColloLD())
.setNumCollo(mtbColtSession.getNumCollo())
.setSerCollo(mtbColtSession.getSerCollo())
.setGestioneCollo(mtbColtSession.getGestione())

View File

@@ -22,14 +22,18 @@ import it.integry.integrywmsnative.core.data_store.db.dao.MtbColrDao;
import it.integry.integrywmsnative.core.data_store.db.dao.MtbColtDao;
import it.integry.integrywmsnative.core.data_store.db.dao.OrdineDao;
import it.integry.integrywmsnative.core.data_store.db.dao.RawDao;
import it.integry.integrywmsnative.core.data_store.db.dao.VerificaGiacenzeDao;
import it.integry.integrywmsnative.core.data_store.db.dao.VerificaGiacenzeRowDao;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloGriglia;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloOrdine;
import it.integry.integrywmsnative.core.data_store.db.entity.Griglia;
import it.integry.integrywmsnative.core.data_store.db.entity.InventarioRoomDTO;
import it.integry.integrywmsnative.core.data_store.db.entity.InventarioEntity;
import it.integry.integrywmsnative.core.data_store.db.entity.InventarioRowRoomDTO;
import it.integry.integrywmsnative.core.data_store.db.entity.Ordine;
import it.integry.integrywmsnative.core.data_store.db.entity.SqlMtbColr;
import it.integry.integrywmsnative.core.data_store.db.entity.SqlMtbColt;
import it.integry.integrywmsnative.core.data_store.db.entity.VerificaGiacenzeEntity;
import it.integry.integrywmsnative.core.data_store.db.entity.VerificaGiacenzeRowEntity;
@Database(entities = {
ArticoloGriglia.class,
@@ -38,10 +42,12 @@ import it.integry.integrywmsnative.core.data_store.db.entity.SqlMtbColt;
ArticoloOrdine.class,
SqlMtbColt.class,
SqlMtbColr.class,
InventarioRoomDTO.class,
InventarioRowRoomDTO.class
InventarioEntity.class,
InventarioRowRoomDTO.class,
VerificaGiacenzeEntity.class,
VerificaGiacenzeRowEntity.class
},
version = 17)
version = 18)
@TypeConverters({
DateConverter.class,
BigDecimalConverter.class,
@@ -70,7 +76,8 @@ public abstract class AppDatabase extends RoomDatabase {
.addMigrations(MIGRATION_13_14)
.addMigrations(MIGRATION_14_15)
.addMigrations(MIGRATION_15_16)
.addMigrations(MIGRATION_16_17);
.addMigrations(MIGRATION_16_17)
.addMigrations(MIGRATION_17_18);
sInstance = builder.build();
}
@@ -95,6 +102,10 @@ public abstract class AppDatabase extends RoomDatabase {
public abstract InventarioRowDao inventarioRowDao();
public abstract VerificaGiacenzeDao verificaGiacenzeDao();
public abstract VerificaGiacenzeRowDao verificaGiacenzeRowDao();
static final Migration MIGRATION_10_11 = new Migration(10, 11) {
@@ -182,4 +193,28 @@ public abstract class AppDatabase extends RoomDatabase {
database.execSQL("DROP TABLE _inventario_rows_old;");
}
};
static final Migration MIGRATION_17_18 = new Migration(17, 18) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE IF NOT EXISTS verifica_giacenze (_id INTEGER PRIMARY KEY AUTOINCREMENT, cod_mdep TEXT NOT NULL, data INTEGER, remote_sync_date INTEGER);");
database.execSQL("CREATE INDEX IF NOT EXISTS index_verifica_giacenze__id ON verifica_giacenze (_id);");
database.execSQL("CREATE TABLE IF NOT EXISTS verifica_giacenze_rows (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"parent_id INTEGER, " +
"created_at INTEGER DEFAULT CURRENT_TIMESTAMP, " +
"cod_mart TEXT, " +
"partita_mag TEXT, " +
"descrizione TEXT, " +
"qta_in_giacenza REAL NOT NULL DEFAULT 0, " +
"qta REAL NOT NULL DEFAULT 0, " +
"num_cnf REAL NOT NULL DEFAULT 0, " +
"qta_cnf REAL NOT NULL DEFAULT 0, " +
"scan_cod_barre TEXT, " +
"remote_sync_date INTEGER, " +
"FOREIGN KEY(parent_id) REFERENCES verifica_giacenze(_id) ON UPDATE NO ACTION ON DELETE CASCADE );");
database.execSQL("CREATE INDEX IF NOT EXISTS index_verifica_giacenze_rows__id ON verifica_giacenze_rows (_id)");
database.execSQL("CREATE INDEX IF NOT EXISTS index_verifica_giacenze_rows_parent_id ON verifica_giacenze_rows (parent_id)");
}
};
}

View File

@@ -18,6 +18,8 @@ import it.integry.integrywmsnative.core.data_store.db.dao.MtbColrDao;
import it.integry.integrywmsnative.core.data_store.db.dao.MtbColtDao;
import it.integry.integrywmsnative.core.data_store.db.dao.OrdineDao;
import it.integry.integrywmsnative.core.data_store.db.dao.RawDao;
import it.integry.integrywmsnative.core.data_store.db.dao.VerificaGiacenzeDao;
import it.integry.integrywmsnative.core.data_store.db.dao.VerificaGiacenzeRowDao;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoliOrdineRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoloGrigliaRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.GrigliaRepository;
@@ -32,10 +34,17 @@ import it.integry.integrywmsnative.core.data_store.db.repository.datasource.SqlM
import it.integry.integrywmsnative.core.data_store.db.repository.datasource.SqlMtbColtDataSource;
import it.integry.integrywmsnative.core.data_store.db.respository_new.InventarioRepository;
import it.integry.integrywmsnative.core.data_store.db.respository_new.InventarioRowRepository;
import it.integry.integrywmsnative.core.data_store.db.respository_new.VerificaGiacenzeRepository;
import it.integry.integrywmsnative.core.data_store.db.respository_new.VerificaGiacenzeRowRepository;
import it.integry.integrywmsnative.core.data_store.db.respository_new.data_source.InventarioLocalDataSource;
import it.integry.integrywmsnative.core.data_store.db.respository_new.data_source.InventarioRowLocalDataSource;
import it.integry.integrywmsnative.core.data_store.db.respository_new.data_source.VerificaGiacenzeLocalDataSource;
import it.integry.integrywmsnative.core.data_store.db.respository_new.data_source.VerificaGiacenzeRowLocalDataSource;
import it.integry.integrywmsnative.core.mapper.InventarioMapper;
import it.integry.integrywmsnative.core.mapper.InventarioRowMapper;
import it.integry.integrywmsnative.core.mapper.VerificaGiacenzeMapper;
import it.integry.integrywmsnative.core.mapper.VerificaGiacenzeRowMapper;
import it.integry.integrywmsnative.core.rest.consumers.GiacenzaPvRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.InventarioRESTConsumer;
@Module
@@ -108,6 +117,11 @@ public class RoomModule {
return appDatabase.inventarioRowDao();
}
@Singleton
@Provides
InventarioMapper providesInventarioMapper(InventarioRowMapper inventarioRowMapper) {
return new InventarioMapper(inventarioRowMapper);
}
@Singleton
@Provides
@@ -117,8 +131,26 @@ public class RoomModule {
@Singleton
@Provides
InventarioMapper providesInventarioMapper(InventarioRowMapper inventarioRowMapper) {
return new InventarioMapper(inventarioRowMapper);
VerificaGiacenzeDao providesVerificaGiacenzeDao(AppDatabase appDatabase) {
return appDatabase.verificaGiacenzeDao();
}
@Singleton
@Provides
VerificaGiacenzeRowDao providesVerificaGiacenzeRowDao(AppDatabase appDatabase) {
return appDatabase.verificaGiacenzeRowDao();
}
@Singleton
@Provides
VerificaGiacenzeMapper providesVerificaGiacenzeMapper(VerificaGiacenzeRowMapper verificaGiacenzeRowMapper) {
return new VerificaGiacenzeMapper(verificaGiacenzeRowMapper);
}
@Singleton
@Provides
VerificaGiacenzeRowMapper providesVerificaGiacenzeRowMapper() {
return new VerificaGiacenzeRowMapper();
}
@@ -182,4 +214,20 @@ public class RoomModule {
return new InventarioRowRepository(inventarioRowLocalDataSource, inventarioRESTConsumer, inventarioRowMapper, handler);
}
@Provides
VerificaGiacenzeRepository providesVerificaGiacenzeRepository(ExecutorService executorService, Handler handler,
VerificaGiacenzeLocalDataSource verificaGiacenzeLocalDataSource,
GiacenzaPvRESTConsumer giacenzaPvRESTConsumer,
VerificaGiacenzeMapper verificaGiacenzeMapper) {
return new VerificaGiacenzeRepository(verificaGiacenzeLocalDataSource, giacenzaPvRESTConsumer, verificaGiacenzeMapper, handler, executorService);
}
@Provides
VerificaGiacenzeRowRepository providesVerificaGiacenzeRowRepository(ExecutorService executorService, Handler handler,
VerificaGiacenzeRowLocalDataSource verificaGiacenzeRowLocalDataSource,
GiacenzaPvRESTConsumer giacenzaPvRESTConsumer,
VerificaGiacenzeRowMapper verificaGiacenzeRowMapper) {
return new VerificaGiacenzeRowRepository(verificaGiacenzeRowLocalDataSource, giacenzaPvRESTConsumer, verificaGiacenzeRowMapper, handler, executorService);
}
}

View File

@@ -7,21 +7,21 @@ import java.util.List;
import io.reactivex.rxjava3.core.Flowable;
import it.integry.integrywmsnative.core.data_store.db.entity.BaseSyncDTO;
import it.integry.integrywmsnative.core.data_store.db.entity.InventarioRoomDTO;
import it.integry.integrywmsnative.core.data_store.db.entity.InventarioEntity;
import it.integry.integrywmsnative.core.data_store.db.interfaces.EntityDaoInterface;
@Dao
public interface InventarioDao extends EntityDaoInterface<InventarioRoomDTO> {
public interface InventarioDao extends EntityDaoInterface<InventarioEntity> {
@Query("SELECT * FROM " + InventarioRoomDTO.TABLE_NAME +
@Query("SELECT * FROM " + InventarioEntity.TABLE_NAME +
" WHERE ((:toBeSync = 1 AND " + BaseSyncDTO.Columns.COLUMN_REMOTE_SYNC_DATE + " IS NULL) OR (:toBeSync = 0))")
List<InventarioRoomDTO> selectAll(boolean toBeSync);
List<InventarioEntity> selectAll(boolean toBeSync);
@Query("SELECT * FROM " + InventarioRoomDTO.TABLE_NAME +
@Query("SELECT * FROM " + InventarioEntity.TABLE_NAME +
" WHERE ((:toBeSync = 1 AND " + BaseSyncDTO.Columns.COLUMN_REMOTE_SYNC_DATE + " IS NULL) OR (:toBeSync = 0))" +
" ORDER BY " + InventarioRoomDTO.Columns.DATA_INVENTARIO + " DESC")
Flowable<List<InventarioRoomDTO>> selectAllFlowable(boolean toBeSync);
" ORDER BY " + InventarioEntity.Columns.DATA_INVENTARIO + " DESC")
Flowable<List<InventarioEntity>> selectAllFlowable(boolean toBeSync);
}

View File

@@ -0,0 +1,42 @@
package it.integry.integrywmsnative.core.data_store.db.dao;
import androidx.room.Dao;
import androidx.room.Query;
import androidx.room.Transaction;
import java.util.List;
import io.reactivex.rxjava3.core.Flowable;
import it.integry.integrywmsnative.core.data_store.db.entity.BaseSyncDTO;
import it.integry.integrywmsnative.core.data_store.db.entity.VerificaGiacenzeEntity;
import it.integry.integrywmsnative.core.data_store.db.entity.VerificaGiacenzeRowEntity;
import it.integry.integrywmsnative.core.data_store.db.interfaces.EntityDaoInterface;
import it.integry.integrywmsnative.core.data_store.db.wrappers.VerificaGiacenzeWithRowsWrapper;
@Dao
public interface VerificaGiacenzeDao extends EntityDaoInterface<VerificaGiacenzeEntity> {
@Transaction
@Query("SELECT * FROM " + VerificaGiacenzeEntity.TABLE_NAME +
" WHERE ((:toBeSync = 1 AND " + BaseSyncDTO.Columns.COLUMN_REMOTE_SYNC_DATE + " IS NULL) OR (:toBeSync = 0))")
List<VerificaGiacenzeWithRowsWrapper> selectAll(boolean toBeSync);
@Transaction
@Query("SELECT * FROM " + VerificaGiacenzeEntity.TABLE_NAME +
" WHERE ((:toBeSync = 1 AND " + BaseSyncDTO.Columns.COLUMN_REMOTE_SYNC_DATE + " IS NULL) OR (:toBeSync = 0))" +
" ORDER BY " + VerificaGiacenzeEntity.Columns.DATA + " DESC")
Flowable<List<VerificaGiacenzeWithRowsWrapper>> selectAllFlowable(boolean toBeSync);
@Transaction
@Query("SELECT * FROM " + VerificaGiacenzeEntity.TABLE_NAME +
" WHERE ((:toBeSync = 1 AND " + BaseSyncDTO.Columns.COLUMN_REMOTE_SYNC_DATE + " IS NULL) OR (:toBeSync = 0))" +
" ORDER BY " + VerificaGiacenzeEntity.Columns.DATA + " DESC" +
" LIMIT 1")
VerificaGiacenzeWithRowsWrapper selectLast(boolean toBeSync);
@Query("SELECT COALESCE(strftime('%s', 'now') - MAX(" + VerificaGiacenzeRowEntity.Columns.CREATED_AT + ") < :maxMinutes * 60, 0) as any_verifica_to_be_recovered" +
" FROM " + VerificaGiacenzeRowEntity.TABLE_NAME +
" WHERE (" + BaseSyncDTO.Columns.COLUMN_REMOTE_SYNC_DATE + " IS NULL)")
boolean isAnotherVerificaGiacenzeInProgress(int maxMinutes);
}

View File

@@ -0,0 +1,25 @@
package it.integry.integrywmsnative.core.data_store.db.dao;
import androidx.room.Dao;
import androidx.room.Query;
import java.util.List;
import io.reactivex.rxjava3.core.Flowable;
import it.integry.integrywmsnative.core.data_store.db.entity.BaseSyncDTO;
import it.integry.integrywmsnative.core.data_store.db.entity.VerificaGiacenzeRowEntity;
import it.integry.integrywmsnative.core.data_store.db.interfaces.EntityDaoInterface;
@Dao
public interface VerificaGiacenzeRowDao extends EntityDaoInterface<VerificaGiacenzeRowEntity> {
@Query("SELECT * FROM " + VerificaGiacenzeRowEntity.TABLE_NAME +
" WHERE ((:toBeSync = 1 AND " + BaseSyncDTO.Columns.COLUMN_REMOTE_SYNC_DATE + " IS NULL) OR (:toBeSync = 0))")
List<VerificaGiacenzeRowEntity> selectAll(boolean toBeSync);
@Query("SELECT * FROM " + VerificaGiacenzeRowEntity.TABLE_NAME +
" WHERE ((:toBeSync = 1 AND " + BaseSyncDTO.Columns.COLUMN_REMOTE_SYNC_DATE + " IS NULL) OR (:toBeSync = 0))")
Flowable<List<VerificaGiacenzeRowEntity>> selectAllFlowable(boolean toBeSync);
}

View File

@@ -12,8 +12,8 @@ import java.util.List;
import it.integry.integrywmsnative.core.data_store.db.interfaces.EntityModelInterface;
@Entity(tableName = InventarioRoomDTO.TABLE_NAME)
public class InventarioRoomDTO extends BaseSyncDTO implements EntityModelInterface {
@Entity(tableName = InventarioEntity.TABLE_NAME)
public class InventarioEntity extends BaseSyncDTO implements EntityModelInterface {
public static final String TABLE_NAME = "inventari";

View File

@@ -4,7 +4,6 @@ import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.ForeignKey;
import androidx.room.PrimaryKey;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@@ -12,10 +11,11 @@ import java.time.LocalDateTime;
import it.integry.integrywmsnative.core.data_store.db.interfaces.EntityModelInterface;
@Entity(
inheritSuperIndices = true,
tableName = InventarioRowRoomDTO.TABLE_NAME,
foreignKeys = {
@ForeignKey(
entity = InventarioRoomDTO.class,
entity = InventarioEntity.class,
parentColumns = {BaseSyncDTO.Columns.ID},
childColumns = {InventarioRowRoomDTO.Columns.PARENT_ID},
onDelete = ForeignKey.CASCADE
@@ -40,13 +40,6 @@ public class InventarioRowRoomDTO extends BaseSyncDTO implements EntityModelInte
public static final String ZONA = "zona";
}
/**
* The unique ID
*/
@PrimaryKey(autoGenerate = true)
@ColumnInfo(index = true, name = BaseSyncDTO.Columns.ID)
private Long id;
@ColumnInfo(index = true, name = Columns.PARENT_ID)
private Long parentId;

View File

@@ -0,0 +1,78 @@
package it.integry.integrywmsnative.core.data_store.db.entity;
import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.Ignore;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import it.integry.integrywmsnative.core.data_store.db.interfaces.EntityModelInterface;
@Entity(
inheritSuperIndices = true,
tableName = VerificaGiacenzeEntity.TABLE_NAME
)
public class VerificaGiacenzeEntity extends BaseSyncDTO implements EntityModelInterface {
public static final String TABLE_NAME = "verifica_giacenze";
public static class Columns {
public static final String COD_MDEP = "cod_mdep";
public static final String DATA = "data";
}
@NonNull
@ColumnInfo(name = VerificaGiacenzeEntity.Columns.COD_MDEP)
private String codMdep;
@ColumnInfo(name = VerificaGiacenzeEntity.Columns.DATA)
private LocalDateTime data;
@Ignore
private List<VerificaGiacenzeRowEntity> verificaGiacenzeRowList;
@NonNull
public String getCodMdep() {
return codMdep;
}
public void setCodMdep(@NonNull String codMdep) {
this.codMdep = codMdep;
}
public LocalDateTime getData() {
return data;
}
public void setData(LocalDateTime data) {
this.data = data;
}
public List<VerificaGiacenzeRowEntity> getVerificaGiacenzeRowList() {
return verificaGiacenzeRowList;
}
public void setVerificaGiacenzeRowList(List<VerificaGiacenzeRowEntity> verificaGiacenzeRowList) {
this.verificaGiacenzeRowList = verificaGiacenzeRowList;
}
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
VerificaGiacenzeEntity that = (VerificaGiacenzeEntity) o;
return getId().equals(that.getId()) && getCodMdep().equals(that.getCodMdep()) && Objects.equals(getData(), that.getData()) && Objects.equals(getVerificaGiacenzeRowList(), that.getVerificaGiacenzeRowList());
}
@Override
public int hashCode() {
int result = getId().hashCode();
result = 31 * result + getCodMdep().hashCode();
result = 31 * result + Objects.hashCode(getData());
result = 31 * result + Objects.hashCode(getVerificaGiacenzeRowList());
return result;
}
}

View File

@@ -0,0 +1,211 @@
package it.integry.integrywmsnative.core.data_store.db.entity;
import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.ForeignKey;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Objects;
import it.integry.integrywmsnative.core.data_store.db.interfaces.EntityModelInterface;
@Entity(
inheritSuperIndices = true,
tableName = VerificaGiacenzeRowEntity.TABLE_NAME,
foreignKeys = {
@ForeignKey(
entity = VerificaGiacenzeEntity.class,
parentColumns = {BaseSyncDTO.Columns.ID},
childColumns = {VerificaGiacenzeRowEntity.Columns.PARENT_ID},
onDelete = ForeignKey.CASCADE
)
}
)
public class VerificaGiacenzeRowEntity extends BaseSyncDTO implements EntityModelInterface, Cloneable {
public static final String TABLE_NAME = "verifica_giacenze_rows";
public static class Columns {
public static final String PARENT_ID = "parent_id";
public static final String CREATED_AT = "created_at";
public static final String COD_MART = "cod_mart";
public static final String PARTITA_MAG = "partita_mag";
public static final String DESCRIZIONE = "descrizione";
public static final String QTA_IN_GIACENZA = "qta_in_giacenza";
public static final String QTA = "qta";
public static final String NUM_CNF = "num_cnf";
public static final String QTA_CNF = "qta_cnf";
public static final String SCAN_COD_BARRE = "scan_cod_barre";
}
@ColumnInfo(index = true, name = Columns.PARENT_ID)
private Long parentId;
@ColumnInfo(name = Columns.CREATED_AT, defaultValue = "CURRENT_TIMESTAMP")
private LocalDateTime createdAt = LocalDateTime.now();
@ColumnInfo(name = Columns.COD_MART)
private String codMart;
@ColumnInfo(name = Columns.PARTITA_MAG)
private String partitaMag;
@ColumnInfo(name = Columns.DESCRIZIONE)
private String descrizione;
@NonNull
@ColumnInfo(name = Columns.QTA_IN_GIACENZA, defaultValue = "0")
private BigDecimal qtaInGiacenza;
@NonNull
@ColumnInfo(name = Columns.QTA, defaultValue = "0")
private BigDecimal qta;
@NonNull
@ColumnInfo(name = Columns.NUM_CNF, defaultValue = "0")
private BigDecimal numConf;
@NonNull
@ColumnInfo(name = Columns.QTA_CNF, defaultValue = "0")
private BigDecimal qtaConf;
@ColumnInfo(name = Columns.SCAN_COD_BARRE)
private String scanCodBarre;
public Long getParentId() {
return parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public String getCodMart() {
return codMart;
}
public void setCodMart(String codMart) {
this.codMart = codMart;
}
public String getPartitaMag() {
return partitaMag;
}
public void setPartitaMag(String partitaMag) {
this.partitaMag = partitaMag;
}
public String getDescrizione() {
return descrizione;
}
public void setDescrizione(String descrizione) {
this.descrizione = descrizione;
}
@NonNull
public BigDecimal getQtaInGiacenza() {
return qtaInGiacenza;
}
public void setQtaInGiacenza(@NonNull BigDecimal qtaInGiacenza) {
this.qtaInGiacenza = qtaInGiacenza;
}
@NonNull
public BigDecimal getQta() {
return qta;
}
public void setQta(@NonNull BigDecimal qta) {
this.qta = qta;
}
@NonNull
public BigDecimal getNumConf() {
return numConf;
}
public void setNumConf(@NonNull BigDecimal numConf) {
this.numConf = numConf;
}
@NonNull
public BigDecimal getQtaConf() {
return qtaConf;
}
public void setQtaConf(@NonNull BigDecimal qtaConf) {
this.qtaConf = qtaConf;
}
public String getScanCodBarre() {
return scanCodBarre;
}
public void setScanCodBarre(String scanCodBarre) {
this.scanCodBarre = scanCodBarre;
}
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
VerificaGiacenzeRowEntity that = (VerificaGiacenzeRowEntity) o;
return getId().equals(that.getId()) && getParentId().equals(that.getParentId()) && getCodMart().equals(that.getCodMart()) && Objects.equals(getPartitaMag(), that.getPartitaMag()) && getQta().equals(that.getQta()) && getNumConf().equals(that.getNumConf()) && getQtaConf().equals(that.getQtaConf()) && Objects.equals(getScanCodBarre(), that.getScanCodBarre());
}
@Override
public int hashCode() {
int result = getId().hashCode();
result = 31 * result + getParentId().hashCode();
result = 31 * result + getCodMart().hashCode();
result = 31 * result + Objects.hashCode(getPartitaMag());
result = 31 * result + getQta().hashCode();
result = 31 * result + getNumConf().hashCode();
result = 31 * result + getQtaConf().hashCode();
result = 31 * result + Objects.hashCode(getScanCodBarre());
return result;
}
@NonNull
@Override
public VerificaGiacenzeRowEntity clone() throws CloneNotSupportedException {
try {
VerificaGiacenzeRowEntity clone = (VerificaGiacenzeRowEntity) super.clone();
// Clona ID
clone.setId(getId() != null ? new Long(getId()) : null);
clone.setParentId(getParentId() != null ? new Long(getParentId()) : null);
// Clona le stringhe
clone.setCodMart(getCodMart() != null ? new String(getCodMart()) : null);
clone.setPartitaMag(getPartitaMag() != null ? new String(getPartitaMag()) : null);
clone.setDescrizione(getDescrizione() != null ? new String(getDescrizione()) : null);
clone.setScanCodBarre(getScanCodBarre() != null ? new String(getScanCodBarre()) : null);
// Clona i BigDecimal
clone.setQta(getQta() != null ? new BigDecimal(getQta().toString()) : null);
clone.setNumConf(getNumConf() != null ? new BigDecimal(getNumConf().toString()) : null);
clone.setQtaConf(getQtaConf() != null ? new BigDecimal(getQtaConf().toString()) : null);
return clone;
} catch (CloneNotSupportedException e) {
throw new AssertionError(); // Can't happen
}
}
}

View File

@@ -15,7 +15,7 @@ import java.util.concurrent.ExecutorService;
import javax.inject.Inject;
import io.reactivex.rxjava3.schedulers.Schedulers;
import it.integry.integrywmsnative.core.data_store.db.entity.InventarioRoomDTO;
import it.integry.integrywmsnative.core.data_store.db.entity.InventarioEntity;
import it.integry.integrywmsnative.core.data_store.db.respository_new.data_source.InventarioLocalDataSource;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.mapper.InventarioMapper;
@@ -24,13 +24,13 @@ import it.integry.integrywmsnative.core.rest.consumers.InventarioRESTConsumer;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityLiveData;
public class InventarioRepository extends _BaseRepository<MtbInvent, InventarioRoomDTO, InventarioMapper, InventarioLocalDataSource, InventarioRESTConsumer> {
public class InventarioRepository extends _BaseRepository<MtbInvent, InventarioEntity, InventarioMapper, InventarioLocalDataSource, InventarioRESTConsumer> {
private final ExecutorService executorService;
private final Handler handler;
private final MutableLiveData<List<InventarioRoomDTO>> internalLiveData = new MutableLiveData<>();
private final MutableLiveData<List<InventarioEntity>> internalLiveData = new MutableLiveData<>();
@Inject
public InventarioRepository(InventarioLocalDataSource localDataSource,
@@ -44,7 +44,7 @@ public class InventarioRepository extends _BaseRepository<MtbInvent, InventarioR
}
public LiveData<List<InventarioRoomDTO>> retrieve(Runnable onComplete, RunnableArgs<Exception> onError) {
public LiveData<List<InventarioEntity>> retrieve(Runnable onComplete, RunnableArgs<Exception> onError) {
localDataSource.makeSynchronousRetrieveAllLive(false)
.observeOn(Schedulers.io())
.subscribe(internalLiveData::postValue);
@@ -84,13 +84,13 @@ public class InventarioRepository extends _BaseRepository<MtbInvent, InventarioR
});
}
public void insert(InventarioRoomDTO inventarioDTO, Runnable onComplete, RunnableArgs<Exception> onError) {
public void insert(InventarioEntity inventarioDTO, Runnable onComplete, RunnableArgs<Exception> onError) {
localDataSource.makeInsertRequest(inventarioDTO, localResult -> {
if (onComplete != null) handler.post(onComplete);
}, onError);
}
public void export(InventarioRoomDTO inventarioDTO, Runnable onComplete, RunnableArgs<Exception> onError) {
public void export(InventarioEntity inventarioDTO, Runnable onComplete, RunnableArgs<Exception> onError) {
remoteDataSource.makeInsertRequest(dataMapper.mapRoomToRest(inventarioDTO), () -> {
inventarioDTO.setRemoteSyncDate(new Date());
@@ -100,7 +100,7 @@ public class InventarioRepository extends _BaseRepository<MtbInvent, InventarioR
}, onError);
}
public void delete(InventarioRoomDTO inventarioDTO, Runnable onComplete, RunnableArgs<Exception> onError) {
public void delete(InventarioEntity inventarioDTO, Runnable onComplete, RunnableArgs<Exception> onError) {
localDataSource.makeDeleteRequest(inventarioDTO, onComplete, onError);
}

View File

@@ -0,0 +1,59 @@
package it.integry.integrywmsnative.core.data_store.db.respository_new;
import android.os.Handler;
import java.util.List;
import java.util.concurrent.ExecutorService;
import it.integry.integrywmsnative.core.data_store.db.entity.VerificaGiacenzeEntity;
import it.integry.integrywmsnative.core.data_store.db.respository_new.data_source.VerificaGiacenzeLocalDataSource;
import it.integry.integrywmsnative.core.mapper.VerificaGiacenzeMapper;
import it.integry.integrywmsnative.core.rest.consumers.GiacenzaPvRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.pv.VerificaGiacenzeDTO;
public class VerificaGiacenzeRepository extends _BaseRepository<VerificaGiacenzeDTO, VerificaGiacenzeEntity, VerificaGiacenzeMapper, VerificaGiacenzeLocalDataSource, GiacenzaPvRESTConsumer> {
private final ExecutorService executorService;
private final Handler handler;
public VerificaGiacenzeRepository(VerificaGiacenzeLocalDataSource localDataSource,
GiacenzaPvRESTConsumer remoteDataSource,
VerificaGiacenzeMapper dataMapper,
Handler handler,
ExecutorService executorService) {
super(dataMapper, localDataSource, remoteDataSource);
this.handler = handler;
this.executorService = executorService;
}
public List<VerificaGiacenzeEntity> retrieve() {
return localDataSource.makeSynchronousRetrieveAllRequest(false);
}
public VerificaGiacenzeEntity retrieveLast() {
return localDataSource.makeSynchronousRetrieveLastRequest(false);
}
public boolean isAnotherVerificaGiacenzeInProgress(int maxMinutes) {
return localDataSource.isAnotherVerificaGiacenzeInProgress(maxMinutes);
}
public void clearPreviousSessions() {
var entities = retrieve();
for (var entity : entities) {
localDataSource.makeSynchronousDeleteRequest(entity);
}
}
public void insert(VerificaGiacenzeEntity entity) {
localDataSource.makeSynchronousInsertRequest(entity);
}
public void delete(VerificaGiacenzeEntity entity) {
localDataSource.makeSynchronousDeleteRequest(entity);
}
}

View File

@@ -0,0 +1,55 @@
package it.integry.integrywmsnative.core.data_store.db.respository_new;
import android.os.Handler;
import java.util.concurrent.ExecutorService;
import it.integry.integrywmsnative.core.data_store.db.entity.VerificaGiacenzeRowEntity;
import it.integry.integrywmsnative.core.data_store.db.respository_new.data_source.VerificaGiacenzeRowLocalDataSource;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.mapper.VerificaGiacenzeRowMapper;
import it.integry.integrywmsnative.core.rest.consumers.GiacenzaPvRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.pv.VerificaGiacenzeRowDTO;
public class VerificaGiacenzeRowRepository extends _BaseRepository<VerificaGiacenzeRowDTO, VerificaGiacenzeRowEntity, VerificaGiacenzeRowMapper, VerificaGiacenzeRowLocalDataSource, GiacenzaPvRESTConsumer> {
private final ExecutorService executorService;
private final Handler handler;
public VerificaGiacenzeRowRepository(VerificaGiacenzeRowLocalDataSource localDataSource,
GiacenzaPvRESTConsumer remoteDataSource,
VerificaGiacenzeRowMapper dataMapper,
Handler handler,
ExecutorService executorService) {
super(dataMapper, localDataSource, remoteDataSource);
this.handler = handler;
this.executorService = executorService;
}
public void insertSynchronized(VerificaGiacenzeRowEntity entity) {
localDataSource.makeSynchronousInsertRequest(entity);
}
public void insert(VerificaGiacenzeRowEntity entity, RunnableArgs<VerificaGiacenzeRowEntity> onComplete, RunnableArgs<Exception> onFailed) {
localDataSource.makeInsertRequest(entity, onComplete, onFailed);
}
public void updateSynchronized(VerificaGiacenzeRowEntity entity) {
localDataSource.makeSynchronousUpdateRequest(entity);
}
public void update(VerificaGiacenzeRowEntity entity, RunnableArgs<VerificaGiacenzeRowEntity> onComplete, RunnableArgs<Exception> onFailed) {
localDataSource.makeUpdateRequest(entity, onComplete, onFailed);
}
public void deleteSynchronized(VerificaGiacenzeRowEntity entity) {
localDataSource.makeSynchronousDeleteRequest(entity);
}
public void delete(VerificaGiacenzeRowEntity entity, Runnable onComplete, RunnableArgs<Exception> onFailed) {
localDataSource.makeDeleteRequest(entity, onComplete, onFailed);
}
}

View File

@@ -8,24 +8,24 @@ import javax.inject.Singleton;
import io.reactivex.rxjava3.core.Flowable;
import it.integry.integrywmsnative.core.data_store.db.dao.InventarioDao;
import it.integry.integrywmsnative.core.data_store.db.entity.InventarioRoomDTO;
import it.integry.integrywmsnative.core.data_store.db.entity.InventarioEntity;
@Singleton
public class InventarioLocalDataSource extends _BaseRoomDataSource<InventarioRoomDTO, InventarioDao> {
public class InventarioLocalDataSource extends _BaseRoomDataSource<InventarioEntity, InventarioDao> {
@Inject
public InventarioLocalDataSource(ExecutorService executorService, InventarioDao entityDao) {
super(executorService, entityDao, InventarioRoomDTO.TABLE_NAME);
super(executorService, entityDao, InventarioEntity.TABLE_NAME);
}
@Override
public List<InventarioRoomDTO> makeSynchronousRetrieveAllRequest(boolean onlyToBeSync) {
public List<InventarioEntity> makeSynchronousRetrieveAllRequest(boolean onlyToBeSync) {
return entityDao
.selectAll(onlyToBeSync);
}
@Override
public Flowable<List<InventarioRoomDTO>> makeSynchronousRetrieveAllLive(boolean onlyToBeSync) {
public Flowable<List<InventarioEntity>> makeSynchronousRetrieveAllLive(boolean onlyToBeSync) {
return entityDao
.selectAllFlowable(onlyToBeSync);
}

View File

@@ -0,0 +1,63 @@
package it.integry.integrywmsnative.core.data_store.db.respository_new.data_source;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.reactivex.rxjava3.core.Flowable;
import it.integry.integrywmsnative.core.data_store.db.dao.VerificaGiacenzeDao;
import it.integry.integrywmsnative.core.data_store.db.entity.VerificaGiacenzeEntity;
import it.integry.integrywmsnative.core.data_store.db.wrappers.VerificaGiacenzeWithRowsWrapper;
@Singleton
public class VerificaGiacenzeLocalDataSource extends _BaseRoomDataSource<VerificaGiacenzeEntity, VerificaGiacenzeDao> {
@Inject
public VerificaGiacenzeLocalDataSource(ExecutorService executorService, VerificaGiacenzeDao entityDao) {
super(executorService, entityDao, VerificaGiacenzeEntity.TABLE_NAME);
}
@Override
public List<VerificaGiacenzeEntity> makeSynchronousRetrieveAllRequest(boolean onlyToBeSync) {
var data = entityDao
.selectAll(onlyToBeSync);
return data.stream()
.map(x -> {
x.verificaGiacenze.setVerificaGiacenzeRowList(x.verificaGiacenzeRowList);
return x.verificaGiacenze;
})
.collect(Collectors.toList());
}
@Override
public Flowable<List<VerificaGiacenzeEntity>> makeSynchronousRetrieveAllLive(boolean onlyToBeSync) {
Flowable<List<VerificaGiacenzeWithRowsWrapper>> listFlowable = entityDao
.selectAllFlowable(onlyToBeSync);
return listFlowable.map(x ->
x.stream()
.map(y -> {
y.verificaGiacenze.setVerificaGiacenzeRowList(y.verificaGiacenzeRowList);
return y.verificaGiacenze;
})
.collect(Collectors.toList())
);
}
public VerificaGiacenzeEntity makeSynchronousRetrieveLastRequest(boolean onlyToBeSync) {
var lastEntity = entityDao
.selectLast(onlyToBeSync);
lastEntity.verificaGiacenze.setVerificaGiacenzeRowList(lastEntity.verificaGiacenzeRowList);
return lastEntity.verificaGiacenze;
}
public boolean isAnotherVerificaGiacenzeInProgress(int maxMinutes) {
return entityDao.isAnotherVerificaGiacenzeInProgress(maxMinutes);
}
}

View File

@@ -0,0 +1,34 @@
package it.integry.integrywmsnative.core.data_store.db.respository_new.data_source;
import java.util.List;
import java.util.concurrent.ExecutorService;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.reactivex.rxjava3.core.Flowable;
import it.integry.integrywmsnative.core.data_store.db.dao.VerificaGiacenzeRowDao;
import it.integry.integrywmsnative.core.data_store.db.entity.VerificaGiacenzeRowEntity;
@Singleton
public class VerificaGiacenzeRowLocalDataSource extends _BaseRoomDataSource<VerificaGiacenzeRowEntity, VerificaGiacenzeRowDao> {
@Inject
public VerificaGiacenzeRowLocalDataSource(ExecutorService executorService, VerificaGiacenzeRowDao entityDao) {
super(executorService, entityDao, VerificaGiacenzeRowEntity.TABLE_NAME);
}
@Override
public List<VerificaGiacenzeRowEntity> makeSynchronousRetrieveAllRequest(boolean onlyToBeSync) {
var data = entityDao
.selectAll(onlyToBeSync);
return data;
}
@Override
public Flowable<List<VerificaGiacenzeRowEntity>> makeSynchronousRetrieveAllLive(boolean onlyToBeSync) {
return entityDao
.selectAllFlowable(onlyToBeSync);
}
}

View File

@@ -0,0 +1,24 @@
package it.integry.integrywmsnative.core.data_store.db.wrappers;
import androidx.room.DatabaseView;
import androidx.room.Embedded;
import androidx.room.Relation;
import java.util.List;
import it.integry.integrywmsnative.core.data_store.db.entity.BaseSyncDTO;
import it.integry.integrywmsnative.core.data_store.db.entity.VerificaGiacenzeEntity;
import it.integry.integrywmsnative.core.data_store.db.entity.VerificaGiacenzeRowEntity;
@DatabaseView
public class VerificaGiacenzeWithRowsWrapper {
@Embedded
public VerificaGiacenzeEntity verificaGiacenze;
@Relation(
parentColumn = BaseSyncDTO.Columns.ID,
entityColumn = VerificaGiacenzeRowEntity.Columns.PARENT_ID
)
public List<VerificaGiacenzeRowEntity> verificaGiacenzeRowList;
}

View File

@@ -4,9 +4,6 @@ import androidx.databinding.BaseObservable;
import java.math.BigDecimal;
import it.integry.integrywmsnative.core.CommonConst;
import it.integry.integrywmsnative.core.utility.UtilityNumber;
public class BindableFloat extends BaseObservable {
private Float value;
@@ -15,10 +12,6 @@ public class BindableFloat extends BaseObservable {
}
public BigDecimal getBigDecimal() {
int numberOfDigits = UtilityNumber.countNumberOfDecimalDigits(get());
if(numberOfDigits > CommonConst.Config.NUMBER_OF_DECIMAL_DIGITS) numberOfDigits = CommonConst.Config.NUMBER_OF_DECIMAL_DIGITS;
return BigDecimal.valueOf(get());
}

View File

@@ -11,6 +11,7 @@ import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import androidx.annotation.ColorRes;
import androidx.appcompat.widget.AppCompatCheckBox;
@@ -24,6 +25,10 @@ import androidx.databinding.BindingAdapter;
import androidx.databinding.BindingConversion;
import androidx.databinding.Observable;
import androidx.databinding.ObservableField;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewTreeLifecycleOwner;
import com.google.android.material.datepicker.MaterialDatePicker;
import com.google.android.material.textfield.TextInputEditText;
@@ -33,6 +38,8 @@ import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
@@ -41,6 +48,7 @@ import it.integry.integrywmsnative.MainApplication;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.expansion.BaseDialogFragment;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.utility.LocaleDecimalKeyListener;
import it.integry.integrywmsnative.core.utility.UtilityBigDecimal;
import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.core.utility.UtilityNumber;
@@ -257,7 +265,7 @@ public class Converters {
BigDecimal value = null;
if (!UtilityString.isNullOrEmpty(s.toString()))
value = new BigDecimal(s.toString());
value = UtilityNumber.parseBigDecimal(s.toString(), Locale.getDefault());
observableBigDecimal.set(value);
}
@@ -267,7 +275,7 @@ public class Converters {
}
BigDecimal newValue = observableBigDecimal.get();
BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? new BigDecimal(view.getText().toString()) : null;
BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? UtilityNumber.parseBigDecimal(view.getText().toString(), Locale.getDefault()) : null;
if (!UtilityBigDecimal.equalsTo(viewValue, newValue)) {
view.setText(UtilityNumber.decimalToString(newValue));
@@ -288,7 +296,7 @@ public class Converters {
String newValueString = s.toString().trim();
if (!UtilityString.isNullOrEmpty(newValueString))
value = new BigDecimal(newValueString);
value = UtilityNumber.parseBigDecimal(newValueString, Locale.getDefault());
observableBigDecimal.set(value);
}
@@ -297,7 +305,7 @@ public class Converters {
view.addTextChangedListener(watcher);
}
BigDecimal newValue = observableBigDecimal.get();
BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? new BigDecimal(view.getText().toString()) : null;
BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? UtilityNumber.parseBigDecimal(view.getText().toString(), Locale.getDefault()) : null;
if (!UtilityBigDecimal.equalsTo(viewValue, newValue)) {
view.setText(UtilityNumber.decimalToString(newValue));
@@ -318,7 +326,7 @@ public class Converters {
String newValueString = s.toString().trim();
if (!UtilityString.isNullOrEmpty(newValueString))
value = new BigDecimal(newValueString);
value = UtilityNumber.parseBigDecimal(newValueString, Locale.getDefault());
observableBigDecimal.set(value);
}
@@ -327,7 +335,7 @@ public class Converters {
view.addTextChangedListener(watcher);
}
BigDecimal newValue = observableBigDecimal.get();
BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? new BigDecimal(view.getText().toString()) : null;
BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? UtilityNumber.parseBigDecimal(view.getText().toString(), Locale.getDefault()) : null;
if (!UtilityBigDecimal.equalsTo(viewValue, newValue)) {
view.setText(UtilityNumber.decimalToString(newValue));
@@ -346,7 +354,8 @@ public class Converters {
public void onTextChanged(CharSequence s, int start, int before, int count) {
BigDecimal value = null;
if (!UtilityString.isNullOrEmpty(s.toString()))
value = new BigDecimal(s.toString());
value = UtilityNumber.parseBigDecimal(s.toString(), Locale.getDefault());
bindableBigDecimal.set(value);
}
};
@@ -354,7 +363,7 @@ public class Converters {
view.addTextChangedListener(watcher);
}
BigDecimal newValue = bindableBigDecimal.get();
BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? new BigDecimal(view.getText().toString()) : null;
BigDecimal viewValue = !view.getText().toString().trim().isEmpty() ? UtilityNumber.parseBigDecimal(view.getText().toString(), Locale.getDefault()) : null;
if (!UtilityBigDecimal.equalsTo(viewValue, newValue)) {
view.setText(UtilityNumber.decimalToString(newValue));
@@ -820,11 +829,11 @@ public class Converters {
@BindingAdapter("visibilityWhenNotNull")
public static void bindViewVisibilityWhenNotNull(View view, ObservableField<?> bindableObject) {
public static void bindViewVisibilityObservableFieldWhenNotNull(View view, ObservableField<?> bindableObject) {
if(bindableObject == null) return;
if (view.getTag(R.id.bound_observable) != bindableObject) {
view.setTag(R.id.bound_observable, bindableObject);
if (view.getTag(R.id.bound_observable_visibility) != bindableObject) {
view.setTag(R.id.bound_observable_visibility, bindableObject);
}
bindableObject.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
@@ -838,6 +847,36 @@ public class Converters {
}
@BindingAdapter("visibilityWhenNotNull")
public static void bindViewVisibilityLiveDataWhenNotNull(View view, LiveData<?> liveData) {
// Se il LiveData è null, nascondi la view e esci
if (liveData == null) {
view.setVisibility(View.GONE);
return;
}
// Ottieni il LifecycleOwner dalla view
LifecycleOwner lifecycleOwner = ViewTreeLifecycleOwner.get(view);
if (lifecycleOwner == null) return;
// Rimuovi eventuali observer precedenti
Observer<Object> oldObserver = (Observer<Object>) view.getTag(R.id.bound_observable_visibility);
if (oldObserver != null) {
liveData.removeObserver(oldObserver);
}
// Crea e registra il nuovo observer
Observer<Object> newObserver = value ->
view.setVisibility(value == null ? View.GONE : View.VISIBLE);
liveData.observe(lifecycleOwner, newObserver);
view.setTag(R.id.bound_observable_visibility, newObserver);
// Imposta lo stato iniziale
view.setVisibility(liveData.getValue() == null ? View.GONE : View.VISIBLE);
}
@BindingAdapter("visibilityWhenNotNull")
public static void bindViewVisibilityWhenNotNull(View view, Object genericObject) {
view.setVisibility(genericObject == null ? View.GONE : View.VISIBLE);
@@ -845,7 +884,7 @@ public class Converters {
@BindingAdapter("visibilityWhenNull")
public static void bindViewVisibilityWhenNull(View view, ObservableField<?> bindableObject) {
public static void bindViewVisibilityObservableFieldWhenNull(View view, ObservableField<?> bindableObject) {
if (view.getTag(R.id.bound_observable_visibility) != bindableObject) {
view.setTag(R.id.bound_observable_visibility, bindableObject);
@@ -864,6 +903,36 @@ public class Converters {
}
@BindingAdapter("visibilityWhenNull")
public static void bindViewVisibilityLiveDataWhenNull(View view, LiveData<?> liveData) {
// Se il LiveData è null, nascondi la view e esci
if (liveData == null) {
view.setVisibility(View.VISIBLE);
return;
}
// Ottieni il LifecycleOwner dalla view
LifecycleOwner lifecycleOwner = ViewTreeLifecycleOwner.get(view);
if (lifecycleOwner == null) return;
// Rimuovi eventuali observer precedenti
Observer<Object> oldObserver = (Observer<Object>) view.getTag(R.id.bound_observable_visibility);
if (oldObserver != null) {
liveData.removeObserver(oldObserver);
}
// Crea e registra il nuovo observer
Observer<Object> newObserver = value ->
view.setVisibility(value == null ? View.VISIBLE : View.GONE);
liveData.observe(lifecycleOwner, newObserver);
view.setTag(R.id.bound_observable_visibility, newObserver);
// Imposta lo stato iniziale
view.setVisibility(liveData.getValue() == null ? View.VISIBLE : View.GONE);
}
@BindingAdapter({"reverse_visibility"})
public static void bindViewReverseVisibility(View view, final BindableBoolean bindableBoolean) {
if (view.getTag(R.id.bound_reverse_visibility) != bindableBoolean) {
@@ -910,4 +979,64 @@ public class Converters {
view.setLayoutParams(layoutParams);
}
}
/**
* BindingAdapter per bindare una LocalDate diretta su una TextView con un formato specificato.
* Esempio di utilizzo in XML:
* app:localDateText="@{myLocalDate}" app:dateFormat="@{@string/my_date_format}"
*/
@BindingAdapter(value = {"localDateText", "dateFormat"}, requireAll = false)
public static void bindLocalDateText(TextView view, LocalDate date, String dateFormat) {
if (date == null) {
view.setText("");
return;
}
String pattern = dateFormat != null ? dateFormat : "dd/MM/yyyy";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
view.setText(date.format(formatter));
}
@BindingAdapter(value = {"localDateTimeText", "dateFormat"}, requireAll = false)
public static void bindLocalDateText(TextView view, LocalDateTime date, String dateFormat) {
if (date == null) {
view.setText("");
return;
}
String pattern = dateFormat != null ? dateFormat : "dd/MM/yyyy hh:mm";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
view.setText(date.format(formatter));
}
/**
* BindingAdapter per bindare una ObservableField<LocalDate> su una TextView con un formato specificato.
* Esempio di utilizzo in XML:
* app:localDateObservableText="@{myObservableLocalDate}" app:dateFormat="@{@string/my_date_format}"
*/
@BindingAdapter(value = {"localDateObservableText", "dateFormat"}, requireAll = false)
public static void bindObservableLocalDateText(TextView view, ObservableField<LocalDate> observableDate, String dateFormat) {
if (observableDate == null) {
view.setText("");
return;
}
LocalDate date = observableDate.get();
if (date == null) {
view.setText("");
return;
}
String pattern = dateFormat != null ? dateFormat : "dd/MM/yyyy";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
view.setText(date.format(formatter));
}
/**
* BindingAdapter che applica automaticamente il KeyListener localizzato
* ai campi con inputType numberDecimal, permettendo l'uso della virgola
* come separatore decimale in base al locale del dispositivo.
*/
@BindingAdapter("useLocaleDecimalInput")
public static void setLocaleDecimalInput(EditText view, boolean useLocaleInput) {
if (useLocaleInput) {
view.setKeyListener(LocaleDecimalKeyListener.getInstance());
}
}
}

View File

@@ -66,9 +66,6 @@ public class Ean128Service {
switch (aiModel.AI) {
case SSCC -> {
if (aiValue.length() > 0 && (aiValue.charAt(0) == '0' || aiValue.charAt(0) == '9')) {
aiValue = new StringBuilder(aiValue.substring(1));
}
model.Sscc = aiValue.toString();
}
case GTIN -> {

View File

@@ -0,0 +1,8 @@
package it.integry.integrywmsnative.core.exception;
public class InvalidCodMdepBarcodeException extends RuntimeException {
public InvalidCodMdepBarcodeException(String message) {
super("Il deposito scansionato non è valido: " + message);
}
}

View File

@@ -4,7 +4,13 @@ import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.utility.UtilityResources;
public final class InvalidCodMdepException extends Exception {
public InvalidCodMdepException() {
super(UtilityResources.getString(R.string.invalid_codmdep));
super(UtilityResources.getString(R.string.invalid_codmdep_error_message));
}
public InvalidCodMdepException(String codMdep) {
super(UtilityResources.getString(R.string.invalid_codmdep_error_message) + "(" + codMdep + ")");
}
}

View File

@@ -34,7 +34,6 @@ public class BaseActivity extends AppCompatActivity {
}
public void onLoadingStarted() {
BarcodeManager.disable();
this.openProgress();
}
@@ -52,14 +51,14 @@ public class BaseActivity extends AppCompatActivity {
private void openProgress() {
BarcodeManager.disable();
BarcodeManager.disableLastCallback();
// executorService.execute(() -> {
this.mCurrentProgress.show(getSupportFragmentManager());
// });
}
private void closeProgress() {
BarcodeManager.enable();
BarcodeManager.enableLastCallback();
// executorService.execute(() -> {
mCurrentProgress.dismiss();
// });
@@ -67,7 +66,7 @@ public class BaseActivity extends AppCompatActivity {
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (BarcodeManager.isEnabled() && BarcodeManager.isKeyboardEmulator()) {
if (BarcodeManager.isLastCallbackEnabled() && BarcodeManager.isKeyboardEmulator()) {
if (event.getAction() == KeyEvent.ACTION_DOWN || event.getAction() == KeyEvent.ACTION_MULTIPLE && !isControlKey(event)) {
return BarcodeManager.onKeyDown(event.getKeyCode(), event);
}

View File

@@ -14,7 +14,7 @@ public class BaseDialog extends Dialog {
public BaseDialog(@NonNull Context context) {
super(context);
if (BarcodeManager.isEnabled() && BarcodeManager.isKeyboardEmulator()) {
if (BarcodeManager.isLastCallbackEnabled() && BarcodeManager.isKeyboardEmulator()) {
setOnKeyListener((dialog, keyCode, event) -> {
if (mBarcodeListener && (event.getAction() == KeyEvent.ACTION_DOWN || event.getAction() == KeyEvent.ACTION_MULTIPLE) && !isControlKey(event)) {
return BarcodeManager.onKeyDown(event.getKeyCode(), event);

View File

@@ -65,25 +65,23 @@ public abstract class BaseDialogFragment extends DialogFragment implements Dialo
}
public void onLoadingStarted() {
BarcodeManager.disable();
this.openProgress();
}
public void onLoadingEnded() {
this.closeProgress();
BarcodeManager.enable();
}
private void openProgress() {
BarcodeManager.disable();
BarcodeManager.disableLastCallback();
// executorService.execute(() -> {
this.mCurrentProgress.show(requireActivity().getSupportFragmentManager());
// });
}
private void closeProgress() {
BarcodeManager.enable();
BarcodeManager.enableLastCallback();
// executorService.execute(() -> {
mCurrentProgress.dismiss();
// });
@@ -91,9 +89,8 @@ public abstract class BaseDialogFragment extends DialogFragment implements Dialo
public void onError(Exception ex) {
this.onLoadingEnded();
requireActivity().runOnUiThread(() -> {
this.onLoadingEnded();
UtilityExceptions.defaultException(requireActivity(), ex);
});
}
@@ -130,7 +127,7 @@ public abstract class BaseDialogFragment extends DialogFragment implements Dialo
.create()
.inject(this);
if (BarcodeManager.isEnabled() && BarcodeManager.isKeyboardEmulator() && getDialog() != null) {
if (BarcodeManager.isLastCallbackEnabled() && BarcodeManager.isKeyboardEmulator() && getDialog() != null) {
getDialog().setOnKeyListener((dialog, keyCode, event) -> {
if (mBarcodeListener && (event.getAction() == KeyEvent.ACTION_DOWN || event.getAction() == KeyEvent.ACTION_MULTIPLE) && !isControlKey(event)) {
return BarcodeManager.onKeyDown(event.getKeyCode(), event);

View File

@@ -1,6 +1,7 @@
package it.integry.integrywmsnative.core.expansion;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -30,6 +31,9 @@ public abstract class BaseFragment extends Fragment {
@Inject
public ExecutorService executorService;
@Inject
public Handler handler;
protected ElevatedToolbar mToolbar;
protected final List<Runnable> mOnPreDestroyList = new ArrayList<>();
@@ -65,24 +69,23 @@ public abstract class BaseFragment extends Fragment {
}
private void openProgress() {
BarcodeManager.disable();
BarcodeManager.disableLastCallback();
// executorService.execute(() -> {
this.mCurrentProgress.show(requireActivity().getSupportFragmentManager());
// });
}
private void closeProgress() {
BarcodeManager.enable();
BarcodeManager.enableLastCallback();
// executorService.execute(() -> {
mCurrentProgress.dismiss();
// });
}
public void onError(Exception ex) {
requireActivity().runOnUiThread(() -> {
handler.post(() -> {
this.closeProgress();
UtilityExceptions.defaultException(getActivity(), ex);
BarcodeManager.enable();
});
}
@@ -102,7 +105,7 @@ public abstract class BaseFragment extends Fragment {
protected void popMe() {
if (requireActivity() instanceof IPoppableActivity) {
requireActivity().runOnUiThread(() -> {
handler.post(() -> {
((IPoppableActivity) requireActivity()).pop();
});
} else {

View File

@@ -0,0 +1,44 @@
package it.integry.integrywmsnative.core.expansion.view;
import android.view.View;
import androidx.databinding.ObservableArrayList;
import androidx.databinding.ObservableList;
import androidx.recyclerview.widget.RecyclerView;
import it.integry.integrywmsnative.core.expansion.OnListGeneralChangedCallback;
public abstract class ExtendedSectionedRecyclerViewNew<T, SH extends RecyclerView.ViewHolder, VH extends RecyclerView.ViewHolder>
extends SectionedRecyclerViewAdapter<SH, VH> {
private View mEmptyView;
public ExtendedSectionedRecyclerViewNew(ObservableArrayList<T> myDataset) {
super();
myDataset.addOnListChangedCallback(new OnListGeneralChangedCallback<T>() {
@Override
public void onChanged(ObservableList<T> sender) {
checkIfEmpty();
}
});
checkIfEmpty();
}
public ExtendedSectionedRecyclerViewNew<T, SH, VH> setEmptyView(View emptyView) {
this.mEmptyView = emptyView;
this.checkIfEmpty();
return this;
}
private void checkIfEmpty() {
if (mEmptyView != null) {
final boolean emptyViewVisible = getItemCount() == 0;
mEmptyView.setVisibility(emptyViewVisible ? View.VISIBLE : View.GONE);
}
}
}

View File

@@ -0,0 +1,218 @@
package it.integry.integrywmsnative.core.expansion.view;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.util.SparseArray;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.lang.ref.WeakReference;
import java.util.ArrayDeque;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import java.util.concurrent.TimeUnit;
public class RecyclerViewProfiler {
private static final String TAG = "RVProfiler";
private final SparseArray<Long> bindingTimes;
private final SparseArray<Long> creationTimes;
private final Handler mainHandler;
private WeakReference<RecyclerView> recyclerViewRef;
private boolean isProfilingEnabled = true;
// Metriche di performance
private long totalBindingTime = 0;
private long totalCreationTime = 0;
private int bindCount = 0;
private int createCount = 0;
private long firstBindTime = 0;
private final ArrayDeque<Long> recentBindTimes;
private static final int MAX_RECENT_TIMES = 50;
public RecyclerViewProfiler(RecyclerView recyclerView) {
this.recyclerViewRef = new WeakReference<>(recyclerView);
this.bindingTimes = new SparseArray<>();
this.creationTimes = new SparseArray<>();
this.mainHandler = new Handler(Looper.getMainLooper());
this.recentBindTimes = new ArrayDeque<>();
setupRecyclerViewCallbacks();
}
private void setupRecyclerViewCallbacks() {
RecyclerView recyclerView = recyclerViewRef.get();
if (recyclerView == null) return;
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
logPerformanceMetrics();
}
}
});
// Monitora il pre-layout
recyclerView.addOnLayoutChangeListener((v, left, top, right, bottom,
oldLeft, oldTop, oldRight, oldBottom) -> {
if (firstBindTime == 0) {
mainHandler.postDelayed(this::checkInitialPerformance, 500);
}
});
}
public void onPreBind(int position) {
if (!isProfilingEnabled) return;
bindingTimes.put(position, System.nanoTime());
}
public void onPostBind(int position) {
if (!isProfilingEnabled) return;
Long startTime = bindingTimes.get(position);
if (startTime != null) {
long bindTime = System.nanoTime() - startTime;
bindingTimes.remove(position);
if (firstBindTime == 0) {
firstBindTime = bindTime;
}
totalBindingTime += bindTime;
bindCount++;
recentBindTimes.addLast(bindTime);
if (recentBindTimes.size() > MAX_RECENT_TIMES) {
recentBindTimes.removeFirst();
}
// Segnala binding lenti
if (bindTime > TimeUnit.MILLISECONDS.toNanos(16)) { // 1 frame
Log.w(TAG, String.format("Slow binding at position %d: %.2fms",
position, bindTime / 1_000_000.0));
}
}
}
public void onPreCreate(int viewType) {
if (!isProfilingEnabled) return;
creationTimes.put(viewType, System.nanoTime());
}
public void onPostCreate(int viewType) {
if (!isProfilingEnabled) return;
Long startTime = creationTimes.get(viewType);
if (startTime != null) {
long createTime = System.nanoTime() - startTime;
creationTimes.remove(viewType);
totalCreationTime += createTime;
createCount++;
// Segnala creazioni lente
if (createTime > TimeUnit.MILLISECONDS.toNanos(8)) {
Log.w(TAG, String.format("Slow view creation for type %d: %.2fms",
viewType, createTime / 1_000_000.0));
}
}
}
private void checkInitialPerformance() {
RecyclerView recyclerView = recyclerViewRef.get();
if (recyclerView == null) return;
// Verifica inflazione layout
long avgBindTime = bindCount > 0 ? totalBindingTime / bindCount : 0;
if (avgBindTime > TimeUnit.MILLISECONDS.toNanos(8)) {
Log.w(TAG, String.format("High average binding time: %.2fms. " +
"Consider using AsyncLayoutInflater", avgBindTime / 1_000_000.0));
}
// Verifica dimensione view pool
RecyclerView.RecycledViewPool pool = recyclerView.getRecycledViewPool();
if (pool != null) {
int[] viewTypes = getViewTypes(recyclerView);
for (int type : viewTypes) {
if (pool.getRecycledViewCount(type) == 0) {
Log.w(TAG, "ViewPool empty for type " + type +
". Consider increasing pool size");
}
}
}
// Verifica prefetch
if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
LinearLayoutManager lm = (LinearLayoutManager) recyclerView.getLayoutManager();
if (!lm.isItemPrefetchEnabled()) {
Log.w(TAG, "Item prefetch is disabled. Enable it for better performance");
}
}
}
private void logPerformanceMetrics() {
if (!isProfilingEnabled || recentBindTimes.isEmpty()) return;
// Calcola la varianza dei tempi di binding recenti
double mean = recentBindTimes.stream()
.mapToLong(Long::longValue)
.average()
.orElse(0.0);
double variance = recentBindTimes.stream()
.mapToDouble(time -> Math.pow(time - mean, 2))
.average()
.orElse(0.0);
Log.d(TAG, String.format("Performance metrics:\n" +
"Avg binding time: %.2fms\n" +
"Binding time variance: %.2f\n" +
"View creation rate: %.1f%%",
mean / 1_000_000.0,
variance / 1_000_000.0,
createCount * 100.0 / (bindCount + 1)));
}
private int[] getViewTypes(RecyclerView recyclerView) {
RecyclerView.Adapter<?> adapter = recyclerView.getAdapter();
if (adapter == null) return new int[0];
Set<Integer> types = new HashSet<>();
for (int i = 0; i < adapter.getItemCount(); i++) {
types.add(adapter.getItemViewType(i));
}
return types.stream().mapToInt(Integer::intValue).toArray();
}
public void enableProfiling(boolean enabled) {
isProfilingEnabled = enabled;
if (!enabled) {
bindingTimes.clear();
creationTimes.clear();
recentBindTimes.clear();
}
}
public String getProfilingStats() {
if (bindCount == 0) return "No data collected yet";
return String.format(Locale.US,
"Profiling Statistics:\n" +
"Total bindings: %d\n" +
"Average binding time: %.2fms\n" +
"Total view creations: %d\n" +
"Average creation time: %.2fms\n" +
"First binding time: %.2fms\n" +
"Creation/Binding ratio: %.1f%%",
bindCount,
(totalBindingTime / bindCount) / 1_000_000.0,
createCount,
(totalCreationTime / createCount) / 1_000_000.0,
firstBindTime / 1_000_000.0,
createCount * 100.0 / bindCount);
}
}

View File

@@ -0,0 +1,352 @@
package it.integry.integrywmsnative.core.expansion.view;
import android.util.SparseArray;
import android.util.SparseIntArray;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import it.integry.integrywmsnative.BuildConfig;
public abstract class SectionedRecyclerViewAdapter<H extends RecyclerView.ViewHolder,
I extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private RecyclerViewProfiler profiler;
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
// Utilizziamo SparseArray invece di HashMap per migliori performance su Android
private final SparseArray<Section> sectionsByPosition;
private final ArrayList<Section> sections;
// Cache per le posizioni degli item per evitare ricalcoli frequenti
private final SparseIntArray positionCache;
private int lastCacheUpdateCount;
// Pool di View per riutilizzo
private final RecyclerView.RecycledViewPool sharedPool;
// Dimensione massima della cache delle posizioni
private static final int MAX_POSITION_CACHE_SIZE = 2000;
public SectionedRecyclerViewAdapter() {
this.sections = new ArrayList<>();
this.sectionsByPosition = new SparseArray<>();
this.positionCache = new SparseIntArray(MAX_POSITION_CACHE_SIZE);
this.sharedPool = new RecyclerView.RecycledViewPool();
// Aumentiamo il pool di ViewHolder per tipo
sharedPool.setMaxRecycledViews(TYPE_HEADER, 500);
sharedPool.setMaxRecycledViews(TYPE_ITEM, 2000);
}
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
profiler = new RecyclerViewProfiler(recyclerView);
profiler.enableProfiling(BuildConfig.DEBUG);
recyclerView.setRecycledViewPool(sharedPool);
// Ottimizziamo il layout manager per le prestazioni
if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
layoutManager.setItemPrefetchEnabled(true);
// layoutManager.setInitialPrefetchItemCount(20);
}
// recyclerView.postDelayed(() -> {
// Precarica alcuni ViewHolder
// for (int i = 0; i < 100; i++) {
// sharedPool.putRecycledView(
// createViewHolder(recyclerView, TYPE_HEADER));
// }
// for (int i = 0; i < 100; i++) {
// sharedPool.putRecycledView(
// createViewHolder(recyclerView, TYPE_ITEM));
// }
// }, 50);
}
protected static class Section {
private final Object headerData;
private final ArrayList<Object> itemsData;
private int globalStartPosition; // Posizione globale di inizio sezione
public Section(Object headerData, int initialCapacity) {
this.headerData = headerData;
this.itemsData = new ArrayList<>(initialCapacity);
this.globalStartPosition = 0;
}
public Object getHeaderData() {
return headerData;
}
public List<Object> getItemsData() {
return itemsData;
}
public void addItem(Object item) {
itemsData.add(item);
}
public int getItemCount() {
return itemsData.size();
}
public void setGlobalStartPosition(int position) {
this.globalStartPosition = position;
}
public int getGlobalStartPosition() {
return globalStartPosition;
}
}
// ViewHolder pooling e caching
@Override
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
super.onViewRecycled(holder);
// Pulizia custom del ViewHolder se necessario
if (holder instanceof OnRecycleListener) {
((OnRecycleListener) holder).onRecycle();
}
}
// Interfaccia per gestire la pulizia custom dei ViewHolder
public interface OnRecycleListener {
void onRecycle();
}
@Override
@NonNull
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
profiler.onPreCreate(viewType);
RecyclerView.ViewHolder holder;
if (viewType == TYPE_HEADER) {
holder = onCreateHeaderViewHolder(parent);
} else {
holder = onCreateItemViewHolder(parent);
}
// Applichiamo ViewHolder pooling
if (holder.itemView.getLayoutParams() == null) {
holder.itemView.setLayoutParams(
new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
);
}
profiler.onPostCreate(viewType);
return holder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
profiler.onPreBind(position);
PositionInfo posInfo = getItemPositionInfo(position);
if (getItemViewType(position) == TYPE_HEADER) {
onBindHeaderViewHolder((H) holder,
sections.get(posInfo.sectionPosition).getHeaderData(),
posInfo.sectionPosition);
} else {
Section section = sections.get(posInfo.sectionPosition);
onBindItemViewHolder((I) holder,
section.getItemsData().get(posInfo.itemPosition),
posInfo.sectionPosition,
posInfo.itemPosition);
}
profiler.onPostBind(position);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List<Object> payloads) {
if (payloads.isEmpty()) {
super.onBindViewHolder(holder, position, payloads);
return;
}
// Supporto per aggiornamenti parziali
if (getItemViewType(position) == TYPE_HEADER) {
onBindHeaderViewHolderPartial((H) holder, position, payloads);
} else {
onBindItemViewHolderPartial((I) holder, position, payloads);
}
}
// Metodi per gestire aggiornamenti parziali
protected void onBindHeaderViewHolderPartial(H holder, int position, List<Object> payloads) {
onBindViewHolder(holder, position);
}
protected void onBindItemViewHolderPartial(I holder, int position, List<Object> payloads) {
onBindViewHolder(holder, position);
}
@Override
public int getItemCount() {
int count = 0;
for (Section section : sections) {
count += section.getItemCount() + 1;
}
return count;
}
@Override
public int getItemViewType(int position) {
return isHeader(position) ? TYPE_HEADER : TYPE_ITEM;
}
// Metodi ottimizzati per la gestione delle sezioni
public <T> void addSection(T headerData, int expectedItems) {
sections.add(new Section(headerData, expectedItems));
updatePositionCache();
notifyDataSetChanged();
}
public void addItem(int sectionPosition, Object item) {
if (sectionPosition >= 0 && sectionPosition < sections.size()) {
sections.get(sectionPosition).addItem(item);
updatePositionCache();
// Notifichiamo solo l'inserimento invece di un refresh completo
notifyItemInserted(getGlobalPositionForItem(sectionPosition,
sections.get(sectionPosition).getItemCount() - 1));
}
}
public <T extends Object, S extends Object> void setSections(List<T> headers, Map<T, List<S>> items) {
sections.clear();
sectionsByPosition.clear();
int position = 0;
for (T header : headers) {
List<S> sectionItems = items.get(header);
Section section = new Section(header, sectionItems != null ? sectionItems.size() : 5);
if (sectionItems != null) {
section.getItemsData().addAll(sectionItems);
}
section.setGlobalStartPosition(position);
sections.add(section);
sectionsByPosition.put(position, section);
position += section.getItemCount() + 1;
}
updatePositionCache();
notifyDataSetChanged();
}
// Gestione efficiente della cache delle posizioni
private void updatePositionCache() {
if (sections.size() > MAX_POSITION_CACHE_SIZE) {
positionCache.clear();
return;
}
int currentPosition = 0;
for (int i = 0; i < sections.size(); i++) {
Section section = sections.get(i);
section.setGlobalStartPosition(currentPosition);
sectionsByPosition.put(currentPosition, section);
currentPosition += section.getItemCount() + 1;
}
lastCacheUpdateCount = getItemCount();
}
private boolean isHeader(int position) {
Section section = sectionsByPosition.get(position);
if (section != null) {
return true;
}
for (int i = 0; i < sections.size(); i++) {
section = sections.get(i);
if (position == section.getGlobalStartPosition()) {
return true;
}
if (position < section.getGlobalStartPosition() + section.getItemCount() + 1) {
return false;
}
}
return false;
}
private static class PositionInfo {
final int sectionPosition;
final int itemPosition;
PositionInfo(int sectionPosition, int itemPosition) {
this.sectionPosition = sectionPosition;
this.itemPosition = itemPosition;
}
}
private PositionInfo getItemPositionInfo(int position) {
// Controllo cache
int cachedSection = positionCache.get(position, -1);
if (cachedSection != -1 && lastCacheUpdateCount == getItemCount()) {
Section section = sections.get(cachedSection);
int relativePos = position - section.getGlobalStartPosition();
if (relativePos == 0) {
return new PositionInfo(cachedSection, -1);
}
return new PositionInfo(cachedSection, relativePos - 1);
}
// Ricerca ottimizzata
Section targetSection = sectionsByPosition.get(position);
if (targetSection != null) {
int sectionIndex = sections.indexOf(targetSection);
return new PositionInfo(sectionIndex, -1);
}
// Ricerca binaria nelle sezioni
int left = 0;
int right = sections.size() - 1;
while (left <= right) {
int mid = (left + right) >>> 1;
Section section = sections.get(mid);
int sectionStart = section.getGlobalStartPosition();
int sectionEnd = sectionStart + section.getItemCount() + 1;
if (position >= sectionStart && position < sectionEnd) {
int relativePos = position - sectionStart;
if (relativePos == 0) {
return new PositionInfo(mid, -1);
}
return new PositionInfo(mid, relativePos - 1);
}
if (position < sectionStart) {
right = mid - 1;
} else {
left = mid + 1;
}
}
throw new IndexOutOfBoundsException("Position " + position + " is out of bounds");
}
private int getGlobalPositionForItem(int sectionPosition, int itemPosition) {
return sections.get(sectionPosition).getGlobalStartPosition() + itemPosition + 1;
}
// Metodi astratti che devono essere implementati
protected abstract H onCreateHeaderViewHolder(ViewGroup parent);
protected abstract I onCreateItemViewHolder(ViewGroup parent);
protected abstract void onBindHeaderViewHolder(H holder, Object headerData, int sectionPosition);
protected abstract void onBindItemViewHolder(I holder, Object itemData, int sectionPosition, int itemPosition);
}

View File

@@ -2,11 +2,11 @@ package it.integry.integrywmsnative.core.mapper;
import javax.inject.Singleton;
import it.integry.integrywmsnative.core.data_store.db.entity.InventarioRoomDTO;
import it.integry.integrywmsnative.core.data_store.db.entity.InventarioEntity;
import it.integry.integrywmsnative.core.model.MtbInvent;
@Singleton
public class InventarioMapper extends BaseMapper<MtbInvent, InventarioRoomDTO> {
public class InventarioMapper extends BaseMapper<MtbInvent, InventarioEntity> {
private final InventarioRowMapper inventarioRowMapper;
@@ -15,10 +15,10 @@ public class InventarioMapper extends BaseMapper<MtbInvent, InventarioRoomDTO> {
}
@Override
public InventarioRoomDTO mapRestToRoom(MtbInvent inputData) {
public InventarioEntity mapRestToRoom(MtbInvent inputData) {
if(inputData == null) return null;
var data = new InventarioRoomDTO();
var data = new InventarioEntity();
data.setIdInventario(inputData.getIdInventario());
data.setCodMdep(inputData.getCodMdep());
data.setDataInventario(inputData.getDataInventario());
@@ -42,7 +42,7 @@ public class InventarioMapper extends BaseMapper<MtbInvent, InventarioRoomDTO> {
}
@Override
public MtbInvent mapRoomToRest(InventarioRoomDTO inputData) {
public MtbInvent mapRoomToRest(InventarioEntity inputData) {
if(inputData == null) return null;
var data = new MtbInvent();

View File

@@ -0,0 +1,44 @@
package it.integry.integrywmsnative.core.mapper;
import javax.inject.Singleton;
import it.integry.integrywmsnative.core.data_store.db.entity.VerificaGiacenzeEntity;
import it.integry.integrywmsnative.core.rest.model.pv.VerificaGiacenzeDTO;
@Singleton
public class VerificaGiacenzeMapper extends BaseMapper<VerificaGiacenzeDTO, VerificaGiacenzeEntity> {
private final VerificaGiacenzeRowMapper verificaGiacenzeRowMapper;
public VerificaGiacenzeMapper(VerificaGiacenzeRowMapper verificaGiacenzeRowMapper) {
this.verificaGiacenzeRowMapper = verificaGiacenzeRowMapper;
}
@Override
public VerificaGiacenzeEntity mapRestToRoom(VerificaGiacenzeDTO inputData) {
if(inputData == null) return null;
var data = new VerificaGiacenzeEntity();
data.setCodMdep(inputData.getCodMdep());
data.setData(inputData.getDataVerifica());
data.setVerificaGiacenzeRowList(verificaGiacenzeRowMapper.mapRestsToRooms(inputData.getRows()));
return data;
}
@Override
public VerificaGiacenzeDTO mapRoomToRest(VerificaGiacenzeEntity inputData) {
if(inputData == null) return null;
var data = new VerificaGiacenzeDTO();
data.setCodMdep(inputData.getCodMdep());
data.setDataVerifica(inputData.getData());
data.setRows(verificaGiacenzeRowMapper.mapRoomsToRests(inputData.getVerificaGiacenzeRowList()));
return data;
}
}

View File

@@ -0,0 +1,40 @@
package it.integry.integrywmsnative.core.mapper;
import javax.inject.Singleton;
import it.integry.integrywmsnative.core.data_store.db.entity.VerificaGiacenzeRowEntity;
import it.integry.integrywmsnative.core.rest.model.pv.VerificaGiacenzeRowDTO;
@Singleton
public class VerificaGiacenzeRowMapper extends BaseMapper<VerificaGiacenzeRowDTO, VerificaGiacenzeRowEntity> {
@Override
public VerificaGiacenzeRowEntity mapRestToRoom(VerificaGiacenzeRowDTO inputData) {
if(inputData == null) return null;
var data = new VerificaGiacenzeRowEntity();
data.setCodMart(inputData.getCodMart());
data.setPartitaMag(inputData.getPartitaMag());
data.setQtaInGiacenza(inputData.getQtaInGiacenza());
data.setQta(inputData.getQta());
data.setNumConf(inputData.getNumCnf());
data.setQtaConf(inputData.getQtaCnf());
data.setScanCodBarre(inputData.getBarcode());
return data;
}
@Override
public VerificaGiacenzeRowDTO mapRoomToRest(VerificaGiacenzeRowEntity inputData) {
if(inputData == null) return null;
var data = new VerificaGiacenzeRowDTO();
data.setCodMart(inputData.getCodMart());
data.setPartitaMag(inputData.getPartitaMag());
data.setQtaInGiacenza(inputData.getQtaInGiacenza());
data.setQta(inputData.getQta());
data.setNumCnf(inputData.getNumConf());
data.setQtaCnf(inputData.getQtaConf());
data.setBarcode(inputData.getScanCodBarre());
return data;
}
}

View File

@@ -1,17 +1,10 @@
package it.integry.integrywmsnative.core.menu;
import androidx.annotation.NonNull;
import javax.inject.Singleton;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.model.StbMenu;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.consumers._BaseRESTConsumer;
import it.integry.integrywmsnative.core.rest.handler.ManagedErrorCallback;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import retrofit2.Call;
import retrofit2.Response;
@Singleton
public class MenuRESTConsumer extends _BaseRESTConsumer {
@@ -22,19 +15,12 @@ public class MenuRESTConsumer extends _BaseRESTConsumer {
this.restBuilder = restBuilder;
}
public void retrieveMenu(String rootCodOpz, RunnableArgs<StbMenu> onComplete, RunnableArgs<Exception> onFailed) {
public StbMenu retrieveMenuSynchronized(String rootCodOpz) throws Exception {
MenuRESTConsumerService menuRESTConsumerService = restBuilder.getService(MenuRESTConsumerService.class);
menuRESTConsumerService.retrieveMenuConfig(rootCodOpz).enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<StbMenu>> call, Response<ServiceRESTResponse<StbMenu>> response) {
analyzeAnswer(response, "retrieveMenu", onComplete, onFailed);
}
var response = menuRESTConsumerService.retrieveMenuConfig(rootCodOpz)
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<StbMenu>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
return analyzeAnswer(response, "retrieveMenu");
}
}

View File

@@ -10,7 +10,6 @@ import javax.inject.Singleton;
import it.integry.integrywmsnative.core.class_router.configs.BaseMenuConfiguration;
import it.integry.integrywmsnative.core.class_router.configs.MenuConfiguration;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.menu.exception.MenuNotFoundException;
import it.integry.integrywmsnative.core.model.StbMenu;
@@ -29,20 +28,18 @@ public class MenuService {
this.menuRESTConsumer = menuRESTConsumer;
}
public void init(Runnable onMenuInitialized, RunnableArgs<Exception> onFailed) {
menuRESTConsumer.retrieveMenu(MENU_COD_OPZ, menu -> {
if(menu != null) {
this.mInternalCachedMenu = menu.getStbMenuChildren();
this.mInternalCachedFlatMenu = new ArrayList<>();
flattenMenu(this.mInternalCachedMenu);
}
public void init() throws Exception {
var menu = menuRESTConsumer.retrieveMenuSynchronized(MENU_COD_OPZ);
onMenuInitialized.run();
}, onFailed);
if (menu != null) {
this.mInternalCachedMenu = menu.getStbMenuChildren();
this.mInternalCachedFlatMenu = new ArrayList<>();
flattenMenu(this.mInternalCachedMenu);
}
}
public List<StbMenu> getMenu() throws Exception {
if(mInternalCachedMenu == null) throw new MenuNotFoundException();
if (mInternalCachedMenu == null) throw new MenuNotFoundException();
return mInternalCachedMenu;
}
@@ -64,10 +61,10 @@ public class MenuService {
}
private void flattenMenu(List<StbMenu> menu) {
for(StbMenu stbMenu : menu) {
for (StbMenu stbMenu : menu) {
this.mInternalCachedFlatMenu.add(stbMenu);
if(stbMenu.getStbMenuChildren() != null && !stbMenu.getStbMenuChildren().isEmpty()) {
if (stbMenu.getStbMenuChildren() != null && !stbMenu.getStbMenuChildren().isEmpty()) {
flattenMenu(stbMenu.getStbMenuChildren());
}
}

View File

@@ -1,7 +1,7 @@
package it.integry.integrywmsnative.core.model;
import java.math.BigDecimal;
import java.util.Date;
import java.time.LocalDate;
import java.util.List;
public class DtbDoct {
@@ -10,7 +10,7 @@ public class DtbDoct {
private String codAnag;
private String codDtip;
private Date dataDoc;
private LocalDate dataDoc;
private Integer numDoc;
private String serDoc;
private BigDecimal acconto;
@@ -41,14 +41,14 @@ public class DtbDoct {
private String compilatoDa;
private String userName;
private String controllatoDa;
private Date dataChkDoc;
private Date dataDocVal;
private Date dataInizTrasp;
private Date dataIns;
private Date dataOrd;
private Date dataReg;
private Date dataRifScad;
private Date dataUltMod;
private LocalDate dataChkDoc;
private LocalDate dataDocVal;
private LocalDate dataInizTrasp;
private LocalDate dataIns;
private LocalDate dataOrd;
private LocalDate dataReg;
private LocalDate dataRifScad;
private LocalDate dataUltMod;
private String descrizionePaga;
private String flagPrzScontati;
private String gestione;
@@ -89,7 +89,7 @@ public class DtbDoct {
private String targa;
private Integer postiPallet;
private BigDecimal tempMedia;
private Date dataCons;
private LocalDate dataCons;
private BigDecimal nolo;
private BigDecimal nolo2;
private String conducente;
@@ -102,7 +102,7 @@ public class DtbDoct {
private String setDataDecorrenza2DataRic;
private BigDecimal totSpese;
private String chkArtListino;
private Date dataCmov;
private LocalDate dataCmov;
private String reso;
private Integer numCmovAutofattura;
private Object dtbTipi;
@@ -141,11 +141,11 @@ public class DtbDoct {
return this;
}
public Date getDataDoc() {
public LocalDate getDataDoc() {
return dataDoc;
}
public DtbDoct setDataDoc(Date dataDoc) {
public DtbDoct setDataDoc(LocalDate dataDoc) {
this.dataDoc = dataDoc;
return this;
}
@@ -420,74 +420,74 @@ public class DtbDoct {
return this;
}
public Date getDataChkDoc() {
public LocalDate getDataChkDoc() {
return dataChkDoc;
}
public DtbDoct setDataChkDoc(Date dataChkDoc) {
public DtbDoct setDataChkDoc(LocalDate dataChkDoc) {
this.dataChkDoc = dataChkDoc;
return this;
}
public Date getDataDocVal() {
public LocalDate getDataDocVal() {
return dataDocVal;
}
public DtbDoct setDataDocVal(Date dataDocVal) {
public DtbDoct setDataDocVal(LocalDate dataDocVal) {
this.dataDocVal = dataDocVal;
return this;
}
public Date getDataInizTrasp() {
public LocalDate getDataInizTrasp() {
return dataInizTrasp;
}
public DtbDoct setDataInizTrasp(Date dataInizTrasp) {
public DtbDoct setDataInizTrasp(LocalDate dataInizTrasp) {
this.dataInizTrasp = dataInizTrasp;
return this;
}
public Date getDataIns() {
public LocalDate getDataIns() {
return dataIns;
}
public DtbDoct setDataIns(Date dataIns) {
public DtbDoct setDataIns(LocalDate dataIns) {
this.dataIns = dataIns;
return this;
}
public Date getDataOrd() {
public LocalDate getDataOrd() {
return dataOrd;
}
public DtbDoct setDataOrd(Date dataOrd) {
public DtbDoct setDataOrd(LocalDate dataOrd) {
this.dataOrd = dataOrd;
return this;
}
public Date getDataReg() {
public LocalDate getDataReg() {
return dataReg;
}
public DtbDoct setDataReg(Date dataReg) {
public DtbDoct setDataReg(LocalDate dataReg) {
this.dataReg = dataReg;
return this;
}
public Date getDataRifScad() {
public LocalDate getDataRifScad() {
return dataRifScad;
}
public DtbDoct setDataRifScad(Date dataRifScad) {
public DtbDoct setDataRifScad(LocalDate dataRifScad) {
this.dataRifScad = dataRifScad;
return this;
}
public Date getDataUltMod() {
public LocalDate getDataUltMod() {
return dataUltMod;
}
public DtbDoct setDataUltMod(Date dataUltMod) {
public DtbDoct setDataUltMod(LocalDate dataUltMod) {
this.dataUltMod = dataUltMod;
return this;
}
@@ -852,11 +852,11 @@ public class DtbDoct {
return this;
}
public Date getDataCons() {
public LocalDate getDataCons() {
return dataCons;
}
public DtbDoct setDataCons(Date dataCons) {
public DtbDoct setDataCons(LocalDate dataCons) {
this.dataCons = dataCons;
return this;
}
@@ -969,11 +969,11 @@ public class DtbDoct {
return this;
}
public Date getDataCmov() {
public LocalDate getDataCmov() {
return dataCmov;
}
public DtbDoct setDataCmov(Date dataCmov) {
public DtbDoct setDataCmov(LocalDate dataCmov) {
this.dataCmov = dataCmov;
return this;
}

View File

@@ -1,6 +1,7 @@
package it.integry.integrywmsnative.core.model;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import it.integry.integrywmsnative.core.utility.UtilityString;
@@ -96,6 +97,8 @@ public class MtbAart extends EntityBase {
private List<MtbUntMis> mtbUntMis;
private List<MtbAartBarCode> mtbAartBarCode;
public enum UntMisRifPesoEnum {
C,
@@ -108,6 +111,104 @@ public class MtbAart extends EntityBase {
this.type = "mtb_aart";
}
public MtbAart(MtbAart other) {
this();
this.codMart = other.codMart;
this.descrizione = other.descrizione;
this.untMis = other.untMis;
this.barCode = other.barCode;
this.pesoKg = other.pesoKg; // BigDecimal è immutabile
this.qtaCnf = other.qtaCnf;
this.codAliq = other.codAliq;
this.codScoArt = other.codScoArt;
this.codTcolUi = other.codTcolUi;
this.codTcolUl = other.codTcolUl;
this.articoloComposto = other.articoloComposto;
this.esposizioneComp = other.esposizioneComp;
this.descrizioneEstesa = other.descrizioneEstesa;
this.codUltForn = other.codUltForn;
this.dataUltCar = other.dataUltCar;
this.valUltCar = other.valUltCar;
this.codUltClie = other.codUltClie;
this.dataUltScar = other.dataUltScar;
this.valUltScar = other.valUltScar;
this.tipoCodice = other.tipoCodice;
this.note = other.note;
this.posizione = other.posizione;
this.colliPedana = other.colliPedana;
this.untMis2 = other.untMis2;
this.rapConv2 = other.rapConv2;
this.flagInclListino = other.flagInclListino;
this.untMis3 = other.untMis3;
this.rapConv3 = other.rapConv3;
this.codMartStat = other.codMartStat;
this.codMcon = other.codMcon;
this.codMgrp = other.codMgrp;
this.codMsfa = other.codMsfa;
this.codMsgr = other.codMsgr;
this.codMstp = other.codMstp;
this.codMtip = other.codMtip;
this.descrizioneStat = other.descrizioneStat;
this.flagStato = other.flagStato;
this.cambioDiviCar = other.cambioDiviCar;
this.cambioDiviScar = other.cambioDiviScar;
this.ggScadPartita = other.ggScadPartita;
this.volumeMc = other.volumeMc;
this.flagEsponiPrz = other.flagEsponiPrz;
this.dataUltVar = other.dataUltVar;
this.percSfrido = other.percSfrido;
this.codBarreImb = other.codBarreImb;
this.flagCalcPrz = other.flagCalcPrz;
this.esposizioneCompAcq = other.esposizioneCompAcq;
this.flagCalcPrzAcq = other.flagCalcPrzAcq;
this.diacod = other.diacod;
this.plu = other.plu;
this.partIvaProd = other.partIvaProd;
this.ragSocProd = other.ragSocProd;
this.flagRapConvVariabile = other.flagRapConvVariabile;
this.flagMovArtMag = other.flagMovArtMag;
this.flagTracciabilita = other.flagTracciabilita;
this.taraKg = other.taraKg;
this.colliStrato = other.colliStrato;
this.flagQtaCnfFissa = other.flagQtaCnfFissa;
this.flagColliPedanaFisso = other.flagColliPedanaFisso;
this.codCconCosti = other.codCconCosti;
this.codCconRicavi = other.codCconRicavi;
this.codDgrpArt = other.codDgrpArt;
this.codDiviCar = other.codDiviCar;
this.codDiviScar = other.codDiviScar;
this.codEcrCat = other.codEcrCat;
this.codEcrMcat = other.codEcrMcat;
this.codEcrRep = other.codEcrRep;
this.codEcrStipo = other.codEcrStipo;
this.codEcrTipo = other.codEcrTipo;
this.codGrpBolla = other.codGrpBolla;
this.ingredienti = other.ingredienti;
this.idArtEqui = other.idArtEqui;
this.descrCassa = other.descrCassa;
this.codNcIntracee = other.codNcIntracee;
this.marchio = other.marchio;
this.sezione = other.sezione;
this.untMisRifPeso = other.untMisRifPeso; // Enum è immutabile
this.qtaEsistente = other.qtaEsistente;
this.qtaImpegnata = other.qtaImpegnata;
this.numCnfEsistente = other.numCnfEsistente;
this.numCnfImpegnata = other.numCnfImpegnata;
// Deep copy della lista
if (other.mtbUntMis != null) {
this.mtbUntMis = new ArrayList<>();
for (MtbUntMis untMis : other.mtbUntMis) {
this.mtbUntMis.add(new MtbUntMis(untMis)); // Assicurati che MtbUntMis abbia un costruttore di copia
}
}
}
public boolean isFlagTracciabilitaBoolean() {
return flagTracciabilita != null && flagTracciabilita.equalsIgnoreCase("S");
}
@@ -866,6 +967,13 @@ public class MtbAart extends EntityBase {
return getMtbUntMis() != null && !getMtbUntMis().isEmpty() ? getMtbUntMis().get(0) : null;
}
public List<MtbAartBarCode> getMtbAartBarCode() {
return mtbAartBarCode;
}
public void setMtbAartBarCode(List<MtbAartBarCode> mtbAartBarCode) {
this.mtbAartBarCode = mtbAartBarCode;
}
@Override
public boolean equals(Object o) {

View File

@@ -0,0 +1,55 @@
package it.integry.integrywmsnative.core.model;
import java.math.BigDecimal;
public class MtbAartBarCode extends EntityBase {
private String codBarre;
private String codMart;
private BigDecimal qtaCnf;
private String flagPrimario;
private String tipoCodBarre;
public MtbAartBarCode() {
this.type = "mtb_aart_bar_code";
}
public String getCodBarre() {
return codBarre;
}
public void setCodBarre(String codBarre) {
this.codBarre = codBarre;
}
public String getCodMart() {
return codMart;
}
public void setCodMart(String codMart) {
this.codMart = codMart;
}
public BigDecimal getQtaCnf() {
return qtaCnf;
}
public void setQtaCnf(BigDecimal qtaCnf) {
this.qtaCnf = qtaCnf;
}
public String getFlagPrimario() {
return flagPrimario;
}
public void setFlagPrimario(String flagPrimario) {
this.flagPrimario = flagPrimario;
}
public String getTipoCodBarre() {
return tipoCodBarre;
}
public void setTipoCodBarre(String tipoCodBarre) {
this.tipoCodBarre = tipoCodBarre;
}
}

View File

@@ -15,7 +15,7 @@ public class MtbColr extends EntityBase {
private String gestione;
private String serCollo;
private Integer numCollo;
private String dataCollo;
private LocalDate dataCollo;
private Integer riga;
private Integer rigaOrd;
private String codMart;
@@ -27,7 +27,7 @@ public class MtbColr extends EntityBase {
private String serColloRif;
private String note;
private LocalDate dataOrd;
private String dataColloRif;
private LocalDate dataColloRif;
private BigDecimal qtaCnf;
private BigDecimal qtaCol;
private Integer numOrd;
@@ -67,6 +67,58 @@ public class MtbColr extends EntityBase {
}
}
public MtbColr(MtbColr other) {
this();
this.gestione = other.gestione;
this.serCollo = other.serCollo;
this.numCollo = other.numCollo;
this.dataCollo = other.dataCollo;
this.riga = other.riga;
this.rigaOrd = other.rigaOrd;
this.codMart = other.codMart;
this.codBarre = other.codBarre;
this.codCol = other.codCol;
this.codTagl = other.codTagl;
this.partitaMag = other.partitaMag;
this.gestioneRif = other.gestioneRif;
this.serColloRif = other.serColloRif;
this.note = other.note;
this.dataOrd = other.dataOrd; // LocalDate è immutabile
this.dataColloRif = other.dataColloRif;
this.qtaCnf = other.qtaCnf; // BigDecimal è immutabile
this.qtaCol = other.qtaCol;
this.numOrd = other.numOrd;
this.numEtich = other.numEtich;
this.numColloRif = other.numColloRif;
this.datetimeRow = other.datetimeRow;
this.codJcom = other.codJcom;
this.numCnf = other.numCnf;
this.insPartitaMag = other.insPartitaMag;
this.mtbPartitaMag_descrizione = other.mtbPartitaMag_descrizione;
this.dataScadPartita = other.dataScadPartita;
this.descrizione = other.descrizione;
this.untMis = other.untMis;
this.causale = other.causale;
this.utente = other.utente;
this.codAnagDoc = other.codAnagDoc;
this.codDtipDoc = other.codDtipDoc;
this.dataDoc = other.dataDoc;
this.serDoc = other.serDoc;
this.numDoc = other.numDoc;
this.idRigaDoc = other.idRigaDoc;
this.pesoNettoKg = other.pesoNettoKg;
this.pesoLordoKg = other.pesoLordoKg;
// Deep copy degli oggetti complessi
this.mtbAart = other.mtbAart != null ? new MtbAart(other.mtbAart) : null;
this.mtbPartitaMag = other.mtbPartitaMag != null ? new MtbPartitaMag(other.mtbPartitaMag) : null;
// Non copiamo i campi transient
// this.id = other.id;
// this.refMtbColr = other.refMtbColr;
}
public static class Causale {
public static final int DEFAULT = 0;
@@ -112,21 +164,18 @@ public class MtbColr extends EntityBase {
return this;
}
public String getDataColloS() {
public LocalDate getDataColloLD() {
return dataCollo;
}
public Date getDataColloD() {
return UtilityDate.recognizeDateWithExceptionHandler(getDataColloS());
}
public MtbColr setDataCollo(String dataCollo) {
this.dataCollo = dataCollo;
this.dataCollo = UtilityDate.recognizeLocalDateWithExceptionHandler(dataCollo);
return this;
}
public MtbColr setDataCollo(Date dataCollo) {
setDataCollo(UtilityDate.formatDate(dataCollo, UtilityDate.COMMONS_DATE_FORMATS.DMY_TIME_SLASH));
public MtbColr setDataCollo(LocalDate dataCollo) {
this.dataCollo = dataCollo;
return this;
}
@@ -235,25 +284,24 @@ public class MtbColr extends EntityBase {
}
public String getDataColloRifS() {
return dataColloRif;
return dataColloRif != null ? UtilityDate.COMMONS_DATE_FORMATS.DATE_DMY_SLASHED_FORMATTER.format(dataColloRif) : null;
}
public Date getDataColloRifD() {
return UtilityDate.recognizeDateWithExceptionHandler(getDataColloRifS());
}
public MtbColr setDataColloRif(String dataColloRif) {
this.dataColloRif = dataColloRif;
return this;
public LocalDate getDataColloRifLD() {
return dataColloRif;
}
public MtbColr setDataColloRif(Date dataColloRif) {
this.dataColloRif = UtilityDate.formatDate(dataColloRif, UtilityDate.COMMONS_DATE_FORMATS.DMY_TIME_SLASH);
public MtbColr setDataColloRif(String dataColloRif) {
this.dataColloRif = UtilityDate.recognizeLocalDateWithExceptionHandler(dataColloRif);
return this;
}
public MtbColr setDataColloRif(LocalDate dataColloRif) {
this.dataColloRif = UtilityDate.formatDate(dataColloRif, UtilityDate.COMMONS_DATE_FORMATS.DMY_SLASH);
this.dataColloRif = dataColloRif;
return this;
}

View File

@@ -3,7 +3,7 @@ package it.integry.integrywmsnative.core.model;
import android.text.TextUtils;
import androidx.databinding.ObservableArrayList;
import androidx.databinding.ObservableField;
import androidx.lifecycle.MutableLiveData;
import com.annimon.stream.Optional;
import com.annimon.stream.Stream;
@@ -22,7 +22,6 @@ import it.integry.integrywmsnative.core.model.secondary.GestioneEnum;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityDB;
import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.core.utility.UtilityLogger;
import it.integry.integrywmsnative.core.utility.UtilityString;
/**
@@ -31,7 +30,7 @@ import it.integry.integrywmsnative.core.utility.UtilityString;
public class MtbColt extends EntityBase {
private String gestione;
private String dataCollo;
private LocalDate dataCollo;
private String serCollo;
private Integer numCollo;
private String rifOrd;
@@ -66,7 +65,9 @@ public class MtbColt extends EntityBase {
private BigDecimal altezzaCm;
private String codJcom;
private final ObservableField<ObservableMtbTcol> mtbTCol = new ObservableField<>();
private String barcodeUl;
private final transient MutableLiveData<ObservableMtbTcol> mtbTCol = new MutableLiveData<>();
private Boolean disablePrint;
private String ragSocCliente;
@@ -84,7 +85,7 @@ public class MtbColt extends EntityBase {
public MtbColt() {
type = "mtb_colt";
setDataCollo(UtilityDate.getDateInstance());
setDataCollo(LocalDate.now());
setSerCollo("/");
if (SettingsManager.i().isUserLoggedIn()) {
@@ -143,20 +144,13 @@ public class MtbColt extends EntityBase {
}
public String getDataColloHumanLong() {
Date dataColloD = null;
try {
dataColloD = getDataColloD();
} catch (Exception ex) {
UtilityLogger.error(ex);
}
if (dataColloD != null) {
return UtilityDate.formatDate(dataColloD, UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN_LONG);
if (dataCollo != null) {
return UtilityDate.COMMONS_DATE_FORMATS.DATE_DMY_HUMAN_FORMATTER.format(dataCollo);
} else return null;
}
public String getDataColloS() {
return dataCollo;
return dataCollo != null ? UtilityDate.COMMONS_DATE_FORMATS.DATE_DMY_SLASHED_FORMATTER.format(dataCollo) : null;
}
public Date getDataColloD() {
@@ -164,21 +158,16 @@ public class MtbColt extends EntityBase {
}
public LocalDate getDataColloLD() {
return UtilityDate.recognizeLocalDateWithExceptionHandler(getDataColloS());
return dataCollo;
}
public MtbColt setDataCollo(String dataCollo) {
this.dataCollo = dataCollo;
return this;
}
public MtbColt setDataCollo(Date dataCollo) {
this.dataCollo = UtilityDate.formatDate(dataCollo, UtilityDate.COMMONS_DATE_FORMATS.DMY_TIME_SLASH);
this.dataCollo = UtilityDate.recognizeLocalDateWithExceptionHandler(dataCollo);
return this;
}
public MtbColt setDataCollo(LocalDate dataCollo) {
this.dataCollo = UtilityDate.formatDate(dataCollo, UtilityDate.COMMONS_DATE_FORMATS.DMY_SLASH);
this.dataCollo = dataCollo;
return this;
}
@@ -261,7 +250,7 @@ public class MtbColt extends EntityBase {
public MtbColt setCodTcol(String codTcol) {
this.codTcol = codTcol;
if(!UtilityString.isNullOrEmpty(codTcol)) {
if (!UtilityString.isNullOrEmpty(codTcol)) {
var fountMtbTcolObservable = SettingsManager.iDB().getInternalImballi().stream()
.filter(x -> x.getCodTcol().equalsIgnoreCase(codTcol))
.findFirst()
@@ -544,16 +533,25 @@ public class MtbColt extends EntityBase {
return this;
}
public ObservableMtbTcol getMtbTCol() {
return mtbTCol.get();
public String getBarcodeUl() {
return barcodeUl;
}
public MtbColt setMtbTCol(ObservableMtbTcol mtbTCol) {
this.mtbTCol.set(mtbTCol);
public MtbColt setBarcodeUl(String barcodeUl) {
this.barcodeUl = barcodeUl;
return this;
}
public ObservableField<ObservableMtbTcol> mtbTcolProperty() {
public ObservableMtbTcol getMtbTCol() {
return mtbTCol.getValue();
}
public MtbColt setMtbTCol(ObservableMtbTcol mtbTCol) {
this.mtbTCol.postValue(mtbTCol);
return this;
}
public MutableLiveData<ObservableMtbTcol> mtbTcolProperty() {
return mtbTCol;
}
@@ -631,8 +629,20 @@ public class MtbColt extends EntityBase {
@Override
public EntityBase clone() {
return clone(true);
}
public MtbColt clone(boolean withMtbColr) {
MtbColt mtbColt = (MtbColt) super.clone();
mtbColt.setMtbColr((ObservableArrayList<MtbColr>) mtbColt.getMtbColr().clone());
mtbColt.setMtbColr(new ObservableArrayList<>());
if(!withMtbColr) return mtbColt;
this.getMtbColr().stream()
.map(MtbColr::new) //Genera un clone
.forEach(mtbColr -> {
mtbColt.getMtbColr().add(mtbColr);
});
return mtbColt;
}
}

View File

@@ -5,7 +5,7 @@ import android.os.Parcelable;
import java.math.BigDecimal;
public class MtbDepo extends EntityBase implements Parcelable {
public class MtbDepo extends EntityBase {
private String codMdep;
@@ -41,79 +41,6 @@ public class MtbDepo extends EntityBase implements Parcelable {
type = "mtb_depo";
}
protected MtbDepo(Parcel in) {
codMdep = in.readString();
descrizione = in.readString();
flagVal = in.readString();
codAnag = in.readString();
indirizzo = in.readString();
cap = in.readString();
citta = in.readString();
prov = in.readString();
tel = in.readString();
nazione = in.readString();
fax = in.readString();
eMail = in.readString();
sitoWeb = in.readString();
codVdes = in.readString();
serie = in.readString();
flagMovimentabile = in.readString();
codJfas = in.readString();
codVlis = in.readString();
codCcau = in.readString();
codCcon = in.readString();
codDtip = in.readString();
codDtipFat = in.readString();
flagContoVendita = in.readString();
flagTipoNegozio = in.readString();
codMdepReso = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(codMdep);
dest.writeString(descrizione);
dest.writeString(flagVal);
dest.writeString(codAnag);
dest.writeString(indirizzo);
dest.writeString(cap);
dest.writeString(citta);
dest.writeString(prov);
dest.writeString(tel);
dest.writeString(nazione);
dest.writeString(fax);
dest.writeString(eMail);
dest.writeString(sitoWeb);
dest.writeString(codVdes);
dest.writeString(serie);
dest.writeString(flagMovimentabile);
dest.writeString(codJfas);
dest.writeString(codVlis);
dest.writeString(codCcau);
dest.writeString(codCcon);
dest.writeString(codDtip);
dest.writeString(codDtipFat);
dest.writeString(flagContoVendita);
dest.writeString(flagTipoNegozio);
dest.writeString(codMdepReso);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<MtbDepo> CREATOR = new Creator<>() {
@Override
public MtbDepo createFromParcel(Parcel in) {
return new MtbDepo(in);
}
@Override
public MtbDepo[] newArray(int size) {
return new MtbDepo[size];
}
};
public String getCodMdep() {
return codMdep;

View File

@@ -4,34 +4,60 @@ import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class MtbPartitaMag extends EntityBase{
private String codMart;
private String partitaMag;
private String descrizione;
public class MtbPartitaMag extends EntityBase {
private String codMart;
private String partitaMag;
private String descrizione;
private LocalDateTime dataIns;
private LocalDate dataScad;
private Integer scelta;
private Integer scelta;
private BigDecimal costoUntUmMag;
private BigDecimal valUntUmMag;
private BigDecimal taraCnfKg;
private BigDecimal qtaCnf;
private String flagImballoArendere;
private String flagStato;
private String codDiviCont;
private BigDecimal cambioDiviCont;
private String barcode;
private String note;
private BigDecimal rapConv2;
private BigDecimal rapConv3;
private String posizione;
private BigDecimal valUntUmMag;
private BigDecimal taraCnfKg;
private BigDecimal qtaCnf;
private String flagImballoArendere;
private String flagStato;
private String codDiviCont;
private BigDecimal cambioDiviCont;
private String barcode;
private String note;
private BigDecimal rapConv2;
private BigDecimal rapConv3;
private String posizione;
private String dataAggPrz;
private String partitaMagSec;
private String partitaMagSec;
private BigDecimal qtaAttesa;
public MtbPartitaMag() {
this.type = "mtb_partita_mag";
}
public MtbPartitaMag(MtbPartitaMag other) {
this();
this.codMart = other.codMart;
this.partitaMag = other.partitaMag;
this.descrizione = other.descrizione;
this.dataIns = other.dataIns; // LocalDateTime è immutabile
this.dataScad = other.dataScad; // LocalDate è immutabile
this.scelta = other.scelta;
this.costoUntUmMag = other.costoUntUmMag; // BigDecimal è immutabile
this.valUntUmMag = other.valUntUmMag;
this.taraCnfKg = other.taraCnfKg;
this.qtaCnf = other.qtaCnf;
this.flagImballoArendere = other.flagImballoArendere;
this.flagStato = other.flagStato;
this.codDiviCont = other.codDiviCont;
this.cambioDiviCont = other.cambioDiviCont;
this.barcode = other.barcode;
this.note = other.note;
this.rapConv2 = other.rapConv2;
this.rapConv3 = other.rapConv3;
this.posizione = other.posizione;
this.dataAggPrz = other.dataAggPrz;
this.partitaMagSec = other.partitaMagSec;
this.qtaAttesa = other.qtaAttesa;
}
public String getCodMart() {

View File

@@ -15,6 +15,18 @@ public class MtbUntMis extends EntityBase {
this.type = "mtb_unt_mis";
}
// Costruttore di copia
public MtbUntMis(MtbUntMis other) {
this();
this.untMis = other.untMis;
this.flagDig = other.flagDig;
this.cifreDec = other.cifreDec; // BigDecimal è immutabile
this.tipoUm = other.tipoUm;
this.flagUnitaKg = other.flagUnitaKg;
this.flagAttivo = other.flagAttivo;
}
public String getUntMis() {
return untMis;
}

View File

@@ -4,7 +4,6 @@ import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.core.utility.UtilityNumber;
import it.integry.integrywmsnative.core.utility.UtilityString;
@@ -306,7 +305,7 @@ public class MvwSitArtUdcDetInventario {
return new MtbColr()
.setCodJcom(getCodJcom())
.setCodMart(getCodMart())
.setDataCollo(UtilityDate.toDate(getDataCollo()))
.setDataCollo(getDataCollo())
.setNumCollo(getNumCollo())
.setSerCollo(getSerCollo())
.setGestione(getGestione())

View File

@@ -3,7 +3,7 @@ package it.integry.integrywmsnative.core.model.dto;
import it.integry.integrywmsnative.core.model.MtbColt;
public class AlreadyRegisteredUDCDTO {
public class AlreadyRegisteredUlDTO {
private MtbColt mtbColt;
@@ -13,7 +13,7 @@ public class AlreadyRegisteredUDCDTO {
return mtbColt;
}
public AlreadyRegisteredUDCDTO setMtbColt(MtbColt mtbColt) {
public AlreadyRegisteredUlDTO setMtbColt(MtbColt mtbColt) {
this.mtbColt = mtbColt;
return this;
}
@@ -22,7 +22,7 @@ public class AlreadyRegisteredUDCDTO {
return canBeRecovered;
}
public AlreadyRegisteredUDCDTO setCanBeRecovered(boolean canBeRecovered) {
public AlreadyRegisteredUlDTO setCanBeRecovered(boolean canBeRecovered) {
this.canBeRecovered = canBeRecovered;
return this;
}

View File

@@ -28,7 +28,7 @@ public class AuthInterceptor implements Interceptor {
public Response intercept(@NonNull Chain chain) throws IOException {
var originalRequest = chain.request();
if (SettingsManager.i().getUserSession() != null) {
if (SettingsManager.i().getUserSession() != null && SettingsManager.i().getUserSession().getAccessToken() != null) {
var accessToken = SettingsManager.i().getUserSession().getAccessToken();
var accessTokenExpiryDate = SettingsManager.i().getUserSession().getAccessTokenExpiryDate();
@@ -55,21 +55,22 @@ public class AuthInterceptor implements Interceptor {
.protocol(Protocol.HTTP_1_1)
.code(401)
.message("Unauthorized")
.body(ResponseBody.create(new byte[0], null))
.body(ResponseBody.create(okhttp3.MediaType.get("application/json"), new byte[0]))
.build();
} catch (Exception e) {
return chain.proceed(originalRequest);
}
//Retrieve the new access token after refresh
accessToken = SettingsManager.i().getUserSession().getAccessToken();
}
// Add the access token to the request header
var authorizedRequest = originalRequest.newBuilder()
.header("Authorization", "Bearer " + SettingsManager.i().getUserSession().getAccessToken())
.build();
// Add the access token to the request header
var authorizedRequest = originalRequest.newBuilder()
.header("Authorization", "Bearer " + accessToken)
.build();
return chain.proceed(authorizedRequest);
} else
return chain.proceed(originalRequest);
return chain.proceed(authorizedRequest);
} else
return chain.proceed(originalRequest);
}

View File

@@ -3,7 +3,7 @@ package it.integry.integrywmsnative.core.rest;
import java.io.IOException;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.core.utility.UtilityString;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
@@ -18,30 +18,28 @@ public class HttpInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
final String PROFILE_DB = SettingsManager.i().getUserSession() == null ? null : SettingsManager.i().getUserSession().getProfileDB();
final String APP_TOKEN = "fa3a21af-606b-4129-a22b-aedc2a52c7b6";
final String PROFILE_DB = SettingsManager.i().getUserSession() == null ? null : SettingsManager.i().getUserSession().getProfileDB();
final String APP_TOKEN = "fa3a21af-606b-4129-a22b-aedc2a52c7b6";
final Request request = chain.request();
final HttpUrl url = request.url().newBuilder()
.addQueryParameter("profileDb", PROFILE_DB)
.build();
HttpUrl.Builder urlBuilder = chain.request().url().newBuilder();
Request.Builder builder = chain.request().newBuilder()
if (!UtilityString.isNullOrEmpty(PROFILE_DB))
urlBuilder
.addQueryParameter("profileDb", PROFILE_DB);
HttpUrl url = urlBuilder.build();
final Request.Builder requestBuilder = chain.request().newBuilder();
Request.Builder builder = requestBuilder
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "*/*")
.addHeader("x-app-token", APP_TOKEN);
String accessToken = null;
//Nel caso in cui il token è scaduto e devo richiamare la refresh non bisogna passare il vecchio token
if(SettingsManager.i().getUserSession().getAccessTokenExpiryDate() != null &&
UtilityDate.getNowTime().isBefore(SettingsManager.i().getUserSession().getAccessTokenExpiryDate())) {
accessToken = SettingsManager.i().getUserSession().getAccessToken();
}
if(accessToken != null)
builder.header("Authorization", "Bearer " + accessToken);
if (SettingsManager.i().getUserSession() != null &&
SettingsManager.i().getUserSession().getDepo() != null &&
!UtilityString.isNullOrEmpty(SettingsManager.i().getUserSession().getDepo().getCodMdep()))
builder.addHeader("codMdep", SettingsManager.i().getUserSession().getDepo().getCodMdep());
var newRequest = builder
.url(url)

View File

@@ -37,29 +37,32 @@ public class RESTBuilder {
}
public <T> T getService(final Class<T> service, int timeout) {
return getService(service, SettingsManager.i().getServer().getProtocol(), SettingsManager.i().getServer().getHost(), SettingsManager.i().getServer().getPort(), true, true, timeout);
return getService(service, SettingsManager.i().getServer().getProtocol(), SettingsManager.i().getServer().getHost(), SettingsManager.i().getServer().getPort(), true, timeout);
}
public <T> T getService(final Class<T> service, String protocol, String host, int port, boolean addInterceptors) {
return getService(service, protocol, host, port, addInterceptors, true, 60);
public <T> T getService(final Class<T> service, String protocol, String host, int port) {
return getService(service, protocol, host, port, true, 60);
}
public <T> T getService(final Class<T> service, String protocol, String host, int port, boolean addInterceptors, boolean addEmsApi) {
return getService(service, protocol, host, port, addInterceptors, addEmsApi, 60);
public <T> T getService(final Class<T> service, String protocol, String host, int port, boolean addEmsApi) {
return getService(service, protocol, host, port, addEmsApi, 60);
}
public <T> T getService(final Class<T> service, String protocol, String host, int port, boolean addInterceptors, boolean addEmsApi, int timeout) {
public <T> T getService(final Class<T> service, String protocol, String host, int port, boolean addEmsApi, int timeout) {
OkHttpClient.Builder clientBuilder = getDefaultHttpClient();
timeout = 0;
clientBuilder.connectTimeout(timeout, TimeUnit.SECONDS);
clientBuilder.readTimeout(timeout, TimeUnit.SECONDS);
clientBuilder.writeTimeout(timeout, TimeUnit.SECONDS);
clientBuilder.callTimeout(timeout, TimeUnit.SECONDS);
clientBuilder.retryOnConnectionFailure(true);
clientBuilder.addInterceptor(authInterceptor);
if (addInterceptors) clientBuilder.addInterceptor(new HttpInterceptor());
clientBuilder.addInterceptor(new HttpInterceptor());
if (ADD_LOGGER_INTERCEPTOR) clientBuilder.addInterceptor(new HttpLoggerInterceptor());
OkHttpClient client = clientBuilder.build();

View File

@@ -10,6 +10,9 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
import javax.inject.Singleton;
@@ -26,7 +29,6 @@ import it.integry.integrywmsnative.core.rest.model.articolo.RetrieveArticoloByCo
import it.integry.integrywmsnative.core.rest.model.articolo.SaveArticoloRequestDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.SaveArticoloResponseDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.SearchArticoloByBarcodeRequestDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.SearchArticoloByBarcodeResponseDTO;
import it.integry.integrywmsnative.core.rest.model.articolo.UpdateBarcodeImballoRequestDTO;
import it.integry.integrywmsnative.core.utility.UtilityQuery;
import retrofit2.Call;
@@ -36,10 +38,12 @@ import retrofit2.Response;
public class ArticoloRESTConsumer extends _BaseRESTConsumer {
private final RESTBuilder restBuilder;
private final ExecutorService executorService;
private final SystemRESTConsumer systemRESTConsumer;
public ArticoloRESTConsumer(RESTBuilder restBuilder, SystemRESTConsumer systemRESTConsumer) {
public ArticoloRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService, SystemRESTConsumer systemRESTConsumer) {
this.restBuilder = restBuilder;
this.executorService = executorService;
this.systemRESTConsumer = systemRESTConsumer;
}
@@ -78,31 +82,33 @@ public class ArticoloRESTConsumer extends _BaseRESTConsumer {
});
}
public void searchByBarcode(String barcodeProd, RunnableArgs<List<MtbAart>> onComplete, RunnableArgs<Exception> onFailed) {
public List<MtbAart> searchByBarcodeSynchronized(String barcodeProd) throws Exception {
ArticoloRESTConsumerService articoloRESTConsumerService = restBuilder.getService(ArticoloRESTConsumerService.class);
var request = new SearchArticoloByBarcodeRequestDTO()
.setBarcode(barcodeProd)
.setOnlyActive(true);
articoloRESTConsumerService
var response = articoloRESTConsumerService
.searchByBarcode(request)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<SearchArticoloByBarcodeResponseDTO>> call, Response<ServiceRESTResponse<SearchArticoloByBarcodeResponseDTO>> response) {
analyzeAnswer(response, "searchByBarcode", (m) -> {
onComplete.run(response.body().getDto().getArts());
}, onFailed);
}
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<SearchArticoloByBarcodeResponseDTO>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
analyzeAnswer(response, "searchByBarcode");
return response.body().getDto().getArts();
}
public void findIfIsKit(MtbAart mtbAart, RunnableArgs<MtbAart> onComplete, RunnableArgs<Exception> onFailed){
public void searchByBarcode(String barcodeProd, RunnableArgs<List<MtbAart>> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var mtbAarts = searchByBarcodeSynchronized(barcodeProd);
if (onComplete != null) onComplete.run(mtbAarts);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public void findIfIsKit(MtbAart mtbAart, RunnableArgs<MtbAart> onComplete, RunnableArgs<Exception> onFailed) {
ArticoloRESTConsumerService articoloRESTConsumerService = restBuilder.getService(ArticoloRESTConsumerService.class);
articoloRESTConsumerService
@@ -122,45 +128,47 @@ public class ArticoloRESTConsumer extends _BaseRESTConsumer {
});
}
public void getByCodMarts(List<String> codMartToFind, RunnableArgs<List<MtbAart>> onComplete, RunnableArgs<Exception> onFailed) {
var codMarts = Stream.of(codMartToFind)
.withoutNulls()
.distinct().toList();
public List<MtbAart> getByCodMartsSynchronized(List<String> codMartToFind) throws Exception {
var codMarts = codMartToFind.parallelStream()
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toUnmodifiableList());
ArticoloRESTConsumerService articoloRESTConsumer = restBuilder.getService(ArticoloRESTConsumerService.class);
articoloRESTConsumer
var response = articoloRESTConsumer
.getByCodMart(new RetrieveArticoloByCodMartRequestDTO()
.setCodMarts(codMarts))
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<List<MtbAart>>> call, Response<ServiceRESTResponse<List<MtbAart>>> response) {
analyzeAnswer(response, "getByCodMart", onComplete, onFailed);
}
.execute();
return analyzeAnswer(response, "getByCodMart");
}
@Override
public void onFailure(Call<ServiceRESTResponse<List<MtbAart>>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
public void getByCodMarts(List<String> codMartToFind, RunnableArgs<List<MtbAart>> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var mtbAarts = getByCodMartsSynchronized(codMartToFind);
if (onComplete != null) onComplete.run(mtbAarts);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public List<StatoArticoloDTO> getStatoPartitaSynchronized(String codMart, String partitaMag) throws Exception {
ArticoloRESTConsumerService articoloRESTConsumer = restBuilder.getService(ArticoloRESTConsumerService.class);
var response = articoloRESTConsumer.getStatoPartita(codMart, partitaMag).execute();
var data = analyzeAnswer(response, "getStatoPartita");
return data;
}
public void getStatoPartita(String codMart, String partitaMag, RunnableArgs<List<StatoArticoloDTO>> onComplete, RunnableArgs<Exception> onFailed) {
ArticoloRESTConsumerService articoloRESTConsumer = restBuilder.getService(ArticoloRESTConsumerService.class);
articoloRESTConsumer.getStatoPartita(codMart, partitaMag).enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<List<StatoArticoloDTO>>> call, Response<ServiceRESTResponse<List<StatoArticoloDTO>>> response) {
analyzeAnswer(response, "getStatoPartita", onComplete, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<List<StatoArticoloDTO>>> call, @NonNull final Exception e) {
onFailed.run(e);
executorService.execute(() -> {
try {
var response = getStatoPartitaSynchronized(codMart, partitaMag);
if (onComplete != null) onComplete.run(response);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
@@ -172,7 +180,7 @@ public class ArticoloRESTConsumer extends _BaseRESTConsumer {
}
public void getArtsGroups(List<String> groupsToFind, RunnableArgs<List<MtbGrup>> onComplete, RunnableArgs<Exception> onFailed) {
public List<MtbGrup> getArtsGroupsSynchronized(List<String> groupsToFind) throws Exception {
var whereCondMap = Stream.of(groupsToFind)
.map(x -> {
HashMap<String, Object> vars = new HashMap<>();
@@ -186,29 +194,30 @@ public class ArticoloRESTConsumer extends _BaseRESTConsumer {
Type typeOfObjectsList = new TypeToken<ArrayList<MtbGrup>>() {
}.getType();
this.systemRESTConsumer.processSql("SELECT * FROM mtb_grup " + whereCond, typeOfObjectsList, onComplete, onFailed);
return this.systemRESTConsumer.processSqlSynchronized("SELECT * FROM mtb_grup " + whereCond, typeOfObjectsList);
}
public void getUntMisArts(List<String> inputUntMis, RunnableArgs<List<MtbUntMis>> onComplete, RunnableArgs<Exception> onFailed) {
List<HashMap<String, Object>> whereCondList = Stream.of(inputUntMis)
public List<MtbUntMis> getUntMisArtsSynchronized(List<String> inputUntMis) throws Exception {
List<HashMap<String, Object>> whereCondList = inputUntMis.parallelStream()
.distinct()
.withoutNulls()
.filter(Objects::nonNull)
.map(x -> {
HashMap<String, Object> data = new HashMap<>();
data.put("unt_mis", x);
return data;
})
.toList();
.collect(Collectors.toUnmodifiableList());
var whereCond = whereCondList.isEmpty() ? "" : " WHERE " + UtilityQuery.concatFieldListInWhereCond(whereCondList);
Type typeOfObjectsList = new TypeToken<ArrayList<MtbUntMis>>() {
}.getType();
this.systemRESTConsumer.processSql("SELECT * FROM mtb_unt_mis " + whereCond, typeOfObjectsList, onComplete, onFailed);
return this.systemRESTConsumer.processSqlSynchronized("SELECT * FROM mtb_unt_mis " + whereCond, typeOfObjectsList);
}
public void fillMtbAartsWithMtbUntMis(List<MtbAart> inputMtbAart, RunnableArgs<List<MtbAart>> onComplete, RunnableArgs<Exception> onFailed) {
public List<MtbAart> fillMtbAartsWithMtbUntMisSynchronized(List<MtbAart> inputMtbAart) throws Exception {
var inputUntMis = new ArrayList<String>();
if (inputMtbAart != null && !inputMtbAart.isEmpty()) {
@@ -220,21 +229,23 @@ public class ArticoloRESTConsumer extends _BaseRESTConsumer {
}
if (inputUntMis.isEmpty()) {
onComplete.run(inputMtbAart);
return;
return inputMtbAart;
}
getUntMisArts(inputUntMis, mtbUntMiss -> {
for (var item : inputMtbAart) {
var mtbUntMis = Stream.of(mtbUntMiss).filter(x -> x.getUntMis().equalsIgnoreCase(item.getUntMis()))
.findFirstOrElse(null);
var mtbUntMiss = getUntMisArtsSynchronized(inputUntMis);
if (mtbUntMis != null)
item.setMtbUntMis(Collections.singletonList(mtbUntMis));
}
for (var item : inputMtbAart) {
var mtbUntMis = mtbUntMiss.stream()
.filter(x -> x.getUntMis().equalsIgnoreCase(item.getUntMis()))
.findFirst()
.orElse(null);
if (mtbUntMis != null)
item.setMtbUntMis(Collections.singletonList(mtbUntMis));
}
return inputMtbAart;
onComplete.run(inputMtbAart);
}, onFailed);
}

View File

@@ -1,16 +1,9 @@
package it.integry.integrywmsnative.core.rest.consumers;
import androidx.annotation.NonNull;
import javax.inject.Singleton;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.model.Azienda;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.handler.ManagedErrorCallback;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import retrofit2.Call;
import retrofit2.Response;
@Singleton
public class AziendaRESTConsumer extends _BaseRESTConsumer {
@@ -21,19 +14,12 @@ public class AziendaRESTConsumer extends _BaseRESTConsumer {
this.restBuilder = restBuilder;
}
public void retrieveAzienda(RunnableArgs<Azienda> onComplete, RunnableArgs<Exception> onFailed) {
public Azienda retrieveAziendaSynchronized() throws Exception {
AziendaRESTConsumerService aziendaRESTConsumerService = restBuilder.getService(AziendaRESTConsumerService.class);
aziendaRESTConsumerService.retrieveDefaultAzienda().enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<Azienda>> call, Response<ServiceRESTResponse<Azienda>> response) {
analyzeAnswer(response, "Retrieve default azienda", onComplete, onFailed);
}
var response = aziendaRESTConsumerService.retrieveDefaultAzienda()
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<Azienda>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
return analyzeAnswer(response, "Retrieve default azienda");
}
}

View File

@@ -16,6 +16,10 @@ public class BarcodeRESTConsumer extends _BaseRESTConsumer {
this.ean128Service = ean128Service;
}
public Ean128Model decodeEan128Synchronized(BarcodeScanDTO barcodeScanDTO) throws Exception {
return this.ean128Service.decode(barcodeScanDTO);
}
public void decodeEan128(BarcodeScanDTO barcodeObj, RunnableArgs<Ean128Model> onComplete, RunnableArgs<Exception> onFailed) {
try {
onComplete.run(this.ean128Service.decode(barcodeObj));

View File

@@ -3,6 +3,7 @@ package it.integry.integrywmsnative.core.rest.consumers;
import androidx.annotation.NonNull;
import java.math.BigDecimal;
import java.util.concurrent.ExecutorService;
import javax.inject.Singleton;
@@ -27,10 +28,8 @@ import it.integry.integrywmsnative.core.rest.model.uds.CloseUDSRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.CloseUDSResponseDTO;
import it.integry.integrywmsnative.core.rest.model.uds.CreateUDSFromArtRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.CreateUDSRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.CreateUDSResponseDTO;
import it.integry.integrywmsnative.core.rest.model.uds.DeleteUDSRowRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.EditUDSRowRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.EditUDSRowResponseDTO;
import it.integry.integrywmsnative.core.rest.model.uds.InsertUDCRowRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.InsertUDCRowResponseDTO;
import it.integry.integrywmsnative.core.rest.model.uds.InsertUDSRowRequestDTO;
@@ -44,10 +43,12 @@ public class ColliLavorazioneRESTConsumer extends _BaseRESTConsumer implements C
private final RESTBuilder restBuilder;
private final ExecutorService executorService;
private final SettingsManager settingsManager;
public ColliLavorazioneRESTConsumer(RESTBuilder restBuilder, SettingsManager settingsManager) {
public ColliLavorazioneRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService, SettingsManager settingsManager) {
this.restBuilder = restBuilder;
this.executorService = executorService;
this.settingsManager = settingsManager;
}
@@ -123,93 +124,111 @@ public class ColliLavorazioneRESTConsumer extends _BaseRESTConsumer implements C
});
}
public void createUDS(CreateUDSRequestDTO createUDSRequestDTO, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed) {
public MtbColt createUDSSynchronized(CreateUDSRequestDTO createUDSRequestDTO) throws Exception {
ColliLavorazioneRESTConsumerService colliLavorazioneRESTConsumerService = restBuilder.getService(ColliLavorazioneRESTConsumerService.class);
colliLavorazioneRESTConsumerService.createUDS(createUDSRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<CreateUDSResponseDTO>> call, Response<ServiceRESTResponse<CreateUDSResponseDTO>> response) {
analyzeAnswer(response, "lavorazione/createUDS", data -> onComplete.run(data.getMtbColt()), onFailed);
}
var response = colliLavorazioneRESTConsumerService.createUDS(createUDSRequestDTO)
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<CreateUDSResponseDTO>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
var data = analyzeAnswer(response, "lavorazione/createUDS");
return data.getMtbColt();
}
public void createUDS(CreateUDSRequestDTO createUDSRequestDTO, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var response = createUDSSynchronized(createUDSRequestDTO);
if (onComplete != null) onComplete.run(response);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public CloseUDSResponseDTO closeUDSSynchronized(CloseUDSRequestDTO closeUDSRequestDTO) throws Exception {
ColliLavorazioneRESTConsumerService colliLavorazioneRESTConsumerService = restBuilder.getService(ColliLavorazioneRESTConsumerService.class);
var response = colliLavorazioneRESTConsumerService.closeUDS(closeUDSRequestDTO)
.execute();
var data = analyzeAnswer(response, "lavorazione/closeUDS");
return data;
}
public void closeUDS(CloseUDSRequestDTO closeUDSRequestDTO, RunnableArgs<CloseUDSResponseDTO> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var response = closeUDSSynchronized(closeUDSRequestDTO);
if (onComplete != null) onComplete.run(response);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
@Override
public void closeUDS(CloseUDSRequestDTO closeUDSRequestDTO, RunnableArgs<CloseUDSResponseDTO> onComplete, RunnableArgs<Exception> onFailed) {
public MtbColr insertUDSRowSynchronized(InsertUDSRowRequestDTO insertUDSRowRequestDTO) throws Exception {
ColliLavorazioneRESTConsumerService colliLavorazioneRESTConsumerService = restBuilder.getService(ColliLavorazioneRESTConsumerService.class);
colliLavorazioneRESTConsumerService.closeUDS(closeUDSRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<CloseUDSResponseDTO>> call, Response<ServiceRESTResponse<CloseUDSResponseDTO>> response) {
analyzeAnswer(response, "lavorazione/closeUDS", onComplete, onFailed);
}
Response<ServiceRESTResponse<InsertUDSRowResponseDTO>> response = colliLavorazioneRESTConsumerService.insertUDSRow(insertUDSRowRequestDTO)
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<CloseUDSResponseDTO>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
var data = analyzeAnswer(response, "lavorazione/insertUDSRow");
return data.getSavedMtbColr();
}
@Override
public void insertUDSRow(InsertUDSRowRequestDTO insertUDSRowRequestDTO, RunnableArgs<MtbColr> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var response = insertUDSRowSynchronized(insertUDSRowRequestDTO);
if (onComplete != null) onComplete.run(response);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public MtbColr editUDSRowSynchronized(EditUDSRowRequestDTO editUDSRowRequestDTO) throws Exception {
ColliLavorazioneRESTConsumerService colliLavorazioneRESTConsumerService = restBuilder.getService(ColliLavorazioneRESTConsumerService.class);
colliLavorazioneRESTConsumerService.insertUDSRow(insertUDSRowRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<InsertUDSRowResponseDTO>> call, Response<ServiceRESTResponse<InsertUDSRowResponseDTO>> response) {
analyzeAnswer(response, "lavorazione/insertUDSRow", data -> onComplete.run(data.getSavedMtbColr()), onFailed);
}
var response = colliLavorazioneRESTConsumerService.editUDSRow(editUDSRowRequestDTO)
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<InsertUDSRowResponseDTO>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
var data = analyzeAnswer(response, "lavorazione/editUDSRow");
return data.getSavedMtbColr();
}
public void editUDSRow(EditUDSRowRequestDTO editUDSRowRequestDTO, RunnableArgs<MtbColr> onComplete, RunnableArgs<Exception> onFailed) {
ColliLavorazioneRESTConsumerService colliLavorazioneRESTConsumerService = restBuilder.getService(ColliLavorazioneRESTConsumerService.class);
colliLavorazioneRESTConsumerService.editUDSRow(editUDSRowRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<EditUDSRowResponseDTO>> call, Response<ServiceRESTResponse<EditUDSRowResponseDTO>> response) {
analyzeAnswer(response, "lavorazione/editUDSRow", data -> onComplete.run(data.getSavedMtbColr()), onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<EditUDSRowResponseDTO>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
executorService.execute(() -> {
try {
var response = editUDSRowSynchronized(editUDSRowRequestDTO);
if (onComplete != null) onComplete.run(response);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
@Override
public void deleteUDSRow(DeleteUDSRowRequestDTO deleteUDSRowRequestDTO, Runnable onComplete, RunnableArgs<Exception> onFailed) {
public void deleteUDSRowSynchronized(DeleteUDSRowRequestDTO deleteUDSRowRequestDTO) throws Exception {
ColliLavorazioneRESTConsumerService colliLavorazioneRESTConsumerService = restBuilder.getService(ColliLavorazioneRESTConsumerService.class);
colliLavorazioneRESTConsumerService.deleteUDSRow(deleteUDSRowRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<Void>> call, Response<ServiceRESTResponse<Void>> response) {
analyzeAnswer(response, "lavorazione/deleteUDSRow", data -> onComplete.run(), onFailed);
}
var response = colliLavorazioneRESTConsumerService.deleteUDSRow(deleteUDSRowRequestDTO)
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<Void>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
analyzeAnswer(response, "lavorazione/deleteUDSRow");
}
public void deleteUDSRow(DeleteUDSRowRequestDTO deleteUDSRowRequestDTO, Runnable onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
deleteUDSRowSynchronized(deleteUDSRowRequestDTO);
if (onComplete != null) onComplete.run();
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
@Override

View File

@@ -11,12 +11,14 @@ import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
import javax.inject.Singleton;
@@ -36,8 +38,8 @@ import it.integry.integrywmsnative.core.rest.handler.ManagedErrorCallback;
import it.integry.integrywmsnative.core.rest.model.RettificaULDTO;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.rest.model.SpostaArtsTraULRequestDTO;
import it.integry.integrywmsnative.core.rest.model.SpostaArtsTraULResponseDTO;
import it.integry.integrywmsnative.core.rest.model.SpostaULRequestDTO;
import it.integry.integrywmsnative.core.rest.model.UpdatePosizioneULRequestDTO;
import it.integry.integrywmsnative.core.rest.model.UpdateTipoULRequestDTO;
import it.integry.integrywmsnative.core.rest.model.VersamentoAutomaticoULResponseDTO;
import it.integry.integrywmsnative.core.rest.model.uds.CanULBeDeletedRequestDTO;
@@ -60,8 +62,9 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
private final ArticoloRESTConsumer mArticoloRESTConsumer;
private final EntityRESTConsumer mEntityRESTConsumer;
private final SettingsManager mSettingsManager;
private final ExecutorService executorService;
public ColliMagazzinoRESTConsumer(RESTBuilder restBuilder, SystemRESTConsumer systemRESTConsumer,
public ColliMagazzinoRESTConsumer(ExecutorService executorService, RESTBuilder restBuilder, SystemRESTConsumer systemRESTConsumer,
ArticoloRESTConsumer articoloRESTConsumer,
EntityRESTConsumer entityRESTConsumer,
SettingsManager settingsManager) {
@@ -70,38 +73,36 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
this.mArticoloRESTConsumer = articoloRESTConsumer;
this.mEntityRESTConsumer = entityRESTConsumer;
this.mSettingsManager = settingsManager;
this.executorService = executorService;
}
public void saveCollo(MtbColt mtbColtToSave, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed) {
public MtbColt saveColloSynchronized(MtbColt mtbColtToSave) throws Exception {
MtbColt mtbColtToSaveClone = (MtbColt) mtbColtToSave.clone();
mtbColtToSaveClone.setOperation(CommonModelConsts.OPERATION.INSERT_OR_UPDATE);
mtbColtToSaveClone.setOnlyPkMaster(false);
mtbColtToSaveClone.setMtbColr(new ObservableArrayList<>());
for (int i = 0; i < mtbColtToSave.getMtbColr().size(); i++) {
mtbColtToSaveClone.getMtbColr().add(
((MtbColr) mtbColtToSave.getMtbColr().get(i).clone())
.setMtbAart(null)
.setMtbPartitaMag(null));
mtbColtToSaveClone.getMtbColr().get(i)
.setMtbAart(null)
.setMtbPartitaMag(null);
}
this.mEntityRESTConsumer.processEntity(mtbColtToSaveClone, new ISimpleOperationCallback<>() {
@Override
public void onSuccess(MtbColt value) {
if (onComplete != null) onComplete.run(value);
}
return this.mEntityRESTConsumer.processEntitySynchronized(mtbColtToSaveClone, MtbColt.class);
}
@Override
public void onFailed(Exception ex) {
public void saveCollo(MtbColt mtbColtToSave, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var mtbColt = saveColloSynchronized(mtbColtToSave);
if (onComplete != null) onComplete.run(mtbColt);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
}, MtbColt.class);
});
}
public void saveColli(List<MtbColt> mtbColtsToSave, RunnableArgs<List<MtbColt>> onComplete, RunnableArgs<Exception> onFailed) {
public List<MtbColt> saveColliSynchronized(List<MtbColt> mtbColtsToSave) throws Exception {
for (MtbColt mtbColt : mtbColtsToSave) {
for (int i = 0; i < mtbColt.getMtbColr().size(); i++) {
@@ -111,28 +112,22 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
}
}
this.mEntityRESTConsumer.processEntityList(mtbColtsToSave, true, MtbColt.class, onComplete, onFailed);
}
public void createColloLavorazione(int segno, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed) {
MtbColt mtbColtToCreate = new MtbColt()
.setSegno(segno);
mtbColtToCreate.initDefaultFields(GestioneEnum.LAVORAZIONE);
mtbColtToCreate
.setOperation(CommonModelConsts.OPERATION.INSERT);
saveCollo(mtbColtToCreate, value -> {
if (onComplete != null) onComplete.run(value);
}, ex -> {
if (onFailed != null) onFailed.run(ex);
});
return this.mEntityRESTConsumer.processEntityListSynchronized(mtbColtsToSave, true, MtbColt.class);
}
public void createColloScaricoDaCarico(MtbColt sourceMtbColt, MtbDepoPosizione posizione, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var mtbColt = createColloScaricoDaCaricoSynchronized(sourceMtbColt, posizione);
if (onComplete != null) onComplete.run(mtbColt);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public MtbColt createColloScaricoDaCaricoSynchronized(MtbColt sourceMtbColt, MtbDepoPosizione posizione) throws Exception {
MtbColt newMtbColt = new MtbColt()
.initDefaultFields(GestioneEnum.LAVORAZIONE)
@@ -166,11 +161,11 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
mtbColrClone
.setNumCollo(null)
.setDataCollo((String) null)
.setDataCollo((LocalDate) null)
.setRiga(null)
.setGestione(GestioneEnum.LAVORAZIONE)
.setDataColloRif(sourceMtbColt.getDataColloD())
.setDataColloRif(sourceMtbColt.getDataColloLD())
.setNumColloRif(sourceMtbColt.getNumCollo())
.setGestioneRif(sourceMtbColt.getGestione())
.setSerColloRif(sourceMtbColt.getSerCollo())
@@ -181,7 +176,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
}
saveCollo(newMtbColt, onComplete, onFailed);
return saveColloSynchronized(newMtbColt);
}
@@ -212,7 +207,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
}
// if (sourceMtbColt.getMtbColr().size() != 1) {
// if (sourceMtbColt.getMtbColr().getValue().size() != 1) {
// onFailed.run(new Exception());
// return;
// }
@@ -220,10 +215,10 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
MtbColr mtbColrClone = new MtbColr();
mtbColrClone
.setNumCollo(null)
.setDataCollo((String) null)
.setDataCollo((LocalDate) null)
.setRiga(null)
.setGestione(GestioneEnum.LAVORAZIONE)
.setDataColloRif(sourceMtbColt.getDataColloD())
.setDataColloRif(sourceMtbColt.getDataColloLD())
.setNumColloRif(sourceMtbColt.getNumCollo())
.setGestioneRif(sourceMtbColt.getGestione())
.setSerColloRif(sourceMtbColt.getSerCollo())
@@ -288,32 +283,34 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
saveCollo(mtbColtToCreate, onComplete, onFailed);
}
public void getBySSCC(String ssccString, boolean onlyResiduo, boolean throwExcIfNull, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed) {
public MtbColt getBySsccSynchronized(String ssccString, boolean onlyResiduo, boolean throwExcIfNull) throws Exception {
ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = restBuilder.getService(ColliMagazzinoRESTConsumerService.class);
colliMagazzinoRESTConsumerService.getColloByBarcode(ssccString, onlyResiduo, throwExcIfNull).enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<MtbColt>> call, Response<ServiceRESTResponse<MtbColt>> response) {
analyzeAnswer(response, "GetBySSCC", mtbColt -> {
var colloResponse = colliMagazzinoRESTConsumerService.getColloByBarcode(ssccString, onlyResiduo, throwExcIfNull)
.execute();
var mtbColt = analyzeAnswer(colloResponse, "GetBySSCC");
if (mtbColt != null && mtbColt.getMtbColr() != null && !mtbColt.getMtbColr().isEmpty()) {
List<MtbColt> mtbColtList = new ArrayList<>();
mtbColtList.add(mtbColt);
fillMtbAartsOfMtbColts(mtbColtList, mtbColts -> onComplete.run(mtbColts.get(0)), onFailed);
} else {
onComplete.run(mtbColt);
}
if (mtbColt != null && mtbColt.getMtbColr() != null && !mtbColt.getMtbColr().isEmpty()) {
List<MtbColt> mtbColtList = new ArrayList<>();
mtbColtList.add(mtbColt);
var mtbColts = fillMtbAartsOfMtbColtsSynchronized(mtbColtList);
return mtbColts.get(0);
}
}, onFailed);
}
return mtbColt;
}
@Override
public void onFailure(Call<ServiceRESTResponse<MtbColt>> call, @NonNull final Exception e) {
onFailed.run(e);
public void getBySSCC(String ssccString, boolean onlyResiduo, boolean throwExcIfNull, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var mtbColt = getBySsccSynchronized(ssccString, onlyResiduo, throwExcIfNull);
if (onComplete != null) onComplete.run(mtbColt);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public void fillMtbAartsOfMtbColrs(List<MtbColr> mtbColrs, RunnableArgs<List<MtbColr>> onComplete, RunnableArgs<Exception> onFailed) {
public List<MtbColr> fillMtbAartsOfMtbColrsSynchronized(List<MtbColr> mtbColrs) throws Exception {
List<String> codMarts = new ArrayList<>(mtbColrs.stream()
.map(MtbColr::getCodMart)
@@ -321,14 +318,48 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
.distinct()
.collect(Collectors.toUnmodifiableList()));
mArticoloRESTConsumer.getByCodMarts(codMarts, arts -> {
var arts = mArticoloRESTConsumer.getByCodMartsSynchronized(codMarts);
if (arts != null && !arts.isEmpty()) {
for (MtbColr mtbColr : mtbColrs) {
if (arts != null && !arts.isEmpty()) {
for (MtbColr mtbColr : mtbColrs) {
MtbAart foundMtbAart = null;
List<MtbAart> mtbAartStream = arts.stream()
.filter(x -> x.getCodMart().equalsIgnoreCase(mtbColr.getCodMart()))
.collect(Collectors.toList());
if (!mtbAartStream.isEmpty()) {
foundMtbAart = mtbAartStream.get(0);
}
mtbColr.setMtbAart(foundMtbAart);
}
}
return mtbColrs;
}
public List<MtbColt> fillMtbAartsOfMtbColtsSynchronized(List<MtbColt> mtbColts) throws Exception {
List<String> codMarts = new ArrayList<>();
for (MtbColt mtbColt : mtbColts) {
codMarts.addAll(mtbColt.getMtbColr().stream()
.map(MtbColr::getCodMart)
.filter(x -> !UtilityString.isNullOrEmpty(x))
.distinct()
.collect(Collectors.toList()));
}
List<MtbAart> mtbAarts = mArticoloRESTConsumer.getByCodMartsSynchronized(codMarts);
for (MtbColt mtbColt : mtbColts) {
for (MtbColr mtbColr : mtbColt.getMtbColr()) {
if (mtbAarts != null && !mtbAarts.isEmpty()) {
MtbAart foundMtbAart = null;
List<MtbAart> mtbAartStream = arts.stream()
List<MtbAart> mtbAartStream = mtbAarts.parallelStream()
.filter(x -> x.getCodMart().equalsIgnoreCase(mtbColr.getCodMart()))
.collect(Collectors.toList());
@@ -338,52 +369,26 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
mtbColr.setMtbAart(foundMtbAart);
}
mtbColr.setGestione(mtbColt.getGestione());
mtbColr.setSerCollo(mtbColt.getSerCollo());
mtbColr.setNumCollo(mtbColt.getNumCollo());
mtbColr.setDataCollo(mtbColt.getDataColloLD());
}
}
onComplete.run(mtbColrs);
}, onFailed);
return mtbColts;
}
public void fillMtbAartsOfMtbColts(List<MtbColt> mtbColts, RunnableArgs<List<MtbColt>> onComplete, RunnableArgs<Exception> onFailed) {
List<String> codMarts = new ArrayList<>();
for (MtbColt mtbColt : mtbColts) {
codMarts.addAll(mtbColt.getMtbColr().stream()
.map(MtbColr::getCodMart)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toUnmodifiableList()));
}
mArticoloRESTConsumer.getByCodMarts(codMarts, arts -> {
if (arts != null && !arts.isEmpty()) {
for (MtbColt mtbColt : mtbColts) {
for (MtbColr mtbColr : mtbColt.getMtbColr()) {
MtbAart foundMtbAart = null;
List<MtbAart> mtbAartStream = arts.stream()
.filter(x -> x.getCodMart().equalsIgnoreCase(mtbColr.getCodMart()))
.collect(Collectors.toList());
if (!mtbAartStream.isEmpty()) {
foundMtbAart = mtbAartStream.get(0);
}
mtbColr.setMtbAart(foundMtbAart);
mtbColr.setGestione(mtbColt.getGestione());
mtbColr.setSerCollo(mtbColt.getSerCollo());
mtbColr.setNumCollo(mtbColt.getNumCollo());
mtbColr.setDataCollo(mtbColt.getDataColloS());
}
}
executorService.execute(() -> {
try {
List<MtbColt> returnedMtbColts = fillMtbAartsOfMtbColtsSynchronized(mtbColts);
if (onComplete != null) onComplete.run(returnedMtbColts);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
onComplete.run(mtbColts);
}, onFailed);
});
}
public void getMultipleByTestate(List<MtbColt> testate, boolean onlyResiduo, RunnableArgs<List<MtbColt>> onComplete, RunnableArgs<Exception> onFailed) {
@@ -404,7 +409,17 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
}
}
public void getByChiaveCollo(GestioneEnum gestione, int numCollo, String dataCollo, String serCollo, boolean onlyResiduo, boolean throwExcIfNull, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed) {
public MtbColt getByChiaveColloSynchronized(GestioneEnum gestione, int numCollo, LocalDate dataCollo, String serCollo, boolean onlyResiduo, boolean throwExcIfNull) throws Exception {
MtbColt mtbColtToRetrieve = new MtbColt()
.setGestione(gestione)
.setNumCollo(numCollo)
.setDataCollo(dataCollo)
.setSerCollo(serCollo);
return getByTestataSynchronized(mtbColtToRetrieve, onlyResiduo, throwExcIfNull);
}
public void getByChiaveCollo(GestioneEnum gestione, int numCollo, LocalDate dataCollo, String serCollo, boolean onlyResiduo, boolean throwExcIfNull, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed) {
MtbColt mtbColtToRetrieve = new MtbColt()
.setGestione(gestione)
.setNumCollo(numCollo)
@@ -414,36 +429,34 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
getByTestata(mtbColtToRetrieve, onlyResiduo, throwExcIfNull, onComplete, onFailed);
}
public void getByTestata(MtbColt testata, boolean onlyResiduo, boolean throwExcIfNull, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed) {
public MtbColt getByTestataSynchronized(MtbColt testata, boolean onlyResiduo, boolean throwExcIfNull) throws Exception {
testata.setMtbColr(new ObservableArrayList<>());
ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = restBuilder.getService(ColliMagazzinoRESTConsumerService.class);
colliMagazzinoRESTConsumerService.getColloInGiac(onlyResiduo, throwExcIfNull, testata)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<MtbColt>> call, Response<ServiceRESTResponse<MtbColt>> response) {
analyzeAnswer(response, "getColloInGiac", mtbColt -> {
var response = colliMagazzinoRESTConsumerService.getColloInGiac(onlyResiduo, throwExcIfNull, testata)
.execute();
var mtbColt = analyzeAnswer(response, "getColloInGiac");
if (mtbColt != null && mtbColt.getMtbColr() != null && !mtbColt.getMtbColr().isEmpty()) {
var mtbColts = fillMtbAartsOfMtbColtsSynchronized(Collections.singletonList(mtbColt));
return mtbColts.get(0);
}
if (mtbColt != null && mtbColt.getMtbColr() != null && !mtbColt.getMtbColr().isEmpty()) {
List<MtbColt> mtbColtList = new ArrayList<>();
mtbColtList.add(mtbColt);
fillMtbAartsOfMtbColts(mtbColtList, mtbColts -> onComplete.run(mtbColts.get(0)), onFailed);
} else {
onComplete.run(mtbColt);
}
}, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<MtbColt>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
return mtbColt;
}
public void spostaUL(MtbColt mtbColtToMove, String codMdep, String posizione, boolean createDocAutomatically, Runnable onComplete, RunnableArgs<Exception> onFailed) {
public void getByTestata(MtbColt testata, boolean onlyResiduo, boolean throwExcIfNull, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var data = getByTestataSynchronized(testata, onlyResiduo, throwExcIfNull);
if (onComplete != null) onComplete.run(data);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public void spostaUlSynchronized(MtbColt mtbColtToMove, String codMdep, String posizione, boolean createDocAutomatically) throws Exception {
MtbColt mtbColtToMoveClone = (MtbColt) mtbColtToMove.clone();
for (int i = 0; i < mtbColtToMoveClone.getMtbColr().size(); i++) {
@@ -459,21 +472,23 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
.setCreateDocAutomatically(createDocAutomatically);
ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = restBuilder.getService(ColliMagazzinoRESTConsumerService.class);
colliMagazzinoRESTConsumerService
Response<ServiceRESTResponse<Void>> response = colliMagazzinoRESTConsumerService
.spostaUL(spostaUlRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<Void>> call, Response<ServiceRESTResponse<Void>> response) {
analyzeAnswer(response, "spostaUL", mtbColts -> {
onComplete.run();
}, onFailed);
}
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<Void>> call, @NonNull final Exception e) {
if (onFailed != null) onFailed.run(e);
}
});
analyzeAnswer(response, "spostaUL");
}
public void spostaUL(MtbColt mtbColtToMove, String codMdep, String posizione, boolean createDocAutomatically, Runnable onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
spostaUlSynchronized(mtbColtToMove, codMdep, posizione, createDocAutomatically);
if (onComplete != null) onComplete.run();
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public void spostaUL(MtbColt mtbColtToMove, MtbDepoPosizione posizione, Runnable onComplete, RunnableArgs<Exception> onFailed) {
@@ -484,7 +499,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
spostaUL(mtbColtToMove, codMdep, posizioneString, true, onComplete, onFailed);
}
public void updateTipoUL(MtbColt mtbColt, String codTcol, Runnable onComplete, RunnableArgs<Exception> onFailed) {
public void updateTipoULSynchronized(MtbColt mtbColt, String codTcol) throws Exception {
MtbColt mtbColtClone = (MtbColt) mtbColt.clone();
mtbColtClone.setMtbColr(new ObservableArrayList<>());
@@ -494,22 +509,52 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
.setCodTcol(codTcol);
ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = restBuilder.getService(ColliMagazzinoRESTConsumerService.class);
colliMagazzinoRESTConsumerService
Response<ServiceRESTResponse<Void>> response = colliMagazzinoRESTConsumerService
.updateTipoUL(updateTipoULRequest)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<Void>> call, Response<ServiceRESTResponse<Void>> response) {
analyzeAnswer(response, "updateTipoUL", mtbColts -> {
onComplete.run();
}, onFailed);
}
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<Void>> call, @NonNull final Exception e) {
if (onFailed != null) onFailed.run(e);
}
});
analyzeAnswer(response, "updateTipoUL");
}
public void updateTipoUL(MtbColt mtbColt, String codTcol, Runnable onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
updateTipoULSynchronized(mtbColt, codTcol);
if (onComplete != null) onComplete.run();
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public void updatePosizioneULSynchronized(MtbColt mtbColt, String posizione) throws Exception {
MtbColt mtbColtClone = (MtbColt) mtbColt.clone();
mtbColtClone.setMtbColr(new ObservableArrayList<>());
UpdatePosizioneULRequestDTO updateTipoULRequest = new UpdatePosizioneULRequestDTO()
.setMtbColt(mtbColtClone)
.setPosizione(posizione);
ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = restBuilder.getService(ColliMagazzinoRESTConsumerService.class);
Response<ServiceRESTResponse<Void>> response = colliMagazzinoRESTConsumerService
.updatePosizioneUL(updateTipoULRequest)
.execute();
analyzeAnswer(response, "updatePosizioneUL");
}
public void updatePosizioneUL(MtbColt mtbColt, String posizione, Runnable onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
updatePosizioneULSynchronized(mtbColt, posizione);
if (onComplete != null) onComplete.run();
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public void updateDataFine(MtbColt mtbColt, Runnable onComplete, RunnableArgs<Exception> onFailed) {
@@ -572,44 +617,45 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
});
}
public void spostaArtsTraUL(MtbColt sourceMtbColt, MtbColt destMtbColt, boolean flagForceUseRefs, RunnableArgs<List<MtbColr>> onComplete, RunnableArgs<Exception> onFailed) {
new Thread(() -> {
MtbColt mtbColtToMoveClone = (MtbColt) sourceMtbColt.clone();
MtbColt mtbColtDestClone = (MtbColt) destMtbColt.clone();
public List<MtbColr> spostaArtsTraULSynchronized(MtbColt sourceMtbColt, MtbColt destMtbColt, boolean flagForceUseRefs) throws Exception {
MtbColt mtbColtToMoveClone = (MtbColt) sourceMtbColt.clone();
MtbColt mtbColtDestClone = (MtbColt) destMtbColt.clone();
for (int i = 0; i < mtbColtToMoveClone.getMtbColr().size(); i++) {
mtbColtToMoveClone.getMtbColr().get(i)
.setMtbAart(null)
.setMtbPartitaMag(null);
}
for (int i = 0; i < mtbColtToMoveClone.getMtbColr().size(); i++) {
mtbColtToMoveClone.getMtbColr().get(i)
.setMtbAart(null)
.setMtbPartitaMag(null);
}
mtbColtDestClone.setMtbColr(null);
mtbColtDestClone.setMtbColr(null);
SpostaArtsTraULRequestDTO spostaArtsTraULRequestDTO = new SpostaArtsTraULRequestDTO()
.setSourceMtbColt(mtbColtToMoveClone)
.setDestinationMtbColt(mtbColtDestClone)
.setFlagForceUseRefs(flagForceUseRefs);
SpostaArtsTraULRequestDTO spostaArtsTraULRequestDTO = new SpostaArtsTraULRequestDTO()
.setSourceMtbColt(mtbColtToMoveClone)
.setDestinationMtbColt(mtbColtDestClone)
.setFlagForceUseRefs(flagForceUseRefs);
ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = restBuilder.getService(ColliMagazzinoRESTConsumerService.class);
colliMagazzinoRESTConsumerService.spostaArtsTraUL(spostaArtsTraULRequestDTO).enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<SpostaArtsTraULResponseDTO>> call, Response<ServiceRESTResponse<SpostaArtsTraULResponseDTO>> response) {
analyzeAnswer(response, "spostaArtsTraUL", data -> {
ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = restBuilder.getService(ColliMagazzinoRESTConsumerService.class);
var response = colliMagazzinoRESTConsumerService.spostaArtsTraUL(spostaArtsTraULRequestDTO)
.execute();
fillMtbAartsOfMtbColrs(data.getGeneratedMtbColr(), onComplete, onFailed);
var data = analyzeAnswer(response, "spostaArtsTraUL");
var mtbColrs = fillMtbAartsOfMtbColrsSynchronized(data.getGeneratedMtbColr());
}, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<SpostaArtsTraULResponseDTO>> call, @NonNull final Exception e) {
if (onFailed != null) onFailed.run(e);
}
});
}).start();
return mtbColrs;
}
public void assegnaLottoSuColloScarico(MtbColt sourceMtbColt, Runnable onComplete, RunnableArgs<Exception> onFailed) {
public void spostaArtsTraUL(MtbColt sourceMtbColt, MtbColt destMtbColt, boolean flagForceUseRefs, RunnableArgs<List<MtbColr>> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var result = spostaArtsTraULSynchronized(sourceMtbColt, destMtbColt, flagForceUseRefs);
if (onComplete != null) onComplete.run(result);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public MtbColt assegnaLottoSuColloScaricoSynchronized(MtbColt sourceMtbColt) throws Exception {
MtbColt sourceMtbColtClone = (MtbColt) sourceMtbColt.clone();
for (int i = 0; i < sourceMtbColtClone.getMtbColr().size(); i++) {
@@ -619,17 +665,20 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
}
ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = restBuilder.getService(ColliMagazzinoRESTConsumerService.class);
colliMagazzinoRESTConsumerService.assegnaLottoSuColloScarico(sourceMtbColtClone).enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<MtbColt>> call, Response<ServiceRESTResponse<MtbColt>> response) {
analyzeAnswer(response, "assegnaLottoSuColloScarico", data -> {
onComplete.run();
}, onFailed);
}
var response = colliMagazzinoRESTConsumerService.assegnaLottoSuColloScarico(sourceMtbColtClone)
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<MtbColt>> call, @NonNull final Exception e) {
if (onFailed != null) onFailed.run(e);
var data = analyzeAnswer(response, "assegnaLottoSuColloScarico");
return data;
}
public void assegnaLottoSuColloScarico(MtbColt sourceMtbColt, Runnable onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var result = assegnaLottoSuColloScaricoSynchronized(sourceMtbColt);
if (onComplete != null) onComplete.run();
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
@@ -735,42 +784,48 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer {
}
public void canULBeDeleted(MtbColt mtbColt, RunnableArgs<Boolean> onComplete, RunnableArgs<Exception> onFailed) {
public Boolean canULBeDeletedSynchronized(MtbColt mtbColt) throws Exception {
CanULBeDeletedRequestDTO canULBeDeletedRequestDTO = new CanULBeDeletedRequestDTO()
.setMtbColt(mtbColt);
ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = restBuilder.getService(ColliMagazzinoRESTConsumerService.class);
colliMagazzinoRESTConsumerService.canULBeDeleted(canULBeDeletedRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<Boolean>> call, Response<ServiceRESTResponse<Boolean>> response) {
analyzeAnswer(response, "generic/canULBeDeleted", onComplete, onFailed);
}
var response = colliMagazzinoRESTConsumerService.canULBeDeleted(canULBeDeletedRequestDTO)
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<Boolean>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
var data = analyzeAnswer(response, "generic/canULBeDeleted");
return data;
}
public void canULBeDeleted(MtbColt mtbColt, RunnableArgs<Boolean> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var result = canULBeDeletedSynchronized(mtbColt);
if (onComplete != null) onComplete.run(result);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public void deleteULSynchronized(DeleteULRequestDTO deleteULRequestDTO) throws Exception {
ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = restBuilder.getService(ColliMagazzinoRESTConsumerService.class);
var response = colliMagazzinoRESTConsumerService.deleteUL(deleteULRequestDTO)
.execute();
analyzeAnswer(response, "generic/deleteUL");
}
public void deleteUL(DeleteULRequestDTO deleteULRequestDTO, Runnable onComplete, RunnableArgs<Exception> onFailed) {
ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = restBuilder.getService(ColliMagazzinoRESTConsumerService.class);
colliMagazzinoRESTConsumerService.deleteUL(deleteULRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<Void>> call, Response<ServiceRESTResponse<Void>> response) {
analyzeAnswer(response, "generic/deleteUL", Void -> onComplete.run(), onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<Void>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
executorService.execute(() -> {
try {
deleteULSynchronized(deleteULRequestDTO);
if (onComplete != null) onComplete.run();
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}

View File

@@ -9,6 +9,7 @@ import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.rest.model.SpostaArtsTraULRequestDTO;
import it.integry.integrywmsnative.core.rest.model.SpostaArtsTraULResponseDTO;
import it.integry.integrywmsnative.core.rest.model.SpostaULRequestDTO;
import it.integry.integrywmsnative.core.rest.model.UpdatePosizioneULRequestDTO;
import it.integry.integrywmsnative.core.rest.model.UpdateTipoULRequestDTO;
import it.integry.integrywmsnative.core.rest.model.VersamentoAutomaticoULResponseDTO;
import it.integry.integrywmsnative.core.rest.model.uds.CanULBeDeletedRequestDTO;
@@ -37,6 +38,9 @@ public interface ColliMagazzinoRESTConsumerService {
@POST("wms/updateTipoUL")
Call<ServiceRESTResponse<Void>> updateTipoUL(@Body UpdateTipoULRequestDTO requestDto);
@POST("wms/updatePosizioneUL")
Call<ServiceRESTResponse<Void>> updatePosizioneUL(@Body UpdatePosizioneULRequestDTO requestDto);
@POST("wms/spostaUL")
Call<ServiceRESTResponse<Void>> spostaUL(@Body SpostaULRequestDTO requestDto);

View File

@@ -1,6 +1,6 @@
package it.integry.integrywmsnative.core.rest.consumers;
import androidx.annotation.NonNull;
import java.util.concurrent.ExecutorService;
import javax.inject.Singleton;
@@ -9,134 +9,152 @@ import it.integry.integrywmsnative.core.model.MtbColr;
import it.integry.integrywmsnative.core.model.MtbColt;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.consumers.interfaces.ColliScaricoRESTConsumerInterface;
import it.integry.integrywmsnative.core.rest.handler.ManagedErrorCallback;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.rest.model.uds.CloseUDSRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.CloseUDSResponseDTO;
import it.integry.integrywmsnative.core.rest.model.uds.CreateUDSRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.CreateUDSResponseDTO;
import it.integry.integrywmsnative.core.rest.model.uds.DeleteUDSRowRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.DuplicateUDSRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.DuplicateUDSResponseDTO;
import it.integry.integrywmsnative.core.rest.model.uds.EditUDSRowRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.EditUDSRowResponseDTO;
import it.integry.integrywmsnative.core.rest.model.uds.InsertUDSRowRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.InsertUDSRowResponseDTO;
import retrofit2.Call;
import retrofit2.Response;
@Singleton
public class ColliSpedizioneRESTConsumer extends _BaseRESTConsumer implements ColliScaricoRESTConsumerInterface {
private final RESTBuilder restBuilder;
private final ExecutorService executorService;
public ColliSpedizioneRESTConsumer(RESTBuilder restBuilder) {
public ColliSpedizioneRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService) {
this.restBuilder = restBuilder;
this.executorService = executorService;
}
public MtbColt createUDSSynchronized(CreateUDSRequestDTO createUDSRequestDTO) throws Exception {
ColliSpedizioneRESTConsumerService colliSpedizioneRESTConsumerService = restBuilder.getService(ColliSpedizioneRESTConsumerService.class);
var response = colliSpedizioneRESTConsumerService.createUDS(createUDSRequestDTO)
.execute();
var data = analyzeAnswer(response, "spedizione/createUDS");
return data.getMtbColt();
}
public void createUDS(CreateUDSRequestDTO createUDSRequestDTO, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var response = createUDSSynchronized(createUDSRequestDTO);
if (onComplete != null) onComplete.run(response);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public CloseUDSResponseDTO closeUDSSynchronized(CloseUDSRequestDTO closeUDSRequestDTO) throws Exception {
ColliSpedizioneRESTConsumerService colliSpedizioneRESTConsumerService = restBuilder.getService(ColliSpedizioneRESTConsumerService.class);
colliSpedizioneRESTConsumerService.createUDS(createUDSRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<CreateUDSResponseDTO>> call, Response<ServiceRESTResponse<CreateUDSResponseDTO>> response) {
analyzeAnswer(response, "spedizione/createUDS", data -> onComplete.run(data.getMtbColt()), onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<CreateUDSResponseDTO>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
var response = colliSpedizioneRESTConsumerService.closeUDS(closeUDSRequestDTO)
.execute();
var data = analyzeAnswer(response, "spedizione/closeUDS");
return data;
}
public void closeUDS(CloseUDSRequestDTO closeUDSRequestDTO, RunnableArgs<CloseUDSResponseDTO> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var response = closeUDSSynchronized(closeUDSRequestDTO);
if (onComplete != null) onComplete.run(response);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public MtbColr insertUDSRowSynchronized(InsertUDSRowRequestDTO insertUDSRowRequestDTO) throws Exception {
ColliSpedizioneRESTConsumerService colliSpedizioneRESTConsumerService = restBuilder.getService(ColliSpedizioneRESTConsumerService.class);
colliSpedizioneRESTConsumerService.closeUDS(closeUDSRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<CloseUDSResponseDTO>> call, Response<ServiceRESTResponse<CloseUDSResponseDTO>> response) {
analyzeAnswer(response, "spedizione/closeUDS", onComplete, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<CloseUDSResponseDTO>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
Response<ServiceRESTResponse<InsertUDSRowResponseDTO>> response = colliSpedizioneRESTConsumerService.insertUDSRow(insertUDSRowRequestDTO)
.execute();
var data = analyzeAnswer(response, "spedizione/insertUDSRow");
return data.getSavedMtbColr();
}
public void insertUDSRow(InsertUDSRowRequestDTO insertUDSRowRequestDTO, RunnableArgs<MtbColr> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var response = insertUDSRowSynchronized(insertUDSRowRequestDTO);
if (onComplete != null) onComplete.run(response);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public MtbColr editUDSRowSynchronized(EditUDSRowRequestDTO editUDSRowRequestDTO) throws Exception {
ColliSpedizioneRESTConsumerService colliSpedizioneRESTConsumerService = restBuilder.getService(ColliSpedizioneRESTConsumerService.class);
colliSpedizioneRESTConsumerService.insertUDSRow(insertUDSRowRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<InsertUDSRowResponseDTO>> call, Response<ServiceRESTResponse<InsertUDSRowResponseDTO>> response) {
analyzeAnswer(response, "spedizione/insertUDSRow", data -> onComplete.run(data.getSavedMtbColr()), onFailed);
}
var response = colliSpedizioneRESTConsumerService.editUDSRow(editUDSRowRequestDTO)
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<InsertUDSRowResponseDTO>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
var data = analyzeAnswer(response, "spedizione/editUDSRow");
return data.getSavedMtbColr();
}
public void editUDSRow(EditUDSRowRequestDTO editUDSRowRequestDTO, RunnableArgs<MtbColr> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var response = editUDSRowSynchronized(editUDSRowRequestDTO);
if (onComplete != null) onComplete.run(response);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public void deleteUDSRowSynchronized(DeleteUDSRowRequestDTO deleteUDSRowRequestDTO) throws Exception {
ColliSpedizioneRESTConsumerService colliSpedizioneRESTConsumerService = restBuilder.getService(ColliSpedizioneRESTConsumerService.class);
colliSpedizioneRESTConsumerService.editUDSRow(editUDSRowRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<EditUDSRowResponseDTO>> call, Response<ServiceRESTResponse<EditUDSRowResponseDTO>> response) {
analyzeAnswer(response, "spedizione/editUDSRow", data -> onComplete.run(data.getSavedMtbColr()), onFailed);
}
var response = colliSpedizioneRESTConsumerService.deleteUDSRow(deleteUDSRowRequestDTO)
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<EditUDSRowResponseDTO>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
analyzeAnswer(response, "spedizione/deleteUDSRow");
}
public void deleteUDSRow(DeleteUDSRowRequestDTO deleteUDSRowRequestDTO, Runnable onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
deleteUDSRowSynchronized(deleteUDSRowRequestDTO);
if (onComplete != null) onComplete.run();
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public DuplicateUDSResponseDTO duplicateUDSSynchronized(DuplicateUDSRequestDTO duplicateUDSRequestDTO) throws Exception {
ColliSpedizioneRESTConsumerService colliSpedizioneRESTConsumerService = restBuilder.getService(ColliSpedizioneRESTConsumerService.class);
colliSpedizioneRESTConsumerService.deleteUDSRow(deleteUDSRowRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<Void>> call, Response<ServiceRESTResponse<Void>> response) {
analyzeAnswer(response, "spedizione/deleteUDSRow", data -> onComplete.run(), onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<Void>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
var response = colliSpedizioneRESTConsumerService.duplicateUDS(duplicateUDSRequestDTO)
.execute();
var data = analyzeAnswer(response, "spedizione/duplicateUDS");
return data;
}
public void duplicateUDS(DuplicateUDSRequestDTO duplicateUDSRequestDTO, RunnableArgs<DuplicateUDSResponseDTO> onComplete, RunnableArgs<Exception> onFailed) {
ColliSpedizioneRESTConsumerService colliSpedizioneRESTConsumerService = restBuilder.getService(ColliSpedizioneRESTConsumerService.class);
colliSpedizioneRESTConsumerService.duplicateUDS(duplicateUDSRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(@NonNull Call<ServiceRESTResponse<DuplicateUDSResponseDTO>> call, @NonNull Response<ServiceRESTResponse<DuplicateUDSResponseDTO>> response) {
analyzeAnswer(response, "spedizione/duplicateUDS", onComplete, onFailed);
}
@Override
public void onFailure(@NonNull Call<ServiceRESTResponse<DuplicateUDSResponseDTO>> call, @NonNull final Exception e) {
onFailed.run(new Exception());
}
});
executorService.execute(() -> {
try {
var data = duplicateUDSSynchronized(duplicateUDSRequestDTO);
if (onComplete != null) onComplete.run(data);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
}

View File

@@ -6,6 +6,7 @@ import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
import javax.inject.Singleton;
@@ -18,34 +19,42 @@ import it.integry.integrywmsnative.core.utility.UtilityString;
@Singleton
public class CommessaRESTConsumer extends _BaseRESTConsumer {
private final ExecutorService executorService;
private final SystemRESTConsumer systemRESTConsumer;
public CommessaRESTConsumer(SystemRESTConsumer systemRESTConsumer) {
public CommessaRESTConsumer(ExecutorService executorService, SystemRESTConsumer systemRESTConsumer) {
this.executorService = executorService;
this.systemRESTConsumer = systemRESTConsumer;
}
public void getJtbComts(List<String> itemsToFind, RunnableArgs<List<JtbComt>> onComplete, RunnableArgs<Exception> onFailed) {
var whereCondMap = itemsToFind.stream()
public List<JtbComt> getJtbComtsSynchronized(List<String> itemsToFind) throws Exception {
List<HashMap<String, Object>> whereCondMap = itemsToFind.stream()
.filter(x -> !UtilityString.isNullOrEmpty(x))
.map(x -> {
HashMap<String, Object> codJcom = new HashMap<>() {{
put("cod_jcom", x);
}};
return codJcom;
})
.map(x -> new HashMap<String, Object>() {{
put("cod_jcom", x);
}})
.collect(Collectors.toUnmodifiableList());
if(whereCondMap.isEmpty()) {
onComplete.run(new ArrayList<>());
return;
return new ArrayList<>();
}
var whereCond = " WHERE " + UtilityQuery.concatFieldListInWhereCond(whereCondMap);
Type typeOfObjectsList = new TypeToken<ArrayList<JtbComt>>() {}.getType();
this.systemRESTConsumer.processSql("SELECT * FROM jtb_comt " + whereCond, typeOfObjectsList, onComplete, onFailed);
return this.systemRESTConsumer.processSqlSynchronized("SELECT * FROM jtb_comt " + whereCond, typeOfObjectsList);
}
public void getJtbComts(List<String> itemsToFind, RunnableArgs<List<JtbComt>> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var data = getJtbComtsSynchronized(itemsToFind);
if (onComplete != null) onComplete.run(data);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
}

View File

@@ -5,26 +5,26 @@ import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import javax.inject.Singleton;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.model.MtbDepo;
@Singleton
public class DepositoRESTConsumer extends _BaseRESTConsumer {
private final EntityRESTConsumer entityRESTConsumer;
private final ExecutorService executorService;
private final SystemRESTConsumer systemRESTConsumer;
public DepositoRESTConsumer(EntityRESTConsumer entityRESTConsumer, SystemRESTConsumer systemRESTConsumer) {
this.entityRESTConsumer = entityRESTConsumer;
public DepositoRESTConsumer(ExecutorService executorService, SystemRESTConsumer systemRESTConsumer) {
this.executorService = executorService;
this.systemRESTConsumer = systemRESTConsumer;
}
public void getAll(RunnableArgs<List<MtbDepo>> onComplete, RunnableArgs<Exception> onFailed) {
public List<MtbDepo> getAllSynchronized() throws Exception {
Type typeOfObjectsList = new TypeToken<ArrayList<MtbDepo>>() {
}.getType();
this.systemRESTConsumer.processSql("SELECT * FROM mtb_depo", typeOfObjectsList, onComplete, onFailed);
return this.systemRESTConsumer.processSqlSynchronized("SELECT * FROM mtb_depo", typeOfObjectsList);
}
}

View File

@@ -3,6 +3,7 @@ package it.integry.integrywmsnative.core.rest.consumers;
import androidx.annotation.NonNull;
import java.util.List;
import java.util.concurrent.ExecutorService;
import javax.inject.Singleton;
@@ -20,9 +21,11 @@ import retrofit2.Response;
public class DocumentRESTConsumer extends _BaseRESTConsumer {
private final RESTBuilder restBuilder;
private final ExecutorService executorService;
public DocumentRESTConsumer(RESTBuilder restBuilder) {
public DocumentRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService) {
this.restBuilder = restBuilder;
this.executorService = executorService;
}
public void createDocsFromColli(List<LoadColliDTO> listColli, RunnableArgs<List<DtbDoct>> onComplete, RunnableArgs<Exception> onFailed) {
@@ -40,17 +43,22 @@ public class DocumentRESTConsumer extends _BaseRESTConsumer {
});
}
public void createDocFromColli(LoadColliDTO loadColliDTO, RunnableArgs<DtbDoct> onComplete, RunnableArgs<Exception> onFailed) {
public DtbDoct makeSynchronousCreateDocFromColliRequest(LoadColliDTO loadColliDTO) throws Exception {
DocumentiRESTConsumerService documentiRESTConsumerService = restBuilder.getService(DocumentiRESTConsumerService.class);
documentiRESTConsumerService.createDocFromColli(loadColliDTO).enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<DtbDoct>> call, Response<ServiceRESTResponse<DtbDoct>> response) {
analyzeAnswer(response, "createDocFromColli", onComplete, onFailed);
}
var response = documentiRESTConsumerService
.createDocFromColli(loadColliDTO)
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<DtbDoct>> call, @NonNull final Exception e) {
onFailed.run(e);
return analyzeAnswer(response, "createDocFromColli");
}
public void makeCreateDocFromColliRequest(LoadColliDTO loadColliDTO, RunnableArgs<DtbDoct> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var result = makeSynchronousCreateDocFromColliRequest(loadColliDTO);
if (onComplete != null) onComplete.run(result);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}

View File

@@ -9,6 +9,7 @@ import com.google.gson.JsonObject;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import javax.inject.Singleton;
@@ -26,100 +27,93 @@ import retrofit2.Response;
public class EntityRESTConsumer extends _BaseRESTConsumer {
private final RESTBuilder restBuilder;
private final ExecutorService executorService;
public EntityRESTConsumer(RESTBuilder restBuilder) {
public EntityRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService) {
this.restBuilder = restBuilder;
this.executorService = executorService;
}
public <T extends EntityBase> T processEntitySynchronized(T entityToSave, Class<T> type) throws Exception {
EntityRESTConsumerService service = restBuilder.getService(EntityRESTConsumerService.class);
var response = service
.processEntity(entityToSave)
.execute();
if (response.isSuccessful()) {
if (response.body() != null) {
if (response.body().getEsito() == EsitoType.OK) {
Gson gson = UtilityGson.createObject();
return gson.fromJson(response.body().getEntity(), type);
} else {
Log.e("EntityRESTConsumer", response.body().getErrorMessage());
throw new Exception(response.body().getErrorMessage());
}
} else {
Log.e("EntityRESTConsumer", response.message());
throw new Exception(response.message());
}
} else {
Log.e("EntityRESTConsumer", "Status " + response.code() + ": " + response.message());
throw new Exception("Status " + response.code() + ": " + response.message());
}
}
public <T extends EntityBase> void processEntity(T entityToSave, final ISimpleOperationCallback<T> callback, Class<T> type) {
executorService.execute(() -> {
try {
var data = processEntitySynchronized(entityToSave, type);
if (callback != null) callback.onSuccess(data);
} catch (Exception ex) {
if (callback != null) callback.onFailed(ex);
}
});
RunnableArgs<Exception> tmpFailed = ex -> {
if (callback != null) callback.onFailed(ex);
};
}
public <T extends EntityBase> List<T> processEntityListSynchronized(List<T> entitiesToSave, boolean singleTransaction, Class<T> type) throws Exception {
EntityRESTConsumerService service = restBuilder.getService(EntityRESTConsumerService.class);
service
.processEntity(entityToSave)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<JsonObject>> call, Response<ServiceRESTResponse<JsonObject>> response) {
if (response.isSuccessful()) {
var response = service.processEntityList(singleTransaction, entitiesToSave)
.execute();
if (response.body() != null) {
if (response.body().getEsito() == EsitoType.OK) {
Gson gson = UtilityGson.createObject();
T object = gson.fromJson(response.body().getEntity(), type);
if (response.isSuccessful()) {
callback.onSuccess(object);
} else {
Log.e("EntityRESTConsumer", response.body().getErrorMessage());
tmpFailed.run(new Exception(response.body().getErrorMessage()));
}
} else {
Log.e("EntityRESTConsumer", response.message());
tmpFailed.run(new Exception(response.message()));
}
} else {
Log.e("EntityRESTConsumer", "Status " + response.code() + ": " + response.message());
tmpFailed.run(new Exception("Status " + response.code() + ": " + response.message()));
}
if (response.body() != null) {
ArrayList<T> responseList = new ArrayList<>();
Gson gson = UtilityGson.createObject();
for (ServiceRESTResponse<JsonObject> jsonSingleObject : response.body()) {
if (jsonSingleObject.getEsito() == EsitoType.OK) {
String jsonText = gson.toJson(jsonSingleObject.getEntity());
responseList.add(gson.fromJson(jsonText, type));
} else {
Log.e("EntityRESTConsumer", jsonSingleObject.getErrorMessage());
throw new Exception(jsonSingleObject.getErrorMessage());
}
}
@Override
public void onFailure(Call<ServiceRESTResponse<JsonObject>> call, @NonNull final Exception e) {
tmpFailed.run(e);
}
});
return responseList;
} else {
Log.e("EntityRESTConsumer", response.message());
throw new Exception(response.message());
}
} else {
Log.e("EntityRESTConsumer", "Status " + response.code() + ": " + response.message());
throw new Exception("Status " + response.code() + ": " + response.message());
}
}
public <T extends EntityBase> void processEntityList(List<T> entitiesToSave, boolean singleTransaction, Class<T> type, final RunnableArgs<List<T>> onComplete, final RunnableArgs<Exception> onFailed) {
RunnableArgs<Exception> tmpFailed = ex -> {
// UtilityExceptions.defaultException(null, ex);
if (onFailed != null) onFailed.run(ex);
};
EntityRESTConsumerService service = restBuilder.getService(EntityRESTConsumerService.class);
Call<List<ServiceRESTResponse<JsonObject>>> request = service.processEntityList(singleTransaction, entitiesToSave);
request.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<List<ServiceRESTResponse<JsonObject>>> call, Response<List<ServiceRESTResponse<JsonObject>>> response) {
if (response.isSuccessful()) {
if (response.body() != null) {
ArrayList<T> responseList = new ArrayList<>();
Gson gson = UtilityGson.createObject();
// Type typeOfObjectsList = new TypeToken<T>() {}.getType();
for (ServiceRESTResponse<JsonObject> jsonSingleObject : response.body()) {
if (jsonSingleObject.getEsito() == EsitoType.OK) {
String jsonText = gson.toJson(jsonSingleObject.getEntity());
responseList.add(gson.fromJson(jsonText, type));
} else {
Log.e("EntityRESTConsumer", jsonSingleObject.getErrorMessage());
tmpFailed.run(new Exception(jsonSingleObject.getErrorMessage()));
return;
}
}
onComplete.run(responseList);
} else {
Log.e("EntityRESTConsumer", response.message());
tmpFailed.run(new Exception(response.message()));
}
} else {
Log.e("EntityRESTConsumer", "Status " + response.code() + ": " + response.message());
tmpFailed.run(new Exception("Status " + response.code() + ": " + response.message()));
}
}
@Override
public void onFailure(Call<List<ServiceRESTResponse<JsonObject>>> call, @NonNull final Exception e) {
tmpFailed.run(e);
executorService.execute(() -> {
try {
var data = processEntityListSynchronized(entitiesToSave, singleTransaction, type);
if (onComplete != null) onComplete.run(data);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});

View File

@@ -79,32 +79,22 @@ public class GestSetupRESTConsumer extends _BaseRESTConsumer {
}
public void getValues(String codMdep, List<StbGestSetupReader> stbGestSetupList, RunnableArgs<List<StbGestSetupReader>> onComplete, RunnableArgs<Exception> onFailed) {
public List<StbGestSetupReader> getValuesSynchronized(String codMdep, List<StbGestSetupReader> stbGestSetupList) throws Exception {
var stbGestSetups = stbGestSetupList.stream().map(x -> (StbGestSetup) x).collect(Collectors.toList());
GestSetupRESTConsumerService service = restBuilder.getService(GestSetupRESTConsumerService.class);
service.getGestSetupValues(codMdep, stbGestSetups).enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<List<StbGestSetup>>> call, Response<ServiceRESTResponse<List<StbGestSetup>>> response) {
analyzeAnswer(response, "GestSetup", data -> {
var response = service.getGestSetupValues(codMdep, stbGestSetups)
.execute();
var data = analyzeAnswer(response, "GestSetup");
for (StbGestSetup stbGestSetup : data) {
stbGestSetupList.stream().filter(x -> stbGestSetup.getGestName().equalsIgnoreCase(x.getGestName()) &&
stbGestSetup.getSection().equalsIgnoreCase(x.getSection()) &&
stbGestSetup.getKeySection().equalsIgnoreCase(x.getKeySection()))
.findFirst()
.ifPresent(x -> x.setValue(stbGestSetup.getValue()));
}
for (StbGestSetup stbGestSetup : data) {
stbGestSetupList.stream().filter(x -> stbGestSetup.getGestName().equalsIgnoreCase(x.getGestName()) &&
stbGestSetup.getSection().equalsIgnoreCase(x.getSection()) &&
stbGestSetup.getKeySection().equalsIgnoreCase(x.getKeySection()))
.findFirst()
.ifPresent(x -> x.setValue(stbGestSetup.getValue()));
}
onComplete.run(stbGestSetupList);
}, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<List<StbGestSetup>>> call, @NonNull final Exception e) {
if (onFailed != null) onFailed.run(e);
}
});
return stbGestSetupList;
}

View File

@@ -0,0 +1,61 @@
package it.integry.integrywmsnative.core.rest.consumers;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.model.pv.CloseVerificaRequestDTO;
import it.integry.integrywmsnative.core.rest.model.pv.DeleteRowVerificaRequestDTO;
import it.integry.integrywmsnative.core.rest.model.pv.GiacenzaPvDTO;
import it.integry.integrywmsnative.core.rest.model.pv.SaveNewRowVerificaRequestDTO;
import it.integry.integrywmsnative.core.rest.model.pv.UpdateRowVerificaRequestDTO;
public class GiacenzaPvRESTConsumer extends _BaseRESTConsumer {
private final RESTBuilder restBuilder;
public GiacenzaPvRESTConsumer(RESTBuilder restBuilder) {
this.restBuilder = restBuilder;
}
public List<GiacenzaPvDTO> retrieveGiacenzeSynchronized(String codMdep, String codMart) throws Exception {
GiacenzaPvRESTConsumerService giacenzaPvRESTConsumerService = restBuilder.getService(GiacenzaPvRESTConsumerService.class, 120);
var response = giacenzaPvRESTConsumerService.retrieve(codMdep, codMart).execute();
var giacenzeList = analyzeAnswer(response, "retrieve-giacenze-pv");
return giacenzeList != null ? giacenzeList : new ArrayList<>();
}
public void saveNewRowSynchronized(SaveNewRowVerificaRequestDTO saveNewRowVerificaRequest) throws Exception {
GiacenzaPvRESTConsumerService giacenzaPvRESTConsumerService = restBuilder.getService(GiacenzaPvRESTConsumerService.class, 0);
var response = giacenzaPvRESTConsumerService.saveNewRowVerifica(saveNewRowVerificaRequest)
.execute();
analyzeAnswer(response, "save-row-verifica-pv");
}
public void updateRowSynchronized(UpdateRowVerificaRequestDTO updateRowVerificaRequest) throws Exception {
GiacenzaPvRESTConsumerService giacenzaPvRESTConsumerService = restBuilder.getService(GiacenzaPvRESTConsumerService.class, 0);
var response = giacenzaPvRESTConsumerService.updateRowVerifica(updateRowVerificaRequest)
.execute();
analyzeAnswer(response, "update-row-verifica-pv");
}
public void deleteRowSynchronized(DeleteRowVerificaRequestDTO deleteRowVerificaRequest) throws Exception {
GiacenzaPvRESTConsumerService giacenzaPvRESTConsumerService = restBuilder.getService(GiacenzaPvRESTConsumerService.class, 0);
var response = giacenzaPvRESTConsumerService.deleteRowVerifica(deleteRowVerificaRequest)
.execute();
analyzeAnswer(response, "delete-row-verifica-pv");
}
public void closeVerifica(CloseVerificaRequestDTO closeVerificaRequestDTO) throws Exception {
GiacenzaPvRESTConsumerService giacenzaPvRESTConsumerService = restBuilder.getService(GiacenzaPvRESTConsumerService.class, 0);
var response = giacenzaPvRESTConsumerService.closeVerifica(closeVerificaRequestDTO)
.execute();
analyzeAnswer(response, "close-verifica-pv");
}
}

View File

@@ -0,0 +1,33 @@
package it.integry.integrywmsnative.core.rest.consumers;
import java.util.List;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.rest.model.pv.CloseVerificaRequestDTO;
import it.integry.integrywmsnative.core.rest.model.pv.DeleteRowVerificaRequestDTO;
import it.integry.integrywmsnative.core.rest.model.pv.GiacenzaPvDTO;
import it.integry.integrywmsnative.core.rest.model.pv.SaveNewRowVerificaRequestDTO;
import it.integry.integrywmsnative.core.rest.model.pv.UpdateRowVerificaRequestDTO;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
public interface GiacenzaPvRESTConsumerService {
@GET("wms/pv/verifica_giacenze/retrieve")
Call<ServiceRESTResponse<List<GiacenzaPvDTO>>> retrieve(@Query("codMdep") String codMdep, @Query("codMart") String codMart);
@POST("wms/pv/verifica_giacenze/save_new_row")
Call<ServiceRESTResponse<Void>> saveNewRowVerifica(@Body SaveNewRowVerificaRequestDTO saveNewRowVerificaRequest);
@POST("wms/pv/verifica_giacenze/update_row")
Call<ServiceRESTResponse<Void>> updateRowVerifica(@Body UpdateRowVerificaRequestDTO updateRowVerificaRequest);
@POST("wms/pv/verifica_giacenze/delete_row")
Call<ServiceRESTResponse<Void>> deleteRowVerifica(@Body DeleteRowVerificaRequestDTO deleteRowVerificaRequest);
@POST("wms/pv/verifica_giacenze/close_verifica")
Call<ServiceRESTResponse<Void>> closeVerifica(@Body CloseVerificaRequestDTO closeVerificaRequest);
}

View File

@@ -7,6 +7,8 @@ import com.annimon.stream.Stream;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
import javax.inject.Singleton;
@@ -28,52 +30,55 @@ import retrofit2.Response;
public class GiacenzaRESTConsumer extends _BaseRESTConsumer {
private final RESTBuilder restBuilder;
private final ExecutorService executorService;
private final ArticoloRESTConsumer mArticoloRESTConsumer;
public GiacenzaRESTConsumer(RESTBuilder restBuilder, ArticoloRESTConsumer articoloRESTConsumer) {
public GiacenzaRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService, ArticoloRESTConsumer articoloRESTConsumer) {
this.restBuilder = restBuilder;
this.executorService = executorService;
this.mArticoloRESTConsumer = articoloRESTConsumer;
}
public void getGiacenzeInPosizione(MtbDepoPosizione posizione, RunnableArgs<List<MvwSitArtUdcDetInventario>> onComplete, RunnableArgs<Exception> onFailed) {
public List<MvwSitArtUdcDetInventario> getGiacenzeInPosizioneSynchronized(MtbDepoPosizione posizione) throws Exception {
GiacenzaRESTConsumerService giacenzaRESTConsumerService = restBuilder.getService(GiacenzaRESTConsumerService.class);
giacenzaRESTConsumerService.retrieveAvailableItems(posizione.getPosizione()).enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<List<MvwSitArtUdcDetInventario>>> call, Response<ServiceRESTResponse<List<MvwSitArtUdcDetInventario>>> response) {
analyzeAnswer(response, "getGiacenzeInPosizione", inventarioList -> {
var response = giacenzaRESTConsumerService.retrieveAvailableItems(posizione.getPosizione())
.execute();
if(inventarioList != null && !inventarioList.isEmpty()){
List<String> codMarts = Stream.of(inventarioList)
.map(x -> x.getCodMart().trim())
.toList();
var inventarioList = analyzeAnswer(response, "getGiacenzeInPosizione");
mArticoloRESTConsumer.getByCodMarts(codMarts, mtbAarts -> {
for (var row : inventarioList) {
if (inventarioList != null && !inventarioList.isEmpty()) {
List<String> codMarts = inventarioList.stream()
.map(x -> x.getCodMart().trim())
.collect(Collectors.toList());
MtbAart foundMtbAart = null;
Optional<MtbAart> mtbAartOpt = Stream.of(mtbAarts)
.filter(x -> x.getCodMart().equalsIgnoreCase(row.getCodMart()))
.findFirst();
var mtbAarts = mArticoloRESTConsumer.getByCodMartsSynchronized(codMarts);
for (var row : inventarioList) {
MtbAart foundMtbAart = null;
Optional<MtbAart> mtbAartOpt = Stream.of(mtbAarts)
.filter(x -> x.getCodMart().equalsIgnoreCase(row.getCodMart()))
.findFirst();
if (mtbAartOpt.isPresent()) {
foundMtbAart = mtbAartOpt.get();
}
if (mtbAartOpt.isPresent()) {
foundMtbAart = mtbAartOpt.get();
}
row.setMtbAart(foundMtbAart);
}
onComplete.run(inventarioList);
}, onFailed);
}else{
onComplete.run(new ArrayList<>());
}
}, onFailed);
row.setMtbAart(foundMtbAart);
}
@Override
public void onFailure(Call<ServiceRESTResponse<List<MvwSitArtUdcDetInventario>>> call, @NonNull final Exception e) {
onFailed.run(e);
return inventarioList;
}
return new ArrayList<>();
}
public void getGiacenzeInPosizione(MtbDepoPosizione posizione, RunnableArgs<List<MvwSitArtUdcDetInventario>> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var result = getGiacenzeInPosizioneSynchronized(posizione);
if (onComplete != null) onComplete.run(result);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
@@ -92,8 +97,8 @@ public class GiacenzaRESTConsumer extends _BaseRESTConsumer {
mArticoloRESTConsumer.getByCodMarts(codMarts, mtbAarts -> {
for (var articoli : inventarioList) {
List<MvwSitArtUdcDetInventario> mvwSitArtUdcDetInventario = articoli.getMvwSitArtUdcDetInventarioDTO();
if (mvwSitArtUdcDetInventario != null && !mvwSitArtUdcDetInventario.isEmpty()){
for (var row : mvwSitArtUdcDetInventario){
if (mvwSitArtUdcDetInventario != null && !mvwSitArtUdcDetInventario.isEmpty()) {
for (var row : mvwSitArtUdcDetInventario) {
MtbAart foundMtbAart = null;
Optional<MtbAart> mtbAartOpt = Stream.of(mtbAarts)
.filter(x -> x.getCodMart().equalsIgnoreCase(row.getCodMart()))
@@ -164,27 +169,28 @@ public class GiacenzaRESTConsumer extends _BaseRESTConsumer {
}
public void getInstantItemSituation(String codMdep, String codMart, String partitaMag, String codJcom, RunnableArgs<InstantItemSituationResponseDto> onComplete, RunnableArgs<Exception> onFailed) {
public InstantItemSituationResponseDto getInstantItemSituationSynchronized(String codMdep, String codMart, String partitaMag, String codJcom) throws Exception {
GiacenzaRESTConsumerService giacenzaRESTConsumerService = restBuilder.getService(GiacenzaRESTConsumerService.class);
giacenzaRESTConsumerService.retrieveInstantItemSituation(codMdep, codMart, partitaMag, codJcom)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<InstantItemSituationResponseDto>> call, Response<ServiceRESTResponse<InstantItemSituationResponseDto>> response) {
analyzeAnswer(response, "getInstantItemSituation", data -> {
var response = giacenzaRESTConsumerService.retrieveInstantItemSituation(codMdep, codMart, partitaMag, codJcom)
.execute();
fillInstantItemSituationWithMtbAarts(data, onComplete, onFailed);
}, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<InstantItemSituationResponseDto>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
var data = analyzeAnswer(response, "getInstantItemSituation");
return fillInstantItemSituationWithMtbAartsSynchronized(data);
}
private void fillInstantItemSituationWithMtbAarts(InstantItemSituationResponseDto data, RunnableArgs<InstantItemSituationResponseDto> onComplete, RunnableArgs<Exception> onFailed) {
public void getInstantItemSituation(String codMdep, String codMart, String partitaMag, String codJcom, RunnableArgs<InstantItemSituationResponseDto> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var response = getInstantItemSituationSynchronized(codMdep, codMart, partitaMag, codJcom);
if (onComplete != null) onComplete.run(response);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
private InstantItemSituationResponseDto fillInstantItemSituationWithMtbAartsSynchronized(InstantItemSituationResponseDto data) throws Exception {
var inputCodMarts = new ArrayList<String>();
if (data.getIncomingItems() != null && !data.getIncomingItems().isEmpty()) {
@@ -200,37 +206,33 @@ public class GiacenzaRESTConsumer extends _BaseRESTConsumer {
}
if (inputCodMarts.isEmpty()) {
onComplete.run(data);
return;
return null;
}
mArticoloRESTConsumer.getByCodMarts(inputCodMarts, mtbAarts -> {
var mtbAarts = mArticoloRESTConsumer.getByCodMartsSynchronized(inputCodMarts);
var newMtbAarts = mArticoloRESTConsumer.fillMtbAartsWithMtbUntMisSynchronized(mtbAarts);
mArticoloRESTConsumer.fillMtbAartsWithMtbUntMis(mtbAarts, newMtbAarts -> {
if (data.getIncomingItems() != null && !data.getIncomingItems().isEmpty()) {
for (var item : data.getIncomingItems()) {
var mtbAart = Stream.of(newMtbAarts).filter(x -> x.getCodMart().equalsIgnoreCase(item.getCodMart()))
.findFirstOrElse(null);
if (data.getIncomingItems() != null && !data.getIncomingItems().isEmpty()) {
for (var item : data.getIncomingItems()) {
var mtbAart = Stream.of(newMtbAarts).filter(x -> x.getCodMart().equalsIgnoreCase(item.getCodMart()))
.findFirstOrElse(null);
if (mtbAart != null)
item.setMtbAart(mtbAart);
}
}
if (mtbAart != null)
item.setMtbAart(mtbAart);
}
}
if (data.getAvailableItems() != null && !data.getAvailableItems().isEmpty()) {
for (var item : data.getAvailableItems()) {
var mtbAart = Stream.of(newMtbAarts).filter(x -> x.getCodMart().equalsIgnoreCase(item.getCodMart()))
.findFirstOrElse(null);
if (data.getAvailableItems() != null && !data.getAvailableItems().isEmpty()) {
for (var item : data.getAvailableItems()) {
var mtbAart = Stream.of(newMtbAarts).filter(x -> x.getCodMart().equalsIgnoreCase(item.getCodMart()))
.findFirstOrElse(null);
if (mtbAart != null)
item.setMtbAart(mtbAart);
}
}
if (mtbAart != null)
item.setMtbAart(mtbAart);
}
}
onComplete.run(data);
}, onFailed);
}, onFailed);
return data;
}

View File

@@ -2,6 +2,8 @@ package it.integry.integrywmsnative.core.rest.consumers;
import androidx.annotation.NonNull;
import java.util.concurrent.ExecutorService;
import javax.inject.Singleton;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
@@ -18,26 +20,31 @@ import retrofit2.Response;
public class MagazzinoAutomaticoRESTConsumer extends _BaseRESTConsumer {
private final ExecutorService executorService;
private final RESTBuilder restBuilder;
public MagazzinoAutomaticoRESTConsumer(RESTBuilder restBuilder) {
public MagazzinoAutomaticoRESTConsumer(ExecutorService executorService, RESTBuilder restBuilder) {
this.executorService = executorService;
this.restBuilder = restBuilder;
}
public void pickItems(MtbDepoPosizione posizione, MagazzinoAutomaticoPickItemsRequestDTO magazzinoAutomaticoPickItemsRequestDTO, Runnable onComplete, RunnableArgs<Exception> onFailed) {
public void pickItemsSynchronized(MtbDepoPosizione posizione, MagazzinoAutomaticoPickItemsRequestDTO magazzinoAutomaticoPickItemsRequestDTO) throws Exception {
MagazzinoAutomaticoRESTConsumerService magazzinoAutomaticoRESTConsumerService = restBuilder.getService(MagazzinoAutomaticoRESTConsumerService.class);
magazzinoAutomaticoRESTConsumerService.pickItems(posizione.getPosizione(), magazzinoAutomaticoPickItemsRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<Void>> call, Response<ServiceRESTResponse<Void>> response) {
analyzeAnswer(response, "magazzino-automatico/pickItems", data -> onComplete.run(), onFailed);
}
var response = magazzinoAutomaticoRESTConsumerService.pickItems(posizione.getPosizione(), magazzinoAutomaticoPickItemsRequestDTO)
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<Void>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
analyzeAnswer(response, "magazzino-automatico/pickItems");
}
public void pickItems(MtbDepoPosizione posizione, MagazzinoAutomaticoPickItemsRequestDTO magazzinoAutomaticoPickItemsRequestDTO, Runnable onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
pickItemsSynchronized(posizione, magazzinoAutomaticoPickItemsRequestDTO);
if (onComplete != null) onComplete.run();
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}

View File

@@ -1,5 +1,6 @@
package it.integry.integrywmsnative.core.rest.consumers;
import java.util.List;
import java.util.concurrent.ExecutorService;
import javax.inject.Singleton;
@@ -8,6 +9,8 @@ import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.model.MtbColt;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.model.materiali.RecuperaMaterialiRequestDTO;
import it.integry.integrywmsnative.core.rest.model.materiali.VersaMaterialiRequestDTO;
import it.integry.integrywmsnative.gest.prod_recupero_materiale.dto.HistoryVersamentoProdULRestDTO;
@Singleton
public class MaterialiRESTConsumer extends _BaseRESTConsumer {
@@ -20,6 +23,28 @@ public class MaterialiRESTConsumer extends _BaseRESTConsumer {
this.executorService = executorService;
}
public List<HistoryVersamentoProdULRestDTO> makeSynchronousRetrieveLastVersamentiRequest(String codJfas) throws Exception {
var materialiRESTConsumerService = restBuilder.getService(MaterialiRESTConsumerService.class);
var response = materialiRESTConsumerService.retrieveLastVersamenti(codJfas)
.execute();
var data = analyzeAnswer(response, "retrieveLastVersamenti");
return data;
}
public void makeRetrieveLastVersamentiRequest(String codJfas, final RunnableArgs<List<HistoryVersamentoProdULRestDTO>> onComplete, final RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var response = makeSynchronousRetrieveLastVersamentiRequest(codJfas);
if (onComplete != null) onComplete.run(response);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public MtbColt makeSynchronousRecuperaRequest(RecuperaMaterialiRequestDTO request) throws Exception {
var materialiRESTConsumerService = restBuilder.getService(MaterialiRESTConsumerService.class);
@@ -43,4 +68,27 @@ public class MaterialiRESTConsumer extends _BaseRESTConsumer {
});
}
public void makeSynchronousVersaRequest(VersaMaterialiRequestDTO request) throws Exception {
var materialiRESTConsumerService = restBuilder.getService(MaterialiRESTConsumerService.class);
var response = materialiRESTConsumerService.versa(request)
.execute();
var data = analyzeAnswer(response, "versaMateriali");
// if (data == null) return null;
// return data.getUpdatedMtbColtScarico();
}
public void makeVersaRequest(VersaMaterialiRequestDTO request, final Runnable onComplete, final RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
makeSynchronousVersaRequest(request);
if (onComplete != null) onComplete.run();
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
}

View File

@@ -1,14 +1,27 @@
package it.integry.integrywmsnative.core.rest.consumers;
import java.util.List;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.rest.model.materiali.RecuperaMaterialiRequestDTO;
import it.integry.integrywmsnative.core.rest.model.materiali.RecuperaMaterialiResponseDTO;
import it.integry.integrywmsnative.core.rest.model.materiali.VersaMaterialiRequestDTO;
import it.integry.integrywmsnative.core.rest.model.materiali.VersaMaterialiResponseDTO;
import it.integry.integrywmsnative.gest.prod_recupero_materiale.dto.HistoryVersamentoProdULRestDTO;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
public interface MaterialiRESTConsumerService {
@POST("wms/materiali/versa")
Call<ServiceRESTResponse<VersaMaterialiResponseDTO>> versa(@Body VersaMaterialiRequestDTO request);
@GET("wms/materiali/retrieveLastVersamenti")
Call<ServiceRESTResponse<List<HistoryVersamentoProdULRestDTO>>> retrieveLastVersamenti(@Query("codJfas") String codJfas);
@POST("wms/materiali/recupera")
Call<ServiceRESTResponse<RecuperaMaterialiResponseDTO>> recupera(@Body RecuperaMaterialiRequestDTO request);

View File

@@ -66,21 +66,14 @@ public class MesRESTConsumer extends _BaseRESTConsumer {
}
public void getOrdiniLavorazione(String flagEvaso, RunnableArgs<List<OrdineLavorazioneDTO>> onComplete, RunnableArgs<Exception> onFailed) {
public List<OrdineLavorazioneDTO> getOrdiniLavorazioneSynchronized(String flagEvaso) throws Exception {
MesRESTConsumerService mesRESTConsumerService = restBuilder.getService(MesRESTConsumerService.class);
mesRESTConsumerService.getOrdiniLavorazione(flagEvaso)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<List<OrdineLavorazioneDTO>>> call, Response<ServiceRESTResponse<List<OrdineLavorazioneDTO>>> response) {
analyzeAnswer(response, "getOrdiniLavorazione", (m) -> onComplete.run(response.body().getDto()), onFailed);
}
var response = mesRESTConsumerService.getOrdiniLavorazione(flagEvaso)
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<List<OrdineLavorazioneDTO>>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
var data = analyzeAnswer(response, "mes_v2/getOrdiniLavorazione");
return data;
}
public void getLineeProduzione(String codJfasParent, RunnableArgs<List<JtbFasi>> onComplete, RunnableArgs<Exception> onFailed) {

View File

@@ -4,14 +4,11 @@ import androidx.annotation.NonNull;
import com.annimon.stream.Optional;
import com.annimon.stream.Stream;
import com.google.gson.reflect.TypeToken;
import com.orhanobut.logger.Logger;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import javax.inject.Singleton;
@@ -21,6 +18,7 @@ import it.integry.integrywmsnative.core.model.MtbColr;
import it.integry.integrywmsnative.core.model.MtbColt;
import it.integry.integrywmsnative.core.model.MtbPartitaMag;
import it.integry.integrywmsnative.core.model.OrdineInevasoDTO;
import it.integry.integrywmsnative.core.model.dto.AlreadyRegisteredUlDTO;
import it.integry.integrywmsnative.core.model.secondary.GestioneEnum;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.handler.ManagedErrorCallback;
@@ -28,8 +26,7 @@ import it.integry.integrywmsnative.core.rest.model.GetPickingListDTO;
import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.rest.model.SitArtOrdDTO;
import it.integry.integrywmsnative.core.utility.UtilityDB;
import it.integry.integrywmsnative.core.utility.UtilityQuery;
import it.integry.integrywmsnative.core.rest.model.uds.RetrieveAlreadyRegisteredUdsRequestDTO;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.gest.spedizione.model.PickingObjectDTO;
import retrofit2.Call;
@@ -39,12 +36,14 @@ import retrofit2.Response;
public class OrdiniRESTConsumer extends _BaseRESTConsumer {
private final RESTBuilder restBuilder;
private final ExecutorService executorService;
private final SystemRESTConsumer mSystemRESTConsumer;
private final EntityRESTConsumer mEntityRESTConsumer;
public OrdiniRESTConsumer(RESTBuilder restBuilder, SystemRESTConsumer systemRESTConsumer, EntityRESTConsumer entityRESTConsumer) {
public OrdiniRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService,SystemRESTConsumer systemRESTConsumer, EntityRESTConsumer entityRESTConsumer) {
this.restBuilder = restBuilder;
this.executorService = executorService;
this.mSystemRESTConsumer = systemRESTConsumer;
this.mEntityRESTConsumer = entityRESTConsumer;
}
@@ -61,7 +60,7 @@ public class OrdiniRESTConsumer extends _BaseRESTConsumer {
for (PickingObjectDTO pickingObjectDTO : pickingObjects) {
for (MtbColt mtbColt : pickingObjectDTO.getMtbColts()) {
Stream.of(mtbColt.getMtbColr())
mtbColt.getMtbColr().stream()
.filter(x -> !UtilityString.isNullOrEmpty(x.getPartitaMag()))
.forEach(x -> {
@@ -125,28 +124,24 @@ public class OrdiniRESTConsumer extends _BaseRESTConsumer {
this.mEntityRESTConsumer.processEntityList(partitaMag, true, MtbPartitaMag.class, onComplete, onFailed);
}
public void getOrdiniInevasi(String codMdep, GestioneEnum gestione, RunnableArgs<List<OrdineUscitaInevasoDTO>> onComplete, RunnableArgs<Exception> onFailed) {
public List<OrdineUscitaInevasoDTO> getOrdiniInevasiSynchronized(String codMdep, GestioneEnum gestione) throws Exception {
OrdiniRESTConsumerService service = restBuilder.getService(OrdiniRESTConsumerService.class);
service.getOrdiniInevasi(codMdep, gestione.getText())
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<List<OrdineUscitaInevasoDTO>>> call, Response<ServiceRESTResponse<List<OrdineUscitaInevasoDTO>>> response) {
analyzeAnswer(response, "getOrdiniInevasi", responseDtoList -> {
if (responseDtoList == null) responseDtoList = new ArrayList<>();
onComplete.run(responseDtoList);
}, ex -> {
Logger.e(ex, "Errore durante il caricamento degli ordini di lavorazione");
if (onFailed != null) onFailed.run(ex);
});
}
var response = service.getOrdiniInevasi(codMdep, gestione.getText())
.execute();
var data = analyzeAnswer(response, "getOrdiniInevasi");
return data == null ? new ArrayList<>() : data;
}
@Override
public void onFailure(Call<ServiceRESTResponse<List<OrdineUscitaInevasoDTO>>> call, @NonNull final Exception e) {
if (onFailed != null) onFailed.run(e);
}
});
public void getOrdiniInevasi(String codMdep, GestioneEnum gestione, RunnableArgs<List<OrdineUscitaInevasoDTO>> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var result = getOrdiniInevasiSynchronized(codMdep, gestione);
if (onComplete != null) onComplete.run(result);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public void retrieveListaArticoliFromOrdiniUscita(String codMdep, List<OrdineUscitaInevasoDTO> orders, RunnableArgs<List<SitArtOrdDTO>> onComplete, RunnableArgs<Exception> onFailed) {
@@ -182,44 +177,27 @@ public class OrdiniRESTConsumer extends _BaseRESTConsumer {
});
}
public void getBancaliGiaRegistrati(List<OrdineInevasoDTO> orders, GestioneEnum gestione, int segno, RunnableArgs<List<MtbColt>> onComplete, RunnableArgs<Exception> onFailed) {
String whereCondGestione = "";
public List<AlreadyRegisteredUlDTO> getBancaliGiaRegistratiSynchronized(List<? extends OrdineInevasoDTO> orders, int segno) throws Exception {
OrdiniRESTConsumerService service = restBuilder.getService(OrdiniRESTConsumerService.class);
if (gestione != null) {
whereCondGestione = "mtb_colt.gestione = " + UtilityDB.valueToString(gestione.getText()) + " ";
} else {
whereCondGestione = "(mtb_colt.gestione = 'V' OR mtb_colt.gestione = 'L') ";
}
var request = new RetrieveAlreadyRegisteredUdsRequestDTO()
.setOrdini(orders)
.setSegno(segno);
String baseSql = "SELECT DISTINCT mtb_colt.* " +
"FROM mtb_colt " +
" INNER JOIN mtb_colr ON " +
" mtb_colt.gestione = mtb_colr.gestione " +
" AND mtb_colt.ser_collo = mtb_colr.ser_collo " +
" AND mtb_colt.data_collo = mtb_colr.data_collo " +
" AND mtb_colt.num_collo = mtb_colr.num_collo " +
" WHERE " + whereCondGestione +
" AND mtb_colt.segno = " + UtilityDB.valueToString(segno) + " " +
" AND mtb_colt.data_doc IS NULL AND ";
var response = service.retrieveAlreadyRegisteredUDS(request)
.execute();
var data = analyzeAnswer(response, "getBancaliGiaRegistrati");
return data == null || data.getUdsList() == null ? new ArrayList<>() : data.getUdsList();
}
List<HashMap<String, Object>> whereCondMapList = new ArrayList<>();
for (OrdineInevasoDTO ordineInevaso : orders) {
HashMap<String, Object> whereCondMap = new HashMap<>();
whereCondMap.put("mtb_colr.data_ord", ordineInevaso.getDataOrdD());
whereCondMap.put("mtb_colr.num_ord", ordineInevaso.getNumOrd());
whereCondMap.put("mtb_colr.gestione", ordineInevaso.getGestione());
whereCondMapList.add(whereCondMap);
}
baseSql += "(" + UtilityQuery.concatFieldListInWhereCond(whereCondMapList) + ")";
Type typeOfObjectsList = new TypeToken<ArrayList<MtbColt>>() {
}.getType();
this.mSystemRESTConsumer.<List<MtbColt>>processSql(baseSql, typeOfObjectsList, value -> {
if (onComplete != null) onComplete.run(value);
}, ex -> {
if (onFailed != null) onFailed.run(ex);
public void getBancaliGiaRegistrati(List<OrdineInevasoDTO> orders, int segno, RunnableArgs<List<AlreadyRegisteredUlDTO>> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var result = getBancaliGiaRegistratiSynchronized(orders, segno);
if (onComplete != null) onComplete.run(result);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}

View File

@@ -5,6 +5,8 @@ import java.util.List;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.rest.model.SitArtOrdDTO;
import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO;
import it.integry.integrywmsnative.core.rest.model.uds.RetrieveAlreadyRegisteredUdsRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.RetrieveAlreadyRegisteredUdsResponseDTO;
import it.integry.integrywmsnative.gest.spedizione.model.PickingObjectDTO;
import it.integry.integrywmsnative.core.rest.model.GetPickingListDTO;
import retrofit2.Call;
@@ -23,4 +25,7 @@ public interface OrdiniRESTConsumerService {
@GET("SM2GetOrdiniVenditaInevasi")
Call<ServiceRESTResponse<List<OrdineUscitaInevasoDTO>>> getOrdiniInevasi(@Query("codMdep") String codMdep, @Query("gestione") String gestione);
@POST("wms/spedizione/retrieveAlreadyRegisteredUDS")
Call<ServiceRESTResponse<RetrieveAlreadyRegisteredUdsResponseDTO>> retrieveAlreadyRegisteredUDS(@Body RetrieveAlreadyRegisteredUdsRequestDTO request);
}

View File

@@ -1,12 +1,11 @@
package it.integry.integrywmsnative.core.rest.consumers;
import androidx.annotation.NonNull;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import javax.inject.Singleton;
@@ -14,44 +13,33 @@ import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.model.MtbColt;
import it.integry.integrywmsnative.core.model.MtbDepoPosizione;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.handler.ManagedErrorCallback;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.utility.UtilityDB;
import retrofit2.Call;
import retrofit2.Response;
@Singleton
public class PosizioniRESTConsumer extends _BaseRESTConsumer {
private final RESTBuilder restBuilder;
private final SystemRESTConsumer mSystemRESTConsumer;
private final ExecutorService executorService;
public PosizioniRESTConsumer(RESTBuilder restBuilder, SystemRESTConsumer systemRESTConsumer) {
public PosizioniRESTConsumer(RESTBuilder restBuilder, SystemRESTConsumer systemRESTConsumer, ExecutorService executorService) {
this.restBuilder = restBuilder;
this.mSystemRESTConsumer = systemRESTConsumer;
this.executorService = executorService;
}
public void getAvailablePosizioni(RunnableArgs<List<MtbDepoPosizione>> onComplete, RunnableArgs<Exception> onFailed) {
public List<MtbDepoPosizione> getAvailablePosizioniSynchronized() throws Exception {
String codMdep = null;
PosizioniRESTConsumerService posizioniRESTConsumerService = restBuilder.getService(PosizioniRESTConsumerService.class);
posizioniRESTConsumerService.getAvailablePosizioni(codMdep).enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<List<MtbDepoPosizione>>> call, Response<ServiceRESTResponse<List<MtbDepoPosizione>>> response) {
analyzeAnswer(response, "getAvailablePosizioni", (m) -> {
onComplete.run(response.body().getDto());
}, onFailed);
}
var response = posizioniRESTConsumerService.getAvailablePosizioni(codMdep)
.execute();
@Override
public void onFailure(Call<ServiceRESTResponse<List<MtbDepoPosizione>>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
var data = analyzeAnswer(response, "getAvailablePosizioni");
return response.body().getDto();
}
public void getBancaliInPosizione(MtbDepoPosizione mtbDepoPosizione, RunnableArgs<List<MtbColt>> onComplete, RunnableArgs<Exception> onFailed) {
public ArrayList<MtbColt> getBancaliInPosizioneSynchronized(MtbDepoPosizione mtbDepoPosizione) throws Exception {
String sql = "SELECT * FROM mtb_colt " +
"WHERE segno > 0 " +
"AND cod_mdep = " + UtilityDB.valueToString(mtbDepoPosizione.getCodMdep()) + " " +
@@ -61,10 +49,18 @@ public class PosizioniRESTConsumer extends _BaseRESTConsumer {
Type typeOfObjectsList = new TypeToken<ArrayList<MtbColt>>() {
}.getType();
mSystemRESTConsumer.<ArrayList<MtbColt>>processSql(sql, typeOfObjectsList, value -> {
if (onComplete != null) onComplete.run(value);
}, ex -> {
if (onFailed != null) onFailed.run(ex);
var value = mSystemRESTConsumer.<ArrayList<MtbColt>>processSqlSynchronized(sql, typeOfObjectsList);
return value;
}
public void getBancaliInPosizione(MtbDepoPosizione mtbDepoPosizione, RunnableArgs<List<MtbColt>> onComplete, RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
var result = getBancaliInPosizioneSynchronized(mtbDepoPosizione);
if (onComplete != null) onComplete.run(result);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}

View File

@@ -123,27 +123,15 @@ public class PrinterRESTConsumer extends _BaseRESTConsumer {
printReportType(reportType, codMdep, null, params, onComplete, onFailed);
}
public void printClosedOrders(PrintOrderCloseDTO dto, String codMdep, Runnable onComplete, RunnableArgs<Exception> onFailed) {
public void printClosedOrdersSynchronized(PrintOrderCloseDTO dto, String codMdep) throws Exception {
if (BuildConfig.DEBUG) {
onComplete.run();
return;
// return;
}
PrinterRESTConsumerService printerService = restBuilder.getService(PrinterRESTConsumerService.class, 240);
Call<ServiceRESTResponse<Object>> callable = printerService.printClosedOrders(codMdep, dto);
callable.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<Object>> call, Response<ServiceRESTResponse<Object>> response) {
analyzeAnswer(response, "printCollo", data -> {
onComplete.run();
}, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<Object>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
var response = printerService.printClosedOrders(codMdep, dto).execute();
analyzeAnswer(response, "printCollo");
}

View File

@@ -1,8 +1,5 @@
package it.integry.integrywmsnative.core.rest.consumers;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.NonNull;
import com.google.gson.Gson;
@@ -17,8 +14,6 @@ import java.util.concurrent.ExecutorService;
import javax.inject.Singleton;
import it.integry.integrywmsnative.BuildConfig;
import it.integry.integrywmsnative.core.CommonConst;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.handler.ManagedErrorCallback;
@@ -27,10 +22,7 @@ import it.integry.integrywmsnative.core.rest.model.MailRequestDTO;
import it.integry.integrywmsnative.core.rest.model.NativeSqlRequestDTO;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.rest.model.system.LatestAppVersionInfoDTO;
import it.integry.integrywmsnative.core.rest.model.system.RegisterDeviceRequestDTO;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityGson;
import it.integry.integrywmsnative.core.utility.UtilityString;
import retrofit2.Call;
import retrofit2.Response;
@@ -40,9 +32,9 @@ public class SystemRESTConsumer extends _BaseRESTConsumer {
private final ExecutorService executorService;
private final RESTBuilder restBuilder;
public SystemRESTConsumer(ExecutorService executorService, RESTBuilder restBuilder) {
this.executorService = executorService;
public SystemRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService) {
this.restBuilder = restBuilder;
this.executorService = executorService;
}
public LatestAppVersionInfoDTO retrieveUpdatesInfoSynchronized(boolean betaVersion) throws Exception {
@@ -57,59 +49,45 @@ public class SystemRESTConsumer extends _BaseRESTConsumer {
return analyzeAnswerGeneric(response, "updates");
}
public void registerDevice(final Runnable onSuccess, final RunnableArgs<Exception> onFailed) {
RegisterDeviceRequestDTO registerDeviceRequestDTO = new RegisterDeviceRequestDTO()
.setApp("WMS");
SystemRESTConsumerService systemRESTConsumerService = restBuilder.getService(SystemRESTConsumerService.class);
systemRESTConsumerService.registerDevice(registerDeviceRequestDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<Void>> call, Response<ServiceRESTResponse<Void>> response) {
analyzeAnswer(response, "device/register", Void -> onSuccess.run(), onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<Void>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
}
public <T> void processSql(String nativeSql, final Type clazz, final RunnableArgs<T> onComplete, final RunnableArgs<Exception> onFailed) {
public <T> T processSqlSynchronized(String nativeSql, final Type clazz) throws Exception {
NativeSqlRequestDTO nativeSqlDTO = new NativeSqlRequestDTO()
.setNativeSql(nativeSql);
SystemRESTConsumerService service = restBuilder.getService(SystemRESTConsumerService.class);
service
var response = service
.processSql(nativeSqlDTO)
.enqueue(new ManagedErrorCallback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<Object>> call, Response<ServiceRESTResponse<Object>> response) {
analyzeAnswer(response, "ProcessSql", o -> {
Gson gson = UtilityGson.createObject();
.execute();
var data = analyzeAnswer(response, "processSql");
String json = gson.toJson(o);
Gson gson = UtilityGson.createObject();
String json = gson.toJson(data);
InputStream ims = new ByteArrayInputStream(json.getBytes());
Reader reader = new InputStreamReader(ims);
T gsonObj = gson.fromJson(reader, clazz);
InputStream ims = new ByteArrayInputStream(json.getBytes());
Reader reader = new InputStreamReader(ims);
T gsonObj = gson.fromJson(reader, clazz);
onComplete.run(gsonObj);
}, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<Object>> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
return gsonObj;
}
public <T> void processSql(String nativeSql, final Type clazz, final RunnableArgs<T> onComplete, final RunnableArgs<Exception> onFailed) {
executorService.execute(() -> {
try {
T result = processSqlSynchronized(nativeSql, clazz);
if (onComplete != null) onComplete.run(result);
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
}
});
}
public List<AvailableCodMdepsDTO> getAvailableCodMdepsSynchronized() throws Exception {
SystemRESTConsumerService service = restBuilder.getService(SystemRESTConsumerService.class);
var response = service.getAvailableCodMdeps().execute();
return analyzeAnswer(response, "CodMdepsAvailable");
}
public void getAvailableCodMdeps(final RunnableArgs<List<AvailableCodMdepsDTO>> onSuccess, RunnableArgs<Exception> onFailed) {
SystemRESTConsumerService service = restBuilder.getService(SystemRESTConsumerService.class);
service.getAvailableCodMdeps().enqueue(new ManagedErrorCallback<>() {
@@ -125,36 +103,6 @@ public class SystemRESTConsumer extends _BaseRESTConsumer {
});
}
public void sendErrorLogMail(String message, Runnable onComplete, RunnableArgs<Exception> onFailed) {
String currentAzienda = UtilityString.isNullOrEmpty(SettingsManager.i().getUserSession().getProfileDB()) ? "" : " [" + SettingsManager.i().getUserSession().getProfileDB() + "]";
String dest = "";
if (BuildConfig.DEBUG) {
dest = TextUtils.join(";", CommonConst.Mail.forErrorsDebug);
} else {
dest = TextUtils.join(";", CommonConst.Mail.forErrors);
}
MailRequestDTO mailDTO = new MailRequestDTO()
.setFrom("sender@integry.it")
.setFromName((BuildConfig.DEBUG ? "[DEBUG] " : "") + "WMS Android")
.setTo(dest)
.setSubject("Bug notification" + currentAzienda)
.setMsgText(message)
.setHtml(true);
sendMail(mailDTO, () -> {
if (onComplete != null) onComplete.run();
}, ex -> {
Log.e(SystemRESTConsumer.class.getName(), "", ex);
if (onFailed != null) onFailed.run(ex);
});
}
public void sendMailSynchronized(MailRequestDTO mailDTO) throws Exception {
SystemRESTConsumerService service = restBuilder.getService(SystemRESTConsumerService.class);
var response = service.sendMail(mailDTO).execute();

View File

@@ -7,7 +7,6 @@ import it.integry.integrywmsnative.core.rest.model.MailRequestDTO;
import it.integry.integrywmsnative.core.rest.model.NativeSqlRequestDTO;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.rest.model.system.LatestAppVersionInfoDTO;
import it.integry.integrywmsnative.core.rest.model.system.RegisterDeviceRequestDTO;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
@@ -19,9 +18,6 @@ public interface SystemRESTConsumerService {
@GET("wms/currentVersion")
Call<LatestAppVersionInfoDTO> retrieveUpdatesInfo(@Query("suffix") String suffix);
@POST("device/register")
Call<ServiceRESTResponse<Void>> registerDevice(@Body RegisterDeviceRequestDTO registerDeviceRequestDTO);
@POST("processSql")
Call<ServiceRESTResponse<Object>> processSql(@Body NativeSqlRequestDTO nativeSqlDTO);

View File

@@ -12,13 +12,23 @@ import it.integry.integrywmsnative.core.rest.model.uds.InsertUDSRowRequestDTO;
public interface ColliScaricoRESTConsumerInterface {
MtbColt createUDSSynchronized(CreateUDSRequestDTO createUDSRequestDTO) throws Exception;
void createUDS(CreateUDSRequestDTO createUDSRequestDTO, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed);
CloseUDSResponseDTO closeUDSSynchronized(CloseUDSRequestDTO closeUDSRequestDTO) throws Exception;
void closeUDS(CloseUDSRequestDTO closeUDSRequestDTO, RunnableArgs<CloseUDSResponseDTO> onComplete, RunnableArgs<Exception> onFailed);
MtbColr insertUDSRowSynchronized(InsertUDSRowRequestDTO insertUDSRowRequestDTO) throws Exception;
void insertUDSRow(InsertUDSRowRequestDTO insertUDSRowRequestDTO, RunnableArgs<MtbColr> onComplete, RunnableArgs<Exception> onFailed);
MtbColr editUDSRowSynchronized(EditUDSRowRequestDTO editUDSRowRequestDTO) throws Exception;
void editUDSRow(EditUDSRowRequestDTO editUDSRowRequestDTO, RunnableArgs<MtbColr> onComplete, RunnableArgs<Exception> onFailed);
void deleteUDSRowSynchronized(DeleteUDSRowRequestDTO deleteUDSRequestDTO) throws Exception;
void deleteUDSRow(DeleteUDSRowRequestDTO deleteUDSRequestDTO, Runnable onComplete, RunnableArgs<Exception> onFailed);
}

View File

@@ -0,0 +1,21 @@
package it.integry.integrywmsnative.core.rest.deserializer;
import androidx.lifecycle.MutableLiveData;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class MutableLiveDataDeserializer implements JsonDeserializer<MutableLiveData<?>> {
@Override
public MutableLiveData<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Type type = ((ParameterizedType) typeOfT).getActualTypeArguments()[0];
MutableLiveData<Object> liveData = new MutableLiveData<>();
liveData.setValue(context.deserialize(json, type));
return liveData;
}
}

View File

@@ -1,8 +1,13 @@
package it.integry.integrywmsnative.core.rest.model;
import com.google.gson.annotations.SerializedName;
public class AvailableCodMdepsDTO {
@SerializedName("codMdep")
private String codMdep;
@SerializedName("descrizione")
private String descrizione;
public String getCodMdep() {

View File

@@ -337,7 +337,7 @@ public class Ean128Model {
public String Internal3; //Cod-Jfas
///<summary>Informazioni interne</summary>
public String Internal4;
public String Internal4; //Cod-Mdep
///<summary>Informazioni interne</summary>
public String Internal5;

View File

@@ -0,0 +1,27 @@
package it.integry.integrywmsnative.core.rest.model;
import it.integry.integrywmsnative.core.model.MtbColt;
public class UpdatePosizioneULRequestDTO {
private MtbColt mtbColt;
private String posizione;
public MtbColt getMtbColt() {
return mtbColt;
}
public UpdatePosizioneULRequestDTO setMtbColt(MtbColt mtbColt) {
this.mtbColt = mtbColt;
return this;
}
public String getPosizione() {
return posizione;
}
public UpdatePosizioneULRequestDTO setPosizione(String posizione) {
this.posizione = posizione;
return this;
}
}

View File

@@ -0,0 +1,110 @@
package it.integry.integrywmsnative.core.rest.model.materiali;
import java.math.BigDecimal;
import java.time.LocalDate;
public class VersaMaterialiRequestDTO {
private String codMart;
private String partitaMag;
private BigDecimal numCnf;
private BigDecimal qtaCnf;
private BigDecimal qtaTot;
private Integer numCollo;
private LocalDate dataCollo;
private String gestione;
private String serCollo;
private String barcodeUl;
public String getCodMart() {
return codMart;
}
public VersaMaterialiRequestDTO setCodMart(String codMart) {
this.codMart = codMart;
return this;
}
public String getPartitaMag() {
return partitaMag;
}
public VersaMaterialiRequestDTO setPartitaMag(String partitaMag) {
this.partitaMag = partitaMag;
return this;
}
public BigDecimal getNumCnf() {
return numCnf;
}
public VersaMaterialiRequestDTO setNumCnf(BigDecimal numCnf) {
this.numCnf = numCnf;
return this;
}
public BigDecimal getQtaCnf() {
return qtaCnf;
}
public VersaMaterialiRequestDTO setQtaCnf(BigDecimal qtaCnf) {
this.qtaCnf = qtaCnf;
return this;
}
public BigDecimal getQtaTot() {
return qtaTot;
}
public VersaMaterialiRequestDTO setQtaTot(BigDecimal qtaTot) {
this.qtaTot = qtaTot;
return this;
}
public Integer getNumCollo() {
return numCollo;
}
public VersaMaterialiRequestDTO setNumCollo(Integer numCollo) {
this.numCollo = numCollo;
return this;
}
public LocalDate getDataCollo() {
return dataCollo;
}
public VersaMaterialiRequestDTO setDataCollo(LocalDate dataCollo) {
this.dataCollo = dataCollo;
return this;
}
public String getGestione() {
return gestione;
}
public VersaMaterialiRequestDTO setGestione(String gestione) {
this.gestione = gestione;
return this;
}
public String getSerCollo() {
return serCollo;
}
public VersaMaterialiRequestDTO setSerCollo(String serCollo) {
this.serCollo = serCollo;
return this;
}
public String getBarcodeUl() {
return barcodeUl;
}
public VersaMaterialiRequestDTO setBarcodeUl(String barcodeUl) {
this.barcodeUl = barcodeUl;
return this;
}
}

View File

@@ -0,0 +1,4 @@
package it.integry.integrywmsnative.core.rest.model.materiali;
public class VersaMaterialiResponseDTO {
}

Some files were not shown because too many files have changed in this diff Show More