From fbe095b7f709a462bb85aedbc7305beb5218c365 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 5 Aug 2021 13:07:05 +0200 Subject: [PATCH 01/18] Refactoring splash screen --- .idea/runConfigurations.xml | 13 - app/build.gradle | 5 +- app/src/main/AndroidManifest.xml | 2 +- .../integrywmsnative/MainApplication.java | 10 +- .../MainApplicationComponent.java | 14 +- .../MainApplicationModule.java | 38 ++- .../integrywmsnative/SplashActivity.java | 89 ++++--- .../SplashActivityComponent.java | 15 ++ .../SplashActivityModule.java | 7 + .../core/barcode_reader/BarcodeManager.java | 87 +++---- .../core/class_router/ClassRouter.java | 11 +- .../configs/BaseMenuConfiguration.java | 21 ++ .../configs/MenuConfiguration.java | 17 ++ .../core/context/AppContext.java | 22 +- .../core/context/MainContext.java | 82 ++++-- .../core/data_recover/ColliDataRecover.java | 235 ------------------ .../data_recover/ColliDataRecoverService.java | 24 +- .../core/menu/MenuRESTConsumer.java | 34 +++ .../core/menu/MenuRESTConsumerService.java | 13 + .../core/menu/MenuService.java | 36 +++ .../integrywmsnative/core/model/StbMenu.java | 217 ++++++++++++++++ .../core/settings/SettingsManager.java | 104 ++++---- .../core/utility/UtilityExceptions.java | 28 +-- .../core/utility/UtilitySettings.java | 7 +- .../gest/login/LoginActivity.java | 9 +- .../gest/login/viewmodel/LoginViewModel.java | 45 ++-- .../{ => gest/main}/MainActivity.java | 12 +- .../main}/MainActivityComponent.java | 2 +- .../{ => gest/main}/MainActivityModule.java | 2 +- .../gest/main/MainFragment.java | 31 ++- .../gest/main/MainFragmentComponent.java | 15 ++ .../gest/main/MainFragmentModule.java | 7 + app/src/main/res/layout/activity_splash.xml | 14 ++ app/src/main/res/layout/app_bar_main.xml | 2 +- app/src/main/res/layout/content_main.xml | 2 +- app/src/main/res/values/strings.xml | 1 + barcode_base_android_library/build.gradle | 6 +- .../interfaces/BarcodeReaderInterface.java | 2 +- build.gradle | 4 +- dynamic__base/build.gradle | 11 +- dynamic_agricoper/build.gradle | 24 +- dynamic_frudis/build.gradle | 7 +- dynamic_gramm/build.gradle | 11 +- dynamic_ime/build.gradle | 7 +- dynamic_saporiveri/build.gradle | 7 +- dynamic_saporiveri_pv/build.gradle | 7 +- dynamic_vgalimenti/build.gradle | 11 +- gradle.properties | 2 - gradle/wrapper/gradle-wrapper.properties | 2 +- honeywellscannerlibrary/build.gradle | 6 +- .../HoneyWellBarcodeReader.java | 22 +- keyobardemulatorscannerlibrary/build.gradle | 6 +- .../KeyboardEmulatorBarcodeReader.java | 8 +- pointmobilescannerlibrary/build.gradle | 6 +- .../PointMobileBarcodeReader.java | 8 +- zebrascannerlibrary/build.gradle | 6 +- 56 files changed, 827 insertions(+), 609 deletions(-) delete mode 100644 .idea/runConfigurations.xml create mode 100644 app/src/main/java/it/integry/integrywmsnative/SplashActivityComponent.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/SplashActivityModule.java delete mode 100644 app/src/main/java/it/integry/integrywmsnative/core/data_recover/ColliDataRecover.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/menu/MenuRESTConsumer.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/menu/MenuRESTConsumerService.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/menu/MenuService.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/model/StbMenu.java rename app/src/main/java/it/integry/integrywmsnative/{ => gest/main}/MainActivity.java (97%) rename app/src/main/java/it/integry/integrywmsnative/{ => gest/main}/MainActivityComponent.java (83%) rename app/src/main/java/it/integry/integrywmsnative/{ => gest/main}/MainActivityModule.java (70%) create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragmentComponent.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragmentModule.java diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index e497da99..00000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 30fcbe9b..52cb3ed7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -53,8 +53,9 @@ android { android.buildFeatures.dataBinding true compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } productFlavors { } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7da50e84..245da2b4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -34,7 +34,7 @@ android:screenOrientation="portrait" android:theme="@style/Light" /> diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplication.java b/app/src/main/java/it/integry/integrywmsnative/MainApplication.java index 00bfc562..b7ea2ff2 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplication.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplication.java @@ -4,6 +4,8 @@ import android.app.Application; import android.content.res.Configuration; import android.content.res.Resources; +import javax.inject.Inject; + import it.integry.integrywmsnative.core.context.AppContext; import it.integry.integrywmsnative.core.data_store.db.RoomModule; @@ -17,7 +19,8 @@ public class MainApplication extends Application { public static MainApplicationModule appModule; public static RoomModule roomModule; - private AppContext appContext = new AppContext(this); + @Inject + AppContext appContext; @@ -27,16 +30,15 @@ public class MainApplication extends Application { public void onCreate() { super.onCreate(); - appModule = new MainApplicationModule(MainApplication.this, this); + appModule = new MainApplicationModule(this); roomModule = new RoomModule(this); appComponent = DaggerMainApplicationComponent.builder() .mainApplicationModule(appModule) .roomModule(roomModule) .build(); - appComponent.inject(appContext); + appComponent.inject(this); - appContext.init(); res = getResources(); } diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java index 32d0c3ca..2b66ce0c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java @@ -7,6 +7,10 @@ import it.integry.integrywmsnative.core.context.AppContext; import it.integry.integrywmsnative.core.data_store.db.RoomModule; import it.integry.integrywmsnative.gest.accettazione_picking.AccettazionePickingComponent; import it.integry.integrywmsnative.gest.accettazione_picking.AccettazionePickingModule; +import it.integry.integrywmsnative.gest.main.MainActivityComponent; +import it.integry.integrywmsnative.gest.main.MainActivityModule; +import it.integry.integrywmsnative.gest.main.MainFragmentComponent; +import it.integry.integrywmsnative.gest.main.MainFragmentModule; import it.integry.integrywmsnative.gest.ordini_uscita_elenco.OrdiniUscitaElencoComponent; import it.integry.integrywmsnative.gest.ordini_uscita_elenco.OrdiniUscitaElencoModule; import it.integry.integrywmsnative.gest.picking_libero.PickingLiberoComponent; @@ -49,7 +53,9 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr // Definition of the Application graph @Singleton @Component(modules = { + SplashActivityModule.class, MainApplicationModule.class, + MainFragmentModule.class, RoomModule.class, MainActivityModule.class, PVOrdineAcquistoGrigliaModule.class, @@ -70,10 +76,13 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr VersamentoMerceModule.class, DialogAskMagazzinoProssimitaModule.class, DialogChooseBatchLotModule.class, - DialogRowInfoProdFabbisognoLineeProdModule.class}) + DialogRowInfoProdFabbisognoLineeProdModule.class +}) public interface MainApplicationComponent { + SplashActivityComponent.Factory splashActivityComponent(); MainActivityComponent.Factory mainActivityComponent(); + MainFragmentComponent.Factory mainFragmentComponent(); PVOrdineAcquistoGrigliaComponent.Factory pvOrdineAcquistoGrigliaComponent(); PVOrdineAcquistoEditComponent.Factory pvOrdineAcquistoEditComponent(); PickingLiberoComponent.Factory pickingLiberoComponent(); @@ -97,6 +106,7 @@ public interface MainApplicationComponent { ProdRientroMerceOrderDetailComponent.Factory prodRientroMerceOrderDetailComponent(); - void inject(AppContext appContext); + void inject(MainApplication mainApplication); + void inject(AppContext mainApplication); } diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java index 1bfcc0c1..c7f743f8 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java @@ -1,13 +1,16 @@ package it.integry.integrywmsnative; import android.app.Application; -import android.content.Context; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; +import it.integry.integrywmsnative.core.context.AppContext; +import it.integry.integrywmsnative.core.context.MainContext; import it.integry.integrywmsnative.core.data_recover.ColliDataRecoverService; +import it.integry.integrywmsnative.core.menu.MenuRESTConsumer; +import it.integry.integrywmsnative.core.menu.MenuService; import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.BarcodeRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; @@ -23,11 +26,9 @@ import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.rest.ProdFabb @Module public class MainApplicationModule { - private final Context mContext; private final Application mApplication; - public MainApplicationModule(Context context, Application application) { - this.mContext = context; + public MainApplicationModule(Application application) { this.mApplication = application; } @@ -37,10 +38,30 @@ public class MainApplicationModule { return mApplication; } + @Provides + @Singleton + AppContext providesAppContext() { + return new AppContext(mApplication); + } + + @Provides + @Singleton + MainContext providesMainContextNew(MenuService menuService) { + return new MainContext(mApplication.getApplicationContext(), menuService); + } + @Provides @Singleton ColliDataRecoverService provideColliDataRecoverService() { - return new ColliDataRecoverService(); + ColliDataRecoverService colliDataRecoverService = new ColliDataRecoverService(mApplication.getApplicationContext()); + colliDataRecoverService.init(); + return colliDataRecoverService; + } + + @Provides + @Singleton + MenuService provideMenuService(MenuRESTConsumer menuRESTConsumer) { + return new MenuService(menuRESTConsumer); } @Provides @@ -61,6 +82,12 @@ public class MainApplicationModule { return new ArticoloRESTConsumer(); } + @Provides + @Singleton + MenuRESTConsumer provideMenuRESTConsumer() { + return new MenuRESTConsumer(); + } + @Provides @Singleton MagazzinoRESTConsumer provideMagazzinoRESTConsumer() { @@ -110,5 +137,4 @@ public class MainApplicationModule { } - } diff --git a/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java b/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java index 7397d141..e9b0cec3 100644 --- a/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java @@ -5,6 +5,7 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.text.SpannableString; +import android.text.Spanned; import android.view.LayoutInflater; import androidx.databinding.DataBindingUtil; @@ -12,22 +13,29 @@ import androidx.databinding.DataBindingUtil; import java.util.ArrayList; import java.util.List; +import javax.inject.Inject; + import it.integry.integrywmsnative.core.context.MainContext; import it.integry.integrywmsnative.core.expansion.BaseActivity; import it.integry.integrywmsnative.core.expansion.RunnableArgsss; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.PermissionsHelper; import it.integry.integrywmsnative.core.utility.UtilityContext; +import it.integry.integrywmsnative.core.utility.UtilitySettings; import it.integry.integrywmsnative.databinding.ActivitySplashBinding; import it.integry.integrywmsnative.gest.login.LoginActivity; +import it.integry.integrywmsnative.gest.main.MainActivity; import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; -public class SplashActivity extends BaseActivity { +public class SplashActivity extends BaseActivity implements MainContext.Listener { private ActivitySplashBinding mBinding; - private MainContext mainContext = new MainContext(this); +// private MainContext mainContext = new MainContext(this); + + @Inject + MainContext mainContext; private RunnableArgsss> onRequestPermissionResult; @@ -35,32 +43,23 @@ public class SplashActivity extends BaseActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + MainApplication.appComponent + .splashActivityComponent() + .create() + .inject(this); + + mainContext.setListener(this); + mBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.activity_splash, null, false); setContentView(mBinding.getRoot()); UtilityContext.initMainActivity(this); - initAppVersion(); + initAppVersion(); initPermissions(this::init); } - private void initPermissions(Runnable onComplete) { - PermissionsHelper.askPermissions(this, () -> { - onComplete.run(); - }, permanentlyDenied -> { - if(permanentlyDenied) { - DialogSimpleMessageView.makeErrorDialog(new SpannableString(getText(R.string.permissions_permanently_denied)), null, () -> { - this.finish(); - }) - .show(getSupportFragmentManager(), "tag"); - } else { - initPermissions(onComplete); - } - }); - } - - private void initAppVersion() { try { PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0); @@ -68,7 +67,7 @@ public class SplashActivity extends BaseActivity { String debugText = ""; - if(BuildConfig.DEBUG) debugText += "\n[DEBUG VERSION]"; + if (BuildConfig.DEBUG) debugText += "\n[DEBUG VERSION]"; mBinding.appVersionTextview.setText("v" + version + debugText); } catch (PackageManager.NameNotFoundException e) { @@ -76,15 +75,39 @@ public class SplashActivity extends BaseActivity { } } + private void initPermissions(Runnable onComplete) { + PermissionsHelper.askPermissions(this, onComplete, permanentlyDenied -> { + if (permanentlyDenied) { + onError(new SpannableString(getText(R.string.permissions_permanently_denied))); + + } else { + initPermissions(onComplete); + } + }); + } + private void init() { - if(!SettingsManager.i().isUserLoggedIn()){ + if (!SettingsManager.i().isUserLoggedIn()) { startLoginActivity(); } else { - mainContext.init(this::startMainActivity); + mainContext.init(); } } + @Override + public void onDBDataLoading(String item) { + mBinding.loadingInfoTextview.setText("Caricamento " + item); + } + @Override + public void onMenuLoading() { + mBinding.loadingInfoTextview.setText("Caricamento menĂ¹"); + } + + @Override + public void onContextInitialized() { + startMainActivity(); + } public void setOnRequestPermissionsResult(RunnableArgsss> onRequestPermissionResult) { @@ -95,9 +118,9 @@ public class SplashActivity extends BaseActivity { @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if(this.onRequestPermissionResult != null) { + if (this.onRequestPermissionResult != null) { List grantResultsList = new ArrayList<>(); - for(int i = 0; i < grantResults.length; i++) { + for (int i = 0; i < grantResults.length; i++) { grantResultsList.add(grantResults[i]); } @@ -106,20 +129,28 @@ public class SplashActivity extends BaseActivity { } - - - - private void startLoginActivity(){ + private void startLoginActivity() { this.finish(); Intent myIntent = new Intent(this, LoginActivity.class); startActivity(myIntent); } - private void startMainActivity(){ + private void startMainActivity() { this.finish(); Intent myIntent = new Intent(this, MainActivity.class); startActivity(myIntent); } + @Override + public void onError(Spanned message) { + + DialogSimpleMessageView.makeErrorDialog( + message, null, this::finish, R.string.logout, () -> { + UtilitySettings.logout(() -> { + MainApplication.exit(); + }); + }) + .show(this.getSupportFragmentManager(), "tag"); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/SplashActivityComponent.java b/app/src/main/java/it/integry/integrywmsnative/SplashActivityComponent.java new file mode 100644 index 00000000..a5d85b45 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/SplashActivityComponent.java @@ -0,0 +1,15 @@ +package it.integry.integrywmsnative; + +import dagger.Subcomponent; + +@Subcomponent +public interface SplashActivityComponent { + + @Subcomponent.Factory + interface Factory { + + SplashActivityComponent create(); + } + + void inject(SplashActivity mainActivity); +} diff --git a/app/src/main/java/it/integry/integrywmsnative/SplashActivityModule.java b/app/src/main/java/it/integry/integrywmsnative/SplashActivityModule.java new file mode 100644 index 00000000..923dabb8 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/SplashActivityModule.java @@ -0,0 +1,7 @@ +package it.integry.integrywmsnative; + +import dagger.Module; + +@Module(subcomponents = SplashActivityComponent.class) +public class SplashActivityModule { +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/barcode_reader/BarcodeManager.java b/app/src/main/java/it/integry/integrywmsnative/core/barcode_reader/BarcodeManager.java index cb83f66f..85924b83 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/barcode_reader/BarcodeManager.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/barcode_reader/BarcodeManager.java @@ -1,33 +1,27 @@ package it.integry.integrywmsnative.core.barcode_reader; +import android.content.Context; import android.view.KeyEvent; -import androidx.appcompat.app.AppCompatActivity; - import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.List; -import it.integry.barcode_base_android_library.exception.BarcodeAdapterNotFoundException; import it.integry.barcode_base_android_library.interfaces.BarcodeReaderInterface; import it.integry.honeywellscannerlibrary.HoneyWellBarcodeReader; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.integrywmsnative.core.utility.UtilityLogger; import it.integry.keyobardemulatorscannerlibrary.KeyboardEmulatorBarcodeReader; import it.integry.pointmobilescannerlibrary.PointMobileBarcodeReader; import it.integry.zebrascannerlibrary.ZebraBarcodeReader; public class BarcodeManager { - private static AppCompatActivity context; - private static BarcodeReaderInterface mCurrentBarcodeInterface; - private static List mBarcodeCallbacksStacktrace = new ArrayList<>(); + private static final List mBarcodeCallbacksStacktrace = new ArrayList<>(); private static boolean mEnabled = true; - private static Class[] registeredBarcodeReaderInterfaces = new Class[]{ + private static final Class[] registeredBarcodeReaderInterfaces = new Class[]{ PointMobileBarcodeReader.class, ZebraBarcodeReader.class, HoneyWellBarcodeReader.class, @@ -35,73 +29,60 @@ public class BarcodeManager { }; - public static void init(AppCompatActivity context) { - BarcodeManager.context = context; + public static void init(Context applicationContext) throws Exception { - initBarcodeReader(); + initBarcodeReader(applicationContext); } - private static void initBarcodeReader() { + private static void initBarcodeReader(Context applicationContext) throws Exception { - for (Class readerInterface : registeredBarcodeReaderInterfaces){ + for (Class readerInterface : registeredBarcodeReaderInterfaces) { - Constructor cons = null; - try { - cons = Class.forName(readerInterface.getName()).getConstructors()[0]; - BarcodeReaderInterface object = (BarcodeReaderInterface) cons.newInstance(context); + Constructor cons = Class.forName(readerInterface.getName()).getConstructors()[0]; + BarcodeReaderInterface object = (BarcodeReaderInterface) cons.newInstance(applicationContext); - if(object.isRightAdapter()) { - mCurrentBarcodeInterface = object; - break; - } - - - } catch (Exception e) { - UtilityExceptions.defaultException(context,e); + if (object.isRightAdapter()) { + mCurrentBarcodeInterface = object; + break; } + + } - if(mCurrentBarcodeInterface != null) { + if (mCurrentBarcodeInterface != null) { - try { - mCurrentBarcodeInterface.init(() -> { - - mCurrentBarcodeInterface.register(data -> { - BarcodeCallbackDTO callback = getValidCallback(); - if(callback != null && mEnabled) { - callback.getOnScanSuccessfull().run(data); - } - }, ex -> { - BarcodeCallbackDTO callback = getValidCallback(); - if(callback != null && mEnabled) { - callback.getOnScanFailed().run(ex); - } - }); + mCurrentBarcodeInterface.init(() -> { + mCurrentBarcodeInterface.register(data -> { + BarcodeCallbackDTO callback = getValidCallback(); + if (callback != null && mEnabled) { + callback.getOnScanSuccessfull().run(data); + } + }, ex -> { + BarcodeCallbackDTO callback = getValidCallback(); + if (callback != null && mEnabled) { + callback.getOnScanFailed().run(ex); + } }); - } catch (BarcodeAdapterNotFoundException ex) { - UtilityExceptions.defaultException(context, ex); - } - + }); } - } private static BarcodeCallbackDTO getValidCallback() { - if(mBarcodeCallbacksStacktrace.size() > 0) { - return mBarcodeCallbacksStacktrace.get(mBarcodeCallbacksStacktrace.size() -1); + if (mBarcodeCallbacksStacktrace.size() > 0) { + return mBarcodeCallbacksStacktrace.get(mBarcodeCallbacksStacktrace.size() - 1); } else { return null; } } - public static boolean onKeyDown(int keyCode, KeyEvent keyEvent){ + public static boolean onKeyDown(int keyCode, KeyEvent keyEvent) { if (mCurrentBarcodeInterface != null) - mCurrentBarcodeInterface.onKeyEvent(keyEvent); + mCurrentBarcodeInterface.onKeyEvent(keyEvent); return true; } @@ -113,8 +94,8 @@ public class BarcodeManager { int newID = -1; - if(mBarcodeCallbacksStacktrace.size() > 0) { - newID = mBarcodeCallbacksStacktrace.get(mBarcodeCallbacksStacktrace.size() -1).getID() + 1; + if (mBarcodeCallbacksStacktrace.size() > 0) { + newID = mBarcodeCallbacksStacktrace.get(mBarcodeCallbacksStacktrace.size() - 1).getID() + 1; } else { newID = 1; } @@ -131,7 +112,7 @@ public class BarcodeManager { //Rimuovo la callback con l'ID trovato e tutte quelle con >ID in modo che rimuovo tutte le call aggiunte successivamente for (int i = 0; i < mBarcodeCallbacksStacktrace.size(); i++) { - if(mBarcodeCallbacksStacktrace.get(i).getID() == ID || callbackObjFound) { + if (mBarcodeCallbacksStacktrace.get(i).getID() == ID || callbackObjFound) { mBarcodeCallbacksStacktrace.remove(i); callbackObjFound = true; diff --git a/app/src/main/java/it/integry/integrywmsnative/core/class_router/ClassRouter.java b/app/src/main/java/it/integry/integrywmsnative/core/class_router/ClassRouter.java index bf917c1f..969920f7 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/class_router/ClassRouter.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/class_router/ClassRouter.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.List; import it.integry.integrywmsnative.core.class_router.exceptions.MethodPathNotRegisteredException; +import it.integry.integrywmsnative.core.utility.UtilityExceptions; public class ClassRouter { @@ -21,8 +22,8 @@ public class ClassRouter { private static List> mRouteClasses = new ArrayList<>(); - public static void init(Context context) { - ClassRouter.context = context; + public static void init() { +// ClassRouter.context = context; } private static boolean checkIClassExists(PATH path) { @@ -51,9 +52,7 @@ public class ClassRouter { try { mRouteClasses.add(new Pair<>(path, clazz.newInstance())); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InstantiationException e) { + } catch (IllegalAccessException | InstantiationException e) { e.printStackTrace(); } } @@ -77,7 +76,7 @@ public class ClassRouter { return (T)instance; } catch (MethodPathNotRegisteredException ex) { - // UtilityExceptions.defaultException(null, ex, true); + UtilityExceptions.defaultException(null, ex, true); } return null; diff --git a/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/BaseMenuConfiguration.java b/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/BaseMenuConfiguration.java index d082f900..b4bace12 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/BaseMenuConfiguration.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/BaseMenuConfiguration.java @@ -32,6 +32,8 @@ public class BaseMenuConfiguration { @IdRes private int mGroupId; + private String codMenu; + private List mItems = new ArrayList<>(); public @IdRes int getGroupId() { @@ -52,6 +54,15 @@ public class BaseMenuConfiguration { return this; } + public String getCodMenu() { + return codMenu; + } + + public MenuGroup setCodMenu(String codMenu) { + this.codMenu = codMenu; + return this; + } + public List getItems() { return mItems; } @@ -67,6 +78,7 @@ public class BaseMenuConfiguration { @StringRes private int mTitleText; @DrawableRes private int mTitleIcon; @DrawableRes private int mDrawerIcon; + private String codMenu; private RunnableWithReturn fragmentFactory; public int getID() { @@ -105,6 +117,15 @@ public class BaseMenuConfiguration { return this; } + public String getCodMenu() { + return codMenu; + } + + public MenuItem setCodMenu(String codMenu) { + this.codMenu = codMenu; + return this; + } + public RunnableWithReturn getFragmentFactory() { return fragmentFactory; } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/MenuConfiguration.java b/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/MenuConfiguration.java index 457c5833..9862b4e4 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/MenuConfiguration.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/MenuConfiguration.java @@ -24,9 +24,11 @@ public class MenuConfiguration extends BaseMenuConfiguration { new MenuGroup() .setGroupText(R.string.purchase) .setGroupId(R.id.nav_group_acquisto) + .setCodMenu("MM008") .addItem(new MenuItem() .setID(R.id.nav_accettazione) + .setCodMenu("MG044") .setTitleText(R.string.accettazione_title_fragment) .setTitleIcon(R.drawable.ic_dashboard_accettazione) .setDrawerIcon(R.drawable.ic_black_download) @@ -34,6 +36,7 @@ public class MenuConfiguration extends BaseMenuConfiguration { .addItem(new MenuItem() .setID(R.id.nav_resi_fornitore) + .setCodMenu("MG045") .setTitleText(R.string.fragment_ultime_arrivi_fornitore_title) .setTitleIcon(R.drawable.ic_latest_delivery) .setDrawerIcon(R.drawable.ic_black_latest_delivery) @@ -42,9 +45,11 @@ public class MenuConfiguration extends BaseMenuConfiguration { new MenuGroup() .setGroupText(R.string.checkout) .setGroupId(R.id.nav_group_spedizione) + .setCodMenu("MM010") .addItem(new MenuItem() .setID(R.id.nav_spedizione) + .setCodMenu("MG046") .setTitleText(R.string.vendita_title_fragment) .setTitleIcon(R.drawable.ic_dashboard_spedizione) .setDrawerIcon(R.drawable.ic_black_upload) @@ -52,6 +57,7 @@ public class MenuConfiguration extends BaseMenuConfiguration { .addItem(new MenuItem() .setID(R.id.nav_free_picking) + .setCodMenu("MG047") .setTitleText(R.string.free_picking) .setTitleIcon(R.drawable.ic_dashboard_picking_libero) .setDrawerIcon(R.drawable.ic_black_barcode_scanner) @@ -59,6 +65,7 @@ public class MenuConfiguration extends BaseMenuConfiguration { .addItem(new MenuItem() .setID(R.id.nav_resi_cliente) + .setCodMenu("MG048") .setTitleText(R.string.fragment_ultime_consegne_cliente_title) .setTitleIcon(R.drawable.ic_latest_delivery_customer) .setDrawerIcon(R.drawable.ic_black_latest_delivery) @@ -66,9 +73,11 @@ public class MenuConfiguration extends BaseMenuConfiguration { ).addGroup(new MenuGroup() .setGroupText(R.string.manufacture) .setGroupId(R.id.nav_group_produzione) + .setCodMenu("MM009") .addItem(new MenuItem() .setID(R.id.nav_prod_ordine_produzione) + .setCodMenu("MG049") .setTitleText(R.string.prod_ordine_produzione_title_fragment) .setTitleIcon(R.drawable.ic_dashboard_prod_accettazione_produzione) .setDrawerIcon(R.drawable.ic_black_external) @@ -76,6 +85,7 @@ public class MenuConfiguration extends BaseMenuConfiguration { .addItem(new MenuItem() .setID(R.id.nav_prod_ordine_lavorazione) + .setCodMenu("MG050") .setTitleText(R.string.prod_ordine_lavorazione_title_fragment) .setTitleIcon(R.drawable.ic_dashboard_prod_picking_lavorazione) .setDrawerIcon(R.drawable.ic_black_external) @@ -83,6 +93,7 @@ public class MenuConfiguration extends BaseMenuConfiguration { .addItem(new MenuItem() .setID(R.id.nav_free_lav_picking) + .setCodMenu("MG051") .setTitleText(it.integry.integrywmsnative.R.string.free_lav_picking) .setTitleIcon(R.drawable.ic_dashboard_prod_picking_libero) .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_barcode_scanner) @@ -90,6 +101,7 @@ public class MenuConfiguration extends BaseMenuConfiguration { .addItem(new MenuItem() .setID(R.id.nav_prod_posizionamento_da_ord) + .setCodMenu("MG052") .setTitleText(R.string.prod_fabbisogno_linee_prod_title) .setTitleIcon(R.drawable.ic_dashboard_prod_versamento_merce) .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_load_shelf) @@ -97,6 +109,7 @@ public class MenuConfiguration extends BaseMenuConfiguration { .addItem(new MenuItem() .setID(R.id.nav_prod_versamento_materiale) + .setCodMenu("MG053") .setTitleText(R.string.prod_versamento_materiale_title_fragment) .setTitleIcon(R.drawable.ic_dashboard_prod_versamento_materiale) .setDrawerIcon(R.drawable.ic_black_external) @@ -104,6 +117,7 @@ public class MenuConfiguration extends BaseMenuConfiguration { .addItem(new MenuItem() .setID(R.id.nav_prod_recupero_materiale) + .setCodMenu("MG054") .setTitleText(R.string.prod_recupero_materiale_title_fragment) .setTitleIcon(R.drawable.ic_dashboard_prod_recupero_materiale) .setDrawerIcon(R.drawable.ic_black_external) @@ -113,9 +127,11 @@ public class MenuConfiguration extends BaseMenuConfiguration { new MenuGroup() .setGroupText(R.string.internal_handling) .setGroupId(R.id.nav_group_movimentazione_interna) + .setCodMenu("MM011") .addItem(new MenuItem() .setID(R.id.nav_versamento_merce) + .setCodMenu("MG055") .setTitleText(R.string.versamento_merce_fragment_title) .setTitleIcon(R.drawable.ic_dashboard_versamento_merce) .setDrawerIcon(R.drawable.ic_black_load_shelf) @@ -123,6 +139,7 @@ public class MenuConfiguration extends BaseMenuConfiguration { .addItem(new MenuItem() .setID(R.id.nav_rettifica_giacenze) + .setCodMenu("MG056") .setTitleText(R.string.rettifica_giacenze_fragment_title) .setTitleIcon(R.drawable.ic_dashboard_rettifica_giacenze) .setDrawerIcon(R.drawable.ic_black_empty_box) diff --git a/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java b/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java index 3498373e..d1148d7e 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java @@ -7,8 +7,10 @@ import com.orhanobut.logger.AndroidLogAdapter; import com.orhanobut.logger.Logger; import javax.inject.Inject; +import javax.inject.Singleton; import it.integry.integrywmsnative.BuildConfig; +import it.integry.integrywmsnative.MainApplication; import it.integry.integrywmsnative.core.data_store.db.AppDatabase; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.settings.Stash; @@ -18,20 +20,26 @@ import it.integry.integrywmsnative.core.utility.UtilitySettings; import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.core.utility.UtilityToast; +@Singleton public class AppContext { //Note: this is the Application Context NOT the Activity Context - private final Context mContext; + private final Context mApplicationContext; @Inject AppDatabase mAppDatabase; public AppContext(Context context) { - this.mContext = context; + this.mApplicationContext = context; + + MainApplication.appComponent + .inject(this); } + + @Inject public void init() { this.initUtilities(); @@ -45,8 +53,8 @@ public class AppContext { private void initSettings() { - Stash.init(mContext); - SettingsManager.init(mContext); + Stash.init(mApplicationContext); + SettingsManager.init(mApplicationContext); } private void initCrashlytics() { @@ -64,9 +72,9 @@ public class AppContext { } private void initUtilities() { - UtilityContext.initApplicationContext(mContext); - UtilityResources.init(mContext); - UtilityToast.init(mContext); + UtilityContext.initApplicationContext(mApplicationContext); + UtilityResources.init(mApplicationContext); + UtilityToast.init(mApplicationContext); UtilitySettings.init(mAppDatabase); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java b/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java index 63b81354..a94fb49f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java @@ -4,45 +4,51 @@ import android.content.Context; import android.text.Html; import android.text.SpannableString; import android.text.Spanned; - -import androidx.appcompat.app.AppCompatActivity; +import android.text.SpannedString; import java.lang.reflect.Method; import java.net.ConnectException; -import it.integry.integrywmsnative.MainApplication; -import it.integry.integrywmsnative.R; +import javax.inject.Singleton; + import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; import it.integry.integrywmsnative.core.class_router.ClassRouter; -import it.integry.integrywmsnative.core.data_recover.ColliDataRecover; +import it.integry.integrywmsnative.core.menu.MenuService; import it.integry.integrywmsnative.core.rest.watcher.ServerStatusChecker; import it.integry.integrywmsnative.core.settings.SettingsManager; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.integrywmsnative.core.utility.UtilitySettings; -import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; +@Singleton public class MainContext { - private final AppCompatActivity mContext; + private final Context applicationContext; + private final MenuService menuService; - public MainContext(AppCompatActivity context) { - this.mContext = context; + private Listener mListener; + + public MainContext(Context applicationContext, MenuService menuService) { + this.applicationContext = applicationContext; + this.menuService = menuService; } + public void init() { - public void init(Runnable onContextInitialized) { + try { + BarcodeManager.init(applicationContext); + } catch (Exception exception) { - BarcodeManager.init(mContext); + } this.initDBData(() -> { - onContextInitialized.run(); + this.initMenu(() -> { + + this.initReflections(); + if (mListener != null) mListener.onContextInitialized(); + }); }); - this.initReflections(); this.initServerStatusChecker(); - ColliDataRecover.init(mContext); } @@ -51,7 +57,13 @@ public class MainContext { } private void initDBData(Runnable onComplete) { - SettingsManager.loadDBVariables(onComplete, ex -> { + + + SettingsManager.loadDBVariables(item -> { + if (mListener != null) mListener.onDBDataLoading(item); + }, + onComplete, + ex -> { Spanned message = null; @@ -63,18 +75,21 @@ public class MainContext { message = new SpannableString(ex.getMessage()); } - DialogSimpleMessageView.makeErrorDialog( - message, null, mContext::finish, R.string.logout, () -> { - UtilitySettings.logout(); - MainApplication.exit(); - }) - .show(mContext.getSupportFragmentManager(), "tag"); + if (mListener != null) mListener.onError(message); + } ); } + private void initMenu(Runnable onComplete) { + if (mListener != null) mListener.onMenuLoading(); + this.menuService.init(onComplete, ex -> { + if (mListener != null) mListener.onError(new SpannedString(ex.getMessage())); + }); + } + private void initReflections() { - ClassRouter.init(mContext); + ClassRouter.init(); try { String initMethod = "init"; @@ -87,14 +102,29 @@ public class MainContext { // for static methods we can use null as instance of class final Object newInstance = dynamicContextClass.newInstance(); - m.invoke(newInstance, (Context) mContext); + m.invoke(newInstance, applicationContext); break; } } } catch (Exception e) { - UtilityExceptions.defaultException(mContext, e, true); +// UtilityExceptions.defaultException(mContext, e, true); } } + + public MainContext setListener(Listener listener) { + this.mListener = listener; + return this; + } + + public interface Listener { + void onDBDataLoading(String item); + + void onMenuLoading(); + + void onContextInitialized(); + + void onError(Spanned message); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/data_recover/ColliDataRecover.java b/app/src/main/java/it/integry/integrywmsnative/core/data_recover/ColliDataRecover.java deleted file mode 100644 index 3c5a7ba2..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/core/data_recover/ColliDataRecover.java +++ /dev/null @@ -1,235 +0,0 @@ -package it.integry.integrywmsnative.core.data_recover; - -import android.content.Context; - -import androidx.appcompat.app.AppCompatActivity; - -import com.annimon.stream.Optional; -import com.annimon.stream.Stream; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import it.integry.integrywmsnative.core.CommonConst; -import it.integry.integrywmsnative.core.model.MtbColt; -import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; - -public class ColliDataRecover { - - public static class RecoverDTO { - private int id; - private int numCollo; - private String serCollo; - private String dataCollo; - private String gestioneCollo; - private String filtro; - - private List testateOrdini; - - public int getId() { - return id; - } - - public RecoverDTO setId(int id) { - this.id = id; - return this; - } - - public int getNumCollo() { - return numCollo; - } - - public RecoverDTO setNumCollo(int numCollo) { - this.numCollo = numCollo; - return this; - } - - public String getSerCollo() { - return serCollo; - } - - public RecoverDTO setSerCollo(String serCollo) { - this.serCollo = serCollo; - return this; - } - - public String getDataCollo() { - return dataCollo; - } - - public RecoverDTO setDataCollo(String dataCollo) { - this.dataCollo = dataCollo; - return this; - } - - public String getGestioneCollo() { - return gestioneCollo; - } - - public RecoverDTO setGestioneCollo(String gestioneCollo) { - this.gestioneCollo = gestioneCollo; - return this; - } - - public String getFiltro() { - return filtro; - } - - public RecoverDTO setFiltro(String filtro) { - this.filtro = filtro; - return this; - } - - public List getTestateOrdini() { - return testateOrdini; - } - - public RecoverDTO setTestateOrdini(List testateOrdini) { - this.testateOrdini = testateOrdini; - return this; - } - - - public MtbColt getMtbColt() { - return new MtbColt() - .setNumCollo(getNumCollo()) - .setSerCollo(getSerCollo()) - .setGestione(getGestioneCollo()) - .setDataCollo(getDataCollo()) - .setFiltroOrdini(getFiltro()); - } - } - - private static AppCompatActivity mContext; - - private static List mtbColtsSessions = new ArrayList<>(); - - public static void init(AppCompatActivity context) { - mContext = context; - - if(isFilePresent(CommonConst.Files.RECOVER_COLLO_FILE)) { - loadLocalFile(); - } - } - - public static boolean thereIsAnExistantSession() { - return mtbColtsSessions != null && mtbColtsSessions.size() > 0; - } - - public static List getAllSessionIDs() { - if(thereIsAnExistantSession()) { - - return Stream.of(mtbColtsSessions) - .map(RecoverDTO::getId) - .toList(); - - } else return null; - } - - public static RecoverDTO getSession(Integer sessionID) { - - if(sessionID == null) return null; - - return getIfExists(sessionID); - } - - private static RecoverDTO getIfExists(int id) { - Optional recoverDTOOptional = Stream.of(mtbColtsSessions) - .filter(x -> x.getId() == id) - .findSingle(); - - - return recoverDTOOptional.isPresent() ? recoverDTOOptional.get() : null; - } - - public static int startNewSession(MtbColt mtbColtSession, List testateOrdini) { - Integer newId = null; - - while(newId == null) { - int randomId = new Random().nextInt(1000); - RecoverDTO dto = getIfExists(randomId); - if(dto == null) newId = randomId; - } - - - RecoverDTO recoverDTO = new RecoverDTO() - .setId(newId) - .setDataCollo(mtbColtSession.getDataColloS()) - .setNumCollo(mtbColtSession.getNumCollo()) - .setSerCollo(mtbColtSession.getSerCollo()) - .setGestioneCollo(mtbColtSession.getGestione()) - .setFiltro(mtbColtSession.getFiltroOrdini()) - .setTestateOrdini(testateOrdini); - - mtbColtsSessions.add(recoverDTO); - updateLocalFile(); - return newId; - } - - public static void closeSession(int ID) { - RecoverDTO dto = getIfExists(ID); - - if(dto != null) { - mtbColtsSessions.remove(dto); - updateLocalFile(); - } - } - - - private static void loadLocalFile() { - InputStream inputStream; - - Gson gson = new Gson(); - - try { - inputStream = mContext.openFileInput(CommonConst.Files.RECOVER_COLLO_FILE); - - byte[] bytes = new byte[inputStream.available()]; - inputStream.read(bytes); - inputStream.close(); - - String jsonString = new String(bytes); - - Type listType = new TypeToken>(){}.getType(); - mtbColtsSessions = gson.fromJson(jsonString, listType); - - if(mtbColtsSessions == null) mtbColtsSessions = new ArrayList<>(); - } catch (Exception e) { - e.printStackTrace(); - UtilityExceptions.defaultException(mContext, e); - } - } - - - private static void updateLocalFile() { - FileOutputStream outputStream; - - Gson gson = new Gson(); - String jsonText = gson.toJson(mtbColtsSessions); - - try { - outputStream = mContext.openFileOutput(CommonConst.Files.RECOVER_COLLO_FILE, Context.MODE_PRIVATE); - outputStream.write(jsonText.getBytes()); - outputStream.close(); - } catch (Exception e) { - e.printStackTrace(); - UtilityExceptions.defaultException(mContext, e); - } - } - - private static boolean isFilePresent(String fileName) { - String path = mContext.getFilesDir().getAbsolutePath() + "/" + fileName; - File file = new File(path); - return file.exists(); - } - - -} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/data_recover/ColliDataRecoverService.java b/app/src/main/java/it/integry/integrywmsnative/core/data_recover/ColliDataRecoverService.java index ca313714..c19968d8 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/data_recover/ColliDataRecoverService.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/data_recover/ColliDataRecoverService.java @@ -2,8 +2,6 @@ package it.integry.integrywmsnative.core.data_recover; import android.content.Context; -import androidx.appcompat.app.AppCompatActivity; - import com.annimon.stream.Optional; import com.annimon.stream.Stream; import com.google.android.gms.common.util.IOUtils; @@ -24,22 +22,20 @@ import javax.inject.Singleton; import it.integry.integrywmsnative.core.CommonConst; import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; @Singleton public class ColliDataRecoverService { - private AppCompatActivity mContext; + private final Context mApplicationContext; private List mtbColtsSessions = new ArrayList<>(); - @Inject - public ColliDataRecoverService() { + public ColliDataRecoverService(Context applicationContext) { + this.mApplicationContext = applicationContext; } - public void init(AppCompatActivity appCompatActivity) { - this.mContext = appCompatActivity; - + @Inject + public void init() { if(isFilePresent(CommonConst.Files.RECOVER_COLLO_FILE)) { loadLocalFile(); } @@ -114,7 +110,7 @@ public class ColliDataRecoverService { Gson gson = new Gson(); try { - inputStream = mContext.openFileInput(CommonConst.Files.RECOVER_COLLO_FILE); + inputStream = mApplicationContext.openFileInput(CommonConst.Files.RECOVER_COLLO_FILE); byte[] bytes = IOUtils.readInputStreamFully(inputStream); String jsonString = new String(bytes); @@ -125,7 +121,7 @@ public class ColliDataRecoverService { inputStream.close(); } catch (Exception e) { e.printStackTrace(); - UtilityExceptions.defaultException(mContext, e); +// UtilityExceptions.defaultException(mContext, e); } } @@ -137,17 +133,17 @@ public class ColliDataRecoverService { String jsonText = gson.toJson(mtbColtsSessions); try { - outputStream = mContext.openFileOutput(CommonConst.Files.RECOVER_COLLO_FILE, Context.MODE_PRIVATE); + outputStream = mApplicationContext.openFileOutput(CommonConst.Files.RECOVER_COLLO_FILE, Context.MODE_PRIVATE); outputStream.write(jsonText.getBytes()); outputStream.close(); } catch (Exception e) { e.printStackTrace(); - UtilityExceptions.defaultException(mContext, e); +// UtilityExceptions.defaultException(mContext, e); } } private boolean isFilePresent(String fileName) { - String path = mContext.getFilesDir().getAbsolutePath() + "/" + fileName; + String path = mApplicationContext.getFilesDir().getAbsolutePath() + "/" + fileName; File file = new File(path); return file.exists(); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/menu/MenuRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/menu/MenuRESTConsumer.java new file mode 100644 index 00000000..6ed857c3 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/menu/MenuRESTConsumer.java @@ -0,0 +1,34 @@ +package it.integry.integrywmsnative.core.menu; + +import javax.inject.Singleton; + +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.model.StbMenu; +import it.integry.integrywmsnative.core.rest.RESTBuilder; +import it.integry.integrywmsnative.core.rest.consumers._BaseRESTConsumer; +import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +@Singleton +public class MenuRESTConsumer extends _BaseRESTConsumer { + + public void retrieveMenu(String rootCodOpz, RunnableArgs onComplete, RunnableArgs onFailed) { + MenuRESTConsumerService menuRESTConsumerService = RESTBuilder.getService(MenuRESTConsumerService.class); + menuRESTConsumerService.retrieveMenuConfig(rootCodOpz).enqueue(new Callback<>() { + @Override + public void onResponse(Call> call, Response> response) { + analyzeAnswer(response, "retrieveMenu", (m) -> { + onComplete.run(response.body().getEntity()); + }, onFailed); + } + + @Override + public void onFailure(Call> call, Throwable t) { + onFailed.run(new Exception(t)); + } + }); + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/menu/MenuRESTConsumerService.java b/app/src/main/java/it/integry/integrywmsnative/core/menu/MenuRESTConsumerService.java new file mode 100644 index 00000000..5013008d --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/menu/MenuRESTConsumerService.java @@ -0,0 +1,13 @@ +package it.integry.integrywmsnative.core.menu; + +import it.integry.integrywmsnative.core.model.StbMenu; +import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface MenuRESTConsumerService { + + @GET("retrieveMenuConfig") + Call> retrieveMenuConfig(@Query("rootCodOpz") String rootCodOpz); +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/menu/MenuService.java b/app/src/main/java/it/integry/integrywmsnative/core/menu/MenuService.java new file mode 100644 index 00000000..3fe5466d --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/menu/MenuService.java @@ -0,0 +1,36 @@ +package it.integry.integrywmsnative.core.menu; + +import java.util.List; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.model.StbMenu; + +@Singleton +public class MenuService { + + private static final String MENU_COD_OPZ = "MM007"; + + private final MenuRESTConsumer menuRESTConsumer; + + private List mInternalCachedMenu; + + @Inject + public MenuService(MenuRESTConsumer menuRESTConsumer) { + this.menuRESTConsumer = menuRESTConsumer; + } + + public void init(Runnable onMenuInitialized, RunnableArgs onFailed) { + menuRESTConsumer.retrieveMenu(MENU_COD_OPZ, menu -> { + if(menu != null) this.mInternalCachedMenu = menu.getStbMenuChildren(); + onMenuInitialized.run(); + }, onFailed); + } + + public void getMenu() { + + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/model/StbMenu.java b/app/src/main/java/it/integry/integrywmsnative/core/model/StbMenu.java new file mode 100644 index 00000000..f1b39678 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/model/StbMenu.java @@ -0,0 +1,217 @@ +package it.integry.integrywmsnative.core.model; + +import java.util.ArrayList; +import java.util.List; + +public class StbMenu extends EntityBase { + + public StbMenu() { + this.type = "stb_menu"; + } + + private String codOpz; + private String codParent; + private String tipoAzienda; + private String descrizione; + private String descrizioneEstesa; + private String entityName; + private String flagAttivo; + private String flagPrinterSetup; + private String gestName; + private String note; + private String objectType; + private String openType; + private String parameter; + private String pictureMenu; + private String pictureSelect; + private Integer pos; + private Integer posCliente; + private Integer posTipoAzienda; + private String urlDescrizione; + + private final List stbMenuChildren = new ArrayList<>(); + + public String getCodOpz() { + return codOpz; + } + + public StbMenu setCodOpz(String codOpz) { + this.codOpz = codOpz; + return this; + } + + public String getCodParent() { + return codParent; + } + + public StbMenu setCodParent(String codParent) { + this.codParent = codParent; + return this; + } + + public String getTipoAzienda() { + return tipoAzienda; + } + + public StbMenu setTipoAzienda(String tipoAzienda) { + this.tipoAzienda = tipoAzienda; + return this; + } + + public String getDescrizione() { + return descrizione; + } + + public StbMenu setDescrizione(String descrizione) { + this.descrizione = descrizione; + return this; + } + + public String getDescrizioneEstesa() { + return descrizioneEstesa; + } + + public StbMenu setDescrizioneEstesa(String descrizioneEstesa) { + this.descrizioneEstesa = descrizioneEstesa; + return this; + } + + public String getEntityName() { + return entityName; + } + + public StbMenu setEntityName(String entityName) { + this.entityName = entityName; + return this; + } + + public String getFlagAttivo() { + return flagAttivo; + } + + public StbMenu setFlagAttivo(String flagAttivo) { + this.flagAttivo = flagAttivo; + return this; + } + + public String getFlagPrinterSetup() { + return flagPrinterSetup; + } + + public StbMenu setFlagPrinterSetup(String flagPrinterSetup) { + this.flagPrinterSetup = flagPrinterSetup; + return this; + } + + public String getGestName() { + return gestName; + } + + public StbMenu setGestName(String gestName) { + this.gestName = gestName; + return this; + } + + public String getNote() { + return note; + } + + public StbMenu setNote(String note) { + this.note = note; + return this; + } + + public String getObjectType() { + return objectType; + } + + public StbMenu setObjectType(String objectType) { + this.objectType = objectType; + return this; + } + + public String getOpenType() { + return openType; + } + + public StbMenu setOpenType(String openType) { + this.openType = openType; + return this; + } + + public String getParameter() { + return parameter; + } + + public StbMenu setParameter(String parameter) { + this.parameter = parameter; + return this; + } + + public String getPictureMenu() { + return pictureMenu; + } + + public StbMenu setPictureMenu(String pictureMenu) { + this.pictureMenu = pictureMenu; + return this; + } + + public String getPictureSelect() { + return pictureSelect; + } + + public StbMenu setPictureSelect(String pictureSelect) { + this.pictureSelect = pictureSelect; + return this; + } + + public Integer getPos() { + return pos; + } + + public StbMenu setPos(Integer pos) { + this.pos = pos; + return this; + } + + public Integer getPosCliente() { + return posCliente; + } + + public StbMenu setPosCliente(Integer posCliente) { + this.posCliente = posCliente; + return this; + } + + public Integer getPosTipoAzienda() { + return posTipoAzienda; + } + + public StbMenu setPosTipoAzienda(Integer posTipoAzienda) { + this.posTipoAzienda = posTipoAzienda; + return this; + } + + public String getType() { + return type; + } + + public StbMenu setType(String type) { + this.type = type; + return this; + } + + public String getUrlDescrizione() { + return urlDescrizione; + } + + public StbMenu setUrlDescrizione(String urlDescrizione) { + this.urlDescrizione = urlDescrizione; + return this; + } + + public List getStbMenuChildren() { + return stbMenuChildren; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java b/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java index d83aaac1..94f8ef10 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java @@ -30,12 +30,12 @@ public class SettingsManager { private static Context mContext; - public static void init(Context context){ + public static void init(Context context) { mContext = context; settingsModelIstance = (SettingsModel) Stash.getObject(TAG, SettingsModel.class); - if(settingsModelIstance == null) { + if (settingsModelIstance == null) { settingsModelIstance = new SettingsModel(); settingsModelIstance.setServer(new SettingsModel.Server()); @@ -49,31 +49,28 @@ public class SettingsManager { } - public static SettingsModel i(){ + public static SettingsModel i() { return settingsModelIstance; } - public static DBSettingsModel iDB(){ + + public static DBSettingsModel iDB() { return dbSettingsModelIstance; } - public static boolean isFirstStart(){ + public static boolean isFirstStart() { return firstStart; } - public static boolean isInstanceAvailable(){ + + public static boolean isInstanceAvailable() { return i() != null; } - public static void update(){ + public static void update() { Stash.put(TAG, settingsModelIstance); } - - - - - - public static void loadDBVariables(Runnable onComplete, RunnableArgs onFailed){ + public static void loadDBVariables(RunnableArgs onProgress, Runnable onComplete, RunnableArgs onFailed) { dbSettingsModelIstance = new DBSettingsModel(); Trace perfTrace = UtilityFirebase.getNewPerformanceTrace("db_load_vars"); @@ -86,26 +83,41 @@ public class SettingsManager { RunnableArgs tmpOnFailed = ex -> { perfTrace.putAttribute("failed", "true"); - if(!(ex instanceof SocketTimeoutException)) onFailed.run(ex); - else onFailed.run(new Exception("Errore durante il caricamento dei dati. Riavviare l'applicazione!")); + if (!(ex instanceof SocketTimeoutException)) onFailed.run(ex); + else + onFailed.run(new Exception("Errore durante il caricamento dei dati. Riavviare l'applicazione!")); }; - loadDatiAzienda(() -> - loadAvailableProfiles(() -> - loadAvailableCodMdeps(() -> - loadAvailablePosizioni(() -> - loadGestSetupValues(tmpOnComplete, tmpOnFailed) ,tmpOnFailed), tmpOnFailed), tmpOnFailed), tmpOnFailed); + onProgress.run("dati azienda"); + loadDatiAzienda(() -> { + + onProgress.run("profili"); + loadAvailableProfiles(() -> { + + onProgress.run("depositi"); + loadAvailableCodMdeps(() -> { + + onProgress.run("posizioni"); + loadAvailablePosizioni(() -> { + + onProgress.run("impostazioni"); + loadGestSetupValues(tmpOnComplete, tmpOnFailed); + }, tmpOnFailed); + }, tmpOnFailed); + }, tmpOnFailed); + }, tmpOnFailed); } private static void loadDatiAzienda(Runnable onComplete, RunnableArgs onFailed) { + SystemRESTConsumer.getAzienda(datiAzienda -> { SettingsManager.iDB().setDatiAzienda(datiAzienda); - if(onComplete != null) onComplete.run(); + if (onComplete != null) onComplete.run(); }, onFailed); } - private static void loadAvailableProfiles(Runnable onComplete, RunnableArgs onFailed){ + private static void loadAvailableProfiles(Runnable onComplete, RunnableArgs onFailed) { SystemRESTConsumer.getAvailableProfiles(new ISimpleOperationCallback>() { @Override public void onSuccess(List availableProfiles) { @@ -118,7 +130,7 @@ public class SettingsManager { @Override public void onFailed(Exception ex) { //BOH - if(onFailed != null) onFailed.run(ex); + if (onFailed != null) onFailed.run(ex); } }); } @@ -129,34 +141,34 @@ public class SettingsManager { public void onSuccess(List availableCodMdeps) { dbSettingsModelIstance.setAvailableCodMdep(availableCodMdeps); - if(availableCodMdeps == null || availableCodMdeps.size() == 0) { + if (availableCodMdeps == null || availableCodMdeps.size() == 0) { onFailed.run(new Exception(mContext.getText(R.string.no_codmdep_available).toString())); return; } boolean codMdepExistsAnymore = false; - if(settingsModelIstance.getUserSession().getDepo() != null){ - for(AvailableCodMdepsDTO availableCodMdepDTO : availableCodMdeps){ + if (settingsModelIstance.getUserSession().getDepo() != null) { + for (AvailableCodMdepsDTO availableCodMdepDTO : availableCodMdeps) { //Controllo se il codMdep salvato esiste ancora - if(availableCodMdepDTO.getCodMdep().equalsIgnoreCase(settingsModelIstance.getUserSession().getDepo().getCodMdep())) { + if (availableCodMdepDTO.getCodMdep().equalsIgnoreCase(settingsModelIstance.getUserSession().getDepo().getCodMdep())) { codMdepExistsAnymore = true; break; } } } - if(!codMdepExistsAnymore){ + if (!codMdepExistsAnymore) { settingsModelIstance.getUserSession().setDepo(availableCodMdeps.get(0)); } - if(onComplete != null) onComplete.run(); + if (onComplete != null) onComplete.run(); } @Override public void onFailed(Exception ex) { //BOH - if(onFailed != null) onFailed.run(ex); + if (onFailed != null) onFailed.run(ex); } }); } @@ -164,12 +176,12 @@ public class SettingsManager { private static void loadAvailablePosizioni(Runnable onComplete, RunnableArgs onFailed) { PosizioniRESTConsumer.getAvailablePosizioni(availablePosizioni -> { - dbSettingsModelIstance.setAvailablePosizioni(availablePosizioni); + dbSettingsModelIstance.setAvailablePosizioni(availablePosizioni); - if(onComplete != null) onComplete.run(); - }, ex -> { - if(onFailed != null) onFailed.run(ex); - } + if (onComplete != null) onComplete.run(); + }, ex -> { + if (onFailed != null) onFailed.run(ex); + } ); } @@ -270,16 +282,16 @@ public class SettingsManager { GestSetupRESTConsumer.getValues(stbGestSetupList, list -> { dbSettingsModelIstance.setDefaultCausaleRettificaGiacenze(getValueFromList(list, "SETUP", "DEFAULT_CAUSALE_RETTIFICA_GIACENZE", String.class)); - dbSettingsModelIstance.setEnableCheckPartitaMagCheckPickingV(getValueFromList(list, "SETUP","ENABLE_CHECK_PARTITA_MAG_PICKING_V", Boolean.class)); - dbSettingsModelIstance.setFlagMultiClienteOrdV(getValueFromList(list, "SETUP","FLAG_MULTI_CLIENTE_ORD_VENDITA", Boolean.class)); - dbSettingsModelIstance.setDefaultCodAnag(getValueFromList(list, "SETUP","COD_ANAG_DEFAULT", String.class)); - dbSettingsModelIstance.setDefaultCriterioDistribuzione(getValueFromList(list, "SETUP","DEFAULT_CRITERIO_DISTRIBUZIONE", String.class)); + dbSettingsModelIstance.setEnableCheckPartitaMagCheckPickingV(getValueFromList(list, "SETUP", "ENABLE_CHECK_PARTITA_MAG_PICKING_V", Boolean.class)); + dbSettingsModelIstance.setFlagMultiClienteOrdV(getValueFromList(list, "SETUP", "FLAG_MULTI_CLIENTE_ORD_VENDITA", Boolean.class)); + 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.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)); - dbSettingsModelIstance.setFlagEnableCheckDepositoSpedizione(getValueFromList(list,"SPEDIZIONE", "ENABLE_CHECK_DEPOSITO", Boolean.class)); + dbSettingsModelIstance.setFlagEnableCheckDepositoSpedizione(getValueFromList(list, "SPEDIZIONE", "ENABLE_CHECK_DEPOSITO", Boolean.class)); dbSettingsModelIstance.setFlagForceAllToColli(getValueFromList(list, "SETUP", "FLAG_FORCE_ALL_TO_COLLI", Boolean.class)); dbSettingsModelIstance.setFlagAskPesoColloSpedizione(getValueFromList(list, "SETUP", "FLAG_ASK_PESO_COLLO", Boolean.class)); dbSettingsModelIstance.setFlagUseNewPickingListSpedizione(getValueFromList(list, "SPEDIZIONE", "FLAG_USE_NEW_PICKING_LIST", Boolean.class)); @@ -292,27 +304,27 @@ public class SettingsManager { dbSettingsModelIstance.setFlagSpedizioneUseQtaOrd(getValueFromList(list, "SPEDIZIONE", "FLAG_USE_QTA_ORD", Boolean.class)); Integer onNumCnfInputChanged = getValueFromList(list, "SETUP", "ON_NUM_CNF_INPUT_CHANGED", Integer.class); - if(onNumCnfInputChanged != null) { + if (onNumCnfInputChanged != null) { dbSettingsModelIstance.setOnNumCnfInputChanged(onNumCnfInputChanged); } - if(onComplete != null) onComplete.run(); + if (onComplete != null) onComplete.run(); }, onFailed); } - public static T getValueFromList(List stbGestSetupList, String section, String keySectionName, Class clazz) { + public static T getValueFromList(List stbGestSetupList, String section, String keySectionName, Class clazz) { StbGestSetup value = Stream.of(stbGestSetupList) .filter(x -> x.getSection().equalsIgnoreCase(section) && x.getKeySection().equalsIgnoreCase(keySectionName)) .findFirst().get(); - if(clazz == String.class) { + if (clazz == String.class) { return clazz.cast(value.getValue()); - } else if(clazz == Boolean.class) { + } else if (clazz == Boolean.class) { return clazz.cast("S".equalsIgnoreCase(value.getValue())); - } else if(clazz == Integer.class && value.getValue() != null) { + } else if (clazz == Integer.class && value.getValue() != null) { return clazz.cast(Integer.parseInt(value.getValue())); } else return null; diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java index 7a602ae4..b5191722 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java @@ -17,22 +17,18 @@ import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; public class UtilityExceptions { - public static void defaultException(Context context, Exception ex, Dialog progressDialog){ + public static void defaultException(Context context, Exception ex, Dialog progressDialog) { defaultException(context, ex); - if(progressDialog != null) progressDialog.dismiss(); + if (progressDialog != null) progressDialog.dismiss(); } - public static void defaultException(Context context, Exception ex, Dialog progressDialog, boolean sendMail){ - defaultException(context, ex, sendMail); - if(progressDialog != null) progressDialog.dismiss(); - } - public static void defaultException(Context context, Exception ex){ + public static void defaultException(Context context, Exception ex) { defaultException(context, ex, false); } - public static void defaultException(Context context, Exception ex, boolean sendEmail){ + public static void defaultException(Context context, Exception ex, boolean sendEmail) { - if(ex.getMessage() != null) { + if (ex.getMessage() != null) { Logger.e(ex, ex.getMessage()); } else { Logger.e(ex, "Errore"); @@ -40,27 +36,27 @@ public class UtilityExceptions { String errorMessage = CommonRESTException.tryRecognizeThenGetMessage(ex); - if(errorMessage == null) { + if (errorMessage == null) { errorMessage = ex.getMessage(); - if(ex.getCause() != null) errorMessage += "
" + ex.getCause().getMessage(); + if (ex.getCause() != null) errorMessage += "
" + ex.getCause().getMessage(); } FragmentManager fm = null; - if(context != null && context instanceof FragmentActivity) { + if (context instanceof FragmentActivity) { fm = ((FragmentActivity) context).getSupportFragmentManager(); - } else if(UtilityContext.getMainActivity() != null) { + } else if (UtilityContext.getMainActivity() != null) { fm = UtilityContext.getMainActivity().getSupportFragmentManager(); } - if(fm != null) { + if (fm != null) { DialogSimpleMessageView.makeErrorDialog(new SpannableString(errorMessage), null, null) .show(fm, "tag"); } - if(!BuildConfig.DEBUG) { - // if(sendEmail) UtilityLogger.errorMe(ex); + if (!BuildConfig.DEBUG) { + if (sendEmail) UtilityLogger.errorMe(ex); FirebaseCrashlytics.getInstance().recordException(ex); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilitySettings.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilitySettings.java index 1574c6f9..b08eb25c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilitySettings.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilitySettings.java @@ -12,11 +12,14 @@ public class UtilitySettings { mAppDatabase = appDatabase; } - public static void logout(){ + public static void logout(Runnable onComplete){ SettingsManager.i().setUser(null); SettingsManager.i().setUserSession(null); - UtilityThread.executeParallel(mAppDatabase::clearAllTables); SettingsManager.update(); + UtilityThread.executeParallel(() -> { + mAppDatabase.clearAllTables(); + onComplete.run(); + }); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/LoginActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/LoginActivity.java index c40cc742..fa4f42e3 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/login/LoginActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/LoginActivity.java @@ -1,12 +1,10 @@ package it.integry.integrywmsnative.gest.login; -import androidx.databinding.DataBindingUtil; -import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; +import androidx.databinding.DataBindingUtil; + import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; -import it.integry.integrywmsnative.core.context.MainContext; import it.integry.integrywmsnative.core.expansion.BaseActivity; import it.integry.integrywmsnative.core.utility.UtilityWindow; import it.integry.integrywmsnative.databinding.ActivityLoginBinding; @@ -14,7 +12,6 @@ import it.integry.integrywmsnative.gest.login.viewmodel.LoginViewModel; public class LoginActivity extends BaseActivity { - private MainContext mainContext = new MainContext(this); @Override protected void onCreate(Bundle savedInstanceState) { @@ -22,7 +19,7 @@ public class LoginActivity extends BaseActivity { UtilityWindow.maximizeToFullScreen(this); ActivityLoginBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_login); - LoginViewModel loginViewModel = new LoginViewModel(this, mainContext); + LoginViewModel loginViewModel = new LoginViewModel(this); binding.setLoginViewModel(loginViewModel); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java index ff43799c..ed262482 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java @@ -12,9 +12,8 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.List; -import it.integry.integrywmsnative.MainActivity; import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.context.MainContext; +import it.integry.integrywmsnative.SplashActivity; import it.integry.integrywmsnative.core.di.BindableBoolean; import it.integry.integrywmsnative.core.di.BindableString; import it.integry.integrywmsnative.core.rest.consumers.ISimpleOperationCallback; @@ -47,15 +46,12 @@ public class LoginViewModel { public BindableString codAziendaError = new BindableString(); - private LoginActivity mActivity; - private MainContext mMainContext; private Dialog mProgress; - public LoginViewModel(LoginActivity activity, MainContext mainContext) { + public LoginViewModel(LoginActivity activity) { this.mActivity = activity; - this.mMainContext = mainContext; loginButtonEnabled.set(true); @@ -66,7 +62,6 @@ public class LoginViewModel { } - public boolean validate() { if (username.isEmpty() || username.get().length() < 3) { usernameError.set(mActivity.getText(R.string.username_error_not_valid).toString()); @@ -82,9 +77,8 @@ public class LoginViewModel { } - - public void login(boolean areValidData){ - if(areValidData){ + public void login(boolean areValidData) { + if (areValidData) { loginButtonEnabled.set(false); mProgress = UtilityProgress.createDefaultProgressDialog(mActivity); @@ -112,7 +106,7 @@ public class LoginViewModel { UtilityServer.isEmsApiAvailable(host, port, value1 -> { - if(value1){ //Is online + if (value1) { //Is online loginHelper.doLogin(host, port, new ISimpleOperationCallback() { @Override public void onSuccess(final LoginDTO loginDTO) { @@ -169,7 +163,7 @@ public class LoginViewModel { public void onSuccess(List availableCodMdeps) { SettingsManager.iDB().setAvailableCodMdep(availableCodMdeps); - if(availableCodMdeps == null || availableCodMdeps.size() == 0) { + if (availableCodMdeps == null || availableCodMdeps.size() == 0) { onLoginFailed(Html.fromHtml(String.format(mActivity.getText(R.string.no_codmdep_available).toString()))); return; } @@ -177,7 +171,7 @@ public class LoginViewModel { SettingsManager.i().getUserSession().setDepo(availableCodMdeps.get(0)); - if(onComplete != null) onComplete.run(); + if (onComplete != null) onComplete.run(); } @Override @@ -189,7 +183,7 @@ public class LoginViewModel { } - private void onLoginFailed(final Spanned message){ + private void onLoginFailed(final Spanned message) { mProgress.dismiss(); loginButtonEnabled.set(true); mActivity.runOnUiThread(() -> DialogSimpleMessageView.makeErrorDialog( @@ -200,7 +194,7 @@ public class LoginViewModel { } - private void onLoginSuccess(final String title, final Spanned message, final String host, final int port, final List availableProfiles){ + private void onLoginSuccess(final String title, final Spanned message, final String host, final int port, final List availableProfiles) { mProgress.dismiss(); mActivity.runOnUiThread(() -> DialogSimpleMessageView.makeSuccessDialog( title, @@ -210,8 +204,8 @@ public class LoginViewModel { .show(mActivity.getSupportFragmentManager(), "tag")); } - private void showProfileDBSelectionDialog(final String host, final int port, final List availableProfiles){ - if(availableProfiles != null && availableProfiles.size() == 1 ) { + private void showProfileDBSelectionDialog(final String host, final int port, final List availableProfiles) { + if (availableProfiles != null && availableProfiles.size() == 1) { SettingsManager.i().getUserSession().setProfileDB(availableProfiles.get(0)); loadDepo(host, port, this::onLoginCompleted); @@ -238,19 +232,16 @@ public class LoginViewModel { public void onLoginCompleted() { loginButtonEnabled.set(true); - SettingsManager.update(); - Dialog loadingProgress = UtilityProgress.createDefaultProgressDialog(mActivity); - mMainContext.init(() -> { - loadingProgress.dismiss(); - mActivity.finish(); - - Intent myIntent = new Intent(mActivity, MainActivity.class); - mActivity.startActivity(myIntent); - }); - + startSplashActivity(); } + private void startSplashActivity() { + mActivity.finish(); + Intent myIntent = new Intent(mActivity, SplashActivity.class); + mActivity.startActivity(myIntent); + } + } diff --git a/app/src/main/java/it/integry/integrywmsnative/MainActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java similarity index 97% rename from app/src/main/java/it/integry/integrywmsnative/MainActivity.java rename to app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java index c251a146..03c328f3 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative; +package it.integry.integrywmsnative.gest.main; import android.content.Intent; import android.os.Bundle; @@ -25,6 +25,8 @@ import java.util.List; import javax.inject.Inject; +import it.integry.integrywmsnative.MainApplication; +import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.class_router.BaseCustomConfiguration; import it.integry.integrywmsnative.core.class_router.ClassRouter; import it.integry.integrywmsnative.core.class_router.configs.BaseMenuConfiguration; @@ -47,7 +49,6 @@ import it.integry.integrywmsnative.core.utility.UtilityContext; import it.integry.integrywmsnative.core.utility.UtilitySettings; import it.integry.integrywmsnative.databinding.ActivityMainBinding; import it.integry.integrywmsnative.gest.login.LoginActivity; -import it.integry.integrywmsnative.gest.main.MainFragment; import it.integry.integrywmsnative.gest.settings.MainSettingsFragment; public class MainActivity extends BaseActivity @@ -73,7 +74,7 @@ public class MainActivity extends BaseActivity .create() .inject(this); - mColliDataRecoverService.init(this); +// mColliDataRecoverService.init(this); mBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.activity_main, null, false); setContentView(mBinding.getRoot()); @@ -184,9 +185,10 @@ public class MainActivity extends BaseActivity case R.id.nav_logout: ServerStatusChecker.dispose(); - UtilitySettings.logout(); + UtilitySettings.logout(() -> { + startLoginActivity(); + }); - startLoginActivity(); break; } } diff --git a/app/src/main/java/it/integry/integrywmsnative/MainActivityComponent.java b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivityComponent.java similarity index 83% rename from app/src/main/java/it/integry/integrywmsnative/MainActivityComponent.java rename to app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivityComponent.java index 6e616fe3..42e29f68 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainActivityComponent.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivityComponent.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative; +package it.integry.integrywmsnative.gest.main; import dagger.Subcomponent; diff --git a/app/src/main/java/it/integry/integrywmsnative/MainActivityModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivityModule.java similarity index 70% rename from app/src/main/java/it/integry/integrywmsnative/MainActivityModule.java rename to app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivityModule.java index 3cb0f046..b990452a 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainActivityModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivityModule.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative; +package it.integry.integrywmsnative.gest.main; import dagger.Module; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragment.java index 4bd807d4..f80f2db3 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragment.java @@ -20,7 +20,9 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import it.integry.integrywmsnative.MainActivity; +import javax.inject.Inject; + +import it.integry.integrywmsnative.MainApplication; import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.class_router.BaseCustomConfiguration; import it.integry.integrywmsnative.core.class_router.ClassRouter; @@ -28,7 +30,8 @@ import it.integry.integrywmsnative.core.class_router.configs.BaseMenuConfigurati import it.integry.integrywmsnative.core.class_router.configs.MenuConfiguration; import it.integry.integrywmsnative.core.class_router.interfaces.ICustomConfiguration; import it.integry.integrywmsnative.core.class_router.interfaces.IOrdiniVendita; -import it.integry.integrywmsnative.core.data_recover.ColliDataRecover; +import it.integry.integrywmsnative.core.data_recover.ColliDataRecoverDTO; +import it.integry.integrywmsnative.core.data_recover.ColliDataRecoverService; import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.expansion.RunnableArgss; import it.integry.integrywmsnative.core.interfaces.IScrollableFragment; @@ -53,6 +56,9 @@ import it.integry.integrywmsnative.ui.ElevatedToolbar; */ public class MainFragment extends Fragment implements ITitledFragment, IScrollableFragment { + @Inject + ColliDataRecoverService colliDataRecoverService; + private FragmentMainBinding mBindings; private final List mOnPreDestroyList = new ArrayList<>(); @@ -81,6 +87,11 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab Bundle savedInstanceState) { this.mLayoutInflater = inflater; + MainApplication.appComponent + .mainFragmentComponent() + .create() + .inject(this); + mBindings = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false); @@ -94,7 +105,7 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab mToolbar.setNestedScrollView(mBindings.fragmentMainScrollview); init(); - initGestMenu(); + initGestMenuOLD(); initVersion(); } @@ -134,12 +145,12 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab } private void initRecuperoCollo() { - if (ColliDataRecover.thereIsAnExistantSession()) { + if (colliDataRecoverService.thereIsAnExistantSession()) { startRecoverMode(); List generatedErrors = new ArrayList<>(); - Iterator sessionsIterator = ColliDataRecover.getAllSessionIDs().iterator(); + Iterator sessionsIterator = colliDataRecoverService.getAllSessionIDs().iterator(); cyclicRecover(sessionsIterator, () -> { @@ -157,7 +168,7 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab RunnableArgss tmpOnFailed = (ex, recoveredMtbColtID) -> { if (ex.getMessage().contains("Dati entity mtb_colt non trovati") || ex.getMessage().contains("Dati collo non corretti") || (ex.getMessage().contains("Il collo numero") && ex.getMessage().contains("non esiste"))) { - ColliDataRecover.closeSession(recoveredMtbColtID); + colliDataRecoverService.closeSession(recoveredMtbColtID); onFailed.run(ex); } else { onFailed.run(ex); @@ -168,7 +179,7 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab if (sessionsIterator.hasNext()) { Integer recoveredMtbColtID = sessionsIterator.next(); - ColliDataRecover.RecoverDTO recoveredMtbColtDto = ColliDataRecover.getSession(recoveredMtbColtID); + ColliDataRecoverDTO recoveredMtbColtDto = colliDataRecoverService.getSession(recoveredMtbColtID); MtbColt recoveredMtbColt = recoveredMtbColtDto.getMtbColt(); if (recoveredMtbColt != null && (recoveredMtbColt.getGestioneEnum() == GestioneEnum.VENDITA || recoveredMtbColt.getGestioneEnum() == GestioneEnum.LAVORAZIONE) && !UtilityString.isNullOrEmpty(recoveredMtbColt.getFiltroOrdini())) { @@ -178,7 +189,7 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab ColliMagazzinoRESTConsumer.updateDataFineStatic(recoveredMtbColt, () -> { ordiniVendita.distribuisciCollo(recoveredMtbColt, recoveredMtbColtDto.getTestateOrdini(), mtbColts -> { - ColliDataRecover.closeSession(recoveredMtbColtID); + colliDataRecoverService.closeSession(recoveredMtbColtID); cyclicRecover(sessionsIterator, onComplete, onFailed); }, ex -> { @@ -189,7 +200,7 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab tmpOnFailed.run(ex, recoveredMtbColtID); }); } else { - ColliDataRecover.closeSession(recoveredMtbColtID); + colliDataRecoverService.closeSession(recoveredMtbColtID); cyclicRecover(sessionsIterator, onComplete, onFailed); } @@ -227,7 +238,7 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab } - private void initGestMenu() { + private void initGestMenuOLD() { ICustomConfiguration customConfiguration = ClassRouter.getInstance(ClassRouter.PATH.CUSTOM_CONFIGURATION); if (customConfiguration == null) { // MainApplication.exit(); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragmentComponent.java b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragmentComponent.java new file mode 100644 index 00000000..90d056e4 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragmentComponent.java @@ -0,0 +1,15 @@ +package it.integry.integrywmsnative.gest.main; + +import dagger.Subcomponent; + +@Subcomponent +public interface MainFragmentComponent { + + @Subcomponent.Factory + interface Factory { + + MainFragmentComponent create(); + } + + void inject(MainFragment mainActivity); +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragmentModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragmentModule.java new file mode 100644 index 00000000..713ba11c --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragmentModule.java @@ -0,0 +1,7 @@ +package it.integry.integrywmsnative.gest.main; + +import dagger.Module; + +@Module(subcomponents = MainFragmentComponent.class) +public class MainFragmentModule { +} diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml index bc5c3d07..7ef59bc9 100644 --- a/app/src/main/res/layout/activity_splash.xml +++ b/app/src/main/res/layout/activity_splash.xml @@ -61,6 +61,20 @@ app:layout_constraintRight_toLeftOf="@+id/guideline_right_progress" app:layout_constraintTop_toBottomOf="@id/imageView" /> + + + tools:context="it.integry.integrywmsnative.gest.main.MainActivity"> Ret of processing goods Agricoper customizations + Module Title diff --git a/barcode_base_android_library/build.gradle b/barcode_base_android_library/build.gradle index da9d562a..68c46eb4 100644 --- a/barcode_base_android_library/build.gradle +++ b/barcode_base_android_library/build.gradle @@ -7,8 +7,6 @@ android { defaultConfig { minSdkVersion 21 targetSdkVersion 30 - versionCode 1 - versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles 'consumer-rules.pro' @@ -21,8 +19,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } lintOptions { diff --git a/barcode_base_android_library/src/main/java/it/integry/barcode_base_android_library/interfaces/BarcodeReaderInterface.java b/barcode_base_android_library/src/main/java/it/integry/barcode_base_android_library/interfaces/BarcodeReaderInterface.java index 7b8c48b9..b62ab935 100644 --- a/barcode_base_android_library/src/main/java/it/integry/barcode_base_android_library/interfaces/BarcodeReaderInterface.java +++ b/barcode_base_android_library/src/main/java/it/integry/barcode_base_android_library/interfaces/BarcodeReaderInterface.java @@ -11,7 +11,7 @@ public interface BarcodeReaderInterface { boolean isRightAdapter(); - void init(Runnable onDeviceReady) throws BarcodeAdapterNotFoundException; + void init(Runnable onDeviceReady) throws BarcodeAdapterNotFoundException, Exception; void deinit(); diff --git a/build.gradle b/build.gradle index b933f532..1e28a654 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { - kotlin_version = '1.5.0' + kotlin_version = '1.5.21' } repositories { @@ -10,7 +10,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.2.2' + classpath 'com.android.tools.build:gradle:7.0.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.5' classpath 'com.google.firebase:perf-plugin:1.3.5' diff --git a/dynamic__base/build.gradle b/dynamic__base/build.gradle index 7e0bfde6..2edefc68 100644 --- a/dynamic__base/build.gradle +++ b/dynamic__base/build.gradle @@ -1,18 +1,17 @@ -apply plugin: 'com.android.dynamic-feature' +plugins { + id 'com.android.dynamic-feature' +} android { compileSdkVersion 30 defaultConfig { minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } lintOptions { diff --git a/dynamic_agricoper/build.gradle b/dynamic_agricoper/build.gradle index b6aa4283..bd238e5e 100644 --- a/dynamic_agricoper/build.gradle +++ b/dynamic_agricoper/build.gradle @@ -1,21 +1,25 @@ -apply plugin: 'com.android.dynamic-feature' - +plugins { + id 'com.android.dynamic-feature' +} android { - compileSdkVersion 30 + compileSdk 30 defaultConfig { - minSdkVersion 21 - targetSdkVersion 30 + applicationId "com.example.dynamicfeature" + minSdk 21 + targetSdk 30 versionCode 1 versionName "1.0" - } - compileOptions { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } - + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } } dependencies { diff --git a/dynamic_frudis/build.gradle b/dynamic_frudis/build.gradle index b6aa4283..8c659f3a 100644 --- a/dynamic_frudis/build.gradle +++ b/dynamic_frudis/build.gradle @@ -1,13 +1,12 @@ -apply plugin: 'com.android.dynamic-feature' +plugins { + id 'com.android.dynamic-feature' +} android { compileSdkVersion 30 defaultConfig { minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" } compileOptions { diff --git a/dynamic_gramm/build.gradle b/dynamic_gramm/build.gradle index 677d1a53..18391429 100644 --- a/dynamic_gramm/build.gradle +++ b/dynamic_gramm/build.gradle @@ -1,20 +1,19 @@ -apply plugin: "com.android.dynamic-feature" +plugins { + id 'com.android.dynamic-feature' +} android { compileSdkVersion 30 defaultConfig { minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } lintOptions { diff --git a/dynamic_ime/build.gradle b/dynamic_ime/build.gradle index 2d8772cc..e0edeefa 100644 --- a/dynamic_ime/build.gradle +++ b/dynamic_ime/build.gradle @@ -1,4 +1,6 @@ -apply plugin: 'com.android.dynamic-feature' +plugins { + id 'com.android.dynamic-feature' +} android { compileSdkVersion 30 @@ -7,9 +9,6 @@ android { defaultConfig { minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" } diff --git a/dynamic_saporiveri/build.gradle b/dynamic_saporiveri/build.gradle index de8c2567..1973cdf9 100644 --- a/dynamic_saporiveri/build.gradle +++ b/dynamic_saporiveri/build.gradle @@ -1,4 +1,6 @@ -apply plugin: 'com.android.dynamic-feature' +plugins { + id 'com.android.dynamic-feature' +} android { compileSdkVersion 30 @@ -7,9 +9,6 @@ android { defaultConfig { minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" } compileOptions { diff --git a/dynamic_saporiveri_pv/build.gradle b/dynamic_saporiveri_pv/build.gradle index de8c2567..1973cdf9 100644 --- a/dynamic_saporiveri_pv/build.gradle +++ b/dynamic_saporiveri_pv/build.gradle @@ -1,4 +1,6 @@ -apply plugin: 'com.android.dynamic-feature' +plugins { + id 'com.android.dynamic-feature' +} android { compileSdkVersion 30 @@ -7,9 +9,6 @@ android { defaultConfig { minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" } compileOptions { diff --git a/dynamic_vgalimenti/build.gradle b/dynamic_vgalimenti/build.gradle index f488f7dd..db6c8f05 100644 --- a/dynamic_vgalimenti/build.gradle +++ b/dynamic_vgalimenti/build.gradle @@ -1,17 +1,16 @@ -apply plugin: 'com.android.dynamic-feature' +plugins { + id 'com.android.dynamic-feature' +} android { compileSdkVersion 30 defaultConfig { minSdkVersion 21 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } } diff --git a/gradle.properties b/gradle.properties index 9044160d..50928d0f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -30,8 +30,6 @@ org.gradle.daemon=true org.gradle.configureondemand=true # Enable parallel builds org.gradle.parallel=true -# Enable Build Cache -android.enableBuildCache=true # Enable simple gradle caching org.gradle.caching=true # Increase memory allotted to JVM diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 639eb689..abc62726 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https://services.gradle.org/distributions/gradle-6.7.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip diff --git a/honeywellscannerlibrary/build.gradle b/honeywellscannerlibrary/build.gradle index 9c62028d..7252a5e1 100644 --- a/honeywellscannerlibrary/build.gradle +++ b/honeywellscannerlibrary/build.gradle @@ -6,8 +6,6 @@ android { defaultConfig { minSdkVersion 21 targetSdkVersion 30 - versionCode 1 - versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -21,8 +19,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } lintOptions { diff --git a/honeywellscannerlibrary/src/main/java/it/integry/honeywellscannerlibrary/HoneyWellBarcodeReader.java b/honeywellscannerlibrary/src/main/java/it/integry/honeywellscannerlibrary/HoneyWellBarcodeReader.java index 61be9aea..02b7877f 100644 --- a/honeywellscannerlibrary/src/main/java/it/integry/honeywellscannerlibrary/HoneyWellBarcodeReader.java +++ b/honeywellscannerlibrary/src/main/java/it/integry/honeywellscannerlibrary/HoneyWellBarcodeReader.java @@ -1,16 +1,13 @@ package it.integry.honeywellscannerlibrary; +import android.content.Context; import android.os.Build; import android.view.KeyEvent; -import android.widget.Toast; - -import androidx.appcompat.app.AppCompatActivity; import com.honeywell.aidc.AidcManager; import com.honeywell.aidc.BarcodeFailureEvent; import com.honeywell.aidc.BarcodeReadEvent; import com.honeywell.aidc.BarcodeReader; -import com.honeywell.aidc.InvalidScannerNameException; import com.honeywell.aidc.ScannerUnavailableException; import com.honeywell.aidc.UnsupportedPropertyException; @@ -26,7 +23,7 @@ import it.integry.barcode_base_android_library.model.BarcodeScanDTO; public class HoneyWellBarcodeReader implements BarcodeReaderInterface { - private final AppCompatActivity mContext; + private final Context mContext; private AidcManager manager; private BarcodeReader barcodeReader; @@ -35,7 +32,7 @@ public class HoneyWellBarcodeReader implements BarcodeReaderInterface { private static final String TAG = HoneyWellBarcodeReader.class.getName(); - public HoneyWellBarcodeReader(final AppCompatActivity context) { + public HoneyWellBarcodeReader(final Context context) { this.mContext = context; } @@ -64,11 +61,8 @@ public class HoneyWellBarcodeReader implements BarcodeReaderInterface { barcodeReader = manager.createBarcodeReader(); registerListenersInternal(); } - catch (InvalidScannerNameException e){ - Toast.makeText(mContext, "Invalid Scanner Name Exception: " + e.getMessage(), Toast.LENGTH_SHORT).show(); - } catch (Exception e){ - Toast.makeText(mContext, "Exception: " + e.getMessage(), Toast.LENGTH_SHORT).show(); +// throw new Exception("Invalid Scanner Name Exception: " + e.getMessage()); } @@ -114,7 +108,7 @@ public class HoneyWellBarcodeReader implements BarcodeReaderInterface { } - private void registerListenersInternal() { + private void registerListenersInternal() throws Exception { // register bar code event listener barcodeReader.addBarcodeListener(new BarcodeReader.BarcodeListener() { @Override @@ -134,7 +128,7 @@ public class HoneyWellBarcodeReader implements BarcodeReaderInterface { barcodeReader.setProperty(BarcodeReader.PROPERTY_TRIGGER_CONTROL_MODE, BarcodeReader.TRIGGER_CONTROL_MODE_CLIENT_CONTROL); } catch (UnsupportedPropertyException e) { - Toast.makeText(mContext, "Failed to apply properties", Toast.LENGTH_SHORT).show(); + throw new Exception("Failed to apply properties"); } Map properties = new HashMap<>(); @@ -169,7 +163,7 @@ public class HoneyWellBarcodeReader implements BarcodeReaderInterface { private void dispatchEvent(BarcodeReadEvent barcodeReadEvent) { - mContext.runOnUiThread(() -> { +// mContext.runOnUiThread(() -> { BarcodeScanDTO barcodeScanDTO = new BarcodeScanDTO() .setByteValue(barcodeReadEvent.getBarcodeData().getBytes()) @@ -178,6 +172,6 @@ public class HoneyWellBarcodeReader implements BarcodeReaderInterface { .setName(HoneywellBarcodeTypeMapper.map(barcodeReadEvent.getCodeId()).toString()); mOnScanSuccessfull.run(barcodeScanDTO); - }); +// }); } } diff --git a/keyobardemulatorscannerlibrary/build.gradle b/keyobardemulatorscannerlibrary/build.gradle index a98eb2c5..cfae7fc2 100644 --- a/keyobardemulatorscannerlibrary/build.gradle +++ b/keyobardemulatorscannerlibrary/build.gradle @@ -6,8 +6,6 @@ android { defaultConfig { minSdkVersion 21 targetSdkVersion 30 - versionCode 1 - versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles 'consumer-rules.pro' @@ -21,8 +19,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } lintOptions { diff --git a/keyobardemulatorscannerlibrary/src/main/java/it/integry/keyobardemulatorscannerlibrary/KeyboardEmulatorBarcodeReader.java b/keyobardemulatorscannerlibrary/src/main/java/it/integry/keyobardemulatorscannerlibrary/KeyboardEmulatorBarcodeReader.java index d1a69ab6..9c342d3e 100644 --- a/keyobardemulatorscannerlibrary/src/main/java/it/integry/keyobardemulatorscannerlibrary/KeyboardEmulatorBarcodeReader.java +++ b/keyobardemulatorscannerlibrary/src/main/java/it/integry/keyobardemulatorscannerlibrary/KeyboardEmulatorBarcodeReader.java @@ -1,12 +1,8 @@ package it.integry.keyobardemulatorscannerlibrary; -import android.view.KeyCharacterMap; +import android.content.Context; import android.view.KeyEvent; -import androidx.appcompat.app.AppCompatActivity; - -import java.util.regex.Pattern; - import it.integry.barcode_base_android_library.exception.BarcodeAdapterNotFoundException; import it.integry.barcode_base_android_library.extension.RunnableArgs; import it.integry.barcode_base_android_library.interfaces.BarcodeReaderInterface; @@ -22,7 +18,7 @@ public class KeyboardEmulatorBarcodeReader implements BarcodeReaderInterface { private long mLastCharInsertTime = 0; - public KeyboardEmulatorBarcodeReader(AppCompatActivity context) { + public KeyboardEmulatorBarcodeReader(Context applicationContext) { } diff --git a/pointmobilescannerlibrary/build.gradle b/pointmobilescannerlibrary/build.gradle index 33ece24e..aacf18eb 100644 --- a/pointmobilescannerlibrary/build.gradle +++ b/pointmobilescannerlibrary/build.gradle @@ -6,8 +6,6 @@ android { defaultConfig { minSdkVersion 21 targetSdkVersion 30 - versionCode 1 - versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -20,8 +18,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } lintOptions { diff --git a/pointmobilescannerlibrary/src/main/java/it/integry/pointmobilescannerlibrary/PointMobileBarcodeReader.java b/pointmobilescannerlibrary/src/main/java/it/integry/pointmobilescannerlibrary/PointMobileBarcodeReader.java index 51092164..241426c6 100644 --- a/pointmobilescannerlibrary/src/main/java/it/integry/pointmobilescannerlibrary/PointMobileBarcodeReader.java +++ b/pointmobilescannerlibrary/src/main/java/it/integry/pointmobilescannerlibrary/PointMobileBarcodeReader.java @@ -5,8 +5,6 @@ import android.content.Context; import android.content.Intent; import android.view.KeyEvent; -import androidx.appcompat.app.AppCompatActivity; - import java.nio.charset.StandardCharsets; import device.common.DecodeResult; @@ -20,7 +18,7 @@ import it.integry.barcode_base_android_library.model.BarcodeType; public class PointMobileBarcodeReader implements BarcodeReaderInterface { - private AppCompatActivity mContext; + private final Context mApplicationContext; private static ScanManager mScanManager; private static DecodeResult mDecodeResult; @@ -29,8 +27,8 @@ public class PointMobileBarcodeReader implements BarcodeReaderInterface { private static String TAG = PointMobileBarcodeReader.class.getName(); - public PointMobileBarcodeReader(AppCompatActivity context) { - this.mContext = context; + public PointMobileBarcodeReader(Context applicationContext) { + this.mApplicationContext = applicationContext; mScanManager = new ScanManager(); mDecodeResult = new DecodeResult(); diff --git a/zebrascannerlibrary/build.gradle b/zebrascannerlibrary/build.gradle index c1c9aa1b..828bde64 100644 --- a/zebrascannerlibrary/build.gradle +++ b/zebrascannerlibrary/build.gradle @@ -6,8 +6,6 @@ android { defaultConfig { minSdkVersion 21 targetSdkVersion 30 - versionCode 1 - versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -20,8 +18,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } lintOptions { From fbcda5eaf6835a5117acfcd35b95db2a6c3189e9 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 5 Aug 2021 15:25:06 +0200 Subject: [PATCH 02/18] Implementato servizio di retrieve menu --- .../core/menu/MenuService.java | 44 +++++++++++++- .../menu/exception/MenuNotFoundException.java | 8 +++ .../core/rest/RESTBuilder.java | 7 --- .../gest/main/MainActivity.java | 4 ++ .../gest/main/MainFragment.java | 57 ++++++++++++++++++- 5 files changed, 110 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/menu/exception/MenuNotFoundException.java diff --git a/app/src/main/java/it/integry/integrywmsnative/core/menu/MenuService.java b/app/src/main/java/it/integry/integrywmsnative/core/menu/MenuService.java index 3fe5466d..bdc1f118 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/menu/MenuService.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/menu/MenuService.java @@ -1,11 +1,17 @@ package it.integry.integrywmsnative.core.menu; +import com.annimon.stream.Stream; + +import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; +import it.integry.integrywmsnative.core.class_router.configs.BaseMenuConfiguration; +import it.integry.integrywmsnative.core.class_router.configs.MenuConfiguration; import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.menu.exception.MenuNotFoundException; import it.integry.integrywmsnative.core.model.StbMenu; @Singleton @@ -16,6 +22,7 @@ public class MenuService { private final MenuRESTConsumer menuRESTConsumer; private List mInternalCachedMenu; + private List mInternalCachedFlatMenu; @Inject public MenuService(MenuRESTConsumer menuRESTConsumer) { @@ -24,13 +31,46 @@ public class MenuService { public void init(Runnable onMenuInitialized, RunnableArgs onFailed) { menuRESTConsumer.retrieveMenu(MENU_COD_OPZ, menu -> { - if(menu != null) this.mInternalCachedMenu = menu.getStbMenuChildren(); + if(menu != null) { + this.mInternalCachedMenu = menu.getStbMenuChildren(); + this.mInternalCachedFlatMenu = new ArrayList<>(); + flattenMenu(this.mInternalCachedMenu); + } + onMenuInitialized.run(); }, onFailed); } - public void getMenu() { + public List getMenu() throws Exception { + if(mInternalCachedMenu == null) throw new MenuNotFoundException(); + return mInternalCachedMenu; + } + + + public boolean isGroupEnabled(MenuConfiguration.MenuGroup androidMenuGroup) throws Exception { + List dbMenu = getMenu(); + + return Stream.of(this.mInternalCachedFlatMenu) + .anyMatch(x -> x.getCodOpz().equalsIgnoreCase(androidMenuGroup.getCodMenu())); + } + + + public boolean isItemEnabled(BaseMenuConfiguration.MenuItem androidMenuItem) throws Exception { + List dbMenu = getMenu(); + + return Stream.of(this.mInternalCachedFlatMenu) + .anyMatch(x -> x.getCodOpz().equalsIgnoreCase(androidMenuItem.getCodMenu())); + } + + private void flattenMenu(List menu) { + for(StbMenu stbMenu : menu) { + this.mInternalCachedFlatMenu.add(stbMenu); + + if(stbMenu.getStbMenuChildren() != null && !stbMenu.getStbMenuChildren().isEmpty()) { + flattenMenu(stbMenu.getStbMenuChildren()); + } + } } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/menu/exception/MenuNotFoundException.java b/app/src/main/java/it/integry/integrywmsnative/core/menu/exception/MenuNotFoundException.java new file mode 100644 index 00000000..c631fefd --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/menu/exception/MenuNotFoundException.java @@ -0,0 +1,8 @@ +package it.integry.integrywmsnative.core.menu.exception; + +public class MenuNotFoundException extends Exception{ + + public MenuNotFoundException() { + super("Non è stato possibile caricare il menĂ¹"); + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/RESTBuilder.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/RESTBuilder.java index d3af8845..e3678e0a 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/RESTBuilder.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/RESTBuilder.java @@ -17,12 +17,10 @@ import retrofit2.converter.gson.GsonConverterFactory; public class RESTBuilder { public static T getService(final Class service) { -// return getService(service, "192.168.2.13", 8080); return getService(service, SettingsManager.i().getServer().getHost(), SettingsManager.i().getServer().getPort(), true); } public static T getService(final Class service, int timeout) { -// return getService(service, "192.168.2.13", 8080); return getService(service, SettingsManager.i().getServer().getHost(), SettingsManager.i().getServer().getPort(), true, true, timeout); } @@ -54,17 +52,12 @@ public class RESTBuilder { .setDateFormat("dd/MM/yyyy HH:mm:ss") .create(); - - - Retrofit retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create(gson)) .baseUrl(endpoint) .client(client) .build(); - - return retrofit.create(service); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java index 03c328f3..703b1f3c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java @@ -43,6 +43,7 @@ import it.integry.integrywmsnative.core.interfaces.IScrollableFragment; import it.integry.integrywmsnative.core.interfaces.ISearcableFragment; import it.integry.integrywmsnative.core.interfaces.ISelectAllFragment; import it.integry.integrywmsnative.core.interfaces.ITitledFragment; +import it.integry.integrywmsnative.core.menu.MenuService; import it.integry.integrywmsnative.core.rest.watcher.ServerStatusChecker; import it.integry.integrywmsnative.core.update.UpdatesManager; import it.integry.integrywmsnative.core.utility.UtilityContext; @@ -65,6 +66,9 @@ public class MainActivity extends BaseActivity @Inject ColliDataRecoverService mColliDataRecoverService; + @Inject + MenuService menuService; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragment.java index f80f2db3..c355c9fa 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragment.java @@ -36,6 +36,7 @@ import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.expansion.RunnableArgss; import it.integry.integrywmsnative.core.interfaces.IScrollableFragment; import it.integry.integrywmsnative.core.interfaces.ITitledFragment; +import it.integry.integrywmsnative.core.menu.MenuService; import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.model.secondary.GestioneEnum; import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; @@ -59,6 +60,9 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab @Inject ColliDataRecoverService colliDataRecoverService; + @Inject + MenuService menuService; + private FragmentMainBinding mBindings; private final List mOnPreDestroyList = new ArrayList<>(); @@ -105,7 +109,8 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab mToolbar.setNestedScrollView(mBindings.fragmentMainScrollview); init(); - initGestMenuOLD(); + initGestMenu(); +// initGestMenuOLD(); initVersion(); } @@ -237,6 +242,56 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab mToolbar = toolbar; } + private void initGestMenu() { + int menuSpanCount = 2; + if(UtilityDimension.getDisplayInchs(this.getActivity()) > 8) menuSpanCount = 4; + else if(UtilityDimension.getDisplayInchs(this.getActivity()) > 6.5) menuSpanCount = 3; + + MenuConfiguration baseMenuConfiguration = new MenuConfiguration(); + List menuGroups = baseMenuConfiguration.getGroups(); + + for(int i = 0; i < menuGroups.size(); i++) { + try { + + BaseMenuConfiguration.MenuGroup menuGroup = menuGroups.get(i); + + if(menuService.isGroupEnabled(menuGroup)) { + + FragmentMainMenuGroupLayoutBinding groupBinding = DataBindingUtil.inflate(mLayoutInflater, R.layout.fragment_main_menu_group_layout, null, false); + + String title = this.getResources().getString(menuGroup.getGroupText()); + groupBinding.generalDashboardGroupTitle.setText(title); + + List enableMenuItems = new ArrayList<>(); + + for(int j = 0; j < menuGroup.getItems().size(); j++) { + if(menuService.isItemEnabled(menuGroup.getItems().get(j))) { + enableMenuItems.add(menuGroup.getItems().get(j)); + } + } + + MenuListAdapter menuListAdapter = new MenuListAdapter(getContext(), enableMenuItems); + + groupBinding.mainList.setLayoutManager(new GridLayoutManager(getContext(), menuSpanCount)); + groupBinding.mainList.setAdapter(menuListAdapter); + groupBinding.mainList.setNestedScrollingEnabled(false); + + menuListAdapter.setClickListener((view, position) -> { + onMenuClick(menuGroup.getItems().get(position)); + }); + + mBindings.menuContainer.addView(groupBinding.getRoot()); + + + } + + + } catch (Exception exception) { + exception.printStackTrace(); + } + } + + } private void initGestMenuOLD() { ICustomConfiguration customConfiguration = ClassRouter.getInstance(ClassRouter.PATH.CUSTOM_CONFIGURATION); From 624a880ad5a09ae641be1a7e02f274cebe0455e5 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 5 Aug 2021 18:23:54 +0200 Subject: [PATCH 03/18] Refactoring main list accettazione --- .../MainApplicationComponent.java | 6 +- .../MainAccettazioneComponent.java | 15 + .../MainAccettazioneFragment.java | 268 +++++----- .../accettazione/MainAccettazioneModule.java | 20 + .../MainAccettazioneViewModel.java | 94 ++++ .../accettazione/core/AccettazioneHelper.java | 87 ---- .../core/MainListAccettazioneAdapter.java | 137 ++--- .../MainListAccettazioneClienteListModel.java | 26 + .../core/MainListAccettazioneListModel.java | 70 +++ .../dto/OrdineAccettazioneDTO.java | 481 ------------------ .../rest/OrdiniAccettazioneRESTConsumer.java | 16 + .../OrdiniUscitaElencoFragment.java | 4 +- .../list/OrdiniUscitaElencoAdapter.java | 42 +- .../accettazione_main_list_group_model.xml | 9 +- .../res/layout/fragment_main_accettazione.xml | 48 +- ...t_main_ordini_uscita__list_group_model.xml | 2 +- 16 files changed, 483 insertions(+), 842 deletions(-) create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneComponent.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneModule.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneViewModel.java delete mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/AccettazioneHelper.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneClienteListModel.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneListModel.java delete mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/accettazione/dto/OrdineAccettazioneDTO.java diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java index 2b66ce0c..b09c57e6 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java @@ -5,6 +5,8 @@ import javax.inject.Singleton; import dagger.Component; import it.integry.integrywmsnative.core.context.AppContext; import it.integry.integrywmsnative.core.data_store.db.RoomModule; +import it.integry.integrywmsnative.gest.accettazione.MainAccettazioneComponent; +import it.integry.integrywmsnative.gest.accettazione.MainAccettazioneModule; import it.integry.integrywmsnative.gest.accettazione_picking.AccettazionePickingComponent; import it.integry.integrywmsnative.gest.accettazione_picking.AccettazionePickingModule; import it.integry.integrywmsnative.gest.main.MainActivityComponent; @@ -53,10 +55,11 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr // Definition of the Application graph @Singleton @Component(modules = { + RoomModule.class, SplashActivityModule.class, MainApplicationModule.class, MainFragmentModule.class, - RoomModule.class, + MainAccettazioneModule.class, MainActivityModule.class, PVOrdineAcquistoGrigliaModule.class, PVOrdineAcquistoEditModule.class, @@ -83,6 +86,7 @@ public interface MainApplicationComponent { SplashActivityComponent.Factory splashActivityComponent(); MainActivityComponent.Factory mainActivityComponent(); MainFragmentComponent.Factory mainFragmentComponent(); + MainAccettazioneComponent.Factory mainAccettazioneComponent(); PVOrdineAcquistoGrigliaComponent.Factory pvOrdineAcquistoGrigliaComponent(); PVOrdineAcquistoEditComponent.Factory pvOrdineAcquistoEditComponent(); PickingLiberoComponent.Factory pickingLiberoComponent(); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneComponent.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneComponent.java new file mode 100644 index 00000000..bff63b69 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneComponent.java @@ -0,0 +1,15 @@ +package it.integry.integrywmsnative.gest.accettazione; + +import dagger.Subcomponent; + +@Subcomponent +public interface MainAccettazioneComponent { + + @Subcomponent.Factory + interface Factory { + + MainAccettazioneComponent create(); + } + + void inject(MainAccettazioneFragment mainAccettazioneFragment); +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneFragment.java index 24c56ab8..b2e04d93 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneFragment.java @@ -1,20 +1,17 @@ package it.integry.integrywmsnative.gest.accettazione; -import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.text.Html; -import android.text.SpannableString; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; import androidx.appcompat.widget.AppCompatTextView; import androidx.databinding.DataBindingUtil; -import androidx.fragment.app.Fragment; +import androidx.databinding.ObservableArrayList; import androidx.recyclerview.widget.LinearLayoutManager; import com.annimon.stream.Stream; @@ -23,44 +20,46 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import javax.inject.Inject; + +import it.integry.integrywmsnative.MainApplication; import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.data_cache.DataCache; -import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.di.BindableBoolean; +import it.integry.integrywmsnative.core.expansion.BaseFragment; import it.integry.integrywmsnative.core.interfaces.IScrollableFragment; import it.integry.integrywmsnative.core.interfaces.ISearcableFragment; import it.integry.integrywmsnative.core.interfaces.ITitledFragment; -import it.integry.integrywmsnative.core.rest.CommonRESTException; +import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityBigDecimal; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.integrywmsnative.core.utility.UtilityProgress; +import it.integry.integrywmsnative.core.utility.UtilityDate; import it.integry.integrywmsnative.databinding.FragmentMainAccettazioneBinding; -import it.integry.integrywmsnative.gest.accettazione.core.AccettazioneHelper; import it.integry.integrywmsnative.gest.accettazione.core.MainListAccettazioneAdapter; +import it.integry.integrywmsnative.gest.accettazione.core.MainListAccettazioneClienteListModel; +import it.integry.integrywmsnative.gest.accettazione.core.MainListAccettazioneListModel; import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; import it.integry.integrywmsnative.gest.accettazione.dto.SitArtOrdDTO; -import it.integry.integrywmsnative.gest.accettazione.rest.OrdiniAccettazioneRESTConsumer; import it.integry.integrywmsnative.gest.accettazione_picking.AccettazionePickingActivity; import it.integry.integrywmsnative.ui.ElevatedToolbar; import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; -public class MainAccettazioneFragment extends Fragment implements ISearcableFragment, ITitledFragment, IScrollableFragment { +public class MainAccettazioneFragment extends BaseFragment implements ISearcableFragment, ITitledFragment, IScrollableFragment, MainAccettazioneViewModel.Listener { + + public BindableBoolean fabVisible = new BindableBoolean(false); + + @Inject + MainAccettazioneViewModel mViewModel; private final List mOnPreDestroyList = new ArrayList<>(); private ElevatedToolbar mToolbar; private FragmentMainAccettazioneBinding mBinding; - private AccettazioneHelper mHelper; - private MainListAccettazioneAdapter mAdapter; - - private List mOriginalOrderList; - private final List mRenderedOrderList = new ArrayList<>(); + private final ObservableArrayList mOrdiniInevasiMutableData = new ObservableArrayList<>(); private AppCompatTextView mAppBarTitle; - - public MainAccettazioneFragment() { // Required empty public constructor } @@ -73,8 +72,6 @@ public class MainAccettazioneFragment extends Fragment implements ISearcableFrag } - - @Override public void onCreateActionBar(AppCompatTextView titleText, Context context) { mAppBarTitle = titleText; @@ -87,21 +84,32 @@ public class MainAccettazioneFragment extends Fragment implements ISearcableFrag mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_main_accettazione, container, false); - init(); + MainApplication.appComponent + .mainAccettazioneComponent() + .create() + .inject(this); + mViewModel.setListener(this); + + mBinding.setLifecycleOwner(this); mBinding.setView(this); - mBinding.accettazioneMainList.setLayoutManager(new LinearLayoutManager(getActivity())); - mBinding.accettazioneMainFab.hide(); - mBinding.accettazioneMainFab.setOnClickListener(v -> { - this.onAccettazioneMainFabClick(); - }); + this.initRecyclerView(); mToolbar.setRecyclerView(mBinding.accettazioneMainList); return mBinding.getRoot(); } + + @Override + public void onStart() { + super.onStart(); + + String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep(); + mViewModel.init(codMdep); + } + @Override public void onDestroy() { for (Runnable onPreDestroy : mOnPreDestroyList) { @@ -111,111 +119,93 @@ public class MainAccettazioneFragment extends Fragment implements ISearcableFrag } - - private void init() { - - final Dialog progress = UtilityProgress.createDefaultProgressDialog(getActivity()); - - mHelper = new AccettazioneHelper(getActivity()); - - mHelper.loadOrdini(ordini -> { - if(ordini != null) { - Toast.makeText(getActivity(), "Caricati " + ordini.size() + " ordini", Toast.LENGTH_LONG).show(); - mOriginalOrderList = ordini; - } - - mBinding.ordiniAccettazioneEmptyView.setVisibility(ordini != null && ordini.size() > 0 ? View.GONE : View.VISIBLE); - refreshRenderedOrdini(ordini); - initRecyclerView(); - progress.dismiss(); - - }, ex -> { - UtilityExceptions.defaultException(getActivity(), ex, progress); - }); - - - } - private void initRecyclerView() { - mAdapter = new MainListAccettazioneAdapter(getActivity(), mRenderedOrderList, onSingleSelectionChanged); - mBinding.accettazioneMainList.setAdapter(mAdapter); - } + this.mViewModel.getOrderList().observe(getViewLifecycleOwner(), this::refreshList); - private void refreshRenderedOrdini(List ordini) { - mRenderedOrderList.clear(); - if(ordini != null) mRenderedOrderList.addAll(ordini); + MainListAccettazioneAdapter adapter = new MainListAccettazioneAdapter(getActivity(), mOrdiniInevasiMutableData) + .setOnGroupItemClicked(x -> { + Stream.of(mOrdiniInevasiMutableData) + .filter(y -> !y.getGroupTitle().equalsIgnoreCase(x) && y.getSelectedObservable().get()) + .forEach(y -> y.getSelectedObservable().set(false)); + + boolean allSelected = Stream.of(mOrdiniInevasiMutableData) + .filter(y -> y.getGroupTitle().equalsIgnoreCase(x)) + .allMatch(y -> y.getSelectedObservable().get()); + + Stream.of(mOrdiniInevasiMutableData) + .filter(y -> y.getGroupTitle().equalsIgnoreCase(x)) + .forEach(y -> y.getSelectedObservable().set(!allSelected)); + }) + .setOnItemChecked(x -> { + Stream.of(mOrdiniInevasiMutableData) + .filter(y -> !y.getGroupTitle().equalsIgnoreCase(x.getGroupTitle()) && y.getSelectedObservable().get()) + .forEach(y -> y.getSelectedObservable().set(false)); + + fabVisible.set(Stream.of(mOrdiniInevasiMutableData) + .anyMatch(y -> y.getSelectedObservable().get())); + }); + + adapter.setEmptyView(this.mBinding.ordiniAccettazioneEmptyView); + + this.mBinding.accettazioneMainList.setAdapter(adapter); + this.mBinding.accettazioneMainList.setLayoutManager(new LinearLayoutManager(getActivity())); + + if (mToolbar != null) + mToolbar.setRecyclerView(this.mBinding.accettazioneMainList); } + private void refreshList(List filteredList) { - private final RunnableArgs onSingleSelectionChanged = dto -> { - List selectedOrders = mHelper.getSelectedOrders(mOriginalOrderList); + List tmpList = null; - if(dto.isSelected()) { - Stream.of(selectedOrders) - .filter(x -> !x.getCodAnagOrd().equalsIgnoreCase(dto.getCodAnagOrd())) - .forEach(x -> x.setSelected(false)); + if (filteredList != null) { + tmpList = filteredList; + } else { + tmpList = mViewModel.getOrderList().getValue(); } - if(selectedOrders != null && selectedOrders.size() > 0) { - mBinding.accettazioneMainFab.show(); - } - else { - mBinding.accettazioneMainFab.hide(); - } - }; + this.mOrdiniInevasiMutableData.clear(); + this.mOrdiniInevasiMutableData.addAll(convertDataModelToListModel(tmpList)); + } - private void onAccettazioneMainFabClick() { + private List convertDataModelToListModel(List dataList) { - List selectedOrders = mHelper.getSelectedOrders(mOriginalOrderList); + return Stream.of(dataList) + .distinctBy(OrdineAccettazioneInevasoDTO::getBarcode) + .sortBy(x -> x.getRagSocOrd() + (x.getDataConsD() != null ? UtilityDate.formatDate(x.getDataConsD(), UtilityDate.COMMONS_DATE_FORMATS.YMD_SLASH) : "")) + .map(x -> { + MainListAccettazioneListModel listModel = new MainListAccettazioneListModel(); - final Dialog progress = UtilityProgress.createDefaultProgressDialog(getActivity()); + listModel.setOriginalModel(x); - OrdiniAccettazioneRESTConsumer.retrievePickingListNewStatic(selectedOrders, sitArtOrds -> { - progress.dismiss(); - - - long artsCounter = Stream.of(sitArtOrds) - .filter(x -> UtilityBigDecimal.greaterThan(x.getQtaDaEvadere(), BigDecimal.ZERO)) - .map(SitArtOrdDTO::getCodMart) - .distinct() - .count(); - - long ordsCounter = Stream.of(sitArtOrds) - .distinctBy(x -> x.getDataOrd() + " " + x.getNumOrd() + " " + x.getGestione()) - .count(); - - - DialogSimpleMessageView.makeInfoDialog(getText(R.string.orders).toString(), - Html.fromHtml(String.format(getActivity().getResources().getQuantityString(R.plurals.loaded_orders_message, (int) ordsCounter), ordsCounter) - + "

" + - "" + artsCounter + " " + getActivity().getResources().getQuantityString(R.plurals.available_articles, (int) artsCounter)), - null, - () -> { - - String cacheSitArtItemID = DataCache.addItem(sitArtOrds); - String cacheOrdersItemID = DataCache.addItem(selectedOrders); - - Intent myIntent = new Intent(getActivity(), AccettazionePickingActivity.class); - myIntent.putExtra("keyOrders", cacheOrdersItemID); - myIntent.putExtra("keySitArts", cacheSitArtItemID); - getActivity().startActivity(myIntent); - - }).show(getActivity().getSupportFragmentManager(), "tag"); - - }, ex -> { - progress.dismiss(); - - String errorMessage = CommonRESTException.tryRecognizeThenGetMessage(ex); - if(errorMessage == null) errorMessage = ex.getMessage() + "\n" + ex.getCause().getCause().getMessage(); - - DialogSimpleMessageView - .makeErrorDialog(new SpannableString(errorMessage), null, null) - .show(getActivity().getSupportFragmentManager(), "tag"); - }); + listModel.setGroupTitle(x.getRagSocOrd()); + + listModel.setDescription(String.format(getString(R.string.ord_acq_testata), x.getNumero().toString(), UtilityDate.formatDate(x.getDataD(), UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN))); + + List clienti = Stream.of(dataList) + .filter(y -> y.getBarcode().equals(x.getBarcode())) + .map(y -> new MainListAccettazioneClienteListModel() + .setPrimaryText(y.getRifOrd()) + .setRightText(UtilityDate.formatDate(y.getDataConsD(), UtilityDate.COMMONS_DATE_FORMATS.DMY_SLASH))) + .toList(); + + listModel.setClientiListModel(clienti); + + return listModel; + }) + .toList(); + } + + public void dispatchOrders() { + List selectedOrders = Stream.of(this.mOrdiniInevasiMutableData) + .filter(x -> x.getSelectedObservable().get()) + .map(MainListAccettazioneListModel::getOriginalModel) + .toList(); + this.mViewModel.loadPicking(selectedOrders); } @@ -236,11 +226,22 @@ public class MainAccettazioneFragment extends Fragment implements ISearcableFrag @Override public boolean onQueryTextChange(String newText) { - final List filtermodelist = mHelper.getFilteredOrdersByFornitore(mOriginalOrderList, newText); - mAdapter.updateItems(filtermodelist); - return true; + List filteredOrders = new ArrayList<>(); + List originalList = this.mViewModel.getOrderList().getValue(); + if(originalList == null || originalList.isEmpty()) return false; + + for(int i = 0; i < originalList.size(); i++){ + + if(originalList.get(i).getRagSocOrd().toLowerCase().contains(newText.toLowerCase())){ + filteredOrders.add(originalList.get(i)); + } + } + + refreshList(filteredOrders); + return true; } + @Override public void setScrollToolbar(ElevatedToolbar toolbar) { mToolbar = toolbar; @@ -251,4 +252,35 @@ public class MainAccettazioneFragment extends Fragment implements ISearcableFrag public void addOnPreDestroy(Runnable onPreDestroy) { this.mOnPreDestroyList.add(onPreDestroy); } + + @Override + public void onOrdersDispatched(List orders, List sitArts) { + long artsCounter = Stream.of(sitArts) + .filter(x -> UtilityBigDecimal.greaterThan(x.getQtaDaEvadere(), BigDecimal.ZERO)) + .map(SitArtOrdDTO::getCodMart) + .distinct() + .count(); + + long ordsCounter = Stream.of(sitArts) + .distinctBy(x -> x.getDataOrd() + " " + x.getNumOrd() + " " + x.getGestione()) + .count(); + + + DialogSimpleMessageView.makeInfoDialog(getText(R.string.orders).toString(), + Html.fromHtml(String.format(getActivity().getResources().getQuantityString(R.plurals.loaded_orders_message, (int) ordsCounter), ordsCounter) + + "

" + + "" + artsCounter + " " + getActivity().getResources().getQuantityString(R.plurals.available_articles, (int) artsCounter)), + null, + () -> { + + String cacheSitArtItemID = DataCache.addItem(sitArts); + String cacheOrdersItemID = DataCache.addItem(orders); + + Intent myIntent = new Intent(getActivity(), AccettazionePickingActivity.class); + myIntent.putExtra("keyOrders", cacheOrdersItemID); + myIntent.putExtra("keySitArts", cacheSitArtItemID); + getActivity().startActivity(myIntent); + + }).show(getActivity().getSupportFragmentManager(), "tag"); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneModule.java new file mode 100644 index 00000000..9480528f --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneModule.java @@ -0,0 +1,20 @@ +package it.integry.integrywmsnative.gest.accettazione; + +import dagger.Module; +import dagger.Provides; +import it.integry.integrywmsnative.gest.accettazione.rest.OrdiniAccettazioneRESTConsumer; + +@Module(subcomponents = {MainAccettazioneComponent.class}) +public class MainAccettazioneModule { + + @Provides + OrdiniAccettazioneRESTConsumer providesOrdiniAccettazioneRESTConsumer() { + return new OrdiniAccettazioneRESTConsumer(); + } + + @Provides + MainAccettazioneViewModel providesMainAccettazioneViewModel(OrdiniAccettazioneRESTConsumer ordiniAccettazioneRESTConsumer) { + return new MainAccettazioneViewModel(ordiniAccettazioneRESTConsumer); + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneViewModel.java new file mode 100644 index 00000000..65a69fc4 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneViewModel.java @@ -0,0 +1,94 @@ +package it.integry.integrywmsnative.gest.accettazione; + +import androidx.lifecycle.MutableLiveData; + +import java.util.List; + +import javax.inject.Inject; + +import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener; +import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; +import it.integry.integrywmsnative.gest.accettazione.dto.SitArtOrdDTO; +import it.integry.integrywmsnative.gest.accettazione.rest.OrdiniAccettazioneRESTConsumer; + +public class MainAccettazioneViewModel { + + private final OrdiniAccettazioneRESTConsumer mOrdiniAccettazioneRESTConsumer; + + private final MutableLiveData> mOrderList = new MutableLiveData<>(); + + private Listener mListener; + private String codMdep; + + @Inject + public MainAccettazioneViewModel(OrdiniAccettazioneRESTConsumer ordiniAccettazioneRESTConsumer) { + this.mOrdiniAccettazioneRESTConsumer = ordiniAccettazioneRESTConsumer; + } + + public void init(String currentCodMdep) { + this.codMdep = currentCodMdep; + + this.sendOnLoadingStarted(); + new Thread(() -> { + + mOrdiniAccettazioneRESTConsumer.getOrdiniInevasi(codMdep, orderList -> { + this.mOrderList.setValue(orderList); + + this.sendOnLoadingEnded(); + }, this::sendError); + + }).start(); + } + + + public void loadPicking(List selectedOrders) { + + this.sendOnLoadingStarted(); + + new Thread(() -> { + + this.mOrdiniAccettazioneRESTConsumer.retrievePickingListNew(selectedOrders, sitArtOrds -> { + + this.sendOnOrdersDispatched(selectedOrders, sitArtOrds); + this.sendOnLoadingEnded(); + + }, this::sendError); + + }).start(); + + } + + + public MutableLiveData> getOrderList() { + return mOrderList; + } + + public MainAccettazioneViewModel setListener(Listener listener) { + this.mListener = listener; + return this; + } + + 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); + } + + private void sendOnOrdersDispatched(List orders, List sitArts) { + if (this.mListener != null) mListener.onOrdersDispatched(orders, sitArts); + } + + public interface Listener extends ILoadingListener { + + void onError(Exception ex); + + void onOrdersDispatched(List orders, List sitArts); + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/AccettazioneHelper.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/AccettazioneHelper.java deleted file mode 100644 index 0d7c4a23..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/AccettazioneHelper.java +++ /dev/null @@ -1,87 +0,0 @@ -package it.integry.integrywmsnative.gest.accettazione.core; - -import android.content.Context; - -import com.annimon.stream.Stream; - -import java.util.ArrayList; -import java.util.List; - -import it.integry.integrywmsnative.core.expansion.RunnableArgs; -import it.integry.integrywmsnative.core.rest.RESTBuilder; -import it.integry.integrywmsnative.core.rest.model.EsitoType; -import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; -import it.integry.integrywmsnative.core.settings.SettingsManager; -import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; -import it.integry.integrywmsnative.gest.accettazione.rest.OrdiniAccettazioneRESTConsumerService; -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; - -/** - * Created by GiuseppeS on 06/03/2018. - */ - -public class AccettazioneHelper { - - private Context mContext; - - public AccettazioneHelper(Context context){ - mContext = context; - } - - public void loadOrdini(RunnableArgs> onComplete, RunnableArgs onFailed){ - String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep(); - - OrdiniAccettazioneRESTConsumerService service = RESTBuilder.getService(OrdiniAccettazioneRESTConsumerService.class); - service.listOrdiniInevasi(codMdep, "A").enqueue(new Callback>>() { - @Override - public void onResponse(Call>> call, Response>> response) { - - if(response.isSuccessful()) { - - if(response.body() != null) { - if(response.body().getEsito() == EsitoType.OK) { - onComplete.run(response.body().getDto()); - } else { - onFailed.run(new Exception(response.body().getErrorMessage())); - } - } else { - onFailed.run(new Exception(response.message())); - } - } else { - onFailed.run(new Exception("Status " + response.code() + ": " + response.message())); - } - } - - @Override - public void onFailure(Call>> call, Throwable t) { - onFailed.run(new Exception(t)); - } - }); - } - - - - - public List getSelectedOrders(List ordiniList){ - return Stream.of(ordiniList) - .filter(OrdineAccettazioneInevasoDTO::isSelected) - .toList(); - } - - - public List getFilteredOrdersByFornitore(List groupedOrdiniInevasi, String textFilter){ - List filteredOrders = new ArrayList<>(); - - for(int i = 0; i < groupedOrdiniInevasi.size(); i++){ - - if(groupedOrdiniInevasi.get(i).getRagSocOrd().toLowerCase().contains(textFilter.toLowerCase())){ - filteredOrders.add(groupedOrdiniInevasi.get(i)); - } - } - return filteredOrders; - } - - -} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneAdapter.java index af1d4c2d..4b2ab3de 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneAdapter.java @@ -3,36 +3,28 @@ package it.integry.integrywmsnative.gest.accettazione.core; import android.content.Context; import android.text.Html; import android.view.LayoutInflater; +import android.view.View; import android.view.ViewGroup; import androidx.databinding.DataBindingUtil; -import androidx.databinding.Observable; +import androidx.databinding.ObservableArrayList; import androidx.recyclerview.widget.RecyclerView; -import com.annimon.stream.Stream; -import com.zhukic.sectionedrecyclerview.SectionedRecyclerViewAdapter; - -import java.util.List; - import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.di.BindableBoolean; +import it.integry.integrywmsnative.core.expansion.OnSingleClickListener; import it.integry.integrywmsnative.core.expansion.RunnableArgs; -import it.integry.integrywmsnative.core.utility.UtilityDate; +import it.integry.integrywmsnative.core.expansion.view.ExtendedSectionedRecyclerView; import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.databinding.AccettazioneMainListGroupClientiBinding; import it.integry.integrywmsnative.databinding.AccettazioneMainListGroupModelBinding; import it.integry.integrywmsnative.databinding.AccettazioneMainListModelBinding; -import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; -import it.integry.integrywmsnative.ui.fastscroll.SectionTitleProvider; - -public class MainListAccettazioneAdapter extends SectionedRecyclerViewAdapter implements SectionTitleProvider { +public class MainListAccettazioneAdapter extends ExtendedSectionedRecyclerView { private Context mContext; - private List mOriginalDataset; - private List mDataset; - private RunnableArgs mOnSingleSelectionChanged; + private RunnableArgs mOnGroupItemClicked; + private RunnableArgs mOnItemChecked; static class SubheaderHolder extends RecyclerView.ViewHolder { @@ -55,31 +47,22 @@ public class MainListAccettazioneAdapter extends SectionedRecyclerViewAdapter myDataset, RunnableArgs onSingleSelectionChanged) { + public MainListAccettazioneAdapter(Context context, ObservableArrayList myDataset) { + super(myDataset); mContext = context; - mOriginalDataset = myDataset; - mDataset = orderItems(myDataset); - mOnSingleSelectionChanged = onSingleSelectionChanged; } - public void updateItems(List updatedDataset) { - mDataset.clear(); - mDataset.addAll(orderItems(updatedDataset)); - notifyDataSetChanged(); - notifyDataChanged(); + public MainListAccettazioneAdapter setOnGroupItemClicked(RunnableArgs onGroupItemClicked) { + this.mOnGroupItemClicked = onGroupItemClicked; + return this; } - - private List orderItems(List dataset) { - return Stream.of(dataset) - .distinctBy(OrdineAccettazioneInevasoDTO::getBarcode) - .sortBy(x -> x.getRagSocOrd() + (x.getDataConsD() != null ? UtilityDate.formatDate(x.getDataConsD(), UtilityDate.COMMONS_DATE_FORMATS.YMD_SLASH) : "")) - .toList(); - + public MainListAccettazioneAdapter setOnItemChecked(RunnableArgs onItemChecked) { + this.mOnItemChecked = onItemChecked; + return this; } - @Override public SubheaderHolder onCreateSubheaderViewHolder(ViewGroup parent, int viewType) { AccettazioneMainListModelBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.accettazione_main_list_model, parent, false); @@ -95,48 +78,32 @@ public class MainListAccettazioneAdapter extends SectionedRecyclerViewAdapter { - - boolean anySelected = Stream.of(mDataset) - .filter(x -> x.getCodAnagOrd().equals(mDataset.get(nextItemPosition).getCodAnagOrd())) - .anyMatch(OrdineAccettazioneInevasoDTO::isSelected); - - Stream.of(mDataset) - .filter(x -> x.getCodAnagOrd().equals(mDataset.get(nextItemPosition).getCodAnagOrd())) - .forEach(x -> x.setSelected(!anySelected)); + subheaderHolder.binding.getRoot().setOnClickListener(new OnSingleClickListener() { + @Override + public void onSingleClick(View v) { + if(mOnGroupItemClicked != null) mOnGroupItemClicked.run(mDataset.get(nextItemPosition).getGroupTitle()); + } }); } @Override - public void onBindItemViewHolder(SingleItemViewHolder h, int itemPosition) { - final OrdineAccettazioneInevasoDTO ordine = mDataset.get(itemPosition); - final SingleItemViewHolder holder = h; + public void onBindItemViewHolder(SingleItemViewHolder holder, int itemPosition) { + final MainListAccettazioneListModel ordine = mDataset.get(itemPosition); - holder.binding.accettazioneMainListGroupItemContainerCheckBox.setTag(ordine.getNumero()); - - holder.binding.accettazioneMainListGroupItemContainerCheckBox.setOnCheckedChangeListener(null); - - ordine.selected.resetOnPropertyChangedCallback(); - - - String testataOrdString = String.format(mContext.getString(R.string.ord_acq_testata), String.valueOf(ordine.getNumero()), UtilityDate.formatDate(ordine.getDataD(), UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN)); - holder.binding.accettazioneMainListGroupItemContainerTestataOrd.setText(Html.fromHtml(testataOrdString)); + ordine.getSelectedObservable().resetOnPropertyChangedCallback(); holder.binding.accettazioneMainListGroupItemContainerClientiOrd.removeAllViews(); + holder.binding.accettazioneMainListGroupItemContainerTestataOrd.setText(Html.fromHtml(ordine.getDescription())); - List clienti = Stream.of(mOriginalDataset) - .filter(x -> x.getBarcode().equals(ordine.getBarcode())) - .toList(); - - for (OrdineAccettazioneInevasoDTO cliente : clienti) { + for (MainListAccettazioneClienteListModel cliente : ordine.getClientiListModel()) { AccettazioneMainListGroupClientiBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.accettazione_main_list_group_clienti, holder.binding.accettazioneMainListGroupItemContainerClientiOrd, false); - binding.accettazioneMainListGroupClientiComm.setText(cliente.getRifOrd()); + binding.accettazioneMainListGroupClientiComm.setText(cliente.getPrimaryText()); - if (!UtilityString.isNullOrEmpty(cliente.getDataConsS())) { - binding.accettazioneMainListGroupClientiDatacons.setText(UtilityDate.formatDate(cliente.getDataConsD(), UtilityDate.COMMONS_DATE_FORMATS.DMY_SLASH)); + if (!UtilityString.isNullOrEmpty(cliente.getRightText())) { + binding.accettazioneMainListGroupClientiDatacons.setText(cliente.getRightText()); } else { binding.accettazioneMainListGroupClientiDatacons.setText(""); } @@ -144,37 +111,34 @@ public class MainListAccettazioneAdapter extends SectionedRecyclerViewAdapter { + if(this.mOnItemChecked != null) this.mOnItemChecked.run(ordine); + }); holder.binding.getRoot().setOnClickListener(v -> { - ordine.setSelected(!ordine.isSelected()); + ordine.getSelectedObservable().set(!ordine.getSelectedObservable().get()); }); - holder.binding.accettazioneMainListGroupItemContainerCheckBox.setChecked(ordine.isSelected()); - - //Bindable to View - ordine.selected.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() { - @Override - public void onPropertyChanged(Observable sender, int propertyId) { - if(holder.binding.accettazioneMainListGroupItemContainerCheckBox.getTag().equals(ordine.getNumero())) { - holder.binding.accettazioneMainListGroupItemContainerCheckBox.setChecked(((BindableBoolean) sender).get()); - } - } - }); - - - //View to Bindable - holder.binding.accettazioneMainListGroupItemContainerCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> { - ordine.setSelected(isChecked); - mOnSingleSelectionChanged.run(ordine); - }); } @Override public boolean onPlaceSubheaderBetweenItems(int position) { - return !this.mDataset.get(position).getRagSocOrd().equalsIgnoreCase(this.mDataset.get(position + 1).getRagSocOrd()); + if (getItemSize() == 1) return true; + else if (getItemSize() > 1) { + MainListAccettazioneListModel compare1 = this.mDataset.get(position); + MainListAccettazioneListModel compare2 = this.mDataset.get(position + 1); + if (UtilityString.equalsIgnoreCase(compare1.getGroupTitle(), compare2.getGroupTitle())) { + return false; + } + } + + return true; } @Override @@ -182,11 +146,4 @@ public class MainListAccettazioneAdapter extends SectionedRecyclerViewAdapter clientiListModel; + + + public String getGroupTitle() { + return groupTitle; + } + + public MainListAccettazioneListModel setGroupTitle(String groupTitle) { + this.groupTitle = groupTitle; + return this; + } + + public String getDescription() { + return description; + } + + public MainListAccettazioneListModel setDescription(String description) { + this.description = description; + return this; + } + + public boolean isHidden() { + return hidden; + } + + public MainListAccettazioneListModel setHidden(boolean hidden) { + this.hidden = hidden; + return this; + } + + public BindableBoolean getSelectedObservable() { + return selected; + } + + public OrdineAccettazioneInevasoDTO getOriginalModel() { + return originalModel; + } + + public MainListAccettazioneListModel setOriginalModel(OrdineAccettazioneInevasoDTO originalModel) { + this.originalModel = originalModel; + return this; + } + + public List getClientiListModel() { + return clientiListModel; + } + + public MainListAccettazioneListModel setClientiListModel(List clientiListModel) { + this.clientiListModel = clientiListModel; + return this; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/dto/OrdineAccettazioneDTO.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/dto/OrdineAccettazioneDTO.java deleted file mode 100644 index 1dcf6003..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/dto/OrdineAccettazioneDTO.java +++ /dev/null @@ -1,481 +0,0 @@ -package it.integry.integrywmsnative.gest.accettazione.dto; - -import android.os.Parcel; -import android.os.Parcelable; -import android.util.Log; - -import java.math.BigDecimal; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import it.integry.integrywmsnative.core.model.MtbAart; -import it.integry.integrywmsnative.core.model.MtbColt; -import it.integry.integrywmsnative.core.model.secondary.GestioneEnum; -import it.integry.integrywmsnative.core.utility.UtilityDate; - -/** - * Created by GiuseppeS on 06/03/2018. - */ - -public class OrdineAccettazioneDTO implements Parcelable { - - private String ragSoc; - private int numero; - private String data; - private String gestione; - private String codMdep; - private String codAnag; - private String codVdes; - private String termCons; - private ArrayList ordini; - private String codAlis; - private String rifOrd; - - - public static class Riga implements Parcelable { - private Float qtaOrd; //QTA ORDINATA (tutta la qta ordiata) - public Float qtaRiservate; //QTA COLLI (tutta la qta giĂ  accantonata nei colli - private Float qtaEvasa; //QTA EVASA ORDINE (qta con documento) - //public Float qtaDaEvadere; //qta_ord - qta_evasa - qta_colli - public int rigaOrd; - public String codJcom; - public String ragSocCom; - public String descrizioneCommessa; - public MtbAart mtbAart; - private PickingObjectDTO[] colliAssociati; - private Boolean hidden = null; - private Boolean tempHidden = null; - private String partitaMag; - private String codArtFor; - public String descrizioneEstesa; - public String codAlis; - - public int numOrd; - public String dataOrd; - public String gestioneOrd; - - public String dataCons; - - public BigDecimal getQtaDaEvadere() { - return this.getQtaOrd().subtract(this.getQtaEvasa()).subtract(this.getQtaRiservate()); - } - - - public BigDecimal getQtaOrd() { - return qtaOrd != null ? new BigDecimal(qtaOrd) : BigDecimal.ZERO; - } - - public BigDecimal getQtaRiservate() { - return qtaRiservate != null ? new BigDecimal(qtaRiservate) : BigDecimal.ZERO; - } - - public BigDecimal getQtaEvasa() { - return qtaEvasa != null ? new BigDecimal(qtaEvasa) : BigDecimal.ZERO; - } - - public int getRigaOrd() { - return rigaOrd; - } - - public String getCodJcom() { - return codJcom; - } - - public String getRagSocCom() { - return ragSocCom; - } - - public String getDescrizioneCommessa() { - return descrizioneCommessa; - } - - public MtbAart getMtbAart() { - return mtbAart; - } - - public PickingObjectDTO[] getColliAssociati() { - return colliAssociati; - } - - public Boolean isHidden() { - return hidden; - } - - public Boolean isTempHidden() { - return tempHidden; - } - - public String getPartitaMag() { - return partitaMag; - } - - public String getCodArtFor() { - return codArtFor; - } - - public String getDescrizioneEstesa() { - return descrizioneEstesa; - } - - public String getCodAlis() { - return codAlis; - } - - public int getNumOrd() { - return numOrd; - } - - public String getGestioneOrd() { - return gestioneOrd; - } - - public GestioneEnum getGestioneOrdEnum() { - return GestioneEnum.fromString(gestioneOrd); - } - - public String getDataCons() { - return dataCons; - } - - public String getDataOrdS() { - return this.dataOrd; - } - - public Date getDataOrdD() { - return UtilityDate.recognizeDateWithExceptionHandler(getDataOrdS()); - } - - - public Riga setQtaOrd(Float qtaOrd) { - this.qtaOrd = qtaOrd; - return this; - } - - public Riga setQtaRiservate(BigDecimal qtaRiservate) { - this.qtaRiservate = qtaRiservate.floatValue(); - return this; - } - - public Riga setQtaEvasa(Float qtaEvasa) { - this.qtaEvasa = qtaEvasa; - return this; - } - - public Riga setRigaOrd(int rigaOrd) { - this.rigaOrd = rigaOrd; - return this; - } - - public Riga setCodJcom(String codJcom) { - this.codJcom = codJcom; - return this; - } - - public Riga setRagSocCom(String ragSocCom) { - this.ragSocCom = ragSocCom; - return this; - } - - public Riga setDescrizioneCommessa(String descrizioneCommessa) { - this.descrizioneCommessa = descrizioneCommessa; - return this; - } - - public Riga setMtbAart(MtbAart mtbAart) { - this.mtbAart = mtbAart; - return this; - } - - public Riga setHidden(boolean hidden) { - this.hidden = hidden; - return this; - } - - public Riga setTempHidden(boolean hidden) { - this.tempHidden = hidden; - return this; - } - - public Riga setPartitaMag(String partitaMag) { - this.partitaMag = partitaMag; - return this; - } - - public Riga setCodArtFor(String codArtFor) { - this.codArtFor = codArtFor; - return this; - } - - public Riga setDescrizioneEstesa(String descrizioneEstesa) { - this.descrizioneEstesa = descrizioneEstesa; - return this; - } - - public Riga setCodAlis(String codAlis) { - this.codAlis = codAlis; - return this; - } - - public Riga setNumOrd(int numOrd) { - this.numOrd = numOrd; - return this; - } - - public Riga setDataOrd(String dataOrd) { - this.dataOrd = dataOrd; - return this; - } - - public Riga setGestioneOrd(String gestioneOrd) { - this.gestioneOrd = gestioneOrd; - return this; - } - - public Riga setDataCons(String dataCons) { - this.dataCons = dataCons; - return this; - } - - - - public Riga(){} - - protected Riga(Parcel in) { - qtaOrd = in.readByte() == 0x00 ? null : in.readFloat(); - qtaRiservate = in.readByte() == 0x00 ? null : in.readFloat(); - rigaOrd = in.readInt(); - codJcom = in.readString(); - ragSocCom = in.readString(); - descrizioneCommessa = in.readString(); - mtbAart = (MtbAart) in.readValue(MtbAart.class.getClassLoader()); - hidden = in.readByte() == 0x00 ? null : in.readByte() != 0x00; - partitaMag = in.readString(); - codArtFor = in.readString(); - descrizioneEstesa = in.readString(); - codAlis = in.readString(); - numOrd = in.readInt(); - dataOrd = in.readString(); - gestioneOrd = in.readString(); - dataCons = in.readString(); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - if (qtaOrd == null) { - dest.writeByte((byte) (0x00)); - } else { - dest.writeByte((byte) (0x01)); - dest.writeFloat(qtaOrd); - } - if (qtaRiservate == null) { - dest.writeByte((byte) (0x00)); - } else { - dest.writeByte((byte) (0x01)); - dest.writeFloat(qtaRiservate); - } - dest.writeInt(rigaOrd); - dest.writeString(codJcom); - dest.writeString(ragSocCom); - dest.writeString(descrizioneCommessa); - dest.writeValue(mtbAart); - if (hidden == null) { - dest.writeByte((byte) (0x00)); - } else { - dest.writeByte((byte) (0x01)); - dest.writeByte((byte) (hidden ? 0x01 : 0x00)); - } - dest.writeString(partitaMag); - dest.writeString(codArtFor); - dest.writeString(descrizioneEstesa); - dest.writeString(codAlis); - dest.writeInt(numOrd); - dest.writeString(dataOrd); - dest.writeString(gestioneOrd); - dest.writeString(dataCons); - } - - @SuppressWarnings("unused") - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public Riga createFromParcel(Parcel in) { - return new Riga(in); - } - - @Override - public Riga[] newArray(int size) { - return new Riga[size]; - } - }; - - } - - public static class PickingObjectDTO extends MtbColt{ - public boolean hidden = false; - } - - public OrdineAccettazioneDTO() {} - - protected OrdineAccettazioneDTO(Parcel in) { - ragSoc = in.readString(); - numero = in.readInt(); - data = in.readString(); - gestione = in.readString(); - codMdep = in.readString(); - codAnag = in.readString(); - codVdes = in.readString(); - termCons = in.readString(); - codAlis = in.readString(); - rifOrd = in.readString(); - if (in.readByte() == 0x01) { - ordini = new ArrayList(); - in.readList(ordini, Riga.class.getClassLoader()); - } else { - ordini = null; - } - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(ragSoc); - dest.writeInt(numero); - dest.writeString(data); - dest.writeString(gestione); - dest.writeString(codMdep); - dest.writeString(codAnag); - dest.writeString(codVdes); - dest.writeString(termCons); - dest.writeString(codAlis); - dest.writeString(rifOrd); - if (ordini == null) { - dest.writeByte((byte) (0x00)); - } else { - dest.writeByte((byte) (0x01)); - dest.writeList(ordini); - } - } - - @SuppressWarnings("unused") - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public OrdineAccettazioneDTO createFromParcel(Parcel in) { - return new OrdineAccettazioneDTO(in); - } - - @Override - public OrdineAccettazioneDTO[] newArray(int size) { - return new OrdineAccettazioneDTO[size]; - } - }; - - - public String getRagSoc() { - return ragSoc; - } - - public OrdineAccettazioneDTO setRagSoc(String ragSoc) { - this.ragSoc = ragSoc; - return this; - } - - public int getNumero() { - return numero; - } - - public OrdineAccettazioneDTO setNumero(int numero) { - this.numero = numero; - return this; - } - - public String getData() { - return data; - } - - public OrdineAccettazioneDTO setData(String data) { - this.data = data; - return this; - } - - public String getGestione() { - return gestione; - } - - public OrdineAccettazioneDTO setGestione(String gestione) { - this.gestione = gestione; - return this; - } - - public String getCodMdep() { - return codMdep; - } - - public OrdineAccettazioneDTO setCodMdep(String codMdep) { - this.codMdep = codMdep; - return this; - } - - public String getCodAnag() { - return codAnag; - } - - public OrdineAccettazioneDTO setCodAnag(String codAnag) { - this.codAnag = codAnag; - return this; - } - - public String getCodVdes() { - return codVdes; - } - - public OrdineAccettazioneDTO setCodVdes(String codVdes) { - this.codVdes = codVdes; - return this; - } - - public String getTermCons() { - return termCons; - } - - public OrdineAccettazioneDTO setTermCons(String termCons) { - this.termCons = termCons; - return this; - } - - public ArrayList getOrdini() { - return ordini; - } - - public OrdineAccettazioneDTO setOrdini(ArrayList ordini) { - this.ordini = ordini; - return this; - } - - public String getCodAlis() { - return codAlis; - } - - public OrdineAccettazioneDTO setCodAlis(String codAlis) { - this.codAlis = codAlis; - return this; - } - - public String getRifOrd() { - return rifOrd; - } - - public OrdineAccettazioneDTO setRifOrd(String rifOrd) { - this.rifOrd = rifOrd; - return this; - } -} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/rest/OrdiniAccettazioneRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/rest/OrdiniAccettazioneRESTConsumer.java index 2320e41f..7c1e054f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/rest/OrdiniAccettazioneRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/rest/OrdiniAccettazioneRESTConsumer.java @@ -22,6 +22,22 @@ import retrofit2.Response; public class OrdiniAccettazioneRESTConsumer extends _BaseRESTConsumer { + public void getOrdiniInevasi(String codMdep, RunnableArgs> onComplete, RunnableArgs onFailed) { + OrdiniAccettazioneRESTConsumerService service = RESTBuilder.getService(OrdiniAccettazioneRESTConsumerService.class); + service.listOrdiniInevasi(codMdep, "A").enqueue(new Callback<>() { + @Override + public void onResponse(Call>> call, Response>> response) { + analyzeAnswer(response, "getOrdiniInevasi", onComplete, onFailed); + } + + @Override + public void onFailure(Call>> call, Throwable t) { + onFailed.run(new Exception(t)); + } + }); + } + + public void retrievePickingListNew(List orders, RunnableArgs> onComplete, RunnableArgs onFailed) { retrievePickingListNewStatic(orders, onComplete, onFailed); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java index 94a5867a..11a6fb3c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java @@ -155,7 +155,6 @@ public class OrdiniUscitaElencoFragment extends BaseFragment implements ITitledF OrdiniUscitaElencoAdapter ordiniUscitaElencoAdapter = new OrdiniUscitaElencoAdapter(getActivity(), mOrdiniInevasiMutableData) - .setEmptyView(this.mBindings.ordiniVenditaEmptyView) .setOnGroupItemClicked(x -> { if (!canSelectMultipleClienti) { Stream.of(mOrdiniInevasiMutableData) @@ -182,6 +181,9 @@ public class OrdiniUscitaElencoFragment extends BaseFragment implements ITitledF .anyMatch(y -> y.getSelectedObservable().get())); }); + ordiniUscitaElencoAdapter + .setEmptyView(this.mBindings.ordiniVenditaEmptyView); + this.mBindings.venditaMainList.setAdapter(ordiniUscitaElencoAdapter); this.mBindings.venditaMainList.setLayoutManager(new LinearLayoutManager(getActivity())); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/list/OrdiniUscitaElencoAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/list/OrdiniUscitaElencoAdapter.java index 0df07d14..5a3ec3f6 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/list/OrdiniUscitaElencoAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/list/OrdiniUscitaElencoAdapter.java @@ -10,28 +10,19 @@ import android.view.ViewGroup; import androidx.core.content.res.ResourcesCompat; import androidx.databinding.DataBindingUtil; import androidx.databinding.ObservableArrayList; -import androidx.databinding.ObservableList; import androidx.recyclerview.widget.RecyclerView; -import com.zhukic.sectionedrecyclerview.SectionedRecyclerViewAdapter; - -import java.util.ArrayList; -import java.util.List; - import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.expansion.OnListGeneralChangedCallback; import it.integry.integrywmsnative.core.expansion.OnSingleClickListener; import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.expansion.view.ExtendedSectionedRecyclerView; import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.databinding.FragmentMainOrdiniUscitaListGroupModelBinding; import it.integry.integrywmsnative.databinding.FragmentMainOrdiniUscitaListModelBinding; -public class OrdiniUscitaElencoAdapter extends SectionedRecyclerViewAdapter { - - private final Context mContext; - private final List mDataset = new ArrayList<>(); - private View mEmptyView; +public class OrdiniUscitaElencoAdapter extends ExtendedSectionedRecyclerView { + private Context mContext; private RunnableArgs mOnGroupItemClicked; private RunnableArgs mOnItemChecked; @@ -57,18 +48,8 @@ public class OrdiniUscitaElencoAdapter extends SectionedRecyclerViewAdapter mutableDataSet) { - this.mContext = context; - - mutableDataSet.addOnListChangedCallback(new OnListGeneralChangedCallback() { - @Override - public void onChanged(ObservableList sender) { - mDataset.clear(); - mDataset.addAll(sender); - notifyDataSetChanged(); - notifyDataChanged(); - checkIfEmpty(); - } - }); + super(mutableDataSet); + mContext = context; } public OrdiniUscitaElencoAdapter setOnGroupItemClicked(RunnableArgs onGroupItemClicked) { @@ -81,19 +62,6 @@ public class OrdiniUscitaElencoAdapter extends SectionedRecyclerViewAdapter - + @@ -17,12 +17,13 @@ android:padding="8dp"> - + tools:layout_editor_absoluteY="1dp" + app:checked="@{selected}" /> - - + + + + - - - + android:layout_height="match_parent"> + + + android:adjustViewBounds="true" + android:src="@drawable/ic_playlist_add_check_24dp" /> + android:textSize="18sp" /> - + + app:srcCompat="@drawable/ic_check_black_24dp" + app:visibility="@{view.fabVisible}" />
\ No newline at end of file diff --git a/app/src/main/res/layout/fragment_main_ordini_uscita__list_group_model.xml b/app/src/main/res/layout/fragment_main_ordini_uscita__list_group_model.xml index bd4973db..d23a78a2 100644 --- a/app/src/main/res/layout/fragment_main_ordini_uscita__list_group_model.xml +++ b/app/src/main/res/layout/fragment_main_ordini_uscita__list_group_model.xml @@ -44,7 +44,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/transparent" - app:checked="@{selected}"/> + app:checked="@{selected}" /> Date: Thu, 5 Aug 2021 19:11:44 +0200 Subject: [PATCH 04/18] Refactoring activity contenuto bancale --- .../MainApplicationComponent.java | 6 +- .../MainApplicationModule.java | 7 + .../core/expansion/BaseActivity.java | 47 ++- .../rest/consumers/DepositoRESTConsumer.java | 14 +- .../rest/consumers/PrinterRESTConsumer.java | 20 -- .../AccettazionePickingActivity.java | 2 - .../ContenutoBancaleActivity.java | 138 +++++++- .../ContenutoBancaleComponent.java | 15 + .../ContenutoBancaleModule.java | 7 + .../ContenutoBancaleViewModel.java | 39 +++ .../core/ContenutoBancaleListAdapter.java | 86 ++--- .../viewmodel/ContenutoBancaleViewModel.java | 143 -------- .../res/layout/activity_contenuto_bancale.xml | 305 +++++++++--------- 13 files changed, 418 insertions(+), 411 deletions(-) create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleComponent.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleModule.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleViewModel.java delete mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/viewmodel/ContenutoBancaleViewModel.java diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java index b09c57e6..1d216f65 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java @@ -9,6 +9,8 @@ import it.integry.integrywmsnative.gest.accettazione.MainAccettazioneComponent; import it.integry.integrywmsnative.gest.accettazione.MainAccettazioneModule; import it.integry.integrywmsnative.gest.accettazione_picking.AccettazionePickingComponent; import it.integry.integrywmsnative.gest.accettazione_picking.AccettazionePickingModule; +import it.integry.integrywmsnative.gest.contenuto_bancale.ContenutoBancaleComponent; +import it.integry.integrywmsnative.gest.contenuto_bancale.ContenutoBancaleModule; import it.integry.integrywmsnative.gest.main.MainActivityComponent; import it.integry.integrywmsnative.gest.main.MainActivityModule; import it.integry.integrywmsnative.gest.main.MainFragmentComponent; @@ -58,9 +60,10 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr RoomModule.class, SplashActivityModule.class, MainApplicationModule.class, + MainActivityModule.class, MainFragmentModule.class, MainAccettazioneModule.class, - MainActivityModule.class, + ContenutoBancaleModule.class, PVOrdineAcquistoGrigliaModule.class, PVOrdineAcquistoEditModule.class, PickingLiberoModule.class, @@ -87,6 +90,7 @@ public interface MainApplicationComponent { MainActivityComponent.Factory mainActivityComponent(); MainFragmentComponent.Factory mainFragmentComponent(); MainAccettazioneComponent.Factory mainAccettazioneComponent(); + ContenutoBancaleComponent.Factory contenutoBancaleComponent(); PVOrdineAcquistoGrigliaComponent.Factory pvOrdineAcquistoGrigliaComponent(); PVOrdineAcquistoEditComponent.Factory pvOrdineAcquistoEditComponent(); PickingLiberoComponent.Factory pickingLiberoComponent(); diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java index c7f743f8..b8050226 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java @@ -14,6 +14,7 @@ import it.integry.integrywmsnative.core.menu.MenuService; 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.DepositoRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.GestSetupRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.MagazzinoRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.MesRESTConsumer; @@ -82,6 +83,12 @@ public class MainApplicationModule { return new ArticoloRESTConsumer(); } + @Provides + @Singleton + DepositoRESTConsumer provideDepositoRESTConsumer() { + return new DepositoRESTConsumer(); + } + @Provides @Singleton MenuRESTConsumer provideMenuRESTConsumer() { diff --git a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseActivity.java b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseActivity.java index 4bb3dc50..89bb6199 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseActivity.java @@ -6,6 +6,7 @@ import android.view.KeyEvent; import androidx.appcompat.app.AppCompatActivity; import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; +import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityProgress; public class BaseActivity extends AppCompatActivity { @@ -38,19 +39,45 @@ public class BaseActivity extends AppCompatActivity { } - protected void openProgress() { - BarcodeManager.disable(); - if (this.mCurrentProgress == null) { - this.mCurrentProgress = UtilityProgress.createDefaultProgressDialog(this); - } + runOnUiThread(() -> { + BarcodeManager.disable(); + if (this.mCurrentProgress == null) { + this.mCurrentProgress = UtilityProgress.createDefaultProgressDialog(this); + } + }); } protected void closeProgress() { - BarcodeManager.enable(); - if (mCurrentProgress != null) { - mCurrentProgress.dismiss(); - mCurrentProgress = null; - } + runOnUiThread(() -> { + BarcodeManager.enable(); + if (mCurrentProgress != null) { + mCurrentProgress.dismiss(); + mCurrentProgress = null; + } + }); + } + + + public void onLoadingStarted() { + new Thread(() -> { + BarcodeManager.disable(); + this.openProgress(); + }).start(); + } + + public void onLoadingEnded() { + new Thread(() -> { + this.closeProgress(); + BarcodeManager.enable(); + }).start(); + } + + public void onError(Exception ex) { + this.runOnUiThread(() -> { + this.closeProgress(); + UtilityExceptions.defaultException(this, ex, mCurrentProgress); + BarcodeManager.enable(); + }); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DepositoRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DepositoRESTConsumer.java index e1a8d5ee..7eeeb3d2 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DepositoRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DepositoRESTConsumer.java @@ -2,31 +2,33 @@ package it.integry.integrywmsnative.core.rest.consumers; import java.util.List; +import javax.inject.Singleton; + import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.model.CommonModelConsts; import it.integry.integrywmsnative.core.model.MtbDepo; -import it.integry.integrywmsnative.core.utility.UtilityLogger; -public class DepositoRESTConsumer { +@Singleton +public class DepositoRESTConsumer extends _BaseRESTConsumer { - public static void getDepoByCodMdep(String codMdep, RunnableArgs onComplete) { + public void getDepoByCodMdep(String codMdep, RunnableArgs onComplete, RunnableArgs onFailed) { MtbDepo mtbDepo = new MtbDepo(); mtbDepo.setCodMdep(codMdep); mtbDepo.setOperation(CommonModelConsts.OPERATION.SELECT); mtbDepo.setOnlyPkMaster(false); - EntityRESTConsumer.selectEntity(mtbDepo, new ISimpleOperationCallback>() { + EntityRESTConsumer.selectEntity(mtbDepo, new ISimpleOperationCallback<>() { @Override public void onSuccess(List value) { - if(value != null && value.size() > 0) { + if (value != null && value.size() > 0) { onComplete.run(value.get(0)); } } @Override public void onFailed(Exception ex) { - UtilityLogger.errorMe(ex); + onFailed.run(ex); } }, MtbDepo.class); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PrinterRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PrinterRESTConsumer.java index 7362e3a0..9136247d 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PrinterRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PrinterRESTConsumer.java @@ -32,27 +32,7 @@ public class PrinterRESTConsumer extends _BaseRESTConsumer { } - public static void getAvailablePrintersStatic(final ISimpleOperationCallback> callback) { - PrinterRESTConsumerService printerService = RESTBuilder.getService(PrinterRESTConsumerService.class); - printerService.getAvailablePrinters().enqueue(new Callback>>() { - @Override - public void onResponse(Call>> call, Response>> response) { - analyzeAnswer(response, "GetAvailablePrinters", callback); - } - - @Override - public void onFailure(Call>> call, Throwable t) { - - } - }); - } - public void getAvailablePrinters(String codMdep, final RunnableArgs> onComplete, final RunnableArgs onFailed) { - getAvailablePrintersStatic(codMdep, onComplete, onFailed); - } - - public static void getAvailablePrintersStatic(String codMdep, final RunnableArgs> onComplete, RunnableArgs onFailed) { - PrinterRESTConsumerService printerService = RESTBuilder.getService(PrinterRESTConsumerService.class); printerService.getAvailablePrinters(codMdep).enqueue(new Callback>>() { @Override diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingActivity.java index cb91bac0..3f9687fc 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingActivity.java @@ -117,8 +117,6 @@ public class AccettazionePickingActivity extends BaseActivity implements Accetta mBindings.bottomSheetLuContent.setListener(this); mBottomSheetFragmentLUContentViewModel.setListener(this); - setSupportActionBar(this.mBindings.toolbar); - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); mShowSecondaryUntMis = sharedPreferences.getBoolean("picking_ingresso_enable_sec_unt_mis", true); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleActivity.java index 4632345a..a2da3873 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleActivity.java @@ -1,25 +1,53 @@ package it.integry.integrywmsnative.gest.contenuto_bancale; -import androidx.databinding.DataBindingUtil; -import androidx.appcompat.app.AppCompatActivity; - import android.content.Context; import android.content.Intent; +import android.content.res.Resources; import android.os.Bundle; +import android.text.SpannableString; +import androidx.core.content.ContextCompat; +import androidx.databinding.DataBindingUtil; +import androidx.databinding.ObservableField; +import androidx.recyclerview.widget.LinearLayoutManager; + +import javax.inject.Inject; + +import it.integry.integrywmsnative.MainApplication; import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.expansion.BaseActivity; -import it.integry.integrywmsnative.core.rest.consumers.PrinterRESTConsumer; import it.integry.integrywmsnative.core.data_cache.DataCache; +import it.integry.integrywmsnative.core.expansion.BaseActivity; import it.integry.integrywmsnative.core.model.MtbColt; +import it.integry.integrywmsnative.core.report.ReportManager; +import it.integry.integrywmsnative.core.rest.consumers.DepositoRESTConsumer; +import it.integry.integrywmsnative.core.rest.consumers.PrinterRESTConsumer; +import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.databinding.ActivityContenutoBancaleBinding; -import it.integry.integrywmsnative.gest.contenuto_bancale.viewmodel.ContenutoBancaleViewModel; +import it.integry.integrywmsnative.gest.contenuto_bancale.core.ContenutoBancaleListAdapter; +import it.integry.integrywmsnative.ui.SimpleDividerItemDecoration; +import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; -public class ContenutoBancaleActivity extends BaseActivity { +public class ContenutoBancaleActivity extends BaseActivity implements ContenutoBancaleViewModel.Listener { public ActivityContenutoBancaleBinding bindings; - private ContenutoBancaleViewModel mViewModel; + @Inject + ContenutoBancaleViewModel mViewModel; + + @Inject + DepositoRESTConsumer mDepositoRESTConsumer; + + @Inject + PrinterRESTConsumer mPrinterRESTConsumer; + + public final ObservableField mtbColt = new ObservableField<>(); + public final ObservableField descrizioneDepo = new ObservableField<>(); + + public ObservableField fabVisible = new ObservableField<>(true); + public ObservableField recoverFabMenuVisible = new ObservableField<>(false); + + private String mReportName; + private PrinterRESTConsumer.Type mPrinterType; private static class Key { private static final String MtbColtKey = "mtbColtKey"; @@ -50,24 +78,106 @@ public class ContenutoBancaleActivity extends BaseActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + boolean canRecoverUL = DataCache.retrieveItem(getIntent().getStringExtra(Key.CanRecoverUL)); + mtbColt.set(DataCache.retrieveItem(getIntent().getStringExtra(Key.MtbColtKey))); + mReportName = DataCache.retrieveItem(getIntent().getStringExtra(Key.ReportName)); + mPrinterType = DataCache.retrieveItem(getIntent().getStringExtra(Key.PrinterType)); + bindings = DataBindingUtil.setContentView(this, R.layout.activity_contenuto_bancale); - boolean canRecoverUL = DataCache.retrieveItem(getIntent().getStringExtra(Key.CanRecoverUL)); - MtbColt mtbColt = DataCache.retrieveItem(getIntent().getStringExtra(Key.MtbColtKey)); - String reportName = DataCache.retrieveItem(getIntent().getStringExtra(Key.ReportName)); + MainApplication.appComponent + .contenutoBancaleComponent() + .create() + .inject(this); - PrinterRESTConsumer.Type mPrinterType = DataCache.retrieveItem(getIntent().getStringExtra(Key.PrinterType)); - - mViewModel = new ContenutoBancaleViewModel(this, mtbColt, canRecoverUL, mPrinterType, reportName); + bindings.setView(this); + bindings.setViewModel(this.mViewModel); bindings.elevatedToolbar.setNestedScrollView(bindings.scrollView); setSupportActionBar(this.bindings.toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); + mViewModel.setListener(this); + mViewModel.init(mtbColt.get(), mPrinterType, mReportName); + + recoverFabMenuVisible.set(canRecoverUL); + + initRecyclerView(); + initColloInfo(); } + private void initRecyclerView() { + this.bindings.contenutoBancaleMainList.setNestedScrollingEnabled(false); + + this.bindings.contenutoBancaleMainList.setHasFixedSize(true); + + this.bindings.contenutoBancaleMainList.setLayoutManager(new LinearLayoutManager(this)); + + SimpleDividerItemDecoration itemDecorator = new SimpleDividerItemDecoration(this, SimpleDividerItemDecoration.VERTICAL); + itemDecorator.setDrawable(ContextCompat.getDrawable(this, R.drawable.divider)); + this.bindings.contenutoBancaleMainList.addItemDecoration(itemDecorator); + + ContenutoBancaleListAdapter adapter = new ContenutoBancaleListAdapter(mtbColt.get().getMtbColr()); + this.bindings.contenutoBancaleMainList.setAdapter(adapter); + } + + + private void initColloInfo() { + mDepositoRESTConsumer.getDepoByCodMdep(mtbColt.get().getCodMdep(), depo -> { + descrizioneDepo.set("(" + depo.getDescrizione() + ")"); + }, this::onError); + } + + + public void recoverUL() { + Intent data = new Intent(); + String key = DataCache.addItem(mtbColt.get()); + data.putExtra("key", key); + + this.setResult(RESULT_OK, data); + this.finish(); + } + + + public void printUL() { + this.bindings.contenutoBancaleFab.close(true); + this.onLoadingStarted(); + + this.mPrinterRESTConsumer.getAvailablePrinters(SettingsManager.i().getUserSession().getDepo().getCodMdep(), mPrinterType, value -> { + if (value.size() > 0) { + + try { + String reportName = ReportManager.getReportNameLUFromGestione(mtbColt.get().getGestioneEnum()); + reportName = mReportName != null ? mReportName : reportName; + + this.mPrinterRESTConsumer.printCollo(value.get(0), + mtbColt.get(), + 1, + reportName, + () -> { + this.onLoadingEnded(); + + Resources res = this.getResources(); + String errorMessage = res.getText(R.string.alert_print_completed_message).toString(); + DialogSimpleMessageView + .makeSuccessDialog(res.getText(R.string.completed).toString(), new SpannableString(errorMessage), null, null) + .show(getSupportFragmentManager(), "tag"); + }, this::onError); + + } catch (Exception ex) { + this.onError(ex); + } + + } else { + this.onLoadingEnded(); + String errorMessage = "Nessuna stampante configurata"; + this.onError(new Exception(errorMessage)); + } + }, this::onError); + + } @Override public boolean onSupportNavigateUp() { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleComponent.java b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleComponent.java new file mode 100644 index 00000000..fc3f891c --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleComponent.java @@ -0,0 +1,15 @@ +package it.integry.integrywmsnative.gest.contenuto_bancale; + +import dagger.Subcomponent; + +@Subcomponent +public interface ContenutoBancaleComponent { + + @Subcomponent.Factory + interface Factory { + ContenutoBancaleComponent create(); + } + + void inject(ContenutoBancaleActivity contenutoBancaleActivity); + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleModule.java new file mode 100644 index 00000000..dc6c3a92 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleModule.java @@ -0,0 +1,7 @@ +package it.integry.integrywmsnative.gest.contenuto_bancale; + +import dagger.Module; + +@Module(subcomponents = ContenutoBancaleComponent.class) +public class ContenutoBancaleModule { +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleViewModel.java new file mode 100644 index 00000000..ef70a79d --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleViewModel.java @@ -0,0 +1,39 @@ +package it.integry.integrywmsnative.gest.contenuto_bancale; + +import javax.inject.Inject; + +import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener; +import it.integry.integrywmsnative.core.model.MtbColt; +import it.integry.integrywmsnative.core.rest.consumers.DepositoRESTConsumer; +import it.integry.integrywmsnative.core.rest.consumers.PrinterRESTConsumer; + +public class ContenutoBancaleViewModel { + + private final DepositoRESTConsumer mDepositoRESTConsumer; + + + private Listener mListener; + + @Inject + public ContenutoBancaleViewModel(DepositoRESTConsumer depositoRESTConsumer) { + this.mDepositoRESTConsumer = depositoRESTConsumer; + } + + public void init(MtbColt mtbColt, PrinterRESTConsumer.Type printerType, String defaultReportName) { + + + } + + + public ContenutoBancaleViewModel setListener(Listener listener) { + this.mListener = listener; + return this; + } + + public interface Listener extends ILoadingListener { + + void onError(Exception ex); + + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/core/ContenutoBancaleListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/core/ContenutoBancaleListAdapter.java index cd23aae4..51cfdc61 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/core/ContenutoBancaleListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/core/ContenutoBancaleListAdapter.java @@ -1,15 +1,15 @@ package it.integry.integrywmsnative.gest.contenuto_bancale.core; -import android.content.Context; -import androidx.databinding.DataBindingUtil; -import androidx.databinding.ObservableArrayList; -import androidx.databinding.ObservableList; -import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.ViewGroup; +import androidx.databinding.DataBindingUtil; +import androidx.databinding.ObservableArrayList; +import androidx.recyclerview.widget.RecyclerView; + import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.interfaces.IRecyclerItemClicked; +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.expansion.view.ExtendedRecyclerView; import it.integry.integrywmsnative.core.model.MtbColr; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityNumber; @@ -17,13 +17,13 @@ import it.integry.integrywmsnative.core.utility.UtilityResources; import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.databinding.ListaContenutoBancaleListModelBinding; -public class ContenutoBancaleListAdapter extends RecyclerView.Adapter { +public class ContenutoBancaleListAdapter extends ExtendedRecyclerView { + private RunnableArgs mOnItemClickListener; - protected static Context mContext; - protected ObservableArrayList mDataset; - - private IRecyclerItemClicked mOnItemClickListener; + public ContenutoBancaleListAdapter(ObservableArrayList myDataset) { + super(myDataset); + } public static class ViewHolder extends RecyclerView.ViewHolder { protected ListaContenutoBancaleListModelBinding mViewDataBinding; @@ -37,12 +37,11 @@ public class ContenutoBancaleListAdapter extends RecyclerView.Adapter myDataset, IRecyclerItemClicked onItemClickListener) { - mContext = context; - mDataset = myDataset; - mOnItemClickListener = onItemClickListener; - - myDataset.addOnListChangedCallback(onListChangedCallback); - } - @Override public ContenutoBancaleListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view @@ -78,10 +69,10 @@ public class ContenutoBancaleListAdapter extends RecyclerView.Adapter { - if(mOnItemClickListener != null) { - mOnItemClickListener.onItemClick(mtbColr, position); + if (mOnItemClickListener != null) { + mOnItemClickListener.run(mtbColr); } }); } - @Override - public void onViewRecycled(ContenutoBancaleListAdapter.ViewHolder holder) { - super.onViewRecycled(holder); + + public ContenutoBancaleListAdapter setOnItemClickListener(RunnableArgs onItemClickListener) { + this.mOnItemClickListener = onItemClickListener; + return this; } - - @Override - public int getItemCount() { - return mDataset.size(); - } - - - private ObservableList.OnListChangedCallback onListChangedCallback = new ObservableList.OnListChangedCallback>(){ - - @Override - public void onChanged(ObservableList sender) { - notifyDataSetChanged(); - } - - @Override - public void onItemRangeChanged(ObservableList sender, int positionStart, int itemCount) { - notifyDataSetChanged(); - } - - @Override - public void onItemRangeInserted(ObservableList sender, int positionStart, int itemCount) { - notifyDataSetChanged(); - } - - @Override - public void onItemRangeMoved(ObservableList sender, int fromPosition, int toPosition, int itemCount) { - notifyDataSetChanged(); - } - - @Override - public void onItemRangeRemoved(ObservableList sender, int positionStart, int itemCount) { - notifyDataSetChanged(); - } - }; - - } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/viewmodel/ContenutoBancaleViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/viewmodel/ContenutoBancaleViewModel.java deleted file mode 100644 index 5219400b..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/viewmodel/ContenutoBancaleViewModel.java +++ /dev/null @@ -1,143 +0,0 @@ -package it.integry.integrywmsnative.gest.contenuto_bancale.viewmodel; - -import android.app.Dialog; -import android.content.Intent; -import android.content.res.Resources; -import android.text.SpannableString; - -import androidx.core.content.ContextCompat; -import androidx.databinding.ObservableField; -import androidx.recyclerview.widget.LinearLayoutManager; - -import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.data_cache.DataCache; -import it.integry.integrywmsnative.core.di.BindableString; -import it.integry.integrywmsnative.core.interfaces.IRecyclerItemClicked; -import it.integry.integrywmsnative.core.model.MtbColr; -import it.integry.integrywmsnative.core.model.MtbColt; -import it.integry.integrywmsnative.core.report.ReportManager; -import it.integry.integrywmsnative.core.rest.consumers.DepositoRESTConsumer; -import it.integry.integrywmsnative.core.rest.consumers.PrinterRESTConsumer; -import it.integry.integrywmsnative.core.settings.SettingsManager; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.integrywmsnative.core.utility.UtilityProgress; -import it.integry.integrywmsnative.gest.contenuto_bancale.ContenutoBancaleActivity; -import it.integry.integrywmsnative.gest.contenuto_bancale.core.ContenutoBancaleListAdapter; -import it.integry.integrywmsnative.ui.SimpleDividerItemDecoration; -import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; - -import static android.app.Activity.RESULT_OK; - -public class ContenutoBancaleViewModel implements IRecyclerItemClicked { - - private ContenutoBancaleActivity mContext; - - public ObservableField mtbColt; - public BindableString descrizioneDepo = new BindableString(); - - public ObservableField isFabVisible = new ObservableField<>(); - public ObservableField isRecoverFabMenuVisible = new ObservableField<>(); - - private ContenutoBancaleListAdapter mAdapter; - - private PrinterRESTConsumer.Type mPrinterType; - private String mReportName; - - public ContenutoBancaleViewModel(ContenutoBancaleActivity context, MtbColt mtbColt, boolean canRecoverUL, PrinterRESTConsumer.Type printerType, String defaultReportName) { - mContext = context; - this.mtbColt = new ObservableField<>(mtbColt); - this.isFabVisible.set(true); - this.isRecoverFabMenuVisible.set(canRecoverUL); - this.mPrinterType = printerType; - this.mReportName = defaultReportName; - - mContext.bindings.setViewModel(this); - - initRecyclerView(); - - initColloInfo(); - } - - - private void initRecyclerView() { - mContext.bindings.contenutoBancaleMainList.setNestedScrollingEnabled(false); - - mContext.bindings.contenutoBancaleMainList.setHasFixedSize(true); - - mContext.bindings.contenutoBancaleMainList.setLayoutManager(new LinearLayoutManager(mContext)); - - SimpleDividerItemDecoration itemDecorator = new SimpleDividerItemDecoration(mContext, SimpleDividerItemDecoration.VERTICAL); - itemDecorator.setDrawable(ContextCompat.getDrawable(mContext, R.drawable.divider)); - mContext.bindings.contenutoBancaleMainList.addItemDecoration(itemDecorator); - - mAdapter = new ContenutoBancaleListAdapter(mContext, mtbColt.get().getMtbColr(), this); - mContext.bindings.contenutoBancaleMainList.setAdapter(mAdapter); - } - - - private void initColloInfo() { - DepositoRESTConsumer.getDepoByCodMdep(mtbColt.get().getCodMdep(), depo -> { - descrizioneDepo.set("(" + depo.getDescrizione() + ")"); - }); - } - - @Override - public void onItemClick(MtbColr item, int position) { - } - - - public void recoverUL() { - Intent data = new Intent(); - String key = DataCache.addItem(mtbColt.get()); - data.putExtra("key", key); - - mContext.setResult(RESULT_OK, data); - mContext.finish(); - } - - - public void printUL() { - mContext.bindings.contenutoBancaleFab.close(true); - final Dialog progress = UtilityProgress.createDefaultProgressDialog(mContext); - - PrinterRESTConsumer.getAvailablePrintersStatic(SettingsManager.i().getUserSession().getDepo().getCodMdep(), mPrinterType, value -> { - - if (value.size() > 0) { - - try { - String reportName = ReportManager.getReportNameLUFromGestione(mtbColt.get().getGestioneEnum()); - - reportName = mReportName != null ? mReportName : reportName; - - PrinterRESTConsumer.printColloStatic(value.get(0), - mtbColt.get(), - 1, - reportName, - () -> { - progress.dismiss(); - - Resources res = mContext.getResources(); - String errorMessage = res.getText(R.string.alert_print_completed_message).toString(); - DialogSimpleMessageView - .makeSuccessDialog(res.getText(R.string.completed).toString(), new SpannableString(errorMessage), null, null) - .show(mContext.getSupportFragmentManager(), "tag"); - }, ex -> UtilityExceptions.defaultException(mContext, ex, progress)); - - } catch (Exception ex) { - UtilityExceptions.defaultException(mContext, ex, progress); - } - - } else { - progress.dismiss(); - String errorMessage = "Nessuna stampante configurata"; - DialogSimpleMessageView - .makeWarningDialog(new SpannableString(errorMessage), null, null) - .show(mContext.getSupportFragmentManager(), "tag");; - } - }, ex -> { - UtilityExceptions.defaultException(mContext, ex, progress); - }); - - } - -} diff --git a/app/src/main/res/layout/activity_contenuto_bancale.xml b/app/src/main/res/layout/activity_contenuto_bancale.xml index 7508d0b7..e6c2bf2c 100644 --- a/app/src/main/res/layout/activity_contenuto_bancale.xml +++ b/app/src/main/res/layout/activity_contenuto_bancale.xml @@ -1,15 +1,21 @@ - + xmlns:fab="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + + + type="it.integry.integrywmsnative.gest.contenuto_bancale.ContenutoBancaleViewModel" /> + + @@ -18,183 +24,182 @@ android:layout_height="match_parent"> - - - - - - - - - - + android:background="@color/full_white" + android:orientation="vertical"> - - + android:layout_height="wrap_content"> + + + +
+ + + android:paddingTop="8dp" + tools:context=".gest.contenuto_bancale.ContenutoBancaleActivity"> + + android:layout_marginLeft="8dp" + android:layout_marginRight="8dp" + android:background="@drawable/gray_detail_background_round8" + android:orientation="vertical" + android:padding="16dp"> - + android:orientation="horizontal"> - + + + + + + android:orientation="horizontal"> + + + + + + + + + + + + + + + + + + + + + + + - + android:layout_marginTop="16dp" + android:layout_marginBottom="92dp" + android:paddingStart="2dp" + android:paddingEnd="2dp"> - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - + + app:onClick="@{() -> view.recoverUL()}" + app:visibility="@{view.recoverFabMenuVisible}" + fab:fab_label="@string/action_recover_ul" /> From 8d87970a75e8390c8c2ea9d7c3c7529d0b0d0c11 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Fri, 6 Aug 2021 10:22:48 +0200 Subject: [PATCH 05/18] Renaming --- .../MainAccettazioneFragment.java | 6 +- .../MainListAccettazioneAdapter.java | 2 +- .../MainListAccettazioneClienteListModel.java | 2 +- .../MainListAccettazioneListModel.java | 2 +- .../AccettazionePickingActivity.java | 4 +- .../{core => ui}/AccettazioneListAdapter.java | 2 +- .../{core => ui}/AccettazioneListModel.java | 2 +- .../ContenutoBancaleActivity.java | 2 +- .../ContenutoBancaleListAdapter.java | 2 +- .../MainListListaColliAdapter.java | 2 +- .../viewmodel/ListaBancaliViewModel.java | 2 +- .../OrdiniUscitaElencoFragment.java | 4 +- .../OrdiniUscitaElencoAdapter.java | 2 +- .../OrdiniUscitaElencoListModel.java | 2 +- .../picking_libero/PickingLiberoFragment.java | 2 +- .../PickingLiberoListAdapter.java | 2 +- .../picking_resi/PickingResiActivity.java | 4 +- .../{core => ui}/PickingResiListAdapter.java | 2 +- .../{core => ui}/PickingResiListModel.java | 2 +- .../PVOrdineAcquistoEditActivity.java | 2 +- .../OrdineAcquistoArtListAdapter.java | 6 +- .../PVOrdiniAcquistoGrigliaFragment.java | 2 +- .../OrdineAcquistoPvOpenListAdapter.java | 2 +- .../RettificaGiacenzeFragment.java | 4 +- .../RettificaGiacenzeModule.java | 2 +- .../RettificaGiacenzeViewModel.java | 2 +- .../core/RettificaGiacenzeHelper.java | 86 ------------------- .../RettificaGiacenzeRESTConsumer.java | 2 +- .../AutoCompleteFornitoreAdapter.java | 4 +- .../RettificaGiacenzeMainListAdapter.java | 2 +- .../gest/spedizione/SpedizioneActivity.java | 4 +- .../row_info/BaseDialogRowInfoView.java | 2 +- ...logRowInfoProdFabbisognoLineeProdView.java | 2 +- .../{core => ui}/SpedizioneListAdapter.java | 2 +- .../{core => ui}/SpedizioneListModel.java | 2 +- .../UltimiArriviFornitoreFragment.java | 3 +- .../UltimiArriviFornitoreModule.java | 1 - .../UltimiArriviFornitoreViewModel.java | 2 +- .../UltimiArriviFornitoreListAdapter.java | 2 +- ...ttomSheetFragmentLUContentListAdapter.java | 9 -- .../fragment_ultimi_arrivi_fornitore.xml | 2 +- 41 files changed, 45 insertions(+), 148 deletions(-) rename app/src/main/java/it/integry/integrywmsnative/gest/accettazione/{core => ui}/MainListAccettazioneAdapter.java (99%) rename app/src/main/java/it/integry/integrywmsnative/gest/accettazione/{core => ui}/MainListAccettazioneClienteListModel.java (90%) rename app/src/main/java/it/integry/integrywmsnative/gest/accettazione/{core => ui}/MainListAccettazioneListModel.java (96%) rename app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/{core => ui}/AccettazioneListAdapter.java (99%) rename app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/{core => ui}/AccettazioneListModel.java (98%) rename app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/{core => ui}/ContenutoBancaleListAdapter.java (98%) rename app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/{core => ui}/MainListListaColliAdapter.java (98%) rename app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/{list => ui}/OrdiniUscitaElencoAdapter.java (99%) rename app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/{list => ui}/OrdiniUscitaElencoListModel.java (97%) rename app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/{core => ui}/PickingLiberoListAdapter.java (98%) rename app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/{core => ui}/PickingResiListAdapter.java (99%) rename app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/{core => ui}/PickingResiListModel.java (97%) rename app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/{adapter => ui}/OrdineAcquistoArtListAdapter.java (93%) rename app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/{core => ui}/OrdineAcquistoPvOpenListAdapter.java (98%) delete mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/core/RettificaGiacenzeHelper.java rename app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/{core => rest}/RettificaGiacenzeRESTConsumer.java (98%) rename app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/{core/adapter => ui}/AutoCompleteFornitoreAdapter.java (95%) rename app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/{core/adapter => ui}/RettificaGiacenzeMainListAdapter.java (97%) rename app/src/main/java/it/integry/integrywmsnative/gest/spedizione/{core => ui}/SpedizioneListAdapter.java (99%) rename app/src/main/java/it/integry/integrywmsnative/gest/spedizione/{core => ui}/SpedizioneListModel.java (98%) rename app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/{core => }/UltimiArriviFornitoreViewModel.java (99%) rename app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/{core => ui}/UltimiArriviFornitoreListAdapter.java (99%) diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneFragment.java index b2e04d93..c5332696 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneFragment.java @@ -34,9 +34,9 @@ import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityBigDecimal; import it.integry.integrywmsnative.core.utility.UtilityDate; import it.integry.integrywmsnative.databinding.FragmentMainAccettazioneBinding; -import it.integry.integrywmsnative.gest.accettazione.core.MainListAccettazioneAdapter; -import it.integry.integrywmsnative.gest.accettazione.core.MainListAccettazioneClienteListModel; -import it.integry.integrywmsnative.gest.accettazione.core.MainListAccettazioneListModel; +import it.integry.integrywmsnative.gest.accettazione.ui.MainListAccettazioneAdapter; +import it.integry.integrywmsnative.gest.accettazione.ui.MainListAccettazioneClienteListModel; +import it.integry.integrywmsnative.gest.accettazione.ui.MainListAccettazioneListModel; import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; import it.integry.integrywmsnative.gest.accettazione.dto.SitArtOrdDTO; import it.integry.integrywmsnative.gest.accettazione_picking.AccettazionePickingActivity; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/ui/MainListAccettazioneAdapter.java similarity index 99% rename from app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneAdapter.java rename to app/src/main/java/it/integry/integrywmsnative/gest/accettazione/ui/MainListAccettazioneAdapter.java index 4b2ab3de..8f967bb2 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/ui/MainListAccettazioneAdapter.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.accettazione.core; +package it.integry.integrywmsnative.gest.accettazione.ui; import android.content.Context; import android.text.Html; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneClienteListModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/ui/MainListAccettazioneClienteListModel.java similarity index 90% rename from app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneClienteListModel.java rename to app/src/main/java/it/integry/integrywmsnative/gest/accettazione/ui/MainListAccettazioneClienteListModel.java index bd4fe089..be14e3ea 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneClienteListModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/ui/MainListAccettazioneClienteListModel.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.accettazione.core; +package it.integry.integrywmsnative.gest.accettazione.ui; public class MainListAccettazioneClienteListModel { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneListModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/ui/MainListAccettazioneListModel.java similarity index 96% rename from app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneListModel.java rename to app/src/main/java/it/integry/integrywmsnative/gest/accettazione/ui/MainListAccettazioneListModel.java index d523c29f..59a06291 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/core/MainListAccettazioneListModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/ui/MainListAccettazioneListModel.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.accettazione.core; +package it.integry.integrywmsnative.gest.accettazione.ui; import java.util.List; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingActivity.java index 3f9687fc..4846afb9 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/AccettazionePickingActivity.java @@ -50,8 +50,8 @@ import it.integry.integrywmsnative.core.utility.UtilityToast; import it.integry.integrywmsnative.databinding.ActivityAccettazioneOrdineInevasoBinding; import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; import it.integry.integrywmsnative.gest.accettazione.dto.SitArtOrdDTO; -import it.integry.integrywmsnative.gest.accettazione_picking.core.AccettazioneListAdapter; -import it.integry.integrywmsnative.gest.accettazione_picking.core.AccettazioneListModel; +import it.integry.integrywmsnative.gest.accettazione_picking.ui.AccettazioneListAdapter; +import it.integry.integrywmsnative.gest.accettazione_picking.ui.AccettazioneListModel; import it.integry.integrywmsnative.gest.accettazione_picking.dto.AccettazioneOrdineInevasoOrderBy; import it.integry.integrywmsnative.gest.accettazione_picking.dto.PickingObjectDTO; import it.integry.integrywmsnative.gest.accettazione_picking.rest.RecoverMtbColt; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/core/AccettazioneListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/ui/AccettazioneListAdapter.java similarity index 99% rename from app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/core/AccettazioneListAdapter.java rename to app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/ui/AccettazioneListAdapter.java index a41dce20..6236a6bf 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/core/AccettazioneListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/ui/AccettazioneListAdapter.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.accettazione_picking.core; +package it.integry.integrywmsnative.gest.accettazione_picking.ui; import android.content.Context; import android.graphics.Color; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/core/AccettazioneListModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/ui/AccettazioneListModel.java similarity index 98% rename from app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/core/AccettazioneListModel.java rename to app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/ui/AccettazioneListModel.java index ce6d2329..b42e5e44 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/core/AccettazioneListModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_picking/ui/AccettazioneListModel.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.accettazione_picking.core; +package it.integry.integrywmsnative.gest.accettazione_picking.ui; import org.jetbrains.annotations.NotNull; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleActivity.java index a2da3873..8556f1b8 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ContenutoBancaleActivity.java @@ -23,7 +23,7 @@ import it.integry.integrywmsnative.core.rest.consumers.DepositoRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.PrinterRESTConsumer; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.databinding.ActivityContenutoBancaleBinding; -import it.integry.integrywmsnative.gest.contenuto_bancale.core.ContenutoBancaleListAdapter; +import it.integry.integrywmsnative.gest.contenuto_bancale.ui.ContenutoBancaleListAdapter; import it.integry.integrywmsnative.ui.SimpleDividerItemDecoration; import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/core/ContenutoBancaleListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ui/ContenutoBancaleListAdapter.java similarity index 98% rename from app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/core/ContenutoBancaleListAdapter.java rename to app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ui/ContenutoBancaleListAdapter.java index 51cfdc61..302bbaeb 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/core/ContenutoBancaleListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/contenuto_bancale/ui/ContenutoBancaleListAdapter.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.contenuto_bancale.core; +package it.integry.integrywmsnative.gest.contenuto_bancale.ui; import android.view.LayoutInflater; import android.view.ViewGroup; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/core/MainListListaColliAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ui/MainListListaColliAdapter.java similarity index 98% rename from app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/core/MainListListaColliAdapter.java rename to app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ui/MainListListaColliAdapter.java index 04a125a1..2a8382f0 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/core/MainListListaColliAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ui/MainListListaColliAdapter.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.lista_bancali.core; +package it.integry.integrywmsnative.gest.lista_bancali.ui; import android.content.Context; import androidx.databinding.DataBindingUtil; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/viewmodel/ListaBancaliViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/viewmodel/ListaBancaliViewModel.java index 6f4fc2ca..38632bcc 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/viewmodel/ListaBancaliViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/viewmodel/ListaBancaliViewModel.java @@ -16,7 +16,7 @@ import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsume import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityProgress; import it.integry.integrywmsnative.gest.lista_bancali.ListaBancaliActivity; -import it.integry.integrywmsnative.gest.lista_bancali.core.MainListListaColliAdapter; +import it.integry.integrywmsnative.gest.lista_bancali.ui.MainListListaColliAdapter; import it.integry.integrywmsnative.ui.SimpleDividerItemDecoration; public class ListaBancaliViewModel implements IRecyclerItemClicked { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java index 11a6fb3c..613fa72f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java @@ -45,8 +45,8 @@ import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.databinding.FragmentMainOrdiniUscitaBinding; import it.integry.integrywmsnative.gest.ordini_uscita_elenco.dialogs.DialogVenditaFiltroAvanzatoView; import it.integry.integrywmsnative.gest.ordini_uscita_elenco.dialogs.DialogVenditaFiltroAvanzatoViewModel; -import it.integry.integrywmsnative.gest.ordini_uscita_elenco.list.OrdiniUscitaElencoAdapter; -import it.integry.integrywmsnative.gest.ordini_uscita_elenco.list.OrdiniUscitaElencoListModel; +import it.integry.integrywmsnative.gest.ordini_uscita_elenco.ui.OrdiniUscitaElencoAdapter; +import it.integry.integrywmsnative.gest.ordini_uscita_elenco.ui.OrdiniUscitaElencoListModel; import it.integry.integrywmsnative.gest.spedizione.SpedizioneActivity; import it.integry.integrywmsnative.gest.spedizione.dialogs.row_info.BaseDialogRowInfoView; import it.integry.integrywmsnative.ui.ElevatedToolbar; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/list/OrdiniUscitaElencoAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/ui/OrdiniUscitaElencoAdapter.java similarity index 99% rename from app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/list/OrdiniUscitaElencoAdapter.java rename to app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/ui/OrdiniUscitaElencoAdapter.java index 5a3ec3f6..512ab6f7 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/list/OrdiniUscitaElencoAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/ui/OrdiniUscitaElencoAdapter.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.ordini_uscita_elenco.list; +package it.integry.integrywmsnative.gest.ordini_uscita_elenco.ui; import android.content.Context; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/list/OrdiniUscitaElencoListModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/ui/OrdiniUscitaElencoListModel.java similarity index 97% rename from app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/list/OrdiniUscitaElencoListModel.java rename to app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/ui/OrdiniUscitaElencoListModel.java index 340d1622..df2d942d 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/list/OrdiniUscitaElencoListModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/ui/OrdiniUscitaElencoListModel.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.ordini_uscita_elenco.list; +package it.integry.integrywmsnative.gest.ordini_uscita_elenco.ui; import androidx.annotation.ColorInt; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoFragment.java index 71a510ea..40f759dc 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoFragment.java @@ -46,7 +46,7 @@ import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityToast; import it.integry.integrywmsnative.databinding.FragmentPickingLiberoBinding; -import it.integry.integrywmsnative.gest.picking_libero.core.PickingLiberoListAdapter; +import it.integry.integrywmsnative.gest.picking_libero.ui.PickingLiberoListAdapter; import it.integry.integrywmsnative.gest.spedizione.exceptions.InvalidPesoKGException; import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO; import it.integry.integrywmsnative.gest.spedizione.model.PickingObjectDTO; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/core/PickingLiberoListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/ui/PickingLiberoListAdapter.java similarity index 98% rename from app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/core/PickingLiberoListAdapter.java rename to app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/ui/PickingLiberoListAdapter.java index 434be576..04250597 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/core/PickingLiberoListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/ui/PickingLiberoListAdapter.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.picking_libero.core; +package it.integry.integrywmsnative.gest.picking_libero.ui; import android.view.LayoutInflater; import android.view.ViewGroup; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/PickingResiActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/PickingResiActivity.java index ecdaf0ae..3d4cfb24 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/PickingResiActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/PickingResiActivity.java @@ -42,8 +42,8 @@ import it.integry.integrywmsnative.core.utility.UtilityResources; import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.core.utility.UtilityToast; import it.integry.integrywmsnative.databinding.ActivityPickingResiBinding; -import it.integry.integrywmsnative.gest.picking_resi.core.PickingResiListAdapter; -import it.integry.integrywmsnative.gest.picking_resi.core.PickingResiListModel; +import it.integry.integrywmsnative.gest.picking_resi.ui.PickingResiListAdapter; +import it.integry.integrywmsnative.gest.picking_resi.ui.PickingResiListModel; import it.integry.integrywmsnative.gest.picking_resi.rest.WithdrawableDtbDocr; import it.integry.integrywmsnative.gest.spedizione.exceptions.InvalidPesoKGException; import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/core/PickingResiListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/ui/PickingResiListAdapter.java similarity index 99% rename from app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/core/PickingResiListAdapter.java rename to app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/ui/PickingResiListAdapter.java index 30459d32..4d8b3c29 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/core/PickingResiListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/ui/PickingResiListAdapter.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.picking_resi.core; +package it.integry.integrywmsnative.gest.picking_resi.ui; import android.content.Context; import android.graphics.Color; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/core/PickingResiListModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/ui/PickingResiListModel.java similarity index 97% rename from app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/core/PickingResiListModel.java rename to app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/ui/PickingResiListModel.java index fe12ed1e..61d14436 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/core/PickingResiListModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_resi/ui/PickingResiListModel.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.picking_resi.core; +package it.integry.integrywmsnative.gest.picking_resi.ui; import java.math.BigDecimal; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditActivity.java index a8f24976..f362f4b6 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditActivity.java @@ -35,7 +35,7 @@ import it.integry.integrywmsnative.core.utility.UtilityDate; import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityProgress; import it.integry.integrywmsnative.databinding.ActivityPvOrdineAcquistoEditBinding; -import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.adapter.OrdineAcquistoArtListAdapter; +import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.ui.OrdineAcquistoArtListAdapter; 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.ui.FabMenuCustomAnimations; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/adapter/OrdineAcquistoArtListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/ui/OrdineAcquistoArtListAdapter.java similarity index 93% rename from app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/adapter/OrdineAcquistoArtListAdapter.java rename to app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/ui/OrdineAcquistoArtListAdapter.java index f00c8bc4..93da5ee1 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/adapter/OrdineAcquistoArtListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/ui/OrdineAcquistoArtListAdapter.java @@ -1,7 +1,6 @@ -package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.adapter; +package it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.ui; import android.content.Context; -import android.text.Html; import android.view.LayoutInflater; import android.view.ViewGroup; @@ -15,13 +14,10 @@ import java.util.List; import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.data_store.db.entity.ArticoloOrdine; -import it.integry.integrywmsnative.core.data_store.db.entity.Ordine; -import it.integry.integrywmsnative.core.data_store.db.wrappers.OrdineWrapper; 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.databinding.FragmentPvOrdiniAcquistoListSingleItemBinding; import it.integry.integrywmsnative.ui.fastscroll.SectionTitleProvider; public class OrdineAcquistoArtListAdapter extends SectionedRecyclerViewAdapter implements SectionTitleProvider { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdiniAcquistoGrigliaFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdiniAcquistoGrigliaFragment.java index 8246e7cf..73ed8cb3 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdiniAcquistoGrigliaFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdiniAcquistoGrigliaFragment.java @@ -41,7 +41,7 @@ import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityProgress; import it.integry.integrywmsnative.databinding.FragmentPvOrdiniAcquistoBinding; import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.PVOrdineAcquistoEditActivity; -import it.integry.integrywmsnative.gest.pv_ordini_acquisto.core.OrdineAcquistoPvOpenListAdapter; +import it.integry.integrywmsnative.gest.pv_ordini_acquisto.ui.OrdineAcquistoPvOpenListAdapter; import it.integry.integrywmsnative.gest.pv_ordini_acquisto.dialogs.DialogScanLisA; import it.integry.integrywmsnative.gest.pv_ordini_acquisto.helper.OrdineAcquistoPvHelper; import it.integry.integrywmsnative.ui.ElevatedToolbar; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/core/OrdineAcquistoPvOpenListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/ui/OrdineAcquistoPvOpenListAdapter.java similarity index 98% rename from app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/core/OrdineAcquistoPvOpenListAdapter.java rename to app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/ui/OrdineAcquistoPvOpenListAdapter.java index 2c3f7517..d0579d82 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/core/OrdineAcquistoPvOpenListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/ui/OrdineAcquistoPvOpenListAdapter.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.pv_ordini_acquisto.core; +package it.integry.integrywmsnative.gest.pv_ordini_acquisto.ui; import android.content.Context; import android.text.Html; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java index edaaf44d..db7525ca 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java @@ -50,8 +50,8 @@ import it.integry.integrywmsnative.core.utility.UtilityProgress; import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.core.utility.UtilityToast; import it.integry.integrywmsnative.databinding.FragmentMainRettificaGiacenzeBinding; -import it.integry.integrywmsnative.gest.rettifica_giacenze.core.adapter.AutoCompleteFornitoreAdapter; -import it.integry.integrywmsnative.gest.rettifica_giacenze.core.adapter.RettificaGiacenzeMainListAdapter; +import it.integry.integrywmsnative.gest.rettifica_giacenze.ui.AutoCompleteFornitoreAdapter; +import it.integry.integrywmsnative.gest.rettifica_giacenze.ui.RettificaGiacenzeMainListAdapter; import it.integry.integrywmsnative.gest.rettifica_giacenze.dto.FornitoreDTO; import it.integry.integrywmsnative.gest.spedizione.exceptions.InvalidPesoKGException; import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeModule.java index d4d5f481..f20b3373 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeModule.java @@ -9,7 +9,7 @@ import it.integry.integrywmsnative.core.rest.consumers.BarcodeRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.PrinterRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; -import it.integry.integrywmsnative.gest.rettifica_giacenze.core.RettificaGiacenzeRESTConsumer; +import it.integry.integrywmsnative.gest.rettifica_giacenze.rest.RettificaGiacenzeRESTConsumer; @Module(subcomponents = RettificaGiacenzeComponent.class) public class RettificaGiacenzeModule { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeViewModel.java index 91d4fe71..adc66c27 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeViewModel.java @@ -35,7 +35,7 @@ import it.integry.integrywmsnative.core.utility.UtilityBarcode; import it.integry.integrywmsnative.core.utility.UtilityBigDecimal; import it.integry.integrywmsnative.core.utility.UtilityDate; import it.integry.integrywmsnative.core.utility.UtilityString; -import it.integry.integrywmsnative.gest.rettifica_giacenze.core.RettificaGiacenzeRESTConsumer; +import it.integry.integrywmsnative.gest.rettifica_giacenze.rest.RettificaGiacenzeRESTConsumer; import it.integry.integrywmsnative.gest.rettifica_giacenze.dto.FornitoreDTO; import it.integry.integrywmsnative.gest.spedizione.exceptions.InvalidPesoKGException; import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/core/RettificaGiacenzeHelper.java b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/core/RettificaGiacenzeHelper.java deleted file mode 100644 index 4cf2ae1d..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/core/RettificaGiacenzeHelper.java +++ /dev/null @@ -1,86 +0,0 @@ -package it.integry.integrywmsnative.gest.rettifica_giacenze.core; - -import android.app.Dialog; -import android.content.Context; - -import com.google.gson.reflect.TypeToken; - -import java.lang.reflect.Type; -import java.util.ArrayList; - -import it.integry.integrywmsnative.core.rest.consumers.ISimpleOperationCallback; -import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; -import it.integry.integrywmsnative.core.expansion.RunnableArgs; -import it.integry.integrywmsnative.core.model.MtbAart; -import it.integry.integrywmsnative.core.model.MtbAartWithFornitore; -import it.integry.integrywmsnative.core.utility.UtilityDB; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.integrywmsnative.core.utility.UtilityProgress; -import it.integry.integrywmsnative.gest.rettifica_giacenze.dto.FornitoreDTO; - -public class RettificaGiacenzeHelper { - - private Context mContext; - - public RettificaGiacenzeHelper(Context context){ - mContext = context; - } - - - public void searchArtForn(String codAlis, String codArtForOrDescr, RunnableArgs> onComplete, RunnableArgs onFailed) { - - String sql = "SELECT mtb_aart.*, mtb_lisa.cod_art_for from mtb_lisa, mtb_aart, mtb_part " + - " WHERE mtb_lisa.cod_alis = " + UtilityDB.valueToString(codAlis) + - " AND mtb_lisa.cod_mart = mtb_aart.cod_mart " + - " AND mtb_lisa.cod_mart = mtb_part.cod_mart " + - " AND mtb_part.cod_mdep = '01' " + - " AND (mtb_aart.descrizione_estesa LIKE '%" + codArtForOrDescr + "%' OR cod_art_for LIKE '%" + codArtForOrDescr + "%') " + - " ORDER BY ABS(mtb_part.qta_esistente) DESC, mtb_aart.descrizione_estesa"; - - - Type typeOfObjectsList = new TypeToken>() {}.getType(); - SystemRESTConsumer.processSqlStatic(sql, typeOfObjectsList, new ISimpleOperationCallback>() { - @Override - public void onSuccess(ArrayList value) { - if(onComplete != null) onComplete.run(value); - } - - @Override - public void onFailed(Exception ex) { - if(onFailed != null) onFailed.run(ex); - } - }); - } - - - public void searchArtInt(String codMartOrBarcodeOrDescr, RunnableArgs> onComplete, RunnableArgs onFailed) { - String sql = "SELECT DISTINCT mtb_aart.* " + - "FROM mtb_aart " + - "LEFT OUTER JOIN mvw_barcode on mtb_aart.cod_mart = mvw_barcode.cod_mart " + - "WHERE CASE" + - " WHEN LEN(mvw_barcode.cod_barre) > 13 THEN mvw_barcode.cod_barre " + - " ELSE Replicate('0', 13 - len(mvw_barcode.cod_barre))+ mvw_barcode.cod_barre " + - "END LIKE '%' + CASE " + - " WHEN LEN('" + codMartOrBarcodeOrDescr + "') > 13 THEN '" + codMartOrBarcodeOrDescr + "' " + - " ELSE Replicate('0', 13 - len('" + codMartOrBarcodeOrDescr + "')) + '" + codMartOrBarcodeOrDescr + "'" + - " END " + - "OR mtb_aart.cod_mart = '" + codMartOrBarcodeOrDescr + "' " + - "OR mtb_aart.descrizione_estesa LIKE '%" + codMartOrBarcodeOrDescr + "%'"; - - Type typeOfObjectsList = new TypeToken>() {}.getType(); - SystemRESTConsumer.processSqlStatic(sql, typeOfObjectsList, new ISimpleOperationCallback>() { - @Override - public void onSuccess(ArrayList value) { - if(onComplete != null) onComplete.run(value); - } - - @Override - public void onFailed(Exception ex) { - if(onFailed != null) onFailed.run(ex); - } - }); - } - - - -} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/core/RettificaGiacenzeRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/rest/RettificaGiacenzeRESTConsumer.java similarity index 98% rename from app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/core/RettificaGiacenzeRESTConsumer.java rename to app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/rest/RettificaGiacenzeRESTConsumer.java index 71448147..2e58d0f1 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/core/RettificaGiacenzeRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/rest/RettificaGiacenzeRESTConsumer.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.rettifica_giacenze.core; +package it.integry.integrywmsnative.gest.rettifica_giacenze.rest; import com.google.gson.reflect.TypeToken; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/core/adapter/AutoCompleteFornitoreAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/ui/AutoCompleteFornitoreAdapter.java similarity index 95% rename from app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/core/adapter/AutoCompleteFornitoreAdapter.java rename to app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/ui/AutoCompleteFornitoreAdapter.java index b7821cac..104b95e1 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/core/adapter/AutoCompleteFornitoreAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/ui/AutoCompleteFornitoreAdapter.java @@ -1,9 +1,7 @@ -package it.integry.integrywmsnative.gest.rettifica_giacenze.core.adapter; +package it.integry.integrywmsnative.gest.rettifica_giacenze.ui; import android.content.Context; import androidx.databinding.DataBindingUtil; -import androidx.databinding.ObservableArrayList; -import androidx.databinding.ObservableList; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import android.view.LayoutInflater; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/core/adapter/RettificaGiacenzeMainListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/ui/RettificaGiacenzeMainListAdapter.java similarity index 97% rename from app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/core/adapter/RettificaGiacenzeMainListAdapter.java rename to app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/ui/RettificaGiacenzeMainListAdapter.java index a7b49592..143bbc23 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/core/adapter/RettificaGiacenzeMainListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/ui/RettificaGiacenzeMainListAdapter.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.rettifica_giacenze.core.adapter; +package it.integry.integrywmsnative.gest.rettifica_giacenze.ui; import android.view.LayoutInflater; import android.view.ViewGroup; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java index c5225a75..0cfe378c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java @@ -56,8 +56,8 @@ import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.core.utility.UtilityToast; import it.integry.integrywmsnative.databinding.ActivitySpedizioneBinding; import it.integry.integrywmsnative.gest.lista_bancali.ListaBancaliActivity; -import it.integry.integrywmsnative.gest.spedizione.core.SpedizioneListAdapter; -import it.integry.integrywmsnative.gest.spedizione.core.SpedizioneListModel; +import it.integry.integrywmsnative.gest.spedizione.ui.SpedizioneListAdapter; +import it.integry.integrywmsnative.gest.spedizione.ui.SpedizioneListModel; import it.integry.integrywmsnative.gest.spedizione.dialogs.row_info.BaseDialogRowInfoView; import it.integry.integrywmsnative.gest.spedizione.exceptions.InvalidPesoKGException; import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/dialogs/row_info/BaseDialogRowInfoView.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/dialogs/row_info/BaseDialogRowInfoView.java index 09b58137..c40c2c75 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/dialogs/row_info/BaseDialogRowInfoView.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/dialogs/row_info/BaseDialogRowInfoView.java @@ -3,7 +3,7 @@ package it.integry.integrywmsnative.gest.spedizione.dialogs.row_info; import org.jetbrains.annotations.NotNull; import it.integry.integrywmsnative.core.expansion.BaseDialogFragment; -import it.integry.integrywmsnative.gest.spedizione.core.SpedizioneListModel; +import it.integry.integrywmsnative.gest.spedizione.ui.SpedizioneListModel; public abstract class BaseDialogRowInfoView extends BaseDialogFragment implements IBaseDialogRowInfoView { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/dialogs/row_info/prod_fabbisogno_linee_prod/DialogRowInfoProdFabbisognoLineeProdView.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/dialogs/row_info/prod_fabbisogno_linee_prod/DialogRowInfoProdFabbisognoLineeProdView.java index 663d4b98..ba232757 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/dialogs/row_info/prod_fabbisogno_linee_prod/DialogRowInfoProdFabbisognoLineeProdView.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/dialogs/row_info/prod_fabbisogno_linee_prod/DialogRowInfoProdFabbisognoLineeProdView.java @@ -26,7 +26,7 @@ import it.integry.integrywmsnative.core.rest.model.SitArtOrdDTO; import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.databinding.DialogRowInfoProdFabbisognoLineeProdBinding; import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.dto.ProdFabbisognoLineeProdDTO; -import it.integry.integrywmsnative.gest.spedizione.core.SpedizioneListModel; +import it.integry.integrywmsnative.gest.spedizione.ui.SpedizioneListModel; import it.integry.integrywmsnative.gest.spedizione.dialogs.row_info.BaseDialogRowInfoView; public class DialogRowInfoProdFabbisognoLineeProdView extends BaseDialogRowInfoView implements DialogRowInfoProdFabbisognoLineeProdViewModel.Listener { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/core/SpedizioneListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/ui/SpedizioneListAdapter.java similarity index 99% rename from app/src/main/java/it/integry/integrywmsnative/gest/spedizione/core/SpedizioneListAdapter.java rename to app/src/main/java/it/integry/integrywmsnative/gest/spedizione/ui/SpedizioneListAdapter.java index a2355ece..16ad0f55 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/core/SpedizioneListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/ui/SpedizioneListAdapter.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.spedizione.core; +package it.integry.integrywmsnative.gest.spedizione.ui; import android.content.Context; import android.graphics.Color; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/core/SpedizioneListModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/ui/SpedizioneListModel.java similarity index 98% rename from app/src/main/java/it/integry/integrywmsnative/gest/spedizione/core/SpedizioneListModel.java rename to app/src/main/java/it/integry/integrywmsnative/gest/spedizione/ui/SpedizioneListModel.java index 94f425fa..8e8181e9 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/core/SpedizioneListModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/ui/SpedizioneListModel.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.spedizione.core; +package it.integry.integrywmsnative.gest.spedizione.ui; import org.jetbrains.annotations.NotNull; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java index d0c28b47..f4349073 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java @@ -41,8 +41,7 @@ import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.databinding.FragmentUltimiArriviFornitoreBinding; import it.integry.integrywmsnative.gest.picking_resi.PickingResiActivity; -import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core.UltimiArriviFornitoreListAdapter; -import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core.UltimiArriviFornitoreViewModel; +import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.ui.UltimiArriviFornitoreListAdapter; import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.dialog.DialogUltimiArriviFornitoreFiltroAvanzato; import it.integry.integrywmsnative.ui.ElevatedToolbar; import it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts.DialogChooseArtsFromListaArts; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreModule.java index fcb4e8fa..8286388d 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreModule.java @@ -7,7 +7,6 @@ import dagger.Provides; import it.integry.integrywmsnative.core.rest.consumers.BarcodeRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; -import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core.UltimiArriviFornitoreViewModel; import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.rest.UltimiArriviFornitoreRESTConsumer; @Module(subcomponents = UltimiArriviFornitoreComponent.class) diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/core/UltimiArriviFornitoreViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreViewModel.java similarity index 99% rename from app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/core/UltimiArriviFornitoreViewModel.java rename to app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreViewModel.java index 7b17b4eb..0e972f67 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/core/UltimiArriviFornitoreViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreViewModel.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core; +package it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore; import androidx.lifecycle.MutableLiveData; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/core/UltimiArriviFornitoreListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/ui/UltimiArriviFornitoreListAdapter.java similarity index 99% rename from app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/core/UltimiArriviFornitoreListAdapter.java rename to app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/ui/UltimiArriviFornitoreListAdapter.java index 8249b12e..0b1691fe 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/core/UltimiArriviFornitoreListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/ui/UltimiArriviFornitoreListAdapter.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.core; +package it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.ui; import android.content.Context; import android.view.LayoutInflater; diff --git a/app/src/main/java/it/integry/integrywmsnative/view/bottom_sheet__lu_content/BottomSheetFragmentLUContentListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/view/bottom_sheet__lu_content/BottomSheetFragmentLUContentListAdapter.java index f723ec4e..dcd00bbe 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/bottom_sheet__lu_content/BottomSheetFragmentLUContentListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/bottom_sheet__lu_content/BottomSheetFragmentLUContentListAdapter.java @@ -4,32 +4,23 @@ import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.BaseAdapter; import androidx.databinding.DataBindingUtil; -import androidx.databinding.Observable; import androidx.databinding.ObservableArrayList; -import androidx.databinding.ObservableField; import androidx.databinding.ObservableList; import androidx.recyclerview.widget.RecyclerView; -import java.math.BigDecimal; import java.util.ArrayList; import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.expansion.OnListGeneralChangedCallback; import it.integry.integrywmsnative.core.expansion.OnSingleClickListener; -import it.integry.integrywmsnative.core.expansion.RunnableArgs; -import it.integry.integrywmsnative.core.expansion.WeakReferenceOnListChangedCallback; import it.integry.integrywmsnative.core.model.MtbColr; -import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityNumber; import it.integry.integrywmsnative.core.utility.UtilityResources; import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.databinding.BottomSheetFragmentLuContentListItemBinding; -import it.integry.integrywmsnative.databinding.ListaRettificaGiacenzeModelBinding; -import it.integry.integrywmsnative.gest.rettifica_giacenze.core.adapter.RettificaGiacenzeMainListAdapter; public class BottomSheetFragmentLUContentListAdapter extends RecyclerView.Adapter { diff --git a/app/src/main/res/layout/fragment_ultimi_arrivi_fornitore.xml b/app/src/main/res/layout/fragment_ultimi_arrivi_fornitore.xml index b5d13b56..fc6272ce 100644 --- a/app/src/main/res/layout/fragment_ultimi_arrivi_fornitore.xml +++ b/app/src/main/res/layout/fragment_ultimi_arrivi_fornitore.xml @@ -10,7 +10,7 @@ + type="it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.UltimiArriviFornitoreViewModel" /> From 627d3646a63293524d08106b86e40d26f9f928a6 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Fri, 6 Aug 2021 11:37:26 +0200 Subject: [PATCH 06/18] Refactoring activity lista bancali --- .../MainApplicationComponent.java | 4 + .../lista_bancali/ListaBancaliActivity.java | 55 ++++++-- .../lista_bancali/ListaBancaliComponent.java | 15 +++ .../lista_bancali/ListaBancaliModule.java | 16 +++ .../lista_bancali/ListaBancaliViewModel.java | 67 ++++++++++ .../ui/ListaColliMainListAdapter.java | 76 +++++++++++ .../ui/MainListListaColliAdapter.java | 126 ------------------ .../viewmodel/ListaBancaliViewModel.java | 82 ------------ 8 files changed, 223 insertions(+), 218 deletions(-) create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliComponent.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliModule.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliViewModel.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ui/ListaColliMainListAdapter.java delete mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ui/MainListListaColliAdapter.java delete mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/viewmodel/ListaBancaliViewModel.java diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java index 1d216f65..5172884e 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java @@ -11,6 +11,8 @@ import it.integry.integrywmsnative.gest.accettazione_picking.AccettazionePicking import it.integry.integrywmsnative.gest.accettazione_picking.AccettazionePickingModule; import it.integry.integrywmsnative.gest.contenuto_bancale.ContenutoBancaleComponent; import it.integry.integrywmsnative.gest.contenuto_bancale.ContenutoBancaleModule; +import it.integry.integrywmsnative.gest.lista_bancali.ListaBancaliComponent; +import it.integry.integrywmsnative.gest.lista_bancali.ListaBancaliModule; import it.integry.integrywmsnative.gest.main.MainActivityComponent; import it.integry.integrywmsnative.gest.main.MainActivityModule; import it.integry.integrywmsnative.gest.main.MainFragmentComponent; @@ -63,6 +65,7 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr MainActivityModule.class, MainFragmentModule.class, MainAccettazioneModule.class, + ListaBancaliModule.class, ContenutoBancaleModule.class, PVOrdineAcquistoGrigliaModule.class, PVOrdineAcquistoEditModule.class, @@ -90,6 +93,7 @@ public interface MainApplicationComponent { MainActivityComponent.Factory mainActivityComponent(); MainFragmentComponent.Factory mainFragmentComponent(); MainAccettazioneComponent.Factory mainAccettazioneComponent(); + ListaBancaliComponent.Factory listaBancaliComponent(); ContenutoBancaleComponent.Factory contenutoBancaleComponent(); PVOrdineAcquistoGrigliaComponent.Factory pvOrdineAcquistoGrigliaComponent(); PVOrdineAcquistoEditComponent.Factory pvOrdineAcquistoEditComponent(); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliActivity.java index 2cddbae5..6d9afe15 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliActivity.java @@ -4,10 +4,16 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; +import androidx.core.content.ContextCompat; import androidx.databinding.DataBindingUtil; +import androidx.databinding.ObservableArrayList; +import androidx.recyclerview.widget.LinearLayoutManager; import java.util.List; +import javax.inject.Inject; + +import it.integry.integrywmsnative.MainApplication; import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.data_cache.DataCache; import it.integry.integrywmsnative.core.expansion.BaseActivity; @@ -16,9 +22,10 @@ import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.rest.consumers.PrinterRESTConsumer; import it.integry.integrywmsnative.databinding.ActivityListaBancaliBinding; import it.integry.integrywmsnative.gest.contenuto_bancale.ContenutoBancaleActivity; -import it.integry.integrywmsnative.gest.lista_bancali.viewmodel.ListaBancaliViewModel; +import it.integry.integrywmsnative.gest.lista_bancali.ui.ListaColliMainListAdapter; +import it.integry.integrywmsnative.ui.SimpleDividerItemDecoration; -public class ListaBancaliActivity extends BaseActivity { +public class ListaBancaliActivity extends BaseActivity implements ListaBancaliViewModel.Listener{ private static class Key { private static final String MtbColtsKey = "mtbColtsKey"; @@ -28,9 +35,12 @@ public class ListaBancaliActivity extends BaseActivity { private static final String FlagOnlyResiduo = "flagOnlyResiduo"; } - public ActivityListaBancaliBinding bindings; + public ActivityListaBancaliBinding mBindings; - private ListaBancaliViewModel mViewModel; + @Inject + ListaBancaliViewModel mViewModel; + + private final ObservableArrayList mtbColts = new ObservableArrayList<>(); private RunnableArgsWithReturn mCanRecoverUl; private PrinterRESTConsumer.Type mPrinterType; @@ -78,7 +88,12 @@ public class ListaBancaliActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - bindings = DataBindingUtil.setContentView(this, R.layout.activity_lista_bancali); + mBindings = DataBindingUtil.setContentView(this, R.layout.activity_lista_bancali); + + MainApplication.appComponent + .listaBancaliComponent() + .create() + .inject(this); mCanRecoverUl = DataCache.retrieveItem(getIntent().getStringExtra(Key.CanRecoverUL)); @@ -86,16 +101,36 @@ public class ListaBancaliActivity extends BaseActivity { mReportName = DataCache.retrieveItem(getIntent().getStringExtra(Key.ReportName)); mFlagOnlyResiduo = DataCache.retrieveItem(getIntent().getStringExtra(Key.FlagOnlyResiduo)); - List mtbColts = DataCache.retrieveItem(getIntent().getStringExtra(Key.MtbColtsKey)); - mViewModel = new ListaBancaliViewModel(this, mtbColts, mFlagOnlyResiduo); + mtbColts.addAll(DataCache.retrieveItem(getIntent().getStringExtra(Key.MtbColtsKey))); + this.initRecyclerView(); - setSupportActionBar(this.bindings.toolbar); + setSupportActionBar(this.mBindings.toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - } + + public void initRecyclerView() { + mBindings.listaColliMainList.setHasFixedSize(true); + mBindings.listaColliMainList.setLayoutManager(new LinearLayoutManager(this)); + + SimpleDividerItemDecoration itemDecorator = new SimpleDividerItemDecoration(this, SimpleDividerItemDecoration.VERTICAL); + itemDecorator.setDrawable(ContextCompat.getDrawable(this, R.drawable.divider)); + mBindings.listaColliMainList.addItemDecoration(itemDecorator); + + + ListaColliMainListAdapter adapter = new ListaColliMainListAdapter(mtbColts) + .setOnItemClickListener(mtbColtSelected -> { + this.mViewModel.dispatchMtbColt(mtbColtSelected, mFlagOnlyResiduo, this::startContenutoBancaleActivity); + }); + + adapter.setEmptyView(mBindings.listaBancaliEmptyView); + mBindings.listaColliMainList.setAdapter(adapter); + + mBindings.elevatedToolbar.setRecyclerView(mBindings.listaColliMainList); + } + + @Override public boolean onSupportNavigateUp() { onBackPressed(); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliComponent.java b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliComponent.java new file mode 100644 index 00000000..7e7e4379 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliComponent.java @@ -0,0 +1,15 @@ +package it.integry.integrywmsnative.gest.lista_bancali; + +import dagger.Subcomponent; + +@Subcomponent +public interface ListaBancaliComponent { + + @Subcomponent.Factory + interface Factory { + ListaBancaliComponent create(); + } + + void inject(ListaBancaliActivity listaBancaliActivity); + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliModule.java new file mode 100644 index 00000000..a2eddb5d --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliModule.java @@ -0,0 +1,16 @@ +package it.integry.integrywmsnative.gest.lista_bancali; + + +import dagger.Module; +import dagger.Provides; +import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; + +@Module(subcomponents = ListaBancaliComponent.class) +public class ListaBancaliModule { + + @Provides + ListaBancaliViewModel providesListaBancaliViewModel(ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer) { + return new ListaBancaliViewModel(colliMagazzinoRESTConsumer); + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliViewModel.java new file mode 100644 index 00000000..6f28e59c --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ListaBancaliViewModel.java @@ -0,0 +1,67 @@ +package it.integry.integrywmsnative.gest.lista_bancali; + + +import androidx.databinding.ObservableArrayList; + +import javax.inject.Inject; + +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener; +import it.integry.integrywmsnative.core.model.MtbColr; +import it.integry.integrywmsnative.core.model.MtbColt; +import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; + +public class ListaBancaliViewModel { + + private final ColliMagazzinoRESTConsumer mColliMagazzinoRESTConsumer; + + private Listener mListener; + + @Inject + public ListaBancaliViewModel(ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer) { + this.mColliMagazzinoRESTConsumer = colliMagazzinoRESTConsumer; + } + + + public void dispatchMtbColt(MtbColt mtbColtToDispatch, boolean onlyResiduo, RunnableArgs onComplete) { + this.sendOnLoadingStarted(); + + new Thread(() -> { + mColliMagazzinoRESTConsumer.getByTestata(mtbColtToDispatch, onlyResiduo, false, mtbColt -> { + this.sendOnLoadingEnded(); + + ObservableArrayList mtbColrObservableArrayList = new ObservableArrayList<>(); + if(mtbColt != null && mtbColt.getMtbColr() != null) mtbColrObservableArrayList.addAll(mtbColt.getMtbColr()); + mtbColtToDispatch.setMtbColr(mtbColrObservableArrayList); + + onComplete.run(mtbColtToDispatch); + }, this::sendError); + + }).start(); + } + + + 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 ListaBancaliViewModel setListener(Listener listener) { + this.mListener = listener; + return this; + } + + public interface Listener extends ILoadingListener { + + void onError(Exception ex); + + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ui/ListaColliMainListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ui/ListaColliMainListAdapter.java new file mode 100644 index 00000000..de7758e3 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ui/ListaColliMainListAdapter.java @@ -0,0 +1,76 @@ +package it.integry.integrywmsnative.gest.lista_bancali.ui; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.databinding.DataBindingUtil; +import androidx.databinding.ObservableArrayList; +import androidx.recyclerview.widget.RecyclerView; + +import it.integry.integrywmsnative.R; +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.expansion.view.ExtendedRecyclerView; +import it.integry.integrywmsnative.core.model.MtbColt; +import it.integry.integrywmsnative.databinding.ListaBancaliListModelBinding; + +public class ListaColliMainListAdapter extends ExtendedRecyclerView { + + + private RunnableArgs mOnItemClickListener; + + public static class ViewHolder extends RecyclerView.ViewHolder { + protected ListaBancaliListModelBinding mViewDataBinding; + + + public ViewHolder(ListaBancaliListModelBinding v) { + super(v.getRoot()); + mViewDataBinding = v; + } + + public void bind(MtbColt mtbColt) { + mViewDataBinding.setMtbColt(mtbColt); + mViewDataBinding.executePendingBindings(); + } + } + + public ListaColliMainListAdapter(ObservableArrayList myDataset) { + super(myDataset); + } + + + @Override + public ListaColliMainListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + // create a new view + ListaBancaliListModelBinding viewDataBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.lista_bancali_list_model, parent, false); + + return new ViewHolder(viewDataBinding); + } + + + @Override + public void onBindViewHolder(ListaColliMainListAdapter.ViewHolder holder, int position) { + MtbColt item = mDataset.get(position); + holder.bind(item); + + holder.mViewDataBinding.getRoot().setOnClickListener(x -> { + if(mOnItemClickListener != null) { + mOnItemClickListener.run(item); + } + }); + } + + @Override + public void onViewRecycled(ListaColliMainListAdapter.ViewHolder holder) { + super.onViewRecycled(holder); + } + + + + + public ListaColliMainListAdapter setOnItemClickListener(RunnableArgs onItemClickListener) { + this.mOnItemClickListener = onItemClickListener; + return this; + } + + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ui/MainListListaColliAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ui/MainListListaColliAdapter.java deleted file mode 100644 index 2a8382f0..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/ui/MainListListaColliAdapter.java +++ /dev/null @@ -1,126 +0,0 @@ -package it.integry.integrywmsnative.gest.lista_bancali.ui; - -import android.content.Context; -import androidx.databinding.DataBindingUtil; -import androidx.databinding.ObservableArrayList; -import androidx.databinding.ObservableList; -import androidx.recyclerview.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.ViewGroup; -import android.view.View; - -import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.interfaces.IRecyclerItemClicked; -import it.integry.integrywmsnative.core.model.MtbColt; -import it.integry.integrywmsnative.databinding.ListaBancaliListModelBinding; - -public class MainListListaColliAdapter extends RecyclerView.Adapter { - - protected Context mContext; - protected ObservableArrayList mDataset; - - private View mEmptyView; - - private IRecyclerItemClicked mOnItemClickListener; - - public static class ViewHolder extends RecyclerView.ViewHolder { - protected ListaBancaliListModelBinding mViewDataBinding; - - - public ViewHolder(ListaBancaliListModelBinding v) { - super(v.getRoot()); - mViewDataBinding = v; - } - - public void bind(MtbColt mtbColt) { - mViewDataBinding.setMtbColt(mtbColt); - mViewDataBinding.executePendingBindings(); - } - } - - public MainListListaColliAdapter(Context context, ObservableArrayList myDataset, IRecyclerItemClicked onItemClickListener, View emptyView) { - mContext = context; - mDataset = myDataset; - mEmptyView = emptyView; - mOnItemClickListener = onItemClickListener; - - myDataset.addOnListChangedCallback(onListChangedCallback); - - checkIfEmpty(); - } - - - @Override - public MainListListaColliAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - // create a new view - ListaBancaliListModelBinding viewDataBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.lista_bancali_list_model, parent, false); - - return new ViewHolder(viewDataBinding); - } - - - @Override - public void onBindViewHolder(MainListListaColliAdapter.ViewHolder holder, int position) { - MtbColt item = mDataset.get(position); - holder.bind(item); - - holder.mViewDataBinding.getRoot().setOnClickListener(x -> { - if(mOnItemClickListener != null) { - mOnItemClickListener.onItemClick(item, position); - } - }); - } - - @Override - public void onViewRecycled(MainListListaColliAdapter.ViewHolder holder) { - super.onViewRecycled(holder); - } - - - @Override - public int getItemCount() { - return mDataset.size(); - } - - - void checkIfEmpty() { - if (mEmptyView != null) { - final boolean emptyViewVisible = getItemCount() == 0; - mEmptyView.setVisibility(emptyViewVisible ? View.VISIBLE : View.GONE); - } - } - - - private ObservableList.OnListChangedCallback onListChangedCallback = new ObservableList.OnListChangedCallback>() { - @Override - public void onChanged(ObservableList sender) { - notifyDataSetChanged(); - checkIfEmpty(); - } - - @Override - public void onItemRangeChanged(ObservableList sender, int positionStart, int itemCount) { - notifyDataSetChanged(); - checkIfEmpty(); - } - - @Override - public void onItemRangeInserted(ObservableList sender, int positionStart, int itemCount) { - notifyDataSetChanged(); - checkIfEmpty(); - } - - @Override - public void onItemRangeMoved(ObservableList sender, int fromPosition, int toPosition, int itemCount) { - notifyDataSetChanged(); - checkIfEmpty(); - } - - @Override - public void onItemRangeRemoved(ObservableList sender, int positionStart, int itemCount) { - notifyDataSetChanged(); - checkIfEmpty(); - } - }; - -} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/viewmodel/ListaBancaliViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/viewmodel/ListaBancaliViewModel.java deleted file mode 100644 index 38632bcc..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/gest/lista_bancali/viewmodel/ListaBancaliViewModel.java +++ /dev/null @@ -1,82 +0,0 @@ -package it.integry.integrywmsnative.gest.lista_bancali.viewmodel; - -import android.app.Dialog; - -import androidx.core.content.ContextCompat; -import androidx.databinding.ObservableArrayList; -import androidx.recyclerview.widget.LinearLayoutManager; - -import java.util.List; - -import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.interfaces.IRecyclerItemClicked; -import it.integry.integrywmsnative.core.model.MtbColr; -import it.integry.integrywmsnative.core.model.MtbColt; -import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.integrywmsnative.core.utility.UtilityProgress; -import it.integry.integrywmsnative.gest.lista_bancali.ListaBancaliActivity; -import it.integry.integrywmsnative.gest.lista_bancali.ui.MainListListaColliAdapter; -import it.integry.integrywmsnative.ui.SimpleDividerItemDecoration; - -public class ListaBancaliViewModel implements IRecyclerItemClicked { - - private ListaBancaliActivity mContext; - private ObservableArrayList mMtbColts; - - private MainListListaColliAdapter mAdapter; - - private boolean mLoadOnlyResiduo; - - public ListaBancaliViewModel(ListaBancaliActivity context, List mtbColts, boolean loadOnlyResiduo){ - mContext = context; - mMtbColts = new ObservableArrayList<>(); - mMtbColts.addAll(mtbColts); - - this.mLoadOnlyResiduo = loadOnlyResiduo; - - initRecyclerView(); - } - - public void initRecyclerView() { - mContext.bindings.listaColliMainList.setHasFixedSize(true); - mContext.bindings.listaColliMainList.setLayoutManager(new LinearLayoutManager(mContext)); - - SimpleDividerItemDecoration itemDecorator = new SimpleDividerItemDecoration(mContext, SimpleDividerItemDecoration.VERTICAL); - itemDecorator.setDrawable(ContextCompat.getDrawable(mContext, R.drawable.divider)); - mContext.bindings.listaColliMainList.addItemDecoration(itemDecorator); - - - mAdapter = new MainListListaColliAdapter(mContext, mMtbColts, this, mContext.bindings.listaBancaliEmptyView); - mContext.bindings.listaColliMainList.setAdapter(mAdapter); - - mContext.bindings.elevatedToolbar.setRecyclerView(mContext.bindings.listaColliMainList); - - } - - @Override - public void onItemClick(MtbColt item, int position) { - - final Dialog progress = UtilityProgress.createDefaultProgressDialog(mContext); - - try { - ColliMagazzinoRESTConsumer.getByTestataStatic(item, mLoadOnlyResiduo, false, mtbColt -> { - - ObservableArrayList mtbColrObservableArrayList = new ObservableArrayList<>(); - if(mtbColt != null && mtbColt.getMtbColr() != null) mtbColrObservableArrayList.addAll(mtbColt.getMtbColr()); - item.setMtbColr(mtbColrObservableArrayList); - - progress.dismiss(); - - mContext.startContenutoBancaleActivity(item); - - }, ex -> UtilityExceptions.defaultException(mContext, ex, progress)); - - - } catch (Exception e) { - e.printStackTrace(); - UtilityExceptions.defaultException(mContext, e, progress); - } - } - -} From 18b4b08e1b4f43c089288713ec86a0f9d71f9087 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Fri, 6 Aug 2021 13:28:56 +0200 Subject: [PATCH 07/18] Refactoring accettazione ordini produzione --- .../MainApplicationComponent.java | 6 +- .../consumers/ColliMagazzinoRESTConsumer.java | 14 +- .../rest/OrdiniAccettazioneRESTConsumer.java | 5 - .../OrdiniUscitaElencoFragment.java | 20 -- .../ProdOrdineProduzioneElencoComponent.java | 15 + .../ProdOrdineProduzioneElencoFragment.java | 293 +++++++++--------- .../ProdOrdineProduzioneElencoModule.java | 21 ++ .../ProdOrdineProduzioneElencoViewModel.java | 100 ++++++ .../core/OrdineProduzioneHelper.java | 70 ----- .../core/OrdineProduzioneListAdapter.java | 196 ------------ .../ProdOrdineProduzioneRESTConsumer.java | 64 ++++ ...rdineProduzioneElencoClienteListModel.java | 25 ++ ...stProdOrdineProduzioneElencoListModel.java | 70 +++++ .../ui/OrdineProduzioneListAdapter.java | 153 +++++++++ ...od_ordine_produzione__list_group_model.xml | 9 +- ...fragment_prod_ordine_produzione_elenco.xml | 16 +- 16 files changed, 625 insertions(+), 452 deletions(-) create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoComponent.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoModule.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoViewModel.java delete mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/core/OrdineProduzioneHelper.java delete mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/core/OrdineProduzioneListAdapter.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/rest/ProdOrdineProduzioneRESTConsumer.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/MainListProdOrdineProduzioneElencoClienteListModel.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/MainListProdOrdineProduzioneElencoListModel.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/OrdineProduzioneListAdapter.java diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java index 5172884e..3ad66620 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java @@ -23,6 +23,8 @@ import it.integry.integrywmsnative.gest.picking_libero.PickingLiberoComponent; import it.integry.integrywmsnative.gest.picking_libero.PickingLiberoModule; import it.integry.integrywmsnative.gest.picking_resi.PickingResiComponent; import it.integry.integrywmsnative.gest.picking_resi.PickingResiModule; +import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ProdOrdineProduzioneElencoComponent; +import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ProdOrdineProduzioneElencoModule; import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.ProdFabbisognoLineeProdComponent; import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.ProdFabbisognoLineeProdModule; import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.dialog_ask_mag_prossimita.DialogAskMagazzinoProssimitaComponent; @@ -85,7 +87,8 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr VersamentoMerceModule.class, DialogAskMagazzinoProssimitaModule.class, DialogChooseBatchLotModule.class, - DialogRowInfoProdFabbisognoLineeProdModule.class + DialogRowInfoProdFabbisognoLineeProdModule.class, + ProdOrdineProduzioneElencoModule.class }) public interface MainApplicationComponent { @@ -116,6 +119,7 @@ public interface MainApplicationComponent { DialogRowInfoProdFabbisognoLineeProdComponent.Factory dialogRowInfoProdFabbisognoLineeProdComponent(); ProdRientroMerceComponent.Factory prodRientroMerceComponent(); ProdRientroMerceOrderDetailComponent.Factory prodRientroMerceOrderDetailComponent(); + ProdOrdineProduzioneElencoComponent.Factory prodOrdineProduzioneElencoComponent(); void inject(MainApplication mainApplication); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java index e1ab5b2e..cb86c5fd 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java @@ -447,10 +447,6 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { } public void getMultipleByTestate(List testate, boolean onlyResiduo, RunnableArgs> onComplete, RunnableArgs onFailed) { - ColliMagazzinoRESTConsumer.getMultipleByTestateStatic(testate, onlyResiduo, onComplete, onFailed); - } - - public static void getMultipleByTestateStatic(List testate, boolean onlyResiduo, RunnableArgs> onComplete, RunnableArgs onFailed) { ArrayList resultMtbColt = new ArrayList<>(); cyclicGetMultipleByTestate(testate.iterator(), onlyResiduo, resultMtbColt, () -> { onComplete.run(resultMtbColt); @@ -458,9 +454,9 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { } - private static void cyclicGetMultipleByTestate(@NotNull Iterator sourceMtbColts, boolean onlyResiduo, ArrayList resultMtbColt, Runnable onComplete, RunnableArgs onAbort) { + private void cyclicGetMultipleByTestate(@NotNull Iterator sourceMtbColts, boolean onlyResiduo, ArrayList resultMtbColt, Runnable onComplete, RunnableArgs onAbort) { if (sourceMtbColts.hasNext()) { - getByTestataStatic(sourceMtbColts.next(), onlyResiduo, false, mtbColt -> { + getByTestata(sourceMtbColts.next(), onlyResiduo, false, mtbColt -> { resultMtbColt.add(mtbColt); cyclicGetMultipleByTestate(sourceMtbColts, onlyResiduo, resultMtbColt, onComplete, onAbort); }, onAbort); @@ -476,14 +472,10 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { .setDataCollo(dataCollo) .setSerCollo(serCollo); - ColliMagazzinoRESTConsumer.getByTestataStatic(mtbColtToRetrieve, onlyResiduo, throwExcIfNull, onComplete, onFailed); + getByTestata(mtbColtToRetrieve, onlyResiduo, throwExcIfNull, onComplete, onFailed); } public void getByTestata(MtbColt testata, boolean onlyResiduo, boolean throwExcIfNull, RunnableArgs onComplete, RunnableArgs onFailed) { - ColliMagazzinoRESTConsumer.getByTestataStatic(testata, onlyResiduo, throwExcIfNull, onComplete, onFailed); - } - - public static void getByTestataStatic(MtbColt testata, boolean onlyResiduo, boolean throwExcIfNull, RunnableArgs onComplete, RunnableArgs onFailed) { testata.setMtbColr(new ObservableArrayList<>()); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/rest/OrdiniAccettazioneRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/rest/OrdiniAccettazioneRESTConsumer.java index 7c1e054f..08561633 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/rest/OrdiniAccettazioneRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/rest/OrdiniAccettazioneRESTConsumer.java @@ -39,10 +39,6 @@ public class OrdiniAccettazioneRESTConsumer extends _BaseRESTConsumer { public void retrievePickingListNew(List orders, RunnableArgs> onComplete, RunnableArgs onFailed) { - retrievePickingListNewStatic(orders, onComplete, onFailed); - } - - public static void retrievePickingListNewStatic(List orders, RunnableArgs> onComplete, RunnableArgs onFailed) { List getPickingListDTOs = Stream.of(orders) .map(x -> new GetPickingListAccettazioneDTO() .setData(x.getData()) @@ -63,7 +59,6 @@ public class OrdiniAccettazioneRESTConsumer extends _BaseRESTConsumer { onFailed.run(new Exception(t)); } }); - } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java index 613fa72f..442e7b19 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/OrdiniUscitaElencoFragment.java @@ -288,26 +288,6 @@ public class OrdiniUscitaElencoFragment extends BaseFragment implements ITitledF this.mViewModel.loadPicking(selectedOrders); } - - @Override - public void onLoadingStarted() { - BarcodeManager.disable(); - this.openProgress(); - } - - @Override - public void onLoadingEnded() { - this.closeProgress(); - BarcodeManager.enable(); - } - - @Override - public void onError(Exception ex) { - this.closeProgress(); - UtilityExceptions.defaultException(getActivity(), ex, mCurrentProgress); - BarcodeManager.enable(); - } - @Override public void onOrderFiltered(List filteredOrders) { refreshList(filteredOrders); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoComponent.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoComponent.java new file mode 100644 index 00000000..809f3677 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoComponent.java @@ -0,0 +1,15 @@ +package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione; + +import dagger.Subcomponent; + +@Subcomponent +public interface ProdOrdineProduzioneElencoComponent { + + @Subcomponent.Factory + interface Factory { + ProdOrdineProduzioneElencoComponent create(); + } + + void inject(ProdOrdineProduzioneElencoFragment prodOrdineProduzioneElencoFragment); + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java index df721f6b..c9226096 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java @@ -1,19 +1,17 @@ package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione; -import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.text.Html; -import android.text.SpannableString; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; import androidx.appcompat.widget.AppCompatTextView; import androidx.databinding.DataBindingUtil; +import androidx.databinding.ObservableArrayList; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; @@ -23,22 +21,26 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import javax.inject.Inject; + +import it.integry.integrywmsnative.MainApplication; import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.data_cache.DataCache; -import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.di.BindableBoolean; +import it.integry.integrywmsnative.core.expansion.BaseFragment; import it.integry.integrywmsnative.core.interfaces.IFilterableFragment; import it.integry.integrywmsnative.core.interfaces.IScrollableFragment; import it.integry.integrywmsnative.core.interfaces.ITitledFragment; -import it.integry.integrywmsnative.core.rest.CommonRESTException; +import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityBigDecimal; -import it.integry.integrywmsnative.core.utility.UtilityProgress; +import it.integry.integrywmsnative.core.utility.UtilityDate; import it.integry.integrywmsnative.databinding.FragmentProdOrdineProduzioneElencoBinding; import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; import it.integry.integrywmsnative.gest.accettazione.dto.SitArtOrdDTO; -import it.integry.integrywmsnative.gest.accettazione.rest.OrdiniAccettazioneRESTConsumer; import it.integry.integrywmsnative.gest.accettazione_picking.AccettazionePickingActivity; -import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.core.OrdineProduzioneHelper; -import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.core.OrdineProduzioneListAdapter; +import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui.MainListProdOrdineProduzioneElencoClienteListModel; +import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui.MainListProdOrdineProduzioneElencoListModel; +import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui.OrdineProduzioneListAdapter; import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.dialog.DialogOrdineProduzioneFiltroAvanzato; import it.integry.integrywmsnative.ui.ElevatedToolbar; import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; @@ -46,18 +48,19 @@ import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; /** * A simple {@link Fragment} subclass. */ -public class ProdOrdineProduzioneElencoFragment extends Fragment implements ITitledFragment, IScrollableFragment, IFilterableFragment { +public class ProdOrdineProduzioneElencoFragment extends BaseFragment implements ProdOrdineProduzioneElencoViewModel.Listener, ITitledFragment, IScrollableFragment, IFilterableFragment { + + public BindableBoolean fabVisible = new BindableBoolean(false); + + @Inject + ProdOrdineProduzioneElencoViewModel mViewModel; private final List mOnPreDestroyList = new ArrayList<>(); private ElevatedToolbar mToolbar; private FragmentProdOrdineProduzioneElencoBinding mBinding; - private OrdineProduzioneHelper mHelper; - private OrdineProduzioneListAdapter mAdapter; - - private List mOriginalOrderList; - private List mRenderedOrderList = new ArrayList<>(); + private final ObservableArrayList mOrdiniInevasiMutableData = new ObservableArrayList<>(); private AppCompatTextView mAppBarTitle; @@ -87,21 +90,30 @@ public class ProdOrdineProduzioneElencoFragment extends Fragment implements ITit Bundle savedInstanceState) { mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_prod_ordine_produzione_elenco, container, false); + MainApplication.appComponent + .prodOrdineProduzioneElencoComponent() + .create() + .inject(this); + mViewModel.setListener(this); + + mBinding.setLifecycleOwner(this); mBinding.setView(this); - mBinding.ordineProduzioneMainList.setLayoutManager(new LinearLayoutManager(getActivity())); - mBinding.ordineProduzioneMainFab.hide(); - mBinding.ordineProduzioneMainFab.setOnClickListener(v -> { - this.onAccettazioneMainFabClick(); - }); + this.initRecyclerView(); - mToolbar.setRecyclerView(mBinding.ordineProduzioneMainList); - - init(); return mBinding.getRoot(); } + + @Override + public void onStart() { + super.onStart(); + + String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep(); + mViewModel.init(codMdep); + } + @Override public void onDestroy() { super.onDestroy(); @@ -117,144 +129,149 @@ public class ProdOrdineProduzioneElencoFragment extends Fragment implements ITit mAppBarTitle.setText(context.getText(R.string.prod_ordine_produzione_title_fragment).toString()); } - - private void init() { - final Dialog progress = UtilityProgress.createDefaultProgressDialog(getActivity()); - - mHelper = new OrdineProduzioneHelper(getActivity()); - mHelper.loadOrdini(ordini -> { - if (ordini != null) { - Toast.makeText(getActivity(), "Caricati " + ordini.size() + " ordini", Toast.LENGTH_LONG).show(); - mOriginalOrderList = ordini; - } - - mBinding.ordiniProduzioneEmptyView.setVisibility(ordini != null && ordini.size() > 0 ? View.GONE : View.VISIBLE); - refreshRenderedOrdini(ordini); - initRecyclerView(); - progress.dismiss(); - }, ex -> { - progress.dismiss(); - - String errorMessage = CommonRESTException.tryRecognizeThenGetMessage(ex); - if (errorMessage == null) errorMessage = ex.getMessage(); - DialogSimpleMessageView - .makeErrorDialog(new SpannableString(errorMessage), null, null) - .show(getActivity().getSupportFragmentManager(), "tag"); - } - ); - } - @Override public void setScrollToolbar(ElevatedToolbar toolbar) { mToolbar = toolbar; } private void initRecyclerView() { - mAdapter = new OrdineProduzioneListAdapter(getActivity(), mRenderedOrderList, onSingleSelectionChanged); - mBinding.ordineProduzioneMainList.setAdapter(mAdapter); - } + this.mViewModel.getOrderList().observe(getViewLifecycleOwner(), this::refreshList); - private void refreshRenderedOrdini(List ordini) { + mBinding.ordineProduzioneMainList.setLayoutManager(new LinearLayoutManager(getActivity())); - mRenderedOrderList.clear(); - if (ordini != null) mRenderedOrderList.addAll(ordini); - } + OrdineProduzioneListAdapter adapter = new OrdineProduzioneListAdapter(getActivity(), mOrdiniInevasiMutableData) + .setOnGroupItemClicked(x -> { + Stream.of(mOrdiniInevasiMutableData) + .filter(y -> !y.getGroupTitle().equalsIgnoreCase(x) && y.getSelectedObservable().get()) + .forEach(y -> y.getSelectedObservable().set(false)); - private void refreshRecyclerView() { - mAdapter.updateItems(mRenderedOrderList); - } + boolean allSelected = Stream.of(mOrdiniInevasiMutableData) + .filter(y -> y.getGroupTitle().equalsIgnoreCase(x)) + .allMatch(y -> y.getSelectedObservable().get()); - private RunnableArgs onSingleSelectionChanged = dto -> { - List selectedOrders = mHelper.getSelectedOrders(mOriginalOrderList); + Stream.of(mOrdiniInevasiMutableData) + .filter(y -> y.getGroupTitle().equalsIgnoreCase(x)) + .forEach(y -> y.getSelectedObservable().set(!allSelected)); + }) + .setOnItemChecked(x -> { + Stream.of(mOrdiniInevasiMutableData) + .filter(y -> !y.getGroupTitle().equalsIgnoreCase(x.getGroupTitle()) && y.getSelectedObservable().get()) + .forEach(y -> y.getSelectedObservable().set(false)); - if (dto.isSelected()) { - Stream.of(selectedOrders) - .filter(x -> !x.getCodAnagOrd().equalsIgnoreCase(dto.getCodAnagOrd())) - .forEach(x -> x.setSelected(false)); - } - - if (selectedOrders != null && selectedOrders.size() > 0) { - mBinding.ordineProduzioneMainFab.show(); - } else { - mBinding.ordineProduzioneMainFab.hide(); - } - }; - - - private void onAccettazioneMainFabClick() { - List selectedOrders = mHelper.getSelectedOrders(mOriginalOrderList); - - final Dialog progress = UtilityProgress.createDefaultProgressDialog(getActivity()); - - OrdiniAccettazioneRESTConsumer.retrievePickingListNewStatic(selectedOrders, sitArtOrds -> { - progress.dismiss(); - - long artsCounter = Stream.of(sitArtOrds) - .filter(x -> UtilityBigDecimal.greaterThan(x.getQtaDaEvadere(), BigDecimal.ZERO)) - .map(SitArtOrdDTO::getCodMart) - .distinct() - .count(); - - long ordsCounter = Stream.of(sitArtOrds) - .distinctBy(x -> x.getDataOrd() + " " + x.getNumOrd() + " " + x.getGestione()) - .count(); - - DialogSimpleMessageView.makeInfoDialog(getText(R.string.orders).toString(), - Html.fromHtml(String.format(getActivity().getResources().getQuantityString(R.plurals.loaded_orders_message, (int) ordsCounter), ordsCounter) - + "

" + - "" + artsCounter + " " + getActivity().getResources().getQuantityString(R.plurals.available_articles, (int) artsCounter)), - null, - () -> { - - String cacheSitArtItemID = DataCache.addItem(sitArtOrds); - String cacheOrdersItemID = DataCache.addItem(selectedOrders); - - Intent myIntent = new Intent(getActivity(), AccettazionePickingActivity.class); - myIntent.putExtra("keyOrders", cacheOrdersItemID); - myIntent.putExtra("keySitArts", cacheSitArtItemID); - getActivity().startActivity(myIntent); - - }).show(getActivity().getSupportFragmentManager(), "tag"); - - }, - - ex -> { -// Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_LONG).show(); - progress.dismiss(); - - String errorMessage = CommonRESTException.tryRecognizeThenGetMessage(ex); - if (errorMessage == null) - errorMessage = ex.getMessage() + "\n" + ex.getCause().getCause().getMessage(); - DialogSimpleMessageView - .makeErrorDialog(new SpannableString(errorMessage), null, null) - .show(getActivity().getSupportFragmentManager(), "tag"); + fabVisible.set(Stream.of(mOrdiniInevasiMutableData) + .anyMatch(y -> y.getSelectedObservable().get())); }); + adapter.setEmptyView(mBinding.ordiniProduzioneEmptyView); + mBinding.ordineProduzioneMainList.setAdapter(adapter); + + mToolbar.setRecyclerView(mBinding.ordineProduzioneMainList); + } + + private void refreshList(List filteredList) { + + List tmpList = null; + + if(filteredList != null) { + tmpList = filteredList; + } else if (mAppliedFilterViewModel != null) { +// mAppliedFilterViewModel.init(mViewModel.getOrderList().getValue()); +// mAppliedFilterViewModel.applyAllTests(); +// tmpList = mAppliedFilterViewModel.getMutableFilteredOrderList().getValue(); + } else { + tmpList = mViewModel.getOrderList().getValue(); + } + + this.mOrdiniInevasiMutableData.clear(); + this.mOrdiniInevasiMutableData.addAll(convertDataModelToListModel(tmpList)); + } + + private List convertDataModelToListModel(List dataList) { + + return Stream.of(dataList) + .distinctBy(OrdineAccettazioneInevasoDTO::getBarcode) + .sortBy(x -> x.getRagSocOrd() + (x.getDataConsD() != null ? UtilityDate.formatDate(x.getDataConsD(), UtilityDate.COMMONS_DATE_FORMATS.YMD_SLASH) : "")) + .map(x -> { + MainListProdOrdineProduzioneElencoListModel listModel = new MainListProdOrdineProduzioneElencoListModel(); + + listModel.setOriginalModel(x); + + listModel.setGroupTitle(x.getRagSocOrd()); + + listModel.setDescription(String.format(getString(R.string.ord_acq_testata), x.getNumero().toString(), UtilityDate.formatDate(x.getDataD(), UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN))); + + List clienti = Stream.of(dataList) + .filter(y -> y.getBarcode().equals(x.getBarcode())) + .map(y -> new MainListProdOrdineProduzioneElencoClienteListModel() + .setPrimaryText(y.getRifOrd()) + .setRightText(y.getCodJcom())) + .toList(); + + listModel.setClientiListModel(clienti); + + return listModel; + }) + .toList(); + } + + + public void dispatchOrders() { + List selectedOrders = Stream.of(this.mOrdiniInevasiMutableData) + .filter(x -> x.getSelectedObservable().get()) + .map(MainListProdOrdineProduzioneElencoListModel::getOriginalModel) + .toList(); + + + this.mViewModel.loadPicking(selectedOrders); } @Override public void onFilterClick() { - DialogOrdineProduzioneFiltroAvanzato.make(getActivity(), mOriginalOrderList, mAppliedFilterViewModel, (filteredOrderList, filter) -> { - mAppliedFilterViewModel = filter; - - if (filteredOrderList != null) { - - refreshOrdini(filteredOrderList); - refreshRecyclerView(); - } - - }).show(); +// DialogOrdineProduzioneFiltroAvanzato.make(getActivity(), mOriginalOrderList, mAppliedFilterViewModel, (filteredOrderList, filter) -> { +// mAppliedFilterViewModel = filter; +// +// if (filteredOrderList != null) { +// refreshList(filteredOrderList); +// } +// +// }).show(); } - public void refreshOrdini(List ordini) { - mRenderedOrderList.clear(); - mRenderedOrderList.addAll(ordini); - } - @Override public void addOnPreDestroy(Runnable onPreDestroy) { this.mOnPreDestroyList.add(onPreDestroy); } + + @Override + public void onOrdersDispatched(List orders, List sitArts) { + long artsCounter = Stream.of(sitArts) + .filter(x -> UtilityBigDecimal.greaterThan(x.getQtaDaEvadere(), BigDecimal.ZERO)) + .map(SitArtOrdDTO::getCodMart) + .distinct() + .count(); + + long ordsCounter = Stream.of(sitArts) + .distinctBy(x -> x.getDataOrd() + " " + x.getNumOrd() + " " + x.getGestione()) + .count(); + + + DialogSimpleMessageView.makeInfoDialog(getText(R.string.orders).toString(), + Html.fromHtml(String.format(getActivity().getResources().getQuantityString(R.plurals.loaded_orders_message, (int) ordsCounter), ordsCounter) + + "

" + + "" + artsCounter + " " + getActivity().getResources().getQuantityString(R.plurals.available_articles, (int) artsCounter)), + null, + () -> { + + String cacheSitArtItemID = DataCache.addItem(sitArts); + String cacheOrdersItemID = DataCache.addItem(orders); + + Intent myIntent = new Intent(getActivity(), AccettazionePickingActivity.class); + myIntent.putExtra("keyOrders", cacheOrdersItemID); + myIntent.putExtra("keySitArts", cacheSitArtItemID); + getActivity().startActivity(myIntent); + + }).show(getActivity().getSupportFragmentManager(), "tag"); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoModule.java new file mode 100644 index 00000000..0db6253d --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoModule.java @@ -0,0 +1,21 @@ +package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione; + +import dagger.Module; +import dagger.Provides; +import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; +import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.rest.ProdOrdineProduzioneRESTConsumer; + +@Module(subcomponents = ProdOrdineProduzioneElencoComponent.class) +public class ProdOrdineProduzioneElencoModule { + + @Provides + ProdOrdineProduzioneRESTConsumer providesProdOrdineProduzioneRESTConsumer() { + return new ProdOrdineProduzioneRESTConsumer(); + } + + @Provides + ProdOrdineProduzioneElencoViewModel providesProdOrdineProduzioneElencoViewModel(ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer, ProdOrdineProduzioneRESTConsumer prodOrdineProduzioneRESTConsumer) { + return new ProdOrdineProduzioneElencoViewModel(colliMagazzinoRESTConsumer, prodOrdineProduzioneRESTConsumer); + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoViewModel.java new file mode 100644 index 00000000..bd36a93e --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoViewModel.java @@ -0,0 +1,100 @@ +package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione; + +import androidx.lifecycle.MutableLiveData; + +import java.util.List; + +import javax.inject.Inject; + +import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener; +import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; +import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; +import it.integry.integrywmsnative.gest.accettazione.dto.SitArtOrdDTO; +import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.rest.ProdOrdineProduzioneRESTConsumer; + +public class ProdOrdineProduzioneElencoViewModel { + + private final ColliMagazzinoRESTConsumer mColliMagazzinoRESTConsumer; + private final ProdOrdineProduzioneRESTConsumer mProdOrdineProduzioneRESTConsumer; + + private final MutableLiveData> mOrderList = new MutableLiveData<>(); + + private Listener mListener; + + private String codMdep; + + + @Inject + public ProdOrdineProduzioneElencoViewModel(ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer, ProdOrdineProduzioneRESTConsumer prodOrdineProduzioneRESTConsumer) { + this.mColliMagazzinoRESTConsumer = colliMagazzinoRESTConsumer; + this.mProdOrdineProduzioneRESTConsumer = prodOrdineProduzioneRESTConsumer; + } + + + public void init(String codMdep) { + this.codMdep = codMdep; + + this.sendOnLoadingStarted(); + new Thread(() -> { + + mProdOrdineProduzioneRESTConsumer.getOrdiniInevasi(codMdep, orderList -> { + this.mOrderList.setValue(orderList); + + this.sendOnLoadingEnded(); + }, this::sendError); + + }).start(); + } + + + public void loadPicking(List selectedOrders) { + + this.sendOnLoadingStarted(); + + new Thread(() -> { + + this.mProdOrdineProduzioneRESTConsumer.retrievePickingListNew(selectedOrders, sitArtOrds -> { + + this.sendOnOrdersDispatched(selectedOrders, sitArtOrds); + this.sendOnLoadingEnded(); + + }, this::sendError); + + }).start(); + + } + + + public MutableLiveData> getOrderList() { + return mOrderList; + } + + public ProdOrdineProduzioneElencoViewModel setListener(Listener listener) { + this.mListener = listener; + return this; + } + + 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); + } + + private void sendOnOrdersDispatched(List orders, List sitArts) { + if (this.mListener != null) mListener.onOrdersDispatched(orders, sitArts); + } + + public interface Listener extends ILoadingListener { + + void onError(Exception ex); + + void onOrdersDispatched(List orders, List sitArts); + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/core/OrdineProduzioneHelper.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/core/OrdineProduzioneHelper.java deleted file mode 100644 index 8957c8b7..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/core/OrdineProduzioneHelper.java +++ /dev/null @@ -1,70 +0,0 @@ -package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.core; - -import android.content.Context; -import android.util.Log; - -import com.annimon.stream.Stream; - -import java.util.List; - -import it.integry.integrywmsnative.core.expansion.RunnableArgs; -import it.integry.integrywmsnative.core.rest.RESTBuilder; -import it.integry.integrywmsnative.core.rest.model.EsitoType; -import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; -import it.integry.integrywmsnative.core.settings.SettingsManager; -import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; -import it.integry.integrywmsnative.gest.accettazione.rest.OrdiniAccettazioneRESTConsumerService; -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; - -public class OrdineProduzioneHelper { - - private Context mContext; - - public OrdineProduzioneHelper(Context context){ - mContext = context; - } - public void loadOrdini(RunnableArgs> onComplete, RunnableArgs onFailed){ - String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep(); - - OrdiniAccettazioneRESTConsumerService service = RESTBuilder.getService(OrdiniAccettazioneRESTConsumerService.class); - service.listOrdiniInevasi(codMdep, "P").enqueue(new Callback>>() { - @Override - public void onResponse(Call>> call, Response>> response) { - - if(response.isSuccessful()) { - - if(response.body() != null) { - if(response.body().getEsito() == EsitoType.OK) { - onComplete.run(response.body().getDto()); - } else { - Log.e("Accettazione", response.body().getErrorMessage()); - onFailed.run(new Exception(response.body().getErrorMessage())); - } - } else { - Log.e("Accettazione", response.message()); - onFailed.run(new Exception(response.message())); - } - } else { - Log.e("Accettazione", "Status " + response.code() + ": " + response.message()); - onFailed.run(new Exception("Status " + response.code() + ": " + response.message())); - } - } - - @Override - public void onFailure(Call>> call, Throwable t) { - Log.e("Produzione", t.toString()); - onFailed.run(new Exception(t)); - } - }); - } - - - public List getSelectedOrders(List ordiniList){ - return Stream.of(ordiniList) - .filter(OrdineAccettazioneInevasoDTO::isSelected) - .toList(); - } - -} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/core/OrdineProduzioneListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/core/OrdineProduzioneListAdapter.java deleted file mode 100644 index 07a2a7c4..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/core/OrdineProduzioneListAdapter.java +++ /dev/null @@ -1,196 +0,0 @@ -package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.core; - -import android.content.Context; -import android.text.Html; -import android.view.LayoutInflater; -import android.view.ViewGroup; - -import androidx.databinding.DataBindingUtil; -import androidx.databinding.Observable; -import androidx.recyclerview.widget.RecyclerView; - -import com.annimon.stream.Stream; -import com.zhukic.sectionedrecyclerview.SectionedRecyclerViewAdapter; - -import java.util.List; - -import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.di.BindableBoolean; -import it.integry.integrywmsnative.core.expansion.RunnableArgs; -import it.integry.integrywmsnative.core.utility.UtilityDate; -import it.integry.integrywmsnative.core.utility.UtilityString; -import it.integry.integrywmsnative.databinding.FragmentProdOrdineProduzioneListGroupClientiBinding; -import it.integry.integrywmsnative.databinding.FragmentProdOrdineProduzioneListGroupModelBinding; -import it.integry.integrywmsnative.databinding.FragmentProdOrdineProduzioneListModelBinding; -import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; -import it.integry.integrywmsnative.ui.fastscroll.SectionTitleProvider; - -public class OrdineProduzioneListAdapter extends SectionedRecyclerViewAdapter implements SectionTitleProvider { - - - private Context mContext; - - private List mOriginalDataset; - private List mDataset; - private RunnableArgs mOnSingleSelectionChanged; - - - static class SubheaderHolder extends RecyclerView.ViewHolder { - - FragmentProdOrdineProduzioneListModelBinding binding; - - SubheaderHolder(FragmentProdOrdineProduzioneListModelBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } - - } - - static class SingleItemViewHolder extends RecyclerView.ViewHolder { - - FragmentProdOrdineProduzioneListGroupModelBinding binding; - - SingleItemViewHolder(FragmentProdOrdineProduzioneListGroupModelBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } - } - - - public OrdineProduzioneListAdapter(Context context, List myDataset, RunnableArgs onSingleSelectionChanged) { - mContext = context; - mOriginalDataset = myDataset; - mDataset = orderItems(myDataset); - mOnSingleSelectionChanged = onSingleSelectionChanged; - } - - public void updateItems(List updatedDataset) { - mDataset.clear(); - mDataset.addAll(orderItems(updatedDataset)); - notifyDataSetChanged(); - notifyDataChanged(); - } - - - private List orderItems(List dataset) { - return Stream.of(dataset) - .distinctBy(OrdineAccettazioneInevasoDTO::getBarcode) - .sortBy(x -> x.getRagSocOrd() + (x.getDataConsD() != null ? UtilityDate.formatDate(x.getDataConsD(), UtilityDate.COMMONS_DATE_FORMATS.YMD_SLASH) : "")) - .toList(); - - } - - - - @Override - public SubheaderHolder onCreateSubheaderViewHolder(ViewGroup parent, int viewType) { - FragmentProdOrdineProduzioneListModelBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.fragment_prod_ordine_produzione__list_model, parent, false); - return new SubheaderHolder(binding); - } - - @Override - public SingleItemViewHolder onCreateItemViewHolder(ViewGroup parent, int viewType) { - FragmentProdOrdineProduzioneListGroupModelBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.fragment_prod_ordine_produzione__list_group_model, parent, false); - return new SingleItemViewHolder(binding); - } - - - @Override - public void onBindSubheaderViewHolder(OrdineProduzioneListAdapter.SubheaderHolder subheaderHolder, int nextItemPosition) { - subheaderHolder.binding.ordineProduzioneMainListGroupHeader.setText(mDataset.get(nextItemPosition).getRagSocOrd()); - - subheaderHolder.binding.getRoot().setOnClickListener(v -> { - - boolean anySelected = Stream.of(mDataset) - .filter(x -> x.getCodAnagOrd().equals(mDataset.get(nextItemPosition).getCodAnagOrd())) - .anyMatch(OrdineAccettazioneInevasoDTO::isSelected); - - Stream.of(mDataset) - .filter(x -> x.getCodAnagOrd().equals(mDataset.get(nextItemPosition).getCodAnagOrd())) - .forEach(x -> x.setSelected(!anySelected)); - }); - } - - @Override - public void onBindItemViewHolder(OrdineProduzioneListAdapter.SingleItemViewHolder h, int itemPosition) { - final OrdineAccettazioneInevasoDTO ordine = mDataset.get(itemPosition); - final OrdineProduzioneListAdapter.SingleItemViewHolder holder = h; - - holder.binding.ordineProduzioneMainListGroupItemContainerCheckBox.setTag(ordine.getNumero()); - - holder.binding.ordineProduzioneMainListGroupItemContainerCheckBox.setOnCheckedChangeListener(null); - - ordine.selected.resetOnPropertyChangedCallback(); - - - String testataOrdString = String.format(mContext.getString(R.string.ord_acq_testata), String.valueOf(ordine.getNumero()), UtilityDate.formatDate(ordine.getDataD(), UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN)); - holder.binding.ordineProduzioneMainListGroupItemContainerTestataOrd.setText(Html.fromHtml(testataOrdString)); - - holder.binding.ordineProduzioneMainListGroupItemContainerClientiOrd.removeAllViews(); - - List clienti = Stream.of(mOriginalDataset) - .filter(x -> x.getBarcode().equals(ordine.getBarcode())) - .toList(); - - for (OrdineAccettazioneInevasoDTO cliente : clienti) { - FragmentProdOrdineProduzioneListGroupClientiBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.fragment_prod_ordine_produzione__list_group_clienti, holder.binding.ordineProduzioneMainListGroupItemContainerClientiOrd, false); - - binding.ordineProduzioneMainListGroupClientiComm.setText(cliente.getRifOrd()); - -// if (!UtilityString.isNullOrEmpty(cliente.getDataConsS())) { -// binding.ordineProduzioneMainListGroupClientiDatacons.setText(UtilityDate.formatDate(cliente.getDataConsD(), UtilityDate.COMMONS_DATE_FORMATS.DMY_SLASH)); -// } else { -// binding.ordineProduzioneMainListGroupClientiDatacons.setText(""); -// } - - if (!UtilityString.isNullOrEmpty(cliente.getCodJcom())) { - binding.ordineProduzioneMainListGroupClientiDatacons.setText(cliente.getCodJcom()); - } - - holder.binding.ordineProduzioneMainListGroupItemContainerClientiOrd.addView(binding.getRoot()); - } - - holder.binding.setCheckboxValue(ordine.selected); - - holder.binding.getRoot().setOnClickListener(v -> { - ordine.setSelected(!ordine.isSelected()); - }); - - holder.binding.ordineProduzioneMainListGroupItemContainerCheckBox.setChecked(ordine.isSelected()); - - //Bindable to View - ordine.selected.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() { - @Override - public void onPropertyChanged(Observable sender, int propertyId) { - if(holder.binding.ordineProduzioneMainListGroupItemContainerCheckBox.getTag().equals(ordine.getNumero())) { - holder.binding.ordineProduzioneMainListGroupItemContainerCheckBox.setChecked(((BindableBoolean) sender).get()); - } - } - }); - - - //View to Bindable - holder.binding.ordineProduzioneMainListGroupItemContainerCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> { - ordine.setSelected(isChecked); - mOnSingleSelectionChanged.run(ordine); - }); - } - - - @Override - public boolean onPlaceSubheaderBetweenItems(int position) { - return !this.mDataset.get(position).getRagSocOrd().equalsIgnoreCase(this.mDataset.get(position + 1).getRagSocOrd()); - - } - - @Override - public int getItemSize() { - return mDataset.size(); - } - - @Override - public String getSectionTitle(int position) { - return null; - } - -} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/rest/ProdOrdineProduzioneRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/rest/ProdOrdineProduzioneRESTConsumer.java new file mode 100644 index 00000000..105ea499 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/rest/ProdOrdineProduzioneRESTConsumer.java @@ -0,0 +1,64 @@ +package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.rest; + +import com.annimon.stream.Stream; + +import java.util.List; + +import javax.inject.Singleton; + +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.rest.RESTBuilder; +import it.integry.integrywmsnative.core.rest.consumers._BaseRESTConsumer; +import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; +import it.integry.integrywmsnative.core.utility.UtilityLogger; +import it.integry.integrywmsnative.gest.accettazione.dto.GetPickingListAccettazioneDTO; +import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; +import it.integry.integrywmsnative.gest.accettazione.dto.SitArtOrdDTO; +import it.integry.integrywmsnative.gest.accettazione.rest.OrdiniAccettazioneRESTConsumerService; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +@Singleton +public class ProdOrdineProduzioneRESTConsumer extends _BaseRESTConsumer { + + public void getOrdiniInevasi(String codMdep, RunnableArgs> onComplete, RunnableArgs onFailed) { + OrdiniAccettazioneRESTConsumerService service = RESTBuilder.getService(OrdiniAccettazioneRESTConsumerService.class); + service.listOrdiniInevasi(codMdep, "P").enqueue(new Callback<>() { + @Override + public void onResponse(Call>> call, Response>> response) { + analyzeAnswer(response, "getOrdiniInevasi", onComplete, onFailed); + } + + @Override + public void onFailure(Call>> call, Throwable t) { + onFailed.run(new Exception(t)); + } + }); + } + + + public void retrievePickingListNew(List orders, RunnableArgs> onComplete, RunnableArgs onFailed) { + List getPickingListDTOs = Stream.of(orders) + .map(x -> new GetPickingListAccettazioneDTO() + .setData(x.getData()) + .setGestione(x.getGestione()) + .setNumero(x.getNumero())) + .toList(); + + OrdiniAccettazioneRESTConsumerService service = RESTBuilder.getService(OrdiniAccettazioneRESTConsumerService.class); + service.getArticoliFromOrdiniAccettazione(getPickingListDTOs).enqueue(new Callback<>() { + @Override + public void onResponse(Call>> call, Response>> response) { + analyzeAnswer(response, "retrieveListaArticoliFromOrdiniProduzione", onComplete, onFailed); + } + + @Override + public void onFailure(Call>> call, Throwable t) { + UtilityLogger.errorMe(new Exception(t)); + onFailed.run(new Exception(t)); + } + }); + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/MainListProdOrdineProduzioneElencoClienteListModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/MainListProdOrdineProduzioneElencoClienteListModel.java new file mode 100644 index 00000000..8fb00900 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/MainListProdOrdineProduzioneElencoClienteListModel.java @@ -0,0 +1,25 @@ +package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui; + +public class MainListProdOrdineProduzioneElencoClienteListModel { + private String primaryText; + private String rightText; + + + public String getPrimaryText() { + return primaryText; + } + + public MainListProdOrdineProduzioneElencoClienteListModel setPrimaryText(String primaryText) { + this.primaryText = primaryText; + return this; + } + + public String getRightText() { + return rightText; + } + + public MainListProdOrdineProduzioneElencoClienteListModel setRightText(String rightText) { + this.rightText = rightText; + return this; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/MainListProdOrdineProduzioneElencoListModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/MainListProdOrdineProduzioneElencoListModel.java new file mode 100644 index 00000000..a9756427 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/MainListProdOrdineProduzioneElencoListModel.java @@ -0,0 +1,70 @@ +package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui; + +import java.util.List; + +import it.integry.integrywmsnative.core.di.BindableBoolean; +import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; + +public class MainListProdOrdineProduzioneElencoListModel { + + private String groupTitle; + + private String description; + + private boolean hidden; + private BindableBoolean selected = new BindableBoolean(); + + + private OrdineAccettazioneInevasoDTO originalModel; + private List clientiListModel; + + + public String getGroupTitle() { + return groupTitle; + } + + public MainListProdOrdineProduzioneElencoListModel setGroupTitle(String groupTitle) { + this.groupTitle = groupTitle; + return this; + } + + public String getDescription() { + return description; + } + + public MainListProdOrdineProduzioneElencoListModel setDescription(String description) { + this.description = description; + return this; + } + + public boolean isHidden() { + return hidden; + } + + public MainListProdOrdineProduzioneElencoListModel setHidden(boolean hidden) { + this.hidden = hidden; + return this; + } + + public BindableBoolean getSelectedObservable() { + return selected; + } + + public OrdineAccettazioneInevasoDTO getOriginalModel() { + return originalModel; + } + + public MainListProdOrdineProduzioneElencoListModel setOriginalModel(OrdineAccettazioneInevasoDTO originalModel) { + this.originalModel = originalModel; + return this; + } + + public List getClientiListModel() { + return clientiListModel; + } + + public MainListProdOrdineProduzioneElencoListModel setClientiListModel(List clientiListModel) { + this.clientiListModel = clientiListModel; + return this; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/OrdineProduzioneListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/OrdineProduzioneListAdapter.java new file mode 100644 index 00000000..47c0dfc5 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/OrdineProduzioneListAdapter.java @@ -0,0 +1,153 @@ +package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui; + +import android.content.Context; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.databinding.DataBindingUtil; +import androidx.databinding.ObservableArrayList; +import androidx.recyclerview.widget.RecyclerView; + +import it.integry.integrywmsnative.R; +import it.integry.integrywmsnative.core.expansion.OnSingleClickListener; +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.expansion.view.ExtendedSectionedRecyclerView; +import it.integry.integrywmsnative.core.utility.UtilityString; +import it.integry.integrywmsnative.databinding.FragmentProdOrdineProduzioneListGroupClientiBinding; +import it.integry.integrywmsnative.databinding.FragmentProdOrdineProduzioneListGroupModelBinding; +import it.integry.integrywmsnative.databinding.FragmentProdOrdineProduzioneListModelBinding; + +public class OrdineProduzioneListAdapter extends ExtendedSectionedRecyclerView { + + + private Context mContext; + + private RunnableArgs mOnGroupItemClicked; + private RunnableArgs mOnItemChecked; + + + static class SubheaderHolder extends RecyclerView.ViewHolder { + + FragmentProdOrdineProduzioneListModelBinding binding; + + SubheaderHolder(FragmentProdOrdineProduzioneListModelBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + + } + + static class SingleItemViewHolder extends RecyclerView.ViewHolder { + + FragmentProdOrdineProduzioneListGroupModelBinding binding; + + SingleItemViewHolder(FragmentProdOrdineProduzioneListGroupModelBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } + + + public OrdineProduzioneListAdapter(Context context, ObservableArrayList myDataset) { + super(myDataset); + mContext = context; + } + + public OrdineProduzioneListAdapter setOnGroupItemClicked(RunnableArgs onGroupItemClicked) { + this.mOnGroupItemClicked = onGroupItemClicked; + return this; + } + + public OrdineProduzioneListAdapter setOnItemChecked(RunnableArgs onItemChecked) { + this.mOnItemChecked = onItemChecked; + return this; + } + + + + @Override + public SubheaderHolder onCreateSubheaderViewHolder(ViewGroup parent, int viewType) { + FragmentProdOrdineProduzioneListModelBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.fragment_prod_ordine_produzione__list_model, parent, false); + return new SubheaderHolder(binding); + } + + @Override + public SingleItemViewHolder onCreateItemViewHolder(ViewGroup parent, int viewType) { + FragmentProdOrdineProduzioneListGroupModelBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.fragment_prod_ordine_produzione__list_group_model, parent, false); + return new SingleItemViewHolder(binding); + } + + + @Override + public void onBindSubheaderViewHolder(OrdineProduzioneListAdapter.SubheaderHolder subheaderHolder, int nextItemPosition) { + subheaderHolder.binding.ordineProduzioneMainListGroupHeader.setText(mDataset.get(nextItemPosition).getGroupTitle()); + + subheaderHolder.binding.getRoot().setOnClickListener(new OnSingleClickListener() { + @Override + public void onSingleClick(View v) { + if(mOnGroupItemClicked != null) mOnGroupItemClicked.run(mDataset.get(nextItemPosition).getGroupTitle()); + } + }); + } + + @Override + public void onBindItemViewHolder(OrdineProduzioneListAdapter.SingleItemViewHolder holder, int itemPosition) { + final MainListProdOrdineProduzioneElencoListModel ordine = mDataset.get(itemPosition); + + ordine.getSelectedObservable().resetOnPropertyChangedCallback(); + + holder.binding.ordineProduzioneMainListGroupItemContainerClientiOrd.removeAllViews(); + holder.binding.ordineProduzioneMainListGroupItemContainerTestataOrd.setText(Html.fromHtml(ordine.getDescription())); + + + for (MainListProdOrdineProduzioneElencoClienteListModel cliente : ordine.getClientiListModel()) { + FragmentProdOrdineProduzioneListGroupClientiBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.fragment_prod_ordine_produzione__list_group_clienti, holder.binding.ordineProduzioneMainListGroupItemContainerClientiOrd, false); + + binding.ordineProduzioneMainListGroupClientiComm.setText(cliente.getPrimaryText()); + + if (!UtilityString.isNullOrEmpty(cliente.getRightText())) { + binding.ordineProduzioneMainListGroupClientiDatacons.setText(cliente.getRightText()); + } else { + binding.ordineProduzioneMainListGroupClientiDatacons.setText(""); + } + + holder.binding.ordineProduzioneMainListGroupItemContainerClientiOrd.addView(binding.getRoot()); + } + + holder.binding.setSelected(ordine.getSelectedObservable()); + holder.binding.executePendingBindings(); + holder.binding.ordineProduzioneMainListGroupItemContainerCheckBox.jumpDrawablesToCurrentState(); + + ordine.getSelectedObservable().addOnPropertyChangedCallback(() -> { + if(this.mOnItemChecked != null) this.mOnItemChecked.run(ordine); + }); + + holder.binding.getRoot().setOnClickListener(v -> { + ordine.getSelectedObservable().set(!ordine.getSelectedObservable().get()); + }); + } + + + @Override + public boolean onPlaceSubheaderBetweenItems(int position) { + if (getItemSize() == 1) return true; + else if (getItemSize() > 1) { + MainListProdOrdineProduzioneElencoListModel compare1 = this.mDataset.get(position); + MainListProdOrdineProduzioneElencoListModel compare2 = this.mDataset.get(position + 1); + + if (UtilityString.equalsIgnoreCase(compare1.getGroupTitle(), compare2.getGroupTitle())) { + return false; + } + } + + return true; + } + + @Override + public int getItemSize() { + return mDataset.size(); + } + +} diff --git a/app/src/main/res/layout/fragment_prod_ordine_produzione__list_group_model.xml b/app/src/main/res/layout/fragment_prod_ordine_produzione__list_group_model.xml index 2de7309b..f406fde2 100644 --- a/app/src/main/res/layout/fragment_prod_ordine_produzione__list_group_model.xml +++ b/app/src/main/res/layout/fragment_prod_ordine_produzione__list_group_model.xml @@ -1,9 +1,9 @@ - + @@ -17,12 +17,13 @@ android:padding="8dp"> - + tools:layout_editor_absoluteY="1dp" + app:checked="@{selected}" /> + android:adjustViewBounds="true" + android:src="@drawable/ic_playlist_add_check_24dp" /> + android:textSize="18sp" /> @@ -87,8 +87,10 @@ android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" + android:onClick="@{() -> view.dispatchOrders()}" android:tint="@android:color/white" - app:srcCompat="@drawable/ic_check_black_24dp" /> + app:srcCompat="@drawable/ic_check_black_24dp" + app:visibility="@{view.fabVisible}" /> \ No newline at end of file From 9033548455ae83061d6e13b40c63a3a99aa96740 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Fri, 6 Aug 2021 15:35:25 +0200 Subject: [PATCH 08/18] Refactoring dialog filtro accettazione ordini produzione --- .../MainAccettazioneFragment.java | 2 + .../DialogVenditaFiltroAvanzatoView.java | 16 +- .../DialogVenditaFiltroAvanzatoViewModel.java | 2 +- .../ProdOrdineProduzioneElencoFragment.java | 32 ++- .../DialogOrdineProduzioneFiltroAvanzato.java | 225 ------------------ ...logOrdineProduzioneFiltroAvanzatoView.java | 164 +++++++++++++ ...dineProduzioneFiltroAvanzatoViewModel.java | 76 ++++++ ...alog_ordine_produzione_filtro_avanzato.xml | 9 +- 8 files changed, 273 insertions(+), 253 deletions(-) delete mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzato.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzatoView.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzatoViewModel.java diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneFragment.java index c5332696..f13a4ce3 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione/MainAccettazioneFragment.java @@ -106,6 +106,8 @@ public class MainAccettazioneFragment extends BaseFragment implements ISearcable public void onStart() { super.onStart(); + this.fabVisible.set(false); + String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep(); mViewModel.init(codMdep); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/dialogs/DialogVenditaFiltroAvanzatoView.java b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/dialogs/DialogVenditaFiltroAvanzatoView.java index 0c34d915..12faa6c2 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/dialogs/DialogVenditaFiltroAvanzatoView.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/dialogs/DialogVenditaFiltroAvanzatoView.java @@ -64,11 +64,7 @@ public class DialogVenditaFiltroAvanzatoView { private ArrayAdapter arrayAdapterAutomezzo; private ArrayAdapter arrayAdapterPaese; - private DialogVenditaFiltroAvanzatoViewModel viewModel; - - public static AlertDialog make(final Context context, final List ordersList, RunnableArgs onDismiss) { - return new DialogVenditaFiltroAvanzatoView(context, ordersList, null, onDismiss).currentAlert; - } + private final DialogVenditaFiltroAvanzatoViewModel viewModel; public static AlertDialog make(final Context context, final List ordersList, @@ -93,8 +89,8 @@ public class DialogVenditaFiltroAvanzatoView { binding.setView(this); binding.setViewmodel(viewModel); - initViewModelNew(viewModel); - initView(binding, viewModel); + initViewModel(viewModel); + initView(binding); currentAlert = alertDialog.create(); currentAlert.setCanceledOnTouchOutside(false); @@ -102,8 +98,6 @@ public class DialogVenditaFiltroAvanzatoView { currentAlert.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); currentAlert.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - - binding.positiveBtn.setOnClickListener(view -> { currentAlert.dismiss(); }); @@ -119,7 +113,7 @@ public class DialogVenditaFiltroAvanzatoView { } - private void initView(DialogVenditaFiltroAvanzatoBinding bindings, DialogVenditaFiltroAvanzatoViewModel viewModel) { + private void initView(DialogVenditaFiltroAvanzatoBinding bindings) { IFiltroOrdiniVendita filtroOrdiniVendita = ClassRouter.getInstance(ClassRouter.PATH.FILTRO_ORDINI_VENDITA); // bindings.filledExposedDropdownDataCons.setOnFocusChangeListener((v, hasFocus) -> { @@ -192,7 +186,7 @@ public class DialogVenditaFiltroAvanzatoView { refreshAll(); } - private void initViewModelNew(DialogVenditaFiltroAvanzatoViewModel viewModel) { + private void initViewModel(DialogVenditaFiltroAvanzatoViewModel viewModel) { viewModel.applyAllTests(); BindableString.registerListener(idViaggio, value -> { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/dialogs/DialogVenditaFiltroAvanzatoViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/dialogs/DialogVenditaFiltroAvanzatoViewModel.java index 3efba5fb..b1e7a3bb 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/dialogs/DialogVenditaFiltroAvanzatoViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ordini_uscita_elenco/dialogs/DialogVenditaFiltroAvanzatoViewModel.java @@ -26,7 +26,7 @@ public class DialogVenditaFiltroAvanzatoViewModel { private List initialOrderList; - private MutableLiveData> currentFilteredOrderList = new MutableLiveData<>(); + private final MutableLiveData> currentFilteredOrderList = new MutableLiveData<>(); public void init(List initialList) { this.initialOrderList = initialList; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java index c9226096..c8ec74d4 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java @@ -38,10 +38,11 @@ import it.integry.integrywmsnative.databinding.FragmentProdOrdineProduzioneElenc import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; import it.integry.integrywmsnative.gest.accettazione.dto.SitArtOrdDTO; import it.integry.integrywmsnative.gest.accettazione_picking.AccettazionePickingActivity; +import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.dialog.DialogOrdineProduzioneFiltroAvanzatoView; +import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.dialog.DialogOrdineProduzioneFiltroAvanzatoViewModel; import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui.MainListProdOrdineProduzioneElencoClienteListModel; import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui.MainListProdOrdineProduzioneElencoListModel; import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui.OrdineProduzioneListAdapter; -import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.dialog.DialogOrdineProduzioneFiltroAvanzato; import it.integry.integrywmsnative.ui.ElevatedToolbar; import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; @@ -64,7 +65,7 @@ public class ProdOrdineProduzioneElencoFragment extends BaseFragment implements private AppCompatTextView mAppBarTitle; - private DialogOrdineProduzioneFiltroAvanzato.DialogOrdineProduzioneFiltroAvanzatoViewModel mAppliedFilterViewModel; + private DialogOrdineProduzioneFiltroAvanzatoViewModel mAppliedFilterViewModel; public ProdOrdineProduzioneElencoFragment() { @@ -110,6 +111,8 @@ public class ProdOrdineProduzioneElencoFragment extends BaseFragment implements public void onStart() { super.onStart(); + this.fabVisible.set(false); + String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep(); mViewModel.init(codMdep); } @@ -176,9 +179,9 @@ public class ProdOrdineProduzioneElencoFragment extends BaseFragment implements if(filteredList != null) { tmpList = filteredList; } else if (mAppliedFilterViewModel != null) { -// mAppliedFilterViewModel.init(mViewModel.getOrderList().getValue()); -// mAppliedFilterViewModel.applyAllTests(); -// tmpList = mAppliedFilterViewModel.getMutableFilteredOrderList().getValue(); + mAppliedFilterViewModel.init(mViewModel.getOrderList().getValue()); + mAppliedFilterViewModel.applyAllTests(); + tmpList = mAppliedFilterViewModel.getMutableFilteredOrderList().getValue(); } else { tmpList = mViewModel.getOrderList().getValue(); } @@ -228,14 +231,17 @@ public class ProdOrdineProduzioneElencoFragment extends BaseFragment implements @Override public void onFilterClick() { -// DialogOrdineProduzioneFiltroAvanzato.make(getActivity(), mOriginalOrderList, mAppliedFilterViewModel, (filteredOrderList, filter) -> { -// mAppliedFilterViewModel = filter; -// -// if (filteredOrderList != null) { -// refreshList(filteredOrderList); -// } -// -// }).show(); + DialogOrdineProduzioneFiltroAvanzatoView.make( + getActivity(), + this.mViewModel.getOrderList().getValue(), + mAppliedFilterViewModel, + + filter -> { + + mAppliedFilterViewModel = filter; + refreshList(null); + + }).show(); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzato.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzato.java deleted file mode 100644 index 58d97159..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzato.java +++ /dev/null @@ -1,225 +0,0 @@ -package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.dialog; - -import androidx.appcompat.app.AlertDialog; -import android.content.Context; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; -import android.view.LayoutInflater; -import android.view.WindowManager; -import android.widget.ArrayAdapter; -import android.widget.MultiAutoCompleteTextView; - -import androidx.databinding.DataBindingUtil; - -import com.annimon.stream.Stream; -import com.annimon.stream.function.Predicate; - -import java.util.List; - -import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.di.BindableString; -import it.integry.integrywmsnative.core.expansion.RunnableArgss; -import it.integry.integrywmsnative.core.utility.UtilityString; -import it.integry.integrywmsnative.databinding.DialogOrdineProduzioneFiltroAvanzatoBinding; -import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; - -public class DialogOrdineProduzioneFiltroAvanzato { - - - private AlertDialog currentAlert; - private Context currentContext; - - private RunnableArgss, DialogOrdineProduzioneFiltroAvanzatoViewModel> currentOnFilterDone; - - private List currentOrderList; - private List currentFilteredOrderList; - - - private ArrayAdapter arrayAdapterNumOrds; - private ArrayAdapter arrayAdapterCodJcoms; - - private Predicate currentNumOrdsPredicate = null; - private Predicate currentCodJcomsPredicate = null; - - - - public static AlertDialog make(final Context context, - final List ordersList, - DialogOrdineProduzioneFiltroAvanzatoViewModel baseViewModel, - RunnableArgss, DialogOrdineProduzioneFiltroAvanzatoViewModel> onDismiss) { - return new DialogOrdineProduzioneFiltroAvanzato(context, ordersList, baseViewModel, onDismiss).currentAlert; - } - - - private DialogOrdineProduzioneFiltroAvanzato(final Context context, final List ordersList, DialogOrdineProduzioneFiltroAvanzatoViewModel baseViewModel, RunnableArgss, DialogOrdineProduzioneFiltroAvanzatoViewModel> onDismiss) { - currentContext = context; - currentOrderList = ordersList; - currentOnFilterDone = onDismiss; - - DialogOrdineProduzioneFiltroAvanzatoViewModel viewModel = baseViewModel != null ? baseViewModel : new DialogOrdineProduzioneFiltroAvanzatoViewModel(); - - LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - - DialogOrdineProduzioneFiltroAvanzatoBinding binding = DataBindingUtil.inflate(inflater, R.layout.dialog_ordine_produzione_filtro_avanzato, null, false); - - final AlertDialog.Builder alertDialog = new AlertDialog.Builder(context) - .setView(binding.getRoot()); - - binding.setViewmodel(viewModel); - initViewModelNew(viewModel, binding); - initView(binding, viewModel); - - currentAlert = alertDialog.create(); - currentAlert.setCanceledOnTouchOutside(false); - - currentAlert.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); - currentAlert.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - - binding.positiveBtn.setOnClickListener(view -> { - currentAlert.dismiss(); - }); - - binding.neutralBtn.setOnClickListener(view -> { - resetAll(viewModel); - }); - - - currentAlert.setOnDismissListener(dialogInterface -> { - if(currentOnFilterDone != null) currentOnFilterDone.run(currentFilteredOrderList, viewModel); - }); - - refreshList(); - - } - - private void resetAll(DialogOrdineProduzioneFiltroAvanzatoViewModel viewModel) { - viewModel.numOrds.set(null); - viewModel.codJcoms.set(null); - } - - private void initView(DialogOrdineProduzioneFiltroAvanzatoBinding bindings, DialogOrdineProduzioneFiltroAvanzatoViewModel viewModel) { - - arrayAdapterNumOrds = new ArrayAdapter(currentContext, R.layout.dialog_vendita_filtro_avanzato__single_item); - arrayAdapterNumOrds.addAll(getAvailableNumOrds(false)); - bindings.filledExposedDropdownNumOrds.setAdapter(arrayAdapterNumOrds); - bindings.filledExposedDropdownNumOrds.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); - - arrayAdapterCodJcoms = new ArrayAdapter(currentContext, R.layout.dialog_vendita_filtro_avanzato__single_item); - arrayAdapterCodJcoms.addAll(getAvailableCodJcoms(false)); - bindings.filledExposedDropdownCodJcoms.setAdapter(arrayAdapterCodJcoms); - bindings.filledExposedDropdownCodJcoms.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); - - - viewModel.numOrds.refresh(); - viewModel.codJcoms.refresh(); - } - - - private void initViewModelNew(DialogOrdineProduzioneFiltroAvanzatoViewModel viewModel, DialogOrdineProduzioneFiltroAvanzatoBinding bindings) { - - - BindableString.registerListener(viewModel.numOrds, value -> { - if(UtilityString.isNullOrEmpty(value)) currentNumOrdsPredicate = null; - else { - String[] numOrdsSplitted = value.split("[,\\ ]"); - - try{ - List numOrdsInteger = Stream.of(numOrdsSplitted) - .filter(x -> !UtilityString.isNullOrEmpty(x)) - .map(Integer::parseInt).toList(); - - currentNumOrdsPredicate = o -> numOrdsInteger.contains(o.getNumero()); - } catch (NumberFormatException ex) { - currentNumOrdsPredicate = null; - } - } - - refreshList(); - - arrayAdapterCodJcoms.clear(); - arrayAdapterCodJcoms.addAll(getAvailableCodJcoms(true)); - }); - - - BindableString.registerListener(viewModel.codJcoms, value -> { - if(UtilityString.isNullOrEmpty(value)) currentCodJcomsPredicate = null; - else { - String[] codJcomsSplitted = value.split("[,\\ ]"); - - try{ - List codJcoms = Stream.of(codJcomsSplitted) - .filter(x -> !UtilityString.isNullOrEmpty(x)).toList(); - - currentCodJcomsPredicate = o -> codJcoms.contains(o.getCodJcom()); - } catch (NumberFormatException ex) { - currentCodJcomsPredicate = null; - } - } - - refreshList(); - - arrayAdapterNumOrds.clear(); - arrayAdapterNumOrds.addAll(getAvailableNumOrds(true)); - }); - - - - } - - - private List getAvailableNumOrds(boolean skipRecalc) { - if(currentCodJcomsPredicate == null){ - currentFilteredOrderList = currentOrderList; - } else - if(!skipRecalc){ - Stream tmpStream = Stream.of(currentOrderList) - .filter(x -> - (currentCodJcomsPredicate == null || (currentCodJcomsPredicate.test(x))) - ); - - currentFilteredOrderList = tmpStream.toList(); - } - - return Stream.of(currentFilteredOrderList).map(x -> x.getNumero().toString()).distinct().withoutNulls().toList(); - } - - - private List getAvailableCodJcoms(boolean skipRecalc) { - if(currentNumOrdsPredicate == null){ - currentFilteredOrderList = currentOrderList; - } else - if(!skipRecalc){ - Stream tmpStream = Stream.of(currentOrderList) - .filter(x -> - (currentNumOrdsPredicate == null || (currentNumOrdsPredicate.test(x))) - ); - - currentFilteredOrderList = tmpStream.toList(); - } - - return Stream.of(currentFilteredOrderList).map(OrdineAccettazioneInevasoDTO::getCodJcom).distinct().withoutNulls().toList(); - } - - - private void refreshList() { - - if (currentNumOrdsPredicate == null && currentCodJcomsPredicate == null) { - currentFilteredOrderList = currentOrderList; - } else { - Stream tmpStream = Stream.of(currentOrderList) - .filter(x -> - (currentNumOrdsPredicate == null || (currentNumOrdsPredicate.test(x))) && - (currentCodJcomsPredicate == null || (currentCodJcomsPredicate.test(x))) - ); - - currentFilteredOrderList = tmpStream.toList(); - } - } - - public class DialogOrdineProduzioneFiltroAvanzatoViewModel { - - public BindableString numOrds = new BindableString(); - public BindableString codJcoms = new BindableString(); - } - -} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzatoView.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzatoView.java new file mode 100644 index 00000000..092e2982 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzatoView.java @@ -0,0 +1,164 @@ +package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.dialog; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.view.LayoutInflater; +import android.view.WindowManager; +import android.widget.ArrayAdapter; +import android.widget.MultiAutoCompleteTextView; + +import androidx.appcompat.app.AlertDialog; +import androidx.databinding.DataBindingUtil; + +import com.annimon.stream.Stream; + +import java.util.List; +import java.util.Objects; + +import it.integry.integrywmsnative.R; +import it.integry.integrywmsnative.core.di.BindableString; +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.databinding.DialogOrdineProduzioneFiltroAvanzatoBinding; +import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; + +public class DialogOrdineProduzioneFiltroAvanzatoView { + + + private AlertDialog currentAlert; + private Context currentContext; + + private RunnableArgs currentOnFilterDone; + + public BindableString numOrds = new BindableString(); + public BindableString codJcoms = new BindableString(); + + private ArrayAdapter arrayAdapterNumOrds; + private ArrayAdapter arrayAdapterCodJcoms; + + private DialogOrdineProduzioneFiltroAvanzatoViewModel mViewModel; + + + + public static AlertDialog make(final Context context, + final List ordersList, + DialogOrdineProduzioneFiltroAvanzatoViewModel baseViewModel, + RunnableArgs onDismiss) { + return new DialogOrdineProduzioneFiltroAvanzatoView(context, ordersList, baseViewModel, onDismiss).currentAlert; + } + + + private DialogOrdineProduzioneFiltroAvanzatoView(final Context context, final List ordersList, DialogOrdineProduzioneFiltroAvanzatoViewModel baseViewModel, RunnableArgs onDismiss) { + currentContext = context; + currentOnFilterDone = onDismiss; + + mViewModel = baseViewModel != null ? baseViewModel : new DialogOrdineProduzioneFiltroAvanzatoViewModel(); + mViewModel.init(ordersList); + + LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + DialogOrdineProduzioneFiltroAvanzatoBinding binding = DataBindingUtil.inflate(inflater, R.layout.dialog_ordine_produzione_filtro_avanzato, null, false); + + final AlertDialog.Builder alertDialog = new AlertDialog.Builder(context) + .setView(binding.getRoot()); + + binding.setView(this); + binding.setViewmodel(mViewModel); + initViewModel(mViewModel); + initView(binding); + + currentAlert = alertDialog.create(); + currentAlert.setCanceledOnTouchOutside(false); + + currentAlert.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + currentAlert.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + + binding.positiveBtn.setOnClickListener(view -> { + currentAlert.dismiss(); + }); + + binding.neutralBtn.setOnClickListener(view -> { + resetAll(); + }); + + + currentAlert.setOnDismissListener(dialogInterface -> { + if(currentOnFilterDone != null) currentOnFilterDone.run(mViewModel); + }); + } + + private void initView(DialogOrdineProduzioneFiltroAvanzatoBinding bindings) { + + arrayAdapterNumOrds = new ArrayAdapter(currentContext, R.layout.dialog_vendita_filtro_avanzato__single_item); + arrayAdapterNumOrds.addAll(getAvailableNumOrds(false)); + bindings.filledExposedDropdownNumOrds.setAdapter(arrayAdapterNumOrds); + bindings.filledExposedDropdownNumOrds.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); + + arrayAdapterCodJcoms = new ArrayAdapter(currentContext, R.layout.dialog_vendita_filtro_avanzato__single_item); + arrayAdapterCodJcoms.addAll(getAvailableCodJcoms(false)); + bindings.filledExposedDropdownCodJcoms.setAdapter(arrayAdapterCodJcoms); + bindings.filledExposedDropdownCodJcoms.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); + + + refreshAll(); + } + + + private void initViewModel(DialogOrdineProduzioneFiltroAvanzatoViewModel viewModel) { + viewModel.applyAllTests(); + + BindableString.registerListener(numOrds, value -> { + viewModel.setNumOrdFilter(value); + viewModel.applyAllTests(); + + refreshArrayAdapter(arrayAdapterCodJcoms, getAvailableCodJcoms(true)); + }); + + BindableString.registerListener(codJcoms, value -> { + viewModel.setCodJcomFilter(value); + viewModel.applyAllTests(); + + refreshArrayAdapter(arrayAdapterNumOrds, getAvailableNumOrds(true)); + }); + + } + + + private void refreshArrayAdapter(ArrayAdapter arrayAdapter, List inputList) { + arrayAdapter.clear(); + arrayAdapter.addAll(inputList); + arrayAdapter.notifyDataSetChanged(); + } + + + private List getAvailableNumOrds(boolean skipRecalc) { + return Stream.of(Objects.requireNonNull(mViewModel.getMutableFilteredOrderList().getValue())) + .map(x -> x.getNumero().toString()) + .distinct() + .withoutNulls() + .sorted() + .toList(); + } + + + private List getAvailableCodJcoms(boolean skipRecalc) { + return Stream.of(Objects.requireNonNull(mViewModel.getMutableFilteredOrderList().getValue())) + .map(OrdineAccettazioneInevasoDTO::getCodJcom) + .distinct() + .withoutNulls() + .sorted() + .toList(); + } + + + public void refreshAll() { + numOrds.refresh(); + codJcoms.refresh(); + } + + + public void resetAll() { + numOrds.set(null); + codJcoms.set(null); + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzatoViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzatoViewModel.java new file mode 100644 index 00000000..900fc91d --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/dialog/DialogOrdineProduzioneFiltroAvanzatoViewModel.java @@ -0,0 +1,76 @@ +package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.dialog; + +import androidx.lifecycle.MutableLiveData; + +import com.annimon.stream.Stream; +import com.annimon.stream.function.Predicate; + +import java.util.List; + +import it.integry.integrywmsnative.core.utility.UtilityString; +import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; + +public class DialogOrdineProduzioneFiltroAvanzatoViewModel { + + + private Predicate currentNumOrdsPredicate = null; + private Predicate currentCodJcomsPredicate = null; + + private List initialOrderList; + private final MutableLiveData> currentFilteredOrderList = new MutableLiveData<>(); + + public void init(List initialList) { + this.initialOrderList = initialList; + this.currentFilteredOrderList.setValue(this.initialOrderList); + } + + public MutableLiveData> getMutableFilteredOrderList() { + return this.currentFilteredOrderList; + } + + public void setNumOrdFilter(String numOrds) { + if(UtilityString.isNullOrEmpty(numOrds)) currentNumOrdsPredicate = null; + else { + String[] numOrdsSplitted = numOrds.split("[,\\ ]"); + + try{ + List numOrdsInteger = Stream.of(numOrdsSplitted) + .filter(x -> !UtilityString.isNullOrEmpty(x)) + .map(Integer::parseInt).toList(); + + currentNumOrdsPredicate = o -> numOrdsInteger.contains(o.getNumero()); + } catch (NumberFormatException ex) { + currentNumOrdsPredicate = null; + } + } + } + + public void setCodJcomFilter(String codJcom) { + if(UtilityString.isNullOrEmpty(codJcom)) currentCodJcomsPredicate = null; + else { + currentCodJcomsPredicate = o -> o.getCodJcom().toLowerCase().equalsIgnoreCase(codJcom); + } + } + + public void applyAllTests() { + + List returnList = null; + + if (currentNumOrdsPredicate == null && + currentCodJcomsPredicate == null + ) { + returnList = this.initialOrderList; + } else { + Stream tmpStream = Stream.of(this.initialOrderList) + .filter(x -> + (currentNumOrdsPredicate == null || (currentNumOrdsPredicate.test(x))) && + (currentCodJcomsPredicate == null || (currentCodJcomsPredicate.test(x))) + ); + + returnList = tmpStream.toList(); + } + + this.currentFilteredOrderList.setValue(returnList); + } + +} diff --git a/app/src/main/res/layout/dialog_ordine_produzione_filtro_avanzato.xml b/app/src/main/res/layout/dialog_ordine_produzione_filtro_avanzato.xml index a2357605..258c6c82 100644 --- a/app/src/main/res/layout/dialog_ordine_produzione_filtro_avanzato.xml +++ b/app/src/main/res/layout/dialog_ordine_produzione_filtro_avanzato.xml @@ -7,7 +7,10 @@ + type="it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.dialog.DialogOrdineProduzioneFiltroAvanzatoViewModel" /> + @@ -55,7 +58,7 @@ android:inputType="number|text" android:singleLine="true" android:ellipsize="end" - app:binding="@{viewmodel.numOrds}"/> + app:binding="@{view.numOrds}"/> @@ -76,7 +79,7 @@ android:inputType="text" android:singleLine="true" android:ellipsize="end" - app:binding="@{viewmodel.codJcoms}"/> + app:binding="@{view.codJcoms}"/> From fcddda8e3ffdc88467555f557edd5d771b47e8f5 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Wed, 11 Aug 2021 15:19:35 +0200 Subject: [PATCH 09/18] Refactoring di Versamento e Recupero materiale produzione --- .../MainApplicationComponent.java | 10 +- .../MainApplicationModule.java | 16 +- .../integrywmsnative/SplashActivity.java | 5 +- .../core/class_router/ClassRouter.java | 9 +- .../core/context/AppContext.java | 2 - .../core/context/MainContext.java | 16 +- .../core/di/BindableBigDecimal.java | 110 ++++++ .../core/di/BindableBoolean.java | 3 +- .../core/expansion/BaseFragment.java | 69 +++- .../core/model/CheckableOrdineLavoro.java | 73 ---- .../consumers/ColliMagazzinoRESTConsumer.java | 89 ++--- .../rest/consumers/EntityRESTConsumer.java | 10 +- .../core/rest/consumers/MesRESTConsumer.java | 4 +- .../PVOrdiniAcquistoRESTConsumer.java | 2 +- .../rest/consumers/PrinterRESTConsumer.java | 40 +- .../rest/consumers/SystemRESTConsumer.java | 63 ++- .../rest/consumers/_BaseRESTConsumer.java | 107 +++-- .../core/settings/SettingsManager.java | 65 ++-- .../core/utility/UtilityExceptions.java | 6 +- .../core/utility/UtilitySettings.java | 20 - .../core/utility/UtilityThread.java | 13 +- .../gest/login/viewmodel/LoginViewModel.java | 31 +- .../gest/main/MainActivity.java | 13 +- .../gest/main/MainFragment.java | 5 +- .../ProdOrdineProduzioneElencoFragment.java | 24 -- .../ProdOrdineProduzioneElencoModule.java | 5 +- .../ProdOrdineProduzioneElencoViewModel.java | 5 +- .../ProdFabbisognoLineeProdFragment.java | 3 +- .../ProdRecuperoMaterialeComponent.java | 15 + .../ProdRecuperoMaterialeFragment.java | 229 +++++++++-- .../ProdRecuperoMaterialeModule.java | 24 ++ .../ProdRecuperoMaterialeViewModel.java | 365 ++++++++---------- .../ProdRecuperMaterialeRESTConsumer.java} | 222 ++++++----- .../{core => ui}/HistoryULsListAdapter.java | 75 ++-- .../ui/HistoryULsListModel.java | 92 +++++ .../ProdVersamentoMaterialeComponent.java | 15 + .../ProdVersamentoMaterialeFragment.java | 325 ++++++++++++++-- .../ProdVersamentoMaterialeModule.java | 16 + .../ProdVersamentoMaterialeViewModel.java | 215 +++++++++++ .../core/ChooseOrdsLavFromListAdapter.java | 226 ----------- .../core/ProdVersamentoMaterialHelper.java | 14 - .../MtbColrVersamentoMaterialeListModel.java | 90 +++++ .../VersamentoMerceOrdineLavListModel.java | 104 +++++ .../ui/ChooseOrdsLavFromListAdapter.java | 120 ++++++ .../ChooseOrdsLavFromListItemModel.java | 2 +- .../ProdVersamentoMaterialViewModel.java | 261 ------------- .../RettificaGiacenzeFragment.java | 53 +-- .../gest/spedizione/SpedizioneActivity.java | 2 +- .../VersamentoMerceFragment.java | 6 +- .../DialogChooseArtsFromListaArts.java | 8 +- ...log_choose_arts_from_lista_arts_layout.xml | 2 +- ..._choose_ords_lav_from_list__item_model.xml | 219 +++++------ .../fragment_prod_recupero_materiale.xml | 4 + .../fragment_prod_versamento_materiale.xml | 61 +-- .../prod_recupero_materiale_list_header.xml | 6 +- .../ZebraBarcodeReader.java | 6 +- 56 files changed, 2023 insertions(+), 1572 deletions(-) create mode 100644 app/src/main/java/it/integry/integrywmsnative/core/di/BindableBigDecimal.java delete mode 100644 app/src/main/java/it/integry/integrywmsnative/core/model/CheckableOrdineLavoro.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeComponent.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeModule.java rename app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/{viewmodel => }/ProdRecuperoMaterialeViewModel.java (51%) rename app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/{core/ProdRecuperoMaterialeHelper.java => rest/ProdRecuperMaterialeRESTConsumer.java} (62%) rename app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/{core => ui}/HistoryULsListAdapter.java (57%) create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ui/HistoryULsListModel.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeComponent.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeModule.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeViewModel.java delete mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/core/ChooseOrdsLavFromListAdapter.java delete mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/core/ProdVersamentoMaterialHelper.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/dto/MtbColrVersamentoMaterialeListModel.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/dto/VersamentoMerceOrdineLavListModel.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ui/ChooseOrdsLavFromListAdapter.java rename app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/{core => ui}/ChooseOrdsLavFromListItemModel.java (98%) delete mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/viewmodel/ProdVersamentoMaterialViewModel.java diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java index 3ad66620..d7f453f7 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java @@ -29,8 +29,12 @@ import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.ProdFabbisogn import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.ProdFabbisognoLineeProdModule; import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.dialog_ask_mag_prossimita.DialogAskMagazzinoProssimitaComponent; import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.dialog_ask_mag_prossimita.DialogAskMagazzinoProssimitaModule; +import it.integry.integrywmsnative.gest.prod_recupero_materiale.ProdRecuperoMaterialeComponent; +import it.integry.integrywmsnative.gest.prod_recupero_materiale.ProdRecuperoMaterialeModule; import it.integry.integrywmsnative.gest.prod_rientro_merce.ProdRientroMerceComponent; import it.integry.integrywmsnative.gest.prod_rientro_merce.order_detail.ProdRientroMerceOrderDetailComponent; +import it.integry.integrywmsnative.gest.prod_versamento_materiale.ProdVersamentoMaterialeComponent; +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_ordini_acquisto.PVOrdineAcquistoGrigliaComponent; @@ -88,7 +92,9 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr DialogAskMagazzinoProssimitaModule.class, DialogChooseBatchLotModule.class, DialogRowInfoProdFabbisognoLineeProdModule.class, - ProdOrdineProduzioneElencoModule.class + ProdOrdineProduzioneElencoModule.class, + ProdRecuperoMaterialeModule.class, + ProdVersamentoMaterialeModule.class }) public interface MainApplicationComponent { @@ -120,6 +126,8 @@ public interface MainApplicationComponent { ProdRientroMerceComponent.Factory prodRientroMerceComponent(); ProdRientroMerceOrderDetailComponent.Factory prodRientroMerceOrderDetailComponent(); ProdOrdineProduzioneElencoComponent.Factory prodOrdineProduzioneElencoComponent(); + ProdRecuperoMaterialeComponent.Factory prodRecuperoMaterialeComponent(); + ProdVersamentoMaterialeComponent.Factory prodVersamentoMaterialeComponent(); void inject(MainApplication mainApplication); diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java index b8050226..eb1c98d5 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java @@ -9,12 +9,14 @@ import dagger.Provides; import it.integry.integrywmsnative.core.context.AppContext; import it.integry.integrywmsnative.core.context.MainContext; import it.integry.integrywmsnative.core.data_recover.ColliDataRecoverService; +import it.integry.integrywmsnative.core.data_store.db.AppDatabase; import it.integry.integrywmsnative.core.menu.MenuRESTConsumer; import it.integry.integrywmsnative.core.menu.MenuService; 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.DepositoRESTConsumer; +import it.integry.integrywmsnative.core.rest.consumers.EntityRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.GestSetupRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.MagazzinoRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.MesRESTConsumer; @@ -47,8 +49,8 @@ public class MainApplicationModule { @Provides @Singleton - MainContext providesMainContextNew(MenuService menuService) { - return new MainContext(mApplication.getApplicationContext(), menuService); + MainContext providesMainContextNew(MenuService menuService, AppDatabase appDatabase) { + return new MainContext(mApplication.getApplicationContext(), menuService, appDatabase); } @Provides @@ -109,8 +111,14 @@ public class MainApplicationModule { @Provides @Singleton - ColliMagazzinoRESTConsumer provideColliMagazzinoRESTConsumer(ArticoloRESTConsumer articoloRESTConsumer) { - return new ColliMagazzinoRESTConsumer(articoloRESTConsumer); + EntityRESTConsumer provideEntityRESTConsumer() { + return new EntityRESTConsumer(); + } + + @Provides + @Singleton + ColliMagazzinoRESTConsumer provideColliMagazzinoRESTConsumer(SystemRESTConsumer systemRESTConsumer, ArticoloRESTConsumer articoloRESTConsumer, EntityRESTConsumer entityRESTConsumer) { + return new ColliMagazzinoRESTConsumer(systemRESTConsumer, articoloRESTConsumer, entityRESTConsumer); } @Provides diff --git a/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java b/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java index e9b0cec3..8b870565 100644 --- a/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java @@ -21,7 +21,6 @@ import it.integry.integrywmsnative.core.expansion.RunnableArgsss; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.PermissionsHelper; import it.integry.integrywmsnative.core.utility.UtilityContext; -import it.integry.integrywmsnative.core.utility.UtilitySettings; import it.integry.integrywmsnative.databinding.ActivitySplashBinding; import it.integry.integrywmsnative.gest.login.LoginActivity; import it.integry.integrywmsnative.gest.main.MainActivity; @@ -147,9 +146,7 @@ public class SplashActivity extends BaseActivity implements MainContext.Listener DialogSimpleMessageView.makeErrorDialog( message, null, this::finish, R.string.logout, () -> { - UtilitySettings.logout(() -> { - MainApplication.exit(); - }); + this.mainContext.logout(MainApplication::exit); }) .show(this.getSupportFragmentManager(), "tag"); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/class_router/ClassRouter.java b/app/src/main/java/it/integry/integrywmsnative/core/class_router/ClassRouter.java index 969920f7..d234cebb 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/class_router/ClassRouter.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/class_router/ClassRouter.java @@ -6,9 +6,6 @@ import android.util.Pair; import java.util.ArrayList; import java.util.List; -import it.integry.integrywmsnative.core.class_router.exceptions.MethodPathNotRegisteredException; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; - public class ClassRouter { public enum PATH { @@ -68,15 +65,15 @@ public class ClassRouter { try { if (!checkIClassExists(path)) { - throw new MethodPathNotRegisteredException(path); +// throw new MethodPathNotRegisteredException(path); } Object instance = mRouteClasses.get(getClassIndex(path)).second; return (T)instance; - } catch (MethodPathNotRegisteredException ex) { - UtilityExceptions.defaultException(null, ex, true); + } catch (Exception ex) { +// UtilityExceptions.defaultException(null, ex, true); } return null; diff --git a/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java b/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java index d1148d7e..b50df297 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java @@ -16,7 +16,6 @@ import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.settings.Stash; import it.integry.integrywmsnative.core.utility.UtilityContext; import it.integry.integrywmsnative.core.utility.UtilityResources; -import it.integry.integrywmsnative.core.utility.UtilitySettings; import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.core.utility.UtilityToast; @@ -75,7 +74,6 @@ public class AppContext { UtilityContext.initApplicationContext(mApplicationContext); UtilityResources.init(mApplicationContext); UtilityToast.init(mApplicationContext); - UtilitySettings.init(mAppDatabase); } private void initLogger() { diff --git a/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java b/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java index a94fb49f..8b13a429 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/context/MainContext.java @@ -13,21 +13,25 @@ import javax.inject.Singleton; import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; import it.integry.integrywmsnative.core.class_router.ClassRouter; +import it.integry.integrywmsnative.core.data_store.db.AppDatabase; import it.integry.integrywmsnative.core.menu.MenuService; import it.integry.integrywmsnative.core.rest.watcher.ServerStatusChecker; import it.integry.integrywmsnative.core.settings.SettingsManager; +import it.integry.integrywmsnative.core.utility.UtilityThread; @Singleton public class MainContext { private final Context applicationContext; private final MenuService menuService; + private final AppDatabase appDatabase; private Listener mListener; - public MainContext(Context applicationContext, MenuService menuService) { + public MainContext(Context applicationContext, MenuService menuService, AppDatabase appDatabase) { this.applicationContext = applicationContext; this.menuService = menuService; + this.appDatabase = appDatabase; } public void init() { @@ -51,6 +55,16 @@ public class MainContext { } + public void logout(Runnable onLoggedOut) { + UtilityThread.executeParallel(() -> { + SettingsManager.i().setUser(null); + SettingsManager.i().setUserSession(null); + SettingsManager.update(); + appDatabase.clearAllTables(); + + onLoggedOut.run(); + }, true); + } private void initServerStatusChecker() { ServerStatusChecker.init(); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/BindableBigDecimal.java b/app/src/main/java/it/integry/integrywmsnative/core/di/BindableBigDecimal.java new file mode 100644 index 00000000..7ee35f86 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/BindableBigDecimal.java @@ -0,0 +1,110 @@ +package it.integry.integrywmsnative.core.di; + +import androidx.annotation.NonNull; +import androidx.databinding.Bindable; +import androidx.databinding.Observable; +import androidx.databinding.PropertyChangeRegistry; + +import java.math.BigDecimal; + +public class BindableBigDecimal implements Observable { + + BigDecimal mValue; + + private transient PropertyChangeRegistry mCallbacks; + + public BindableBigDecimal() { + } + + public BindableBigDecimal(BigDecimal startValue) { + this.mValue = startValue; + } + + + @Override + public void addOnPropertyChangedCallback(@NonNull OnPropertyChangedCallback callback) { + synchronized (this) { + if (mCallbacks == null) { + mCallbacks = new PropertyChangeRegistry(); + } + } + mCallbacks.add(callback); + } + + public void addOnPropertyChangedCallback(@NonNull Runnable callback) { + synchronized (this) { + if (mCallbacks == null) { + mCallbacks = new PropertyChangeRegistry(); + } + } + mCallbacks.add(new OnPropertyChangedCallback() { + @Override + public void onPropertyChanged(Observable sender, int propertyId) { + callback.run(); + } + }); + } + + @Override + public void removeOnPropertyChangedCallback(@NonNull OnPropertyChangedCallback callback) { + synchronized (this) { + if (mCallbacks == null) { + return; + } + } + mCallbacks.remove(callback); + } + + public void resetOnPropertyChangedCallback() { + synchronized (this) { + if (mCallbacks == null) { + return; + } + } + mCallbacks.clear(); + mCallbacks = null; + } + + /** + * Notifies listeners that all properties of this instance have changed. + */ + public void notifyChange() { + synchronized (this) { + if (mCallbacks == null) { + return; + } + } + mCallbacks.notifyCallbacks(this, 0, null); + } + + /** + * Notifies listeners that a specific property has changed. The getter for the property + * that changes should be marked with {@link Bindable} to generate a field in + * BR to be used as fieldId. + * + * @param fieldId The generated BR id for the Bindable field. + */ + public void notifyPropertyChanged(int fieldId) { + synchronized (this) { + if (mCallbacks == null) { + return; + } + } + mCallbacks.notifyCallbacks(this, fieldId, null); + } + + public BigDecimal get() { + return mValue; + } + + public void set(BigDecimal value) { + this.set(value, false); + } + + public void set(BigDecimal value, boolean forceRefresh) { + if (!mValue.equals(value) || forceRefresh) { + this.mValue = value; + notifyChange(); + } + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/BindableBoolean.java b/app/src/main/java/it/integry/integrywmsnative/core/di/BindableBoolean.java index f82a1b33..b32ac914 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/di/BindableBoolean.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/BindableBoolean.java @@ -1,12 +1,11 @@ package it.integry.integrywmsnative.core.di; import androidx.annotation.NonNull; -import androidx.databinding.BaseObservable; import androidx.databinding.Bindable; import androidx.databinding.Observable; import androidx.databinding.PropertyChangeRegistry; -public class BindableBoolean implements Observable { +public class BindableBoolean implements Observable { boolean mValue; 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 74dd8c0d..6f19b3a2 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 @@ -4,38 +4,40 @@ import android.app.Dialog; import androidx.fragment.app.Fragment; +import java.util.ArrayList; +import java.util.List; + import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; +import it.integry.integrywmsnative.core.interfaces.IPoppableActivity; import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityProgress; +import it.integry.integrywmsnative.ui.ElevatedToolbar; -public class BaseFragment extends Fragment { +public abstract class BaseFragment extends Fragment { protected Dialog mCurrentProgress; + protected ElevatedToolbar mToolbar; - protected void openProgress() { + protected final List mOnPreDestroyList = new ArrayList<>(); -// new Thread(() -> { - getActivity().runOnUiThread(() -> { - if (this.mCurrentProgress == null) { - this.mCurrentProgress = UtilityProgress.createDefaultProgressDialog(getActivity()); - } - }); -// }).start(); + + + + public void setScrollToolbar(ElevatedToolbar toolbar) { + mToolbar = toolbar; } - protected void closeProgress() { -// new Thread(() -> { - getActivity().runOnUiThread(() -> { - if (mCurrentProgress != null) { - mCurrentProgress.dismiss(); - mCurrentProgress = null; - } - }); -// }).start(); + + public void addOnPreDestroy(Runnable onPreDestroy) { + this.mOnPreDestroyList.add(onPreDestroy); } + + + + public void onLoadingStarted() { new Thread(() -> { BarcodeManager.disable(); @@ -57,4 +59,35 @@ public class BaseFragment extends Fragment { BarcodeManager.enable(); }); } + + + @Override + public void onDestroy() { + super.onDestroy(); + + for (Runnable onPreDestroy : mOnPreDestroyList) { + onPreDestroy.run(); + } + } + + protected void openProgress() { + getActivity().runOnUiThread(() -> { + if (this.mCurrentProgress == null) { + this.mCurrentProgress = UtilityProgress.createDefaultProgressDialog(getActivity()); + } + }); + } + + protected void closeProgress() { + getActivity().runOnUiThread(() -> { + if (mCurrentProgress != null) { + mCurrentProgress.dismiss(); + mCurrentProgress = null; + } + }); + } + + protected void popMe() { + ((IPoppableActivity) requireActivity()).pop(); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/model/CheckableOrdineLavoro.java b/app/src/main/java/it/integry/integrywmsnative/core/model/CheckableOrdineLavoro.java deleted file mode 100644 index a5ca465c..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/core/model/CheckableOrdineLavoro.java +++ /dev/null @@ -1,73 +0,0 @@ -package it.integry.integrywmsnative.core.model; - -import androidx.databinding.Observable; - -import java.util.List; - -import it.integry.integrywmsnative.core.di.BindableBoolean; -import it.integry.integrywmsnative.core.di.BindableFloat; -import it.integry.integrywmsnative.gest.prod_versamento_materiale.core.ChooseOrdsLavFromListItemModel; - -public class CheckableOrdineLavoro { - - - private ChooseOrdsLavFromListItemModel item; - private BindableBoolean checked = new BindableBoolean(false); - - private String testata; - - public CheckableOrdineLavoro(ChooseOrdsLavFromListItemModel item) { - this.item = item; - } - - public ChooseOrdsLavFromListItemModel getItem() { - return item; - } - - public CheckableOrdineLavoro setItem(ChooseOrdsLavFromListItemModel item) { - this.item = item; - - return this; - } - - public BindableBoolean getChecked() { - return checked; - } - - public CheckableOrdineLavoro setChecked(BindableBoolean checked) { - this.checked = checked; - return this; - } - - public BindableFloat getQtaCol() { - return item.getOrdineLav().getQtaColVersamento(); - } - - public void setQtaCol(float qtaCnf) { - this.item.getOrdineLav().setQtaColVersamento(qtaCnf); - } - - public void toggleCheck() { - this.checked.set(!this.checked.get()); - } - - public boolean isChecked() { - return checked.get(); - } - - public String getTestata() { - return testata; - } - - public void setTestata(String testata) { - this.testata = testata; - } - - public BindableFloat getNumCnf() { - return item.getOrdineLav().getNumCnfVersamento(); - } - - public void setNumCnf(float numCnf) { - this.item.getOrdineLav().setNumCnfVersamento(numCnf); - } -} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java index cb86c5fd..e7cad6bd 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java @@ -45,10 +45,16 @@ import retrofit2.Response; @Singleton public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { - private ArticoloRESTConsumer mArticoloRESTConsumer; + private final SystemRESTConsumer mSystemRESTConsumer; + private final ArticoloRESTConsumer mArticoloRESTConsumer; + private final EntityRESTConsumer mEntityRESTConsumer; - public ColliMagazzinoRESTConsumer(ArticoloRESTConsumer articoloRESTConsumer) { + public ColliMagazzinoRESTConsumer(SystemRESTConsumer systemRESTConsumer, + ArticoloRESTConsumer articoloRESTConsumer, + EntityRESTConsumer entityRESTConsumer) { + this.mSystemRESTConsumer = systemRESTConsumer; this.mArticoloRESTConsumer = articoloRESTConsumer; + this.mEntityRESTConsumer = entityRESTConsumer; } @@ -65,10 +71,6 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { } public void saveCollo(MtbColt mtbColtToSave, RunnableArgs onComplete, RunnableArgs onFailed) { - ColliMagazzinoRESTConsumer.saveColloStatic(mtbColtToSave, onComplete, onFailed); - } - - public static void saveColloStatic(MtbColt mtbColtToSave, RunnableArgs onComplete, RunnableArgs onFailed) { MtbColt mtbColtToSaveClone = (MtbColt) mtbColtToSave.clone(); mtbColtToSave.setOperation(CommonModelConsts.OPERATION.INSERT_OR_UPDATE); @@ -81,7 +83,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { .setMtbPartitaMag(null)); } - EntityRESTConsumer.processEntity(mtbColtToSaveClone, new ISimpleOperationCallback() { + this.mEntityRESTConsumer.processEntity(mtbColtToSaveClone, new ISimpleOperationCallback() { @Override public void onSuccess(MtbColt value) { if (onComplete != null) onComplete.run(value); @@ -96,10 +98,6 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { } public void saveColli(List mtbColtsToSave, RunnableArgs> onComplete, RunnableArgs onFailed) { - saveColliStatic(mtbColtsToSave, onComplete, onFailed); - } - - public static void saveColliStatic(List mtbColtsToSave, RunnableArgs> onComplete, RunnableArgs onFailed) { for (MtbColt mtbColt : mtbColtsToSave) { mtbColt.setMtbCols(null); @@ -111,7 +109,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { } } - EntityRESTConsumer.processEntityList(mtbColtsToSave, new ISimpleOperationCallback>() { + this.mEntityRESTConsumer.processEntityList(mtbColtsToSave, new ISimpleOperationCallback>() { @Override public void onSuccess(List value) { if (onComplete != null) onComplete.run(value); @@ -143,7 +141,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { }); } - public static void createColloScaricoDaCarico(MtbColt sourceMtbColt, MtbDepoPosizione posizione, RunnableArgs onComplete, RunnableArgs onFailed) { + public void createColloScaricoDaCarico(MtbColt sourceMtbColt, MtbDepoPosizione posizione, RunnableArgs onComplete, RunnableArgs onFailed) { MtbColt newMtbColt = new MtbColt() .initDefaultFields() @@ -193,20 +191,10 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { } - saveColloStatic(newMtbColt, new ISimpleOperationCallback() { - @Override - public void onSuccess(MtbColt value) { - if (onComplete != null) onComplete.run(value); - } - - @Override - public void onFailed(Exception ex) { - if (onFailed != null) onFailed.run(ex); - } - }); + saveCollo(newMtbColt, onComplete, onFailed); } - public static void createColliScaricoDaOrdineLavorazione(MtbColt sourceMtbColt, MtbColr sourceMtbColr, MtbDepoPosizione posizione, List ordini, RunnableArgs onComplete, RunnableArgs onFailed) { + public void createColliScaricoDaOrdineLavorazione(MtbColt sourceMtbColt, MtbColr sourceMtbColr, MtbDepoPosizione posizione, List ordini, RunnableArgs onComplete, RunnableArgs onFailed) { MtbColt newMtbColt = new MtbColt() .initDefaultFields() @@ -214,8 +202,8 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { .setGestione(GestioneEnum.LAVORAZIONE) .setSegno(-1) .setCodTcol(sourceMtbColt.getCodTcol()) - .setPesoKg(sourceMtbColt.getPesoKg()) - .setPesoNettoKg(sourceMtbColt.getPesoNettoKg()) +// .setPesoKg(sourceMtbColt.getPesoKg()) +// .setPesoNettoKg(sourceMtbColt.getPesoNettoKg()) .setLarghezzaCm(sourceMtbColt.getLarghezzaCm()) .setLunghezzaCm(sourceMtbColt.getLunghezzaCm()) .setAltezzaCm(sourceMtbColt.getAltezzaCm()) @@ -269,18 +257,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { } - - saveColloStatic(newMtbColt, new ISimpleOperationCallback() { - @Override - public void onSuccess(MtbColt value) { - if (onComplete != null) onComplete.run(value); - } - - @Override - public void onFailed(Exception ex) { - if (onFailed != null) onFailed.run(ex); - } - }); + saveCollo(newMtbColt, onComplete, onFailed); } @@ -314,11 +291,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { mtbColtToCreate .setOperation(CommonModelConsts.OPERATION.INSERT); - saveCollo(mtbColtToCreate, value -> { - if (onComplete != null) onComplete.run(value); - }, ex -> { - if (onFailed != null) onFailed.run(ex); - }); + saveCollo(mtbColtToCreate, onComplete, onFailed); } public void deleteCollo(MtbColt mtbColtToDelete, Runnable onComplete, RunnableArgs onFailed) { @@ -327,9 +300,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { saveCollo(mtbColtToDelete, value -> { if (onComplete != null) onComplete.run(); - }, ex -> { - if (onFailed != null) onFailed.run(ex); - }); + }, onFailed); } public static void distribuisciCollo(MtbColt mtbColtToDistribute, DistribuzioneColloDTO.CriterioDistribuzione criterioDistribuzione, RunnableArgs> onComplete, RunnableArgs onFailed) { @@ -374,10 +345,6 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { } public void getBySSCC(String ssccString, boolean onlyResiduo, boolean throwExcIfNull, RunnableArgs onComplete, RunnableArgs onFailed) { - ColliMagazzinoRESTConsumer.getBySSCCStatic(ssccString, onlyResiduo, throwExcIfNull, onComplete, onFailed); - } - - public static void getBySSCCStatic(String ssccString, boolean onlyResiduo, boolean throwExcIfNull, RunnableArgs onComplete, RunnableArgs onFailed) { ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = RESTBuilder.getService(ColliMagazzinoRESTConsumerService.class); colliMagazzinoRESTConsumerService.getColloByBarcode(ssccString, onlyResiduo, throwExcIfNull).enqueue(new Callback>() { @Override @@ -538,17 +505,13 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { } public void updateDataFine(MtbColt mtbColt, Runnable onComplete, RunnableArgs onFailed) { - ColliMagazzinoRESTConsumer.updateDataFineStatic(mtbColt, onComplete, onFailed); - } - - public static void updateDataFineStatic(MtbColt mtbColt, Runnable onComplete, RunnableArgs onFailed) { MtbColt cloneMtbColt = (MtbColt) mtbColt.clone(); cloneMtbColt.setOperation(CommonModelConsts.OPERATION.UPDATE); cloneMtbColt.setOraFinePrep(UtilityDate.getDateInstance()); cloneMtbColt.setMtbColr(new ObservableArrayList<>()); - ColliMagazzinoRESTConsumer.saveColloStatic(cloneMtbColt, value -> { + saveCollo(cloneMtbColt, value -> { onComplete.run(); }, ex -> { if (onFailed != null) onFailed.run(ex); @@ -557,10 +520,6 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { } public void canLUBeDeleted(MtbColt mtbColt, RunnableArgs onComplete, RunnableArgs onFailed) { - ColliMagazzinoRESTConsumer.canLUBeDeletedStatic(mtbColt, onComplete, onFailed); - } - - public static void canLUBeDeletedStatic(MtbColt mtbColt, RunnableArgs onComplete, RunnableArgs onFailed) { HashMap params = new HashMap<>(); params.put("mtb_colt.gestione", mtbColt.getGestione()); @@ -602,7 +561,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { Type typeOfObjectsList = new TypeToken>() { }.getType(); - SystemRESTConsumer.>processSqlStatic(query, typeOfObjectsList, data -> { + this.mSystemRESTConsumer.>processSql(query, typeOfObjectsList, data -> { onComplete.run(data != null && data.size() > 0); }, onFailed); } @@ -639,7 +598,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { colliMagazzinoRESTConsumerService.creaRettificaCollo( SettingsManager.i().getUserSession().getDepo().getCodMdep(), rettificaULDTO - ).enqueue(new Callback>() { + ).enqueue(new Callback<>() { @Override public void onResponse(Call> call, Response> response) { analyzeAnswer(response, "creaRettificaCollo", onComplete, onFailed); @@ -669,9 +628,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { .setDestinationMtbColt(mtbColtDestClone); ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = RESTBuilder.getService(ColliMagazzinoRESTConsumerService.class); - colliMagazzinoRESTConsumerService.spostaArtsTraUL( - spostaArtsTraULRequestDTO - ).enqueue(new Callback>() { + colliMagazzinoRESTConsumerService.spostaArtsTraUL(spostaArtsTraULRequestDTO).enqueue(new Callback<>() { @Override public void onResponse(Call> call, Response> response) { analyzeAnswer(response, "spostaArtsTraUL", data -> { @@ -697,7 +654,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { } ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = RESTBuilder.getService(ColliMagazzinoRESTConsumerService.class); - colliMagazzinoRESTConsumerService.assegnaLottoSuColloScarico(sourceMtbColtClone).enqueue(new Callback>() { + colliMagazzinoRESTConsumerService.assegnaLottoSuColloScarico(sourceMtbColtClone).enqueue(new Callback<>() { @Override public void onResponse(Call> call, Response> response) { analyzeAnswer(response, "assegnaLottoSuColloScarico", data -> { diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/EntityRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/EntityRESTConsumer.java index 4af99fc4..6c3f35f4 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/EntityRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/EntityRESTConsumer.java @@ -4,23 +4,23 @@ import android.util.Log; import com.google.gson.Gson; import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; -import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; +import javax.inject.Singleton; + import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.model.EntityBase; import it.integry.integrywmsnative.core.rest.RESTBuilder; import it.integry.integrywmsnative.core.rest.model.EsitoType; import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; -import it.integry.integrywmsnative.core.model.EntityBase; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; -public class EntityRESTConsumer { +@Singleton +public class EntityRESTConsumer extends _BaseRESTConsumer { public static void processEntity(T entityToSave, RunnableArgs onComplete, RunnableArgs onFailed, Class type) { diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MesRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MesRESTConsumer.java index 0785c8f4..85d91398 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MesRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/MesRESTConsumer.java @@ -29,11 +29,11 @@ public class MesRESTConsumer extends _BaseRESTConsumer { this.mSystemRESTConsumer = systemRESTConsumer; } - public static void getOrdiniLavorazioneMateriale(String codJfas, String idMateriale, RunnableArgs> onComplete, RunnableArgs onFailed) { + public void getOrdiniLavorazioneMateriale(String codJfas, String idMateriale, RunnableArgs> onComplete, RunnableArgs onFailed) { MesRESTConsumerService mesRESTConsumerService = RESTBuilder.getService(MesRESTConsumerService.class); mesRESTConsumerService.getOrdiniLavorazioneMateriale(codJfas, idMateriale) - .enqueue(new Callback>>() { + .enqueue(new Callback<>() { @Override public void onResponse(Call>> call, Response>> response) { analyzeAnswer(response, "getOrdiniLavorazioneMateriale", (m) -> onComplete.run(response.body().getDto()), onFailed); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PVOrdiniAcquistoRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PVOrdiniAcquistoRESTConsumer.java index dc73ded6..c50ac071 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PVOrdiniAcquistoRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PVOrdiniAcquistoRESTConsumer.java @@ -59,7 +59,7 @@ public class PVOrdiniAcquistoRESTConsumer extends _BaseRESTConsumer { }); griglia.setGrigliaAcquistiChild(listaArticoli); onSuccess.run(griglia); - }); + }, false); }, onFailed); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PrinterRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PrinterRESTConsumer.java index 9136247d..b5a21cf6 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PrinterRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PrinterRESTConsumer.java @@ -34,20 +34,12 @@ public class PrinterRESTConsumer extends _BaseRESTConsumer { public void getAvailablePrinters(String codMdep, final RunnableArgs> onComplete, final RunnableArgs onFailed) { PrinterRESTConsumerService printerService = RESTBuilder.getService(PrinterRESTConsumerService.class); - printerService.getAvailablePrinters(codMdep).enqueue(new Callback>>() { + printerService.getAvailablePrinters(codMdep).enqueue(new Callback<>() { @Override public void onResponse(Call>> call, Response>> response) { - analyzeAnswer(response, "GetAvailablePrinters", new ISimpleOperationCallback>() { - @Override - public void onSuccess(List value) { - onComplete.run(value != null ? Stream.of(value).withoutNulls().toList() : null); - } - - @Override - public void onFailed(Exception ex) { - onFailed.run(ex); - } - }); + analyzeAnswer(response, "GetAvailablePrinters", printers -> { + onComplete.run(printers != null ? Stream.of(printers).withoutNulls().toList() : null); + }, onFailed); } @Override @@ -61,15 +53,11 @@ public class PrinterRESTConsumer extends _BaseRESTConsumer { public void getAvailablePrinters(String codMdep, Type printerType, RunnableArgs> onComplete, RunnableArgs onFailed) { - PrinterRESTConsumer.getAvailablePrintersStatic(codMdep, printerType, onComplete, onFailed); - } - - public static void getAvailablePrintersStatic(String codMdep, Type printerType, RunnableArgs> onComplete, RunnableArgs onFailed) { String printerTypeStr = printerType != null ? printerType.toString() : null; PrinterRESTConsumerService printerService = RESTBuilder.getService(PrinterRESTConsumerService.class); - printerService.getAvailablePrinters(codMdep, printerTypeStr).enqueue(new Callback>>() { + printerService.getAvailablePrinters(codMdep, printerTypeStr).enqueue(new Callback<>() { @Override public void onResponse(Call>> call, Response>> response) { analyzeAnswer(response, "GetAvailablePrinters", printerList -> { @@ -88,17 +76,13 @@ public class PrinterRESTConsumer extends _BaseRESTConsumer { } public void printCollo(String printerName, MtbColt testataColloToPrint, int quantity, String reportName, Runnable onComplete, RunnableArgs onFailed) { - printColloStatic(printerName, testataColloToPrint, quantity, reportName, onComplete, onFailed); - } - public static void printColloStatic(String printerName, MtbColt testataColloToPrint, int quantity, String reportName, Runnable onComplete, RunnableArgs onFailed) { - - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { onComplete.run(); return; } - if(UtilityString.isNullOrEmpty(printerName)) { + if (UtilityString.isNullOrEmpty(printerName)) { onFailed.run(new Exception("Nessuna stampante configurata: valore null")); return; } @@ -113,7 +97,7 @@ public class PrinterRESTConsumer extends _BaseRESTConsumer { quantity, reportName) - .enqueue(new Callback>() { + .enqueue(new Callback<>() { @Override public void onResponse(Call> call, Response> response) { analyzeAnswer(response, "printCollo", data -> { @@ -123,7 +107,7 @@ public class PrinterRESTConsumer extends _BaseRESTConsumer { @Override public void onFailure(Call> call, Throwable t) { - if(t.getMessage().contains("Printer not found")) { + if (t.getMessage().contains("Printer not found")) { onFailed.run(new NoPrintersFoundException()); } else onFailed.run(new Exception(t)); } @@ -145,7 +129,7 @@ public class PrinterRESTConsumer extends _BaseRESTConsumer { PrinterRESTConsumerService printerService = RESTBuilder.getService(PrinterRESTConsumerService.class); printerService .processPrintReport(printerName, quantity, jasperDTO) - .enqueue(new Callback>() { + .enqueue(new Callback<>() { @Override public void onResponse(Call> call, Response> response) { analyzeAnswer(response, "printReport", data -> { @@ -155,11 +139,11 @@ public class PrinterRESTConsumer extends _BaseRESTConsumer { @Override public void onFailure(Call> call, Throwable t) { - if(t.getMessage().contains("Printer not found")) { + if (t.getMessage().contains("Printer not found")) { onFailed.run(new NoPrintersFoundException()); } else onFailed.run(new Exception(t)); } - }); + }); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumer.java index 60c7e305..af2494ae 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumer.java @@ -42,27 +42,19 @@ public class SystemRESTConsumer extends _BaseRESTConsumer { nativeSqlDTO.nativeSql = nativeSql; SystemRESTConsumerService service = RESTBuilder.getService(SystemRESTConsumerService.class); - service.processSql(nativeSqlDTO).enqueue(new Callback>() { + service.processSql(nativeSqlDTO).enqueue(new Callback<>() { @Override public void onResponse(Call> call, Response> response) { - analyzeAnswer(response, "ProcessSql", new ISimpleOperationCallback() { - @Override - public void onSuccess(Object value) { - Gson gson = new Gson(); - String json = gson.toJson(value); + analyzeAnswer(response, "ProcessSql", o -> { + Gson gson = new Gson(); + String json = gson.toJson(o); - InputStream ims = new ByteArrayInputStream(json.getBytes()); - Reader reader = new InputStreamReader(ims); - T gsonObj = gson.fromJson(reader, clazz); + InputStream ims = new ByteArrayInputStream(json.getBytes()); + Reader reader = new InputStreamReader(ims); + T gsonObj = gson.fromJson(reader, clazz); - onComplete.run(gsonObj); - } - - @Override - public void onFailed(Exception ex) { - if(onFailed != null) onFailed.run(ex); - } - }); + onComplete.run(gsonObj); + }, onFailed); } @Override @@ -73,6 +65,7 @@ public class SystemRESTConsumer extends _BaseRESTConsumer { }); } + public static void processSqlStatic(String nativeSql, final Type clazz, final ISimpleOperationCallback callback) { processSqlStatic(nativeSql, clazz, data -> { @@ -86,19 +79,19 @@ public class SystemRESTConsumer extends _BaseRESTConsumer { } - public static void getAvailableProfiles(final ISimpleOperationCallback> callback){ + public static void getAvailableProfiles(final RunnableArgs> onSuccess, RunnableArgs onFailed) { SystemRESTConsumerService service = RESTBuilder.getService(SystemRESTConsumerService.class); service.getAvailableProfiles(SettingsManager.i().getUser().getUsername(), SettingsManager.i().getUser().getPassword()).enqueue(new Callback>>() { @Override public void onResponse(Call>> call, Response>> response) { - analyzeAnswer(response, "ProfilesAvailable", callback); + analyzeAnswer(response, "ProfilesAvailable", onSuccess, onFailed); } @Override public void onFailure(Call>> call, final Throwable t) { Log.e("ProfilesAvailable", t.toString()); - callback.onFailed(new Exception(t)); + onFailed.run(new Exception(t)); UtilityLogger.errorMe(new Exception(t)); } }); @@ -107,23 +100,19 @@ public class SystemRESTConsumer extends _BaseRESTConsumer { } - - - - public static void getAvailableCodMdeps(final ISimpleOperationCallback> callback){ + public static void getAvailableCodMdeps(final RunnableArgs> onSuccess, RunnableArgs onFailed) { SystemRESTConsumerService service = RESTBuilder.getService(SystemRESTConsumerService.class); - service.getAvailableCodMdeps().enqueue(new Callback>>() { + service.getAvailableCodMdeps().enqueue(new Callback<>() { @Override public void onResponse(Call>> call, Response>> response) { - analyzeAnswer(response, "CodMdepsAvailable", callback); + analyzeAnswer(response, "CodMdepsAvailable", onSuccess, onFailed); } @Override public void onFailure(Call>> call, final Throwable t) { Log.e("CodMdepsAvailable", t.toString()); - callback.onFailed(new Exception(t)); -// UtilityLogger.errorMe(new Exception(t)); + onFailed.run(new Exception(t)); } }); } @@ -139,7 +128,7 @@ public class SystemRESTConsumer extends _BaseRESTConsumer { String currentAzienda = UtilityString.isNullOrEmpty(SettingsManager.i().getUserSession().getProfileDB()) ? "" : " [" + SettingsManager.i().getUserSession().getProfileDB() + "]"; String dest = ""; - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { dest = TextUtils.join(";", CommonConst.Mail.forErrorsDebug); } else { dest = TextUtils.join(";", CommonConst.Mail.forErrors); @@ -155,10 +144,10 @@ public class SystemRESTConsumer extends _BaseRESTConsumer { .setHtml(true); sendMail(mailDTO, () -> { - if(onComplete != null) onComplete.run(); + if (onComplete != null) onComplete.run(); }, ex -> { Log.e(SystemRESTConsumer.class.getName(), "", ex); - if(onFailed != null) onFailed.run(ex); + if (onFailed != null) onFailed.run(ex); }); } @@ -169,12 +158,12 @@ public class SystemRESTConsumer extends _BaseRESTConsumer { service.sendMail(mailDTO).enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { - if(onComplete != null) onComplete.run(); + if (onComplete != null) onComplete.run(); } @Override public void onFailure(Call> call, Throwable t) { - if(onFailed != null) { + if (onFailed != null) { onFailed.run(new Exception(t)); } } @@ -182,21 +171,21 @@ public class SystemRESTConsumer extends _BaseRESTConsumer { } - public static void getAzienda(RunnableArgs onComplete, RunnableArgs onFailed) { String sql = "SELECT TOP 1 * FROM azienda"; - Type typeOfObjectsList = new TypeToken>() {}.getType(); + Type typeOfObjectsList = new TypeToken>() { + }.getType(); SystemRESTConsumer.processSqlStatic(sql, typeOfObjectsList, new ISimpleOperationCallback>() { @Override public void onSuccess(List value) { - if(onComplete != null) onComplete.run(value.get(0)); + if (onComplete != null) onComplete.run(value.get(0)); } @Override public void onFailed(Exception ex) { - if(onFailed != null) onFailed.run(ex); + if (onFailed != null) onFailed.run(ex); } }); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/_BaseRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/_BaseRESTConsumer.java index 9257eefb..62a5620b 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/_BaseRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/_BaseRESTConsumer.java @@ -14,96 +14,78 @@ import retrofit2.Response; public class _BaseRESTConsumer { - - public static void analyzeAnswer(Response> response, String logTitle, final ISimpleOperationCallback callback) { + public static void analyzeAnswer(Response> response, String logTitle, RunnableArgs onComplete, RunnableArgs onFailed) { if (response.isSuccessful()) { if (response.body() != null) { if (response.body().getEsito() == EsitoType.OK) { if (!UtilityString.isNullOrEmpty(response.body().getErrorMessage())) { - callback.onFailed(new Exception(response.body().getErrorMessage())); + onFailed.run(new Exception(response.body().getErrorMessage())); } else { T dataObj = response.body().getDto() != null ? response.body().getDto() : response.body().getEntity(); - callback.onSuccess(dataObj); + onComplete.run(dataObj); } } else { Log.e(logTitle, response.body().getErrorMessage()); // callback.onFailed(new Exception(response.body().getErrorMessage())); - callback.onFailed(CommonRESTException.tryRecognizeException(response.body().getErrorMessage())); + onFailed.run(CommonRESTException.tryRecognizeException(response.body().getErrorMessage())); } } else { Log.e(logTitle, response.message()); - callback.onFailed(new Exception(response.message())); + onFailed.run(new Exception(response.message())); } } else { - Log.e(logTitle, "Status " + response.code() + ": " + response.message()); - callback.onFailed(new Exception("Status " + response.code() + ": " + response.message())); - } - } - - public static void analyzeAnswer(Response> response, String logTitle, RunnableArgs onComplete, RunnableArgs onFailed) { - analyzeAnswer(response, logTitle, new ISimpleOperationCallback() { - @Override - public void onSuccess(T value) { - onComplete.run(value); - } - - @Override - public void onFailed(Exception ex) { - onFailed.run(ex); - } - }); - } - - - public static void analyzeAnswerList(Response> response, String logTitle, final ISimpleOperationCallback> callback) { - if (response.isSuccessful()) { - if (response.body() != null) { - if (response.body().getEsito() == EsitoType.OK) { - if (!UtilityString.isNullOrEmpty(response.body().getErrorMessage())) { - callback.onFailed(new Exception(response.body().getErrorMessage())); - } else { - - List dataObj = response.body().getEntityList(); - - callback.onSuccess(dataObj); - } - } else { - Log.e(logTitle, response.body().getErrorMessage()); - callback.onFailed(new Exception(response.body().getErrorMessage())); - } + if (response.code() == 404) { + Log.e(logTitle, "Errore " + response.code() + ": risorsa non trovata"); + onFailed.run(new Exception("Errore " + response.code() + ": risorsa non trovata (" + logTitle + ")")); } else { - Log.e(logTitle, response.message()); - callback.onFailed(new Exception(response.message())); + Log.e(logTitle, "Status " + response.code() + ": " + response.message()); + onFailed.run(new Exception("Status " + response.code() + ": " + response.message())); } - } else { - Log.e(logTitle, "Status " + response.code() + ": " + response.message()); - callback.onFailed(new Exception("Status " + response.code() + ": " + response.message())); + + } } public static void analyzeAnswerList(Response> response, String logTitle, RunnableArgs> onComplete, RunnableArgs onFailed) { - analyzeAnswerList(response, logTitle, new ISimpleOperationCallback>() { - @Override - public void onSuccess(List value) { - onComplete.run(value); - } + if (response.isSuccessful()) { + if (response.body() != null) { + if (response.body().getEsito() == EsitoType.OK) { + if (!UtilityString.isNullOrEmpty(response.body().getErrorMessage())) { + onFailed.run(new Exception(response.body().getErrorMessage())); + } else { - @Override - public void onFailed(Exception ex) { - onFailed.run(ex); + List dataObj = response.body().getEntityList(); + + onComplete.run(dataObj); + } + } else { + Log.e(logTitle, response.body().getErrorMessage()); + onFailed.run(new Exception(response.body().getErrorMessage())); + } + } else { + Log.e(logTitle, response.message()); + onFailed.run(new Exception(response.message())); } - }); + } else { + if (response.code() == 404) { + Log.e(logTitle, "Errore " + response.code() + ": risorsa non trovata"); + onFailed.run(new Exception("Errore " + response.code() + ": risorsa non trovata (" + logTitle + ")")); + } else { + Log.e(logTitle, "Status " + response.code() + ": " + response.message()); + onFailed.run(new Exception("Status " + response.code() + ": " + response.message())); + } + } } public static void analyzeListOfAnswers(Response>> responseList, String logTitle, RunnableArgs> onComplete, RunnableArgs onFailed) { if (responseList.isSuccessful()) { if (responseList.body() != null) { List analyzedList = new ArrayList<>(); - for (ServiceRESTResponse response : responseList.body()){ + for (ServiceRESTResponse response : responseList.body()) { if (response.getEsito() == EsitoType.OK) { if (!UtilityString.isNullOrEmpty(response.getErrorMessage())) { onFailed.run(new Exception(response.getErrorMessage())); @@ -111,7 +93,7 @@ public class _BaseRESTConsumer { T dataObj = response.getDto() != null ? response.getDto() : response.getEntity(); - if (dataObj !=null ) analyzedList.add(dataObj); + if (dataObj != null) analyzedList.add(dataObj); } } else { @@ -126,8 +108,13 @@ public class _BaseRESTConsumer { onFailed.run(new Exception(responseList.message())); } } else { - Log.e(logTitle, "Status " + responseList.code() + ": " + responseList.message()); - onFailed.run(new Exception("Status " + responseList.code() + ": " + responseList.message())); + if (responseList.code() == 404) { + Log.e(logTitle, "Errore " + responseList.code() + ": risorsa non trovata"); + onFailed.run(new Exception("Errore " + responseList.code() + ": risorsa non trovata (" + logTitle + ")")); + } else { + Log.e(logTitle, "Status " + responseList.code() + ": " + responseList.message()); + onFailed.run(new Exception("Status " + responseList.code() + ": " + responseList.message())); + } } } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java b/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java index 94f8ef10..5b3b6de0 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/settings/SettingsManager.java @@ -13,7 +13,6 @@ import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.model.StbGestSetup; import it.integry.integrywmsnative.core.rest.consumers.GestSetupRESTConsumer; -import it.integry.integrywmsnative.core.rest.consumers.ISimpleOperationCallback; import it.integry.integrywmsnative.core.rest.consumers.PosizioniRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; import it.integry.integrywmsnative.core.rest.model.AvailableCodMdepsDTO; @@ -118,58 +117,46 @@ public class SettingsManager { } private static void loadAvailableProfiles(Runnable onComplete, RunnableArgs onFailed) { - SystemRESTConsumer.getAvailableProfiles(new ISimpleOperationCallback>() { - @Override - public void onSuccess(List availableProfiles) { - dbSettingsModelIstance.setAvailableProfiles(availableProfiles); + SystemRESTConsumer.getAvailableProfiles(availableProfiles -> { + dbSettingsModelIstance.setAvailableProfiles(availableProfiles); - onComplete.run(); + onComplete.run(); - } - - @Override - public void onFailed(Exception ex) { - //BOH - if (onFailed != null) onFailed.run(ex); - } + }, ex -> { + //BOH + if (onFailed != null) onFailed.run(ex); }); } private static void loadAvailableCodMdeps(Runnable onComplete, RunnableArgs onFailed) { - SystemRESTConsumer.getAvailableCodMdeps(new ISimpleOperationCallback>() { - @Override - public void onSuccess(List availableCodMdeps) { - dbSettingsModelIstance.setAvailableCodMdep(availableCodMdeps); + SystemRESTConsumer.getAvailableCodMdeps(availableCodMdeps -> { + dbSettingsModelIstance.setAvailableCodMdep(availableCodMdeps); - if (availableCodMdeps == null || availableCodMdeps.size() == 0) { - onFailed.run(new Exception(mContext.getText(R.string.no_codmdep_available).toString())); - return; - } + if (availableCodMdeps == null || availableCodMdeps.size() == 0) { + onFailed.run(new Exception(mContext.getText(R.string.no_codmdep_available).toString())); + return; + } - boolean codMdepExistsAnymore = false; + boolean codMdepExistsAnymore = false; - if (settingsModelIstance.getUserSession().getDepo() != null) { - for (AvailableCodMdepsDTO availableCodMdepDTO : availableCodMdeps) { - //Controllo se il codMdep salvato esiste ancora - if (availableCodMdepDTO.getCodMdep().equalsIgnoreCase(settingsModelIstance.getUserSession().getDepo().getCodMdep())) { - codMdepExistsAnymore = true; - break; - } + if (settingsModelIstance.getUserSession().getDepo() != null) { + for (AvailableCodMdepsDTO availableCodMdepDTO : availableCodMdeps) { + //Controllo se il codMdep salvato esiste ancora + if (availableCodMdepDTO.getCodMdep().equalsIgnoreCase(settingsModelIstance.getUserSession().getDepo().getCodMdep())) { + codMdepExistsAnymore = true; + break; } } - - if (!codMdepExistsAnymore) { - settingsModelIstance.getUserSession().setDepo(availableCodMdeps.get(0)); - } - - if (onComplete != null) onComplete.run(); } - @Override - public void onFailed(Exception ex) { - //BOH - if (onFailed != null) onFailed.run(ex); + if (!codMdepExistsAnymore) { + settingsModelIstance.getUserSession().setDepo(availableCodMdeps.get(0)); } + + if (onComplete != null) onComplete.run(); + }, ex -> { + //BOH + if (onFailed != null) onFailed.run(ex); }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java index b5191722..739b8acb 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java @@ -2,7 +2,7 @@ package it.integry.integrywmsnative.core.utility; import android.app.Dialog; import android.content.Context; -import android.text.SpannableString; +import android.text.Html; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; @@ -29,7 +29,7 @@ public class UtilityExceptions { public static void defaultException(Context context, Exception ex, boolean sendEmail) { if (ex.getMessage() != null) { - Logger.e(ex, ex.getMessage()); + Logger.e(ex, Html.fromHtml(ex.getMessage()).toString()); } else { Logger.e(ex, "Errore"); } @@ -51,7 +51,7 @@ public class UtilityExceptions { } if (fm != null) { - DialogSimpleMessageView.makeErrorDialog(new SpannableString(errorMessage), null, null) + DialogSimpleMessageView.makeErrorDialog(Html.fromHtml(errorMessage), null, null) .show(fm, "tag"); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilitySettings.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilitySettings.java index b08eb25c..4bf725b1 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilitySettings.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilitySettings.java @@ -1,25 +1,5 @@ package it.integry.integrywmsnative.core.utility; -import it.integry.integrywmsnative.core.data_store.db.AppDatabase; -import it.integry.integrywmsnative.core.settings.SettingsManager; - public class UtilitySettings { - - private static AppDatabase mAppDatabase; - - public static void init(AppDatabase appDatabase) { - mAppDatabase = appDatabase; - } - - public static void logout(Runnable onComplete){ - SettingsManager.i().setUser(null); - SettingsManager.i().setUserSession(null); - SettingsManager.update(); - UtilityThread.executeParallel(() -> { - mAppDatabase.clearAllTables(); - onComplete.run(); - }); - } - } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityThread.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityThread.java index e04b0ff3..76dedc81 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityThread.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityThread.java @@ -2,8 +2,17 @@ package it.integry.integrywmsnative.core.utility; public class UtilityThread { - public static void executeParallel(Runnable runnable) { - new Thread(runnable).start(); + public static void executeParallel(Runnable runnable, boolean waitEnd) { + Thread t = new Thread(runnable); + t.start(); + + if(waitEnd) { + try { + t.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java index ed262482..2f05a1d7 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/login/viewmodel/LoginViewModel.java @@ -18,7 +18,6 @@ import it.integry.integrywmsnative.core.di.BindableBoolean; import it.integry.integrywmsnative.core.di.BindableString; import it.integry.integrywmsnative.core.rest.consumers.ISimpleOperationCallback; import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; -import it.integry.integrywmsnative.core.rest.model.AvailableCodMdepsDTO; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityProgress; import it.integry.integrywmsnative.core.utility.UtilityServer; @@ -158,27 +157,21 @@ public class LoginViewModel { SettingsManager.i().getUser().setUsername(username.get()); SettingsManager.i().getUser().setPassword(password.get()); - SystemRESTConsumer.getAvailableCodMdeps(new ISimpleOperationCallback>() { - @Override - public void onSuccess(List availableCodMdeps) { - SettingsManager.iDB().setAvailableCodMdep(availableCodMdeps); + SystemRESTConsumer.getAvailableCodMdeps(availableCodMdeps -> { + SettingsManager.iDB().setAvailableCodMdep(availableCodMdeps); - if (availableCodMdeps == null || availableCodMdeps.size() == 0) { - onLoginFailed(Html.fromHtml(String.format(mActivity.getText(R.string.no_codmdep_available).toString()))); - return; - } - - SettingsManager.i().getUserSession().setDepo(availableCodMdeps.get(0)); - - - if (onComplete != null) onComplete.run(); + if (availableCodMdeps == null || availableCodMdeps.size() == 0) { + onLoginFailed(Html.fromHtml(String.format(mActivity.getText(R.string.no_codmdep_available).toString()))); + return; } - @Override - public void onFailed(Exception ex) { - //BOH - onLoginFailed(new SpannableString(ex.getMessage())); - } + SettingsManager.i().getUserSession().setDepo(availableCodMdeps.get(0)); + + + if (onComplete != null) onComplete.run(); + }, ex -> { + //BOH + onLoginFailed(new SpannableString(ex.getMessage())); }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java index 703b1f3c..e42327d5 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java @@ -32,8 +32,8 @@ import it.integry.integrywmsnative.core.class_router.ClassRouter; import it.integry.integrywmsnative.core.class_router.configs.BaseMenuConfiguration; import it.integry.integrywmsnative.core.class_router.configs.MenuConfiguration; import it.integry.integrywmsnative.core.class_router.interfaces.ICustomConfiguration; +import it.integry.integrywmsnative.core.context.MainContext; import it.integry.integrywmsnative.core.data_recover.ColliDataRecoverService; -import it.integry.integrywmsnative.core.data_store.db.AppDatabase; import it.integry.integrywmsnative.core.expansion.BaseActivity; import it.integry.integrywmsnative.core.expansion.OnSingleClickListener; import it.integry.integrywmsnative.core.interfaces.IFilterableFragment; @@ -47,7 +47,6 @@ import it.integry.integrywmsnative.core.menu.MenuService; import it.integry.integrywmsnative.core.rest.watcher.ServerStatusChecker; import it.integry.integrywmsnative.core.update.UpdatesManager; import it.integry.integrywmsnative.core.utility.UtilityContext; -import it.integry.integrywmsnative.core.utility.UtilitySettings; import it.integry.integrywmsnative.databinding.ActivityMainBinding; import it.integry.integrywmsnative.gest.login.LoginActivity; import it.integry.integrywmsnative.gest.settings.MainSettingsFragment; @@ -60,15 +59,15 @@ public class MainActivity extends BaseActivity private boolean firstCheckExecution = true; private boolean mIsOnline = false; - @Inject - AppDatabase mAppDatabase; - @Inject ColliDataRecoverService mColliDataRecoverService; @Inject MenuService menuService; + @Inject + MainContext mainContext; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -78,8 +77,6 @@ public class MainActivity extends BaseActivity .create() .inject(this); -// mColliDataRecoverService.init(this); - mBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.activity_main, null, false); setContentView(mBinding.getRoot()); @@ -189,7 +186,7 @@ public class MainActivity extends BaseActivity case R.id.nav_logout: ServerStatusChecker.dispose(); - UtilitySettings.logout(() -> { + this.mainContext.logout(() -> { startLoginActivity(); }); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragment.java index c355c9fa..ef9f6f25 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainFragment.java @@ -63,6 +63,9 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab @Inject MenuService menuService; + @Inject + ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer; + private FragmentMainBinding mBindings; private final List mOnPreDestroyList = new ArrayList<>(); @@ -191,7 +194,7 @@ public class MainFragment extends Fragment implements ITitledFragment, IScrollab IOrdiniVendita ordiniVendita = ClassRouter.getInstance(ClassRouter.PATH.ORDINI_VENDITA); - ColliMagazzinoRESTConsumer.updateDataFineStatic(recoveredMtbColt, () -> { + this.colliMagazzinoRESTConsumer.updateDataFine(recoveredMtbColt, () -> { ordiniVendita.distribuisciCollo(recoveredMtbColt, recoveredMtbColtDto.getTestateOrdini(), mtbColts -> { colliDataRecoverService.closeSession(recoveredMtbColtID); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java index c8ec74d4..09875676 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java @@ -18,7 +18,6 @@ import androidx.recyclerview.widget.LinearLayoutManager; import com.annimon.stream.Stream; import java.math.BigDecimal; -import java.util.ArrayList; import java.util.List; import javax.inject.Inject; @@ -43,7 +42,6 @@ import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.dialog. import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui.MainListProdOrdineProduzioneElencoClienteListModel; import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui.MainListProdOrdineProduzioneElencoListModel; import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui.OrdineProduzioneListAdapter; -import it.integry.integrywmsnative.ui.ElevatedToolbar; import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; /** @@ -56,9 +54,6 @@ public class ProdOrdineProduzioneElencoFragment extends BaseFragment implements @Inject ProdOrdineProduzioneElencoViewModel mViewModel; - private final List mOnPreDestroyList = new ArrayList<>(); - private ElevatedToolbar mToolbar; - private FragmentProdOrdineProduzioneElencoBinding mBinding; private final ObservableArrayList mOrdiniInevasiMutableData = new ObservableArrayList<>(); @@ -117,26 +112,12 @@ public class ProdOrdineProduzioneElencoFragment extends BaseFragment implements mViewModel.init(codMdep); } - @Override - public void onDestroy() { - super.onDestroy(); - - for (Runnable onPreDestroy : mOnPreDestroyList) { - onPreDestroy.run(); - } - } - @Override public void onCreateActionBar(AppCompatTextView titleText, Context context) { mAppBarTitle = titleText; mAppBarTitle.setText(context.getText(R.string.prod_ordine_produzione_title_fragment).toString()); } - @Override - public void setScrollToolbar(ElevatedToolbar toolbar) { - mToolbar = toolbar; - } - private void initRecyclerView() { this.mViewModel.getOrderList().observe(getViewLifecycleOwner(), this::refreshList); @@ -245,11 +226,6 @@ public class ProdOrdineProduzioneElencoFragment extends BaseFragment implements } - @Override - public void addOnPreDestroy(Runnable onPreDestroy) { - this.mOnPreDestroyList.add(onPreDestroy); - } - @Override public void onOrdersDispatched(List orders, List sitArts) { long artsCounter = Stream.of(sitArts) diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoModule.java index 0db6253d..a87fdc14 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoModule.java @@ -2,7 +2,6 @@ package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione; import dagger.Module; import dagger.Provides; -import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.rest.ProdOrdineProduzioneRESTConsumer; @Module(subcomponents = ProdOrdineProduzioneElencoComponent.class) @@ -14,8 +13,8 @@ public class ProdOrdineProduzioneElencoModule { } @Provides - ProdOrdineProduzioneElencoViewModel providesProdOrdineProduzioneElencoViewModel(ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer, ProdOrdineProduzioneRESTConsumer prodOrdineProduzioneRESTConsumer) { - return new ProdOrdineProduzioneElencoViewModel(colliMagazzinoRESTConsumer, prodOrdineProduzioneRESTConsumer); + ProdOrdineProduzioneElencoViewModel providesProdOrdineProduzioneElencoViewModel(ProdOrdineProduzioneRESTConsumer prodOrdineProduzioneRESTConsumer) { + return new ProdOrdineProduzioneElencoViewModel(prodOrdineProduzioneRESTConsumer); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoViewModel.java index bd36a93e..512f9856 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoViewModel.java @@ -7,14 +7,12 @@ import java.util.List; import javax.inject.Inject; import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener; -import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; import it.integry.integrywmsnative.gest.accettazione.dto.SitArtOrdDTO; import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.rest.ProdOrdineProduzioneRESTConsumer; public class ProdOrdineProduzioneElencoViewModel { - private final ColliMagazzinoRESTConsumer mColliMagazzinoRESTConsumer; private final ProdOrdineProduzioneRESTConsumer mProdOrdineProduzioneRESTConsumer; private final MutableLiveData> mOrderList = new MutableLiveData<>(); @@ -25,8 +23,7 @@ public class ProdOrdineProduzioneElencoViewModel { @Inject - public ProdOrdineProduzioneElencoViewModel(ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer, ProdOrdineProduzioneRESTConsumer prodOrdineProduzioneRESTConsumer) { - this.mColliMagazzinoRESTConsumer = colliMagazzinoRESTConsumer; + public ProdOrdineProduzioneElencoViewModel(ProdOrdineProduzioneRESTConsumer prodOrdineProduzioneRESTConsumer) { this.mProdOrdineProduzioneRESTConsumer = prodOrdineProduzioneRESTConsumer; } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/ProdFabbisognoLineeProdFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/ProdFabbisognoLineeProdFragment.java index e31c5cd0..b697cdb2 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/ProdFabbisognoLineeProdFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_fabbisogno_linee_prod/ProdFabbisognoLineeProdFragment.java @@ -20,7 +20,6 @@ import javax.inject.Inject; import it.integry.integrywmsnative.MainApplication; import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.expansion.BaseFragment; -import it.integry.integrywmsnative.core.interfaces.IPoppableActivity; import it.integry.integrywmsnative.core.interfaces.ITitledFragment; import it.integry.integrywmsnative.core.model.MtbColr; import it.integry.integrywmsnative.core.model.secondary.GestioneEnum; @@ -158,7 +157,7 @@ public class ProdFabbisognoLineeProdFragment extends BaseFragment implements ITi MtbColr.Causale.VERSAMENTO, DialogRowInfoProdFabbisognoLineeProdView.class); - ((IPoppableActivity) getActivity()).pop(); + popMe(); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeComponent.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeComponent.java new file mode 100644 index 00000000..489be0f5 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeComponent.java @@ -0,0 +1,15 @@ +package it.integry.integrywmsnative.gest.prod_recupero_materiale; + +import dagger.Subcomponent; + +@Subcomponent +public interface ProdRecuperoMaterialeComponent { + + @Subcomponent.Factory + interface Factory { + ProdRecuperoMaterialeComponent create(); + } + + void inject(ProdRecuperoMaterialeFragment prodRecuperoMaterialeFragment); + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeFragment.java index 3fa9b3d9..44d33d4b 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeFragment.java @@ -3,33 +3,61 @@ package it.integry.integrywmsnative.gest.prod_recupero_materiale; import android.content.Context; import android.os.Bundle; +import android.text.SpannableString; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.appcompat.widget.AppCompatTextView; import androidx.databinding.DataBindingUtil; +import androidx.databinding.ObservableArrayList; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; -import java.util.ArrayList; +import com.annimon.stream.Stream; + +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.MainApplication; import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.interfaces.IPoppableActivity; +import it.integry.integrywmsnative.core.barcode_reader.BarcodeCallbackDTO; +import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; +import it.integry.integrywmsnative.core.expansion.BaseFragment; +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.expansion.RunnableArgss; +import it.integry.integrywmsnative.core.interfaces.IScrollableFragment; import it.integry.integrywmsnative.core.interfaces.ITitledFragment; +import it.integry.integrywmsnative.core.model.MtbAart; +import it.integry.integrywmsnative.core.model.MtbColt; +import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.databinding.FragmentProdRecuperoMaterialeBinding; -import it.integry.integrywmsnative.gest.prod_recupero_materiale.core.ProdRecuperoMaterialeHelper; -import it.integry.integrywmsnative.gest.prod_recupero_materiale.viewmodel.ProdRecuperoMaterialeViewModel; +import it.integry.integrywmsnative.gest.prod_recupero_materiale.dto.HistoryVersamentoProdULDTO; +import it.integry.integrywmsnative.gest.prod_recupero_materiale.ui.HistoryULsListAdapter; +import it.integry.integrywmsnative.gest.prod_recupero_materiale.ui.HistoryULsListModel; +import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO; +import it.integry.integrywmsnative.view.dialogs.DialogCommon; +import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; +import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2DTO; +import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2View; +import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCreateLUView; /** * A simple {@link Fragment} subclass. */ -public class ProdRecuperoMaterialeFragment extends Fragment implements ITitledFragment { - private FragmentProdRecuperoMaterialeBinding mBinding; - private ProdRecuperoMaterialeViewModel mViewmodel; - private ProdRecuperoMaterialeHelper mHelper; +public class ProdRecuperoMaterialeFragment extends BaseFragment implements ITitledFragment, IScrollableFragment, ProdRecuperoMaterialeViewModel.Listener { - private final List mOnPreDestroyList = new ArrayList<>(); + @Inject + ProdRecuperoMaterialeViewModel mViewModel; + + private FragmentProdRecuperoMaterialeBinding mBinding; + + private int barcodeScannerIstanceID = -1; + + private final ObservableArrayList mHistoryULMutableData = new ObservableArrayList<>(); public ProdRecuperoMaterialeFragment() { // Required empty public constructor @@ -37,33 +65,36 @@ public class ProdRecuperoMaterialeFragment extends Fragment implements ITitledFr public static ProdRecuperoMaterialeFragment newInstance() { ProdRecuperoMaterialeFragment fragment = new ProdRecuperoMaterialeFragment(); - Bundle args = new Bundle(); - fragment.setArguments(args); return fragment; } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - mViewmodel = new ProdRecuperoMaterialeViewModel(); - } - - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_prod_recupero_materiale, container, false); - init(); + MainApplication.appComponent + .prodRecuperoMaterialeComponent() + .create() + .inject(this); + + mViewModel.setListener(this); + + mBinding.setLifecycleOwner(getViewLifecycleOwner()); + mBinding.setView(this); + + this.initBarcodeReader(); + this.initRecyclerView(); + return mBinding.getRoot(); } - private void init() { - mHelper = new ProdRecuperoMaterialeHelper(getActivity()); - mViewmodel.init(getActivity(), mBinding, mHelper, () -> { - ((IPoppableActivity) getActivity()).pop(); - }); + + @Override + public void onStart() { + super.onStart(); + + mViewModel.init(); } @@ -72,16 +103,150 @@ public class ProdRecuperoMaterialeFragment extends Fragment implements ITitledFr titleText.setText(context.getText(R.string.prod_recupero_materiale_title_fragment).toString()); } - @Override - public void onDestroy() { - for (Runnable onPreDestroy : mOnPreDestroyList) { - onPreDestroy.run(); + + private void initBarcodeReader() { + barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO() + .setOnScanSuccessfull(onScanSuccessful) + .setOnScanFailed(this::onError)); + + BarcodeManager.enable(); + } + + private final RunnableArgs onScanSuccessful = data -> { + BarcodeManager.disable(); + + this.openProgress(); + + this.mViewModel.processBarcodeDTO(data); + }; + + private void initRecyclerView() { + this.mViewModel.getOrderList().observe(getViewLifecycleOwner(), this::refreshList); + + mBinding.prodRecuperoMaterialeMainList.setLayoutManager(new LinearLayoutManager(getActivity())); + + HistoryULsListAdapter adapter = new HistoryULsListAdapter(getActivity(), mHistoryULMutableData) + .setOnItemClicked(data -> this.mViewModel.dispatchItem(data.getOriginalModel(), null)); + + adapter.setEmptyView(mBinding.emptyView); + + mBinding.prodRecuperoMaterialeMainList.setAdapter(adapter); + + mToolbar.setRecyclerView(mBinding.prodRecuperoMaterialeMainList); + } + + private void refreshList(List filteredList) { + + List tmpList = null; + + if (filteredList != null) { + tmpList = filteredList; + } else { + tmpList = mViewModel.getOrderList().getValue(); } - super.onDestroy(); + + this.mHistoryULMutableData.clear(); + this.mHistoryULMutableData.addAll(convertDataModelToListModel(tmpList)); + } + + private List convertDataModelToListModel(List dataList) { + + return Stream.of(dataList) + .sortBy(HistoryVersamentoProdULDTO::getCodJfas) + .map(x -> { + HistoryULsListModel listModel = new HistoryULsListModel(); + + listModel + .setOriginalModel(x) + .setGroupTitle(UtilityString.isNullOrEmpty(x.getDescrizioneFase()) ? x.getCodJfas() : x.getDescrizioneFase()) + + .setCodMart(x.getCodMart()) + .setDescrizione(x.getDescrizioneArt()) + .setNumCollo(x.getNumColloRif()) + .setPartitaMag(x.getPartitaMag()) + .setQtaVersata(x.getQtaCol()) + .setUntMisVersata(x.getUntMis()); + + + return listModel; + }) + .toList(); } @Override - public void addOnPreDestroy(Runnable onPreDestroy) { - this.mOnPreDestroyList.add(onPreDestroy); + public void onItemDispatched(HistoryVersamentoProdULDTO item, + MtbColt sourceMtbColt, + MtbAart mtbAart, + BigDecimal initialNumCnf, + BigDecimal initialQtaCnf, + BigDecimal initialQtaTot, + BigDecimal totalQtaAvailable, + BigDecimal totalNumCnfAvailable, + BigDecimal qtaCnfAvailable, + String partitaMag, + boolean canOverflowOrderQuantity, + boolean canLUBeClosed) { + + DialogInputQuantityV2DTO dialogInputQuantityV2DTO = new DialogInputQuantityV2DTO() + .setMtbAart(mtbAart) + .setInitialNumCnf(initialNumCnf) + .setInitialQtaCnf(initialQtaCnf) + .setInitialQtaTot(initialQtaTot) + + .setTotalQtaAvailable(totalQtaAvailable) + .setTotalNumCnfAvailable(totalNumCnfAvailable) + .setQtaCnfAvailable(qtaCnfAvailable) + .setPartitaMag(partitaMag) + .setCanOverflowOrderQuantity(canOverflowOrderQuantity) + .setCanLUBeClosed(canLUBeClosed); + + DialogInputQuantityV2View + .newInstance(dialogInputQuantityV2DTO, (resultDTO, shouldCloseLU) -> { + PickedQuantityDTO pickedQuantityDTO = new PickedQuantityDTO() + .setNumCnf(resultDTO.getNumCnf()) + .setQtaCnf(resultDTO.getQtaCnf()) + .setQtaTot(resultDTO.getQtaTot()) + .setPartitaMag(resultDTO.getPartitaMag()) + .setDataScad(resultDTO.getDataScad()); + + this.mViewModel.onItemDispatched(item, pickedQuantityDTO, sourceMtbColt); + }, this::onLoadingEnded) + .show(requireActivity().getSupportFragmentManager(), "tag"); + } + + @Override + public void onLURequest(boolean canLUBeCreated, boolean shouldCheckIfDocExist, RunnableArgss onComplete) { + DialogScanOrCreateLUView.newInstance(canLUBeCreated, shouldCheckIfDocExist, onComplete) + .show(requireActivity().getSupportFragmentManager(), "tag"); + } + + + @Override + public void onLUPrintError(Exception ex, Runnable onComplete) { + this.closeProgress(); + DialogSimpleMessageView.makeErrorDialog( + new SpannableString(ex.getMessage()), + null, + null, + R.string.button_ignore_print, + onComplete) + .show(requireActivity().getSupportFragmentManager(), "tag"); + } + + @Override + public void onNoLUFound(Runnable onComplete) { + String errorMessage = "Nessuna stampante configurata"; + DialogSimpleMessageView + .makeWarningDialog(new SpannableString(errorMessage), null, onComplete) + .show(requireActivity().getSupportFragmentManager(), "tag"); + } + + + @Override + public void onDataSaved() { + this.onLoadingEnded(); + this.requireActivity().runOnUiThread(() -> { + DialogCommon.showDataSaved(requireActivity(), this::popMe); + }); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeModule.java new file mode 100644 index 00000000..217ffe62 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeModule.java @@ -0,0 +1,24 @@ +package it.integry.integrywmsnative.gest.prod_recupero_materiale; + +import dagger.Module; +import dagger.Provides; +import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer; +import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; +import it.integry.integrywmsnative.core.rest.consumers.PrinterRESTConsumer; +import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; +import it.integry.integrywmsnative.gest.prod_recupero_materiale.rest.ProdRecuperMaterialeRESTConsumer; + +@Module(subcomponents = ProdRecuperoMaterialeComponent.class) +public class ProdRecuperoMaterialeModule { + + @Provides + ProdRecuperMaterialeRESTConsumer providesProdRecuperMaterialeRESTConsumer(SystemRESTConsumer systemRESTConsumer, ArticoloRESTConsumer articoloRESTConsumer) { + return new ProdRecuperMaterialeRESTConsumer(systemRESTConsumer, articoloRESTConsumer); + } + + @Provides + ProdRecuperoMaterialeViewModel providesProdRecuperoMaterialeViewModel(ProdRecuperMaterialeRESTConsumer prodRecuperMaterialeRESTConsumer, ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer, PrinterRESTConsumer printerRESTConsumer) { + return new ProdRecuperoMaterialeViewModel(prodRecuperMaterialeRESTConsumer, colliMagazzinoRESTConsumer, printerRESTConsumer); + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/viewmodel/ProdRecuperoMaterialeViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeViewModel.java similarity index 51% rename from app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/viewmodel/ProdRecuperoMaterialeViewModel.java rename to app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeViewModel.java index 1dcd67fe..344ede39 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/viewmodel/ProdRecuperoMaterialeViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ProdRecuperoMaterialeViewModel.java @@ -1,15 +1,9 @@ -package it.integry.integrywmsnative.gest.prod_recupero_materiale.viewmodel; - -import android.app.Dialog; -import android.text.SpannableString; +package it.integry.integrywmsnative.gest.prod_recupero_materiale; import androidx.databinding.ObservableArrayList; -import androidx.databinding.ObservableField; -import androidx.fragment.app.FragmentActivity; -import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.lifecycle.MutableLiveData; import com.annimon.stream.Stream; -import com.tfb.fbtoast.FBToast; import java.math.BigDecimal; import java.math.RoundingMode; @@ -17,13 +11,15 @@ 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.R; -import it.integry.integrywmsnative.core.barcode_reader.BarcodeCallbackDTO; -import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; +import it.integry.integrywmsnative.core.exception.NoLUFoundException; import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.expansion.RunnableArgss; +import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener; import it.integry.integrywmsnative.core.model.CommonModelConsts; +import it.integry.integrywmsnative.core.model.MtbAart; import it.integry.integrywmsnative.core.model.MtbColr; import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.report.ReportManager; @@ -33,114 +29,72 @@ import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityBarcode; import it.integry.integrywmsnative.core.utility.UtilityBigDecimal; import it.integry.integrywmsnative.core.utility.UtilityDate; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.integrywmsnative.core.utility.UtilityProgress; import it.integry.integrywmsnative.core.utility.UtilityString; -import it.integry.integrywmsnative.databinding.FragmentProdRecuperoMaterialeBinding; -import it.integry.integrywmsnative.gest.prod_recupero_materiale.core.HistoryULsListAdapter; -import it.integry.integrywmsnative.gest.prod_recupero_materiale.core.ProdRecuperoMaterialeHelper; import it.integry.integrywmsnative.gest.prod_recupero_materiale.dto.HistoryVersamentoProdULDTO; +import it.integry.integrywmsnative.gest.prod_recupero_materiale.rest.ProdRecuperMaterialeRESTConsumer; import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO; -import it.integry.integrywmsnative.view.dialogs.DialogCommon; -import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; -import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2DTO; -import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2View; -import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCreateLUView; public class ProdRecuperoMaterialeViewModel { - private FragmentActivity mContext; + private final ProdRecuperMaterialeRESTConsumer mProdRecuperMaterialeRESTConsumer; + private final ColliMagazzinoRESTConsumer mColliMagazzinoRESTConsumer; + private final PrinterRESTConsumer mPrinterRESTConsumer; - private FragmentProdRecuperoMaterialeBinding mBinding; - private ProdRecuperoMaterialeHelper mHelper; - private Runnable mOnRecuperoCompleted; + private final MutableLiveData> mUlList = new MutableLiveData<>(); + + private Listener mListener; - private HistoryULsListAdapter mAdapter; - private List mDataset; - - public ObservableField mtbColt = new ObservableField<>(); - - private int barcodeScannerIstanceID = -1; - - public void init(FragmentActivity context, FragmentProdRecuperoMaterialeBinding binding, ProdRecuperoMaterialeHelper helper, Runnable onRecuperoCompleted) { - mContext = context; - mBinding = binding; - mHelper = helper; - mOnRecuperoCompleted = onRecuperoCompleted; - - initRecyclerView(); - refreshAdapter(); - - initBarcode(); + @Inject + public ProdRecuperoMaterialeViewModel(ProdRecuperMaterialeRESTConsumer prodRecuperMaterialeRESTConsumer, ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer, PrinterRESTConsumer printerRESTConsumer) { + this.mProdRecuperMaterialeRESTConsumer = prodRecuperMaterialeRESTConsumer; + this.mColliMagazzinoRESTConsumer = colliMagazzinoRESTConsumer; + this.mPrinterRESTConsumer = printerRESTConsumer; } + public void init() { + this.sendOnLoadingStarted(); + new Thread(() -> { - public void setMtbColt(MtbColt mtbColt) { - this.mtbColt.set(mtbColt); + mProdRecuperMaterialeRESTConsumer.loadLastULVersate(ulList -> { + this.mUlList.setValue(ulList); + + this.sendOnLoadingEnded(); + }, this::sendError); + + }).start(); } - - private void initBarcode() { - BarcodeManager.enable(); - barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO() - .setOnScanSuccessfull(onScanSuccessful) - .setOnScanFailed(ex -> UtilityExceptions.defaultException(mContext, ex, false))); - - } - - - private void initRecyclerView() { - mAdapter = new HistoryULsListAdapter(mContext, new ArrayList<>(), mBinding.emptyView); - mAdapter.setOnItemClicked(data -> this.dispatchItem(data, null, null)); - - mBinding.prodRecuperoMaterialeMainList.setLayoutManager(new LinearLayoutManager(mContext)); - mBinding.prodRecuperoMaterialeMainList.setAdapter(mAdapter); - } - - - private final RunnableArgs onScanSuccessful = data -> { - BarcodeManager.disable(); - - Dialog progressDialog = UtilityProgress.createDefaultProgressDialog(mContext); - + public void processBarcodeDTO(BarcodeScanDTO data) { if (UtilityBarcode.isEtichettaAnonima(data) || UtilityBarcode.isEtichetta128(data)) { - this.executeEtichettaUL(data, progressDialog); + this.executeEtichettaUL(data); } + } - }; + private void executeEtichettaUL(BarcodeScanDTO barcodeScanDTO) { + this.sendOnLoadingStarted(); - private void executeEtichettaUL(BarcodeScanDTO barcodeScanDTO, Dialog progressDialog) { - ColliMagazzinoRESTConsumer.getBySSCCStatic(barcodeScanDTO.getStringValue(), true, false, mtbColt -> { + this.mColliMagazzinoRESTConsumer.getBySSCC(barcodeScanDTO.getStringValue(), true, false, mtbColt -> { + this.sendOnLoadingEnded(); if (mtbColt != null) { - HistoryVersamentoProdULDTO historyVersamentoProdULRestDTO = this.getHistoryElementFromMtbColt(mtbColt); if (historyVersamentoProdULRestDTO != null) { - this.dispatchItem(historyVersamentoProdULRestDTO, mtbColt, progressDialog); + this.dispatchItem(historyVersamentoProdULRestDTO, mtbColt); } else { - DialogCommon.showNoULFound(mContext, () -> { - BarcodeManager.enable(); - progressDialog.dismiss(); - }); + this.sendError(new NoLUFoundException()); } } else { - DialogCommon.showNoULFound(mContext, () -> { - BarcodeManager.enable(); - progressDialog.dismiss(); - }); + this.sendError(new NoLUFoundException()); } - }, ex -> { - UtilityExceptions.defaultException(mContext, ex, progressDialog); - BarcodeManager.enable(); - }); + }, this::sendError); } private HistoryVersamentoProdULDTO getHistoryElementFromMtbColt(MtbColt mtbColt) { - List filteredItems = Stream.of(mDataset) + List filteredItems = Stream.of(this.mUlList.getValue()) .filter(x -> Objects.equals(x.getNumColloRif(), mtbColt.getNumCollo()) && x.getDataColloRif().equals(mtbColt.getDataColloS()) && x.getSerColloRif().equalsIgnoreCase(mtbColt.getSerCollo()) && @@ -155,79 +109,39 @@ public class ProdRecuperoMaterialeViewModel { } -// private void dispatchItem(HistoryVersamentoProdULDTO item, MtbColt sourceMtbColt, Dialog dialogProgress) { -// BigDecimal qtaDaEvadere = BigDecimal.ZERO; -// -// qtaDaEvadere = qtaDaEvadere.add(item.getQtaCol()); -// -// -// DialogInputQuantity.DTO dto = new DialogInputQuantity.DTO() -// .setBatchLot(item.getPartitaMag()) -// .setQtaDaEvadere(null) -// .setQtaOrd(null) -// .setMtbAart(item.getMtbAart()) -// .setCanPartitaMagBeChanged(false) -// .setNumCnf(1) -// .setQtaCnf(item.getQtaCnf()) -// .setQtaTot(item.getQtaCnf()) -// .setMaxQta(qtaDaEvadere) -// .setQtaDisponibile(qtaDaEvadere); -// -// DialogInputQuantity.makeBase(mContext, dto, false, quantity -> { -// onItemDispatched(item, quantity.qtaTot.getBigDecimal(), sourceMtbColt, dialogProgress); -// }, () -> { -// if (dialogProgress != null) dialogProgress.dismiss(); -// }).show(); -// } - private void dispatchItem(HistoryVersamentoProdULDTO item, MtbColt sourceMtbColt, Dialog dialogProgress) { + public void dispatchItem(HistoryVersamentoProdULDTO item, MtbColt sourceMtbColt) { BigDecimal qtaDaEvadere = BigDecimal.ZERO; BigDecimal numCnfDaEvadere = BigDecimal.ZERO; qtaDaEvadere = qtaDaEvadere.add(item.getQtaCol()); - if(!UtilityBigDecimal.equalsTo(qtaDaEvadere, BigDecimal.ZERO)) { + if (!UtilityBigDecimal.equalsTo(qtaDaEvadere, BigDecimal.ZERO)) { numCnfDaEvadere = UtilityBigDecimal.divide(qtaDaEvadere, item.getQtaCnf()); } - DialogInputQuantityV2DTO dialogInputQuantityV2DTO = new DialogInputQuantityV2DTO() - .setMtbAart(item.getMtbAart()) - .setInitialNumCnf(BigDecimal.ONE) - .setInitialQtaCnf(item.getQtaCnf()) - .setInitialQtaTot(item.getQtaCnf()) - - .setTotalQtaAvailable(qtaDaEvadere) - .setTotalNumCnfAvailable(numCnfDaEvadere) - .setQtaCnfAvailable(item.getQtaCnf()) - .setPartitaMag(item.getPartitaMag()) -// .setDataScad(item.getDa) - .setCanOverflowOrderQuantity(false) - .setCanLUBeClosed(false); - - DialogInputQuantityV2View - .newInstance(dialogInputQuantityV2DTO, (resultDTO, shouldCloseLU) -> { - PickedQuantityDTO pickedQuantityDTO = new PickedQuantityDTO() - .setNumCnf(resultDTO.getNumCnf()) - .setQtaCnf(resultDTO.getQtaCnf()) - .setQtaTot(resultDTO.getQtaTot()) - .setPartitaMag(resultDTO.getPartitaMag()) - .setDataScad(resultDTO.getDataScad()); - - onItemDispatched(item, resultDTO.getQtaTot(), resultDTO.getNumCnf(), resultDTO.getQtaCnf(), sourceMtbColt, dialogProgress); - }, () -> { - if (dialogProgress != null) dialogProgress.dismiss(); - BarcodeManager.enable(); - }) - .show(mContext.getSupportFragmentManager(), "tag"); + this.sendOnItemDispatched(item, + sourceMtbColt, + item.getMtbAart(), + BigDecimal.ONE, + item.getQtaCnf(), + BigDecimal.ONE.multiply(item.getQtaCnf()), + qtaDaEvadere, + numCnfDaEvadere, + item.getQtaCnf(), + item.getPartitaMag(), + false, + false); } - private void onItemDispatched(HistoryVersamentoProdULDTO item, BigDecimal inputQtaTot, BigDecimal inputNumCnf, BigDecimal inputQtaCnf, MtbColt sourceMtbColt, Dialog progress) { + public void onItemDispatched(HistoryVersamentoProdULDTO item, PickedQuantityDTO pickedQuantityDTO, MtbColt sourceMtbColt) { - if (progress == null) { - progress = UtilityProgress.createDefaultProgressDialog(mContext); - } - Dialog finalProgress = progress; + this.sendOnLoadingStarted(); + + BigDecimal inputNumCnf = pickedQuantityDTO.getNumCnf(); + BigDecimal inputQtaTot = pickedQuantityDTO.getQtaTot(); + BigDecimal inputQtaCnf = pickedQuantityDTO.getQtaCnf(); final MtbColt mtbColtScarico = new MtbColt() .setDataCollo(item.getDataCollo()) @@ -245,7 +159,7 @@ public class ProdRecuperoMaterialeViewModel { BigDecimal qtaColToSave; BigDecimal numCnfToSave; - if (SettingsManager.iDB().isFlagForceAllToColli() || (item.getMtbAart() != null && !item.getMtbAart().isFlagQtaCnfFissaBoolean()) ){ + if (SettingsManager.iDB().isFlagForceAllToColli() || (item.getMtbAart() != null && !item.getMtbAart().isFlagQtaCnfFissaBoolean())) { numCnfToSave = UtilityBigDecimal.divideAndRoundToInteger(inputNumCnf.multiply(BigDecimal.valueOf(ordine.getPercentageHr())), BigDecimal.valueOf(100), RoundingMode.FLOOR); qtaColToSave = numCnfToSave.multiply(inputQtaCnf).setScale(0, BigDecimal.ROUND_FLOOR); } else { @@ -283,23 +197,30 @@ public class ProdRecuperoMaterialeViewModel { boolean updateQtaCnfFirstRow = false; - if(UtilityBigDecimal.lowerThan(totalSumOfNumCnf, inputNumCnf)) { + if (UtilityBigDecimal.lowerThan(totalSumOfNumCnf, inputNumCnf)) { BigDecimal diff = inputNumCnf.subtract(totalSumOfNumCnf).multiply(BigDecimal.valueOf(-1)); mtbColtScarico.getMtbColr().get(0).setNumCnf(mtbColtScarico.getMtbColr().get(0).getNumCnf().add(diff)); updateQtaCnfFirstRow = true; } - if(UtilityBigDecimal.lowerThan(totalSumOfQtaCol, inputQtaTot)) { + if (UtilityBigDecimal.lowerThan(totalSumOfQtaCol, inputQtaTot)) { BigDecimal diff = inputQtaTot.subtract(totalSumOfQtaCol).multiply(BigDecimal.valueOf(-1)); mtbColtScarico.getMtbColr().get(0).setQtaCol(mtbColtScarico.getMtbColr().get(0).getQtaCol().add(diff)); updateQtaCnfFirstRow = true; } - if(updateQtaCnfFirstRow) { + if (updateQtaCnfFirstRow) { mtbColtScarico.getMtbColr().get(0).setQtaCnf( UtilityBigDecimal.divide(mtbColtScarico.getMtbColr().get(0).getQtaCol(), mtbColtScarico.getMtbColr().get(0).getNumCnf())); } + for(int i = 0; i < mtbColtScarico.getMtbColr().size(); i++) { + if(mtbColtScarico.getMtbColr().get(i).getQtaCol().equals(BigDecimal.ZERO)) { + mtbColtScarico.getMtbColr().remove(i); + i--; + } + } + mtbColtScarico.setOperation(CommonModelConsts.OPERATION.INSERT_OR_UPDATE); @@ -344,79 +265,53 @@ public class ProdRecuperoMaterialeViewModel { colliToSave.add(mtbColtScarico); boolean finalShouldPrint = shouldPrint; - ColliMagazzinoRESTConsumer.saveColliStatic(colliToSave, value -> { - - FBToast.successToast(mContext, mContext.getResources().getString(R.string.data_saved), FBToast.LENGTH_SHORT); + this.mColliMagazzinoRESTConsumer.saveColli(colliToSave, value -> { +// FBToast.successToast(mContext, mContext.getResources().getString(R.string.data_saved), FBToast.LENGTH_SHORT); +// if (finalShouldPrint) { - printCollo(finalProgress, value.get(0), () -> { - this.refreshAdapter(); - mOnRecuperoCompleted.run(); - }); + printCollo(value.get(0), this::sendOnDataSaved); } else { - finalProgress.dismiss(); - this.refreshAdapter(); - mOnRecuperoCompleted.run(); + this.sendOnDataSaved(); } - }, ex -> { - UtilityExceptions.defaultException(mContext, ex, finalProgress); - }); + }, this::sendError); } else { - finalProgress.dismiss(); + this.sendOnLoadingEnded(); } }; if (sourceMtbColt != null) saveRunnable.run(sourceMtbColt, false); - else DialogScanOrCreateLUView.newInstance(true, false, saveRunnable) - .show(mContext.getSupportFragmentManager(), "tag"); - + else this.sendOnLURequest(true, false, saveRunnable); } - private void printCollo(Dialog progress, MtbColt mtbColtToPrint, Runnable onComplete) { + private void printCollo(MtbColt mtbColtToPrint, Runnable onComplete) { - PrinterRESTConsumer.getAvailablePrintersStatic(SettingsManager.i().getUserSession().getDepo().getCodMdep(), PrinterRESTConsumer.Type.PRIMARIA, printerList -> { + this.mPrinterRESTConsumer.getAvailablePrinters(SettingsManager.i().getUserSession().getDepo().getCodMdep(), PrinterRESTConsumer.Type.PRIMARIA, printerList -> { if (printerList.size() > 0) { try { singlePrint(mtbColtToPrint, printerList.get(0), () -> { onComplete.run(); - progress.dismiss(); - }, ex -> { - progress.dismiss(); - String errorMessage = ex.getMessage(); - DialogSimpleMessageView.makeErrorDialog( - new SpannableString(errorMessage), - null, - null, - R.string.button_ignore_print, - onComplete) - .show(mContext.getSupportFragmentManager(), "tag"); - }); + }, ex -> this.sendOnLUPrintError(ex, onComplete)); } catch (Exception ex) { - UtilityExceptions.defaultException(mContext, ex, progress); + this.sendError(ex); onComplete.run(); } } else { - progress.dismiss(); - String errorMessage = "Nessuna stampante configurata"; - DialogSimpleMessageView - .makeWarningDialog(new SpannableString(errorMessage), null, onComplete) - .show(mContext.getSupportFragmentManager(), "tag"); + this.sendOnNoLUFound(onComplete); } - }, ex -> { - UtilityExceptions.defaultException(mContext, ex, progress); - }); + }, this::sendError); } private void singlePrint(MtbColt mtbColtToPrint, String printerName, Runnable onComplete, RunnableArgs onAbort) { String reportName = ReportManager.getReportNameLUFromGestione(mtbColtToPrint.getGestioneEnum()); - PrinterRESTConsumer.printColloStatic( + this.mPrinterRESTConsumer.printCollo( printerName, mtbColtToPrint, 1, @@ -425,20 +320,86 @@ public class ProdRecuperoMaterialeViewModel { } - private void refreshAdapter() { - Dialog progressDialog = UtilityProgress.createDefaultProgressDialog(mContext); - mHelper.loadLastULVersate(historyULs -> { - this.mDataset = historyULs; - progressDialog.dismiss(); + public MutableLiveData> getOrderList() { + return mUlList; + } - this.mAdapter.updateItems(this.mDataset); - }, ex -> { - UtilityExceptions.defaultException(mContext, ex, progressDialog); - BarcodeManager.enable(); - }); + public ProdRecuperoMaterialeViewModel setListener(Listener listener) { + this.mListener = listener; + return this; + } + 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); + } + + private void sendOnItemDispatched(HistoryVersamentoProdULDTO item, + MtbColt sourceMtbColt, + MtbAart mtbAart, + BigDecimal initialNumCnf, + BigDecimal initialQtaCnf, + BigDecimal initialQtaTot, + BigDecimal totalQtaAvailable, + BigDecimal totalNumCnfAvailable, + BigDecimal qtaCnfAvailable, + String partitaMag, + boolean canOverflowOrderQuantity, + boolean canLUBeClosed) { + if (this.mListener != null) + mListener.onItemDispatched(item, sourceMtbColt, mtbAart, initialNumCnf, initialQtaCnf, initialQtaTot, totalQtaAvailable, totalNumCnfAvailable, qtaCnfAvailable, partitaMag, canOverflowOrderQuantity, canLUBeClosed); + } + + private void sendOnLURequest(boolean canLUBeCreated, boolean shouldCheckIfDocExist, RunnableArgss onComplete) { + if(this.mListener != null) mListener.onLURequest(canLUBeCreated, shouldCheckIfDocExist, onComplete); + } + + private void sendOnLUPrintError(Exception ex, Runnable onComplete) { + if (this.mListener != null) mListener.onLUPrintError(ex, onComplete); + } + + private void sendOnNoLUFound(Runnable onComplete) { + if (this.mListener != null) mListener.onNoLUFound(onComplete); + } + + private void sendOnDataSaved() { + if (this.mListener != null) mListener.onDataSaved(); } + + public interface Listener extends ILoadingListener { + + void onError(Exception ex); + + void onItemDispatched(HistoryVersamentoProdULDTO item, + MtbColt sourceMtbColt, + MtbAart mtbAart, + BigDecimal initialNumCnf, + BigDecimal initialQtaCnf, + BigDecimal initialQtaTot, + BigDecimal totalQtaAvailable, + BigDecimal totalNumCnfAvailable, + BigDecimal qtaCnfAvailable, + String partitaMag, + boolean canOverflowOrderQuantity, + boolean canLUBeClosed); + + void onLURequest(boolean canLUBeCreated, boolean shouldCheckIfDocExist, RunnableArgss onComplete); + + void onLUPrintError(Exception ex, Runnable onComplete); + + void onNoLUFound(Runnable onComplete); + + void onDataSaved(); + } + } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/core/ProdRecuperoMaterialeHelper.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/rest/ProdRecuperMaterialeRESTConsumer.java similarity index 62% rename from app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/core/ProdRecuperoMaterialeHelper.java rename to app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/rest/ProdRecuperMaterialeRESTConsumer.java index 428a96e9..9d707a58 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/core/ProdRecuperoMaterialeHelper.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/rest/ProdRecuperMaterialeRESTConsumer.java @@ -1,6 +1,4 @@ -package it.integry.integrywmsnative.gest.prod_recupero_materiale.core; - -import android.content.Context; +package it.integry.integrywmsnative.gest.prod_recupero_materiale.rest; import com.annimon.stream.Stream; import com.google.gson.reflect.TypeToken; @@ -11,21 +9,25 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import javax.inject.Singleton; + +import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.model.MtbAart; import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer; -import it.integry.integrywmsnative.core.rest.consumers.ISimpleOperationCallback; import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; -import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.rest.consumers._BaseRESTConsumer; import it.integry.integrywmsnative.gest.prod_recupero_materiale.dto.HistoryVersamentoProdULDTO; import it.integry.integrywmsnative.gest.prod_recupero_materiale.dto.HistoryVersamentoProdULRestDTO; -public class ProdRecuperoMaterialeHelper { +@Singleton +public class ProdRecuperMaterialeRESTConsumer extends _BaseRESTConsumer { + private final SystemRESTConsumer mSystemRESTConsumer; + private final ArticoloRESTConsumer mArticoloRESTConsumer; - private Context mContext; - - public ProdRecuperoMaterialeHelper(Context context) { - this.mContext = context; + public ProdRecuperMaterialeRESTConsumer(SystemRESTConsumer systemRESTConsumer, ArticoloRESTConsumer articoloRESTConsumer) { + this.mSystemRESTConsumer = systemRESTConsumer; + this.mArticoloRESTConsumer = articoloRESTConsumer; } @@ -176,125 +178,117 @@ public class ProdRecuperoMaterialeHelper { " max_ul.max_datetime_row = ul_list.datetime_row"; Type typeOfObjectsList = new TypeToken>() {}.getType(); - SystemRESTConsumer.processSqlStatic(sql, typeOfObjectsList, new ISimpleOperationCallback>() { - @Override - public void onSuccess(List ulList) { + this.mSystemRESTConsumer.>processSql(sql, typeOfObjectsList, ulList -> { - if(ulList == null) { - onComplete.run(null); - return; - } + if (ulList == null) { + onComplete.run(null); + return; + } - List newUlList = new ArrayList<>(); + List newUlList = new ArrayList<>(); - Stream.of(ulList) - .distinctBy(x -> { - HashMap hashMap = new HashMap<>(); - hashMap.put("gestione", x.getGestione()); - hashMap.put("data_collo", x.getDataCollo()); - hashMap.put("ser_collo", x.getSerCollo()); - hashMap.put("num_collo", x.getNumCollo()); - hashMap.put("cod_mart", x.getCodMart()); - hashMap.put("gestione_rif", x.getGestioneRif()); - hashMap.put("data_collo_rif", x.getDataColloRif()); - hashMap.put("ser_collo_rif", x.getSerColloRif()); - hashMap.put("num_collo_rif", x.getNumColloRif()); + Stream.of(ulList) + .distinctBy(x -> { + HashMap hashMap = new HashMap<>(); + hashMap.put("gestione", x.getGestione()); + hashMap.put("data_collo", x.getDataCollo()); + hashMap.put("ser_collo", x.getSerCollo()); + hashMap.put("num_collo", x.getNumCollo()); + hashMap.put("cod_mart", x.getCodMart()); + hashMap.put("gestione_rif", x.getGestioneRif()); + hashMap.put("data_collo_rif", x.getDataColloRif()); + hashMap.put("ser_collo_rif", x.getSerColloRif()); + hashMap.put("num_collo_rif", x.getNumColloRif()); - return hashMap; - }) - .forEach(restDTO -> { + return hashMap; + }) + .forEach(restDTO -> { - List ordineList = Stream.of(ulList) - .filter(x -> x.getNumCollo().equals(restDTO.getNumCollo()) && - x.getDataCollo().equals(restDTO.getDataCollo()) && - x.getSerCollo().equals(restDTO.getSerCollo()) && - x.getGestione().equals(restDTO.getGestione())) - .map(x -> new HistoryVersamentoProdULDTO.OrdineDto() - .setData(x.getDataOrdD()) - .setNumero(x.getNumOrd()) - .setGestione(x.getGestioneOrd()) - .setRigaOrd(x.getRigaOrd()) - .setQtaCol(x.getQtaCol()) - .setNumCnf(x.getNumCnf()) - .setPercentageHr(x.getPercentageHr())) - .toList(); + List ordineList = Stream.of(ulList) + .filter(x -> x.getNumCollo().equals(restDTO.getNumCollo()) && + x.getDataCollo().equals(restDTO.getDataCollo()) && + x.getSerCollo().equals(restDTO.getSerCollo()) && + x.getGestione().equals(restDTO.getGestione())) + .map(x -> new HistoryVersamentoProdULDTO.OrdineDto() + .setData(x.getDataOrdD()) + .setNumero(x.getNumOrd()) + .setGestione(x.getGestioneOrd()) + .setRigaOrd(x.getRigaOrd()) + .setQtaCol(x.getQtaCol()) + .setNumCnf(x.getNumCnf()) + .setPercentageHr(x.getPercentageHr())) + .toList(); - BigDecimal qtaColTot = BigDecimal.ZERO; - BigDecimal numCnfColTot = BigDecimal.ZERO; + BigDecimal qtaColTot = BigDecimal.ZERO; + BigDecimal numCnfColTot = BigDecimal.ZERO; - for (HistoryVersamentoProdULDTO.OrdineDto ordine : - ordineList) { - qtaColTot = qtaColTot.add(ordine.getQtaCol()); - numCnfColTot = numCnfColTot.add(ordine.getNumCnf()); - } - - newUlList.add(new HistoryVersamentoProdULDTO() - .setGestione(restDTO.getGestione()) - .setDataCollo(restDTO.getDataCollo()) - .setSerCollo(restDTO.getSerCollo()) - .setNumCollo(restDTO.getNumCollo()) - .setSegno(restDTO.getSegno()) - .setCodMart(restDTO.getCodMart()) - .setCodCol(restDTO.getCodCol()) - .setCodTagl(restDTO.getCodTagl()) - .setCodJfas(restDTO.getCodJfas()) - .setDescrizioneFase(restDTO.getDescrizioneFase()) - .setQtaCol(qtaColTot) - .setNumCnf(numCnfColTot) - .setPartitaMag(restDTO.getPartitaMag()) - .setCodJcom(restDTO.getCodJcom()) - .setDatetimeRow(restDTO.getDatetimeRow()) - .setUntMis(restDTO.getUntMis()) - .setGestioneRif(restDTO.getGestioneRif()) - .setDataColloRif(restDTO.getDataColloRif()) - .setSerColloRif(restDTO.getSerColloRif()) - .setNumColloRif(restDTO.getNumColloRif()) - .setOrdini(ordineList)); - - }); - - - - if(newUlList.size() > 0){ - List codMarts = Stream.of(newUlList) - .map(HistoryVersamentoProdULDTO::getCodMart) - .withoutNulls() - .distinct() - .toList(); - - ArticoloRESTConsumer.getByCodMartsStatic(codMarts, arts -> { - - if(arts != null && arts.size() > 0) { - for (HistoryVersamentoProdULDTO value : newUlList) { - - MtbAart foundMtbAart = null; - - List mtbAartStream = Stream.of(arts) - .filter(x -> x.getCodMart().equalsIgnoreCase(value.getCodMart())).toList(); - - if(mtbAartStream != null && mtbAartStream.size() > 0){ - foundMtbAart = mtbAartStream.get(0); - } - - value.setMtbAart(foundMtbAart); - } + for (HistoryVersamentoProdULDTO.OrdineDto ordine : + ordineList) { + qtaColTot = qtaColTot.add(ordine.getQtaCol()); + numCnfColTot = numCnfColTot.add(ordine.getNumCnf()); } - onComplete.run(newUlList); + newUlList.add(new HistoryVersamentoProdULDTO() + .setGestione(restDTO.getGestione()) + .setDataCollo(restDTO.getDataCollo()) + .setSerCollo(restDTO.getSerCollo()) + .setNumCollo(restDTO.getNumCollo()) + .setSegno(restDTO.getSegno()) + .setCodMart(restDTO.getCodMart()) + .setCodCol(restDTO.getCodCol()) + .setCodTagl(restDTO.getCodTagl()) + .setCodJfas(restDTO.getCodJfas()) + .setDescrizioneFase(restDTO.getDescrizioneFase()) + .setQtaCol(qtaColTot) + .setNumCnf(numCnfColTot) + .setPartitaMag(restDTO.getPartitaMag()) + .setCodJcom(restDTO.getCodJcom()) + .setDatetimeRow(restDTO.getDatetimeRow()) + .setUntMis(restDTO.getUntMis()) + .setGestioneRif(restDTO.getGestioneRif()) + .setDataColloRif(restDTO.getDataColloRif()) + .setSerColloRif(restDTO.getSerColloRif()) + .setNumColloRif(restDTO.getNumColloRif()) + .setOrdini(ordineList)); - }, onFailed); + }); + + + if (newUlList.size() > 0) { + List codMarts = Stream.of(newUlList) + .map(HistoryVersamentoProdULDTO::getCodMart) + .withoutNulls() + .distinct() + .toList(); + + this.mArticoloRESTConsumer.getByCodMarts(codMarts, arts -> { + + if (arts != null && arts.size() > 0) { + for (HistoryVersamentoProdULDTO value : newUlList) { + + MtbAart foundMtbAart = null; + + List mtbAartStream = Stream.of(arts) + .filter(x -> x.getCodMart().equalsIgnoreCase(value.getCodMart())).toList(); + + if (mtbAartStream != null && mtbAartStream.size() > 0) { + foundMtbAart = mtbAartStream.get(0); + } + + value.setMtbAart(foundMtbAart); + } + } - } else { onComplete.run(newUlList); - } + }, onFailed); + + } else { + onComplete.run(newUlList); } - @Override - public void onFailed(Exception ex) { - onFailed.run(ex); - } - }); + }, onFailed); } + } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/core/HistoryULsListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ui/HistoryULsListAdapter.java similarity index 57% rename from app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/core/HistoryULsListAdapter.java rename to app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ui/HistoryULsListAdapter.java index 254fb98a..5a36b45d 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/core/HistoryULsListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ui/HistoryULsListAdapter.java @@ -1,38 +1,31 @@ -package it.integry.integrywmsnative.gest.prod_recupero_materiale.core; +package it.integry.integrywmsnative.gest.prod_recupero_materiale.ui; import android.content.Context; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import androidx.databinding.DataBindingUtil; +import androidx.databinding.ObservableArrayList; import androidx.recyclerview.widget.RecyclerView; import com.annimon.stream.Stream; -import com.zhukic.sectionedrecyclerview.SectionedRecyclerViewAdapter; import java.util.List; import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.expansion.view.ExtendedSectionedRecyclerView; import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.databinding.ProdRecuperoMaterialeListHeaderBinding; import it.integry.integrywmsnative.databinding.ProdRecuperoMaterialeListItemBinding; import it.integry.integrywmsnative.gest.prod_recupero_materiale.dto.HistoryVersamentoProdULDTO; -import it.integry.integrywmsnative.gest.prod_recupero_materiale.dto.HistoryVersamentoProdULDTO; -import it.integry.integrywmsnative.ui.fastscroll.SectionTitleProvider; -public class HistoryULsListAdapter extends SectionedRecyclerViewAdapter implements SectionTitleProvider { +public class HistoryULsListAdapter extends ExtendedSectionedRecyclerView { private Context mContext; - private List mOriginalDataset; - private List mDataset; - private View mEmptyView; - - - private RunnableArgs mOnItemClicked; + private RunnableArgs mOnItemClicked; static class SubheaderHolder extends RecyclerView.ViewHolder { @@ -57,23 +50,14 @@ public class HistoryULsListAdapter extends SectionedRecyclerViewAdapter myDataset, View emptyView) { + public HistoryULsListAdapter(Context context, ObservableArrayList myDataset) { + super(myDataset); mContext = context; - mOriginalDataset = myDataset; - mEmptyView = emptyView; - mDataset = orderItems(myDataset); } - public void setOnItemClicked(RunnableArgs onItemClicked) { + public HistoryULsListAdapter setOnItemClicked(RunnableArgs onItemClicked) { this.mOnItemClicked = onItemClicked; - } - - public void updateItems(List updatedDataset) { - mDataset.clear(); - mDataset.addAll(orderItems(updatedDataset)); - notifyDataChanged(); - - mEmptyView.setVisibility(mDataset.size() > 0 ? View.GONE : View.VISIBLE); + return this; } @@ -102,26 +86,21 @@ public class HistoryULsListAdapter extends SectionedRecyclerViewAdapter { if(this.mOnItemClicked != null) this.mOnItemClicked.run(ul); @@ -133,19 +112,17 @@ public class HistoryULsListAdapter extends SectionedRecyclerViewAdapter 1) { + HistoryULsListModel compare1 = this.mDataset.get(position); + HistoryULsListModel compare2 = this.mDataset.get(position + 1); + if (UtilityString.equalsIgnoreCase(compare1.getGroupTitle(), compare2.getGroupTitle())) { + return false; + } + } + + return true; } - @Override - public int getItemSize() { - return mDataset.size(); - } - - @Override - public String getSectionTitle(int position) { - return null; - } - - } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ui/HistoryULsListModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ui/HistoryULsListModel.java new file mode 100644 index 00000000..4ec813e5 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_recupero_materiale/ui/HistoryULsListModel.java @@ -0,0 +1,92 @@ +package it.integry.integrywmsnative.gest.prod_recupero_materiale.ui; + +import java.math.BigDecimal; + +import it.integry.integrywmsnative.gest.prod_recupero_materiale.dto.HistoryVersamentoProdULDTO; + +public class HistoryULsListModel { + + private String groupTitle; + + private int numCollo; + private String codMart; + private String descrizione; + private String partitaMag; + + private BigDecimal qtaVersata; + private String untMisVersata; + + private HistoryVersamentoProdULDTO originalModel; + + public String getGroupTitle() { + return groupTitle; + } + + public HistoryULsListModel setGroupTitle(String groupTitle) { + this.groupTitle = groupTitle; + return this; + } + + public int getNumCollo() { + return numCollo; + } + + public HistoryULsListModel setNumCollo(int numCollo) { + this.numCollo = numCollo; + return this; + } + + public String getCodMart() { + return codMart; + } + + public HistoryULsListModel setCodMart(String codMart) { + this.codMart = codMart; + return this; + } + + public String getDescrizione() { + return descrizione; + } + + public HistoryULsListModel setDescrizione(String descrizione) { + this.descrizione = descrizione; + return this; + } + + public String getPartitaMag() { + return partitaMag; + } + + public HistoryULsListModel setPartitaMag(String partitaMag) { + this.partitaMag = partitaMag; + return this; + } + + public BigDecimal getQtaVersata() { + return qtaVersata; + } + + public HistoryULsListModel setQtaVersata(BigDecimal qtaVersata) { + this.qtaVersata = qtaVersata; + return this; + } + + public String getUntMisVersata() { + return untMisVersata; + } + + public HistoryULsListModel setUntMisVersata(String untMisVersata) { + this.untMisVersata = untMisVersata; + return this; + } + + public HistoryVersamentoProdULDTO getOriginalModel() { + return originalModel; + } + + public HistoryULsListModel setOriginalModel(HistoryVersamentoProdULDTO originalModel) { + this.originalModel = originalModel; + return this; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeComponent.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeComponent.java new file mode 100644 index 00000000..7586eec4 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeComponent.java @@ -0,0 +1,15 @@ +package it.integry.integrywmsnative.gest.prod_versamento_materiale; + +import dagger.Subcomponent; + +@Subcomponent +public interface ProdVersamentoMaterialeComponent { + + @Subcomponent.Factory + interface Factory { + ProdVersamentoMaterialeComponent create(); + } + + void inject(ProdVersamentoMaterialeFragment prodVersamentoMaterialeFragment); + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeFragment.java index 3f941bf7..d6b16d1f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeFragment.java @@ -2,92 +2,339 @@ package it.integry.integrywmsnative.gest.prod_versamento_materiale; import android.content.Context; import android.os.Bundle; +import android.text.Html; +import android.text.SpannableString; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Toast; import androidx.appcompat.widget.AppCompatTextView; import androidx.databinding.DataBindingUtil; -import androidx.fragment.app.Fragment; +import androidx.databinding.ObservableArrayList; +import androidx.databinding.ObservableField; +import androidx.recyclerview.widget.LinearLayoutManager; -import java.util.ArrayList; +import com.annimon.stream.Stream; + +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; -import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.interfaces.IPoppableActivity; -import it.integry.integrywmsnative.core.interfaces.ITitledFragment; -import it.integry.integrywmsnative.databinding.FragmentProdVersamentoMaterialeBinding; -import it.integry.integrywmsnative.gest.prod_versamento_materiale.core.ProdVersamentoMaterialHelper; -import it.integry.integrywmsnative.gest.prod_versamento_materiale.viewmodel.ProdVersamentoMaterialViewModel; +import javax.inject.Inject; -public class ProdVersamentoMaterialeFragment extends Fragment implements ITitledFragment { +import it.integry.integrywmsnative.MainApplication; +import it.integry.integrywmsnative.R; +import it.integry.integrywmsnative.core.di.BindableString; +import it.integry.integrywmsnative.core.expansion.BaseFragment; +import it.integry.integrywmsnative.core.interfaces.ITitledFragment; +import it.integry.integrywmsnative.core.model.MtbColt; +import it.integry.integrywmsnative.core.model.secondary.GestioneEnum; +import it.integry.integrywmsnative.core.settings.SettingsManager; +import it.integry.integrywmsnative.core.utility.UtilityBigDecimal; +import it.integry.integrywmsnative.core.utility.UtilityDate; +import it.integry.integrywmsnative.core.utility.UtilityNumber; +import it.integry.integrywmsnative.core.utility.UtilityResources; +import it.integry.integrywmsnative.core.utility.UtilityString; +import it.integry.integrywmsnative.databinding.FragmentProdVersamentoMaterialeBinding; +import it.integry.integrywmsnative.gest.prod_versamento_materiale.dto.OrdineLavorazioneDTO; +import it.integry.integrywmsnative.gest.prod_versamento_materiale.dto.VersamentoMerceOrdineLavListModel; +import it.integry.integrywmsnative.gest.prod_versamento_materiale.ui.ChooseOrdsLavFromListAdapter; +import it.integry.integrywmsnative.view.dialogs.DialogCommon; +import it.integry.integrywmsnative.view.dialogs.DialogConsts; +import it.integry.integrywmsnative.view.dialogs.ask_position_of_lu.DialogAskPositionOfLU; +import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; +import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCreateLUView; + +public class ProdVersamentoMaterialeFragment extends BaseFragment implements ProdVersamentoMaterialeViewModel.Listener, ITitledFragment { + + @Inject + ProdVersamentoMaterialeViewModel mViewModel; private FragmentProdVersamentoMaterialeBinding mBinding; - private ProdVersamentoMaterialViewModel mViewmodel; - private ProdVersamentoMaterialHelper mHelper; - private final List mOnPreDestroyList = new ArrayList<>(); + private final ObservableField mCurrentMtbColt = new ObservableField<>(); + private final ObservableArrayList mCurrentOrders = new ObservableArrayList<>(); + + public final BindableString codPrimaryArt = new BindableString(); + public final BindableString descrizionePrimaryArt = new BindableString(); + public final BindableString lottoPrimaryArt = new BindableString(); + public final BindableString quantityPrimaryArt = new BindableString(); + public final ObservableField fabVisible = new ObservableField<>(false); + public ProdVersamentoMaterialeFragment() { // Required empty public constructor } public static ProdVersamentoMaterialeFragment newInstance() { - ProdVersamentoMaterialeFragment fragment = new ProdVersamentoMaterialeFragment(); - Bundle args = new Bundle(); - fragment.setArguments(args); - return fragment; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - mViewmodel = new ProdVersamentoMaterialViewModel(); + return new ProdVersamentoMaterialeFragment(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment - mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_prod_versamento_materiale, container, false); + MainApplication.appComponent + .prodVersamentoMaterialeComponent() + .create() + .inject(this); + + this.mViewModel.setListener(this); + + mBinding.setLifecycleOwner(this); + mBinding.setView(this); - init(); return mBinding.getRoot(); } @Override - public void onDestroy() { - super.onDestroy(); + public void onStart() { + super.onStart(); - for (Runnable onPreDestroy : mOnPreDestroyList) { - onPreDestroy.run(); + this.mViewModel.init(SettingsManager.iDB().isFlagVersamentoDirettoProduzione()); + + this.initView(); + this.openLU(); + } + + private void initView() { + this.mViewModel.getOpenedOrderLavMutableLiveList().observe(getViewLifecycleOwner(), this::refreshList); + this.mViewModel.getMtbColtMutableLiveData().observe(getViewLifecycleOwner(), this.mCurrentMtbColt::set); + + this.mViewModel.getMtbColrMutableLiveData().observe(getViewLifecycleOwner(), firstMtbColr -> { + codPrimaryArt.set(firstMtbColr.getCodMart()); + descrizionePrimaryArt.set(firstMtbColr.getDescrizione()); + lottoPrimaryArt.set(firstMtbColr.getPartitaMag() + ((firstMtbColr.getMtbPartitaMag() != null) ? " - " + firstMtbColr.getMtbPartitaMag().getDescrizione() : "")); + + if (!SettingsManager.iDB().isFlagForceAllToColli() && (firstMtbColr.getMtbAart() == null || firstMtbColr.getMtbAart().isFlagQtaCnfFissaBoolean())) { + String text = UtilityNumber.decimalToString(firstMtbColr.getQtaCol()); + + if (firstMtbColr.getMtbAart() != null) { + text += !UtilityString.isNullOrEmpty(firstMtbColr.getMtbAart().getUntMis()) ? " " + firstMtbColr.getMtbAart().getUntMis() : ""; + } + + quantityPrimaryArt.set(text); + } else { + quantityPrimaryArt.set(UtilityNumber.decimalToString(firstMtbColr.getNumCnf()) + " " + UtilityResources.getString(R.string.unt_mis_col)); + } + }); + + initRecyclerView(); + + } + + + private void initRecyclerView() { + mBinding.listaArts.setNestedScrollingEnabled(false); + mBinding.listaArts.setHasFixedSize(true); + mBinding.listaArts.setLayoutManager(new LinearLayoutManager(requireActivity())); + + ChooseOrdsLavFromListAdapter adapter = new ChooseOrdsLavFromListAdapter( + requireActivity(), + this.mCurrentOrders, + SettingsManager.iDB().isFlagForceAllToColli()) + .setOnItemClickListener(clickedItem -> { + recalcAllQuantities(); + }); + adapter.setEmptyView(mBinding.emptyView); + mBinding.listaArts.setAdapter(adapter); + } + + private void refreshList(List orders) { + this.mCurrentOrders.clear(); + this.mCurrentOrders.addAll(convertDataModelToListModel(orders)); + } + + private List convertDataModelToListModel(List dataList) { + + return Stream.of(dataList) + .withoutNulls() + .map(x -> { + VersamentoMerceOrdineLavListModel listModel = new VersamentoMerceOrdineLavListModel(); + + listModel.setOriginalOrdineLavorazione(x); + listModel.setOriginalMtbAart(this.mViewModel.getMtbColrMutableLiveData().getValue().getMtbAart()); + + listModel.setPreDescriptionText( + getString(R.string.ord_testata, String.valueOf(x.getNumOrd()), UtilityDate.formatDate(x.getDataOrdD(), UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN))); + + listModel.setDescriptionText(x.getCodProd() + " " + x.getDescrizioneProd()); + + listModel.setSubDescriptionText(UtilityString.isNullOrEmpty(x.getPartitaMag()) ? "" : getString(R.string.batch_lot_text, x.getPartitaMag())); + + listModel.setSubDescription2Text(UtilityString.isNullOrEmpty(x.getNoteLav()) ? "" : getString(R.string.notes_text, x.getNoteLav())); + + return listModel; + }) + .toList(); + } + + private void openLU() { + DialogScanOrCreateLUView.newInstance(false, false, true, false, (mtbColt, created) -> { + if (mtbColt == null) { + popMe(); + } else if ((mtbColt.getGestioneEnum() == GestioneEnum.ACQUISTO || mtbColt.getGestioneEnum() == GestioneEnum.LAVORAZIONE || mtbColt.getGestioneEnum() == GestioneEnum.VENDITA) && mtbColt.getSegno().equals(+1)) { + + if (mtbColt.getMtbColr() == null || mtbColt.getMtbColr().size() == 0) { + DialogSimpleMessageView.makeWarningDialog( + new SpannableString(Html.fromHtml("E' stata scansionata una UL giĂ  vuota")), + null, this::openLU) + .show((requireActivity()).getSupportFragmentManager(), "tag"); + + } else { + mViewModel.setMtbColt(mtbColt); + choosePosition(); + } + + } else { + this.onError(new Exception("Sono accettate solamente UL di Acquisto o Lavorazione di CARICO")); + } + }).show(requireActivity().getSupportFragmentManager(), "tag"); + } + + private void choosePosition() { + DialogAskPositionOfLU.makeBase(requireActivity(), true, (status, mtbDepoPosizione) -> { + + if (status == DialogConsts.Results.ABORT) { + popMe(); + } else { + mViewModel.setPosizione(mtbDepoPosizione); + } + + }, this::onError).show(); + } + + + private void recalcAllQuantities() { + if(this.mViewModel.getMtbColrMutableLiveData().getValue() == null) return; + + BigDecimal residuoCol = this.mViewModel.getMtbColrMutableLiveData().getValue().getQtaCol(); + BigDecimal residuoCnf = this.mViewModel.getMtbColrMutableLiveData().getValue().getNumCnf(); + BigDecimal qtaCnf = this.mViewModel.getMtbColrMutableLiveData().getValue().getQtaCnf(); + + BigDecimal offsetCol = BigDecimal.ZERO.add(residuoCol); //Forced clone + BigDecimal offsetCnf = BigDecimal.ZERO.add(residuoCnf); //Forced clone + + List selectedOrders = Stream.of(this.mCurrentOrders) + .filter(x -> x.getSelected().get()) + .toList(); + + int totalHr = Stream.of(selectedOrders) + .mapToInt(x -> x.getOriginalOrdineLavorazione().getHrNum()) + .sum(); + + if(selectedOrders.size() > 0 && totalHr <= 0) { + this.onError(new Exception("Il totale delle risorse umane è pari a 0")); + return; + } + + fabVisible.set(selectedOrders.size() > 0); + + for(VersamentoMerceOrdineLavListModel versamentoMerceOrdineLavListModel : this.mCurrentOrders) { + versamentoMerceOrdineLavListModel.setNumCnfBigDecimal(BigDecimal.ZERO); + versamentoMerceOrdineLavListModel.setQtaBigDecimal(BigDecimal.ZERO); + + versamentoMerceOrdineLavListModel.getOriginalOrdineLavorazione().setQtaColVersamento(0f); + versamentoMerceOrdineLavListModel.getOriginalOrdineLavorazione().setNumCnfVersamento(0f); + } + + for(VersamentoMerceOrdineLavListModel versamentoMerceOrdineLavListModel : selectedOrders) { + int usagePerc = (versamentoMerceOrdineLavListModel.getOriginalOrdineLavorazione().getHrNum() * 100) / totalHr; + BigDecimal usedCol; + BigDecimal usedCnf; + + if (SettingsManager.iDB().isFlagForceAllToColli() || (versamentoMerceOrdineLavListModel.getOriginalMtbAart() != null && !versamentoMerceOrdineLavListModel.getOriginalMtbAart().isFlagQtaCnfFissaBoolean())){ + usedCnf = UtilityBigDecimal.divideAndRoundToInteger(residuoCnf.multiply(BigDecimal.valueOf(usagePerc)), BigDecimal.valueOf(100), RoundingMode.FLOOR); + + if(UtilityBigDecimal.equalsOrLowerThan(usedCnf, BigDecimal.ZERO) && UtilityBigDecimal.greaterThan(offsetCnf, BigDecimal.ZERO)) { + usedCnf = BigDecimal.ONE; + } + + usedCol = usedCnf.multiply(qtaCnf).setScale(0,BigDecimal.ROUND_FLOOR); + } else { + usedCol = UtilityBigDecimal.divideAndRoundToInteger(residuoCol.multiply(BigDecimal.valueOf(usagePerc)), BigDecimal.valueOf(100), RoundingMode.FLOOR); + + if (UtilityBigDecimal.equalsOrLowerThan(usedCol, BigDecimal.ZERO) && UtilityBigDecimal.greaterThan(offsetCol, BigDecimal.ZERO)){ + usedCol = BigDecimal.ONE; + } + + usedCnf = UtilityBigDecimal.divide(usedCol, qtaCnf, RoundingMode.FLOOR); + } + + offsetCol = offsetCol.subtract(usedCol); + offsetCnf = offsetCnf.subtract(usedCnf); + + versamentoMerceOrdineLavListModel.setNumCnfBigDecimal(usedCnf); + versamentoMerceOrdineLavListModel.setQtaBigDecimal(usedCol); + + versamentoMerceOrdineLavListModel.getOriginalOrdineLavorazione().setQtaColVersamento(usedCol.floatValue()); + versamentoMerceOrdineLavListModel.getOriginalOrdineLavorazione().setNumCnfVersamento(usedCnf.floatValue()); + } + + + if (selectedOrders.size() > 0) { + VersamentoMerceOrdineLavListModel majorOrder = + Stream.of(selectedOrders) + .max((o1, o2) -> Integer.compare(o1.getOriginalOrdineLavorazione().getHrNum(), o2.getOriginalOrdineLavorazione().getHrNum())).get(); + + if (offsetCnf.floatValue() != 0 || offsetCol.floatValue() != 0){ + if ( SettingsManager.iDB().isFlagForceAllToColli() || (majorOrder.getOriginalMtbAart() != null && !majorOrder.getOriginalMtbAart().isFlagQtaCnfFissaBoolean())) { + majorOrder.setNumCnfBigDecimal(majorOrder.getNumCnfBigDecimal().add(offsetCnf)); + majorOrder.setQtaBigDecimal(majorOrder.getQtaBigDecimal().add(offsetCol)); + } else { + majorOrder.setQtaBigDecimal(majorOrder.getQtaBigDecimal().add(offsetCol)); + majorOrder.setNumCnfBigDecimal(UtilityBigDecimal.divide(majorOrder.getQtaBigDecimal(), qtaCnf)); + } + } } } + public void onConfirmClicked() { + List selectedOrders = Stream.of(this.mCurrentOrders) + .filter(x -> x.getSelected().get()) + .map(VersamentoMerceOrdineLavListModel::getOriginalOrdineLavorazione) + .toList(); - - private void init() { - mHelper = new ProdVersamentoMaterialHelper(getActivity()); - mViewmodel.init(getActivity(), mBinding, mHelper, () -> { - ((IPoppableActivity) getActivity()).pop(); - }); - - mViewmodel.openLU(); + if(selectedOrders.size() > 0) { + this.mViewModel.save(selectedOrders); + } else { + Toast.makeText(requireActivity(), "Nessun ordine selezionato!", Toast.LENGTH_SHORT).show(); + } } + @Override public void onCreateActionBar(AppCompatTextView titleText, Context context) { titleText.setText(context.getText(R.string.prod_versamento_materiale_title_fragment).toString()); } @Override - public void addOnPreDestroy(Runnable onPreDestroy) { - this.mOnPreDestroyList.add(onPreDestroy); + public void requestLUOpen() { + this.openLU(); } + + @Override + public void onWarning(String warningText, Runnable action) { + this.requireActivity().runOnUiThread(() -> { + this.closeProgress(); + DialogSimpleMessageView + .makeWarningDialog(new SpannableString(Html.fromHtml(warningText)), null, action) + .show(requireActivity().getSupportFragmentManager(), "tag"); + }); + } + + @Override + public void onDataSaved() { + this.onLoadingEnded(); + this.requireActivity().runOnUiThread(() -> { + DialogCommon.showDataSaved(requireActivity(), this::popMe); + }); + } + } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeModule.java new file mode 100644 index 00000000..9ed35af9 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeModule.java @@ -0,0 +1,16 @@ +package it.integry.integrywmsnative.gest.prod_versamento_materiale; + +import dagger.Module; +import dagger.Provides; +import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; +import it.integry.integrywmsnative.core.rest.consumers.MesRESTConsumer; + +@Module(subcomponents = ProdVersamentoMaterialeComponent.class) +public class ProdVersamentoMaterialeModule { + + @Provides + ProdVersamentoMaterialeViewModel providesProdVersamentoMaterialeViewModel(ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer, MesRESTConsumer mesRESTConsumer) { + return new ProdVersamentoMaterialeViewModel(colliMagazzinoRESTConsumer, mesRESTConsumer); + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeViewModel.java new file mode 100644 index 00000000..6d5c4742 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ProdVersamentoMaterialeViewModel.java @@ -0,0 +1,215 @@ +package it.integry.integrywmsnative.gest.prod_versamento_materiale; + +import androidx.lifecycle.MutableLiveData; + +import org.jetbrains.annotations.NotNull; + +import java.util.Iterator; +import java.util.List; + +import javax.inject.Inject; + +import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener; +import it.integry.integrywmsnative.core.model.MtbAart; +import it.integry.integrywmsnative.core.model.MtbColr; +import it.integry.integrywmsnative.core.model.MtbColt; +import it.integry.integrywmsnative.core.model.MtbDepoPosizione; +import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; +import it.integry.integrywmsnative.core.rest.consumers.MesRESTConsumer; +import it.integry.integrywmsnative.core.utility.UtilityBigDecimal; +import it.integry.integrywmsnative.core.utility.UtilityString; +import it.integry.integrywmsnative.gest.prod_versamento_materiale.dto.OrdineLavorazioneDTO; + +public class ProdVersamentoMaterialeViewModel { + + private final ColliMagazzinoRESTConsumer mColliMagazzinoRESTConsumer; + private final MesRESTConsumer mMesRESTConsumer; + + private boolean mFlagVersamentoDirettoProduzione; + + private final MutableLiveData mtbColtMutableLiveData = new MutableLiveData<>(); + private final MutableLiveData mtbColrMutableLiveData = new MutableLiveData<>(); + private final MutableLiveData> openedOrderLavMutableLiveList = new MutableLiveData<>(); + private final MutableLiveData mtbDepoPosizioneMutableLiveData = new MutableLiveData<>(); + + private Listener mListener; + + @Inject + public ProdVersamentoMaterialeViewModel(ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer, MesRESTConsumer mesRESTConsumer) { + this.mColliMagazzinoRESTConsumer = colliMagazzinoRESTConsumer; + this.mMesRESTConsumer = mesRESTConsumer; + } + + + public void init(boolean flagVersamentoDirettoProduzione) { + this.mFlagVersamentoDirettoProduzione = flagVersamentoDirettoProduzione; + } + + + public void setMtbColt(MtbColt mtbColt) { + this.mtbColtMutableLiveData.setValue(mtbColt); + } + + + public void setPosizione(MtbDepoPosizione mtbDepoPosizione) { + this.mtbDepoPosizioneMutableLiveData.postValue(mtbDepoPosizione); + MtbColt mtbColt = mtbColtMutableLiveData.getValue(); + + this.sendOnLoadingStarted(); + + if (mtbDepoPosizione != null && mtbDepoPosizione.isFlagLineaProduzione() && mtbColt != null) { + if (!mFlagVersamentoDirettoProduzione) { + createColloScarico(mtbDepoPosizione); + } else { + if (mtbColt.getMtbColr() == null || mtbColt.getMtbColr().size() <= 0) { + this.sendWarning("Il collo selezionato non presenta articoli versabili sulla linea.", this::sendRequestLUOpen); + return; + } else if (mtbColt.getMtbColr().size() > 1) { + this.sendWarning("Il collo selezionato contiene piĂ¹ articoli, solo il primo verrĂ  versato in questa sessione.
Per versare i colli restanti ripetere l'operazione di versamento.", + () -> { + cyclicGetOrdiniLavByCollo(mtbColt.getMtbColr().iterator(), mtbDepoPosizione); + }); + return; + + } + + mMesRESTConsumer.getOrdiniLavorazioneMateriale( + mtbDepoPosizione.getPosizione(), + getIdMaterialeFromCollo(mtbColt), + ordini -> { + setCurrentOrders(ordini, mtbColt.getMtbColr().get(0)); + this.sendOnLoadingEnded(); + }, + e -> this.sendWarning(e.getMessage(), this::sendRequestLUOpen)); + } + } else { + this.sendWarning("Si è verificato un errore. Riprovare", this::sendRequestLUOpen); + } + } + + private void createColloScarico(MtbDepoPosizione mtbDepoPosizione) { + + this.sendOnLoadingStarted(); + + this.mColliMagazzinoRESTConsumer.createColloScaricoDaCarico(mtbColtMutableLiveData.getValue(), mtbDepoPosizione, + generatedMtbColt -> { + this.sendOnLoadingEnded(); + this.sendOnDataSaved(); + }, this::sendError); + } + + + + private String getIdMaterialeFromCollo(MtbColt mtbColt) { + MtbAart articolo = mtbColt.getMtbColr().get(0).getMtbAart(); + return UtilityString.isNullOrEmpty(articolo.getIdArtEqui()) ? articolo.getCodMart() : articolo.getIdArtEqui(); + } + + private void setCurrentOrders(List ordini, MtbColr currentMtbColr) { + currentMtbColr.setQtaCnf(UtilityBigDecimal.divide(currentMtbColr.getQtaCol(), currentMtbColr.getNumCnf())); + this.mtbColrMutableLiveData.setValue(currentMtbColr); + this.openedOrderLavMutableLiveList.setValue(ordini); + } + + + private void cyclicGetOrdiniLavByCollo(@NotNull Iterator mtbColrIterator, MtbDepoPosizione mtbDepoPosizione) { + MtbColr currentMtbColr = mtbColrIterator.next(); + MtbAart currentMtbAart = currentMtbColr.getMtbAart(); + + this.mMesRESTConsumer.getOrdiniLavorazioneMateriale( + mtbDepoPosizione.getPosizione(), + UtilityString.isNullOrEmpty(currentMtbAart.getIdArtEqui()) ? currentMtbAart.getCodMart() : currentMtbAart.getIdArtEqui(), + ordini -> { + if (ordini == null || ordini.isEmpty()) { + if (mtbColrIterator.hasNext()) { + cyclicGetOrdiniLavByCollo(mtbColrIterator, mtbDepoPosizione); + } else { + setCurrentOrders(ordini, currentMtbColr); + } + } else { + setCurrentOrders(ordini, currentMtbColr); + } + } + , e -> this.sendWarning(e.getMessage(), this::sendRequestLUOpen)); + } + + + + public void save(List selectedOrders) { + this.sendOnLoadingStarted(); + + this.mColliMagazzinoRESTConsumer.createColliScaricoDaOrdineLavorazione( + this.mtbColtMutableLiveData.getValue(), + this.mtbColrMutableLiveData.getValue(), + this.mtbDepoPosizioneMutableLiveData.getValue(), + selectedOrders, + mtbColtSaved -> { + this.sendOnDataSaved(); + }, this::sendError); + } + + + + + + + + + + + + + public MutableLiveData getMtbColtMutableLiveData() { + return mtbColtMutableLiveData; + } + + public MutableLiveData getMtbColrMutableLiveData() { + return mtbColrMutableLiveData; + } + + public MutableLiveData> getOpenedOrderLavMutableLiveList() { + return openedOrderLavMutableLiveList; + } + + + public ProdVersamentoMaterialeViewModel setListener(Listener listener) { + this.mListener = listener; + return this; + } + + private void sendRequestLUOpen() { + if (this.mListener != null) mListener.requestLUOpen(); + } + + private void sendOnLoadingStarted() { + if (this.mListener != null) mListener.onLoadingStarted(); + } + + private void sendOnLoadingEnded() { + if (this.mListener != null) mListener.onLoadingEnded(); + } + + private void sendWarning(String warningText, Runnable action) { + if (this.mListener != null) mListener.onWarning(warningText, action); + } + + private void sendError(Exception ex) { + if (this.mListener != null) mListener.onError(ex); + } + + private void sendOnDataSaved() { + if (this.mListener != null) mListener.onDataSaved(); + } + + public interface Listener extends ILoadingListener { + + void requestLUOpen(); + + void onError(Exception ex); + + void onWarning(String warningText, Runnable action); + + void onDataSaved(); + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/core/ChooseOrdsLavFromListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/core/ChooseOrdsLavFromListAdapter.java deleted file mode 100644 index 6b277af5..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/core/ChooseOrdsLavFromListAdapter.java +++ /dev/null @@ -1,226 +0,0 @@ -package it.integry.integrywmsnative.gest.prod_versamento_materiale.core; - -import android.content.Context; -import android.text.Html; -import android.text.SpannableString; -import android.view.LayoutInflater; -import android.view.ViewGroup; - -import androidx.appcompat.app.AppCompatActivity; -import androidx.databinding.DataBindingUtil; -import androidx.databinding.Observable; -import androidx.recyclerview.widget.RecyclerView; - -import com.annimon.stream.Stream; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.text.ParseException; -import java.util.HashMap; -import java.util.List; - -import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.exception.DateNotRecognizedException; -import it.integry.integrywmsnative.core.exception.TimeNotRecognizedException; -import it.integry.integrywmsnative.core.model.CheckableOrdineLavoro; -import it.integry.integrywmsnative.core.model.MtbColr; -import it.integry.integrywmsnative.core.model.MtbColt; -import it.integry.integrywmsnative.core.settings.SettingsManager; -import it.integry.integrywmsnative.core.utility.UtilityBigDecimal; -import it.integry.integrywmsnative.core.utility.UtilityDate; -import it.integry.integrywmsnative.core.utility.UtilityNumber; -import it.integry.integrywmsnative.core.utility.UtilityResources; -import it.integry.integrywmsnative.core.utility.UtilityString; -import it.integry.integrywmsnative.databinding.FragmentChooseOrdsLavFromListItemModelBinding; -import it.integry.integrywmsnative.gest.prod_versamento_materiale.dto.OrdineLavorazioneDTO; -import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; - -public class ChooseOrdsLavFromListAdapter extends RecyclerView.Adapter { - - protected Context mContext; - - private MtbColt mMtbColt; - private MtbColr mMtbColr; - private List mDataset; - private HashMap mDatasetPositions = new HashMap<>(); - - - public ChooseOrdsLavFromListAdapter(Context context, List myDataset, MtbColt mtbColt, MtbColr mtbColr) throws ParseException, TimeNotRecognizedException, DateNotRecognizedException { - mContext = context; - mMtbColt = mtbColt; - mMtbColr = mtbColr; - if (myDataset != null) { - mDataset = Stream.of(myDataset) - .withoutNulls() - .map(CheckableOrdineLavoro::new).toList(); - } - } - - private void onItemChecked(CheckableOrdineLavoro itemModel) { - if (itemModel.isChecked() && itemModel.getItem().getOrdineLav().getHrNum() <= 0){ - DialogSimpleMessageView.makeWarningDialog( - new SpannableString(Html.fromHtml("Nessuna risorsa umana registrata per l'ordine selezionato!
Per una corretta suddivisione delle quantitĂ  registra le risorse.")), - null, () -> { - itemModel.getChecked().set(false); - }) - .show(((AppCompatActivity) mContext).getSupportFragmentManager(), "tag"); - return; - } - if (!itemModel.isChecked()) { - itemModel.setQtaCol(0); - itemModel.setNumCnf(0); - } - calculateMtbColtShare(); - notifyDataSetChanged(); - } - - - private void calculateMtbColtShare() { - MtbColr mtbColr = mMtbColr; - BigDecimal residuoCol = mtbColr.getQtaCol(); - BigDecimal residuoCnf = mtbColr.getNumCnf(); - - BigDecimal offsetCol = BigDecimal.ZERO.add(residuoCol); //Forced clone - BigDecimal offsetCnf = BigDecimal.ZERO.add(residuoCnf); //Forced clone - - mtbColr.setQtaCnf(UtilityBigDecimal.divide(mtbColr.getQtaCol(), mtbColr.getNumCnf())); - - List ordiniSelezionati = getSelectedData(); - int totalHr = Stream.of(ordiniSelezionati) - .mapToInt(x -> x.getItem().getOrdineLav().getHrNum()) - .sum(); - - for (CheckableOrdineLavoro c : ordiniSelezionati) { - BigDecimal usedCol, usedCnf; - int perc = (c.getItem().getOrdineLav().getHrNum() * 100) / totalHr; - - if (SettingsManager.iDB().isFlagForceAllToColli() || (mtbColr.getMtbAart() != null && !mtbColr.getMtbAart().isFlagQtaCnfFissaBoolean()) ){ - usedCnf = UtilityBigDecimal.divideAndRoundToInteger(residuoCnf.multiply(BigDecimal.valueOf(perc)), BigDecimal.valueOf(100), RoundingMode.FLOOR); - - if(UtilityBigDecimal.equalsOrLowerThan(usedCnf, BigDecimal.ZERO) && UtilityBigDecimal.greaterThan(offsetCnf, BigDecimal.ZERO)) { - usedCnf = BigDecimal.ONE; - } - - usedCol = usedCnf.multiply(mtbColr.getQtaCnf()).setScale(0,BigDecimal.ROUND_FLOOR); - } else { - usedCol = UtilityBigDecimal.divideAndRoundToInteger(residuoCol.multiply(BigDecimal.valueOf(perc)), BigDecimal.valueOf(100), RoundingMode.FLOOR); - - if (UtilityBigDecimal.equalsOrLowerThan(usedCol, BigDecimal.ZERO) && UtilityBigDecimal.greaterThan(offsetCol, BigDecimal.ZERO)){ - usedCol = BigDecimal.ONE; - } - - usedCnf = UtilityBigDecimal.divide(usedCol, mtbColr.getQtaCnf(), RoundingMode.FLOOR); - } - - offsetCol = offsetCol.subtract(usedCol); - offsetCnf = offsetCnf.subtract(usedCnf); - - c.setQtaCol(usedCol.floatValue()); - c.setNumCnf(usedCnf.floatValue()); - } - - if (ordiniSelezionati.size() > 0) { - CheckableOrdineLavoro majorOrder = Stream.of(ordiniSelezionati).max((o1, o2) -> Integer.compare(o1.getItem().getOrdineLav().getHrNum(), o2.getItem().getOrdineLav().getHrNum())).get(); - if (majorOrder == null) { - majorOrder = ordiniSelezionati.get(0); - } - - if (offsetCnf.floatValue() != 0 || offsetCol.floatValue() != 0){ - if ( SettingsManager.iDB().isFlagForceAllToColli() || (mtbColr.getMtbAart() != null && !mtbColr.getMtbAart().isFlagQtaCnfFissaBoolean())) { - majorOrder.setNumCnf(majorOrder.getNumCnf().get() + offsetCnf.floatValue()); - majorOrder.setQtaCol(majorOrder.getQtaCol().get() + offsetCol.floatValue()); - } else { - majorOrder.setQtaCol(majorOrder.getQtaCol().get() + offsetCol.floatValue()); - majorOrder.setNumCnf(majorOrder.getQtaCol().get() / mtbColr.getQtaCnf().floatValue()); - } - } - } - } - - public class ViewHolder extends RecyclerView.ViewHolder { - protected FragmentChooseOrdsLavFromListItemModelBinding mViewDataBinding; - - - public ViewHolder(FragmentChooseOrdsLavFromListItemModelBinding v) { - super(v.getRoot()); - mViewDataBinding = v; - } - - public void bind(CheckableOrdineLavoro checkableOrdineLavoro, MtbColr mtbColr) throws ParseException, TimeNotRecognizedException, DateNotRecognizedException { - mViewDataBinding.setCheckableOrdineLav(checkableOrdineLavoro); - mViewDataBinding.setMtbColr(mtbColr); - - OrdineLavorazioneDTO ordine = checkableOrdineLavoro.getItem().getOrdineLav(); - - checkableOrdineLavoro.setTestata(UtilityString.formatHtmlStringFromResId(R.string.ord_testata, String.valueOf(ordine.getNumOrd()), UtilityDate.formatDate(ordine.getDataOrdD(), UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN)).toString()); - - checkableOrdineLavoro.getChecked().resetOnPropertyChangedCallback(); - checkableOrdineLavoro.getChecked().addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() { - @Override - public void onPropertyChanged(Observable sender, int propertyId) { - onItemChecked(checkableOrdineLavoro); - } - }); - - if (!SettingsManager.iDB().isFlagForceAllToColli() && (mtbColr.getMtbAart() == null || mtbColr.getMtbAart().isFlagQtaCnfFissaBoolean())) { - String text = UtilityNumber.decimalToString(checkableOrdineLavoro.getQtaCol().get()); - - if (mtbColr.getMtbAart() != null) { - text += !UtilityString.isNullOrEmpty(mtbColr.getMtbAart().getUntMis()) ? "\n" + mtbColr.getMtbAart().getUntMis() : ""; - } - - mViewDataBinding.qtaTextview.setText(text); - } else { - mViewDataBinding.qtaTextview.setText(UtilityNumber.decimalToString(checkableOrdineLavoro.getNumCnf().get()) + "\n" + UtilityResources.getString(R.string.unt_mis_col)); - } - - mViewDataBinding.executePendingBindings(); - } - } - - @Override - public ChooseOrdsLavFromListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - // create a new view - FragmentChooseOrdsLavFromListItemModelBinding viewDataBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.fragment_choose_ords_lav_from_list__item_model, parent, false); - - return new ViewHolder(viewDataBinding); - } - - @Override - public void onBindViewHolder(ChooseOrdsLavFromListAdapter.ViewHolder holder, int position) { - CheckableOrdineLavoro item = mDataset.get(position); - try { - holder.bind(item, mMtbColr); - } catch (ParseException e) { - e.printStackTrace(); - } catch (TimeNotRecognizedException e) { - e.printStackTrace(); - } catch (DateNotRecognizedException e) { - e.printStackTrace(); - } - - } - - @Override - public void onViewRecycled(ChooseOrdsLavFromListAdapter.ViewHolder holder) { - super.onViewRecycled(holder); - } - - @Override - public int getItemCount() { - return mDataset.size(); - } - - public List getSelectedItems() { - return Stream.of(mDataset) - .filter(y -> y.getChecked().get()) - .map(x -> x.getItem().getOrdineLav()).toList(); - } - - public List getSelectedData() { - return Stream.of(mDataset) - .filter(y -> y.getChecked().get()) - .map(x -> x).toList(); - } - -} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/core/ProdVersamentoMaterialHelper.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/core/ProdVersamentoMaterialHelper.java deleted file mode 100644 index a5754ea6..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/core/ProdVersamentoMaterialHelper.java +++ /dev/null @@ -1,14 +0,0 @@ -package it.integry.integrywmsnative.gest.prod_versamento_materiale.core; - -import android.content.Context; - -public class ProdVersamentoMaterialHelper { - - - private Context mContext; - - public ProdVersamentoMaterialHelper(Context context) { - this.mContext = context; - } - -} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/dto/MtbColrVersamentoMaterialeListModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/dto/MtbColrVersamentoMaterialeListModel.java new file mode 100644 index 00000000..e12088a1 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/dto/MtbColrVersamentoMaterialeListModel.java @@ -0,0 +1,90 @@ +package it.integry.integrywmsnative.gest.prod_versamento_materiale.dto; + +import androidx.databinding.ObservableField; + +import java.math.BigDecimal; + +import it.integry.integrywmsnative.core.di.BindableBoolean; +import it.integry.integrywmsnative.core.model.MtbColr; + +public class MtbColrVersamentoMaterialeListModel { + + private String preDescriptionText; + private String descriptionText; + private String subDescriptionText; + + private final ObservableField kgBigDecimal = new ObservableField<>(BigDecimal.ZERO); + private final ObservableField qtaBigDecimal = new ObservableField<>(BigDecimal.ZERO); + + private MtbColr originalMtbColr; + private OrdineLavorazioneDTO originalOrdineLavorazione; + + private BindableBoolean selected = new BindableBoolean(); + + public String getPreDescriptionText() { + return preDescriptionText; + } + + public MtbColrVersamentoMaterialeListModel setPreDescriptionText(String preDescriptionText) { + this.preDescriptionText = preDescriptionText; + return this; + } + + public String getDescriptionText() { + return descriptionText; + } + + public MtbColrVersamentoMaterialeListModel setDescriptionText(String descriptionText) { + this.descriptionText = descriptionText; + return this; + } + + public String getSubDescriptionText() { + return subDescriptionText; + } + + public MtbColrVersamentoMaterialeListModel setSubDescriptionText(String subDescriptionText) { + this.subDescriptionText = subDescriptionText; + return this; + } + + public BigDecimal getKgBigDecimal() { + return kgBigDecimal.get(); + } + + public MtbColrVersamentoMaterialeListModel setKgBigDecimal(BigDecimal kgBigDecimal) { + this.kgBigDecimal.set(kgBigDecimal); + return this; + } + + public BigDecimal getQtaBigDecimal() { + return qtaBigDecimal.get(); + } + + public MtbColrVersamentoMaterialeListModel setQtaBigDecimal(BigDecimal qtaBigDecimal) { + this.qtaBigDecimal.set(qtaBigDecimal); + return this; + } + + public MtbColr getOriginalMtbColr() { + return originalMtbColr; + } + + public MtbColrVersamentoMaterialeListModel setOriginalMtbColr(MtbColr originalMtbColr) { + this.originalMtbColr = originalMtbColr; + return this; + } + + public OrdineLavorazioneDTO getOriginalOrdineLavorazione() { + return originalOrdineLavorazione; + } + + public MtbColrVersamentoMaterialeListModel setOriginalOrdineLavorazione(OrdineLavorazioneDTO originalOrdineLavorazione) { + this.originalOrdineLavorazione = originalOrdineLavorazione; + return this; + } + + public BindableBoolean getSelected() { + return selected; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/dto/VersamentoMerceOrdineLavListModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/dto/VersamentoMerceOrdineLavListModel.java new file mode 100644 index 00000000..05f77745 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/dto/VersamentoMerceOrdineLavListModel.java @@ -0,0 +1,104 @@ +package it.integry.integrywmsnative.gest.prod_versamento_materiale.dto; + +import java.math.BigDecimal; + +import it.integry.integrywmsnative.core.di.BindableBigDecimal; +import it.integry.integrywmsnative.core.di.BindableBoolean; +import it.integry.integrywmsnative.core.model.MtbAart; + +public class VersamentoMerceOrdineLavListModel { + + private String preDescriptionText; + private String descriptionText; + private String subDescriptionText; + private String subDescription2Text; + + private final BindableBigDecimal qtaBigDecimal = new BindableBigDecimal(BigDecimal.ZERO); + private final BindableBigDecimal numCnfBigDecimal = new BindableBigDecimal(BigDecimal.ZERO); + + private OrdineLavorazioneDTO originalOrdineLavorazione; + private MtbAart originalMtbAart; + + private BindableBoolean selected = new BindableBoolean(); + + public String getPreDescriptionText() { + return preDescriptionText; + } + + public VersamentoMerceOrdineLavListModel setPreDescriptionText(String preDescriptionText) { + this.preDescriptionText = preDescriptionText; + return this; + } + + public String getDescriptionText() { + return descriptionText; + } + + public VersamentoMerceOrdineLavListModel setDescriptionText(String descriptionText) { + this.descriptionText = descriptionText; + return this; + } + + public String getSubDescriptionText() { + return subDescriptionText; + } + + public VersamentoMerceOrdineLavListModel setSubDescriptionText(String subDescriptionText) { + this.subDescriptionText = subDescriptionText; + return this; + } + + public String getSubDescription2Text() { + return subDescription2Text; + } + + public VersamentoMerceOrdineLavListModel setSubDescription2Text(String subDescription2Text) { + this.subDescription2Text = subDescription2Text; + return this; + } + + public BigDecimal getQtaBigDecimal() { + return qtaBigDecimal.get(); + } + + public BindableBigDecimal getQtaBigDecimalObservable() { + return qtaBigDecimal; + } + + public VersamentoMerceOrdineLavListModel setQtaBigDecimal(BigDecimal qtaBigDecimal) { + this.qtaBigDecimal.set(qtaBigDecimal); + return this; + } + + public BigDecimal getNumCnfBigDecimal() { + return numCnfBigDecimal.get(); + } + + public VersamentoMerceOrdineLavListModel setNumCnfBigDecimal(BigDecimal numCnfBigDecimal) { + this.numCnfBigDecimal.set(numCnfBigDecimal); + return this; + } + + public OrdineLavorazioneDTO getOriginalOrdineLavorazione() { + return originalOrdineLavorazione; + } + + public VersamentoMerceOrdineLavListModel setOriginalOrdineLavorazione(OrdineLavorazioneDTO originalOrdineLavorazione) { + this.originalOrdineLavorazione = originalOrdineLavorazione; + return this; + } + + public MtbAart getOriginalMtbAart() { + return originalMtbAart; + } + + public VersamentoMerceOrdineLavListModel setOriginalMtbAart(MtbAart originalMtbAart) { + this.originalMtbAart = originalMtbAart; + return this; + } + + public BindableBoolean getSelected() { + return selected; + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ui/ChooseOrdsLavFromListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ui/ChooseOrdsLavFromListAdapter.java new file mode 100644 index 00000000..0c72698d --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ui/ChooseOrdsLavFromListAdapter.java @@ -0,0 +1,120 @@ +package it.integry.integrywmsnative.gest.prod_versamento_materiale.ui; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.databinding.DataBindingUtil; +import androidx.databinding.ObservableArrayList; +import androidx.recyclerview.widget.RecyclerView; + +import java.math.BigDecimal; + +import it.integry.integrywmsnative.R; +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.expansion.view.ExtendedRecyclerView; +import it.integry.integrywmsnative.core.model.MtbAart; +import it.integry.integrywmsnative.core.utility.UtilityNumber; +import it.integry.integrywmsnative.core.utility.UtilityResources; +import it.integry.integrywmsnative.core.utility.UtilityString; +import it.integry.integrywmsnative.databinding.FragmentChooseOrdsLavFromListItemModelBinding; +import it.integry.integrywmsnative.gest.prod_versamento_materiale.dto.VersamentoMerceOrdineLavListModel; + +public class ChooseOrdsLavFromListAdapter extends ExtendedRecyclerView { + + private final Context mContext; + private final boolean mForceAllToColli; + + private RunnableArgs mOnItemChecked; + + + public ChooseOrdsLavFromListAdapter(Context context, ObservableArrayList myDataset, boolean forceAllToColli) { + super(myDataset); + mContext = context; + mForceAllToColli = forceAllToColli; + } + + + public class ViewHolder extends RecyclerView.ViewHolder { + protected FragmentChooseOrdsLavFromListItemModelBinding mViewDataBinding; + + + public ViewHolder(FragmentChooseOrdsLavFromListItemModelBinding v) { + super(v.getRoot()); + mViewDataBinding = v; + } + + public void bind(VersamentoMerceOrdineLavListModel versamentoMerceOrdineLavListModel) { + mViewDataBinding.setListModel(versamentoMerceOrdineLavListModel); + + + + versamentoMerceOrdineLavListModel.getQtaBigDecimalObservable().resetOnPropertyChangedCallback(); + versamentoMerceOrdineLavListModel.getQtaBigDecimalObservable().addOnPropertyChangedCallback(() -> { + setQtaText(versamentoMerceOrdineLavListModel.getOriginalMtbAart(), versamentoMerceOrdineLavListModel.getQtaBigDecimal(), versamentoMerceOrdineLavListModel.getNumCnfBigDecimal()); + }); + setQtaText(versamentoMerceOrdineLavListModel.getOriginalMtbAart(), versamentoMerceOrdineLavListModel.getQtaBigDecimal(), versamentoMerceOrdineLavListModel.getNumCnfBigDecimal()); + + + + versamentoMerceOrdineLavListModel.getQtaBigDecimalObservable().addOnPropertyChangedCallback(() -> { + setPeso(versamentoMerceOrdineLavListModel.getOriginalMtbAart(), versamentoMerceOrdineLavListModel.getQtaBigDecimal()); + }); + setPeso(versamentoMerceOrdineLavListModel.getOriginalMtbAart(), versamentoMerceOrdineLavListModel.getQtaBigDecimal()); + + + mViewDataBinding.getRoot().setOnClickListener(v -> { + versamentoMerceOrdineLavListModel.getSelected().set(!versamentoMerceOrdineLavListModel.getSelected().get()); + }); + + mViewDataBinding.executePendingBindings(); + mViewDataBinding.checkbox.jumpDrawablesToCurrentState(); + } + + private void setQtaText(MtbAart mtbAart, BigDecimal qtaText, BigDecimal numCnf) { + if (!mForceAllToColli && (mtbAart == null || mtbAart.isFlagQtaCnfFissaBoolean())) { + String text = UtilityNumber.decimalToString(qtaText); + + if (mtbAart != null) { + text += !UtilityString.isNullOrEmpty(mtbAart.getUntMis()) ? "\n" + mtbAart.getUntMis() : ""; + } + + mViewDataBinding.qtaTextview.setText(text); + } else { + mViewDataBinding.qtaTextview.setText(UtilityNumber.decimalToString(numCnf) + "\n" + UtilityResources.getString(R.string.unt_mis_col)); + } + } + + private void setPeso(MtbAart mtbAart, BigDecimal pesoKg) { + mViewDataBinding.pesoKg.setText(UtilityNumber.decimalToString(pesoKg) + " " + mtbAart.getUntMis()); + } + } + + @Override + public ChooseOrdsLavFromListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + // create a new view + FragmentChooseOrdsLavFromListItemModelBinding viewDataBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.fragment_choose_ords_lav_from_list__item_model, parent, false); + return new ViewHolder(viewDataBinding); + } + + @Override + public void onBindViewHolder(ChooseOrdsLavFromListAdapter.ViewHolder holder, int position) { + final VersamentoMerceOrdineLavListModel mtbColrVersamentoMaterialeListModel = mDataset.get(position); + + mtbColrVersamentoMaterialeListModel.getSelected().resetOnPropertyChangedCallback(); + + mtbColrVersamentoMaterialeListModel.getSelected().addOnPropertyChangedCallback(() -> { + if(this.mOnItemChecked != null) this.mOnItemChecked.run(mtbColrVersamentoMaterialeListModel); + }); + + holder.bind(mtbColrVersamentoMaterialeListModel); + } + + + public ChooseOrdsLavFromListAdapter setOnItemClickListener(RunnableArgs onItemChecked) { + this.mOnItemChecked = onItemChecked; + return this; + } + + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/core/ChooseOrdsLavFromListItemModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ui/ChooseOrdsLavFromListItemModel.java similarity index 98% rename from app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/core/ChooseOrdsLavFromListItemModel.java rename to app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ui/ChooseOrdsLavFromListItemModel.java index 747fd4ce..5698e2f4 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/core/ChooseOrdsLavFromListItemModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/ui/ChooseOrdsLavFromListItemModel.java @@ -1,4 +1,4 @@ -package it.integry.integrywmsnative.gest.prod_versamento_materiale.core; +package it.integry.integrywmsnative.gest.prod_versamento_materiale.ui; import it.integry.integrywmsnative.core.di.BindableBoolean; import it.integry.integrywmsnative.gest.prod_versamento_materiale.dto.OrdineLavorazioneDTO; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/viewmodel/ProdVersamentoMaterialViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/viewmodel/ProdVersamentoMaterialViewModel.java deleted file mode 100644 index b522b1b1..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_versamento_materiale/viewmodel/ProdVersamentoMaterialViewModel.java +++ /dev/null @@ -1,261 +0,0 @@ -package it.integry.integrywmsnative.gest.prod_versamento_materiale.viewmodel; - -import android.app.Dialog; -import android.text.Html; -import android.text.SpannableString; -import android.view.View; -import android.widget.Toast; - -import androidx.appcompat.app.AppCompatActivity; -import androidx.databinding.ObservableField; -import androidx.fragment.app.FragmentActivity; -import androidx.recyclerview.widget.LinearLayoutManager; - -import org.jetbrains.annotations.NotNull; - -import java.text.ParseException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import it.integry.integrywmsnative.R; -import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; -import it.integry.integrywmsnative.core.exception.DateNotRecognizedException; -import it.integry.integrywmsnative.core.exception.TimeNotRecognizedException; -import it.integry.integrywmsnative.core.interfaces.IPoppableActivity; -import it.integry.integrywmsnative.core.model.MtbAart; -import it.integry.integrywmsnative.core.model.MtbColr; -import it.integry.integrywmsnative.core.model.MtbColt; -import it.integry.integrywmsnative.core.model.MtbDepoPosizione; -import it.integry.integrywmsnative.core.model.secondary.GestioneEnum; -import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; -import it.integry.integrywmsnative.core.rest.consumers.MesRESTConsumer; -import it.integry.integrywmsnative.core.settings.SettingsManager; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.integrywmsnative.core.utility.UtilityNumber; -import it.integry.integrywmsnative.core.utility.UtilityProgress; -import it.integry.integrywmsnative.core.utility.UtilityResources; -import it.integry.integrywmsnative.core.utility.UtilityString; -import it.integry.integrywmsnative.databinding.FragmentProdVersamentoMaterialeBinding; -import it.integry.integrywmsnative.gest.prod_versamento_materiale.core.ChooseOrdsLavFromListAdapter; -import it.integry.integrywmsnative.gest.prod_versamento_materiale.core.ChooseOrdsLavFromListItemModel; -import it.integry.integrywmsnative.gest.prod_versamento_materiale.core.ProdVersamentoMaterialHelper; -import it.integry.integrywmsnative.gest.prod_versamento_materiale.dto.OrdineLavorazioneDTO; -import it.integry.integrywmsnative.view.dialogs.DialogCommon; -import it.integry.integrywmsnative.view.dialogs.DialogConsts; -import it.integry.integrywmsnative.view.dialogs.ask_position_of_lu.DialogAskPositionOfLU; -import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; -import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCreateLUView; - - -public class ProdVersamentoMaterialViewModel { - - - private FragmentActivity mContext; - - private FragmentProdVersamentoMaterialeBinding mBinding; - private ProdVersamentoMaterialHelper mHelper; - private Runnable mOnVersamentoCompleted; - private List mDataset = new ArrayList<>(); - private ChooseOrdsLavFromListAdapter currentAdapter; - public ObservableField mtbColt = new ObservableField<>(); - public MtbColr mMtbColr; - - - public void init(FragmentActivity context, FragmentProdVersamentoMaterialeBinding binding, ProdVersamentoMaterialHelper helper, Runnable onVersamentoCompleted) { - mContext = context; - mBinding = binding; - mHelper = helper; - mOnVersamentoCompleted = onVersamentoCompleted; - - BarcodeManager.enable(); - } - - public void setMtbColr(MtbColr mtbColr) { - mMtbColr = mtbColr; - mBinding.descrArt.setText(mtbColr.getDescrizione()); - mBinding.codArt.setText(mtbColr.getCodMart()); - mBinding.batch.setText(mtbColr.getPartitaMag() + ((mtbColr.getMtbPartitaMag() != null) ? " - " + mtbColr.getMtbPartitaMag().getDescrizione() : "")); - if (!SettingsManager.iDB().isFlagForceAllToColli() && (mtbColr.getMtbAart() == null || mtbColr.getMtbAart().isFlagQtaCnfFissaBoolean())) { - String text = UtilityNumber.decimalToString(mtbColr.getQtaCol()); - - if (mtbColr.getMtbAart() != null) { - text += !UtilityString.isNullOrEmpty(mtbColr.getMtbAart().getUntMis()) ? " " + mtbColr.getMtbAart().getUntMis() : ""; - } - - mBinding.qtaCol.setText(text); - } else { - mBinding.qtaCol.setText(UtilityNumber.decimalToString(mtbColr.getNumCnf()) + " " + UtilityResources.getString(R.string.unt_mis_col)); - } - } - - public void openLU() { - DialogScanOrCreateLUView.newInstance(false, false, true, false, (mtbColt, created) -> { - if (mtbColt == null) { - ((IPoppableActivity) mContext).pop(); - } else if ((mtbColt.getGestioneEnum() == GestioneEnum.ACQUISTO || mtbColt.getGestioneEnum() == GestioneEnum.LAVORAZIONE || mtbColt.getGestioneEnum() == GestioneEnum.VENDITA) && mtbColt.getSegno().equals(+1)) { - - if (mtbColt.getMtbColr() == null || mtbColt.getMtbColr().size() == 0) { - DialogSimpleMessageView.makeWarningDialog( - new SpannableString(Html.fromHtml("E' stata scansionata una UL giĂ  vuota")), - null, this::openLU) - .show((mContext).getSupportFragmentManager(), "tag"); - - } else { - setMtbColt(mtbColt); - choosePosition(); - } - } else { - DialogSimpleMessageView - .makeWarningDialog(new SpannableString(Html.fromHtml("Sono accettate solamente UL di Acquisto o Lavorazione di CARICO")), - null, this::openLU) - .show((mContext).getSupportFragmentManager(), "tag"); - } - }).show(mContext.getSupportFragmentManager(), "tag"); - } - - private void choosePosition() { - DialogAskPositionOfLU.makeBase(mContext, true, (status, mtbDepoPosizione) -> { - - if (status == DialogConsts.Results.ABORT) { - ((IPoppableActivity) mContext).pop(); - } else { - if (mtbDepoPosizione != null && mtbDepoPosizione.isFlagLineaProduzione() && mtbColt.get() != null) { - if (!SettingsManager.iDB().isFlagVersamentoDirettoProduzione()) { - createColloScarico(mtbDepoPosizione); - } else { - if (mtbColt == null || mtbColt.get() == null || mtbColt.get().getMtbColr() == null || mtbColt.get().getMtbColr().size() <= 0) { - DialogSimpleMessageView - .makeWarningDialog(new SpannableString(Html.fromHtml("Il collo selezionato non presenta articoli versabili sulla linea.")), - null, this::openLU) - .show(mContext.getSupportFragmentManager(), "tag"); - return; - } else if (mtbColt.get().getMtbColr().size() > 1) { - - DialogSimpleMessageView - .makeWarningDialog(new SpannableString(Html.fromHtml("Il collo selezionato contiene piĂ¹ articoli, solo il primo verrĂ  versato in questa sessione.
Per versare i colli restanti ripetere l'operazione di versamento.")), - null, () -> { - cyclicGetOrdiniLavByCollo(mtbColt.get().getMtbColr().iterator(), mtbDepoPosizione); - }) - .show(mContext.getSupportFragmentManager(), "tag"); - return; - - } - - MesRESTConsumer.getOrdiniLavorazioneMateriale( - mtbDepoPosizione.getPosizione(), - getIdMaterialeFromCollo(mtbColt.get()), - ordini -> richiediOrdiniPerVersamento(ordini, mtbDepoPosizione), - e -> DialogSimpleMessageView.makeWarningDialog(new SpannableString(Html.fromHtml(e.getMessage())), - null, - this::openLU) - .show(mContext.getSupportFragmentManager(), "tag")); - } - } else { - DialogSimpleMessageView - .makeWarningDialog(new SpannableString(Html.fromHtml("Si è verificato un errore. Riprovare")), - null, this::openLU) - .show(((AppCompatActivity) mContext).getSupportFragmentManager(), "tag"); - } - } - - - }, ex -> { - UtilityExceptions.defaultException(mContext, ex); - }).show(); - } - - private String getIdMaterialeFromCollo(MtbColt mtbColt) { - MtbAart articolo = mtbColt.getMtbColr().get(0).getMtbAart(); - return UtilityString.isNullOrEmpty(articolo.getIdArtEqui()) ? articolo.getCodMart() : articolo.getIdArtEqui(); - } - - private void createColloScarico(MtbDepoPosizione mtbDepoPosizione) { - - Dialog progressDialog = UtilityProgress.createDefaultProgressDialog(mContext); - - ColliMagazzinoRESTConsumer.createColloScaricoDaCarico(mtbColt.get(), mtbDepoPosizione, generatedMtbColt -> DialogCommon.showDataSaved(mContext, () -> { - progressDialog.dismiss(); - mOnVersamentoCompleted.run(); - }), ex -> UtilityExceptions.defaultException(mContext, ex)); - } - - public void setMtbColt(MtbColt mtbColt) { - this.mtbColt.set(mtbColt); - this.setMtbColr(mtbColt.getMtbColr().get(0)); - } - - public void resetMtbColt() { - this.mtbColt.set(null); - this.mMtbColr = null; - openLU(); - } - - private void richiediOrdiniPerVersamento(List ordini, MtbDepoPosizione mtbDepoPosizione) { - - if (ordini == null || ordini.size() <= 0) { - mBinding.positiveFab.setVisibility(View.GONE); - mBinding.positiveFab.setOnClickListener(null); - mBinding.emptyView.setVisibility(View.VISIBLE); - return; - } - mBinding.positiveFab.setVisibility(View.VISIBLE); - - mBinding.positiveFab.setOnClickListener(c -> onPositiveClick(mtbDepoPosizione)); - for (OrdineLavorazioneDTO ordineLav : ordini) { - mDataset.add(new ChooseOrdsLavFromListItemModel().setOrdineLav(ordineLav)); - } - mBinding.emptyView.setVisibility(mDataset != null && mDataset.size() > 0 ? View.GONE : View.VISIBLE); - try { - initRecyclerView(); - } catch (Exception e) { - UtilityExceptions.defaultException(mContext, e); - } - - } - - private void onPositiveClick(MtbDepoPosizione mtbDepoPosizione) { - List ordLavs = currentAdapter.getSelectedItems(); - if (ordLavs.size() > 0) { - Dialog progressDialog = UtilityProgress.createDefaultProgressDialog(mContext); - ColliMagazzinoRESTConsumer.createColliScaricoDaOrdineLavorazione(mtbColt.get(), mMtbColr, mtbDepoPosizione, ordLavs, generatedMtbColt -> DialogCommon.showDataSaved(mContext, () -> { - progressDialog.dismiss(); - mOnVersamentoCompleted.run(); - }), ex -> UtilityExceptions.defaultException(mContext, ex)); - } else { - Toast.makeText(mContext, "Nessun ordine selezionato!", Toast.LENGTH_SHORT).show(); - } - } - - private void initRecyclerView() throws ParseException, TimeNotRecognizedException, DateNotRecognizedException { - mBinding.dialogChooseArtsFromListaArtMainList.setNestedScrollingEnabled(false); - - mBinding.dialogChooseArtsFromListaArtMainList.setHasFixedSize(true); - - mBinding.dialogChooseArtsFromListaArtMainList.setLayoutManager(new LinearLayoutManager(mContext)); - - currentAdapter = new ChooseOrdsLavFromListAdapter(mContext, mDataset, mtbColt.get(), mMtbColr); - mBinding.dialogChooseArtsFromListaArtMainList.setAdapter(currentAdapter); - } - - private void cyclicGetOrdiniLavByCollo(@NotNull Iterator righeCollo, MtbDepoPosizione mtbDepoPosizione) { - MtbColr colr = righeCollo.next(); - setMtbColr(colr); - MtbAart articolo = colr.getMtbAart(); - - MesRESTConsumer.getOrdiniLavorazioneMateriale(mtbDepoPosizione.getPosizione(), UtilityString.isNullOrEmpty(articolo.getIdArtEqui()) ? articolo.getCodMart() : articolo.getIdArtEqui(), ordini -> { - if (ordini == null || ordini.isEmpty()) { - if (righeCollo.hasNext()) { - cyclicGetOrdiniLavByCollo(righeCollo, mtbDepoPosizione); - } else { - richiediOrdiniPerVersamento(ordini, mtbDepoPosizione); - } - } else { - richiediOrdiniPerVersamento(ordini, mtbDepoPosizione); - } - } - , e -> DialogSimpleMessageView.makeWarningDialog(new SpannableString(Html.fromHtml(e.getMessage())), - null, this::openLU) - .show(((AppCompatActivity) mContext).getSupportFragmentManager(), "tag")); - } -} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java index db7525ca..916e6125 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeFragment.java @@ -16,7 +16,6 @@ import androidx.core.content.ContextCompat; import androidx.core.content.res.ResourcesCompat; import androidx.databinding.DataBindingUtil; import androidx.databinding.ObservableField; -import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import com.google.android.material.textfield.TextInputLayout; @@ -25,7 +24,6 @@ import com.tfb.fbtoast.FBToast; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; -import java.util.List; import javax.inject.Inject; @@ -35,6 +33,7 @@ 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.di.BindableBoolean; +import it.integry.integrywmsnative.core.expansion.BaseFragment; import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.expansion.RunnableArgss; import it.integry.integrywmsnative.core.interfaces.ILifecycleFragment; @@ -46,13 +45,12 @@ import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.model.MtbDepoPosizione; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.integrywmsnative.core.utility.UtilityProgress; import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.core.utility.UtilityToast; import it.integry.integrywmsnative.databinding.FragmentMainRettificaGiacenzeBinding; +import it.integry.integrywmsnative.gest.rettifica_giacenze.dto.FornitoreDTO; import it.integry.integrywmsnative.gest.rettifica_giacenze.ui.AutoCompleteFornitoreAdapter; import it.integry.integrywmsnative.gest.rettifica_giacenze.ui.RettificaGiacenzeMainListAdapter; -import it.integry.integrywmsnative.gest.rettifica_giacenze.dto.FornitoreDTO; import it.integry.integrywmsnative.gest.spedizione.exceptions.InvalidPesoKGException; import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO; import it.integry.integrywmsnative.gest.spedizione.model.PickingObjectDTO; @@ -67,7 +65,7 @@ import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQua import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCreateLUView; import it.integry.integrywmsnative.view.dialogs.yes_no.DialogYesNo; -public class RettificaGiacenzeFragment extends Fragment implements ITitledFragment, ILifecycleFragment, RettificaGiacenzeViewModel.Listener, BottomSheetMtbColrEditView.Listener { +public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFragment, ILifecycleFragment, RettificaGiacenzeViewModel.Listener, BottomSheetMtbColrEditView.Listener { private FragmentMainRettificaGiacenzeBinding mBinding = null; @@ -85,8 +83,6 @@ public class RettificaGiacenzeFragment extends Fragment implements ITitledFragme private Dialog mCurrentProgress; - private List mOnPreDestroyList = new ArrayList<>(); - public RettificaGiacenzeFragment() { // Required empty public constructor } @@ -202,15 +198,6 @@ public class RettificaGiacenzeFragment extends Fragment implements ITitledFragme super.onAttach(context); } - @Override - public void onDestroy() { - for(Runnable onPreDestroy : mOnPreDestroyList) { - onPreDestroy.run(); - } - - super.onDestroy(); - } - @Override public void onCreateActionBar(AppCompatTextView titleText, Context context) { titleText.setText(context.getText(R.string.rettifica_giacenze_fragment_title).toString()); @@ -229,21 +216,6 @@ public class RettificaGiacenzeFragment extends Fragment implements ITitledFragme }; - - private void openProgress() { - if (this.mCurrentProgress == null) { - this.mCurrentProgress = UtilityProgress.createDefaultProgressDialog(getActivity()); - } - } - - private void closeProgress() { - if (mCurrentProgress != null) { - mCurrentProgress.dismiss(); - mCurrentProgress = null; - } - } - - public void setUIToForn() { mBinding.rettificaGiacenzeFornCheckBox.setChecked(true); mBinding.rettificaGiacenzeFornLayout.setBackground(ResourcesCompat.getDrawable(getActivity().getResources(), R.drawable.circular_background_left, null)); @@ -265,18 +237,6 @@ public class RettificaGiacenzeFragment extends Fragment implements ITitledFragme mBinding.rettificaGiacenzeFornLayout.setBackgroundTintList(null); } - @Override - public void onLoadingStarted() { - BarcodeManager.disable(); - this.openProgress(); - } - - @Override - public void onLoadingEnded() { - this.closeProgress(); - BarcodeManager.enable(); - } - @Override public void onFornitoriLoaded(ArrayList fornitoriList) { AutoCompleteFornitoreAdapter autoCompleteFornitoreAdapter = new AutoCompleteFornitoreAdapter(getActivity(), fornitoriList); @@ -331,7 +291,7 @@ public class RettificaGiacenzeFragment extends Fragment implements ITitledFragme public void onLUOpenRequest(RunnableArgss onComplete) { DialogScanOrCreateLUView.newInstance(true, false, (mtbColt, created) -> { if (mtbColt == null) { - ((IPoppableActivity) getActivity()).pop(); + popMe(); } else { onComplete.run(mtbColt, created); } @@ -528,9 +488,4 @@ public class RettificaGiacenzeFragment extends Fragment implements ITitledFragme BarcodeManager.removeCallback(barcodeScannerIstanceID); mViewModel.closeLU(false, onComplete); } - - @Override - public void addOnPreDestroy(Runnable onPreDestroy) { - this.mOnPreDestroyList.add(onPreDestroy); - } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java index 0cfe378c..b675b4c8 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java @@ -247,7 +247,7 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo private void initBarcodeReader() { barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO() .setOnScanSuccessfull(onScanSuccessful) - .setOnScanFailed(ex -> UtilityExceptions.defaultException(this, ex, false))); + .setOnScanFailed(this::onError)); BarcodeManager.enable(); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/versamento_merce/VersamentoMerceFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/versamento_merce/VersamentoMerceFragment.java index 759cd1bc..c3b374f4 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/versamento_merce/VersamentoMerceFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/versamento_merce/VersamentoMerceFragment.java @@ -220,10 +220,8 @@ public class VersamentoMerceFragment extends BaseFragment implements ITitledFrag @Override public void onDataSaved() { - this.getActivity().runOnUiThread(() -> { - DialogCommon.showDataSaved(getActivity(), () -> { - ((IPoppableActivity) getActivity()).pop(); - }); + this.requireActivity().runOnUiThread(() -> { + DialogCommon.showDataSaved(requireActivity(), this::popMe); }); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArts.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArts.java index 16023666..77448e77 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArts.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArts.java @@ -110,14 +110,14 @@ public class DialogChooseArtsFromListaArts { } private void initRecyclerView() { - mBindings.dialogChooseArtsFromListaArtMainList.setNestedScrollingEnabled(false); + mBindings.listaArts.setNestedScrollingEnabled(false); - mBindings.dialogChooseArtsFromListaArtMainList.setHasFixedSize(true); + mBindings.listaArts.setHasFixedSize(true); - mBindings.dialogChooseArtsFromListaArtMainList.setLayoutManager(new LinearLayoutManager(currentContext)); + mBindings.listaArts.setLayoutManager(new LinearLayoutManager(currentContext)); currentAdapter = new DialogChooseArtsFromListaArtsAdapter(currentContext, mDataset); - mBindings.dialogChooseArtsFromListaArtMainList.setAdapter(currentAdapter); + mBindings.listaArts.setAdapter(currentAdapter); } diff --git a/app/src/main/res/layout/dialog_choose_arts_from_lista_arts_layout.xml b/app/src/main/res/layout/dialog_choose_arts_from_lista_arts_layout.xml index 5088ac7c..5f578f2d 100644 --- a/app/src/main/res/layout/dialog_choose_arts_from_lista_arts_layout.xml +++ b/app/src/main/res/layout/dialog_choose_arts_from_lista_arts_layout.xml @@ -55,7 +55,7 @@ diff --git a/app/src/main/res/layout/fragment_choose_ords_lav_from_list__item_model.xml b/app/src/main/res/layout/fragment_choose_ords_lav_from_list__item_model.xml index d06ab91c..2b2ccbcd 100644 --- a/app/src/main/res/layout/fragment_choose_ords_lav_from_list__item_model.xml +++ b/app/src/main/res/layout/fragment_choose_ords_lav_from_list__item_model.xml @@ -1,154 +1,157 @@ - + xmlns:tools="http://schemas.android.com/tools"> + + + + + + + + + - + name="listModel" + type="it.integry.integrywmsnative.gest.prod_versamento_materiale.dto.VersamentoMerceOrdineLavListModel" /> + + app:backgroundTintResID="@{listModel.selected.get() ? R.color.bg_checked_layout : android.R.color.transparent}"> - - - - - - - - - - - - - - - - - - - - - - + app:checked="@{listModel.selected}" /> + + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentEnd="true" + android:background="@drawable/badge2_round_corner" + android:backgroundTint="@{context.getColor(listModel.selected.get() ? R.color.orange_600 : R.color.gray_500)}" + android:paddingStart="6dp" + android:paddingEnd="6dp" + android:textColor="@android:color/white" + android:textSize="14sp" + android:textStyle="bold" + android:visibility="@{SettingsManager.iDB().isFlagForceAllToColli() || (listModel.originalMtbAart != null && !listModel.originalMtbAart.flagQtaCnfFissaBoolean) ? View.VISIBLE : View.GONE}" + tools:text="PESO KG" /> + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_prod_recupero_materiale.xml b/app/src/main/res/layout/fragment_prod_recupero_materiale.xml index 0795ad18..41d9485b 100644 --- a/app/src/main/res/layout/fragment_prod_recupero_materiale.xml +++ b/app/src/main/res/layout/fragment_prod_recupero_materiale.xml @@ -6,6 +6,10 @@ + + + + - - - - - - + - - - - + - - - - - + + - - - + - + - - + + android:paddingBottom="80dp" + android:scrollbarStyle="outsideOverlay" /> - + diff --git a/app/src/main/res/layout/prod_recupero_materiale_list_header.xml b/app/src/main/res/layout/prod_recupero_materiale_list_header.xml index e03c8d45..b673fa1e 100644 --- a/app/src/main/res/layout/prod_recupero_materiale_list_header.xml +++ b/app/src/main/res/layout/prod_recupero_materiale_list_header.xml @@ -1,6 +1,6 @@ - + mOnScanSuccessfull; private static RunnableArgs mOnScanFailed; @@ -24,7 +22,7 @@ public class ZebraBarcodeReader implements BarcodeReaderInterface { private static final String TAG = ZebraBarcodeReader.class.getName(); private static final String INTENT_FILTER_STRING = "it.integry.scan_filter"; - public ZebraBarcodeReader(AppCompatActivity context) { + public ZebraBarcodeReader(Context context) { this.mContext = context; } From 98b6a3212636bd4db52c2e0d01b70cb9485d9e97 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Wed, 11 Aug 2021 15:20:42 +0200 Subject: [PATCH 10/18] Rename --- .../integrywmsnative/MainApplicationComponent.java | 8 ++++---- .../pv_ordini_acquisto/PVOrdineAcquistoGrigliaModule.java | 7 ------- ...mponent.java => PVOrdiniAcquistoGrigliaComponent.java} | 4 ++-- .../pv_ordini_acquisto/PVOrdiniAcquistoGrigliaModule.java | 7 +++++++ 4 files changed, 13 insertions(+), 13 deletions(-) delete mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdineAcquistoGrigliaModule.java rename app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/{PVOrdineAcquistoGrigliaComponent.java => PVOrdiniAcquistoGrigliaComponent.java} (70%) create mode 100644 app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdiniAcquistoGrigliaModule.java diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java index d7f453f7..b092b210 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java @@ -37,8 +37,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_ordini_acquisto.PVOrdineAcquistoGrigliaComponent; -import it.integry.integrywmsnative.gest.pv_ordini_acquisto.PVOrdineAcquistoGrigliaModule; +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; import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeModule; import it.integry.integrywmsnative.gest.spedizione.SpedizioneComponent; @@ -73,7 +73,7 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr MainAccettazioneModule.class, ListaBancaliModule.class, ContenutoBancaleModule.class, - PVOrdineAcquistoGrigliaModule.class, + PVOrdiniAcquistoGrigliaModule.class, PVOrdineAcquistoEditModule.class, PickingLiberoModule.class, RettificaGiacenzeModule.class, @@ -104,7 +104,7 @@ public interface MainApplicationComponent { MainAccettazioneComponent.Factory mainAccettazioneComponent(); ListaBancaliComponent.Factory listaBancaliComponent(); ContenutoBancaleComponent.Factory contenutoBancaleComponent(); - PVOrdineAcquistoGrigliaComponent.Factory pvOrdineAcquistoGrigliaComponent(); + PVOrdiniAcquistoGrigliaComponent.Factory pvOrdineAcquistoGrigliaComponent(); PVOrdineAcquistoEditComponent.Factory pvOrdineAcquistoEditComponent(); PickingLiberoComponent.Factory pickingLiberoComponent(); RettificaGiacenzeComponent.Factory rettificaGiacenzeComponent(); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdineAcquistoGrigliaModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdineAcquistoGrigliaModule.java deleted file mode 100644 index 7e49f63c..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdineAcquistoGrigliaModule.java +++ /dev/null @@ -1,7 +0,0 @@ -package it.integry.integrywmsnative.gest.pv_ordini_acquisto; - -import dagger.Module; - -@Module(subcomponents = PVOrdineAcquistoGrigliaComponent.class) -public class PVOrdineAcquistoGrigliaModule { -} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdineAcquistoGrigliaComponent.java b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdiniAcquistoGrigliaComponent.java similarity index 70% rename from app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdineAcquistoGrigliaComponent.java rename to app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdiniAcquistoGrigliaComponent.java index 5da928e4..42854741 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdineAcquistoGrigliaComponent.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdiniAcquistoGrigliaComponent.java @@ -3,12 +3,12 @@ package it.integry.integrywmsnative.gest.pv_ordini_acquisto; import dagger.Subcomponent; @Subcomponent -public interface PVOrdineAcquistoGrigliaComponent { +public interface PVOrdiniAcquistoGrigliaComponent { @Subcomponent.Factory interface Factory { - PVOrdineAcquistoGrigliaComponent create(); + PVOrdiniAcquistoGrigliaComponent create(); } void inject(PVOrdiniAcquistoGrigliaFragment pvOrdiniAcquistoGrigliaFragment); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdiniAcquistoGrigliaModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdiniAcquistoGrigliaModule.java new file mode 100644 index 00000000..997d2b0d --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/PVOrdiniAcquistoGrigliaModule.java @@ -0,0 +1,7 @@ +package it.integry.integrywmsnative.gest.pv_ordini_acquisto; + +import dagger.Module; + +@Module(subcomponents = PVOrdiniAcquistoGrigliaComponent.class) +public class PVOrdiniAcquistoGrigliaModule { +} From eaeef05e64d17dda5ae8175efe94595e8040a5f2 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 12 Aug 2021 11:02:50 +0200 Subject: [PATCH 11/18] Vario --- .../MainApplicationComponent.java | 6 +- .../MainApplicationModule.java | 4 +- .../rest/consumers/ArticoloRESTConsumer.java | 7 +- .../rest/consumers/BarcodeRESTConsumer.java | 6 +- .../consumers/ColliMagazzinoRESTConsumer.java | 13 -- .../rest/consumers/DepositoRESTConsumer.java | 8 +- .../rest/consumers/EntityRESTConsumer.java | 26 +--- .../picking_libero/PickingLiberoFragment.java | 10 +- .../UltimiArriviFornitoreFragment.java | 6 +- .../VersamentoMerceFragment.java | 6 +- .../dialogs/basket_lu/DialogBasketLU.java | 2 +- .../DialogBasketLU_ViewPagerAdapter.java | 12 +- .../DialogChooseArtsFromListaArts.java | 128 ++++++++++-------- ...ialogChooseArtsFromListaArtsComponent.java | 15 ++ .../DialogChooseArtsFromListaArtsModule.java | 7 + 15 files changed, 138 insertions(+), 118 deletions(-) create mode 100644 app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArtsComponent.java create mode 100644 app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArtsModule.java diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java index b092b210..bc0fed50 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java @@ -51,6 +51,8 @@ import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.UltimiArriviForn import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.UltimiArriviFornitoreModule; import it.integry.integrywmsnative.gest.versamento_merce.VersamentoMerceComponent; import it.integry.integrywmsnative.gest.versamento_merce.VersamentoMerceModule; +import it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts.DialogChooseArtsFromListaArtsComponent; +import it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts.DialogChooseArtsFromListaArtsModule; import it.integry.integrywmsnative.view.dialogs.choose_batch_lot.DialogChooseBatchLotComponent; import it.integry.integrywmsnative.view.dialogs.choose_batch_lot.DialogChooseBatchLotModule; import it.integry.integrywmsnative.view.dialogs.input_lu_prod.DialogInputLUProdComponent; @@ -94,7 +96,8 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr DialogRowInfoProdFabbisognoLineeProdModule.class, ProdOrdineProduzioneElencoModule.class, ProdRecuperoMaterialeModule.class, - ProdVersamentoMaterialeModule.class + ProdVersamentoMaterialeModule.class, + DialogChooseArtsFromListaArtsModule.class }) public interface MainApplicationComponent { @@ -128,6 +131,7 @@ public interface MainApplicationComponent { ProdOrdineProduzioneElencoComponent.Factory prodOrdineProduzioneElencoComponent(); ProdRecuperoMaterialeComponent.Factory prodRecuperoMaterialeComponent(); ProdVersamentoMaterialeComponent.Factory prodVersamentoMaterialeComponent(); + DialogChooseArtsFromListaArtsComponent.Factory dialogChooseArtsFromListaArtsComponent(); void inject(MainApplication mainApplication); diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java index eb1c98d5..1d72f32c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java @@ -87,8 +87,8 @@ public class MainApplicationModule { @Provides @Singleton - DepositoRESTConsumer provideDepositoRESTConsumer() { - return new DepositoRESTConsumer(); + DepositoRESTConsumer provideDepositoRESTConsumer(EntityRESTConsumer entityRESTConsumer) { + return new DepositoRESTConsumer(entityRESTConsumer); } @Provides diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ArticoloRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ArticoloRESTConsumer.java index c1f4e2a4..185de530 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ArticoloRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ArticoloRESTConsumer.java @@ -18,7 +18,8 @@ import retrofit2.Response; @Singleton public class ArticoloRESTConsumer extends _BaseRESTConsumer { - public static void getByBarcodeProdStatic(String barcodeProd, RunnableArgs> onComplete, RunnableArgs onFailed) { + + public void getByBarcodeProd(String barcodeProd, RunnableArgs> onComplete, RunnableArgs onFailed) { ArticoloRESTConsumerService articoloRESTConsumerService = RESTBuilder.getService(ArticoloRESTConsumerService.class); articoloRESTConsumerService.getByBarcodeProd(barcodeProd).enqueue(new Callback>() { @Override @@ -35,10 +36,6 @@ public class ArticoloRESTConsumer extends _BaseRESTConsumer { }); } - public void getByBarcodeProd(String barcodeProd, RunnableArgs> onComplete, RunnableArgs onFailed) { - getByBarcodeProdStatic(barcodeProd, onComplete, onFailed); - } - public void getByCodMarts(List codMartToFind, RunnableArgs> onComplete, RunnableArgs onFailed) { getByCodMartsStatic(codMartToFind, onComplete, onFailed); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/BarcodeRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/BarcodeRESTConsumer.java index 31ab699a..c03668da 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/BarcodeRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/BarcodeRESTConsumer.java @@ -16,7 +16,7 @@ import retrofit2.Response; @Singleton public class BarcodeRESTConsumer extends _BaseRESTConsumer { - public static void decodeEan128Static(BarcodeScanDTO barcodeObj, RunnableArgs onComplete, RunnableArgs onFailed) { + public void decodeEan128(BarcodeScanDTO barcodeObj, RunnableArgs onComplete, RunnableArgs onFailed) { IBarcodeCustomization barcodeCustomization = ClassRouter.getInstance(ClassRouter.PATH.BARCODE_CUSTOMIZATION); @@ -42,8 +42,4 @@ public class BarcodeRESTConsumer extends _BaseRESTConsumer { } }); } - - public void decodeEan128(BarcodeScanDTO barcodeObj, RunnableArgs onComplete, RunnableArgs onFailed) { - BarcodeRESTConsumer.decodeEan128Static(barcodeObj, onComplete, onFailed); - } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java index e7cad6bd..c1164e65 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java @@ -57,19 +57,6 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { this.mEntityRESTConsumer = entityRESTConsumer; } - - public static void saveColloStatic(MtbColt mtbColtToSave, final ISimpleOperationCallback callback) { - - for (int i = 0; i < mtbColtToSave.getMtbColr().size(); i++) { - mtbColtToSave.getMtbColr().get(i) - .setMtbAart(null) - .setMtbPartitaMag(null); - } - - EntityRESTConsumer.processEntity(mtbColtToSave, callback, MtbColt.class); - - } - public void saveCollo(MtbColt mtbColtToSave, RunnableArgs onComplete, RunnableArgs onFailed) { MtbColt mtbColtToSaveClone = (MtbColt) mtbColtToSave.clone(); mtbColtToSave.setOperation(CommonModelConsts.OPERATION.INSERT_OR_UPDATE); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DepositoRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DepositoRESTConsumer.java index 7eeeb3d2..ef61ef87 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DepositoRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/DepositoRESTConsumer.java @@ -11,6 +11,12 @@ import it.integry.integrywmsnative.core.model.MtbDepo; @Singleton public class DepositoRESTConsumer extends _BaseRESTConsumer { + private final EntityRESTConsumer entityRESTConsumer; + + public DepositoRESTConsumer(EntityRESTConsumer entityRESTConsumer) { + this.entityRESTConsumer = entityRESTConsumer; + } + public void getDepoByCodMdep(String codMdep, RunnableArgs onComplete, RunnableArgs onFailed) { MtbDepo mtbDepo = new MtbDepo(); @@ -18,7 +24,7 @@ public class DepositoRESTConsumer extends _BaseRESTConsumer { mtbDepo.setOperation(CommonModelConsts.OPERATION.SELECT); mtbDepo.setOnlyPkMaster(false); - EntityRESTConsumer.selectEntity(mtbDepo, new ISimpleOperationCallback<>() { + this.entityRESTConsumer.selectEntity(mtbDepo, new ISimpleOperationCallback<>() { @Override public void onSuccess(List value) { if (value != null && value.size() > 0) { diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/EntityRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/EntityRESTConsumer.java index 6c3f35f4..0d3a4fee 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/EntityRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/EntityRESTConsumer.java @@ -22,24 +22,8 @@ import retrofit2.Response; @Singleton public class EntityRESTConsumer extends _BaseRESTConsumer { - public static void processEntity(T entityToSave, RunnableArgs onComplete, RunnableArgs onFailed, Class type) { - processEntity(entityToSave, new ISimpleOperationCallback() { - @Override - public void onSuccess(T value) { - if(onComplete != null) onComplete.run(value); - } - - @Override - public void onFailed(Exception ex) { - if(onFailed != null) onFailed.run(ex); - } - }, type); - - } - - - public static void processEntity(T entityToSave, final ISimpleOperationCallback callback, Class type) { + public void processEntity(T entityToSave, final ISimpleOperationCallback callback, Class type) { RunnableArgs tmpFailed = ex -> { if (callback != null) callback.onFailed(ex); @@ -48,7 +32,7 @@ public class EntityRESTConsumer extends _BaseRESTConsumer { EntityRESTConsumerService service = RESTBuilder.getService(EntityRESTConsumerService.class); service .processEntity(entityToSave) - .enqueue(new Callback>() { + .enqueue(new Callback<>() { @Override public void onResponse(Call> call, Response> response) { if (response.isSuccessful()) { @@ -82,7 +66,7 @@ public class EntityRESTConsumer extends _BaseRESTConsumer { } - public static void processEntityList(List entitiesToSave, final ISimpleOperationCallback> callback, boolean singleTransaction, Class type) { + public void processEntityList(List entitiesToSave, final ISimpleOperationCallback> callback, boolean singleTransaction, Class type) { RunnableArgs tmpFailed = ex -> { // UtilityExceptions.defaultException(null, ex); @@ -91,7 +75,7 @@ public class EntityRESTConsumer extends _BaseRESTConsumer { EntityRESTConsumerService service = RESTBuilder.getService(EntityRESTConsumerService.class); Call>> request = service.processEntityList(singleTransaction, entitiesToSave); - request.enqueue(new Callback>>() { + request.enqueue(new Callback<>() { @Override public void onResponse(Call>> call, Response>> response) { if (response.isSuccessful()) { @@ -136,7 +120,7 @@ public class EntityRESTConsumer extends _BaseRESTConsumer { } - public static void selectEntity(T entityToSave, final ISimpleOperationCallback> callback, Class type) { + public void selectEntity(T entityToSave, final ISimpleOperationCallback> callback, Class type) { EntityRESTConsumerService service = RESTBuilder.getService(EntityRESTConsumerService.class); Call> request = service.processEntity(entityToSave); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoFragment.java index 40f759dc..c8e1d912 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoFragment.java @@ -290,10 +290,12 @@ public class PickingLiberoFragment extends BaseFragment implements ITitledFragme @Override public void onArtSelectionRequest(List mtbColrsToPick, RunnableArgs> onComplete, Runnable onAbort) { - DialogChooseArtsFromListaArts.make(getActivity(), mtbColrsToPick, onComplete, () -> { - onAbort.run(); - BarcodeManager.enable(); - }); + DialogChooseArtsFromListaArts + .newInstance(mtbColrsToPick, onComplete, () -> { + onAbort.run(); + BarcodeManager.enable(); + }) + .show(requireActivity().getSupportFragmentManager(), "tag"); } @Override diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java index f4349073..8ea4c517 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/ultimi_arrivi_fornitore/UltimiArriviFornitoreFragment.java @@ -275,7 +275,7 @@ public class UltimiArriviFornitoreFragment extends BaseFragment implements ITitl public void onMtbColtScanned(MtbColt scannedMtbColt) { DialogChooseArtsFromListaArts - .make(getActivity(), scannedMtbColt.getMtbColr(), items -> { + .newInstance(scannedMtbColt.getMtbColr(), items -> { List mtbAarts = Stream.of(items) .map(MtbColr::getMtbAart) @@ -283,7 +283,7 @@ public class UltimiArriviFornitoreFragment extends BaseFragment implements ITitl filterItems(mtbAarts); - }, null); - + }, null) + .show(requireActivity().getSupportFragmentManager(), "tag"); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/versamento_merce/VersamentoMerceFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/versamento_merce/VersamentoMerceFragment.java index c3b374f4..894194d5 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/versamento_merce/VersamentoMerceFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/versamento_merce/VersamentoMerceFragment.java @@ -168,8 +168,10 @@ public class VersamentoMerceFragment extends BaseFragment implements ITitledFrag @Override public void onArtsChooseRequired(List mtbColrList, RunnableArgs> onComplete, Runnable onAbort) { - this.getActivity().runOnUiThread(() -> { - DialogChooseArtsFromListaArts.make(getActivity(), mtbColrList, onComplete, onAbort); + this.requireActivity().runOnUiThread(() -> { + DialogChooseArtsFromListaArts + .newInstance(mtbColrList, onComplete, onAbort) + .show(requireActivity().getSupportFragmentManager(), "tag"); }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/basket_lu/DialogBasketLU.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/basket_lu/DialogBasketLU.java index b9ba93c7..f01d1f58 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/basket_lu/DialogBasketLU.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/basket_lu/DialogBasketLU.java @@ -54,7 +54,7 @@ public class DialogBasketLU { } private void initViewPager() { - List> views = new ArrayList<>(); + List>> views = new ArrayList<>(); views.add(new AbstractMap.SimpleEntry<>(R.layout.dialog_basket_lu__page1, DialogBasketLU_Page1_ViewModel.class)); views.add(new AbstractMap.SimpleEntry<>(R.layout.dialog_basket_lu__page2, DialogBasketLU_Page2_ViewModel.class)); diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/basket_lu/DialogBasketLU_ViewPagerAdapter.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/basket_lu/DialogBasketLU_ViewPagerAdapter.java index bf4e2edc..1dafa3db 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/basket_lu/DialogBasketLU_ViewPagerAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/basket_lu/DialogBasketLU_ViewPagerAdapter.java @@ -17,21 +17,19 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import it.integry.integrywmsnative.BR; import it.integry.integrywmsnative.ui.DeactivatableViewPager; -import it.integry.integrywmsnative.view.dialogs.ask_cliente.viewmodel.IDialogAskClienteViewModel; import it.integry.integrywmsnative.view.dialogs.basket_lu.interfaces.IDialogBasketLUViewModel; public class DialogBasketLU_ViewPagerAdapter extends PagerAdapter implements ViewPager.OnPageChangeListener { - private Context mContext; + private final Context mContext; - private List> mDatasetLayout; - private List> mDatasetViews; + private final List>> mDatasetLayout; + private final List> mDatasetViews; private DeactivatableViewPager viewPager; - public DialogBasketLU_ViewPagerAdapter(Context context, List> datasetLayouts) { + public DialogBasketLU_ViewPagerAdapter(Context context, List>> datasetLayouts) { this.mContext = context; this.mDatasetLayout = datasetLayouts; this.mDatasetViews = new ArrayList<>(); @@ -47,7 +45,7 @@ public class DialogBasketLU_ViewPagerAdapter extends PagerAdapter implements Vie LayoutInflater inflater = (LayoutInflater) mContext.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); ViewDataBinding mBinding = DataBindingUtil.inflate(inflater, viewId, null, false); - Class viewModelClass = mDatasetLayout.get(position).getValue(); + Class viewModelClass = mDatasetLayout.get(position).getValue(); IDialogBasketLUViewModel viewModel = null; try { diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArts.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArts.java index 77448e77..16d00ccc 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArts.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArts.java @@ -2,27 +2,33 @@ package it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts; import android.app.Dialog; import android.content.Context; +import android.content.DialogInterface; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.widget.SearchView; import androidx.databinding.DataBindingUtil; -import androidx.fragment.app.FragmentActivity; import androidx.recyclerview.widget.LinearLayoutManager; import com.annimon.stream.Stream; -import org.jetbrains.annotations.NotNull; - import java.util.ArrayList; import java.util.List; +import javax.inject.Inject; + import it.integry.barcode_base_android_library.model.BarcodeScanDTO; +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.expansion.BaseDialogFragment; import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.model.MtbAart; import it.integry.integrywmsnative.core.model.MtbColr; @@ -37,28 +43,33 @@ import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.databinding.DialogChooseArtsFromListaArtsLayoutBinding; import it.integry.integrywmsnative.view.dialogs.DialogCommon; -public class DialogChooseArtsFromListaArts { +public class DialogChooseArtsFromListaArts extends BaseDialogFragment { - private Context currentContext; - private Dialog mDialog; + @Inject + BarcodeRESTConsumer barcodeRESTConsumer; + + @Inject + ArticoloRESTConsumer articoloRESTConsumer; + + private Context context; private DialogChooseArtsFromListaArtsLayoutBinding mBindings; private DialogChooseArtsFromListaArtsAdapter currentAdapter; - private RunnableArgs> mOnItemsChoosed; - private Runnable mOnAbort; + private final RunnableArgs> mOnItemsChoosed; + private final Runnable mOnAbort; - private List mDataset; + private final List mDataset; - public static void make(@NotNull final FragmentActivity activity, List listaMtbColr, RunnableArgs> onItemsChoosed, Runnable onAbort) { - activity.runOnUiThread(() -> { - new DialogChooseArtsFromListaArts(activity, listaMtbColr, onItemsChoosed, onAbort).mDialog.show(); - }); + private int mBarcodeScannerIstanceID; + + public static DialogChooseArtsFromListaArts newInstance(List listaMtbColr, RunnableArgs> onItemsChoosed, Runnable onAbort) { + return new DialogChooseArtsFromListaArts(listaMtbColr, onItemsChoosed, onAbort); } + private DialogChooseArtsFromListaArts(List listaMtbColr, RunnableArgs> onItemsChoosed, Runnable onAbort) { + super(); - private DialogChooseArtsFromListaArts(Context context, List listaMtbColr, RunnableArgs> onItemsChoosed, Runnable onAbort) { - currentContext = context; mOnItemsChoosed = onItemsChoosed; mOnAbort = onAbort; @@ -73,50 +84,54 @@ public class DialogChooseArtsFromListaArts { mDataset.add(new DialogChooseArtsFromListaArtsItemModel().setMtbColr(mtbColr)); } } + } - LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + + this.context = getActivity(); mBindings = DataBindingUtil.inflate(inflater, R.layout.dialog_choose_arts_from_lista_arts_layout, null, false); + mBindings.setLifecycleOwner(getViewLifecycleOwner()); - mBindings.emptyView.setVisibility(listaMtbColr != null && listaMtbColr.size() > 0 ? View.GONE : View.VISIBLE); + MainApplication.appComponent + .dialogChooseArtsFromListaArtsComponent() + .create() + .inject(this); + UtilityDialog.setTo90PercentWidth(context, this); - mDialog = new Dialog(context); - mDialog.setContentView(mBindings.getRoot()); - mDialog.setCanceledOnTouchOutside(false); - mDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - - mDialog.setOnCancelListener(dialog -> { - if (this.mOnAbort != null) this.mOnAbort.run(); - }); - - UtilityDialog.setTo90PercentWidth(context, mDialog); + mBindings.emptyView.setVisibility(mDataset != null && mDataset.size() > 0 ? View.GONE : View.VISIBLE); initRecyclerView(); - initFilter(); - setupBarcode(); mBindings.positiveButton.setOnClickListener(v -> { - mDialog.dismiss(); + dismiss(); onPositiveClick(); }); mBindings.negativeButton.setOnClickListener(v -> { - mDialog.dismiss(); + dismiss(); onNegativeClick(); }); + + getDialog().setCanceledOnTouchOutside(false); + getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + + return mBindings.getRoot(); } + private void initRecyclerView() { mBindings.listaArts.setNestedScrollingEnabled(false); - mBindings.listaArts.setHasFixedSize(true); + mBindings.listaArts.setLayoutManager(new LinearLayoutManager(context)); - mBindings.listaArts.setLayoutManager(new LinearLayoutManager(currentContext)); - - currentAdapter = new DialogChooseArtsFromListaArtsAdapter(currentContext, mDataset); + currentAdapter = new DialogChooseArtsFromListaArtsAdapter(context, mDataset); mBindings.listaArts.setAdapter(currentAdapter); } @@ -178,9 +193,9 @@ public class DialogChooseArtsFromListaArts { String diacod = x.getMtbColr().getMtbAart().getDiacod().toLowerCase(); return ((codMart.startsWith(finalNewText) || - codMart.endsWith(finalNewText) || - codMart.contains(finalNewText) || - codMart.equalsIgnoreCase(finalNewText)) || + codMart.endsWith(finalNewText) || + codMart.contains(finalNewText) || + codMart.equalsIgnoreCase(finalNewText)) || (descrizioneArt.startsWith(finalNewText) || descrizioneArt.endsWith(finalNewText) || descrizioneArt.contains(finalNewText) || @@ -206,21 +221,28 @@ public class DialogChooseArtsFromListaArts { private void setupBarcode() { BarcodeManager.enable(); - int barcodeIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO() + mBarcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO() .setOnScanSuccessfull(onScanSuccessfull) - .setOnScanFailed(ex -> UtilityExceptions.defaultException(currentContext, ex, false))); + .setOnScanFailed(ex -> UtilityExceptions.defaultException(context, ex, false))); - mDialog.setOnDismissListener(dialog -> { - BarcodeManager.removeCallback(barcodeIstanceID); - }); } + + + @Override + public void onDismiss(@NonNull DialogInterface dialog) { + BarcodeManager.removeCallback(mBarcodeScannerIstanceID); + this.mOnAbort.run(); + super.onDismiss(dialog); + } + + private final RunnableArgs onScanSuccessfull = data -> { BarcodeManager.disable(); - Dialog progressDialog = UtilityProgress.createDefaultProgressDialog(currentContext); + Dialog progressDialog = UtilityProgress.createDefaultProgressDialog(context); if (UtilityBarcode.isEan13(data)) { this.loadArticolo(data.getStringValue(), null, progressDialog); @@ -236,7 +258,7 @@ public class DialogChooseArtsFromListaArts { private void executeEtichettaEan128(BarcodeScanDTO barcodeScanDTO, Dialog progressDialog) { - BarcodeRESTConsumer.decodeEan128Static(barcodeScanDTO, ean128Model -> { + this.barcodeRESTConsumer.decodeEan128(barcodeScanDTO, ean128Model -> { String barcodeProd = null; @@ -251,7 +273,7 @@ public class DialogChooseArtsFromListaArts { if (!UtilityString.isNullOrEmpty(ean128Model.Gtin) || !UtilityString.isNullOrEmpty(ean128Model.Content)) { this.loadArticolo(barcodeProd, ean128Model, progressDialog); } else { - DialogCommon.showNoArtFoundDialog(currentContext, () -> { + DialogCommon.showNoArtFoundDialog(context, () -> { BarcodeManager.enable(); progressDialog.dismiss(); }); @@ -261,14 +283,14 @@ public class DialogChooseArtsFromListaArts { } else { //EAN 128 non completo o comunque mancano i riferimenti al prodotto - DialogCommon.showNoArtFoundDialog(currentContext, () -> { + DialogCommon.showNoArtFoundDialog(context, () -> { BarcodeManager.enable(); progressDialog.dismiss(); }); } }, ex -> { - UtilityExceptions.defaultException(currentContext, ex, progressDialog); + UtilityExceptions.defaultException(context, ex, progressDialog); BarcodeManager.enable(); }); } @@ -280,7 +302,7 @@ public class DialogChooseArtsFromListaArts { } String finalBarcodeProd = barcodeProd; - ArticoloRESTConsumer.getByBarcodeProdStatic(barcodeProd, mtbAartList -> { + this.articoloRESTConsumer.getByBarcodeProd(barcodeProd, mtbAartList -> { if (mtbAartList != null && mtbAartList.size() > 0) { this.mBindings.mainSearch.setQuery(finalBarcodeProd, false); @@ -292,7 +314,7 @@ public class DialogChooseArtsFromListaArts { } else { - DialogCommon.showNoArtFoundDialog(currentContext, () -> { + DialogCommon.showNoArtFoundDialog(context, () -> { BarcodeManager.enable(); progressDialog.dismiss(); }); @@ -300,7 +322,7 @@ public class DialogChooseArtsFromListaArts { }, ex -> { BarcodeManager.enable(); - UtilityExceptions.defaultException(currentContext, ex, progressDialog); + UtilityExceptions.defaultException(context, ex, progressDialog); }); } @@ -314,7 +336,7 @@ public class DialogChooseArtsFromListaArts { .toList(); if (foundRowsList.size() == 0) { - DialogCommon.showNoArtFoundDialog(currentContext, null); + DialogCommon.showNoArtFoundDialog(context, null); } else { for (int i = 0; i < mDataset.size(); i++) { @@ -339,7 +361,7 @@ public class DialogChooseArtsFromListaArts { private void onNegativeClick() { - if (this.mOnAbort != null) mOnAbort.run(); + this.dismiss(); } diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArtsComponent.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArtsComponent.java new file mode 100644 index 00000000..e99add7f --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArtsComponent.java @@ -0,0 +1,15 @@ +package it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts; + +import dagger.Subcomponent; + +@Subcomponent +public interface DialogChooseArtsFromListaArtsComponent { + + @Subcomponent.Factory + interface Factory { + DialogChooseArtsFromListaArtsComponent create(); + } + + void inject(DialogChooseArtsFromListaArts dialogChooseArtsFromListaArts); + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArtsModule.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArtsModule.java new file mode 100644 index 00000000..fd6c526b --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_arts_from_lista_arts/DialogChooseArtsFromListaArtsModule.java @@ -0,0 +1,7 @@ +package it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts; + +import dagger.Module; + +@Module(subcomponents = DialogChooseArtsFromListaArtsComponent.class) +public class DialogChooseArtsFromListaArtsModule { +} From a6664102db9792961882a0ea3450182113be3cdb Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 2 Sep 2021 09:56:15 +0200 Subject: [PATCH 12/18] Vario --- .../configs/MenuConfiguration.java | 62 ++++++++++++------- .../gest/spedizione/SpedizioneViewModel.java | 12 ++-- build.gradle | 2 +- dynamic_agricoper/build.gradle | 3 - .../MenuConfigurationSAPORIVERIPV.java | 2 + 5 files changed, 50 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/MenuConfiguration.java b/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/MenuConfiguration.java index 9862b4e4..fcec5faa 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/MenuConfiguration.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/class_router/configs/MenuConfiguration.java @@ -9,6 +9,7 @@ import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ProdOrd import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.ProdFabbisognoLineeProdFragment; import it.integry.integrywmsnative.gest.prod_recupero_materiale.ProdRecuperoMaterialeFragment; import it.integry.integrywmsnative.gest.prod_versamento_materiale.ProdVersamentoMaterialeFragment; +import it.integry.integrywmsnative.gest.pv_ordini_acquisto.PVOrdiniAcquistoGrigliaFragment; import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeFragment; import it.integry.integrywmsnative.gest.ultime_consegne_cliente.UltimeConsegneClienteFragment; import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.UltimiArriviFornitoreFragment; @@ -122,31 +123,50 @@ public class MenuConfiguration extends BaseMenuConfiguration { .setTitleIcon(R.drawable.ic_dashboard_prod_recupero_materiale) .setDrawerIcon(R.drawable.ic_black_external) .setFragmentFactory(ProdRecuperoMaterialeFragment::newInstance)) - ) - .addGroup( - new MenuGroup() - .setGroupText(R.string.internal_handling) - .setGroupId(R.id.nav_group_movimentazione_interna) - .setCodMenu("MM011") + ).addGroup( + new MenuGroup() + .setGroupText(R.string.internal_handling) + .setGroupId(R.id.nav_group_movimentazione_interna) + .setCodMenu("MM011") - .addItem(new MenuItem() - .setID(R.id.nav_versamento_merce) - .setCodMenu("MG055") - .setTitleText(R.string.versamento_merce_fragment_title) - .setTitleIcon(R.drawable.ic_dashboard_versamento_merce) - .setDrawerIcon(R.drawable.ic_black_load_shelf) - .setFragmentFactory(VersamentoMerceFragment::newInstance)) + .addItem(new MenuItem() + .setID(R.id.nav_versamento_merce) + .setCodMenu("MG055") + .setTitleText(R.string.versamento_merce_fragment_title) + .setTitleIcon(R.drawable.ic_dashboard_versamento_merce) + .setDrawerIcon(R.drawable.ic_black_load_shelf) + .setFragmentFactory(VersamentoMerceFragment::newInstance)) - .addItem(new MenuItem() - .setID(R.id.nav_rettifica_giacenze) - .setCodMenu("MG056") - .setTitleText(R.string.rettifica_giacenze_fragment_title) - .setTitleIcon(R.drawable.ic_dashboard_rettifica_giacenze) - .setDrawerIcon(R.drawable.ic_black_empty_box) - .setFragmentFactory(RettificaGiacenzeFragment::newInstance)) + .addItem(new MenuItem() + .setID(R.id.nav_rettifica_giacenze) + .setCodMenu("MG056") + .setTitleText(R.string.rettifica_giacenze_fragment_title) + .setTitleIcon(R.drawable.ic_dashboard_rettifica_giacenze) + .setDrawerIcon(R.drawable.ic_black_empty_box) + .setFragmentFactory(RettificaGiacenzeFragment::newInstance)) - ); + ).addGroup( + new MenuGroup() + .setCodMenu("MM012") + .setGroupText(it.integry.integrywmsnative.R.string.punto_vendita) + .setGroupId(it.integry.integrywmsnative.R.id.nav_group_puntivendita) + + .addItem(new MenuItem() + .setCodMenu("MG057") + .setID(it.integry.integrywmsnative.R.id.nav_pv_ordini_acquisto) + .setTitleText(it.integry.integrywmsnative.R.string.generate_orders) + .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_purchase_orders_pv) + .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_purchase_orders_pv) + .setFragmentFactory(PVOrdiniAcquistoGrigliaFragment::newInstance)) + +// .addItem(new MenuItem() +// .setID(it.integry.integrywmsnative.R.id.nav_pv_ordini_acquisto_trasmessi) +// .setTitleText(it.integry.integrywmsnative.R.string.transmitted_orders) +// .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_trasmitted_orders_list) +// .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_trasmitted_orders_list) +// .setFragmentClass(PVOrdiniAcquistoTransmittedListFragment.newInstance())) + ); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java index c3438510..d557362a 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java @@ -412,7 +412,7 @@ public class SpedizioneViewModel { //dell'etichetta anonima this.executeEtichettaAnonimaNotOpenedLU(barcodeScanDTO, onComplete); - } else if (UtilityBarcode.isEtichettaPosizione(barcodeScanDTO) && mDefaultSegnoCol == 1) { + } else if (UtilityBarcode.isEtichettaPosizione(barcodeScanDTO)/* && mDefaultSegnoCol == 1*/) { this.processBarcodePosizioneNotOpenedLU(barcodeScanDTO, onComplete); } else { @@ -488,16 +488,16 @@ public class SpedizioneViewModel { this.executeEtichettaEanPeso(barcodeScanDTO, onComplete); - } else if (UtilityBarcode.isEtichetta128(barcodeScanDTO)) { - //Cerco tramite etichetta ean 128 (che puĂ² indicarmi un articolo o una UL) - this.executeEtichettaEan128(barcodeScanDTO, onComplete); - - } else if (UtilityBarcode.isEtichettaPosizione(barcodeScanDTO)) { //Cerco l'UL presente all'interno della posizione this.executeEtichettaPosizione(barcodeScanDTO.getStringValue(), onComplete); + } else if (UtilityBarcode.isEtichetta128(barcodeScanDTO)) { + //Cerco tramite etichetta ean 128 (che puĂ² indicarmi un articolo o una UL) + this.executeEtichettaEan128(barcodeScanDTO, onComplete); + + } else { this.loadArticolo(barcodeScanDTO.getStringValue(), null, onComplete); } diff --git a/build.gradle b/build.gradle index 1e28a654..999a8c17 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.0.0' + classpath 'com.android.tools.build:gradle:7.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.5' classpath 'com.google.firebase:perf-plugin:1.3.5' diff --git a/dynamic_agricoper/build.gradle b/dynamic_agricoper/build.gradle index bd238e5e..f0211172 100644 --- a/dynamic_agricoper/build.gradle +++ b/dynamic_agricoper/build.gradle @@ -5,11 +5,8 @@ android { compileSdk 30 defaultConfig { - applicationId "com.example.dynamicfeature" minSdk 21 targetSdk 30 - versionCode 1 - versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationSAPORIVERIPV.java b/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationSAPORIVERIPV.java index 7a7520ac..78c90dcb 100644 --- a/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationSAPORIVERIPV.java +++ b/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationSAPORIVERIPV.java @@ -12,10 +12,12 @@ public class MenuConfigurationSAPORIVERIPV extends BaseMenuConfiguration { this .addGroup( new MenuGroup() + .setCodMenu("MM012") .setGroupText(it.integry.integrywmsnative.R.string.punto_vendita) .setGroupId(it.integry.integrywmsnative.R.id.nav_group_puntivendita) .addItem(new MenuItem() + .setCodMenu("MG057") .setID(it.integry.integrywmsnative.R.id.nav_pv_ordini_acquisto) .setTitleText(it.integry.integrywmsnative.R.string.generate_orders) .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_purchase_orders_pv) From 0cc31a4a8eec112a79e6d505a58617560d5f0250 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 9 Sep 2021 16:49:40 +0200 Subject: [PATCH 13/18] Implementato controllo su barcode UL/Articolo in fase di add extra item. --- .../core/expansion/BaseDialogFragment.java | 13 +++++++++++-- .../gest/spedizione/SpedizioneActivity.java | 18 +++++++++--------- .../dialogs/scan_art/DialogScanArtView.java | 14 ++++++++------ .../scan_art/DialogScanArtViewModel.java | 14 +++++++++++--- build.gradle | 2 +- 5 files changed, 40 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java index 3f283249..dbae356b 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java @@ -10,6 +10,7 @@ import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; +import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityProgress; public class BaseDialogFragment extends DialogFragment { @@ -65,7 +66,7 @@ public class BaseDialogFragment extends DialogFragment { protected void openProgress() { // new Thread(() -> { - getActivity().runOnUiThread(() -> { + requireActivity().runOnUiThread(() -> { if (this.mCurrentProgress == null) { this.mCurrentProgress = UtilityProgress.createDefaultProgressDialog(getActivity()); } @@ -75,7 +76,7 @@ public class BaseDialogFragment extends DialogFragment { protected void closeProgress() { // new Thread(() -> { - getActivity().runOnUiThread(() -> { + requireActivity().runOnUiThread(() -> { if (mCurrentProgress != null) { mCurrentProgress.dismiss(); mCurrentProgress = null; @@ -83,4 +84,12 @@ public class BaseDialogFragment extends DialogFragment { }); // }).start(); } + + + public void onError(Exception ex) { + requireActivity().runOnUiThread(() -> { + this.closeProgress(); + UtilityExceptions.defaultException(requireActivity(), ex); + }); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java index b675b4c8..d26cefbd 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java @@ -94,7 +94,7 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo public BindableBoolean bottomSheetEnabled = new BindableBoolean(false); public BindableBoolean closeOrderButtonEnabled = new BindableBoolean(false); - private boolean mEnableGiacenza; + private boolean mEnableFakeGiacenza; private boolean mFlagShowCodForn; private boolean mDivideByGrpMerc; private boolean mEnableQuantityReset; @@ -195,16 +195,16 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo String codMdep = SettingsManager.i().getUserSession().getDepo().getCodMdep(); - mEnableGiacenza = !SettingsManager.iDB().isFlagSpedizioneEnableFakeGiacenza(); + mEnableFakeGiacenza = !SettingsManager.iDB().isFlagSpedizioneEnableFakeGiacenza(); boolean enableCheckPartitaMag = SettingsManager.iDB().isEnableCheckPartitaMagCheckPickingV(); boolean canOverflowOrderQuantity = SettingsManager.iDB().isFlagCanAddExtraQuantitySpedizione(); boolean shouldAskPesoLU = SettingsManager.iDB().isFlagAskPesoColloSpedizione(); boolean useQtaOrd = SettingsManager.iDB().isFlagSpedizioneUseQtaOrd(); - if (mEnableGiacenza) this.openProgress(); + if (mEnableFakeGiacenza) this.openProgress(); mViewmodel.init( codMdep, - mEnableGiacenza, + mEnableFakeGiacenza, enableCheckPartitaMag, shouldAskPesoLU, canOverflowOrderQuantity, @@ -311,7 +311,7 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo boolean anyLUPresent = x.getMtbColts() != null && x.getMtbColts().size() > 0; - spedizioneListModel.setActive(!mEnableGiacenza || anyLUPresent); + spedizioneListModel.setActive(!mEnableFakeGiacenza || anyLUPresent); AtomicBigDecimal numCnfWithdrawRows = new AtomicBigDecimal(); @@ -323,10 +323,10 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo qtaColWithdrawRows.addAndGet(row.getQtaCol()); }); + spedizioneListModel.setBadge2(x.getSitArtOrdDTO().getCodJcom()); if (!anyLUPresent) { - spedizioneListModel.setGroupTitle(mEnableGiacenza ? getString(R.string.picking_not_available) : ""); - spedizioneListModel.setBadge2(x.getSitArtOrdDTO().getCodJcom()); + spedizioneListModel.setGroupTitle(mEnableFakeGiacenza ? getString(R.string.picking_not_available) : ""); if (SettingsManager.iDB().isFlagForceAllToColli() || (x.getMtbAart() == null || !x.getMtbAart().isFlagQtaCnfFissaBoolean())) { spedizioneListModel.setUntMis(UtilityResources.getString(R.string.unt_mis_col)); @@ -469,7 +469,7 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo boolean anyLUPresent = x.getMtbColts() != null && x.getMtbColts().size() > 0; - spedizioneListModel.setActive(!mEnableGiacenza || anyLUPresent); + spedizioneListModel.setActive(!mEnableFakeGiacenza || anyLUPresent); AtomicBigDecimal numCnfWithdrawRows = new AtomicBigDecimal(); @@ -625,7 +625,7 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo public void addExtraItem() { DialogScanArtView - .newInstance((status, mtbAart, ean128Model, mtbColr) -> { + .newInstance(!mEnableFakeGiacenza, (status, mtbAart, ean128Model, mtbColr) -> { if (status == DialogConsts.Results.YES) { this.mViewmodel.dispatchExtraItem(mtbAart, ean128Model, mtbColr); } diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtView.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtView.java index efd6e921..d62bdc9d 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtView.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtView.java @@ -27,7 +27,6 @@ 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.rest.model.Ean128Model; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.databinding.DialogScanArtBinding; import it.integry.integrywmsnative.view.dialogs.DialogConsts; import it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_mtb_colr.DialogChooseArtFromListaMtbColrView; @@ -37,6 +36,8 @@ public class DialogScanArtView extends BaseDialogFragment implements DialogScanA @Inject DialogScanArtViewModel mViewModel; + private final boolean mForceOnlyUL; + private DialogScanArtBinding mBindings; private int mBarcodeScannerIstanceID; @@ -44,12 +45,13 @@ public class DialogScanArtView extends BaseDialogFragment implements DialogScanA private RunnableArgssss mOnItemChoosed = null; - public static DialogScanArtView newInstance(@NotNull RunnableArgssss onComplete) { - return new DialogScanArtView(onComplete); + public static DialogScanArtView newInstance(boolean forceOnlyUL, @NotNull RunnableArgssss onComplete) { + return new DialogScanArtView(forceOnlyUL, onComplete); } - private DialogScanArtView(RunnableArgssss onItemChoosed) { + private DialogScanArtView(boolean forceOnlyUL, RunnableArgssss onItemChoosed) { super(); + mForceOnlyUL = forceOnlyUL; mOnItemChoosed = onItemChoosed; } @@ -67,6 +69,7 @@ public class DialogScanArtView extends BaseDialogFragment implements DialogScanA .inject(this); this.mViewModel + .setForceOnlyUL(mForceOnlyUL) .setListener(this); getDialog().setCanceledOnTouchOutside(false); @@ -122,8 +125,7 @@ public class DialogScanArtView extends BaseDialogFragment implements DialogScanA @Override public void onError(Exception ex) { - this.closeProgress(); - UtilityExceptions.defaultException(getActivity(), ex); + super.onError(ex); BarcodeManager.enable(); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtViewModel.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtViewModel.java index 6fcb77f4..dc52a7f7 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtViewModel.java @@ -26,6 +26,8 @@ public class DialogScanArtViewModel { private final ColliMagazzinoRESTConsumer mColliMagazzinoRESTConsumer; private final ArticoloRESTConsumer mArticoloRESTConsumer; + private boolean mForceOnlyUL; + private Listener mListener; public DialogScanArtViewModel(BarcodeRESTConsumer barcodeRESTConsumer, ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer, ArticoloRESTConsumer articoloRESTConsumer) { @@ -34,6 +36,10 @@ public class DialogScanArtViewModel { this.mArticoloRESTConsumer = articoloRESTConsumer; } + public DialogScanArtViewModel setForceOnlyUL(boolean forceOnlyUL) { + this.mForceOnlyUL = forceOnlyUL; + return this; + } public void processBarcodeDTO(BarcodeScanDTO barcodeScanDTO, RunnableArgssss> onComplete) { if (UtilityBarcode.isEtichettaAnonima(barcodeScanDTO)) { @@ -44,12 +50,14 @@ 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) && !mForceOnlyUL) { this.executeEtichettaEan128(barcodeScanDTO, onComplete); - } else if(UtilityBarcode.isEanPeso(barcodeScanDTO)){ + } else if(UtilityBarcode.isEanPeso(barcodeScanDTO) && !mForceOnlyUL){ this.executeEtichettaEanPeso(barcodeScanDTO, onComplete); - } else { + } else if (!mForceOnlyUL){ this.loadArticolo(barcodeScanDTO.getStringValue(), null, onComplete); + } else { + this.sendError(new Exception("Barcode non valido")); } } diff --git a/build.gradle b/build.gradle index 999a8c17..666d9518 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.0.1' + classpath 'com.android.tools.build:gradle:7.0.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.5' classpath 'com.google.firebase:perf-plugin:1.3.5' From eb99c9d8cff639e6f16fb9c1bcf118dab2100213 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Fri, 10 Sep 2021 12:22:04 +0200 Subject: [PATCH 14/18] Aggiunto controllo su data scadenza < oggi --- .../integrywmsnative/core/di/Converters.java | 23 +++++++++++++++---- .../core/expansion/BaseDialogFragment.java | 14 +++++++++++ .../DialogInputQuantityV2View.java | 2 +- .../dialog_input_quantity_v2.xml | 4 +++- .../res/layout/dialog_input_quantity_v2.xml | 2 ++ 5 files changed, 39 insertions(+), 6 deletions(-) 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 089702ba..d36e21a0 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 @@ -2,6 +2,7 @@ package it.integry.integrywmsnative.core.di; import android.app.DatePickerDialog; import android.content.res.ColorStateList; +import android.text.SpannableString; import android.util.Log; import android.view.View; import android.widget.AutoCompleteTextView; @@ -37,11 +38,13 @@ import java.util.Locale; import it.integry.integrywmsnative.MainApplication; import it.integry.integrywmsnative.R; +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.UtilityDate; import it.integry.integrywmsnative.core.utility.UtilityNumber; import it.integry.integrywmsnative.core.utility.UtilityString; +import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; public class Converters { @@ -244,8 +247,8 @@ public class Converters { } } - @BindingAdapter({"binding"}) - public static void bindTextInputEditTextDate(TextInputEditText view, final ObservableField observableDate) { + @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); if (pair == null || pair.first != observableDate) { if (pair != null) { @@ -274,8 +277,20 @@ public class Converters { DatePickerDialog datePickerDialog = new DatePickerDialog(view.getContext(), (cView, year, month, day) -> { Date resultDate = new GregorianCalendar(year, month, day).getTime(); - view.setText(UtilityDate.formatDate(resultDate, UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN)); - observableDate.set(resultDate); + + if(parentFragment != null && warningOnOldDates && resultDate.before(new Date())) { + DialogSimpleMessageView + .makeWarningDialog(new SpannableString("Hai scelto una data precedente a quella odierna. Continuare?"), null, () -> { + view.setText(UtilityDate.formatDate(resultDate, UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN)); + observableDate.set(resultDate); + }, () -> { + + }) + .show(parentFragment.requireActivity().getSupportFragmentManager(), "tag"); + } else { + view.setText(UtilityDate.formatDate(resultDate, UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN)); + observableDate.set(resultDate); + } }, mYear, mMonth, mDay); datePickerDialog.show(); }; diff --git a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java index dbae356b..7ede3676 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/expansion/BaseDialogFragment.java @@ -2,12 +2,15 @@ package it.integry.integrywmsnative.core.expansion; import android.app.Dialog; import android.os.Bundle; +import android.util.Log; import android.view.KeyEvent; import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; import it.integry.integrywmsnative.core.utility.UtilityExceptions; @@ -23,6 +26,17 @@ public class BaseDialogFragment extends DialogFragment { } + @Override + public void show(FragmentManager manager, String tag) { + try { + FragmentTransaction ft = manager.beginTransaction(); + ft.add(this, tag); + ft.commit(); + } catch (IllegalStateException e) { + Log.d("ABSDIALOGFRAG", "Exception", e); + } + } + @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java index 82353801..f1abc006 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2View.java @@ -365,6 +365,6 @@ public class DialogInputQuantityV2View extends BaseDialogFragment implements Dia public void onError(Exception ex) { DialogSimpleMessageView .makeErrorDialog(new SpannableString(Html.fromHtml(ex.getMessage())), null, null) - .show(getActivity().getSupportFragmentManager(), "tag"); + .show(requireActivity().getSupportFragmentManager(), "tag"); } } diff --git a/app/src/main/res/layout-land-hdpi/dialog_input_quantity_v2.xml b/app/src/main/res/layout-land-hdpi/dialog_input_quantity_v2.xml index b259e83f..dfb091da 100644 --- a/app/src/main/res/layout-land-hdpi/dialog_input_quantity_v2.xml +++ b/app/src/main/res/layout-land-hdpi/dialog_input_quantity_v2.xml @@ -442,7 +442,9 @@ android:focusableInTouchMode="false" android:hint="@string/expire_date" android:inputType="text" - app:binding="@{view.currentDataScad}" /> + app:binding="@{view.currentDataScad}" + app:parentView="@{view}" + app:warningOnOldDates="@{true}" /> diff --git a/app/src/main/res/layout/dialog_input_quantity_v2.xml b/app/src/main/res/layout/dialog_input_quantity_v2.xml index b330b509..6d147a83 100644 --- a/app/src/main/res/layout/dialog_input_quantity_v2.xml +++ b/app/src/main/res/layout/dialog_input_quantity_v2.xml @@ -436,6 +436,8 @@ android:hint="@string/expire_date" android:focusableInTouchMode="false" app:binding="@{view.currentDataScad}" + app:warningOnOldDates="@{true}" + app:parentView="@{view}" android:inputType="text" /> From 6f15169157c03e63560db17636c6fcd1c961dafa Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Wed, 15 Sep 2021 18:56:52 +0200 Subject: [PATCH 15/18] =?UTF-8?q?Vario=20ed=20eliminazione=20delle=20perso?= =?UTF-8?q?nalizzazioni=20non=20pi=C3=B9=20necessarie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/runConfigurations/app_agricoper.xml | 60 --------- .idea/runConfigurations/app_frudis.xml | 60 --------- .idea/runConfigurations/app_gramm.xml | 60 --------- .idea/runConfigurations/app_ime.xml | 60 --------- .idea/runConfigurations/app_saporiveri.xml | 60 --------- .idea/runConfigurations/app_saporiveri_pv.xml | 60 --------- app/build.gradle | 2 +- .../MainApplicationModule.java | 4 +- .../integrywmsnative/core/model/MtbColr.java | 11 ++ .../core/model/MtbPartitaMag.java | 6 +- .../consumers/ColliMagazzinoRESTConsumer.java | 12 +- .../rest/consumers/EntityRESTConsumer.java | 6 +- .../rest/consumers/OrdiniRESTConsumer.java | 93 ++++++++++--- .../RettificaGiacenzeViewModel.java | 1 + .../gest/spedizione/SpedizioneActivity.java | 20 ++- .../gest/spedizione/SpedizioneViewModel.java | 109 +++++++++------ .../spedizione/ui/SpedizioneListAdapter.java | 9 +- .../spedizione/ui/SpedizioneListModel.java | 11 ++ .../DialogChooseBatchLotView.java | 13 +- build_all.bat | 6 - dynamic_agricoper/.gitignore | 1 - dynamic_agricoper/build.gradle | 27 ---- .../ExampleInstrumentedTest.java | 26 ---- .../src/main/AndroidManifest.xml | 14 -- .../dynamic_customization/DynamicContext.java | 29 ---- .../extensions/CustomConfiguration.java | 12 -- .../extensions/FiltroOrdiniVendita.java | 21 --- .../MenuConfigurationAGRICOPER.java | 53 -------- .../extensions/OrdiniVendita.java | 23 ---- .../ExampleUnitTest.java | 17 --- dynamic_frudis/.gitignore | 1 - dynamic_frudis/build.gradle | 25 ---- dynamic_frudis/src/main/AndroidManifest.xml | 14 -- .../dynamic_customization/DynamicContext.java | 29 ---- .../extensions/CustomConfiguration.java | 12 -- .../extensions/FiltroOrdiniVendita.java | 21 --- .../extensions/MenuConfigurationFRUDIS.java | 105 --------------- .../extensions/OrdiniVendita.java | 23 ---- dynamic_gramm/.gitignore | 1 - dynamic_gramm/build.gradle | 29 ---- .../ExampleInstrumentedTest.java | 18 --- dynamic_gramm/src/main/AndroidManifest.xml | 11 -- .../dynamic_customization/DynamicContext.java | 29 ---- .../extensions/CustomConfiguration.java | 12 -- .../extensions/FiltroOrdiniVendita.java | 21 --- .../extensions/MenuConfigurationGRAMM.java | 124 ------------------ .../extensions/OrdiniVendita.java | 23 ---- .../ExampleUnitTest.java | 17 --- dynamic_ime/.gitignore | 1 - dynamic_ime/build.gradle | 26 ---- dynamic_ime/src/main/AndroidManifest.xml | 12 -- .../dynamic_customization/DynamicContext.java | 29 ---- .../extensions/CustomConfiguration.java | 12 -- .../extensions/FiltroOrdiniVendita.java | 21 --- .../extensions/MenuConfigurationIME.java | 109 --------------- .../extensions/OrdiniVendita.java | 23 ---- dynamic_saporiveri/.gitignore | 1 - dynamic_saporiveri/build.gradle | 27 ---- .../src/main/AndroidManifest.xml | 14 -- .../dynamic_customization/DynamicContext.java | 31 ----- .../extensions/BarcodeCustomization.java | 14 -- .../extensions/CustomConfiguration.java | 11 -- .../extensions/FiltroOrdiniVendita.java | 21 --- .../extensions/OrdiniVendita.java | 23 ---- dynamic_saporiveri_pv/.gitignore | 1 - dynamic_saporiveri_pv/build.gradle | 27 ---- .../src/main/AndroidManifest.xml | 14 -- .../dynamic_customization/DynamicContext.java | 29 ---- .../extensions/CustomConfiguration.java | 13 -- .../extensions/FiltroOrdiniVendita.java | 21 --- .../MenuConfigurationSAPORIVERIPV.java | 49 ------- .../extensions/OrdiniVendita.java | 24 ---- settings.gradle | 4 +- 73 files changed, 205 insertions(+), 1753 deletions(-) delete mode 100644 .idea/runConfigurations/app_agricoper.xml delete mode 100644 .idea/runConfigurations/app_frudis.xml delete mode 100644 .idea/runConfigurations/app_gramm.xml delete mode 100644 .idea/runConfigurations/app_ime.xml delete mode 100644 .idea/runConfigurations/app_saporiveri.xml delete mode 100644 .idea/runConfigurations/app_saporiveri_pv.xml delete mode 100644 dynamic_agricoper/.gitignore delete mode 100644 dynamic_agricoper/build.gradle delete mode 100644 dynamic_agricoper/src/androidTest/java/it/integry/wms/dynamic_customization/ExampleInstrumentedTest.java delete mode 100644 dynamic_agricoper/src/main/AndroidManifest.xml delete mode 100644 dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java delete mode 100644 dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java delete mode 100644 dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java delete mode 100644 dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationAGRICOPER.java delete mode 100644 dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java delete mode 100644 dynamic_agricoper/src/test/java/it/integry/wms/dynamic_customization/ExampleUnitTest.java delete mode 100644 dynamic_frudis/.gitignore delete mode 100644 dynamic_frudis/build.gradle delete mode 100644 dynamic_frudis/src/main/AndroidManifest.xml delete mode 100644 dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java delete mode 100644 dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java delete mode 100644 dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java delete mode 100644 dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationFRUDIS.java delete mode 100644 dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java delete mode 100644 dynamic_gramm/.gitignore delete mode 100644 dynamic_gramm/build.gradle delete mode 100644 dynamic_gramm/src/androidTest/java/it/integry/wms/dynamic_customization/ExampleInstrumentedTest.java delete mode 100644 dynamic_gramm/src/main/AndroidManifest.xml delete mode 100644 dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java delete mode 100644 dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java delete mode 100644 dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java delete mode 100644 dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationGRAMM.java delete mode 100644 dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java delete mode 100644 dynamic_gramm/src/test/java/it/integry/wms/dynamic_customization/ExampleUnitTest.java delete mode 100644 dynamic_ime/.gitignore delete mode 100644 dynamic_ime/build.gradle delete mode 100644 dynamic_ime/src/main/AndroidManifest.xml delete mode 100644 dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java delete mode 100644 dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java delete mode 100644 dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java delete mode 100644 dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationIME.java delete mode 100644 dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java delete mode 100644 dynamic_saporiveri/.gitignore delete mode 100644 dynamic_saporiveri/build.gradle delete mode 100644 dynamic_saporiveri/src/main/AndroidManifest.xml delete mode 100644 dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java delete mode 100644 dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/BarcodeCustomization.java delete mode 100644 dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java delete mode 100644 dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java delete mode 100644 dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java delete mode 100644 dynamic_saporiveri_pv/.gitignore delete mode 100644 dynamic_saporiveri_pv/build.gradle delete mode 100644 dynamic_saporiveri_pv/src/main/AndroidManifest.xml delete mode 100644 dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java delete mode 100644 dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java delete mode 100644 dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java delete mode 100644 dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationSAPORIVERIPV.java delete mode 100644 dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java diff --git a/.idea/runConfigurations/app_agricoper.xml b/.idea/runConfigurations/app_agricoper.xml deleted file mode 100644 index 5736eb4f..00000000 --- a/.idea/runConfigurations/app_agricoper.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations/app_frudis.xml b/.idea/runConfigurations/app_frudis.xml deleted file mode 100644 index 802d974d..00000000 --- a/.idea/runConfigurations/app_frudis.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations/app_gramm.xml b/.idea/runConfigurations/app_gramm.xml deleted file mode 100644 index 1438cfb0..00000000 --- a/.idea/runConfigurations/app_gramm.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations/app_ime.xml b/.idea/runConfigurations/app_ime.xml deleted file mode 100644 index 4665b87a..00000000 --- a/.idea/runConfigurations/app_ime.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations/app_saporiveri.xml b/.idea/runConfigurations/app_saporiveri.xml deleted file mode 100644 index 969d5409..00000000 --- a/.idea/runConfigurations/app_saporiveri.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations/app_saporiveri_pv.xml b/.idea/runConfigurations/app_saporiveri_pv.xml deleted file mode 100644 index 8c8e7471..00000000 --- a/.idea/runConfigurations/app_saporiveri_pv.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 52cb3ed7..513e03c5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -78,7 +78,7 @@ android { abortOnError false } - dynamicFeatures = [":dynamic__base", ":dynamic_vgalimenti", ":dynamic_ime", ":dynamic_frudis", ":dynamic_saporiveri_pv", ":dynamic_saporiveri", ':dynamic_gramm', ':dynamic_agricoper'] + dynamicFeatures = [":dynamic__base", ":dynamic_vgalimenti"] } diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java index 1d72f32c..4bb1cddb 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java @@ -69,8 +69,8 @@ public class MainApplicationModule { @Provides @Singleton - OrdiniRESTConsumer provideOrdiniRESTConsumer(SystemRESTConsumer systemRESTConsumer) { - return new OrdiniRESTConsumer(systemRESTConsumer); + OrdiniRESTConsumer provideOrdiniRESTConsumer(SystemRESTConsumer systemRESTConsumer, EntityRESTConsumer entityRESTConsumer) { + return new OrdiniRESTConsumer(systemRESTConsumer, entityRESTConsumer); } @Provides diff --git a/app/src/main/java/it/integry/integrywmsnative/core/model/MtbColr.java b/app/src/main/java/it/integry/integrywmsnative/core/model/MtbColr.java index 673b0e2d..a73a097f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/model/MtbColr.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/model/MtbColr.java @@ -53,6 +53,8 @@ public class MtbColr extends EntityBase { private MtbAart mtbAart; private MtbPartitaMag mtbPartitaMag; + + private transient int id; private transient MtbColr refMtbColr; public MtbColr() { @@ -516,6 +518,15 @@ public class MtbColr extends EntityBase { return this; } + public int getId() { + return id; + } + + public MtbColr setId(int id) { + this.id = id; + return this; + } + public MtbColr getRefMtbColr() { return refMtbColr; } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/model/MtbPartitaMag.java b/app/src/main/java/it/integry/integrywmsnative/core/model/MtbPartitaMag.java index d54a04a2..f677fc1b 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/model/MtbPartitaMag.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/model/MtbPartitaMag.java @@ -5,7 +5,7 @@ import java.util.Date; import it.integry.integrywmsnative.core.utility.UtilityDate; -public class MtbPartitaMag { +public class MtbPartitaMag extends EntityBase{ private String codMart; private String partitaMag; @@ -30,6 +30,10 @@ public class MtbPartitaMag { private String partitaMagSec; private BigDecimal qtaAttesa; + public MtbPartitaMag() { + this.type = "mtb_partita_mag"; + } + public String getCodMart() { return codMart; diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java index c1164e65..c9bf2a9e 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/ColliMagazzinoRESTConsumer.java @@ -96,17 +96,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer { } } - this.mEntityRESTConsumer.processEntityList(mtbColtsToSave, new ISimpleOperationCallback>() { - @Override - public void onSuccess(List value) { - if (onComplete != null) onComplete.run(value); - } - - @Override - public void onFailed(Exception ex) { - if (onFailed != null) onFailed.run(ex); - } - }, true, MtbColt.class); + this.mEntityRESTConsumer.processEntityList(mtbColtsToSave, true, MtbColt.class, onComplete, onFailed); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/EntityRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/EntityRESTConsumer.java index 0d3a4fee..832f293d 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/EntityRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/EntityRESTConsumer.java @@ -66,11 +66,11 @@ public class EntityRESTConsumer extends _BaseRESTConsumer { } - public void processEntityList(List entitiesToSave, final ISimpleOperationCallback> callback, boolean singleTransaction, Class type) { + public void processEntityList(List entitiesToSave, boolean singleTransaction, Class type, final RunnableArgs> onComplete, final RunnableArgs onFailed) { RunnableArgs tmpFailed = ex -> { // UtilityExceptions.defaultException(null, ex); - if (callback != null) callback.onFailed(ex); + if (onFailed != null) onFailed.run(ex); }; EntityRESTConsumerService service = RESTBuilder.getService(EntityRESTConsumerService.class); @@ -99,7 +99,7 @@ public class EntityRESTConsumer extends _BaseRESTConsumer { } } - callback.onSuccess(responseList); + onComplete.run(responseList); } else { Log.e("EntityRESTConsumer", response.message()); tmpFailed.run(new Exception(response.message())); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/OrdiniRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/OrdiniRESTConsumer.java index 2b34d719..94ed5c74 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/OrdiniRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/OrdiniRESTConsumer.java @@ -1,5 +1,6 @@ package it.integry.integrywmsnative.core.rest.consumers; +import com.annimon.stream.Optional; import com.annimon.stream.Stream; import com.google.gson.reflect.TypeToken; import com.orhanobut.logger.Logger; @@ -8,22 +9,27 @@ import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Random; import javax.inject.Singleton; import it.integry.integrywmsnative.core.expansion.RunnableArgs; +import it.integry.integrywmsnative.core.model.CommonModelConsts; +import it.integry.integrywmsnative.core.model.MtbColr; import it.integry.integrywmsnative.core.model.MtbColt; +import it.integry.integrywmsnative.core.model.MtbPartitaMag; import it.integry.integrywmsnative.core.model.OrdineInevasoDTO; import it.integry.integrywmsnative.core.model.secondary.GestioneEnum; import it.integry.integrywmsnative.core.rest.RESTBuilder; +import it.integry.integrywmsnative.core.rest.model.GetPickingListDTO; +import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO; import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse; +import it.integry.integrywmsnative.core.rest.model.SitArtOrdDTO; import it.integry.integrywmsnative.core.utility.UtilityDB; import it.integry.integrywmsnative.core.utility.UtilityLogger; -import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO; import it.integry.integrywmsnative.core.utility.UtilityQuery; +import it.integry.integrywmsnative.core.utility.UtilityString; import it.integry.integrywmsnative.gest.spedizione.model.PickingObjectDTO; -import it.integry.integrywmsnative.core.rest.model.GetPickingListDTO; -import it.integry.integrywmsnative.core.rest.model.SitArtOrdDTO; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; @@ -32,9 +38,11 @@ import retrofit2.Response; public class OrdiniRESTConsumer extends _BaseRESTConsumer { private final SystemRESTConsumer mSystemRESTConsumer; + private final EntityRESTConsumer mEntityRESTConsumer; - public OrdiniRESTConsumer(SystemRESTConsumer systemRESTConsumer) { + public OrdiniRESTConsumer(SystemRESTConsumer systemRESTConsumer, EntityRESTConsumer entityRESTConsumer) { this.mSystemRESTConsumer = systemRESTConsumer; + this.mEntityRESTConsumer = entityRESTConsumer; } public void getSuggestedPickingList(String codMdep, List sitArtOrdList, RunnableArgs> onComplete, RunnableArgs onFailed) { @@ -43,10 +51,59 @@ public class OrdiniRESTConsumer extends _BaseRESTConsumer { service .getSuggestedPickingList(codMdep, sitArtOrdList) - .enqueue(new Callback>>() { + .enqueue(new Callback<>() { @Override public void onResponse(Call>> call, Response>> response) { - analyzeAnswer(response, "getSuggestedPickingList", onComplete, onFailed); + analyzeAnswer(response, "getSuggestedPickingList", pickingObjects -> { + List batchLotsToSearch = new ArrayList<>(); + + for (PickingObjectDTO pickingObjectDTO : pickingObjects) { + for (MtbColt mtbColt : pickingObjectDTO.getMtbColts()) { + Stream.of(mtbColt.getMtbColr()) + .filter(x -> !UtilityString.isNullOrEmpty(x.getPartitaMag())) + .forEach(x -> { + + if (!Stream.of(batchLotsToSearch).anyMatch(batchLotToSearch -> batchLotToSearch.getCodMart().equalsIgnoreCase(x.getCodMart()) && batchLotToSearch.getPartitaMag().equalsIgnoreCase(x.getPartitaMag()))) { + MtbPartitaMag mtbPartitaMag = new MtbPartitaMag() + .setCodMart(x.getCodMart()) + .setPartitaMag(x.getPartitaMag()); + + mtbPartitaMag.setOperation(CommonModelConsts.OPERATION.SELECT_OBJECT); + mtbPartitaMag.setOnlyPkMaster(false); + + batchLotsToSearch.add(mtbPartitaMag); + } + }); + } + } + + Random rand = new Random(); + + + retrievePartiteMag(batchLotsToSearch, partite -> { + + for (PickingObjectDTO pickingObjectDTO : pickingObjects) { + for (MtbColt mtbColt : pickingObjectDTO.getMtbColts()) { + for (MtbColr mtbColr : mtbColt.getMtbColr()) { + + mtbColr.setId(rand.nextInt()); + + Optional optionalMtbPartitaMag = Stream.of(partite) + .filter(x -> x.getCodMart().equalsIgnoreCase(mtbColr.getCodMart()) + && (!UtilityString.isNullOrEmpty(x.getPartitaMag()) && x.getPartitaMag().equalsIgnoreCase(mtbColr.getPartitaMag()))) + .findFirst(); + + if (optionalMtbPartitaMag.isPresent()) mtbColr.setMtbPartitaMag(optionalMtbPartitaMag.get()); + } + } + } + + onComplete.run(pickingObjects); + + }, onFailed); + + + }, onFailed); } @Override @@ -58,6 +115,11 @@ public class OrdiniRESTConsumer extends _BaseRESTConsumer { } + private void retrievePartiteMag(List partitaMag, RunnableArgs> onComplete, RunnableArgs onFailed) { + + this.mEntityRESTConsumer.processEntityList(partitaMag, true, MtbPartitaMag.class, onComplete, onFailed); + } + public void getOrdiniInevasi(String codMdep, GestioneEnum gestione, RunnableArgs> onComplete, RunnableArgs onFailed) { OrdiniRESTConsumerService service = RESTBuilder.getService(OrdiniRESTConsumerService.class); @@ -67,18 +129,18 @@ public class OrdiniRESTConsumer extends _BaseRESTConsumer { @Override public void onResponse(Call>> call, Response>> response) { analyzeAnswer(response, "getOrdiniInevasi", responseDtoList -> { - if(responseDtoList == null) responseDtoList = new ArrayList<>(); + if (responseDtoList == null) responseDtoList = new ArrayList<>(); onComplete.run(responseDtoList); }, ex -> { Logger.e(ex, "Errore durante il caricamento degli ordini di lavorazione"); - if(onFailed != null) onFailed.run(ex); + if (onFailed != null) onFailed.run(ex); }); } @Override public void onFailure(Call>> call, Throwable t) { Logger.e(t, "Errore durante il caricamento degli ordini di lavorazione"); - if(onFailed != null) onFailed.run(new Exception(t)); + if (onFailed != null) onFailed.run(new Exception(t)); } }); } @@ -113,7 +175,7 @@ public class OrdiniRESTConsumer extends _BaseRESTConsumer { public void getBancaliGiaRegistrati(List orders, GestioneEnum gestione, int segno, RunnableArgs> onComplete, RunnableArgs onFailed) { String whereCondGestione = ""; - if(gestione != null) { + if (gestione != null) { whereCondGestione = "mtb_colt.gestione = " + UtilityDB.valueToString(gestione.getText()) + " "; } else { whereCondGestione = "(mtb_colt.gestione = 'V' OR mtb_colt.gestione = 'L') "; @@ -142,12 +204,13 @@ public class OrdiniRESTConsumer extends _BaseRESTConsumer { baseSql += "(" + UtilityQuery.concatFieldListInWhereCond(whereCondMapList) + ")"; - Type typeOfObjectsList = new TypeToken>() {}.getType(); + Type typeOfObjectsList = new TypeToken>() { + }.getType(); this.mSystemRESTConsumer.>processSql(baseSql, typeOfObjectsList, value -> { - if(onComplete != null) onComplete.run(value); - }, ex -> { - if(onFailed != null) onFailed.run(ex); - }); + if (onComplete != null) onComplete.run(value); + }, ex -> { + if (onFailed != null) onFailed.run(ex); + }); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeViewModel.java index adc66c27..b43a9e68 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/rettifica_giacenze/RettificaGiacenzeViewModel.java @@ -568,6 +568,7 @@ public class RettificaGiacenzeViewModel { this.mAnyEditDone = true; this.sendOnRowSaved(); + this.sendOnLoadingEnded(); }, this::sendError ); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java index d26cefbd..51bc7754 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java @@ -263,12 +263,12 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo this.mBindings.spedizionePickingList.setAdapter(spedizioneListAdapter); this.mBindings.spedizionePickingList.setLayoutManager(new LinearLayoutManager(this)); - spedizioneListAdapter.setOnItemClicked((clickedItem, refMtbColt) -> { + spedizioneListAdapter.setOnItemClicked((clickedItem, refMtbColt, refMtbColr) -> { if (!noLUPresent.get() && ((SettingsManager.iDB().isFlagSpedizioneEnableManualPick() && clickedItem.getSitArtOrdDTO().isFlagEnablePickManuale()) || clickedItem.getTempPickData() != null)) { - this.mViewmodel.dispatchOrdineRow(clickedItem, refMtbColt, + this.mViewmodel.dispatchOrdineRow(clickedItem, refMtbColt, refMtbColr, SettingsManager.iDB().isFlagSpedizioneEnableManualPick() && clickedItem.getSitArtOrdDTO().isFlagEnablePickManuale()); } }); @@ -363,6 +363,7 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo cloneModel.setSubDescrizione1(String.format(getString(R.string.batch_lot_text), mtbColrToDispatch.getPartitaMag())); cloneModel.setBadge2(mtbColrToDispatch.getCodJcom()); } + cloneModel.setSourceMtbColr(mtbColrToDispatch); cloneModel.setSubDescrizione2(String.format(getString(R.string.lu_number_data_text), mtbColtToPick.getNumCollo(), UtilityDate.formatDate(mtbColtToPick.getDataColloD(), UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN))); @@ -379,14 +380,14 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo numCnfOrdCounter = numCnfOrdCounter.subtract(numCnfOrdToSubstract); BigDecimal qtaEvasa = Stream.of(x.getWithdrawMtbColrs()) - .filter(y -> y.getRefMtbColr() != null && + .filter(y -> y.getRefMtbColr() != null &&/* y.getRefMtbColr().getNumCollo().equals(mtbColrToDispatch.getNumCollo()) && y.getRefMtbColr().getDataColloD().equals(mtbColrToDispatch.getDataColloD()) && y.getRefMtbColr().getSerCollo().equals(mtbColrToDispatch.getSerCollo()) && y.getRefMtbColr().getGestioneEnum().equals(mtbColrToDispatch.getGestioneEnum()) && UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodMart(), mtbColrToDispatch.getCodMart()) && UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodTagl(), mtbColrToDispatch.getCodTagl()) && - UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodCol(), mtbColrToDispatch.getCodCol())) + UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodCol(), mtbColrToDispatch.getCodCol())*/ y.getRefMtbColr().equals(mtbColrToDispatch)) .map(MtbColr::getNumCnf) .reduce(BigDecimal.ZERO, BigDecimal::add); @@ -404,13 +405,15 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo BigDecimal qtaEvasa = Stream.of(x.getWithdrawMtbColrs()) .filter(y -> y.getRefMtbColr() != null && + y.getRefMtbColr().getId() == mtbColrToDispatch.getId() + /* y.getRefMtbColr().getNumCollo().equals(mtbColrToDispatch.getNumCollo()) && y.getRefMtbColr().getDataColloD().equals(mtbColrToDispatch.getDataColloD()) && y.getRefMtbColr().getSerCollo().equals(mtbColrToDispatch.getSerCollo()) && y.getRefMtbColr().getGestioneEnum().equals(mtbColrToDispatch.getGestioneEnum()) && UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodMart(), mtbColrToDispatch.getCodMart()) && UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodTagl(), mtbColrToDispatch.getCodTagl()) && - UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodCol(), mtbColrToDispatch.getCodCol())) + UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodCol(), mtbColrToDispatch.getCodCol())*/) .map(MtbColr::getQtaCol) .reduce(BigDecimal.ZERO, BigDecimal::add); @@ -528,6 +531,7 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo cloneModel.setSubDescrizione1(String.format(getString(R.string.batch_lot_text), mtbColrToDispatch.getPartitaMag())); cloneModel.setBadge2(mtbColrToDispatch.getCodJcom()); } + cloneModel.setSourceMtbColr(mtbColrToDispatch); cloneModel.setSubDescrizione2(String.format(getString(R.string.lu_number_data_text), mtbColtToPick.getNumCollo(), UtilityDate.formatDate(mtbColtToPick.getDataColloD(), UtilityDate.COMMONS_DATE_FORMATS.DMY_HUMAN))); @@ -545,13 +549,14 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo BigDecimal qtaEvasa = Stream.of(x.getWithdrawMtbColrs()) .filter(y -> y.getRefMtbColr() != null && + y.getRefMtbColr().getId() == mtbColrToDispatch.getId() /* y.getRefMtbColr().getNumCollo().equals(mtbColrToDispatch.getNumCollo()) && y.getRefMtbColr().getDataColloD().equals(mtbColrToDispatch.getDataColloD()) && y.getRefMtbColr().getSerCollo().equals(mtbColrToDispatch.getSerCollo()) && y.getRefMtbColr().getGestioneEnum().equals(mtbColrToDispatch.getGestioneEnum()) && UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodMart(), mtbColrToDispatch.getCodMart()) && UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodTagl(), mtbColrToDispatch.getCodTagl()) && - UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodCol(), mtbColrToDispatch.getCodCol())) + UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodCol(), mtbColrToDispatch.getCodCol())*/) .map(MtbColr::getNumCnf) .reduce(BigDecimal.ZERO, BigDecimal::add); @@ -567,13 +572,14 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo BigDecimal qtaEvasa = Stream.of(x.getWithdrawMtbColrs()) .filter(y -> y.getRefMtbColr() != null && + y.getRefMtbColr().getId() == mtbColrToDispatch.getId() /* y.getRefMtbColr().getNumCollo().equals(mtbColrToDispatch.getNumCollo()) && y.getRefMtbColr().getDataColloD().equals(mtbColrToDispatch.getDataColloD()) && y.getRefMtbColr().getSerCollo().equals(mtbColrToDispatch.getSerCollo()) && y.getRefMtbColr().getGestioneEnum().equals(mtbColrToDispatch.getGestioneEnum()) && UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodMart(), mtbColrToDispatch.getCodMart()) && UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodTagl(), mtbColrToDispatch.getCodTagl()) && - UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodCol(), mtbColrToDispatch.getCodCol())) + UtilityString.equalsIgnoreCase(y.getRefMtbColr().getCodCol(), mtbColrToDispatch.getCodCol())*/) .map(MtbColr::getQtaCol) .reduce(BigDecimal.ZERO, BigDecimal::add); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java index d557362a..93e26713 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java @@ -742,7 +742,7 @@ public class SpedizioneViewModel { this.sendFilterApplied(null); this.getPickingList().postValue(pickingList); } else { - this.dispatchOrdineRow(matchedItem, matchedItem.getRefMtbColt(), false); + this.dispatchOrdineRow(matchedItem, matchedItem.getRefMtbColt(), matchedItem.getRefMtbColt().getMtbColr().get(0), false); } } else { @@ -761,9 +761,11 @@ public class SpedizioneViewModel { } - public void dispatchOrdineRow(final PickingObjectDTO pickingObjectDTO, MtbColt refMtbColt, boolean canPartitaMagBeChanged) { + public void dispatchOrdineRow(final PickingObjectDTO pickingObjectDTO, MtbColt refMtbColt, MtbColr refMtbColr, boolean canPartitaMagBeChanged) { //TODO: Al posto di prelevare la prima riga bisognerebbe controllare se c'è ne una che corrisponde con la partita richiesta +// MtbColr refMtbColr = refMtbColt != null ? refMtbColt.getMtbColr().get(0) : null; + if (pickingObjectDTO.getTempPickData() != null && pickingObjectDTO.getTempPickData().getSourceMtbColt() != null && @@ -771,30 +773,46 @@ public class SpedizioneViewModel { List scannedMtbColrs = pickingObjectDTO.getTempPickData().getSourceMtbColt().getMtbColr(); - List availableBatchLot = Stream.of(scannedMtbColrs) + List availableBatchLots = Stream.of(scannedMtbColrs) .filter(x -> x.getCodMart().equalsIgnoreCase(pickingObjectDTO.getMtbAart().getCodMart()) && ( - x.getPartitaMag() == null || UtilityString.isNullOrEmpty(x.getMtbPartitaMag().getDataScadS()) || UtilityDate.getDateInstance().before(x.getMtbPartitaMag().getDataScadD()) + x.getPartitaMag() == null || + UtilityString.isNullOrEmpty(x.getMtbPartitaMag().getDataScadS()) || + UtilityDate.getDateInstance().before(x.getMtbPartitaMag().getDataScadD()) )) .distinctBy(MtbColr::getPartitaMag) .map(x -> x.getPartitaMag() == null ? new MtbPartitaMag().setCodMart(x.getMtbAart().getCodMart()) : x.getMtbPartitaMag()) .toList(); - if(availableBatchLot.size() > 1) { + //Controllo se una delle partite combacia con quella che voglio evadere + if(refMtbColr != null && refMtbColr.getMtbPartitaMag() != null) { + MtbPartitaMag refMtbPartitaMag = refMtbColr.getMtbPartitaMag(); + + Optional matchPartitaMag = Stream.of(availableBatchLots) + .filter(availableBatchLot -> refMtbPartitaMag.getPartitaMag().equalsIgnoreCase(availableBatchLot.getPartitaMag())) + .findFirst(); + + if(matchPartitaMag.isPresent()) { + availableBatchLots.clear(); + availableBatchLots.add(refMtbPartitaMag); + } + } + + if(availableBatchLots.size() > 1) { this.sendOnLoadingStarted(); List tmp = new ArrayList<>(); - if(Stream.of(availableBatchLot).anyMatch(x -> !UtilityString.isNullOrEmpty(x.getDataScadS()))) { + if(Stream.of(availableBatchLots).anyMatch(x -> !UtilityString.isNullOrEmpty(x.getDataScadS()))) { tmp.addAll( - Stream.of(availableBatchLot) + Stream.of(availableBatchLots) .filter(x -> !UtilityString.isNullOrEmpty(x.getDataScadS()) && UtilityDate.getDateInstance().before(x.getDataScadD())) .sortBy(MtbPartitaMag::getDataScadD) .toList()); } - if(Stream.of(availableBatchLot).anyMatch(x -> UtilityString.isNullOrEmpty(x.getDataScadS()))) { + if(Stream.of(availableBatchLots).anyMatch(x -> UtilityString.isNullOrEmpty(x.getDataScadS()))) { tmp.addAll( - Stream.of(availableBatchLot) + Stream.of(availableBatchLots) .filter(x -> UtilityString.isNullOrEmpty(x.getDataScadS())) .sortBy(MtbPartitaMag::getPartitaMag) .toList()); @@ -811,22 +829,22 @@ public class SpedizioneViewModel { .toList() .get(0); - dispatchOrdineRowOnPostBatchLotSelection(pickingObjectDTO, refMtbColt, scannedMtbColr, canPartitaMagBeChanged); + dispatchOrdineRowOnPostBatchLotSelection(pickingObjectDTO, refMtbColt, refMtbColr, scannedMtbColr, canPartitaMagBeChanged); } }); } else { - dispatchOrdineRowOnPostBatchLotSelection(pickingObjectDTO, refMtbColt, scannedMtbColrs.get(0), canPartitaMagBeChanged); + dispatchOrdineRowOnPostBatchLotSelection(pickingObjectDTO, refMtbColt, refMtbColr, scannedMtbColrs.get(0), canPartitaMagBeChanged); } } else { - dispatchOrdineRowOnPostBatchLotSelection(pickingObjectDTO, refMtbColt, null, canPartitaMagBeChanged); + dispatchOrdineRowOnPostBatchLotSelection(pickingObjectDTO, refMtbColt, refMtbColr, null, canPartitaMagBeChanged); } } - private void dispatchOrdineRowOnPostBatchLotSelection(final PickingObjectDTO pickingObjectDTO, MtbColt refMtbColt, MtbColr scannedMtbColr, boolean canPartitaMagBeChanged) { + private void dispatchOrdineRowOnPostBatchLotSelection(final PickingObjectDTO pickingObjectDTO, MtbColt refMtbColt, MtbColr refMtbColr, MtbColr scannedMtbColr, boolean canPartitaMagBeChanged) { BigDecimal totalQtaOrd = pickingObjectDTO.getSitArtOrdDTO().getQtaOrd(); BigDecimal totalNumCnfOrd = pickingObjectDTO.getSitArtOrdDTO().getNumCnfOrd(); BigDecimal qtaCnfOrd = pickingObjectDTO.getSitArtOrdDTO().getQtaCnfOrd(); @@ -864,45 +882,48 @@ public class SpedizioneViewModel { refMtbColt = pickingObjectDTO.getMtbColts().get(0); } - MtbColr refMtbColr = null; +// MtbColr refMtbColr = null; +// +// if (scannedMtbColr != null && refMtbColt != null && refMtbColt.getMtbColr().size() > 0) { +// Optional optionalMtbColr = Stream.of(refMtbColt.getMtbColr()) +// .filter(y -> UtilityString.equalsIgnoreCase(y.getCodMart(), scannedMtbColr.getCodMart()) && +// UtilityString.equalsIgnoreCase(y.getCodTagl(), scannedMtbColr.getCodTagl()) && +// UtilityString.equalsIgnoreCase(y.getCodCol(), scannedMtbColr.getCodCol()) && +// (!mEnableCheckPartitaMag || UtilityString.equalsIgnoreCase(y.getPartitaMag(), scannedMtbColr.getPartitaMag()) || UtilityString.isNullOrEmpty(scannedMtbColr.getPartitaMag()))) +// .findFirst(); +// +// if (optionalMtbColr.isPresent()) refMtbColr = optionalMtbColr.get(); +// } - if (scannedMtbColr != null && refMtbColt != null && refMtbColt.getMtbColr().size() > 0) { - Optional optionalMtbColr = Stream.of(refMtbColt.getMtbColr()) - .filter(y -> UtilityString.equalsIgnoreCase(y.getCodMart(), scannedMtbColr.getCodMart()) && - UtilityString.equalsIgnoreCase(y.getCodTagl(), scannedMtbColr.getCodTagl()) && - UtilityString.equalsIgnoreCase(y.getCodCol(), scannedMtbColr.getCodCol()) && - (!mEnableCheckPartitaMag || UtilityString.equalsIgnoreCase(y.getPartitaMag(), scannedMtbColr.getPartitaMag()) || UtilityString.isNullOrEmpty(scannedMtbColr.getPartitaMag()))) - .findFirst(); - if (optionalMtbColr.isPresent()) refMtbColr = optionalMtbColr.get(); - } - - MtbColr mtbColrToUse = scannedMtbColr != null ? scannedMtbColr : refMtbColr; - - if (mtbColrToUse != null) { + if(refMtbColr != null) { if (pickingObjectDTO.getMtbAart().isFlagQtaCnfFissaBoolean()) { - if (UtilityBigDecimal.equalsOrLowerThan(mtbColrToUse.getQtaCol(), qtaDaEvadere)) { - numCnfDaPrelevare = mtbColrToUse.getNumCnf(); - qtaColDaPrelevare = mtbColrToUse.getQtaCol(); + if (UtilityBigDecimal.equalsOrLowerThan(refMtbColr.getQtaCol(), qtaDaEvadere)) { + numCnfDaPrelevare = refMtbColr.getNumCnf(); + qtaColDaPrelevare = refMtbColr.getQtaCol(); } else { numCnfDaPrelevare = numCnfDaEvadere; qtaColDaPrelevare = qtaDaEvadere; } - qtaCnfDaPrelevare = mtbColrToUse.getQtaCnf(); + qtaCnfDaPrelevare = refMtbColr.getQtaCnf(); } else { - if (UtilityBigDecimal.equalsOrLowerThan(mtbColrToUse.getNumCnf(), numCnfDaEvadere)) { - numCnfDaPrelevare = mtbColrToUse.getNumCnf(); - qtaCnfDaPrelevare = mtbColrToUse.getQtaCnf(); - qtaColDaPrelevare = mtbColrToUse.getQtaCol(); + if (UtilityBigDecimal.equalsOrLowerThan(refMtbColr.getNumCnf(), numCnfDaEvadere)) { + numCnfDaPrelevare = refMtbColr.getNumCnf(); + qtaCnfDaPrelevare = refMtbColr.getQtaCnf(); + qtaColDaPrelevare = refMtbColr.getQtaCol(); } else { numCnfDaPrelevare = numCnfDaEvadere; qtaColDaPrelevare = qtaDaEvadere; qtaCnfDaPrelevare = qtaCnfDaEvadere; } } + } + MtbColr mtbColrToUse = scannedMtbColr != null ? scannedMtbColr : refMtbColr; + if (mtbColrToUse != null) { + totalQtaAvailable = mtbColrToUse.getQtaCol(); totalNumCnfAvailable = mtbColrToUse.getNumCnf(); qtaCnfAvailable = mtbColrToUse.getQtaCnf(); @@ -1344,7 +1365,7 @@ public class SpedizioneViewModel { .setDatetimeRow(UtilityDate.getDateInstance()); //TODO: Al posto di prelevare la prima riga bisognerebbe controllare se c'è ne una che corrisponde con la partita richiesta - MtbColr mtbColrToDispatch = pickingObjectDTO.getTempPickData() != null && + final MtbColr mtbColrToDispatch = pickingObjectDTO.getTempPickData() != null && pickingObjectDTO.getTempPickData().getSourceMtbColt() != null && pickingObjectDTO.getTempPickData().getSourceMtbColt().getMtbColr() != null && pickingObjectDTO.getTempPickData().getSourceMtbColt().getMtbColr().size() > 0 ? @@ -1400,7 +1421,6 @@ public class SpedizioneViewModel { shouldPrint = false; } - if (UtilityBigDecimal.equalsTo(numCnf, BigDecimal.ZERO) && UtilityBigDecimal.equalsTo(qtaTot, BigDecimal.ZERO)) { resetMatchedRows(); this.sendOnLoadingEnded(); @@ -1430,6 +1450,15 @@ public class SpedizioneViewModel { .setCodCol(mtbColr.getCodCol()); if (refMtbColt != null) { + + MtbColr originalRefMtbColr = refMtbColt.getMtbColr() != null && + refMtbColt.getMtbColr().size() > 0 ? + refMtbColt.getMtbColr().get(0) : null; + + if(originalRefMtbColr != null) { + refMtbColr.setId(originalRefMtbColr.getId()); + } + refMtbColr .setNumCollo(refMtbColt.getNumCollo()) .setDataCollo(refMtbColt.getDataColloS()) @@ -1557,10 +1586,8 @@ public class SpedizioneViewModel { public void closeLU(boolean shouldPrint) { if (mCurrentMtbColt == null) return; - this.sendOnLoadingStarted(); - mColliMagazzinoRESTConsumer.canLUBeDeleted(mCurrentMtbColt, canBeDeleted -> { if (canBeDeleted) { @@ -1641,12 +1668,8 @@ public class SpedizioneViewModel { } }); } - } - }, this::sendError); - - } private void distribuisciLU(RunnableArgs> onComplete) { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/ui/SpedizioneListAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/ui/SpedizioneListAdapter.java index 16ad0f55..68fa2471 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/ui/SpedizioneListAdapter.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/ui/SpedizioneListAdapter.java @@ -24,7 +24,8 @@ import java.util.List; import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.expansion.OnListGeneralChangedCallback; import it.integry.integrywmsnative.core.expansion.OnSingleClickListener; -import it.integry.integrywmsnative.core.expansion.RunnableArgss; +import it.integry.integrywmsnative.core.expansion.RunnableArgsss; +import it.integry.integrywmsnative.core.model.MtbColr; import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityNumber; @@ -41,7 +42,7 @@ public class SpedizioneListAdapter extends SectionedRecyclerViewAdapter mDataset = new ArrayList<>(); - private RunnableArgss mOnItemClicked; + private RunnableArgsss mOnItemClicked; static class SubheaderHolder extends RecyclerView.ViewHolder { @@ -81,7 +82,7 @@ public class SpedizioneListAdapter extends SectionedRecyclerViewAdapter onItemClicked) { + public void setOnItemClicked(RunnableArgsss onItemClicked) { this.mOnItemClicked = onItemClicked; } @@ -159,7 +160,7 @@ public class SpedizioneListAdapter extends SectionedRecyclerViewAdapter { if (this.mOnItemClicked != null) - this.mOnItemClicked.run(pickingObjectDTO.getOriginalModel(), pickingObjectDTO.getSourceMtbColt()); + this.mOnItemClicked.run(pickingObjectDTO.getOriginalModel(), pickingObjectDTO.getSourceMtbColt(), pickingObjectDTO.getSourceMtbColr()); }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/ui/SpedizioneListModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/ui/SpedizioneListModel.java index 8e8181e9..43269d14 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/ui/SpedizioneListModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/ui/SpedizioneListModel.java @@ -4,6 +4,7 @@ import org.jetbrains.annotations.NotNull; import java.math.BigDecimal; +import it.integry.integrywmsnative.core.model.MtbColr; import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.gest.spedizione.model.PickingObjectDTO; @@ -26,6 +27,7 @@ public class SpedizioneListModel implements Cloneable { private PickingObjectDTO mOriginalModel; private MtbColt mSourceMtbColt; + private MtbColr mSourceMtbColr; @NotNull @Override @@ -153,4 +155,13 @@ public class SpedizioneListModel implements Cloneable { this.mSourceMtbColt = sourceMtbColt; return this; } + + public MtbColr getSourceMtbColr() { + return mSourceMtbColr; + } + + public SpedizioneListModel setSourceMtbColr(MtbColr sourceMtbColr) { + this.mSourceMtbColr = sourceMtbColr; + return this; + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_batch_lot/DialogChooseBatchLotView.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_batch_lot/DialogChooseBatchLotView.java index 2a7d8fb1..005653d7 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_batch_lot/DialogChooseBatchLotView.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/choose_batch_lot/DialogChooseBatchLotView.java @@ -1,6 +1,7 @@ package it.integry.integrywmsnative.view.dialogs.choose_batch_lot; import android.content.Context; +import android.content.DialogInterface; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; @@ -32,14 +33,12 @@ public class DialogChooseBatchLotView extends BaseDialogFragment { @Inject DialogChooseBatchLotViewModel mViewModel; - private List mAvailableBatchLot; - private RunnableArgs mOnItemSelected; + private final List mAvailableBatchLot; + private final RunnableArgs mOnItemSelected; private Context mContext; private DialogChooseBatchLotBinding mBindings; - private DialogChooseBatchLotAdapter mAdapter; - private MtbPartitaMag mSelectedItem; public static DialogChooseBatchLotView newInstance(List availableBatchLot, RunnableArgs onItemSelected) { @@ -82,8 +81,8 @@ public class DialogChooseBatchLotView extends BaseDialogFragment { } @Override - public void dismiss() { - super.dismiss(); + public void onDismiss(@NonNull DialogInterface dialog) { + super.onDismiss(dialog); if(mOnItemSelected != null) { this.mOnItemSelected.run(mSelectedItem); @@ -99,7 +98,7 @@ public class DialogChooseBatchLotView extends BaseDialogFragment { itemDecorator.setDrawable(ContextCompat.getDrawable(mContext, R.drawable.divider)); mBindings.mainList.addItemDecoration(itemDecorator); - mAdapter = new DialogChooseBatchLotAdapter(mAvailableBatchLot, onItemClicked); + DialogChooseBatchLotAdapter mAdapter = new DialogChooseBatchLotAdapter(mAvailableBatchLot, onItemClicked); mBindings.mainList.setAdapter(mAdapter); } diff --git a/build_all.bat b/build_all.bat index 6c731ebe..94ac1622 100644 --- a/build_all.bat +++ b/build_all.bat @@ -1,8 +1,2 @@ call build_azienda.bat _base -call build_azienda.bat agricoper -call build_azienda.bat frudis -call build_azienda.bat gramm -call build_azienda.bat ime -call build_azienda.bat saporiveri_pv -call build_azienda.bat saporiveri call build_azienda.bat vgalimenti \ No newline at end of file diff --git a/dynamic_agricoper/.gitignore b/dynamic_agricoper/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/dynamic_agricoper/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/dynamic_agricoper/build.gradle b/dynamic_agricoper/build.gradle deleted file mode 100644 index f0211172..00000000 --- a/dynamic_agricoper/build.gradle +++ /dev/null @@ -1,27 +0,0 @@ -plugins { - id 'com.android.dynamic-feature' -} -android { - compileSdk 30 - - defaultConfig { - minSdk 21 - targetSdk 30 - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':app') - - implementation 'androidx.appcompat:appcompat:1.2.0' -} diff --git a/dynamic_agricoper/src/androidTest/java/it/integry/wms/dynamic_customization/ExampleInstrumentedTest.java b/dynamic_agricoper/src/androidTest/java/it/integry/wms/dynamic_customization/ExampleInstrumentedTest.java deleted file mode 100644 index 32e9a1db..00000000 --- a/dynamic_agricoper/src/androidTest/java/it/integry/wms/dynamic_customization/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package it.integry.wms.dynamic_customization; - -import android.content.Context; - -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - assertEquals("it.integry.wms.dynamic_customization", appContext.getPackageName()); - } -} \ No newline at end of file diff --git a/dynamic_agricoper/src/main/AndroidManifest.xml b/dynamic_agricoper/src/main/AndroidManifest.xml deleted file mode 100644 index b2892323..00000000 --- a/dynamic_agricoper/src/main/AndroidManifest.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java b/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java deleted file mode 100644 index ebaa46ce..00000000 --- a/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java +++ /dev/null @@ -1,29 +0,0 @@ -package it.integry.wms.dynamic_customization; - -import android.content.Context; -import android.util.Log; - -import it.integry.integrywmsnative.core.class_router.ClassRouter; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.wms.dynamic_customization.extensions.CustomConfiguration; -import it.integry.wms.dynamic_customization.extensions.FiltroOrdiniVendita; -import it.integry.wms.dynamic_customization.extensions.OrdiniVendita; - -public class DynamicContext { - - public void init(Context context) { - Log.d("DynamicContext", "Caricamento personalizzazioni per Azienda Agricoper"); - - try { - ClassRouter.registerPath(ClassRouter.PATH.FILTRO_ORDINI_VENDITA, FiltroOrdiniVendita.class); - ClassRouter.registerPath(ClassRouter.PATH.ORDINI_VENDITA, OrdiniVendita.class); - ClassRouter.registerPath(ClassRouter.PATH.CUSTOM_CONFIGURATION, CustomConfiguration.class); - } catch (Exception ex) { - UtilityExceptions.defaultException(context, ex); - } - - Log.d("DynamicContext", "Caricamento personalizzazioni per Azienda Agricoper COMPLETATO"); - - } - -} diff --git a/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java b/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java deleted file mode 100644 index e5d3efbf..00000000 --- a/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java +++ /dev/null @@ -1,12 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.BaseCustomConfiguration; -import it.integry.integrywmsnative.core.class_router.interfaces.ICustomConfiguration; - -public class CustomConfiguration extends BaseCustomConfiguration implements ICustomConfiguration { - - public CustomConfiguration() { - configurations.put(Keys.MENU_CONFIGURATION, new MenuConfigurationAGRICOPER()); - } - -} diff --git a/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java b/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java deleted file mode 100644 index 77adb537..00000000 --- a/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java +++ /dev/null @@ -1,21 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.interfaces.IFiltroOrdiniVendita; - -public class FiltroOrdiniVendita implements IFiltroOrdiniVendita { - - @Override - public boolean shoudShowCodMdepFilter() { - return false; - } - - @Override - public boolean shoudShowIdViaggioFilter() { - return false; - } - - @Override - public boolean shoudShowAgenteFilter() { - return false; - } -} diff --git a/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationAGRICOPER.java b/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationAGRICOPER.java deleted file mode 100644 index ab851f87..00000000 --- a/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationAGRICOPER.java +++ /dev/null @@ -1,53 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.configs.BaseMenuConfiguration; -import it.integry.integrywmsnative.gest.prod_rientro_merce.ProdRientroMerceFragment; -import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeFragment; -import it.integry.integrywmsnative.gest.versamento_merce.VersamentoMerceFragment; - -public class MenuConfigurationAGRICOPER extends BaseMenuConfiguration { - - public MenuConfigurationAGRICOPER() { - - - - this - .addGroup( - new MenuGroup() - .setGroupText(it.integry.integrywmsnative.R.string.manufacture) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_produzione) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_prod_rientro_merce) - .setTitleText(it.integry.integrywmsnative.R.string.rientro_merce_fragment_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_prod_accettazione_produzione) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_external) - .setFragmentFactory(ProdRientroMerceFragment::newInstance)) - - ).addGroup( - new MenuGroup() - .setGroupText(it.integry.integrywmsnative.R.string.internal_handling) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_movimentazione_interna) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_versamento_merce) - .setTitleText(it.integry.integrywmsnative.R.string.versamento_merce_fragment_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_versamento_merce) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_load_shelf) - .setFragmentFactory(VersamentoMerceFragment::newInstance)) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_rettifica_giacenze) - .setTitleText(it.integry.integrywmsnative.R.string.rettifica_giacenze_fragment_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_rettifica_giacenze) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_empty_box) - .setFragmentFactory(RettificaGiacenzeFragment::newInstance)) - - - ); - - - - } - -} diff --git a/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java b/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java deleted file mode 100644 index e5c916e6..00000000 --- a/dynamic_agricoper/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java +++ /dev/null @@ -1,23 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import java.util.List; - -import it.integry.integrywmsnative.core.class_router.interfaces.IOrdiniVendita; -import it.integry.integrywmsnative.core.expansion.RunnableArgs; -import it.integry.integrywmsnative.core.model.MtbColt; -import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; -import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO; -import it.integry.integrywmsnative.core.settings.SettingsManager; - -public class OrdiniVendita implements IOrdiniVendita { - - - @Override - public void distribuisciCollo(MtbColt mtbColt, List testateOrdini, RunnableArgs> onComplete, RunnableArgs onFailed) { -// UtilityToast.showToast("Avviato metodo in BaseFeature"); - - ColliMagazzinoRESTConsumer.distribuisciCollo(mtbColt, SettingsManager.iDB().getDefaultCriterioDistribuzione(), - onComplete, - onFailed); - } -} diff --git a/dynamic_agricoper/src/test/java/it/integry/wms/dynamic_customization/ExampleUnitTest.java b/dynamic_agricoper/src/test/java/it/integry/wms/dynamic_customization/ExampleUnitTest.java deleted file mode 100644 index 1e97227b..00000000 --- a/dynamic_agricoper/src/test/java/it/integry/wms/dynamic_customization/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package it.integry.wms.dynamic_customization; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file diff --git a/dynamic_frudis/.gitignore b/dynamic_frudis/.gitignore deleted file mode 100644 index 796b96d1..00000000 --- a/dynamic_frudis/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/dynamic_frudis/build.gradle b/dynamic_frudis/build.gradle deleted file mode 100644 index 8c659f3a..00000000 --- a/dynamic_frudis/build.gradle +++ /dev/null @@ -1,25 +0,0 @@ -plugins { - id 'com.android.dynamic-feature' -} - -android { - compileSdkVersion 30 - - defaultConfig { - minSdkVersion 21 - - } - compileOptions { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 - } - - -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':app') - - implementation 'androidx.appcompat:appcompat:1.2.0' -} diff --git a/dynamic_frudis/src/main/AndroidManifest.xml b/dynamic_frudis/src/main/AndroidManifest.xml deleted file mode 100644 index a4fad88a..00000000 --- a/dynamic_frudis/src/main/AndroidManifest.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - diff --git a/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java b/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java deleted file mode 100644 index 2a98ae74..00000000 --- a/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java +++ /dev/null @@ -1,29 +0,0 @@ -package it.integry.wms.dynamic_customization; - -import android.content.Context; -import android.util.Log; - -import it.integry.integrywmsnative.core.class_router.ClassRouter; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.wms.dynamic_customization.extensions.CustomConfiguration; -import it.integry.wms.dynamic_customization.extensions.FiltroOrdiniVendita; -import it.integry.wms.dynamic_customization.extensions.OrdiniVendita; - -public class DynamicContext { - - public void init(Context context) { - Log.d("DynamicContext", "Caricamento personalizzazioni per Frudis"); - - try { - ClassRouter.registerPath(ClassRouter.PATH.FILTRO_ORDINI_VENDITA, FiltroOrdiniVendita.class); - ClassRouter.registerPath(ClassRouter.PATH.ORDINI_VENDITA, OrdiniVendita.class); - ClassRouter.registerPath(ClassRouter.PATH.CUSTOM_CONFIGURATION, CustomConfiguration.class); - } catch (Exception ex) { - UtilityExceptions.defaultException(context, ex); - } - - Log.d("DynamicContext", "Caricamento personalizzazioni per Frudis COMPLETATO"); - - } - -} diff --git a/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java b/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java deleted file mode 100644 index f01ceee4..00000000 --- a/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java +++ /dev/null @@ -1,12 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.BaseCustomConfiguration; -import it.integry.integrywmsnative.core.class_router.interfaces.ICustomConfiguration; - -public class CustomConfiguration extends BaseCustomConfiguration implements ICustomConfiguration { - - public CustomConfiguration() { - configurations.put(Keys.MENU_CONFIGURATION, new MenuConfigurationFRUDIS()); - } - -} diff --git a/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java b/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java deleted file mode 100644 index 77adb537..00000000 --- a/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java +++ /dev/null @@ -1,21 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.interfaces.IFiltroOrdiniVendita; - -public class FiltroOrdiniVendita implements IFiltroOrdiniVendita { - - @Override - public boolean shoudShowCodMdepFilter() { - return false; - } - - @Override - public boolean shoudShowIdViaggioFilter() { - return false; - } - - @Override - public boolean shoudShowAgenteFilter() { - return false; - } -} diff --git a/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationFRUDIS.java b/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationFRUDIS.java deleted file mode 100644 index a9c9749d..00000000 --- a/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationFRUDIS.java +++ /dev/null @@ -1,105 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.configs.BaseMenuConfiguration; -import it.integry.integrywmsnative.core.model.secondary.GestioneEnum; -import it.integry.integrywmsnative.gest.ordini_uscita_elenco.OrdiniUscitaElencoFragment; -import it.integry.integrywmsnative.gest.picking_libero.PickingLiberoFragment; -import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ProdOrdineProduzioneElencoFragment; -import it.integry.integrywmsnative.gest.prod_recupero_materiale.ProdRecuperoMaterialeFragment; -import it.integry.integrywmsnative.gest.prod_versamento_materiale.ProdVersamentoMaterialeFragment; -import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeFragment; -import it.integry.integrywmsnative.gest.ultime_consegne_cliente.UltimeConsegneClienteFragment; -import it.integry.integrywmsnative.gest.versamento_merce.VersamentoMerceFragment; - -public class MenuConfigurationFRUDIS extends BaseMenuConfiguration { - - public MenuConfigurationFRUDIS() { - - - this - .addGroup( - new MenuGroup() - .setGroupText(it.integry.integrywmsnative.R.string.checkout) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_spedizione) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_spedizione) - .setTitleText(it.integry.integrywmsnative.R.string.vendita_title_fragment) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_spedizione) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_upload) - .setFragmentFactory(() -> OrdiniUscitaElencoFragment.newInstance(GestioneEnum.VENDITA, null, -1, null))) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_free_picking) - .setTitleText(it.integry.integrywmsnative.R.string.free_picking) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_picking_libero) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_barcode_scanner) - .setFragmentFactory(() -> PickingLiberoFragment.newInstance(GestioneEnum.VENDITA))) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_resi_cliente) - .setTitleText(it.integry.integrywmsnative.R.string.fragment_ultime_consegne_cliente_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_latest_delivery_customer) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_latest_delivery) - .setFragmentFactory(UltimeConsegneClienteFragment::newInstance)) - - ) - .addGroup(new MenuGroup() - - .setGroupText(it.integry.integrywmsnative.R.string.manufacture) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_produzione) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_prod_ordine_produzione) - .setTitleText(it.integry.integrywmsnative.R.string.prod_ordine_produzione_title_fragment) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_prod_accettazione_produzione) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_external) - .setFragmentFactory(ProdOrdineProduzioneElencoFragment::newInstance)) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_prod_ordine_lavorazione) - .setTitleText(it.integry.integrywmsnative.R.string.prod_ordine_lavorazione_title_fragment) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_prod_picking_lavorazione) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_external) - .setFragmentFactory(() -> OrdiniUscitaElencoFragment.newInstance(GestioneEnum.PRODUZIONE, GestioneEnum.LAVORAZIONE, -1, null))) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_prod_versamento_materiale) - .setTitleText(it.integry.integrywmsnative.R.string.prod_versamento_materiale_title_fragment) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_prod_versamento_materiale) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_external) - .setFragmentFactory(ProdVersamentoMaterialeFragment::newInstance)) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_prod_recupero_materiale) - .setTitleText(it.integry.integrywmsnative.R.string.prod_recupero_materiale_title_fragment) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_prod_recupero_materiale) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_external) - .setFragmentFactory(ProdRecuperoMaterialeFragment::newInstance)) - ).addGroup( - new MenuGroup() - .setGroupText(it.integry.integrywmsnative.R.string.internal_handling) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_movimentazione_interna) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_versamento_merce) - .setTitleText(it.integry.integrywmsnative.R.string.versamento_merce_fragment_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_versamento_merce) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_load_shelf) - .setFragmentFactory(VersamentoMerceFragment::newInstance)) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_rettifica_giacenze) - .setTitleText(it.integry.integrywmsnative.R.string.rettifica_giacenze_fragment_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_rettifica_giacenze) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_empty_box) - .setFragmentFactory(RettificaGiacenzeFragment::newInstance)) - - - ); - - - - } - -} diff --git a/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java b/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java deleted file mode 100644 index 2f0ed82a..00000000 --- a/dynamic_frudis/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java +++ /dev/null @@ -1,23 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import java.util.List; - -import it.integry.integrywmsnative.core.class_router.interfaces.IOrdiniVendita; -import it.integry.integrywmsnative.core.expansion.RunnableArgs; -import it.integry.integrywmsnative.core.model.MtbColt; -import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; -import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO; -import it.integry.integrywmsnative.core.settings.SettingsManager; - -public class OrdiniVendita implements IOrdiniVendita { - - - @Override - public void distribuisciCollo(MtbColt mtbColt, List testateOrdini, RunnableArgs> onComplete, RunnableArgs onFailed) { -// UtilityToast.showToast("Avviato metodo in Frudis"); - - ColliMagazzinoRESTConsumer.distribuisciCollo(mtbColt, SettingsManager.iDB().getDefaultCriterioDistribuzione(), - onComplete, - onFailed); - } -} diff --git a/dynamic_gramm/.gitignore b/dynamic_gramm/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/dynamic_gramm/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/dynamic_gramm/build.gradle b/dynamic_gramm/build.gradle deleted file mode 100644 index 18391429..00000000 --- a/dynamic_gramm/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -plugins { - id 'com.android.dynamic-feature' -} - -android { - compileSdkVersion 30 - - defaultConfig { - minSdkVersion 21 - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 - } - - lintOptions { - abortOnError false - } - -} - -dependencies { - - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':app') -} \ No newline at end of file diff --git a/dynamic_gramm/src/androidTest/java/it/integry/wms/dynamic_customization/ExampleInstrumentedTest.java b/dynamic_gramm/src/androidTest/java/it/integry/wms/dynamic_customization/ExampleInstrumentedTest.java deleted file mode 100644 index 317862c8..00000000 --- a/dynamic_gramm/src/androidTest/java/it/integry/wms/dynamic_customization/ExampleInstrumentedTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package it.integry.wms.dynamic_customization; - -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - } -} \ No newline at end of file diff --git a/dynamic_gramm/src/main/AndroidManifest.xml b/dynamic_gramm/src/main/AndroidManifest.xml deleted file mode 100644 index 01ea2c08..00000000 --- a/dynamic_gramm/src/main/AndroidManifest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java b/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java deleted file mode 100644 index f78de76e..00000000 --- a/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java +++ /dev/null @@ -1,29 +0,0 @@ -package it.integry.wms.dynamic_customization; - -import android.content.Context; -import android.util.Log; - -import it.integry.integrywmsnative.core.class_router.ClassRouter; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.wms.dynamic_customization.extensions.CustomConfiguration; -import it.integry.wms.dynamic_customization.extensions.FiltroOrdiniVendita; -import it.integry.wms.dynamic_customization.extensions.OrdiniVendita; - -public class DynamicContext { - - public void init(Context context) { - Log.d("DynamicContext", "Caricamento personalizzazioni per Azienda GRAMM"); - - try { - ClassRouter.registerPath(ClassRouter.PATH.FILTRO_ORDINI_VENDITA, FiltroOrdiniVendita.class); - ClassRouter.registerPath(ClassRouter.PATH.ORDINI_VENDITA, OrdiniVendita.class); - ClassRouter.registerPath(ClassRouter.PATH.CUSTOM_CONFIGURATION, CustomConfiguration.class); - } catch (Exception ex) { - UtilityExceptions.defaultException(context, ex); - } - - Log.d("DynamicContext", "Caricamento personalizzazioni per Azienda GRAMM COMPLETATO"); - - } - -} diff --git a/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java b/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java deleted file mode 100644 index 5f92ec84..00000000 --- a/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java +++ /dev/null @@ -1,12 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.BaseCustomConfiguration; -import it.integry.integrywmsnative.core.class_router.interfaces.ICustomConfiguration; - -public class CustomConfiguration extends BaseCustomConfiguration implements ICustomConfiguration { - - public CustomConfiguration() { - configurations.put(Keys.MENU_CONFIGURATION, new MenuConfigurationGRAMM()); - } - -} diff --git a/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java b/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java deleted file mode 100644 index 77adb537..00000000 --- a/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java +++ /dev/null @@ -1,21 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.interfaces.IFiltroOrdiniVendita; - -public class FiltroOrdiniVendita implements IFiltroOrdiniVendita { - - @Override - public boolean shoudShowCodMdepFilter() { - return false; - } - - @Override - public boolean shoudShowIdViaggioFilter() { - return false; - } - - @Override - public boolean shoudShowAgenteFilter() { - return false; - } -} diff --git a/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationGRAMM.java b/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationGRAMM.java deleted file mode 100644 index 672371ec..00000000 --- a/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationGRAMM.java +++ /dev/null @@ -1,124 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.configs.BaseMenuConfiguration; -import it.integry.integrywmsnative.core.model.secondary.GestioneEnum; -import it.integry.integrywmsnative.gest.accettazione.MainAccettazioneFragment; -import it.integry.integrywmsnative.gest.ordini_uscita_elenco.OrdiniUscitaElencoFragment; -import it.integry.integrywmsnative.gest.picking_libero.PickingLiberoFragment; -import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ProdOrdineProduzioneElencoFragment; -import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.ProdFabbisognoLineeProdFragment; -import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeFragment; -import it.integry.integrywmsnative.gest.ultime_consegne_cliente.UltimeConsegneClienteFragment; -import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.UltimiArriviFornitoreFragment; -import it.integry.integrywmsnative.gest.versamento_merce.VersamentoMerceFragment; - -public class MenuConfigurationGRAMM extends BaseMenuConfiguration { - - public MenuConfigurationGRAMM() { - - - - this - .addGroup( - new MenuGroup() - .setGroupText(it.integry.integrywmsnative.R.string.purchase) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_acquisto) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_accettazione) - .setTitleText(it.integry.integrywmsnative.R.string.accettazione_title_fragment) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_accettazione) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_download) - .setFragmentFactory(MainAccettazioneFragment::newInstance)) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_resi_fornitore) - .setTitleText(it.integry.integrywmsnative.R.string.fragment_ultime_arrivi_fornitore_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_latest_delivery) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_latest_delivery) - .setFragmentFactory(UltimiArriviFornitoreFragment::newInstance)) - ).addGroup( - new MenuGroup() - .setGroupText(it.integry.integrywmsnative.R.string.checkout) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_spedizione) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_spedizione) - .setTitleText(it.integry.integrywmsnative.R.string.vendita_title_fragment) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_spedizione) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_upload) - .setFragmentFactory(() -> OrdiniUscitaElencoFragment.newInstance(GestioneEnum.VENDITA, null, -1, null))) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_free_picking) - .setTitleText(it.integry.integrywmsnative.R.string.free_picking) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_picking_libero) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_barcode_scanner) - .setFragmentFactory(() -> PickingLiberoFragment.newInstance(GestioneEnum.VENDITA))) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_resi_cliente) - .setTitleText(it.integry.integrywmsnative.R.string.fragment_ultime_consegne_cliente_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_latest_delivery_customer) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_latest_delivery) - .setFragmentFactory(UltimeConsegneClienteFragment::newInstance)) - - ).addGroup( - new MenuGroup() - .setGroupText(it.integry.integrywmsnative.R.string.manufacture) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_produzione) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_prod_ordine_produzione) - .setTitleText(it.integry.integrywmsnative.R.string.prod_ordine_produzione_title_fragment) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_prod_accettazione_produzione) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_external) - .setFragmentFactory(ProdOrdineProduzioneElencoFragment::newInstance)) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_prod_ordine_lavorazione) - .setTitleText(it.integry.integrywmsnative.R.string.prod_ordine_lavorazione_title_fragment) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_prod_picking_lavorazione) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_external) - .setFragmentFactory(() -> OrdiniUscitaElencoFragment.newInstance(GestioneEnum.PRODUZIONE, GestioneEnum.LAVORAZIONE, -1, null))) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_free_lav_picking) - .setTitleText(it.integry.integrywmsnative.R.string.free_lav_picking) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_prod_picking_libero) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_barcode_scanner) - .setFragmentFactory(() -> PickingLiberoFragment.newInstance(GestioneEnum.LAVORAZIONE))) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_prod_posizionamento_da_ord) - .setTitleText(it.integry.integrywmsnative.R.string.prod_fabbisogno_linee_prod_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_prod_versamento_merce) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_load_shelf) - .setFragmentFactory(ProdFabbisognoLineeProdFragment::newInstance)) - ).addGroup( - new MenuGroup() - .setGroupText(it.integry.integrywmsnative.R.string.internal_handling) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_movimentazione_interna) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_versamento_merce) - .setTitleText(it.integry.integrywmsnative.R.string.versamento_merce_fragment_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_versamento_merce) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_load_shelf) - .setFragmentFactory(VersamentoMerceFragment::newInstance)) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_rettifica_giacenze) - .setTitleText(it.integry.integrywmsnative.R.string.rettifica_giacenze_fragment_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_rettifica_giacenze) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_empty_box) - .setFragmentFactory(RettificaGiacenzeFragment::newInstance)) - - - ); - - - - } - -} diff --git a/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java b/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java deleted file mode 100644 index e5c916e6..00000000 --- a/dynamic_gramm/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java +++ /dev/null @@ -1,23 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import java.util.List; - -import it.integry.integrywmsnative.core.class_router.interfaces.IOrdiniVendita; -import it.integry.integrywmsnative.core.expansion.RunnableArgs; -import it.integry.integrywmsnative.core.model.MtbColt; -import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; -import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO; -import it.integry.integrywmsnative.core.settings.SettingsManager; - -public class OrdiniVendita implements IOrdiniVendita { - - - @Override - public void distribuisciCollo(MtbColt mtbColt, List testateOrdini, RunnableArgs> onComplete, RunnableArgs onFailed) { -// UtilityToast.showToast("Avviato metodo in BaseFeature"); - - ColliMagazzinoRESTConsumer.distribuisciCollo(mtbColt, SettingsManager.iDB().getDefaultCriterioDistribuzione(), - onComplete, - onFailed); - } -} diff --git a/dynamic_gramm/src/test/java/it/integry/wms/dynamic_customization/ExampleUnitTest.java b/dynamic_gramm/src/test/java/it/integry/wms/dynamic_customization/ExampleUnitTest.java deleted file mode 100644 index 1e97227b..00000000 --- a/dynamic_gramm/src/test/java/it/integry/wms/dynamic_customization/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package it.integry.wms.dynamic_customization; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file diff --git a/dynamic_ime/.gitignore b/dynamic_ime/.gitignore deleted file mode 100644 index 796b96d1..00000000 --- a/dynamic_ime/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/dynamic_ime/build.gradle b/dynamic_ime/build.gradle deleted file mode 100644 index e0edeefa..00000000 --- a/dynamic_ime/build.gradle +++ /dev/null @@ -1,26 +0,0 @@ -plugins { - id 'com.android.dynamic-feature' -} - -android { - compileSdkVersion 30 - - - - defaultConfig { - minSdkVersion 21 - - - } - compileOptions { - sourceCompatibility = '1.8' - targetCompatibility = '1.8' - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':app') - - implementation 'androidx.appcompat:appcompat:1.2.0' -} diff --git a/dynamic_ime/src/main/AndroidManifest.xml b/dynamic_ime/src/main/AndroidManifest.xml deleted file mode 100644 index 429d9080..00000000 --- a/dynamic_ime/src/main/AndroidManifest.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - diff --git a/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java b/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java deleted file mode 100644 index de37a9a3..00000000 --- a/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java +++ /dev/null @@ -1,29 +0,0 @@ -package it.integry.wms.dynamic_customization; - -import android.content.Context; -import android.util.Log; - -import it.integry.integrywmsnative.core.class_router.ClassRouter; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.wms.dynamic_customization.extensions.CustomConfiguration; -import it.integry.wms.dynamic_customization.extensions.FiltroOrdiniVendita; -import it.integry.wms.dynamic_customization.extensions.OrdiniVendita; - -public class DynamicContext { - - public void init(Context context) { - Log.d("DynamicContext", "Caricamento personalizzazioni per Azienda IME"); - - try { - ClassRouter.registerPath(ClassRouter.PATH.FILTRO_ORDINI_VENDITA, FiltroOrdiniVendita.class); - ClassRouter.registerPath(ClassRouter.PATH.ORDINI_VENDITA, OrdiniVendita.class); - ClassRouter.registerPath(ClassRouter.PATH.CUSTOM_CONFIGURATION, CustomConfiguration.class); - } catch (Exception ex) { - UtilityExceptions.defaultException(context, ex); - } - - Log.d("DynamicContext", "Caricamento personalizzazioni per Azienda IME COMPLETATO"); - - } - -} diff --git a/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java b/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java deleted file mode 100644 index 8f1687ab..00000000 --- a/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java +++ /dev/null @@ -1,12 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.BaseCustomConfiguration; -import it.integry.integrywmsnative.core.class_router.interfaces.ICustomConfiguration; - -public class CustomConfiguration extends BaseCustomConfiguration implements ICustomConfiguration { - - public CustomConfiguration() { - configurations.put(Keys.MENU_CONFIGURATION, new MenuConfigurationIME()); - } - -} diff --git a/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java b/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java deleted file mode 100644 index 77adb537..00000000 --- a/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java +++ /dev/null @@ -1,21 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.interfaces.IFiltroOrdiniVendita; - -public class FiltroOrdiniVendita implements IFiltroOrdiniVendita { - - @Override - public boolean shoudShowCodMdepFilter() { - return false; - } - - @Override - public boolean shoudShowIdViaggioFilter() { - return false; - } - - @Override - public boolean shoudShowAgenteFilter() { - return false; - } -} diff --git a/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationIME.java b/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationIME.java deleted file mode 100644 index 5dd95f1d..00000000 --- a/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationIME.java +++ /dev/null @@ -1,109 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.configs.BaseMenuConfiguration; -import it.integry.integrywmsnative.core.model.secondary.GestioneEnum; -import it.integry.integrywmsnative.gest.accettazione.MainAccettazioneFragment; -import it.integry.integrywmsnative.gest.ordini_uscita_elenco.OrdiniUscitaElencoFragment; -import it.integry.integrywmsnative.gest.picking_libero.PickingLiberoFragment; -import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ProdOrdineProduzioneElencoFragment; -import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeFragment; -import it.integry.integrywmsnative.gest.ultime_consegne_cliente.UltimeConsegneClienteFragment; -import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.UltimiArriviFornitoreFragment; -import it.integry.integrywmsnative.gest.versamento_merce.VersamentoMerceFragment; - -public class MenuConfigurationIME extends BaseMenuConfiguration { - - public MenuConfigurationIME() { - - - - this - .addGroup( - new MenuGroup() - .setGroupText(it.integry.integrywmsnative.R.string.purchase) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_acquisto) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_accettazione) - .setTitleText(it.integry.integrywmsnative.R.string.accettazione_title_fragment) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_accettazione) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_download) - .setFragmentFactory(MainAccettazioneFragment::newInstance)) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_resi_fornitore) - .setTitleText(it.integry.integrywmsnative.R.string.fragment_ultime_arrivi_fornitore_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_latest_delivery) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_latest_delivery) - .setFragmentFactory(UltimiArriviFornitoreFragment::newInstance)) - ).addGroup( - new MenuGroup() - .setGroupText(it.integry.integrywmsnative.R.string.checkout) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_spedizione) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_spedizione) - .setTitleText(it.integry.integrywmsnative.R.string.vendita_title_fragment) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_spedizione) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_upload) - .setFragmentFactory(() -> OrdiniUscitaElencoFragment.newInstance(GestioneEnum.VENDITA, null, -1, null))) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_free_picking) - .setTitleText(it.integry.integrywmsnative.R.string.free_picking) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_picking_libero) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_barcode_scanner) - .setFragmentFactory(() -> PickingLiberoFragment.newInstance(GestioneEnum.VENDITA))) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_resi_cliente) - .setTitleText(it.integry.integrywmsnative.R.string.fragment_ultime_consegne_cliente_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_latest_delivery_customer) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_latest_delivery) - .setFragmentFactory(UltimeConsegneClienteFragment::newInstance)) - - ).addGroup( - new MenuGroup() - .setGroupText(it.integry.integrywmsnative.R.string.manufacture) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_produzione) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_prod_ordine_produzione) - .setTitleText(it.integry.integrywmsnative.R.string.prod_ordine_produzione_title_fragment) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_prod_accettazione_produzione) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_external) - .setFragmentFactory(ProdOrdineProduzioneElencoFragment::newInstance)) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_prod_ordine_lavorazione) - .setTitleText(it.integry.integrywmsnative.R.string.prod_ordine_lavorazione_title_fragment) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_prod_picking_lavorazione) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_external) - .setFragmentFactory(() -> OrdiniUscitaElencoFragment.newInstance(GestioneEnum.PRODUZIONE, GestioneEnum.LAVORAZIONE, -1, null))) - ).addGroup( - new MenuGroup() - .setGroupText(it.integry.integrywmsnative.R.string.internal_handling) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_movimentazione_interna) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_versamento_merce) - .setTitleText(it.integry.integrywmsnative.R.string.versamento_merce_fragment_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_versamento_merce) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_load_shelf) - .setFragmentFactory(VersamentoMerceFragment::newInstance)) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_rettifica_giacenze) - .setTitleText(it.integry.integrywmsnative.R.string.rettifica_giacenze_fragment_title) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_rettifica_giacenze) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_empty_box) - .setFragmentFactory(RettificaGiacenzeFragment::newInstance)) - - - ); - - - - } - -} diff --git a/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java b/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java deleted file mode 100644 index e5c916e6..00000000 --- a/dynamic_ime/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java +++ /dev/null @@ -1,23 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import java.util.List; - -import it.integry.integrywmsnative.core.class_router.interfaces.IOrdiniVendita; -import it.integry.integrywmsnative.core.expansion.RunnableArgs; -import it.integry.integrywmsnative.core.model.MtbColt; -import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; -import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO; -import it.integry.integrywmsnative.core.settings.SettingsManager; - -public class OrdiniVendita implements IOrdiniVendita { - - - @Override - public void distribuisciCollo(MtbColt mtbColt, List testateOrdini, RunnableArgs> onComplete, RunnableArgs onFailed) { -// UtilityToast.showToast("Avviato metodo in BaseFeature"); - - ColliMagazzinoRESTConsumer.distribuisciCollo(mtbColt, SettingsManager.iDB().getDefaultCriterioDistribuzione(), - onComplete, - onFailed); - } -} diff --git a/dynamic_saporiveri/.gitignore b/dynamic_saporiveri/.gitignore deleted file mode 100644 index 796b96d1..00000000 --- a/dynamic_saporiveri/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/dynamic_saporiveri/build.gradle b/dynamic_saporiveri/build.gradle deleted file mode 100644 index 1973cdf9..00000000 --- a/dynamic_saporiveri/build.gradle +++ /dev/null @@ -1,27 +0,0 @@ -plugins { - id 'com.android.dynamic-feature' -} - -android { - compileSdkVersion 30 - - - - defaultConfig { - minSdkVersion 21 - - } - compileOptions { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 - } - - -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':app') - - implementation 'androidx.appcompat:appcompat:1.2.0' -} diff --git a/dynamic_saporiveri/src/main/AndroidManifest.xml b/dynamic_saporiveri/src/main/AndroidManifest.xml deleted file mode 100644 index 7990c852..00000000 --- a/dynamic_saporiveri/src/main/AndroidManifest.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - diff --git a/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java b/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java deleted file mode 100644 index e373a3d5..00000000 --- a/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java +++ /dev/null @@ -1,31 +0,0 @@ -package it.integry.wms.dynamic_customization; - -import android.content.Context; -import android.util.Log; - -import it.integry.integrywmsnative.core.class_router.ClassRouter; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.wms.dynamic_customization.extensions.BarcodeCustomization; -import it.integry.wms.dynamic_customization.extensions.CustomConfiguration; -import it.integry.wms.dynamic_customization.extensions.FiltroOrdiniVendita; -import it.integry.wms.dynamic_customization.extensions.OrdiniVendita; - -public class DynamicContext { - - public void init(Context context) { - Log.d("DynamicContext", "Caricamento personalizzazioni per SaporiVeri"); - - try { - ClassRouter.registerPath(ClassRouter.PATH.FILTRO_ORDINI_VENDITA, FiltroOrdiniVendita.class); - ClassRouter.registerPath(ClassRouter.PATH.ORDINI_VENDITA, OrdiniVendita.class); - ClassRouter.registerPath(ClassRouter.PATH.CUSTOM_CONFIGURATION, CustomConfiguration.class); - ClassRouter.registerPath(ClassRouter.PATH.BARCODE_CUSTOMIZATION, BarcodeCustomization.class); - } catch (Exception ex) { - UtilityExceptions.defaultException(context, ex); - } - - Log.d("DynamicContext", "Caricamento personalizzazioni per SaporiVeri COMPLETATO"); - - } - -} diff --git a/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/BarcodeCustomization.java b/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/BarcodeCustomization.java deleted file mode 100644 index 48f469d8..00000000 --- a/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/BarcodeCustomization.java +++ /dev/null @@ -1,14 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.interfaces.IBarcodeCustomization; - -public class BarcodeCustomization implements IBarcodeCustomization { - - @Override - public boolean shouldForceToEan13(String barcode) { - - return barcode != null && barcode.length() == 13; - - } - -} diff --git a/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java b/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java deleted file mode 100644 index 5c3ab3cd..00000000 --- a/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java +++ /dev/null @@ -1,11 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.BaseCustomConfiguration; -import it.integry.integrywmsnative.core.class_router.interfaces.ICustomConfiguration; - -public class CustomConfiguration extends BaseCustomConfiguration implements ICustomConfiguration { - - public CustomConfiguration() { - } - -} diff --git a/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java b/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java deleted file mode 100644 index 77adb537..00000000 --- a/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java +++ /dev/null @@ -1,21 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.interfaces.IFiltroOrdiniVendita; - -public class FiltroOrdiniVendita implements IFiltroOrdiniVendita { - - @Override - public boolean shoudShowCodMdepFilter() { - return false; - } - - @Override - public boolean shoudShowIdViaggioFilter() { - return false; - } - - @Override - public boolean shoudShowAgenteFilter() { - return false; - } -} diff --git a/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java b/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java deleted file mode 100644 index e5c916e6..00000000 --- a/dynamic_saporiveri/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java +++ /dev/null @@ -1,23 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import java.util.List; - -import it.integry.integrywmsnative.core.class_router.interfaces.IOrdiniVendita; -import it.integry.integrywmsnative.core.expansion.RunnableArgs; -import it.integry.integrywmsnative.core.model.MtbColt; -import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; -import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO; -import it.integry.integrywmsnative.core.settings.SettingsManager; - -public class OrdiniVendita implements IOrdiniVendita { - - - @Override - public void distribuisciCollo(MtbColt mtbColt, List testateOrdini, RunnableArgs> onComplete, RunnableArgs onFailed) { -// UtilityToast.showToast("Avviato metodo in BaseFeature"); - - ColliMagazzinoRESTConsumer.distribuisciCollo(mtbColt, SettingsManager.iDB().getDefaultCriterioDistribuzione(), - onComplete, - onFailed); - } -} diff --git a/dynamic_saporiveri_pv/.gitignore b/dynamic_saporiveri_pv/.gitignore deleted file mode 100644 index 796b96d1..00000000 --- a/dynamic_saporiveri_pv/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/dynamic_saporiveri_pv/build.gradle b/dynamic_saporiveri_pv/build.gradle deleted file mode 100644 index 1973cdf9..00000000 --- a/dynamic_saporiveri_pv/build.gradle +++ /dev/null @@ -1,27 +0,0 @@ -plugins { - id 'com.android.dynamic-feature' -} - -android { - compileSdkVersion 30 - - - - defaultConfig { - minSdkVersion 21 - - } - compileOptions { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 - } - - -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':app') - - implementation 'androidx.appcompat:appcompat:1.2.0' -} diff --git a/dynamic_saporiveri_pv/src/main/AndroidManifest.xml b/dynamic_saporiveri_pv/src/main/AndroidManifest.xml deleted file mode 100644 index ae16afaa..00000000 --- a/dynamic_saporiveri_pv/src/main/AndroidManifest.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - diff --git a/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java b/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java deleted file mode 100644 index ef4bfdf9..00000000 --- a/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/DynamicContext.java +++ /dev/null @@ -1,29 +0,0 @@ -package it.integry.wms.dynamic_customization; - -import android.content.Context; -import android.util.Log; - -import it.integry.integrywmsnative.core.class_router.ClassRouter; -import it.integry.integrywmsnative.core.utility.UtilityExceptions; -import it.integry.wms.dynamic_customization.extensions.CustomConfiguration; -import it.integry.wms.dynamic_customization.extensions.FiltroOrdiniVendita; -import it.integry.wms.dynamic_customization.extensions.OrdiniVendita; - -public class DynamicContext { - - public void init(Context context) { - Log.d("DynamicContext", "Caricamento personalizzazioni per SaporiVeri(PV)"); - - try { - ClassRouter.registerPath(ClassRouter.PATH.FILTRO_ORDINI_VENDITA, FiltroOrdiniVendita.class); - ClassRouter.registerPath(ClassRouter.PATH.ORDINI_VENDITA, OrdiniVendita.class); - ClassRouter.registerPath(ClassRouter.PATH.CUSTOM_CONFIGURATION, CustomConfiguration.class); - } catch (Exception ex) { - UtilityExceptions.defaultException(context, ex); - } - - Log.d("DynamicContext", "Caricamento personalizzazioni per SasporiVeri(PV) COMPLETATO"); - - } - -} diff --git a/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java b/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java deleted file mode 100644 index 46389f8a..00000000 --- a/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/CustomConfiguration.java +++ /dev/null @@ -1,13 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.BaseCustomConfiguration; -import it.integry.integrywmsnative.core.class_router.interfaces.ICustomConfiguration; - -public class CustomConfiguration extends BaseCustomConfiguration implements ICustomConfiguration { - - public CustomConfiguration() { - configurations.put(Keys.MENU_CONFIGURATION, new MenuConfigurationSAPORIVERIPV()); - configurations.put(Keys.CUSTOM_DYNAMIC_VERSION_PATH,"_pv"); - } - -} diff --git a/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java b/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java deleted file mode 100644 index 77adb537..00000000 --- a/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/FiltroOrdiniVendita.java +++ /dev/null @@ -1,21 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.interfaces.IFiltroOrdiniVendita; - -public class FiltroOrdiniVendita implements IFiltroOrdiniVendita { - - @Override - public boolean shoudShowCodMdepFilter() { - return false; - } - - @Override - public boolean shoudShowIdViaggioFilter() { - return false; - } - - @Override - public boolean shoudShowAgenteFilter() { - return false; - } -} diff --git a/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationSAPORIVERIPV.java b/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationSAPORIVERIPV.java deleted file mode 100644 index 78c90dcb..00000000 --- a/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/MenuConfigurationSAPORIVERIPV.java +++ /dev/null @@ -1,49 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import it.integry.integrywmsnative.core.class_router.configs.BaseMenuConfiguration; -import it.integry.integrywmsnative.core.model.secondary.GestioneEnum; -import it.integry.integrywmsnative.gest.picking_libero.PickingLiberoFragment; -import it.integry.integrywmsnative.gest.pv_ordini_acquisto.PVOrdiniAcquistoGrigliaFragment; - -public class MenuConfigurationSAPORIVERIPV extends BaseMenuConfiguration { - - public MenuConfigurationSAPORIVERIPV() { - - this - .addGroup( - new MenuGroup() - .setCodMenu("MM012") - .setGroupText(it.integry.integrywmsnative.R.string.punto_vendita) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_puntivendita) - - .addItem(new MenuItem() - .setCodMenu("MG057") - .setID(it.integry.integrywmsnative.R.id.nav_pv_ordini_acquisto) - .setTitleText(it.integry.integrywmsnative.R.string.generate_orders) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_purchase_orders_pv) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_purchase_orders_pv) - .setFragmentFactory(PVOrdiniAcquistoGrigliaFragment::newInstance)) -// .addItem(new MenuItem() -// .setID(it.integry.integrywmsnative.R.id.nav_pv_ordini_acquisto_trasmessi) -// .setTitleText(it.integry.integrywmsnative.R.string.transmitted_orders) -// .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_trasmitted_orders_list) -// .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_trasmitted_orders_list) -// .setFragmentClass(PVOrdiniAcquistoTransmittedListFragment.newInstance())) - ) - .addGroup( - new MenuGroup() - .setGroupText(it.integry.integrywmsnative.R.string.checkout) - .setGroupId(it.integry.integrywmsnative.R.id.nav_group_spedizione) - - .addItem(new MenuItem() - .setID(it.integry.integrywmsnative.R.id.nav_free_picking) - .setTitleText(it.integry.integrywmsnative.R.string.free_picking) - .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_picking_libero) - .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_barcode_scanner) - .setFragmentFactory(() -> PickingLiberoFragment.newInstance(GestioneEnum.VENDITA))) - ); - - - } - -} diff --git a/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java b/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java deleted file mode 100644 index 43e0e202..00000000 --- a/dynamic_saporiveri_pv/src/main/java/it/integry/wms/dynamic_customization/extensions/OrdiniVendita.java +++ /dev/null @@ -1,24 +0,0 @@ -package it.integry.wms.dynamic_customization.extensions; - -import java.util.List; - -import it.integry.integrywmsnative.core.class_router.interfaces.IOrdiniVendita; -import it.integry.integrywmsnative.core.expansion.RunnableArgs; -import it.integry.integrywmsnative.core.model.MtbColt; -import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer; -import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO; -import it.integry.integrywmsnative.core.settings.SettingsManager; - -public class OrdiniVendita implements IOrdiniVendita { - - - @Override - public void distribuisciCollo(MtbColt mtbColt, List testateOrdini, RunnableArgs> onComplete, RunnableArgs onFailed) { - //UtilityToast.showToast("Avviato metodo in SaporiVeriPv"); - - ColliMagazzinoRESTConsumer.distribuisciCollo(mtbColt, SettingsManager.iDB().getDefaultCriterioDistribuzione(), - onComplete, - onFailed); - } - -} diff --git a/settings.gradle b/settings.gradle index 10f357dd..d7777a0c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ -include ':app', ':dynamic_gramm', ':pointmobilescannerlibrary', ':dynamic_vgalimenti', ':dynamic__base', ':zebrascannerlibrary', ':honeywellscannerlibrary', ':dynamic_ime', ':dynamic_frudis', ':dynamic_saporiveri_pv', ':keyobardemulatorscannerlibrary', ':barcode_base_android_library', ':dynamic_saporiveri' -include ':dynamic_agricoper' +include ':app', ':pointmobilescannerlibrary', ':dynamic_vgalimenti', ':dynamic__base', ':zebrascannerlibrary', ':honeywellscannerlibrary', ':keyobardemulatorscannerlibrary', ':barcode_base_android_library' + From 4a884b92adaa4448af37c32b38f3833ff3c23dda Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Wed, 15 Sep 2021 19:13:14 +0200 Subject: [PATCH 16/18] Sistemata libreria Honeywell --- honeywellscannerlibrary/build.gradle | 3 ++- .../libs/DataCollection.aar | Bin 117044 -> 117886 bytes honeywellsdk/DataCollection.aar | Bin 0 -> 117886 bytes honeywellsdk/build.gradle | 2 ++ settings.gradle | 2 +- 5 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 honeywellsdk/DataCollection.aar create mode 100644 honeywellsdk/build.gradle diff --git a/honeywellscannerlibrary/build.gradle b/honeywellscannerlibrary/build.gradle index 7252a5e1..d259f2d0 100644 --- a/honeywellscannerlibrary/build.gradle +++ b/honeywellscannerlibrary/build.gradle @@ -29,8 +29,9 @@ android { } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) +// implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) + implementation project(":honeywellsdk") implementation 'androidx.appcompat:appcompat:1.2.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test:runner:1.3.0' diff --git a/honeywellscannerlibrary/libs/DataCollection.aar b/honeywellscannerlibrary/libs/DataCollection.aar index a67373d8ad8172e6699e77139b11d696112fcb92..d94df831f97f816b6bea71ddd303a19bb9823a3c 100644 GIT binary patch delta 47838 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

U+-I~&aIm$LO5#z* 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 VaERYBcpoo=4^<%hJ{%X&{{eSOukZi> delta 46959 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 AG5`Po diff --git a/honeywellsdk/DataCollection.aar b/honeywellsdk/DataCollection.aar new file mode 100644 index 0000000000000000000000000000000000000000..d94df831f97f816b6bea71ddd303a19bb9823a3c GIT binary patch literal 117886 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 Ndw?+g?`s<1{{x3QKbHUi literal 0 HcmV?d00001 diff --git a/honeywellsdk/build.gradle b/honeywellsdk/build.gradle new file mode 100644 index 00000000..3de5a0c0 --- /dev/null +++ b/honeywellsdk/build.gradle @@ -0,0 +1,2 @@ +configurations.maybeCreate("default") +artifacts.add("default", file('DataCollection.aar')) \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index d7777a0c..cdf935ee 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ -include ':app', ':pointmobilescannerlibrary', ':dynamic_vgalimenti', ':dynamic__base', ':zebrascannerlibrary', ':honeywellscannerlibrary', ':keyobardemulatorscannerlibrary', ':barcode_base_android_library' +include ':app', ':pointmobilescannerlibrary', ':dynamic_vgalimenti', ':dynamic__base', ':zebrascannerlibrary', ':honeywellsdk', ':honeywellscannerlibrary', ':keyobardemulatorscannerlibrary', ':barcode_base_android_library' From a9164109da88a86b98fb4e06a97fd7f6b3edf1cc Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 23 Sep 2021 11:41:32 +0200 Subject: [PATCH 17/18] Fix su refMtbColr --- .../integrywmsnative/gest/spedizione/SpedizioneViewModel.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java index 93e26713..dc107a3a 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java @@ -742,7 +742,9 @@ public class SpedizioneViewModel { this.sendFilterApplied(null); this.getPickingList().postValue(pickingList); } else { - this.dispatchOrdineRow(matchedItem, matchedItem.getRefMtbColt(), matchedItem.getRefMtbColt().getMtbColr().get(0), false); + MtbColt refMtbColt = matchedItem.getRefMtbColt(); + MtbColr refMtbColr = refMtbColt != null ? matchedItem.getRefMtbColt().getMtbColr().get(0) : null; + this.dispatchOrdineRow(matchedItem, refMtbColt, refMtbColr, false); } } else { From ff4d71e616e314739fe96188b90450a1854b4bc0 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Thu, 23 Sep 2021 11:44:22 +0200 Subject: [PATCH 18/18] -> v1.18.0 (230) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 513e03c5..9156ab11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 229 - def appVersionName = '1.17.9' + def appVersionCode = 230 + def appVersionName = '1.18.0' signingConfigs { release {