Sor mezők:
calc (pl. redonyok),
key (pl. alu / vakolhato_alu / teto),
value (Ft).
Tipp: a kalkulátorok és az árajánlatszerkesztő is ugyanebből olvas: JOZSA.db().prices
calc
key
érték (Ft)
művelet
Motorok (fix felárak)
A kalkulátorok és az árajánlatszerkesztő is innen olvas:
JOZSA.db().motors
id
név
ár (Ft)
Megjegyzés
Mentéskor esemény: document.dispatchEvent(new CustomEvent('jozsa:dbchange',{detail:db}))
Így az árajánlatszerkesztő és a kalkulátorok azonnal frissülhetnek.
×
Redőny kalkulátor
Vakolható / belsőtokos esetén választható.
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²)
×
Napháló kalkulátor
Alu-Summer: nincs motor. Alu-Summer Plus: motor választható (NHK nélkül).
0 Ft
(Minimum elszámolás: 1.2 m²)
×
Zsaluzia kalkulátor
0 Ft
(Minimum elszámolás: 1.2 m²)
×
Napellenző kalkulátor
Csak Alu-Sole és Alu-Helios esetén.
0 Ft
(Minimum elszámolás: 1.2 m²)
×
Szúnyoghálók kalkulátor
Csak fix keretes / nyíló zsanéros / tolóajtós típusnál.
RAL felár minden szúnyogháló típusnál választható.
0 Ft
(Minimum elszámolás: 1.2 m²)
×
Szalagfüggöny kalkulátor
Spagetti függönynél a textil nem választható.
0 Ft
Bruttó ár, telepítéssel értendő Pest vármegye területén.
(Minimum elszámolás: 1.2 m²)
×
Fareluxa kalkulátor
Motor csak 50 mm-es kivitelben.
Csak Somfy RTS vagy Somfy Io.
0 Ft
Bruttó ár, telepítéssel értendő Pest vármegye területén.
(Minimum elszámolás: 1.2 m²)
×
Reluxa kalkulátor
0 Ft
Bruttó ár, telepítéssel értendő Pest vármegye területén.
(Minimum elszámolás: 1.2 m²)
×
Roletta kalkulátor
Motor csak gyöngyláncos kivitelben elérhető.
0 Ft
Bruttó ár, telepítéssel értendő Pest vármegye területén.
(Minimum elszámolás: 1.2 m²)
×
Sávroló kalkulátor
Motor és RAL csak zárt szerkezetnél.
0 Ft
Bruttó ár, telepítéssel értendő 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){}
};
})();