Copiata analisi budget di agricoper in of demo

This commit is contained in:
2023-09-20 15:30:00 +02:00
parent ab5c033f58
commit 7068c58323
3 changed files with 1026 additions and 0 deletions

View File

@@ -0,0 +1,941 @@
import AnalisiBudget from "@gest-lib/analisi_budget/ts/AnalisiBudget";
import {monospace} from "@js/utils";
const {store} = reef;
export interface RetGetAnalisiBudget {
data: Array<Budget>
total: number
}
export interface Budget extends kendo.data.Model {
causale: string
macroclasse?: string
classe?: string
id_bdg?: number
id_row?: number
cod_mart: string
articolo: string
cod_anag: string
rag_soc: string
QtaBdgVend: number
QtaVend: number
saldoBudget: number
QtaPrevAcq: number
QtaConsAcq: number
QtaOrdVendSetC: number
QtaVendSetC: number
QtaOrdVendSetP: number
QtaPrevAcqSetP: number
QtaPrevAcqSetPPremium: number
QtaPrevAcqSetPClas1: number
QtaPrevAcqSetPClas2: number
QtaOrdVendSetPP: number
QtaPrevAcqSetPP: number
QtaPrevAcqSetPPPremium: number
QtaPrevAcqSetPPClas1: number
QtaPrevAcqSetPPClas2: number
unt_mis: string
saldoDisp: number
QtaBdgResiduo: number
QtaPrevResidua: number
valQtaPrevAcqSetPPremium: number
valQtaPrevAcqSetPClas1: number
valQtaPrevAcqSetPClas2: number
valQtaPrevAcqSetPPPremium: number
valQtaPrevAcqSetPPClas1: number
valQtaPrevAcqSetPPClas2: number
}
const LAST_ID_BDG_KEY = "LAST_ID_BDG";
export default class AgricoperAnalisiBudget extends AnalisiBudget {
private readonly store: {
idBdg: string
}
private readonly columns: Array<kendo.ui.GridColumn>
private readonly dataSourceGrid: kendo.data.DataSource
private kendoGrid: kendo.ui.Grid
constructor(selector: string) {
super(selector);
this.store = store({
idBdg: undefined
});
this.columns = _kendo.setDefaultCellOptions([
{
id: "9a8530c1-0f83-4ae2-9db3-9fc8400540b0",
field: "macroclasse",
title: "Macro Variet&agrave;",
type: "string",
hidden: true,
groupHeaderTemplate: data => data.value
},
{
id: "e5a4e4e1-d906-4328-a4c3-fd6970f7d665",
field: "classe",
title: "Variet&agrave;",
type: "string",
hidden: true,
groupHeaderTemplate: data => data.value
},
{
id: "8d6ad373-320f-4154-bac3-fbbe794f1ba2",
field: "causale",
title: "Causale",
type: "string",
hidden: true,
groupHeaderTemplate: data => data.value
},
{
id: "3d838c6f-3fbd-4f5e-8a20-00a79c076614",
field: "id_bdg",
title: "Id",
type: "number",
hidden: true
},
{
id: "48b23529-1033-4e3e-87b8-be470390d844",
field: "id_row",
title: "Id riga",
type: "number",
hidden: true
},
{
id: "8ff16795-45b2-41f2-860a-9884daaa1186",
field: "rag_soc",
title: "Rag. Soc.",
type: "string",
hidden: true,
groupHeaderTemplate: data => data.value
},
{
id: "998f6668-ec77-4cd5-90a4-ce5b147d5444",
field: "cliente",
title: "Cliente",
type: "string",
attributes: {
class: "!k-text-left"
},
filterable: {
extra: false,
operators: {
string: {
contains: "Contiene",
doesnotcontain: "Non contiene"
}
}
},
editable: () => false,
groupHeaderTemplate: data => data.value
},
{
id: "4f4eef39-0e44-4b9a-adfd-c44cc8186b38",
title: `TOTALE VENDITE ${new Date().getFullYear()}`,
columns: [
{
id: "c9eff092-d6d5-4f08-86e4-d3d4b11f9c86",
field: "QtaBdgVend",
title: "Budget<br>Vendite Tot",
type: "number",
attributes: {
class: "!k-text-right cursor-pointer"
},
headerAttributes: {
class: "text-positive"
},
filterable: false,
groupable: false,
editable: ({id_bdg, id_row}) => id_bdg && id_row,
template: (data: Budget) => data.QtaBdgVend && this.numberFormat(data.QtaBdgVend) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaBdgVend}) => QtaBdgVend?.sum && this.numberFormat(QtaBdgVend.sum) || "",
editor: (container, options) => {
$(`<input name=${options.field}>`)
.appendTo(container)
.kendoNumericTextBox({
spinners: false,
selectOnFocus: true
});
}
},
{
id: "eacfe6c1-66ee-4559-a053-a554f716ad0b",
field: "QtaVend",
title: "Qta<br>Vendute",
type: "number",
attributes: {
class: "!k-text-right"
},
headerAttributes: {
class: "text-positive"
},
filterable: false,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaVend && this.numberFormat(data.QtaVend) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaVend}) => QtaVend?.sum && this.numberFormat(QtaVend.sum) || ""
},
{
id: "d6603b73-faa8-4a17-b0b2-8cd9e04d43e1",
field: "saldoBudget",
title: "Saldo<br>Budget",
type: "number",
attributes: {
class: "!k-text-right"
},
headerAttributes: {
class: "text-positive"
},
filterable: false,
groupable: false,
editable: () => false,
template: (data: Budget) => data.saldoBudget && this.numberFormat(data.saldoBudget) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({saldoBudget, saldoDisp}) =>
saldoBudget?.sum &&
this.numberFormat(saldoBudget.sum, saldoDisp?.sum < saldoBudget.sum ? "negative" : "positive") || ""
}
]
},
{
id: "906fe3e1-3147-409a-af66-57c678e6601e",
title: `TOTALI RACCOLTA ${moment().year()}`,
columns: [
{
id: "da8c3af4-4545-4731-8635-7c7472937d03",
field: "QtaPrevAcq",
title: "Qta Racc.<br>Prevista",
type: "number",
attributes: {
class: "!k-text-right"
},
headerAttributes: {
class: "text-negative"
},
filterable: true,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaPrevAcq && this.numberFormat(data.QtaPrevAcq) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaPrevAcq}) => QtaPrevAcq?.sum && this.numberFormat(QtaPrevAcq.sum) || ""
},
{
id: "fdcc5612-148b-4b73-98ef-9173e0697891",
field: "QtaConsAcq",
title: "Qta Gi&agrave;<br>Raccolta",
type: "number",
attributes: {
class: "!k-text-right"
},
headerAttributes: {
class: "text-negative"
},
filterable: false,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaConsAcq && this.numberFormat(data.QtaConsAcq) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaConsAcq}) => QtaConsAcq?.sum && this.numberFormat(QtaConsAcq.sum) || ""
},
{
id: "693988bc-41ab-4b5a-8119-f52470849376",
field: "saldoDisp",
title: "Saldo<br>Disponibile",
type: "number",
attributes: {
class: "!k-text-right"
},
headerAttributes: {
class: "text-negative"
},
filterable: false,
groupable: false,
editable: () => false,
template: (data: Budget) => data.saldoDisp && this.numberFormat(data.saldoDisp) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({saldoDisp, saldoBudget}) =>
saldoDisp?.sum &&
this.numberFormat(saldoDisp.sum, saldoDisp.sum < saldoBudget?.sum ? "negative" : "positive") || ""
}
]
},
{
id: "65499819-8d5a-4ae1-be29-172ee8a9f3f1",
title: `SETTIMANA ${moment().isoWeek()}`,
columns: [
{
id: "bf487217-d482-44a5-91e7-f3bfb4b1041c",
field: "QtaOrdVendSetC",
title: "Qta<br>Budget",
type: "number",
attributes: {
class: "!k-text-right"
},
headerAttributes: {
class: "text-positive"
},
filterable: false,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaOrdVendSetC && this.numberFormat(data.QtaOrdVendSetC) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaOrdVendSetC, QtaVendSetC}) =>
QtaOrdVendSetC?.sum &&
this.numberFormat(QtaOrdVendSetC.sum, QtaOrdVendSetC?.sum < QtaVendSetC.sum ? "negative" : "positive") || ""
},
{
id: "3eac6ed7-a62f-4fe2-bfcc-b0c22fa0133c",
field: "QtaVendSetC",
title: "Qta<br>Vendute",
type: "number",
attributes: {
class: "!k-text-right"
},
headerAttributes: {
class: "text-negative"
},
filterable: false,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaVendSetC && this.numberFormat(data.QtaVendSetC) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaVendSetC, QtaOrdVendSetC}) =>
QtaVendSetC?.sum &&
this.numberFormat(QtaVendSetC.sum, QtaOrdVendSetC?.sum < QtaVendSetC.sum ? "negative" : "positive") || ""
}
]
},
{
id: "9ce8091c-2514-4bd7-9840-c6db56493c39",
title: `SETTIMANA ${moment().isoWeek() + 1}`,
columns: [
{
id: "fa63a08d-02f6-4896-901c-ef60ceb4ef30",
field: "QtaOrdVendSetP",
title: "Budget<br>Vendite",
type: "number",
attributes: {
class: "!k-text-right"
},
headerAttributes: {
class: "text-positive"
},
filterable: false,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaOrdVendSetP && this.numberFormat(data.QtaOrdVendSetP) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaOrdVendSetP, QtaPrevAcqSetP}) =>
QtaOrdVendSetP?.sum &&
this.numberFormat(QtaOrdVendSetP.sum, QtaPrevAcqSetP?.sum < QtaOrdVendSetP.sum ? "negative" : "positive") || ""
},
{
id: "f46bd2de-07a7-4b4d-99b7-03ea4a75fbf7",
field: "QtaPrevAcqSetP",
title: "Qta Racc.<br>Prevista",
type: "number",
attributes: {
class: "!k-text-right"
},
headerAttributes: {
class: "text-negative"
},
filterable: true,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaPrevAcqSetP && this.numberFormat(data.QtaPrevAcqSetP) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaPrevAcqSetP, QtaOrdVendSetP}) =>
QtaPrevAcqSetP?.sum &&
this.numberFormat(QtaPrevAcqSetP.sum, QtaPrevAcqSetP.sum < QtaOrdVendSetP?.sum ? "negative" : "positive") || ""
},
{
id: "7eef5256-c8ad-47a0-9412-edf642d19a47",
field: "QtaPrevAcqSetPPremium",
title: "Qta<br>Premium",
type: "number",
attributes: {
class: "!k-text-center"
},
headerAttributes: {
class: "text-negative"
},
filterable: false,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaPrevAcqSetPPremium
&& this.numberFormat(data.QtaPrevAcqSetPPremium/* , undefined, "", "%"*/) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaPrevAcqSetPPremium}) =>
QtaPrevAcqSetPPremium?.sum &&
this.numberFormat(QtaPrevAcqSetPPremium.sum/* / QtaPrevAcqSetP?.sum * 100, undefined, "", "%"*/) || ""
},
{
id: "8ec1d89f-4230-4150-8bd8-d7e1c3a279e7",
field: "QtaPrevAcqSetPClas1",
title: "Qta<br>Classe 1",
type: "number",
attributes: {
class: "!k-text-center"
},
headerAttributes: {
class: "text-negative"
},
filterable: false,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaPrevAcqSetPClas1
&& this.numberFormat(data.QtaPrevAcqSetPClas1/*, undefined, "", "%"*/) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaPrevAcqSetPClas1}) =>
QtaPrevAcqSetPClas1?.sum &&
this.numberFormat(QtaPrevAcqSetPClas1.sum/*/ QtaPrevAcqSetP?.sum * 100, undefined, "", "%"*/) || ""
},
{
id: "ff5412fb-511f-46e3-9271-71d3956aa399",
field: "QtaPrevAcqSetPClas2",
title: "Qta<br>Classe 2",
type: "number",
attributes: {
class: "!k-text-center"
},
headerAttributes: {
class: "text-negative"
},
filterable: false,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaPrevAcqSetPClas2
&& this.numberFormat(data.QtaPrevAcqSetPClas2/*, undefined, "", "%"*/) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaPrevAcqSetPClas2}) =>
QtaPrevAcqSetPClas2?.sum &&
this.numberFormat(QtaPrevAcqSetPClas2.sum/* / QtaPrevAcqSetP?.sum * 100, undefined, "", "%"*/) || ""
}
]
},
{
id: "53d1b4d0-f56d-4480-8a5b-e767eb148489",
title: `SETTIMANA ${moment().isoWeek() + 2}`,
columns: [
{
id: "8172513d-c6c7-4c14-93e2-d75a0a165801",
field: "QtaOrdVendSetPP",
title: "Budget<br>Vendite",
type: "number",
attributes: {
class: "!k-text-right"
},
headerAttributes: {
class: "text-positive"
},
filterable: false,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaOrdVendSetPP && this.numberFormat(data.QtaOrdVendSetPP) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaOrdVendSetPP, QtaPrevAcqSetPP}) =>
QtaOrdVendSetPP?.sum &&
this.numberFormat(QtaOrdVendSetPP.sum, QtaPrevAcqSetPP?.sum < QtaOrdVendSetPP.sum ? "negative" : "positive") || ""
},
{
id: "04504e29-b3fd-4efa-ba69-844694a2e4ea",
field: "QtaPrevAcqSetPP",
title: "Qta Racc.<br>Prevista",
type: "number",
attributes: {
class: "!k-text-right"
},
headerAttributes: {
class: "text-negative"
},
filterable: true,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaPrevAcqSetPP && this.numberFormat(data.QtaPrevAcqSetPP) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaPrevAcqSetPP, QtaOrdVendSetP}) =>
QtaPrevAcqSetPP?.sum &&
this.numberFormat(QtaPrevAcqSetPP.sum, QtaPrevAcqSetPP.sum < QtaOrdVendSetP?.sum ? "negative" : "positive") || ""
},
{
id: "ac057b8d-e2e5-4db3-8aee-382025569934",
field: "QtaPrevAcqSetPPPremium",
title: "Qta<br>Premium",
type: "number",
attributes: {
class: "!k-text-center"
},
headerAttributes: {
class: "text-negative"
},
filterable: false,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaPrevAcqSetPPPremium
&& this.numberFormat(data.QtaPrevAcqSetPPPremium/*, undefined, "", "%"*/) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaPrevAcqSetPPPremium}) =>
QtaPrevAcqSetPPPremium?.sum &&
this.numberFormat(QtaPrevAcqSetPPPremium.sum/* / QtaPrevAcqSetPP?.sum * 100, undefined, "", "%"*/) || ""
},
{
id: "48d7fc12-83b5-4b3e-aac2-cbb79b37ece0",
field: "QtaPrevAcqSetPPClas1",
title: "Qta<br>Classe 1",
type: "number",
attributes: {
class: "!k-text-center"
},
headerAttributes: {
class: "text-negative"
},
filterable: false,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaPrevAcqSetPPClas1
&& this.numberFormat(data.QtaPrevAcqSetPPClas1/*, undefined, "", "%"*/) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaPrevAcqSetPPClas1}) =>
QtaPrevAcqSetPPClas1?.sum &&
this.numberFormat(QtaPrevAcqSetPPClas1.sum/* / QtaPrevAcqSetPP?.sum * 100, undefined, "", "%"*/) || ""
},
{
id: "ecd5ce01-451e-4158-ad83-c2cd36fa02b8",
field: "QtaPrevAcqSetPPClas2",
title: "Qta<br>Classe 2",
type: "number",
attributes: {
class: "!k-text-center"
},
headerAttributes: {
class: "text-negative"
},
filterable: false,
groupable: false,
editable: () => false,
template: (data: Budget) => data.QtaPrevAcqSetPPClas2
&& this.numberFormat(data.QtaPrevAcqSetPPClas2/*, undefined, "", "%"*/) || "",
aggregates: ["sum"],
groupHeaderColumnTemplate: ({QtaPrevAcqSetPPClas2}) =>
QtaPrevAcqSetPPClas2?.sum &&
this.numberFormat(QtaPrevAcqSetPPClas2.sum/* / QtaPrevAcqSetPP?.sum * 100, undefined, "", "%"*/) || ""
}
]
},
// {
// id: "f015525c-9800-4bac-909d-9dd0baa30667",
// title: `SETTIMANE FUTURE`,
// columns: [
// {
// id: "65089b9a-cf16-4c79-b996-96588696028f",
// field: "QtaBdgResiduo",
// title: "Bdg. Vend.<br>Residuo",
// type: "number",
// attributes: {
// class: "!k-text-right"
// },
// headerAttributes: {
// class: "text-positive"
// },
// filterable: false,
// groupable: false,
// editable: () => false,
// template: (data: Budget) => data.QtaBdgResiduo && this.numberFormat(data.QtaBdgResiduo) || "",
// aggregates: ["sum"],
// groupHeaderColumnTemplate: ({QtaBdgResiduo, QtaPrevResidua}) =>
// QtaBdgResiduo?.sum &&
// this.numberFormat(QtaBdgResiduo.sum, QtaPrevResidua?.sum < QtaBdgResiduo.sum ? "negative" : "positive") || ""
// },
// {
// id: "7b44f0f1-40e5-4d87-b928-860c996c8df6",
// field: "QtaPrevResidua",
// title: "Qta Da<br>Raccogliere<br>Residua",
// type: "number",
// attributes: {
// class: "!k-text-right"
// },
// headerAttributes: {
// class: "text-negative"
// },
// filterable: false,
// groupable: false,
// editable: () => false,
// template: (data: Budget) => data.QtaPrevResidua && this.numberFormat(data.QtaPrevResidua) || "",
// aggregates: ["sum"],
// groupHeaderColumnTemplate: ({QtaPrevResidua, QtaBdgResiduo}) =>
// QtaPrevResidua?.sum &&
// this.numberFormat(QtaPrevResidua.sum, QtaPrevResidua.sum < QtaBdgResiduo?.sum ? "negative" : "positive") || ""
// }
// ]
// }
]);
const aggregates = [
{field: "QtaBdgVend", aggregate: "sum"},
{field: "QtaVend", aggregate: "sum"},
{field: "saldoBudget", aggregate: "sum"},
{field: "QtaPrevAcq", aggregate: "sum"},
{field: "QtaConsAcq", aggregate: "sum"},
{field: "saldoDisp", aggregate: "sum"},
{field: "QtaOrdVendSetP", aggregate: "sum"},
{field: "QtaPrevAcqSetP", aggregate: "sum"},
{field: "QtaOrdVendSetPP", aggregate: "sum"},
{field: "QtaPrevAcqSetPP", aggregate: "sum"},
{field: "QtaPrevAcqSetPPremium", aggregate: "sum"},
{field: "QtaPrevAcqSetPClas1", aggregate: "sum"},
{field: "QtaPrevAcqSetPClas2", aggregate: "sum"},
{field: "QtaPrevAcqSetPPPremium", aggregate: "sum"},
{field: "QtaPrevAcqSetPPClas1", aggregate: "sum"},
{field: "QtaPrevAcqSetPPClas2", aggregate: "sum"},
{field: "qtaBdgResiduo", aggregate: "sum"},
{field: "qtaPrevResidua", aggregate: "sum"},
{field: "QtaOrdVendSetC", aggregate: "sum"},
{field: "QtaVendSetC", aggregate: "sum"},
];
this.dataSourceGrid = new kendo.data.DataSource({
transport: {
read: async (options) => {
_kendo.checkFilterValuesColumns(
options.data.filter,
this.columns
);
try {
const data = await this.getAnalisiBudget({
idBdg: this.store.idBdg,
...options.data,
filter: {
filters: [
...options.data.filter?.filters || []
],
logic: "and"
}
});
options.success(data);
} catch (e) {
console.error(e.message);
options.success([]);
}
},
update: async (options) => {
try {
options.success(await this.updateAnalisiBudget(options.data));
} catch (e) {
console.error(e.message);
options.error(e);
}
}
},
batch: true,
schema: {
data: "data",
total: "total",
model: {
id: "row_number",
fields: {
row_number: {type: "number"},
causale: {type: "string"},
macroclasse: {type: "string"},
classe: {type: "string"},
id_bdg: {type: "number"},
id_row: {type: "number"},
cod_mart: {type: "string"},
articolo: {type: "string"},
cod_anag: {type: "string"},
rag_soc: {type: "string"},
QtaBdgVend: {type: "number"},
QtaVend: {type: "number"},
saldoBudget: {type: "number"},
QtaPrevAcq: {type: "number"},
QtaConsAcq: {type: "number"},
QtaOrdVendSetC: {type: "number"},
QtaVendSetC: {type: "number"},
saldoDisp: {type: "number"},
QtaOrdVendSetP: {type: "number"},
QtaPrevAcqSetP: {type: "number"},
QtaPrevAcqSetPPremium: {type: "number"},
QtaPrevAcqSetPClas1: {type: "number"},
QtaPrevAcqSetPClas2: {type: "number"},
QtaOrdVendSetPP: {type: "number"},
QtaPrevAcqSetPP: {type: "number"},
QtaPrevAcqSetPPPremium: {type: "number"},
QtaPrevAcqSetPPClas1: {type: "number"},
QtaPrevAcqSetPPClas2: {type: "number"},
QtaBdgResiduo: {type: "number"},
QtaPrevResidua: {type: "number"}
}
}
},
sort: [
{
field: "macroclasse",
dir: "asc"
},
{
field: "classe",
dir: "asc"
},
{
field: "causale",
dir: "asc"
},
{
field: "rag_soc",
dir: "asc"
}
],
group: [
{
field: "macroclasse",
aggregates
},
{
field: "classe",
aggregates
},
{
field: "causale",
aggregates
}
],
serverPaging: false,
serverFiltering: false,
serverSorting: false
});
}
async content(): Promise<string> {
// language=HTML
return `
<div class="row mx-0">
<div class="col-xs-12 col-lg-4 col-lg-offset-4 mb-10"
style="display: flex; gap: 3px;">
<div id="budgetSelector"></div>
${this.module.get_dataSource("canEditBudgets") &&
`<a href="gestione_budget.php" target="_blank"
class="k-button k-button-link"
style="width: 27%">
<i class="k-icon k-i-edit k-button-icon"></i>
<span class="k-button-text">
Crea/Modifica
</span>
</a>` || ""
}
</div>
</div>
<div id="contextMenuTableAnalisiBudget"></div>
<div id="tableAnalisiBudget"></div>
`;
}
numberFormat(number: number, type: "positive" | "negative" | undefined = undefined, prefix = "", postfix = "") {
const html = monospace(number_format_datatable(prefix, postfix, 0, "'").display(number));
return type && `<span class="text-${type}">${html}</span>` || html;
}
async onLoad() {
await super.onLoad();
// this.$container.parents("#content").find("div").css("max-height", "88vh");
let elementsSet = false;
document.addEventListener("reef:store", async () => {
if (this.store.idBdg && !elementsSet) {
elementsSet = true;
const groupsOpen = {};
const rowGroupKey = (row: JQuery, grid: kendo.ui.Grid) => {
const next = row.nextUntil("[data-uid]").next(),
item = grid.dataItem(next.length ? next : row.next()),
groupIdx = row.children(".k-group-cell").length,
field = grid.dataSource.group()[groupIdx].field,
groupValue = item[field];
return "" + groupIdx + groupValue;
};
this.kendoGrid = await _kendo.savableTable(this.$container.find("#tableAnalisiBudget"), "ANALISI_BUDGET", {
columns: this.columns,
dataSource: this.dataSourceGrid,
filterable: {
mode: "menu"
},
sortable: {
mode: "mixed"
},
pageable: false,
reorderable: true,
resizable: true,
groupable: true,
// height: "84vh",
scrollable: false,
editable: true,
toolbar: [
{
// language=HTML
template: `
<button type="button"
class="k-button k-button-md k-rounded-md k-button-solid k-button-solid-base"
id="saveChanges">
<span class="k-icon k-i-check k-button-icon"></span>
<span class="k-button-text">Salva modifiche</span>
</button>
<button type="button"
class="k-button k-button-md k-rounded-md k-button-solid k-button-solid-base ml-8"
id="cancelChanges">
<span class="k-icon k-i-cancel k-button-icon"></span>
<span class="k-button-text">Annulla modifiche</span>
</button>
`
}
],
dataBound: (e) => {
$(".k-grouping-row").each(function () {
const groupKey = rowGroupKey($(this), e.sender);
if (!groupsOpen[groupKey]) {
e.sender.collapseGroup(this);
}
});
},
save: (e) => {
const budget = e.model as Budget;
if (e.values?.QtaBdgVend || e.values?.QtaVend) {
e.model.set("saldoBudget",
(e.values?.QtaBdgVend || budget.QtaBdgVend) - (e.values?.QtaVend || budget.QtaVend)
);
}
if (e.values?.QtaPrevAcq || e.values?.QtaConsAcq) {
e.model.set("saldoDisp",
(e.values?.QtaPrevAcq || budget.QtaPrevAcq) - (e.values?.QtaConsAcq || budget.QtaConsAcq)
);
}
if (e.values?.QtaOrdVendSetP || e.values?.QtaOrdVendSetPP) {
e.model.set("QtaBdgResiduo",
budget.saldoBudget - (e.values?.QtaOrdVendSetP || budget.QtaOrdVendSetP) - (e.values?.QtaOrdVendSetPP || budget.QtaOrdVendSetPP)
);
}
if (e.values?.QtaPrevAcqSetP || e.values?.QtaPrevAcqSetPP) {
e.model.set("QtaPrevResidua",
budget.saldoDisp - (e.values?.QtaPrevAcqSetP || budget.QtaPrevAcqSetP) - (e.values?.QtaPrevAcqSetPP || budget.QtaPrevAcqSetPP)
);
}
}
});
this.kendoGrid.element.find(".k-grid-toolbar").first().addClass("k-grid-toolbar-sticky").css("border-width", "1px");
this.kendoGrid.element.find(".k-grouping-header").first().css("border-width", "0px 1px 1px 1px");
this.kendoGrid.element.find(".k-grid-header").first().addClass("k-grid-header-sticky");
this.kendoGrid.element.find(".k-grid-table").css("border-width", "0 1px 1px");
$("#saveChanges").on("click", () => {
this.kendoGrid.saveChanges();
});
$("#cancelChanges").on("click", () => {
this.kendoGrid.cancelChanges();
});
this.kendoGrid.table.on("click", ".k-grouping-row .k-i-caret-alt-right, .k-grouping-row .k-i-caret-alt-down", e => {
const row = $(e.target).closest("tr"),
groupKey = rowGroupKey(row, this.kendoGrid);
groupsOpen[groupKey] = $(e.target).hasClass("k-i-caret-alt-down");
});
} else {
this.dataSourceGrid.read();
}
});
$("#budgetSelector").kendoDropDownList({
filter: "contains",
dataTextField: "descrizione",
dataValueField: "id_bdg",
optionLabel: "Seleziona il budget da caricare",
dataBound: (e) => {
e.sender.list.find(".k-list-optionlabel").hide();
if (this.store.idBdg) {
e.sender.value(this.store.idBdg);
}
},
dataSource: {
serverFiltering: true,
sort: {
field: "descrizione",
dir: "asc"
},
transport: {
read: async (options) => {
try {
const ret = await this.ajax()
.get("getBudgets")
.data({
...options.data
})
.noticeAsToast()
.execute();
const savedIdBdg = localStorage.getItem(LAST_ID_BDG_KEY) || undefined;
if (savedIdBdg && (ret?.returnData as Array<{
id_bdg
}>).map(bdg => bdg.id_bdg).find(idBdg => idBdg.toString() === savedIdBdg)) {
this.store.idBdg = savedIdBdg;
}
options.success(ret?.returnData);
} catch (e) {
console.error(e.message);
options.error(e);
}
}
}
},
select: async (e) => {
this.store.idBdg = e.dataItem.id_bdg;
if (this.store.idBdg) {
localStorage.setItem(LAST_ID_BDG_KEY, this.store.idBdg);
} else {
localStorage.removeItem(LAST_ID_BDG_KEY);
}
}
});
}
async getAnalisiBudget(data: object) {
const ret = await this.ajax()
.get("getAnalisiBudget")
.data(data)
.noticeAsModal()
.execute();
return ret?.returnData as RetGetAnalisiBudget;
}
async updateAnalisiBudget(budget: Budget) {
const ret = await this.ajax()
.post("updateAnalisiBudget")
.data({budget})
.noticeAsModal()
.execute();
return ret?.returnId === 1;
}
}

