- 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
974 lines
36 KiB
JavaScript
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;
|
|
} |