40 év  tapasztalat Gyorshatáridő Megfizethető minőség Egyedi megoldások Alumíniumredőny Napellenző Motoros megoldások Teraszárnyékolás Szúnyoghálók Szövet árnyékolók

Fejlesztés alatt

×

Redőny kalkulátor

Műanyag redőnynél nincs motor.
0 Ft
Az árak bruttó árak, telepítéssel értendők Pest vármegye területén.
(Minimum elszámolás: 1.2 m²)
/* JOZSA CORE V3 * - Egyetlen központi DB: localStorage['JOZSA_DB_V3'] * - Ár rekordok: db.prices[] {calc,key,unit,value,label,updatedAt} * - Motor rekordok: db.motors[] {id,name,price} * - Helper: JOZSA.db(), JOZSA.saveDB(), JOZSA.upsertPrice(), JOZSA.getPrice() */ (function(){ const LS_KEY = "JOZSA_DB_V3"; function nowISO(){ return new Date().toISOString(); } function safeJSONParse(s){ try{ return JSON.parse(s); }catch(e){ return null; } } function defaultDB(){ return { version: 3, updatedAt: nowISO(), prices: [], motors: [], meta: {} }; } function loadDB(){ const raw = localStorage.getItem(LS_KEY); const obj = raw ? safeJSONParse(raw) : null; if(obj && typeof obj === "object" && Array.isArray(obj.prices) && Array.isArray(obj.motors)){ // soft-migrate obj.version = 3; obj.updatedAt = obj.updatedAt || nowISO(); obj.meta = obj.meta || {}; return obj; } return defaultDB(); } function saveDB(db){ db.updatedAt = nowISO(); try{ localStorage.setItem(LS_KEY, JSON.stringify(db)); }catch(e){} return db; } function norm(s){ return String(s||"").trim(); } function upsertPrice(calc, key, unit, value, label){ const db = loadDB(); const c = norm(calc), k = norm(key); if(!c || !k) return null; const v = Number(value||0); const u = norm(unit||"fix") || "fix"; const lbl = norm(label||""); const i = db.prices.findIndex(r => norm(r.calc)===c && norm(r.key)===k); const rec = { calc:c, key:k, unit:u, value:v, label:lbl, updatedAt: nowISO() }; if(i>=0) db.prices[i] = Object.assign({}, db.prices[i], rec); else db.prices.push(rec); saveDB(db); return rec; } function removePrice(calc,key){ const db = loadDB(); const c=norm(calc), k=norm(key); db.prices = db.prices.filter(r => !(norm(r.calc)===c && norm(r.key)===k)); saveDB(db); } function getPrice(calc,key){ const db = loadDB(); const c=norm(calc), k=norm(key); const hit = db.prices.find(r => norm(r.calc)===c && norm(r.key)===k); return hit ? Number(hit.value||0) : null; } function listPrices(calc){ const db = loadDB(); const c = norm(calc); return db.prices.filter(r => !c || norm(r.calc)===c); } function ft(n){ return Math.round(Number(n||0)).toLocaleString("hu-HU")+" Ft"; } // m² (cm*cm) min 1.2 m² function m2(wCm,hCm){ const w = Number(wCm||0), h = Number(hCm||0); const a = (w*h)/10000; return a < 1.2 ? 1.2 : a; } // fm: cm -> m, min 1.2 fm function fm(lenCm){ const m = Number(lenCm||0)/100; return m < 1.2 ? 1.2 : m; } // Public API window.JOZSA = window.JOZSA || {}; window.JOZSA.db = function(){ return loadDB(); }; window.JOZSA.saveDB = function(db){ return saveDB(db); }; window.JOZSA.upsertPrice = upsertPrice; window.JOZSA.removePrice = removePrice; window.JOZSA.getPrice = getPrice; window.JOZSA.listPrices = listPrices; window.JOZSA.ft = window.JOZSA.ft || ft; window.JOZSA.m2 = window.JOZSA.m2 || m2; window.JOZSA.fm = window.JOZSA.fm || fm; // Simple event bus (admin/szerkesztő frissítéshez) window.JOZSA.emit = function(name, detail){ try{ window.dispatchEvent(new CustomEvent(name, {detail})); }catch(e){} }; })();