SkiRent Pro je već aktivan u drugoj kartici ili prozoru preglednika. Zatvorite ostale kartice i osvježite ovu stranicu.
⚠️
Greška
SKIRENTPRO
Pregled
Aktivne & Nadolazeće Rezervacije
Korisnik
Oprema
Preuzimanje
Povrat
Status
Korisnici
Nova rezervacija
👤 Korisnik & Djelatnik
📅 Termini
🎿 Odabir Opreme
Najprije odaberite datume preuzimanja i povrata.
💶 Financije
📝 Napomena
Rezervacije
#
Korisnik
Oprema
Preuzimanje
Povrat
Status
Akcije
Oprema
Vrsta
Oznaka ▲
Napomena
Osiguranje
Status
Akcije
Postavke
🏢 Podaci o Poduzeću
Prikazuju se na svakoj Potvrdi.
⚙️ Napredno💾 Ručni Izvoz
📁 Lokalna Mapa / Datoteka
Odaberite mapu ili datoteku JEDNOM — preglednik pamti dopuštenje, a svaki sljedeći automatski backup tiho se sprema na disk (bez pop-up prozora za preuzimanje i bez zatrpavanja Downloads mape). Kod odabira mape, backup rotira kroz 5 datoteka (skirent-backup-1.json … skirent-backup-5.json) — najstarija se automatski prepisuje. Radi samo u Chrome / Edge (na računalu).
🤖 Automatski Backup
Ako je gore odabrana mapa/datoteka, automatski backup tiho piše tamo (rotacija, bez pop-upa). U suprotnom, backup datoteke preuzimaju se u download mapu preglednika kao i dosad.
Šalje backup izravno na Google Drive putem besplatnog Google Apps Script "mosta" — bez prijave (OAuth) i bez vlastitog servera. Podaci se prije slanja enkriptiraju (AES, tajnom lozinkom) jer sadrže OIB, adresu, telefon i e-poštu klijenata. Stariji backupi se automatski brišu (zadržava se zadnjih 30).
Google Drive backup nije uključen
⚙️ Kako postaviti Apps Script "most" (uputa korak-po-korak)
Na drive.google.com napravite (ili odaberite) mapu za backupe i iz URL-a mape kopirajte ID foldera (dio iza /folders/).
Idite na script.google.com → Novi projekt. Obrišite sadržaj i zalijepite kod ispod, te umjesto STAVI_ID_FOLDERA_OVDJE upišite svoj ID foldera. OBAVEZNO postavite i SECRET na istu vrijednost kao polje "Tajna lozinka" gore — bez toga skripta odbija sve zahtjeve.
Kliknite Deploy → New deployment. Za tip odaberite Web app. Postavite: Execute as: Me, Who has access: Anyone. Kliknite Deploy i autorizirajte pristup Drive-u.
Kopirajte dobiveni Web App URL (završava na /exec) i zalijepite ga gore u polje "Web App URL".
Kliknite Testiraj Vezu da provjerite radi li, zatim Spremi Postavke i uključite kvačicu za automatsko slanje.
var FOLDER_ID = 'STAVI_ID_FOLDERA_OVDJE';
var SECRET = 'PROMIJENI_OVO'; // OBAVEZNO — mora biti isto što i "Tajna lozinka" u aplikaciji
var KEEP_LAST = 30;
function doPost(e) {
try {
// Zahtjev se odbija PRIJE bilo kakvog pristupa Driveu ako secret nije ispravan.
if (!SECRET || SECRET === 'PROMIJENI_OVO') {
return ContentService.createTextOutput(JSON.stringify({ok:false,error:'Skripta nije podešena: postavite SECRET.'}))
.setMimeType(ContentService.MimeType.JSON);
}
var body = JSON.parse(e.postData.contents);
if (body.secret !== SECRET) {
return ContentService.createTextOutput(JSON.stringify({ok:false,error:'unauthorized'}))
.setMimeType(ContentService.MimeType.JSON);
}
var folder = DriveApp.getFolderById(FOLDER_ID);
var ts = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
var filename = 'skirent-backup-' + ts + '.json';
// body.data je enkriptiran (AES) tekst poslan iz aplikacije — sprema se kakav jest.
var content = (typeof body.data === 'string') ? body.data : JSON.stringify(body.data, null, 2);
folder.createFile(filename, content, MimeType.PLAIN_TEXT);
rotateBackups(folder, KEEP_LAST);
return ContentService.createTextOutput(JSON.stringify({ok:true,filename:filename}))
.setMimeType(ContentService.MimeType.JSON);
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({ok:false,error:String(err)}))
.setMimeType(ContentService.MimeType.JSON);
}
}
function rotateBackups(folder, keep) {
var files = folder.getFiles();
var list = [];
while (files.hasNext()) {
var f = files.next();
if (f.getName().indexOf('skirent-backup-') === 0) list.push(f);
}
list.sort(function (a, b) { return b.getDateCreated() - a.getDateCreated(); });
for (var i = keep; i < list.length; i++) list[i].setTrashed(true);
}
function doGet(e) {
var params = (e && e.parameter) || {};
if (params.action === 'list') {
// Popis backupa se također štiti secretom, da netko slučajno ne otkrije popis datoteka.
if (!SECRET || SECRET === 'PROMIJENI_OVO' || params.secret !== SECRET) {
return ContentService.createTextOutput(JSON.stringify({ok:false,error:'unauthorized'}))
.setMimeType(ContentService.MimeType.JSON);
}
try {
var folder = DriveApp.getFolderById(FOLDER_ID);
var files = folder.getFiles();
var list = [];
while (files.hasNext()) {
var f = files.next();
if (f.getName().indexOf('skirent-backup-') === 0) list.push(f);
}
list.sort(function (a, b) { return b.getDateCreated() - a.getDateCreated(); });
var out = list.slice(0, 30).map(function (f) {
return { name: f.getName(), date: Utilities.formatDate(f.getDateCreated(), Session.getScriptTimeZone(), 'dd.MM.yyyy HH:mm'), size: f.getSize() };
});
return ContentService.createTextOutput(JSON.stringify({ok:true,files:out}))
.setMimeType(ContentService.MimeType.JSON);
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({ok:false,error:String(err)}))
.setMimeType(ContentService.MimeType.JSON);
}
}
return ContentService.createTextOutput(JSON.stringify({ok:true,msg:'SkiRent backup endpoint radi.'}))
.setMimeType(ContentService.MimeType.JSON);
}
📜 Zapisnik Backupa (zadnjih 10)
📤 Uvoz Backupa
Učitajte prethodni backup. Zamjenjuje sve podatke!