diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index d179c9f3..4ae112ed 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/app/build.gradle b/app/build.gradle index 121ba8f9..b1089999 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { applicationId "it.integry.integrywmsnative" minSdkVersion 21 targetSdkVersion 28 - versionCode 16 - versionName "1.0.13" + versionCode 17 + versionName "1.0.14" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -71,7 +71,8 @@ dependencies { implementation "androidx.lifecycle:lifecycle-common-java8:2.0.0" kapt "androidx.lifecycle:lifecycle-compiler:2.0.0" - implementation "com.emreeran.permissionlivedata:permissionlivedata:1.0.4" + //implementation "com.emreeran.permissionlivedata:permissionlivedata:1.0.4" + //implementation 'com.karumi:dexter:5.0.0' //MVVM implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 06522412..4db6c11f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ + - - + android:windowSoftInputMode="adjustPan"> + + + + + + \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/MainActivity.java b/app/src/main/java/it/integry/integrywmsnative/MainActivity.java index e893395e..e23493ee 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainActivity.java @@ -12,6 +12,7 @@ import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.Toolbar; + import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -22,13 +23,11 @@ import android.widget.TextView; import it.integry.integrywmsnative.core.REST.watcher.ServerStatusChecker; import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; -import it.integry.integrywmsnative.core.exception.ExceptionsHandler; import it.integry.integrywmsnative.core.interfaces.IFilterableFragment; import it.integry.integrywmsnative.core.interfaces.IRecyclerFragment; import it.integry.integrywmsnative.core.interfaces.ISelectAllFragment; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.update.UpdatesManager; -import it.integry.integrywmsnative.core.utility.PermissionsHelper; import it.integry.integrywmsnative.core.utility.UtilitySettings; import it.integry.integrywmsnative.databinding.ActivityMainBinding; import it.integry.integrywmsnative.gest.accettazione.MainAccettazioneFragment; @@ -39,7 +38,6 @@ import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeFrag import it.integry.integrywmsnative.gest.settings.MainSettingsFragment; import it.integry.integrywmsnative.gest.vendita.MainVenditaFragment; import it.integry.integrywmsnative.gest.versamento_merce.VersamentoMerceFragment; -import it.integry.integrywmsnative.view.dialogs.exception.DialogException; public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { @@ -53,7 +51,7 @@ public class MainActivity extends AppCompatActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - //ExceptionsHandler.init(this); + mBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.activity_main, null, false); setContentView(mBinding.getRoot()); @@ -80,9 +78,9 @@ public class MainActivity extends AppCompatActivity private void startLoginActivity(){ + this.finish(); Intent myIntent = new Intent(this, LoginActivity.class); startActivity(myIntent); - this.finish(); } @@ -234,6 +232,8 @@ public class MainActivity extends AppCompatActivity // new SpannableString("Trovato adattatore " + BarcodeManager.getCurrentBarcodeInterface().getAdapterName() + " installato nel sistema"), // null, null).show(); } + //Preload done in splashPage + onDBLoaded(); ServerStatusChecker.getIstance().addCallback(value -> { if(value && (!mIsOnline || firstCheckExecution)){ diff --git a/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java b/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java index 316a4e36..8077d93b 100644 --- a/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/SplashActivity.java @@ -4,14 +4,18 @@ import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; -import android.app.Activity; -import android.os.Handler; import android.text.SpannableString; import android.widget.TextView; +import java.util.ArrayList; +import java.util.List; + import androidx.appcompat.app.AppCompatActivity; import butterknife.BindView; import butterknife.ButterKnife; +import it.integry.integrywmsnative.core.REST.watcher.ServerStatusChecker; +import it.integry.integrywmsnative.core.expansion.RunnableArgss; +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.gest.login.LoginActivity; @@ -22,6 +26,8 @@ public class SplashActivity extends AppCompatActivity { @BindView(R.id.app_version_textview) TextView appVersionTextView; + private RunnableArgsss> onRequestPermissionResult; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -31,19 +37,24 @@ public class SplashActivity extends AppCompatActivity { initAppVersion(); + initPermissions(this::init); + + } + + private void initPermissions(Runnable onComplete) { PermissionsHelper.askPermissions(this, () -> { - init(); + onComplete.run(); }, permanentlyDenied -> { if(permanentlyDenied) { DialogSimpleMessageHelper.makeErrorDialog(this, - new SpannableString(getText(R.string.permissions_permanrntly_denied)), null, () -> { + new SpannableString(getText(R.string.permissions_permanently_denied)), null, () -> { this.finish(); }).show(); + } else { + initPermissions(onComplete); } }); - - } @@ -61,7 +72,36 @@ public class SplashActivity extends AppCompatActivity { if(SettingsManager.i().user.username == null && SettingsManager.i().user.password == null){ startLoginActivity(); } else { - startMainActivity(); + initFirstData(this::startMainActivity); + } + } + + private void initFirstData(Runnable onComplete) { + + SettingsManager.reloadDBVariables(onComplete, ex -> { + DialogSimpleMessageHelper.makeErrorDialog(this, + new SpannableString(ex.getMessage()), null, this::finish).show(); + } + ); + } + + + + + public void setOnRequestPermissionsResult(RunnableArgsss> onRequestPermissionResult) { + this.onRequestPermissionResult = onRequestPermissionResult; + } + + + @Override + public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { + if(this.onRequestPermissionResult != null) { + List grantResultsList = new ArrayList<>(); + for(int i = 0; i < grantResults.length; i++) { + grantResultsList.add(grantResults[i]); + } + + this.onRequestPermissionResult.run(requestCode, permissions, grantResultsList); } } @@ -69,21 +109,16 @@ public class SplashActivity extends AppCompatActivity { - private void startLoginActivity(){ + this.finish(); Intent myIntent = new Intent(this, LoginActivity.class); startActivity(myIntent); - this.finish(); } private void startMainActivity(){ - new Handler().postDelayed(() -> { - Intent myIntent = new Intent(this, MainActivity.class); - startActivity(myIntent); - this.finish(); - }, 3000); - - + this.finish(); + Intent myIntent = new Intent(this, MainActivity.class); + startActivity(myIntent); } 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 c272b95c..04cc12dc 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 @@ -11,6 +11,7 @@ import android.util.Log; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; +import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.RadioGroup; @@ -18,6 +19,7 @@ import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; +import androidx.databinding.Observable; import it.integry.integrywmsnative.R; public class Converters { @@ -175,4 +177,24 @@ public class Converters { public static void bindFloatPercetageOnGuideline(View view, final float percentage) { ((Guideline)view).setGuidelinePercent(percentage); } + + + + + @BindingAdapter("app:visibility") + public static void bindCheckbox(LinearLayout view, final BindableBoolean bindableBoolean) { + if (view.getTag(R.id.bound_observable) != bindableBoolean) { + view.setTag(R.id.bound_observable, bindableBoolean); + //view.setOnCheckedChangeListener((compoundButton, b) -> bindableBoolean.set(b)); + } + bindableBoolean.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() { + @Override + public void onPropertyChanged(Observable sender, int propertyId) { + view.setVisibility(bindableBoolean.get() ? View.VISIBLE : View.GONE); + } + }); + + view.setVisibility(bindableBoolean.get() ? View.VISIBLE : View.GONE); + } + } \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/core/expansion/RunnableArgsss.java b/app/src/main/java/it/integry/integrywmsnative/core/expansion/RunnableArgsss.java new file mode 100644 index 00000000..e746f1ab --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/expansion/RunnableArgsss.java @@ -0,0 +1,7 @@ +package it.integry.integrywmsnative.core.expansion; + +public interface RunnableArgsss { + + void run(S data1, T data2, V data3); +} + diff --git a/app/src/main/java/it/integry/integrywmsnative/core/update/GenericFileProvider.java b/app/src/main/java/it/integry/integrywmsnative/core/update/GenericFileProvider.java new file mode 100644 index 00000000..ac8670af --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/update/GenericFileProvider.java @@ -0,0 +1,5 @@ +package it.integry.integrywmsnative.core.update; + +import androidx.core.content.FileProvider; + +public class GenericFileProvider extends FileProvider {} \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/core/update/UpdateApp.java b/app/src/main/java/it/integry/integrywmsnative/core/update/UpdateApp.java new file mode 100644 index 00000000..32f4fa16 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/update/UpdateApp.java @@ -0,0 +1,60 @@ +package it.integry.integrywmsnative.core.update; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Environment; +import android.util.Log; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +public class UpdateApp extends AsyncTask { + private Context context; + public void setContext(Context contextf){ + context = contextf; + } + + @Override + protected Void doInBackground(String... arg0) { + try { + URL url = new URL(arg0[0]); + HttpURLConnection c = (HttpURLConnection) url.openConnection(); + c.setRequestMethod("GET"); + c.setDoOutput(true); + c.connect(); + + File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); + file.mkdirs(); + File outputFile = new File(file, "update.apk"); + if(outputFile.exists()){ + outputFile.delete(); + } + FileOutputStream fos = new FileOutputStream(outputFile); + + InputStream is = c.getInputStream(); + + byte[] buffer = new byte[1024]; + int len1 = 0; + while ((len1 = is.read(buffer)) != -1) { + fos.write(buffer, 0, len1); + } + fos.close(); + is.close(); + + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(Uri.fromFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)), "application/vnd.android.package-archive"); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // without this flag android returned a intent error! + context.startActivity(intent); + + + } catch (Exception e) { + Log.e("UpdateAPP", "Update error! " + e.getMessage()); + } + return null; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java b/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java index 4e70739a..930b4f6f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java @@ -1,21 +1,94 @@ package it.integry.integrywmsnative.core.update; +import android.app.Activity; +import android.app.DownloadManager; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; import com.github.javiersantos.appupdater.AppUpdater; +import com.github.javiersantos.appupdater.AppUpdaterUtils; +import com.github.javiersantos.appupdater.enums.AppUpdaterError; import com.github.javiersantos.appupdater.enums.Display; import com.github.javiersantos.appupdater.enums.UpdateFrom; +import com.github.javiersantos.appupdater.objects.Update; +import java.io.File; + +import androidx.core.content.FileProvider; +import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.settings.SettingsManager; public class UpdatesManager { - public static void init(Context context) { + public static void init(Activity context) { + String currentVersionUrl = "http://" + SettingsManager.i().server.host + ":" + SettingsManager.i().server.port + "/ems-api/wms/currentVersion"; + String currentDownloadUrl = "http://" + SettingsManager.i().server.host + ":" + SettingsManager.i().server.port + "/ems-api/wms/android-release_v2.apk"; + + AppUpdater appUpdater = new AppUpdater(context) .setDisplay(Display.DIALOG) .setUpdateFrom(UpdateFrom.JSON) - .setUpdateJSON("http://" + SettingsManager.i().server.host + ":" + SettingsManager.i().server.port + "/ems-api/wms/currentVersion"); + .setUpdateJSON(currentVersionUrl) + .setButtonUpdateClickListener((dialog, which) -> { + + installAPK(context, currentDownloadUrl); + }); appUpdater.start(); } + + private static void installAPK(Activity context, String downloadURL) { + String destination = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/"; + String fileName = context.getResources().getString(R.string.app_name) + ".apk"; + destination += fileName; + final Uri uri = Uri.parse("file://" + destination); + + //Delete update file if exists + final File file = new File(destination); + if (file.exists()) + file.delete(); + + //set downloadmanager + DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadURL)); + request.setDescription(context.getString(R.string.notification_update_download)); + request.setTitle(context.getString(R.string.app_name)); + + //set destination + request.setDestinationUri(uri); + + // get download service and enqueue file + final DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + manager.enqueue(request); + + //set BroadcastReceiver to install app when .apk is downloaded + BroadcastReceiver onComplete = new BroadcastReceiver() { + public void onReceive(Context ctxt, Intent i) { + + Uri fileLoc; + Intent intent; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); + fileLoc = GenericFileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".core.update.GenericFileProvider", file); + } else { + intent = new Intent(Intent.ACTION_VIEW); + fileLoc = Uri.fromFile(file); + } + + intent.setDataAndType(fileLoc, "application/vnd.android.package-archive"); + intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + + context.startActivity(intent); + } + }; + + //register receiver for when .apk download is compete + context.registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/PermissionsHelper.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/PermissionsHelper.java index e62203d5..0f66db4e 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/PermissionsHelper.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/PermissionsHelper.java @@ -1,42 +1,83 @@ package it.integry.integrywmsnative.core.utility; import android.Manifest; -import android.app.Activity; +import android.content.pm.PackageManager; +import android.os.Build; +import android.widget.Toast; -import com.emreeran.permissionlivedata.PermissionLiveData; -import com.emreeran.permissionlivedata.Status; +import com.annimon.stream.Stream; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import it.integry.integrywmsnative.SplashActivity; import it.integry.integrywmsnative.core.expansion.RunnableArgs; public class PermissionsHelper { - public static void askPermissions(AppCompatActivity activity, Runnable onPermissionsConfirmed, RunnableArgs onPermissionsDenied) { + public static void askPermissions(SplashActivity activity, Runnable onPermissionsConfirmed, RunnableArgs onPermissionsDenied) { - PermissionLiveData permissionLiveData = PermissionLiveData.create( - activity, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ); + List permissionsToAsk = new ArrayList<>(); + permissionsToAsk.add(Manifest.permission.READ_EXTERNAL_STORAGE); + permissionsToAsk.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + //permissionsToAsk.add(Manifest.permission.INTERNET); + //permissionsToAsk.add(Manifest.permission.ACCESS_WIFI_STATE); - permissionLiveData.observe(activity, permission -> { - if (permission.getStatus() == Status.RECEIVED) { - if (permission.getGranted()) { - onPermissionsConfirmed.run(); - //UtilityToast.showToast("Permission " + permission.getName() + " was granted."); - } else if (permission.getShouldShowRequestPermissionRationale()) { - onPermissionsDenied.run(true); - //UtilityToast.showToast("Permission " + permission.getName() + " was denied without ask never again checked."); - } else { - onPermissionsDenied.run(false); - //UtilityToast.showToast("Permission " + permission.getName() + " was denied."); + + if(Build.VERSION.SDK_INT >= 23) { + //permissionsToAsk.add(Manifest.permission.REQUEST_INSTALL_PACKAGES); + } + + String[] permissionArray = new String[permissionsToAsk.size()]; + permissionsToAsk.toArray(permissionArray); + + + + + activity.setOnRequestPermissionsResult((requestCode, permissions, grantResults) -> { + switch (requestCode) { + case 1: { + + boolean allGranted = Stream.of(grantResults).allMatch(x -> x == PackageManager.PERMISSION_GRANTED); + + // If request is cancelled, the result arrays are empty. + if (grantResults.size() > 0 && allGranted) { + + onPermissionsConfirmed.run(); + + } else { + + boolean anyPermDeny = shouldShowRequestPermissionRationale( activity, permissions ); + + onPermissionsDenied.run(anyPermDeny); + + + } + return; } - } else if (permission.getStatus() == Status.PENDING) { - //UtilityToast.showToast(String.format("Pending request for %s", permission.getName())); + + // other 'case' lines to check for other + // permissions this app might request } }); + + + + ActivityCompat.requestPermissions(activity, permissionArray,1); + + } + + private static boolean shouldShowRequestPermissionRationale(AppCompatActivity activity, String[] permissions) { + boolean anyDeny = false; + + for(int i = 0; i < permissions.length && !anyDeny; i++) { + if(!ActivityCompat.shouldShowRequestPermissionRationale(activity, permissions[i])) anyDeny = true; + } + + return anyDeny; } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_ordine_inevaso/viewmodel/AccettazioneOnOrdineAccettazioneInevasoViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_ordine_inevaso/viewmodel/AccettazioneOnOrdineAccettazioneInevasoViewModel.java index 0cefdb07..56b2395d 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_ordine_inevaso/viewmodel/AccettazioneOnOrdineAccettazioneInevasoViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/accettazione_ordine_inevaso/viewmodel/AccettazioneOnOrdineAccettazioneInevasoViewModel.java @@ -206,7 +206,6 @@ public class AccettazioneOnOrdineAccettazioneInevasoViewModel implements IOnColl public RunnableArgs onScanSuccessfull = data -> { ProgressDialog progressDialog = UtilityProgress.createDefaultProgressDialog(mActivity); - progressDialog.show(); BarcodeManager.disable(); 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 5da0036b..1e04530a 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 @@ -19,6 +19,7 @@ import it.integry.integrywmsnative.core.REST.model.AvailableCodMdepsDTO; import it.integry.integrywmsnative.core.di.BindableBoolean; import it.integry.integrywmsnative.core.di.BindableString; import it.integry.integrywmsnative.core.settings.SettingsManager; +import it.integry.integrywmsnative.core.utility.UtilityProgress; import it.integry.integrywmsnative.core.utility.UtilityServer; import it.integry.integrywmsnative.gest.login.LoginActivity; import it.integry.integrywmsnative.gest.login.core.LoginHelper; @@ -233,13 +234,23 @@ public class LoginViewModel { public void onLoginCompleted() { loginButtonEnabled.set(true); - SettingsManager.update(); - Intent myIntent = new Intent(mActivity, MainActivity.class); - mActivity.startActivity(myIntent); + ProgressDialog loadingProgress = UtilityProgress.createDefaultProgressDialog(mActivity); + SettingsManager.reloadDBVariables(() -> { + loadingProgress.dismiss(); + mActivity.finish(); - mActivity.finish(); + Intent myIntent = new Intent(mActivity, MainActivity.class); + mActivity.startActivity(myIntent); + + },ex -> { + loadingProgress.dismiss(); + DialogSimpleMessageHelper.makeErrorDialog(mActivity, + new SpannableString(ex.getMessage()), null, null).show(); + } + ); } + } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoActivity.java new file mode 100644 index 00000000..456f3423 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/PickingLiberoActivity.java @@ -0,0 +1,57 @@ +package it.integry.integrywmsnative.gest.picking_libero; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.databinding.DataBindingUtil; +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.utility.UtilityExceptions; +import it.integry.integrywmsnative.databinding.ActivityPickingLiberoBinding; +import it.integry.integrywmsnative.gest.picking_libero.core.PickingLiberoHelper; +import it.integry.integrywmsnative.gest.picking_libero.viewmodel.PickingLiberoViewModel; + +import android.os.Bundle; + +public class PickingLiberoActivity extends AppCompatActivity { + + private ActivityPickingLiberoBinding mBindings; + + private PickingLiberoHelper mHelper; + private PickingLiberoViewModel mViewModel; + + private int barcodeScannerIstanceID = -1; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mBindings = DataBindingUtil.setContentView(this, R.layout.activity_picking_libero); + + mHelper = new PickingLiberoHelper(this); + + mViewModel = new PickingLiberoViewModel(); + mViewModel.init(this, mBindings, mHelper); + + mBindings.setViewmodel(mViewModel); + + setSupportActionBar(this.mBindings.toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO() + .setOnScanSuccessfull(mViewModel.onScanSuccessfull) + .setOnScanFailed(ex -> UtilityExceptions.defaultException(this, ex, false))); + } + + @Override + public boolean onSupportNavigateUp() { + onBackPressed(); + return true; + } + + @Override + public void onBackPressed() { + mViewModel.onBackPressed(); + + BarcodeManager.removeCallback(barcodeScannerIstanceID); + super.onBackPressed(); + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/core/PickingLiberoHelper.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/core/PickingLiberoHelper.java new file mode 100644 index 00000000..1d0cc315 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/core/PickingLiberoHelper.java @@ -0,0 +1,13 @@ +package it.integry.integrywmsnative.gest.picking_libero.core; + +import android.content.Context; + +public class PickingLiberoHelper { + + private final Context mContext; + + public PickingLiberoHelper(Context context) { + mContext = context; + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/viewmodel/PickingLiberoViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/viewmodel/PickingLiberoViewModel.java new file mode 100644 index 00000000..c1a195c9 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/picking_libero/viewmodel/PickingLiberoViewModel.java @@ -0,0 +1,416 @@ +package it.integry.integrywmsnative.gest.picking_libero.viewmodel; + +import android.app.Activity; +import android.app.ProgressDialog; +import android.text.SpannableString; + +import com.annimon.stream.Stream; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; +import java.util.List; + +import androidx.databinding.Observable; +import androidx.databinding.ObservableArrayList; +import androidx.databinding.ObservableField; +import it.integry.integrywmsnative.R; +import it.integry.integrywmsnative.core.CommonConst; +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.ISimpleOperationCallback; +import it.integry.integrywmsnative.core.REST.model.Ean128Model; +import it.integry.integrywmsnative.core.REST.model.Ean13PesoModel; +import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; +import it.integry.integrywmsnative.core.di.BindableBoolean; +import it.integry.integrywmsnative.core.expansion.RunnableArgs; +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.model.secondary.GestioneEnum; +import it.integry.integrywmsnative.core.utility.UtilityBarcode; +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.ActivityPickingLiberoBinding; +import it.integry.integrywmsnative.gest.picking_libero.core.PickingLiberoHelper; +import it.integry.integrywmsnative.gest.vendita.dto.PickingObjectDTO; +import it.integry.integrywmsnative.ui.StatusBarAlert; +import it.integry.integrywmsnative.view.dialogs.DialogSimpleMessageHelper; +import it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts.DialogChooseArtsFromListaArts; +import it.integry.integrywmsnative.view.dialogs.input_quantity.DialogInputQuantity; +import it.integry.integrywmsnative.view.dialogs.input_quantity.QuantityDTO; +import it.integry.plugins.barcode_base_library.model.BarcodeScanDTO; + +public class PickingLiberoViewModel { + + public ObservableField mtbColt = new ObservableField<>(); + + public BindableBoolean thereIsAnOpenedUL = new BindableBoolean(); + public BindableBoolean thereIsntAnOpenedUL = new BindableBoolean(); + public BindableBoolean thereIsAnyRowInUL = new BindableBoolean(); + public BindableBoolean thereIsAnOpenULWithoutRows = new BindableBoolean(); + + private Activity mContext; + private ActivityPickingLiberoBinding mBinding; + private PickingLiberoHelper mHelper; + + public void init(Activity context, ActivityPickingLiberoBinding binding, PickingLiberoHelper helper) { + mContext = context; + mBinding = binding; + mHelper = helper; + + initObservable(); + } + + + private void initObservable() { + refreshBindables(); + + mtbColt.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() { + @Override + public void onPropertyChanged(Observable sender, int propertyId) { + refreshBindables(); + } + }); + } + + private void refreshBindables() { + thereIsAnOpenedUL.set(mtbColt.get() != null); + thereIsntAnOpenedUL.set(!thereIsAnOpenedUL.get()); + + thereIsAnyRowInUL.set(mtbColt.get() != null && + mtbColt.get().getMtbColr() != null && + mtbColt.get().getMtbColr().size() > 0); + + + thereIsAnOpenULWithoutRows.set(mtbColt.get() != null && + (mtbColt.get().getMtbColr() == null || mtbColt.get().getMtbColr().size() == 0)); + } + + + public void onBackPressed() { + if(thereIsAnOpenedUL.get()) { + this.closeLU(); + } + } + + + public RunnableArgs onScanSuccessfull = data -> { + + ProgressDialog progressDialog = UtilityProgress.createDefaultProgressDialog(mContext); + BarcodeManager.disable(); + + + if(UtilityBarcode.isEtichettaAnonima(data)){ + //Cerco gli articoli presenti nell'ul dell'etichetta anonima + this.executeEtichettaLU(data.getStringValue(), progressDialog); + } else if(UtilityBarcode.isEtichetta128(data)) { + + //Cerco tramite etichetta ean 128 (che può indicarmi una UL) + this.executeEtichettaEan128(data, progressDialog); + } else { + BarcodeManager.enable(); + } + + }; + + + private void executeEtichettaLU(String sscc, ProgressDialog progressDialog) { + ColliMagazzinoRESTConsumer.getBySSCC(sscc, true, false, mtbColtScanned -> { + + if(mtbColtScanned == null) { + showNoULFound(() -> { + BarcodeManager.enable(); + progressDialog.dismiss(); + }); + } else if((mtbColtScanned.getGestioneEnum() == GestioneEnum.ACQUISTO || mtbColtScanned.getGestioneEnum() == GestioneEnum.LAVORAZIONE) && mtbColtScanned.getSegno() > 0) { + pickMerceULtoUL(mtbColtScanned, mtbColt.get(), progressDialog); + } else { + showNoULFound(() -> { + BarcodeManager.enable(); + progressDialog.dismiss(); + }); + } + + }, ex -> { + showNoULFound(() -> { + BarcodeManager.enable(); + progressDialog.dismiss(); + }); + }); + } + + + private void executeEtichettaEan128(BarcodeScanDTO barcodeScanDTO, ProgressDialog progressDialog) { + BarcodeRESTConsumer.decodeEan128(barcodeScanDTO, ean128Model -> { + + String barcodeProd = null; + + if(!UtilityString.isNullOrEmpty(ean128Model.Sscc)) barcodeProd = ean128Model.Sscc; + if(!UtilityString.isNullOrEmpty(ean128Model.Gtin)) barcodeProd = ean128Model.Gtin; + if(!UtilityString.isNullOrEmpty(ean128Model.Content)) barcodeProd = ean128Model.Content; + + + if(!UtilityString.isNullOrEmpty(barcodeProd)) { + + if(!UtilityString.isNullOrEmpty(ean128Model.Sscc)){ + this.executeEtichettaLU(ean128Model.Sscc, progressDialog); + } else { + showNoULFound(() -> { + BarcodeManager.enable(); + progressDialog.dismiss(); + }); + + } + + + } else { + //EAN 128 non completo o comunque mancano i riferimenti al prodotto + showNoULFound(() -> { + BarcodeManager.enable(); + progressDialog.dismiss(); + }); + } + }, ex-> { + UtilityExceptions.defaultException(mContext, ex, progressDialog); + BarcodeManager.enable(); + }); + } + + + + private void pickMerceULtoUL(MtbColt sourceMtbColt, MtbColt destMtbColt, ProgressDialog progressDialog) { + List mtbColrsToPick = Stream.of(sourceMtbColt.getMtbColr()) + .filter(x -> x.getQtaCol().floatValue() > 0) + .toList(); + + DialogChooseArtsFromListaArts.make(mContext, mtbColrsToPick, pickedAarts -> { + + progressDialog.dismiss(); + + List destNewMtbColr = new ArrayList<>(); + + askQuantities(pickedAarts.iterator(), destNewMtbColr, () -> { + + if(destNewMtbColr != null && destNewMtbColr.size() > 0){ + MtbColt clonedTestata = (MtbColt) destMtbColt.clone(); + ObservableArrayList mtbColrObservableField = new ObservableArrayList<>(); + + for(int i = 0; i < destNewMtbColr.size(); i++) { + MtbColr cloneMtbColr = (MtbColr) destNewMtbColr.get(i).clone(); + + cloneMtbColr + .setGestioneRif(cloneMtbColr.getGestione()) + .setGestione(null); + + cloneMtbColr + .setSerColloRif(cloneMtbColr.getSerCollo()) + .setSerCollo(null); + + cloneMtbColr + .setNumColloRif(cloneMtbColr.getNumCollo()) + .setNumCollo(null); + + cloneMtbColr + .setDataColloRif(cloneMtbColr.getDataColloS()) + .setDataCollo(null); + + mtbColrObservableField.add(cloneMtbColr); + } + + clonedTestata.setMtbColr(mtbColrObservableField); + + saveLU(clonedTestata); + } + + }); + + }, () -> { + progressDialog.dismiss(); + BarcodeManager.enable(); + }).show(); + } + + + private void askQuantities(Iterator sourceMtbColrs, List destMtbColr, Runnable onComplete){ + + if(sourceMtbColrs.hasNext()){ + + askSingleQuantity(sourceMtbColrs.next(), mtbColr -> { + destMtbColr.add(mtbColr); + askQuantities(sourceMtbColrs, destMtbColr, onComplete); + }); + } else { + onComplete.run(); + } + } + + + private void askSingleQuantity(MtbColr mtbColr, RunnableArgs onComplete) { + DialogInputQuantity.DTO dto = new DialogInputQuantity.DTO() + .setBatchLot(mtbColr.getPartitaMag()) + .setDataScad(mtbColr.getDataScadPartitaD()) + .setMtbAart(mtbColr.getMtbAart()) + .setQtaTot(mtbColr.getQtaCol()) + .setQtaOrd(mtbColr.getQtaCol()) + .setQtaDaEvadere(new BigDecimal(-1)) + .setQtaEvasa(BigDecimal.ZERO) + .setCanPartitaMagBeChanged(false) + .setCanDataScadBeChanged(false) + .setMaxQta(mtbColr.getQtaCol()); + + DialogInputQuantity.makeBase(mContext, dto, false, quantityDTO -> { + mtbColr + .setQtaCol(new BigDecimal(quantityDTO.qtaTot.get())) + .setQtaCnf(new BigDecimal(quantityDTO.qtaCnf.get())) + .setNumCnf(new BigDecimal(quantityDTO.numCnf.get())) + .setDatetimeRow(new Date()); + + onComplete.run(mtbColr); + }).show(); + } + + + + private void saveLU(MtbColt mtbColtToSave) { + mtbColtToSave.setOperation(CommonModelConsts.OPERATION.INSERT_OR_UPDATE); + + for(int i = 0; i < mtbColtToSave.getMtbColr().size(); i++) { + mtbColtToSave.getMtbColr().get(i).setOperation(CommonModelConsts.OPERATION.INSERT_OR_UPDATE); + } + + ProgressDialog progressDialog = UtilityProgress.createDefaultProgressDialog(mContext); + + ColliMagazzinoRESTConsumer.saveCollo(mtbColtToSave, value -> { + mtbColt.get().getMtbColr().addAll(mtbColtToSave.getMtbColr()); + + for(int i = 0; i < mtbColt.get().getMtbColr().size(); i++) { + mtbColt.get().getMtbColr().get(i).setOperation(CommonModelConsts.OPERATION.NO_OP); + } + + progressDialog.dismiss(); + BarcodeManager.enable(); + }, ex -> { + BarcodeManager.enable(); + UtilityExceptions.defaultException(mContext, ex, progressDialog); + }); + + } + + + private void showDataSavedDialog() { + + DialogSimpleMessageHelper.makeSuccessDialog( + mContext, + mContext.getResources().getString(R.string.completed), + new SpannableString(mContext.getResources().getString(R.string.data_saved)), + null, null).show(); + + } + + + private void showNoULFound(Runnable onComplete) { + DialogSimpleMessageHelper.makeWarningDialog(mContext, + new SpannableString(mContext.getResources().getText(R.string.no_lu_found_message)), + null, onComplete).show(); + } + + + + + + public void createNewLU() { + createNewLU(null, null, null); + } + + private void createNewLU(Integer customNumCollo, String customSerCollo, Runnable onComplete) { + + ProgressDialog progressDialog = UtilityProgress.createDefaultProgressDialog(mContext); + + MtbColt mtbColt = new MtbColt(); + mtbColt .setGestione(GestioneEnum.VENDITA) + .setSegno(-1) + .setOperation(CommonModelConsts.OPERATION.INSERT_OR_UPDATE); + + if(customNumCollo != null) { + mtbColt.setNumCollo(customNumCollo); + } + + if(!UtilityString.isNullOrEmpty(customSerCollo)) { + mtbColt.setSerCollo(customSerCollo); + } + + ColliMagazzinoRESTConsumer.saveCollo(mtbColt, savedMtbColt -> { + savedMtbColt.setMtbColr(new ObservableArrayList<>()); + setULToCurrentContext(savedMtbColt); + + progressDialog.dismiss(); + + new StatusBarAlert.Builder(mContext) + .autoHide(true) + .withDuration(2500) + .showProgress(false) + .withText(R.string.data_saved) + .withAlertColor(R.color.mainGreen) + .build(); + + if(onComplete != null) onComplete.run(); + + }, ex -> UtilityExceptions.defaultException(mContext, ex, progressDialog)); + } + + + private void setULToCurrentContext(MtbColt mtbColt){ + this.mtbColt.set(mtbColt); + } + + + public void closeLU() { + if(thereIsAnOpenedUL.get()) { + final ProgressDialog progress = UtilityProgress.createDefaultProgressDialog(mContext); + + if(thereIsAnyRowInUL.get()) { + updateDataFine(progress, null); //() -> distribuisciCollo(progress, () -> printCollo(progress))); + } else { + deleteCollo(progress); + } + + } + } + + private void updateDataFine(ProgressDialog progress, Runnable onComplete) { + + MtbColt cloneMtbColt = (MtbColt) this.mtbColt.get().clone(); + cloneMtbColt.setOperation(CommonModelConsts.OPERATION.NO_OP); + cloneMtbColt.setOraFinePrep(new Date()); + + + ColliMagazzinoRESTConsumer.saveCollo(cloneMtbColt, new ISimpleOperationCallback() { + @Override + public void onSuccess(MtbColt value) { + if(onComplete != null) onComplete.run(); + } + + @Override + public void onFailed(Exception ex) { + UtilityExceptions.defaultException(mContext, ex, progress); + } + }); + + } + + private void deleteCollo(ProgressDialog progress) { + + ColliMagazzinoRESTConsumer.deleteCollo(this.mtbColt.get(), () -> { + this.mtbColt.set(null); + + progress.dismiss(); + }, ex -> UtilityExceptions.defaultException(mContext, ex, progress) + ); + } + +} diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/MainVenditaFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/MainVenditaFragment.java index 2750abea..f762f7f6 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/MainVenditaFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/MainVenditaFragment.java @@ -10,6 +10,9 @@ import androidx.recyclerview.widget.LinearLayoutManager; import android.text.Html; import android.text.SpannableString; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -34,6 +37,7 @@ import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityToast; import it.integry.integrywmsnative.databinding.FragmentMainVenditaBinding; import it.integry.integrywmsnative.core.interfaces.ITitledFragment; +import it.integry.integrywmsnative.gest.picking_libero.PickingLiberoActivity; import it.integry.integrywmsnative.gest.vendita.core.MainListVenditaAdapter; import it.integry.integrywmsnative.gest.vendita.core.VenditaHelper; import it.integry.integrywmsnative.gest.vendita.dialogs.DialogVenditaFiltroAvanzato; @@ -87,6 +91,8 @@ public class MainVenditaFragment extends Fragment implements ITitledFragment, IR if (getArguments() != null) { } + setHasOptionsMenu(true); + init(); } @@ -114,6 +120,25 @@ public class MainVenditaFragment extends Fragment implements ITitledFragment, IR return mBinding.getRoot(); } + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.fragment_vendita, menu); + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + + if(item.getItemId() == R.id.action_free_picking) { + Intent myIntent = new Intent(getActivity(), PickingLiberoActivity.class); + startActivity(myIntent); + } + + return true; + + } + + private void init(){ final ProgressDialog progress = ProgressDialog.show(getActivity(), getText(R.string.waiting), diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dto/PickingObjectDTO.java b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dto/PickingObjectDTO.java index 5b715d28..f84225e9 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dto/PickingObjectDTO.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/dto/PickingObjectDTO.java @@ -6,10 +6,14 @@ import android.os.Parcelable; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import it.integry.integrywmsnative.core.REST.model.Ean128Model; 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.utility.UtilityDate; import it.integry.integrywmsnative.core.utility.UtilityLogger; import it.integry.integrywmsnative.core.utility.UtilityString; @@ -43,6 +47,8 @@ public class PickingObjectDTO implements Parcelable { private Boolean tempHidden = null; private PickData tempPickData = null; + private List withdrawRows = new ArrayList<>(); + protected PickingObjectDTO(Parcel in) { if (in.readByte() == 0) { numCollo = null; @@ -417,12 +423,22 @@ public class PickingObjectDTO implements Parcelable { return this; } + public List getWithdrawRows() { + return withdrawRows; + } + + public PickingObjectDTO setWithdrawRows(List withdrawRows) { + this.withdrawRows = withdrawRows; + return this; + } + public static class PickData { private String batchLot; private BigDecimal qtaTot; private BigDecimal qtaCnf; private BigDecimal numCnf; private Date dataScad; + private MtbColt sourceMtbColt; public String getBatchLot() { @@ -470,7 +486,14 @@ public class PickingObjectDTO implements Parcelable { return this; } + public MtbColt getSourceMtbColt() { + return sourceMtbColt; + } + public PickData setSourceMtbColt(MtbColt sourceMtbColt) { + this.sourceMtbColt = sourceMtbColt; + return this; + } public static PickData fromEan128(Ean128Model ean128Model) { PickingObjectDTO.PickData pickData = null; diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/vendita_ordine_inevaso/core/VenditaOrdineInevasoHelper.java b/app/src/main/java/it/integry/integrywmsnative/gest/vendita_ordine_inevaso/core/VenditaOrdineInevasoHelper.java index 2780cdb5..c58379c5 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/vendita_ordine_inevaso/core/VenditaOrdineInevasoHelper.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/vendita_ordine_inevaso/core/VenditaOrdineInevasoHelper.java @@ -133,13 +133,14 @@ public class VenditaOrdineInevasoHelper { if(mtbColrs != null) { - List filteredMtbColrs = Stream.of(mtbColrs).filter( - x -> x.getCodMart().equalsIgnoreCase(item.getCodMart()) && - ((x.getCodJcom() == null && item.getCodJcom() == null) || (x.getCodJcom() != null && x.getCodJcom().equalsIgnoreCase(item.getCodJcom()))) && - (!SettingsManager.iDB().isEnableCheckPartitaMagCheckPickingV() || (SettingsManager.iDB().isEnableCheckPartitaMagCheckPickingV() && ((x.getPartitaMag() == null && item.getPartitaMag() == null) || (x.getPartitaMag() != null && x.getPartitaMag().equalsIgnoreCase(item.getPartitaMag()))))) && - ((x.getNumColloRif() == null && item.getNumCollo() == null) || (x.getNumColloRif() != null && x.getNumColloRif().equals(item.getNumCollo())))).toList(); - for (MtbColr mtbColr : filteredMtbColrs) { +// List filteredMtbColrs = Stream.of(mtbColrs).filter( +// x -> x.getCodMart().equalsIgnoreCase(item.getCodMart()) && +// ((x.getCodJcom() == null && item.getCodJcom() == null) || (x.getCodJcom() != null && x.getCodJcom().equalsIgnoreCase(item.getCodJcom()))) && +// (!SettingsManager.iDB().isEnableCheckPartitaMagCheckPickingV() || (SettingsManager.iDB().isEnableCheckPartitaMagCheckPickingV() && ((x.getPartitaMag() == null && item.getPartitaMag() == null) || (x.getPartitaMag() != null && x.getPartitaMag().equalsIgnoreCase(item.getPartitaMag()))))) && +// ((x.getNumColloRif() == null && item.getNumCollo() == null) || (x.getNumColloRif() != null && x.getNumColloRif().equals(item.getNumCollo())))).toList(); + + for (MtbColr mtbColr : item.getWithdrawRows()) { currentQtaEvasa = currentQtaEvasa.add(mtbColr.getQtaCol()); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/vendita_ordine_inevaso/viewmodel/VenditaOrdineInevasoViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/vendita_ordine_inevaso/viewmodel/VenditaOrdineInevasoViewModel.java index bbb23db0..8d9a536a 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/vendita_ordine_inevaso/viewmodel/VenditaOrdineInevasoViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/vendita_ordine_inevaso/viewmodel/VenditaOrdineInevasoViewModel.java @@ -235,7 +235,7 @@ public class VenditaOrdineInevasoViewModel implements IOnColloClosedCallback, IO for(int i = 0; i < recoveredMtbColt.getMtbColr().size(); i++){ - MtbColr currentMtbColr = recoveredMtbColt.getMtbColr().get(i); +// MtbColr currentMtbColr = recoveredMtbColt.getMtbColr().get(i); // List foundRows = Stream.of(groupedOrdini) // .filter(x -> x.getNumOrd() == currentMtbColr.getNumOrd() && @@ -260,7 +260,6 @@ public class VenditaOrdineInevasoViewModel implements IOnColloClosedCallback, IO public RunnableArgs onScanSuccessfull = data -> { ProgressDialog progressDialog = UtilityProgress.createDefaultProgressDialog(mActivity); - progressDialog.show(); BarcodeManager.disable(); @@ -431,7 +430,6 @@ public class VenditaOrdineInevasoViewModel implements IOnColloClosedCallback, IO final List pickingList = mPickingList; - List matchPickingObject = Stream.of(pickingList) .filter(x -> Objects.equals(x.getNumCollo(), scannedUL.getNumCollo()) && x.getDataColloS().equals(scannedUL.getDataColloS()) && @@ -440,20 +438,21 @@ public class VenditaOrdineInevasoViewModel implements IOnColloClosedCallback, IO //Cerco se devo fare pick dell'articolo tramite codMart perché forse non risulta in nessun collo - if(matchPickingObject != null && matchPickingObject.size() == 0 && scannedUL.getMtbColr() != null && scannedUL.getMtbColr().size() > 0) { + //if(matchPickingObject != null && matchPickingObject.size() == 0 && scannedUL.getMtbColr() != null && scannedUL.getMtbColr().size() > 0) { List listOfCodMartsInRowCollo = Stream.of(scannedUL.getMtbColr()) .map(MtbColr::getCodMart) .withoutNulls() .toList(); - matchPickingObject = Stream.of(pickingList) - .filter(x -> x.getNumCollo() == null && + List matchPickingObjectByArt = Stream.of(pickingList) + .filter(x -> //x.getNumCollo() == null && (listOfCodMartsInRowCollo.contains(x.getCodMart()))) .toList(); + if(SettingsManager.iDB().isEnableCheckPartitaMagCheckPickingV()) { - for (int i = 0; i < matchPickingObject.size(); i++) { - PickingObjectDTO tmpPickObj = matchPickingObject.get(i); + for (int i = 0; i < matchPickingObjectByArt.size(); i++) { + PickingObjectDTO tmpPickObj = matchPickingObjectByArt.get(i); @@ -464,7 +463,7 @@ public class VenditaOrdineInevasoViewModel implements IOnColloClosedCallback, IO boolean anyMatch = matchWithPartitaMag.size() > 0; if(!anyMatch) { - matchPickingObject.remove(i); + matchPickingObjectByArt.remove(i); i--; } else if(matchWithPartitaMag.size() == 1){ MtbColr matchRow = matchWithPartitaMag.get(0); @@ -474,15 +473,17 @@ public class VenditaOrdineInevasoViewModel implements IOnColloClosedCallback, IO .setDataScad(matchRow.getDataScadPartitaD()) .setNumCnf(matchRow.getNumCnf()) .setQtaCnf(matchRow.getQtaCnf()) - .setQtaTot(matchRow.getQtaCol()); + .setQtaTot(matchRow.getQtaCol()) + .setSourceMtbColt(scannedUL); tmpPickObj.setTempPickData(pickData); } } - } else { - for (int i = 0; i < matchPickingObject.size(); i++) { - PickingObjectDTO tmpPickObj = matchPickingObject.get(i); + } else { + for (int i = 0; i < matchPickingObjectByArt.size(); i++) { + + PickingObjectDTO tmpPickObj = matchPickingObjectByArt.get(i); List matchWithColloRow = Stream.of(scannedUL.getMtbColr()) .filter(x -> x.getCodMart().equalsIgnoreCase(tmpPickObj.getCodMart())).toList(); @@ -494,7 +495,8 @@ public class VenditaOrdineInevasoViewModel implements IOnColloClosedCallback, IO .setDataScad(matchRow.getDataScadPartitaD()) .setNumCnf(matchRow.getNumCnf()) .setQtaCnf(matchRow.getQtaCnf()) - .setQtaTot(matchRow.getQtaCol()); + .setQtaTot(matchRow.getQtaCol()) + .setSourceMtbColt(scannedUL); tmpPickObj.setTempPickData(pickData); } @@ -503,7 +505,10 @@ public class VenditaOrdineInevasoViewModel implements IOnColloClosedCallback, IO } - } + + + //} + matchPickingObject.addAll(matchPickingObjectByArt); this.loadMatchedRows(matchPickingObject); @@ -915,7 +920,16 @@ public class VenditaOrdineInevasoViewModel implements IOnColloClosedCallback, IO .setDescrizione(item.getDescrizioneEstesa()) .setDatetimeRow(new Date()); - if(item.getNumCollo() != null) { + if(item.getTempPickData() != null && item.getTempPickData().getSourceMtbColt() != null) { + MtbColt sourceMtbColt = item.getTempPickData().getSourceMtbColt(); + + mtbColr + .setCodJcom(UtilityString.empty2null(item.getCodJcom())) + .setSerColloRif(UtilityString.empty2null(sourceMtbColt.getSerCollo())) + .setNumColloRif(sourceMtbColt.getNumCollo()) + .setGestioneRif(UtilityString.empty2null(sourceMtbColt.getGestione())) + .setDataColloRif(UtilityString.empty2null(sourceMtbColt.getDataColloS())); + } else if(item.getNumCollo() != null) { mtbColr .setCodJcom(UtilityString.empty2null(item.getCodJcom())) .setSerColloRif(UtilityString.empty2null(item.getSerCollo())) @@ -947,6 +961,8 @@ public class VenditaOrdineInevasoViewModel implements IOnColloClosedCallback, IO .setUntMis(item.getMtbAart().getUntMis()) .setMtbAart(item.getMtbAart()); + item.getWithdrawRows().add(mtbColr); + mArticoliInColloBottomSheetViewModel.mtbColt.get().getMtbColr().add(mtbColr); //Chiamato removeListFilter perché cosi mi cancella tutti i dati di pick temporanei diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/DialogSimpleMessageHelper.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/DialogSimpleMessageHelper.java index 67780561..0c9a48e3 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/DialogSimpleMessageHelper.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/DialogSimpleMessageHelper.java @@ -109,6 +109,7 @@ public class DialogSimpleMessageHelper { .setCustomTitle(titleView) .setView(contentView) // .setMessage(messageText) + .setCancelable(false) .setPositiveButton(mContext.getText(R.string.ok), (dialog, which) -> { if(onPositiveClick != null) onPositiveClick.run(); }); diff --git a/app/src/main/res/drawable/ic_check_white_24dp.xml b/app/src/main/res/drawable/ic_check_white_24dp.xml new file mode 100644 index 00000000..6541ee3e --- /dev/null +++ b/app/src/main/res/drawable/ic_check_white_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_picking_libero.xml b/app/src/main/res/layout/activity_picking_libero.xml new file mode 100644 index 00000000..68a98e44 --- /dev/null +++ b/app/src/main/res/layout/activity_picking_libero.xml @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_choose_art_from_lista_art__item_model.xml b/app/src/main/res/layout/dialog_choose_art_from_lista_art__item_model.xml index e977c145..ca439a10 100644 --- a/app/src/main/res/layout/dialog_choose_art_from_lista_art__item_model.xml +++ b/app/src/main/res/layout/dialog_choose_art_from_lista_art__item_model.xml @@ -50,7 +50,7 @@ android:textColor="@color/red_600" android:textSize="14sp" android:textStyle="bold" - android:visibility="@{UtilityString.isNullOrEmpty(mtbAart.diacod) ? View.INVISIBLE : View.VISIBLE}" + android:visibility="@{UtilityString.isNullOrEmpty(mtbAart.diacod) ? View.GONE : View.VISIBLE}" android:layout_alignParentEnd="true" tools:text="DIACOD"/> diff --git a/app/src/main/res/layout/dialog_choose_arts_from_lista_arts__item_model.xml b/app/src/main/res/layout/dialog_choose_arts_from_lista_arts__item_model.xml index edb03fa9..f01baf5b 100644 --- a/app/src/main/res/layout/dialog_choose_arts_from_lista_arts__item_model.xml +++ b/app/src/main/res/layout/dialog_choose_arts_from_lista_arts__item_model.xml @@ -53,7 +53,18 @@ tools:text="COD MART" /> - + + + + + + diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index b7566829..63a94bd1 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -132,6 +132,7 @@ Il barcode scansionato non ha fornito alcun risultato + Il barcode scansionato ha fornito multipli risultati Filtro articoli applicato Rimuovi filtro @@ -163,6 +164,11 @@ Livello Non valido - + + Tutti i permessi sono stati declinati, riapri l\'applicazione per continuare. + Download aggiornamento + Picking libero + Per iniziare clicca sul + in basso a destra + Scansiona un articolo per iniziare \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3b0dba4f..34f6fbdc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -142,6 +142,7 @@ The scanned label has already been used The scanned barcode did not produce any results + The scanned barcode produced multiple results Item filter applied Remove filter @@ -171,6 +172,11 @@ Multiple LU found Do you want print the label? Please scan a Position barcode - Please note that all permissions are required. Application will close now. + Please note that all permissions are required. Application will close now. + All permissions are required, please reopen the app. + Downloading update + Free Picking + Please press + button to start with picking + Scan an item to start diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml new file mode 100644 index 00000000..ffa74ab5 --- /dev/null +++ b/app/src/main/res/xml/provider_paths.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file