Compare commits

...

29 Commits

Author SHA1 Message Date
a74d865c57 Finish v1.24.0 2022-03-08 15:57:56 +01:00
0a37323cef Merge remote-tracking branch 'origin/develop' into develop 2022-03-08 15:57:17 +01:00
b36b80eae0 -> v1.24.0 (268) 2022-03-08 15:57:07 +01:00
acb7727f3c Implementato flag allow empty destinatario 2022-03-08 15:57:07 +01:00
c16f5d2ddd -> v1.24.0 (268) 2022-03-08 15:56:50 +01:00
4ca449d557 Implementato flag allow empty cliente 2022-03-08 15:55:53 +01:00
da70d7c064 Implementata logica della posizione di default sull'articolo in caso di addExtraItem 2022-03-07 12:43:11 +01:00
0be1eac5fe Finish v1.23.12(267) 2022-03-02 18:29:20 +01:00
e0eabbcbda Finish v1.23.12(267) 2022-03-02 18:29:20 +01:00
bd7b561b28 -> v1.23.12 (267) 2022-03-02 18:29:11 +01:00
37c3a1ec76 Refactoring PVOrdiniAcquisto 2022-03-02 18:28:27 +01:00
62e69ad5bf Finish v1.23.11(266) 2022-03-01 12:00:02 +01:00
3a6ba51a69 Finish v1.23.11(266) 2022-03-01 12:00:01 +01:00
767088f1d0 -> v1.23.11 (266) 2022-03-01 11:59:54 +01:00
d0f6999dd8 Aggiunto barcode nel messaggio di errore 2022-03-01 11:59:20 +01:00
f88d7892bd Finish v1.23.10(265) 2022-02-28 18:42:26 +01:00
3df5e406ef Finish v1.23.10(265) 2022-02-28 18:42:25 +01:00
8e0728c2b4 -> 1.23.10 (265) 2022-02-28 18:42:19 +01:00
0a2d47110d Refactoring ordini acquisto 2022-02-28 18:38:41 +01:00
4ed8c825dd Merge remote-tracking branch 'origin/develop' into develop 2022-02-28 17:01:16 +01:00
0a6d01628f Fix su open e close del dialog progress 2022-02-28 17:01:11 +01:00
453c8e0cad Finish v.1.23.9(264) 2022-02-28 15:57:45 +01:00
ee43d1e985 Finish v.1.23.9(264) 2022-02-28 15:57:45 +01:00
86d472fb88 -> v1.23.9 (264) 2022-02-28 15:57:40 +01:00
61c3458088 Finish flag_scan_art 2022-02-28 15:56:44 +01:00
85c4768e51 rimossa progress che si blocca in conferma filtri spedizione 2022-02-28 15:56:21 +01:00
f1b4ce469e Merge branch 'develop' into feature/flag_scan_art 2022-02-28 15:42:35 +01:00
6071b3eb44 Finish v1.23.8(263) 2022-02-28 09:52:59 +01:00
86c7be4e7d Implementato flag per abilitare la scansione tramite barcode articoli 2022-02-22 09:30:09 +01:00
78 changed files with 1858 additions and 842 deletions

558
.idea/dbnavigator.xml generated Normal file

File diff suppressed because one or more lines are too long

View File

@@ -15,6 +15,7 @@
<option name="SHOW_LOGCAT_AUTOMATICALLY" value="true" />
<option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
<option name="FORCE_STOP_RUNNING_APP" value="true" />
<option name="INSPECTION_WITHOUT_ACTIVITY_RESTART" value="false" />
<option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
<option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
<option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
@@ -45,7 +46,7 @@
<option name="ADVANCED_PROFILING_ENABLED" value="false" />
<option name="STARTUP_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Sample Java Methods" />
<option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Callstack Sample" />
<option name="STARTUP_NATIVE_MEMORY_PROFILING_ENABLED" value="false" />
<option name="NATIVE_MEMORY_SAMPLE_RATE_BYTES" value="2048" />
</Profilers>

View File

@@ -15,6 +15,7 @@
<option name="SHOW_LOGCAT_AUTOMATICALLY" value="true" />
<option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
<option name="FORCE_STOP_RUNNING_APP" value="true" />
<option name="INSPECTION_WITHOUT_ACTIVITY_RESTART" value="false" />
<option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
<option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
<option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
@@ -45,7 +46,7 @@
<option name="ADVANCED_PROFILING_ENABLED" value="false" />
<option name="STARTUP_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Sample Java Methods" />
<option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Callstack Sample" />
<option name="STARTUP_NATIVE_MEMORY_PROFILING_ENABLED" value="false" />
<option name="NATIVE_MEMORY_SAMPLE_RATE_BYTES" value="2048" />
</Profilers>

View File

