[FEAT] Implementata la scansione della UL su cui versare la merce in fare di Recupero Materiale da produzione

[FIX] Nell'elenco di pedane versate a produzione ora viene mostrato il numero UL da cui arriva la merce (L+) e non il numero UL di scarico (L-)
[FIX] Risolti errori nei messaggi
This commit is contained in:
Giuseppe Scorrano 2019-10-01 12:29:18 +02:00
parent 6ed44a4c8a
commit b578cbf197
15 changed files with 212 additions and 82 deletions

View File

@ -6,7 +6,7 @@
<option name="DEPLOY_AS_INSTANT" value="false" />
<option name="ARTIFACT_NAME" value="" />
<option name="PM_INSTALL_OPTIONS" value="" />
<option name="DYNAMIC_FEATURES_DISABLED_LIST" value="dynamic__base,dynamic_ime,dynamic_vgalimenti" />
<option name="DYNAMIC_FEATURES_DISABLED_LIST" value="dynamic_frudis,dynamic_ime,dynamic_vgalimenti" />
<option name="ACTIVITY_EXTRA_FLAGS" value="" />
<option name="MODE" value="default_activity" />
<option name="CLEAR_LOGCAT" value="true" />

View File

@ -13,8 +13,11 @@ import android.view.View;
import android.view.ViewGroup;
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.interfaces.IPoppableActivity;
import it.integry.integrywmsnative.core.interfaces.ITitledFragment;
import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.databinding.FragmentProdRecuperoMaterialeBinding;
import it.integry.integrywmsnative.gest.prod_recupero_materiale.core.ProdRecuperoMaterialeHelper;
import it.integry.integrywmsnative.gest.prod_recupero_materiale.viewmodel.ProdRecuperoMaterialeViewModel;
@ -30,6 +33,8 @@ public class ProdRecuperoMaterialeFragment extends Fragment implements ITitledFr
private ProdRecuperoMaterialeViewModel mViewmodel;
private ProdRecuperoMaterialeHelper mHelper;
private int mBarcodeScannerIstanceID;
public ProdRecuperoMaterialeFragment() {
// Required empty public constructor
@ -66,6 +71,7 @@ public class ProdRecuperoMaterialeFragment extends Fragment implements ITitledFr
((IPoppableActivity) getActivity()).pop();
});
initBarcode();
}
@ -74,4 +80,20 @@ public class ProdRecuperoMaterialeFragment extends Fragment implements ITitledFr
titleText.setText(context.getText(R.string.prod_recupero_materiale_title_fragment).toString());
}
@Override
public void onDestroy() {
BarcodeManager.removeCallback(mBarcodeScannerIstanceID);
super.onDestroy();
}
private void initBarcode() {
mBarcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(mViewmodel.onScanSuccessfull)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(getActivity(), ex, false)));
}
}

View File

@ -110,7 +110,7 @@ public class HistoryULsListAdapter extends SectionedRecyclerViewAdapter<HistoryU
holder.binding.codMart.setText(ul.getCodMart());
holder.binding.descrizione.setText(ul.getDescrizioneArt());
holder.binding.numCollo.setText(String.valueOf(ul.getNumCollo()));
holder.binding.numCollo.setText(String.valueOf(ul.getNumColloRif()));
holder.binding.partitaMag.setText("(" + ul.getPartitaMag() + ")");
holder.binding.qtaVersata.setText(String.valueOf(ul.getQtaCol()));

View File

