Merge branch 'feature/RefactoringGestioneColli' into master-beta
All checks were successful
WMS - Android (New)/pipeline/head This commit looks good

This commit is contained in:
2025-09-03 13:02:31 +02:00
29 changed files with 303 additions and 258 deletions

View File

@@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services'
android {
def appVersionCode = 519
def appVersionName = '1.47.06'
def appVersionCode = 522
def appVersionName = '1.47.09'
signingConfigs {
release {
@@ -34,7 +34,7 @@ android {
defaultConfig {
applicationId "it.integry.integrywmsnative"
minSdkVersion 21
targetSdkVersion 36
targetSdk 36
versionCode appVersionCode
versionName appVersionName
// testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -157,7 +157,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"

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

@@ -90,10 +90,10 @@ public class AppContext {
Logger.addLogAdapter(new AndroidLogAdapter());
logsFolder = new File(mApplicationContext.getExternalFilesDir(null).getAbsolutePath());
removeOldLogs(logsFolder);
int maxBytesSize = 5 * 1024 * 1024;
Logger.addLogAdapter(new DiskLogAdapter(logsFolder, maxBytesSize));
removeOldLogs(logsFolder);
}
private void removeOldLogs(File logsFolder) {

View File

@@ -4,6 +4,7 @@ import com.google.gson.annotations.SerializedName;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Objects;
public class MtbPartitaMag extends EntityBase {
@SerializedName("codMart")
@@ -300,4 +301,17 @@ public class MtbPartitaMag extends EntityBase {
this.qtaAttesa = qtaAttesa;
return this;
}
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
MtbPartitaMag that = (MtbPartitaMag) o;
return Objects.equals(getCodMart(), that.getCodMart()) && Objects.equals(getPartitaMag(), that.getPartitaMag()) && Objects.equals(getDescrizione(), that.getDescrizione()) && Objects.equals(getDataIns(), that.getDataIns()) && Objects.equals(getDataScad(), that.getDataScad()) && Objects.equals(getScelta(), that.getScelta()) && Objects.equals(getCostoUntUmMag(), that.getCostoUntUmMag()) && Objects.equals(getValUntUmMag(), that.getValUntUmMag()) && Objects.equals(getTaraCnfKg(), that.getTaraCnfKg()) && Objects.equals(getQtaCnf(), that.getQtaCnf()) && Objects.equals(getFlagImballoArendere(), that.getFlagImballoArendere()) && Objects.equals(getFlagStato(), that.getFlagStato()) && Objects.equals(getCodDiviCont(), that.getCodDiviCont()) && Objects.equals(getCambioDiviCont(), that.getCambioDiviCont()) && Objects.equals(getBarcode(), that.getBarcode()) && Objects.equals(getNote(), that.getNote()) && Objects.equals(getRapConv2(), that.getRapConv2()) && Objects.equals(getRapConv3(), that.getRapConv3()) && Objects.equals(getPosizione(), that.getPosizione()) && Objects.equals(getDataAggPrz(), that.getDataAggPrz()) && Objects.equals(getPartitaMagSec(), that.getPartitaMagSec()) && Objects.equals(getQtaAttesa(), that.getQtaAttesa());
}
@Override
public int hashCode() {
return Objects.hash(getCodMart(), getPartitaMag(), getDescrizione(), getDataIns(), getDataScad(), getScelta(), getCostoUntUmMag(), getValUntUmMag(), getTaraCnfKg(), getQtaCnf(), getFlagImballoArendere(), getFlagStato(), getCodDiviCont(), getCambioDiviCont(), getBarcode(), getNote(), getRapConv2(), getRapConv3(), getPosizione(), getDataAggPrz(), getPartitaMagSec(), getQtaAttesa());
}
}

View File

@@ -0,0 +1,43 @@
package it.integry.integrywmsnative.core.model.dto;
import java.time.LocalDate;
public class PartitaCommessaDTO {
private String partitaMag;
private LocalDate dataScad;
private String codJcom;
private String descrizione;
public String getPartitaMag() {
return partitaMag;
}
public void setPartitaMag(String partitaMag) {
this.partitaMag = partitaMag;
}
public LocalDate getDataScad() {
return dataScad;
}
public void setDataScad(LocalDate dataScad) {
this.dataScad = dataScad;
}
public String getCodJcom() {
return codJcom;
}
public void setCodJcom(String codJcom) {
this.codJcom = codJcom;
}
public String getDescrizione() {
return descrizione;
}
public void setDescrizione(String descrizione) {
this.descrizione = descrizione;
}
}

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.model.MtbDepo;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
@@ -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

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

@@ -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,6 +49,7 @@ public class LoginViewModel {
FirebaseInstallations.getInstance().getId().addOnCompleteListener(fid -> {
SettingsManager.i().createUserSession();
retrieveAvailableProfiles(protocol, host, port, username, password, selectedProfile -> {
if(selectedProfile == null) {
this.sendOnLoadingEnded();
@@ -56,8 +57,6 @@ public class LoginViewModel {
return;
}
SettingsManager.i().createUserSession();
authenticate(protocol, host, port, username, password, selectedProfile, fid.getResult(), fullName -> {
SettingsManager.i().getUser()

View File

@@ -33,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;
@@ -327,35 +329,38 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
private void exportLog() {
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(() -> {
if(!askConfirmToExportLog()) {
return;
}
this.openProgress();
this.openProgress();
executorService.execute(() -> {
File logFilePath = appContext.getLogFilePath();
var files = logFilePath.listFiles();
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) {
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);
}
rawDao.vacuumDb(new SimpleSQLiteQuery("pragma wal_checkpoint(full)"));
@@ -365,43 +370,59 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
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(() -> {
FirebaseCrashlytics.getInstance().recordException(ex, new CustomKeysAndValues.Builder() {{
putString("ExportLog", "Error while exporting log");
}}.build());
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());

View File

@@ -52,6 +52,7 @@ import it.integry.integrywmsnative.core.model.MtbColt;
import it.integry.integrywmsnative.core.model.MtbDepoPosizione;
import it.integry.integrywmsnative.core.model.MtbPartitaMag;
import it.integry.integrywmsnative.core.model.dto.AlreadyRegisteredUlDTO;
import it.integry.integrywmsnative.core.model.dto.PartitaCommessaDTO;
import it.integry.integrywmsnative.core.model.observable.ObservableMtbTcol;
import it.integry.integrywmsnative.core.model.secondary.GestioneEnum;
import it.integry.integrywmsnative.core.report.ReportManager;
@@ -1156,9 +1157,9 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo
}
@Override
public void onBatchLotSelectionRequest(List<MtbPartitaMag> availableBatchLots, RunnableArgs<MtbPartitaMag> onComplete) {
public void onBatchLotSelectionRequest(List<PartitaCommessaDTO> availableBatchLotsCodJcoms, RunnableArgs<PartitaCommessaDTO> onComplete) {
handler.post(() -> {
DialogChooseBatchLotView.newInstance(availableBatchLots, onComplete)
DialogChooseBatchLotView.newInstance(availableBatchLotsCodJcoms, onComplete)
.show(getSupportFragmentManager(), "tag");
});
}

View File

@@ -12,7 +12,6 @@ import org.apache.commons.lang3.NotImplementedException;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -51,6 +50,7 @@ import it.integry.integrywmsnative.core.model.MtbDepoPosizione;
import it.integry.integrywmsnative.core.model.MtbPartitaMag;
import it.integry.integrywmsnative.core.model.VtbVett;
import it.integry.integrywmsnative.core.model.dto.AlreadyRegisteredUlDTO;
import it.integry.integrywmsnative.core.model.dto.PartitaCommessaDTO;
import it.integry.integrywmsnative.core.model.dto.PickDataDTO;
import it.integry.integrywmsnative.core.model.dto.StatoArticoloDTO;
import it.integry.integrywmsnative.core.model.observable.ObservableMtbTcol;
@@ -88,12 +88,12 @@ import it.integry.integrywmsnative.core.rest.model.uds.EditUDSRowRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.InsertUDSRowRequestDTO;
import it.integry.integrywmsnative.core.rest.model.uds.PrintULRequestDTO;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.data.UntMisUtils;
import it.integry.integrywmsnative.core.utility.UtilityBarcode;
import it.integry.integrywmsnative.core.utility.UtilityBigDecimal;
import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.core.utility.UtilityPosizione;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.core.utility.data.UntMisUtils;
import it.integry.integrywmsnative.gest.spedizione.exceptions.CurrentMonoLUPositionIsNotCorrectException;
import it.integry.integrywmsnative.gest.spedizione.exceptions.InvalidMagazzinoAutomaticoMovementException;
import it.integry.integrywmsnative.gest.spedizione.exceptions.InvalidPesoKGException;
@@ -527,11 +527,11 @@ public class SpedizioneViewModel {
return null;
}
private MtbPartitaMag sendBatchLotSelectionRequest(List<MtbPartitaMag> availableBatchLots) {
private PartitaCommessaDTO sendBatchLotSelectionRequest(List<PartitaCommessaDTO> availableBatchLotsCodJcoms) {
final CountDownLatch latch = new CountDownLatch(1);
AtomicReference<MtbPartitaMag> result = new AtomicReference<>();
AtomicReference<PartitaCommessaDTO> result = new AtomicReference<>();
mListener.onBatchLotSelectionRequest(availableBatchLots, item -> {
mListener.onBatchLotSelectionRequest(availableBatchLotsCodJcoms, item -> {
result.set(item);
latch.countDown();
});
@@ -995,19 +995,46 @@ public class SpedizioneViewModel {
public void dispatchOrdineRow(final PickingObjectDTO pickingObjectDTO, MtbColt refMtbColt, MtbColr refMtbColr, boolean canPartitaMagBeChanged, boolean executeImmediately) throws Exception {
if (pickingObjectDTO.getTempPickData() != null && pickingObjectDTO.getTempPickData().getSourceMtbColt() != null && pickingObjectDTO.getTempPickData().getSourceMtbColt().getMtbColr() != null) {
List<MtbColr> scannedMtbColrs = pickingObjectDTO.getTempPickData().getSourceMtbColt().getMtbColr();
List<MtbPartitaMag> availableBatchLots = scannedMtbColrs.stream()
List<PartitaCommessaDTO> availableBatchLotsAndCodJcoms = scannedMtbColrs.stream()
.filter(x -> x.getCodMart().equalsIgnoreCase(pickingObjectDTO.getMtbAart().getCodMart()) &&
(x.getPartitaMag() == null || x.getMtbPartitaMag().getDataScad() == null ||
UtilityDate.getNow().isBefore(x.getMtbPartitaMag().getDataScad())))
.map(x -> x.getPartitaMag() == null ? new MtbPartitaMag().setCodMart(x.getMtbAart().getCodMart()) : x.getMtbPartitaMag())
.map(x -> new PartitaCommessaDTO() {{
setCodJcom(x.getCodJcom());
setPartitaMag(x.getPartitaMag());
setDataScad(x.getMtbPartitaMag() != null ? x.getMtbPartitaMag().getDataScad() : null);
setDescrizione(x.getDescrizione());
}
})
.distinct()
.sorted((a, b) -> {
// 1) Prima la riga con codJcom uguale a refMtbColr.codJcom
if (refMtbColr != null && refMtbColr.getCodJcom() != null) {
boolean aMatchesCodJcom = Objects.equals(a.getCodJcom(), refMtbColr.getCodJcom());
boolean bMatchesCodJcom = Objects.equals(b.getCodJcom(), refMtbColr.getCodJcom());
if (aMatchesCodJcom && !bMatchesCodJcom) return -1;
if (!aMatchesCodJcom && bMatchesCodJcom) return 1;
}
// 2) Poi la riga con partitaMag uguale a refMtbColr.partitaMag
if (refMtbColr != null && refMtbColr.getPartitaMag() != null) {
boolean aMatchesPartitaMag = Objects.equals(a.getPartitaMag(), refMtbColr.getPartitaMag());
boolean bMatchesPartitaMag = Objects.equals(b.getPartitaMag(), refMtbColr.getPartitaMag());
if (aMatchesPartitaMag && !bMatchesPartitaMag) return -1;
if (!aMatchesPartitaMag && bMatchesPartitaMag) return 1;
}
// 3) Infine ordina per dataScad ascendente
if (a.getDataScad() == null && b.getDataScad() == null) return 0;
if (a.getDataScad() == null) return 1;
if (b.getDataScad() == null) return -1;
return a.getDataScad().compareTo(b.getDataScad());
})
.collect(Collectors.toList());
//Controllo se una delle partite combacia con quella che voglio evadere
@@ -1022,33 +1049,23 @@ public class SpedizioneViewModel {
// }
// }
if (availableBatchLots.size() > 1) {
if (availableBatchLotsAndCodJcoms.size() > 1) {
this.sendOnLoadingStarted();
List<MtbPartitaMag> tmp = new ArrayList<>();
if (availableBatchLots.stream().anyMatch(x -> x.getDataScad() != null)) {
tmp.addAll(availableBatchLots.stream()
.filter(x -> x.getDataScad() != null && UtilityDate.getNow().isBefore(x.getDataScad()))
.sorted(Comparator.comparing(MtbPartitaMag::getDataScad))
.collect(Collectors.toList()));
}
if (availableBatchLots.stream().anyMatch(x -> x.getDataScad() == null)) {
tmp.addAll(availableBatchLots.stream()
.filter(x -> x.getDataScad() == null)
.sorted(Comparator.comparing(x -> UtilityString.isNull(x.getPartitaMag(), "")))
.collect(Collectors.toList()));
}
var selected = this.sendBatchLotSelectionRequest(tmp);
var selected = this.sendBatchLotSelectionRequest(availableBatchLotsAndCodJcoms);
this.sendOnLoadingEnded();
if (selected != null) {
MtbColr scannedMtbColr = pickingObjectDTO.getTempPickData().getSourceMtbColt().getMtbColr().stream()
.filter(x -> x.getCodMart().equalsIgnoreCase(pickingObjectDTO.getMtbAart().getCodMart()) &&
.filter(x ->
x.getCodMart().equalsIgnoreCase(pickingObjectDTO.getMtbAart().getCodMart()) &&
((x.getPartitaMag() != null && selected.getPartitaMag() != null && x.getPartitaMag().equalsIgnoreCase(selected.getPartitaMag()))
|| (x.getPartitaMag() == null && selected.getPartitaMag() == null)))
|| (x.getPartitaMag() == null && selected.getPartitaMag() == null)) &&
((x.getCodJcom() != null && selected.getCodJcom() != null && x.getCodJcom().equalsIgnoreCase(selected.getCodJcom()))
|| (x.getCodJcom() == null && selected.getCodJcom() == null)))
.findFirst()
.orElse(null);
@@ -1543,9 +1560,6 @@ public class SpedizioneViewModel {
.setMtbAart(null);
}
var clonedTargetMtbColt = (MtbColt) mCurrentMtbColt.clone();
clonedTargetMtbColt.setMtbColr(null);
var insertUDSRowRequestDto = new InsertUDSRowRequestDTO()
.setSourceMtbColr(clonedSourceMtbColr)
.setCodMart(pickingObjectDTO.getMtbAart().getCodMart())
@@ -1553,7 +1567,7 @@ public class SpedizioneViewModel {
.setQtaCnf(qtaCnf)
.setNumCnf(numCnf)
.setPartitaMag(partitaMag)
.setTargetMtbColt(clonedTargetMtbColt);
.setTargetMtbColt(mCurrentMtbColt.clone(false));
if (dataScad != null)
insertUDSRowRequestDto
@@ -1568,6 +1582,7 @@ public class SpedizioneViewModel {
createdMtbColr = this.mColliScaricoRESTConsumer.insertUDSRowSynchronized(insertUDSRowRequestDto);
} catch (Exception ex) {
this.sendError(ex);
return;
}
MtbColr finalCreatedMtbColr = createdMtbColr;
@@ -2299,7 +2314,7 @@ public class SpedizioneViewModel {
void onLUPositionChangeRequest(RunnableArgss<Boolean, MtbDepoPosizione> onComplete);
void onBatchLotSelectionRequest(List<MtbPartitaMag> availableBatchLots, RunnableArgs<MtbPartitaMag> onComplete);
void onBatchLotSelectionRequest(List<PartitaCommessaDTO> availableBatchLotsCodJcoms, RunnableArgs<PartitaCommessaDTO> onComplete);
PrintOrderCloseDTO onCloseOrderPrintRequest();

View File

@@ -30,6 +30,7 @@ import it.integry.integrywmsnative.core.model.MtbColr;
import it.integry.integrywmsnative.core.model.MtbColt;
import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.core.utility.UtilityNumber;
import it.integry.integrywmsnative.core.utility.UtilityResources;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.databinding.SpedizioneMainListGroupHeaderBinding;
import it.integry.integrywmsnative.databinding.SpedizioneMainListGroupItemBinding;
@@ -129,9 +130,17 @@ public class SpedizioneListAdapter extends SectionedRecyclerViewAdapter<Spedizio
}
holder.mBinding.deactivatedOverBg.setVisibility(!pickingObjectDTO.isActive() ? View.VISIBLE : View.GONE);
holder.mBinding.getRoot().setAlpha(!pickingObjectDTO.isActive() ? 0.8f : 1);
holder.mBinding.badge1.setBackground(ResourcesCompat.getDrawable(mContext.getResources(), !pickingObjectDTO.isActive() ? R.drawable.badge_round_corner : R.drawable.badge1_round_corner, null));
holder.mBinding.badge1.setTextColor(ResourcesCompat.getColor(mContext.getResources(), !pickingObjectDTO.isActive() ? R.color.gray_600 : R.color.white, null));
holder.mBinding.badge1.setBackgroundTintList(UtilityResources.getColorStateListFromAttr(mContext,
!pickingObjectDTO.isActive() ? R.color.gray_400 : com.google.android.material.R.attr.colorPrimaryContainer));
if (!pickingObjectDTO.isActive())
holder.mBinding.badge1.setTextColor(ResourcesCompat.getColor(mContext.getResources(), R.color.gray_600, null));
else
holder.mBinding.badge1.setTextColor(UtilityResources.getColorStateListFromAttr(mContext, com.google.android.material.R.attr.colorOnPrimaryContainer));
holder.mBinding.qtaEvasa.setTextColor(ResourcesCompat.getColor(mContext.getResources(), !pickingObjectDTO.isActive() ? R.color.gray_600 : R.color.green_700, null));
holder.mBinding.descrizione.setText(pickingObjectDTO.getDescrizione());
@@ -163,7 +172,8 @@ public class SpedizioneListAdapter extends SectionedRecyclerViewAdapter<Spedizio
var mtbUntMis = pickingObjectDTO.getOriginalModel().getMtbAart().getMtbUntMis().get(0);
if (mtbUntMis.isFlagDig()) cifreDec = 0;
else cifreDec = Math.min(mtbUntMis.getCifreDec().intValue(), CommonConst.Config.NUMBER_OF_DECIMAL_DIGITS);
else
cifreDec = Math.min(mtbUntMis.getCifreDec().intValue(), CommonConst.Config.NUMBER_OF_DECIMAL_DIGITS);
}
holder.mBinding.qtaEvasa.setText(UtilityNumber.decimalToString(pickingObjectDTO.getQtaEvasa(), cifreDec));

View File

@@ -1,4 +1,4 @@
package it.integry.integrywmsnative.view.dialogs.choose_batch_lot.choose_art_from_lista_mtb_colr;
package it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_mtb_colr;
import android.content.Context;
import android.view.LayoutInflater;

View File

@@ -1,4 +1,4 @@
package it.integry.integrywmsnative.view.dialogs.choose_batch_lot.choose_art_from_lista_mtb_colr;
package it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_mtb_colr;
import android.app.Dialog;
import android.content.Context;

View File

@@ -11,15 +11,15 @@ import java.util.List;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.interfaces.IRecyclerItemClicked;
import it.integry.integrywmsnative.core.model.MtbPartitaMag;
import it.integry.integrywmsnative.core.model.dto.PartitaCommessaDTO;
import it.integry.integrywmsnative.databinding.DialogChooseBatchLotItemModelBinding;
public class DialogChooseBatchLotAdapter extends RecyclerView.Adapter<DialogChooseBatchLotAdapter.ViewHolder> {
protected Context mContext;
private final List<MtbPartitaMag> mDataset;
private final IRecyclerItemClicked<MtbPartitaMag> mOnItemClickListener;
private final List<PartitaCommessaDTO> mDataset;
private final IRecyclerItemClicked<PartitaCommessaDTO> mOnItemClickListener;
public static class ViewHolder extends RecyclerView.ViewHolder {
@@ -31,13 +31,13 @@ public class DialogChooseBatchLotAdapter extends RecyclerView.Adapter<DialogChoo
mViewDataBinding = v;
}
public void bind(MtbPartitaMag mtbPartitaMag) {
mViewDataBinding.setMtbPartitaMag(mtbPartitaMag);
public void bind(PartitaCommessaDTO partitaCommessa) {
mViewDataBinding.setInputData(partitaCommessa);
mViewDataBinding.executePendingBindings();
}
}
public DialogChooseBatchLotAdapter(List<MtbPartitaMag> myDataset, IRecyclerItemClicked<MtbPartitaMag> onItemClickListener) {
public DialogChooseBatchLotAdapter(List<PartitaCommessaDTO> myDataset, IRecyclerItemClicked<PartitaCommessaDTO> onItemClickListener) {
mDataset = myDataset;
mOnItemClickListener = onItemClickListener;
}
@@ -51,7 +51,7 @@ public class DialogChooseBatchLotAdapter extends RecyclerView.Adapter<DialogChoo
@Override
public void onBindViewHolder(DialogChooseBatchLotAdapter.ViewHolder holder, int position) {
MtbPartitaMag item = mDataset.get(position);
PartitaCommessaDTO item = mDataset.get(position);
holder.bind(item);
holder.mViewDataBinding.getRoot().setOnClickListener(x -> {

View File

@@ -22,7 +22,7 @@ import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.expansion.BaseDialogFragment;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.interfaces.IRecyclerItemClicked;
import it.integry.integrywmsnative.core.model.MtbPartitaMag;
import it.integry.integrywmsnative.core.model.dto.PartitaCommessaDTO;
import it.integry.integrywmsnative.databinding.DialogChooseBatchLotBinding;
import it.integry.integrywmsnative.ui.SimpleDividerItemDecoration;
@@ -31,22 +31,22 @@ public class DialogChooseBatchLotView extends BaseDialogFragment {
@Inject
DialogChooseBatchLotViewModel mViewModel;
private final List<MtbPartitaMag> mAvailableBatchLot;
private final RunnableArgs<MtbPartitaMag> mOnItemSelected;
private final List<PartitaCommessaDTO> mAvailableBatchLotCodJcom;
private final RunnableArgs<PartitaCommessaDTO> mOnItemSelected;
private Context mContext;
private DialogChooseBatchLotBinding mBindings;
private MtbPartitaMag mSelectedItem;
private PartitaCommessaDTO mSelectedItem;
public static DialogChooseBatchLotView newInstance(List<MtbPartitaMag> availableBatchLot, RunnableArgs<MtbPartitaMag> onItemSelected) {
return new DialogChooseBatchLotView(availableBatchLot, onItemSelected);
public static DialogChooseBatchLotView newInstance(List<PartitaCommessaDTO> availableBatchLotCodJcom, RunnableArgs<PartitaCommessaDTO> onItemSelected) {
return new DialogChooseBatchLotView(availableBatchLotCodJcom, onItemSelected);
}
private DialogChooseBatchLotView(List<MtbPartitaMag> availableBatchLot, RunnableArgs<MtbPartitaMag> onItemSelected) {
private DialogChooseBatchLotView(List<PartitaCommessaDTO> availableBatchLotCodJcom, RunnableArgs<PartitaCommessaDTO> onItemSelected) {
super();
this.mAvailableBatchLot = availableBatchLot;
this.mAvailableBatchLotCodJcom = availableBatchLotCodJcom;
this.mOnItemSelected = onItemSelected;
}
@@ -103,11 +103,11 @@ public class DialogChooseBatchLotView extends BaseDialogFragment {
itemDecorator.setDrawable(ContextCompat.getDrawable(mContext, R.drawable.divider));
mBindings.mainList.addItemDecoration(itemDecorator);
DialogChooseBatchLotAdapter mAdapter = new DialogChooseBatchLotAdapter(mAvailableBatchLot, onItemClicked);
DialogChooseBatchLotAdapter mAdapter = new DialogChooseBatchLotAdapter(mAvailableBatchLotCodJcom, onItemClicked);
mBindings.mainList.setAdapter(mAdapter);
}
private final IRecyclerItemClicked<MtbPartitaMag> onItemClicked = (item, position) -> {
private final IRecyclerItemClicked<PartitaCommessaDTO> onItemClicked = (item, position) -> {
mSelectedItem = item;
dismiss();
};

View File

@@ -31,7 +31,7 @@ import it.integry.integrywmsnative.core.model.MtbDepoPosizione;
import it.integry.integrywmsnative.core.rest.model.Ean128Model;
import it.integry.integrywmsnative.databinding.DialogScanArtBinding;
import it.integry.integrywmsnative.view.dialogs.DialogConsts;
import it.integry.integrywmsnative.view.dialogs.choose_batch_lot.choose_art_from_lista_mtb_colr.DialogChooseArtFromListaMtbColrView;
import it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_mtb_colr.DialogChooseArtFromListaMtbColrView;
public class DialogScanArtView extends BaseDialogFragment implements DialogScanArtViewModel.Listener {

View File

@@ -41,13 +41,14 @@
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:gravity="center_horizontal"
android:text="@string/select_batch_lot" />
android:text="@string/select_batch_lot_dialog_title" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/main_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp" />
android:layout_marginTop="16dp"
tools:listitem="@layout/dialog_choose_batch_lot_item_model"/>
</androidx.appcompat.widget.LinearLayoutCompat>

View File

@@ -12,77 +12,79 @@
<import type="android.view.View" />
<variable
name="mtbPartitaMag"
type="it.integry.integrywmsnative.core.model.MtbPartitaMag" />
name="inputData"
type="it.integry.integrywmsnative.core.model.dto.PartitaCommessaDTO" />
</data>
<androidx.appcompat.widget.LinearLayoutCompat
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="8dp"
android:paddingBottom="8dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
<TextView
android:id="@+id/partita_mag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:text="@{UtilityString.isNull(inputData.partitaMag, &quot;Nessun lotto&quot;)}"
style="@style/TextAppearance.Material3.LabelLarge"
android:textColor="?colorPrimary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:text="Nessun lotto" />
<TextView
android:id="@+id/cod_jcom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{inputData.codJcom}"
style="@style/TextAppearance.Material3.LabelLarge"
android:background="@drawable/badge_round_corner"
android:backgroundTint="?colorPrimaryContainer"
android:textColor="?colorOnPrimaryContainer"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
app:visibilityWhenNotNull="@{inputData.codJcom}"
tools:text="Nessuna commessa" />
<TextView
android:id="@+id/data_scad_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Scadenza: "
android:layout_marginEnd="4dp"
style="@style/TextAppearance.Material3.BodyMedium"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/partita_mag"
app:visibilityWhenNotNull="@{inputData.dataScad}" />
<TextView
android:id="@+id/data_scad"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{UtilityDate.formatDate(inputData.dataScad, UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN)}"
style="@style/TextAppearance.Material3.BodyMedium"
app:layout_constraintBaseline_toBaselineOf="@id/data_scad_label"
app:layout_constraintStart_toEndOf="@id/data_scad_label"
app:visibilityWhenNotNull="@{inputData.dataScad}"
tools:text="02/05/2025" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:ellipsize="end"
android:text="@{UtilityString.isNull(inputData.descrizione, &quot;Nessuna descrizione&quot;)}"
android:textColor="@android:color/black"
style="@style/TextAppearance.Material3.BodyLarge"
app:layout_constraintTop_toBottomOf="@id/data_scad_label"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:text="Descrizione lunga articolo" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{UtilityString.isNull(mtbPartitaMag.partitaMag, &quot;Nessun lotto&quot;)}"
style="@style/AppTheme.NewMaterial.Text.Medium"
android:textColor="?colorPrimary"
android:textStyle="bold"
tools:text="PARTITA MAG" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Data scad: "
android:textSize="14sp"
android:textStyle="bold"
android:layout_toStartOf="@id/data_scad"
android:layout_marginEnd="4dp"
android:visibility="@{mtbPartitaMag.dataScad == null ? View.GONE : View.VISIBLE}" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/data_scad"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:text="@{UtilityDate.formatDate(mtbPartitaMag.dataScad, UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN)}"
android:textSize="14sp"
android:textStyle="bold"
android:visibility="@{mtbPartitaMag.dataScad == null ? View.GONE : View.VISIBLE}"
tools:text="Data scad" />
</RelativeLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:text="@{UtilityString.isNull(mtbPartitaMag.descrizione, &quot;Nessuna descrizione&quot;)}"
android:textColor="@android:color/black"
android:textSize="16sp"
tools:text="Descrizione lunga articolo" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
</layout>

View File

@@ -25,8 +25,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="BADGE 1"
tools:backgroundTint="?attr/colorPrimaryContainer"
tools:textColor="?attr/colorOnPrimaryContainer"
android:background="@drawable/badge_round_corner"
android:textColor="@android:color/white"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:paddingLeft="6dp"
@@ -41,14 +42,6 @@
android:orientation="horizontal"
android:gravity="end">
<!--<TextView-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content"-->
<!--android:textStyle="bold"-->
<!--android:textColor="@color/green_700"-->
<!--style="@android:style/TextAppearance.Medium"-->
<!--android:text="@string/dispatched"/>-->
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/qta_evasa"
android:layout_width="wrap_content"

View File

@@ -358,7 +358,7 @@
<string name="manufacture">Produzione</string>
<string name="production">Produzione</string>
<string name="production_line">Linea di produzione</string>
<string name="select_batch_lot">Seleziona un lotto</string>
<string name="select_batch_lot_dialog_title">Seleziona un lotto/commessa</string>
<string name="internal_handling">Movimentazione interna</string>
<string name="prod_ordine_produzione_title_fragment">Accettazione da ordine</string>
<string name="prod_ordine_lavorazione_title_fragment">Picking da ordine</string>

View File

@@ -361,7 +361,7 @@
<string name="manufacture">Manufacture</string>
<string name="production">Production</string>
<string name="production_line">Production line</string>
<string name="select_batch_lot">Select a batch lot</string>
<string name="select_batch_lot_dialog_title">Select a batch lot/job</string>
<string name="internal_handling">Internal handling</string>
<string name="prod_ordine_produzione_title_fragment">Production picking</string>
<string name="prod_ordine_lavorazione_title_fragment">Manufacture picking</string>

View File

@@ -1,7 +1,7 @@
apply plugin: 'com.android.library'
android {
compileSdk 35
compileSdk 36
defaultConfig {
minSdkVersion 21
@@ -38,5 +38,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.1'
agp_version = '8.12.2'
}
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"
@@ -41,6 +41,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'
@@ -40,6 +40,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"
}
@@ -38,6 +38,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"
}
@@ -40,7 +40,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')
}