Compare commits

...

86 Commits

Author SHA1 Message Date
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
e541031efe Finish v1.47.02(515) 2025-07-08 16:18:50 +02:00
37 changed files with 940 additions and 684 deletions

2
.gitignore vendored
View File

@@ -149,3 +149,5 @@ crashlytics.properties
crashlytics-build.properties
### AndroidStudio Patch ###
!/gradle/wrapper/gradle-wrapper.jar
/.idea/copilot.data.migration.agent.xml
/.idea/copilot.data.migration.edit.xml

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 = 515
def appVersionName = '1.47.02'
def appVersionCode = 532
def appVersionName = '1.47.19'
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"
@@ -60,6 +61,9 @@ android {
// shrinkResources true // Rimuove risorse non utilizzate
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
firebaseCrashlytics {
mappingFileUploadEnabled true
}
}
}
@@ -91,7 +95,7 @@ android {
abortOnError false
}
namespace 'it.integry.integrywmsnative'
compileSdk 35
compileSdk 36
}
configurations {
@@ -110,18 +114,18 @@ dependencies {
implementation 'com.github.lupaulus:logger:2.3.2'
// Import the Firebase BoM
implementation platform('com.google.firebase:firebase-bom:33.14.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.7.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.appcompat:appcompat:1.7.1'
implementation 'com.google.android.material:material:1.12.0'
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
implementation 'androidx.cardview:cardview:1.0.0'
@@ -134,14 +138,14 @@ dependencies {
}
implementation "androidx.slidingpanelayout:slidingpanelayout:1.2.0"
implementation 'com.squareup.retrofit2:retrofit:2.11.0'
implementation 'com.squareup.retrofit2:converter-gson:2.11.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:2.9.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'
def dagger2_version = '2.57.1'
implementation "com.google.dagger:dagger:$dagger2_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger2_version"
implementation "com.google.dagger:dagger-android:$dagger2_version"
@@ -157,7 +161,7 @@ dependencies {
implementation 'com.github.pedromassango:doubleClick:3.0'
//SQLite ROOM
def room_version = "2.7.1"
def room_version = "2.7.2"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
@@ -183,11 +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 'io.reactivex.rxjava2:rxjava:2.2.21'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
//Barcode generator
implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
implementation("org.javatuples:javatuples:1.2")
}
repositories {

View File

@@ -34,6 +34,12 @@
<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

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

@@ -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

@@ -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

@@ -261,7 +261,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);
}
@@ -271,7 +271,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));
@@ -292,7 +292,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);
}
@@ -301,7 +301,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));
@@ -322,7 +322,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);
}
@@ -331,7 +331,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));
@@ -350,7 +350,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);
}
};
@@ -358,7 +359,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));

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;
@@ -9,6 +10,7 @@ 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 {
@@ -21,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);

View File

@@ -1,17 +1,26 @@
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<RecuperaMaterialiResponseDTO>> versa(@Body VersaMaterialiRequestDTO request);
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

@@ -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,9 +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.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityGson;
import it.integry.integrywmsnative.core.utility.UtilityString;
import retrofit2.Call;
import retrofit2.Response;
@@ -110,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

@@ -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