@@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services'
android {
def appVersionCode = 263
def appVersionName = '1.23.8'
def appVersionCode = 268
def appVersionName = '1.24.0'
signingConfigs {
release {
@@ -85,6 +85,7 @@ android {
dynamicFeatures = [":dynamic__base", ":dynamic_vgalimenti"]
}
dependencies {
@@ -138,7 +139,6 @@ dependencies {
implementation 'com.github.cachapa:ExpandableLayout:2.9.2'
implementation 'com.github.frankiesardo:linearlistview:1.0.1@aar'
implementation 'com.github.fede87:StatusBarAlert:1.0.1'
testImplementation 'junit:junit:4.13.2'
implementation 'com.github.zhukic:sectioned-recyclerview:1.2.3'
implementation 'com.github.pedromassango:doubleClick:3.0'
@@ -157,11 +157,14 @@ dependencies {
implementation project(':barcode_base_android_library')
implementation project(':honeywellscannerlibrary')
implementation project(':keyobardemulatorscannerlibrary')
androidTestImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.1'
androidTestImplementation 'org.testng:testng:7.4.0'
implementation 'com.github.RaviKoradiya:LiveAdapter:1.3.4'
// Required -- JUnit 4 framework
// testImplementation "org.junit.jupiter:junit-jupiter-api:5.8.1"
// androidTestImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
// androidTestImplementation 'org.testng:testng:7.4.0'
}
repositories {

View File

@@ -1,8 +0,0 @@
package it.integry.integrywmsnative.gest.spedizione;
class SpedizioneViewModelTest {
@org.junit.jupiter.api.Test
void createNewLU() {
}
}

View File

@@ -51,6 +51,8 @@ import it.integry.integrywmsnative.gest.prod_versamento_materiale.ProdVersamento
import it.integry.integrywmsnative.gest.prod_versamento_materiale.ProdVersamentoMaterialeModule;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.PVOrdineAcquistoEditComponent;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.PVOrdineAcquistoEditModule;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.DialogEditArticoloComponent;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.DialogEditArticoloModule;
import it.integry.integrywmsnative.gest.pv_ordini_acquisto.PVOrdiniAcquistoGrigliaComponent;
import it.integry.integrywmsnative.gest.pv_ordini_acquisto.PVOrdiniAcquistoGrigliaModule;
import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeComponent;
@@ -122,7 +124,8 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr
DialogSelectDocInfoModule.class,
DocInterniEditFormModule.class,
DialogSelectDocRowsModule.class,
DialogAskClienteModule.class
DialogAskClienteModule.class,
DialogEditArticoloModule.class
})
public interface MainApplicationComponent {
@@ -206,6 +209,8 @@ public interface MainApplicationComponent {
InfoAggiuntiveLUDialogComponent.Factory infoAggiuntiveLUDialogComponent();
DialogEditArticoloComponent.Factory dialogEditArticoloComponent();
void inject(MainApplication mainApplication);
void inject(AppContext mainApplication);

View File

@@ -23,7 +23,7 @@ public class BarcodeCallbackDTO {
return onScanSuccessfull;
}
public BarcodeCallbackDTO setOnScanSuccessfull(RunnableArgs<BarcodeScanDTO> onScanSuccessfull) {
public BarcodeCallbackDTO setOnScanSuccessful(RunnableArgs<BarcodeScanDTO> onScanSuccessfull) {
this.onScanSuccessfull = onScanSuccessfull;
return this;
}

View File

@@ -18,14 +18,12 @@ import it.integry.integrywmsnative.core.data_store.db.entity.Ordine;
import it.integry.integrywmsnative.core.data_store.db.entity.SqlMtbColr;
import it.integry.integrywmsnative.core.data_store.db.entity.SqlMtbColt;
@Database(entities = {ArticoloGriglia.class, Griglia.class, Ordine.class, ArticoloOrdine.class, SqlMtbColt.class, SqlMtbColr.class}, version = 7, exportSchema = false)
@Database(entities = {ArticoloGriglia.class, Griglia.class, Ordine.class, ArticoloOrdine.class, SqlMtbColt.class, SqlMtbColr.class}, version = 8, exportSchema = false)
@TypeConverters({
DateConverter.class
})
public abstract class AppDatabase extends RoomDatabase {
// private AppDatabase mRoomInstance;
public abstract ArticoloGrigliaDao articoloGrigliaDao();
public abstract GrigliaDao grigliaDao();

View File

@@ -4,7 +4,9 @@ import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.RawQuery;
import androidx.room.Update;
import androidx.sqlite.db.SupportSQLiteQuery;
import java.util.List;
@@ -39,15 +41,18 @@ public interface ArticoloGrigliaDao {
@Query("SELECT * FROM articoli_griglia WHERE cod_mart = :codMart AND id_griglia = :idGriglia LIMIT 1")
ArticoloGriglia findArticoloByCodMartAndGriglia(String codMart, int idGriglia);
@Query("SELECT * FROM articoli_griglia WHERE (cod_mart = :scan OR bar_code =:scan )AND id_griglia = :idGriglia LIMIT 1")
@Query("SELECT * FROM articoli_griglia WHERE (cod_mart = :scan OR bar_code =:scan) AND id_griglia = :idGriglia LIMIT 1")
ArticoloGriglia findArticoloByScanAndGriglia(String scan, int idGriglia);
@Query("SELECT articolo_griglia_id FROM articoli_griglia WHERE (cod_mart = :codMart AND bar_code =:barCode )AND id_griglia = :idGriglia LIMIT 1")
@Query("SELECT articolo_griglia_id FROM articoli_griglia WHERE (cod_mart = :codMart AND bar_code =:barCode) AND id_griglia = :idGriglia LIMIT 1")
Integer getIdArticoloByGrigliaAndBarcodeAndCodMart(int idGriglia, String barCode, String codMart);
@RawQuery(observedEntities = ArticoloGriglia.class)
List<ArticoloGriglia> getArticoli(SupportSQLiteQuery query);
@Query("SELECT * FROM articoli_griglia WHERE id_griglia = :grigliaId")
List<ArticoloGriglia> getArticoliFromGriglia(int grigliaId);
@Query("SELECT * FROM articoli_griglia WHERE id_griglia = :grigliaId and new_no_promo = 1")
@Query("SELECT * FROM articoli_griglia WHERE id_griglia = :grigliaId AND new_no_promo = 1")
List<ArticoloGriglia> getNewArticoliInGriglia(int grigliaId);
}

View File

@@ -27,7 +27,7 @@ import it.integry.integrywmsnative.core.utility.UtilityDate;
public class ArticoloGriglia {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "articolo_griglia_id")
private int articoloGrigliaId;
private Integer articoloGrigliaId;
@ColumnInfo(name = "cod_mart")
private String codMart;
@@ -74,11 +74,11 @@ public class ArticoloGriglia {
@ColumnInfo(name = "new_no_promo")
private boolean newNoPromo = false;
public int getArticoloGrigliaId() {
public Integer getArticoloGrigliaId() {
return articoloGrigliaId;
}
public void setArticoloGrigliaId(int articoloGrigliaId) {
public void setArticoloGrigliaId(Integer articoloGrigliaId) {
this.articoloGrigliaId = articoloGrigliaId;
}

View File

@@ -87,7 +87,7 @@ public class ArticoloOrdine {
return articoloOrdineId;
}
public void setArticoloOrdineId(int articoloOrdineId) {
public void setArticoloOrdineId(Integer articoloOrdineId) {
this.articoloOrdineId = articoloOrdineId;
}

View File

@@ -5,7 +5,14 @@ import com.annimon.stream.Stream;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
@@ -24,27 +31,21 @@ public class ArticoliGrigliaDataSource extends Repository implements ArticoloGri
this.mArticoloGrigliaDao = articoloGrigliaDao;
}
public void saveArticoliToGriglia(List<ArticoloGriglia> articoli, Griglia griglia, Runnable onSuccess, RunnableArgs<Exception> onFail) {
public void saveArticoliToGriglia(List<ArticoloGriglia> updatedArts, Griglia griglia, Runnable onSuccess, RunnableArgs<Exception> onFail) {
execute(() -> {
try {
List<ArticoloGriglia> toUpdate = new ArrayList<>();
List<ArticoloGriglia> toInsert = new ArrayList<>();
List<String> codMarts = new ArrayList<>();
for (ArticoloGriglia art : articoli) {
Integer id = mArticoloGrigliaDao.getIdArticoloByGrigliaAndBarcodeAndCodMart(griglia.getGrigliaId(), art.getBarCode(), art.getCodMart());
codMarts.add(art.getCodMart());
if (id != null) {
art.setArticoloGrigliaId(id);
toUpdate.add(art);
} else {
toInsert.add(art);
}
}
var tmp = calcItemsToInsertAndUpdate(updatedArts);
var toInsert = (List<ArticoloGriglia>) tmp.get("toInsert");
var toUpdate = (List<ArticoloGriglia>) tmp.get("toUpdate");
var codMarts = (List<String>) tmp.get("codMarts");
mArticoloGrigliaDao.insertAll(toInsert);
mArticoloGrigliaDao.updateAll(toUpdate);
List<ArticoloGriglia> articoliGriglia = mArticoloGrigliaDao.getArticoliFromGriglia(griglia.getGrigliaId());
List<ArticoloGriglia> toDelete = Stream.of(articoliGriglia).filter(articolo -> !codMarts.contains(articolo.getCodMart())).toList();
mArticoloGrigliaDao.deleteList(toDelete);
onSuccess.run();
} catch (Exception e) {
onFail.run(e);
@@ -52,6 +53,52 @@ public class ArticoliGrigliaDataSource extends Repository implements ArticoloGri
});
}
private HashMap<String, Object> calcItemsToInsertAndUpdate(List<ArticoloGriglia> updatedArts) throws InterruptedException, ExecutionException {
var toInsert = new ArrayList<ArticoloGriglia>();
var toUpdate = new ArrayList<ArticoloGriglia>();
var codMarts = new ArrayList<String>();
int cores = Runtime.getRuntime().availableProcessors();
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(cores);
List<Callable<ArticoloGriglia>> calls = new ArrayList<>();
for (int i = 0; i < updatedArts.size(); i++) {
int finalI = i;
Callable<ArticoloGriglia> callableTask = () -> {
var updatedArt = updatedArts.get(finalI);
Integer id = mArticoloGrigliaDao.getIdArticoloByGrigliaAndBarcodeAndCodMart(updatedArt.getIdGriglia(), updatedArt.getBarCode(), updatedArt.getCodMart());
if (id != null) {
updatedArt.setArticoloGrigliaId(id);
}
return updatedArt;
};
calls.add(callableTask);
}
List<Future<ArticoloGriglia>> futures = executor.invokeAll(calls, Long.MAX_VALUE, TimeUnit.MILLISECONDS);
for (Future<ArticoloGriglia> future : futures) {
if (future.isDone()) {
codMarts.add(future.get().getCodMart());
if (future.get().getArticoloGrigliaId() == null) toInsert.add(future.get());
else toUpdate.add(future.get());
} else {
future.cancel(true);
}
}
var tmp = new HashMap<String, Object>();
tmp.put("toInsert", toInsert);
tmp.put("toUpdate", toUpdate);
tmp.put("codMarts", codMarts);
return tmp;
}
public void findArticoloByBarcodeAndGriglia(String barcode, int idGriglia, RunnableArgs<ArticoloGriglia> onSuccess, RunnableArgs<Exception> onFail) {
execute(() -> {
try {

View File

@@ -4,7 +4,7 @@ import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.utility.UtilityResources;
public final class NoResultFromBarcodeException extends Exception {
public NoResultFromBarcodeException() {
super(UtilityResources.getString(R.string.no_result_from_barcode));
public NoResultFromBarcodeException(String barcode) {
super(UtilityResources.getString(R.string.no_result_from_barcode) + " (" + barcode + ")");
}
}

View File

@@ -21,6 +21,8 @@ public class BaseActivity extends AppCompatActivity {
@Inject
public DialogProgressView mCurrentProgress;
private boolean progressOpened;
@Nullable
@Override
public View onCreateView(@Nullable View parent, @NonNull String name, @NonNull Context context, @NonNull AttributeSet attrs) {
@@ -56,36 +58,38 @@ public class BaseActivity extends AppCompatActivity {
protected void openProgress() {
runOnUiThread(() -> {
BarcodeManager.disable();
if (!this.mCurrentProgress.isVisible() && !this.mCurrentProgress.isAdded()) {
BarcodeManager.disable();
if (!progressOpened) {
this.progressOpened = true;
runOnUiThread(() -> {
this.mCurrentProgress.show(getSupportFragmentManager(), "tag");
}
});
});
}
}
protected void closeProgress() {
runOnUiThread(() -> {
BarcodeManager.enable();
if (mCurrentProgress.isVisible()) {
BarcodeManager.enable();
if (progressOpened) {
this.progressOpened = false;
runOnUiThread(() -> {
mCurrentProgress.dismiss();
}
});
});
}
}
public void onLoadingStarted() {
new Thread(() -> {
// new Thread(() -> {
BarcodeManager.disable();
this.openProgress();
}).start();
// }).start();
}
public void onLoadingEnded() {
new Thread(() -> {
// new Thread(() -> {
this.closeProgress();
BarcodeManager.enable();
}).start();
// }).start();
}
public void onError(Exception ex) {

View File

@@ -29,6 +29,7 @@ public abstract class BaseFragment extends Fragment {
protected ElevatedToolbar mToolbar;
protected final List<Runnable> mOnPreDestroyList = new ArrayList<>();
private boolean progressOpened;
public void setScrollToolbar(ElevatedToolbar toolbar) {
@@ -81,19 +82,21 @@ public abstract class BaseFragment extends Fragment {
}
protected void openProgress() {
requireActivity().runOnUiThread(() -> {
if (!this.mCurrentProgress.isVisible() && !this.mCurrentProgress.isAdded()) {
if (!progressOpened) {
this.progressOpened = true;
requireActivity().runOnUiThread(() -> {
this.mCurrentProgress.show(requireActivity().getSupportFragmentManager(), "tag");
}
});
});
}
}
protected void closeProgress() {
requireActivity().runOnUiThread(() -> {
if (mCurrentProgress.isVisible()) {
if (progressOpened) {
this.progressOpened = false;
requireActivity().runOnUiThread(() -> {
mCurrentProgress.dismiss();
}
});
});
}
}
protected void popMe() {

View File

@@ -1,28 +1,28 @@
package it.integry.integrywmsnative.core.expansion;
import androidx.databinding.ObservableArrayList;
import androidx.databinding.ObservableList;
import androidx.databinding.ObservableList.OnListChangedCallback;
public abstract class OnListGeneralChangedCallback extends ObservableList.OnListChangedCallback {
public abstract class OnListGeneralChangedCallback<T> extends OnListChangedCallback<ObservableList<T>> {
@Override
public void onItemRangeChanged(ObservableList sender, int positionStart, int itemCount) {
public void onItemRangeChanged(ObservableList<T> sender, int positionStart, int itemCount) {
onChanged(sender);
}
@Override
public void onItemRangeInserted(ObservableList sender, int positionStart, int itemCount) {
public void onItemRangeInserted(ObservableList<T> sender, int positionStart, int itemCount) {
onChanged(sender);
}
@Override
public void onItemRangeMoved(ObservableList sender, int fromPosition, int toPosition, int itemCount) {
public void onItemRangeMoved(ObservableList<T> sender, int fromPosition, int toPosition, int itemCount) {
onChanged(sender);
}
@Override
public void onItemRangeRemoved(ObservableList sender, int positionStart, int itemCount) {
public void onItemRangeRemoved(ObservableList<T> sender, int positionStart, int itemCount) {
onChanged(sender);
}

View File

@@ -125,7 +125,7 @@ public class OrdiniRESTConsumer extends _BaseRESTConsumer {
OrdiniRESTConsumerService service = RESTBuilder.getService(OrdiniRESTConsumerService.class);
service.getOrdiniInevasi(codMdep, gestione.getText())
.enqueue(new Callback<ServiceRESTResponse<List<OrdineUscitaInevasoDTO>>>() {
.enqueue(new Callback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<List<OrdineUscitaInevasoDTO>>> call, Response<ServiceRESTResponse<List<OrdineUscitaInevasoDTO>>> response) {
analyzeAnswer(response, "getOrdiniInevasi", responseDtoList -> {
@@ -145,7 +145,7 @@ public class OrdiniRESTConsumer extends _BaseRESTConsumer {
});
}
public void retrieveListaArticoliFromOrdiniUscita(List<OrdineUscitaInevasoDTO> orders, RunnableArgs<List<SitArtOrdDTO>> onComplete, RunnableArgs<Exception> onFailed) {
public void retrieveListaArticoliFromOrdiniUscita(String codMdep, List<OrdineUscitaInevasoDTO> orders, RunnableArgs<List<SitArtOrdDTO>> onComplete, RunnableArgs<Exception> onFailed) {
List<GetPickingListDTO> getPickingListDTOs = Stream.of(orders)
.map(x -> new GetPickingListDTO()
.setData(x.getDataOrdS())
@@ -157,7 +157,7 @@ public class OrdiniRESTConsumer extends _BaseRESTConsumer {
OrdiniRESTConsumerService service = RESTBuilder.getService(OrdiniRESTConsumerService.class, 90);
service.getArticoliFromOrdini(getPickingListDTOs).enqueue(new Callback<ServiceRESTResponse<List<SitArtOrdDTO>>>() {
service.getArticoliFromOrdini(codMdep, getPickingListDTOs).enqueue(new Callback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<List<SitArtOrdDTO>>> call, Response<ServiceRESTResponse<List<SitArtOrdDTO>>> response) {
analyzeAnswer(response, "retrieveListaArticoliFromOrdiniUscita", onComplete, onFailed);

View File

@@ -16,7 +16,7 @@ import retrofit2.http.Query;
public interface OrdiniRESTConsumerService {
@POST("wms/getArticoliFromOrdini")
Call<ServiceRESTResponse<List<SitArtOrdDTO>>> getArticoliFromOrdini(@Body List<GetPickingListDTO> pickingListDTO);
Call<ServiceRESTResponse<List<SitArtOrdDTO>>> getArticoliFromOrdini(@Query("codMdep") String codMdep, @Body List<GetPickingListDTO> pickingListDTO);
@POST("wms/getSuggestedPickingList")
Call<ServiceRESTResponse<List<PickingObjectDTO>>> getSuggestedPickingList(@Query("codMdep") String codMdep, @Body List<SitArtOrdDTO> sitArtOrdDTOList);

View File

@@ -6,8 +6,11 @@ import com.annimon.stream.Stream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.inject.Singleton;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloOrdine;
import it.integry.integrywmsnative.core.data_store.db.entity.Griglia;
import it.integry.integrywmsnative.core.data_store.db.entity.Ordine;
@@ -27,37 +30,47 @@ import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@Singleton
public class PVOrdiniAcquistoRESTConsumer extends _BaseRESTConsumer {
public static void getArticoliListino(String codAlis, RunnableArgs<GrigliaDTO> onSuccess, RunnableArgs<Exception> onFailed) {
public void getArticoliListino(String codAlis, RunnableArgs<GrigliaDTO> onSuccess, RunnableArgs<Exception> onFailed) {
getArticoliListinoStatic(codAlis, onSuccess, onFailed);
}
public static void getArticoliListinoStatic(String codAlis, RunnableArgs<GrigliaDTO> onSuccess, RunnableArgs<Exception> onFailed) {
PVOrdiniAcquistoRESTConsumerService ordiniARestService = RESTBuilder.getService(PVOrdiniAcquistoRESTConsumerService.class);
ordiniARestService
.getArticoliListino(codAlis)
.enqueue(new Callback<ServiceRESTResponse<GrigliaDTO>>() {
.enqueue(new Callback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<GrigliaDTO>> call, Response<ServiceRESTResponse<GrigliaDTO>> response) {
analyzeAnswer(response, "getArticoliListino", griglia -> {
UtilityThread.executeParallel(() -> {
var startTime = new Date().getTime();
List<ArticoloDTO> listaArticoli = new ArrayList<>();
Stream.of(griglia.getGrigliaAcquistiChild())
.map(ArticoloDTO::getCodMart)
.distinct()
.withoutNulls()
.forEach(art -> {
List<ArticoloDTO> inList = Stream.of(griglia.getGrigliaAcquistiChild()).filter(x -> x.getCodMart().equalsIgnoreCase(art)).toList();
if (inList.size() > 1) {
for (ArticoloDTO articolo : inList) {
.groupBy(ArticoloDTO::getCodMart)
.forEach(entry -> {
if(entry.getValue().size() == 1) {
listaArticoli.add(entry.getValue().get(0));
} else {
for (ArticoloDTO articolo : entry.getValue()) {
if (!articolo.getBarCode().endsWith(articolo.getCodMart())) {
listaArticoli.add(articolo);
}
}
} else {
listaArticoli.add(inList.get(0));
}
});
griglia.setGrigliaAcquistiChild(listaArticoli);
Log.d("LOADING TIME 1", "MS: " + (new Date().getTime() - startTime));
onSuccess.run(griglia);
}, false);
}, onFailed);
@@ -72,7 +85,7 @@ public class PVOrdiniAcquistoRESTConsumer extends _BaseRESTConsumer {
});
}
public static void saveOrdine(Ordine ordine, List<ArticoloOrdine> articoli, Griglia griglia, RunnableArgs<Ordine> onSuccess, RunnableArgs<Exception> onFailed) {
public void saveOrdine(Ordine ordine, List<ArticoloOrdine> articoli, Griglia griglia, RunnableArgs<Ordine> onSuccess, RunnableArgs<Exception> onFailed) {
SaveDTO saveDTO = new SaveDTO();
OrdineDTO ordineDTO = new OrdineDTO();
List<ArtDTO> artRows = new ArrayList<>();
@@ -126,7 +139,7 @@ public class PVOrdiniAcquistoRESTConsumer extends _BaseRESTConsumer {
}
private static ArtDTO convertArtToDTO(ArticoloOrdine art, int rigaOrd) {
private ArtDTO convertArtToDTO(ArticoloOrdine art, int rigaOrd) {
ArtDTO dto = new ArtDTO();
dto.setRigaOrd(rigaOrd);
dto.setCodMart(art.getCodMart());

View File

@@ -53,7 +53,7 @@ public class PosizioniRESTConsumer extends _BaseRESTConsumer{
String codMdep = null;
PosizioniRESTConsumerService posizioniRESTConsumerService = RESTBuilder.getService(PosizioniRESTConsumerService.class);
posizioniRESTConsumerService.getAvailablePosizioni(codMdep).enqueue(new Callback<ServiceRESTResponse<List<MtbDepoPosizione>>>() {
posizioniRESTConsumerService.getAvailablePosizioni(codMdep).enqueue(new Callback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<List<MtbDepoPosizione>>> call, Response<ServiceRESTResponse<List<MtbDepoPosizione>>> response) {
analyzeAnswer(response, "getAvailablePosizioni", (m) -> {

View File

@@ -19,6 +19,7 @@ public class SitArtOrdDTO {
private String idViaggio;
private String codMdep;
private boolean flagEnablePickManuale;
private boolean flagEnableScanArt;
private String codMgrp;
private String descrizioneMgrp;
private String codMsgr;
@@ -145,6 +146,14 @@ public class SitArtOrdDTO {
return this;
}
public boolean isFlagEnableScanArt() {
return flagEnableScanArt;
}
public SitArtOrdDTO setFlagEnableScanArt(boolean flagEnableScanArt) {
this.flagEnableScanArt = flagEnableScanArt;
return this;
}
public String getCodMgrp() {
return codMgrp;

View File

@@ -22,7 +22,7 @@ public class DBSettingsModel {
private String defaultCausaleRettificaGiacenze;
private DistribuzioneColloDTO.CriterioDistribuzione defaultCriterioDistribuzione;
private boolean flagAskClienteInPickingLibero;
private boolean flagAllowEmptyClienteInPickingLibero;
private boolean flagPickLiberoAllowEmptyCliente;
private boolean flagCanAddExtraItemSpedizione;
private boolean flagCanAutoOpenNewULAccettazione;
@@ -42,6 +42,7 @@ public class DBSettingsModel {
private String reportNameSpedizionChiudiOrdine;
private int onNumCnfInputChanged = 1;
private boolean flagAccettazioneUseQtaOrd = false;
private boolean flagPickLiberoAllowEmptyDest = false;
public boolean isFlagSpedizioneEnableFakeGiacenza() {
return flagSpedizioneEnableFakeGiacenza;
@@ -141,12 +142,12 @@ public class DBSettingsModel {
return this;
}
public boolean isFlagAllowEmptyClienteInPickingLibero() {
return flagAllowEmptyClienteInPickingLibero;
public boolean isFlagPickLiberoAllowEmptyCliente() {
return flagPickLiberoAllowEmptyCliente;
}
public DBSettingsModel setFlagAllowEmptyClienteInPickingLibero(boolean flagAllowEmptyClienteInPickingLibero) {
this.flagAllowEmptyClienteInPickingLibero = flagAllowEmptyClienteInPickingLibero;
public DBSettingsModel setFlagPickLiberoAllowEmptyCliente(boolean flagPickLiberoAllowEmptyCliente) {
this.flagPickLiberoAllowEmptyCliente = flagPickLiberoAllowEmptyCliente;
return this;
}
@@ -312,4 +313,13 @@ public class DBSettingsModel {
this.flagAccettazioneUseQtaOrd = flagAccettazioneUseQtaOrd;
return this;
}
public boolean isFlagPickLiberoAllowEmptyDest() {
return flagPickLiberoAllowEmptyDest;
}
public DBSettingsModel setFlagPickLiberoAllowEmptyDest(boolean flagPickLiberoAllowEmptyDest) {
this.flagPickLiberoAllowEmptyDest = flagPickLiberoAllowEmptyDest;
return this;
}
}

View File

@@ -282,6 +282,10 @@ public class SettingsManager {
.setGestName("PICKING")
.setSection("ACCETTAZIONE")
.setKeySection("FLAG_USE_QTA_ORD"));
stbGestSetupList.add(new StbGestSetup()
.setGestName("PICKING")
.setSection("PICKING_LIBERO")
.setKeySection("FLAG_ALLOW_EMPTY_DEST"));
GestSetupRESTConsumer.getValues(stbGestSetupList, list -> {
@@ -291,7 +295,7 @@ public class SettingsManager {
dbSettingsModelIstance.setDefaultCodAnag(getValueFromList(list, "SETUP", "COD_ANAG_DEFAULT", String.class));
dbSettingsModelIstance.setDefaultCriterioDistribuzione(getValueFromList(list, "SETUP", "DEFAULT_CRITERIO_DISTRIBUZIONE", String.class));
dbSettingsModelIstance.setFlagAskClienteInPickingLibero(getValueFromList(list, "PICKING_LIBERO", "FLAG_ASK_CLIENTE", Boolean.class));
dbSettingsModelIstance.setFlagAllowEmptyClienteInPickingLibero(getValueFromList(list, "PICKING_LIBERO", "FLAG_ALLOW_EMPTY_CLIENTE", Boolean.class));
dbSettingsModelIstance.setFlagPickLiberoAllowEmptyCliente(getValueFromList(list, "PICKING_LIBERO", "FLAG_ALLOW_EMPTY_CLIENTE", Boolean.class));
dbSettingsModelIstance.setFlagCanAddExtraItemSpedizione(getValueFromList(list, "SPEDIZIONE", "FLAG_CAN_ADD_EXTRA_ITEMS", Boolean.class));
dbSettingsModelIstance.setFlagCanAutoOpenNewULAccettazione(getValueFromList(list, "ACCETTAZIONE", "FLAG_AUTO_OPEN_NEW_UL", Boolean.class));
dbSettingsModelIstance.setFlagCanAddExtraQuantitySpedizione(getValueFromList(list, "SPEDIZIONE", "FLAG_CAN_ADD_EXTRA_QUANTITY", Boolean.class));
@@ -309,6 +313,7 @@ public class SettingsManager {
dbSettingsModelIstance.setFlagOrdinaNuoviArticoliInGriglia(getValueFromList(list, "ORDINI_A", "ORDINA_NUOVI_ARTICOLI", Boolean.class));
dbSettingsModelIstance.setDocInterniCheckFornitore(getValueFromList(list, "DOC_INTERNI", "CHECK_FORNITORE", String.class));
dbSettingsModelIstance.setFlagAccettazioneUseQtaOrd(getValueFromList(list, "ACCETTAZIONE", "FLAG_USE_QTA_ORD", Boolean.class));
dbSettingsModelIstance.setFlagPickLiberoAllowEmptyDest(getValueFromList(list, "PICKING_LIBERO", "FLAG_ALLOW_EMPTY_DEST", Boolean.class));
String notePerdita = getValueFromList(list, "DOC_INTERNI", "NOTE_PERDITA", String.class);
if (notePerdita != null) {

View File

@@ -355,7 +355,7 @@ public class AccettazionePickingActivity extends BaseActivity implements Accetta
private void initBarcodeReader() {
barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessful)
.setOnScanSuccessful(onScanSuccessful)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(this, ex, false)));
}

View File

@@ -317,12 +317,13 @@ public class AccettazionePickingViewModel {
barcodeProd = UtilityBarcode.convertITF14toEAN13(barcodeProd);
}
String finalBarcodeProd = barcodeProd;
this.mArticoloRESTConsumer.getByBarcodeProd(barcodeProd, mtbAartList -> {
if (mtbAartList != null && mtbAartList.size() > 0) {
this.searchArtFromAnag(mtbAartList.get(0), pickData, onComplete);
} else {
this.sendError(new NoResultFromBarcodeException());
this.sendError(new NoResultFromBarcodeException(finalBarcodeProd));
}
}, this::sendError);

View File

@@ -190,7 +190,7 @@ public class DocInterniEditFormActivity extends BaseActivity implements DocInter
}
mBarcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(this.viewModel::processBarcode)
.setOnScanSuccessful(this.viewModel::processBarcode)
.setOnScanFailed(this::onError));
this.viewModel.fetchDocumentRows();
}

View File

@@ -237,7 +237,7 @@ public class OrdiniUscitaElencoFragment extends BaseFragment implements ITitledF
private void initBarcodeReader() {
barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessful)
.setOnScanSuccessful(onScanSuccessful)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(getActivity(), ex, false)));
BarcodeManager.enable();
@@ -697,34 +697,34 @@ public class OrdiniUscitaElencoFragment extends BaseFragment implements ITitledF
};
private void refreshList(List<OrdiniUscitaElencoDTO> filteredList) {
this.onLoadingStarted();
//new Thread(() -> {
// new Thread(() -> {
requireActivity().runOnUiThread(() -> {
List<OrdiniUscitaElencoDTO> tmpList;
// requireActivity().runOnUiThread(() -> {
// this.onLoadingStarted();
List<OrdiniUscitaElencoDTO> tmpList;
if (filteredList != null) {
tmpList = filteredList;
} else if (mAppliedFilterViewModel != null) {
mAppliedFilterViewModel.applyAllTests();
tmpList = mAppliedFilterViewModel.getMutableFilteredOrderList().getValue();
} else {
tmpList = mViewModel.getOrderList().getValue();
}
if (filteredList != null) {
tmpList = filteredList;
} else if (mAppliedFilterViewModel != null) {
mAppliedFilterViewModel.applyAllTests();
tmpList = mAppliedFilterViewModel.getMutableFilteredOrderList().getValue();
} else {
tmpList = mViewModel.getOrderList().getValue();
}
var list = convertDataModelToListModel(tmpList);
var list = convertDataModelToListModel(tmpList);
this.mOrdiniInevasiMutableData.clear();
this.mOrdiniInevasiMutableData.addAll(list);
this.mOrdiniInevasiMutableData.clear();
this.mOrdiniInevasiMutableData.addAll(list);
fabVisible.set(Stream.of(mOrdiniInevasiMutableData)
.anyMatch(y -> y.getSelectedObservable().get()));
fabVisible.set(Stream.of(mOrdiniInevasiMutableData)
.anyMatch(y -> y.getSelectedObservable().get()));
this.onLoadingEnded();
});
// this.onLoadingEnded();
// });
//}).start();
// }).start();
}

View File

@@ -104,7 +104,7 @@ public class OrdiniUscitaElencoViewModel {
.distinct()
.toList();
if (foundGestioni != null && foundGestioni.size() > 1) {
if (foundGestioni.size() > 1) {
this.sendError(new InvalidLUMultiGestioneException());
return;
}
@@ -116,7 +116,7 @@ public class OrdiniUscitaElencoViewModel {
.distinct()
.toList();
if (foundCodMdep != null && foundCodMdep.size() > 1) {
if (foundCodMdep.size() > 1) {
this.sendError(new InvalidLUMultiCodMdepException());
return;
}
@@ -128,9 +128,9 @@ public class OrdiniUscitaElencoViewModel {
.map(x -> (OrdineUscitaInevasoDTO) x)
.toList();
this.mOrdiniRESTConsumer.retrieveListaArticoliFromOrdiniUscita(selectedOrdersBase, sitArts -> {
this.mOrdiniRESTConsumer.retrieveListaArticoliFromOrdiniUscita(mCurrentCodMdep, selectedOrdersBase, sitArts -> {
if(mtbGrupToFilter != null && !mtbGrupToFilter.isEmpty()) {
if (mtbGrupToFilter != null && !mtbGrupToFilter.isEmpty()) {
sitArts = Stream.of(sitArts)
.filter(x -> Stream.of(mtbGrupToFilter).map(MtbGrup::getCodMgrp).anyMatch(y -> y.equalsIgnoreCase(x.getCodMgrp())))
.toList();

View File

@@ -156,7 +156,7 @@ public class PickingLiberoFragment extends BaseFragment implements ITitledFragme
private void initBarcodeReader() {
barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessful)
.setOnScanSuccessful(onScanSuccessful)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(getActivity(), ex, false)));
BarcodeManager.enable();

View File

@@ -205,6 +205,7 @@ public class PickingLiberoViewModel {
barcodeProd = UtilityBarcode.convertITF14toEAN13(barcodeProd);
}
String finalBarcodeProd = barcodeProd;
mArticoloRESTConsumer.getByBarcodeProd(barcodeProd, mtbAartList -> {
if (mtbAartList != null && mtbAartList.size() > 0) {
MtbAart articolo = mtbAartList.get(0);
@@ -216,11 +217,11 @@ public class PickingLiberoViewModel {
this.dispatchArt(articolo, ean128Model);
onComplete.run();
} else {
this.sendError(new NoResultFromBarcodeException());
this.sendError(new NoResultFromBarcodeException(finalBarcodeProd));
}
} else {
this.sendError(new NoResultFromBarcodeException());
this.sendError(new NoResultFromBarcodeException(finalBarcodeProd));
}
}, this::sendError);

View File

@@ -167,7 +167,7 @@ public class PickingResiActivity extends BaseActivity implements BottomSheetFrag
private void initBarcodeReader() {
barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessful)
.setOnScanSuccessful(onScanSuccessful)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(this, ex, false)));
}

View File

@@ -109,7 +109,7 @@ public class ProdRecuperoMaterialeFragment extends BaseFragment implements ITitl
private void initBarcodeReader() {
barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessful)
.setOnScanSuccessful(onScanSuccessful)
.setOnScanFailed(this::onError));
BarcodeManager.enable();

View File

@@ -10,62 +10,52 @@ import android.widget.Toast;
import androidx.core.content.ContextCompat;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ObservableArrayList;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.annimon.stream.Stream;
import com.ravikoradiya.liveadapter.LiveAdapter;
import java.util.ArrayList;
import java.math.BigDecimal;
import java.util.List;
import javax.inject.Inject;
import it.integry.barcode_base_android_library.model.BarcodeScanDTO;
import it.integry.integrywmsnative.BR;
import it.integry.integrywmsnative.MainApplication;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.barcode_reader.BarcodeCallbackDTO;
import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager;
import it.integry.integrywmsnative.core.data_cache.DataCache;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloOrdine;
import it.integry.integrywmsnative.core.data_store.db.entity.Griglia;
import it.integry.integrywmsnative.core.data_store.db.entity.Ordine;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoliOrdineRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoloGrigliaRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.GrigliaRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.OrdineRepository;
import it.integry.integrywmsnative.core.expansion.BaseActivity;
import it.integry.integrywmsnative.core.rest.consumers.PVOrdiniAcquistoRESTConsumer;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.databinding.ActivityPvOrdineAcquistoEditBinding;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.EditArticoloDialog;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.helper.PVEditOrderHelper;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.ui.OrdineAcquistoArtListAdapter;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.DialogEditArticoloView;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.ui.OrdineAcquistoArtListModel;
import it.integry.integrywmsnative.ui.FabMenuCustomAnimations;
import it.integry.integrywmsnative.ui.SimpleDividerItemDecoration;
import it.integry.integrywmsnative.view.dialogs.DialogAskAction;
import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleInputHelper;
import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView;
public class PVOrdineAcquistoEditActivity extends BaseActivity {
public class PVOrdineAcquistoEditActivity extends BaseActivity implements PVOrdineAcquistoEditViewModel.Listener {
private static String DATA_KEY_ORDER = "keyOrdine";
private Ordine mOrdine;
private Griglia mGriglia;
private List<ArticoloOrdine> mArticoli = new ArrayList<>();
private PVEditOrderHelper mhelper;
private ActivityPvOrdineAcquistoEditBinding mBinding;
private int mBarcodeScannerIstanceID;
private OrdineAcquistoArtListAdapter mAdapter;
private int barcodeScannerIstanceID;
@Inject
OrdineRepository mOrdineRepository;
@Inject
GrigliaRepository mGrigliaRepository;
@Inject
ArticoliOrdineRepository mArticoliOrdineRepository;
@Inject
ArticoloGrigliaRepository mArticoloGrigliaRepository;
PVOrdineAcquistoEditViewModel mViewModel;
private final ObservableArrayList<OrdineAcquistoArtListModel> mArticoliMutableData = new ObservableArrayList<>();
public static Intent newInstance(Context context, Ordine ordine) {
@@ -84,7 +74,6 @@ public class PVOrdineAcquistoEditActivity extends BaseActivity {
.create()
.inject(this);
mhelper = new PVEditOrderHelper(mGrigliaRepository, mArticoliOrdineRepository, mArticoloGrigliaRepository);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_pv_ordine_acquisto_edit);
mBinding.setViewModel(this);
@@ -95,25 +84,40 @@ public class PVOrdineAcquistoEditActivity extends BaseActivity {
if (mOrdine == null) {
Toast.makeText(this, "Impossibile modificare ordine esportato", Toast.LENGTH_SHORT).show();
closeEdit();
close();
}
if (mOrdine.isTransmitted()) {
Toast.makeText(this, "Impossibile modificare ordine esportato", Toast.LENGTH_SHORT).show();
closeEdit();
close();
}
String testataOrdString = String.format(this.getString(R.string.ord_acq_testata), String.valueOf(mOrdine.getOrdineId()), UtilityDate.formatDate(mOrdine.getDataIns(), UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN));
mBinding.orderIdentifier.setText(Html.fromHtml(testataOrdString));
FabMenuCustomAnimations.changeIconOnFocus(mBinding.closeActivityFab, R.drawable.ic_check_white_24dp, R.drawable.ic_close_24dp);
initBarcodeReader();
initRecyclerView();
fetchDetails();
mBarcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(this::onScanSuccessful)
.setOnScanFailed(this::handleException));
this.mViewModel.setListener(this);
this.mViewModel.getCurrentGriglia().observe(this, griglia -> {
mBinding.codAlis.setText(griglia.getCodAlis());
});
this.mViewModel.getArticoli().observe(this, articoli -> {
mBinding.countArtOrd.setText(String.valueOf(articoli.size()));
mBinding.pvOrdineExport.setVisibility(articoli.size() > 0 ? View.INVISIBLE : View.GONE);
mBinding.closeActivityFab.close(false);
mBinding.scanArtSpinner.setVisibility(articoli.size() > 0 ? View.GONE : View.VISIBLE);
if (articoli.isEmpty() && isOrderNewProdsForced()) {
this.mViewModel.orderNewProducts();
}
});
this.mViewModel.init(mOrdine);
}
@Override
public boolean onSupportNavigateUp() {
@@ -121,186 +125,137 @@ public class PVOrdineAcquistoEditActivity extends BaseActivity {
return true;
}
private void initRecyclerView() {
mBinding.articoliOrdineList.setHasFixedSize(true);
private void initBarcodeReader() {
barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessful(onScanSuccessful)
.setOnScanFailed(this::onError));
BarcodeManager.enable();
}
private void initRecyclerView() {
// this.mViewModel.getArticoli().observe(this, updatedData -> {
// this.mArticoliMutableData.clear();
// this.mArticoliMutableData.addAll(convertDataModelToListModel(updatedData));
//// this.noItemsToPick.set(!isThereAnyItemToPick(updatedData));
// });
// var mAdapter = new OrdineAcquistoArtListAdapter(this, mArticoliMutableData)
// .setOnItemClicked(this::selectAction);
var liveAdapter = new LiveAdapter(this.mViewModel.getArticoli(), this, BR.articolo)
.map(ArticoloOrdine.class, R.layout.fragment_pv_articoli_ordine_acquisto__list_single_item)
.into(mBinding.articoliOrdineList);
// mBinding.articoliOrdineList.setAdapter(mAdapter);
mBinding.articoliOrdineList.setHasFixedSize(true);
mBinding.articoliOrdineList.setLayoutManager(new LinearLayoutManager(this));
SimpleDividerItemDecoration itemDecorator = new SimpleDividerItemDecoration(this, SimpleDividerItemDecoration.VERTICAL);
itemDecorator.setDrawable(ContextCompat.getDrawable(this, R.drawable.divider));
mBinding.articoliOrdineList.addItemDecoration(itemDecorator);
mAdapter = new OrdineAcquistoArtListAdapter(this, mArticoli, this::selectAction);
mBinding.articoliOrdineList.setAdapter(mAdapter);
}
private List<OrdineAcquistoArtListModel> convertDataModelToListModel
(List<ArticoloOrdine> dataList) {
return Stream.of(dataList)
.distinctBy(ArticoloOrdine::getArticoloOrdineId)
.sortBy(x -> x.getDataIns().getTime())
.map(x -> new OrdineAcquistoArtListModel()
.setBadge1(x.getCodMart())
.setDescription(x.getDescrizione())
.setQuantity(BigDecimal.valueOf(x.getQtaOrd()))
.setUntMis(x.getUntMis())
.setOriginalModel(x))
.toList();
}
private void selectAction(ArticoloOrdine articoloOrdine) {
mBinding.closeActivityFab.close(false);
BarcodeManager.disable();
runOnUiThread(() -> DialogAskAction.make(this,
articoloOrdine.getDescrizione(),
articoloOrdine.getQtaOrd() + " " + articoloOrdine.getUntMis(),
() -> this.addArticolo(articoloOrdine),
() -> this.deleteArticolo(articoloOrdine)).show());
runOnUiThread(() -> {
DialogAskAction.make(this,
articoloOrdine.getDescrizione(),
articoloOrdine.getQtaOrd() + " " + articoloOrdine.getUntMis(),
() -> {
this.onItemDispatched(articoloOrdine);
BarcodeManager.enable();
},
() -> {
this.deleteArticolo(articoloOrdine);
BarcodeManager.enable();
}).show();
});
}
private void deleteArticolo(ArticoloOrdine articoloOrdine) {
String text = "Stai per eliminare l'articolo <b> " + articoloOrdine.getDescrizione() + "</b> dall'ordine, <br> sei sicuro?";
DialogSimpleMessageView.makeWarningDialog(new SpannableString(Html.fromHtml(text)), null, () -> this.runOnUiThread(() -> {
this.openProgress();
mhelper.removeArticoloFromOrdine(articoloOrdine, () -> {
this.closeProgress();
BarcodeManager.enable();
runOnUiThread(this::fetchArticoli);
}, e -> {
this.closeProgress();
runOnUiThread(() -> UtilityExceptions.defaultException(this, e));
});
}), () -> {
DialogSimpleMessageView.makeWarningDialog(new SpannableString(Html.fromHtml(text)), null, () -> {
this.mViewModel.deleteArticolo(articoloOrdine);
}, () -> {
}).show(getSupportFragmentManager(), "tag");
}
private void handleException(Exception ex) {
runOnUiThread(() -> {
this.closeProgress();
BarcodeManager.enable();
UtilityExceptions.defaultException(this, ex, false);
private final RunnableArgs<BarcodeScanDTO> onScanSuccessful = data -> {
mBinding.closeActivityFab.close(false);
this.onLoadingStarted();
this.mViewModel.processBarcodeDTO(data, () -> {
this.onLoadingEnded();
});
};
@Override
public void onItemDispatched(ArticoloOrdine articoloOrdine) {
DialogEditArticoloView
.newInstance(articoloOrdine, articolo -> {
runOnUiThread(() -> {
if (articolo != null) {
Toast.makeText(this, "Articolo aggiunto all'ordine!", Toast.LENGTH_SHORT).show();
}
this.mViewModel.saveArticolo(articolo);
});
}, () -> {
}).show(this.getSupportFragmentManager(), "tag");
}
public void exportOrdine() {
this.mViewModel.exportOrdine(() -> {
runOnUiThread(() -> {
Toast.makeText(this, "Ordine salvato con successo", Toast.LENGTH_SHORT).show();
close();
});
});
}
private void onScanSuccessful(BarcodeScanDTO dto) {
mBinding.closeActivityFab.close(false);
BarcodeManager.disable();
this.openProgress();
mhelper.checkArticolo(
mOrdine,
dto.getStringValue(),
articoloOrdine -> {
this.closeProgress();
addArticolo(articoloOrdine);
},
e -> {
this.closeProgress();
handleException(e);
}
);
}
private void addArticolo(ArticoloOrdine articoloOrdine) {
runOnUiThread(() -> EditArticoloDialog.newInstance(this, mhelper, articoloOrdine, articolo -> {
BarcodeManager.enable();
if (articolo != null) {
Toast.makeText(this, "Articolo aggiunto all'ordine!", Toast.LENGTH_SHORT).show();
}
fetchArticoli();
}).show(this.getSupportFragmentManager(), "tag"));
}
private void fetchDetails() {
fetchGriglia();
fetchArticoli();
}
private void orderNewProducts() {
this.openProgress();
mhelper.getNewArticoli(mOrdine.getIdGriglia(), articoli -> {
if (articoli != null && !articoli.isEmpty()) {
List<ArticoloOrdine> articoliToSave = new ArrayList<>();
Stream.of(articoli).forEach(articolo -> {
if (
Stream.of(mArticoli).filter(x -> x.getCodMart().equalsIgnoreCase(articolo.getCodMart())).findFirst().isEmpty()
&& Stream.of(articoliToSave).filter(x -> x.getCodMart().equalsIgnoreCase(articolo.getCodMart())).findFirst().isEmpty()
) {
ArticoloOrdine dto = articolo.convertToArticoloOrdine(mOrdine);
dto.setQtaOrd(dto.getQtaCnf());
articoliToSave.add(dto);
}
});
if (!articoliToSave.isEmpty()) {
mhelper.saveArticoliToOrdine(articoliToSave, this::fetchArticoli, this::handleException);
} else {
this.closeProgress();
}
} else {
this.closeProgress();
}
}, this::handleException);
}
private void fetchGriglia() {
mhelper.loadGriglia(mOrdine.getIdGriglia(), griglia -> {
runOnUiThread(() -> {
mGriglia = griglia;
mBinding.codAlis.setText(mGriglia.getCodAlis());
});
}, this::handleException);
}
private void fetchArticoli() {
this.openProgress();
mhelper.loadArticoli(mOrdine, articoli -> {
this.closeProgress();
mArticoli = articoli;
runOnUiThread(() -> {
mAdapter.updateItems(mArticoli);
mBinding.countArtOrd.setText(String.valueOf(mArticoli.size()));
mBinding.pvOrdineExport.setVisibility(mArticoli.size() > 0 ? View.INVISIBLE : View.GONE);
mBinding.closeActivityFab.close(false);
mBinding.scanArtSpinner.setVisibility(mArticoli.size() > 0 ? View.GONE : View.VISIBLE);
if (mArticoli.isEmpty() && isOrderNewProdsForced()) {
orderNewProducts();
}
});
}, this::handleException);
}
public void closeEdit() {
public void close() {
onBackPressed();
}
public void exportOrdine() {
this.openProgress();
PVOrdiniAcquistoRESTConsumer.saveOrdine(mOrdine, mArticoli, mGriglia, (ordine) -> {
mOrdineRepository.updateOrder(ordine, ord -> {
this.closeProgress();
runOnUiThread(() -> {
Toast.makeText(this, "Ordine salvato con successo", Toast.LENGTH_SHORT).show();
onBackPressed();
});
}, e -> runOnUiThread(() -> {
this.closeProgress();
UtilityExceptions.defaultException(this, e);
}));
}, e -> runOnUiThread(() -> {
this.closeProgress();
UtilityExceptions.defaultException(this, e);
}));
}
@Override
public void onBackPressed() {
BarcodeManager.removeCallback(mBarcodeScannerIstanceID);
BarcodeManager.removeCallback(barcodeScannerIstanceID);
super.onBackPressed();
}
public void manualSearch() {
BarcodeManager.disable();
DialogSimpleInputHelper.makeInputDialog(this, "Inserisci il codice a barre/codice articolo da cercare", codice -> {
this.openProgress();
mhelper.checkArticolo(
mOrdine,
codice,
articoloOrdine -> {
this.closeProgress();
addArticolo(articoloOrdine);
},
e -> {
this.closeProgress();
handleException(e);
this.onLoadingStarted();
this.mViewModel.loadArticolo(codice,
() -> {
this.onLoadingEnded();
BarcodeManager.enable();
}
);
}, BarcodeManager::enable).show();
@@ -309,4 +264,5 @@ public class PVOrdineAcquistoEditActivity extends BaseActivity {
private boolean isOrderNewProdsForced() {
return SettingsManager.iDB().getFlagOrdinaNuoviArticoliInGriglia();
}
}

View File

@@ -1,7 +1,33 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoliOrdineRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoloGrigliaRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.GrigliaRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.OrdineRepository;
import it.integry.integrywmsnative.core.rest.consumers.PVOrdiniAcquistoRESTConsumer;
@Module(subcomponents = PVOrdineAcquistoEditComponent.class)
public class PVOrdineAcquistoEditModule {
@Provides
@Singleton
PVOrdiniAcquistoRESTConsumer providesPVOrdiniAcquistoRESTConsumer() {
return new PVOrdiniAcquistoRESTConsumer();
}
@Provides
PVOrdineAcquistoEditViewModel providesPvOrdineAcquistoEditViewModel(OrdineRepository ordineRepository,
GrigliaRepository grigliaRepository,
ArticoliOrdineRepository articoliOrdineRepository,
ArticoloGrigliaRepository articoloGrigliaRepository,
PVOrdiniAcquistoRESTConsumer pvOrdiniAcquistoRESTConsumer) {
return new PVOrdineAcquistoEditViewModel(ordineRepository, grigliaRepository, articoliOrdineRepository, articoloGrigliaRepository, pvOrdiniAcquistoRESTConsumer);
}
}

View File

@@ -0,0 +1,262 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit;
import androidx.lifecycle.MutableLiveData;
import com.annimon.stream.Stream;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import javax.inject.Inject;
import it.integry.barcode_base_android_library.model.BarcodeScanDTO;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloGriglia;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloOrdine;
import it.integry.integrywmsnative.core.data_store.db.entity.Griglia;
import it.integry.integrywmsnative.core.data_store.db.entity.Ordine;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoliOrdineRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoloGrigliaRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.GrigliaRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.OrdineRepository;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener;
import it.integry.integrywmsnative.core.rest.consumers.PVOrdiniAcquistoRESTConsumer;
public class PVOrdineAcquistoEditViewModel {
@Inject
OrdineRepository mOrdineRepository;
@Inject
GrigliaRepository mGrigliaRepository;
@Inject
ArticoliOrdineRepository mArticoliOrdineRepository;
@Inject
ArticoloGrigliaRepository mArticoloGrigliaRepository;
@Inject
PVOrdiniAcquistoRESTConsumer pvOrdiniAcquistoRESTConsumer;
private Ordine mCurrentOrdine;
private Listener mListener;
private final MutableLiveData<Griglia> mCurrentGriglia = new MutableLiveData<>();
private final MutableLiveData<List<ArticoloOrdine>> mArticoli = new MutableLiveData<>();
public PVOrdineAcquistoEditViewModel(OrdineRepository ordineRepository,
GrigliaRepository grigliaRepository,
ArticoliOrdineRepository articoliOrdineRepository,
ArticoloGrigliaRepository articoloGrigliaRepository,
PVOrdiniAcquistoRESTConsumer pvOrdiniAcquistoRESTConsumer) {
this.mOrdineRepository = ordineRepository;
this.mGrigliaRepository = grigliaRepository;
this.mArticoliOrdineRepository = articoliOrdineRepository;
this.mArticoloGrigliaRepository = articoloGrigliaRepository;
this.pvOrdiniAcquistoRESTConsumer = pvOrdiniAcquistoRESTConsumer;
}
public void init(Ordine ordine) {
this.mCurrentOrdine = ordine;
this.sendOnLoadingStarted();
this.loadGriglia(ordine.getIdGriglia(), griglia -> {
mCurrentGriglia.postValue(griglia);
this.loadArticoli(mCurrentOrdine, articoli -> {
this.mArticoli.postValue(articoli);
this.sendOnLoadingEnded();
});
});
}
public MutableLiveData<Griglia> getCurrentGriglia() {
return mCurrentGriglia;
}
public MutableLiveData<List<ArticoloOrdine>> getArticoli() {
return mArticoli;
}
public void saveArticolo(ArticoloOrdine articolo) {
var newList = this.mArticoli.getValue();
var alreadySavedItem = Stream.of(newList)
.filter(x -> Objects.equals(x.getCodMart(), articolo.getCodMart()))
.findFirst();
if(alreadySavedItem.isPresent()) newList.remove(alreadySavedItem.get());
newList.add(articolo);
this.mArticoli.postValue(newList);
}
public void loadArticolo(String barcode, Runnable onSuccess) {
try {
mArticoliOrdineRepository.findArticoloByScanAndOrdine(mCurrentOrdine, barcode, (articolo) -> {
if (articolo != null) {
onSuccess.run();
this.sendOnItemDispatched(articolo);
} else {
mArticoloGrigliaRepository.findArticoloByScanAndGriglia(barcode, mCurrentOrdine.getIdGriglia(), artGrid -> {
if (artGrid != null) {
onSuccess.run();
this.sendOnItemDispatched(artGrid.convertToArticoloOrdine(mCurrentOrdine));
} else {
this.sendError(new Exception("L' articolo ( " + barcode + " ) non è presente nella griglia"));
}
}, this::sendError);
}
}, this::sendError);
} catch (Exception e) {
this.sendError(e);
}
}
public void processBarcodeDTO(BarcodeScanDTO barcodeScanDTO, Runnable onComplete) {
this.checkArticolo(
mCurrentOrdine,
barcodeScanDTO.getStringValue(),
articoloOrdine -> {
this.sendOnItemDispatched(articoloOrdine);
onComplete.run();
},
this::sendError
);
}
private void loadGriglia(int idGriglia, RunnableArgs<Griglia> onLoad) {
try {
mGrigliaRepository.findGrigliaById(idGriglia, onLoad, this::sendError);
} catch (Exception e) {
this.sendError(e);
}
}
private void loadArticoli(Ordine ordine, RunnableArgs<List<ArticoloOrdine>> onLoad) {
try {
mArticoliOrdineRepository.findArticoliByOrdine(ordine, onLoad, this::sendError);
} catch (Exception e) {
this.sendError(e);
}
}
private void checkArticolo(Ordine ordine, String barcode, RunnableArgs<ArticoloOrdine> onSuccess, RunnableArgs<Exception> onFail) {
try {
mArticoliOrdineRepository.findArticoloByScanAndOrdine(ordine, barcode, (articolo) -> {
if (articolo != null) {
onSuccess.run(articolo);
} else {
mArticoloGrigliaRepository.findArticoloByScanAndGriglia(barcode, ordine.getIdGriglia(), artGrid -> {
if (artGrid != null) {
onSuccess.run(artGrid.convertToArticoloOrdine(ordine));
} else {
onFail.run(new Exception("L' articolo ( " + barcode + " ) non è presente nella griglia"));
}
}, onFail);
}
}, onFail);
} catch (Exception e) {
onFail.run(e);
}
}
private void getNewArticoli(int idGrigla, RunnableArgs<List<ArticoloGriglia>> onSuccess, RunnableArgs<Exception> onError) {
mArticoloGrigliaRepository.findNewArticoliInGrigla(idGrigla, onSuccess, onError);
}
public void orderNewProducts() {
this.sendOnLoadingStarted();
this.getNewArticoli(mCurrentOrdine.getIdGriglia(), articoli -> {
if (articoli != null && !articoli.isEmpty()) {
List<ArticoloOrdine> articoliToSave = new ArrayList<>();
Stream.of(articoli).forEach(articolo -> {
if (
Stream.of(mArticoli.getValue())
.filter(x -> x.getCodMart().equalsIgnoreCase(articolo.getCodMart()))
.findFirst()
.isEmpty()
&& Stream.of(articoliToSave)
.filter(x -> x.getCodMart().equalsIgnoreCase(articolo.getCodMart()))
.findFirst()
.isEmpty()
) {
ArticoloOrdine dto = articolo.convertToArticoloOrdine(mCurrentOrdine);
dto.setQtaOrd(dto.getQtaCnf());
articoliToSave.add(dto);
}
});
if (!articoliToSave.isEmpty()) {
mArticoliOrdineRepository.saveArticoliToOrdine(articoliToSave, () -> {
Stream.of(articoliToSave).forEach(this::saveArticolo);
this.sendOnLoadingEnded();
}, this::sendError);
} else this.sendOnLoadingEnded();
} else this.sendOnLoadingEnded();
}, this::sendError);
}
public void deleteArticolo(ArticoloOrdine articoloOrdine) {
mArticoliOrdineRepository.deleteArticolo(articoloOrdine, () -> {
this.mArticoli.getValue().remove(articoloOrdine);
this.mArticoli.postValue(this.mArticoli.getValue());
}, this::sendError);
}
public void exportOrdine(Runnable onComplete) {
this.sendOnLoadingStarted();
pvOrdiniAcquistoRESTConsumer.saveOrdine(mCurrentOrdine, mArticoli.getValue(), mCurrentGriglia.getValue(), (ordine) -> {
mOrdineRepository.updateOrder(ordine, ord -> {
this.sendOnLoadingEnded();
onComplete.run();
}, this::sendError);
}, this::sendError);
}
private void sendOnItemDispatched(ArticoloOrdine articoloOrdine) {
if (this.mListener != null) mListener.onItemDispatched(articoloOrdine);
}
private void sendOnLoadingStarted() {
if (this.mListener != null) mListener.onLoadingStarted();
}
private void sendOnLoadingEnded() {
if (this.mListener != null) mListener.onLoadingEnded();
}
private void sendError(Exception ex) {
if (this.mListener != null) mListener.onError(ex);
}
public interface Listener extends ILoadingListener {
void onItemDispatched(ArticoloOrdine articoloOrdine);
void onError(Exception ex);
}
public PVOrdineAcquistoEditViewModel setListener(Listener listener) {
this.mListener = listener;
return this;
}
}

View File

@@ -0,0 +1,14 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog;
import dagger.Subcomponent;
@Subcomponent
public interface DialogEditArticoloComponent {
@Subcomponent.Factory
interface Factory {
DialogEditArticoloComponent create();
}
void inject(DialogEditArticoloView dialogEditArticoloView);
}

View File

@@ -0,0 +1,16 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog;
import dagger.Module;
import dagger.Provides;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoliOrdineRepository;
@Module(subcomponents = DialogEditArticoloComponent.class)
public class DialogEditArticoloModule {
@Provides
DialogEditArticoloViewModel providesDialogEditArticoloViewModel(ArticoliOrdineRepository articoliOrdineRepository) {
return new DialogEditArticoloViewModel(articoliOrdineRepository);
}
}

View File

@@ -0,0 +1,180 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.text.InputType;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ObservableField;
import androidx.fragment.app.DialogFragment;
import java.math.BigDecimal;
import java.math.RoundingMode;
import javax.inject.Inject;
import it.integry.integrywmsnative.MainApplication;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloOrdine;
import it.integry.integrywmsnative.core.expansion.BaseDialogFragment;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.utility.UtilityBigDecimal;
import it.integry.integrywmsnative.core.utility.UtilityObservable;
import it.integry.integrywmsnative.databinding.DialogPvEditArticoloBinding;
public class DialogEditArticoloView extends BaseDialogFragment implements DialogEditArticoloViewModel.Listener {
@Inject
DialogEditArticoloViewModel mViewModel;
private final ArticoloOrdine mArticolo;
private final RunnableArgs<ArticoloOrdine> mOnComplete;
private final Runnable mOnAbort;
public ObservableField<BigDecimal> currentNumCnf = new ObservableField<>();
public ObservableField<BigDecimal> currentQtaCnf = new ObservableField<>();
public ObservableField<BigDecimal> currentQtaTot = new ObservableField<>();
private DialogPvEditArticoloBinding mBindings;
private boolean mEnableDataCallback = true;
public static DialogEditArticoloView newInstance(ArticoloOrdine articolo, RunnableArgs<ArticoloOrdine> onComplete, Runnable onAbort) {
return new DialogEditArticoloView(articolo, onComplete, onAbort);
}
private DialogEditArticoloView(ArticoloOrdine articolo, RunnableArgs<ArticoloOrdine> onComplete, Runnable onAbort) {
super();
this.mArticolo = articolo;
this.mOnComplete = onComplete;
this.mOnAbort = onAbort;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mBindings = DataBindingUtil.inflate(inflater, R.layout.dialog_pv_edit_articolo, container, false);
mBindings.setLifecycleOwner(this);
MainApplication.appComponent
.dialogEditArticoloComponent()
.create()
.inject(this);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
mBindings.toolbar.setTitle("Inserimento articolo");
mBindings.inputQtaOrd.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
this.mViewModel
.setListener(this)
.setCurrentArticolo(this.mArticolo)
.setInitialQtaCnf(BigDecimal.valueOf(mArticolo.getQtaCnf()))
.setInitialNumCnf(UtilityBigDecimal.divide(BigDecimal.valueOf(mArticolo.getQtaOrd()), BigDecimal.valueOf(mArticolo.getQtaCnf())).setScale(0, RoundingMode.CEILING))
.setInitialQtaTot(BigDecimal.valueOf(mArticolo.getQtaOrd()));
mBindings.setView(this);
this.onDataChanged();
this.initBindings();
return mBindings.getRoot();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, R.style.AppTheme_NewMaterial_Dialog_FullscreenDialog);
}
@Override
public void onStart() {
super.onStart();
this.mViewModel.setListener(this);
}
@Override
public void onDismiss(@NonNull DialogInterface dialog) {
this.mOnAbort.run();
super.onDismiss(dialog);
}
private void initBindings() {
UtilityObservable.addPropertyChanged(this.currentNumCnf, (value) -> {
if (this.mEnableDataCallback) {
this.mViewModel.setNumCnf(value);
}
});
UtilityObservable.addPropertyChanged(this.currentQtaCnf, (value) -> {
if (this.mEnableDataCallback) {
this.mViewModel.setQtaCnf(value);
}
});
UtilityObservable.addPropertyChanged(this.currentQtaTot, (value) -> {
if (this.mEnableDataCallback) {
this.mViewModel.setQtaTot(value);
}
});
mBindings.inputQtaOrd.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_DONE) {
mBindings.inputNumCnfText.requestFocus();
return true;
}
return false;
});
mBindings.inputNumCnfText.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_DONE) {
saveAndExit();
return true;
}
return false;
});
}
public ArticoloOrdine getArticolo() {
return mArticolo;
}
@Override
public void onDataChanged() {
this.mEnableDataCallback = false;
this.currentNumCnf.set(this.mViewModel.getNumCnf());
this.currentQtaCnf.set(this.mViewModel.getQtaCnf());
this.currentQtaTot.set(this.mViewModel.getQtaTot());
this.mBindings.executePendingBindings();
this.mEnableDataCallback = true;
}
public void saveAndExit() {
this.onLoadingStarted();
this.mViewModel.save(newArticolo -> {
this.mOnComplete.run(newArticolo);
this.onLoadingEnded();
dismiss();
});
}
}

View File

@@ -0,0 +1,122 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog;
import java.math.BigDecimal;
import java.math.RoundingMode;
import javax.inject.Inject;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloOrdine;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoliOrdineRepository;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.utility.UtilityBigDecimal;
public class DialogEditArticoloViewModel {
ArticoliOrdineRepository mArticoliOrdineRepository;
private Listener mListener;
private ArticoloOrdine mCurrentArticolo;
private BigDecimal internalNumCnf;
private BigDecimal internalQtaCnf;
private BigDecimal internalQtaTot;
@Inject
public DialogEditArticoloViewModel(ArticoliOrdineRepository articoliOrdineRepository) {
this.mArticoliOrdineRepository = articoliOrdineRepository;
}
public DialogEditArticoloViewModel setCurrentArticolo(ArticoloOrdine currentArticolo) {
this.mCurrentArticolo = currentArticolo;
return this;
}
public DialogEditArticoloViewModel setInitialNumCnf(BigDecimal numCnf) {
this.internalNumCnf = numCnf;
return this;
}
public DialogEditArticoloViewModel setInitialQtaCnf(BigDecimal qtaCnf) {
this.internalQtaCnf = qtaCnf;
return this;
}
public DialogEditArticoloViewModel setInitialQtaTot(BigDecimal qtaTot) {
this.internalQtaTot = qtaTot;
return this;
}
public void setNumCnf(BigDecimal newValue) {
this.internalNumCnf = newValue;
if (newValue == null) return;
this.internalQtaTot = UtilityBigDecimal.multiply(newValue, internalQtaCnf)
.setScale(2, RoundingMode.CEILING);
this.mListener.onDataChanged();
}
public void setQtaCnf(BigDecimal newValue) {
this.internalQtaCnf = newValue;
if (newValue == null) return;
this.mListener.onDataChanged();
}
public void setQtaTot(BigDecimal newValue) {
this.internalQtaTot = newValue;
this.internalNumCnf = UtilityBigDecimal.divide(newValue, internalQtaCnf)
.setScale(0, RoundingMode.CEILING);
this.mListener.onDataChanged();
}
public BigDecimal getNumCnf() {
return this.internalNumCnf;
}
public BigDecimal getQtaCnf() {
return this.internalQtaCnf;
}
public BigDecimal getQtaTot() {
return this.internalQtaTot;
}
public interface Listener {
void onDataChanged();
void onError(Exception ex);
}
public Listener getListener() {
return mListener;
}
public DialogEditArticoloViewModel setListener(Listener listener) {
this.mListener = listener;
return this;
}
public void save(RunnableArgs<ArticoloOrdine> onComplete) {
if(UtilityBigDecimal.equalsOrLowerThan(this.internalQtaTot, BigDecimal.ZERO)) {
this.mListener.onError(new Exception("La quantità ordinata deve essere maggiore di 0"));
return;
}
this.mCurrentArticolo.setQtaOrd(this.internalQtaTot.floatValue());
try {
mArticoliOrdineRepository.saveArticoloToOrdine(this.mCurrentArticolo, () -> {
onComplete.run(this.mCurrentArticolo);
}, this.mListener::onError);
} catch (Exception ex) {
this.mListener.onError(ex);
}
}
}

View File

@@ -1,188 +0,0 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog;
import android.app.Activity;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.text.InputType;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.fragment.app.DialogFragment;
import androidx.lifecycle.MutableLiveData;
import java.math.BigDecimal;
import java.math.RoundingMode;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloOrdine;
import it.integry.integrywmsnative.core.di.BindableBigDecimal;
import it.integry.integrywmsnative.core.di.BindableInteger;
import it.integry.integrywmsnative.core.expansion.BaseDialogFragment;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.databinding.DialogPvEditArticoloBinding;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.helper.PVEditOrderHelper;
public class EditArticoloDialog extends BaseDialogFragment {
private final Activity mContext;
private DialogPvEditArticoloBinding mBinding;
private final PVEditOrderHelper mHelper;
private final MutableLiveData<ArticoloOrdine> mArticolo = new MutableLiveData<>();
private final RunnableArgs<ArticoloOrdine> onDialogDismiss;
private boolean mLockedInput = false;
public final BindableBigDecimal qtaOrd = new BindableBigDecimal(BigDecimal.ZERO);
public final BindableInteger numCnf = new BindableInteger(0);
public final BindableBigDecimal qtaCnf = new BindableBigDecimal(BigDecimal.ZERO);
public static EditArticoloDialog newInstance(Activity context, PVEditOrderHelper helper, ArticoloOrdine articolo, RunnableArgs<ArticoloOrdine> onDialogDismiss) {
return new EditArticoloDialog(context, helper, articolo, onDialogDismiss);
}
private EditArticoloDialog(Activity context, PVEditOrderHelper helper, ArticoloOrdine articolo, RunnableArgs<ArticoloOrdine> onDialogDismiss) {
mContext = context;
mArticolo.setValue(articolo);
mHelper = helper;
qtaOrd.set(BigDecimal.valueOf(articolo.getQtaOrd()));
numCnf.set(BigDecimal.valueOf(articolo.getQtaOrd()).divide(BigDecimal.valueOf(articolo.getQtaCnf()), 0, RoundingMode.CEILING).intValue());
qtaCnf.set(BigDecimal.valueOf(articolo.getQtaCnf()));
this.onDialogDismiss = onDialogDismiss;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, R.style.AppTheme_NewMaterial_Dialog_FullscreenDialog);
}
@Override
public void onDismiss(@NonNull DialogInterface dialog) {
super.onDismiss(dialog);
/*ArticoloOrdine articolo = mArticolo.getValue();
if (articolo != null && articolo.getQtaOrd() <= 0f) {
articolo = null;
}
onDialogDismiss.run(articolo);*/
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mBinding = DataBindingUtil.inflate(inflater, R.layout.dialog_pv_edit_articolo, null, false);
mBinding.setView(this);
mBinding.toolbar.setTitle("Inserimento articolo");
mBinding.inputQtaOrd.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
initBindings();
return mBinding.getRoot();
}
@Override
public void onStart() {
super.onStart();
}
private void initBindings() {
BindableBigDecimal.registerListener(qtaOrd, qta -> {
if (!mLockedInput) {
mLockedInput = true;
ArticoloOrdine articoloOrdine = mArticolo.getValue();
BigDecimal qtaCnf = BigDecimal.valueOf(articoloOrdine.getQtaCnf());
int cnf = 0;
if (qtaOrd.get() != null && qtaOrd.get().compareTo(BigDecimal.ZERO) > 0) {
cnf = qtaOrd.get().divide(qtaCnf, 0, RoundingMode.CEILING).intValue();
}
this.numCnf.set(cnf);
this.mBinding.executePendingBindings();
mLockedInput = false;
}
});
BindableInteger.registerListener(numCnf, qta -> {
if (!mLockedInput) {
mLockedInput = true;
ArticoloOrdine articoloOrdine = mArticolo.getValue();
BigDecimal qtaCnf = BigDecimal.valueOf(articoloOrdine.getQtaCnf());
this.qtaOrd.set(BigDecimal.valueOf(numCnf.get() * qtaCnf.floatValue()).setScale(2, RoundingMode.CEILING));
this.mBinding.executePendingBindings();
mLockedInput = false;
}
});
mBinding.inputQtaOrd.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_DONE) {
// saveAndExit();
mBinding.inputNumCnfText.requestFocus();
return true;
}
return false;
});
mBinding.inputNumCnfText.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_DONE) {
saveAndExit();
return true;
}
return false;
});
}
public void saveAndExit() {
this.onLoadingStarted();
try {
ArticoloOrdine articolo = mArticolo.getValue();
if (articolo == null) {
throw new Exception("Articolo non valido");
}
if (qtaOrd.get().compareTo(BigDecimal.ZERO) <= 0) {
throw new Exception("La quantità ordinata deve essere maggiore di 0");
}
articolo.setQtaOrd(qtaOrd.get().floatValue());
mArticolo.setValue(articolo);
mHelper.saveArticoloToOrdine(mArticolo.getValue(), () -> {
this.onLoadingEnded();
requireActivity().runOnUiThread(() -> {
onDialogDismiss.run(articolo);
});
this.dismiss();
}, e -> {
mContext.runOnUiThread(() -> UtilityExceptions.defaultException(mContext, e));
this.onLoadingEnded();
});
} catch (Exception e) {
mContext.runOnUiThread(() -> UtilityExceptions.defaultException(mContext, e));
this.onLoadingEnded();
return;
}
;
}
public ArticoloOrdine getArticolo() {
return mArticolo.getValue();
}
public void cancel() {
mArticolo.postValue(null);
requireActivity().runOnUiThread(() -> {
onDialogDismiss.run(null);
});
this.dismiss();
}
}

View File

@@ -4,7 +4,6 @@ import java.util.List;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloGriglia;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloOrdine;
import it.integry.integrywmsnative.core.data_store.db.entity.Griglia;
import it.integry.integrywmsnative.core.data_store.db.entity.Ordine;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoliOrdineRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoloGrigliaRepository;
@@ -43,26 +42,6 @@ public class PVEditOrderHelper {
}
}
public void loadGriglia(int idGriglia, RunnableArgs<Griglia> onLoad, RunnableArgs<Exception> onError) {
try {
mGrigliaRepository.findGrigliaById(idGriglia, onLoad, onError);
} catch (Exception e) {
onError.run(e);
}
}
public void loadArticoli(Ordine ordine, RunnableArgs<List<ArticoloOrdine>> onLoad, RunnableArgs<Exception> onError) {
try {
mArticoliOrdineRepository.findArticoliByOrdine(ordine, onLoad, onError);
} catch (Exception e) {
onError.run(e);
}
}
public void saveArticoloToOrdine(ArticoloOrdine articolo, Runnable onSave, RunnableArgs<Exception> onFail) {
mArticoliOrdineRepository.saveArticoloToOrdine(articolo, onSave, onFail);
}
public void saveArticoliToOrdine(List<ArticoloOrdine> articoli, Runnable onSave, RunnableArgs<Exception> onFail) {
mArticoliOrdineRepository.saveArticoliToOrdine(articoli, onSave, onFail);

View File

@@ -5,17 +5,19 @@ import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ObservableArrayList;
import androidx.databinding.ObservableList;
import androidx.recyclerview.widget.RecyclerView;
import com.annimon.stream.Stream;
import com.zhukic.sectionedrecyclerview.SectionedRecyclerViewAdapter;
import java.util.ArrayList;
import java.util.List;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloOrdine;
import it.integry.integrywmsnative.core.expansion.OnListGeneralChangedCallback;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.databinding.FragmentPvArticoliOrdineAcquistoListSingleItemBinding;
import it.integry.integrywmsnative.databinding.FragmentPvOrdiniAcquistoListHeaderBinding;
import it.integry.integrywmsnative.ui.fastscroll.SectionTitleProvider;
@@ -23,9 +25,10 @@ import it.integry.integrywmsnative.ui.fastscroll.SectionTitleProvider;
public class OrdineAcquistoArtListAdapter extends SectionedRecyclerViewAdapter<OrdineAcquistoArtListAdapter.SubheaderHolder, OrdineAcquistoArtListAdapter.SingleItemViewHolder> implements SectionTitleProvider {
private Context mContext;
private final Context mContext;
private final List<OrdineAcquistoArtListModel> mDataset = new ArrayList<>();
private List<ArticoloOrdine> mDataset;
RunnableArgs<ArticoloOrdine> mOnItemSelect;
@@ -51,28 +54,26 @@ public class OrdineAcquistoArtListAdapter extends SectionedRecyclerViewAdapter<O
}
public OrdineAcquistoArtListAdapter(Context context, List<ArticoloOrdine> myDataset, RunnableArgs<ArticoloOrdine> onItemSelect) {
public OrdineAcquistoArtListAdapter(Context context, ObservableArrayList<OrdineAcquistoArtListModel> myDataset) {
mContext = context;
mDataset = orderItems(myDataset);
mOnItemSelect = onItemSelect;
myDataset.addOnListChangedCallback(new OnListGeneralChangedCallback() {
@Override
public void onChanged(ObservableList sender) {
mDataset.clear();
mDataset.addAll(sender);
notifyDataSetChanged();
notifyDataChanged();
}
});
}
public void updateItems(List<ArticoloOrdine> updatedDataset) {
mDataset.clear();
mDataset.addAll(orderItems(updatedDataset));
notifyDataSetChanged();
notifyDataChanged();
public OrdineAcquistoArtListAdapter setOnItemClicked(RunnableArgs<ArticoloOrdine> onItemSelect) {
this.mOnItemSelect = onItemSelect;
return this;
}
private List<ArticoloOrdine> orderItems(List<ArticoloOrdine> dataset) {
return Stream.of(dataset)
.distinctBy(ArticoloOrdine::getArticoloOrdineId)
.sortBy(x -> UtilityDate.formatDate(x.getDataIns(), UtilityDate.COMMONS_DATE_FORMATS.YMD_SLASH))
.toList();
}
@Override
public SubheaderHolder onCreateSubheaderViewHolder(ViewGroup parent, int viewType) {
@@ -94,7 +95,7 @@ public class OrdineAcquistoArtListAdapter extends SectionedRecyclerViewAdapter<O
@Override
public void onBindItemViewHolder(OrdineAcquistoArtListAdapter.SingleItemViewHolder h, int itemPosition) {
final ArticoloOrdine articoloOrdine = mDataset.get(itemPosition);
final ArticoloOrdine articoloOrdine = mDataset.get(itemPosition).getOriginalModel();
final OrdineAcquistoArtListAdapter.SingleItemViewHolder holder = h;
holder.binding.setArticolo(articoloOrdine);

View File

@@ -0,0 +1,60 @@
package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.ui;
import java.math.BigDecimal;
import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloOrdine;
public class OrdineAcquistoArtListModel {
private String badge1;
private String description;
private BigDecimal quantity;
private String untMis;
private ArticoloOrdine originalModel;
public String getBadge1() {
return badge1;
}
public OrdineAcquistoArtListModel setBadge1(String badge1) {
this.badge1 = badge1;
return this;
}
public String getDescription() {
return description;
}
public OrdineAcquistoArtListModel setDescription(String description) {
this.description = description;
return this;
}
public BigDecimal getQuantity() {
return quantity;
}
public OrdineAcquistoArtListModel setQuantity(BigDecimal quantity) {
this.quantity = quantity;
return this;
}
public String getUntMis() {
return untMis;
}
public OrdineAcquistoArtListModel setUntMis(String untMis) {
this.untMis = untMis;
return this;
}
public ArticoloOrdine getOriginalModel() {
return originalModel;
}
public OrdineAcquistoArtListModel setOriginalModel(ArticoloOrdine originalModel) {
this.originalModel = originalModel;
return this;
}
}

View File

@@ -66,7 +66,7 @@ public class DialogScanLisA {
private void initBarcode() {
int barcodeIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessfull)
.setOnScanSuccessful(onScanSuccessfull)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(mContext, ex, false)));
mDialog.setBarcodeListener(true);

View File

@@ -40,8 +40,8 @@ public class OrdineAcquistoPvHelper {
updateGriglia(griglia, onSave, onFail);
}
public void updateGriglia(Griglia griglia, RunnableArgs<Griglia> onSave, RunnableArgs<Exception> onFail) {
PVOrdiniAcquistoRESTConsumer.getArticoliListino(griglia.getCodAlis(), dto -> {
public void updateGriglia(Griglia griglia, RunnableArgs<Griglia> onSaved, RunnableArgs<Exception> onFail) {
PVOrdiniAcquistoRESTConsumer.getArticoliListinoStatic(griglia.getCodAlis(), dto -> {
mContext.runOnUiThread(() -> {
if (dto.getGrigliaAcquistiChild().size() <= 0) {
onFail.run(new Exception("La griglia selezionata (" + griglia.getCodAlis() + ") non esiste o non presenta articoli"));
@@ -50,7 +50,13 @@ public class OrdineAcquistoPvHelper {
griglia.setDescrLisa(dto.getDescrLisa());
griglia.setDescrDepo(dto.getDescrDepo());
griglia.setCountArticoli(dto.getGrigliaAcquistiChild().size());
mGrigliaRepository.saveGriglia(griglia, id -> saveLisAToGriglia(dto.getGrigliaAcquistiChild(), griglia, onSave, onFail), onFail);
mGrigliaRepository.saveGriglia(griglia, id -> {
saveLisAToGriglia(dto.getGrigliaAcquistiChild(), griglia, grigliaResult -> {
onSaved.run(grigliaResult);
}, onFail);
}, onFail);
});
}, onFail);
}

View File

@@ -144,7 +144,7 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr
private void initBarcodeReader() {
barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessful)
.setOnScanSuccessful(onScanSuccessful)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(getActivity(), ex, false)));
}

View File

@@ -150,13 +150,14 @@ public class RettificaGiacenzeViewModel {
barcodeProd = UtilityBarcode.convertITF14toEAN13(barcodeProd);
}
String finalBarcodeProd = barcodeProd;
this.mArticoloRESTConsumer.getByBarcodeProd(barcodeProd, mtbAartList -> {
if (onComplete != null) onComplete.run();
if (mtbAartList != null && mtbAartList.size() > 0) {
this.dispatchArt(mtbAartList.get(0), pickData);
} else {
this.sendError(new NoResultFromBarcodeException());
this.sendError(new NoResultFromBarcodeException(finalBarcodeProd));
}
}, this::sendError);

View File

@@ -249,7 +249,7 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo
private void initBarcodeReader() {
barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessful)
.setOnScanSuccessful(onScanSuccessful)
.setOnScanFailed(this::onError));
BarcodeManager.enable();

View File

@@ -626,12 +626,13 @@ public class SpedizioneViewModel {
barcodeProd = UtilityBarcode.convertITF14toEAN13(barcodeProd);
}
String finalBarcodeProd = barcodeProd;
this.mArticoloRESTConsumer.getByBarcodeProd(barcodeProd, mtbAartList -> {
if (mtbAartList != null && mtbAartList.size() > 0) {
this.searchArtFromAnag(mtbAartList.get(0), pickData, onComplete);
} else {
this.sendError(new NoResultFromBarcodeException());
this.sendError(new NoResultFromBarcodeException(finalBarcodeProd));
}
}, this::sendError);
@@ -708,6 +709,7 @@ public class SpedizioneViewModel {
List<PickingObjectDTO> matchPickingObject = Stream.of(pickingList)
.filter(x -> UtilityString.equalsIgnoreCase(mtbAart.getCodMart(), x.getSitArtOrdDTO().getCodMart()))
.filter(x -> x.getSitArtOrdDTO().isFlagEnableScanArt())
.filter(x -> {
MtbPartitaMag mtbPartitaMag = pickData != null && pickData.getManualPickDTO() != null && pickData.getManualPickDTO().getMtbPartitaMag() != null ? pickData.getManualPickDTO().getMtbPartitaMag() : null;
return !mEnableCheckPartitaMag || (mtbPartitaMag != null && UtilityString.equalsIgnoreCase(x.getSitArtOrdDTO().getPartitaMag(), mtbPartitaMag.getPartitaMag()));
@@ -742,8 +744,8 @@ public class SpedizioneViewModel {
this.getPickingList().postValue(pickingList);
} else {
MtbColt refMtbColt = matchedItem.getRefMtbColt();
MtbColr refMtbColr = refMtbColt != null ? matchedItem.getRefMtbColt().getMtbColr().get(0) : null;
this.dispatchOrdineRow(matchedItem, refMtbColt, refMtbColr, false);
MtbColr refMtbColr = refMtbColt != null ? refMtbColt.getMtbColr().get(0) : null;
this.dispatchOrdineRow(matchedItem, refMtbColt, refMtbColr, refMtbColr == null);
}
} else {

View File

@@ -125,6 +125,7 @@ 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.qtaEvasa.setTextColor(ResourcesCompat.getColor(mContext.getResources(), !pickingObjectDTO.isActive() ? R.color.gray_600 : R.color.green_700, null));
holder.mBinding.descrizione.setText(pickingObjectDTO.getDescrizione());

View File

@@ -138,7 +138,7 @@ public class UltimeConsegneClienteFragment extends BaseFragment implements Ultim
private void initBarcodeReader() {
barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessful)
.setOnScanSuccessful(onScanSuccessful)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(getActivity(), ex, false)));
BarcodeManager.enable();

View File

@@ -143,7 +143,7 @@ public class UltimiArriviFornitoreFragment extends BaseFragment implements ITitl
private void initBarcodeReader() {
barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessful)
.setOnScanSuccessful(onScanSuccessful)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(getActivity(), ex, false)));
BarcodeManager.enable();

View File

@@ -123,7 +123,7 @@ public class VersamentoMerceFragment extends BaseFragment implements ITitledFrag
private void initBarcodeReader() {
barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessful)
.setOnScanSuccessful(onScanSuccessful)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(getActivity(), ex, false)));
BarcodeManager.enable();

View File

@@ -94,7 +94,7 @@ public class DialogAskClienteDestinatarioDTO {
@Override
public String toString() {
return String.format("%s (%s)", getDestinatario(), getCodVdes());
return getDestinatario() + (getCodVdes() != null ? (" (" + getCodVdes() + ")") : "");
}
public VtbDest toVtbDestModel() {

View File

@@ -61,7 +61,7 @@ public class DialogAskCliente_Page1ViewModel implements IDialogAskClienteViewMod
public void onShow() {
mBarcodeScannerInstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessful)
.setOnScanSuccessful(onScanSuccessful)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(mContext, ex, false)));
BarcodeManager.enable();
@@ -145,7 +145,12 @@ public class DialogAskCliente_Page1ViewModel implements IDialogAskClienteViewMod
private void initializeAdapter(ArrayList<DialogAskClienteClienteDTO> items) {
DialogAskCliente_Page1_Cliente_ArrayAdapter adapter = new DialogAskCliente_Page1_Cliente_ArrayAdapter(mContext, items);
var orderedList = Stream.of(items)
.sortBy(x -> x.getRagSoc() != null ? x.getRagSoc() : "")
.toList();
DialogAskCliente_Page1_Cliente_ArrayAdapter adapter = new DialogAskCliente_Page1_Cliente_ArrayAdapter(mContext, orderedList);
AutoCompleteTextView editTextDropdownCliente = mBinding.dropdownCliente;
editTextDropdownCliente.setThreshold(0);
@@ -177,7 +182,7 @@ public class DialogAskCliente_Page1ViewModel implements IDialogAskClienteViewMod
private boolean validateCliente() {
if (SettingsManager.iDB().isFlagAllowEmptyClienteInPickingLibero() && mBinding.inputCliente.getEditText().getText().toString().trim().length() == 0) {
if (SettingsManager.iDB().isFlagPickLiberoAllowEmptyCliente() && mBinding.inputCliente.getEditText().getText().toString().trim().length() == 0) {
return true;
} else return getCurrentCliente() != null;
}

View File

@@ -20,13 +20,13 @@ import it.integry.integrywmsnative.view.dialogs.ask_cliente.dto.DialogAskCliente
public class DialogAskCliente_Page1_Cliente_ArrayAdapter extends ArrayAdapter<DialogAskClienteClienteDTO> implements Filterable {
private Context mContext;
private List<DialogAskClienteClienteDTO> mDataset;
private final Context mContext;
private final List<DialogAskClienteClienteDTO> mDataset;
private List<DialogAskClienteClienteDTO> mDatasetAllItems;
private ListFilter listFilter = new ListFilter();
private final ListFilter listFilter = new ListFilter();
public DialogAskCliente_Page1_Cliente_ArrayAdapter(@NonNull Context context, @NonNull ArrayList<DialogAskClienteClienteDTO> list) {
public DialogAskCliente_Page1_Cliente_ArrayAdapter(@NonNull Context context, @NonNull List<DialogAskClienteClienteDTO> list) {
super(context, 0 , list);
mContext = context;
mDataset = list;
@@ -37,13 +37,15 @@ public class DialogAskCliente_Page1_Cliente_ArrayAdapter extends ArrayAdapter<Di
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View listItem = convertView;
if(listItem == null) {
listItem = LayoutInflater.from(mContext).inflate(R.layout.dropdown_simple_item, parent, false);
listItem = LayoutInflater.from(mContext).inflate(R.layout.dropdown_simple_item_w_subtitle, parent, false);
}
if(position < mDataset.size()) {
AppCompatTextView textView = listItem.findViewById(R.id.text);
AppCompatTextView textView = listItem.findViewById(R.id.title);
AppCompatTextView subTitle = listItem.findViewById(R.id.subtitle);
textView.setText(mDataset.get(position).getRagSoc());
subTitle.setText(mDataset.get(position).getCodAnag());
return listItem;
}
@@ -59,7 +61,7 @@ public class DialogAskCliente_Page1_Cliente_ArrayAdapter extends ArrayAdapter<Di
}
public class ListFilter extends Filter {
private Object lock = new Object();
private final Object lock = new Object();
@Override
protected FilterResults performFiltering(CharSequence prefix) {
@@ -81,7 +83,7 @@ public class DialogAskCliente_Page1_Cliente_ArrayAdapter extends ArrayAdapter<Di
ArrayList<DialogAskClienteClienteDTO> matchValues = new ArrayList<>();
for (DialogAskClienteClienteDTO dataItem : mDatasetAllItems) {
if (dataItem.getRagSoc().toLowerCase().startsWith(searchStrLowerCase)) {
if (dataItem.getRagSoc().toLowerCase().contains(searchStrLowerCase)) {
matchValues.add(dataItem);
}
}

View File

@@ -23,7 +23,7 @@ public class DialogAskCliente_Page1_Commessa_ArrayAdapter extends ArrayAdapter<S
private List<String> mDataset = new ArrayList<>();
private List<String> mDatasetAllItems;
private DialogAskCliente_Page1_Commessa_ArrayAdapter.ListFilter listFilter = new DialogAskCliente_Page1_Commessa_ArrayAdapter.ListFilter();
private final DialogAskCliente_Page1_Commessa_ArrayAdapter.ListFilter listFilter = new DialogAskCliente_Page1_Commessa_ArrayAdapter.ListFilter();
public DialogAskCliente_Page1_Commessa_ArrayAdapter(@NonNull Context context) {
super(context, 0);
@@ -56,7 +56,7 @@ public class DialogAskCliente_Page1_Commessa_ArrayAdapter extends ArrayAdapter<S
}
public class ListFilter extends Filter {
private Object lock = new Object();
private final Object lock = new Object();
@Override
protected FilterResults performFiltering(CharSequence prefix) {
@@ -78,7 +78,7 @@ public class DialogAskCliente_Page1_Commessa_ArrayAdapter extends ArrayAdapter<S
ArrayList<String> matchValues = new ArrayList<>();
for (String dataItem : mDatasetAllItems) {
if (dataItem.toLowerCase().startsWith(searchStrLowerCase)) {
if (dataItem.toLowerCase().contains(searchStrLowerCase)) {
matchValues.add(dataItem);
}
}

View File

@@ -11,6 +11,7 @@ import java.util.ArrayList;
import java.util.List;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.databinding.DialogAskClientePage2Binding;
import it.integry.integrywmsnative.view.dialogs.ask_cliente.dto.DialogAskClienteDestinatarioDTO;
@@ -57,6 +58,12 @@ public class DialogAskCliente_Page2ViewModel implements IDialogAskClienteViewMod
return;
}
if(SettingsManager.iDB().isFlagPickLiberoAllowEmptyDest()) {
filteredDestinatari.add(new DialogAskClienteDestinatarioDTO()
.setCodAnag(null)
.setDestinatario("Nessuno"));
}
initializeAdapter(filteredDestinatari);
@@ -95,7 +102,11 @@ public class DialogAskCliente_Page2ViewModel implements IDialogAskClienteViewMod
private void initializeAdapter(List<DialogAskClienteDestinatarioDTO> items) {
DialogAskCliente_Page2_ArrayAdapter adapter = new DialogAskCliente_Page2_ArrayAdapter(mContext, items);
var orderedList = Stream.of(items)
.sortBy(x -> x.getCodAnag() != null ? x.getCodAnag() : "")
.toList();
DialogAskCliente_Page2_ArrayAdapter adapter = new DialogAskCliente_Page2_ArrayAdapter(mContext, orderedList);
AutoCompleteTextView editTextFilledExposedDropdown = mBinding.dropdownDestinatario;
@@ -105,7 +116,9 @@ public class DialogAskCliente_Page2ViewModel implements IDialogAskClienteViewMod
private boolean validateDestinatario() {
return getCurrentDestinatario() != null;
if (SettingsManager.iDB().isFlagPickLiberoAllowEmptyDest() && getCurrentDestinatario() == null) {
return true;
} else return getCurrentDestinatario() != null;
}
public DialogAskClienteDestinatarioDTO getCurrentDestinatario() {

View File

@@ -11,6 +11,7 @@ import android.widget.Filterable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.core.content.ContextCompat;
import java.util.ArrayList;
import java.util.List;
@@ -21,14 +22,15 @@ import it.integry.integrywmsnative.view.dialogs.ask_cliente.dto.DialogAskCliente
public class DialogAskCliente_Page2_ArrayAdapter extends ArrayAdapter<DialogAskClienteDestinatarioDTO> implements Filterable {
private Context mContext;
private List<DialogAskClienteDestinatarioDTO> mDataset;
private final Context mContext;
private final List<DialogAskClienteDestinatarioDTO> mDataset;
private List<DialogAskClienteDestinatarioDTO> mDatasetAllItems;
private ListFilter listFilter = new ListFilter();
private final ListFilter listFilter = new ListFilter();
public DialogAskCliente_Page2_ArrayAdapter(@NonNull Context context, @NonNull List<DialogAskClienteDestinatarioDTO> list) {
super(context, 0 , list);
mContext = context;
mDataset = list;
}
@@ -43,18 +45,21 @@ public class DialogAskCliente_Page2_ArrayAdapter extends ArrayAdapter<DialogAskC
if(position < mDataset.size()) {
var item = mDataset.get(position);
AppCompatTextView destinatario = listItem.findViewById(R.id.destinatario);
destinatario.setText(UtilityString.capitalizeWords(mDataset.get(position).toString()));
destinatario.setText(UtilityString.capitalizeWords(item.getDestinatario() + (item.getCodVdes() != null ? ("(" + item.getCodVdes() + ")") : "")));
if(item.getCodVdes() == null) destinatario.setTextColor(ContextCompat.getColor(mContext, R.color.gray_800));
AppCompatTextView subtitle = listItem.findViewById(R.id.subtitle);
StringBuilder subtitleStr = new StringBuilder();
if(!UtilityString.isNullOrEmpty(mDataset.get(position).getCitta())) {
subtitleStr.append(UtilityString.capitalizeWords(mDataset.get(position).getCitta()) + " - ");
subtitleStr.append(UtilityString.capitalizeWords(item.getCitta())).append(" - ");
}
if(!UtilityString.isNullOrEmpty(mDataset.get(position).getIndirizzo())) {
subtitleStr.append(UtilityString.capitalizeWords(mDataset.get(position).getIndirizzo()));
subtitleStr.append(UtilityString.capitalizeWords(item.getIndirizzo()));
}
subtitle.setText(subtitleStr);
@@ -95,7 +100,7 @@ public class DialogAskCliente_Page2_ArrayAdapter extends ArrayAdapter<DialogAskC
ArrayList<DialogAskClienteDestinatarioDTO> matchValues = new ArrayList<>();
for (DialogAskClienteDestinatarioDTO dataItem : mDatasetAllItems) {
if (dataItem.toString().toLowerCase().startsWith(searchStrLowerCase)) {
if (dataItem.toString().toLowerCase().contains(searchStrLowerCase)) {
matchValues.add(dataItem);
}
}

View File

@@ -130,7 +130,7 @@ public class DialogAskPositionOfLU {
private void setupBarcode() {
int barcodeIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessfull)
.setOnScanSuccessful(onScanSuccessfull)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(mContext, ex, false)));
mDialog.setOnDismissListener(dialog -> {

View File

@@ -242,7 +242,7 @@ public class DialogChooseArtsFromListaArts extends BaseDialogFragment {
BarcodeManager.enable();
mBarcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessfull)
.setOnScanSuccessful(onScanSuccessfull)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(context, ex, false)));

View File

@@ -170,7 +170,7 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia
private void initBarcode() {
mBarcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessful)
.setOnScanSuccessful(onScanSuccessful)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(this.context, ex, false)));
}

View File

@@ -5,13 +5,17 @@ import dagger.Provides;
import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.BarcodeRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.PosizioniRESTConsumer;
@Module(subcomponents = DialogScanArtComponent.class)
public class DialogScanArtModule {
@Provides
DialogScanArtViewModel providesDialogScanArtViewModel(BarcodeRESTConsumer barcodeRESTConsumer, ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer, ArticoloRESTConsumer articoloRESTConsumer) {
return new DialogScanArtViewModel(barcodeRESTConsumer, colliMagazzinoRESTConsumer, articoloRESTConsumer);
DialogScanArtViewModel providesDialogScanArtViewModel(BarcodeRESTConsumer barcodeRESTConsumer,
ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer,
ArticoloRESTConsumer articoloRESTConsumer,
PosizioniRESTConsumer posizioniRESTConsumer) {
return new DialogScanArtViewModel(barcodeRESTConsumer, colliMagazzinoRESTConsumer, articoloRESTConsumer, posizioniRESTConsumer);
}
}

View File

@@ -12,6 +12,8 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import com.annimon.stream.Stream;
import org.jetbrains.annotations.NotNull;
import javax.inject.Inject;
@@ -84,7 +86,6 @@ public class DialogScanArtView extends BaseDialogFragment implements DialogScanA
}
@Override
public void onDismiss(@NonNull DialogInterface dialog) {
BarcodeManager.removeCallback(mBarcodeScannerIstanceID);
@@ -95,7 +96,7 @@ public class DialogScanArtView extends BaseDialogFragment implements DialogScanA
private void initBarcode() {
mBarcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessfull)
.setOnScanSuccessful(onScanSuccessfull)
.setOnScanFailed(this::onError));
setBarcodeListener(true);
@@ -107,14 +108,28 @@ public class DialogScanArtView extends BaseDialogFragment implements DialogScanA
this.openProgress();
this.mViewModel.processBarcodeDTO(data, (status, mtbAart, ean128Model, mtbColrList) -> {
if(mtbColrList != null && mtbColrList.size() > 0) {
DialogChooseArtFromListaMtbColrView.make(getActivity(), mtbColrList, mtbColrChose -> {
var filteredMtbColrList = mtbColrList;
if (mtbAart != null) {
filteredMtbColrList = Stream.of(filteredMtbColrList)
.filter(x -> x.getCodMart().equalsIgnoreCase(mtbAart.getCodMart()))
.toList();
}
if (filteredMtbColrList != null && filteredMtbColrList.size() > 1) {
DialogChooseArtFromListaMtbColrView.make(getActivity(), filteredMtbColrList, mtbColrChose -> {
mOnItemChoosed.run(status, mtbAart, ean128Model, mtbColrChose);
}).show();
} else if (filteredMtbColrList != null && filteredMtbColrList.size() == 1) {
mOnItemChoosed.run(status, mtbAart, ean128Model, filteredMtbColrList.get(0));
} else {
mOnItemChoosed.run(status, mtbAart, ean128Model, null);
}
BarcodeManager.enable();
this.closeProgress();

View File

@@ -7,16 +7,21 @@ import java.util.List;
import it.integry.barcode_base_android_library.model.BarcodeScanDTO;
import it.integry.integrywmsnative.core.exception.InvalidLUException;
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.TooManyLUFoundInMonoLUPositionException;
import it.integry.integrywmsnative.core.expansion.RunnableArgssss;
import it.integry.integrywmsnative.core.model.MtbAart;
import it.integry.integrywmsnative.core.model.MtbColr;
import it.integry.integrywmsnative.core.model.MtbDepoPosizione;
import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.BarcodeRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.PosizioniRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.Ean128Model;
import it.integry.integrywmsnative.core.rest.model.Ean13PesoModel;
import it.integry.integrywmsnative.core.utility.UtilityBarcode;
import it.integry.integrywmsnative.core.utility.UtilityPosizione;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.view.dialogs.DialogConsts;
@@ -25,15 +30,20 @@ public class DialogScanArtViewModel {
private final BarcodeRESTConsumer mBarcodeRESTConsumer;
private final ColliMagazzinoRESTConsumer mColliMagazzinoRESTConsumer;
private final ArticoloRESTConsumer mArticoloRESTConsumer;
private final PosizioniRESTConsumer mPosizioniRESTConsumer;
private boolean mForceOnlyUL;
private Listener mListener;
public DialogScanArtViewModel(BarcodeRESTConsumer barcodeRESTConsumer, ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer, ArticoloRESTConsumer articoloRESTConsumer) {
public DialogScanArtViewModel(BarcodeRESTConsumer barcodeRESTConsumer,
ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer,
ArticoloRESTConsumer articoloRESTConsumer,
PosizioniRESTConsumer posizioniRESTConsumer) {
this.mBarcodeRESTConsumer = barcodeRESTConsumer;
this.mColliMagazzinoRESTConsumer = colliMagazzinoRESTConsumer;
this.mArticoloRESTConsumer = articoloRESTConsumer;
this.mPosizioniRESTConsumer = posizioniRESTConsumer;
}
public DialogScanArtViewModel setForceOnlyUL(boolean forceOnlyUL) {
@@ -50,15 +60,19 @@ public class DialogScanArtViewModel {
//Cerco l'UL presente all'interno della posizione
// this.executeEtichettaPosizione(barcodeScanDTO.getStringValue(), onComplete);
} else if(UtilityBarcode.isEtichetta128(barcodeScanDTO)) {
} else if (UtilityBarcode.isEtichetta128(barcodeScanDTO)) {
this.executeEtichettaEan128(barcodeScanDTO, onComplete);
} else if(UtilityBarcode.isEanPeso(barcodeScanDTO) && !mForceOnlyUL){
} else if (UtilityBarcode.isEanPeso(barcodeScanDTO) && !mForceOnlyUL) {
this.executeEtichettaEanPeso(barcodeScanDTO, onComplete);
} else if (!mForceOnlyUL){
this.loadArticolo(barcodeScanDTO.getStringValue(), null, onComplete);
} else {
this.sendError(new Exception("Barcode non valido"));
this.loadArticolo(barcodeScanDTO.getStringValue(), null, onComplete);
}
// else {
// this.sendError(new Exception("Barcode non valido"));
// }
}
@@ -67,15 +81,15 @@ public class DialogScanArtViewModel {
String barcodeProd = null;
if(ean128Model.Sscc != null) barcodeProd = ean128Model.Sscc;
if(ean128Model.Gtin != null) barcodeProd = ean128Model.Gtin;
if(ean128Model.Content != null) barcodeProd = ean128Model.Content;
if (ean128Model.Sscc != null) barcodeProd = ean128Model.Sscc;
if (ean128Model.Gtin != null) barcodeProd = ean128Model.Gtin;
if (ean128Model.Content != null) barcodeProd = ean128Model.Content;
if(!UtilityString.isNullOrEmpty(barcodeProd)) {
if (!UtilityString.isNullOrEmpty(barcodeProd)) {
if (!UtilityString.isNullOrEmpty(ean128Model.Sscc)) {
this.executeEtichettaLU(ean128Model.Sscc, onComplete);
} else if(!mForceOnlyUL) {
} else if (!mForceOnlyUL) {
if (barcodeProd.startsWith("0") || barcodeProd.startsWith("9")) {
barcodeProd = barcodeProd.substring(1);
}
@@ -86,7 +100,7 @@ public class DialogScanArtViewModel {
}
} else {
//EAN 128 non completo o comunque mancano i riferimenti al prodotto
this.sendError(new NoResultFromBarcodeException());
this.sendError(new NoResultFromBarcodeException(barcodeProd));
}
}, this::sendError);
}
@@ -117,23 +131,48 @@ public class DialogScanArtViewModel {
}, this::sendError);
}
private void executePosizione(MtbDepoPosizione posizione, MtbAart articolo, RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, List<MtbColr>> onComplete) {
this.mPosizioniRESTConsumer.getBancaliInPosizione(posizione, mtbColtList -> {
private void loadArticolo(@NotNull String barcodeProd, Ean128Model ean128Model, RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, List<MtbColr>> onComplete) {
if(barcodeProd.length() == 14) {
// barcodeProd = UtilityBarcode.convertITF14toNeutral(barcodeProd);
barcodeProd = UtilityBarcode.convertITF14toEAN13(barcodeProd);
}
this.mArticoloRESTConsumer.getByBarcodeProd(barcodeProd, mtbAartList -> {
if(mtbAartList != null && mtbAartList.size() > 0) {
onComplete.run(DialogConsts.Results.YES, mtbAartList.get(0), ean128Model, null);
if (mtbColtList == null || mtbColtList.size() == 0) {
this.sendError(new NoLUFoundException());
} else if (mtbColtList.size() == 1) {
this.mColliMagazzinoRESTConsumer.getByTestata(mtbColtList.get(0), true, false, mtbColt -> {
onComplete.run(DialogConsts.Results.YES, articolo, null, mtbColt.getMtbColr());
}, this::sendError);
} else {
this.sendError(new NoResultFromBarcodeException());
this.sendError(new TooManyLUFoundInMonoLUPositionException());
}
}, this::sendError);
}
private void loadArticolo(@NotNull String barcodeProd, Ean128Model ean128Model, RunnableArgssss<DialogConsts.Results, MtbAart, Ean128Model, List<MtbColr>> onComplete) {
if (barcodeProd.length() == 14) {
barcodeProd = UtilityBarcode.convertITF14toEAN13(barcodeProd);
}
String finalBarcodeProd = barcodeProd;
this.mArticoloRESTConsumer.getByBarcodeProd(barcodeProd, mtbAartList -> {
if (mtbAartList != null && mtbAartList.size() > 0) {
MtbAart firstArt = mtbAartList.get(0);
MtbDepoPosizione firstArtPosition = UtilityPosizione.getFromCache(firstArt.getPosizione());
if (firstArtPosition != null && firstArtPosition.isFlagMonoCollo() && mForceOnlyUL) {
this.executePosizione(firstArtPosition, firstArt, onComplete);
} else if (!mForceOnlyUL) {
onComplete.run(DialogConsts.Results.YES, mtbAartList.get(0), ean128Model, null);
} else {
this.sendError(new NoResultFromBarcodeException(finalBarcodeProd));
}
} else {
this.sendError(new NoResultFromBarcodeException(finalBarcodeProd));
}
}, this::sendError);
}
private void sendError(Exception ex) {

View File

@@ -126,7 +126,7 @@ public class DialogScanOrCreateLUView extends BaseDialogFragment implements Dial
private void initBarcode() {
mBarcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessfull)
.setOnScanSuccessful(onScanSuccessfull)
.setOnScanFailed(this::onError));
setBarcodeListener(true);

View File

@@ -155,7 +155,6 @@
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="92dp"
android:paddingStart="2dp"
android:paddingEnd="2dp"
android:clipToPadding="false"
@@ -163,7 +162,8 @@
android:scrollbars="vertical"
app:layout_constraintTop_toBottomOf="@id/header_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/scan_art_spinner"
@@ -198,10 +198,12 @@
<com.github.clans.fab.FloatingActionMenu
android:id="@+id/close_activity_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
app:layout_anchorGravity="center"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:menu_icon="@drawable/ic_check_white_24dp"
@@ -255,7 +257,7 @@
app:fab_colorNormal="@color/white"
app:fab_colorPressed="@color/white_pressed"
app:fab_colorRipple="#66FFFFFF"
app:onClick="@{() -> viewModel.closeEdit()}"
app:onClick="@{() -> viewModel.close()}"
fab:fab_label="@string/close_and_exit" />

View File

@@ -1,38 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingTop="8dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/destinatario"
style="@style/AppTheme.NewMaterial.Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:textAppearance="?attr/textAppearanceSubtitle1"
tools:text="Destinatario"
style="@style/AppTheme.NewMaterial.Text"/>
tools:text="Destinatario" />
<LinearLayout
android:layout_width="match_parent"
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/subtitle"
style="@style/AppTheme.NewMaterial.Text.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
android:maxLines="1"
android:textAppearance="?attr/textAppearanceSubtitle1"
android:textColor="@color/gray_800"
tools:text="Città" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:textAppearance="?attr/textAppearanceSubtitle1"
tools:text="Città"
style="@style/AppTheme.NewMaterial.Text.Small"/>
</LinearLayout>
</LinearLayout>
</androidx.appcompat.widget.LinearLayoutCompat>

View File

@@ -12,7 +12,7 @@
<variable
name="view"
type="it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.EditArticoloDialog" />
type="it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.DialogEditArticoloView" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
@@ -552,7 +552,7 @@
android:imeOptions="actionDone"
android:selectAllOnFocus="true"
android:inputType="number"
app:binding="@{view.numCnf}" />
app:binding="@{view.currentNumCnf}" />
</com.google.android.material.textfield.TextInputLayout>
@@ -575,7 +575,7 @@
android:hint="@string/qty_x_pck"
android:imeOptions="actionDone"
android:inputType="numberDecimal"
app:binding="@{view.qtaCnf}" />
app:binding="@{view.currentQtaCnf}" />
</com.google.android.material.textfield.TextInputLayout>
@@ -597,7 +597,7 @@
android:hint="@string/tot_qty"
android:inputType="number"
android:selectAllOnFocus="true"
app:binding="@{view.qtaOrd}" />
app:binding="@{view.currentQtaTot}" />
</com.google.android.material.textfield.TextInputLayout>
@@ -621,7 +621,7 @@
android:layout_marginStart="4dp"
android:layout_marginEnd="4dp"
android:layout_weight="1"
android:onClick="@{() -> view.cancel()}"
android:onClick="@{() -> view.dismiss()}"
app:icon="@drawable/ic_close_24dp"
app:iconGravity="textStart"
app:layout_constraintTop_toTopOf="parent" />

View File

@@ -4,9 +4,10 @@
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.cardview.widget.CardView
android:orientation="vertical" android:layout_width="match_parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="vertical"
app:cardCornerRadius="12dp"
app:cardElevation="0dp">
@@ -21,17 +22,17 @@
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="24dp"
android:paddingEnd="24dp"
android:paddingTop="24dp"
android:paddingEnd="24dp"
android:paddingBottom="12dp">
<TextView
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/title_text"
style="@style/TextViewMaterial.Dialog.HeadlineText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/TextViewMaterial.Dialog.HeadlineText"
android:text="@string/extra_item"
android:gravity="center_horizontal"/>
android:gravity="center_horizontal"
android:text="@string/extra_item" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="wrap_content"
@@ -45,32 +46,31 @@
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
android:layout_height="wrap_content" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/AppTheme.NewMaterial.Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:layout_marginEnd="12dp"
android:layout_gravity="center_vertical"
android:gravity="center_horizontal"
style="@style/AppTheme.NewMaterial.Text"
android:text="@string/scan_item"/>
android:text="@string/scan_item"
android:textSize="16sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<com.google.android.material.button.MaterialButton
android:id="@+id/button_no"
style="@style/Button.DangerOutline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
style="@style/Button.DangerOutline"
app:strokeColor="@color/red_400"
app:layout_constraintTop_toTopOf="parent"
android:layout_gravity="center_horizontal"
android:text="@string/abort"/>
android:layout_marginTop="16dp"
android:text="@string/abort"
app:layout_constraintTop_toTopOf="parent"
app:strokeColor="@color/red_400" />
</androidx.appcompat.widget.LinearLayoutCompat>
@@ -78,5 +78,4 @@
</androidx.cardview.widget.CardView>
</layout>

View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/title"
style="@style/AppTheme.NewMaterial.Text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:textAppearance="?attr/textAppearanceSubtitle1"
tools:text="Destinatario" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/subtitle"
style="@style/AppTheme.NewMaterial.Text.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:textAppearance="?attr/textAppearanceSubtitle1"
android:textColor="@color/gray_800"
tools:text="Città" />
</androidx.appcompat.widget.LinearLayoutCompat>

View File

@@ -1 +0,0 @@
/build

View File

@@ -1,5 +0,0 @@
apply plugin: 'java-library'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
}

View File

@@ -1,9 +0,0 @@
package it.integry.barcode_base_android_library.exception;
public class BarcodeAdapterNotFoundException extends Exception {
public BarcodeAdapterNotFoundException(String adapterName) {
super("L'adapter " + adapterName + " non è stato rilevato sul dispositivo corrente");
}
}

View File

@@ -1,7 +0,0 @@
package it.integry.barcode_base_android_library.extension;
public interface RunnableArgs<T> {
void run(T data);
}

View File

@@ -1,22 +0,0 @@
package it.integry.barcode_base_android_library.interfaces;
import it.integry.barcode_base_android_library.extension.RunnableArgs;
import it.integry.barcode_base_android_library.exception.BarcodeAdapterNotFoundException;
import it.integry.barcode_base_android_library.model.BarcodeScanDTO;
public interface BarcodeReaderInterface {
boolean isRightAdapter();
void init(Runnable onDeviceReady) throws BarcodeAdapterNotFoundException;
void deinit();
void register(RunnableArgs<BarcodeScanDTO> onScanSuccessfull, RunnableArgs<Exception> onScanFailed);
String getAdapterName();
//void onKeyEvent(KeyEvent keyEvent);
}

View File

@@ -1,55 +0,0 @@
package it.integry.barcode_base_android_library.model;
public class BarcodeScanDTO {
private BarcodeType type;
private String stringValue;
private byte[] byteValue;
private String name;
private int decodingTime;
public BarcodeType getType() {
return type;
}
public BarcodeScanDTO setType(BarcodeType type) {
this.type = type;
return this;
}
public String getStringValue() {
return stringValue;
}
public BarcodeScanDTO setStringValue(String stringValue) {
this.stringValue = stringValue;
return this;
}
public byte[] getByteValue() {
return byteValue;
}
public BarcodeScanDTO setByteValue(byte[] byteValue) {
this.byteValue = byteValue;
return this;
}
public String getName() {
return name;
}
public BarcodeScanDTO setName(String name) {
this.name = name;
return this;
}
public int getDecodingTime() {
return decodingTime;
}
public BarcodeScanDTO setDecodingTime(int decodingTime) {
this.decodingTime = decodingTime;
return this;
}
}

View File

@@ -1,91 +0,0 @@
package it.integry.barcode_base_android_library.model;
public enum BarcodeType {
NIL(0),
AIRLINE_2OF5_13_DIGIT(1),
AIRLINE_2OF5_15_DIGIT(2),
AZTEC(3),
AUSTRALIAN_POSTAL(4),
BOOKLAND_EAN(5),
BPO(6),
CANPOST(7),
CHINAPOST(8),
CHINESE_2OF5(9),
CODABAR(10),
CODABLOCK(11),
CODE11(12),
CODE128(13),
CODE16K(14),
CODE32(15),
CODE39(16),
CODE49(17),
CODE93(18),
COMPOSITE(19),
COUPON_CODE(20),
DATAMATRIX(21),
DISCRETE_2OF5(22),
DUTCH_POSTAL(23),
EAN128(24),
EAN13(25),
EAN8(26),
GS1_DATABAR_14(27),
GS1_DATABAR_EXPANDED(28),
GS1_DATABAR_LIMITED(29),
HONGKONG_2OF5(30),
IATA_2OF5(31),
IDTAG(32),
INTERLEAVED_2OF5(33),
ISBT128(34),
JAPANESE_POSTAL(35),
KOREAN_POSTAL(36),
MATRIX_2OF5(37),
MAXICODE(38),
MESA(39),
MICRO_PDF417(40),
MICRO_QR(41),
MSI(42),
NEC_2OF5(43),
OCR(44),
PDF417(45),
PLESSEY(46),
POSICODE(47),
POST_US4(48),
QR(49),
STRAIGHT_2OF5(50),
STANDARD_2OF5(51),
TELEPEN(52),
TLCODE39(53),
TRIOPTIC(54),
UK_POSTAL(55),
UPCA(56),
UPCE(57),
UPCE1(58),
US_PLANET(59),
US_POSTNET(60),
USPS_4CB(61),
RSS(62),
LABEL(63),
HANXIN(64),
GRIDMATRIX(65),
INFO_MAIL(66),
INTELLIGENT_MAIL(67),
SWEDENPOST(68),
LAST(69);
private Integer text;
BarcodeType(Integer text) {
this.text = text;
}
public Integer getValue() {
return this.text;
}
public static BarcodeType fromInt(Integer text) {
for (BarcodeType b : BarcodeType.values()) {
if (b.text.equals(text)) return b;
}
return null;
}
}