Function bodies 262 total
buildGeneraleTotaleRow function · javascript · L945-L978 (34 LOC)routes/gb2Routes.js
function buildGeneraleTotaleRow(combinatoRighe) {
const cross = combinatoRighe.find((r) => r.tipo === 'totale-cross-fase');
let src = cross;
if (!src) {
const totali = combinatoRighe.filter((r) => r.tipo === 'totale');
src = totali.length ? totali[totali.length - 1] : null;
}
if (!src) {
return {
tipo: 'generale-totale',
livello: 0,
esistenza: 0,
ordinato: 0,
impegnato: 0,
disponibilita: 0,
opc: 0,
op: 0,
ipc: 0,
ip: 0
};
}
return {
tipo: 'generale-totale',
livello: 0,
esistenza: src.esistenza,
ordinato: src.ordinato,
impegnato: src.impegnato,
disponibilita: src.disponibilita,
opc: src.opc,
op: src.op,
ipc: src.ipc,
ip: src.ip
};
}getPoliticaRiordino function · javascript · L1794-L1813 (20 LOC)routes/gb2Routes.js
function getPoliticaRiordino(art) {
const pol = (art.ar_polriord || '').trim().toUpperCase();
const map = {
'M': 'a punto di riordino',
'F': 'fabbisogno puro',
'L': 'a lotto fisso',
'N': 'nessuna politica'
};
let descr = map[pol] || pol;
// Aggiungi dettagli scorta minima e lotto se presenti
if (pol === 'M' && art.ar_scomin) {
descr += ` (scorta min. ${art.ar_scomin}, lotto ${art.ar_ggrior || 0}, s.lotto 0)`;
}
if (pol === 'F') {
const desint = (art.ar_desint || '').trim();
if (desint) descr += ` (${desint})`;
}
return descr;
}checkSpExists function · javascript · L1914-L1919 (6 LOC)routes/gb2Routes.js
async function checkSpExists(pool, spName) {
const r = await pool.request()
.input('name', sql.NVarChar, spName)
.query("SELECT 1 AS ok FROM sys.objects WHERE name=@name AND type='P'");
return r.recordset.length > 0;
}run function · javascript · L17-L156 (140 LOC)setup-gb2.js
async function run() {
let pool;
try {
// Connessione al server (senza database specifico per CREATE DATABASE)
pool = await new sql.ConnectionPool({ ...config, database: 'master' }).connect();
console.log('[1/6] Connesso a master');
// 1. Creare database GB2
const dbExists = await pool.request().query(`SELECT DB_ID('GB2') AS id`);
if (dbExists.recordset[0].id === null) {
await pool.request().query(`CREATE DATABASE [GB2]`);
console.log('[2/6] Database GB2 creato');
} else {
console.log('[2/6] Database GB2 esiste gia, skip');
}
await pool.close();
// 2. Connettersi a GB2 per creare la tabella Operators
pool = await new sql.ConnectionPool({ ...config, database: 'GB2' }).connect();
const tableExists = await pool.request().query(`
SELECT OBJECT_ID('dbo.Operators') AS id
`);
if (tableExists.recordset[0].id === null) {
initSecurity function · javascript · L3-L129 (127 LOC)sicurezza.js
async function initSecurity() {
try {
const res = await fetch('/api/me', { credentials: 'include' });
if (res.status === 401) {
window.location.href = '/'; // Kick to Layer 1
return false;
}
const data = await res.json();
// Aggiorna la memoria locale con le regole fresche appena ricevute dal server
if (data.pwdRules) {
localStorage.setItem('pwdRules', JSON.stringify(data.pwdRules));
}
if (res.status === 403 && data.requiresPasswordChange) {
showPasswordCurtain();
return false; // Ferma l'inizializzazione dell'app
}
if (res.ok) {
// --- CONTROLLO ACCESSO AI MODULI (RBAC) ---
const user = data.user || data;
const currentPath = window.location.pathname.toLowerCase();
// Escludiamo il root e il gateway dal controllo
if (currentPath !== '/' && currentPath !== '/index.html') {
if (user && !user.isSuperuser) {
// Se tenta di accedere alla captain console
showPasswordCurtain function · javascript · L131-L265 (135 LOC)sicurezza.js
function showPasswordCurtain(customMessage) {
if (document.getElementById('securityCurtain')) return;
const curtain = document.createElement('div');
curtain.id = 'securityCurtain';
curtain.style.cssText = 'position:fixed; top:0; left:0; width:100vw; height:100vh; background:rgba(0,0,0,0.95); z-index:99999; display:flex; flex-direction:column; justify-content:center; align-items:center; color:white; font-family:sans-serif;';
const displayMessage = customMessage || 'I tuoi dati attuali sono salvi, ma devi cambiare la password per continuare.';
const rules = JSON.parse(localStorage.getItem('pwdRules') || '{"minLength":6,"requireNum":true,"requireUpp":false,"requireSpec":false}');
// Genera la checklist in base alle regole attive
let rulesHtml = `<ul style="list-style: none; padding: 0; margin: 0 0 20px 0; text-align: left; font-size: 0.95rem; color: #ccc;" id="pwdChecklist">`;
rulesHtml += `<li id="rule-len" style="margin-bottom: 6px;">❌ Almeno ${rules.minLength} fmtData function · javascript · L36-L41 (6 LOC)utils/pdfOrdine.js
function fmtData(d) {
if (!d) return '';
const dt = new Date(d);
if (isNaN(dt.getTime())) return '';
return dt.toLocaleDateString('it-IT', { day: '2-digit', month: '2-digit', year: 'numeric' });
}Repobility — the code-quality scanner for AI-generated software · https://repobility.com
fmtNum function · javascript · L43-L51 (9 LOC)utils/pdfOrdine.js
function fmtNum(n, decimali) {
if (n === null || n === undefined) return '';
const num = Number(n);
if (isNaN(num)) return '';
return num.toLocaleString('it-IT', {
minimumFractionDigits: decimali,
maximumFractionDigits: decimali
});
}fmtPrezzo function · javascript · L53-L57 (5 LOC)utils/pdfOrdine.js
function fmtPrezzo(n) {
const num = Number(n);
if (!num && num !== 0) return '';
return num.toLocaleString('it-IT', { minimumFractionDigits: 4, maximumFractionDigits: 4 });
}generaPdfOrdine function · javascript · L87-L119 (33 LOC)utils/pdfOrdine.js
async function generaPdfOrdine(ordine, righe, options = {}) {
return new Promise((resolve, reject) => {
try {
const isProva = options.ambiente === 'prova';
const doc = new PDFDocument({
size: 'A4',
margins: MARGIN,
info: {
Title: `${isProva ? '[PROVA] ' : ''}Ordine ${ordine.numord}/${ordine.serie} - ${ordine.fornitore_nome || ''}`,
Author: 'U.Jet s.r.l. - MRP Web',
Subject: 'Ordine d\'Acquisto Fornitore'
}
});
const chunks = [];
doc.on('data', chunk => chunks.push(chunk));
doc.on('end', () => resolve(Buffer.concat(chunks)));
doc.on('error', err => reject(err));
// Watermark PROVA su ogni pagina
if (isProva) {
addWatermark(doc);
doc.on('pageAdded', () => addWatermark(doc));
}
renderPdf(docaddWatermark function · javascript · L124-L135 (12 LOC)utils/pdfOrdine.js
function addWatermark(doc) {
doc.save();
doc.opacity(0.10);
doc.fontSize(100).font('Helvetica-Bold').fillColor('#ff0000');
// Centro pagina A4: 297.5, 420.5
doc.translate(297, 420);
doc.rotate(-45, { origin: [0, 0] });
doc.text('PROVA', -200, -50, { width: 400, align: 'center' });
doc.restore();
// Reset opacity per il contenuto che segue
doc.opacity(1);
}renderPdf function · javascript · L137-L344 (208 LOC)utils/pdfOrdine.js
function renderPdf(doc, ordine, righe) {
const x0 = MARGIN.left;
const xMid = x0 + PAGE_W / 2 + 10;
let y = MARGIN.top;
// ============================================================
// INTESTAZIONE — due colonne
// ============================================================
// Colonna SX: destinatario
doc.fontSize(7).fillColor(C.grigio).text('Destinatario :', x0, y);
y += 12;
doc.fontSize(10).fillColor(C.nero).font('Helvetica-Bold')
.text((ordine.fornitore_nome || '').toUpperCase(), x0, y);
y += 14;
doc.fontSize(8).font('Helvetica')
.text(ordine.fornitore_indirizzo || '', x0, y);
y += 11;
const cittaStr = [
ordine.fornitore_cap || '',
(ordine.fornitore_citta || '').toUpperCase(),
ordine.fornitore_prov ? `(${ordine.fornitore_prov})` : ''
].filter(Boolean).join(' ');
doc.text(cittaStr, x0, y);
y += 11;
if (ordine.fornitore_fax) {
doc.fontSize(7).fillColor(C.grigi‹ prevpage 6 / 6