View File

@@ -0,0 +1,50 @@
<?php
class AnalisiBudgetOfdemo extends AnalisiBudget {
public static function getAnalisiBudget($data) {
$idBdg = array_get($data, "idBdg");
if (is_null($idBdg)) {
$ret = new Ret();
return $ret->set_error("Id budget da caricare non fornito.");
}
$query = KendoService::queryInitializerService(
$data,
ROOT . DIRECTORY_SEPARATOR . Azienda::getPathHomeCurrentModulo() . "get-analisi-budget.sql",
"macroclasse, classe, causale, rag_soc"
);
$query->setVar("idBdg", $idBdg);
$ret = $query->toRet()->execute();
if ($ret->is_OK()) {
$budget = from($ret->get_data())
->select(function ($row) {
$row["saldoBudget"] = $row["QtaBdgVend"] - $row["QtaVend"];
$row["saldoDisp"] = $row["QtaPrevAcq"] - $row["QtaConsAcq"];
$row["QtaBdgResiduo"] = $row["saldoBudget"] - $row["QtaOrdVendSetP"] - $row["QtaOrdVendSetP"];
$row["QtaPrevResidua"] = $row["saldoDisp"] - $row["QtaPrevAcqSetP"] - $row["QtaPrevAcqSetP"];
$row["valQtaPrevAcqSetPPremium"] = ($row["causale"] == "Acquisti" ? $row["QtaPrevAcqSetP"] : $row["QtaOrdVendSetP"]) * $row["QtaPrevAcqSetPPremium"] / 100;
$row["valQtaPrevAcqSetPClas1"] = ($row["causale"] == "Acquisti" ? $row["QtaPrevAcqSetP"] : $row["QtaOrdVendSetP"]) * $row["QtaPrevAcqSetPClas1"] / 100;
$row["valQtaPrevAcqSetPClas2"] = ($row["causale"] == "Acquisti" ? $row["QtaPrevAcqSetP"] : $row["QtaOrdVendSetP"]) * $row["QtaPrevAcqSetPClas2"] / 100;
$row["valQtaPrevAcqSetPPPremium"] = ($row["causale"] == "Acquisti" ? $row["QtaPrevAcqSetPP"] : $row["QtaOrdVendSetPP"]) * $row["QtaPrevAcqSetPPPremium"] / 100;
$row["valQtaPrevAcqSetPPClas1"] = ($row["causale"] == "Acquisti" ? $row["QtaPrevAcqSetPP"] : $row["QtaOrdVendSetPP"]) * $row["QtaPrevAcqSetPPClas1"] / 100;
$row["valQtaPrevAcqSetPPClas2"] = ($row["causale"] == "Acquisti" ? $row["QtaPrevAcqSetPP"] : $row["QtaOrdVendSetPP"]) * $row["QtaPrevAcqSetPPClas2"] / 100;
return $row;
})
->toArray();
$firstRow = reset($budget);
$ret->set_data(array(
"data" => $budget,
"total" => array_get($firstRow, "rows_count", 0)
));
}
return $ret;
}
}