@@ -39,8 +39,6 @@ public class SettingsManager {
private static SettingsModel settingsModelIstance;
private static DBSettingsModel dbSettingsModelIstance;
private static boolean firstStart = false;
private static Context mContext;
private static SystemRESTConsumer mSystemRESTConsumer;
private static ImballiRESTConsumer mImballiRESTConsumer;
@@ -65,15 +63,15 @@ public class SettingsManager {
public void init() {
settingsModelIstance = (SettingsModel) Stash.getObject(TAG, SettingsModel.class);
if (settingsModelIstance == null) {
if (settingsModelIstance == null)
settingsModelIstance = new SettingsModel();
if (settingsModelIstance.getServer() == null)
settingsModelIstance.setServer(new SettingsModel.Server());
firstStart = true;
}
dbSettingsModelIstance = new DBSettingsModel();
}
public SettingsModel getSettings() {
@@ -89,10 +87,6 @@ public class SettingsManager {
return dbSettingsModelIstance;
}
public static boolean isFirstStart() {
return firstStart;
}
public static boolean isInstanceAvailable() {
return i() != null;
}

View File

@@ -78,7 +78,7 @@ public class UtilityBarcode {
public static boolean isEanPeso(BarcodeScanDTO barcodeScanDTO) {
return (isEtichetta128(barcodeScanDTO) || isEan13(barcodeScanDTO)) && barcodeScanDTO.getStringValue().startsWith("2");
return (isEtichetta128(barcodeScanDTO) || isEan13(barcodeScanDTO)) && barcodeScanDTO.getStringValue().length() == 13 && barcodeScanDTO.getStringValue().startsWith("2");
}
public static boolean isEan8(BarcodeScanDTO barcodeScanDTO) {

View File

@@ -1,6 +1,7 @@
package it.integry.integrywmsnative.core.utility;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
@@ -9,7 +10,8 @@ import it.integry.integrywmsnative.core.CommonConst;
public class UtilityNumber {
private static DecimalFormat decimalFormatInstance;
// Locale italiano per la formattazione
private static final Locale ITALIAN_LOCALE = new Locale("it", "IT");
public static String decimalToString(Float bigDecimal){
if(bigDecimal == null) return "0";
@@ -23,71 +25,59 @@ public class UtilityNumber {
public static String decimalToString(BigDecimal bigDecimal, int decimal){
if(bigDecimal == null) return "0";
return decimalToString(bigDecimal.floatValue(), decimal);
// Usa stripTrailingZeros per rimuovere gli zeri finali
BigDecimal stripped = bigDecimal.stripTrailingZeros();
// Limita il numero di decimali visualizzati
int scale = Math.min(stripped.scale(), decimal);
stripped = stripped.setScale(scale, RoundingMode.DOWN);
// Configura il formato italiano con virgola come separatore decimale
DecimalFormatSymbols italianSymbols = new DecimalFormatSymbols(ITALIAN_LOCALE);
italianSymbols.setDecimalSeparator(',');
// Crea il pattern dinamico basato sul numero di decimali
StringBuilder patternBuilder = new StringBuilder("0");
if (scale > 0) {
patternBuilder.append(".");
for (int i = 0; i < scale; i++) {
patternBuilder.append("0");
}
}
DecimalFormat formatter = new DecimalFormat(patternBuilder.toString(), italianSymbols);
String result = formatter.format(stripped);
// Se il risultato termina con ',', rimuovilo (per i numeri interi)
if (result.endsWith(",")) {
result = result.substring(0, result.length() - 1);
}
return result;
}
public static String decimalToString(float floatValue, int decimal) {
DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(Locale.getDefault());
otherSymbols.setDecimalSeparator('.');
otherSymbols.setGroupingSeparator(',');
final DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setMaximumFractionDigits(decimal);
decimalFormat.setDecimalFormatSymbols(otherSymbols);
decimalFormat.setGroupingUsed(false);
decimalFormat.setMinimumFractionDigits(Math.min(2, decimal));
return decimalFormat.format(floatValue);
return decimalToString(BigDecimal.valueOf(floatValue), decimal);
}
public static DecimalFormat getNumberFormatInstance() {
if(decimalFormatInstance == null) {
DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(Locale.getDefault());
otherSymbols.setDecimalSeparator('.');
otherSymbols.setGroupingSeparator(',');
decimalFormatInstance = new DecimalFormat();
decimalFormatInstance.setMaximumFractionDigits(CommonConst.Config.NUMBER_OF_DECIMAL_DIGITS);
decimalFormatInstance.setDecimalFormatSymbols(otherSymbols);
decimalFormatInstance.setGroupingUsed(false);
public static BigDecimal parseBigDecimal(String value, Locale locale) {
if (value == null || value.trim().isEmpty()) return null;
try {
DecimalFormatSymbols symbols = new DecimalFormatSymbols(locale);
DecimalFormat format = new DecimalFormat();
format.setDecimalFormatSymbols(symbols);
format.setParseBigDecimal(true);
return (BigDecimal) format.parse(value);
} catch (Exception e) {
return null;
}
return decimalFormatInstance;
}
public static int countNumberOfDecimalDigits(Float value) {
String text = getNumberFormatInstance().format(Math.abs(value));
int integerPlaces = text.indexOf('.');
int decimalPlaces = text.length() - integerPlaces - 1;
return decimalPlaces;
}
public static String normalizeStringNumber(String numberString) {
return numberString.replaceAll(",", ".");
}
public static Float decimalToFloat(BigDecimal bigDecimalValue) {
float multiplier = (float) Math.pow(10, CommonConst.Config.NUMBER_OF_DECIMAL_DIGITS);
Float floatValue = null;
if(bigDecimalValue != null) {
int intValue = (int) (bigDecimalValue.floatValue() * multiplier);
floatValue = Float.valueOf(intValue / multiplier);
}
return floatValue;
}
public static float truncateToDecimal(float v, int i) {
int delta = 10*i;
return ((int)v*delta)/delta;
/**
* Parsa una stringa numerica italiana (con virgola come separatore decimale)
* e restituisce un BigDecimal
*/
public static BigDecimal parseItalianBigDecimal(String value) {
return parseBigDecimal(value, ITALIAN_LOCALE);
}
}

View File

@@ -45,9 +45,7 @@ public class DialogSelectDocInfo_FornitoreAdapter extends ArrayAdapter<DialogSel
@Override
public String toString() {
return this.getOriginalModel().getCodAnag() +
(this.getOriginalModel().getCodVdes() != null ? " - " + this.getOriginalModel().getCodVdes() : "") +
" ( " + this.getOriginalModel().getDescrizione() + " )";
return this.getOriginalModel().getDescrizione();
}
}

View File

@@ -49,8 +49,12 @@ public class LoginViewModel {
FirebaseInstallations.getInstance().getId().addOnCompleteListener(fid -> {
SettingsManager.i().createUserSession();
retrieveAvailableProfiles(protocol, host, port, username, password, selectedProfile -> {
SettingsManager.i().createUserSession();
if(selectedProfile == null) {
this.sendOnLoadingEnded();
return;
}
authenticate(protocol, host, port, username, password, selectedProfile, fid.getResult(), fullName -> {
@@ -126,6 +130,8 @@ public class LoginViewModel {
}
private void authenticate(String protocol, String host, int port, String username, String password, String profileDb, String deviceSalt, RunnableArgs<String> onComplete) {
mAuthenticationRESTConsumer.authenticate(protocol, host, port, username, password, profileDb, deviceSalt, sessionData -> {
var claims = JwtUtils.parseJwt(sessionData.getAccessToken());

View File

@@ -284,8 +284,8 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab
MenuConfiguration baseMenuConfiguration = new MenuConfiguration();
List<MenuConfiguration.MenuGroup> menuGroups = baseMenuConfiguration.getGroups();
for (int i = 0; i < menuGroups.size(); i++) {
try {
try {
for (int i = 0; i < menuGroups.size(); i++) {
BaseMenuConfiguration.MenuGroup menuGroup = menuGroups.get(i);
@@ -313,16 +313,12 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab
menuListAdapter.setClickListener(this::onMenuClick);
mBindings.menuContainer.addView(groupBinding.getRoot());
}
} catch (Exception exception) {
UtilityExceptions.defaultException(requireActivity(), exception);
}
}
} catch (Exception exception) {
UtilityExceptions.defaultException(requireActivity(), exception);
}
}
private void onMenuClick(MenuConfiguration.MenuItem menuItem) {

View File

@@ -122,7 +122,13 @@ public class ProdRecuperoMaterialeFragment extends BaseFragment implements ITitl
BarcodeManager.removeCallback(mBarcodeScannerInstanceID);
}
});
mViewModel.init(codJfas);
mViewModel.refreshData(); // This will eventually trigger the LiveData observer for getOrderList
mBinding.swiperefresh.setOnRefreshListener(() -> {
mViewModel.refreshData();
});
}
@@ -299,8 +305,30 @@ public class ProdRecuperoMaterialeFragment extends BaseFragment implements ITitl
@Override
public void onDataSaved() {
this.onLoadingEnded();
this.requireActivity().runOnUiThread(() -> {
handler.post(() -> {
DialogCommon.showDataSaved(requireActivity(), this::popMe);
});
}
@Override
public void onDataRefreshStarted() {
handler.post(() -> {
mBinding.swiperefresh.setRefreshing(true);
});
}
@Override
public void onDataRefreshEnded() {
handler.post(() -> {
mBinding.swiperefresh.setRefreshing(false);
// applyFilters(); // Non strettamente necessario qui se l'observer di getOrderList() fa il suo dovere
});
}
@Override
public void onError(Exception ex) {
super.onError(ex);
onDataRefreshEnded();
}
}

View File

@@ -1,28 +1,10 @@
package it.integry.integrywmsnative.gest.prod_recupero_materiale;
import dagger.Module;
import dagger.Provides;
import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.MaterialiRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.PrinterRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer;
import it.integry.integrywmsnative.gest.prod_recupero_materiale.rest.ProdRecuperoMaterialeRESTConsumer;
@Module(subcomponents = ProdRecuperoMaterialeComponent.class)
public class ProdRecuperoMaterialeModule {
@Provides
ProdRecuperoMaterialeRESTConsumer providesProdRecuperMaterialeRESTConsumer(SystemRESTConsumer systemRESTConsumer, ArticoloRESTConsumer articoloRESTConsumer) {
return new ProdRecuperoMaterialeRESTConsumer(systemRESTConsumer, articoloRESTConsumer);
}
@Provides
ProdRecuperoMaterialeViewModel providesProdRecuperoMaterialeViewModel(ProdRecuperoMaterialeRESTConsumer prodRecuperoMaterialeRESTConsumer,
ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer,
PrinterRESTConsumer printerRESTConsumer,
MaterialiRESTConsumer materialiRESTConsumer) {
return new ProdRecuperoMaterialeViewModel(prodRecuperoMaterialeRESTConsumer, colliMagazzinoRESTConsumer, printerRESTConsumer, materialiRESTConsumer);
}
}

View File

@@ -3,8 +3,10 @@ package it.integry.integrywmsnative.gest.prod_recupero_materiale;
import androidx.lifecycle.MutableLiveData;
import java.math.BigDecimal;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
import javax.inject.Inject;
@@ -32,31 +34,46 @@ public class ProdRecuperoMaterialeViewModel {
private final ColliMagazzinoRESTConsumer mColliMagazzinoRESTConsumer;
private final PrinterRESTConsumer mPrinterRESTConsumer;
private final MaterialiRESTConsumer mMaterialiRESTConsumer;
private final ExecutorService mExecutorService;
private final MutableLiveData<List<HistoryVersamentoProdULDTO>> mUlList = new MutableLiveData<>();
private Listener mListener;
private String mCodJfas;
@Inject
public ProdRecuperoMaterialeViewModel(ProdRecuperoMaterialeRESTConsumer prodRecuperoMaterialeRESTConsumer,
ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer,
PrinterRESTConsumer printerRESTConsumer,
MaterialiRESTConsumer materialiRESTConsumer) {
MaterialiRESTConsumer materialiRESTConsumer,
ExecutorService executorService) {
this.mProdRecuperoMaterialeRESTConsumer = prodRecuperoMaterialeRESTConsumer;
this.mColliMagazzinoRESTConsumer = colliMagazzinoRESTConsumer;
this.mPrinterRESTConsumer = printerRESTConsumer;
this.mMaterialiRESTConsumer = materialiRESTConsumer;
this.mExecutorService = executorService;
}
public void init(String codJfas) {
this.sendOnLoadingStarted();
this.mCodJfas = codJfas;
}
mProdRecuperoMaterialeRESTConsumer.loadLastULVersate(codJfas, ulList -> {
this.mUlList.setValue(ulList);
public void refreshData() {
this.sendOnDataRefreshStarted();
this.sendOnLoadingEnded();
}, this::sendError);
this.mExecutorService.execute(() -> {
try {
List<HistoryVersamentoProdULDTO> lastUlVersate = mProdRecuperoMaterialeRESTConsumer.loadLastULVersateSynchronized(mCodJfas);
lastUlVersate.sort(Comparator.comparing(HistoryVersamentoProdULDTO::getCodJfas));
this.mUlList.postValue(lastUlVersate);
this.sendOnDataRefreshEnded();
} catch (Exception e) {
this.sendError(e);
}
});
}
public void processBarcodeDTO(BarcodeScanDTO data) {
@@ -204,6 +221,14 @@ public class ProdRecuperoMaterialeViewModel {
return this;
}
private void sendOnDataRefreshStarted() {
if (this.mListener != null) mListener.onDataRefreshStarted();
}
private void sendOnDataRefreshEnded() {
if (this.mListener != null) mListener.onDataRefreshEnded();
}
private void sendOnLoadingStarted() {
if (this.mListener != null) mListener.onLoadingStarted();
}
@@ -274,6 +299,10 @@ public class ProdRecuperoMaterialeViewModel {
void onNoLUFound(Runnable onComplete);
void onDataSaved();
void onDataRefreshStarted();
void onDataRefreshEnded();
}
}

View File

@@ -1,310 +1,432 @@
package it.integry.integrywmsnative.gest.prod_recupero_materiale.rest;
import com.annimon.stream.Stream;
import com.google.gson.reflect.TypeToken;
import androidx.annotation.NonNull;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.inject.Singleton;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.model.MtbAart;
import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.MaterialiRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers._BaseRESTConsumer;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityDB;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.gest.prod_recupero_materiale.dto.HistoryVersamentoProdULDTO;
import it.integry.integrywmsnative.gest.prod_recupero_materiale.dto.HistoryVersamentoProdULRestDTO;
@Singleton
public class ProdRecuperoMaterialeRESTConsumer extends _BaseRESTConsumer {
private final SystemRESTConsumer mSystemRESTConsumer;
private final ArticoloRESTConsumer mArticoloRESTConsumer;
private final MaterialiRESTConsumer mMaterialiRESTConsumer;
public ProdRecuperoMaterialeRESTConsumer(SystemRESTConsumer systemRESTConsumer, ArticoloRESTConsumer articoloRESTConsumer) {
this.mSystemRESTConsumer = systemRESTConsumer;
@Inject
public ProdRecuperoMaterialeRESTConsumer(ArticoloRESTConsumer articoloRESTConsumer, MaterialiRESTConsumer materialiRESTConsumer) {
this.mMaterialiRESTConsumer = materialiRESTConsumer;
this.mArticoloRESTConsumer = articoloRESTConsumer;
}
public void loadLastULVersate(RunnableArgs<List<HistoryVersamentoProdULDTO>> onComplete, RunnableArgs<Exception> onFailed) {
loadLastULVersate(null, onComplete, onFailed);
public List<HistoryVersamentoProdULDTO> loadLastULVersateSynchronized() throws Exception {
return loadLastULVersateSynchronized(null);
}
public void loadLastULVersate(String codJfas, RunnableArgs<List<HistoryVersamentoProdULDTO>> onComplete, RunnableArgs<Exception> onFailed) {
public @NonNull List<HistoryVersamentoProdULDTO> loadLastULVersateSynchronized(String codJfas) throws Exception {
var ulList = mMaterialiRESTConsumer.makeSynchronousRetrieveLastVersamentiRequest(codJfas);
String sql = "WITH ul_list AS ( " +
" SELECT jtb_fasi.cod_jfas, " +
" jtb_fasi.descrizione AS descrizione_fase, " +
" mtb_colr.gestione, " +
" mtb_colr.data_collo, " +
" mtb_colr.num_collo, " +
" mtb_colr.ser_collo, " +
" mtb_colr.cod_mart, " +
" mtb_colr.cod_col, " +
" mtb_colr.cod_tagl, " +
" SUM(mtb_colr.qta_col) AS qta_col, " +
" mtb_colr.qta_cnf AS qta_cnf, " +
" SUM(mtb_colr.num_cnf) AS num_cnf, " +
" mtb_colr.partita_mag, " +
" mtb_colr.cod_jcom, " +
" mtb_colr.num_collo_rif, " +
" mtb_colr.data_collo_rif, " +
" mtb_colr.ser_collo_rif, " +
" mtb_colr.gestione_rif, " +
" mtb_colt.segno, " +
" ISNULL(mtb_aart.descrizione_estesa, mtb_aart.descrizione) AS descrizione_art, " +
" mtb_aart.unt_mis, " +
" MAX(datetime_row) AS datetime_row, " +
" mtb_colr.num_ord, " +
" mtb_colr.data_ord, " +
" mtb_colr.gestione as gestione_ord, " +
" mtb_colr.riga_ord, " +
" dtb_ord_steps.hr_num as hr, " +
" CONVERT(INTEGER, ROUND((CAST(dtb_ord_steps.hr_num AS DECIMAL(20, 5)) / " +
" SUM(dtb_ord_steps.hr_num) OVER (PARTITION BY mtb_colr.num_collo)) * 100, " +
" SUM(CASE WHEN dtb_ord_steps.hr_num > 0 then dtb_ord_steps.hr_num else 1 end) OVER (PARTITION BY mtb_colr.num_collo)) * 100, " +
" 0) as percentage_hr " +
" FROM mtb_colr " +
" INNER JOIN mtb_colt ON mtb_colr.num_collo = mtb_colt.num_collo " +
" AND mtb_colr.data_collo = mtb_colt.data_collo " +
" AND mtb_colr.ser_collo = mtb_colt.ser_collo " +
" AND mtb_colr.gestione = mtb_colt.gestione " +
" " + (SettingsManager.iDB().isFlagVersamentoDirettoProduzione() ? "INNER" : "LEFT OUTER") + " join dtb_ord_steps ON dtb_ord_steps.data_ord = mtb_colr.data_ord " +
" AND dtb_ord_steps.gestione = mtb_colr.gestione " +
" AND dtb_ord_steps.num_ord = mtb_colr.num_ord " +
" AND dtb_ord_steps.data_iniz is not null " +
" AND dtb_ord_steps.data_fine is null " +
" INNER JOIN mtb_aart ON mtb_colr.cod_mart = mtb_aart.cod_mart " +
" LEFT OUTER JOIN jtb_fasi ON mtb_colt.cod_jfas = jtb_fasi.cod_jfas " +
" WHERE jtb_fasi.cod_jfas IS NOT NULL " +
(UtilityString.isNullOrEmpty(codJfas) ? "" : " AND jtb_fasi.cod_jfas = " + UtilityDB.valueToString(codJfas)) +
" AND segno = -1 " +
" AND mtb_colr.data_collo > DATEADD(DAY, -5, GETDATE()) " +
" GROUP BY jtb_fasi.cod_jfas, " +
" jtb_fasi.descrizione, " +
" mtb_colr.gestione, " +
" mtb_colr.data_collo, " +
" mtb_colr.num_collo, " +
" mtb_colr.ser_collo, " +
" mtb_colr.qta_cnf, " +
" mtb_colr.cod_mart, " +
" mtb_colr.cod_col, " +
" mtb_colr.cod_tagl, " +
" mtb_colr.ser_collo, " +
" mtb_colr.partita_mag, " +
" mtb_colr.cod_jcom, " +
" mtb_aart.descrizione_estesa, " +
" mtb_aart.descrizione, " +
" mtb_aart.unt_mis, " +
" mtb_colr.num_collo_rif, " +
" mtb_colr.data_collo_rif, " +
" mtb_colr.ser_collo_rif, " +
" mtb_colr.gestione_rif, " +
" mtb_colt.segno, " +
" mtb_colr.num_ord, " +
" mtb_colr.data_ord, " +
" mtb_colr.gestione, " +
" mtb_colr.riga_ord, " +
" dtb_ord_steps.hr_num " +
" HAVING SUM(mtb_colr.qta_col) > 0 " +
"), max_ul AS ( " +
" SELECT " +
" cod_jfas, " +
" descrizione_fase, " +
" gestione, " +
" cod_mart, " +
" cod_col, " +
" cod_tagl, " +
" ser_collo, " +
" partita_mag, " +
" cod_jcom, " +
" descrizione_art, " +
" unt_mis, " +
" num_collo_rif, " +
" data_collo_rif, " +
" ser_collo_rif, " +
" gestione_rif, " +
" segno, " +
" num_ord, " +
" data_ord, " +
" gestione_ord, " +
" riga_ord, " +
" hr, " +
" MAX (datetime_row) as max_datetime_row " +
" FROM ul_list " +
" GROUP BY cod_jfas, " +
" descrizione_fase, " +
" gestione, " +
" cod_mart, " +
" cod_col, " +
" cod_tagl, " +
" ser_collo, " +
" partita_mag, " +
" cod_jcom, " +
" descrizione_art, " +
" unt_mis, " +
" num_collo_rif, " +
" data_collo_rif, " +
" ser_collo_rif, " +
" gestione_rif, " +
" segno, " +
" num_ord, " +
" data_ord, " +
" gestione_ord, " +
" riga_ord, " +
" hr " +
") " +
" " +
"SELECT ul_list.* FROM max_ul " +
"LEFT OUTER JOIN ul_list ON " +
" ISNULL(max_ul.cod_jfas, '') = ISNULL(ul_list.cod_jfas, '') AND " +
" ISNULL(max_ul.descrizione_fase, '') = ISNULL(ul_list.descrizione_fase, '') AND " +
" ISNULL(max_ul.gestione, '') = ISNULL(ul_list.gestione, '') AND " +
" ISNULL(max_ul.cod_mart, '') = ISNULL(ul_list.cod_mart, '') AND " +
" ISNULL(max_ul.cod_col, '') = ISNULL(ul_list.cod_col, '') AND " +
" ISNULL(max_ul.cod_tagl, '') = ISNULL(ul_list.cod_tagl, '') AND " +
" ISNULL(max_ul.ser_collo, '') = ISNULL(ul_list.ser_collo, '') AND " +
" ISNULL(max_ul.partita_mag, '') = ISNULL(ul_list.partita_mag, '') AND " +
" ISNULL(max_ul.cod_jcom, '') = ISNULL(ul_list.cod_jcom, '') AND " +
" ISNULL(max_ul.descrizione_art, '') = ISNULL(ul_list.descrizione_art, '') AND " +
" ISNULL(max_ul.unt_mis, '') = ISNULL(ul_list.unt_mis, '') AND " +
" ISNULL(max_ul.num_collo_rif, '') = ISNULL(ul_list.num_collo_rif, '') AND " +
" ISNULL(max_ul.data_collo_rif, '') = ISNULL(ul_list.data_collo_rif, '') AND " +
" ISNULL(max_ul.ser_collo_rif, '') = ISNULL(ul_list.ser_collo_rif, '') AND " +
" ISNULL(max_ul.gestione_rif, '') = ISNULL(ul_list.gestione_rif, '') AND " +
" ISNULL(max_ul.segno, '') = ISNULL(ul_list.segno, '') AND " +
" ISNULL(max_ul.num_ord, '') = ISNULL(ul_list.num_ord, '') AND " +
" ISNULL(max_ul.data_ord, '') = ISNULL(ul_list.data_ord, '') AND " +
" ISNULL(max_ul.gestione_ord, '') = ISNULL(ul_list.gestione_ord, '') AND " +
" ISNULL(max_ul.riga_ord, '') = ISNULL(ul_list.riga_ord, '') AND " +
" ISNULL(max_ul.hr, '') = ISNULL(ul_list.hr, '') AND " +
" max_ul.max_datetime_row = ul_list.datetime_row";
if (ulList == null) {
return new ArrayList<>();
}
Type typeOfObjectsList = new TypeToken<ArrayList<HistoryVersamentoProdULRestDTO>>() {
}.getType();
this.mSystemRESTConsumer.<ArrayList<HistoryVersamentoProdULRestDTO>>processSql(sql, typeOfObjectsList, ulList -> {
List<HistoryVersamentoProdULDTO> newUlList = new ArrayList<>();
if (ulList == null) {
onComplete.run(null);
return;
Map<HashMap<String, Object>, List<HistoryVersamentoProdULRestDTO>> ulListGrouped = ulList.stream()
.collect(Collectors.groupingBy(x -> {
var keyMap = new HashMap<String, Object>();
keyMap.put("gestione", x.getGestione());
keyMap.put("data_collo", x.getDataCollo());
keyMap.put("ser_collo", x.getSerCollo());
keyMap.put("num_collo", x.getNumCollo());
keyMap.put("cod_mart", x.getCodMart());
keyMap.put("partita_mag", x.getPartitaMag());
keyMap.put("gestione_rif", x.getGestioneRif());
keyMap.put("data_collo_rif", x.getDataColloRif());
keyMap.put("ser_collo_rif", x.getSerColloRif());
keyMap.put("num_collo_rif", x.getNumColloRif());
return keyMap;
}, Collectors.toList()));
for (HashMap<String, Object> ulKey : ulListGrouped.keySet()) {
var matchingUls = ulList.stream().filter(x ->
Objects.equals(x.getGestione(), ulKey.get("gestione")) &&
Objects.equals(x.getDataCollo(), ulKey.get("data_collo")) &&
Objects.equals(x.getSerCollo(), ulKey.get("ser_collo")) &&
Objects.equals(x.getNumCollo(), ulKey.get("num_collo")) &&
Objects.equals(x.getCodMart(), ulKey.get("cod_mart")) &&
Objects.equals(x.getPartitaMag(), ulKey.get("partita_mag")) &&
Objects.equals(x.getGestioneRif(), ulKey.get("gestione_rif")) &&
Objects.equals(x.getDataColloRif(), ulKey.get("data_collo_rif")) &&
Objects.equals(x.getSerColloRif(), ulKey.get("ser_collo_rif")) &&
Objects.equals(x.getNumColloRif(), ulKey.get("num_collo_rif"))
).collect(Collectors.toUnmodifiableList());
ulKey.put("qta_col", matchingUls.stream().map(HistoryVersamentoProdULRestDTO::getQtaCol)
.reduce(BigDecimal.ZERO, BigDecimal::add));
ulKey.put("num_cnf", matchingUls.stream().map(HistoryVersamentoProdULRestDTO::getNumCnf)
.reduce(BigDecimal.ZERO, BigDecimal::add));
}
ulListGrouped.forEach((key, value) -> {
var listaOrdini = value.stream()
.filter(x -> x.getDataOrd() != null &&
x.getGestioneOrd() != null &&
x.getNumOrd() != null)
.map(x -> new HistoryVersamentoProdULDTO.OrdineDto()
.setData(x.getDataOrd())
.setNumero(x.getNumOrd())
.setGestione(x.getGestione())
.setRigaOrd(x.getRigaOrd())
.setQtaCol(x.getQtaCol())
.setNumCnf(x.getNumCnf())
.setPercentageHr(x.getPercentageHr()))
.distinct()
.collect(Collectors.toUnmodifiableList());
var restData = value.get(0);
var qtaCol = (BigDecimal) key.get("qta_col");
var numCnf = (BigDecimal) key.get("num_cnf");
newUlList.add(new HistoryVersamentoProdULDTO()
.setGestione(restData.getGestione())
.setDataCollo(restData.getDataCollo())
.setSerCollo(restData.getSerCollo())
.setNumCollo(restData.getNumCollo())
.setSegno(restData.getSegno())
.setCodMart(restData.getCodMart())
.setCodCol(restData.getCodCol())
.setCodTagl(restData.getCodTagl())
.setCodJfas(restData.getCodJfas())
.setDescrizioneArt(restData.getDescrizioneArt())
.setDescrizioneFase(restData.getDescrizioneFase())
.setQtaCol(qtaCol)
.setQtaCnf(restData.getQtaCnf())
.setNumCnf(numCnf)
.setPartitaMag(restData.getPartitaMag())
.setCodJcom(restData.getCodJcom())
.setDatetimeRow(restData.getDatetimeRow())
.setUntMis(restData.getUntMis())
.setGestioneRif(restData.getGestioneRif())
.setDataColloRif(restData.getDataColloRif())
.setSerColloRif(restData.getSerColloRif())
.setNumColloRif(restData.getNumColloRif())
.setOrdini(listaOrdini));
});
if (!newUlList.isEmpty()) {
List<String> codMarts = newUlList.stream()
.map(HistoryVersamentoProdULDTO::getCodMart)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toUnmodifiableList());
var arts = this.mArticoloRESTConsumer.getByCodMartsSynchronized(codMarts);
if (arts != null && !arts.isEmpty()) {
for (HistoryVersamentoProdULDTO value : newUlList) {
MtbAart foundMtbAart = arts.stream()
.filter(x -> x.getCodMart().equalsIgnoreCase(value.getCodMart()))
.findFirst()
.orElse(null);
value.setMtbAart(foundMtbAart);
}
}
List<HistoryVersamentoProdULDTO> newUlList = new ArrayList<>();
return newUlList;
Stream.of(ulList)
.distinctBy(x -> {
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("gestione", x.getGestione());
hashMap.put("data_collo", x.getDataCollo());
hashMap.put("ser_collo", x.getSerCollo());
hashMap.put("num_collo", x.getNumCollo());
hashMap.put("cod_mart", x.getCodMart());
hashMap.put("gestione_rif", x.getGestioneRif());
hashMap.put("data_collo_rif", x.getDataColloRif());
hashMap.put("ser_collo_rif", x.getSerColloRif());
hashMap.put("num_collo_rif", x.getNumColloRif());
return hashMap;
})
.forEach(restDTO -> {
} else {
return newUlList;
}
}
List<HistoryVersamentoProdULDTO.OrdineDto> ordineList = ulList.stream()
.filter(x -> x.getNumCollo().equals(restDTO.getNumCollo()) &&
x.getDataCollo().equals(restDTO.getDataCollo()) &&
x.getSerCollo().equals(restDTO.getSerCollo()) &&
x.getGestione().equals(restDTO.getGestione()) &&
(x.getRigaOrd() == null || Objects.equals(x.getRigaOrd(), restDTO.getRigaOrd())))
.map(x -> new HistoryVersamentoProdULDTO.OrdineDto()
.setData(x.getDataOrd())
.setNumero(x.getNumOrd())
.setGestione(x.getGestione())
.setRigaOrd(x.getRigaOrd())
.setQtaCol(x.getQtaCol())
.setNumCnf(x.getNumCnf())
.setPercentageHr(x.getPercentageHr()))
.collect(Collectors.toList());
// BigDecimal qtaColTot = BigDecimal.ZERO;
// BigDecimal numCnfColTot = BigDecimal.ZERO;
// public void loadLastULVersate(String codJfas, RunnableArgs<List<HistoryVersamentoProdULDTO>> onComplete, RunnableArgs<Exception> onFailed) {
//
// for (HistoryVersamentoProdULDTO.OrdineDto ordine :
// ordineList) {
// qtaColTot = qtaColTot.add(ordine.getQtaCol());
// numCnfColTot = numCnfColTot.add(ordine.getNumCnf());
// String sql = "WITH ul_list AS ( " +
// " SELECT jtb_fasi.cod_jfas, " +
// " jtb_fasi.descrizione AS descrizione_fase, " +
// " mtb_colr.gestione, " +
// " mtb_colr.data_collo, " +
// " mtb_colr.num_collo, " +
// " mtb_colr.ser_collo, " +
// " mtb_colr.cod_mart, " +
// " mtb_colr.cod_col, " +
// " mtb_colr.cod_tagl, " +
// " SUM(mtb_colr.qta_col) AS qta_col, " +
// " mtb_colr.qta_cnf AS qta_cnf, " +
// " SUM(mtb_colr.num_cnf) AS num_cnf, " +
// " mtb_colr.partita_mag, " +
// " mtb_colr.cod_jcom, " +
// " mtb_colr.num_collo_rif, " +
// " mtb_colr.data_collo_rif, " +
// " mtb_colr.ser_collo_rif, " +
// " mtb_colr.gestione_rif, " +
// " mtb_colt.segno, " +
// " ISNULL(mtb_aart.descrizione_estesa, mtb_aart.descrizione) AS descrizione_art, " +
// " mtb_aart.unt_mis, " +
// " MAX(datetime_row) AS datetime_row, " +
// " mtb_colr.num_ord, " +
// " mtb_colr.data_ord, " +
// " mtb_colr.gestione as gestione_ord, " +
// " mtb_colr.riga_ord, " +
// " dtb_ord_steps.hr_num as hr, " +
// " CONVERT(INTEGER, ROUND((CAST(dtb_ord_steps.hr_num AS DECIMAL(20, 5)) / " +
// " SUM(dtb_ord_steps.hr_num) OVER (PARTITION BY mtb_colr.num_collo)), " +
// " SUM(CASE WHEN dtb_ord_steps.hr_num > 0 then dtb_ord_steps.hr_num else 1 end) OVER (PARTITION BY mtb_colr.num_collo)) * 100, " +
// " 0) as percentage_hr " +
// " FROM mtb_colr " +
// " INNER JOIN mtb_colt ON mtb_colr.num_collo = mtb_colt.num_collo " +
// " AND mtb_colr.data_collo = mtb_colt.data_collo " +
// " AND mtb_colr.ser_collo = mtb_colt.ser_collo " +
// " AND mtb_colr.gestione = mtb_colt.gestione " +
// " " + (SettingsManager.iDB().isFlagVersamentoDirettoProduzione() ? "INNER" : "LEFT OUTER") + " join dtb_ord_steps ON dtb_ord_steps.data_ord = mtb_colr.data_ord " +
// " AND dtb_ord_steps.gestione = mtb_colr.gestione " +
// " AND dtb_ord_steps.num_ord = mtb_colr.num_ord " +
// " AND dtb_ord_steps.data_iniz is not null " +
// " AND dtb_ord_steps.data_fine is null " +
// " INNER JOIN mtb_aart ON mtb_colr.cod_mart = mtb_aart.cod_mart " +
// " LEFT OUTER JOIN jtb_fasi ON mtb_colt.cod_jfas = jtb_fasi.cod_jfas " +
// " WHERE jtb_fasi.cod_jfas IS NOT NULL " +
// (UtilityString.isNullOrEmpty(codJfas) ? "" : " AND jtb_fasi.cod_jfas = " + UtilityDB.valueToString(codJfas)) +
// " AND segno = -1 " +
// " AND mtb_colr.data_collo > DATEADD(DAY, -5, GETDATE()) " +
// " GROUP BY jtb_fasi.cod_jfas, " +
// " jtb_fasi.descrizione, " +
// " mtb_colr.gestione, " +
// " mtb_colr.data_collo, " +
// " mtb_colr.num_collo, " +
// " mtb_colr.ser_collo, " +
// " mtb_colr.qta_cnf, " +
// " mtb_colr.cod_mart, " +
// " mtb_colr.cod_col, " +
// " mtb_colr.cod_tagl, " +
// " mtb_colr.ser_collo, " +
// " mtb_colr.partita_mag, " +
// " mtb_colr.cod_jcom, " +
// " mtb_aart.descrizione_estesa, " +
// " mtb_aart.descrizione, " +
// " mtb_aart.unt_mis, " +
// " mtb_colr.num_collo_rif, " +
// " mtb_colr.data_collo_rif, " +
// " mtb_colr.ser_collo_rif, " +
// " mtb_colr.gestione_rif, " +
// " mtb_colt.segno, " +
// " mtb_colr.num_ord, " +
// " mtb_colr.data_ord, " +
// " mtb_colr.gestione, " +
// " mtb_colr.riga_ord, " +
// " dtb_ord_steps.hr_num " +
// " HAVING SUM(mtb_colr.qta_col) > 0 " +
// "), max_ul AS ( " +
// " SELECT " +
// " cod_jfas, " +
// " descrizione_fase, " +
// " gestione, " +
// " cod_mart, " +
// " cod_col, " +
// " cod_tagl, " +
// " ser_collo, " +
// " partita_mag, " +
// " cod_jcom, " +
// " descrizione_art, " +
// " unt_mis, " +
// " num_collo_rif, " +
// " data_collo_rif, " +
// " ser_collo_rif, " +
// " gestione_rif, " +
// " segno, " +
// " num_ord, " +
// " data_ord, " +
// " gestione_ord, " +
// " riga_ord, " +
// " hr, " +
// " MAX (datetime_row) as max_datetime_row " +
// " FROM ul_list " +
// " GROUP BY cod_jfas, " +
// " descrizione_fase, " +
// " gestione, " +
// " cod_mart, " +
// " cod_col, " +
// " cod_tagl, " +
// " ser_collo, " +
// " partita_mag, " +
// " cod_jcom, " +
// " descrizione_art, " +
// " unt_mis, " +
// " num_collo_rif, " +
// " data_collo_rif, " +
// " ser_collo_rif, " +
// " gestione_rif, " +
// " segno, " +
// " num_ord, " +
// " data_ord, " +
// " gestione_ord, " +
// " riga_ord, " +
// " hr " +
// ") " +
// " " +
// "SELECT ul_list.* FROM max_ul " +
// "LEFT OUTER JOIN ul_list ON " +
// " ISNULL(max_ul.cod_jfas, '') = ISNULL(ul_list.cod_jfas, '') AND " +
// " ISNULL(max_ul.descrizione_fase, '') = ISNULL(ul_list.descrizione_fase, '') AND " +
// " ISNULL(max_ul.gestione, '') = ISNULL(ul_list.gestione, '') AND " +
// " ISNULL(max_ul.cod_mart, '') = ISNULL(ul_list.cod_mart, '') AND " +
// " ISNULL(max_ul.cod_col, '') = ISNULL(ul_list.cod_col, '') AND " +
// " ISNULL(max_ul.cod_tagl, '') = ISNULL(ul_list.cod_tagl, '') AND " +
// " ISNULL(max_ul.ser_collo, '') = ISNULL(ul_list.ser_collo, '') AND " +
// " ISNULL(max_ul.partita_mag, '') = ISNULL(ul_list.partita_mag, '') AND " +
// " ISNULL(max_ul.cod_jcom, '') = ISNULL(ul_list.cod_jcom, '') AND " +
// " ISNULL(max_ul.descrizione_art, '') = ISNULL(ul_list.descrizione_art, '') AND " +
// " ISNULL(max_ul.unt_mis, '') = ISNULL(ul_list.unt_mis, '') AND " +
// " ISNULL(max_ul.num_collo_rif, '') = ISNULL(ul_list.num_collo_rif, '') AND " +
// " ISNULL(max_ul.data_collo_rif, '') = ISNULL(ul_list.data_collo_rif, '') AND " +
// " ISNULL(max_ul.ser_collo_rif, '') = ISNULL(ul_list.ser_collo_rif, '') AND " +
// " ISNULL(max_ul.gestione_rif, '') = ISNULL(ul_list.gestione_rif, '') AND " +
// " ISNULL(max_ul.segno, '') = ISNULL(ul_list.segno, '') AND " +
// " ISNULL(max_ul.num_ord, '') = ISNULL(ul_list.num_ord, '') AND " +
// " ISNULL(max_ul.data_ord, '') = ISNULL(ul_list.data_ord, '') AND " +
// " ISNULL(max_ul.gestione_ord, '') = ISNULL(ul_list.gestione_ord, '') AND " +
// " ISNULL(max_ul.riga_ord, '') = ISNULL(ul_list.riga_ord, '') AND " +
// " ISNULL(max_ul.hr, '') = ISNULL(ul_list.hr, '') AND " +
// " max_ul.max_datetime_row = ul_list.datetime_row";
//
// Type typeOfObjectsList = new TypeToken<ArrayList<HistoryVersamentoProdULRestDTO>>() {
// }.getType();
// this.mSystemRESTConsumer.<ArrayList<HistoryVersamentoProdULRestDTO>>processSql(sql, typeOfObjectsList, ulList -> {
//
// if (ulList == null) {
// onComplete.run(null);
// return;
// }
//
// List<HistoryVersamentoProdULDTO> newUlList = new ArrayList<>();
//
// Stream.of(ulList)
// .distinctBy(x -> {
// HashMap<String, Object> hashMap = new HashMap<>();
// hashMap.put("gestione", x.getGestione());
// hashMap.put("data_collo", x.getDataCollo());
// hashMap.put("ser_collo", x.getSerCollo());
// hashMap.put("num_collo", x.getNumCollo());
// hashMap.put("cod_mart", x.getCodMart());
// hashMap.put("gestione_rif", x.getGestioneRif());
// hashMap.put("data_collo_rif", x.getDataColloRif());
// hashMap.put("ser_collo_rif", x.getSerColloRif());
// hashMap.put("num_collo_rif", x.getNumColloRif());
//
// return hashMap;
// })
// .forEach(restDTO -> {
//
// List<HistoryVersamentoProdULDTO.OrdineDto> ordineList = ulList.stream()
// .filter(x -> x.getNumCollo().equals(restDTO.getNumCollo()) &&
// x.getDataCollo().equals(restDTO.getDataCollo()) &&
// x.getSerCollo().equals(restDTO.getSerCollo()) &&
// x.getGestione().equals(restDTO.getGestione()) &&
// (x.getRigaOrd() == null || Objects.equals(x.getRigaOrd(), restDTO.getRigaOrd())))
// .map(x -> new HistoryVersamentoProdULDTO.OrdineDto()
// .setData(x.getDataOrd())
// .setNumero(x.getNumOrd())
// .setGestione(x.getGestione())
// .setRigaOrd(x.getRigaOrd())
// .setQtaCol(x.getQtaCol())
// .setNumCnf(x.getNumCnf())
// .setPercentageHr(x.getPercentageHr()))
// .collect(Collectors.toList());
//
//// BigDecimal qtaColTot = BigDecimal.ZERO;
//// BigDecimal numCnfColTot = BigDecimal.ZERO;
////
//// for (HistoryVersamentoProdULDTO.OrdineDto ordine :
//// ordineList) {
//// qtaColTot = qtaColTot.add(ordine.getQtaCol());
//// numCnfColTot = numCnfColTot.add(ordine.getNumCnf());
//// }
//
// newUlList.add(new HistoryVersamentoProdULDTO()
// .setGestione(restDTO.getGestione())
// .setDataCollo(restDTO.getDataCollo())
// .setSerCollo(restDTO.getSerCollo())
// .setNumCollo(restDTO.getNumCollo())
// .setSegno(restDTO.getSegno())
// .setCodMart(restDTO.getCodMart())
// .setCodCol(restDTO.getCodCol())
// .setCodTagl(restDTO.getCodTagl())
// .setCodJfas(restDTO.getCodJfas())
// .setDescrizioneArt(restDTO.getDescrizioneArt())
// .setDescrizioneFase(restDTO.getDescrizioneFase())
// .setQtaCol(restDTO.getQtaCol())
// .setQtaCnf(restDTO.getQtaCnf())
// .setNumCnf(restDTO.getNumCnf())
// .setPartitaMag(restDTO.getPartitaMag())
// .setCodJcom(restDTO.getCodJcom())
// .setDatetimeRow(restDTO.getDatetimeRow())
// .setUntMis(restDTO.getUntMis())
// .setGestioneRif(restDTO.getGestioneRif())
// .setDataColloRif(restDTO.getDataColloRif())
// .setSerColloRif(restDTO.getSerColloRif())
// .setNumColloRif(restDTO.getNumColloRif())
// .setOrdini(ordineList));
//
// });
//
//
// if (!newUlList.isEmpty()) {
// List<String> codMarts = Stream.of(newUlList)
// .map(HistoryVersamentoProdULDTO::getCodMart)
// .withoutNulls()
// .distinct()
// .toList();
//
// this.mArticoloRESTConsumer.getByCodMarts(codMarts, arts -> {
//
// if (arts != null && !arts.isEmpty()) {
// for (HistoryVersamentoProdULDTO value : newUlList) {
//
// MtbAart foundMtbAart = null;
//
// List<MtbAart> mtbAartStream = Stream.of(arts)
// .filter(x -> x.getCodMart().equalsIgnoreCase(value.getCodMart())).toList();
//
// if (mtbAartStream != null && !mtbAartStream.isEmpty()) {
// foundMtbAart = mtbAartStream.get(0);
// }
//
// value.setMtbAart(foundMtbAart);
// }
newUlList.add(new HistoryVersamentoProdULDTO()
.setGestione(restDTO.getGestione())
.setDataCollo(restDTO.getDataCollo())
.setSerCollo(restDTO.getSerCollo())
.setNumCollo(restDTO.getNumCollo())
.setSegno(restDTO.getSegno())
.setCodMart(restDTO.getCodMart())
.setCodCol(restDTO.getCodCol())
.setCodTagl(restDTO.getCodTagl())
.setCodJfas(restDTO.getCodJfas())
.setDescrizioneArt(restDTO.getDescrizioneArt())
.setDescrizioneFase(restDTO.getDescrizioneFase())
.setQtaCol(restDTO.getQtaCol())
.setQtaCnf(restDTO.getQtaCnf())
.setNumCnf(restDTO.getNumCnf())
.setPartitaMag(restDTO.getPartitaMag())
.setCodJcom(restDTO.getCodJcom())
.setDatetimeRow(restDTO.getDatetimeRow())
.setUntMis(restDTO.getUntMis())
.setGestioneRif(restDTO.getGestioneRif())
.setDataColloRif(restDTO.getDataColloRif())
.setSerColloRif(restDTO.getSerColloRif())
.setNumColloRif(restDTO.getNumColloRif())
.setOrdini(ordineList));
});
if (!newUlList.isEmpty()) {
List<String> codMarts = Stream.of(newUlList)
.map(HistoryVersamentoProdULDTO::getCodMart)
.withoutNulls()
.distinct()
.toList();
this.mArticoloRESTConsumer.getByCodMarts(codMarts, arts -> {
if (arts != null && !arts.isEmpty()) {
for (HistoryVersamentoProdULDTO value : newUlList) {
MtbAart foundMtbAart = null;
List<MtbAart> mtbAartStream = Stream.of(arts)
.filter(x -> x.getCodMart().equalsIgnoreCase(value.getCodMart())).toList();
if (mtbAartStream != null && !mtbAartStream.isEmpty()) {
foundMtbAart = mtbAartStream.get(0);
}
value.setMtbAart(foundMtbAart);
}
}
onComplete.run(newUlList);
}, onFailed);
} else {
onComplete.run(newUlList);
}
}, onFailed);
}
// }
//
// onComplete.run(newUlList);
//
// }, onFailed);
//
// } else {
// onComplete.run(newUlList);
// }
//
// }, onFailed);
// }
}

View File

@@ -21,7 +21,7 @@ public class ProdRientroMerceOrderListFilterViewModel {
public void init(List<OrdineLavorazioneDTO> initialList) {
this.initialOrderList = initialList;
this.currentFilteredOrderList.setValue(this.initialOrderList);
this.currentFilteredOrderList.postValue(this.initialOrderList);
}
public MutableLiveData<List<OrdineLavorazioneDTO>> getMutableFilteredOrderList() {

View File

@@ -19,6 +19,8 @@ import androidx.sqlite.db.SimpleSQLiteQuery;
import com.annimon.stream.Stream;
import com.google.android.material.snackbar.Snackbar;
import com.google.firebase.crashlytics.CustomKeysAndValues;
import com.google.firebase.crashlytics.FirebaseCrashlytics;
import com.harrysoft.androidbluetoothserial.BluetoothManager;
import java.io.BufferedReader;
@@ -31,7 +33,9 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
import javax.inject.Inject;
@@ -256,78 +260,110 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
private void exportLog() {
var handler = new Handler(Looper.getMainLooper());
DialogYesNoView.newInstance("Esportazione log", "Vuoi inviare il log degli eventi al supporto?", result -> {
if (result == DialogConsts.Results.NO || result == DialogConsts.Results.ABORT)
return;
executorService.execute(() -> {
this.openProgress();
if(!askConfirmToExportLog()) {
return;
}
executorService.execute(() -> {
this.openProgress();
File logFilePath = appContext.getLogFilePath();
var files = logFilePath.listFiles();
File logFilePath = appContext.getLogFilePath();
var files = logFilePath.listFiles(File::isFile);
var fileToShare = Arrays.stream(files)
.sorted(Comparator.reverseOrder())
.findFirst()
.orElse(null);
try {
List<MailAttachmentDTO> attachmentDTOList = new ArrayList<>();
var fileToShare = Arrays.stream(files)
.sorted(Comparator.reverseOrder())
.findFirst()
.orElse(null);
try {
List<MailAttachmentDTO> attachmentDTOList = new ArrayList<>();
if (fileToShare != null) {
var htmlContent = createAppLogAttachment(fileToShare);
if (fileToShare != null) {
try {
var htmlContent = createAppLogAttachment(fileToShare);
byte[] buffer = htmlContent.getBytes();//specify the size to allow.
String base64 = Base64.encodeToString(buffer, Base64.NO_WRAP);
byte[] buffer = htmlContent.getBytes();//specify the size to allow.
String base64 = Base64.encodeToString(buffer, Base64.NO_WRAP);
var logAttachment = new MailAttachmentDTO()
.setFileName("wms_log.html")
.setFileb64Content(base64);
attachmentDTOList.add(logAttachment);
}
var logAttachment = new MailAttachmentDTO()
.setFileName("wms_log.html")
.setFileb64Content(base64);
attachmentDTOList.add(logAttachment);
} catch (Exception ex) {
String rawLogFile = getRawLogAttachment(fileToShare);
byte[] buffer = rawLogFile.getBytes();//specify the size to allow.
String base64 = Base64.encodeToString(buffer, Base64.NO_WRAP);
var logAttachment = new MailAttachmentDTO()
.setFileName("raw_log.txt")
.setFileb64Content(base64);
attachmentDTOList.add(logAttachment);
}
}
rawDao.vacuumDb(new SimpleSQLiteQuery("pragma wal_checkpoint(full)"));
File[] dbFiles = new File[3];
dbFiles[0] = requireContext().getDatabasePath("integry_wms");
dbFiles[1] = requireContext().getDatabasePath("integry_wms-shm");
dbFiles[2] = requireContext().getDatabasePath("integry_wms-wal");
rawDao.vacuumDb(new SimpleSQLiteQuery("pragma wal_checkpoint(full)"));
rawDao.vacuumDb(new SimpleSQLiteQuery("VACUUM;"));
File[] dbFiles = new File[3];
dbFiles[0] = requireContext().getDatabasePath("integry_wms");
dbFiles[1] = requireContext().getDatabasePath("integry_wms-shm");
dbFiles[2] = requireContext().getDatabasePath("integry_wms-wal");
for (int i = 0; i < dbFiles.length; i++) {
byte[] dbFileBytes = new byte[(int) dbFiles[i].length()];
FileInputStream inputStream = new FileInputStream(dbFiles[i]);
final int read = inputStream.read(dbFileBytes);
inputStream.close();
for (int i = 0; i < dbFiles.length; i++) {
byte[] dbFileBytes = new byte[(int) dbFiles[i].length()];
FileInputStream inputStream = new FileInputStream(dbFiles[i]);
final int read = inputStream.read(dbFileBytes);
inputStream.close();
var dbAttachment = new MailAttachmentDTO()
.setFileName(dbFiles[i].getName())
.setFileb64Content(Base64.encodeToString(dbFileBytes, Base64.NO_WRAP));
attachmentDTOList.add(dbAttachment);
}
var dbAttachment = new MailAttachmentDTO()
.setFileName(dbFiles[i].getName())
.setFileb64Content(Base64.encodeToString(dbFileBytes, Base64.NO_WRAP));
attachmentDTOList.add(dbAttachment);
}
var mailRequest = new MailRequestDTO()
.setTo("developer@integry.it")
.setMsgText("Questa è una mail contenente il log del WMS")
.setSubject("Internal WMS log")
.setAttachments(attachmentDTOList);
var mailRequest = new MailRequestDTO()
.setTo("developer@integry.it")
.setMsgText("Questa è una mail contenente il log del WMS")
.setSubject("Internal WMS log")
.setAttachments(attachmentDTOList);
systemRESTConsumer.sendMailSynchronized(mailRequest);
systemRESTConsumer.sendMailSynchronized(mailRequest);
this.closeProgress();
} catch (Exception ex) {
handler.post(() -> {
this.closeProgress();
UtilityExceptions.defaultException(requireContext(), ex);
});
}
});
})
.show(getParentFragmentManager(), "tag");
this.closeProgress();
} catch (Exception ex) {
handler.post(() -> {
FirebaseCrashlytics.getInstance().recordException(ex, new CustomKeysAndValues.Builder() {{
putString("ExportLog", "Error while exporting log");
}}.build());
this.closeProgress();
UtilityExceptions.defaultException(requireContext(), ex);
});
}
});
}
private boolean askConfirmToExportLog() {
CountDownLatch countDownLatch = new CountDownLatch(1);
AtomicBoolean userConfirmed = new AtomicBoolean(false);
DialogYesNoView.newInstance("Esportazione log", "Vuoi inviare il log degli eventi al supporto?", result -> {
userConfirmed.set(result != DialogConsts.Results.NO && result != DialogConsts.Results.ABORT);
countDownLatch.countDown();
}).show(getParentFragmentManager(), "tag");
try {
countDownLatch.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return userConfirmed.get();
}
private void openProgress() {
// executorService.execute(() -> {
this.mCurrentProgress.show(requireActivity().getSupportFragmentManager());
@@ -437,4 +473,24 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
return htmlContent.toString();
}
private String getRawLogAttachment(File logFile) {
//Read text from file
StringBuilder text = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new FileReader(logFile));
String line;
while ((line = br.readLine()) != null) {
text.append(line);
text.append('\n');
}
br.close();
} catch (IOException e) {
//You'll need to add proper error handling here
}
return text.toString();
}
}

View File

@@ -739,12 +739,12 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo
public void addExtraItem() {
handler.post(() -> {
DialogScanArtView
.newInstance(!mEnableFakeGiacenza, (status, mtbAart, ean128Model, mtbColr) -> {
.newInstance(!mEnableFakeGiacenza, (status, mtbAart, ean128Model, mtbColt) -> {
if (status == DialogConsts.Results.YES) {
executorService.execute(() -> {
try {
this.mViewmodel.dispatchExtraItem(mtbAart, ean128Model, mtbColr);
this.mViewmodel.dispatchExtraItem(mtbAart, ean128Model, mtbColt);
} catch (Exception e) {
onError(e);
}

View File

@@ -1224,7 +1224,7 @@ public class SpedizioneViewModel {
return !stati.isEmpty() ? stati.get(0) : null;
}
public void dispatchExtraItem(MtbAart mtbAart, Ean128Model ean128Model, MtbColr mtbColrToUse) throws Exception {
public void dispatchExtraItem(MtbAart mtbAart, Ean128Model ean128Model, MtbColt refMtbColt) throws Exception {
PickingObjectDTO pickingObjectDTO = new PickingObjectDTO().setMtbAart(mtbAart).setTempPickData(PickDataDTO.fromEan128(ean128Model));
@@ -1243,12 +1243,23 @@ public class SpedizioneViewModel {
String partitaMag = null;
LocalDate dataScad = null;
MtbColt refMtbColt = null;
// MtbColt refMtbColt = null;
if (mtbColrToUse != null) {
refMtbColt = new MtbColt().setDataCollo(mtbColrToUse.getDataColloD()).setSerCollo(mtbColrToUse.getSerCollo()).setNumCollo(mtbColrToUse.getNumCollo()).setGestione(mtbColrToUse.getGestione()).setMtbColr(new ObservableArrayList<>());
if (refMtbColt != null && refMtbColt.getMtbColr() != null && !refMtbColt.getMtbColr().isEmpty()) {
MtbColr mtbColrToUse = refMtbColt.getMtbColr().get(0);
refMtbColt.getMtbColr().add(mtbColrToUse);
//Se il collo di riferimento non ha righe, lo creo al volo
// refMtbColt = new MtbColt()
// .setDataCollo(mtbColrToUse.getDataColloD())
// .setSerCollo(mtbColrToUse.getSerCollo())
// .setNumCollo(mtbColrToUse.getNumCollo())
// .setGestione(mtbColrToUse.getGestione())
//// .setCodMdep(mtbColrToUse.getCodMdepIn())
//// .setPosizione(mtbColrToUse.getPosizioneIn())
//// .setBarcodeUl(mtbColrToUse.getBarcodeUlIn())
// .setMtbColr(new ObservableArrayList<>());
//
// refMtbColt.getMtbColr().add(mtbColrToUse);
pickingObjectDTO.setMtbAart(mtbColrToUse.getMtbAart()).setTempPickData(new PickDataDTO().setSourceMtbColt(refMtbColt));
@@ -1521,9 +1532,6 @@ public class SpedizioneViewModel {
.setMtbAart(null);
}
var clonedTargetMtbColt = (MtbColt) mCurrentMtbColt.clone();
clonedTargetMtbColt.setMtbColr(null);
var insertUDSRowRequestDto = new InsertUDSRowRequestDTO()
.setSourceMtbColr(clonedSourceMtbColr)
.setCodMart(pickingObjectDTO.getMtbAart().getCodMart())
@@ -1531,7 +1539,7 @@ public class SpedizioneViewModel {
.setQtaCnf(qtaCnf)
.setNumCnf(numCnf)
.setPartitaMag(partitaMag)
.setTargetMtbColt(clonedTargetMtbColt);
.setTargetMtbColt(mCurrentMtbColt.clone(false));
if (dataScad != null)
insertUDSRowRequestDto
@@ -1546,6 +1554,7 @@ public class SpedizioneViewModel {
createdMtbColr = this.mColliScaricoRESTConsumer.insertUDSRowSynchronized(insertUDSRowRequestDto);
} catch (Exception ex) {
this.sendError(ex);
return;
}
pickingObjectDTO.getWithdrawMtbColrs().add(createdMtbColr);
@@ -2115,18 +2124,18 @@ public class SpedizioneViewModel {
}
public void closeOrder() {
this.sendOnLoadingStarted();
if (SettingsManager.iDB().isFlagPrintEtichetteOnOrderClose() || SettingsManager.iDB().isFlagPrintPackingListOnOrderClose()) {
var printRequestResult = this.sendOnCloseOrderPrintRequest();
this.sendOnLoadingStarted();
this.onCloseOrderPrintRequested(printRequestResult);
this.sendOnLoadingEnded();
}
if (this.mIsOrdTrasf && !UtilityString.isNullOrEmpty(SettingsManager.iDB().getCodDtipOrdTrasfV())) {
this.sendCreateDocsRequest();
}
this.sendOnOrderClosed();
}
private void onCloseOrderPrintRequested(PrintOrderCloseDTO dto) {

View File

@@ -1,11 +1,17 @@
package it.integry.integrywmsnative.view.dialogs.ask_cliente.dto;
import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;
public class DialogAskClienteClienteDTO {
@SerializedName("codAnag")
private String codAnag;
@SerializedName("ragSoc")
private String ragSoc;
@SerializedName("codJcoms")
private ArrayList<String> codJcoms = new ArrayList<>();
public String getCodAnag() {

View File

@@ -1,23 +1,34 @@
package it.integry.integrywmsnative.view.dialogs.ask_cliente.dto;
import com.google.gson.annotations.SerializedName;
import it.integry.integrywmsnative.core.model.VtbDest;
public class DialogAskClienteDestinatarioDTO {
@SerializedName("codAnag")
private String codAnag;
@SerializedName("codVdes")
private String codVdes;
@SerializedName("destinatario")
private String destinatario;
@SerializedName("indirizzo")
private String indirizzo;
@SerializedName("cap")
private String cap;
@SerializedName("citta")
private String citta;
@SerializedName("prov")
private String prov;
@SerializedName("nazione")
private String nazione;
public String getCodAnag() {

View File

@@ -4,15 +4,19 @@ import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.ObservableArrayList;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.javatuples.Quartet;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.stream.Collectors;
import javax.inject.Inject;
@@ -27,6 +31,7 @@ import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.expansion.RunnableArgssss;
import it.integry.integrywmsnative.core.model.MtbAart;
import it.integry.integrywmsnative.core.model.MtbColr;
import it.integry.integrywmsnative.core.model.MtbColt;
import it.integry.integrywmsnative.core.model.MtbDepoPosizione;
import it.integry.integrywmsnative.core.rest.model.Ean128Model;
import it.integry.integrywmsnative.databinding.DialogScanArtBinding;
@@ -38,6 +43,9 @@ public class DialogScanArtView extends BaseDialogFragment implements DialogScanA
@Inject
DialogScanArtViewModel mViewModel;
@Inject
Handler handler;
private Context mContext;
private final boolean mForceOnlyUL;
@@ -46,15 +54,15 @@ public class DialogScanArtView extends BaseDialogFragment implements DialogScanA
private int mBarcodeScannerInstanceID;
private RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, MtbColr> onPickingCompleted = null;
private RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, MtbColt> onPickingCompleted = null;
private RunnableArgs<MtbDepoPosizione> onMagazzinoAutomaticoPickingRequest = null;
public static DialogScanArtView newInstance(boolean forceOnlyUL, @NotNull RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, MtbColr> onPickingCompleted, RunnableArgs<MtbDepoPosizione> onMagazzinoAutomaticoPickingRequest) {
public static DialogScanArtView newInstance(boolean forceOnlyUL, @NotNull RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, MtbColt> onPickingCompleted, RunnableArgs<MtbDepoPosizione> onMagazzinoAutomaticoPickingRequest) {
return new DialogScanArtView(forceOnlyUL, onPickingCompleted, onMagazzinoAutomaticoPickingRequest);
}
private DialogScanArtView(boolean forceOnlyUL, RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, MtbColr> onItemChoosed, RunnableArgs<MtbDepoPosizione> onMagazzinoAutomaticoPickingRequest) {
private DialogScanArtView(boolean forceOnlyUL, RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, MtbColt> onItemChoosed, RunnableArgs<MtbDepoPosizione> onMagazzinoAutomaticoPickingRequest) {
super();
mForceOnlyUL = forceOnlyUL;
@@ -122,37 +130,60 @@ public class DialogScanArtView extends BaseDialogFragment implements DialogScanA
private final RunnableArgs<BarcodeScanDTO> onScanSuccessfull = data -> {
this.onLoadingStarted();
this.mViewModel.processBarcodeDTO(data, (status, mtbAart, ean128Model, mtbColrList) -> {
executorService.execute(() -> {
var filteredMtbColrList = mtbColrList;
try {
if (mtbAart != null && filteredMtbColrList != null) {
filteredMtbColrList = filteredMtbColrList.stream()
.filter(x -> x.getCodMart().equalsIgnoreCase(mtbAart.getCodMart()))
.collect(Collectors.toList());
Quartet<DialogConsts.Results, MtbAart, Ean128Model, MtbColt> result = this.mViewModel.processBarcodeDTO(data, pickMagazzinoAutomaticoPosizione -> {
handler.post(() -> {
this.onMagazzinoAutomaticoPickingRequest.run(pickMagazzinoAutomaticoPosizione);
this.onLoadingEnded();
dismiss();
});
});
var status = result.getValue0();
var mtbAart = result.getValue1();
var ean128Model = result.getValue2();
var mtbColt = result.getValue3();
List<MtbColr> filteredMtbColrList = mtbColt.getMtbColr();
if (mtbAart != null && filteredMtbColrList != null) {
filteredMtbColrList = filteredMtbColrList.stream()
.filter(x -> x.getCodMart().equalsIgnoreCase(mtbAart.getCodMart()))
.collect(Collectors.toList());
}
List<MtbColr> finalFilteredMtbColrList = filteredMtbColrList;
handler.post(() -> {
if (finalFilteredMtbColrList != null && finalFilteredMtbColrList.size() > 1) {
DialogChooseArtFromListaMtbColrView.make(getActivity(), finalFilteredMtbColrList, mtbColrChose -> {
mtbColt.setMtbColr(new ObservableArrayList<>());
mtbColt.getMtbColr().add(mtbColrChose);
onPickingCompleted.run(status, mtbAart, ean128Model, mtbColt);
}).show();
} else if (finalFilteredMtbColrList != null && finalFilteredMtbColrList.size() == 1) {
mtbColt.setMtbColr(new ObservableArrayList<>());
mtbColt.getMtbColr().add(finalFilteredMtbColrList.get(0));
onPickingCompleted.run(status, mtbAart, ean128Model, mtbColt);
} else {
onPickingCompleted.run(status, mtbAart, ean128Model, null);
}
this.onLoadingEnded();
dismiss();
});
} catch (Exception ex) {
onError(ex);
}
if (filteredMtbColrList != null && filteredMtbColrList.size() > 1) {
DialogChooseArtFromListaMtbColrView.make(getActivity(), filteredMtbColrList, mtbColrChose -> {
onPickingCompleted.run(status, mtbAart, ean128Model, mtbColrChose);
}).show();
} else if (filteredMtbColrList != null && filteredMtbColrList.size() == 1) {
onPickingCompleted.run(status, mtbAart, ean128Model, filteredMtbColrList.get(0));
} else {
onPickingCompleted.run(status, mtbAart, ean128Model, null);
}
this.onLoadingEnded();
dismiss();
}, pickMagazzinoAutomaticoPosizione -> {
this.onMagazzinoAutomaticoPickingRequest.run(pickMagazzinoAutomaticoPosizione);
this.onLoadingEnded();
dismiss();
});
};
}

View File

@@ -1,22 +1,17 @@
package it.integry.integrywmsnative.view.dialogs.scan_art;
import com.annimon.stream.Stream;
import org.javatuples.Quartet;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import it.integry.barcode_base_android_library.model.BarcodeScanDTO;
import it.integry.integrywmsnative.core.exception.EmptyLUException;
import it.integry.integrywmsnative.core.exception.InvalidLUException;
import it.integry.integrywmsnative.core.exception.NoLUFoundException;
import it.integry.integrywmsnative.core.exception.NoResultFromBarcodeException;
import it.integry.integrywmsnative.core.exception.ScannedPositionNotExistException;
import it.integry.integrywmsnative.core.exception.TooManyLUFoundInMonoLUPositionException;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.expansion.RunnableArgssss;
import it.integry.integrywmsnative.core.model.MtbAart;
import it.integry.integrywmsnative.core.model.MtbColr;
import it.integry.integrywmsnative.core.model.MtbColt;
import it.integry.integrywmsnative.core.model.MtbDepoPosizione;
import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.BarcodeRESTConsumer;
@@ -62,23 +57,23 @@ public class DialogScanArtViewModel {
return this;
}
public void processBarcodeDTO(BarcodeScanDTO barcodeScanDTO, RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, List<MtbColr>> onPickingCompleted, RunnableArgs<MtbDepoPosizione> onMagazzinoAutomaticoPickingRequest) {
public Quartet<DialogConsts.Results, MtbAart, Ean128Model, MtbColt> processBarcodeDTO(BarcodeScanDTO barcodeScanDTO, RunnableArgs<MtbDepoPosizione> onMagazzinoAutomaticoPickingRequest) throws Exception {
if (UtilityBarcode.isEtichettaAnonima(barcodeScanDTO)) {
//Cerco gli articoli presenti nell'ul dell'etichetta anonima
this.executeEtichettaLU(barcodeScanDTO.getStringValue(), onPickingCompleted);
return this.executeEtichettaLU(barcodeScanDTO.getStringValue());
} else if (UtilityBarcode.isEtichettaPosizione(barcodeScanDTO)) {
//Cerco l'UL presente all'interno della posizione
this.executeEtichettaPosizione(barcodeScanDTO.getStringValue(), onPickingCompleted, onMagazzinoAutomaticoPickingRequest);
return this.executeEtichettaPosizione(barcodeScanDTO.getStringValue(), onMagazzinoAutomaticoPickingRequest);
} else if (UtilityBarcode.isEtichetta128(barcodeScanDTO)) {
this.executeEtichettaEan128(barcodeScanDTO, onPickingCompleted);
return this.executeEtichettaEan128(barcodeScanDTO);
} else if (UtilityBarcode.isEanPeso(barcodeScanDTO) && !mForceOnlyUL) {
this.executeEtichettaEanPeso(barcodeScanDTO, onPickingCompleted);
return this.executeEtichettaEanPeso(barcodeScanDTO);
} else {
this.loadArticolo(barcodeScanDTO.getStringValue(), null, onPickingCompleted);
return this.loadArticolo(barcodeScanDTO.getStringValue(), null);
}
// else {
@@ -87,123 +82,108 @@ public class DialogScanArtViewModel {
}
private void executeEtichettaEan128(BarcodeScanDTO barcodeScanDTO, RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, List<MtbColr>> onComplete) {
this.mBarcodeRESTConsumer.decodeEan128(barcodeScanDTO, ean128Model -> {
String barcodeProd = null;
if (ean128Model.Sscc != null) barcodeProd = ean128Model.Sscc;
if (ean128Model.Gtin != null) barcodeProd = ean128Model.Gtin;
if (ean128Model.Content != null) barcodeProd = ean128Model.Content;
private Quartet<DialogConsts.Results, MtbAart, Ean128Model, MtbColt> executeEtichettaEan128(BarcodeScanDTO barcodeScanDTO) throws Exception {
var ean128Model = this.mBarcodeRESTConsumer.decodeEan128Synchronized(barcodeScanDTO);
if (!UtilityString.isNullOrEmpty(barcodeProd)) {
if (!UtilityString.isNullOrEmpty(ean128Model.Sscc)) {
this.executeEtichettaLU(ean128Model.Sscc, onComplete);
} else if (!mForceOnlyUL) {
String barcodeProd = null;
if (ean128Model.Sscc != null) barcodeProd = ean128Model.Sscc;
if (ean128Model.Gtin != null) barcodeProd = ean128Model.Gtin;
if (ean128Model.Content != null) barcodeProd = ean128Model.Content;
if (!UtilityString.isNullOrEmpty(barcodeProd)) {
if (!UtilityString.isNullOrEmpty(ean128Model.Sscc)) {
return this.executeEtichettaLU(ean128Model.Sscc);
} else if (!mForceOnlyUL) {
return this.loadArticolo(barcodeProd, ean128Model);
this.loadArticolo(barcodeProd, ean128Model, onComplete);
} else {
this.sendError(new Exception("Barcode non valido"));
}
} else {
//EAN 128 non completo o comunque mancano i riferimenti al prodotto
this.sendError(new NoResultFromBarcodeException(barcodeProd));
throw new Exception("Barcode non valido");
}
}, this::sendError);
}
private void executeEtichettaEanPeso(BarcodeScanDTO barcodeScanDTO, RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, List<MtbColr>> onComplete) {
try {
Ean13PesoModel ean13PesoModel = Ean13PesoModel.fromBarcode(barcodeScanDTO.getStringValue());
this.loadArticolo(ean13PesoModel.getPrecode(), ean13PesoModel.toEan128(), onComplete);
} catch (Exception ex) {
this.sendError(ex);
} else {
//EAN 128 non completo o comunque mancano i riferimenti al prodotto
throw new NoResultFromBarcodeException(barcodeProd);
}
}
private Quartet<DialogConsts.Results, MtbAart, Ean128Model, MtbColt> executeEtichettaEanPeso(BarcodeScanDTO barcodeScanDTO) throws Exception {
Ean13PesoModel ean13PesoModel = Ean13PesoModel.fromBarcode(barcodeScanDTO.getStringValue());
private void executeEtichettaLU(String SSCC, RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, List<MtbColr>> onComplete) {
mColliMagazzinoRESTConsumer.getBySSCC(SSCC, true, false, mtbColt -> {
if (mtbColt != null && mtbColt.getMtbColr() != null && !mtbColt.getMtbColr().isEmpty()) {
if (mtbColt.getSegno() != -1) {
onComplete.run(DialogConsts.Results.YES, null, null, mtbColt.getMtbColr());
} else this.sendError(new InvalidLUException());
} else {
this.sendError(new EmptyLUException());
}
}, this::sendError);
return this.loadArticolo(ean13PesoModel.getPrecode(), ean13PesoModel.toEan128());
}
private Quartet<DialogConsts.Results, MtbAart, Ean128Model, MtbColt> executeEtichettaLU(String SSCC) throws Exception {
var mtbColt = mColliMagazzinoRESTConsumer.getBySsccSynchronized(SSCC, true, false);
private void executeEtichettaPosizione(String stringValue, RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, List<MtbColr>> onComplete, RunnableArgs<MtbDepoPosizione> onMagazzinoAutomaticoPickingRequest) {
MtbDepoPosizione foundPosizione = Stream.of(SettingsManager.iDB().getAvailablePosizioni())
if (mtbColt == null || mtbColt.getMtbColr() == null || mtbColt.getMtbColr().isEmpty())
throw new NoLUFoundException();
if (mtbColt.getSegno() == -1) throw new InvalidLUException();
return new Quartet<>(DialogConsts.Results.YES, null, null, mtbColt);
}
private Quartet<DialogConsts.Results, MtbAart, Ean128Model, MtbColt> executeEtichettaPosizione(String stringValue, RunnableArgs<MtbDepoPosizione> onMagazzinoAutomaticoPickingRequest) throws Exception {
MtbDepoPosizione foundPosizione = SettingsManager.iDB().getAvailablePosizioni().stream()
.filter(x -> x.getPosizione().equalsIgnoreCase(stringValue))
.single();
.findFirst()
.orElse(null);
if (foundPosizione == null) {
if (foundPosizione == null)
//Nessuna posizione trovata con questo barcode
this.sendError(new ScannedPositionNotExistException());
return;
}
throw new ScannedPositionNotExistException();
if (foundPosizione.isMagazzinoAutomatico()) {
//Eseguo picking da magazzino automatico
onMagazzinoAutomaticoPickingRequest.run(foundPosizione);
} else {
this.executePosizione(foundPosizione, null, onComplete);
return this.executePosizione(foundPosizione, null);
}
return null;
}
private void executePosizione(MtbDepoPosizione posizione, MtbAart articolo, RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, List<MtbColr>> onComplete) {
this.mPosizioniRESTConsumer.getBancaliInPosizione(posizione, mtbColtList -> {
private Quartet<DialogConsts.Results, MtbAart, Ean128Model, MtbColt> executePosizione(MtbDepoPosizione posizione, MtbAart articolo) throws Exception {
var mtbColtList = this.mPosizioniRESTConsumer.getBancaliInPosizioneSynchronized(posizione);
if (mtbColtList == null || mtbColtList.isEmpty()) {
this.sendError(new NoLUFoundException());
} else if (mtbColtList.size() == 1) {
this.mColliMagazzinoRESTConsumer.getByTestata(mtbColtList.get(0), true, false, mtbColt -> {
onComplete.run(DialogConsts.Results.YES, articolo, null, mtbColt.getMtbColr());
}, this::sendError);
} else {
this.sendError(new TooManyLUFoundInMonoLUPositionException());
}
if (mtbColtList == null || mtbColtList.isEmpty())
throw new NoLUFoundException();
}, this::sendError);
if (mtbColtList.size() != 1) {
throw new TooManyLUFoundInMonoLUPositionException();
}
var mtbColt = this.mColliMagazzinoRESTConsumer.getByTestataSynchronized(mtbColtList.get(0), true, false);
return new Quartet<>(DialogConsts.Results.YES, articolo, null, mtbColt);
}
private void loadArticolo(@NotNull String barcodeProd, Ean128Model ean128Model, RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, List<MtbColr>> onComplete) {
this.mArticoloRESTConsumer.searchByBarcode(barcodeProd, mtbAartList -> {
if (mtbAartList != null && !mtbAartList.isEmpty()) {
private Quartet<DialogConsts.Results, MtbAart, Ean128Model, MtbColt> loadArticolo(@NotNull String barcodeProd, Ean128Model ean128Model) throws Exception {
var mtbAartList = this.mArticoloRESTConsumer.searchByBarcodeSynchronized(barcodeProd);
MtbAart firstArt = mtbAartList.get(0);
MtbDepoPosizione firstArtPosition = UtilityPosizione.getFromCache(firstArt.getPosizione());
if (mtbAartList == null || mtbAartList.isEmpty())
throw new NoResultFromBarcodeException(barcodeProd);
if (firstArtPosition != null && firstArtPosition.isFlagMonoCollo() && mForceOnlyUL) {
this.executePosizione(firstArtPosition, firstArt, onComplete);
} else if (!mForceOnlyUL) {
onComplete.run(DialogConsts.Results.YES, mtbAartList.get(0), ean128Model, null);
} else {
this.sendError(new NoResultFromBarcodeException(barcodeProd));
}
MtbAart firstArt = mtbAartList.get(0);
MtbDepoPosizione firstArtPosition = UtilityPosizione.getFromCache(firstArt.getPosizione());
} else {
this.sendError(new NoResultFromBarcodeException(barcodeProd));
}
}, this::sendError);
if (firstArtPosition != null && firstArtPosition.isFlagMonoCollo() && mForceOnlyUL)
return this.executePosizione(firstArtPosition, firstArt);
if (!mForceOnlyUL)
return new Quartet<>(DialogConsts.Results.YES, mtbAartList.get(0), ean128Model, null);
throw new NoResultFromBarcodeException(barcodeProd);
}
private void sendError(Exception ex) {
if (this.mListener != null) mListener.onError(ex);
}
public void setListener(Listener listener) {
this.mListener = listener;
}

View File

@@ -18,13 +18,23 @@
tools:context=".gest.prod_recupero_materiale.ProdRecuperoMaterialeFragment">
<androidx.recyclerview.widget.RecyclerView
android:background="@android:color/white"
android:id="@+id/prod_recupero_materiale_main_list"
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swiperefresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/prod_recupero_materiale_list_item"/>
android:layout_alignParentBottom="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/prod_recupero_materiale_main_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/prod_recupero_materiale_list_item" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/empty_view"

View File

@@ -1,11 +1,11 @@
apply plugin: 'com.android.library'
android {
compileSdk 35
compileSdk 36
defaultConfig {
minSdkVersion 21
targetSdk 35
targetSdk 36
consumerProguardFiles 'consumer-rules.pro'
}
@@ -36,5 +36,5 @@ configurations {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.appcompat:appcompat:1.7.1'
}

View File

@@ -3,7 +3,7 @@
buildscript {
ext {
kotlin_version = '2.1.0'
agp_version = '8.11.0'
agp_version = '8.13.0'
}
repositories {

View File

@@ -1,11 +1,11 @@
apply plugin: 'com.android.library'
android {
compileSdk 35
compileSdk 36
defaultConfig {
minSdkVersion 21
targetSdk 35
targetSdk 36
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -38,6 +38,6 @@ dependencies {
// implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
implementation project(":honeywellsdk")
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.appcompat:appcompat:1.7.1'
implementation project(path: ':barcode_base_android_library')
}

View File

@@ -1,11 +1,11 @@
apply plugin: 'com.android.library'
android {
compileSdk 35
compileSdk 36
defaultConfig {
minSdkVersion 21
targetSdk 35
targetSdk 36
// testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'
@@ -37,6 +37,6 @@ configurations {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.appcompat:appcompat:1.7.1'
implementation project(':barcode_base_android_library')
}

View File

@@ -1,11 +1,11 @@
apply plugin: 'com.android.library'
android {
compileSdk 35
compileSdk 36
defaultConfig {
minSdkVersion 21
targetSdk 35
targetSdk 36
// testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@@ -35,6 +35,6 @@ configurations {
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.appcompat:appcompat:1.7.1'
implementation project(':barcode_base_android_library')
}

View File

@@ -1,11 +1,11 @@
apply plugin: 'com.android.library'
android {
compileSdk 35
compileSdk 36
defaultConfig {
minSdkVersion 21
targetSdk 35
targetSdk 36
// testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@@ -37,7 +37,7 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.appcompat:appcompat:1.7.1'
testImplementation 'junit:junit:4.13.2'
implementation project(path: ':barcode_base_android_library')
}