planning plana

This commit is contained in:
amazuecos
2025-03-29 11:07:36 +01:00
parent 47455cd9c2
commit 8c64b678fe
28 changed files with 655 additions and 209 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

@ -1,7 +1,7 @@
import Ajax from "../../components/ajax.js"
import ClassSelect from "../../components/select2.js";
import DatePicker from "../../components/datepicker.js";
import { alertConfirmationDelete } from "../../components/alerts/sweetAlert.js";
import { alertConfirmationDelete, alertSuccess } from "../../components/alerts/sweetAlert.js";
import Modal from "../../components/modal.js"
class OrdenTrabajo {
@ -100,7 +100,7 @@ class OrdenTrabajo {
this.item.on("click", "#btn-reset-tareas", this.handleResetTareasDeleteConfirmation.bind(this))
this.otForm.on("click", ".ot-tarea-comment", this.handleNoteTarea.bind(this))
$("#btn-update-tarea-comment").on("click", this.handleTareaNoteSubmit.bind(this))
this.otForm.on("keyup","#ot-comment",this.handleOtComment.bind(this))
this.otForm.on("change", "#ot-comment", this.handleOtComment.bind(this))
this._handleGetData()
this.handleGetPortada()
@ -116,7 +116,7 @@ class OrdenTrabajo {
bottomEnd: 'paging'
},
serverSide: true,
responsive : true,
responsive: true,
createdRow: this.filterCreatedRow.bind(this),
pageLength: 10,
language: {
@ -231,10 +231,10 @@ class OrdenTrabajo {
}
fillOtDetails() {
const progreso = this.summaryData.ot.progreso
this.otForm.find("#ot-progress-bar").attr('aria-valuenow',progreso).text(progreso + "%").css("width",progreso + "%")
this.otForm.find("#ot-paginas").val(this.summaryData.presupuesto.paginas)
this.otForm.find("#ot-tirada").val(this.summaryData.presupuesto.tirada)
this.otForm.find("#ot-merma").val(this.summaryData.presupuesto.merma)
this.otForm.find("#ot-progress-bar").attr('aria-valuenow', progreso).text(progreso + "%").css("width", progreso + "%")
this.otForm.find("#ot-paginas").text(this.summaryData.presupuesto.paginas)
this.otForm.find("#ot-tirada").text(this.summaryData.presupuesto.tirada)
this.otForm.find("#ot-merma").text(this.summaryData.presupuesto.merma)
}
fillOtDates() {
this.fechaImpresion.setDate(this.summaryData.dates.fecha_impresion_at)
@ -275,7 +275,7 @@ class OrdenTrabajo {
handleTareaNoteSubmit(event) {
const data = {}
data["comment"] = $("#comment-tarea").val()
data["orden_trabajo_tarea_id"] = $("#comment-tarea").data("id")
data["orden_trabajo_tarea_id"] = this.tareaIdComment
const ajax = new Ajax(
"/produccion/ordentrabajo/update/tarea",
data,
@ -291,17 +291,19 @@ class OrdenTrabajo {
this._handleGetData();
}
handleTareaChangeError(error) { }
handleOtComment(event){
handleOtComment(event) {
console.log($(event.currentTarget).val())
const ajax = new Ajax(
"/produccion/ordentrabajo/update",
{
"orden_trabajo_id" : this.modelId,
"name" : $(event.currentTarget).attr("name"),
"comentarios" : $(event.currentTarget).val()
"orden_trabajo_id": this.modelId,
"name": $(event.currentTarget).attr("name"),
"comentarios": $(event.currentTarget).val()
},
null,
null,
(response) => {
alertSuccess(response.message).fire()
},
null
)
ajax.post();
@ -326,7 +328,11 @@ class OrdenTrabajo {
}
handleDateChangeSuccess(formItem, response) {
formItem.addClass("is-valid")
formItem.parent().append(`<div class="form-text">${[response.user.first_name, response.user.last_name].join(" ")}</div>`)
alertSuccess(response.message).fire()
if (response.user) {
formItem.parent().find(".form-text").remove()
formItem.parent().append(`<div class="form-text">${[response.user.first_name, response.user.last_name].join(" ")}</div>`)
}
}
handleDateChangeError(errors) { }
handlePreimpresionReviewChange(event) {
@ -455,10 +461,10 @@ class OrdenTrabajo {
}
handleDeleteTareaError() { }
handleNoteTarea(event) {
let tarea_id = $(event.currentTarget).data("id");
const tarea = this.summaryData.tasks.find(task => task.id == tarea_id)
this.tareaIdComment = $(event.currentTarget).data("id");
const tarea = this.summaryData.tasks.find(task => task.id == this.tareaIdComment)
if (tarea) {
$("#comment-tarea").attr("data-id", tarea_id)
$("#comment-tarea").attr("data-id", this.tareaIdComment)
$("#comment-type").text(tarea.nombre ?? "")
$("#comment-tarea").val(tarea.comment)
this.tareaCommentModal.toggle()

View File

@ -6,24 +6,45 @@ class PlanningRotativa {
constructor(domItem) {
this.item = domItem
this.tablePlanningRot = this.item.find("#planning-rotativa-datatable")
this.tablePlanningPlana = this.item.find("#planning-plana-datatable")
this.papelGramajeTablePlanning = this.item.find("#planning-papel-datatable")
this.papelPliegoTablePlanning = this.item.find("#planning-pliego-datatable")
this.papelImpresionHeader = this.item.find('#papel-impresion-name-header')
this.papelImpresionPlanaHeader = this.item.find('#papel-impresion-name-plana-header')
this.checkAllMetros = this.item.find("#metros-check-all")
this.checkAllPliegos = this.item.find("#pliegos-check-all")
this.datatableColumns = [
{ data: 'otId', searchable: false, sortable: false },
{ data: 'fecha_entrega_real_at', searchable: true, sortable: false },
{ data: 'presupuesto_titulo', searchable: true, sortable: false },
{ data: 'maquina_planning_nombre', searchable: true, sortable: false },
{ data: 'ot_tirada', searchable: false, sortable: false, },
{ data: 'papel_ancho', searchable: false, sortable: false, render: d => `<span class="autonumeric">${d}</span>` },
{ data: 'papel_alto', searchable: false, sortable: false, render: d => `<span class="autonumeric">${d}</span>` },
{ data: 'otId', searchable: false, sortable: false, width: "3rem" },
{ data: 'fecha_entrega_real_at', searchable: true, sortable: false, width: "15rem" },
{ data: 'presupuesto_titulo', searchable: true, sortable: false, width: "20rem" },
{ data: 'maquina_planning_nombre', searchable: true, sortable: false, width: "10rem" },
{ data: 'ot_tirada', searchable: false, sortable: false, width: "5rem" },
{ data: 'papel_ancho', searchable: false, sortable: false, width: "5rem", render: d => `<span class="autonumeric">${d}</span>` },
{ data: 'papel_alto', searchable: false, sortable: false, width: "5rem", render: d => `<span class="autonumeric">${d}</span>` },
{ data: 'papel_impresion', searchable: false, sortable: false },
{ data: 'papel_gramaje', searchable: false, sortable: false, render: d => `<span class="autonumeric">${d}</span>` },
{ data: 'corte', searchable: false, sortable: false, render: d => d },
{ data: 'papel_gramaje', searchable: false, sortable: false, width: "5rem", render: d => `<span class="autonumeric">${d}</span>` },
{ data: 'corte', searchable: false, sortable: false, render: this.renderCorteImage.bind(this), width: "10rem" },
{ data: 'metros_check', searchable: false, sortable: false, render: d => `<input class="form-check-input metros-check" data-id="${d}" type="checkbox" value="" />` },
{ data: 'metros', searchable: false, sortable: false, render: d => `<span class="autonumeric">${d}</span>` },
{ data: 'action', searchable: false, sortable: false, render: this._renderBtnAction },
]
this.datatablePlanaColumns = [
{ data: 'otId', searchable: false, sortable: false, width: "3rem" },
{ data: 'fecha_entrega_real_at', searchable: true, sortable: false, width: "15rem" },
{ data: 'presupuesto_titulo', searchable: true, sortable: false, width: "20rem" },
{ data: 'maquina_planning_nombre', searchable: true, sortable: false, width: "10rem" },
{ data: 'ot_tirada', searchable: false, sortable: false, width: "5rem" },
{ data: 'papel_ancho', searchable: false, sortable: false, width: "5rem", render: d => `<span class="autonumeric">${d}</span>` },
{ data: 'papel_alto', searchable: false, sortable: false, width: "5rem", render: d => `<span class="autonumeric">${d}</span>` },
{ data: 'papel_impresion', searchable: false, sortable: false },
{ data: 'papel_gramaje', searchable: false, sortable: false, width: "5rem", render: d => `<span class="autonumeric">${d}</span>` },
{ data: 'pliegos_check', searchable: false, sortable: false, render: d => `<input class="form-check-input pliegos-check" data-id="${d}" type="checkbox" value="" />` },
{ data: 'pliegosPedido', searchable: false, sortable: false, render: d => `<span class="autonumeric">${d}</span>` },
{ data: 'action', searchable: false, sortable: false, render: this._renderBtnAction },
]
this.papelGramajeDatatableColumns = [
{ data: 'papelImpresionNombre', searchable: true, sortable: true },
@ -31,7 +52,7 @@ class PlanningRotativa {
{ data: 'tareasCount', searchable: true, sortable: true },
{ data: 'totalTirada', searchable: false, sortable: false },
{ data: 'metros', searchable: false, sortable: false, render: d => `<span class="autonumeric">${d}</span>` },
{ data: 'tiempoReal', searchable: false, sortable: false },
{ data: 'tiempoReal', searchable: false, sortable: false, render: d => this.formatSeconds(d) },
{
data: 'action', searchable: false, sortable: false, render: (d) => {
return `<button type="button" class="btn btn-primary btn-sm w-100 papel-gramaje-btn" data-id="${d.data.papelImpresionId}" data-bs-toggle="button">${d.title}</button>`
@ -40,32 +61,82 @@ class PlanningRotativa {
]
this.maquinaSelectFilter = new ClassSelect($("#maquina-select-filter"), `/maquinas/select`, "Seleccione una maquina", true, {}, $('body'));
this.papelImpresionFilter = new ClassSelect($("#papel-impresion-select-filter"), `/papelesimpresion/select`, "Seleccione un papel", true, {}, $('body'));
this.papelPliegoDatatableColumns = [
{ data: 'papelImpresionNombre', searchable: true, sortable: true },
{ data: 'papelImpresionGramaje', searchable: true, sortable: true },
{ data: 'tareasCount', searchable: true, sortable: true },
{ data: 'totalTirada', searchable: false, sortable: false },
{ data: 'pliegosPedido', searchable: false, sortable: false, render: d => `<span class="autonumeric">${d}</span>` },
{ data: 'tiempoReal', searchable: false, sortable: false, render: d => this.formatSeconds(d) },
{
data: 'action', searchable: false, sortable: false, render: (d) => {
return `<button type="button" class="btn btn-primary btn-sm w-100 papel-pliego-btn" data-id="${d.data.papelImpresionId}" data-bs-toggle="button">${d.title}</button>`
}
},
]
this.maquinaSelectFilter = new ClassSelect(
this.tablePlanningRot.find(".planning-maquina-select"),
`/maquinas/select`,
"Seleccione una maquina",
true, {
dropdownCssClass: "h-2"
}, $('body'));
this.papelImpresionFilter = new ClassSelect(this.tablePlanningRot.find(".planning-papel-select"), `/papelesimpresion/select`, "Seleccione un papel", true, {}, $('body'));
this.maquinaSelectFilterPlana = new ClassSelect(this.tablePlanningPlana.find(".planning-maquina-select"), `/maquinas/select`, "Seleccione una maquina", true, {}, $('body'));
this.papelImpresionFilterPlana = new ClassSelect(this.tablePlanningPlana.find(".planning-papel-select"), `/papelesimpresion/select`, "Seleccione un papel", true, {}, $('body'));
this.maquinaSelectFilter.config.dropdownParent = this.item
}
init() {
const autoNumericOptions = {
digitGroupSeparator: ".",
decimalCharacter: ",",
allowDecimalPadding: 'floats',
currencySymbol: '(m)',
currencySymbolPlacement: 's',
decimalPlaces: 2,
unformatOnSubmit: true,
}
const autoNumericPliegosOptions = {
digitGroupSeparator: ".",
decimalCharacter: ",",
allowDecimalPadding: 'floats',
decimalPlaces: 0,
unformatOnSubmit: true,
}
this.totalMetros = new AutoNumeric(this.item.find('#total-metros')[0], autoNumericOptions);
this.totalMetrosSel = new AutoNumeric(this.item.find('#metros-sel-total')[0], autoNumericOptions);
this.totalPliegos = new AutoNumeric(this.item.find('#total-pliegos')[0], autoNumericPliegosOptions);
this.totalPliegosSel = new AutoNumeric(this.item.find('#pliegos-sel-total')[0], autoNumericPliegosOptions);
this.maquinaSelectFilter.init()
this.papelImpresionFilter.init()
this.maquinaSelectFilterPlana.init()
this.papelImpresionFilterPlana.init()
this.checkAllMetros.on('change', () => {
let isChecked = this.checkAllMetros.prop('checked')
this.item.find(".metros-check").prop('checked', isChecked).trigger("change")
})
this.checkAllPliegos.on('change', () => {
let isChecked = this.checkAllPliegos.prop('checked')
this.item.find(".pliegos-check").prop('checked', isChecked).trigger("change")
})
this.papelGramajeTablePlanning.on('click', '.papel-gramaje-btn', this.filterPapelGramaje.bind(this))
this.papelPliegoTablePlanning.on('click', '.papel-pliego-btn', this.filterPapelGramajePlana.bind(this))
this.papelImpresionFilter.onChange(() => {
this.papelImpresionHeader.text(this.papelImpresionFilter.getText())
})
this.papelImpresionFilterPlana.onChange(() => {
this.papelImpresionPlanaHeader.text(this.papelImpresionFilter.getText())
})
this.datatablePlanningRot = this.tablePlanningRot.DataTable({
processing: true,
orderCellsTop: true,
layout: {
topStart: 'info',
topEnd: null,
bottomStart: 'pageLength',
bottomEnd: 'paging'
},
dom: 'lrtip',
serverSide: true,
responsive: true,
pageLength: 10,
@ -75,17 +146,23 @@ class PlanningRotativa {
columns: this.datatableColumns,
ajax: '/produccion/ordentrabajo/planning/rotativa/datatable'
});
this.datatablePlanningPlana = this.tablePlanningPlana.DataTable({
processing: true,
orderCellsTop: true,
dom: 'lrtip',
serverSide: true,
responsive: true,
pageLength: 10,
language: {
url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"
},
columns: this.datatablePlanaColumns,
ajax: '/produccion/ordentrabajo/planning/plana/datatable'
});
this.papelGramajeDatatable = this.papelGramajeTablePlanning.DataTable({
processing: true,
orderCellsTop: true,
layout: {
topStart: 'info',
topEnd: null,
bottomStart: 'pageLength',
bottomEnd: 'paging'
},
dom: 'lrtip',
serverSide: true,
responsive: true,
pageLength: 10,
@ -95,22 +172,58 @@ class PlanningRotativa {
columns: this.papelGramajeDatatableColumns,
ajax: '/produccion/ordentrabajo/planning/papel/datatable'
});
this.item.on("keyup", ".planning-filter", (event) => {
this.papelPliegoDatatable = this.papelPliegoTablePlanning.DataTable({
processing: true,
orderCellsTop: true,
dom: 'lrtip',
serverSide: true,
responsive: true,
pageLength: 10,
language: {
url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"
},
columns: this.papelPliegoDatatableColumns,
ajax: '/produccion/ordentrabajo/planning/papel/plana/datatable'
});
/**
* PLANNING ROTATIVA
*/
this.tablePlanningRot.on("keyup", ".planning-filter", (event) => {
console.log(this.datatablePlanningRot.column($(event.currentTarget).attr("name")))
let columnIndex = this.datatableColumns.findIndex((element) => element.data == $(event.currentTarget).attr("name"))
this.datatablePlanningRot.column(columnIndex).search($(event.currentTarget).val()).draw()
})
this.item.on("change", "#maquina-select-filter", (event) => {
this.tablePlanningRot.on("change", ".planning-maquina-select", (event) => {
let columnIndex = this.datatableColumns.findIndex((element) => element.data == $(event.currentTarget).attr("name"))
this.datatablePlanningRot.column(columnIndex).search(this.maquinaSelectFilter.getText()).draw()
})
this.item.on("change", "#papel-impresion-select-filter", (event) => {
this.tablePlanningRot.on("change", ".planning-papel-select", (event) => {
let columnIndex = this.datatableColumns.findIndex((element) => element.data == $(event.currentTarget).attr("name"))
this.datatablePlanningRot.column(columnIndex).search(this.papelImpresionFilter.getText()).draw()
})
this.papelGramajeDatatable.on('draw', this.addTotalFooter.bind(this))
this.tablePlanningRot.on('change', ".metros-check", this.calcMetrosCheck.bind(this))
/**
* PLANNING PLANA
*/
this.tablePlanningPlana.on("keyup", ".planning-filter", (event) => {
console.log(this.datatablePlanningRot.column($(event.currentTarget).attr("name")))
let columnIndex = this.datatablePlanaColumns.findIndex((element) => element.data == $(event.currentTarget).attr("name"))
this.datatablePlanningPlana.column(columnIndex).search($(event.currentTarget).val()).draw()
})
this.tablePlanningPlana.on("change", ".planning-maquina-select", (event) => {
let columnIndex = this.datatablePlanaColumns.findIndex((element) => element.data == $(event.currentTarget).attr("name"))
this.datatablePlanningPlana.column(columnIndex).search(this.maquinaSelectFilterPlana.getText()).draw()
})
this.tablePlanningPlana.on("change", ".planning-papel-select", (event) => {
let columnIndex = this.datatablePlanaColumns.findIndex((element) => element.data == $(event.currentTarget).attr("name"))
this.datatablePlanningPlana.column(columnIndex).search(this.papelImpresionFilterPlana.getText()).draw()
})
this.papelPliegoDatatable.on('draw', this.addTotalFooterPliego.bind(this))
this.tablePlanningPlana.on('change', ".pliegos-check", this.calcPliegosCheck.bind(this))
}
_renderBtnAction(d) {
return `<a href="/produccion/ordentrabajo/edit/${d.otId}" class="ot-tarea-comment" data-id="${d.otId}"><i class="ti ti-eye"></i></a>`
@ -123,6 +236,10 @@ class PlanningRotativa {
const papelImpresionId = $(event.currentTarget).data('id')
this.getPapelImpresion(papelImpresionId)
}
filterPapelGramajePlana(event) {
const papelImpresionId = $(event.currentTarget).data('id')
this.getPapelImpresionPlana(papelImpresionId)
}
getPapelImpresion(papelImpresionId) {
let ajax = new Ajax('/papelesimpresion/show/' + papelImpresionId,
null,
@ -132,43 +249,74 @@ class PlanningRotativa {
)
ajax.get()
}
getPapelImpresionPlana(papelImpresionId) {
let ajax = new Ajax('/papelesimpresion/show/' + papelImpresionId,
null,
null,
this.getPapelImpresionPlanaSuccess.bind(this),
this.getPapelImpresionPlanaError.bind(this)
)
ajax.get()
}
getPapelImpresionSuccess(response) {
this.papelImpresionFilter.setOption(response.id, response.nombre)
this.tablePlanningRot.find('input[name=gramaje]').val(response.gramaje).trigger("change")
this.papelImpresionHeader.text(response.nombre)
}
getPapelImpresionError(response) { }
getPapelImpresionPlanaSuccess(response) {
this.papelImpresionFilterPlana.setOption(response.id, response.nombre)
this.tablePlanningPlana.find('input[name=gramaje]').val(response.gramaje).trigger("change")
this.papelImpresionPlanaHeader.text(response.nombre)
}
getPapelImpresionPlanaError(response) { }
formatSeconds(s) {
return [parseInt(s / 60 / 60), parseInt(s / 60 % 60)].join(':').replace(/\b(\d)\b/g, '0$1');
}
addTotalFooter() {
const data = this.papelGramajeDatatable.column(5).data().reduce((a, b) => {
let sa = a.split(":")
let ha = parseInt(sa[0]) * 3600
let ma = parseInt(sa[1]) * 60
let sb = b.split(":")
let hb = parseInt(sb[0]) * 3600
let mb = parseInt(sb[1]) * 60
return hb + mb + ha + ma
})
const metros = this.papelGramajeDatatable.column(4).data().reduce((a, b) => {
const seconds = this.papelGramajeDatatable.column(5).data().reduce((a, b) => {
return parseFloat(a) + parseFloat(b)
}, 0)
const metros = this.papelGramajeDatatable.column(4).data().map((e) => parseFloat(e))
$('#total-tiempo-papel').text(this.formatSeconds(seconds))
this.totalMetros.set(metros.reduce((a, b) => a + b, 0))
}
addTotalFooterPliego() {
const seconds = this.papelPliegoDatatable.column(5).data().reduce((a, b) => {
return parseFloat(a) + parseFloat(b)
}, 0)
const pliegos = this.papelPliegoDatatable.column(4).data().map((e) => parseFloat(e))
$('#total-tiempo-pliego').text(this.formatSeconds(seconds))
this.totalPliegos.set(pliegos.reduce((a, b) => a + b, 0))
return a + b
})
$('#total-tiempo-papel').text(this.formatSeconds(data))
$('#total-metros').text(metros)
}
calcMetrosCheck() {
const metros_sel = this.datatablePlanningRot.rows((idx, data, node) => {
return $(node).find('input[type="checkbox"]').prop('checked');
}).data().toArray().reduce((a, b) => {
a = a?.metros ?? 0
b = b?.metros ?? 0
return a + b
}, null)
this.item.find('#metros-sel-total').text(metros_sel)
}).data().toArray().map((e) => parseFloat(e.metros))
this.totalMetrosSel.set(metros_sel.reduce((a, b) => a + b, 0))
}
calcPliegosCheck() {
const metros_sel = this.datatablePlanningPlana.rows((idx, data, node) => {
return $(node).find('input[type="checkbox"]').prop('checked');
}).data().toArray().map((e) => parseInt(e.pliegosPedido))
this.totalPliegosSel.set(metros_sel.reduce((a, b) => a + b, 0))
}
renderCorteImage() {
return `
<a type="button" class="btn btn-outline-secondary bg-white btn-xs change-corte">
<div class="avatar avatar-size-xs">
<img src="/assets/img/cortadora_bobinas.png" alt="Guillotina" width="10px" height="10px">
</div>
</a>
`
}
}