From 1ea37eb49d1de2cbf8d0110eb61e6abcec672c01 Mon Sep 17 00:00:00 2001 From: allebonvi Date: Mon, 6 Jul 2026 18:16:17 +0200 Subject: [PATCH] Aggiungi diagnostica celle con multiple UDC --- diagnostica.py | 127 +++++++++++++++++++++++++++++++++--------------- locale.json | 6 +++ version_info.py | 2 +- 3 files changed, 95 insertions(+), 40 deletions(-) diff --git a/diagnostica.py b/diagnostica.py index f8d6b84..b7ae059 100644 --- a/diagnostica.py +++ b/diagnostica.py @@ -43,6 +43,49 @@ WHERE chiuse.StatoDocumento = 'D' ORDER BY NomeSimbolicoCella, UDC; """ +SQL_MULTIPLE_UDC_BY_CELL = """ +WITH celle_multiple AS ( + SELECT + g.IDCella + FROM dbo.XMag_GiacenzaPallet AS g + WHERE g.IDCella NOT IN (1000, 9999) + GROUP BY g.IDCella + HAVING COUNT(DISTINCT LTRIM(RTRIM(g.BarcodePallet))) > 1 +) +SELECT + CONCAT( + RTRIM(c.Corsia), + ' - ', + RTRIM(CAST(c.Colonna AS varchar(32))), + ' - ', + RTRIM(CAST(c.Fila AS varchar(32))) + ) AS CELLA, + LTRIM(RTRIM(g.BarcodePallet)) AS UDC +FROM dbo.XMag_GiacenzaPallet AS g +INNER JOIN celle_multiple AS cm + ON cm.IDCella = g.IDCella +INNER JOIN dbo.Celle AS c + ON c.ID = g.IDCella +ORDER BY CELLA, UDC; +""" + +SHIPPED_NOT_DISASSOCIATED_COLUMNS = ( + ("UDC", "diagnostics.col.udc", "UDC", 130, "w"), + ( + "Diagnostica", + "diagnostics.col.shipped_not_disassociated", + "Spedita ma non disassociata", + 280, + "w", + ), + ("NomeSimbolicoCella", "diagnostics.col.symbolic_cell", "Nome simbolico cella", 240, "w"), +) + +MULTIPLE_UDC_COLUMNS = ( + ("CELLA", "diagnostics.col.cell", "CELLA", 220, "w"), + ("UDC", "diagnostics.col.udc", "UDC", 160, "w"), +) + def _rows_to_dicts(res: dict[str, Any] | None) -> list[dict[str, Any]]: if not isinstance(res, dict): @@ -74,6 +117,7 @@ class DiagnosticaWindow(ctk.CTkToplevel): self._current_check = "" self.var_status = tk.StringVar(value="") self._last_export_slug = "diagnostica" + self._current_columns = SHIPPED_NOT_DISASSOCIATED_COLUMNS self.title( versioned_title( @@ -112,7 +156,7 @@ class DiagnosticaWindow(ctk.CTkToplevel): fg_color=theme_color(self._theme, "toolbar_frame_fg_color", ("#d7d7d7", "#3b3b3b")), ) top.grid(row=0, column=0, sticky="ew", padx=8, pady=8) - top.grid_columnconfigure(1, weight=1) + top.grid_columnconfigure(2, weight=1) button_font = theme_font(self._theme, "toolbar_button_font", ("Segoe UI", 10, "bold")) ctk.CTkButton( @@ -126,6 +170,17 @@ class DiagnosticaWindow(ctk.CTkToplevel): font=button_font, ).grid(row=0, column=0, sticky="w", padx=(0, 8)) + ctk.CTkButton( + top, + text=loc_text( + "diagnostics.button.multiple_udc_by_cell", + catalog=self._locale_catalog, + default="Celle con multiple UDC", + ), + command=self._load_multiple_udc_by_cell, + font=button_font, + ).grid(row=0, column=1, sticky="w", padx=(0, 8)) + self.btn_export = ctk.CTkButton( top, text=loc_text("diagnostics.button.export", catalog=self._locale_catalog, default="Esporta XLSX"), @@ -133,7 +188,7 @@ class DiagnosticaWindow(ctk.CTkToplevel): font=button_font, state="disabled", ) - self.btn_export.grid(row=0, column=2, sticky="e") + self.btn_export.grid(row=0, column=3, sticky="e") ctk.CTkLabel( self, @@ -147,37 +202,8 @@ class DiagnosticaWindow(ctk.CTkToplevel): wrap.grid_rowconfigure(0, weight=1) wrap.grid_columnconfigure(0, weight=1) - cols = ("UDC", "Diagnostica", "NomeSimbolicoCella") - self.tree = ttk.Treeview(wrap, columns=cols, show="headings") - headings = { - "UDC": ( - loc_text("diagnostics.col.udc", catalog=self._locale_catalog, default="UDC"), - 130, - "w", - ), - "Diagnostica": ( - loc_text( - "diagnostics.col.shipped_not_disassociated", - catalog=self._locale_catalog, - default="Spedita ma non disassociata", - ), - 280, - "w", - ), - "NomeSimbolicoCella": ( - loc_text( - "diagnostics.col.symbolic_cell", - catalog=self._locale_catalog, - default="Nome simbolico cella", - ), - 240, - "w", - ), - } - for col in cols: - text, width, anchor = headings[col] - self.tree.heading(col, text=text) - self.tree.column(col, width=width, anchor=anchor, stretch=True) + self.tree = ttk.Treeview(wrap, show="headings") + self._configure_tree_columns(self._current_columns) style_treeview( self.tree, style_name="Diagnostics.Treeview", @@ -196,10 +222,22 @@ class DiagnosticaWindow(ctk.CTkToplevel): def _set_status(self, text: str) -> None: self.var_status.set(text) + def _configure_tree_columns(self, columns) -> None: + self.tree.delete(*self.tree.get_children("")) + keys = tuple(str(col[0]) for col in columns) + self.tree.configure(columns=keys, show="headings") + for key, locale_key, default, width, anchor in columns: + self.tree.heading( + key, + text=loc_text(str(locale_key), catalog=self._locale_catalog, default=str(default)), + ) + self.tree.column(key, width=int(width), anchor=str(anchor), stretch=True) + def _load_shipped_not_disassociated(self) -> None: self._run_check( key="shipped_not_disassociated", sql=SQL_SHIPPED_NOT_DISASSOCIATED, + columns=SHIPPED_NOT_DISASSOCIATED_COLUMNS, busy_text=loc_text( "diagnostics.busy.shipped_not_disassociated", catalog=self._locale_catalog, @@ -207,7 +245,19 @@ class DiagnosticaWindow(ctk.CTkToplevel): ), ) - def _run_check(self, *, key: str, sql: str, busy_text: str) -> None: + def _load_multiple_udc_by_cell(self) -> None: + self._run_check( + key="multiple_udc_by_cell", + sql=SQL_MULTIPLE_UDC_BY_CELL, + columns=MULTIPLE_UDC_COLUMNS, + busy_text=loc_text( + "diagnostics.busy.multiple_udc_by_cell", + catalog=self._locale_catalog, + default="Cerco celle con multiple UDC...", + ), + ) + + def _run_check(self, *, key: str, sql: str, columns, busy_text: str) -> None: if self._load_in_progress or not self._is_alive(): return @@ -217,6 +267,8 @@ class DiagnosticaWindow(ctk.CTkToplevel): self._load_in_progress = True self._current_check = key self._last_export_slug = key + self._current_columns = columns + self._configure_tree_columns(columns) try: self.btn_export.configure(state="disabled") except Exception: @@ -242,15 +294,12 @@ class DiagnosticaWindow(ctk.CTkToplevel): try: rows = _rows_to_dicts(res) self.tree.delete(*self.tree.get_children("")) + keys = [str(col[0]) for col in self._current_columns] for index, row in enumerate(rows): self.tree.insert( "", "end", - values=( - row.get("UDC") or "", - row.get("Diagnostica") or "", - row.get("NomeSimbolicoCella") or "", - ), + values=tuple(row.get(key) or "" for key in keys), tags=(zebra_tag(index),), ) try: diff --git a/locale.json b/locale.json index 346f830..aff4d54 100644 --- a/locale.json +++ b/locale.json @@ -78,10 +78,13 @@ "history.picking.msg.detail_error": "Errore dettaglio:\n{error}", "diagnostics.title": "Diagnostica", "diagnostics.button.shipped_not_disassociated": "UDC spedite non disassociate", + "diagnostics.button.multiple_udc_by_cell": "Celle con multiple UDC", "diagnostics.button.export": "Esporta XLSX", "diagnostics.busy.shipped_not_disassociated": "Cerco UDC spedite ma ancora in cella...", + "diagnostics.busy.multiple_udc_by_cell": "Cerco celle con multiple UDC...", "diagnostics.status.rows": "Righe trovate: {count}", "diagnostics.col.udc": "UDC", + "diagnostics.col.cell": "CELLA", "diagnostics.col.shipped_not_disassociated": "Spedita ma non disassociata", "diagnostics.col.symbolic_cell": "Nome simbolico cella", "diagnostics.export.title": "Esporta", @@ -207,10 +210,13 @@ "history.picking.msg.detail_error": "Detail load failed:\n{error}", "diagnostics.title": "Diagnostics", "diagnostics.button.shipped_not_disassociated": "Shipped UDC not disassociated", + "diagnostics.button.multiple_udc_by_cell": "Cells with multiple UDC", "diagnostics.button.export": "Export XLSX", "diagnostics.busy.shipped_not_disassociated": "Searching shipped UDC still assigned to cells...", + "diagnostics.busy.multiple_udc_by_cell": "Searching cells with multiple UDC...", "diagnostics.status.rows": "Rows found: {count}", "diagnostics.col.udc": "UDC", + "diagnostics.col.cell": "CELL", "diagnostics.col.shipped_not_disassociated": "Shipped but not disassociated", "diagnostics.col.symbolic_cell": "Symbolic cell name", "diagnostics.export.title": "Export", diff --git a/version_info.py b/version_info.py index 7b1987d..802d9a8 100644 --- a/version_info.py +++ b/version_info.py @@ -18,7 +18,7 @@ MODULE_VERSIONS: dict[str, str] = { "barcode_service": "1.0.24", "busy_overlay": "1.0.0", "db_config": "1.0.0", - "diagnostica": "1.0.1", + "diagnostica": "1.0.2", "gestione_aree": "1.0.1", "gestione_layout": "1.0.2", "gestione_pickinglist": "1.0.4",