Nuova gestione chiusura tagli prezzo

This commit is contained in:
2024-02-08 09:43:50 +01:00
parent 9cbf5be8da
commit 154d93dda8
14 changed files with 609 additions and 2 deletions

View File

@@ -0,0 +1,32 @@
<?php
session_start();
include "functions.php";
require_once "include_login.php";
include "config.php";
include "include/module.php";
include Controller::current_mainClasspath();
(new ChiusuraTagliPrezzoAjax())->checkAjaxRequests();
?>
<!DOCTYPE html>
<!--html manifest="manifest.appcache"-->
<html lang="it">
<head>
<?php include pvm_tagHead; ?>
</head>
<body>
<?php include pvm_headerNavbar; ?>
<?php include pvm_splashScreen; ?>
<div id="content">
<div><?php
include pvm_navTab;
if (!PVM\CurrentModule::isAuthorizedToCurrentUser()) {
include pvm_unauthorized;
} else {
include Controller::current_gestpath_mainPage();
} ?>
</div>
</div>
<?php include pvm_footerMinimal; ?>
</body>
</html>

View File

@@ -2275,5 +2275,18 @@
"kendo"
],
"requirePermission": true
},
"chiusura_tagli_prezzo": {
"title": "Chiusura Tagli Prezzo",
"pages": "chiusura_tagli_prezzo.php",
"position": [],
"children": [],
"icon": "icon.png",
"libs": [
"std-pkg",
"flexbox",
"kendo"
],
"requirePermission": true
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,61 @@
<?php
class ChiusuraTagliPrezzo {
public static function _moduleDatasource($filter) {
$Ret = new Ret;
if ($Ret->is_OK()) {
$retData = array(
array("id" => "name", "data" => array()),
);
$Ret->set_data($retData);
}
return $Ret;
}
public static function getPromozioni($data) {
$dataVal = array_get($data, "dataVal");
if (is_null($dataVal)) {
return Ret::errorCode(ErrorHandler::MISSING_PARAMS, "getPromozioni");
}
$query = KendoService::queryInitializerService($data, "get-promozioni", "1, 2", false, false);
$query->setDateVar("dataVal", $dataVal);
$ret = $query->toRet()->execute();
if ($ret->is_OK()) {
$promozioni = $ret->get_data();
$ret->set_data(array(
"data" => $promozioni,
"total" => array_get($promozioni, "0.rows_count")
));
}
return $ret;
}
public static function updateListiniVend($data) {
$promozioni = array_get($data, "promozioni");
$promozioni = array_map(function ($promozione) {
return EntityItem::fromArray($promozione);
}, $promozioni);
$entityList = new EntityList();
foreach ($promozioni as $promozione) {
$entityList->push($promozione);
}
$imsApi = new IMSApi();
$imsApi
->post("listini-vendita/update")
->body($entityList);
return $imsApi->send();
}
}

View File

@@ -0,0 +1,10 @@
<?php
class ChiusuraTagliPrezzoAjax extends Ajax {
protected function checkCustomRequests() {
if (self::get("popup-sample")) {
$data = Utility::sanitizeB64JSON_parse($_GET["popup-sample"]);
include "popup-sample.php";
}
}
}

View File

@@ -0,0 +1 @@
/*# sourceMappingURL=main.css.map */

Binary file not shown.

View File

@@ -0,0 +1,3 @@
<?php ?>
<div id="app">Caricamento...</div>

View File

@@ -0,0 +1,11 @@
<?php
$Ret = new Ret;
if ($Ret->is_OK()) {
ob_start();
$html = Utility\Str::remove_multiple_spaces(@ob_get_clean());
$Ret->set_string($html);
}
$Ret->display();

View File

@@ -0,0 +1,98 @@
WITH art AS (SELECT cod_mart, cod_mart AS cod_mart_mov, descrizione
FROM carelli.dbo.mtb_aart
WHERE articolo_composto = 'N'
UNION ALL
SELECT mtb_aart.cod_mart, mtb_comp.cod_comp AS cod_Mart_mov, descrizione
FROM carelli.dbo.mtb_aart
INNER JOIN carelli.dbo.mtb_comp ON mtb_aart.cod_mart = mtb_comp.cod_mart
WHERE articolo_composto = 'S'),
ordini AS (SELECT dtb_ordr.cod_mart,
t.data_ord,
t.num_ord,
listino,
data_esportazione,
t.serie,
t.cod_mdep
FROM carelli.dbo.dtb_ordt t
INNER JOIN carelli.dbo.dtb_ordr ON
t.data_ord = dtb_ordr.data_ord AND
t.num_ord = dtb_ordr.num_ord AND
t.gestione = dtb_ordr.gestione
WHERE CAST(t.data_esportazione AS DATE) = DATEADD(DAY, -1, CAST(GETDATE() AS DATE))
AND flag_annulla <> 'S'
UNION ALL
SELECT dtb_ordr.cod_mart,
t.data_ord,
t.num_ord,
listino,
data_esportazione,
t.serie,
t.cod_mdep
FROM panimal.dbo.dtb_ordt t
INNER JOIN panimal.dbo.dtb_ordr ON
t.data_ord = dtb_ordr.data_ord AND
t.num_ord = dtb_ordr.num_ord AND
t.gestione = dtb_ordr.gestione
WHERE CAST(t.data_esportazione AS DATE) = DATEADD(DAY, -1, CAST(GETDATE() AS DATE))
AND flag_annulla <> 'S'
UNION ALL
SELECT dtb_ordr.cod_mart,
t.data_ord,
t.num_ord,
listino,
data_esportazione,
t.serie,
t.cod_mdep
FROM gestfood.dbo.dtb_ordt t
INNER JOIN gestfood.dbo.dtb_ordr ON
t.data_ord = dtb_ordr.data_ord AND
t.num_ord = dtb_ordr.num_ord AND
t.gestione = dtb_ordr.gestione
WHERE CAST(t.data_esportazione AS DATE) = DATEADD(DAY, -1, CAST(GETDATE() AS DATE))
AND flag_annulla <> 'S'),
tmp_ord AS (SELECT art.cod_mart,
art.descrizione,
cod_mart_mov,
ordini.data_ord,
ordini.num_ord,
ordini.listino,
ordini.data_esportazione,
CAST(IIF(ordini.serie = 'SU', 1, 0) AS BIT) AS sudd,
mtb_depo.cod_vlis
FROM ordini
INNER JOIN art ON ordini.cod_mart = art.cod_mart
INNER JOIN mtb_depo ON ordini.cod_mdep = mtb_depo.cod_mdep),
TempResult AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_number,
*
FROM (SELECT DISTINCT promo.cod_vlis + '-' + promo.cod_mart AS id,
promo.cod_vlis,
promo.descrizione,
promo.cod_mart,
mtb_aart.descrizione AS articolo,
data_iniz,
data_fine,
cod_promo,
promo.note,
aggiornato_da,
prz_vend_iva,
ordini.sudd,
CAST(IIF(ordini.data_ord IS NOT NULL, 1, 0) AS BIT) AS flag_riass
FROM dbo.getPromozioneVendita('[dataVal]', '[dataVal]', NULL, NULL, NULL) promo
INNER JOIN mtb_aart ON promo.cod_marT = mtb_aart.cod_mart
LEFT OUTER JOIN tmp_ord ordini ON promo.cod_vlis = ordini.cod_vlis AND
promo.cod_mart = ordini.cod_mart AND
ordini.data_ord BETWEEN promo.data_iniz AND promo.data_fine) t
WHERE [filter]),
TempCount AS (SELECT COUNT(*) AS rows_count
FROM TempResult)
SELECT TempResult.*,
TempCount.*
FROM TempResult,
TempCount
ORDER BY [orderBy]