@ -42,6 +42,10 @@ public class ProdRecuperoMaterialeHelper {
"mtb_colr.ser_collo, " +
"mtb_colr.partita_mag, " +
"mtb_colr.cod_jcom, " +
"mtb_colr.num_collo_rif, " +
"mtb_colr.data_collo_rif, " +
"mtb_colr.ser_collo_rif, " +
"mtb_colr.gestione_rif, " +
"mtb_colt.segno, " +
"ISNULL(mtb_aart.descrizione_estesa, mtb_aart.descrizione) AS descrizione_art, " +
"mtb_aart.unt_mis, " +
@ -72,6 +76,10 @@ public class ProdRecuperoMaterialeHelper {
"mtb_aart.descrizione_estesa, " +
"mtb_aart.descrizione, " +
"mtb_aart.unt_mis, " +
"mtb_colr.num_collo_rif, " +
"mtb_colr.data_collo_rif, " +
"mtb_colr.ser_collo_rif, " +
"mtb_colr.gestione_rif, " +
"mtb_colt.segno " +
"HAVING SUM(mtb_colr.qta_col) > 0 " +
"ORDER BY data_collo DESC";

View File

@ -24,6 +24,10 @@ public class HistoryVersamentoProdUL {
private String datetimeRow;
private String descrizioneArt;
private String untMis;
private String gestioneRif;
private String dataColloRif;
private String serColloRif;
private Integer numColloRif;
private MtbAart mtbAart;
@ -180,6 +184,42 @@ public class HistoryVersamentoProdUL {
return this;
}
public String getGestioneRif() {
return gestioneRif;
}
public HistoryVersamentoProdUL setGestioneRif(String gestioneRif) {
this.gestioneRif = gestioneRif;
return this;
}
public String getDataColloRif() {
return dataColloRif;
}
public HistoryVersamentoProdUL setDataColloRif(String dataColloRif) {
this.dataColloRif = dataColloRif;
return this;
}
public String getSerColloRif() {
return serColloRif;
}
public HistoryVersamentoProdUL setSerColloRif(String serColloRif) {
this.serColloRif = serColloRif;
return this;
}
public Integer getNumColloRif() {
return numColloRif;
}
public HistoryVersamentoProdUL setNumColloRif(Integer numColloRif) {
this.numColloRif = numColloRif;
return this;
}
public MtbAart getMtbAart() {
return mtbAart;
}

View File

@ -15,8 +15,10 @@ import com.tfb.fbtoast.FBToast;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.barcode_reader.BarcodeCallbackDTO;
import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.interfaces.IPoppableActivity;
@ -46,6 +48,7 @@ import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageHelper;
import it.integry.integrywmsnative.view.dialogs.input_quantity.DialogInputQuantity;
import it.integry.integrywmsnative.view.dialogs.input_quantity.QuantityDTO;
import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCreateLU;
import it.integry.plugins.barcode_base_library.model.BarcodeScanDTO;
public class ProdRecuperoMaterialeViewModel {
@ -72,6 +75,27 @@ public class ProdRecuperoMaterialeViewModel {
refreshAdapter();
}
public RunnableArgs<BarcodeScanDTO> onScanSuccessfull = data -> {
BarcodeManager.disable();
ProgressDialog progressDialog = UtilityProgress.createDefaultProgressDialog(mContext);
// if(UtilityBarcode.isEtichettaPosizione(data)){
// progressDialog.show();
// this.executeEtichettaPosizione(data, progressDialog);
// } else if(data.getType() == BarcodeType.EAN8 || data.getType() == BarcodeType.EAN13 || data.getType() == BarcodeType.UPCA){
// //searchArtInt(data.getStringValue());
// } else if(UtilityBarcode.isEtichettaAnonima(data)) {
// this.executeEtichettaLU(data.getStringValue(), true, progressDialog);
// }else if(UtilityBarcode.isEtichetta128(data)) {
// this.executeEtichettaEan128(data, progressDialog);
// } else {
// BarcodeManager.enable();
// }
};
public void setMtbColt(MtbColt mtbColt) {
@ -80,7 +104,6 @@ public class ProdRecuperoMaterialeViewModel {
private void initRecyclerView() {
mAdapter = new HistoryULsListAdapter(mContext, new ArrayList<>());
mAdapter.setOnItemClicked(this::onListItemClicked);
@ -121,108 +144,135 @@ public class ProdRecuperoMaterialeViewModel {
final ProgressDialog progress = UtilityProgress.createDefaultProgressDialog(mContext);
final MtbColt mtbColtCarico = new MtbColt()
.initDefaultFields()
.setGestione(GestioneEnum.LAVORAZIONE)
.setSegno(+1)
.setMtbColr(new ObservableArrayList<>());
mtbColtCarico
.setOperation(CommonModelConsts.OPERATION.INSERT_OR_UPDATE);
final MtbColr mtbColrCarico = new MtbColr()
.setCodMart(item.getCodMart())
.setPartitaMag(UtilityString.empty2null(item.getPartitaMag()))
.setQtaCol(quantity)
.setDescrizione(UtilityString.isNullOrEmpty(item.getMtbAart().getDescrizioneEstesa()) ? item.getMtbAart().getDescrizione() : item.getMtbAart().getDescrizioneEstesa())
.setDatetimeRow(UtilityDate.getDateInstance());
mtbColtCarico.setOperation(CommonModelConsts.OPERATION.INSERT_OR_UPDATE);
mtbColtCarico.getMtbColr().add(mtbColrCarico);
final MtbColt mtbColtScarico = new MtbColt()
.setDataCollo(item.getDataCollo())
.setSerCollo(item.getSerCollo())
.setNumCollo(item.getNumCollo())
.setGestione(item.getGestione())
.setMtbColr(new ObservableArrayList<>());
mtbColtScarico
.setOperation(CommonModelConsts.OPERATION.NO_OP);
final MtbColr mtbColrScarico = new MtbColr()
.setCodMart(item.getCodMart())
.setPartitaMag(UtilityString.empty2null(item.getPartitaMag()))
.setQtaCol(quantity.multiply(new BigDecimal(-1)))
.setDescrizione(UtilityString.isNullOrEmpty(item.getMtbAart().getDescrizioneEstesa()) ? item.getMtbAart().getDescrizione() : item.getMtbAart().getDescrizioneEstesa())
.setDatetimeRow(UtilityDate.getDateInstance());
.setDatetimeRow(UtilityDate.getDateInstance())
.setNumColloRif(item.getNumColloRif())
.setDataColloRif(item.getDataColloRif())
.setGestioneRif(item.getGestioneRif())
.setSerColloRif(item.getSerColloRif());
mtbColrScarico.setOperation(CommonModelConsts.OPERATION.INSERT);
mtbColtScarico.setOperation(CommonModelConsts.OPERATION.INSERT_OR_UPDATE);
mtbColtScarico.getMtbColr().add(mtbColrScarico);
List<MtbColt> colliToSave = new ArrayList<>();
colliToSave.add(mtbColtCarico);
colliToSave.add(mtbColtScarico);
DialogScanOrCreateLU.make(mContext, false, false, mtbColt -> {
if(mtbColt != null) {
List<MtbColt> colliToSave = new ArrayList<>();
boolean shouldPrint = false;
if(!Objects.equals(mtbColt.getNumCollo(), item.getNumColloRif()) ||
!Objects.equals(mtbColt.getSerCollo(), item.getSerColloRif()) ||
!Objects.equals(mtbColt.getDataColloS(), item.getDataColloRif()) ||
!Objects.equals(mtbColt.getGestione(), item.getGestioneRif())) {
final MtbColt mtbColtCarico = mtbColt
.setMtbColr(new ObservableArrayList<>());
mtbColtCarico
.setOperation(CommonModelConsts.OPERATION.INSERT_OR_UPDATE);
final MtbColr mtbColrCarico = new MtbColr()
.setCodMart(item.getCodMart())
.setPartitaMag(UtilityString.empty2null(item.getPartitaMag()))
.setQtaCol(quantity)
.setDescrizione(UtilityString.isNullOrEmpty(item.getMtbAart().getDescrizioneEstesa()) ? item.getMtbAart().getDescrizione() : item.getMtbAart().getDescrizioneEstesa())
.setDatetimeRow(UtilityDate.getDateInstance())
.setNumColloRif(item.getNumColloRif())
.setDataColloRif(item.getDataColloRif())
.setGestioneRif(item.getGestioneRif())
.setSerColloRif(item.getSerColloRif());
mtbColtCarico.setOperation(CommonModelConsts.OPERATION.INSERT_OR_UPDATE);
mtbColtCarico.getMtbColr().add(mtbColrCarico);
colliToSave.add(mtbColtCarico);
shouldPrint = true;
}
colliToSave.add(mtbColtScarico);
boolean finalShouldPrint = shouldPrint;
ColliMagazzinoRESTConsumer.saveColli(colliToSave, value -> {
FBToast.successToast(mContext, mContext.getResources().getString(R.string.data_saved), FBToast.LENGTH_SHORT);
if(finalShouldPrint) {
printCollo(progress, value.get(0), () -> {
this.refreshAdapter();
mOnRecuperoCompleted.run();
});
} else {
this.refreshAdapter();
mOnRecuperoCompleted.run();
}
}, ex -> {
UtilityExceptions.defaultException(mContext, ex, progress);
});
} else {
progress.dismiss();
}
}).show();
ColliMagazzinoRESTConsumer.saveColli(colliToSave, value -> {
FBToast.successToast(mContext, mContext.getResources().getString(R.string.data_saved), FBToast.LENGTH_SHORT);
printCollo(progress, value.get(0), () -> {
this.refreshAdapter();
mOnRecuperoCompleted.run();
});
}, ex -> {
UtilityExceptions.defaultException(mContext, ex, progress);
});
}
private void printCollo(ProgressDialog progress, MtbColt mtbColtToPrint, Runnable onComplete) {
DialogAskShouldPrint.make(mContext, "Packing List", shouldPrint -> {
if(shouldPrint) {
PrinterRESTConsumer.getAvailablePrinters(SettingsManager.i().userSession.depo.getCodMdep(), PrinterRESTConsumer.Type.PRIMARIA, printerList -> {
PrinterRESTConsumer.getAvailablePrinters(SettingsManager.i().userSession.depo.getCodMdep(), PrinterRESTConsumer.Type.PRIMARIA, printerList -> {
if (printerList.size() > 0) {
try {
singlePrint(mtbColtToPrint, printerList.get(0), () -> {
onComplete.run();
progress.dismiss();
}, ex -> {
progress.dismiss();
String errorMessage = ex.getMessage();
DialogSimpleMessageHelper.makeErrorDialog(
mContext,
new SpannableString(errorMessage),
null,
null,
R.string.button_ignore_print,
onComplete).show();
});
} catch (Exception ex) {
UtilityExceptions.defaultException(mContext, ex, progress);
onComplete.run();
}
} else {
if (printerList.size() > 0) {
try {
singlePrint(mtbColtToPrint, printerList.get(0), () -> {
onComplete.run();
progress.dismiss();
String errorMessage = "Nessuna stampante configurata";
DialogSimpleMessageHelper.makeWarningDialog(mContext, new SpannableString(errorMessage), null, onComplete).show();
}
}, ex -> {
}, ex -> {
progress.dismiss();
String errorMessage = ex.getMessage();
DialogSimpleMessageHelper.makeErrorDialog(
mContext,
new SpannableString(errorMessage),
null,
null,
R.string.button_ignore_print,
onComplete).show();
});
} catch (Exception ex) {
UtilityExceptions.defaultException(mContext, ex, progress);
});
onComplete.run();
}
} else {
onComplete.run();
progress.dismiss();
String errorMessage = "Nessuna stampante configurata";
DialogSimpleMessageHelper.makeWarningDialog(mContext, new SpannableString(errorMessage), null, onComplete).show();
}
}).show();
}, ex -> {
UtilityExceptions.defaultException(mContext, ex, progress);
});
}

View File

@ -71,7 +71,7 @@ public class ProdVersamentoMaterialViewModel {
}
private void choosePosition() {
DialogAskPositionOfLU.makeBase(mContext, null, (status, mtbDepoPosizione) -> {
DialogAskPositionOfLU.makeBase(mContext, null, true, (status, mtbDepoPosizione) -> {
if(status == DialogConsts.Results.ABORT) {
((IPoppableActivity)mContext).pop();

View File

@ -572,7 +572,7 @@ public class RettificaGiacenzeViewModel implements IRecyclerItemClicked<MtbColr>
switch (result){
case YES:
DialogAskPositionOfLU.makeBase(mContext, mtbColt.get(), (status, mtbDepoPosizione) -> {
DialogAskPositionOfLU.makeBase(mContext, mtbColt.get(), false, (status, mtbDepoPosizione) -> {
if(status == DialogConsts.Results.ABORT) {
onAbort.run();
} else {

View File

@ -1143,7 +1143,7 @@ public class VenditaOrdineInevasoViewModel implements IOnColloClosedCallback, IO
if(tmpPickData.getQtaTot() != null) {
useQtaDaEvadere = qtaDaEvadere.floatValue() < tmpPickData.getQtaTot().floatValue() && item.getMtbAart().isFlagQtaCnfFissa();
if(useQtaDaEvadere){
if (useQtaDaEvadere) {
dto.setQtaTot(qtaDaEvadere);
dto.setMaxQta(qtaDaEvadere);
} else {
@ -1152,7 +1152,6 @@ public class VenditaOrdineInevasoViewModel implements IOnColloClosedCallback, IO
dto.setQtaCnf(tmpPickData.getQtaTot());
}
if (tmpPickData.getQtaCnf() != null && useQtaDaEvadere) {
dto.setQtaCnf(tmpPickData.getQtaCnf());
}

View File

@ -4,6 +4,7 @@ import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.databinding.DataBindingUtil;
import com.google.android.material.textfield.TextInputLayout;
@ -39,6 +40,7 @@ public class DialogAskPositionOfLU {
private Context mContext;
private DialogAskPositionOfLuBinding mBinding;
private MtbColt mtbColt;
private boolean mCheckForLineaProd;
private MtbDepoPosizione currentMtbDepoPosizione;
@ -51,13 +53,14 @@ public class DialogAskPositionOfLU {
private boolean completedFlow = false;
public static Dialog makeBase(final Context context, MtbColt mtbColtToUpdate, RunnableArgss<DialogConsts.Results, MtbDepoPosizione> onComplete, RunnableArgs<Exception> onFailed) {
return new DialogAskPositionOfLU(context, mtbColtToUpdate, onComplete, onFailed).mDialog;
public static Dialog makeBase(final Context context, MtbColt mtbColtToUpdate, boolean checkForLineaProd, RunnableArgss<DialogConsts.Results, MtbDepoPosizione> onComplete, RunnableArgs<Exception> onFailed) {
return new DialogAskPositionOfLU(context, mtbColtToUpdate, checkForLineaProd, onComplete, onFailed).mDialog;
}
private DialogAskPositionOfLU(Context context, MtbColt mtbColtToUpdate, RunnableArgss<DialogConsts.Results, MtbDepoPosizione> onComplete, RunnableArgs<Exception> onFailed) {
private DialogAskPositionOfLU(Context context, MtbColt mtbColtToUpdate, boolean checkForLineaProd, RunnableArgss<DialogConsts.Results, MtbDepoPosizione> onComplete, RunnableArgs<Exception> onFailed) {
mContext = context;
mtbColt = mtbColtToUpdate;
mCheckForLineaProd = checkForLineaProd;
this.onComplete = onComplete;
this.onFailed = onFailed;
@ -82,6 +85,8 @@ public class DialogAskPositionOfLU {
mDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
mDialog.setOnShowListener(dialog -> {
((AppCompatTextView) adapter.getPage(0).findViewById(R.id.description_text)).setText(mCheckForLineaProd ? R.string.ask_production_line_of_lu_message : R.string.ask_position_of_lu_message);
adapter.getPage(1).findViewById(R.id.button_confirm).setOnClickListener(v -> {
String levelNumber = ((TextView)adapter.getPage(1).findViewById(R.id.level_number)).getText().toString();
onLevelConfirm(levelNumber);
@ -151,7 +156,7 @@ public class DialogAskPositionOfLU {
currentMtbDepoPosizione = foundPosizione;
if (!currentMtbDepoPosizione.isFlagLineaProduzione() && UtilityPosizione.isPosizioneWithLivello(foundPosizione)) {
if (!mCheckForLineaProd && !currentMtbDepoPosizione.isFlagLineaProduzione() && UtilityPosizione.isPosizioneWithLivello(foundPosizione)) {
askLivello();
BarcodeManager.enable();
} else {

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -20,6 +21,7 @@
android:layout_height="wrap_content"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/description_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
@ -28,7 +30,7 @@
android:layout_gravity="center_vertical"
android:gravity="center_horizontal"
style="@style/TextViewMaterial"
android:text="Scansiona il codice a barre di uno Scaffale"/>
tools:text="Scansiona il codice a barre di uno Scaffale"/>
</LinearLayout>
</LinearLayout>

View File

@ -157,7 +157,7 @@
<androidx.constraintlayout.widget.Guideline
android:id="@+id/ok_right_buttons_guideline"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.75"/>
@ -168,6 +168,7 @@
style="@style/Button.PrimaryFull"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="@id/ok_left_buttons_guideline"
app:layout_constraintEnd_toEndOf="@id/ok_right_buttons_guideline"

View File

@ -76,6 +76,7 @@
android:layout_marginEnd="12dp"
android:layout_gravity="center_vertical"
android:gravity="center_horizontal"
style="@style/TextViewMaterial"
android:text="Scansiona il codice a barre di una UL"/>
</LinearLayout>
@ -95,6 +96,7 @@
android:textSize="16sp"
android:textStyle="bold"
android:layout_gravity="center_horizontal"
style="@style/TextViewMaterial"
android:text="OPPURE" />
<androidx.constraintlayout.widget.ConstraintLayout
@ -123,7 +125,6 @@
style="@style/Button.PrimaryFull"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
app:layout_constrainedHeight="true"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="@id/ok_left_buttons_guideline"
app:layout_constraintEnd_toEndOf="@id/ok_right_buttons_guideline"

View File

@ -194,6 +194,7 @@
<string name="too_much_lu_found_message">E\' stata trovata più di una UL</string>
<string name="ask_print_message"><![CDATA[Si vuole procedere con la stampa dell\'etichetta?]]></string>
<string name="ask_position_of_lu_message">Scansiona il codice a barre di una <b>Posizione</b></string>
<string name="ask_production_line_of_lu_message">Scansiona il codice a barre di una <b>Linea di Produzione</b></string>
<string name="level">Livello</string>
<string name="not_valid">Non valido</string>

View File

@ -197,6 +197,7 @@
<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="ask_production_line_of_lu_message">Please scan a <b>Production Line</b> barcode</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>