Finish v1_0_14(17)

This commit is contained in:
Gius95 2019-01-07 19:36:45 +01:00
commit 662c07ae5b
29 changed files with 1142 additions and 82 deletions

Binary file not shown.

View File

@ -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'

View File

@ -6,6 +6,7 @@
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<application
android:name=".MainApplication"
@ -21,9 +22,7 @@
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@style/Light"
android:windowSoftInputMode="adjustPan">
</activity>
android:windowSoftInputMode="adjustPan"></activity>
<activity
android:name=".gest.accettazione_ordine_inevaso.AccettazioneOrdineInevasoActivity"
android:screenOrientation="portrait"
@ -66,6 +65,23 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name=".core.update.GenericFileProvider"
android:authorities="${applicationId}.core.update.GenericFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
<activity
android:name=".gest.picking_libero.PickingLiberoActivity"
android:label="@string/free_picking"
android:screenOrientation="portrait"
android:theme="@style/Light"
android:windowSoftInputMode="adjustNothing" ></activity>
</application>
</manifest>

View File

@ -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)){

View File

@ -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<Integer, String[], List<Integer>> 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,29 +72,53 @@ 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<Integer, String[], List<Integer>> onRequestPermissionResult) {
this.onRequestPermissionResult = onRequestPermissionResult;
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
if(this.onRequestPermissionResult != null) {
List<Integer> grantResultsList = new ArrayList<>();
for(int i = 0; i < grantResults.length; i++) {
grantResultsList.add(grantResults[i]);
}
this.onRequestPermissionResult.run(requestCode, permissions, grantResultsList);
}
}
private void startLoginActivity(){
this.finish();
Intent myIntent = new Intent(this, LoginActivity.class);
startActivity(myIntent);
this.finish();
}
private void startMainActivity(){
new Handler().postDelayed(() -> {
this.finish();
Intent myIntent = new Intent(this, MainActivity.class);
startActivity(myIntent);
this.finish();
}, 3000);
}

View File

@ -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);
}
}

View File

@ -0,0 +1,7 @@
package it.integry.integrywmsnative.core.expansion;
public interface RunnableArgsss<S, T, V> {
void run(S data1, T data2, V data3);
}

View File

@ -0,0 +1,5 @@
package it.integry.integrywmsnative.core.update;
import androidx.core.content.FileProvider;
public class GenericFileProvider extends FileProvider {}

View File

@ -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<String,Void,Void> {
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;
}
}

View File

@ -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));
}
}

View File

@ -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<Boolean> onPermissionsDenied) {
public static void askPermissions(SplashActivity activity, Runnable onPermissionsConfirmed, RunnableArgs<Boolean> onPermissionsDenied) {
PermissionLiveData permissionLiveData = PermissionLiveData.create(
activity,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
);
List<String> 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);
}
} else if (permission.getStatus() == Status.PENDING) {
//UtilityToast.showToast(String.format("Pending request for %s", permission.getName()));
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;
}
// 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;
}
}

View File

@ -206,7 +206,6 @@ public class AccettazioneOnOrdineAccettazioneInevasoViewModel implements IOnColl
public RunnableArgs<BarcodeScanDTO> onScanSuccessfull = data -> {
ProgressDialog progressDialog = UtilityProgress.createDefaultProgressDialog(mActivity);
progressDialog.show();
BarcodeManager.disable();

View File

@ -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();
ProgressDialog loadingProgress = UtilityProgress.createDefaultProgressDialog(mActivity);
SettingsManager.reloadDBVariables(() -> {
loadingProgress.dismiss();
mActivity.finish();
Intent myIntent = new Intent(mActivity, MainActivity.class);
mActivity.startActivity(myIntent);
mActivity.finish();
},ex -> {
loadingProgress.dismiss();
DialogSimpleMessageHelper.makeErrorDialog(mActivity,
new SpannableString(ex.getMessage()), null, null).show();
}
);
}
}

View File

@ -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();
}
}

View File

@ -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;
}
}

View File