View File

@@ -0,0 +1,35 @@
SELECT causale,
macroclasse,
classe,
vb.id_bdg,
vb.id_row,
gab.cod_mart,
articolo,
gab.cod_anag,
rag_soc,
cod_anag + ' - ' + rag_soc AS cliente,
QtaBdgVend,
QtaVend,
QtaPrevAcq,
QtaConsAcq,
QtaOrdVendSetC,
QtaVendSetC,
QtaOrdVendSetP,
QtaPrevAcqSetP,
QtaPrevAcqSetPPremium,
QtaPrevAcqSetPClas1,
QtaPrevAcqSetPClas2,
QtaOrdVendSetPP,
QtaPrevAcqSetPP,
QtaPrevAcqSetPPPremium,
QtaPrevAcqSetPPClas1,
QtaPrevAcqSetPPClas2,
unt_mis
FROM GetAnalisiBudget([idBdg]) gab
OUTER APPLY (SELECT id_bdg, id_row
FROM vtb_bdgr
WHERE vtb_bdgr.id_bdg = [idBdg]
AND vtb_bdgr.cod_anag = gab.cod_anag
AND vtb_bdgr.cod_mart = gab.cod_mart) AS vb
where macroclasse is not null
-- ORDER BY macroclasse, classe, causale, rag_soc