From 1512cb7de9c6de4a23c27878590b8e211961b8f0 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Tue, 22 Nov 2022 10:42:18 +0100 Subject: [PATCH] Migliorie in elenco inventari --- .../11.json | 139 +++++++++++++++++- .../respository_new/InventarioRepository.java | 4 + .../integrywmsnative/core/di/Converters.java | 27 ++++ .../core/expansion/BaseFragment.java | 8 +- .../inventario/ElencoInventariFragment.java | 70 ++++++--- .../inventario/ElencoInventariViewModel.java | 55 +++++-- .../DialogAskInfoInventarioView.java | 17 ++- .../res/layout/fragment_elenco_inventario.xml | 53 +++++++ ...ent_elenco_inventario_list_single_item.xml | 16 +- app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values/strings.xml | 3 +- 11 files changed, 343 insertions(+), 50 deletions(-) diff --git a/app/schemas/it.integry.integrywmsnative.core.data_store.db.AppDatabase/11.json b/app/schemas/it.integry.integrywmsnative.core.data_store.db.AppDatabase/11.json index c2a83d4d..5138adfb 100644 --- a/app/schemas/it.integry.integrywmsnative.core.data_store.db.AppDatabase/11.json +++ b/app/schemas/it.integry.integrywmsnative.core.data_store.db.AppDatabase/11.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 11, - "identityHash": "1fbbe769d42f5fb33a56580bea8b11c6", + "identityHash": "6a7fc5a013080ef96827187ce0637459", "entities": [ { "tableName": "articoli_griglia", @@ -868,7 +868,7 @@ }, { "tableName": "inventari", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `id_inventario` INTEGER, `cod_mdep` TEXT NOT NULL, `data_inventario` INTEGER, `data_reg` INTEGER, `data_ver` INTEGER, `filtro` TEXT, `flag_stato` TEXT, `flag_operazione` TEXT, `cod_anag` TEXT, `cod_dtip` TEXT, `inserito_da` TEXT, `registrato_da` TEXT, `verificato_da` TEXT, `data_ora_inizio` INTEGER, `data_ora_fine` INTEGER, `causale` TEXT, `remote_sync_date` INTEGER)", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `id_inventario` INTEGER, `cod_mdep` TEXT NOT NULL, `data_inventario` INTEGER, `data_reg` INTEGER, `data_ver` INTEGER, `filtro` TEXT, `flag_stato` TEXT, `flag_operazione` TEXT, `cod_anag` TEXT, `cod_dtip` TEXT, `inserito_da` TEXT, `registrato_da` TEXT, `verificato_da` TEXT, `data_ora_inizio` INTEGER, `data_ora_fine` INTEGER, `causale` TEXT, `zona` TEXT, `remote_sync_date` INTEGER)", "fields": [ { "fieldPath": "id", @@ -972,6 +972,12 @@ "affinity": "TEXT", "notNull": false }, + { + "fieldPath": "zona", + "columnName": "zona", + "affinity": "TEXT", + "notNull": false + }, { "fieldPath": "remoteSyncDate", "columnName": "remote_sync_date", @@ -1006,12 +1012,139 @@ } ], "foreignKeys": [] + }, + { + "tableName": "inventario_rows", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `parent_id` INTEGER, `cod_mart` TEXT NOT NULL, `partita_mag` TEXT, `descrizione` TEXT, `qta` REAL NOT NULL DEFAULT 0, `num_cnf` REAL NOT NULL DEFAULT 0, `qta_cnf` REAL NOT NULL DEFAULT 0, `unt_mis` TEXT NOT NULL DEFAULT '0', `data_ora_inv` INTEGER, `scan_cod_barre` TEXT, `zona` TEXT, `remote_sync_date` INTEGER, FOREIGN KEY(`parent_id`) REFERENCES `inventari`(`_id`) ON UPDATE NO ACTION ON DELETE NO ACTION )", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "parentId", + "columnName": "parent_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "codMart", + "columnName": "cod_mart", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "partitaMag", + "columnName": "partita_mag", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "descrizione", + "columnName": "descrizione", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "qta", + "columnName": "qta", + "affinity": "REAL", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "numConf", + "columnName": "num_cnf", + "affinity": "REAL", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "qtaConf", + "columnName": "qta_cnf", + "affinity": "REAL", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "untMis", + "columnName": "unt_mis", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'0'" + }, + { + "fieldPath": "dataOraInv", + "columnName": "data_ora_inv", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "scanCodBarre", + "columnName": "scan_cod_barre", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "zona", + "columnName": "zona", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "remoteSyncDate", + "columnName": "remote_sync_date", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_inventario_rows__id", + "unique": false, + "columnNames": [ + "_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_inventario_rows__id` ON `${TABLE_NAME}` (`_id`)" + }, + { + "name": "index_inventario_rows_parent_id", + "unique": false, + "columnNames": [ + "parent_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_inventario_rows_parent_id` ON `${TABLE_NAME}` (`parent_id`)" + } + ], + "foreignKeys": [ + { + "table": "inventari", + "onDelete": "NO ACTION", + "onUpdate": "NO ACTION", + "columns": [ + "parent_id" + ], + "referencedColumns": [ + "_id" + ] + } + ] } ], "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1fbbe769d42f5fb33a56580bea8b11c6')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '6a7fc5a013080ef96827187ce0637459')" ] } } \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/respository_new/InventarioRepository.java b/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/respository_new/InventarioRepository.java index 84ce2d72..bc729191 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/respository_new/InventarioRepository.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/respository_new/InventarioRepository.java @@ -60,4 +60,8 @@ public class InventarioRepository extends _BaseRepository onError){ + localDataSource.makeDeleteRequest(inventarioDTO, onComplete, onError); + } + } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java b/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java index b6b6421b..9fe6386d 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java @@ -358,6 +358,33 @@ public class Converters { } } + @BindingAdapter("binding") + public static void bindTextInputEditTextLong(TextInputEditText view, final ObservableField observableLong) { + Pair, TextWatcherAdapter> pair = (Pair) view.getTag(R.id.bound_observable); + if (pair == null || pair.first != observableLong) { + if (pair != null) { + view.removeTextChangedListener(pair.second); + } + TextWatcherAdapter watcher = new TextWatcherAdapter() { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + Long value = null; + if (!UtilityString.isNullOrEmpty(s.toString())) + value = Long.valueOf(s.toString()); + observableLong.set(value); + } + }; + view.setTag(R.id.bound_observable, new Pair<>(observableLong, watcher)); + view.addTextChangedListener(watcher); + } + Long newValue = observableLong.get(); + Long viewValue = view.getText().toString().trim().length() > 0 ? Long.valueOf(view.getText().toString()) : Long.valueOf(0); + + if (!viewValue.equals(newValue) && newValue != null) { + view.setText(newValue.toString()); + } + } + @BindingAdapter(value = {"binding", "parentView", "warningOnOldDates"}, requireAll = false) public static void bindTextInputEditTextDate(TextInputEditText view, final ObservableField observableDate, BaseDialogFragment parentFragment, boolean warningOnOldDates) { Pair, TextWatcherAdapter> pair = (Pair) view.getTag(R.id.bound_observable); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseFragment.java b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseFragment.java index c18ae504..aa44347b 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseFragment.java @@ -11,6 +11,7 @@ import androidx.fragment.app.Fragment; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutorService; import javax.inject.Inject; @@ -26,6 +27,9 @@ public abstract class BaseFragment extends Fragment { @Inject public DialogProgressView mCurrentProgress; + @Inject + public ExecutorService executorService; + protected ElevatedToolbar mToolbar; protected final List mOnPreDestroyList = new ArrayList<>(); @@ -65,7 +69,7 @@ public abstract class BaseFragment extends Fragment { BarcodeManager.disable(); if (!progressOpened && !this.mCurrentProgress.isAdded()) { this.progressOpened = true; - requireActivity().runOnUiThread(() -> { + executorService.execute(() -> { this.mCurrentProgress.show(requireActivity().getSupportFragmentManager(), "tag"); }); } @@ -75,7 +79,7 @@ public abstract class BaseFragment extends Fragment { BarcodeManager.enable(); if (progressOpened) { this.progressOpened = false; - requireActivity().runOnUiThread(() -> { + executorService.execute(() -> { mCurrentProgress.dismissAllowingStateLoss(); }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/inventario/ElencoInventariFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/inventario/ElencoInventariFragment.java index eb959f68..c73848f1 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/inventario/ElencoInventariFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/inventario/ElencoInventariFragment.java @@ -78,27 +78,33 @@ public class ElencoInventariFragment extends BaseFragment implements ITitledFrag private void initRecyclerView() { mViewModel.getInventarioList().observe(getViewLifecycleOwner(), data -> { -// binding.reportEmptyView.setVisibility(data == null || data.isEmpty() ? View.VISIBLE : View.GONE); + mBinding.emptyView.setVisibility(data == null || data.isEmpty() ? View.VISIBLE : View.GONE); }); var itemType = new Type(R.layout.fragment_elenco_inventario_list_single_item, BR.item); itemType.onClick(x -> { - new BottomSheetInventarioActionsView(x.getBinding().getItem()) - .setListener(new BottomSheetInventarioActionsView.Listener() { - @Override - public void onItemEdit() { - mViewModel.loadInventarioData(x.getBinding().getItem().getIdInventario(), listArts -> { - startPicking(x.getBinding().getItem(), listArts); - }); - } + var item = x.getBinding().getItem(); - @Override - public void onItemDelete() { + if (!item.isSyncronized()) { + var bottomSheetActions = new BottomSheetInventarioActionsView(item) + .setListener(new BottomSheetInventarioActionsView.Listener() { + @Override + public void onItemEdit() { + mViewModel.loadInventarioData(item.getIdInventario(), listArts -> { + startPicking(item, listArts); + }); + } - } - }) - .show(requireActivity().getSupportFragmentManager(), "tag"); + @Override + public void onItemDelete() { + deleteInventarioRequest(item); + } + }); + + + bottomSheetActions.show(requireActivity().getSupportFragmentManager(), "tag"); + } return null; }); @@ -115,11 +121,6 @@ public class ElencoInventariFragment extends BaseFragment implements ITitledFrag } - private void startPicking(InventarioRoomDTO inventarioRoomDTO, List listArts) { - PickingInventarioActivity.startActivity(requireContext(), inventarioRoomDTO, listArts); - } - - @Override public void onPreDestroy(Runnable onComplete) { mViewModel.destroyData(); @@ -132,13 +133,23 @@ public class ElencoInventariFragment extends BaseFragment implements ITitledFrag } @Override - public void onInventarioInfoRequest(RunnableArgss onComplete) { + public void onInventarioInfoRequest(RunnableArgss onComplete) { DialogAskInfoInventarioView.newInstance(onComplete, null) .show(requireActivity().getSupportFragmentManager(), "tag"); } @Override - public void onCreateInventarioRequest(int inventoryId, String zone) { + public void onInventarioLoaded(InventarioRoomDTO inventarioRoomDTO, List listaArts) { + startPicking(inventarioRoomDTO, listaArts); + } + + + private void startPicking(InventarioRoomDTO inventarioRoomDTO, List listArts) { + PickingInventarioActivity.startActivity(requireContext(), inventarioRoomDTO, listArts); + } + + @Override + public void onCreateInventarioRequest(long inventoryId, String zone) { DialogYesNoView .newInstance(null, "Vuoi procedere con la creazione di un nuovo inventario con codice " + inventoryId + "?", dialogResponse -> { @@ -155,4 +166,21 @@ public class ElencoInventariFragment extends BaseFragment implements ITitledFrag }) .show(requireActivity().getSupportFragmentManager(), "tag"); } + + public void deleteInventarioRequest(InventarioRoomDTO inventarioRoomDTO) { + DialogYesNoView + .newInstance(null, "Vuoi cancellare l'inventario?", + dialogResponse -> { + switch (dialogResponse) { + case YES: + this.mViewModel.deleteInventario(inventarioRoomDTO); + break; + + case NO: + case ABORT: + break; + } + }) + .show(requireActivity().getSupportFragmentManager(), "tag"); + } } \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/inventario/ElencoInventariViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/inventario/ElencoInventariViewModel.java index 3cf5b663..07e734b3 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/inventario/ElencoInventariViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/inventario/ElencoInventariViewModel.java @@ -3,6 +3,7 @@ package it.integry.integrywmsnative.gest.inventario; import androidx.lifecycle.LiveData; import java.util.List; +import java.util.Objects; import it.integry.integrywmsnative.core.data_store.db.entity.InventarioRoomDTO; import it.integry.integrywmsnative.core.data_store.db.respository_new.InventarioRepository; @@ -13,6 +14,7 @@ import it.integry.integrywmsnative.core.rest.consumers.InventarioRESTConsumer; import it.integry.integrywmsnative.core.rest.model.inventario.InventarioArtDTO; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityDate; +import it.integry.integrywmsnative.core.utility.UtilityString; public class ElencoInventariViewModel { @@ -54,13 +56,31 @@ public class ElencoInventariViewModel { this.sendOnLoadingStarted(); inventarioRESTConsumer.loadInventario(inventoryId, loadedInventario -> { - this.sendOnLoadingEnded(); - if (loadedInventario == null || loadedInventario.getMtbInvent() == null) + if (loadedInventario == null || loadedInventario.getMtbInvent() == null) { + this.sendOnLoadingEnded(); this.sendCreateInventarioRequest(inventoryId, zone); - else this.createNewInventario(inventoryId, zone, (inventarioRoom, listaArts) -> { + } else { - }); + var matchedInventory = getInventarioList().getValue() + .stream() + .filter(x -> Objects.equals(x.getIdInventario(), inventoryId) && UtilityString.equalsIgnoreCase(x.getZona(), zone)) + .findFirst() + .orElse(null); + + if (matchedInventory == null) + this.createNewInventario(inventoryId, zone, (inventarioRoom, listaArts) -> { + this.sendOnLoadingEnded(); + this.sendOnInventarioLoaded(inventarioRoom, listaArts); + }); + + else + loadInventarioData(inventoryId, listaArts -> { + this.sendOnLoadingEnded(); + this.sendOnInventarioLoaded(matchedInventory, listaArts); + }); + + } }, this::sendOnError); }); } @@ -83,16 +103,21 @@ public class ElencoInventariViewModel { var createdInventario = new InventarioRoomDTO(); createdInventario.setIdInventario(inventoryId); + createdInventario.setZona(zone); createdInventario.setCodMdep(codMdep); createdInventario.setInseritoDa(settingsManager.getSettings().getUser().getFullname()); createdInventario.setDataInventario(UtilityDate.getNow()); - inventarioRepository.insert(createdInventario, () -> { - loadInventarioData(inventoryId, inventarioArts -> { + loadInventarioData(inventoryId, inventarioArts -> { + inventarioRepository.insert(createdInventario, () -> { this.sendOnLoadingEnded(); onComplete.run(createdInventario, inventarioArts); - }); - }, this::sendOnError); + }, this::sendOnError); + }); + } + + public void deleteInventario(InventarioRoomDTO inventarioRoomDTO) { + inventarioRepository.delete(inventarioRoomDTO, null, this::sendOnError); } @@ -100,11 +125,15 @@ public class ElencoInventariViewModel { this.listener = listener; } - private void sendOnInventarioInfoRequest(RunnableArgss onComplete) { + private void sendOnInventarioInfoRequest(RunnableArgss onComplete) { if (listener != null) listener.onInventarioInfoRequest(onComplete); } - private void sendCreateInventarioRequest(int inventoryId, String zone) { + private void sendOnInventarioLoaded(InventarioRoomDTO inventarioRoomDTO, List listaArts) { + if (listener != null) listener.onInventarioLoaded(inventarioRoomDTO, listaArts); + } + + private void sendCreateInventarioRequest(long inventoryId, String zone) { if (this.listener != null) this.listener.onCreateInventarioRequest(inventoryId, zone); } @@ -122,9 +151,11 @@ public class ElencoInventariViewModel { public interface Listener extends ILoadingListener { - void onInventarioInfoRequest(RunnableArgss onComplete); + void onInventarioInfoRequest(RunnableArgss onComplete); - void onCreateInventarioRequest(int inventoryId, String zone); + void onInventarioLoaded(InventarioRoomDTO inventarioRoomDTO, List listaArts); + + void onCreateInventarioRequest(long inventoryId, String zone); void onError(Exception ex); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/inventario/dialogs/ask_info_inventario/DialogAskInfoInventarioView.java b/app/src/main/java/it/integry/integrywmsnative/gest/inventario/dialogs/ask_info_inventario/DialogAskInfoInventarioView.java index b576b13e..a53929bb 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/inventario/dialogs/ask_info_inventario/DialogAskInfoInventarioView.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/inventario/dialogs/ask_info_inventario/DialogAskInfoInventarioView.java @@ -11,12 +11,15 @@ import androidx.databinding.ObservableField; import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import org.apache.commons.lang3.StringUtils; + import javax.inject.Inject; import it.integry.integrywmsnative.MainApplication; import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.expansion.BaseDialogFragment; import it.integry.integrywmsnative.core.expansion.RunnableArgss; +import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.databinding.DialogAskInfoInventarioBinding; public class DialogAskInfoInventarioView extends BaseDialogFragment { @@ -24,21 +27,21 @@ public class DialogAskInfoInventarioView extends BaseDialogFragment { @Inject DialogAskInfoInventarioViewModel mViewModel; - private final RunnableArgss onConfirmed; + private final RunnableArgss onConfirmed; private final Runnable onAbort; - public ObservableField inventoryId = new ObservableField<>(); + public ObservableField inventoryId = new ObservableField<>(); public ObservableField zone = new ObservableField<>(); private DialogAskInfoInventarioBinding mBindings; private Context mContext; //Pass here all external parameters - public static DialogAskInfoInventarioView newInstance(RunnableArgss onConfirmed, Runnable onAbort) { + public static DialogAskInfoInventarioView newInstance(RunnableArgss onConfirmed, Runnable onAbort) { return new DialogAskInfoInventarioView(onConfirmed, onAbort); } - private DialogAskInfoInventarioView(RunnableArgss onConfirmed, Runnable onAbort) { + private DialogAskInfoInventarioView(RunnableArgss onConfirmed, Runnable onAbort) { super(); this.onConfirmed = onConfirmed; @@ -66,8 +69,12 @@ public class DialogAskInfoInventarioView extends BaseDialogFragment { .setView(mBindings.getRoot()) .setCancelable(cancelable) .setPositiveButton(R.string.ok, (dialog, which) -> { + var zone = UtilityString.empty2null(this.zone.get()); + if(zone != null) zone = StringUtils.capitalize(zone); + + if (this.onConfirmed != null) - this.onConfirmed.run(this.inventoryId.get(), this.zone.get()); + this.onConfirmed.run(this.inventoryId.get(), zone); }) .setNegativeButton(R.string.abort, (dialog, which) -> { if (this.onAbort != null) this.onAbort.run(); diff --git a/app/src/main/res/layout/fragment_elenco_inventario.xml b/app/src/main/res/layout/fragment_elenco_inventario.xml index 2239f82d..730607a2 100644 --- a/app/src/main/res/layout/fragment_elenco_inventario.xml +++ b/app/src/main/res/layout/fragment_elenco_inventario.xml @@ -17,6 +17,59 @@ android:orientation="vertical" tools:context=".gest.inventario.ElencoInventariFragment"> + + + + + + + + + + + + + + + + + + + + android:text="@{item.zona}" + app:visibility="@{UtilityString.isNullOrEmpty(item.zona) ? View.GONE : View.VISIBLE}" + android:textAllCaps="true" + tools:text="fresco" /> \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 033283c3..370893a4 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -208,6 +208,7 @@ Nessun ordine compatibile Nessun articolo Nessuna UL versata in produzione + Nessun inventario disponibile Il barcode scansionato non ha fornito alcun risultato diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a1847060..997fe930 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -207,7 +207,8 @@ No items to pick No documents to show No orders to dispatch - . + No inventory available + no compatible orders found No items No LU poured into production