Implementata lettura barcode in Accettazione

This commit is contained in:
2018-11-27 13:09:54 +01:00
parent 57cc899dfa
commit 218a86cdb1
47 changed files with 1573 additions and 61 deletions

View File

@@ -33,7 +33,6 @@ dependencies {
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.orhanobut:logger:2.2.0'
implementation 'com.android.support:appcompat-v7:27.1.1'
@@ -48,7 +47,6 @@ dependencies {
implementation 'org.parceler:parceler-api:1.1.10'
annotationProcessor 'org.parceler:parceler:1.1.10'
implementation 'com.annimon:stream:1.2.1'
//MVVM
implementation 'android.arch.lifecycle:extensions:1.1.1'
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
@@ -60,11 +58,9 @@ dependencies {
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
implementation 'br.com.zbra:android-linq:1.1.0'
//FAB
//implementation 'com.getbase:floatingactionbutton:1.10.1'
implementation 'com.github.clans:fab:1.6.4'
//CUSTOM VIEWS
implementation 'de.hdodenhof:circleimageview:2.2.0'
implementation 'net.cachapa.expandablelayout:expandablelayout:2.9.2'
@@ -74,8 +70,9 @@ dependencies {
implementation 'com.fxn769:stash:1.2'
testImplementation 'junit:junit:4.12'
implementation project(':waterfall_toolbar')
implementation 'com.mikhaellopez:lazydatepicker:1.0.0'
implementation project(':pointmobilescannerlibrary')
implementation project(path: ':barcode_base_library')
}
repositories {
mavenCentral()

View File

@@ -5,6 +5,7 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
android:name=".MainApplication"
android:allowBackup="true"

View File

@@ -11,6 +11,7 @@ import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.text.SpannableString;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@@ -22,6 +23,7 @@ import butterknife.ButterKnife;
import it.integry.integrywmsnative.core.REST.consumers.ISimpleOperationCallback;
import it.integry.integrywmsnative.core.REST.consumers.ISingleValueOperationCallback;
import it.integry.integrywmsnative.core.REST.watcher.ServerStatusChecker;
import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilitySettings;
import it.integry.integrywmsnative.core.wifi.WiFiCheckerViewHolder;
@@ -32,6 +34,7 @@ import it.integry.integrywmsnative.gest.main.MainFragment;
import it.integry.integrywmsnative.gest.settings.MainSettingsFragment;
import it.integry.integrywmsnative.gest.settings.SettingsPreferenceFragment;
import it.integry.integrywmsnative.gest.vendita.MainVenditaFragment;
import it.integry.integrywmsnative.view.dialogs.DialogSimpleMessageHelper;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
@@ -195,6 +198,14 @@ public class MainActivity extends AppCompatActivity
private void init(){
if(BarcodeManager.getCurrentBarcodeInterface() != null) {
// DialogSimpleMessageHelper.makeInfoDialog(this,
// "Lettore barcode",
// new SpannableString("Trovato adattatore " + BarcodeManager.getCurrentBarcodeInterface().getAdapterName() + " installato nel sistema"),
// null, null).show();
}
ServerStatusChecker.getIstance().addCallback(value -> {
if(value && (!mIsOnline || firstCheckExecution)){

View File

@@ -10,6 +10,7 @@ import com.orhanobut.logger.AndroidLogAdapter;
import com.orhanobut.logger.Logger;
import it.integry.integrywmsnative.core.REST.watcher.ServerStatusChecker;
import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.settings.Stash;
import it.integry.integrywmsnative.core.utility.UtilityExceptions;
@@ -30,6 +31,7 @@ public class MainApplication extends Application {
SettingsManager.init(this);
ServerStatusChecker.init();
BarcodeManager.init(this);
// UtilityExceptions.init(this);
UtilityResources.init(this);
@@ -39,6 +41,8 @@ public class MainApplication extends Application {
res = getResources();
Context = this;
}
// Called by the system when the device configuration changes while your component is running.

View File

@@ -16,6 +16,8 @@ public class CommonConst {
public static class Config {
public static String COMMESSA_MAG = "MAG";
public static String DEFAULT_ANONYMOUS_UL_SERIE = "UL";
}

View File

@@ -0,0 +1,32 @@
package it.integry.integrywmsnative.core.REST.consumers;
import java.util.List;
import it.integry.integrywmsnative.core.REST.RESTBuilder;
import it.integry.integrywmsnative.core.REST.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.model.MtbAart;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class ArticoloRESTConsumer extends _BaseRESTConsumer {
public static void getByBarcodeProd(String barcodeProd, RunnableArgs<List<MtbAart>> onComplete, RunnableArgs<Exception> onFailed) {
ArticoloRESTConsumerService articoloRESTConsumerService = RESTBuilder.getService(ArticoloRESTConsumerService.class);
articoloRESTConsumerService.getByBarcodeProd(barcodeProd).enqueue(new Callback<ServiceRESTResponse<MtbAart>>() {
@Override
public void onResponse(Call<ServiceRESTResponse<MtbAart>> call, Response<ServiceRESTResponse<MtbAart>> response) {
analyzeAnswer(response, "getByBarcodeProd", (m) -> {
onComplete.run(response.body().getEntityList());
}, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<MtbAart>> call, Throwable t) {
onFailed.run(new Exception(t));
}
});
}
}

View File

@@ -0,0 +1,17 @@
package it.integry.integrywmsnative.core.REST.consumers;
import java.util.List;
import it.integry.integrywmsnative.core.REST.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.model.MtbAart;
import retrofit2.Call;
import retrofit2.http.POST;
import retrofit2.http.Query;
public interface ArticoloRESTConsumerService {
@POST("SM2getArticoloByBarcode")
Call<ServiceRESTResponse<MtbAart>> getByBarcodeProd(@Query("barcode") String barcodeProd);
}

View File

@@ -0,0 +1,34 @@
package it.integry.integrywmsnative.core.REST.consumers;
import com.google.gson.JsonObject;
import it.integry.integrywmsnative.core.REST.RESTBuilder;
import it.integry.integrywmsnative.core.REST.model.Ean128Model;
import it.integry.integrywmsnative.core.REST.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.plugins.barcode_base_library.model.BarcodeScanDTO;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class BarcodeRESTConsumer extends _BaseRESTConsumer {
public static void decodeEan128(BarcodeScanDTO barcodeObj, RunnableArgs<Ean128Model> onComplete, RunnableArgs<Exception> onFailed) {
String ean128 = barcodeObj.getStringValue().replaceAll("" + ((char) 29), "|");
BarcodeRESTConsumerService barcodeRESTConsumerService = RESTBuilder.getService(BarcodeRESTConsumerService.class);
barcodeRESTConsumerService.decodeEan128(ean128).enqueue(new Callback<ServiceRESTResponse<Ean128Model>>() {
@Override
public void onResponse(Call<ServiceRESTResponse<Ean128Model>> call, Response<ServiceRESTResponse<Ean128Model>> response) {
analyzeAnswer(response, "DecodeEan128", onComplete, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<Ean128Model>> call, Throwable t) {
onFailed.run(new Exception(t));
}
});
}
}

View File

@@ -0,0 +1,19 @@
package it.integry.integrywmsnative.core.REST.consumers;
import com.google.gson.JsonObject;
import it.integry.integrywmsnative.core.REST.model.DistribuzioneColloDTO;
import it.integry.integrywmsnative.core.REST.model.Ean128Model;
import it.integry.integrywmsnative.core.REST.model.ServiceRESTResponse;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
public interface BarcodeRESTConsumerService {
@GET("decodeEan128")
Call<ServiceRESTResponse<Ean128Model>> decodeEan128(@Query("ean128") String ean128);
}

View File

@@ -40,7 +40,6 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer{
}
public static void distribuisciCollo(MtbColt mtbColtToDistribute, Runnable onComplete, RunnableArgs<Exception> onFailed) {
DistribuzioneColloDTO distribuzioneColloDTO = new DistribuzioneColloDTO()
@@ -55,7 +54,7 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer{
.enqueue(new Callback<ServiceRESTResponse<JsonObject>>() {
@Override
public void onResponse(Call<ServiceRESTResponse<JsonObject>> call, Response<ServiceRESTResponse<JsonObject>> response) {
analyzeAnswer(response, "GetAvailablePrinters", obj -> onComplete.run(), onFailed);
analyzeAnswer(response, "DistribuzioneCollo", obj -> onComplete.run(), onFailed);
}
@Override
@@ -66,6 +65,24 @@ public class ColliMagazzinoRESTConsumer extends _BaseRESTConsumer{
}
public static void getBySSCC(String ssccString, boolean onlyResiduo, boolean throwExcIfNull, RunnableArgs<MtbColt> onComplete, RunnableArgs<Exception> onFailed) {
ColliMagazzinoRESTConsumerService colliMagazzinoRESTConsumerService = RESTBuilder.getService(ColliMagazzinoRESTConsumerService.class);
colliMagazzinoRESTConsumerService.getColloByBarcode(ssccString, onlyResiduo, throwExcIfNull).enqueue(new Callback<ServiceRESTResponse<MtbColt>>() {
@Override
public void onResponse(Call<ServiceRESTResponse<MtbColt>> call, Response<ServiceRESTResponse<MtbColt>> response) {
analyzeAnswer(response, "GetBySSCC", onComplete, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<MtbColt>> call, Throwable t) {
onFailed.run(new Exception(t));
}
});
}
public static void deleteRiga(MtbColr mtbColrToDelete, Runnable onComplete, RunnableArgs<Exception> onFailed){
MtbColr newMtbColr = new MtbColr();

View File

@@ -4,9 +4,12 @@ import com.google.gson.JsonObject;
import it.integry.integrywmsnative.core.REST.model.DistribuzioneColloDTO;
import it.integry.integrywmsnative.core.REST.model.ServiceRESTResponse;
import it.integry.integrywmsnative.core.model.MtbColr;
import it.integry.integrywmsnative.core.model.MtbColt;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;
import retrofit2.http.Query;
public interface ColliMagazzinoRESTConsumerService {
@@ -14,4 +17,7 @@ public interface ColliMagazzinoRESTConsumerService {
@POST("SM2DistribuzioneRigheCollo")
Call<ServiceRESTResponse<JsonObject>> distribuisciCollo(@Body DistribuzioneColloDTO distribuzioneCollo);
@POST("getColloByBarcode")
Call<ServiceRESTResponse<MtbColt>> getColloByBarcode(@Query("codBarreCollo") String sscc, @Query("onlyResiduo") boolean onlyResiduo, @Query("throwExcIfNull") boolean throwExcIfNull);
}

View File

@@ -0,0 +1,342 @@
package it.integry.integrywmsnative.core.REST.model;
public class Ean128Model {
///<summary>Numero sequenziale del collo </summary>
public String Sscc;
///<summary>Codice EAN/UCC unità logistica </summary>
public String Gtin;
///<summary>Codice EAN/UCC dei prodotti contenuti all'interno di unità log</summary>
public String Content;
///<summary>Numero del lotto di fabbricazione</summary>
public String BatchLot;
///<summary>Data di produzione (yymmdd) 0~50 (2000~2050) - 51~99 (1951~1999)</summary>
public String ProdString;
///<summary>Data di scadenza pagamento fattura</summary>
public String DueString;
///<summary>Data di confezionamento</summary>
public String PackString;
///<summary>Data minima di validità</summary>
public String BestBefore;
///<summary>Data massima di validità</summary>
public String Expiry;
///<summary>Variante di prodotto - uso interno aziendale</summary>
public String Variant;
///<summary>Numero di serie</summary>
public String Serial;
///<summary>Dati supplementari per prodotti farmaceutici</summary>
public String QtyStringBatch;
///<summary>Numedi di identificazione supplementare del prodotto</summary>
public String AdditionalID;
///<summary>Codice prodotto interno del cliente</summary>
public String CustPartNumber;
///<summary>Numero di serie secondario</summary>
public String SecondarySerial;
///<summary>Entità di origine o marca auricolare</summary>
public String RefToSource;
///<summary>Quantità variabile</summary>
public String VarCount;
///<summary>Peso netto in Kg</summary>
public Float NetWeightKg;
///<summary>Lunghezza o 1° dimensione, in mt, uso commerciale</summary>
public Float LengthM;
///<summary>Larghezza, diametro o 2° dimensione, in mt, uso commerciale</summary>
public Float WidthM;
///<summary>Profondità, spessore, altezza o 3° dimensione, in mt, uso commerciale</summary>
public Float HeightM;
///<summary>Superficie, in metriquadri, uso commerciale</summary>
public Float AreaM2;
///<summary>Volume, in litri, uso commerciale</summary>
public Float NetVolumeL;
///<summary>Volume, in metricubi, uso commerciale</summary>
public Float NetVolumeM3;
///<summary>Peso netto, in libbre, uso commerciale</summary>
public Float NetWeightLb;
///<summary>Lunghezza o 1° dimensione, in pollici, uso commerciale</summary>
public Float LengthI;
///<summary>Lunghezza o 1° dimensione, in piedi, uso commerciale</summary>
public Float LengthF;
///<summary>Lunghezza o 1° dimensione, in yards, uso commerciale</summary>
public Float LengthY;
///<summary>Larghezza, diametro o 2° dimensione, in pollici, uso commerciale</summary>
public Float WidthI;
///<summary>Larghezza, diametro o 2° dimensione, in piedi, uso commerciale</summary>
public Float WidthF;
///<summary>Larghezza, diametro o 2° dimensione, in yards, uso commerciale</summary>
public Float WidthY;
///<summary>Profondità, spessore, altezza o 3° dimensione, in pollici, uso commerciale</summary>
public Float HeightI;
///<summary>Profondità, spessore, altezza o 3° dimensione, in piedi, uso commerciale</summary>
public Float HeightF;
///<summary>Profondità, spessore, altezza o 3° dimensione, in yards, uso commerciale</summary>
public Float HeightY;
///<summary>Peso lordo, in Kg, uso logistico</summary>
public Float CrossweightKgLog;
///<summary>Peso lordo, in libbre, uso logistico</summary>
public Float CrossweightLbLog;
///<summary>Lunghezza o 1° dimensione, in metri, uso logistico</summary>
public Float LengthMLog;
///<summary>Larghezza, diametro o 2° dimensione, in metri, uso logistico</summary>
public Float WidthMLog;
///<summary>Profondità, spessore, altezza o 3° dimensione, in metri, uso logistico</summary>
public Float HeigthMLog;
///<summary>Superficie, in metriquadri, uso logistico</summary>
public Float AreaM2Log;
///<summary>Volume lordo, in litri, uso logistico</summary>
public Float VolumeLLog;
///<summary>Volume lordo, in metricubi, uso logistico</summary>
public Float VolumeM3Log;
///<summary>Lunghezza o 1° dimensione, in pollici, uso logistico</summary>
public Float LengthILog;
///<summary>Lunghezza o 1° dimensione, in piedi, uso logistico</summary>
public Float LengthFLog;
///<summary>Lunghezza o 1° dimensione, in yards, uso logistico</summary>
public Float LengthYLog;
///<summary>Larghezza, diametro o 2° dimensione, in pollici, uso logistico</summary>
public Float WidthILog;
///<summary>Larghezza, diametro o 2° dimensione, in piedi, uso logistico</summary>
public Float WidthFLog;
///<summary>Larghezza, diametro o 2° dimensione, in yards, uso logistico</summary>
public Float WidthYLog;
///<summary>Profondità, spessore, altezza o 3° dimensione, in pollici, uso logistico</summary>
public Float HeigthILog;
///<summary>Profondità, spessore, altezza o 3° dimensione, in piedi, uso logistico</summary>
public Float HeigthFLog;
///<summary>Profondità, spessore, altezza o 3° dimensione, in yards, uso logistico</summary>
public Float HeigthYLog;
///<summary>Superficie, in pollici quadrati, uso commerciale</summary>
public Float AreaI2;
///<summary>Superficie, in piedi quadrati, uso commerciale</summary>
public Float AreaF2;
///<summary>Superficie, in yards quadrati, uso commerciale</summary>
public Float AreaY2;
///<summary>Superficie, in pollici quadrati, uso logistico</summary>
public Float AreaI2Log;
///<summary>Superficie, in piedi quadrati, uso logistico</summary>
public Float AreaF2Log;
///<summary>Superficie, in yards quadrati, uso logistico</summary>
public Float AreaY2Log;
///<summary>Peso netto, in once troy, uso commerciale</summary>
public Float NetWeightT;
///<summary>Peso netto, in once (U.S.), uso commerciale</summary>
public Float NetVolumeOz;
///<summary>Peso netto, in quarti di gallone, uso commerciale</summary>
public Float NetVolumeLb;
///<summary>Peso netto, in galloni (U.S.), uso commerciale</summary>
public Float NetVolumeG;
///<summary>Volume lordo, in quarti di gallone, uso logistico</summary>
public Float VolumeQLog;
///<summary>Volume lordo, in galloni (U.S.), uso logistico</summary>
public Float VolumeGLog;
///<summary>Volume netto, in pollici cubi, uso commerciale</summary>
public Float NetVolumeI3;
///<summary>Volume netto, in piedi cubi, uso commerciale</summary>
public Float NetVolumeF3;
///<summary>Volume netto, in yards cubi, uso commerciale</summary>
public Float NetVolumeY3;
///<summary>Volume lordo, in pollici cubi, uso logistico</summary>
public Float VolumeI3Log;
///<summary>Volume lordo, in piedi cubi, uso logistico</summary>
public Float VolumeF3Log;
///<summary>Volume lordo, in yards cubi, uso logistico</summary>
public Float VolumeY3Log;
///<summary>Quantità prodotti contenuti in un'unità logistica</summary>
public Integer Count;
///<summary>Importo da pagare singola area monetaria</summary>
public Float Amount;
///<summary>Importo da pagare singola unità monetaria (prodotti a peso variabile)</summary>
public Float Price;
///<summary>Numero d'ordine d'acquisto cliente</summary>
public String OrderNumber;
///<summary>Numero di consegna</summary>
public String Consignment;
///<summary>Numero di spedizione</summary>
public String ShipmentNo;
///<summary>Codice di smistamento pacchi</summary>
public String Route;
///<summary>Codice di locazione EAN/UCC "Spedire a, Consegnare a"</summary>
public String ShipToLoc;
///<summary>Codice di locazione EAN/UCC "Fatturare a"</summary>
public String BillToLoc;
///<summary>Codice di locazione EAN/UCC "Acquistato da"</summary>
public String PurchaseFromLoc;
///<summary>Codice di locazione EAN/UCC "Sperdire per, Consegnare per, Inoltrare a"</summary>
public String ShipForLoc;
///<summary>Codice di locazione EAN/UCC: identificazione di una locazione fisica</summary>
public String LocationNumber;
///<summary>Codice di locazione EAN/UCC di chi emette la fattura</summary>
public String PayToLoc;
///<summary>Codice postale "Spedire a, Consegnare a" (nazionale)</summary>
public String ShipToPost;
///<summary>Paese di origine del prodotto</summary>
public String Origin;
///<summary>Paese di lavorazione con codice nazionale ISO</summary>
public String CountryProcess;
///<summary>Paese di scomposizione con codice nazionale ISO</summary>
public String CountryDisassembly;
///<summary>Paese di lavorazione completa con codice nazionale ISO</summary>
public String CountryFullProcess;
///<summary>Numero di stock NATO</summary>
public String NSN;
///<summary>Carcasse animali e classificazione dei tagli UN/ECE</summary>
public String MeatCut;
///<summary>Prodotti in rotoli - larghezza, lunghezza, diametro interno, senso di svolgimento e giunte</summary>
public String Dimensions;
///<summary>Numero sequenziale elettronico per applicazioni di telefonia cellulare</summary>
public String CmtNo;
///<summary>Numero di identificazione per beni a rendere,</summary>
public String Grai;
///<summary>Numero di identificazione globale per beni individuali</summary>
public String Giai;
///<summary>Prezzo per unità di misura</summary>
public String PricePerUnit;
///<summary>Identificazione dei componenti di un prodotto</summary>
public String Gctin;
///<summary>Numero di contocorrente bancario internazionale</summary>
public String Iban;
///<summary>Data e ora di produzione</summary>
public String ProdTime;
///<summary>Numedo Globale di Relazione di Servizio</summary>
public String Gsrn;
///<summary>Numero del bollettino di pagamento</summary>
public String RefNo;
///<summary>Codice esteso per i coupons, UCC</summary>
public String Coupon1;
///<summary>Codice esteso per i coupons, UCC</summary>
public String Coupon2;
///<summary>Codice esteso per i coupons, UCC</summary>
public String Coupon3;
///<summary>Informazioni concordate tra i partners commerciali</summary>
public String InternalPart;
///<summary>Informazioni interne</summary>
public String Internal1;
///<summary>Informazioni interne</summary>
public String Internal2;
///<summary>Informazioni interne</summary>
public String Internal3;
///<summary>Informazioni interne</summary>
public String Internal4;
///<summary>Informazioni interne</summary>
public String Internal5;
///<summary>Informazioni interne</summary>
public String Internal6;
///<summary>Informazioni interne</summary>
public String Internal7;
///<summary>Informazioni interne</summary>
public String Internal8;
///<summary>Informazioni interne</summary>
public String Internal9;
}

View File

@@ -0,0 +1,48 @@
package it.integry.integrywmsnative.core.REST.model;
public class Ean13PesoModel {
private String precode;
private Float peso;
public String getPrecode() {
return precode;
}
public Ean13PesoModel setPrecode(String precode) {
this.precode = precode;
return this;
}
public Float getPeso() {
return peso;
}
public Ean13PesoModel setPeso(Float peso) {
this.peso = peso;
return this;
}
public Ean128Model toEan128() {
Ean128Model ean128Model = new Ean128Model();
ean128Model.NetWeightKg = getPeso();
return ean128Model;
}
public static Ean13PesoModel fromBarcode(String barcode) throws Exception {
if(barcode == null || barcode.length() != 13) {
throw new Exception("Errore durante il parse del barcode (" + barcode + ")");
}
String precode = barcode.substring(1, 7);
String pesoString = barcode.substring(7, barcode.length() - 1);
Float pesoFloat = Integer.parseInt(pesoString) / (float) 1000;
return new Ean13PesoModel()
.setPrecode(precode)
.setPeso(pesoFloat);
}
}

View File

@@ -0,0 +1,39 @@
package it.integry.integrywmsnative.core.barcode_reader;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.plugins.barcode_base_library.model.BarcodeScanDTO;
public class BarcodeCallbackDTO {
private int ID = -1;
private RunnableArgs<BarcodeScanDTO> onScanSuccessfull;
private RunnableArgs<Exception> onScanFailed;
public int getID() {
return ID;
}
public BarcodeCallbackDTO setID(int ID) {
this.ID = ID;
return this;
}
public RunnableArgs<BarcodeScanDTO> getOnScanSuccessfull() {
return onScanSuccessfull;
}
public BarcodeCallbackDTO setOnScanSuccessfull(RunnableArgs<BarcodeScanDTO> onScanSuccessfull) {
this.onScanSuccessfull = onScanSuccessfull;
return this;
}
public RunnableArgs<Exception> getOnScanFailed() {
return onScanFailed;
}
public BarcodeCallbackDTO setOnScanFailed(RunnableArgs<Exception> onScanFailed) {
this.onScanFailed = onScanFailed;
return this;
}
}

View File

@@ -0,0 +1,137 @@
package it.integry.integrywmsnative.core.barcode_reader;
import android.content.Context;
import android.text.SpannableString;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;
import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.core.utility.UtilityLogger;
import it.integry.integrywmsnative.view.dialogs.DialogSimpleMessageHelper;
import it.integry.plugins.barcode_base_library.exception.BarcodeAdapterNotFoundException;
import it.integry.plugins.barcode_base_library.interfaces.BarcodeReaderInterface;
import it.integry.pointmobilescannerlibrary.PointMobileBarcodeReader;
public class BarcodeManager {
private static Context context;
private static BarcodeReaderInterface mCurrentBarcodeInterface;
private static List<BarcodeCallbackDTO> mBarcodeCallbacksStacktrace = new ArrayList<>();
private static boolean mEnabled = true;
private static Class<? extends BarcodeReaderInterface>[] registeredBarcodeReaderInterfaces = new Class[]{
PointMobileBarcodeReader.class
};
public static void init(Context context) {
BarcodeManager.context = context;
initBarcodeReader();
}
private static void initBarcodeReader() {
for (Class<? extends BarcodeReaderInterface> readerInterface : registeredBarcodeReaderInterfaces){
Constructor<?> cons = null;
try {
cons = Class.forName(readerInterface.getName()).getConstructors()[0];
BarcodeReaderInterface object = (BarcodeReaderInterface) cons.newInstance(context);
if(object.isRightAdapter()) {
mCurrentBarcodeInterface = object;
break;
}
} catch (Exception e) {
UtilityLogger.errorMe(e);
}
}
if(mCurrentBarcodeInterface != null) {
try {
mCurrentBarcodeInterface.init();
} catch (BarcodeAdapterNotFoundException ex) {
UtilityExceptions.defaultException(context, ex);
}
mCurrentBarcodeInterface.register(data -> {
BarcodeCallbackDTO callback = getValidCallback();
if(callback != null && mEnabled) {
callback.getOnScanSuccessfull().run(data);
}
}, ex -> {
BarcodeCallbackDTO callback = getValidCallback();
if(callback != null && mEnabled) {
callback.getOnScanFailed().run(ex);
}
});
}
}
private static BarcodeCallbackDTO getValidCallback() {
if(mBarcodeCallbacksStacktrace.size() > 0) {
return mBarcodeCallbacksStacktrace.get(mBarcodeCallbacksStacktrace.size() -1);
} else {
return null;
}
}
public static BarcodeReaderInterface getCurrentBarcodeInterface() {
return mCurrentBarcodeInterface;
}
public static int addCallback(BarcodeCallbackDTO barcodeCallbackDTO) {
int newID = -1;
if(mBarcodeCallbacksStacktrace.size() > 0) {
newID = mBarcodeCallbacksStacktrace.get(mBarcodeCallbacksStacktrace.size() -1).getID() + 1;
} else {
newID = 1;
}
barcodeCallbackDTO.setID(newID);
mBarcodeCallbacksStacktrace.add(barcodeCallbackDTO);
return newID;
}
public static void removeCallback(int ID) {
boolean callbackObjFound = false;
//Rimuovo la callback con l'ID trovato e tutte quelle con >ID in modo che rimuovo tutte le call aggiunte successivamente
for (int i = 0; i < mBarcodeCallbacksStacktrace.size(); i++) {
if(mBarcodeCallbacksStacktrace.get(i).getID() == ID || callbackObjFound) {
mBarcodeCallbacksStacktrace.remove(i);
callbackObjFound = true;
}
}
}
public static void disable() {
mEnabled = false;
}
public static void enable() {
mEnabled = true;
}
}

View File

@@ -56,6 +56,8 @@ public class MtbColt extends EntityBase implements Parcelable {
private BigDecimal larghezzaCm;
private BigDecimal altezzaCm;
private Boolean disablePrint;
protected MtbColt(Parcel in) {
type = "mtb_colt";
gestione = in.readString();
@@ -632,7 +634,14 @@ public class MtbColt extends EntityBase implements Parcelable {
return this;
}
public Boolean getDisablePrint() {
return disablePrint;
}
public MtbColt setDisablePrint(Boolean disablePrint) {
this.disablePrint = disablePrint;
return this;
}
public void generaFiltroOrdineFromDTO(List<FiltroOrdineDTO> filtroOrdineDtos) {

View File

@@ -0,0 +1,56 @@
package it.integry.integrywmsnative.core.utility;
import it.integry.plugins.barcode_base_library.model.BarcodeScanDTO;
import it.integry.plugins.barcode_base_library.model.BarcodeType;
public class UtilityBarcode {
public static boolean isEtichettaAnonima(BarcodeScanDTO barcodeScanDTO){
return barcodeScanDTO != null && barcodeScanDTO.getType() == BarcodeType.CODE128 && barcodeScanDTO.getStringValue().startsWith("U");
}
public static boolean isEanPeso(BarcodeScanDTO barcodeScanDTO) {
return barcodeScanDTO != null && barcodeScanDTO.getType() == BarcodeType.EAN13 && barcodeScanDTO.getStringValue().startsWith("2");
}
public static Integer getNumColloFromULAnonima(BarcodeScanDTO barcodeScanDTO) {
if(barcodeScanDTO != null && barcodeScanDTO.getType() == BarcodeType.CODE128){
return Integer.parseInt(barcodeScanDTO.getStringValue().substring(3));
} else
return null;
}
public static String convertITF14toEAN13(String barcodeITF14) {
String barcodeEAN13 = null;
if(barcodeITF14.length() == 14) {
barcodeEAN13 = barcodeEAN13.substring(1, barcodeEAN13.length() - 1);
barcodeEAN13 += calculateCheckDigitEan13(barcodeEAN13);
}
return barcodeEAN13;
}
public static int calculateCheckDigitEan13(String barcodeEan13) {
String[] barcodeCharArray = barcodeEan13.split("");
int somma = 0;
for(int i = 0; i < barcodeCharArray.length; i++){
if(i % 2 == 1){
somma += Integer.parseInt(barcodeCharArray[i]) * 3;
} else {
somma += Integer.parseInt(barcodeCharArray[i]);
}
}
return 10 - (somma % 10);
}
}

View File

@@ -0,0 +1,17 @@
package it.integry.integrywmsnative.core.utility;
import android.app.ProgressDialog;
import android.content.Context;
import it.integry.integrywmsnative.R;
public class UtilityProgress {
public static ProgressDialog createDefaultProgressDialog(Context mContext) {
final ProgressDialog progress = ProgressDialog.show(mContext, mContext.getText(R.string.waiting),
mContext.getText(R.string.loading) + " ...", true);
return progress;
}
}

View File

@@ -44,6 +44,7 @@ public class OrdineAccettazioneDTO implements Parcelable {
public MtbAart mtbAart;
public PickingObjectDTO[] colliAssociati;
public Boolean hidden = null;
public Boolean tempHidden = null;
public String partitaMag;
public String codArtFor;
public String descrizioneEstesa;
@@ -100,6 +101,10 @@ public class OrdineAccettazioneDTO implements Parcelable {
return hidden;
}
public Boolean isTempHidden() {
return tempHidden;
}
public String getPartitaMag() {
return partitaMag;
}
@@ -187,6 +192,11 @@ public class OrdineAccettazioneDTO implements Parcelable {
return this;
}
public Riga setTempHidden(boolean hidden) {
this.tempHidden = hidden;
return this;
}
public Riga setPartitaMag(String partitaMag) {
this.partitaMag = partitaMag;
return this;

View File

@@ -11,7 +11,10 @@ import java.util.ArrayList;
import java.util.List;
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.model.MtbColt;
import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.databinding.ActivityAccettazioneOrdineInevasoBinding;
import it.integry.integrywmsnative.databinding.FragmentArticoliInColloBottomSheetBinding;
import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneDTO;
@@ -27,6 +30,8 @@ public class AccettazioneOrdineInevasoActivity extends AppCompatActivity {
private static final int PICK_UL_REQUEST = 1; // The request code
private int barcodeScannerIstanceID = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -44,6 +49,10 @@ public class AccettazioneOrdineInevasoActivity extends AppCompatActivity {
setTitle(orders);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(mAccettazioneOrdineInevasoViewModel.onScanSuccessfull)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(this, ex)));
}
@Override
@@ -58,7 +67,10 @@ public class AccettazioneOrdineInevasoActivity extends AppCompatActivity {
mArticoliInColloBottomSheetViewModel.collapse();
} else if(mAccettazioneOrdineInevasoViewModel.thereIsAnOpenedUL()) {
mArticoliInColloBottomSheetViewModel.closeCurrentUL();
} else super.onBackPressed();
} else {
BarcodeManager.removeCallback(barcodeScannerIstanceID);
super.onBackPressed();
}
}
@Override

View File

@@ -74,15 +74,14 @@ public class AccettazioneOrdineInevasoHelper {
if(mDataset.get(i).codJcom.equalsIgnoreCase(CommonConst.Config.COMMESSA_MAG)) mDataset.get(i).descrizioneCommessa = null;
}
boolean anyNull = codArtForns.contains(null);
codArtForns = Stream.of(codArtForns)
.withoutNulls()
.sortBy(x -> x).toList();
// Collections.sort(codArtForns, (str1, str2) -> {
// if(str1 != null && str2 != null) {
// return str1.compareToIgnoreCase(str2);
// }
// return 0;
// });
if(anyNull) codArtForns.add(null);
List<List<OrdineAccettazioneDTO.Riga>> groupedRighe = new ArrayList<>();
for (String codArtForn : codArtForns) {
@@ -96,6 +95,9 @@ public class AccettazioneOrdineInevasoHelper {
//tmpList.remove(i);
//i--;
} else tmpList.get(i).setHidden(false);
tmpList.get(i).setTempHidden(false);
}
}
@@ -133,6 +135,9 @@ public class AccettazioneOrdineInevasoHelper {
//tmpList.remove(i);
//i--;
} else tmpList.get(i).setHidden(false);
tmpList.get(i).setTempHidden(false);
}
}
@@ -196,15 +201,13 @@ public class AccettazioneOrdineInevasoHelper {
//tmpList.remove(i);
//i--;
} else tmpList.get(i).setHidden(false);
tmpList.get(i).setTempHidden(false);
}
}
Collections.sort(tmpList, (obj1, obj2) -> obj1.mtbAart.descrizioneEstesa.compareToIgnoreCase(obj2.mtbAart.descrizioneEstesa));
for(int i = 0; i < tmpList.size(); i++) {
Logger.d(tmpList.get(i));
}
if(tmpList.size() > 0){
groupedRighe.add(tmpList);
}

View File

@@ -1,9 +1,10 @@
package it.integry.integrywmsnative.gest.accettazione_ordine_inevaso.core;
import it.integry.integrywmsnative.core.REST.model.Ean128Model;
import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneDTO;
public interface IOnOrdineAccettazioneRowDispatchCallback {
void onOrdineRowDispatch(OrdineAccettazioneDTO.Riga item);
void onOrdineRowDispatch(OrdineAccettazioneDTO.Riga item, Ean128Model ean128Model);
}

View File

@@ -144,7 +144,10 @@ public class MainListOrdineAccettazioneAdapter extends RecyclerView.Adapter<Main
final AccettazioneOrdineInevasoListViewModel.SubItem rowItem = subset.get(i);
if(!rowItem.getOriginalModel().isHidden()) {
if(!rowItem.getOriginalModel().isHidden() &&
(rowItem.getOriginalModel().isTempHidden() == null ||
(rowItem.getOriginalModel().isTempHidden() != null && !rowItem.getOriginalModel().isTempHidden()))) {
visibleElementsCounter++;
View groupModelViewPool = (View) sPool.acquire();
@@ -199,7 +202,7 @@ public class MainListOrdineAccettazioneAdapter extends RecyclerView.Adapter<Main
groupModelView.setOnClickListener(view -> {
if (mOrdineRowDispatch != null) {
mOrdineRowDispatch.onOrdineRowDispatch(rowItem.getOriginalModel());
mOrdineRowDispatch.onOrdineRowDispatch(rowItem.getOriginalModel(), null);
}
});

View File

@@ -18,7 +18,9 @@ public class AccettazioneOrdineInevasoListViewModel {
public boolean isHidden(){
if(rows == null || rows.size() == 0) return true;
return Stream.of(rows).filter(x -> x.originalModel.isHidden() != null && !x.originalModel.isHidden()).count() == 0;
return Stream.of(rows).filter(
x -> (x.originalModel.isHidden() != null && !x.originalModel.isHidden()) &&
(x.originalModel.isTempHidden() != null && !x.originalModel.isTempHidden())).count() == 0;
}
public static class SubItem {

View File

@@ -16,17 +16,29 @@ import java.util.List;
import it.integry.integrywmsnative.BR;
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.GestSetupRESTConsumer;
import it.integry.integrywmsnative.core.REST.consumers.ISimpleOperationCallback;
import it.integry.integrywmsnative.core.REST.consumers.PrinterRESTConsumer;
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.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.report.ReportManager;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityBarcode;
import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.core.utility.UtilityLogger;
import it.integry.integrywmsnative.core.utility.UtilityProgress;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneDTO;
import it.integry.integrywmsnative.gest.accettazione_ordine_inevaso.AccettazioneOrdineInevasoActivity;
@@ -42,6 +54,8 @@ import it.integry.integrywmsnative.view.bottomsheet.viewmodel.ArticoliInColloBot
import it.integry.integrywmsnative.view.dialogs.DialogSimpleMessageHelper;
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;
import it.integry.plugins.barcode_base_library.model.BarcodeType;
import static br.com.zbra.androidlinq.Linq.stream;
@@ -49,7 +63,7 @@ public class AccettazioneOnOrdineAccettazioneInevasoViewModel implements IOnColl
public ObservableField<Boolean> isFabVisible = new ObservableField<>();
private final AccettazioneOrdineInevasoActivity mActivity;
private AccettazioneOrdineInevasoActivity mActivity;
private final ArticoliInColloBottomSheetViewModel mArticoliInColloBottomSheetViewModel;
private final List<OrdineAccettazioneDTO> mOrders;
@@ -135,6 +149,26 @@ public class AccettazioneOnOrdineAccettazioneInevasoViewModel implements IOnColl
}
}
public void applyFilter(String descriptionText) {
mActivity.bindings.filteredArtsInListExpandableLayout.expand(true);
mActivity.bindings.descriptionFilterText.setText(descriptionText);
}
public void removeListFilter() {
for(int i = 0; i < groupedOrdini.size(); i++) {
groupedOrdini.get(i).setTempHidden(false);
}
refreshOrderBy(false);
mActivity.bindings.filteredArtsInListExpandableLayout.collapse(true);
}
public void recoverUL(MtbColt recoveredMtbColt){
for(int i = 0; i < recoveredMtbColt.getMtbColr().size(); i++){
@@ -162,31 +196,190 @@ public class AccettazioneOnOrdineAccettazioneInevasoViewModel implements IOnColl
}
public RunnableArgs<BarcodeScanDTO> onScanSuccessfull = data -> {
ProgressDialog progressDialog = UtilityProgress.createDefaultProgressDialog(mActivity);
progressDialog.show();
BarcodeManager.disable();
if(UtilityBarcode.isEtichettaAnonima(data) && !thereIsAnOpenedUL()){
this.executeEtichettaAnonima(data, progressDialog);
} else if(data.getType() == BarcodeType.EAN128) {
this.executeEtichettaEan128(data, progressDialog);
} else if(UtilityBarcode.isEanPeso(data)){
this.executeEtichettaEanPeso(data, progressDialog);
} else {
this.loadArticolo(data.getStringValue(), null, progressDialog);
}
};
private void executeEtichettaAnonima(BarcodeScanDTO barcodeScanDTO, ProgressDialog progressDialog) {
ColliMagazzinoRESTConsumer.getBySSCC(barcodeScanDTO.getStringValue(), false, false, mtbColt -> {
if(mtbColt == null) {
this.createNewUL(UtilityBarcode.getNumColloFromULAnonima(barcodeScanDTO), CommonConst.Config.DEFAULT_ANONYMOUS_UL_SERIE, progressDialog, true, null);
BarcodeManager.enable();
} else {
progressDialog.dismiss();
BarcodeManager.enable();
DialogSimpleMessageHelper.makeWarningDialog(mActivity,
new SpannableString(mActivity.getResources().getText(R.string.already_used_anonymous_barcode)),
null, null).show();
}
}, ex -> {
UtilityExceptions.defaultException(mActivity, ex, progressDialog);
BarcodeManager.enable();
});
}
private void executeEtichettaEan128(BarcodeScanDTO barcodeScanDTO, ProgressDialog progressDialog) {
BarcodeRESTConsumer.decodeEan128(barcodeScanDTO, ean128Model -> {
String barcodeProd = null;
if(ean128Model.Sscc != null) barcodeProd = ean128Model.Sscc;
if(ean128Model.Gtin != null) barcodeProd = ean128Model.Gtin;
if(ean128Model.Content != null) barcodeProd = ean128Model.Content;
if(!UtilityString.isNullOrEmpty(barcodeProd)) {
if (barcodeProd.startsWith("0") || barcodeProd.startsWith("9")) {
barcodeProd = barcodeProd.substring(1, barcodeProd.length());
}
this.loadArticolo(barcodeProd, ean128Model, progressDialog);
} else {
//EAN 128 non completo o comunque mancano i riferimenti al prodotto
progressDialog.dismiss();
BarcodeManager.enable();
}
}, ex-> {
UtilityExceptions.defaultException(mActivity, ex, progressDialog);
BarcodeManager.enable();
});
}
private void executeEtichettaEanPeso(BarcodeScanDTO barcodeScanDTO, ProgressDialog progressDialog) {
try {
Ean13PesoModel ean13PesoModel = Ean13PesoModel.fromBarcode(barcodeScanDTO.getStringValue());
this.loadArticolo(ean13PesoModel.getPrecode(), ean13PesoModel.toEan128(), progressDialog);
} catch (Exception ex) {
UtilityExceptions.defaultException(mActivity, ex, progressDialog);
BarcodeManager.enable();
}
}
private void loadArticolo(String barcodeProd, Ean128Model ean128Model, ProgressDialog progressDialog) {
if(barcodeProd.length() == 14) {
barcodeProd = UtilityBarcode.convertITF14toEAN13(barcodeProd);
}
ArticoloRESTConsumer.getByBarcodeProd(barcodeProd, mtbAartList -> {
if(mtbAartList != null && mtbAartList.size() > 0) {
if(!thereIsAnOpenedUL()){
this.createNewUL(null, null, progressDialog, false, () -> {
BarcodeManager.enable();
this.searchArtInList(mtbAartList.get(0), ean128Model);
});
} else {
this.searchArtInList(mtbAartList.get(0), ean128Model);
BarcodeManager.enable();
progressDialog.dismiss();
}
} else {
BarcodeManager.enable();
progressDialog.dismiss();
DialogSimpleMessageHelper.makeWarningDialog(mActivity,
new SpannableString(mActivity.getResources().getText(R.string.no_result_from_barcode)),
null, null, null)
.show();
}
}, ex -> {
BarcodeManager.enable();
UtilityExceptions.defaultException(mActivity, ex, progressDialog);
});
}
private void searchArtInList(MtbAart mtbAart, Ean128Model ean128Model) {
removeListFilter();
List<OrdineAccettazioneDTO.Riga> foundRowsList = Stream.of(groupedOrdini)
.filter(x -> x.getMtbAart().getCodMart().equalsIgnoreCase(mtbAart.codMart) &&
(x.isHidden() != null && !x.isHidden()) && (x.isTempHidden() != null && !x.isTempHidden()))
.toList();
if(foundRowsList.size() == 0) {
showNoArtFoundDialog();
} else if(foundRowsList.size() == 1) {
onOrdineRowDispatch(foundRowsList.get(0), ean128Model);
} else {
for(int i = 0; i < groupedOrdini.size(); i++) {
if(!foundRowsList.contains(groupedOrdini.get(i))) {
groupedOrdini.get(i).setTempHidden(true);
}
}
applyFilter("COD: " + mtbAart.getCodMart());
refreshOrderBy(false);
}
}
private void showNoArtFoundDialog() {
DialogSimpleMessageHelper.makeWarningDialog(mActivity,
new SpannableString(mActivity.getResources().getText(R.string.no_result_from_barcode)),
null, null).show();
}
public void showOrderDialog() {
AlertDialog dialog = new AlertDialog.Builder(mActivity)
.setTitle(mActivity.getText(R.string.action_orderBy))
.setSingleChoiceItems(AccettazioneOrdineInevasoOrderBy.descriptions, currentOrderBy.getVal(), (dialog12, which) -> currentOrderBy = AccettazioneOrdineInevasoOrderBy.Enum.fromInt(which))
.setPositiveButton("Ok", (dialog1, which) -> refreshOrderBy(true))
.setPositiveButton("Ok", (dialog1, which) -> refreshOrderBy(false))
.create();
dialog.show();
}
public void createNewUL() {
this.createNewUL(null, null, null, false, null);
}
public void createNewUL(Integer customNumCollo, String customSerCollo, ProgressDialog progress, boolean disablePrint, Runnable onComplete) {
mActivity.bindings.accettazioneOrdineInevasoFab.close(true);
final ProgressDialog progress = ProgressDialog.show(mActivity, mActivity.getText(R.string.waiting),
mActivity.getText(R.string.loading) + " ...", true);
if (progress == null){
progress = UtilityProgress.createDefaultProgressDialog(mActivity);
}
ProgressDialog finalProgress = progress;
NoteAggiuntiveNuovaULDialog.show(mActivity, new NoteAggiuntiveNuovaULDialog.Callback() {
@Override
public void onSuccess(String noteString) {
//Add loading dialog here
progress.show();
finalProgress.show();
GestSetupRESTConsumer.getValue("PICKING", "SETUP", "DEFAULT_POSIZIONE_COLLI_ACCETTAZIONE", defaultPosAccettazioneDTO -> {
@@ -201,8 +394,17 @@ public class AccettazioneOnOrdineAccettazioneInevasoViewModel implements IOnColl
.setOraInizPrep(new Date())
.setAnnotazioni(noteString)
.setPosizione(defaultPosAccettazione)
.setSerCollo("/")
.setOperation(CommonModelConsts.OPERATION.INSERT_OR_UPDATE);
if(customNumCollo != null) {
mtbColt.setNumCollo(customNumCollo);
}
if(!UtilityString.isNullOrEmpty(customSerCollo)) {
mtbColt.setSerCollo(customSerCollo);
}
List<String> codAnags =
stream(mOrders)
.select(c -> c.codAnag)
@@ -246,11 +448,15 @@ public class AccettazioneOnOrdineAccettazioneInevasoViewModel implements IOnColl
@Override
public void onSuccess(MtbColt value) {
value.setMtbColr(new ObservableArrayList<>());
value
.setDisablePrint(disablePrint)
.setMtbColr(new ObservableArrayList<>());
setULToCurrentContext(value);
progress.dismiss();
finalProgress.dismiss();
new StatusBarAlert.Builder(mActivity)
.autoHide(true)
@@ -260,14 +466,16 @@ public class AccettazioneOnOrdineAccettazioneInevasoViewModel implements IOnColl
.withAlertColor(R.color.mainGreen)
.build();
if(onComplete != null) onComplete.run();
}
@Override
public void onFailed(Exception ex) {
UtilityExceptions.defaultException(mActivity, ex, progress);
UtilityExceptions.defaultException(mActivity, ex, finalProgress);
}
});
}, ex -> UtilityExceptions.defaultException(mActivity, ex, progress));
}, ex -> UtilityExceptions.defaultException(mActivity, ex, finalProgress));
@@ -275,7 +483,7 @@ public class AccettazioneOnOrdineAccettazioneInevasoViewModel implements IOnColl
@Override
public void onAbort() {
progress.dismiss();
finalProgress.dismiss();
}
});
@@ -315,9 +523,7 @@ public class AccettazioneOnOrdineAccettazioneInevasoViewModel implements IOnColl
public void onColloClosed() {
if(thereIsAnOpenedUL()) {
final ProgressDialog progress = ProgressDialog.show(mActivity, mActivity.getText(R.string.waiting),
mActivity.getText(R.string.loading) + " ...", true);
final ProgressDialog progress = UtilityProgress.createDefaultProgressDialog(mActivity);
progress.show();
if(thereIsAnyRowInUL()) {
@@ -352,6 +558,13 @@ public class AccettazioneOnOrdineAccettazioneInevasoViewModel implements IOnColl
}
private void printCollo(ProgressDialog progress) {
MtbColt currentMtbColt = mArticoliInColloBottomSheetViewModel.mtbColt.get();
if(currentMtbColt.getDisablePrint() != null && currentMtbColt.getDisablePrint()){
postCloseOperations();
progress.dismiss();
return;
}
PrinterRESTConsumer.getAvailablePrinters(SettingsManager.i().userSession.depo.getCodMdep(), new ISimpleOperationCallback<List<String>>() {
@Override
@@ -359,7 +572,7 @@ public class AccettazioneOnOrdineAccettazioneInevasoViewModel implements IOnColl
if(value.size() > 0) {
try{
MtbColt currentMtbColt = mArticoliInColloBottomSheetViewModel.mtbColt.get();
ReportManager.getRightReportNameByMtbColt(currentMtbColt, reportName -> {
@@ -463,7 +676,7 @@ public class AccettazioneOnOrdineAccettazioneInevasoViewModel implements IOnColl
}
@Override
public void onOrdineRowDispatch(final OrdineAccettazioneDTO.Riga item) {
public void onOrdineRowDispatch(final OrdineAccettazioneDTO.Riga item, Ean128Model ean128Model) {
if(mArticoliInColloBottomSheetViewModel.mtbColt.get() != null){
List<MtbColr> currentMtbColrs = mArticoliInColloBottomSheetViewModel.mtbColt.get().getMtbColr();
@@ -492,6 +705,44 @@ public class AccettazioneOnOrdineAccettazioneInevasoViewModel implements IOnColl
.setQtaEvasa(new BigDecimal(qtaEvasa))
.setCanPartitaMagBeChanged(true);
if(ean128Model != null){
if(!UtilityString.isNullOrEmpty(ean128Model.BatchLot)) {
dto.setBatchLot(ean128Model.BatchLot);
}
try {
if(!UtilityString.isNullOrEmpty(ean128Model.BestBefore)){
dto.setDataScad(UtilityDate.recognizeDate(ean128Model.BestBefore));
} else if(!UtilityString.isNullOrEmpty(ean128Model.Expiry)) {
dto.setDataScad(UtilityDate.recognizeDate(ean128Model.Expiry));
}
} catch (Exception e) {
UtilityLogger.errorMe(e);
}
if(ean128Model.Count != null && ean128Model.Count > 0) {
//if(!UtilityString.isNullOrEmpty(ean128Model.Sscc)) {
dto.setNumCnf(ean128Model.Count);
//} else {
// dto.setQtaTot(new BigDecimal(ean128Model.Count));
//}
}
if (ean128Model.NetWeightKg != null && ean128Model.NetWeightKg > 0) {
dto.setQtaTot(new BigDecimal(ean128Model.NetWeightKg));
}
if(dto.getQtaTot() != null && dto.getQtaTot().floatValue() > 0 && dto.getNumCnf() != null && dto.getNumCnf() > 0) {
dto.setQtaCnf(dto.getQtaTot().divide(new BigDecimal(dto.getNumCnf())));
}
dto.setCanPartitaMagBeChanged(false);
dto.setCanDataScadBeChanged(false);
dto.setShouldAskDataScad(true);
}
DialogInputQuantity.makeBase(mActivity, dto, true, value -> onOrdineRowDispatched(item, value)).show();
}
}

View File

@@ -21,6 +21,7 @@ import android.widget.EditText;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import it.integry.integrywmsnative.BR;
@@ -34,16 +35,20 @@ import it.integry.integrywmsnative.view.dialogs.DialogSimpleMessageHelper;
public class DialogInputQuantity {
public static class DTO {
public MtbAart mtbAart;
public String batchLot;
public BigDecimal qtaDaEvadere;
public BigDecimal qtaOrd;
public BigDecimal qtaTot;
public BigDecimal qtaCnf;
public BigDecimal qtaEvasa;
public BigDecimal maxQta;
public String codArtFor;
public boolean canPartitaMagBeChanged;
private MtbAart mtbAart;
private String batchLot;
private BigDecimal qtaDaEvadere;
private BigDecimal qtaEvasa;
private BigDecimal qtaOrd;
private BigDecimal qtaTot;
private BigDecimal qtaCnf;
private Integer numCnf;
private BigDecimal maxQta;
private String codArtFor;
private Date dataScad;
private boolean canPartitaMagBeChanged;
private Boolean canDataScadBeChanged;
private Boolean shouldAskDataScad;
public MtbAart getMtbAart() {
return mtbAart;
@@ -99,6 +104,15 @@ public class DialogInputQuantity {
return this;
}
public Integer getNumCnf() {
return numCnf;
}
public DTO setNumCnf(Integer numCnf) {
this.numCnf = numCnf;
return this;
}
public BigDecimal getQtaEvasa() {
return qtaEvasa;
}
@@ -126,6 +140,15 @@ public class DialogInputQuantity {
return this;
}
public Date getDataScad() {
return dataScad;
}
public DTO setDataScad(Date dataScad) {
this.dataScad = dataScad;
return this;
}
public boolean getCanPartitaMagBeChanged() {
return canPartitaMagBeChanged;
}
@@ -134,6 +157,24 @@ public class DialogInputQuantity {
this.canPartitaMagBeChanged = canPartitaMagBeChanged;
return this;
}
public Boolean isCanDataScadBeChanged() {
return canDataScadBeChanged;
}
public DTO setCanDataScadBeChanged(boolean canDataScadBeChanged) {
this.canDataScadBeChanged = canDataScadBeChanged;
return this;
}
public Boolean getShouldAskDataScad() {
return shouldAskDataScad;
}
public DTO setShouldAskDataScad(Boolean shouldAskDataScad) {
this.shouldAskDataScad = shouldAskDataScad;
return this;
}
}
private static ColorStateList originalColorStateList = null;
@@ -232,14 +273,30 @@ public class DialogInputQuantity {
quantityDTO.qtaTot.set(qtaDaEvadere);
}
if(dto.getNumCnf() != null) {
quantityDTO.numCnf.set(new BigDecimal(dto.getNumCnf()).floatValue());
}
if(quantityDTO.numCnf.get(false) == null) {
quantityDTO.numCnf.set(quantityDTO.qtaTot.get() / quantityDTO.qtaCnf.get());
}
quantityDTO.canPartitaMagBeChanged.set(dto.getCanPartitaMagBeChanged());
if(dto.isCanDataScadBeChanged() != null){
quantityDTO.canDataScadBeChanged.set(dto.isCanDataScadBeChanged());
}
quantityDTO.shouldAskDataScad.set(dto.mtbAart.isFlagTracciabilita() && dto.mtbAart.getGgScadPartita() != null && dto.mtbAart.getGgScadPartita() > 0);
if(dto.getShouldAskDataScad() != null) {
quantityDTO.shouldAskDataScad.set(dto.getShouldAskDataScad());
}
if(dto.getDataScad() != null) {
quantityDTO.expireDate = dto.getDataScad();
}
if(quantityDTO.expireDate == null && dto.mtbAart.getGgScadPartita() != null && dto.mtbAart.getGgScadPartita() > 0) {
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE, dto.mtbAart.getGgScadPartita()); // number of days to add

View File

@@ -1,4 +1,4 @@
<layout>
<layout xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="android.view.View" />
@@ -50,17 +50,74 @@
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/accettazione_ordine_main_list"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
android:paddingBottom="72dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<net.cachapa.expandablelayout.ExpandableLayout
android:id="@+id/filtered_arts_in_list_expandable_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:el_duration="400"
app:el_expanded="false">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:paddingLeft="8dp"
android:paddingRight="8dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_toLeftOf="@+id/remove_art_filter_list"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:text="@string/filtered_arts_in_list" />
<TextView
android:id="@+id/description_filter_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
android:textSize="16sp"
android:textStyle="bold"
android:ellipsize="end"
android:maxLines="1"
tools:text="COD_ART_HERE"/>
</LinearLayout>
<android.support.v7.widget.AppCompatButton
android:id="@+id/remove_art_filter_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:backgroundTint="@color/red_600"
android:textColor="@android:color/white"
android:onClick="@{() -> viewmodel.removeListFilter()}"
android:text="@string/remove_filter_button"/>
</RelativeLayout>
</net.cachapa.expandablelayout.ExpandableLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/accettazione_ordine_main_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
</LinearLayout>
<android.support.constraint.ConstraintLayout
xmlns:tools="http://schemas.android.com/tools"

View File

@@ -58,7 +58,6 @@
android:layout_height="match_parent"
android:scrollbars="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:paddingBottom="72dp"
android:clipToPadding="false" />

View File

@@ -196,6 +196,7 @@
android:layout_height="wrap_content"
tools:text="11 nov 2018"
android:textSize="16sp"
android:enabled="@{quantityViewModel.canDataScadBeChanged}"
android:visibility="@{quantityViewModel.shouldAskDataScad.get() == false ? View.GONE : View.VISIBLE}"
app:binding="@{quantityViewModel.expireDateString}"
app:layout_constraintStart_toEndOf="@id/guideline_partita_data"

View File

@@ -121,4 +121,10 @@
<string name="no_lu_already_registered_text">Nessuna UL registrata a magazzino</string>
<string name="no_item_to_pick_text">Nessun articolo da prelevare</string>
<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="filtered_arts_in_list">Filtro articoli applicato</string>
<string name="remove_filter_button">Rimuovi filtro</string>
</resources>

View File

@@ -44,7 +44,10 @@
<color name="orange_800">#EF6C00</color>
<color name="red_400">#EF5350</color>
<color name="red_500">#F44336</color>
<color name="red_600">#E53935</color>
<color name="red_700">#D32F2F</color>
<color name="yellow_600">#FDD835</color>

View File

@@ -129,4 +129,10 @@
<string name="no_lu_already_registered_text">No LU already registered</string>
<string name="no_item_to_pick_text">No items to pick</string>
<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="filtered_arts_in_list">Item filter applied</string>
<string name="remove_filter_button">Remove filter</string>
</resources>