diff --git a/app/build.gradle b/app/build.gradle index 7947bffd..680b4b17 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 438 - def appVersionName = '1.40.21' + def appVersionCode = 446 + def appVersionName = '1.40.29' signingConfigs { release { diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliAccettazioneRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliAccettazioneRESTConsumer.java index 91dcdb01..dc07ca34 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliAccettazioneRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliAccettazioneRESTConsumer.java @@ -114,4 +114,21 @@ public class ColliAccettazioneRESTConsumer extends _BaseRESTConsumer implements }); } + public void checkBarcodeUl(String barcodeUl, RunnableArgs onComplete, RunnableArgs onFailed){ + ColliAccettazioneRESTConsumerService colliAccettazioneRESTConsumerService = RESTBuilder.getService(ColliAccettazioneRESTConsumerService.class); + + colliAccettazioneRESTConsumerService.checkIfBarcodeUlAlreadyRegistered(barcodeUl) + .enqueue(new Callback<>() { + @Override + public void onResponse(Call> call, Response> response) { + analyzeAnswer(response, "accettazione/checkIfBarcodeUlAlreadyRegistered", onComplete, onFailed); + } + + @Override + public void onFailure(Call> call, Throwable t) { + onFailed.run(new Exception(t)); + } + }); + } + } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliAccettazioneRESTConsumerService.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliAccettazioneRESTConsumerService.java index 42a65b48..5f239012 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliAccettazioneRESTConsumerService.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliAccettazioneRESTConsumerService.java @@ -12,7 +12,9 @@ import it.integry.integrywmsnative.core.rest.model.uds.InsertUDCRowRequestDTO; import it.integry.integrywmsnative.core.rest.model.uds.InsertUDCRowResponseDTO; import retrofit2.Call; import retrofit2.http.Body; +import retrofit2.http.GET; import retrofit2.http.POST; +import retrofit2.http.Query; public interface ColliAccettazioneRESTConsumerService { @@ -31,4 +33,7 @@ public interface ColliAccettazioneRESTConsumerService { @POST("wms/accettazione/deleteUDCRow") Call> deleteUDCRow(@Body DeleteUDCRowRequestDTO deleteUDCRowRequestDTO); + @GET("wms/accettazione/checkIfBarcodeUlAlreadyRegistered") + Call> checkIfBarcodeUlAlreadyRegistered(@Query("barcodeUl") String barcodeUl); + } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliSpedizioneRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliSpedizioneRESTConsumer.java index 962e077b..a44d8bc2 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliSpedizioneRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliSpedizioneRESTConsumer.java @@ -1,5 +1,7 @@ package it.integry.integrywmsnative.core.rest.consumers; +import androidx.annotation.NonNull; + import javax.inject.Singleton; import it.integry.integrywmsnative.core.expansion.RunnableArgs; @@ -13,6 +15,8 @@ import it.integry.integrywmsnative.core.rest.model.uds.CloseUDSResponseDTO; import it.integry.integrywmsnative.core.rest.model.uds.CreateUDSRequestDTO; import it.integry.integrywmsnative.core.rest.model.uds.CreateUDSResponseDTO; import it.integry.integrywmsnative.core.rest.model.uds.DeleteUDSRowRequestDTO; +import it.integry.integrywmsnative.core.rest.model.uds.DuplicateUDSRequestDTO; +import it.integry.integrywmsnative.core.rest.model.uds.DuplicateUDSResponseDTO; import it.integry.integrywmsnative.core.rest.model.uds.EditUDSRowRequestDTO; import it.integry.integrywmsnative.core.rest.model.uds.EditUDSRowResponseDTO; import it.integry.integrywmsnative.core.rest.model.uds.InsertUDSRowRequestDTO; @@ -113,4 +117,21 @@ public class ColliSpedizioneRESTConsumer extends _BaseRESTConsumer implements Co } + public void duplicateUDS(DuplicateUDSRequestDTO duplicateUDSRequestDTO, RunnableArgs onComplete, RunnableArgs onFailed) { + ColliSpedizioneRESTConsumerService colliSpedizioneRESTConsumerService = RESTBuilder.getService(ColliSpedizioneRESTConsumerService.class); + + colliSpedizioneRESTConsumerService.duplicateUDS(duplicateUDSRequestDTO) + .enqueue(new Callback<>() { + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> response) { + analyzeAnswer(response, "spedizione/duplicateUDS", onComplete, onFailed); + } + + @Override + public void onFailure(@NonNull Call> call, @NonNull Throwable t) { + onFailed.run(new Exception()); + } + }); + } + } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliSpedizioneRESTConsumerService.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliSpedizioneRESTConsumerService.java index 32f0b1fc..b80f725d 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliSpedizioneRESTConsumerService.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliSpedizioneRESTConsumerService.java @@ -6,6 +6,8 @@ import it.integry.integrywmsnative.core.rest.model.uds.CloseUDSResponseDTO; import it.integry.integrywmsnative.core.rest.model.uds.CreateUDSRequestDTO; import it.integry.integrywmsnative.core.rest.model.uds.CreateUDSResponseDTO; import it.integry.integrywmsnative.core.rest.model.uds.DeleteUDSRowRequestDTO; +import it.integry.integrywmsnative.core.rest.model.uds.DuplicateUDSRequestDTO; +import it.integry.integrywmsnative.core.rest.model.uds.DuplicateUDSResponseDTO; import it.integry.integrywmsnative.core.rest.model.uds.EditUDSRowRequestDTO; import it.integry.integrywmsnative.core.rest.model.uds.EditUDSRowResponseDTO; import it.integry.integrywmsnative.core.rest.model.uds.InsertUDSRowRequestDTO; @@ -35,4 +37,7 @@ public interface ColliSpedizioneRESTConsumerService { @POST("wms/spedizione/deleteUDSRow") Call> deleteUDSRow(@Body DeleteUDSRowRequestDTO deleteUDSRowRequestDTO); + @POST("wms/spedizione/duplicateUDS") + Call> duplicateUDS(@Body DuplicateUDSRequestDTO duplicateUDSRequestDTO); + } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DocumentRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DocumentRESTConsumer.java index 92740653..fc6643db 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DocumentRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DocumentRESTConsumer.java @@ -2,6 +2,7 @@ package it.integry.integrywmsnative.core.rest.consumers; import androidx.annotation.NonNull; +import java.util.Date; import java.util.List; import javax.inject.Singleton; @@ -18,7 +19,7 @@ import retrofit2.Response; @Singleton public class DocumentRESTConsumer extends _BaseRESTConsumer { - + public void createDocsFromColli(List listColli, RunnableArgs> onComplete, RunnableArgs onFailed) { DocumentiRESTConsumerService documentiRESTConsumerService = RESTBuilder.getService(DocumentiRESTConsumerService.class); @@ -50,8 +51,21 @@ public class DocumentRESTConsumer extends _BaseRESTConsumer { }); } + public void checkFrumaDocument(String fornitore, String numDoc, String dataDoc, RunnableArgs onComplete, RunnableArgs onFailed) { + var inventarioRESTConsumerService = RESTBuilder.getService(DocumentiRESTConsumerService.class); + inventarioRESTConsumerService.checkFrumaDoc(fornitore, numDoc, dataDoc) + .enqueue(new Callback<>() { + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> response) { + analyzeAnswer(response, "checkDocument", onComplete, onFailed); + } - + @Override + public void onFailure(@NonNull Call> call, @NonNull Throwable t) { + onFailed.run(new Exception(t)); + } + }); + } public void loadDocumentAvailableArts(String codDtip, String codMgrp, String codAnagForn, RunnableArgs onComplete, RunnableArgs onFailed) { var inventarioRESTConsumerService = RESTBuilder.getService(DocumentiRESTConsumerService.class); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DocumentiRESTConsumerService.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DocumentiRESTConsumerService.java index 2ba2c2d6..bfd9d899 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DocumentiRESTConsumerService.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DocumentiRESTConsumerService.java @@ -1,5 +1,6 @@ package it.integry.integrywmsnative.core.rest.consumers; +import java.util.Date; import java.util.List; import it.integry.integrywmsnative.core.model.DtbDoct; @@ -20,8 +21,11 @@ public interface DocumentiRESTConsumerService { @POST("createDocFromColli") Call> createDocFromColli(@Body LoadColliDTO listColli); - - + @GET("wms/documento/checkFruma") + Call> checkFrumaDoc( + @Query("fornitore") String fornitore, + @Query("numDoc") String numDoc, + @Query("dataDoc") String dataDoc); @GET("wms/documento/arts") Call> retrieveArts( diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MagazzinoRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MagazzinoRESTConsumer.java index af1b4f46..602ce4b0 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MagazzinoRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MagazzinoRESTConsumer.java @@ -1,13 +1,19 @@ package it.integry.integrywmsnative.core.rest.consumers; +import androidx.annotation.NonNull; + +import java.util.Date; +import java.util.List; import java.util.concurrent.ExecutorService; import javax.inject.Singleton; import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.model.MtbPartitaMag; import it.integry.integrywmsnative.core.rest.RESTBuilder; import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; +import it.integry.integrywmsnative.core.utility.UtilityDate; import it.integry.integrywmsnative.gest.contab_doc_interni.dto.SaveDTO; import retrofit2.Call; import retrofit2.Callback; @@ -59,4 +65,20 @@ public class MagazzinoRESTConsumer extends _BaseRESTConsumer { } }); } + + public void retrieveAllPartitaMag(List codMarts, Date dataScad, RunnableArgs> onComplete, RunnableArgs onFailed) { + MagazzinoRESTConsumerService service = RESTBuilder.getService(MagazzinoRESTConsumerService.class); + service.retrieveAllPartitaMag(codMarts, UtilityDate.formatDate(dataScad, UtilityDate.COMMONS_DATE_FORMATS.YMD_SLASH)) + .enqueue(new Callback<>() { + @Override + public void onResponse(@NonNull Call>> call, @NonNull Response>> response) { + analyzeAnswer(response, "retrieveAllPartitaMag", onComplete, onFailed); + } + + @Override + public void onFailure(@NonNull Call>> call, @NonNull Throwable t) { + onFailed.run(new Exception(t)); + } + }); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MagazzinoRESTConsumerService.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MagazzinoRESTConsumerService.java index 2797ffee..60cd5dbd 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MagazzinoRESTConsumerService.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MagazzinoRESTConsumerService.java @@ -3,14 +3,12 @@ package it.integry.integrywmsnative.core.rest.consumers; import java.util.List; import it.integry.integrywmsnative.core.model.MtbPartitaMag; -import it.integry.integrywmsnative.core.model.MtbTCol; import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; import it.integry.integrywmsnative.gest.contab_doc_interni.dto.SaveDTO; import retrofit2.Call; import retrofit2.http.Body; import retrofit2.http.GET; import retrofit2.http.POST; -import retrofit2.http.Path; import retrofit2.http.Query; public interface MagazzinoRESTConsumerService { @@ -22,6 +20,7 @@ public interface MagazzinoRESTConsumerService { Call> retrievePartitaMag(@Query("codMart") String codMart, @Query("partitaMag") String partitaMag); - - + @POST("wms/partita-magazzino/retrieveAllPartitaMag") + Call>> retrieveAllPartitaMag(@Body List codMarts, + @Query("dataScad") String dataScad); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/model/uds/DuplicateUDSRequestDTO.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/uds/DuplicateUDSRequestDTO.java new file mode 100644 index 00000000..24c5bc0d --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/uds/DuplicateUDSRequestDTO.java @@ -0,0 +1,28 @@ +package it.integry.integrywmsnative.core.rest.model.uds; + +import it.integry.integrywmsnative.core.model.MtbColt; + +public class DuplicateUDSRequestDTO { + + private MtbColt mtbColt; + + private int numOfDuplicates; + + public MtbColt getMtbColt() { + return mtbColt; + } + + public DuplicateUDSRequestDTO setMtbColt(MtbColt mtbColt) { + this.mtbColt = mtbColt; + return this; + } + + public int getNumOfDuplicates() { + return numOfDuplicates; + } + + public DuplicateUDSRequestDTO setNumOfDuplicates(int numOfDuplicates) { + this.numOfDuplicates = numOfDuplicates; + return this; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/model/uds/DuplicateUDSResponseDTO.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/uds/DuplicateUDSResponseDTO.java new file mode 100644 index 00000000..47d39930 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/uds/DuplicateUDSResponseDTO.java @@ -0,0 +1,19 @@ +package it.integry.integrywmsnative.core.rest.model.uds; + +import java.util.List; + +import it.integry.integrywmsnative.core.model.MtbColt; + +public class DuplicateUDSResponseDTO { + + private List mtbColtList; + + public List getMtbColtList() { + return mtbColtList; + } + + public DuplicateUDSResponseDTO setMtbColtList(List mtbColtList) { + this.mtbColtList = mtbColtList; + return this; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/settings/DBSettingsModel.java b/app/src/main/java/it/integry/integrywmsnative/core/settings/DBSettingsModel.java index 0c1f0860..5f2448bb 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/settings/DBSettingsModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/settings/DBSettingsModel.java @@ -34,6 +34,7 @@ public class DBSettingsModel { private boolean flagSpedizioneCanSelectMultipleOrders; private List notePerditaDocInterni = new ArrayList<>(); private boolean flagSpedizioneUseQtaOrd; + private boolean flagSpedizioneUseColliPedana; private boolean flagOrdinaNuoviArticoliInGriglia; private boolean flagOrdinaArticoliOnScan; private boolean flagConsentiFuoriPianoLogistico; @@ -78,6 +79,10 @@ public class DBSettingsModel { private boolean flagTracciamentoImballiCaricoEnabled = false; private boolean flagTracciamentoImballiScaricoEnabled = false; + private boolean flagPickingLiberoEnableScanArt = false; + private boolean flagAskDuplicateUDSSpedizione = false; + + private boolean suggestDataScad = false; public boolean isFlagSpedizioneEnableFakeGiacenza() { return flagSpedizioneEnableFakeGiacenza; @@ -268,6 +273,15 @@ public class DBSettingsModel { return this; } + public boolean isFlagSpedizioneUseColliPedana() { + return flagSpedizioneUseColliPedana; + } + + public DBSettingsModel setFlagSpedizioneUseColliPedana(boolean flagSpedizioneUseColliPedana) { + this.flagSpedizioneUseColliPedana = flagSpedizioneUseColliPedana; + return this; + } + public DBSettingsModel setFlagOrdinaNuoviArticoliInGriglia(boolean flagOrdinaNuoviArticoliInGriglia) { this.flagOrdinaNuoviArticoliInGriglia = flagOrdinaNuoviArticoliInGriglia; return this; @@ -654,4 +668,31 @@ public class DBSettingsModel { this.flagTracciamentoImballiScaricoEnabled = flagTracciamentoImballiScaricoEnabled; return this; } + + public boolean isFlagPickingLiberoEnableScanArt() { + return flagPickingLiberoEnableScanArt; + } + + public DBSettingsModel setFlagPickingLiberoEnableScanArt(boolean flagPickingLiberoEnableScanArt) { + this.flagPickingLiberoEnableScanArt = flagPickingLiberoEnableScanArt; + return this; + } + + public boolean isFlagAskDuplicateUDSSpedizione() { + return flagAskDuplicateUDSSpedizione; + } + + public DBSettingsModel setFlagAskDuplicateUDSSpedizione(boolean flagAskDuplicateUDSSpedizione) { + this.flagAskDuplicateUDSSpedizione = flagAskDuplicateUDSSpedizione; + return this; + } + + public boolean isSuggestDataScad() { + return suggestDataScad; + } + + public DBSettingsModel setSuggestDataScad(boolean suggestDataScad) { + this.suggestDataScad = suggestDataScad; + return this; + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java b/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java index bb2c9c7d..7a85f68a 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java @@ -315,6 +315,11 @@ public class SettingsManager { .setSection("SPEDIZIONE") .setKeySection("FLAG_USE_QTA_ORD") .setSetter(dbSettingsModelIstance::setFlagSpedizioneUseQtaOrd)); + stbGestSetupReaderList.add(new StbGestSetupReader<>(Boolean.class) + .setGestName("PICKING") + .setSection("SPEDIZIONE") + .setKeySection("FLAG_USE_COLLI_PEDANA") + .setSetter(dbSettingsModelIstance::setFlagSpedizioneUseColliPedana)); stbGestSetupReaderList.add(new StbGestSetupReader<>(Integer.class) .setGestName("PICKING") .setSection("SETUP") @@ -388,6 +393,11 @@ public class SettingsManager { .setSection("SPEDIZIONE") .setKeySection("FLAG_ASK_INFO_AGGIUNTIVE") .setSetter(dbSettingsModelIstance::setFlagAskInfoAggiuntiveSpedizione)); + stbGestSetupReaderList.add(new StbGestSetupReader<>(Boolean.class) + .setGestName("PICKING") + .setSection("SPEDIZIONE") + .setKeySection("FLAG_ASK_DUPLICATE_UDS") + .setSetter(dbSettingsModelIstance::setFlagAskDuplicateUDSSpedizione)); stbGestSetupReaderList.add(new StbGestSetupReader<>(String.class) .setGestName("PICKING") .setSection("SPEDIZIONE") @@ -446,6 +456,12 @@ public class SettingsManager { .setKeySection("GENERA_DOC") .setSetter(dbSettingsModelIstance::setFlagGeneraDocumentoSpedizione) .setDefaultValue(false)); + stbGestSetupReaderList.add(new StbGestSetupReader<>(Boolean.class) + .setGestName("PICKING") + .setSection("SPEDIZIONE") + .setKeySection("SUGGEST_DATA_SCAD") + .setSetter(dbSettingsModelIstance::setSuggestDataScad) + .setDefaultValue(false)); stbGestSetupReaderList.add(new StbGestSetupReader<>(Boolean.class) .setGestName("PICKING") .setSection("ACCETTAZIONE_BOLLA") @@ -518,6 +534,12 @@ public class SettingsManager { .setKeySection("FLAG_WARNING_NEW_PARTITA_MAG") .setSetter(dbSettingsModelIstance::setFlagWarningNewPartitaMag) .setDefaultValue(false)); + stbGestSetupReaderList.add(new StbGestSetupReader<>(Boolean.class) + .setGestName("PICKING") + .setSection("PICKING_LIBERO") + .setKeySection("ENABLE_SCAN_ART") + .setSetter(dbSettingsModelIstance::setFlagPickingLiberoEnableScanArt) + .setDefaultValue(true)); stbGestSetupReaderList.add(new StbGestSetupReader<>(String.class) .setGestName("PICKING") diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/AccettazioneBollaPickingActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/AccettazioneBollaPickingActivity.java index 7710b378..6ae8b99d 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/AccettazioneBollaPickingActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/AccettazioneBollaPickingActivity.java @@ -22,6 +22,8 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Objects; import javax.inject.Inject; @@ -33,6 +35,7 @@ import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; import it.integry.integrywmsnative.core.data_cache.DataCache; import it.integry.integrywmsnative.core.di.BindableBoolean; import it.integry.integrywmsnative.core.expansion.BaseActivity; +import it.integry.integrywmsnative.core.expansion.OnGeneralChangedCallback; import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.expansion.RunnableArgss; import it.integry.integrywmsnative.core.model.MtbAart; @@ -54,11 +57,15 @@ import it.integry.integrywmsnative.gest.accettazione_bolla_elenco.rest.dto.SitBo import it.integry.integrywmsnative.gest.accettazione_bolla_elenco.rest.dto.TestataBollaAccettazioneDTO; import it.integry.integrywmsnative.gest.accettazione_bolla_picking.dto.AccettazioneBollaPickingOrderBy; import it.integry.integrywmsnative.gest.accettazione_bolla_picking.dto.PickingObjectDTO; +import it.integry.integrywmsnative.gest.accettazione_bolla_picking.filters.AccettazioneBollaPickingFilterViewModel; import it.integry.integrywmsnative.gest.accettazione_bolla_picking.ui.AccettazioneBollaPickingListAdapter; import it.integry.integrywmsnative.gest.accettazione_bolla_picking.ui.AccettazioneBollaPickingListModel; +import it.integry.integrywmsnative.gest.accettazione_ordini_picking.filters.FilterDescrLayoutView; import it.integry.integrywmsnative.gest.lista_bancali.ListaBancaliActivity; import it.integry.integrywmsnative.gest.spedizione.exceptions.InvalidPesoKGException; import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO; +import it.integry.integrywmsnative.ui.filter_chips.FilterChipDTO; +import it.integry.integrywmsnative.ui.filter_chips.FilterChipView; import it.integry.integrywmsnative.view.bottom_sheet__lu_content.BottomSheetFragmentLUContentView; import it.integry.integrywmsnative.view.bottom_sheet__lu_content.BottomSheetFragmentLUContentViewModel; import it.integry.integrywmsnative.view.dialogs.ask_should_versamento_automatico_ul.DialogAskShouldVersamentoAutomaticoULView; @@ -82,8 +89,9 @@ public class AccettazioneBollaPickingActivity extends BaseActivity implements Ac private ActivityAccettazioneBollaPickingBinding mBindings; private BottomSheetFragmentLUContentViewModel mBottomSheetFragmentLUContentViewModel; - - + + private final AccettazioneBollaPickingFilterViewModel mAppliedFilterViewModel = new AccettazioneBollaPickingFilterViewModel(); + private final ObservableArrayList mAccettazioneMutableData = new ObservableArrayList<>(); public BindableBoolean noItemsToPick = new BindableBoolean(false); @@ -150,7 +158,7 @@ public class AccettazioneBollaPickingActivity extends BaseActivity implements Ac this.initVars(); this.initBarcodeReader(); this.initRecyclerView(); -// this.initFilters(); + this.initFilters(); this.initFab(); boolean useQtaBolla = SettingsManager.iDB().isFlagAccettazioneBollaUseQtaOrd(); @@ -201,16 +209,85 @@ public class AccettazioneBollaPickingActivity extends BaseActivity implements Ac this.mBindings.accettazionePickingList.setAdapter(adapter); this.mViewModel.getPickingList().observe(this, updatedData -> { -// mAppliedFilterViewModel.init(updatedData); + mAppliedFilterViewModel.init(updatedData); refreshList(); }); + adapter.setOnLongClickListener(clickedItem -> { + this.mViewModel.dispatchBollaRow(clickedItem, true); + }); + adapter.setOnItemClicked(clickedItem -> { this.mViewModel.dispatchBollaRow(clickedItem); }); } + private void initFilters() { + + var onPredicateChanged = new OnGeneralChangedCallback() { + @Override + public void run() { + refreshList(); + } + }; + + mAppliedFilterViewModel.getCurrentDescrPredicate().addOnPropertyChangedCallback(onPredicateChanged); + + List filterList = Stream.of(AccettazioneBollaPickingBindings.AVAILABLE_FILTERS.entrySet()).map(Map.Entry::getValue).sortBy(FilterChipDTO::getPosizione).toList(); + + for (FilterChipDTO filterChipDTO : filterList) { + + FilterChipView filterChipView = new FilterChipView(this, filterChipDTO.getFilterChipText(), v -> initBottomSheetDialogFilter(filterChipDTO)); + + if (filterChipDTO.getID() == AccettazioneBollaPickingBindings.DESCR_FILTER_ID) { + mAppliedFilterViewModel.getCurrentDescrPredicate().addOnPropertyChangedCallback(new OnGeneralChangedCallback() { + @Override + public void run() { + if (mAppliedFilterViewModel.getCurrentDescrPredicate().get() == null) { + mViewModel.resetMatchedRows(); + filterChipView.disableCloseIcon(); + + mBindings.filterChipsGroup.removeView(filterChipView); + mBindings.filterChipsGroup.addView(filterChipView); + mBindings.filterChips.smoothScrollTo(0, 0); + } else { + filterChipView.enableCloseIcon(); + + mBindings.filterChipsGroup.removeView(filterChipView); + mBindings.filterChipsGroup.addView(filterChipView, 0); + mBindings.filterChips.smoothScrollTo(0, 0); + } + } + }); + filterChipView.setOnResetClicked(() -> mAppliedFilterViewModel.getCurrentDescrPredicate().set(null)); + } + + this.mBindings.filterChipsGroup.addView(filterChipView); + } + } + + private void initBottomSheetDialogFilter(FilterChipDTO filterChipDTO) { + + filterChipDTO.getFilterLayoutView().setFilterName(filterChipDTO.getFilterChipText()).setContext(this); + + var filterLayoutView = filterChipDTO.getFilterLayoutView(); + + if (filterChipDTO.getID() == AccettazioneBollaPickingBindings.DESCR_FILTER_ID) { + ((FilterDescrLayoutView) filterLayoutView) + .setAll(mAppliedFilterViewModel.getAllDescrs()) + .setAvailable(mAppliedFilterViewModel.getAvailableDescrs()) + .setOnFilterApplied(mAppliedFilterViewModel::setDescrFilter) + .setPreselected( + Stream.of(Objects.requireNonNull(mViewModel.getPickingList().getValue())) + .filter(mAppliedFilterViewModel.getCurrentDescrPredicate().get() == null ? x -> false : Objects.requireNonNull(mAppliedFilterViewModel.getCurrentDescrPredicate().get())) + .map(x -> x.getMtbAart().getDescrizioneEstesa()).toList() + ); + } + + + if (!filterLayoutView.isAdded()) filterLayoutView.show(getSupportFragmentManager(), "TAG"); + } private void initFab() { fabPopupMenu = new PopupMenu(this, this.mBindings.accettazioneOrdineInevasoFab, @@ -246,13 +323,13 @@ public class AccettazioneBollaPickingActivity extends BaseActivity implements Ac runOnUiThread(() -> { List tmpList; -// if (mAppliedFilterViewModel != null) { -// mAppliedFilterViewModel.applyAllTests(); -// tmpList = mAppliedFilterViewModel.getMutableFilteredOrderList().getValue(); -// } else { + if (mAppliedFilterViewModel != null) { + mAppliedFilterViewModel.applyAllTests(); + tmpList = mAppliedFilterViewModel.getMutableFilteredOrderList().getValue(); + } else { tmpList = mViewModel.getPickingList().getValue(); -// } -// + } + var list = convertDataModelToListModel(tmpList); this.mAccettazioneMutableData.clear(); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/AccettazioneBollaPickingBindings.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/AccettazioneBollaPickingBindings.java new file mode 100644 index 00000000..40df6a37 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/AccettazioneBollaPickingBindings.java @@ -0,0 +1,22 @@ +package it.integry.integrywmsnative.gest.accettazione_bolla_picking; + +import java.util.HashMap; + +import it.integry.integrywmsnative.gest.accettazione_ordini_picking.filters.FilterDescrLayoutView; +import it.integry.integrywmsnative.ui.filter_chips.FilterChipDTO; + +public class AccettazioneBollaPickingBindings { + + public static final int DESCR_FILTER_ID = 0; + + public static final HashMap AVAILABLE_FILTERS = new HashMap<>() { + { + + put(DESCR_FILTER_ID, new FilterChipDTO() + .setID(DESCR_FILTER_ID) + .setPosizione(1) + .setFilterChipText("Descrizione articolo") + .setFilterLayoutView(new FilterDescrLayoutView())); + } + }; +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/AccettazioneBollaPickingViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/AccettazioneBollaPickingViewModel.java index ad521005..6e8b80eb 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/AccettazioneBollaPickingViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/AccettazioneBollaPickingViewModel.java @@ -443,7 +443,11 @@ public class AccettazioneBollaPickingViewModel { dispatchBollaRow(pickingObjectDTO); } - public void dispatchBollaRow(final PickingObjectDTO pickingObjectDTO) { + public void dispatchBollaRow(final PickingObjectDTO pickingObjectDTO){ + dispatchBollaRow(pickingObjectDTO, false); + } + + public void dispatchBollaRow(final PickingObjectDTO pickingObjectDTO, boolean longClick) { if (this.mCurrentMtbColt == null) return; AtomicBigDecimal numCnfWithdrawRows = new AtomicBigDecimal(); @@ -578,31 +582,42 @@ public class AccettazioneBollaPickingViewModel { } } - this.sendOnItemDispatched( - pickingObjectDTO, - pickingObjectDTO.getMtbAart(), - initialNumCnf, initialQtaCnf, initialQtaTot, - qtaDaEvadere, - numCnfDaEvadere, - qtaCnfDaEvadere, - qtaColDaPrelevare, - numCnfDaPrelevare, - qtaCnfDaPrelevare, - null, - null, - null, - partitaMag, - dataScad, - true, - (pickedQuantityDTO, shouldCloseLU) -> { - this.saveNewRow(pickingObjectDTO, - pickedQuantityDTO.getNumCnf(), - pickedQuantityDTO.getQtaCnf(), - pickedQuantityDTO.getQtaTot(), - pickedQuantityDTO.getPartitaMag(), - pickedQuantityDTO.getDataScad(), - shouldCloseLU); - }); + if (!longClick){ + this.sendOnItemDispatched( + pickingObjectDTO, + pickingObjectDTO.getMtbAart(), + initialNumCnf, initialQtaCnf, initialQtaTot, + qtaDaEvadere, + numCnfDaEvadere, + qtaCnfDaEvadere, + qtaColDaPrelevare, + numCnfDaPrelevare, + qtaCnfDaPrelevare, + null, + null, + null, + partitaMag, + dataScad, + true, + (pickedQuantityDTO, shouldCloseLU) -> { + this.saveNewRow(pickingObjectDTO, + pickedQuantityDTO.getNumCnf(), + pickedQuantityDTO.getQtaCnf(), + pickedQuantityDTO.getQtaTot(), + pickedQuantityDTO.getPartitaMag(), + pickedQuantityDTO.getDataScad(), + shouldCloseLU); + }); + } else { + this.saveNewRow( + pickingObjectDTO, + initialNumCnf, + initialQtaCnf, + initialQtaTot, + partitaMag, + dataScad, + false); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/filters/AccettazioneBollaPickingFilterViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/filters/AccettazioneBollaPickingFilterViewModel.java new file mode 100644 index 00000000..6280da7f --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/filters/AccettazioneBollaPickingFilterViewModel.java @@ -0,0 +1,75 @@ +package it.integry.integrywmsnative.gest.accettazione_bolla_picking.filters; + +import androidx.databinding.ObservableField; +import androidx.lifecycle.MutableLiveData; + +import com.annimon.stream.Stream; +import com.annimon.stream.function.Predicate; + +import java.util.List; +import java.util.Objects; + +import it.integry.integrywmsnative.core.utility.UtilityString; +import it.integry.integrywmsnative.gest.accettazione_bolla_picking.dto.PickingObjectDTO; + +public class AccettazioneBollaPickingFilterViewModel { + private final ObservableField> currentDescrPredicate = new ObservableField<>(); + + private List initialOrderList; + private final MutableLiveData> currentFilteredOrderList = new MutableLiveData<>(); + + public void init(List initialList) { + this.initialOrderList = initialList; + this.currentFilteredOrderList.setValue(this.initialOrderList); + } + + public MutableLiveData> getMutableFilteredOrderList() { + return this.currentFilteredOrderList; + } + + + public void setDescrFilter(List descrs) { + if (descrs == null || descrs.isEmpty()) currentDescrPredicate.set(null); + else { + currentDescrPredicate.set(o -> descrs.contains(o.getMtbAart().getDescrizione())); + } + } + + public void applyAllTests() { + + List returnList; + + if (currentDescrPredicate.get() == null) { + returnList = this.initialOrderList; + } else { + Stream tmpStream = Stream.of(this.initialOrderList) + .filter(x ->(currentDescrPredicate.get() == null || (currentDescrPredicate.get().test(x))) + ); + + returnList = tmpStream.toList(); + } + + this.currentFilteredOrderList.setValue(returnList); + } + + public ObservableField> getCurrentDescrPredicate() { + return currentDescrPredicate; + } + + public List getAllDescrs() { + return Stream + .of(Objects.requireNonNull(initialOrderList)) + .filter(x -> x.getMtbAart().getDescrizioneEstesa() != null) + .sortBy(x -> x.getMtbAart().getDescrizioneEstesa()) + .map(x -> x.getMtbAart().getDescrizioneEstesa() != null ? x.getMtbAart().getDescrizioneEstesa() : null) + .distinct() + .toList(); + } + + public List getAvailableDescrs() { + return Stream.of(this.initialOrderList) + .map(x -> x.getMtbAart().getDescrizioneEstesa()) + .distinct() + .toList(); + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/ui/AccettazioneBollaPickingListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/ui/AccettazioneBollaPickingListAdapter.java index 1d6ca3bb..bf8f8a83 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/ui/AccettazioneBollaPickingListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_bolla_picking/ui/AccettazioneBollaPickingListAdapter.java @@ -33,6 +33,7 @@ public class AccettazioneBollaPickingListAdapter extends SectionedRecyclerViewAd private final List mDataset = new ArrayList<>(); private RunnableArgs mOnItemClicked; + private RunnableArgs mOnItemLongClicked; static class SubheaderHolder extends RecyclerView.ViewHolder { @@ -75,6 +76,9 @@ public class AccettazioneBollaPickingListAdapter extends SectionedRecyclerViewAd this.mOnItemClicked = onItemClicked; } + public void setOnLongClickListener(RunnableArgs onItemLongClicked){ + this.mOnItemLongClicked = onItemLongClicked; + } @Override public AccettazioneBollaPickingListAdapter.SubheaderHolder onCreateSubheaderViewHolder(ViewGroup parent, int viewType) { @@ -160,6 +164,12 @@ public class AccettazioneBollaPickingListAdapter extends SectionedRecyclerViewAd if (this.mOnItemClicked != null) this.mOnItemClicked.run(pickingObjectDTO.getOriginalModel()); }); + + holder.mBinding.getRoot().setOnLongClickListener(v -> { + if (this.mOnItemLongClicked != null) + this.mOnItemLongClicked.run(pickingObjectDTO.getOriginalModel()); + return true; + }); } @Override diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_ordini_picking/AccettazioneOrdiniPickingActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_ordini_picking/AccettazioneOrdiniPickingActivity.java index 3f549c78..78f42a9e 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_ordini_picking/AccettazioneOrdiniPickingActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_ordini_picking/AccettazioneOrdiniPickingActivity.java @@ -4,6 +4,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Resources; import android.os.Bundle; +import android.text.Html; import android.text.SpannableString; import android.view.Gravity; import android.view.Menu; @@ -741,6 +742,16 @@ public class AccettazioneOrdiniPickingActivity extends BaseActivity implements A BarcodeManager.enable(); } + @Override + public void onWarning(String warningText, Runnable action) { + this.runOnUiThread(() -> { + this.onLoadingEnded(); + DialogSimpleMessageView + .makeWarningDialog(new SpannableString(Html.fromHtml(warningText)), null, action) + .show(getSupportFragmentManager(), "tag"); + }); + } + @Override public void onItemDispatched(PickingObjectDTO pickingObjectDTO, MtbAart mtbAart, BigDecimal initialNumCnf, BigDecimal initialQtaCnf, BigDecimal initialQtaTot, BigDecimal totalQtaOrd, BigDecimal totalNumCnfOrd, BigDecimal qtaCnfOrd, BigDecimal totalQtaToBeTaken, BigDecimal totalNumCnfToBeTaken, BigDecimal qtaCnfToBeTaken, BigDecimal totalQtaAvailable, BigDecimal totalNumCnfAvailable, BigDecimal qtaCnfAvailable, String partitaMag, LocalDate dataScad, boolean canPartitaMagBeChanged, boolean canOverflowQuantity, String customArtDescription, RunnableArgss onComplete) { DialogInputQuantityV2DTO dialogInputQuantityV2DTO = new DialogInputQuantityV2DTO().setMtbAart(mtbAart).setInitialNumCnf(initialNumCnf).setInitialQtaCnf(initialQtaCnf).setInitialQtaTot(initialQtaTot).setTotalQtaOrd(totalQtaOrd).setTotalNumCnfOrd(totalNumCnfOrd).setQtaCnfOrd(qtaCnfOrd).setTotalQtaToBeTaken(totalQtaToBeTaken).setTotalNumCnfToBeTaken(totalNumCnfToBeTaken).setQtaCnfToBeTaken(qtaCnfToBeTaken).setTotalQtaAvailable(totalQtaAvailable).setTotalNumCnfAvailable(totalNumCnfAvailable).setQtaCnfAvailable(qtaCnfAvailable).setPartitaMag(partitaMag).setDataScad(dataScad).setCanPartitaMagBeChanged(canPartitaMagBeChanged).setCanLUBeClosed(true).setCanOverflowOrderQuantity(canOverflowQuantity).setCustomArtDescription(customArtDescription); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_ordini_picking/AccettazioneOrdiniPickingViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_ordini_picking/AccettazioneOrdiniPickingViewModel.java index 952a72b5..68bff77b 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_ordini_picking/AccettazioneOrdiniPickingViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_ordini_picking/AccettazioneOrdiniPickingViewModel.java @@ -247,8 +247,14 @@ public class AccettazioneOrdiniPickingViewModel { try { Ean128Model ean128Model = mEan128Service.decode(barcodeScanDTO); - //Nel caso trovo un SSCC lo aggiungo - this.processBarcodeNotOpenedLU(barcodeScanDTO, ean128Model.Sscc, onComplete); + mColliAccettazioneRESTConsumer.checkBarcodeUl(ean128Model.Sscc, result -> { + if (result){ + this.sendWarning("Barcode ul già registrato!", onComplete); + } else { + //Nel caso trovo un SSCC lo aggiungo + this.processBarcodeNotOpenedLU(barcodeScanDTO, ean128Model.Sscc, onComplete); + } + }, this::sendError); } catch (Exception e) { this.sendError(e); @@ -550,7 +556,7 @@ public class AccettazioneOrdiniPickingViewModel { if (dataScad == null && pickingObjectDTO.getMtbAart().getGgScadPartita() != null && pickingObjectDTO.getMtbAart().getGgScadPartita() > 0) { dataScad = UtilityDate.getNow(); - dataScad.plusDays(pickingObjectDTO.getMtbAart().getGgScadPartita()); + dataScad = dataScad.plusDays(pickingObjectDTO.getMtbAart().getGgScadPartita()); } if (partitaMag == null && dataScad == null) { @@ -933,6 +939,10 @@ public class AccettazioneOrdiniPickingViewModel { if (this.mListener != null) mListener.onError(ex); } + private void sendWarning(String warningText, Runnable action) { + if (this.mListener != null) mListener.onWarning(warningText, action); + } + private void sendLUOpened(MtbColt mtbColt) { if (this.mListener != null) mListener.onLUOpened(mtbColt); } @@ -1050,6 +1060,8 @@ public class AccettazioneOrdiniPickingViewModel { void onFilterPosizioneApplied(String posizioneToFilter); + void onWarning(String warningText, Runnable action); + void onULVersata(VersamentoAutomaticoULResponseDTO versamentoAutomaticoULResponseDTO, Runnable onComplete); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/contab_doc_interni/DocInterniFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/contab_doc_interni/DocInterniFragment.java index f47d0f26..9b9cc20b 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/contab_doc_interni/DocInterniFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/contab_doc_interni/DocInterniFragment.java @@ -3,6 +3,8 @@ package it.integry.integrywmsnative.gest.contab_doc_interni; import android.content.Context; import android.os.Bundle; +import android.text.Html; +import android.text.SpannableString; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -37,6 +39,7 @@ import it.integry.integrywmsnative.gest.contab_doc_interni.edit_form.DocInterniE import it.integry.integrywmsnative.gest.contab_doc_interni.ui.DocInterniListAdapter; import it.integry.integrywmsnative.gest.contab_doc_interni.ui.DocInterniListModel; import it.integry.integrywmsnative.ui.ElevatedToolbar; +import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; public class DocInterniFragment extends BaseFragment implements ITitledFragment, IScrollableFragment, DocInterniViewModel.Listener { @@ -120,10 +123,21 @@ public class DocInterniFragment extends BaseFragment implements ITitledFragment, this.openDocumentSelectionDialog(); } + @Override + public void onWarning(String warningText, Runnable action) { + this.requireActivity().runOnUiThread(() -> { + this.onLoadingEnded(); + DialogSimpleMessageView + .makeWarningDialog(new SpannableString(Html.fromHtml(warningText)), null, action) + .show(requireActivity().getSupportFragmentManager(), "tag"); + }); + } + @Override public void onDocDetailsChanged(DialogSelectDocInfoResponseDTO selection) { - mViewModel.setSelectedDocDetails(selection); - mBinding.invalidateAll(); + mViewModel.setSelectedDocDetails(selection, () -> { + mBinding.invalidateAll(); + }); } @Override diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/contab_doc_interni/DocInterniViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/contab_doc_interni/DocInterniViewModel.java index 84a04510..ffcda8a5 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/contab_doc_interni/DocInterniViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/contab_doc_interni/DocInterniViewModel.java @@ -8,6 +8,7 @@ import java.util.List; import javax.inject.Inject; +import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.data_store.db.entity.SqlMtbColt; import it.integry.integrywmsnative.core.data_store.db.repository.MtbColtRepository; import it.integry.integrywmsnative.core.data_store.db.wrappers.DocInternoWrapper; @@ -17,6 +18,8 @@ import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingL import it.integry.integrywmsnative.core.rest.consumers.DocumentRESTConsumer; import it.integry.integrywmsnative.core.rest.model.documento.DocumentoArtDTO; import it.integry.integrywmsnative.core.settings.SettingsManager; +import it.integry.integrywmsnative.core.utility.UtilityDate; +import it.integry.integrywmsnative.core.utility.UtilityResources; import it.integry.integrywmsnative.gest.contab_doc_interni.dialog.DialogSelectDocInfoResponseDTO; import it.integry.integrywmsnative.gest.contab_doc_interni.dto.DocInterniSetupDTO; import it.integry.integrywmsnative.gest.contab_doc_interni.dto.FornitoreDTO; @@ -76,6 +79,14 @@ public class DocInterniViewModel { if (this.mListener != null) mListener.onError(ex); } + private void sendWarning(String warningText, Runnable action) { + if (this.mListener != null) mListener.onWarning(warningText, action); + } + + private void sendDocDetailsChanged(DialogSelectDocInfoResponseDTO selection){ + if (this.mListener != null) mListener.onDocDetailsChanged(selection); + } + public DocInterniViewModel setListeners(Listener listener) { this.mListener = listener; return this; @@ -85,7 +96,7 @@ public class DocInterniViewModel { return mDocsList; } - public void setSelectedDocDetails(DialogSelectDocInfoResponseDTO selection) { + public void setSelectedDocDetails(DialogSelectDocInfoResponseDTO selection, Runnable action) { this.fornitore = selection.getFornitore(); this.dtbTipi = selection.getTipoDoc(); @@ -94,10 +105,31 @@ public class DocInterniViewModel { this.numDoc = selection.getNumDoc() != null ? selection.getNumDoc().toString() : null; this.note = selection.getNote(); - this.sendOnLoadingStarted(); - fetchProducts(() -> { - fetchDocuments(this::sendOnLoadingEnded); - }); + if (dtbTipi.getCodDtip().equalsIgnoreCase("FRUMA")) { + documentRESTConsumer.checkFrumaDocument( + fornitore.getCodAnag(), + numDoc, + UtilityDate.formatDate(dataDoc, "yyyy/MM/dd"), + data -> { + if (!data) { + this.sendWarning(UtilityResources.getString(R.string.no_doc_found_message), this::init); + } else { + action.run(); + this.sendOnLoadingStarted(); + fetchProducts(() -> { + fetchDocuments(this::sendOnLoadingEnded); + }); + } + }, + this::sendError + ); + } else { + action.run(); + this.sendOnLoadingStarted(); + fetchProducts(() -> { + fetchDocuments(this::sendOnLoadingEnded); + }); + } } public void fetchProducts(Runnable onComplete) { @@ -210,6 +242,8 @@ public class DocInterniViewModel { void onError(Exception ex); + void onWarning(String warningText, Runnable action); + void onDocInterniSetupFetched(DocInterniSetupDTO docInterniSetupDTO); void onDocDetailsChanged(DialogSelectDocInfoResponseDTO selection); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoViewModel.java index 171877f8..8ea43452 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoViewModel.java @@ -14,6 +14,7 @@ import javax.inject.Inject; import it.integry.barcode_base_android_library.model.BarcodeScanDTO; import it.integry.integrywmsnative.core.exception.InvalidCodMdepException; +import it.integry.integrywmsnative.core.exception.NoArtsFoundException; import it.integry.integrywmsnative.core.exception.NoLUFoundException; import it.integry.integrywmsnative.core.exception.NoResultFromBarcodeException; import it.integry.integrywmsnative.core.exception.ScannedPositionNotExistException; @@ -137,13 +138,15 @@ public class PickingLiberoViewModel { //Cerco tramite etichetta ean 128 (che può indicarmi una UL) this.executeEtichettaEan128(barcodeScanDTO, onComplete); - } else if (UtilityBarcode.isEanPeso(barcodeScanDTO)) { + } else if (UtilityBarcode.isEanPeso(barcodeScanDTO) && SettingsManager.iDB().isFlagPickingLiberoEnableScanArt()) { //Cerco tramite etichetta ean 128 (che può indicarmi un articolo o una UL) this.executeEtichettaEanPeso(barcodeScanDTO, onComplete); - } else { + } else if (SettingsManager.iDB().isFlagPickingLiberoEnableScanArt()){ //Cerco tramite ean13 un collo in posizione mono ul definita in anagrafica articolo, altrimenti se abilitato procedo con picking manuale this.loadArticolo(barcodeScanDTO.getStringValue(), null, onComplete); + } else { + this.sendError(new NoArtsFoundException()); } } @@ -269,18 +272,16 @@ public class PickingLiberoViewModel { if (!UtilityString.isNullOrEmpty(ean128Model.Content)) barcodeProd = ean128Model.Content; - if (!UtilityString.isNullOrEmpty(barcodeProd)) { if (!UtilityString.isNullOrEmpty(ean128Model.Sscc)) { this.executeEtichettaLU(ean128Model.Sscc, onComplete); - } else if (!UtilityString.isNullOrEmpty(barcodeProd)) { + } else if (!UtilityString.isNullOrEmpty(barcodeProd) && SettingsManager.iDB().isFlagPickingLiberoEnableScanArt()) { this.loadArticolo(barcodeProd, ean128Model, onComplete); } else { this.sendError(new NoLUFoundException()); } - } else { //EAN 128 non completo o comunque mancano i riferimenti al prodotto this.sendError(new NoLUFoundException()); @@ -326,7 +327,7 @@ public class PickingLiberoViewModel { private void createNewLU_PostClienteAsk(Integer customNumCollo, String customSerCollo, VtbDest vtbDest, Runnable onComplete) { if (this.mFlagAskLineaProd) { this.sendLULineaProdRequired(response -> { - createNewLU_PostLineaProdAsk(customNumCollo, customSerCollo, vtbDest, response.getPosizione(), response.getIdLotto(), onComplete); + createNewLU_PostLineaProdAsk(customNumCollo, customSerCollo, vtbDest, response.getPosizione(), response.getIdLotto(), onComplete); }, () -> { this.sendOnLoadingEnded(); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java index 1e622974..03c4044b 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java @@ -18,6 +18,7 @@ import androidx.preference.PreferenceFragmentCompat; import androidx.sqlite.db.SimpleSQLiteQuery; import com.annimon.stream.Stream; +import com.google.firebase.crashlytics.FirebaseCrashlytics; import com.harrysoft.androidbluetoothserial.BluetoothManager; import java.io.BufferedReader; @@ -26,7 +27,9 @@ import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.Comparator; import java.util.List; import java.util.concurrent.ExecutorService; @@ -236,9 +239,10 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT File logFilePath = appContext.getLogFilePath(); var files = logFilePath.listFiles(); - var fileToShare = Stream.of(files) - .sortBy(x -> -1 * x.lastModified()) - .findFirstOrElse(null); + var fileToShare = Arrays.stream(files) + .sorted(Comparator.reverseOrder()) + .findFirst() + .orElse(null); try { List attachmentDTOList = new ArrayList<>(); @@ -294,6 +298,8 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT .makeErrorDialog(new SpannableString(Html.fromHtml(ex.getMessage())), null, null) .show(requireActivity().getSupportFragmentManager(), "tag"); }); + + FirebaseCrashlytics.getInstance().recordException(ex); } }); }) diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java index d2022ba4..2ca1a6a5 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java @@ -5,6 +5,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Resources; import android.os.Bundle; +import android.text.Html; import android.text.SpannableString; import android.view.Gravity; import android.widget.Toast; @@ -80,6 +81,7 @@ import it.integry.integrywmsnative.view.dialogs.info_aggiuntive_lu.DialogInfoAgg import it.integry.integrywmsnative.view.dialogs.input_peso_lu.DialogInputPesoLUView; import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2DTO; import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2View; +import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.exception.OverflowQtaTotOrderedQuantityException; import it.integry.integrywmsnative.view.dialogs.scan_art.DialogScanArtView; import it.integry.integrywmsnative.view.dialogs.tracciamento_imballi.DialogTracciamentoImballiView; import it.integry.integrywmsnative.view.dialogs.yes_no.DialogYesNoView; @@ -211,6 +213,7 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo boolean canOverflowOrderQuantity = SettingsManager.iDB().isFlagCanAddExtraQuantitySpedizione(); boolean shouldAskPesoLU = SettingsManager.iDB().isFlagAskPesoColloSpedizione(); boolean useQtaOrd = SettingsManager.iDB().isFlagSpedizioneUseQtaOrd(); + boolean useColliPedana = SettingsManager.iDB().isFlagSpedizioneUseColliPedana(); mViewmodel.init( codMdep, @@ -223,7 +226,8 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo mColliRegistrati, mGestioneCol, mSegnoCol, mDefaultCausaleUL, mEnableQuantityReset, - useQtaOrd); + useQtaOrd, + useColliPedana); } @@ -280,7 +284,7 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo fabPopupMenu.getMenu().removeItem(R.id.close_order); } - if(!SettingsManager.iDB().isFlagTracciamentoImballiScaricoEnabled()) + if (!SettingsManager.iDB().isFlagTracciamentoImballiScaricoEnabled()) fabPopupMenu.getMenu().removeItem(R.id.track_packaging); fabPopupMenu.setOnMenuItemClickListener(item -> { @@ -886,6 +890,11 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo boolean canPartitaMagBeChanged, RunnableArgss onComplete) { + if (dataScad == null && pickingObjectDTO.getMtbAart().getGgScadPartita() != null && pickingObjectDTO.getMtbAart().getGgScadPartita() > 0) { + dataScad = UtilityDate.getNow(); + dataScad = dataScad.plusDays(pickingObjectDTO.getMtbAart().getGgScadPartita()); + } + DialogInputQuantityV2DTO dialogInputQuantityV2DTO = new DialogInputQuantityV2DTO() .setMtbAart(mtbAart) .setInitialNumCnf(initialNumCnf) @@ -907,7 +916,8 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo .setCanLUBeClosed(true) .setCanPartitaMagBeChanged(canPartitaMagBeChanged) .setStatoPartitaMag(pickingObjectDTO != null ? pickingObjectDTO.getStatoArticoloDTO() : null) - .setNotifyProductLotStatus(SettingsManager.iDB().isNotifyLotStatus()); + .setNotifyProductLotStatus(SettingsManager.iDB().isNotifyLotStatus()) + .setMtbPartitaMagList(mViewmodel.getmPartitaMagList()); if (!mDialogInputQuantityV2View.isVisible()) mDialogInputQuantityV2View @@ -1072,4 +1082,32 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo DialogInfoAggiuntiveLUView.newInstance(mtbColt, onComplete, this::onLoadingEnded) .show(getSupportFragmentManager(), DialogInfoAggiuntiveLUView.class.getName()); } + + @Override + public void onInputDuplicate(BigDecimal qtaTot, BigDecimal qtaEvasa, RunnableArgs onComplete, Runnable onNegativeClick) { + String textWarning = UtilityResources.getString(R.string.ordered_quantity_overflow_error_message); + + dialogInputQuantityToDuplicate(inputNumber -> { + if (qtaTot != null && qtaEvasa != null && UtilityBigDecimal.equalsOrGreaterThan(qtaEvasa.multiply(BigDecimal.valueOf(inputNumber)), qtaTot)) { + + DialogSimpleMessageView.makeWarningDialog(new SpannableString(Html.fromHtml(textWarning)), + null, + () -> this.onInputDuplicate(qtaTot, qtaEvasa, onComplete, onNegativeClick) + ).show(getSupportFragmentManager(), "tag"); + } else { + onComplete.run(inputNumber); + } + }, onNegativeClick); + } + + private void dialogInputQuantityToDuplicate(RunnableArgs onComplete, Runnable onNegativeClick) { + DialogSimpleInputHelper.makeInputDialog(this, "Numero pedane da duplicare", inputValue -> { + try { + Integer num = Integer.parseInt(inputValue); + onComplete.run(num); + } catch (NumberFormatException ex) { + this.onError(new Exception("Inserire un numero di risorse valido")); + } + }, onNegativeClick).show(); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneModule.java index dad4a875..e2f150e2 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneModule.java @@ -11,6 +11,7 @@ import it.integry.integrywmsnative.core.rest.consumers.ColliSpedizioneRESTConsum import it.integry.integrywmsnative.core.rest.consumers.DocumentRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.ImballiRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.MagazzinoAutomaticoRESTConsumer; +import it.integry.integrywmsnative.core.rest.consumers.MagazzinoRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.OrdiniRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.PosizioniRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.PrinterRESTConsumer; @@ -36,7 +37,8 @@ public class SpedizioneModule { ColliSpedizioneRESTConsumer colliSpedizioneRESTConsumer, ColliLavorazioneRESTConsumer colliLavorazioneRESTConsumer, MagazzinoAutomaticoRESTConsumer magazzinoAutomaticoRESTConsumer, - ImballiRESTConsumer imballiRESTConsumer) { + ImballiRESTConsumer imballiRESTConsumer, + MagazzinoRESTConsumer magazzinoRESTConsumer) { return new SpedizioneViewModel(articoloRESTConsumer, barcodeRESTConsumer, colliDataRecoverService, @@ -48,7 +50,8 @@ public class SpedizioneModule { colliSpedizioneRESTConsumer, colliLavorazioneRESTConsumer, magazzinoAutomaticoRESTConsumer, - imballiRESTConsumer); + imballiRESTConsumer, + magazzinoRESTConsumer); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java index f6dc1249..52d48cfb 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java @@ -1,5 +1,6 @@ package it.integry.integrywmsnative.gest.spedizione; +import androidx.annotation.IntegerRes; import androidx.databinding.ObservableArrayList; import androidx.lifecycle.MutableLiveData; @@ -9,14 +10,19 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.util.ArrayList; import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.inject.Inject; import it.integry.barcode_base_android_library.model.BarcodeScanDTO; +import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.CommonConst; import it.integry.integrywmsnative.core.data_recover.ColliDataRecoverService; import it.integry.integrywmsnative.core.exception.EmptyLUException; @@ -54,6 +60,7 @@ import it.integry.integrywmsnative.core.rest.consumers.ColliSpedizioneRESTConsum import it.integry.integrywmsnative.core.rest.consumers.DocumentRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.ImballiRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.MagazzinoAutomaticoRESTConsumer; +import it.integry.integrywmsnative.core.rest.consumers.MagazzinoRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.OrdiniRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.PosizioniRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.PrinterRESTConsumer; @@ -72,14 +79,17 @@ import it.integry.integrywmsnative.core.rest.model.uds.CreateUDSRequestDTO; import it.integry.integrywmsnative.core.rest.model.uds.CreateUDSRequestOrderDTO; import it.integry.integrywmsnative.core.rest.model.uds.DeleteUDSRowRequestDTO; import it.integry.integrywmsnative.core.rest.model.uds.DeleteULRequestDTO; +import it.integry.integrywmsnative.core.rest.model.uds.DuplicateUDSRequestDTO; 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.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.UtilityResources; import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.gest.spedizione.exceptions.CurrentMonoLUPositionIsNotCorrectException; import it.integry.integrywmsnative.gest.spedizione.exceptions.InvalidMagazzinoAutomaticoMovementException; @@ -89,6 +99,7 @@ import it.integry.integrywmsnative.gest.spedizione.exceptions.OrdersLoadExceptio import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO; import it.integry.integrywmsnative.gest.spedizione.model.PickingObjectDTO; import it.integry.integrywmsnative.gest.spedizione.model.PrintOrderCloseDTO; +import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.exception.OverflowQtaTotOrderedQuantityException; import it.integry.integrywmsnative.view.dialogs.tracciamento_imballi.TracciamentoImballoDTO; public class SpedizioneViewModel { @@ -96,6 +107,7 @@ public class SpedizioneViewModel { private List mTestateOrdini; private MutableLiveData> mPickingList = new MutableLiveData<>(); private List mColliRegistrati = new ArrayList<>(); + private List mPartitaMagList = new ArrayList<>(); private Listener mListener; @@ -114,6 +126,7 @@ public class SpedizioneViewModel { private boolean mIsNewLU; private boolean mEnableQuantityReset; private boolean mUseQtaOrd; + private boolean mUseColliPedana; private boolean mIsOrdTrasf = false; private MtbColt mCurrentMtbColt = null; @@ -133,6 +146,7 @@ public class SpedizioneViewModel { private final ImballiRESTConsumer mImballiRESTConsumer; private ColliScaricoRESTConsumerInterface mColliScaricoRESTConsumer; + private MagazzinoRESTConsumer magazzinoRESTConsumer; @Inject public SpedizioneViewModel(ArticoloRESTConsumer articoloRESTConsumer, @@ -146,7 +160,8 @@ public class SpedizioneViewModel { ColliSpedizioneRESTConsumer colliSpedizioneRESTConsumer, ColliLavorazioneRESTConsumer colliLavorazioneRESTConsumer, MagazzinoAutomaticoRESTConsumer mMagazzinoAutomaticoRESTConsumer, - ImballiRESTConsumer imballiRESTConsumer) { + ImballiRESTConsumer imballiRESTConsumer, + MagazzinoRESTConsumer magazzinoRESTConsumer) { this.mArticoloRESTConsumer = articoloRESTConsumer; this.mBarcodeRESTConsumer = barcodeRESTConsumer; this.mColliDataRecoverService = colliDataRecoverService; @@ -159,10 +174,11 @@ public class SpedizioneViewModel { this.mColliLavorazioneRESTConsumer = colliLavorazioneRESTConsumer; this.mMagazzinoAutomaticoRESTConsumer = mMagazzinoAutomaticoRESTConsumer; this.mImballiRESTConsumer = imballiRESTConsumer; + this.magazzinoRESTConsumer = magazzinoRESTConsumer; } - public void init(String codMdep, boolean enableGiacenza, boolean enableCheckPartitaMag, boolean shouldAskPesoLU, boolean canOverflowOrderQuantity, List pickingList, List testateOrdini, List colliRegistrati, GestioneEnum gestioneCol, int segnoCol, Integer defaultCausaleUL, boolean enableQuantityReset, boolean useQtaOrd) { + public void init(String codMdep, boolean enableGiacenza, boolean enableCheckPartitaMag, boolean shouldAskPesoLU, boolean canOverflowOrderQuantity, List pickingList, List testateOrdini, List colliRegistrati, GestioneEnum gestioneCol, int segnoCol, Integer defaultCausaleUL, boolean enableQuantityReset, boolean useQtaOrd, boolean useColliPedana) { this.sendOnLoadingStarted(); this.mDefaultCodMdep = codMdep; @@ -175,25 +191,40 @@ public class SpedizioneViewModel { this.mDefaultCausaleOfUL = defaultCausaleUL; this.mEnableQuantityReset = enableQuantityReset; this.mUseQtaOrd = useQtaOrd; + this.mUseColliPedana = useColliPedana; if (enableGiacenza) { mOrdiniRestConsumerService.getSuggestedPickingList(this.mDefaultCodMdep, pickingList, pickingObjectList -> { this.mPickingList.postValue(pickingObjectList); - this.sendOnLoadingEnded(); }, ex -> this.sendError(new OrdersLoadException(ex))); } else { getEmptyPickingList(pickingList, pickingObjectList -> { this.mPickingList.postValue(pickingObjectList); - this.sendOnLoadingEnded(); }); } + getPartitaMagList(pickingList, mtbPartitaMagList -> { + this.mPartitaMagList = mtbPartitaMagList; + this.sendOnLoadingEnded(); + }); + this.mDefaultGestioneOfUL = gestioneCol; this.mDefaultSegnoCol = segnoCol; this.initDefaultVars(); } + private void getPartitaMagList(List sitArtOrdList, RunnableArgs> onComplete) { + if (SettingsManager.iDB().isSuggestDataScad()) { + List codMarts = sitArtOrdList.stream() + .map(x -> x.getCodMart().trim()) + .collect(Collectors.toList()); + + this.magazzinoRESTConsumer.retrieveAllPartitaMag(codMarts, new Date(), onComplete, this::sendError); + } else { + onComplete.run(new ArrayList<>()); + } + } private void getEmptyPickingList(List sitArtOrdList, RunnableArgs> onComplete) { List codMarts = sitArtOrdList.stream() @@ -982,20 +1013,6 @@ public class SpedizioneViewModel { refMtbColt = pickingObjectDTO.getMtbColts().get(0); } -// MtbColr refMtbColr = null; -// -// if (scannedMtbColr != null && refMtbColt != null && refMtbColt.getMtbColr().size() > 0) { -// Optional optionalMtbColr = Stream.of(refMtbColt.getMtbColr()) -// .filter(y -> UtilityString.equalsIgnoreCase(y.getCodMart(), scannedMtbColr.getCodMart()) && -// UtilityString.equalsIgnoreCase(y.getCodTagl(), scannedMtbColr.getCodTagl()) && -// UtilityString.equalsIgnoreCase(y.getCodCol(), scannedMtbColr.getCodCol()) && -// (!mEnableCheckPartitaMag || UtilityString.equalsIgnoreCase(y.getPartitaMag(), scannedMtbColr.getPartitaMag()) || UtilityString.isNullOrEmpty(scannedMtbColr.getPartitaMag()))) -// .findFirst(); -// -// if (optionalMtbColr.isPresent()) refMtbColr = optionalMtbColr.get(); -// } - - if (refMtbColr != null) { if (pickingObjectDTO.getMtbAart().isFlagQtaCnfFissaBoolean()) { if (UtilityBigDecimal.equalsOrLowerThan(refMtbColr.getQtaCol(), qtaDaEvadere)) { @@ -1083,8 +1100,12 @@ public class SpedizioneViewModel { } } + BigDecimal initialNumCnf = mUseColliPedana ? pickingObjectDTO.getMtbAart().getColliPedana() : mUseQtaOrd ? numCnfDaPrelevare : null; + BigDecimal initialQtaCnf = mUseColliPedana ? pickingObjectDTO.getMtbAart().getQtaCnf() : mUseQtaOrd ? qtaCnfDaPrelevare : null; + BigDecimal initialQtaTot = mUseColliPedana ? initialNumCnf.multiply(initialQtaCnf) : mUseQtaOrd ? qtaColDaPrelevare : null; + MtbColt finalRefMtbColt = refMtbColt; - this.onItemDispatched(pickingObjectDTO, pickingObjectDTO.getMtbAart(), mUseQtaOrd ? numCnfDaPrelevare : null, mUseQtaOrd ? qtaCnfDaPrelevare : null, mUseQtaOrd ? qtaColDaPrelevare : null, qtaDaEvadere, numCnfDaEvadere, qtaCnfDaEvadere, qtaColDaPrelevare, numCnfDaPrelevare, qtaCnfDaPrelevare, totalQtaAvailable, totalNumCnfAvailable, qtaCnfAvailable, partitaMag, dataScad, mCanOverflowOrderQuantity, canPartitaMagBeChanged, (pickedQuantityDTO, shouldCloseLU) -> { + this.onItemDispatched(pickingObjectDTO, pickingObjectDTO.getMtbAart(), initialNumCnf, initialQtaCnf, initialQtaTot, qtaDaEvadere, numCnfDaEvadere, qtaCnfDaEvadere, qtaColDaPrelevare, numCnfDaPrelevare, qtaCnfDaPrelevare, totalQtaAvailable, totalNumCnfAvailable, qtaCnfAvailable, partitaMag, dataScad, mCanOverflowOrderQuantity, canPartitaMagBeChanged, (pickedQuantityDTO, shouldCloseLU) -> { this.saveNewRow(pickingObjectDTO, finalRefMtbColt, pickedQuantityDTO.getNumCnf(), pickedQuantityDTO.getQtaCnf(), pickedQuantityDTO.getQtaTot(), pickedQuantityDTO.getPartitaMag(), pickedQuantityDTO.getDataScad(), shouldCloseLU); }); } @@ -1549,31 +1570,37 @@ public class SpedizioneViewModel { this.closeLU(generatedMtbColts -> { - this.mColliMagazzinoRESTConsumer.fillMtbAartsOfMtbColts(generatedMtbColts, filledMtbColts -> { + this.validateTheUdsToBeDuplicated(generatedMtbColts, duplicatedMtbColts -> { - this.askPositionChange( - filledMtbColts, - positionedMtbColts -> { + if (duplicatedMtbColts != null) { + generatedMtbColts.addAll(duplicatedMtbColts); + } - this.askPrint((shouldPrint && SettingsManager.iDB().isFlagPrintEtichetteOnLUClose()), positionedMtbColts, () -> { - positionedMtbColts.stream() - .filter(x -> !this.mColliRegistrati.contains(x)) - .forEach(x -> this.mColliRegistrati.add(x)); + this.mColliMagazzinoRESTConsumer.fillMtbAartsOfMtbColts(generatedMtbColts, filledMtbColts -> { - postCloseOperations(positionedMtbColts); + this.askPositionChange( + filledMtbColts, + positionedMtbColts -> { - this.mIsNewLU = false; + this.askPrint((shouldPrint && SettingsManager.iDB().isFlagPrintEtichetteOnLUClose()), positionedMtbColts, () -> { + positionedMtbColts.stream() + .filter(x -> !this.mColliRegistrati.contains(x)) + .forEach(x -> this.mColliRegistrati.add(x)); + + postCloseOperations(positionedMtbColts); + + this.mIsNewLU = false; + + this.resetMatchedRows(); + this.sendLUClosed(); + this.sendOnLoadingEnded(); + }); - this.resetMatchedRows(); - this.sendLUClosed(); - this.sendOnLoadingEnded(); }); - }); - - }, this::sendError); + }, this::sendError); + }); }); - }); }); }); @@ -1596,8 +1623,79 @@ public class SpedizioneViewModel { this.mColliScaricoRESTConsumer.closeUDS(closeUDSRequestDto, closeResponse -> { onComplete.run(closeResponse.getGeneratedMtbColts()); }, this::sendError); + } + private void validateTheUdsToBeDuplicated(List mtbColtList, RunnableArgs> onComplete) { + var clonedLu = (MtbColt) this.mCurrentMtbColt.clone(); + boolean noReference = clonedLu.getMtbColr().stream() + .allMatch( + x -> x.getGestioneRif() == null && + x.getDataColloRifD() == null && + x.getSerColloRif() == null && + x.getNumColloRif() == null + ); + + if (mtbColtList.size() > 1 || !noReference || !SettingsManager.iDB().isFlagAskDuplicateUDSSpedizione()) { + onComplete.run(new ArrayList<>()); + return; + } + + var savedMtbColt = mtbColtList.get(0); + + //Controllo se si va in extra quantity + if (!SettingsManager.iDB().isFlagCanAddExtraQuantitySpedizione()) { + Map> groupedByCodMart = savedMtbColt.getMtbColr() + .stream() + .filter(x -> x.getCodMart() != null) + .collect(Collectors.groupingBy(MtbColr::getCodMart)); + + for (PickingObjectDTO pickingObjectDTO : Objects.requireNonNull(this.mPickingList.getValue())) { + + if (pickingObjectDTO.getMtbAart() != null) { + String codMart = pickingObjectDTO.getMtbAart().getCodMart(); + + if (groupedByCodMart.containsKey(codMart)) { + BigDecimal qtaTot = UntMisUtils.shouldBeShowInColli(pickingObjectDTO.getMtbAart()) ? pickingObjectDTO.getSitArtOrdDTO().getNumCnfOrd() : pickingObjectDTO.getSitArtOrdDTO().getQtaOrd(); + + BigDecimal qtaEvasa = Objects.requireNonNull(groupedByCodMart.get(codMart)).stream().map(MtbColr::getNumCnf).reduce(BigDecimal.ZERO, BigDecimal::add); + + sendInputDuplicate(qtaTot, qtaEvasa, inputNumber -> { + duplicateUDS(savedMtbColt, inputNumber, onComplete); + }, () -> onComplete.run(null)); + } + } + } + } else { + sendInputDuplicate(inputNumber -> { + duplicateUDS(savedMtbColt, inputNumber, onComplete); + }, () -> onComplete.run(null)); + } + } + + private void duplicateUDS(MtbColt savedMtbColt, Integer inputNumber, RunnableArgs> onComplete) { + var duplicateUDSRequestDTO = new DuplicateUDSRequestDTO() + .setMtbColt(savedMtbColt) + .setNumOfDuplicates(inputNumber); + + this.mColliSpedizioneRESTConsumer.duplicateUDS(duplicateUDSRequestDTO, data -> { + Map> groupedByCodMart = data.getMtbColtList() + .stream() + .flatMap(x -> x.getMtbColr().stream()) + .filter(x -> x.getCodMart() != null) + .collect(Collectors.groupingBy(MtbColr::getCodMart)); + + for (PickingObjectDTO pickingObjectDTO : Objects.requireNonNull(this.mPickingList.getValue())) { + if (pickingObjectDTO.getMtbAart() != null) { + String codMart = pickingObjectDTO.getMtbAart().getCodMart(); + if (groupedByCodMart.containsKey(codMart)) { + pickingObjectDTO.getWithdrawMtbColrs() + .addAll(Objects.requireNonNull(groupedByCodMart.get(codMart))); + } + } + } + onComplete.run(data.getMtbColtList()); + }, this::sendError); } private void checkIfShouldBeDeleted(Runnable onDeleted, Runnable onContinue) { @@ -1904,6 +2002,10 @@ public class SpedizioneViewModel { return mPickingList; } + public List getmPartitaMagList() { + return mPartitaMagList; + } + public ArrayList getCreatedMtbColts() { return (ArrayList) this.mColliRegistrati; } @@ -1938,6 +2040,16 @@ public class SpedizioneViewModel { this.mDocumentRESTConsumer.createDocFromColli(loadCollidto, doc -> this.sendOnOrderClosed(), this::sendError); } + private void sendInputDuplicate(BigDecimal qtaTot, BigDecimal qtaEvasa, RunnableArgs onComplete, Runnable onNegativeClick) { + if (this.mListener != null) + mListener.onInputDuplicate(qtaTot, qtaEvasa, onComplete, onNegativeClick); + } + + private void sendInputDuplicate(RunnableArgs onComplete, Runnable onNegativeClick) { + if (this.mListener != null) + mListener.onInputDuplicate(null, null, onComplete, onNegativeClick); + } + public SpedizioneViewModel setListeners(Listener listener) { this.mListener = listener; return this; @@ -1970,6 +2082,8 @@ public class SpedizioneViewModel { void onChooseArtsRequest(List artsList, RunnableArgs> onComplete); void onOrderClosed(); + + void onInputDuplicate(BigDecimal qtaTot, BigDecimal qtaEvasa, RunnableArgs onComplete, Runnable onNegativeClick); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2DTO.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2DTO.java index bc2df22e..84547c37 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2DTO.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2DTO.java @@ -2,9 +2,11 @@ package it.integry.integrywmsnative.view.dialogs.input_quantity_v2; import java.math.BigDecimal; import java.time.LocalDate; +import java.util.List; import it.integry.integrywmsnative.core.expansion.RunnableArgsWithReturn; import it.integry.integrywmsnative.core.model.MtbAart; +import it.integry.integrywmsnative.core.model.MtbPartitaMag; import it.integry.integrywmsnative.core.model.dto.StatoArticoloDTO; import it.integry.integrywmsnative.core.utility.UtilityBigDecimal; @@ -57,6 +59,8 @@ public class DialogInputQuantityV2DTO { private String customArtDescription; + private List mtbPartitaMagList; + public MtbAart getMtbAart() { return mtbAart; } @@ -380,4 +384,13 @@ public class DialogInputQuantityV2DTO { this.warnOnQuantityOverflow = warnOnQuantityOverflow; return this; } + + public List getMtbPartitaMagList() { + return mtbPartitaMagList; + } + + public DialogInputQuantityV2DTO setMtbPartitaMagList(List mtbPartitaMagList) { + this.mtbPartitaMagList = mtbPartitaMagList; + return this; + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java index 0aa33da3..ba92bce0 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java @@ -27,6 +27,7 @@ import com.pedromassango.doubleclick.DoubleClickListener; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; +import java.util.Objects; import javax.inject.Inject; import javax.inject.Singleton; @@ -177,6 +178,7 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia .setSuggestPartitaMagRunnable(mDialogInputQuantityV2DTO.getSuggestPartitaMag()) .setDataScad(mDialogInputQuantityV2DTO.getDataScad()) .setDisableTracciabilitaCheck(mDialogInputQuantityV2DTO.isDisableTracciabilitaCheck()) + .setmPartitaMagList(mDialogInputQuantityV2DTO.getMtbPartitaMagList()) .setStatoArt(mDialogInputQuantityV2DTO.getStatoPartitaMag() != null ? mDialogInputQuantityV2DTO.getStatoPartitaMag().getStatoArt() : null); mBindings.setView(this); @@ -301,7 +303,7 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia UtilityObservable.addPropertyChanged(this.currentPartitaMag, (value) -> { if (this.mEnableDataCallback) { - this.mViewModel.setPartitaMag(value); + this.mViewModel.setNewPartitaMag(value); } }); @@ -403,7 +405,7 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia UtilityObservable.addPropertyChanged(this.mViewModel.blockedQtaTot, (value) -> { toggleTextInputLayoutError(textColorsQtaTot, this.mBindings.inputQtaTotLayout, value); - if (this.mViewModel.mtbAart.get().isFlagQtaCnfFissaBoolean()) { + if (Objects.requireNonNull(this.mViewModel.mtbAart.get()).isFlagQtaCnfFissaBoolean()) { this.enabledNumCnf.set(this.mDialogInputQuantityV2DTO.isNumCnfEditable() && !value); } else { if (value) { diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2ViewModel.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2ViewModel.java index 6b7af810..dc2f3a77 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2ViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2ViewModel.java @@ -4,8 +4,13 @@ import androidx.databinding.ObservableField; import java.math.BigDecimal; import java.time.LocalDate; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.Optional; import java.util.concurrent.FutureTask; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Stream; import javax.inject.Inject; @@ -100,6 +105,8 @@ public class DialogInputQuantityV2ViewModel { private StatoPartitaMag statoArt; + private List mPartitaMagList; + @Inject public DialogInputQuantityV2ViewModel(BarcodeRESTConsumer barcodeRESTConsumer, MagazzinoRESTConsumer magazzinoRESTConsumer) { this.mBarcodeRESTConsumer = barcodeRESTConsumer; @@ -354,6 +361,11 @@ public class DialogInputQuantityV2ViewModel { return this; } + public DialogInputQuantityV2ViewModel setmPartitaMagList(List mPartitaMagList) { + this.mPartitaMagList = mPartitaMagList; + return this; + } + public DialogInputQuantityV2ViewModel setWarnOnQuantityOverflow(boolean warnOnQuantityOverflow) { this.warnOnQuantityOverflow = warnOnQuantityOverflow; return this; @@ -378,6 +390,37 @@ public class DialogInputQuantityV2ViewModel { return this; } + public void setNewPartitaMag(String internalPartitaMag) { + this.internalPartitaMag = internalPartitaMag; + + if (mPartitaMagList != null && SettingsManager.iDB().isSuggestDataScad()){ + Optional partitaMag = mPartitaMagList.stream() + .filter(x -> x.getPartitaMag().equalsIgnoreCase(internalPartitaMag)) + .findFirst(); + + if (partitaMag.isPresent()){ + setNewDataScad(partitaMag.get().getDataScad()); + } else { + MtbAart localMtbAart = mtbAart.get(); + LocalDate dataScad = null; + + if (localMtbAart != null && localMtbAart.getGgScadPartita() != null && localMtbAart.getGgScadPartita() > 0) { + dataScad = UtilityDate.getNow(); + dataScad.plusDays(localMtbAart.getGgScadPartita()); + } + + setNewDataScad(dataScad); + } + } + + this.mListener.onDataChanged(); + } + + public void setNewDataScad(LocalDate internalDataScad) { + this.internalDataScad = internalDataScad; + this.mListener.onDataChanged(); + } + public DialogInputQuantityV2ViewModel setDataScad(LocalDate internalDataScad) { this.internalDataScad = internalDataScad; return this;