Files
PVM/public_html/gest-lib/mrp/js/PopupOrdProd.js
ClaudioR 94781bef76 [MRP V2]
- Adesso è possibile modificare un ordine di produzione selezionando e deselezionando gli ordini di vendita associati
- Aggiunto Ordini Pianificati in Produzione, cioè gli ordini di vendia già agganciai a partita mag, nel popup fabbisogno ordini vendita
2024-02-29 11:01:48 +01:00

974 lines
36 KiB
JavaScript

function PopupOrdProd() {
this._codMart = null;
this._orderKey = null;
this._anag = null;
this._$domElement = null;
this._modalBox = null;
this._onSave = null;
this._onOpen = null;
}
PopupOrdProd.prototype.codMart = function (v) {
this._codMart = v;
return this;
};
PopupOrdProd.prototype.orderKey = function (v) {
this._orderKey = v;
return this;
};
PopupOrdProd.prototype.anag = function (v) {
this._anag = v;
return this;
};
PopupOrdProd.prototype.$domElement = function ($) {
this._$domElement = $;
return this;
};
PopupOrdProd.prototype.onSave = function (f) {
this._onSave = f;
return this;
};
PopupOrdProd.prototype.onOpen = function (f) {
this._onOpen = f;
return this;
};
PopupOrdProd.prototype._isNew = function () {
return is_null(this._orderKey);
};
PopupOrdProd.prototype.open = function () {
const self = this;
const title = self._isNew() ? "Nuovo ordine di Produzione <small>" + self._codMart + " <small>" + self._anag.descrizione + "</small></small>" : "Ordine di lavorazione n. <b>" + self._orderKey.num_ord + "</b> del " + self._orderKey.data_ord.unixtime_format("DD/MM/YYYY");
const ajax = new Ajax();
ajax.get("popup-ord-prod")
.data({cod_mart: self._codMart, order_key: self._orderKey})
.$toDisable(self._$domElement)
.noticeAsModal()
.onSuccess(function (ret) {
self._anag = ret.returnData.prodotto;
self.checkProdOnSave = !_.isNil(ret.returnData.ggCheckOrdine);
const btOK =
self._isNew() ?
{
text: "Crea ordine di produzione", onClick: function () {
self._onInsert();
}
}
: {
text: "Aggiorna ordine", onClick: function () {
self._onUpdate();
}
};
self._modalBox = new ModalBox();
self._modalBox.onBeforeShow(function ($div) {
$div.find(".modal-body").css("overflow-y", "scroll");
const $dataProd = $div.find("input[name='data_prod']");
const $dataScad = $div.find("input[name='data_scad']");
$dataProd.datepicker({
dateFormat: "dd/mm/yyyy",
autoClose: true,
clearButton: true,
inModal: true
});
$dataScad.datepicker({
dateFormat: "dd/mm/yyyy",
autoClose: true,
clearButton: true,
inModal: true
});
if (self._isNew()) {
$dataProd.datepicker({
minDate: new Date(),
onSelect(formattedDate, date) {
self._setListMateriali();
$div.find("#bt_proponiPartitaScad > span").addClass("text-warning");
}
});
self._setEvents();
self._setDefaultValues();
} else {
const rigaOrdine = ret.returnData.rigaOrdine;
$dataScad.datepicker({
onRenderCell: function (date, cellType) {
if (cellType === "day") {
let currentTime = moment().unix();
let isDisabled = !(daysDiff(rigaOrdine.data_ord, currentTime) === 0 || daysDiffFromToday(currentTime) >= 0);
return {
disabled: isDisabled
};
}
}
});
let dataOrd = moment(rigaOrdine.data_ord * 1000);
$div.find("input[name='data_prod']").data("datepicker").selectDate(dataOrd.toDate());
// ALTERNATIVA A MINDATE: ABILITA SOLO LE DATE FUTURE PIU' LA DATA CORRENTE ANCHE SE PASSATA (DATA_ORD)
// $dataProd.datepicker("option", "beforeShowDay", function (currentDate) {
// var currentTime = currentDate.dateToTime();
// var enable = daysDiff(rigaOrdine.data_ord, currentTime) === 0 || daysDiffFromToday(currentTime) >= 0;
// return [enable, ""];
// }).datepicker("setDate", rigaOrdine.data_ord.timeToDate());
self._setEvents();
$div.find("input[name='colli_pedana']").val(rigaOrdine.colli_pedana);
$div.find("select[name='cod_tcol_ul']").val(rigaOrdine.cod_tcol_ul);
if (rigaOrdine.flag_partita !== "I") {
$div.find("input[name='partita_mag']").setValue(rigaOrdine.partita_mag).readonly();
$div.find("#bt_proponiPartitaScad").parent().remove();
}
$div.find("input[name='data_scad']").setValue(!is_null(rigaOrdine.data_scad) ? rigaOrdine.data_scad.unixtime_format("DD/MM/YYYY") : null);
if (rigaOrdine.cod_jfas_steps) {
$div.find("[name='cod_jfas']").val(rigaOrdine.cod_jfas_steps.split("|")).trigger("select2:select").trigger("change.select2");
} else {
self._setListMateriali();
}
$div.find("[name='note']").val(rigaOrdine.note);
$div.find("[name='qta_prod']").val(rigaOrdine.qta_prod).trigger("change");
}
// TODO mostrare linee con ore disponibili
// new Ajax()
// .get("getOrdiniLavorazione")
// .data({
// codJfas: $div.find("select[name='cod_jfas']").val()
// })
// .noticeAsToast()
// .onSuccess(data => {
// if (data.returnData && data.returnData.length > 0) {
// $dataProd.datepicker("option", "beforeShowDay", function (date) {
// const eventsInDate = data.returnData.filter(ordine => moment(ordine.start, "DD/MM/YYYY HH:mm:ss").isSame(moment(date), "day"));
//
// if (eventsInDate.length > 0) {
// return [true, eventsInDate[0].stato.toLowerCase().replaceAll(" ", "-"), eventsInDate[0].title];
// } else {
// return [true, "", ""];
// }
// });
// }
// })
// .execute();
})
.onClose(function () {
// delete self;
})
.btOK(btOK)
.gridSize({xs: 12, sm: 8})
.style(self._isNew() ? "info" : "warning")
.okCancel().draggable().backhash().content(ret.returnString).title(title).show();
}).execute();
};
PopupOrdProd.prototype._setDefaultValues = function () {
var self = this;
self._modalBox.$div.find("input[name='colli_pedana']").val(self._anag.colli_pedana);
self._modalBox.$div.find("select[name='cod_tcol_ul']").val(self._anag.cod_tcol_ul);
// self._modalBox.$div.find("input[name='data_prod']").val(moment().format("DD/MM/YYYY"));
self._modalBox.$div.find("input[name='data_prod']").data("datepicker").selectDate(getToday().timeToDate());
return self;
};
PopupOrdProd.prototype._setEvents = function () {
let self = this;
let $div = self._modalBox.$div;
let $bt_proponiPartitaScad = $div.find("#bt_proponiPartitaScad");
self._codMdep = _mrp.getDepositoDefault().cod_mdep;
// if (self._isNew()) {
$bt_proponiPartitaScad.on("click", function () {
self._refreshPartitaScad();
});
// } else {
// $bt_proponiPartitaScad.parent().remove();
// }
let $numPedane = $div.find("input[name='num_pedane']");
let $colliPedana = $div.find("input[name='colli_pedana']");
let $partitaMag = $div.find("input[name='partita_mag']");
let $dataScad = $div.find("input[name='data_scad']");
let $qtaProd = $div.find("input[name='qta_prod']");
let $qtaOrd = $div.find("input[name='qta_ord']");
let $codJfas = $div.find("select[name='cod_jfas']");
let qtaCnf = self._anag.qta_cnf;
let flagDigUntMisProd = self._anag.flag_dig_unt_mis_prod;
$numPedane.on("change", function () {
let numPedane = $(this).getNumericValue();
let colliPedana = $colliPedana.getNumericValue();
if (!is_null(numPedane)) {
let qtaProd = numPedane * colliPedana;
$qtaProd.setValue(blankIfNullOrZero(qtaProd)).trigger("change");
}
});
$colliPedana.on("change", function () {
let colliPedana = $(this).getNumericValue();
let numPedane = $numPedane.getNumericValue();
let qtaOrd = numPedane * colliPedana * qtaCnf;
$qtaOrd.setValue(blankIfNullOrZero(qtaOrd)).trigger("change");
let qtaProd = numPedane * colliPedana;
$qtaProd.setValue(blankIfNullOrZero(qtaProd));
});
$qtaProd.on("change", function () {
let qtaProd = $(this).getNumericValue();
let colliPedana = $colliPedana.getNumericValue();
let qtaOrd = qtaProd * qtaCnf;
$qtaOrd.setValue(blankIfNullOrZero(qtaOrd)).trigger("change");
$numPedane.setValue(Math.ceil(qtaOrd / qtaCnf / colliPedana));
});
$qtaOrd.on("change", function () {
let qtaOrd = $(this).getNumericValue();
let colliPedana = $colliPedana.getNumericValue();
let qtaProd = qtaOrd / qtaCnf;
if (flagDigUntMisProd === "S") {
qtaProd = Math.ceil(qtaProd);
}
$qtaProd.setValue(qtaProd);
$numPedane.setValue(Math.ceil(qtaProd / colliPedana));
self._setListMateriali();
});
$codJfas.select2({
dropdownParent: $div,
width: "100%",
closeOnSelect: false
});
self.$dataProd = $div.find("input[name='data_prod']");
$codJfas.on("select2:select select2:unselect", function (e) {
const arrCodJfas = if_null($(this).val(), []);
const centro = _.find(_mrp.module.get_dataSource("centriLavoro"), {cod_jfas: arrCodJfas && arrCodJfas[0] || null});
const $options = $(this).find("option").not(`[value='${arrCodJfas}']`);
self.initializeCRP(arrCodJfas);
self.$dataProd.datepicker({
onSelect(formattedDate, date) {
arrCodJfas.forEach(codJfas => {
const scheduler = $div.find(`#${codJfas} #scheduler`).data("kendoScheduler");
scheduler.date(moment(formattedDate, "DD/MM/YYYY").toDate());
scheduler.dataSource.read();
});
self._setListMateriali();
}
});
if (!_.isNil(centro) && !_.isNil(centro.cod_mdep_lav)) {
$div.find(".codMdepLav").val(centro.descrizione_depo).attr("data-cod_mdep_lav", centro.cod_mdep_lav);
self._codMdep = centro.cod_mdep_lav;
let anyChange = false;
$options.each((i, option) => {
$(option).removeAttr("disabled");
const centroOption = _.find(_mrp.module.get_dataSource("centriLavoro"), {cod_jfas: option.value});
if (centro.cod_mdep_lav !== centroOption.cod_mdep_lav) {
$(option).attr("disabled", "disabled");
anyChange = true;
}
});
if (anyChange && $codJfas) {
$codJfas
.select2({
dropdownParent: $div,
width: "100%",
closeOnSelect: false
})
.select2("open");
}
} else {
const deposito = _mrp.getDepositoDefault();
$div.find(".codMdepLav").val(deposito.descrizione);
self._codMdep = deposito.cod_mdep;
$options.each((i, option) => {
$(option).removeAttr("disabled");
});
}
}).trigger("select2:select");
$("#liCRP").on("shown.bs.tab", (event) => {
const arrCodJfas = if_null($codJfas.val(), []);
self.initializeCRP(arrCodJfas);
});
$partitaMag.on("change", function (e) {
let partitaMag = $(e.currentTarget).val();
$dataScad.datepicker("option", "disabled", true);
if (!_.isNil(partitaMag) && (_.isNumber(partitaMag) || !_.isEmpty(partitaMag))) {
new Ajax()
.get("suggestDataScad")
.data({partitaMag: partitaMag, codMart: self._codMart})
.waitToast("Controllo esistenza lotto")
.noticeAsModal()
.onSuccess(function (ret) {
let data_scad = _.isNil(ret.returnData) ? null : ret.returnData.data_scad;
if (!_.isNil(data_scad)) {
let dataScadenza = moment(data_scad * 1000).toDate();
$dataScad.data("datepicker").selectDate(dataScadenza);
} else {
$dataScad.data("datepicker").clear();
$dataScad.focus().datepicker("option", "disabled", false);
}
})
.execute();
} else {
$dataScad.data("datepicker").clear();
$dataScad.focus().datepicker("option", "disabled", false);
}
});
$div.find("input[id=cod_jcom]").on("change", function () {
const checked = $("input[id=cod_jcom]:checked:first");
const firstRow = _ojbc.B64JSON_parse($(checked).parents("tr").attr("data-row"));
const assegnaQtaColDaOrdiniV = _mrp.module.get_dataSource("assegnaQtaColDaOrdiniV");
if (assegnaQtaColDaOrdiniV && firstRow) {
$colliPedana.val(firstRow.colli_pedana);
}
const sumNumCnf = $("input[id=cod_jcom]:checked")
.map((index, el) => {
const row = _ojbc.B64JSON_parse($(el).parents("tr").attr("data-row"));
return row.num_cnf;
})
.toArray()
.reduce((a, b) => a + b, 0);
$("input[id=cod_jcom]:not(:checked)")
.each((index, elem) => {
const $el = $(elem);
const row = _ojbc.B64JSON_parse($el.parents("tr").attr("data-row"));
$el.prop("disabled", (firstRow && row.cod_tcol_ul !== firstRow.cod_tcol_ul) || false);
});
if (assegnaQtaColDaOrdiniV) {
// let numPedane = firstRow && sumNumCnf && sumNumCnf / firstRow.colli_pedana;
//
// if (numPedane && numPedane < 1) {
// numPedane = 1;
// }
//
// $numPedane.val(numPedane || 0).trigger("change");
$qtaProd.val(sumNumCnf).trigger("change");
}
});
return self;
};
PopupOrdProd.prototype.initializeCRP = function (arrCodJfas) {
let self = this;
let $div = self._modalBox.$div;
self.$schedulers = $div.find("#schedulers");
self.$schedulers.html("");
arrCodJfas.forEach((codJfas, i) => {
self.$schedulers.append(
$(`<div class="panel panel-default" id="${codJfas}">`)
.append(`<div class="panel-heading"><h4 class="font-weight-bold">Linea ${codJfas}</h4></div>`)
.append(`<div id="scheduler"></div>`)
);
let dataOrd = self.$dataProd.val() ? self.$dataProd.val() : new Date(Date.now()).toLocaleDateString();
kendo.culture("it-IT");
$div.find(`#${codJfas} #scheduler`).kendoScheduler({
views: [{
type: "week",
eventSpacing: 40
}],
min: new Date(),
date: moment(dataOrd, "DD/MM/YYYY").toDate(),
allDayEventTemplate: $div.find("#event-template").html(),
dateHeaderTemplate: kendo.template("<strong>#=kendo.toString(date, 'ddd')# #=kendo.toString(date, 'dd/M')#</strong>"),
dataSource: {
transport: {
async read(options) {
await timeout(250 * i);
new Ajax()
.get("getOrdiniLavorazione")
.data({
...this.parameterMap ? this.parameterMap(options.data, "read") : options.data,
codJfas
})
.noticeAsToast()
.onSuccess(data => {
options.success(data.returnData);
const scheduler = $div.find(`#${codJfas} #scheduler`).data("kendoScheduler");
const currentData = scheduler.data();
if (currentData && currentData.length > 0 && !$div.find(`#${codJfas} .k-scheduler-header-all-day tbody .sumRow`).exists()) {
const date = moment(scheduler.date());
const weekDates = getWeekDates(date);
const weekDatesString = weekDates
.map(weekDate => {
const sum = _(data.returnData)
.filter(ordine => moment(ordine.start).isSame(weekDate, "day"))
.sumBy("runTimeSec");
const sumMin = sum / 60;
const hours = Math.floor(sumMin / 60);
const minutes = Math.round(sumMin % 60);
return `<td role="gridcell" aria-selected="false">
${sum > 0 ? hours + " h " + minutes + " m" : ""}
</td>`;
}).join("");
$div.find(`#${codJfas} .k-scheduler-header-all-day tbody`).append(
`<tr class="sumRow" role="row" style="background-color: #f8f9fa">
${weekDatesString}
</tr>`);
}
})
.onError({
toast: {message: "Errore nel caricamento degli ordini di lavorazione."},
callback(result) {
options.error(result.errorText);
}
}).execute();
}
}
},
resources: [
{
field: "stato",
dataSource: [
{value: "IN CORSO", color: "#090"}
]
}
],
navigate() {
if (this.dataSource.total() > 0) {
this.dataSource.read();
}
},
messages: {
next: "Successivo",
previous: "Precedente"
},
editable: false,
footer: false,
mobile: true
});
if (i === arrCodJfas.length - 1) {
$div.find("#loading").remove();
}
});
if (arrCodJfas.length === 0) {
$("#noLineText").show();
$("#loading").hide();
} else {
$("#noLineText").hide();
}
};
PopupOrdProd.prototype._setListMateriali = function () {
let self = this;
let $tbody = $("#listMateriali > tbody");
let $div = self._modalBox.$div;
let $dataProd = $div.find("input[name='data_prod']");
let $qtaOrd = $div.find("input[name='qta_ord']");
let dataProd = if_null(moment($dataProd.val(), "DD/MM/YYYY").unix(), moment().unix());
let qtaOrd = if_null($qtaOrd.getValue(), 0);
new Ajax()
.get("getMateriali")
.data({
cod_mart: self._codMart,
data_ord: moment().unix(),
qta_prod: qtaOrd,
cod_mdep: self._codMdep
})
.noticeAsToast()
.onSuccess(function (ret) {
$tbody.html("");
let materiali = _.groupBy(ret.returnData, function (item) {
return item.cod_mart;
});
_.each(materiali, function (materiale) {
$tbody.append(self._buildRiga(materiale, dataProd));
});
})
.execute();
return self;
};
PopupOrdProd.prototype._buildRiga = function (items, dataPr) {
const self = this;
const $trMat = _mrp.module.get_$template("tr-mat");
const firstItem = items[0];
$trMat.find(".txt_descrArticolo").html(firstItem.descr_articolo);
$trMat.find(".txt_codMart").html(firstItem.cod_mart);
_.each(items, function (item) {
let gestione = String(item.gestione);
let tipologia;
let value;
let red;
switch (gestione) {
case "L":
tipologia = "impegni";
value = Math.abs(item.impegni);
break;
case "A":
tipologia = "arrivi";
value = Math.abs(item.qta_arrivo);
break;
default:
tipologia = "giacenza";
value = item.giacenza;
red = value < 0;
break;
}
let dataMrp;
if (moment(item.data_mrp, "YYYY-MM-DD", true).isValid()) {
let data = new Date(item.data_mrp);
dataMrp = moment(data);
} else {
dataMrp = moment.unix(item.data_mrp);
}
let today = moment().startOf("day");
let daysDiff = Math.abs(dataMrp.diff(today, "days")) + 1;
if (value) {
let daySpan = $trMat.find(`.${tipologia}Day${daysDiff}`);
daySpan.html(number_format_datatable().display(value));
daySpan.attr("data-value", value);
if (red) {
daySpan.css("color", "red");
}
}
});
let today = moment().startOf("day");
let dataProd = moment.unix(dataPr).startOf("day");
let daysDiff = Math.abs(today.diff(dataProd, "days")) + 1;
let qtaProd = firstItem.qta_prod;
if (qtaProd && daysDiff) {
let fabbisogni = $trMat.find(`.fabbisogniDay${daysDiff}`);
fabbisogni.html(qtaProd).attr("data-value", qtaProd);
}
for (let i = 1; i <= 7; i++) {
let elToFind;
if (i === 1) {
elToFind = `.giacenzaDay${i}`;
} else {
elToFind = `.disponibilitaDay${i - 1}`;
}
if ($trMat.hasClass("rowDisponibilita")) {
$trMat
.attr("data-codMart", firstItem.cod_mart)
.attr("data-descrArticolo", firstItem.descr_articolo);
}
const disponibilitaPrec = zeroIfBlankOrNull($trMat.find(elToFind).attr("data-value"));
const impegni = zeroIfBlankOrNull($trMat.find(`.impegniDay${i}`).attr("data-value"));
const arrivi = zeroIfBlankOrNull($trMat.find(`.arriviDay${i}`).attr("data-value"));
const fabbisogni = zeroIfBlankOrNull($trMat.find(`.fabbisogniDay${i}`).attr("data-value"));
const newDisp = disponibilitaPrec - impegni + arrivi - fabbisogni;
const newDispFormat = number_format_datatable().display(newDisp);
const disponibilitaDay = $trMat.find(`.disponibilitaDay${i}`);
disponibilitaDay.html(newDispFormat).attr("data-value", newDisp);
if (newDisp < 0) {
disponibilitaDay.css("color", "red");
}
}
return $trMat;
};
PopupOrdProd.prototype._refreshPartitaScad = function () {
let self = this;
let $div = self._modalBox.$div;
let partitaMag = null;
let $dataProd = $div.find("input[name='data_prod']");
let $partitaMag = $div.find("input[name='partita_mag']");
let $dataScad = $div.find("input[name='data_scad']");
let $codJfas = $div.find("select[name='cod_jfas']");
let $bt = $div.find("#bt_proponiPartitaScad");
let dataProd = $dataProd.getTimestampValue();
if (_.isNil($codJfas.val()) || _.isEmpty($codJfas.val())) {
$codJfas.focus();
return;
}
$dataScad.data("datepicker").clear();
if (!is_null(dataProd)) {
new Ajax()
.get("suggestDataScadPartitaMag")
.data({
cod_mart: self._codMart,
data_prod: dataProd,
partita_mag: "",
cod_anag: "",
gestione: "L",
num_ord: "",
cod_jfas: $codJfas.val()[0]
})
.$button($bt)
.$toDisable($dataScad, $dataProd)
.noticeAsToast()
.onSuccess(function (ret) {
let dataScad = ret.returnData.data_scad;
if (!is_null(dataScad)) {
let dataScadenza = moment(dataScad * 1000).toDate();
$dataScad.data("datepicker").selectDate(dataScadenza);
}
$partitaMag.setValue(ret.returnData.partita_mag);
$bt.children("span").bs_element_setStyle("secondary");
})
.execute();
}
return self;
};
PopupOrdProd.prototype._checkMaterie = async function () {
const today = moment().startOf("day");
const $dataProd = $("input[name='data_prod']");
const unixDataProd = moment($dataProd.val(), "DD/MM/YYYY");
const daysDiff = Math.abs(today.diff(unixDataProd, "days")) + 1;
const codMartMiscela = _mrp.module.get_dataSource("codMartMiscela");
const checkDisponibilitaMP = _mrp.module.get_dataSource("checkDisponibilitaMP");
const righeNegative = [];
if (checkDisponibilitaMP) {
$("#listMateriali tr.rowDisponibilita").each(function () {
const $disp = $(this).find(`.disponibilitaDay${daysDiff}`);
const value = $disp.getDataAttr("value");
const $dispRow = $disp.parent();
const codMart = $dispRow.getDataAttr("codMart");
const descrArticolo = $dispRow.getDataAttr("descrArticolo");
if (value < 0 && !codMartMiscela.includes(codMart)) {
righeNegative.push(codMart + " - " + descrArticolo);
}
});
}
let response = true;
const dataProd = $dataProd.val();
if (righeNegative.length > 0) {
const modalBox = new ModalBox();
response = await modalBox
.yesNo()
.warning()
.content(
"I seguenti articoli non hanno disponibilità nel giorno " + dataProd + ". Vuoi continuare?" +
"<br><br>" +
righeNegative.join("<br>")
)
.title("Disponibilità negativa")
.show();
}
return response;
}
PopupOrdProd.prototype._onInsert = async function () {
const self = this;
if (self.checkProdOnSave) {
const data = {
cod_mart: self._codMart,
cod_jfas: self._modalBox.$div.find("select[name=cod_jfas]").val()
};
const ajax = new Ajax();
ajax
.get("checkProduzione")
.data(data)
.waitModal("Controllo Produzione")
.noticeAsModal()
.onSuccess(function (ret) {
const data_reg = ret.returnData.data_reg;
const flag_prod = ret.returnData.flag_prod;
if (!_.eq(flag_prod, "NO")) {
const modal = new ModalBox();
modal
.yesNo({text: "conferma"})
.info()
.content(
_.eq(flag_prod, "SI") ?
"L'ultima produzione del prodotto '" + self._codMart + "' è del " + moment(data_reg * 1000).format("DD/MM/YYYY") + " prima di procedere alla generazione dell'ordine si consiglia di verificare l'anagrafica e la distinta base, Continuare?"
: "Il prodotto '" + self._codMart + "' non è stato mai prodotto, prima di procedere alla generazione dell'ordine si consiglia di verificare l'anagrafica e la distinta base, Continuare?"
)
.title("Conferma produzione")
.show()
.then(function (response) {
if (response) {
self._confirmInsert();
}
});
} else {
self._confirmInsert();
}
})
.execute();
} else {
self._confirmInsert();
}
};
PopupOrdProd.prototype._confirmInsert = async function () {
const self = this;
const data = _checkForm.checkData(self._modalBox.$div, false, false, false, false,
value => !value || (Array.isArray(value) && value.length === 0));
const toast = new Toast();
if (data !== false) {
data.cod_mart = self._codMart;
data.filterMdep = _mrp.getCodMdep();
if (!_.isNil(data.partita_mag) && !_.isEmpty(data.partita_mag) && (_.isNil(data.data_scad) || (!_.isNumber(data.data_scad) && _.isEmpty(data.data_scad)))) {
self._modalBox.$div.find("[name=data_scad]").addClass("error");
setTimeout(() => {
self._modalBox.$div.find("[name=data_scad]").removeClass("error");
}, 3000);
toast.danger("Inserire una data di scadenza per il lotto inserito!");
return;
}
data.ordiniSelezionati = self._modalBox.$div.find("input[id=cod_jcom]:checked")
.map((index, el) => {
const row = _ojbc.B64JSON_parse($(el).parents("tr").attr("data-row"));
row.data_ord = moment.unix(row.data_ord).format("YYYY/MM/DD");
return row;
})
.toArray();
const answer = await self.checkQtaOrdiniSel(data);
if (!answer) {
return;
}
let untMisProd = self._anag.unt_mis_prod;
let qtaOrdProd = data.qta_prod * self._anag.qta_cnf;
let rapConv;
switch (untMisProd) {
case self._anag.unt_mis:
rapConv = 1;
break;
case self._anag.unt_mis2:
rapConv = self._anag.rap_conv2;
break;
case self._anag.unt_mis3:
rapConv = self._anag.rap_conv3;
break;
default:
rapConv = 0;
}
if (rapConv === 0) {
toast.danger("Impossibile convertire la quantità impostata in U.M. di produzione.", "Controllare la distinta!");
return;
}
data.qta_prod = qtaOrdProd / rapConv;
const response = await self._checkMaterie();
if (response) {
new Ajax()
.post("insertOrdLav")
.data(data)
.$button(self._modalBox.get$btOK())
.waitModal("Registrazione ordine di produzione")
.noticeAsModal()
.onSuccess(function (ret) {
self._modalBox.close();
var ordKeys = ret.returnData.ordKeys; // attualmente sempre ordine singolo
var $ul = $("<ul>");
ordKeys.forEach(function (ordine) {
$ul.append("<li>Ordine num. <b>" + ordine.num_ord + "</b></li>");
});
_mrp.refresh_produzioneRow(self._codMart, ret.returnData.produzione);
var toast = new Toast();
toast.timeout(10).closeButton().info($ul.outerHtml(), ordKeys.length === 1 ? "L'ordine di produzione è stato registrato" : "Gli ordini di produzione sono stati registrati");
if (_mrp.module.get_dataSource("reportNameScheda")) {
new Ajax()
.post("getSchedaTecnica")
.data({
...ret.returnData.lavorazione[0],
cod_prodotto: self._codMart
})
.confirmModal({
style: "info",
title: "Scheda tecnica",
message: `
<div class="text-center">
<i class="fas fa-5x fa-info-circle text-info"></i><br>
<h4 class="mt-10">
Stampare la scheda tecnica?
</h4>
</div>
`
})
.noticeAsModal()
.waitModal("Stampa scheda tecnica...")
.onSuccess({
downloadFile: true
})
.execute();
}
if (is_function(self._onSave)) {
self._onSave();
}
})
.execute();
}
}
};
PopupOrdProd.prototype._onUpdate = async function () {
const self = this;
const formData = _checkForm.checkData(self._modalBox.$div);
if (formData !== false) {
formData.key = self._orderKey;
formData.filterMdep = _mrp.getCodMdep();
formData.ordiniSelezionati = self._modalBox.$div.find("input[id=cod_jcom]:checked")
.map((index, el) => _ojbc.B64JSON_parse($(el).parents("tr").attr("data-row")))
.toArray();
const answer = await self.checkQtaOrdiniSel(formData);
if (!answer) {
return;
}
const response = await self._checkMaterie();
if (response) {
new Ajax()
.post("updateOrdLav")
.data(formData)
.$button(self._modalBox.get$btOK())
.waitModal("Aggiornamento ordine di produzione")
.noticeAsModal()
.onSuccess({
toast: "L'ordine è stato aggiornato",
callback: function () {
self._modalBox.close();
if (is_function(self._onSave)) {
self._onSave();
}
}
})
.execute();
}
}
};
PopupOrdProd.prototype.checkQtaOrdiniSel = async function (data) {
if (data.ordiniSelezionati?.length > 0) {
const sumNumCnf = data.ordiniSelezionati
.map(ordine => ordine.num_cnf)
.reduce((a, b) => a + b, 0);
const totPedane = sumNumCnf / data.colli_pedana;
if (sumNumCnf && data.num_pedane < totPedane) {
const pedaneMancanti = totPedane - data.num_pedane;
return await new ModalBox()
.style("warning")
.title("Pedane insufficienti")
.content(`
Il numero di pedane inserito non è sufficiente per gli ordini di vendita selezionati.<br>
<b>${pedaneMancanti}</b> pedane mancant${pedaneMancanti === 1 ? "e" : "i"}. Procedere comunque?
`)
.btOK({
text: "Conferma"
})
.okCancel()
.show();
}
}
return true;
}