@ -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> 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<BarcodeScanDTO> 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<MtbColr> mtbColrsToPick = Stream.of(sourceMtbColt.getMtbColr())
.filter(x -> x.getQtaCol().floatValue() > 0)
.toList();
DialogChooseArtsFromListaArts.make(mContext, mtbColrsToPick, pickedAarts -> {
progressDialog.dismiss();
List<MtbColr> destNewMtbColr = new ArrayList<>();
askQuantities(pickedAarts.iterator(), destNewMtbColr, () -> {
if(destNewMtbColr != null && destNewMtbColr.size() > 0){
MtbColt clonedTestata = (MtbColt) destMtbColt.clone();
ObservableArrayList<MtbColr> 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<MtbColr> sourceMtbColrs, List<MtbColr> 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<MtbColr> 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<MtbColt>() {
@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)
);
}
}

View File

@ -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),

View File

@ -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<MtbColr> 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<MtbColr> getWithdrawRows() {
return withdrawRows;
}
public PickingObjectDTO setWithdrawRows(List<MtbColr> 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;

View File

@ -133,13 +133,14 @@ public class VenditaOrdineInevasoHelper {
if(mtbColrs != null) {
List<MtbColr> 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<MtbColr> 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());
}
}

View File

@ -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<OrdineAccettazioneDTO.Riga> foundRows = Stream.of(groupedOrdini)
// .filter(x -> x.getNumOrd() == currentMtbColr.getNumOrd() &&
@ -260,7 +260,6 @@ public class VenditaOrdineInevasoViewModel implements IOnColloClosedCallback, IO
public RunnableArgs<BarcodeScanDTO> onScanSuccessfull = data -> {
ProgressDialog progressDialog = UtilityProgress.createDefaultProgressDialog(mActivity);
progressDialog.show();
BarcodeManager.disable();
@ -431,7 +430,6 @@ public class VenditaOrdineInevasoViewModel implements IOnColloClosedCallback, IO
final List<PickingObjectDTO> pickingList = mPickingList;
List<PickingObjectDTO> 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<String> listOfCodMartsInRowCollo = Stream.of(scannedUL.getMtbColr())
.map(MtbColr::getCodMart)
.withoutNulls()
.toList();
matchPickingObject = Stream.of(pickingList)
.filter(x -> x.getNumCollo() == null &&
List<PickingObjectDTO> 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<MtbColr> 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

View File

@ -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();
});

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>

View File

@ -0,0 +1,193 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:fab="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View"/>
<import type="it.integry.integrywmsnative.core.utility.UtilityString" />
<variable
name="viewmodel"
type="it.integry.integrywmsnative.gest.picking_libero.viewmodel.PickingLiberoViewModel" />
</data>
<androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/full_white">
<it.integry.plugins.waterfalltoolbar.WaterfallToolbar
android:id="@+id/waterfall_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
tools:title="Picking Libero"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</it.integry.plugins.waterfalltoolbar.WaterfallToolbar>
<net.cachapa.expandablelayout.ExpandableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
app:el_expanded_bind="@{viewmodel.thereIsAnOpenedUL}">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:textSize="16sp"
android:textColor="@android:color/white"
android:textStyle="bold"
android:background="@drawable/badge1_round_corner"
android:text="@{viewmodel.mtbColt.get().numCollo.toString()}"
tools:text="2156"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:textSize="16sp"
android:textColor="@android:color/black"
android:textStyle="bold"
android:visibility="@{!UtilityString.isNullOrEmpty(viewmodel.mtbColt.get().posizione) ? View.VISIBLE : View.GONE}"
android:text="@{viewmodel.mtbColt.get().posizione}"
tools:text="ME1FS032"/>
</LinearLayout>
</net.cachapa.expandablelayout.ExpandableLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/free_picking__suggestion_1__guideline_top"
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.35"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/free_picking__suggestion_1__guideline_left"
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.2" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/free_picking__suggestion_1__guideline_right"
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.8" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:alpha="0.4"
app:visibility="@{viewmodel.thereIsntAnOpenedUL}"
app:layout_constraintTop_toBottomOf="@id/free_picking__suggestion_1__guideline_top"
app:layout_constraintLeft_toRightOf="@id/free_picking__suggestion_1__guideline_left"
app:layout_constraintRight_toLeftOf="@id/free_picking__suggestion_1__guideline_right">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
android:textSize="18sp"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:text="@string/free_picking_suggestion_1"/>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:alpha="0.4"
app:visibility="@{viewmodel.thereIsAnOpenULWithoutRows}"
app:layout_constraintTop_toBottomOf="@id/free_picking__suggestion_1__guideline_top"
app:layout_constraintLeft_toRightOf="@id/free_picking__suggestion_1__guideline_left"
app:layout_constraintRight_toLeftOf="@id/free_picking__suggestion_1__guideline_right">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
android:textSize="18sp"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:text="@string/free_picking_suggestion_2"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<com.github.clans.fab.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:layout_marginBottom="8dp"
android:layout_marginRight="8dp"
android:src="@drawable/fab_add"
android:onClick="@{() -> viewmodel.createNewLU()}"
android:visibility="@{viewmodel.mtbColt.get() == null ? View.VISIBLE : View.GONE}"
fab:fab_colorNormal="@color/colorPrimary"
fab:fab_colorPressed="@color/white_pressed"
fab:fab_colorRipple="#66FFFFFF"/>
<com.github.clans.fab.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:layout_marginBottom="8dp"
android:layout_marginRight="8dp"
android:src="@drawable/ic_check_white_24dp"
android:onClick="@{() -> viewmodel.closeLU()}"
android:visibility="@{viewmodel.mtbColt.get() != null ? View.VISIBLE : View.GONE}"
fab:fab_colorNormal="@color/mainGreen"
fab:fab_colorPressed="@color/white_pressed"
fab:fab_colorRipple="#66FFFFFF"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</layout>

View File

@ -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"/>
</RelativeLayout>

View File

@ -53,7 +53,18 @@
tools:text="COD MART" />
<TextView
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{checkableMtbColr.mtbColr.mtbAart.getDiacod()}"
android:textColor="@color/red_600"
android:textSize="14sp"
android:textStyle="bold"
android:visibility="@{UtilityString.isNullOrEmpty(checkableMtbColr.mtbColr.mtbAart.diacod) ? View.GONE : View.VISIBLE}"
tools:text="DIACOD" />
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_free_picking"
android:orderInCategory="100"
android:title="@string/free_picking"
app:showAsAction="never" />
</menu>

View File

@ -132,6 +132,7 @@
<string name="already_used_anonymous_barcode"><![CDATA[L\'etichetta scansionata è stata già utilizzata]]></string>
<string name="no_result_from_barcode">Il barcode scansionato non ha fornito alcun risultato</string>
<string name="multiple_results_from_barcode">Il barcode scansionato ha fornito multipli risultati</string>
<string name="filtered_arts_in_list">Filtro articoli applicato</string>
<string name="remove_filter_button">Rimuovi filtro</string>
@ -163,6 +164,11 @@
<string name="level">Livello</string>
<string name="not_valid">Non valido</string>
<string name="permissions_permanrntly_denied"><![CDATA[Sono stati negati tutti i permessi necessari al funzionamento dell\'applicazione. L\'applicazione verrà adesso chiusa.]]></string>
<string name="permissions_permanently_denied"><![CDATA[Sono stati negati tutti i permessi necessari al funzionamento dell\'applicazione. L\'applicazione verrà adesso chiusa.]]></string>
<string name="permissions_denied">Tutti i permessi sono stati declinati, riapri l\'applicazione per continuare.</string>
<string name="notification_update_download">Download aggiornamento</string>
<string name="free_picking">Picking libero</string>
<string name="free_picking_suggestion_1">Per iniziare clicca sul + in basso a destra</string>
<string name="free_picking_suggestion_2">Scansiona un articolo per iniziare</string>
</resources>

View File

@ -142,6 +142,7 @@
<string name="already_used_anonymous_barcode">The scanned label has already been used</string>
<string name="no_result_from_barcode">The scanned barcode did not produce any results</string>
<string name="multiple_results_from_barcode">The scanned barcode produced multiple results</string>
<string name="filtered_arts_in_list">Item filter applied</string>
<string name="remove_filter_button">Remove filter</string>
@ -171,6 +172,11 @@
<string name="too_much_lu_found_message">Multiple LU found</string>
<string name="ask_print_message">Do you want print the label?</string>
<string name="ask_position_of_lu_message">Please scan a <b>Position</b> barcode</string>
<string name="permissions_permanrntly_denied">Please note that all permissions are required. Application will close now.</string>
<string name="permissions_permanently_denied">Please note that all permissions are required. Application will close now.</string>
<string name="permissions_denied">All permissions are required, please reopen the app.</string>
<string name="notification_update_download">Downloading update</string>
<string name="free_picking">Free Picking</string>
<string name="free_picking_suggestion_1">Please press + button to start with picking</string>
<string name="free_picking_suggestion_2">Scan an item to start</string>
</resources>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>