From a0c0520cf767a7c5a97260b189ba7251b7435e47 Mon Sep 17 00:00:00 2001 From: OpenClaw Assistant Date: Sat, 21 Feb 2026 20:47:40 +0000 Subject: [PATCH] Add CSV-to-SQLite tariff sync script for paradiz --- .../paradiz/scripts/sync_prices_to_sqlite.py | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 skills/paradiz/scripts/sync_prices_to_sqlite.py diff --git a/skills/paradiz/scripts/sync_prices_to_sqlite.py b/skills/paradiz/scripts/sync_prices_to_sqlite.py new file mode 100644 index 0000000..4056ea4 --- /dev/null +++ b/skills/paradiz/scripts/sync_prices_to_sqlite.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +import csv +import hashlib +import shutil +from datetime import datetime +from pathlib import Path +import sqlite3 + +CSV_PATH = Path('/home/openclaw/.openclaw/workspace/skills/paradiz/references/prices.csv') +DB_PATH = Path('/home/openclaw/.openclaw/workspace/skills/paradiz/data/db/testDB.sqlite') + + +def mk_hash(*parts: str) -> str: + return hashlib.md5('|'.join(parts).encode('utf-8')).hexdigest() + + +def load_csv(path: Path): + with path.open('r', encoding='utf-8-sig', newline='') as f: + return list(csv.DictReader(f)) + + +def date_jd(cur, s: str): + return cur.execute('SELECT julianday(?)', (s,)).fetchone()[0] + + +def ensure_category(cur, name: str, maxlivers: int): + row = cur.execute('SELECT id FROM hotel_room_categories WHERE name=?', (name,)).fetchone() + if row: + return row[0] + cid = mk_hash('paradiz-cat', name) + now_jd = cur.execute('SELECT julianday("now")').fetchone()[0] + h = mk_hash(cid, name) + cur.execute( + '''INSERT INTO hotel_room_categories + (id,name,ename,color,maxlivers,channelCode,additionalChannelCode,additional,description,status,lastupdate,hash) + VALUES (?,?,?,?,?,?,?,?,?,?,?,?)''', + (cid, name, name, 0, maxlivers, '', '', '', 'imported from prices.csv', 0, now_jd, h) + ) + return cid + + +def upsert_cost(cur, category_id: str, room_name: str, guests_num: int, cost: float, dfrom: str, dto: str): + rid = mk_hash('paradiz-cost', room_name, dfrom, dto, str(guests_num)) + exists = cur.execute('SELECT 1 FROM hotel_room_categories_cost WHERE id=?', (rid,)).fetchone() + df = date_jd(cur, dfrom) + dt = date_jd(cur, dto) + if exists: + cur.execute('''UPDATE hotel_room_categories_cost + SET category=?, number=?, cost=?, date_from=?, date_to=?, subtype='', days=127 + WHERE id=?''', + (category_id, guests_num, cost, df, dt, rid)) + else: + cur.execute('''INSERT INTO hotel_room_categories_cost + (id, category, number, cost, date_from, date_to, subtype, days) + VALUES (?,?,?,?,?,?,?,?)''', + (rid, category_id, guests_num, cost, df, dt, '', 127)) + + +def main(): + if not CSV_PATH.exists() or not DB_PATH.exists(): + raise SystemExit('prices.csv or testDB.sqlite not found') + + # backup db + backup_dir = DB_PATH.parent / 'backups' + backup_dir.mkdir(parents=True, exist_ok=True) + stamp = datetime.now().strftime('%Y%m%d-%H%M%S') + backup_path = backup_dir / f'testDB-{stamp}.sqlite' + shutil.copy2(DB_PATH, backup_path) + + rows = load_csv(CSV_PATH) + + # extra-person price by period + extra_by_period = {} + for r in rows: + if (r.get('room') or '').strip().lower() == 'доп. человек': + extra_by_period[(r['date_from'], r['date_to'])] = float(r['price_per_night']) + + conn = sqlite3.connect(str(DB_PATH)) + cur = conn.cursor() + + room_max = { + 'Домик Эконом': 4, + 'Стандарт': 4, + 'Двухкомнатный номер': 6, + 'Номер с кухней': 4, + 'Номер Большой с кухней': 6, + } + + synced = 0 + for r in rows: + room = (r.get('room') or '').strip() + if not room or room == 'Доп. человек': + continue + + dfrom = r['date_from'] + dto = r['date_to'] + gmin = int(r['guests_min']) + gmax = int(r['guests_max']) + base = float(r['price_per_night']) + extra = float(extra_by_period.get((dfrom, dto), 800.0)) + + base_included = 4 if room in ('Двухкомнатный номер', 'Номер Большой с кухней') else 2 + maxl = room_max.get(room, gmax) + cat_id = ensure_category(cur, room, maxl) + + for n in range(gmin, gmax + 1): + extra_guests = max(0, n - base_included) + cost = base + extra_guests * extra + upsert_cost(cur, cat_id, room, n, cost, dfrom, dto) + synced += 1 + + conn.commit() + conn.close() + + print(f'backup: {backup_path}') + print(f'synced cost rows: {synced}') + + +if __name__ == '__main__': + main()