View File

@@ -0,0 +1,373 @@
import ViewModule from "@js/modules/ViewModule.js";
import mapKeys from "lodash-es/mapKeys.js";
import camelCase from "lodash-es/camelCase.js";
export class Promozione extends kendo.data.Model.define({
id: "id",
fields: {
id: {type: "string"},
cod_vlis: {type: "string"},
descrizione: {type: "string"},
cod_mart: {type: "string"},
articolo: {type: "string"},
data_iniz: {type: "date"},
data_fine: {type: "date"},
cod_promo: {type: "string"},
note: {type: "string"},
aggiornato_da: {type: "string"},
prz_vend_iva: {type: "number"},
sudd: {type: "boolean"},
flag_riass: {type: "boolean"},
}
}) {
id_ord: string
cod_vlis: string
descrizione: string
cod_mart: string
articolo: string
data_iniz: Date
data_fine: Date
cod_promo: string
note: string
aggiornato_da: string
prz_vend_iva: number
sudd: boolean
flag_riass: boolean
type = "mtb_lisv_data"
}
export default class ChiusuraTagliPrezzo extends ViewModule {
private dataVal: kendo.ui.DatePicker
private checkboxRiass: kendo.ui.CheckBox
private checkboxMiePromo: kendo.ui.CheckBox
private readonly columnsPromozioni: Array<kendo.ui.GridColumn>
private readonly dataSourcePromozioni: kendo.data.DataSource
private tablePromozioni: kendo.ui.Grid
constructor(selector: string | null) {
super(selector);
this.columnsPromozioni = _kendo.setDefaultCellOptions([
{
id: "c0f8bf55-9744-4bdd-a4f0-8db3066e88a7",
field: "cod_mart",
title: "Cod. Art.",
type: "string",
filterable: {
operators: {
string: {
contains: "Contiene",
doesnotcontain: "Non contiene"
}
}
},
},
{
id: "f7d7626e-73c8-4d4b-818d-f7dd81c49827",
field: "articolo",
title: "Articolo",
type: "string",
filterable: {
operators: {
string: {
contains: "Contiene",
doesnotcontain: "Non contiene"
}
}
},
},
{
id: "eb844518-e289-4a0f-9d34-fed9ad7e17fd",
field: "cod_vlis",
title: "Listino",
type: "string",
filterable: {
operators: {
string: {
contains: "Contiene",
doesnotcontain: "Non contiene"
}
}
},
},
{
id: "5e817e11-901a-4a4c-9263-1fdadcadcc78",
field: "descrizione",
title: "Descrizione",
type: "string",
filterable: {
operators: {
string: {
contains: "Contiene",
doesnotcontain: "Non contiene"
}
}
},
},
{
id: "b01bedb3-2ac4-4c15-b1be-3f108a772015",
field: "data_iniz",
title: "Data Inizio",
type: "date",
format: "{0:dd/MM/yyyy}",
},
{
id: "9256ed35-434d-4ee6-9e2f-9b4f1c2a00ab",
field: "data_fine",
title: "Data Fine",
type: "date",
format: "{0:dd/MM/yyyy}"
},
{
id: "dd73e45b-31ff-480a-a61a-f6887ef2cad7",
field: "cod_promo",
title: "Cod. Promo",
type: "string"
},
{
id: "0cc0e1d6-f57e-44f9-a11a-ecfe2bcbe94f",
field: "note",
title: "Note",
type: "string"
},
{
id: "0ad4f5a1-b9e6-4a41-bcb1-a785a0141b12",
field: "sudd",
title: "Suddivisione",
type: "boolean",
template: ({sudd}) => `<i class="fas fa-${sudd && "check" || "times"}"></i>`
}
]);
this.dataSourcePromozioni = new kendo.data.DataSource({
transport: {
read: async (options) => {
_kendo.checkFilterValuesColumns(
options.data.filter,
this.columnsPromozioni
);
try {
const data = await this.getPromozioni({
dataVal: this.dataVal.value(),
...options.data,
filter: {
filters: [
...options.data.filter?.filters || [],
...this.checkboxRiass.check() && [{
field: "flag_riass",
operator: "eq",
value: true
}] || [],
...this.checkboxMiePromo.check() && [{
field: "aggiornato_da",
operator: "contains",
value: _USER.username
}] || []
],
logic: "and"
}
});
options.success(data);
} catch (e) {
options.error(e);
}
}
},
schema: {
data: "data",
total: "total",
model: Promozione
},
// sort: {
// field: "cod_vlis",
// dir: "desc"
// },
serverPaging: false,
serverFiltering: true,
serverSorting: false
});
}
async content(): Promise<string> {
// language=HTML
return `
<aside class="flex gaps mb-10 align-center">
<input type="text" id="dataVal" style="width: 10%">
<div>
<input type="checkbox" id="filterRiass" class="mt-0">
</div>
<div>
<input type="checkbox" id="filterMiePromo" class="mt-0">
</div>
</aside>
<div id="tablePromozioni"></div>
`;
}
name(): string {
return "chiusura_tagli_prezzo";
}
async onLoad(hideSplashScreen = true): Promise<void> {
await super.onLoad(hideSplashScreen);
this.dataVal = this.$container.find("#dataVal").kendoDatePicker({
dateInput: true,
value: new Date(),
label: "Data Validità",
change: () => {
this.dataSourcePromozioni.read();
}
}).data("kendoDatePicker");
this.checkboxRiass = this.$container.find("#filterRiass").kendoCheckBox({
label: "Solo articoli riassortiti",
change: () => {
this.dataSourcePromozioni.read();
}
}).data("kendoCheckBox");
this.checkboxMiePromo = this.$container.find("#filterMiePromo").kendoCheckBox({
label: "Visualizza mie promo",
change: () => {
this.dataSourcePromozioni.read();
}
}).data("kendoCheckBox");
this.tablePromozioni = await _kendo.savableTable(this.$container.find("#tablePromozioni"), "PROMOZIONI", {
columns: this.columnsPromozioni,
dataSource: this.dataSourcePromozioni,
filterable: {
mode: "menu"
},
pageable: false,
selectable: "multiple, row",
contextMenu: {
body: [
{
name: "ChiusuraAnticipata",
text: "Chiusura Anticipata",
icon: "- fas fa-trash",
command: "ChiusuraAnticipata"
}
],
open: (e) => {
const selectedRows = this.tablePromozioni.select();
const targetTr = $(e.target).parents("tr").get(0);
if (!selectedRows.toArray().some(selectedRow => selectedRow === targetTr)) {
this.tablePromozioni.clearSelection();
this.tablePromozioni.select(targetTr);
}
}
}
}, {autoBind: !!this.dataVal.value()});
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
kendo.ui.grid.commands["ChiusuraAnticipata"] = kendo.ui.grid.GridCommand.extend({
exec: async () => {
const selectedRows = this.tablePromozioni.select();
let promozioni = selectedRows
.map((i, row) => this.tablePromozioni.dataItem(row).toJSON() as Promozione)
.toArray();
const {dataFine, confirmed} = await this.askDataFinePromo();
console.log(dataFine, confirmed);
if (confirmed) {
promozioni = promozioni
.map(promozione => (promozione.data_fine = dataFine.toDate(), mapKeys(promozione, (v, key) => camelCase(key))));
if (await this.updateListiniVend(promozioni)) {
await this.dataSourcePromozioni.read();
}
}
}
});
}
async getPromozioni(data: object = null) {
const ret = await this.ajax()
.get("getPromozioni")
.data(data)
.noticeAsModal()
.execute();
return ret?.returnData as {
data: Array<Promozione>
total: number
};
}
async askDataFinePromo(): Promise<{ dataFine: moment.Moment, confirmed: boolean }> {
// language=HTML
return await new ModalBox()
.content(`
<div id="dataFine"></div>
`)
.onBeforeShow(($div) => {
const $okBtn = $div.find(".modal-btn-ok");
$okBtn.disabled(true);
const today = moment().startOf("day");
const yesterday = today.clone().subtract(1, "day").startOf("day");
$div.find("#dataFine").kendoDropDownList({
dataTextField: "text",
dataValueField: "value",
optionLabel: {
text: "Data di chiusura",
value: null
},
dataSource: [
{
text: `Ieri - ${yesterday.format("DD/MM/YYYY")}`,
value: yesterday
},
{
text: `Oggi - ${today.format("DD/MM/YYYY")}`,
value: today
}
],
dataBound: (e) => e.sender.list.find(".k-list-optionlabel").hide(),
select: (e) => $okBtn.disabled(!e.dataItem.value)
} as kendo.ui.DropDownListOptions);
})
.btOK({
text: "Conferma",
dismissOnClick: true,
onClick(e, $bt, $div) {
return {
dataFine: $div.find("#dataFine").val(),
confirmed: true
};
}
})
.gridSize({
xs: 12,
md: 4
})
.okCancel()
.title("Seleziona la data di chiusura")
.show();
}
async updateListiniVend(data: Promozione[]) {
const ret = await this.ajax()
.post("updateListiniVend")
.data({
promozioni: data
})
.noticeAsModal()
.waitModal()
.execute();
return ret?.returnId === 1;
}
}

View File

@@ -0,0 +1,5 @@
import ChiusuraTagliPrezzo from "./ChiusuraTagliPrezzo.js";
$(function () {
new ChiusuraTagliPrezzo("#app");
});

View File

@@ -105,7 +105,7 @@ input {
}
}
&[type="checkbox"] {
&[type="checkbox"]:not(.k-checkbox) {
border: none;
outline: none;
}