107 Commits

Author SHA1 Message Date
Jonas Linter
fce2dbc8de Fixed incorrect overlap detection 2025-12-09 15:29:35 +01:00
f6929ca7cc Small logging improvement 2025-12-09 14:13:58 +00:00
Jonas Linter
c73747e02d Update free_rooms is_closing season detection. Should also accept 1 as True 2025-12-09 14:45:22 +01:00
Jonas Linter
13e404d07c Only update updated_at timestamps if something actually changes. 2025-12-09 14:06:00 +01:00
Jonas Linter
c4bb9c524d Disabled free_rooms for main branch
The respective tests fail but that is too be expected
2025-12-09 12:36:08 +01:00
Jonas Linter
02b0ec3b9c Updated handshake reference file 2025-12-04 20:48:50 +01:00
Jonas Linter
2f458ed6df Added git-filter-repo 2025-12-04 20:32:21 +01:00
Jonas Linter
4b8bb1b57d No schema creation if public 2025-12-04 17:07:54 +01:00
Jonas Linter
4cff7c6081 Fixed setup for db where its empty 2025-12-04 17:05:48 +01:00
Jonas Linter
a6837197b6 FIxed date range overlap 2025-12-04 16:33:11 +01:00
Jonas Linter
16d12f5b62 Free rooms doesn't cause errors but further data verification is necessary 2025-12-04 16:14:40 +01:00
Jonas Linter
ea3d886b87 Activated free rooms 2025-12-04 15:32:29 +01:00
Jonas Linter
f728ce369a Merge branch 'db_fixes_plus_free_rooms' of https://gitea.99tales.net/jonas/alpinebits_python into db_fixes_plus_free_rooms 2025-12-03 22:37:08 +01:00
Jonas Linter
6cee77c232 Bit hamfisted but updates old records 2025-12-03 19:15:21 +01:00
Jonas Linter
6ea510174e Updated classification scheme 2025-12-03 19:02:34 +01:00
Jonas Linter
67c20bc18a Another logging message to see how the classification is doing 2025-12-03 18:52:53 +01:00
Jonas Linter
ff338ecb15 Added a logging statement to better see where the child dies 2025-12-03 18:44:32 +01:00
Jonas Linter
d61897b929 Added is_regular and awarness detection 2025-12-03 17:59:30 +01:00
Jonas Linter
95da5dcee9 And fixed typo 2025-12-03 17:47:30 +01:00
Jonas Linter
b4a6c1656d Added migration for awarness guest column 2025-12-03 17:47:23 +01:00
Jonas Linter
89f5b81983 Awarness guest now for real 2025-12-03 17:44:05 +01:00
Jonas Linter
8e5f045181 Added awarnesss flag for conversion_guests 2025-12-03 17:43:51 +01:00
Jonas Linter
f033abf76e Seems to mostly work now. Regular matching is still wrong 2025-12-03 17:05:58 +01:00
Jonas Linter
d03669873e Fine this needs more work 2025-12-03 16:12:07 +01:00
Jonas Linter
a6e4bcbe1b Significant matching fix. 2025-12-03 15:23:10 +01:00
Jonas Linter
12350578cc Finally fixed greenlet_spawn sqllchemy error. The horror 2025-12-03 14:13:20 +01:00
Jonas Linter
d2ed77e008 Readded fk constraint for conversion_guests 2025-12-03 12:27:17 +01:00
Jonas Linter
f2c40e1a23 Fixed removing hashed_customer 2025-12-03 12:12:37 +01:00
Jonas Linter
ad29a0a2f6 Not quite done but mostly starting to remove hashed_customer references 2025-12-03 12:00:02 +01:00
Jonas Linter
3175342cb2 Fixed greenlet error on rollback 2025-12-03 11:32:24 +01:00
Jonas Linter
1bdef3ee11 HashedCustomer is now no longer necessary 2025-12-03 11:10:27 +01:00
Jonas Linter
3193ceac63 Migration to single customer table works but conversion_service still needs updating 2025-12-03 10:51:18 +01:00
Jonas Linter
b572f660a7 Holy db migrations batman 2025-12-03 10:41:34 +01:00
Jonas Linter
e0c3b6e8af Reduced logging for conversion service 2025-12-02 17:03:07 +01:00
Jonas Linter
03aac27233 Replaced config auth with db auth 2025-12-02 16:43:56 +01:00
Jonas Linter
7ff3c44747 Reduced logging impact 2025-12-02 16:01:45 +01:00
Jonas Linter
87522711d4 Fixed small issue in webhook-processor not saving the results to the webhook_request table 2025-12-02 16:00:43 +01:00
Jonas Linter
f35f3f3dc9 Lots of refactoring and simplification in conversions_service 2025-12-02 15:45:40 +01:00
Jonas Linter
1f13991bfe Removed some unused fields 2025-12-02 15:38:39 +01:00
Jonas Linter
e2e2d12824 Update guest IDs in reservation tests for consistency 2025-12-02 15:27:14 +01:00
Jonas Linter
c0e601e308 Fixed up the damm tests 2025-12-02 15:24:30 +01:00
Jonas Linter
56d67984cf New pydantic model for ConversionGuest 2025-12-02 13:18:43 +01:00
Jonas Linter
ee80c57bcb Migration successfull. Does not cause any problems and new foreign keys work 2025-12-02 11:27:07 +01:00
e24866d8a0 Small db improvements. Still needs migration for alembic 2025-12-02 09:45:27 +00:00
6c50273f54 Merge branch 'concurrency-fix' of https://gitea.99tales.net/jonas/alpinebits_python into concurrency-fix 2025-12-01 10:15:58 +00:00
7a8ee41080 Added a new analysis query to the sql_analysis.md file 2025-12-01 10:15:39 +00:00
Jonas Linter
d04218988d Disabled free rooms action for now 2025-12-01 11:14:31 +01:00
Jonas Linter
877b2909f2 Fixed room upsert logic 2025-12-01 11:12:22 +01:00
Jonas Linter
2be10ff899 Fixed some tests and added schemas 2025-12-01 10:14:14 +01:00
Jonas Linter
3e577a499f Small typing addition 2025-12-01 09:21:25 +01:00
Jonas Linter
a80f66bd45 Fix integrity error by adding dummy payload_hash in webhook reprocessing test 2025-12-01 09:21:15 +01:00
Jonas Linter
a1d9ef5fea Offers get extracted from generic webhooks and added to reservations 2025-11-27 19:59:38 +01:00
Jonas Linter
7624b70fd0 Duplicate detection improved but refactoring necessary to make the whole thing more managable 2025-11-27 19:35:30 +01:00
Jonas Linter
f7158e7373 Free rooms first implementation 2025-11-27 18:57:45 +01:00
e8601bbab9 Added docs extracted from the pdf 2025-11-27 17:20:43 +00:00
f0e98bc8f7 Webhook_processors accept event_dispatchers now so that push notifs are possible in the future 2025-11-27 14:58:36 +00:00
18753826cd Updated tests. Since the endpoints are now handled by the unified webhook endpoint we have to be a touch more careful with hotel_ids in testing since it won't accept any code anymore 2025-11-27 14:44:57 +00:00
Jonas Linter
2b1215a43a Some more refactoring. Push_events don't work at the moment 2025-11-27 15:33:15 +01:00
Jonas Linter
011b68758a Catch integrity errors gracefully instead of dumping a giant stacktrace 2025-11-27 14:47:05 +01:00
Jonas Linter
7c4e1ff36b Updated test_api.
Had to change hotel_ids used in test_requests. Previously any hotel_id was valid now only registered ones are. Doesn't make a difference in prod
2025-11-25 21:04:18 +01:00
Jonas Linter
a445de0f2f Handling legacy endpoints directly in unified endpoints 2025-11-25 20:40:51 +01:00
Jonas Linter
8805c87e05 Moved some stuff around and fixed circular import 2025-11-25 20:30:07 +01:00
Jonas Linter
bdd7522f47 Added an enum for Webhook Status 2025-11-25 20:20:51 +01:00
Jonas Linter
3ba857a0f8 Better typing + moved some code to webhook_processor 2025-11-25 20:20:40 +01:00
Jonas Linter
9522091efc Removed redundant size_field in webhook_requests 2025-11-25 20:20:06 +01:00
Jonas Linter
95953fa639 Moved existing processing functions to webhook_processor 2025-11-25 20:19:48 +01:00
Jonas Linter
8d144a761c feat: Add hotel and webhook endpoint management
- Introduced Hotel and WebhookEndpoint models to manage hotel configurations and webhook settings.
- Implemented sync_config_to_database function to synchronize hotel data from configuration to the database.
- Added HotelService for accessing hotel configurations and managing customer data.
- Created WebhookProcessor interface and specific processors for handling different webhook types (Wix form and generic).
- Enhanced webhook processing logic to handle incoming requests and create/update reservations and customers.
- Added logging for better traceability of operations related to hotels and webhooks.
2025-11-25 12:05:48 +01:00
Jonas Linter
da85098d8d Add bcrypt as a dependency with version 5.0.0
- Included bcrypt in the dependencies list of uv.lock.
- Specified version requirement for bcrypt as >=5.0.0.
- Added package details for bcrypt including source, sdist, and various wheel distributions.
2025-11-25 12:05:29 +01:00
Jonas Linter
d4adfa4ab4 Extract offer from generic_webhook if set 2025-11-20 23:01:04 +01:00
Jonas Linter
7918cc1489 Created a script to update the csv imports that don't have the date 2025-11-20 11:14:07 +01:00
Jonas Linter
d83f4c2f38 Increased timeout limit 2025-11-19 20:53:27 +01:00
Jonas Linter
10fe471ae0 Idempotent matching. Hopefully 2025-11-19 20:34:08 +01:00
Jonas Linter
f6c5a14cbf More cleanup 2025-11-19 19:35:54 +01:00
Jonas Linter
3819b2bc95 Cleanup 2025-11-19 19:35:36 +01:00
Jonas Linter
e4bd64a9e4 Lets see if the matching is finally sensible 2025-11-19 19:35:06 +01:00
Jonas Linter
278d082215 Adjusted the migrations so they work on the prod db 2025-11-19 19:10:25 +01:00
Jonas Linter
661a6e830c Just some adjustments to conversion service so that the tests work again 2025-11-19 18:58:44 +01:00
Jonas Linter
434dabbb7a On we go. Maybe soon this will be done 2025-11-19 18:40:44 +01:00
Jonas Linter
93207c3877 Finally it works 2025-11-19 17:27:47 +01:00
Jonas Linter
0854352726 More refactoring 2025-11-19 16:25:18 +01:00
Jonas Linter
8547326ffa Seems to work now 2025-11-19 15:39:33 +01:00
Jonas Linter
d27e31b0c1 Complete seperation 2025-11-19 15:10:38 +01:00
Jonas Linter
45b50d1549 Migration done 2025-11-19 15:01:16 +01:00
Jonas Linter
45452ac918 Significant refactorings 2025-11-19 14:49:42 +01:00
Jonas Linter
70dfb54c8f Merge branch 'conversion_test_initial' 2025-11-19 14:30:42 +01:00
Jonas Linter
947911be28 Fixed the incorrect conversion_service test 2025-11-19 14:29:58 +01:00
Jonas Linter
75bc01545f Hashed comparisions don't work unfortunatly 2025-11-19 14:17:13 +01:00
Jonas Linter
a087a312a7 Migration to guest_table for conversion works 2025-11-19 12:05:38 +01:00
Jonas Linter
55c4b0b9de Now sending an actually unique parameter so matching in the future is simpler 2025-11-19 11:40:41 +01:00
Jonas Linter
7b8f59008f Added a test for conversions 2025-11-19 11:05:51 +01:00
Jonas Linter
bbbb4d7847 Massive refactoring. Csv import still works 2025-11-19 10:20:48 +01:00
Jonas Linter
67f5894ccd Both csv imports work 2025-11-19 10:17:11 +01:00
Jonas Linter
e8cdc75421 Importing mailbox leads now works 2025-11-19 09:55:54 +01:00
57dac8514c the db might not have permissions for this. Schema needs to exist ahead of time which is fine 2025-11-18 19:36:08 +00:00
Jonas Linter
8e2de0fa94 Csv import now works with preacknowlegdments 2025-11-18 19:25:52 +01:00
Jonas Linter
e5abefe690 Fixed the csv_import 2025-11-18 18:37:30 +01:00
Jonas Linter
0633718604 Deleted log because its big 2025-11-18 17:06:57 +01:00
Jonas Linter
b4ceb90da8 Fixed all tests. Tests now use alembic migrations 2025-11-18 16:47:09 +01:00
Jonas Linter
2d37db46d6 Changed how services work and updated csv_import 2025-11-18 16:40:09 +01:00
Jonas Linter
df84d8c898 Converted csv_import to put request 2025-11-18 16:23:58 +01:00
Jonas Linter
433026dd01 Presumably production ready xD 2025-11-18 16:10:57 +01:00
Jonas Linter
ccdc66fb9b Looking good 2025-11-18 14:49:44 +01:00
Jonas Linter
db0b0afd33 Fixed missing await statement in alembic setup 2025-11-18 14:38:21 +01:00
Jonas Linter
ab04dc98ed Conversion import returns faster and processes in the background 2025-11-18 14:37:04 +01:00
Jonas Linter
ba25bbd92d Finally a migration that works 2025-11-18 14:25:46 +01:00
Jonas Linter
c86a18d126 Merge branch 'main' of https://gitea.linter-home.com/jonas/alpinebits_python 2025-11-18 14:03:49 +01:00
Jonas Linter
7ab5506e51 Fuck it lets add the giant files 2025-11-18 14:02:12 +01:00
94 changed files with 317748 additions and 1457237 deletions

BIN
.coverage

Binary file not shown.

2
.gitignore vendored
View File

@@ -33,9 +33,7 @@ alpinebits.db
# ignore sql
*.sql
*.csv
# test output files
test_output.txt

View File

@@ -33,6 +33,10 @@ COPY --from=builder /app/.venv /app/.venv
# Copy application code
COPY src/ ./src/
# Copy Alembic files for database migrations
COPY alembic.ini ./
COPY alembic/ ./alembic/
# Create directories and set permissions
RUN mkdir -p /app/logs && \
chown -R appuser:appuser /app
@@ -53,9 +57,8 @@ EXPOSE 8000
HEALTHCHECK --interval=120s --timeout=10s --start-period=60s --retries=3 \
CMD python -c "import requests; requests.get('http://localhost:8000/api/health', timeout=5)"
# Run the application with uvicorn
WORKDIR /app/src
CMD uvicorn alpine_bits_python.api:app \
# Run the application with run_api.py (includes migrations)
CMD python -m alpine_bits_python.run_api \
--host 0.0.0.0 \
--port 8000 \
--workers 4 \
@@ -63,4 +66,5 @@ CMD uvicorn alpine_bits_python.api:app \
--access-log \
--forwarded-allow-ips "${FORWARDED_ALLOW_IPS:-127.0.0.1}" \
--proxy-headers \
--no-server-header
--no-server-header \
--timeout-graceful-shutdown 300

211
LEADS_EXTRACTION.md Normal file
View File

@@ -0,0 +1,211 @@
# Email Leads Extraction and Import
This document describes the lead extraction and CSV import functionality for the Alpine Bits Python application.
## Overview
The system now supports extracting lead information from email MBOX files and importing the structured data into the application. This includes support for both the original landing page form CSV format and the new email lead export format.
## Lead Extraction (`extract_leads.py`)
### Purpose
Extracts structured lead information from email MBOX files (like Google Takeout exports) and exports them to CSV and JSON formats.
### Usage
```bash
python extract_leads.py
```
### Input Format
MBOX files containing emails with structured lead data in the following format:
```
Name: Martina
Nachname: Contarin
Mail: martinacontarin.mc@gmail.com
Tel: 3473907005
Anreise: 30.12.2025
Abreise: 04.01.2026
Erwachsene: 2
Kinder: 3
Alter Kind 1: 3
Alter Kind 2: 6
Alter Kind 3: 10
Apartment: Peonia
Verpflegung: Halbpension
```
### Output Formats
#### CSV Export (`leads_export.csv`)
Tabular format with the following columns:
- `name` - First name
- `lastname` - Last name
- `mail` - Email address
- `tel` - Phone number
- `anreise` - Check-in date (DD.MM.YYYY)
- `abreise` - Check-out date (DD.MM.YYYY)
- `erwachsene` - Number of adults
- `kinder` - Number of children
- `kind_ages` - Child ages as comma-separated string (e.g., "3,6,10")
- `apartments` - Comma-separated apartment preferences
- `verpflegung` - Meal plan preference
- `sprache` - Language
- `device` - Device information
- `anrede` - Salutation/title
- `land` - Country
- `privacy` - Privacy consent (Yes/No)
#### JSON Export (`leads_export.json`)
Same data in JSON format for programmatic access.
## CSV Import Integration
### Enhanced CSV Importer
The `CSVImporter` class in `csv_import.py` now supports both:
1. **German Landing Page Form Format** (original)
- Column names in German (Zeit der Einreichung, Anreisedatum, etc.)
- Child ages in individual columns (Alter Kind 1, Alter Kind 2, etc.)
2. **English Email Lead Export Format** (new)
- Column names in English (name, lastname, anreise, abreise, etc.)
- Child ages as comma-separated string in `kind_ages` column
### API Endpoint
The existing CSV import endpoint now handles both formats:
```http
PUT /api/admin/import-csv/{hotel_code}/{filename:path}
```
**Example with leads CSV:**
```bash
curl -X PUT \
-H "Authorization: Basic user:pass" \
--data-binary @leads_export.csv \
http://localhost:8000/api/admin/import-csv/bemelmans/leads.csv
```
### Features
- **Automatic Format Detection**: The importer automatically detects which format is being used
- **Child Age Handling**: Supports both individual age columns and comma-separated age format
- **Duplicate Detection**: Uses name, email, dates, and tracking IDs (fbclid/gclid) to prevent duplicates
- **Dry-Run Mode**: Test imports without committing data
- **Pre-Acknowledgement**: Optionally pre-acknowledge all imported reservations
- **Transaction Safety**: Rolls back on any error, maintaining data integrity
### Supported Columns
#### Required Fields
- `name` (or `Vorname`) - First name
- `lastname` (or `Nachname`) - Last name
#### Date Fields (required)
- `anreise` (or `Anreisedatum`) - Check-in date
- `abreise` (or `Abreisedatum`) - Check-out date
#### Guest Information
- `mail` (or `Email`) - Email address
- `tel` (or `Phone`) - Phone number
- `erwachsene` (or `Anzahl Erwachsene`) - Number of adults
- `kinder` (or `Anzahl Kinder`) - Number of children
- `kind_ages` (or individual `Alter Kind 1-10`) - Child ages
#### Preferences
- `apartments` (or `Angebot auswählen`) - Room/apartment preferences
- `verpflegung` - Meal plan preference
- `sprache` - Language preference
#### Metadata
- `device` - Device information
- `anrede` - Salutation/title
- `land` - Country
- `privacy` - Privacy consent
#### Tracking (optional)
- `utm_Source`, `utm_Medium`, `utm_Campaign`, `utm_Term`, `utm_Content` - UTM parameters
- `fbclid` - Facebook click ID
- `gclid` - Google click ID
### Import Examples
**Python:**
```python
from src.alpine_bits_python.csv_import import CSVImporter
from src.alpine_bits_python.db import AsyncSession
async with AsyncSession() as session:
importer = CSVImporter(session, config)
# Test import (dry-run)
result = await importer.import_csv_file(
csv_file_path="leads_export.csv",
hotel_code="bemelmans",
dryrun=True
)
# Actual import
stats = await importer.import_csv_file(
csv_file_path="leads_export.csv",
hotel_code="bemelmans",
pre_acknowledge=True,
client_id="my_client",
username="hotel_user"
)
print(f"Created {stats['created_reservations']} reservations")
```
**Command Line (via API):**
```bash
# Copy CSV to logs directory (endpoint expects it there)
cp leads_export.csv /logs/csv_imports/leads.csv
# Import via API
curl -X PUT \
-H "Authorization: Basic username:password" \
http://localhost:8000/api/admin/import-csv/bemelmans/leads.csv
```
### Return Values
The importer returns statistics:
```python
{
'total_rows': 576,
'skipped_empty': 0,
'created_customers': 45,
'existing_customers': 531,
'created_reservations': 576,
'skipped_duplicates': 0,
'pre_acknowledged': 576,
'errors': []
}
```
## Data Flow
```
Email MBOX Files
extract_leads.py
leads_export.csv / leads_export.json
CSV Import API
CSVImporter.import_csv_file()
Database (Customers & Reservations)
```
## Notes
- Dates can be in formats: `YYYY-MM-DD`, `DD.MM.YYYY`, or `DD/MM/YYYY`
- Child ages are validated to be between 0-17 years old
- If child count doesn't match the number of ages provided, the system will attempt to match them
- All imports are wrapped in database transactions for safety
- The API endpoint requires HTTP Basic Authentication

File diff suppressed because it is too large Load Diff

59
MIGRATION_FIXES.md Normal file
View File

@@ -0,0 +1,59 @@
# Migration Fixes for Production Database Compatibility
## Problem
The database migrations were failing when run against a production database dump because:
1. **First migration (630b0c367dcb)**: Tried to create an index on `acked_requests` that already existed in the production dump
2. **Third migration (08fe946414d8)**: Tried to add `hashed_customer_id` column to `reservations` without checking if it already existed
3. **Fourth migration (a1b2c3d4e5f6)**: Tried to modify `conversion_guests` table before it was guaranteed to exist
## Solutions Applied
### 1. Migration 630b0c367dcb - Initial Migration
**Change**: Made index creation idempotent by checking if index already exists before creating it
**Impact**: Allows migration to run even if production DB already has the `ix_acked_requests_username` index
### 2. Migration 08fe946414d8 - Add hashed_customer_id to reservations
**Change**: Added check to skip adding the column if it already exists
**Impact**:
- Preserves production data in `reservations` and `hashed_customers` tables
- Makes migration safe to re-run
- Still performs data migration to populate `hashed_customer_id` when needed
### 3. Migration a1b2c3d4e5f6 - Add hashed_customer_id to conversion_guests
**Change**: Added check to verify `conversion_guests` table exists before modifying it
**Impact**: Safely handles the case where table creation in a previous migration succeeded
## Data Preservation
All non-conversion tables are preserved:
-`customers`: 1095 rows preserved
-`reservations`: 1177 rows preserved
-`hashed_customers`: 1095 rows preserved
-`acked_requests`: preserved
Conversion tables are properly recreated:
-`conversions`: created fresh with new schema
-`conversion_rooms`: created fresh with new schema
-`conversion_guests`: created fresh with composite key
## Verification
After running `uv run alembic upgrade head`:
- All migrations apply successfully
- Database is at head revision: `a1b2c3d4e5f6`
- All required columns exist (`conversion_guests.hashed_customer_id`, `reservations.hashed_customer_id`)
- Production data is preserved
## Reset Instructions
If you need to reset and re-run all migrations:
```sql
DELETE FROM alpinebits.alembic_version;
```
Then run:
```bash
uv run alembic upgrade head
```

37
MIGRATION_RESET.md Normal file
View File

@@ -0,0 +1,37 @@
# Migration Reset Instructions
If you need to reset the alembic_version table to start migrations from scratch:
## SQL Command
```sql
-- Connect to your database and run:
DELETE FROM alpinebits.alembic_version;
```
This clears all migration records so that `alembic upgrade head` will run all migrations from the beginning.
## Python One-Liner (if preferred)
```bash
uv run python -c "
import asyncio
from sqlalchemy import text
from alpine_bits_python.config_loader import load_config
from alpine_bits_python.db import get_database_url, get_database_schema
from sqlalchemy.ext.asyncio import create_async_engine
async def reset():
app_config = load_config()
db_url = get_database_url(app_config)
schema = get_database_schema(app_config)
engine = create_async_engine(db_url)
async with engine.begin() as conn:
await conn.execute(text(f'SET search_path TO {schema}'))
await conn.execute(text('DELETE FROM alembic_version'))
print('Cleared alembic_version table')
await engine.dispose()
asyncio.run(reset())
"
```

View File

@@ -0,0 +1,403 @@
# Webhook System Refactoring - Implementation Summary
## Overview
This document summarizes the webhook system refactoring that was implemented to solve race conditions, unify webhook handling, add security through randomized URLs, and migrate hotel configuration to the database.
## What Was Implemented
### 1. Database Models ✅
**File:** [src/alpine_bits_python/db.py](src/alpine_bits_python/db.py)
Added three new database models:
#### Hotel Model
- Stores hotel configuration (previously in `alpine_bits_auth` config.yaml section)
- Fields: hotel_id, hotel_name, username, password_hash (bcrypt), meta/google account IDs, push endpoint config
- Relationships: one-to-many with webhook_endpoints
#### WebhookEndpoint Model
- Stores webhook configurations per hotel
- Each hotel can have multiple webhook types (wix_form, generic, etc.)
- Each endpoint has a unique randomized webhook_secret (64-char URL-safe string)
- Fields: webhook_secret, webhook_type, hotel_id, description, is_enabled
#### WebhookRequest Model
- Tracks incoming webhooks for deduplication and retry handling
- Uses SHA256 payload hashing to detect duplicates
- Status tracking: pending → processing → completed/failed
- Supports payload purging after retention period
- Fields: payload_hash, status, payload_json, retry_count, created_at, processing timestamps
### 2. Alembic Migration ✅
**File:** [alembic/versions/2025_11_25_1155-e7ee03d8f430_add_hotels_and_webhook_tables.py](alembic/versions/2025_11_25_1155-e7ee03d8f430_add_hotels_and_webhook_tables.py)
- Creates all three tables with appropriate indexes
- Includes composite indexes for query performance
- Fully reversible (downgrade supported)
### 3. Hotel Service ✅
**File:** [src/alpine_bits_python/hotel_service.py](src/alpine_bits_python/hotel_service.py)
**Key Functions:**
- `hash_password()` - Bcrypt password hashing (12 rounds)
- `verify_password()` - Bcrypt password verification
- `generate_webhook_secret()` - Cryptographically secure secret generation
- `sync_config_to_database()` - Syncs config.yaml to database at startup
- Creates/updates hotels from alpine_bits_auth config
- Auto-generates default webhook endpoints if missing
- Idempotent - safe to run on every startup
**HotelService Class:**
- `get_hotel_by_id()` - Look up hotel by hotel_id
- `get_hotel_by_webhook_secret()` - Look up hotel and endpoint by webhook secret
- `get_hotel_by_username()` - Look up hotel by AlpineBits username
### 4. Webhook Processor Interface ✅
**File:** [src/alpine_bits_python/webhook_processor.py](src/alpine_bits_python/webhook_processor.py)
**Architecture:**
- Protocol-based interface for webhook processors
- Registry pattern for managing processor types
- Two built-in processors:
- `WixFormProcessor` - Wraps existing `process_wix_form_submission()`
- `GenericWebhookProcessor` - Wraps existing `process_generic_webhook_submission()`
**Benefits:**
- Easy to add new webhook types
- Clean separation of concerns
- Type-safe processor interface
### 5. Config-to-Database Sync ✅
**File:** [src/alpine_bits_python/db_setup.py](src/alpine_bits_python/db_setup.py)
- Added call to `sync_config_to_database()` in `run_startup_tasks()`
- Runs on every application startup (primary worker only)
- Logs statistics about created/updated hotels and endpoints
### 6. Unified Webhook Handler ✅
**File:** [src/alpine_bits_python/api.py](src/alpine_bits_python/api.py)
**Endpoint:** `POST /api/webhook/{webhook_secret}`
**Flow:**
1. Look up webhook_endpoint by webhook_secret
2. Parse and hash payload (SHA256)
3. Check for duplicate using `SELECT FOR UPDATE SKIP LOCKED`
4. Return immediately if already processed (idempotent)
5. Create WebhookRequest with status='processing'
6. Route to appropriate processor based on webhook_type
7. Update status to 'completed' or 'failed'
8. Return response with webhook_id
**Race Condition Prevention:**
- PostgreSQL row-level locking with `SKIP LOCKED`
- Atomic status transitions
- Payload hash uniqueness constraint
- If duplicate detected during processing, return success (not error)
**Features:**
- Gzip decompression support
- Payload size limit (10MB)
- Automatic retry for failed webhooks
- Detailed error logging
- Source IP and user agent tracking
### 7. Cleanup and Monitoring ✅
**File:** [src/alpine_bits_python/api.py](src/alpine_bits_python/api.py)
**Functions:**
- `cleanup_stale_webhooks()` - Reset webhooks stuck in 'processing' (worker crash recovery)
- `purge_old_webhook_payloads()` - Remove payload_json from old completed webhooks (keeps metadata)
- `periodic_webhook_cleanup()` - Runs both cleanup tasks
**Scheduling:**
- Periodic task runs every 5 minutes (primary worker only)
- Stale timeout: 10 minutes
- Payload retention: 7 days before purge
### 8. Processor Initialization ✅
**File:** [src/alpine_bits_python/api.py](src/alpine_bits_python/api.py) - lifespan function
- Calls `initialize_webhook_processors()` during application startup
- Registers all built-in processors (wix_form, generic)
## What Was NOT Implemented (Future Work)
### 1. Legacy Endpoint Updates
The existing `/api/webhook/wix-form` and `/api/webhook/generic` endpoints still work as before. They could be updated to:
- Look up hotel from database
- Find appropriate webhook endpoint
- Redirect to unified handler
This is backward compatible, so it's not urgent.
### 2. AlpineBits Authentication Updates
The `validate_basic_auth()` function still reads from config.yaml. It could be updated to:
- Query hotels table by username
- Use bcrypt to verify password
- Return Hotel object instead of just credentials
This requires changing the AlpineBits auth flow, so it's a separate task.
### 3. Admin Endpoints
Could add endpoints for:
- `GET /admin/webhooks/stats` - Processing statistics
- `GET /admin/webhooks/failed` - Recent failures
- `POST /admin/webhooks/{id}/retry` - Manually retry failed webhook
- `GET /admin/hotels` - List all hotels with webhook URLs
- `POST /admin/hotels/{id}/webhook` - Create new webhook endpoint
### 4. Tests
Need to write tests for:
- Hotel service functions
- Webhook processors
- Unified webhook handler
- Race condition scenarios (concurrent identical webhooks)
- Deduplication logic
- Cleanup functions
## How to Use
### 1. Run Migration
```bash
uv run alembic upgrade head
```
### 2. Start Application
The application will automatically:
- Sync config.yaml hotels to database
- Generate default webhook endpoints for each hotel
- Log webhook URLs to console
- Start periodic cleanup tasks
### 3. Use New Webhook URLs
Each hotel will have webhook URLs like:
```
POST /api/webhook/{webhook_secret}
```
The webhook_secret is logged at startup, or you can query the database:
```sql
SELECT h.hotel_id, h.hotel_name, we.webhook_type, we.webhook_secret
FROM hotels h
JOIN webhook_endpoints we ON h.hotel_id = we.hotel_id
WHERE we.is_enabled = true;
```
Example webhook URL:
```
https://your-domain.com/api/webhook/x7K9mPq2rYv8sN4jZwL6tH1fBd3gCa5eFhIk0uMoQp-RnVxWy
```
### 4. Legacy Endpoints Still Work
Existing integrations using `/api/webhook/wix-form` or `/api/webhook/generic` will continue to work without changes.
## Benefits Achieved
### 1. Race Condition Prevention ✅
- PostgreSQL row-level locking prevents duplicate processing
- Atomic status transitions ensure only one worker processes each webhook
- Stale webhook cleanup recovers from worker crashes
### 2. Unified Webhook Handling ✅
- Single entry point with pluggable processor interface
- Easy to add new webhook types
- Consistent error handling and logging
### 3. Secure Webhook URLs ✅
- Randomized 64-character URL-safe secrets
- One unique secret per hotel/webhook-type combination
- No authentication needed (secret provides security)
### 4. Database-Backed Configuration ✅
- Hotel config automatically synced from config.yaml
- Passwords hashed with bcrypt
- Webhook endpoints stored in database
- Easy to manage via SQL queries
### 5. Payload Management ✅
- Automatic purging of old payloads (keeps metadata)
- Configurable retention period
- Efficient storage usage
### 6. Observability ✅
- Webhook requests tracked in database
- Status history maintained
- Source IP and user agent logged
- Retry count tracked
- Error messages stored
## Configuration
### Existing Config (config.yaml)
No changes required! The existing `alpine_bits_auth` section is still read and synced to the database automatically:
```yaml
alpine_bits_auth:
- hotel_id: "123"
hotel_name: "Example Hotel"
username: "hotel123"
password: "secret" # Will be hashed with bcrypt in database
meta_account: "1234567890"
google_account: "9876543210"
push_endpoint:
url: "https://example.com/push"
token: "token123"
username: "pushuser"
```
### New Optional Config
You can add webhook-specific configuration:
```yaml
webhooks:
stale_timeout_minutes: 10 # Timeout for stuck webhooks (default: 10)
payload_retention_days: 7 # Days before purging payload_json (default: 7)
cleanup_interval_minutes: 5 # How often to run cleanup (default: 5)
```
## Database Queries
### View All Webhook URLs
```sql
SELECT
h.hotel_id,
h.hotel_name,
we.webhook_type,
we.webhook_secret,
'https://your-domain.com/api/webhook/' || we.webhook_secret AS webhook_url
FROM hotels h
JOIN webhook_endpoints we ON h.hotel_id = we.hotel_id
WHERE we.is_enabled = true
ORDER BY h.hotel_id, we.webhook_type;
```
### View Recent Webhook Activity
```sql
SELECT
wr.id,
wr.created_at,
h.hotel_name,
we.webhook_type,
wr.status,
wr.retry_count,
wr.created_customer_id,
wr.created_reservation_id
FROM webhook_requests wr
JOIN webhook_endpoints we ON wr.webhook_endpoint_id = we.id
JOIN hotels h ON we.hotel_id = h.hotel_id
ORDER BY wr.created_at DESC
LIMIT 50;
```
### View Failed Webhooks
```sql
SELECT
wr.id,
wr.created_at,
h.hotel_name,
we.webhook_type,
wr.retry_count,
wr.last_error
FROM webhook_requests wr
JOIN webhook_endpoints we ON wr.webhook_endpoint_id = we.id
JOIN hotels h ON we.hotel_id = h.hotel_id
WHERE wr.status = 'failed'
ORDER BY wr.created_at DESC;
```
### Webhook Statistics
```sql
SELECT
h.hotel_name,
we.webhook_type,
COUNT(*) AS total_requests,
SUM(CASE WHEN wr.status = 'completed' THEN 1 ELSE 0 END) AS completed,
SUM(CASE WHEN wr.status = 'failed' THEN 1 ELSE 0 END) AS failed,
SUM(CASE WHEN wr.status = 'processing' THEN 1 ELSE 0 END) AS processing,
AVG(EXTRACT(EPOCH FROM (wr.processing_completed_at - wr.processing_started_at))) AS avg_processing_seconds
FROM webhook_requests wr
JOIN webhook_endpoints we ON wr.webhook_endpoint_id = we.id
JOIN hotels h ON we.hotel_id = h.hotel_id
WHERE wr.created_at > NOW() - INTERVAL '7 days'
GROUP BY h.hotel_name, we.webhook_type
ORDER BY total_requests DESC;
```
## Security Considerations
### 1. Password Storage
- Passwords are hashed with bcrypt (12 rounds)
- Plain text passwords never stored in database
- Config sync does NOT update password_hash (security)
- To change password: manually update database or delete hotel record
### 2. Webhook Secrets
- Generated using `secrets.token_urlsafe(48)` (cryptographically secure)
- 64-character URL-safe strings
- Unique per endpoint
- Act as API keys (no additional auth needed)
### 3. Payload Size Limits
- 10MB maximum payload size
- Prevents memory exhaustion attacks
- Configurable in code
### 4. Rate Limiting
- Existing rate limiting still applies
- Uses slowapi with configured limits
## Next Steps
1. **Test Migration** - Run `uv run alembic upgrade head` in test environment
2. **Verify Sync** - Start application and check logs for hotel sync statistics
3. **Test Webhook URLs** - Send test payloads to new unified endpoint
4. **Monitor Performance** - Watch for any issues with concurrent webhooks
5. **Add Tests** - Write comprehensive test suite
6. **Update Documentation** - Document webhook URLs for external integrations
7. **Consider Admin UI** - Build admin interface for managing hotels/webhooks
## Files Modified
1. `src/alpine_bits_python/db.py` - Added Hotel, WebhookEndpoint, WebhookRequest models
2. `src/alpine_bits_python/db_setup.py` - Added config sync call
3. `src/alpine_bits_python/api.py` - Added unified handler, cleanup functions, processor initialization
4. `src/alpine_bits_python/hotel_service.py` - NEW FILE
5. `src/alpine_bits_python/webhook_processor.py` - NEW FILE
6. `alembic/versions/2025_11_25_1155-*.py` - NEW MIGRATION
## Rollback Plan
If issues are discovered:
1. **Rollback Migration:**
```bash
uv run alembic downgrade -1
```
2. **Revert Code:**
```bash
git revert <commit-hash>
```
3. **Fallback:**
- Legacy endpoints (`/webhook/wix-form`, `/webhook/generic`) still work
- No breaking changes to existing integrations
- Can disable new unified handler by removing route
## Success Metrics
- ✅ No duplicate customers/reservations created from concurrent webhooks
- ✅ Webhook processing latency maintained
- ✅ Zero data loss during migration
- ✅ Backward compatibility maintained
- ✅ Memory usage stable (payload purging working)
- ✅ Error rate < 1% for webhook processing
## Support
For issues or questions:
1. Check application logs for errors
2. Query `webhook_requests` table for failed webhooks
3. Review this document for configuration options
4. Check GitHub issues for known problems

View File

@@ -82,7 +82,7 @@ def do_run_migrations(connection: Connection) -> None:
with context.begin_transaction():
# Create schema if it doesn't exist
if SCHEMA:
connection.execute(text(f"CREATE SCHEMA IF NOT EXISTS {SCHEMA}"))
#connection.execute(text(f"CREATE SCHEMA IF NOT EXISTS {SCHEMA}"))
# Set search path to our schema
print(f"setting search path to schema {SCHEMA}, ")
connection.execute(text(f"SET search_path TO {SCHEMA}"))
@@ -106,9 +106,9 @@ async def run_async_migrations() -> None:
# PostgreSQL will emit all CREATE / ALTER / DROP statements
# in terms of this schema by default
connection.execute(text(f"SET search_path TO {SCHEMA}"))
await connection.execute(text(f"SET search_path TO {SCHEMA}"))
# in SQLAlchemy v2+ the search path change needs to be committed
connection.commit()
await connection.commit()
await connection.run_sync(do_run_migrations)
await connectable.dispose()

View File

@@ -1,108 +1,284 @@
"""Initial migration
Revision ID: 630b0c367dcb
Revises:
Revises:
Create Date: 2025-11-18 13:19:37.183397
"""
from typing import Sequence, Union
from alembic import op
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = '630b0c367dcb'
down_revision: Union[str, Sequence[str], None] = None
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
revision: str = "630b0c367dcb"
down_revision: str | Sequence[str] | None = None
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
"""Upgrade schema."""
# Drop existing tables to start with a clean slate
# Drop conversion_rooms first due to foreign key dependency
op.execute("DROP TABLE IF EXISTS conversion_rooms CASCADE")
op.execute("DROP TABLE IF EXISTS conversion_guests CASCADE")
op.execute("DROP TABLE IF EXISTS conversions CASCADE")
print("dropped existing conversion tables")
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('conversion_rooms',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('conversion_id', sa.Integer(), nullable=False),
sa.Column('pms_hotel_reservation_id', sa.String(), nullable=True),
sa.Column('arrival_date', sa.Date(), nullable=True),
sa.Column('departure_date', sa.Date(), nullable=True),
sa.Column('room_status', sa.String(), nullable=True),
sa.Column('room_type', sa.String(), nullable=True),
sa.Column('room_number', sa.String(), nullable=True),
sa.Column('num_adults', sa.Integer(), nullable=True),
sa.Column('rate_plan_code', sa.String(), nullable=True),
sa.Column('connected_room_type', sa.String(), nullable=True),
sa.Column('daily_sales', sa.JSON(), nullable=True),
sa.Column('total_revenue', sa.String(), nullable=True),
sa.Column('created_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True),
sa.ForeignKeyConstraint(['conversion_id'], ['alpinebits.conversions.id'], ),
sa.PrimaryKeyConstraint('id')
# Create conversions table
op.create_table(
"conversions",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("reservation_id", sa.Integer(), nullable=True),
sa.Column("customer_id", sa.Integer(), nullable=True),
sa.Column("hashed_customer_id", sa.Integer(), nullable=True),
sa.Column("hotel_id", sa.String(), nullable=True),
sa.Column("pms_reservation_id", sa.String(), nullable=True),
sa.Column("reservation_number", sa.String(), nullable=True),
sa.Column("reservation_date", sa.Date(), nullable=True),
sa.Column("creation_time", sa.DateTime(timezone=True), nullable=True),
sa.Column("reservation_type", sa.String(), nullable=True),
sa.Column("booking_channel", sa.String(), nullable=True),
sa.Column("guest_first_name", sa.String(), nullable=True),
sa.Column("guest_last_name", sa.String(), nullable=True),
sa.Column("guest_email", sa.String(), nullable=True),
sa.Column("guest_country_code", sa.String(), nullable=True),
sa.Column("advertising_medium", sa.String(), nullable=True),
sa.Column("advertising_partner", sa.String(), nullable=True),
sa.Column("advertising_campagne", sa.String(), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=True),
sa.ForeignKeyConstraint(
["customer_id"],
["customers.id"],
),
sa.ForeignKeyConstraint(
["hashed_customer_id"],
["hashed_customers.id"],
),
sa.ForeignKeyConstraint(
["reservation_id"],
["reservations.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(op.f('ix_conversion_rooms_arrival_date'), 'conversion_rooms', ['arrival_date'], unique=False)
op.create_index(op.f('ix_conversion_rooms_conversion_id'), 'conversion_rooms', ['conversion_id'], unique=False)
op.create_index(op.f('ix_conversion_rooms_departure_date'), 'conversion_rooms', ['departure_date'], unique=False)
op.create_index(op.f('ix_conversion_rooms_pms_hotel_reservation_id'), 'conversion_rooms', ['pms_hotel_reservation_id'], unique=False)
op.create_index(op.f('ix_conversion_rooms_room_number'), 'conversion_rooms', ['room_number'], unique=False)
op.create_index(op.f('ix_acked_requests_username'), 'acked_requests', ['username'], unique=False)
op.add_column('conversions', sa.Column('guest_first_name', sa.String(), nullable=True))
op.add_column('conversions', sa.Column('guest_last_name', sa.String(), nullable=True))
op.add_column('conversions', sa.Column('guest_email', sa.String(), nullable=True))
op.add_column('conversions', sa.Column('guest_country_code', sa.String(), nullable=True))
op.add_column('conversions', sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True))
op.drop_index(op.f('ix_conversions_sale_date'), table_name='conversions')
op.create_index(op.f('ix_conversions_guest_email'), 'conversions', ['guest_email'], unique=False)
op.create_index(op.f('ix_conversions_guest_first_name'), 'conversions', ['guest_first_name'], unique=False)
op.create_index(op.f('ix_conversions_guest_last_name'), 'conversions', ['guest_last_name'], unique=False)
op.drop_column('conversions', 'rate_plan_code')
op.drop_column('conversions', 'revenue_total')
op.drop_column('conversions', 'revenue_other')
op.drop_column('conversions', 'sale_date')
op.drop_column('conversions', 'room_status')
op.drop_column('conversions', 'revenue_board')
op.drop_column('conversions', 'departure_date')
op.drop_column('conversions', 'revenue_spa')
op.drop_column('conversions', 'num_adults')
op.drop_column('conversions', 'room_type')
op.drop_column('conversions', 'revenue_logis')
op.drop_column('conversions', 'room_number')
op.drop_column('conversions', 'arrival_date')
op.drop_column('conversions', 'revenue_fb')
op.create_index(
op.f("ix_conversions_advertising_campagne"),
"conversions",
["advertising_campagne"],
unique=False,
)
op.create_index(
op.f("ix_conversions_advertising_medium"),
"conversions",
["advertising_medium"],
unique=False,
)
op.create_index(
op.f("ix_conversions_advertising_partner"),
"conversions",
["advertising_partner"],
unique=False,
)
op.create_index(
op.f("ix_conversions_customer_id"), "conversions", ["customer_id"], unique=False
)
op.create_index(
op.f("ix_conversions_guest_email"), "conversions", ["guest_email"], unique=False
)
op.create_index(
op.f("ix_conversions_guest_first_name"),
"conversions",
["guest_first_name"],
unique=False,
)
op.create_index(
op.f("ix_conversions_guest_last_name"),
"conversions",
["guest_last_name"],
unique=False,
)
op.create_index(
op.f("ix_conversions_hashed_customer_id"),
"conversions",
["hashed_customer_id"],
unique=False,
)
op.create_index(
op.f("ix_conversions_hotel_id"), "conversions", ["hotel_id"], unique=False
)
op.create_index(
op.f("ix_conversions_pms_reservation_id"),
"conversions",
["pms_reservation_id"],
unique=False,
)
op.create_index(
op.f("ix_conversions_reservation_id"),
"conversions",
["reservation_id"],
unique=False,
)
# Create conversion_rooms table
op.create_table(
"conversion_rooms",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("conversion_id", sa.Integer(), nullable=False),
sa.Column("pms_hotel_reservation_id", sa.String(), nullable=True),
sa.Column("arrival_date", sa.Date(), nullable=True),
sa.Column("departure_date", sa.Date(), nullable=True),
sa.Column("room_status", sa.String(), nullable=True),
sa.Column("room_type", sa.String(), nullable=True),
sa.Column("room_number", sa.String(), nullable=True),
sa.Column("num_adults", sa.Integer(), nullable=True),
sa.Column("rate_plan_code", sa.String(), nullable=True),
sa.Column("connected_room_type", sa.String(), nullable=True),
sa.Column("daily_sales", sa.JSON(), nullable=True),
sa.Column("total_revenue", sa.String(), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=True),
sa.ForeignKeyConstraint(
["conversion_id"],
["alpinebits.conversions.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(
op.f("ix_conversion_rooms_arrival_date"),
"conversion_rooms",
["arrival_date"],
unique=False,
)
op.create_index(
op.f("ix_conversion_rooms_conversion_id"),
"conversion_rooms",
["conversion_id"],
unique=False,
)
op.create_index(
op.f("ix_conversion_rooms_departure_date"),
"conversion_rooms",
["departure_date"],
unique=False,
)
op.create_index(
op.f("ix_conversion_rooms_pms_hotel_reservation_id"),
"conversion_rooms",
["pms_hotel_reservation_id"],
unique=False,
)
op.create_index(
op.f("ix_conversion_rooms_room_number"),
"conversion_rooms",
["room_number"],
unique=False,
)
# Create index on acked_requests if it doesn't exist
connection = op.get_bind()
inspector = sa.inspect(connection)
# Get existing indices on acked_requests
acked_requests_indices = [idx['name'] for idx in inspector.get_indexes('acked_requests')]
# Only create index if it doesn't exist
if "ix_acked_requests_username" not in acked_requests_indices:
op.create_index(
op.f("ix_acked_requests_username"), "acked_requests", ["username"], unique=False
)
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('conversions', sa.Column('revenue_fb', sa.VARCHAR(), autoincrement=False, nullable=True))
op.add_column('conversions', sa.Column('arrival_date', sa.DATE(), autoincrement=False, nullable=True))
op.add_column('conversions', sa.Column('room_number', sa.VARCHAR(), autoincrement=False, nullable=True))
op.add_column('conversions', sa.Column('revenue_logis', sa.VARCHAR(), autoincrement=False, nullable=True))
op.add_column('conversions', sa.Column('room_type', sa.VARCHAR(), autoincrement=False, nullable=True))
op.add_column('conversions', sa.Column('num_adults', sa.INTEGER(), autoincrement=False, nullable=True))
op.add_column('conversions', sa.Column('revenue_spa', sa.VARCHAR(), autoincrement=False, nullable=True))
op.add_column('conversions', sa.Column('departure_date', sa.DATE(), autoincrement=False, nullable=True))
op.add_column('conversions', sa.Column('revenue_board', sa.VARCHAR(), autoincrement=False, nullable=True))
op.add_column('conversions', sa.Column('room_status', sa.VARCHAR(), autoincrement=False, nullable=True))
op.add_column('conversions', sa.Column('sale_date', sa.DATE(), autoincrement=False, nullable=True))
op.add_column('conversions', sa.Column('revenue_other', sa.VARCHAR(), autoincrement=False, nullable=True))
op.add_column('conversions', sa.Column('revenue_total', sa.VARCHAR(), autoincrement=False, nullable=True))
op.add_column('conversions', sa.Column('rate_plan_code', sa.VARCHAR(), autoincrement=False, nullable=True))
op.drop_index(op.f('ix_conversions_guest_last_name'), table_name='conversions')
op.drop_index(op.f('ix_conversions_guest_first_name'), table_name='conversions')
op.drop_index(op.f('ix_conversions_guest_email'), table_name='conversions')
op.create_index(op.f('ix_conversions_sale_date'), 'conversions', ['sale_date'], unique=False)
op.drop_column('conversions', 'updated_at')
op.drop_column('conversions', 'guest_country_code')
op.drop_column('conversions', 'guest_email')
op.drop_column('conversions', 'guest_last_name')
op.drop_column('conversions', 'guest_first_name')
op.drop_index(op.f('ix_acked_requests_username'), table_name='acked_requests')
op.drop_index(op.f('ix_conversion_rooms_room_number'), table_name='conversion_rooms')
op.drop_index(op.f('ix_conversion_rooms_pms_hotel_reservation_id'), table_name='conversion_rooms')
op.drop_index(op.f('ix_conversion_rooms_departure_date'), table_name='conversion_rooms')
op.drop_index(op.f('ix_conversion_rooms_conversion_id'), table_name='conversion_rooms')
op.drop_index(op.f('ix_conversion_rooms_arrival_date'), table_name='conversion_rooms')
op.drop_table('conversion_rooms')
op.add_column(
"conversions",
sa.Column("revenue_fb", sa.VARCHAR(), autoincrement=False, nullable=True),
)
op.add_column(
"conversions",
sa.Column("arrival_date", sa.DATE(), autoincrement=False, nullable=True),
)
op.add_column(
"conversions",
sa.Column("room_number", sa.VARCHAR(), autoincrement=False, nullable=True),
)
op.add_column(
"conversions",
sa.Column("revenue_logis", sa.VARCHAR(), autoincrement=False, nullable=True),
)
op.add_column(
"conversions",
sa.Column("room_type", sa.VARCHAR(), autoincrement=False, nullable=True),
)
op.add_column(
"conversions",
sa.Column("num_adults", sa.INTEGER(), autoincrement=False, nullable=True),
)
op.add_column(
"conversions",
sa.Column("revenue_spa", sa.VARCHAR(), autoincrement=False, nullable=True),
)
op.add_column(
"conversions",
sa.Column("departure_date", sa.DATE(), autoincrement=False, nullable=True),
)
op.add_column(
"conversions",
sa.Column("revenue_board", sa.VARCHAR(), autoincrement=False, nullable=True),
)
op.add_column(
"conversions",
sa.Column("room_status", sa.VARCHAR(), autoincrement=False, nullable=True),
)
op.add_column(
"conversions",
sa.Column("sale_date", sa.DATE(), autoincrement=False, nullable=True),
)
op.add_column(
"conversions",
sa.Column("revenue_other", sa.VARCHAR(), autoincrement=False, nullable=True),
)
op.add_column(
"conversions",
sa.Column("revenue_total", sa.VARCHAR(), autoincrement=False, nullable=True),
)
op.add_column(
"conversions",
sa.Column("rate_plan_code", sa.VARCHAR(), autoincrement=False, nullable=True),
)
op.drop_index(op.f("ix_conversions_guest_last_name"), table_name="conversions")
op.drop_index(op.f("ix_conversions_guest_first_name"), table_name="conversions")
op.drop_index(op.f("ix_conversions_guest_email"), table_name="conversions")
op.create_index(
op.f("ix_conversions_sale_date"), "conversions", ["sale_date"], unique=False
)
op.drop_column("conversions", "updated_at")
op.drop_column("conversions", "guest_country_code")
op.drop_column("conversions", "guest_email")
op.drop_column("conversions", "guest_last_name")
op.drop_column("conversions", "guest_first_name")
op.drop_index(op.f("ix_acked_requests_username"), table_name="acked_requests")
op.drop_index(
op.f("ix_conversion_rooms_room_number"), table_name="conversion_rooms"
)
op.drop_index(
op.f("ix_conversion_rooms_pms_hotel_reservation_id"),
table_name="conversion_rooms",
)
op.drop_index(
op.f("ix_conversion_rooms_departure_date"), table_name="conversion_rooms"
)
op.drop_index(
op.f("ix_conversion_rooms_conversion_id"), table_name="conversion_rooms"
)
op.drop_index(
op.f("ix_conversion_rooms_arrival_date"), table_name="conversion_rooms"
)
op.drop_table("conversion_rooms")
# ### end Alembic commands ###

View File

@@ -0,0 +1,284 @@
"""Update conversions schema with new attribution fields and composite key for guests.
Revision ID: a2b3c4d5e6f7
Revises: 630b0c367dcb
Create Date: 2025-11-19 00:00:00.000000
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "a2b3c4d5e6f7"
down_revision: str | Sequence[str] | None = "630b0c367dcb"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
"""Upgrade schema."""
# Drop existing conversion tables to migrate to new schema
# Drop conversion_rooms first due to foreign key dependency
op.execute("DROP TABLE IF EXISTS conversion_rooms CASCADE")
op.execute("DROP TABLE IF EXISTS conversions CASCADE")
op.execute("DROP TABLE IF EXISTS conversion_guests CASCADE")
# Create conversion_guests table with composite primary key (hotel_id, guest_id)
op.create_table(
"conversion_guests",
sa.Column("hotel_id", sa.String(), nullable=False, primary_key=True),
sa.Column("guest_id", sa.String(), nullable=False, primary_key=True),
sa.Column("guest_first_name", sa.String(), nullable=True),
sa.Column("guest_last_name", sa.String(), nullable=True),
sa.Column("guest_email", sa.String(), nullable=True),
sa.Column("guest_country_code", sa.String(), nullable=True),
sa.Column("guest_birth_date", sa.Date(), nullable=True),
sa.Column("hashed_first_name", sa.String(64), nullable=True),
sa.Column("hashed_last_name", sa.String(64), nullable=True),
sa.Column("hashed_email", sa.String(64), nullable=True),
sa.Column("hashed_country_code", sa.String(64), nullable=True),
sa.Column("hashed_birth_date", sa.String(64), nullable=True),
sa.Column("is_regular", sa.Boolean(), default=False, nullable=False),
sa.Column("first_seen", sa.DateTime(timezone=True), nullable=True),
sa.Column("last_seen", sa.DateTime(timezone=True), nullable=True),
sa.PrimaryKeyConstraint("hotel_id", "guest_id"),
)
op.create_index(
op.f("ix_conversion_guests_hotel_id"),
"conversion_guests",
["hotel_id"],
unique=False,
)
op.create_index(
op.f("ix_conversion_guests_guest_id"),
"conversion_guests",
["guest_id"],
unique=False,
)
op.create_index(
op.f("ix_conversion_guests_hashed_first_name"),
"conversion_guests",
["hashed_first_name"],
unique=False,
)
op.create_index(
op.f("ix_conversion_guests_hashed_last_name"),
"conversion_guests",
["hashed_last_name"],
unique=False,
)
op.create_index(
op.f("ix_conversion_guests_hashed_email"),
"conversion_guests",
["hashed_email"],
unique=False,
)
# Create conversions table with new schema
op.create_table(
"conversions",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("reservation_id", sa.Integer(), nullable=True),
sa.Column("customer_id", sa.Integer(), nullable=True),
sa.Column("hashed_customer_id", sa.Integer(), nullable=True),
sa.Column("hotel_id", sa.String(), nullable=True),
sa.Column("guest_id", sa.String(), nullable=True),
sa.Column("pms_reservation_id", sa.String(), nullable=True),
sa.Column("reservation_number", sa.String(), nullable=True),
sa.Column("reservation_date", sa.Date(), nullable=True),
sa.Column("creation_time", sa.DateTime(timezone=True), nullable=True),
sa.Column("reservation_type", sa.String(), nullable=True),
sa.Column("booking_channel", sa.String(), nullable=True),
sa.Column("advertising_medium", sa.String(), nullable=True),
sa.Column("advertising_partner", sa.String(), nullable=True),
sa.Column("advertising_campagne", sa.String(), nullable=True),
sa.Column("directly_attributable", sa.Boolean(), default=False, nullable=False),
sa.Column("guest_matched", sa.Boolean(), default=False, nullable=False),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=True),
sa.ForeignKeyConstraint(["reservation_id"], ["reservations.id"]),
sa.ForeignKeyConstraint(["customer_id"], ["customers.id"]),
sa.ForeignKeyConstraint(["hashed_customer_id"], ["hashed_customers.id"]),
sa.ForeignKeyConstraint(
["hotel_id", "guest_id"],
["conversion_guests.hotel_id", "conversion_guests.guest_id"],
ondelete="SET NULL",
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(
op.f("ix_conversions_advertising_campagne"),
"conversions",
["advertising_campagne"],
unique=False,
)
op.create_index(
op.f("ix_conversions_advertising_medium"),
"conversions",
["advertising_medium"],
unique=False,
)
op.create_index(
op.f("ix_conversions_advertising_partner"),
"conversions",
["advertising_partner"],
unique=False,
)
op.create_index(
op.f("ix_conversions_customer_id"),
"conversions",
["customer_id"],
unique=False,
)
op.create_index(
op.f("ix_conversions_hashed_customer_id"),
"conversions",
["hashed_customer_id"],
unique=False,
)
op.create_index(
op.f("ix_conversions_hotel_id"),
"conversions",
["hotel_id"],
unique=False,
)
op.create_index(
op.f("ix_conversions_guest_id"),
"conversions",
["guest_id"],
unique=False,
)
op.create_index(
op.f("ix_conversions_pms_reservation_id"),
"conversions",
["pms_reservation_id"],
unique=False,
)
op.create_index(
op.f("ix_conversions_reservation_id"),
"conversions",
["reservation_id"],
unique=False,
)
# Create conversion_rooms table
op.create_table(
"conversion_rooms",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("conversion_id", sa.Integer(), nullable=False),
sa.Column("pms_hotel_reservation_id", sa.String(), nullable=True),
sa.Column("arrival_date", sa.Date(), nullable=True),
sa.Column("departure_date", sa.Date(), nullable=True),
sa.Column("room_status", sa.String(), nullable=True),
sa.Column("room_type", sa.String(), nullable=True),
sa.Column("room_number", sa.String(), nullable=True),
sa.Column("num_adults", sa.Integer(), nullable=True),
sa.Column("rate_plan_code", sa.String(), nullable=True),
sa.Column("connected_room_type", sa.String(), nullable=True),
sa.Column("daily_sales", sa.JSON(), nullable=True),
sa.Column("total_revenue", sa.Double(), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=True),
sa.ForeignKeyConstraint(["conversion_id"], ["conversions.id"]),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(
op.f("ix_conversion_rooms_arrival_date"),
"conversion_rooms",
["arrival_date"],
unique=False,
)
op.create_index(
op.f("ix_conversion_rooms_conversion_id"),
"conversion_rooms",
["conversion_id"],
unique=False,
)
op.create_index(
op.f("ix_conversion_rooms_departure_date"),
"conversion_rooms",
["departure_date"],
unique=False,
)
op.create_index(
op.f("ix_conversion_rooms_pms_hotel_reservation_id"),
"conversion_rooms",
["pms_hotel_reservation_id"],
unique=False,
)
op.create_index(
op.f("ix_conversion_rooms_room_number"),
"conversion_rooms",
["room_number"],
unique=False,
)
def downgrade() -> None:
"""Downgrade schema."""
op.drop_index(
op.f("ix_conversion_rooms_room_number"), table_name="conversion_rooms"
)
op.drop_index(
op.f("ix_conversion_rooms_pms_hotel_reservation_id"),
table_name="conversion_rooms",
)
op.drop_index(
op.f("ix_conversion_rooms_departure_date"), table_name="conversion_rooms"
)
op.drop_index(
op.f("ix_conversion_rooms_conversion_id"), table_name="conversion_rooms"
)
op.drop_index(
op.f("ix_conversion_rooms_arrival_date"), table_name="conversion_rooms"
)
op.drop_table("conversion_rooms")
op.drop_index(
op.f("ix_conversions_reservation_id"), table_name="conversions"
)
op.drop_index(
op.f("ix_conversions_pms_reservation_id"), table_name="conversions"
)
op.drop_index(
op.f("ix_conversions_guest_id"), table_name="conversions"
)
op.drop_index(
op.f("ix_conversions_hotel_id"), table_name="conversions"
)
op.drop_index(
op.f("ix_conversions_hashed_customer_id"), table_name="conversions"
)
op.drop_index(
op.f("ix_conversions_customer_id"), table_name="conversions"
)
op.drop_index(
op.f("ix_conversions_advertising_partner"), table_name="conversions"
)
op.drop_index(
op.f("ix_conversions_advertising_medium"), table_name="conversions"
)
op.drop_index(
op.f("ix_conversions_advertising_campagne"), table_name="conversions"
)
op.drop_table("conversions")
op.drop_index(
op.f("ix_conversion_guests_hashed_email"), table_name="conversion_guests"
)
op.drop_index(
op.f("ix_conversion_guests_hashed_last_name"), table_name="conversion_guests"
)
op.drop_index(
op.f("ix_conversion_guests_hashed_first_name"), table_name="conversion_guests"
)
op.drop_index(
op.f("ix_conversion_guests_guest_id"), table_name="conversion_guests"
)
op.drop_index(
op.f("ix_conversion_guests_hotel_id"), table_name="conversion_guests"
)
op.drop_table("conversion_guests")

View File

@@ -0,0 +1,71 @@
"""add hashed_customer_id to reservations with cascade delete
Revision ID: 08fe946414d8
Revises: 70b2579d1d96
Create Date: 2025-11-19 14:57:27.178924
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '08fe946414d8'
down_revision: Union[str, Sequence[str], None] = 'a2b3c4d5e6f7'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
connection = op.get_bind()
# Check if hashed_customer_id column already exists in reservations
inspector = sa.inspect(connection)
reservations_columns = [col['name'] for col in inspector.get_columns('reservations')]
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column('hashed_customers', 'customer_id',
existing_type=sa.INTEGER(),
nullable=True)
op.drop_constraint(op.f('hashed_customers_customer_id_fkey'), 'hashed_customers', type_='foreignkey')
op.create_foreign_key(None, 'hashed_customers', 'customers', ['customer_id'], ['id'], ondelete='SET NULL')
op.drop_constraint(op.f('reservations_customer_id_fkey'), 'reservations', type_='foreignkey')
op.create_foreign_key(None, 'reservations', 'customers', ['customer_id'], ['id'], ondelete='SET NULL')
# Add hashed_customer_id column to reservations if it doesn't exist
if 'hashed_customer_id' not in reservations_columns:
op.add_column('reservations', sa.Column('hashed_customer_id', sa.Integer(), nullable=True))
op.create_index(op.f('ix_reservations_hashed_customer_id'), 'reservations', ['hashed_customer_id'], unique=False)
op.create_foreign_key(None, 'reservations', 'hashed_customers', ['hashed_customer_id'], ['id'], ondelete='CASCADE')
# Data migration: Populate hashed_customer_id from customer relationship
update_stmt = sa.text("""
UPDATE reservations r
SET hashed_customer_id = hc.id
FROM hashed_customers hc
WHERE r.customer_id = hc.customer_id
AND hc.customer_id IS NOT NULL
""")
connection.execute(update_stmt)
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
# Drop the hashed_customer_id column and its constraints
op.drop_constraint(None, 'reservations', type_='foreignkey')
op.drop_index(op.f('ix_reservations_hashed_customer_id'), table_name='reservations')
op.drop_column('reservations', 'hashed_customer_id')
op.drop_constraint(None, 'reservations', type_='foreignkey')
op.create_foreign_key(op.f('reservations_customer_id_fkey'), 'reservations', 'customers', ['customer_id'], ['id'])
op.drop_constraint(None, 'hashed_customers', type_='foreignkey')
op.create_foreign_key(op.f('hashed_customers_customer_id_fkey'), 'hashed_customers', 'customers', ['customer_id'], ['id'])
op.alter_column('hashed_customers', 'customer_id',
existing_type=sa.INTEGER(),
nullable=False)
# ### end Alembic commands ###

View File

@@ -0,0 +1,45 @@
"""add hashed_customer_id to conversion_guests
Revision ID: a1b2c3d4e5f6
Revises: 08fe946414d8
Create Date: 2025-11-19 18:00:00.000000
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = 'a1b2c3d4e5f6'
down_revision: Union[str, Sequence[str], None] = '08fe946414d8'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
connection = op.get_bind()
inspector = sa.inspect(connection)
# Check if conversion_guests table and hashed_customer_id column exist
tables = inspector.get_table_names()
# Only proceed if conversion_guests table exists
if 'conversion_guests' in tables:
conversion_guests_columns = [col['name'] for col in inspector.get_columns('conversion_guests')]
# Add hashed_customer_id column if it doesn't exist
if 'hashed_customer_id' not in conversion_guests_columns:
op.add_column('conversion_guests', sa.Column('hashed_customer_id', sa.Integer(), nullable=True))
op.create_index(op.f('ix_conversion_guests_hashed_customer_id'), 'conversion_guests', ['hashed_customer_id'], unique=False)
op.create_foreign_key(None, 'conversion_guests', 'hashed_customers', ['hashed_customer_id'], ['id'], ondelete='SET NULL')
def downgrade() -> None:
"""Downgrade schema."""
# Drop the hashed_customer_id column and its constraints
op.drop_constraint(None, 'conversion_guests', type_='foreignkey')
op.drop_index(op.f('ix_conversion_guests_hashed_customer_id'), table_name='conversion_guests')
op.drop_column('conversion_guests', 'hashed_customer_id')

View File

@@ -0,0 +1,120 @@
"""add_hotels_and_webhook_tables
Revision ID: e7ee03d8f430
Revises: a1b2c3d4e5f6
Create Date: 2025-11-25 11:55:18.872715
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from alpine_bits_python.const import WebhookStatus
# revision identifiers, used by Alembic.
revision: str = 'e7ee03d8f430'
down_revision: Union[str, Sequence[str], None] = 'a1b2c3d4e5f6'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
# Create hotels table
op.create_table(
'hotels',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('hotel_id', sa.String(length=50), nullable=False),
sa.Column('hotel_name', sa.String(length=200), nullable=False),
sa.Column('username', sa.String(length=100), nullable=False),
sa.Column('password_hash', sa.String(length=200), nullable=False),
sa.Column('meta_account_id', sa.String(length=50), nullable=True),
sa.Column('google_account_id', sa.String(length=50), nullable=True),
sa.Column('push_endpoint_url', sa.String(length=500), nullable=True),
sa.Column('push_endpoint_token', sa.String(length=200), nullable=True),
sa.Column('push_endpoint_username', sa.String(length=100), nullable=True),
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
sa.Column('is_active', sa.Boolean(), nullable=False, default=True),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_hotels_hotel_id'), 'hotels', ['hotel_id'], unique=True)
op.create_index(op.f('ix_hotels_username'), 'hotels', ['username'], unique=True)
op.create_index(op.f('ix_hotels_is_active'), 'hotels', ['is_active'], unique=False)
# Create webhook_endpoints table
op.create_table(
'webhook_endpoints',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('hotel_id', sa.String(length=50), nullable=False),
sa.Column('webhook_secret', sa.String(length=64), nullable=False),
sa.Column('webhook_type', sa.String(length=50), nullable=False),
sa.Column('description', sa.String(length=200), nullable=True),
sa.Column('is_enabled', sa.Boolean(), nullable=False, default=True),
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(['hotel_id'], ['hotels.hotel_id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_webhook_endpoints_hotel_id'), 'webhook_endpoints', ['hotel_id'], unique=False)
op.create_index(op.f('ix_webhook_endpoints_webhook_secret'), 'webhook_endpoints', ['webhook_secret'], unique=True)
op.create_index('idx_webhook_endpoint_hotel_type', 'webhook_endpoints', ['hotel_id', 'webhook_type'], unique=False)
# Create webhook_requests table
op.create_table(
'webhook_requests',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('payload_hash', sa.String(length=64), nullable=False),
sa.Column('webhook_endpoint_id', sa.Integer(), nullable=True),
sa.Column('hotel_id', sa.String(length=50), nullable=True),
sa.Column('status', sa.String(length=20), nullable=False, default=WebhookStatus.PENDING.value),
sa.Column('processing_started_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('processing_completed_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('retry_count', sa.Integer(), nullable=True, default=0),
sa.Column('last_error', sa.String(length=2000), nullable=True),
sa.Column('payload_json', sa.JSON(), nullable=True),
sa.Column('purged_at', sa.DateTime(timezone=True), nullable=True),
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
sa.Column('source_ip', sa.String(length=45), nullable=True),
sa.Column('user_agent', sa.String(length=500), nullable=True),
sa.Column('created_customer_id', sa.Integer(), nullable=True),
sa.Column('created_reservation_id', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['webhook_endpoint_id'], ['webhook_endpoints.id'], ),
sa.ForeignKeyConstraint(['hotel_id'], ['hotels.hotel_id'], ),
sa.ForeignKeyConstraint(['created_customer_id'], ['customers.id'], ),
sa.ForeignKeyConstraint(['created_reservation_id'], ['reservations.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_webhook_requests_payload_hash'), 'webhook_requests', ['payload_hash'], unique=True)
op.create_index(op.f('ix_webhook_requests_webhook_endpoint_id'), 'webhook_requests', ['webhook_endpoint_id'], unique=False)
op.create_index(op.f('ix_webhook_requests_hotel_id'), 'webhook_requests', ['hotel_id'], unique=False)
op.create_index(op.f('ix_webhook_requests_status'), 'webhook_requests', ['status'], unique=False)
op.create_index(op.f('ix_webhook_requests_created_at'), 'webhook_requests', ['created_at'], unique=False)
op.create_index('idx_webhook_status_created', 'webhook_requests', ['status', 'created_at'], unique=False)
op.create_index('idx_webhook_hotel_created', 'webhook_requests', ['hotel_id', 'created_at'], unique=False)
op.create_index('idx_webhook_purge_candidate', 'webhook_requests', ['status', 'purged_at', 'created_at'], unique=False)
def downgrade() -> None:
"""Downgrade schema."""
# Drop tables in reverse order (respecting foreign key constraints)
op.drop_index('idx_webhook_purge_candidate', table_name='webhook_requests')
op.drop_index('idx_webhook_hotel_created', table_name='webhook_requests')
op.drop_index('idx_webhook_status_created', table_name='webhook_requests')
op.drop_index(op.f('ix_webhook_requests_created_at'), table_name='webhook_requests')
op.drop_index(op.f('ix_webhook_requests_status'), table_name='webhook_requests')
op.drop_index(op.f('ix_webhook_requests_hotel_id'), table_name='webhook_requests')
op.drop_index(op.f('ix_webhook_requests_webhook_endpoint_id'), table_name='webhook_requests')
op.drop_index(op.f('ix_webhook_requests_payload_hash'), table_name='webhook_requests')
op.drop_table('webhook_requests')
op.drop_index('idx_webhook_endpoint_hotel_type', table_name='webhook_endpoints')
op.drop_index(op.f('ix_webhook_endpoints_webhook_secret'), table_name='webhook_endpoints')
op.drop_index(op.f('ix_webhook_endpoints_hotel_id'), table_name='webhook_endpoints')
op.drop_table('webhook_endpoints')
op.drop_index(op.f('ix_hotels_is_active'), table_name='hotels')
op.drop_index(op.f('ix_hotels_username'), table_name='hotels')
op.drop_index(op.f('ix_hotels_hotel_id'), table_name='hotels')
op.drop_table('hotels')

View File

@@ -0,0 +1,108 @@
"""Add hotel inventory and room availability tables
Revision ID: b2cfe2d3aabc
Revises: e7ee03d8f430
Create Date: 2025-11-27 12:00:00.000000
"""
from collections.abc import Sequence
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = "b2cfe2d3aabc"
down_revision: str | Sequence[str] | None = "e7ee03d8f430"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
"""Upgrade schema with inventory and availability tables."""
op.create_table(
"hotel_inventory",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("hotel_id", sa.String(length=50), nullable=False),
sa.Column("inv_type_code", sa.String(length=8), nullable=False),
sa.Column("inv_code", sa.String(length=16), nullable=True),
sa.Column("room_name", sa.String(length=200), nullable=True),
sa.Column("max_occupancy", sa.Integer(), nullable=True),
sa.Column("source", sa.String(length=20), nullable=False),
sa.Column("first_seen", sa.DateTime(timezone=True), nullable=False),
sa.Column("last_updated", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(["hotel_id"], ["hotels.hotel_id"], ondelete="CASCADE"),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(
op.f("ix_hotel_inventory_hotel_id"),
"hotel_inventory",
["hotel_id"],
unique=False,
)
op.create_index(
op.f("ix_hotel_inventory_inv_type_code"),
"hotel_inventory",
["inv_type_code"],
unique=False,
)
op.create_index(
op.f("ix_hotel_inventory_inv_code"),
"hotel_inventory",
["inv_code"],
unique=False,
)
op.create_index(
"uq_hotel_inventory_unique_key",
"hotel_inventory",
["hotel_id", "inv_type_code", sa.text("COALESCE(inv_code, '')")],
unique=True,
)
op.create_table(
"room_availability",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("inventory_id", sa.Integer(), nullable=False),
sa.Column("date", sa.Date(), nullable=False),
sa.Column("count_type_2", sa.Integer(), nullable=True),
sa.Column("count_type_6", sa.Integer(), nullable=True),
sa.Column("count_type_9", sa.Integer(), nullable=True),
sa.Column("is_closing_season", sa.Boolean(), nullable=False, server_default=sa.false()),
sa.Column("last_updated", sa.DateTime(timezone=True), nullable=False),
sa.Column("update_type", sa.String(length=20), nullable=False),
sa.ForeignKeyConstraint(["inventory_id"], ["hotel_inventory.id"], ondelete="CASCADE"),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("inventory_id", "date", name="uq_room_availability_unique_key"),
)
op.create_index(
op.f("ix_room_availability_inventory_id"),
"room_availability",
["inventory_id"],
unique=False,
)
op.create_index(
op.f("ix_room_availability_date"),
"room_availability",
["date"],
unique=False,
)
op.create_index(
"idx_room_availability_inventory_date",
"room_availability",
["inventory_id", "date"],
unique=False,
)
def downgrade() -> None:
"""Downgrade schema by removing availability tables."""
op.drop_index("idx_room_availability_inventory_date", table_name="room_availability")
op.drop_index(op.f("ix_room_availability_date"), table_name="room_availability")
op.drop_index(op.f("ix_room_availability_inventory_id"), table_name="room_availability")
op.drop_table("room_availability")
op.drop_index("uq_hotel_inventory_unique_key", table_name="hotel_inventory")
op.drop_index(op.f("ix_hotel_inventory_inv_code"), table_name="hotel_inventory")
op.drop_index(op.f("ix_hotel_inventory_inv_type_code"), table_name="hotel_inventory")
op.drop_index(op.f("ix_hotel_inventory_hotel_id"), table_name="hotel_inventory")
op.drop_table("hotel_inventory")

View File

@@ -0,0 +1,167 @@
"""Id columns changed to integer, foreign_keys added
Revision ID: b50c0f45030a
Revises: b2cfe2d3aabc
Create Date: 2025-12-02 11:06:25.850790
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = 'b50c0f45030a'
down_revision: Union[str, Sequence[str], None] = 'b2cfe2d3aabc'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
# Drop composite FK constraint first (references guest_id columns)
op.drop_constraint(
'conversions_hotel_id_guest_id_fkey', 'conversions', type_='foreignkey'
)
# Now convert the guest_id columns
op.alter_column('conversion_guests', 'guest_id',
existing_type=sa.VARCHAR(),
type_=sa.Integer(),
existing_nullable=False,
postgresql_using='guest_id::integer')
op.alter_column('conversion_guests', 'is_regular',
existing_type=sa.BOOLEAN(),
nullable=True)
op.drop_constraint(op.f('conversion_guests_hashed_customer_id_fkey'), 'conversion_guests', type_='foreignkey')
op.create_foreign_key(op.f('fk_conversion_guests_hashed_customer_id_hashed_customers'), 'conversion_guests', 'hashed_customers', ['hashed_customer_id'], ['id'])
# Create FK with NOT VALID to skip checking existing data
# (hotels table will be populated from config when app starts)
op.create_foreign_key(
op.f('fk_conversion_guests_hotel_id_hotels'),
'conversion_guests',
'hotels',
['hotel_id'],
['hotel_id'],
ondelete='CASCADE',
postgresql_not_valid=True
)
op.alter_column('conversions', 'hotel_id',
existing_type=sa.VARCHAR(),
nullable=False)
op.alter_column('conversions', 'pms_reservation_id',
existing_type=sa.VARCHAR(),
type_=sa.Integer(),
nullable=False,
postgresql_using='pms_reservation_id::integer')
op.alter_column('conversions', 'guest_id',
existing_type=sa.VARCHAR(),
type_=sa.Integer(),
existing_nullable=True,
postgresql_using='guest_id::integer')
op.alter_column('conversions', 'directly_attributable',
existing_type=sa.BOOLEAN(),
nullable=True)
op.alter_column('conversions', 'guest_matched',
existing_type=sa.BOOLEAN(),
nullable=True)
# Re-create composite FK constraint after column type changes
op.create_foreign_key(
'conversions_hotel_id_guest_id_fkey',
'conversions',
'conversion_guests',
['hotel_id', 'guest_id'],
['hotel_id', 'guest_id'],
ondelete='SET NULL'
)
op.create_unique_constraint('uq_conversion_hotel_reservation', 'conversions', ['hotel_id', 'pms_reservation_id'])
# Create FK with NOT VALID for same reason as above
op.create_foreign_key(
op.f('fk_conversions_hotel_id_hotels'),
'conversions',
'hotels',
['hotel_id'],
['hotel_id'],
ondelete='CASCADE',
postgresql_not_valid=True
)
op.drop_constraint(op.f('customers_contact_id_key'), 'customers', type_='unique')
op.create_unique_constraint(op.f('uq_customers_contact_id'), 'customers', ['contact_id'])
op.drop_constraint(op.f('hashed_customers_contact_id_key'), 'hashed_customers', type_='unique')
op.drop_constraint(op.f('hashed_customers_customer_id_key'), 'hashed_customers', type_='unique')
op.create_unique_constraint(op.f('uq_hashed_customers_contact_id'), 'hashed_customers', ['contact_id'])
op.create_unique_constraint(op.f('uq_hashed_customers_customer_id'), 'hashed_customers', ['customer_id'])
op.drop_index(op.f('ix_reservations_hashed_customer_id'), table_name='reservations')
op.drop_constraint(op.f('reservations_md5_unique_id_key'), 'reservations', type_='unique')
op.drop_constraint(op.f('reservations_unique_id_key'), 'reservations', type_='unique')
op.create_unique_constraint(op.f('uq_reservations_md5_unique_id'), 'reservations', ['md5_unique_id'])
op.create_unique_constraint(op.f('uq_reservations_unique_id'), 'reservations', ['unique_id'])
op.drop_index(op.f('idx_room_availability_inventory_date'), table_name='room_availability')
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.create_index(op.f('idx_room_availability_inventory_date'), 'room_availability', ['inventory_id', 'date'], unique=False)
op.drop_constraint(op.f('uq_reservations_unique_id'), 'reservations', type_='unique')
op.drop_constraint(op.f('uq_reservations_md5_unique_id'), 'reservations', type_='unique')
op.create_unique_constraint(op.f('reservations_unique_id_key'), 'reservations', ['unique_id'], postgresql_nulls_not_distinct=False)
op.create_unique_constraint(op.f('reservations_md5_unique_id_key'), 'reservations', ['md5_unique_id'], postgresql_nulls_not_distinct=False)
op.create_index(op.f('ix_reservations_hashed_customer_id'), 'reservations', ['hashed_customer_id'], unique=False)
op.drop_constraint(op.f('uq_hashed_customers_customer_id'), 'hashed_customers', type_='unique')
op.drop_constraint(op.f('uq_hashed_customers_contact_id'), 'hashed_customers', type_='unique')
op.create_unique_constraint(op.f('hashed_customers_customer_id_key'), 'hashed_customers', ['customer_id'], postgresql_nulls_not_distinct=False)
op.create_unique_constraint(op.f('hashed_customers_contact_id_key'), 'hashed_customers', ['contact_id'], postgresql_nulls_not_distinct=False)
op.drop_constraint(op.f('uq_customers_contact_id'), 'customers', type_='unique')
op.create_unique_constraint(op.f('customers_contact_id_key'), 'customers', ['contact_id'], postgresql_nulls_not_distinct=False)
op.drop_constraint(op.f('fk_conversions_hotel_id_hotels'), 'conversions', type_='foreignkey')
op.drop_constraint('uq_conversion_hotel_reservation', 'conversions', type_='unique')
# Drop composite FK constraint before changing column types back
op.drop_constraint(
'conversions_hotel_id_guest_id_fkey', 'conversions', type_='foreignkey'
)
op.alter_column('conversions', 'guest_matched',
existing_type=sa.BOOLEAN(),
nullable=False)
op.alter_column('conversions', 'directly_attributable',
existing_type=sa.BOOLEAN(),
nullable=False)
op.alter_column('conversions', 'guest_id',
existing_type=sa.Integer(),
type_=sa.VARCHAR(),
existing_nullable=True)
op.alter_column('conversions', 'pms_reservation_id',
existing_type=sa.Integer(),
type_=sa.VARCHAR(),
nullable=True)
op.alter_column('conversions', 'hotel_id',
existing_type=sa.VARCHAR(),
nullable=True)
op.drop_constraint(op.f('fk_conversion_guests_hotel_id_hotels'), 'conversion_guests', type_='foreignkey')
op.drop_constraint(op.f('fk_conversion_guests_hashed_customer_id_hashed_customers'), 'conversion_guests', type_='foreignkey')
op.create_foreign_key(op.f('conversion_guests_hashed_customer_id_fkey'), 'conversion_guests', 'hashed_customers', ['hashed_customer_id'], ['id'], ondelete='SET NULL')
op.alter_column('conversion_guests', 'is_regular',
existing_type=sa.BOOLEAN(),
nullable=False)
op.alter_column('conversion_guests', 'guest_id',
existing_type=sa.Integer(),
type_=sa.VARCHAR(),
existing_nullable=False)
# Re-create composite FK constraint after reverting column types
op.create_foreign_key(
'conversions_hotel_id_guest_id_fkey',
'conversions',
'conversion_guests',
['hotel_id', 'guest_id'],
['hotel_id', 'guest_id'],
ondelete='SET NULL'
)
# ### end Alembic commands ###

View File

@@ -0,0 +1,51 @@
"""remove_composite_fk_from_conversions
Revision ID: 694d52a883c3
Revises: b50c0f45030a
Create Date: 2025-12-03 09:50:18.506030
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '694d52a883c3'
down_revision: Union[str, Sequence[str], None] = 'b50c0f45030a'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint(op.f('conversions_hotel_id_guest_id_fkey'), 'conversions', type_='foreignkey')
# Rename hotel_code to hotel_id (preserving data) and add FK to hotels
op.add_column('reservations', sa.Column('hotel_id', sa.String(), nullable=True))
op.execute('UPDATE reservations SET hotel_id = hotel_code')
op.drop_column('reservations', 'hotel_code')
# Add FK constraint without immediate validation (NOT VALID)
# This allows existing rows with non-existent hotel_ids to remain
# Future inserts/updates will still be validated
op.execute(
'ALTER TABLE reservations ADD CONSTRAINT fk_reservations_hotel_id_hotels '
'FOREIGN KEY (hotel_id) REFERENCES hotels (hotel_id) ON DELETE CASCADE NOT VALID'
)
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
# Drop FK and rename hotel_id back to hotel_code (preserving data)
op.drop_constraint(op.f('fk_reservations_hotel_id_hotels'), 'reservations', type_='foreignkey')
op.add_column('reservations', sa.Column('hotel_code', sa.VARCHAR(), autoincrement=False, nullable=True))
op.execute('UPDATE reservations SET hotel_code = hotel_id')
op.drop_column('reservations', 'hotel_id')
op.create_foreign_key(op.f('conversions_hotel_id_guest_id_fkey'), 'conversions', 'conversion_guests', ['hotel_id', 'guest_id'], ['hotel_id', 'guest_id'], ondelete='SET NULL')
# ### end Alembic commands ###

View File

@@ -0,0 +1,104 @@
"""merge_hashed_customers_into_customers
Revision ID: 0fbeb40dbb2c
Revises: 694d52a883c3
Create Date: 2025-12-03 10:44:32.243220
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '0fbeb40dbb2c'
down_revision: Union[str, Sequence[str], None] = '694d52a883c3'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
# Add hashed columns to customers table
op.add_column('customers', sa.Column('hashed_email', sa.String(length=64), nullable=True))
op.add_column('customers', sa.Column('hashed_phone', sa.String(length=64), nullable=True))
op.add_column('customers', sa.Column('hashed_given_name', sa.String(length=64), nullable=True))
op.add_column('customers', sa.Column('hashed_surname', sa.String(length=64), nullable=True))
op.add_column('customers', sa.Column('hashed_city', sa.String(length=64), nullable=True))
op.add_column('customers', sa.Column('hashed_postal_code', sa.String(length=64), nullable=True))
op.add_column('customers', sa.Column('hashed_country_code', sa.String(length=64), nullable=True))
op.add_column('customers', sa.Column('hashed_gender', sa.String(length=64), nullable=True))
op.add_column('customers', sa.Column('hashed_birth_date', sa.String(length=64), nullable=True))
op.add_column('customers', sa.Column('created_at', sa.DateTime(timezone=True), nullable=True))
# Migrate data from hashed_customers to customers
op.execute('''
UPDATE customers c
SET
hashed_email = hc.hashed_email,
hashed_phone = hc.hashed_phone,
hashed_given_name = hc.hashed_given_name,
hashed_surname = hc.hashed_surname,
hashed_city = hc.hashed_city,
hashed_postal_code = hc.hashed_postal_code,
hashed_country_code = hc.hashed_country_code,
hashed_gender = hc.hashed_gender,
hashed_birth_date = hc.hashed_birth_date,
created_at = COALESCE(c.created_at, hc.created_at)
FROM hashed_customers hc
WHERE c.id = hc.customer_id
''')
# Update reservations to point to customers instead of hashed_customers
# First, update reservations.customer_id from reservations.hashed_customer_id
op.execute('''
UPDATE reservations r
SET customer_id = hc.customer_id
FROM hashed_customers hc
WHERE r.hashed_customer_id = hc.id
AND r.customer_id IS NULL
''')
# Update conversions to point to customers instead of hashed_customers
op.execute('''
UPDATE conversions c
SET customer_id = hc.customer_id
FROM hashed_customers hc
WHERE c.hashed_customer_id = hc.id
AND c.customer_id IS NULL
''')
# Update conversion_guests to point to customers instead of hashed_customers
op.execute('''
UPDATE conversion_guests cg
SET hashed_customer_id = NULL
WHERE hashed_customer_id IS NOT NULL
''')
# Now safe to drop the FK and column from reservations
op.drop_constraint(op.f('reservations_hashed_customer_id_fkey'), 'reservations', type_='foreignkey')
op.drop_column('reservations', 'hashed_customer_id')
# Note: We're keeping the hashed_customers table for now since conversion_service.py still uses it
# It can be dropped in a future migration after updating the application code
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('reservations', sa.Column('hashed_customer_id', sa.INTEGER(), autoincrement=False, nullable=True))
op.create_foreign_key(op.f('reservations_hashed_customer_id_fkey'), 'reservations', 'hashed_customers', ['hashed_customer_id'], ['id'], ondelete='CASCADE')
op.drop_column('customers', 'created_at')
op.drop_column('customers', 'hashed_birth_date')
op.drop_column('customers', 'hashed_gender')
op.drop_column('customers', 'hashed_country_code')
op.drop_column('customers', 'hashed_postal_code')
op.drop_column('customers', 'hashed_city')
op.drop_column('customers', 'hashed_surname')
op.drop_column('customers', 'hashed_given_name')
op.drop_column('customers', 'hashed_phone')
op.drop_column('customers', 'hashed_email')
# ### end Alembic commands ###

View File

@@ -0,0 +1,63 @@
"""removed hashed_customer completly
Revision ID: 3147e421bc47
Revises: 0fbeb40dbb2c
Create Date: 2025-12-03 11:42:05.722690
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision: str = '3147e421bc47'
down_revision: Union[str, Sequence[str], None] = '0fbeb40dbb2c'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f('ix_conversion_guests_hashed_customer_id'), table_name='conversion_guests')
op.drop_constraint(op.f('fk_conversion_guests_hashed_customer_id_hashed_customers'), 'conversion_guests', type_='foreignkey')
op.drop_column('conversion_guests', 'hashed_customer_id')
op.drop_index(op.f('ix_conversions_hashed_customer_id'), table_name='conversions')
op.drop_constraint(op.f('conversions_hashed_customer_id_fkey'), 'conversions', type_='foreignkey')
op.drop_column('conversions', 'hashed_customer_id')
op.drop_table('hashed_customers')
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('conversions', sa.Column('hashed_customer_id', sa.INTEGER(), autoincrement=False, nullable=True))
op.create_foreign_key(op.f('conversions_hashed_customer_id_fkey'), 'conversions', 'hashed_customers', ['hashed_customer_id'], ['id'])
op.create_index(op.f('ix_conversions_hashed_customer_id'), 'conversions', ['hashed_customer_id'], unique=False)
op.add_column('conversion_guests', sa.Column('hashed_customer_id', sa.INTEGER(), autoincrement=False, nullable=True))
op.create_foreign_key(op.f('fk_conversion_guests_hashed_customer_id_hashed_customers'), 'conversion_guests', 'hashed_customers', ['hashed_customer_id'], ['id'])
op.create_index(op.f('ix_conversion_guests_hashed_customer_id'), 'conversion_guests', ['hashed_customer_id'], unique=False)
op.create_table('hashed_customers',
sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False),
sa.Column('customer_id', sa.INTEGER(), autoincrement=False, nullable=True),
sa.Column('contact_id', sa.VARCHAR(), autoincrement=False, nullable=True),
sa.Column('hashed_email', sa.VARCHAR(length=64), autoincrement=False, nullable=True),
sa.Column('hashed_phone', sa.VARCHAR(length=64), autoincrement=False, nullable=True),
sa.Column('hashed_given_name', sa.VARCHAR(length=64), autoincrement=False, nullable=True),
sa.Column('hashed_surname', sa.VARCHAR(length=64), autoincrement=False, nullable=True),
sa.Column('hashed_city', sa.VARCHAR(length=64), autoincrement=False, nullable=True),
sa.Column('hashed_postal_code', sa.VARCHAR(length=64), autoincrement=False, nullable=True),
sa.Column('hashed_country_code', sa.VARCHAR(length=64), autoincrement=False, nullable=True),
sa.Column('hashed_gender', sa.VARCHAR(length=64), autoincrement=False, nullable=True),
sa.Column('hashed_birth_date', sa.VARCHAR(length=64), autoincrement=False, nullable=True),
sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True),
sa.ForeignKeyConstraint(['customer_id'], ['customers.id'], name=op.f('hashed_customers_customer_id_fkey'), ondelete='SET NULL'),
sa.PrimaryKeyConstraint('id', name=op.f('hashed_customers_pkey')),
sa.UniqueConstraint('contact_id', name=op.f('uq_hashed_customers_contact_id'), postgresql_include=[], postgresql_nulls_not_distinct=False),
sa.UniqueConstraint('customer_id', name=op.f('uq_hashed_customers_customer_id'), postgresql_include=[], postgresql_nulls_not_distinct=False)
)
# ### end Alembic commands ###

View File

@@ -0,0 +1,32 @@
"""add conversions→conversion_guests fk
Revision ID: 263bed87114f
Revises: 3147e421bc47
Create Date: 2025-12-03 12:25:12.820232
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '263bed87114f'
down_revision: Union[str, Sequence[str], None] = '3147e421bc47'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.create_foreign_key('fk_conversions_guest', 'conversions', 'conversion_guests', ['hotel_id', 'guest_id'], ['hotel_id', 'guest_id'])
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint('fk_conversions_guest', 'conversions', type_='foreignkey')
# ### end Alembic commands ###

View File

@@ -0,0 +1,32 @@
"""boolean to signify awarness match in guests
Revision ID: 1daea5172a03
Revises: 263bed87114f
Create Date: 2025-12-03 17:44:29.657898
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '1daea5172a03'
down_revision: Union[str, Sequence[str], None] = '263bed87114f'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('conversion_guests', sa.Column('is_awareness_guest', sa.Boolean(), nullable=True))
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('conversion_guests', 'is_awareness_guest')
# ### end Alembic commands ###

View File

@@ -0,0 +1,54 @@
"""pk_key_and_name_changes_for_room_availabilty
Revision ID: 872d95f54456
Revises: 1daea5172a03
Create Date: 2025-12-04 15:26:19.484062
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '872d95f54456'
down_revision: Union[str, Sequence[str], None] = '1daea5172a03'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('room_availability', sa.Column('bookable_type_2', sa.Integer(), nullable=True))
op.add_column('room_availability', sa.Column('out_of_order_type_6', sa.Integer(), nullable=True))
op.add_column('room_availability', sa.Column('not_bookable_type_9', sa.Integer(), nullable=True))
op.drop_index(op.f('ix_room_availability_date'), table_name='room_availability')
op.drop_index(op.f('ix_room_availability_inventory_id'), table_name='room_availability')
op.drop_constraint(op.f('uq_room_availability_unique_key'), 'room_availability', type_='unique')
op.drop_column('room_availability', 'count_type_6')
op.drop_column('room_availability', 'count_type_2')
op.drop_column('room_availability', 'count_type_9')
op.drop_column('room_availability', 'id')
# Create composite primary key on inventory_id and date
op.create_primary_key('pk_room_availability', 'room_availability', ['inventory_id', 'date'])
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
# Drop composite primary key before adding back the id column
op.drop_constraint('pk_room_availability', 'room_availability', type_='primary')
op.add_column('room_availability', sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False))
op.add_column('room_availability', sa.Column('count_type_9', sa.INTEGER(), autoincrement=False, nullable=True))
op.add_column('room_availability', sa.Column('count_type_2', sa.INTEGER(), autoincrement=False, nullable=True))
op.add_column('room_availability', sa.Column('count_type_6', sa.INTEGER(), autoincrement=False, nullable=True))
op.create_unique_constraint(op.f('uq_room_availability_unique_key'), 'room_availability', ['inventory_id', 'date'], postgresql_nulls_not_distinct=False)
op.create_index(op.f('ix_room_availability_inventory_id'), 'room_availability', ['inventory_id'], unique=False)
op.create_index(op.f('ix_room_availability_date'), 'room_availability', ['date'], unique=False)
op.drop_column('room_availability', 'not_bookable_type_9')
op.drop_column('room_availability', 'out_of_order_type_6')
op.drop_column('room_availability', 'bookable_type_2')
# ### end Alembic commands ###

File diff suppressed because one or more lines are too long

View File

@@ -8,8 +8,8 @@ database:
# Use annotatedyaml for secrets and environment-specific overrides
logger:
level: "WARNING" # Set to DEBUG for more verbose output
file: "config/alpinebits.log" # Log file path, or null for console only
level: "INFO" # Set to DEBUG for more verbose output
file: "config/alpinebits.log" # Log file path, or null for console only
server:
codecontext: "ADVERTISING"
@@ -23,22 +23,19 @@ alpine_bits_auth:
username: "bemelman"
password: !secret BEMELMANS_PASSWORD
meta_account: "238334370765317"
google_account: "7581209925" # Optional: Meta advertising account ID
google_account: "7581209925" # Optional: Meta advertising account ID
- hotel_id: "135"
hotel_name: "Testhotel"
username: "sebastian"
password: !secret BOB_PASSWORD
- hotel_id: "39052_001"
hotel_name: "Jagthof Kaltern"
username: "jagthof"
password: !secret JAGTHOF_PASSWORD
meta_account: "948363300784757"
google_account: "1951919786" # Optional: Meta advertising account ID
google_account: "1951919786" # Optional: Meta advertising account ID
- hotel_id: "39040_001"
hotel_name: "Residence Erika"
@@ -46,11 +43,9 @@ alpine_bits_auth:
password: !secret ERIKA_PASSWORD
google_account: "6604634947"
api_tokens:
- tLTI8wXF1OVEvUX7kdZRhSW3Qr5feBCz0mHo-kbnEp0
# Email configuration (SMTP service config - kept for when port is unblocked)
email:
# SMTP server configuration
@@ -69,8 +64,8 @@ email:
# Pushover configuration (push notification service config)
pushover:
# Pushover API credentials (get from https://pushover.net)
user_key: !secret PUSHOVER_USER_KEY # Your user/group key
api_token: !secret PUSHOVER_API_TOKEN # Your application API token
user_key: !secret PUSHOVER_USER_KEY # Your user/group key
api_token: !secret PUSHOVER_API_TOKEN # Your application API token
# Unified notification system - recipient-based routing
notifications:
@@ -82,7 +77,7 @@ notifications:
#- type: "email"
# address: "jonas@vaius.ai"
- type: "pushover"
priority: 0 # Pushover priority: -2=lowest, -1=low, 0=normal, 1=high, 2=emergency
priority: 0 # Pushover priority: -2=lowest, -1=low, 0=normal, 1=high, 2=emergency
# Daily report configuration (applies to all recipients)
daily_report:
@@ -104,5 +99,3 @@ notifications:
log_levels:
- "ERROR"
- "CRITICAL"

396
database_schema_analysis.md Normal file
View File

@@ -0,0 +1,396 @@
# Database Schema Analysis
## Overview
This document analyzes the database schema for normalization issues, redundancy, and potential improvements.
## Schema Summary
The database contains 13 tables organized around several core concepts:
- **Customer/Guest Management**: `customers`, `hashed_customers`, `conversion_guests`
- **Reservations**: `reservations`, `conversions`, `conversion_rooms`
- **Hotels**: `hotels`, `hotel_inventory`, `room_availability`
- **Webhooks**: `webhook_endpoints`, `webhook_requests`
- **Tracking**: `acked_requests`
---
## Major Issues Identified
### 1. **CRITICAL: Dual Customer Systems (Data Duplication)**
**Problem**: The schema maintains two parallel customer tracking systems:
- `customers` + `hashed_customers` (from Wix forms)
- `conversion_guests` (from PMS)
**Impact**:
- Same person can exist in both systems with no linkage
- `conversion_guests.hashed_customer_id` attempts to link but this is backward (many-to-one instead of one-to-one)
- Data inconsistency when same guest appears in both sources
**Details**:
```
customers (id=1, email="john@example.com")
└─ hashed_customers (id=1, customer_id=1, hashed_email="abc123...")
conversion_guests (hotel_id="HOTEL1", guest_id=42, guest_email="john@example.com")
└─ hashed_customer_id = NULL (or points to hashed_customers.id=1 after matching)
```
**Recommendation**:
- Create a unified `persons` table with a `source` field ("wix", "pms", "merged")
- Both `customers` and `conversion_guests` should reference this unified entity
- Implement proper guest matching/merging logic
---
### 2. **Data Redundancy: Hashed Values Stored Separately**
**Problem**: `hashed_customers` and `conversion_guests` store hashed values in separate columns alongside originals.
**Current Structure**:
```
customers:
- email_address (plaintext)
- phone (plaintext)
hashed_customers:
- customer_id (FK to customers)
- hashed_email
- hashed_phone
- hashed_given_name
...
```
**Issues**:
- Violates 3NF (derived data stored in separate table)
- Synchronization required between `customers` and `hashed_customers`
- If customer data changes, hashed version can become stale
- Extra JOIN required for every Meta Conversion API call
**Better Approach**:
Option A: Store hashed values directly in `customers` table as additional columns
Option B: Compute hashes on-the-fly (SHA256 is fast, ~1-2ms per hash)
**Recommendation**:
- **Short term**: Keep current structure but add triggers to auto-update hashed values
- **Long term**: Move hashed columns into `customers` table directly
---
### 3. **Advertising Account IDs Duplicated Across Tables**
**Problem**: `meta_account_id` and `google_account_id` appear in 3 places:
- `hotels` table (canonical source)
- `reservations` table (copied at creation time)
- Derived from `fbclid`/`gclid` tracking parameters
**Current Flow**:
```
hotels.meta_account_id = "123456"
reservation created with fbclid
reservations.meta_account_id = "123456" (copied from hotels)
```
**Issues**:
- Denormalization without clear benefit
- If hotel's account ID changes, old reservations have stale data
- Mixed source of truth (sometimes from hotels, sometimes from tracking params)
**Recommendation**:
- Remove `meta_account_id` and `google_account_id` from `reservations`
- Always derive from `hotels` table via JOIN
- If tracking-derived account differs from hotel's account, log a warning
---
### 4. **Hotel Information Duplicated in Reservations**
**Problem**: `reservations` table stores `hotel_code` and `hotel_name` but has no FK to `hotels` table.
**Issues**:
- Data can become inconsistent if hotel name changes
- No referential integrity
- Unclear if `hotel_code` matches `hotels.hotel_id`
**Recommendation**:
- Add `hotel_id` FK column to `reservations` pointing to `hotels.hotel_id`
- Remove `hotel_code` and `hotel_name` columns
- Derive hotel information via JOIN when needed
---
### 5. **Weak Foreign Key Consistency**
**Problem**: Mixed use of `ON DELETE` policies:
- Some FKs use `SET NULL` (appropriate for nullable relationships)
- Some use `CASCADE` (appropriate for child records)
- Some use `NO ACTION` (prevents deletion, may cause issues)
- `conversions` table has confusing composite FK setup with `hotel_id` and `guest_id`
**Examples**:
```sql
-- Good: Child data should be deleted with parent
hotel_inventory.hotel_id hotels.hotel_id (ON DELETE CASCADE)
-- Questionable: Should webhook requests survive hotel deletion?
webhook_requests.hotel_id hotels.hotel_id (ON DELETE NO ACTION)
-- Inconsistent: Why SET NULL vs CASCADE?
reservations.customer_id customers.id (ON DELETE SET NULL)
reservations.hashed_customer_id hashed_customers.id (ON DELETE CASCADE)
```
**Recommendation**:
Review each FK and establish consistent policies:
- Core data (hotels, customers): SET NULL to preserve historical records
- Supporting data (hashed_customers, inventory): CASCADE
- Transactional data (webhooks, conversions): Decide on retention policy
---
### 6. **Confusing Composite Foreign Key in Conversions**
**Problem**: The `conversions` table has a composite FK that's incorrectly mapped:
```python
# In db.py lines 650-655
__table_args__ = (
ForeignKeyConstraint(
["hotel_id", "guest_id"],
["conversion_guests.hotel_id", "conversion_guests.guest_id"],
ondelete="SET NULL",
),
)
```
**But the database shows**:
```
Foreign Keys:
hotel_id -> conversion_guests.hotel_id (ON DELETE SET NULL)
guest_id -> conversion_guests.hotel_id (ON DELETE SET NULL) # ← WRONG!
guest_id -> conversion_guests.guest_id (ON DELETE SET NULL)
hotel_id -> conversion_guests.guest_id (ON DELETE SET NULL) # ← WRONG!
```
**Impact**:
- Database has 4 FKs instead of 1 composite FK
- Mapping is incorrect (guest_id → hotel_id doesn't make sense)
- Could cause constraint violations or allow orphaned records
**Recommendation**:
- Fix the composite FK definition in SQLAlchemy
- Run a migration to drop incorrect FKs and recreate properly
---
### 7. **Unclear Relationship Between Reservations and Conversions**
**Problem**: The relationship between `reservations` (from Wix forms) and `conversions` (from PMS) is complex:
```
conversions:
- reservation_id (FK to reservations) - matched by tracking IDs
- customer_id (FK to customers) - matched by guest details
- hashed_customer_id (FK to hashed_customers) - matched by hashed guest details
- guest_id (FK to conversion_guests) - the actual PMS guest
```
**Issues**:
- Three different FK fields to three different customer/guest tables
- Matching logic is unclear from schema alone
- `directly_attributable` and `guest_matched` flags indicate matching quality, but this should be more explicit
**Recommendation**:
- Add a `match_confidence` enum field: "exact_id", "high_confidence", "medium_confidence", "no_match"
- Add `match_method` field to explain how the link was made
- Consider a separate `reservation_conversion_links` table to make the many-to-many relationship explicit
---
### 8. **Room Type Information Scattered**
**Problem**: Room information appears in multiple places:
- `reservations.room_type_code`, `room_classification_code`, `room_type`
- `conversion_rooms.room_type`, `room_number`
- `hotel_inventory.inv_type_code`, `inv_code`, `room_name`
**Issues**:
- No clear master data for room types
- Room type codes not standardized across sources
- No FK between `reservations.room_type_code` and `hotel_inventory.inv_type_code`
**Recommendation**:
- Create a `room_types` reference table linked to hotels
- Add FKs from reservations and conversion_rooms to room_types
- Standardize room type codes across all sources
---
## Normalization Analysis
### 1st Normal Form (1NF): ✅ PASS
- All columns contain atomic values
- **Exception**: `reservations.children_ages` stores comma-separated values
- Should be: separate `reservation_children` table with age column
### 2nd Normal Form (2NF): ⚠️ MOSTLY PASS
- All non-key attributes depend on the full primary key
- **Issue**: Some denormalized data exists (hotel names, account IDs in reservations)
### 3rd Normal Form (3NF): ❌ FAIL
Multiple violations:
- `hashed_customers` stores derived data (hashes) that depend on `customers`
- `reservations.meta_account_id` depends on `hotels` via hotel_code
- `reservations.hotel_name` depends on `hotels` via hotel_code
---
## Data Integrity Issues
### Missing Foreign Keys
1. **reservations.hotel_code** → should FK to hotels.hotel_id
2. **reservations.room_type_code** → should FK to hotel_inventory
3. **acked_requests.unique_id** → should FK to reservations.unique_id (or be nullable)
### Missing Indexes
Consider adding for query performance:
1. `customers.email_address` - for lookups during conversion matching
2. `conversions.reservation_date` - for time-based queries
3. `conversion_rooms.total_revenue` - for revenue analytics
4. `reservations.start_date`, `end_date` - for date range queries
### Missing Constraints
1. **Check constraints** for date logic:
- `reservations.end_date > start_date`
- `conversion_rooms.departure_date > arrival_date`
2. **Check constraints** for counts:
- `num_adults >= 0`, `num_children >= 0`
3. **NOT NULL constraints** on critical fields:
- `customers.contact_id` should be NOT NULL (it's the natural key)
- `conversions.hotel_id` is NOT NULL ✓ (good)
---
## Recommendations Priority
### HIGH PRIORITY (Data Integrity)
1. Fix composite FK in `conversions` table (lines 650-655 in db.py)
2. Add `hotel_id` FK to `reservations` table
3. Add missing NOT NULL constraints on natural keys
4. Add check constraints for date ranges and counts
### MEDIUM PRIORITY (Normalization)
5. Unify customer/guest systems into a single `persons` entity
6. Remove duplicate account ID fields from `reservations`
7. Remove `hotel_name` from `reservations` (derive via JOIN)
8. Create `reservation_children` table for children_ages
### LOW PRIORITY (Performance & Cleanup)
9. Move hashed fields into `customers` table (remove `hashed_customers`)
10. Add indexes for common query patterns
11. Create `room_types` reference table
12. Add `match_confidence` and `match_method` to `conversions`
---
## Positive Aspects
✅ Good use of composite keys (`conversion_guests`, `hotel_inventory`)
✅ Unique constraints on natural keys (`contact_id`, `webhook_secret`)
✅ Proper use of indexes on frequently queried fields
✅ Cascade deletion for child records (inventory, rooms)
✅ Tracking metadata (created_at, updated_at, first_seen, last_seen)
✅ Webhook deduplication via `payload_hash`
✅ JSON storage for flexible data (`conversion_rooms.daily_sales`)
---
## Suggested Refactoring Path
### Phase 1: Fix Critical Issues (1-2 days)
- Fix composite FK in conversions
- Add hotel_id FK to reservations
- Add missing constraints
### Phase 2: Normalize Customer Data (3-5 days)
- Create unified persons/guests table
- Migrate existing data
- Update matching logic
### Phase 3: Clean Up Redundancy (2-3 days)
- Remove duplicate account IDs
- Merge hashed_customers into customers
- Create room_types reference
### Phase 4: Enhance Tracking (1-2 days)
- Add match_confidence fields
- Improve conversion attribution
- Add missing indexes
---
## Query Examples Affected by Current Issues
### Issue: Duplicate Customer Data
```sql
-- Current: Find all reservations for a guest (requires checking both systems)
SELECT r.* FROM reservations r
WHERE r.customer_id = ?
OR r.hashed_customer_id IN (
SELECT id FROM hashed_customers WHERE contact_id = ?
);
-- After fix: Simple unified query
SELECT r.* FROM reservations r
WHERE r.person_id = ?;
```
### Issue: Missing Hotel FK
```sql
-- Current: Get hotel info for reservation (unreliable)
SELECT r.*, r.hotel_name
FROM reservations r
WHERE r.id = ?;
-- After fix: Reliable JOIN
SELECT r.*, h.hotel_name, h.meta_account_id
FROM reservations r
JOIN hotels h ON r.hotel_id = h.hotel_id
WHERE r.id = ?;
```
### Issue: Hashed Data in Separate Table
```sql
-- Current: Get customer for Meta API (requires JOIN)
SELECT hc.hashed_email, hc.hashed_phone
FROM reservations r
JOIN hashed_customers hc ON r.hashed_customer_id = hc.id
WHERE r.id = ?;
-- After fix: Direct access
SELECT c.hashed_email, c.hashed_phone
FROM reservations r
JOIN customers c ON r.customer_id = c.id
WHERE r.id = ?;
```
---
## Conclusion
The schema is **functional but has significant normalization and consistency issues**. The main problems are:
1. **Dual customer tracking systems** that should be unified
2. **Redundant storage of derived data** (hashes, account IDs)
3. **Missing foreign key relationships** (hotels, room types)
4. **Inconsistent deletion policies** across foreign keys
5. **Broken composite foreign key** in conversions table
The database violates 3NF in several places and could benefit from a refactoring effort. However, the issues are primarily architectural rather than critical bugs, so the system can continue operating while improvements are made incrementally.
**Estimated effort to fix all issues**: 1-2 weeks of development + testing
**Risk level**: Medium (requires data migration and careful FK updates)
**Recommended approach**: Incremental fixes starting with high-priority items

View File

@@ -0,0 +1,131 @@
# 4.1 FreeRooms: Room Availability Notifications
When `action=OTA_HotelInvCountNotif:FreeRooms`, the client sends room availability updates to the server. Servers must support at least one capability: `OTA_HotelInvCountNotif_accept_rooms` (distinct rooms) or `OTA_HotelInvCountNotif_accept_categories` (room categories); they may support both.
## 4.1.1 Client Request (`OTA_HotelInvCountNotifRQ`)
- The payload is a single `OTA_HotelInvCountNotifRQ` with exactly one `Inventories` element, so only one hotel is covered per request. `HotelCode` is mandatory; `HotelName` is optional.
- Example (outer structure):
```xml
<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelInvCountNotifRQ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.opentravel.org/OTA/2003/05"
Version="4"
xsi:schemaLocation="http://www.opentravel.org/OTA/2003/05 OTA_HotelInvCountNotifRQ.xsd">
<UniqueID Type="16" ID="1" Instance="CompleteSet"/>
<Inventories HotelCode="123" HotelName="Frangart Inn">
<!-- ... Inventory elements ... -->
</Inventories>
</OTA_HotelInvCountNotifRQ>
```
- `Inventories` contains one or more `Inventory` elements, each for a distinct period/room or period/category. Example inner portion:
```xml
<Inventory>
<StatusApplicationControl Start="2022-08-01" End="2022-08-10" InvTypeCode="DOUBLE" />
<InvCounts>
<InvCount CountType="2" Count="3" />
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start="2022-08-11" End="2022-08-20" InvTypeCode="DOUBLE" />
</Inventory>
<Inventory>
<StatusApplicationControl Start="2022-08-21" End="2022-08-30" InvTypeCode="DOUBLE" />
<InvCounts>
<InvCount CountType="2" Count="1" />
</InvCounts>
</Inventory>
```
- Missing `InvCode` means the availability refers to a room category (`InvTypeCode`). Using both `InvTypeCode` and `InvCode` targets a specific room. Matching is case-sensitive. Mixing rooms and categories in one request is not allowed.
- `InvCounts` may contain up to three `InvCount` entries (all absolute, not deltas):
- `CountType=2`: bookable rooms (must be supported).
- `CountType=6`: out of order rooms (requires `OTA_HotelInvCountNotif_accept_out_of_order`).
- `CountType=9`: available but not bookable rooms (requires `OTA_HotelInvCountNotif_accept_out_of_market`).
- Omitted `InvCount` entries imply `Count=0`. If `InvCounts` is omitted, the room/room category is considered fully booked for the period. `Count` is non-negative; for specific rooms it should be `1`. Sum of counts cannot exceed the total rooms; overbooking is not allowed.
- Date ranges are inclusive of the start and end nights (checkout is the morning after `End`). Inventory periods must not overlap for the same room or room category; servers may reject overlaps.
### CompleteSet
- Purpose: replace all server-held availability for the hotel with the provided data (e.g., first sync or resync after issues).
- Server capability required: `OTA_HotelInvCountNotif_accept_complete_set`.
- Indicate a complete set with `UniqueID Instance="CompleteSet" Type="16"` (the `ID` value is ignored). `Type="35"` is also accepted and can be used to hint that data was purged by business rules.
- A CompleteSet must list every managed room/room category for all periods the client has on record. Even fully booked periods must be present (with `InvCounts` showing zero or omitted entirely).
- To fully reset availability, a CompleteSet may contain a single empty `Inventory` element with no attributes (needed for OTA validation).
- Do not include periods for which the client has no data source.
### Deltas
- If `UniqueID` is missing, the message is a delta: the server updates only what is present and leaves all other stored data untouched.
- Server capability required: `OTA_HotelInvCountNotif_accept_deltas`.
- If a delta explicitly covers an entire period, it overwrites the prior state for that period.
- AlpineBits recommends periodic full CompleteSet syncs when both sides support them. A server should expose at least one of the delta or complete-set capabilities; without CompleteSet support, obsolete data might require manual cleanup.
### Closing Seasons
- Indicates periods when the hotel is closed (distinct from fully booked). Requires both parties to expose `OTA_HotelInvCountNotif_accept_closing_seasons`.
- Can only appear as the first `Inventory` elements in a CompleteSet.
- Structure: one `StatusApplicationControl` with mandatory `Start`, `End`, and `AllInvCode="true"`; no `InvCounts` allowed. Multiple closing periods are allowed if they do not overlap with each other or with availability periods.
- Delta messages supersede earlier closed periods; best practice is to avoid such overlaps or follow deltas with a CompleteSet to restate closures explicitly.
## 4.1.2 Server Response (`OTA_HotelInvCountNotifRS`)
- Responses return one of the four AlpineBits outcomes (success, advisory, warning, error). The payload is `OTA_HotelInvCountNotifRS`. See section 2.3 for outcome semantics.
## 4.1.3 Implementation Tips and Best Practice
- Support for FreeRooms was mandatory in version 2011-11 but is optional now.
- Delta updates were added in 2013-04.
- The action was completely rewritten in 2020-10.
- Forwarders (e.g., channel managers) must not add data beyond what the source provided; do not extend time frames beyond the most future date received.
- For CompleteSet requests, servers are encouraged to delete and reinsert all backend availability rather than perform partial updates.
- The `End` date is the last night of stay; departure is the morning after `End`.
- Length-of-stay and day-of-arrival restrictions were removed from FreeRooms in 2014-04 (they belong in RatePlans).
## 4.1.4 Tabular Representation of `OTA_HotelInvCountNotifRQ`
| Level | Element/Attribute | Type | Cardinality |
| --- | --- | --- | --- |
| OTA_HotelInvCountNotifRQ | element | | 1 |
| OTA_HotelInvCountNotifRQ | Version | | 1 |
| OTA_HotelInvCountNotifRQ | UniqueID | element | 0-1 |
| UniqueID | Type | enum (16 \| 35) | 1 |
| UniqueID | ID | | 1 |
| UniqueID | Instance | enum (CompleteSet) | 1 |
| OTA_HotelInvCountNotifRQ | Inventories | element | 1 |
| Inventories | HotelCode | string(1-16) | 1 |
| Inventories | HotelName | string(1-128) | 0-1 |
| Inventories | Inventory | element | 1..∞ |
| Inventory | StatusApplicationControl | element | 0-1 |
| StatusApplicationControl | Start | date (\\S+) | 1 |
| StatusApplicationControl | End | date (\\S+) | 1 |
| StatusApplicationControl | InvTypeCode | string(1-8) | 0-1 |
| StatusApplicationControl | InvCode | string(1-16) | 0-1 |
| StatusApplicationControl | AllInvCode | boolean (\\S+) | 0-1 |
| Inventory | InvCounts | element | 0-1 |
| InvCounts | InvCount | element | 1-3 |
| InvCount | CountType | enum (2 \| 6 \| 9) | 1 |
| InvCount | Count | integer ([0-9]+) | 1 |
## 4.1.5 Tabular Representation of `OTA_HotelInvCountNotifRS`
| Level | Element/Attribute | Type | Cardinality |
| --- | --- | --- | --- |
| OTA_HotelInvCountNotifRS | element | | 1 |
| OTA_HotelInvCountNotifRS | Version | | 1 |
| OTA_HotelInvCountNotifRS | TimeStamp | | 0-1 |
| OTA_HotelInvCountNotifRS | Success | element (choice start) | 1 |
| OTA_HotelInvCountNotifRS | Warnings | element (choice start) | 0-1 |
| Warnings | Warning | element | 1..∞ |
| Warning | Type | integer ([0-9]+) | 1 |
| Warning | RecordID | string(1-64) | 0-1 |
| Warning | Status | enum (ALPINEBITS_SEND_HANDSHAKE \| ALPINEBITS_SEND_FREEROOMS \| ALPINEBITS_SEND_RATEPLANS \| ALPINEBITS_SEND_INVENTORY) | 0-1 |
| OTA_HotelInvCountNotifRS | Errors | element (choice end) | 1 |
| Errors | Error | element | 1..∞ |
| Error | Type | enum (11 \| 13) | 1 |
| Error | Code | integer ([0-9]+) | 0-1 |
| Error | Status | enum (ALPINEBITS_SEND_HANDSHAKE \| ALPINEBITS_SEND_FREEROOMS \| ALPINEBITS_SEND_RATEPLANS \| ALPINEBITS_SEND_INVENTORY) | 0-1 |

View File

@@ -0,0 +1,33 @@
# Chapter 4 - Data Exchange Actions
These actions define how clients and servers exchange hotel data. For every data exchange request both `action` and `request` parameters are mandatory, and the XML payloads must validate against OTA2015A plus the stricter AlpineBits schema.
## Action Summary
| Known as (since) | Usage | Action parameter | Request XML | Response XML |
| --- | --- | --- | --- | --- |
| FreeRooms (2011-11) | Client sends room availability notifications | `OTA_HotelInvCountNotif:FreeRooms` | `OTA_HotelInvCountNotifRQ` | `OTA_HotelInvCountNotifRS` |
| GuestRequests (2012-05) | Client asks server for quote/booking requests | `OTA_Read:GuestRequests` | `OTA_ReadRQ` | `OTA_ResRetrieveRS` |
| GuestRequests Push (2018-10) | Client pushes quote/booking requests to server | `OTA_HotelResNotif:GuestRequests` | `OTA_HotelResNotifRQ` | `OTA_HotelResNotifRS` |
| GuestRequests Status Update Push (2022-10) | Client sends status updates for quote/booking requests | `OTA_HotelResNotif:GuestRequests_StatusUpdate` | `OTA_HotelResNotifRQ` | `OTA_HotelResNotifRS` |
| GuestRequests Acknowledgments (2014-04) | Client acknowledges requests it received | `OTA_NotifReport:GuestRequests` | `OTA_NotifReportRQ` | `OTA_NotifReportRS` |
| Inventory/Basic Push (2015-07) | Client sends room category info and room lists | `OTA_HotelDescriptiveContentNotif:Inventory` | `OTA_HotelDescriptiveContentNotifRQ` | `OTA_HotelDescriptiveContentNotifRS` |
| Inventory/Basic Pull (2017-10) | Client requests room category info and room lists | `OTA_HotelDescriptiveInfo:Inventory` | `OTA_HotelDescriptiveInfoRQ` | `OTA_HotelDescriptiveInfoRS` |
| Inventory/HotelInfo Push (2015-07) | Client sends additional property descriptive content | `OTA_HotelDescriptiveContentNotif:Info` | `OTA_HotelDescriptiveContentNotifRQ` | `OTA_HotelDescriptiveContentNotifRS` |
| Inventory/HotelInfo Pull (2017-10) | Client requests additional property descriptive content | `OTA_HotelDescriptiveInfo:Info` | `OTA_HotelDescriptiveInfoRQ` | `OTA_HotelDescriptiveInfoRS` |
| RatePlans (2014-04) | Client sends rate plans with prices and booking rules | `OTA_HotelRatePlanNotif:RatePlans` | `OTA_HotelRatePlanNotifRQ` | `OTA_HotelRatePlanNotifRS` |
| BaseRates (2017-10) | Client requests rate plan information | `OTA_HotelRatePlan:BaseRates` | `OTA_HotelRatePlanRQ` | `OTA_HotelRatePlanRS` |
| Activities (2020-10) | Client requests hotel activity information | `OTA_HotelPostEventNotif:EventReports` | `OTA_HotelPostEventNotifRQ` | `OTA_HotelPostEventNotifRS` |
## Encoding and Schema Requirements
- All XML documents must be UTF-8 encoded. Expect arbitrary Unicode (including emojis or non-Latin characters); validate and sanitize before storage to avoid visualization or data corruption issues.
- Requests and responses must validate against OTA2015A. The AlpineBits schema provided in the documentation kit is stricter: every document that passes AlpineBits validation also passes OTA2015A, not vice versa.
- Sample XML files and the stricter XSD are included in the AlpineBits documentation kit for each protocol version.
- Currency codes follow ISO 4217 (EUR shown in samples but any ISO code is allowed). If a server receives an unsupported currency it must reply with a warning outcome; a client should discard responses using unsupported currencies.
## Copyright and Licensing of Multimedia Content
- Many messages carry URLs to multimedia objects. Since XML has no place for license data, AlpineBits recommends embedding licensing metadata (e.g., IPTC/EXIF for images) in the files themselves and preserving it in derived works.
- Alternatively (or additionally), include HTTP headers `X-AlpineBits-License` and `X-AlpineBits-CopyrightHolder` when serving multimedia content. Receivers should honor and propagate these headers to derived assets.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

266
extract_leads.py Normal file
View File

@@ -0,0 +1,266 @@
#!/usr/bin/env python3
"""
Extract lead information from MBOX email file.
Parses email entries and extracts structured lead data.
"""
import re
from dataclasses import dataclass, field, asdict
from typing import List, Optional
from datetime import datetime
import json
@dataclass
class Lead:
"""Represents a single lead extracted from email."""
name: Optional[str] = None
lastname: Optional[str] = None
mail: Optional[str] = None
tel: Optional[str] = None
anreise: Optional[str] = None # Check-in date
abreise: Optional[str] = None # Check-out date
erwachsene: Optional[int] = None # Adults
kinder: Optional[int] = None # Children
kind_ages: List[int] = field(default_factory=list) # Children ages
apartments: List[str] = field(default_factory=list)
verpflegung: Optional[str] = None # Meal plan
sprache: Optional[str] = None # Language
device: Optional[str] = None
anrede: Optional[str] = None # Salutation
land: Optional[str] = None # Country
privacy: Optional[bool] = None
received_date: Optional[str] = None
def parse_mbox_file(filepath: str) -> List[Lead]:
"""
Parse MBOX file and extract lead information.
Args:
filepath: Path to the MBOX file
Returns:
List of Lead objects with extracted data
"""
leads = []
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
# Split by "From " at the beginning of lines to separate emails
email_blocks = re.split(r'^From \d+@', content, flags=re.MULTILINE)[1:]
for email_block in email_blocks:
# Find the content section after headers (after a blank line)
# Headers end with a blank line, then the actual form data starts
parts = email_block.split('\n\n', 1)
if len(parts) < 2:
continue
headers = parts[0]
body = parts[1] if len(parts) > 1 else ""
# Extract lead data from body
lead = parse_email_body(body)
# Extract received date from headers
try:
lead.received_date = extract_received_date(headers)
except ValueError as e:
print(f"WARNING: {e}")
raise
if lead.name or lead.mail: # Only add if we have some data
leads.append(lead)
return leads
def extract_received_date(headers: str) -> Optional[str]:
"""
Extract the Date header from email headers and convert to ISO format.
Args:
headers: Email headers section
Returns:
ISO format date string from the Date header, or None if not found
Raises:
ValueError: If Date header cannot be parsed to ISO format
"""
from email.utils import parsedate_to_datetime
for line in headers.split('\n'):
if line.startswith('Date:'):
# Extract everything after "Date: "
date_value = line[6:].strip()
try:
# Parse the RFC 2822 date format and convert to ISO format
dt = parsedate_to_datetime(date_value)
return dt.isoformat()
except (TypeError, ValueError) as e:
# Raise exception so parsing failures are caught and reported
raise ValueError(f"Failed to parse date '{date_value}': {e}")
return None
def parse_email_body(body: str) -> Lead:
"""
Parse the body of an email to extract lead information.
Args:
body: Email body content
Returns:
Lead object with extracted data
"""
lead = Lead()
# Split body into lines for easier parsing
lines = body.split('\n')
for line in lines:
line = line.strip()
if not line or ':' not in line:
continue
key, value = line.split(':', 1)
key = key.strip()
value = value.strip()
# Map keys to Lead attributes
if key == 'Name':
lead.name = value
elif key == 'Nachname':
lead.lastname = value
elif key == 'Mail':
lead.mail = value
elif key == 'Tel':
lead.tel = value
elif key == 'Anreise':
lead.anreise = value
elif key == 'Abreise':
lead.abreise = value
elif key == 'Erwachsene':
lead.erwachsene = int(value) if value.isdigit() else None
elif key == 'Kinder':
lead.kinder = int(value) if value.isdigit() else None
elif key.startswith('Alter Kind'):
# Extract age from "Alter Kind 1", "Alter Kind 2", etc.
try:
age = int(value)
lead.kind_ages.append(age)
except ValueError:
pass
elif key == 'Apartment':
lead.apartments.append(value)
elif key == 'Verpflegung':
lead.verpflegung = value
elif key == 'Sprache':
lead.sprache = value
elif key == 'Device':
lead.device = value
elif key == 'Anrede':
lead.anrede = value
elif key == 'Land':
lead.land = value
elif key == 'Privacy':
lead.privacy = value.lower() == 'on'
# Sort child ages to maintain order
lead.kind_ages.sort()
return lead
def export_to_json(leads: List[Lead], output_file: str) -> None:
"""Export leads to JSON file."""
data = [asdict(lead) for lead in leads]
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
print(f"Exported {len(leads)} leads to {output_file}")
def export_to_csv(leads: List[Lead], output_file: str) -> None:
"""Export leads to CSV file."""
import csv
if not leads:
return
# Define CSV headers
headers = [
'name',
'lastname',
'mail',
'tel',
'anreise',
'abreise',
'erwachsene',
'kinder',
'kind_ages',
'apartments',
'verpflegung',
'sprache',
'device',
'anrede',
'land',
'privacy',
'received_date'
]
with open(output_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=headers)
writer.writeheader()
for lead in leads:
row = asdict(lead)
# Convert lists to comma-separated strings for CSV
row['kind_ages'] = ','.join(map(str, row['kind_ages']))
row['apartments'] = ','.join(row['apartments'])
row['privacy'] = 'Yes' if row['privacy'] else 'No' if row['privacy'] is False else ''
writer.writerow(row)
print(f"Exported {len(leads)} leads to {output_file}")
def print_summary(leads: List[Lead]) -> None:
"""Print a summary of extracted leads."""
print(f"\n{'='*60}")
print(f"Total leads extracted: {len(leads)}")
print(f"{'='*60}\n")
for i, lead in enumerate(leads, 1):
print(f"Lead {i}:")
print(f" Name: {lead.name} {lead.lastname}")
print(f" Email: {lead.mail}")
print(f" Phone: {lead.tel}")
print(f" Check-in: {lead.anreise}, Check-out: {lead.abreise}")
print(f" Adults: {lead.erwachsene}, Children: {lead.kinder}")
if lead.kind_ages:
print(f" Children ages: {lead.kind_ages}")
if lead.apartments:
print(f" Apartments: {', '.join(lead.apartments)}")
print()
if __name__ == '__main__':
import sys
mbox_file = '/home/divusjulius/repos/alpinebits_python/Leads-Bemelmans Apartments.mbox'
print(f"Parsing {mbox_file}...")
leads = parse_mbox_file(mbox_file)
# Print summary
print_summary(leads)
# Export to JSON
export_to_json(leads, 'leads_export.json')
# Export to CSV
export_to_csv(leads, 'leads_export.csv')

36
fetch_and_update_leads.py Normal file
View File

@@ -0,0 +1,36 @@
import psycopg2
from psycopg2.extras import RealDictCursor
import json
import csv
from datetime import datetime
# Database connection
conn = psycopg2.connect(
dbname="meta_insights",
user="meta_user",
password="meta_password",
host="localhost",
port=5555
)
# Set search path to the schema
cursor = conn.cursor(cursor_factory=RealDictCursor)
cursor.execute("SET search_path TO alpinebits")
# Fetch the data
cursor.execute("""
select r.id, r.created_at, r.customer_id, r.unique_id,
c.given_name, c.email
from reservations as r
join customers as c on c.id = r.customer_id
where unique_id like 'csv_%'
order by r.created_at desc
""")
rows = cursor.fetchall()
print(f"Found {len(rows)} rows to update")
for row in rows:
print(f" - {row['given_name']} ({row['email']}): {row['created_at']}")
cursor.close()
conn.close()

View File

@@ -0,0 +1,2 @@
Vorname,Nachname,E-Mail-Adresse 1,Telefonnummer 1,Erstellt am (UTC+0),E-Mail-Abostatus,SMS-Abostatus,Letzte Aktivität,Datum der letzten Aktivität: (UTC+0),Herkunft,Sprache
Elke,Arnold,seppina@gmx.de,'+49 1512 7030369,2025-11-07 16:36,Nie abonniert,Nie abonniert,Formular eingereicht,2025-11-07 16:36,Eingereichtes Formular,de-de
1 Vorname Nachname E-Mail-Adresse 1 Telefonnummer 1 Erstellt am (UTC+0) E-Mail-Abostatus SMS-Abostatus Letzte Aktivität Datum der letzten Aktivität: (UTC+0) Herkunft Sprache
2 Elke Arnold seppina@gmx.de '+49 1512 7030369 2025-11-07 16:36 Nie abonniert Nie abonniert Formular eingereicht 2025-11-07 16:36 Eingereichtes Formular de-de

1334
landing_page_form.csv Normal file

File diff suppressed because it is too large Load Diff

577
leads_export.csv Normal file
View File

@@ -0,0 +1,577 @@
name,lastname,mail,tel,anreise,abreise,erwachsene,kinder,kind_ages,apartments,verpflegung,sprache,device,anrede,land,privacy,received_date
Martina,Contarin,martinacontarin.mc@gmail.com,3473907005,30.12.2025,04.01.2026,2,0,,"Peonia,Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (393 x 658 px),frau,--,Yes,2025-11-04T23:06:31+01:00
giulia,latini,giulialatini@live.it,,06.12.2025,08.12.2025,2,0,,,Halbpension,it,Desktop (1905 x 945 px),frau,--,Yes,2025-10-15T12:50:15+02:00
Simona,Buompadre,Simi1983@hotmail.it,,03.01.2026,10.01.2026,2,3,"3,6,10",Lavendula,Halbpension,it,Mobile (384 x 700 px),frau,--,Yes,2025-10-03T18:40:58+02:00
Elke,Arnold,seppina@gmx.de,015127030369,28.11.2025,01.12.2025,2,0,,Peonia,Übernachtung mit Frühstück,de,Mobile (360 x 646 px),frau,Germany,Yes,2025-11-11T10:40:49+01:00
Tania,Demetri,Tania.demetri@yahoo.it,,03.01.2026,06.01.2026,4,1,15,,Übernachtung mit Frühstück,it,Mobile (411 x 779 px),--,--,Yes,2025-11-08T07:25:10+01:00
Mario,Reita,marioreita1985@gmail.com,,30.12.2025,03.01.2026,4,4,"2,7,10,12",,Halbpension,it,Mobile (390 x 655 px),herr,--,Yes,2025-11-07T23:12:27+01:00
Gianluca,Biondo,Gnlcbiondo@gmail.com,+393520220616,22.08.2026,29.08.2026,2,3,"1,13,14",,Halbpension,it,Mobile (390 x 655 px),herr,Italy,Yes,2025-11-07T22:55:44+01:00
Franca,Andreana,francesca.andreana@alice.it,+393476755045,28.12.2025,04.01.2026,2,1,14,Peonia,Halbpension,it,Mobile (360 x 684 px),frau,Italy,Yes,2025-10-16T08:19:02+02:00
Barbara,Baldacci,bbaldacci73@gmail.com,3498020461,06.12.2025,08.12.2025,2,1,13,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (360 x 711 px),frau,Italy,Yes,2025-10-16T21:51:39+02:00
Silvia,Silenzi,silenzi.silvia@virgilio.it,345 703 7302,24.12.2025,29.12.2025,3,1,15,,Übernachtung mit Frühstück,it,Mobile (392 x 684 px),frau,Italy,Yes,2025-10-10T22:55:06+02:00
Silvia,Silenzi,silenzi.silvia@virgilio.it,345 703 7302,24.12.2025,29.12.2025,3,1,15,,Übernachtung mit Frühstück,it,Mobile (392 x 684 px),frau,Italy,Yes,2025-10-10T22:55:05+02:00
Alessia,Orru,orrual@gmail.com,,10.11.2025,16.11.2025,2,1,11,"Lavendula,Fenice",Halbpension,it,Mobile (384 x 678 px),frau,Italy,Yes,2025-10-10T22:13:00+02:00
Clementina bisceglie,Bisceglie,bisceglieclementina@gmail.com,3204734570,27.12.2025,03.01.2026,2,3,"8,14,17","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (428 x 729 px),frau,Italy,Yes,2025-10-10T18:08:26+02:00
Cristina,Axinia,Cristinaaxinia11a@gmail.com,3473439538,27.12.2025,30.12.2025,2,2,"13,17",Peonia,Halbpension,it,Mobile (402 x 682 px),frau,Italy,Yes,2025-10-28T13:51:28+01:00
Gerald,Steiner,gerald.steiner.gs@googlemail.com,,30.05.2026,06.06.2026,2,0,,"Peonia,Lavendula,Fenice,Forsythia",Halbpension,de,Desktop (1897 x 924 px),herr,Germany,Yes,2025-10-01T10:22:34+02:00
Dennis,Sommer,dennissommer@gmx.de,,17.06.2026,21.06.2026,4,2,"3,5","Lavendula,Bellis",Übernachtung mit Frühstück,de,Mobile (375 x 547 px),herr,--,Yes,2025-10-24T09:18:05+02:00
PAOLA,AMBROSETTI,paola_ambrosetti@yahoo.it,338 8097755,30.12.2025,01.01.2026,2,0,,Forsythia,Halbpension,it,Mobile (430 x 731 px),frau,Italy,Yes,2025-11-05T14:50:25+01:00
Marilena,GIAQUINTO,marilena.giaquinto73@gmail.com,+393381531396,30.12.2025,03.01.2026,10,4,"5,8,12,15",,Übernachtung mit Frühstück,it,Mobile (360 x 668 px),frau,--,Yes,2025-11-05T13:10:52+01:00
Alice Vaggelli,Vaggelli,Alicevaggelli820@gmail.com,3393723909,31.12.2025,04.01.2026,9,0,,"Loft,Lavendula,Forsythia,Bellis",Übernachtung,it,Mobile (414 x 639 px),frau,Italy,Yes,2025-11-04T07:05:31+01:00
Giustina,Ganci,Giustinaganci@libero.it,3381256848,14.02.2026,17.02.2026,2,2,"10,13",Fenice,Halbpension,it,Mobile (384 x 697 px),frau,Italy,Yes,2025-10-08T09:55:03+02:00
Katherine,OSULLIVAN,kdugdaleosullivan@gmail.com,718-909-9008,14.02.2026,18.02.2026,2,2,"16,18","Peonia,Lavendula,Fenice",Übernachtung,en,Desktop (1440 x 820 px),frau,--,Yes,2025-10-14T14:27:46+02:00
Marianna,Faraci,Faracimarianna27@gmail.com,+393275715125,28.12.2025,04.01.2026,2,2,"1,6",Fenice,Halbpension,it,Mobile (414 x 706 px),frau,Italy,Yes,2025-11-11T22:37:43+01:00
Maurizio,Marino,mauryx05@icloud.com,+393394697328,23.12.2025,27.12.2025,2,1,13,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (390 x 590 px),herr,--,Yes,2025-11-11T13:29:44+01:00
Elisa,Turri,elisaturri76@gmail.com,+393881695046,02.01.2026,05.01.2026,2,0,,,Übernachtung mit Frühstück,it,Mobile (411 x 793 px),frau,--,Yes,2025-11-11T13:16:26+01:00
Lidia Ciuraru,Ciuraru,lidiaanaciuraru@gmail.com,3207242313,24.12.2025,28.12.2025,2,2,"3,6",,Halbpension,it,Mobile (360 x 668 px),frau,Italy,Yes,2025-09-21T16:52:44+02:00
Roberta,La riccia,robertalr89@hotmail.it,3923204310,30.12.2025,02.01.2026,6,5,"0,3,5,8,11","Lavendula,Fenice,Forsythia",Übernachtung mit Frühstück,it,Mobile (411 x 757 px),frau,--,Yes,2025-09-21T11:38:08+02:00
Paola,Fianchini,Paola.f@hotmail.it,3270272667,28.11.2025,30.11.2025,2,0,,,Halbpension,it,Mobile (414 x 728 px),frau,--,Yes,2025-11-06T19:56:30+01:00
Gayan Madurapperuma,Madurapperuma,gsgayan@gmail.com,3881033320,27.12.2025,30.12.2025,2,2,"8,12",Peonia,Halbpension,it,Mobile (411 x 780 px),herr,--,Yes,2025-11-06T12:51:06+01:00
Stefania Guidi,Guidi,morettinamia@yahoo.it,3479573252,20.02.2026,24.02.2026,6,2,"4,5","Fenice,Forsythia",Halbpension,it,Mobile (414 x 708 px),frau,Italy,Yes,2025-10-14T18:02:48+02:00
Happy Mia Lhopital,Lhopital,Hmlhopital@gmail.com,017673564169,15.02.2026,20.02.2026,2,2,"14,17","Peonia,Lavendula,Fenice",Übernachtung,de,Mobile (390 x 667 px),frau,--,Yes,2025-10-31T22:40:18+01:00
Michela,Borrelli,Michyborrelli@libero.it,,22.08.2025,24.08.2025,2,2,"2,6",,Übernachtung mit Frühstück,it,Mobile (390 x 606 px),frau,--,Yes,2025-08-18T20:45:44+02:00
Luisa,Göddemeier,Luisa.stoeckle@gmx.de,,27.12.2025,02.01.2026,2,2,"6,8","Peonia,Lavendula,Fenice",Übernachtung,de,Desktop (1080 x 707 px),frau,--,Yes,2025-11-18T11:04:07+01:00
Fabio panconi,Panconi,Panconifabio4@gmail.com,3284310119,26.12.2025,01.01.2026,4,4,"9,10,12,12",,Übernachtung,it,Mobile (392 x 739 px),herr,Italy,Yes,2025-09-01T21:57:18+02:00
Daniele,Simonetti,denny84844@libero.it,338 695 9081,31.12.2025,05.01.2026,2,2,"5,13",Peonia,Übernachtung mit Frühstück,it,Mobile (360 x 712 px),herr,--,Yes,2025-09-17T21:11:26+02:00
Loredana,Padedda,lorypaddy@gmail.com,,24.12.2025,01.01.2026,3,0,,Peonia,Halbpension,it,Mobile (393 x 770 px),frau,Italy,Yes,2025-09-17T20:27:18+02:00
Adriana,Alfieri,adrianaalfieri56@gmail.com,331 6516002,30.12.2025,04.01.2026,10,1,2,"Loft,Fenice,Forsythia,Bellis",Übernachtung mit Frühstück,it,Mobile (384 x 727 px),frau,--,Yes,2025-09-17T11:18:53+02:00
Tiziano,Conti,Tiziconti@virgilio.it,3495250717,27.12.2025,03.01.2026,4,4,"10,12,12,16",,Übernachtung,it,Mobile (390 x 677 px),herr,--,Yes,2025-09-17T00:45:17+02:00
Edoardo,Grimaccia,liftcar@hotmail.it,3921792572,07.09.2025,14.09.2025,2,0,,Loft,Halbpension,it,Mobile (433 x 830 px),herr,Italy,Yes,2025-08-23T17:38:21+02:00
Lara,Marcatelli,emanuelem83@gmail.com,,30.11.2025,07.12.2025,2,2,"6,14","Lavendula,Fenice",Halbpension,it,Mobile (392 x 735 px),frau,Italy,Yes,2025-08-23T12:45:52+02:00
Maria,Romoli,mr.mariaromoli@gmail.com,+393283996083,04.07.2026,11.07.2026,2,0,,Bellis,Übernachtung,it,Mobile (390 x 677 px),frau,Italy,Yes,2025-08-23T07:47:27+02:00
Christine Kappes,Kappes,christine_kappes@web.de,+491791099892,03.10.2025,11.10.2025,2,0,,"Loft,Lavendula,Forsythia",Übernachtung mit Frühstück,de,Desktop (1263 x 595 px),frau,Germany,Yes,2025-09-07T17:23:43+02:00
Flavio,Tosetto,flaviotosetto01@gmail.com,3286381429,01.01.2026,05.01.2026,2,2,"5,11",Lavendula,Übernachtung,it,Mobile (430 x 753 px),herr,Italy,Yes,2025-09-10T12:59:12+02:00
Simone,Cinti,simonec1984@live.it,3347902970,10.01.2026,17.01.2026,2,2,"5,7",,Halbpension,it,Mobile (411 x 785 px),herr,Italy,Yes,2025-09-10T10:14:37+02:00
Annunziata,Fico,Nunziafico09@gmail.com,3937737695,31.10.2025,02.11.2025,2,2,"2,5",Peonia,Halbpension,it,Mobile (393 x 770 px),frau,Italy,Yes,2025-09-10T07:11:19+02:00
Adriana,Rullo,adry.rullo@gmail.com,,18.08.2025,24.08.2025,2,2,"10,14","Peonia,Lavendula,Fenice",Halbpension,de,Mobile (360 x 667 px),frau,--,Yes,2025-06-23T14:55:25+02:00
Annamaria,Pozzani,Pasinifam@virgilio.it,3487353538,15.09.2025,18.09.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 660 px),frau,Italy,Yes,2025-08-22T18:05:52+02:00
Lakerta,Malaj,lakertamalaj@yahoo.it,+3285909788,21.12.2025,28.12.2025,2,2,"6,11",Lavendula,Halbpension,it,Mobile (390 x 652 px),frau,Italy,Yes,2025-09-03T21:49:52+02:00
Luca,Bottoni,Luca.bottoni06@gmail.com,+393389330916,18.07.2025,20.07.2025,2,1,11,Lavendula,Halbpension,it,Mobile (375 x 539 px),herr,--,Yes,2025-06-24T20:39:08+02:00
Luca,Bottoni,Luca.bottoni06@gmail.com,+393389330916,18.07.2025,20.07.2025,2,1,11,Lavendula,Halbpension,it,Mobile (375 x 539 px),herr,--,Yes,2025-06-24T20:39:08+02:00
Emiliana,Cottignoli,emilianacottignoli@yahoo.it,3462495979,12.07.2025,16.07.2025,2,0,,,Übernachtung mit Frühstück,it,Mobile (411 x 783 px),frau,Italy,Yes,2025-06-24T15:26:08+02:00
Massimo,Morandi,mazzinomorandi@gmail.com,3272485641,13.07.2025,16.07.2025,4,0,,"Lavendula,Fenice",Übernachtung,it,Mobile (338 x 609 px),herr,--,Yes,2025-06-23T18:28:24+02:00
Marianna,Sanna,marianna762006@libero.it,,28.08.2025,06.09.2025,2,0,,Lavendula,Übernachtung,it,Mobile (360 x 664 px),frau,Italy,Yes,2025-06-23T15:30:49+02:00
dumitrita bocanceai,bocancea,ionterenri@gmail.com,351887634,06.08.2025,10.08.2025,2,0,,"Forsythia,Bellis",Halbpension,it,Mobile (360 x 602 px),--,--,Yes,2025-07-12T23:51:54+02:00
Danila,Marenghi,marenghidanila84@gmail.com,,03.08.2025,10.08.2025,2,1,11,"Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (411 x 780 px),frau,Italy,Yes,2025-07-12T23:50:24+02:00
Nadia,Capurro,Capurronadia68@gmail.com,3474614757,23.08.2025,28.08.2025,2,0,,Bellis,Halbpension,it,Mobile (360 x 655 px),frau,Italy,Yes,2025-07-12T15:25:25+02:00
Fabio,Martino,fabiomartino71@gmail.com,+393343903454,16.08.2025,23.08.2025,3,1,14,Lavendula,Übernachtung mit Frühstück,it,Mobile (432 x 816 px),herr,Italy,Yes,2025-07-12T14:52:09+02:00
Giuseppe,Piovesan,piovesang26@gmail.com,3476676922,04.08.2025,11.08.2025,2,0,,Forsythia,Halbpension,it,Mobile (384 x 733 px),herr,Italy,Yes,2025-07-12T14:01:28+02:00
Leonardo,Intini,Intinileo@gmIl.com,3401618984,09.08.2025,20.08.2025,4,0,,,Übernachtung,it,Mobile (430 x 853 px),herr,Italy,Yes,2025-07-12T11:10:06+02:00
Camelia,GHEARASIM,ghearasimcamelia@gmail.com,329 165 6518,01.09.2025,07.09.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (384 x 725 px),frau,Italy,Yes,2025-07-12T10:49:03+02:00
Michele,Mainardi,Mikimaina@hotmail.it,+393355309213,13.08.2025,17.08.2025,2,0,,Bellis,Halbpension,it,Mobile (375 x 740 px),herr,Italy,Yes,2025-07-11T22:59:56+02:00
Edo,Ciaralli,Edocia74@gmail.com,3205781817,19.08.2025,23.08.2025,2,2,"13,16",Fenice,Halbpension,it,Mobile (390 x 652 px),herr,Italy,Yes,2025-07-11T17:07:50+02:00
Silvia,Pelicioli,Silvia.pelicioli@gmail.com,,10.08.2025,18.08.2025,2,3,"7,12,15",Loft,Halbpension,it,Mobile (411 x 788 px),frau,--,Yes,2025-07-11T14:12:14+02:00
Imma,Carone,nannaenea@gmail.com,,05.09.2025,12.09.2025,1,0,,Bellis,Übernachtung,it,undefined,frau,Italy,Yes,2025-07-11T13:17:06+02:00
Matteo,Tommasi,matteo.tommasi83@gmail.com,3208935492,13.08.2025,20.08.2025,2,1,0,,Halbpension,it,Mobile (360 x 652 px),herr,Italy,Yes,2025-07-11T12:46:26+02:00
Nadia,Baldino,nadiabaldino80@gmail.com,347844340,18.08.2025,24.08.2025,2,2,"14,17",,Halbpension,it,Mobile (360 x 681 px),frau,Italy,Yes,2025-07-11T06:48:42+02:00
Concetta,Pierro,amministrazione@consulenzapierro.com,3488549935,01.08.2025,04.08.2025,3,0,,Fenice,Halbpension,it,Mobile (393 x 548 px),frau,Italy,Yes,2025-07-10T19:11:00+02:00
Laura,Gaggioli,coccinelle-75@libero.it,,14.08.2025,22.08.2025,2,0,,"Loft,Bellis",Halbpension,it,Mobile (360 x 669 px),frau,--,Yes,2025-07-10T18:25:22+02:00
Diego,Vendramin,Vendramindiego70@gmail.com,335 194 2137,10.08.2025,17.08.2025,2,2,"11,12",Fenice,Halbpension,it,Mobile (375 x 740 px),herr,Italy,Yes,2025-07-10T10:27:13+02:00
Angela,Nonino,angy.nonino@gmail.com,,15.02.2026,18.02.2026,2,2,"9,14","Peonia,Fenice",Übernachtung mit Frühstück,it,Mobile (411 x 759 px),frau,Italy,Yes,2025-09-19T20:48:56+02:00
Daniela,Palusci,dany_p85@hotmail.it,,26.09.2025,29.09.2025,3,2,"3,6",Forsythia,Übernachtung mit Frühstück,it,Mobile (360 x 671 px),frau,--,Yes,2025-09-19T15:52:06+02:00
Davide,Bonello,davide_bonello@libero.it,,24.01.2026,31.01.2026,2,1,3,Peonia,Übernachtung mit Frühstück,it,Mobile (360 x 663 px),herr,--,Yes,2025-09-19T12:10:18+02:00
Marika,Castelletti,marikacastelletti@gmail.com,3285782640,22.12.2025,28.12.2025,2,2,"5,10","Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (360 x 668 px),frau,--,Yes,2025-09-19T11:58:33+02:00
Alessandra,Panacchia,alessandra.panacchia@uniroma1.it,,26.07.2025,02.08.2025,4,0,,,Übernachtung,it,Mobile (360 x 668 px),frau,Italy,Yes,2025-05-25T22:11:55+02:00
laura,severini,laura.severini@alice.it,3203309929,31.12.2025,03.01.2026,4,2,"8,9",Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 609 px),frau,Italy,Yes,2025-05-25T14:39:27+02:00
Gabriele,Borri,gabriele.borri15@hotmail.com,3392969841,20.07.2025,27.07.2025,2,2,"6,11",Fenice,Halbpension,it,Mobile (384 x 725 px),herr,Italy,Yes,2025-05-25T14:04:22+02:00
Marta,Novazzi,marta.novazzi@gmail.com,,06.07.2025,10.07.2025,2,0,,,Halbpension,it,Mobile (360 x 704 px),frau,Italy,Yes,2025-06-22T23:29:07+02:00
Gabriella,Mury,gmbaddy@gmail.com,+39 347 149 3998,17.08.2025,24.08.2025,3,0,,Peonia,Halbpension,it,Mobile (414 x 824 px),frau,Italy,Yes,2025-06-22T23:12:02+02:00
Francesco,Luongo,francescoluongo-4176@libero.it,3470531852,22.08.2025,25.08.2025,2,0,,Forsythia,Halbpension,it,Mobile (423 x 837 px),herr,Italy,Yes,2025-06-22T21:45:55+02:00
Giuseppina,Di Micco,media.marilory@yahoo.it,329 123 4406,01.08.2025,25.08.2025,1,0,,Bellis,Übernachtung,it,Mobile (392 x 724 px),frau,Italy,Yes,2025-06-22T21:34:01+02:00
Monika,Wolf,wolf.monika@me.com,1782171156,08.08.2026,15.08.2026,9,4,"3,8,8,9",,Halbpension,de,Mobile (428 x 744 px),frau,Germany,Yes,2025-08-06T13:09:23+02:00
cathy,cook,heart1584@aol.com,+1 4096564686,13.07.2025,20.07.2025,2,0,,Loft,Übernachtung,en,Desktop (1257 x 602 px),frau,United States of America,Yes,2025-06-16T14:45:28+02:00
Giancarlo,Capraro,giancarlocapraro8@gmail.com,3247839493,30.08.2025,04.09.2025,2,2,"5,8",Peonia,Halbpension,it,Mobile (360 x 364 px),herr,Italy,Yes,2025-08-17T15:34:55+02:00
Davis,Fabbi,Da.da2003@yahoo.it,3483637094,29.08.2025,31.08.2025,2,1,7,,Übernachtung,it,Mobile (384 x 726 px),herr,Italy,Yes,2025-08-17T13:37:38+02:00
Marilena Ciobanu,Ciobanu,marilenaciobanu016@gmail.com,3284384077,23.12.2025,28.12.2025,3,0,,Lavendula,Übernachtung,it,Mobile (384 x 705 px),frau,--,Yes,2025-10-05T17:17:34+02:00
Giulia,Chiaranda,giulia.chiaranda25@gmail.com,,21.02.2026,24.02.2026,2,2,"4,7","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (393 x 658 px),--,--,Yes,2025-10-05T14:03:14+02:00
Cristina,Porcu,porcucristina38@gmail.com,3338646289,02.12.2025,08.01.2026,3,1,7,Peonia,Halbpension,it,Mobile (375 x 551 px),frau,Italy,Yes,2025-10-05T09:09:30+02:00
Millauer,Kerstin,kerstinmillauer@gmail.com,,14.02.2026,17.02.2026,2,3,"8,10,12",,Übernachtung mit Frühstück,de,Mobile (375 x 634 px),--,--,Yes,2025-11-02T09:18:31+01:00
Alessandro,Cannuni,acannuni4@gmail.com,3450633788,02.01.2026,05.01.2026,4,3,"6,9,9",Lavendula,Halbpension,it,Mobile (360 x 589 px),herr,Italy,Yes,2025-10-10T00:00:02+02:00
Vittoria,sicolo,Vittoria.sicolo@icloud.com,+393892521295,30.12.2025,03.01.2026,2,0,,Forsythia,Halbpension,it,Mobile (393 x 594 px),frau,--,Yes,2025-10-09T16:49:27+02:00
Alueda,Mucaj,aluedaMucaj111@gmail.com,3806957164,14.11.2025,16.11.2025,2,3,"0,3,5",,Übernachtung,it,Mobile (430 x 853 px),frau,Italy,Yes,2025-10-09T14:00:10+02:00
Stefano,Cassol,stefanocassol91@gmail.com,3461223837,16.08.2025,23.08.2025,2,1,1,,Halbpension,it,Mobile (354 x 660 px),herr,Italy,Yes,2025-05-24T15:40:08+02:00
Gabriella,Margani,Gabriella.margani@yahoo.it,3460102509,09.08.2025,16.08.2025,2,1,9,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 616 px),frau,Italy,Yes,2025-05-24T11:31:44+02:00
Luana,Di carlo,dicarloluana@libero.it,,28.06.2025,05.07.2025,2,1,11,"Lavendula,Fenice,Forsythia",Übernachtung mit Frühstück,it,Mobile (375 x 626 px),frau,--,Yes,2025-05-24T07:02:27+02:00
Concetta,Salvatore,Frantin.tina@icloud.com,349 612 8429,14.07.2025,16.07.2025,2,1,12,Fenice,Übernachtung,it,Mobile (375 x 620 px),frau,Italy,Yes,2025-05-24T06:19:54+02:00
Giorgia Valenti,Valenti,Valentigiorgia@virgilio.it,340 128 8815,02.01.2026,05.01.2026,1,3,"8,16,17","Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (384 x 703 px),--,--,Yes,2025-11-18T13:00:13+01:00
Michela Noris,NORIS,mnoris71@gmail.com,+393460111365,29.12.2025,01.01.2026,2,0,,"Forsythia,Bellis",Übernachtung,it,Mobile (375 x 633 px),frau,Italy,Yes,2025-11-18T12:22:42+01:00
Cristina,Axinia,Cristinaaxinia11a@gmail.com,+393473439538,03.01.2026,06.01.2026,2,2,"13,17",Lavendula,Halbpension,it,Mobile (402 x 789 px),frau,Italy,Yes,2025-11-18T09:56:39+01:00
anna,lastrucci,lastruccianna4@gmail.com,3923827691,02.01.2026,06.01.2026,6,0,,"Peonia,Forsythia",Halbpension,it,Mobile (320 x 587 px),frau,Italy,Yes,2025-09-25T15:28:44+02:00
Cristian,Mariotti,cristianmariotti2@gmail.com,3389332607,24.12.2025,28.12.2025,2,2,"13,15",Peonia,Halbpension,it,Mobile (423 x 840 px),herr,Italy,Yes,2025-09-09T14:52:01+02:00
silvia,Lionello,silvia.lionello10@gmail.com,340 395 0522,24.12.2025,30.12.2025,2,1,15,Forsythia,Übernachtung,it,Mobile (360 x 678 px),frau,Italy,Yes,2025-09-09T06:53:14+02:00
Gaetano,Gramano,Ggramano@gmail.com,3935777775,06.12.2025,08.12.2025,2,2,"2,4",,Halbpension,it,Mobile (393 x 576 px),herr,--,Yes,2025-09-08T19:33:47+02:00
Alessia,Carroccia,alessiacarroccia@gmail.com,3298046700,27.12.2025,03.01.2026,2,1,8,Lavendula,Halbpension,it,Mobile (430 x 753 px),frau,--,Yes,2025-09-08T09:44:10+02:00
Domenico,Perotti,amministrazione@squadracredit.com,3476351869,30.12.2025,05.01.2026,2,1,14,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (411 x 655 px),herr,Italy,Yes,2025-10-18T23:02:49+02:00
daniele,dell uomo,daniele.delluomo@gmail.com,3475953749,01.01.2026,04.01.2026,2,2,"7,11",,Halbpension,it,Desktop (1887 x 924 px),herr,--,Yes,2025-10-18T12:45:21+02:00
daniele,dell uomo,daniele.delluomo@gmail.com,3475953749,01.01.2026,04.01.2026,2,2,"7,11",,Halbpension,it,Desktop (1887 x 924 px),herr,Italy,Yes,2025-10-18T12:43:27+02:00
Davis,Fabbi,Da.da2003@yahoo.it,3483637094,29.08.2025,31.08.2025,2,1,7,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 726 px),herr,--,Yes,2025-08-07T14:47:37+02:00
Rosa,Picchi,Rosapicchi@tiscali.it,3356482246,16.08.2025,23.08.2025,2,0,,"Forsythia,Bellis",Halbpension,it,Desktop (785 x 312 px),frau,Italy,Yes,2025-08-07T09:46:51+02:00
david,pesaresi,david_pesaresi@yahoo.it,3347022863,18.08.2025,22.08.2025,2,3,"4,9,11",,Übernachtung mit Frühstück,it,Mobile (411 x 770 px),herr,Italy,Yes,2025-08-07T08:49:20+02:00
Lara,Malpezzi,laramalpezzi4@gmail.com,3348488560,10.08.2025,16.08.2025,2,0,,Loft,Halbpension,it,Mobile (384 x 735 px),frau,--,Yes,2025-08-07T03:16:08+02:00
Patrizia,Tredici,tredicipatrizia@gmail.com,,24.08.2025,26.08.2025,2,0,,,Halbpension,it,Mobile (392 x 739 px),frau,--,Yes,2025-08-06T23:19:00+02:00
Flori,Kuka,florikuka86@gmail.com,3801006603,11.08.2025,16.08.2025,2,2,"5,15",Peonia,Übernachtung mit Frühstück,it,Mobile (320 x 585 px),herr,Italy,Yes,2025-08-06T21:19:19+02:00
Agnese,Carnevali,federicomartina73@gmail.com,3471196161,16.08.2025,23.08.2025,2,3,"11,14,17",Peonia,Halbpension,it,Mobile (423 x 846 px),frau,--,Yes,2025-08-06T12:31:17+02:00
LUCA,Marcato,lucamarcato490@gmail.com,+393283469417,08.09.2025,10.09.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 667 px),herr,Italy,Yes,2025-08-31T17:49:01+02:00
Alessandro,Camoletti,a.camoletti@gmail.com,3762096182,02.01.2026,06.01.2026,3,0,,Fenice,Übernachtung,it,Desktop (1024 x 696 px),herr,Italy,Yes,2025-08-31T15:43:16+02:00
Paolo,Mariani,Paolo.mariani@casbot.com,3420853374,12.08.2025,21.08.2025,2,0,,Peonia,Halbpension,it,Mobile (360 x 627 px),herr,Italy,Yes,2025-05-21T19:17:43+02:00
Daniele,Paiano,Direzione@idea-vision.it,,11.08.2025,24.08.2025,2,0,,Forsythia,Übernachtung mit Frühstück,it,Mobile (375 x 546 px),herr,Italy,Yes,2025-05-21T14:27:52+02:00
Enrico,Breda,Enrico@visibilia.net,,27.06.2025,30.06.2025,4,0,,"Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (440 x 655 px),herr,--,Yes,2025-05-21T14:09:42+02:00
Marco Predieri,Predieri,Famigliapredieri@gmail.com,3397810676,05.12.2025,08.12.2025,2,0,,Forsythia,Übernachtung mit Frühstück,it,Mobile (360 x 691 px),herr,Italy,Yes,2025-10-17T21:21:17+02:00
Silvia,Pistilli,silviapistilli@yahoo.it,4384221774,20.07.2025,27.07.2025,3,0,,Peonia,Halbpension,it,undefined,frau,Italy,Yes,2025-06-29T17:27:29+02:00
Monica,Pini,moni.pini76@gmail.com,,20.08.2025,27.08.2025,2,0,,Forsythia,Halbpension,it,Mobile (384 x 700 px),frau,--,Yes,2025-06-29T15:21:34+02:00
Francesco,Martinelli,fmartinelli1976@gmail.com,,09.08.2025,16.08.2025,2,1,17,"Peonia,Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (360 x 676 px),herr,--,Yes,2025-06-29T15:00:16+02:00
Federica,Ripiccini,Ripiccini_federica@hotmail.com,3397429694,09.08.2025,16.08.2025,2,1,12,,Halbpension,it,Mobile (414 x 706 px),frau,Italy,Yes,2025-06-29T14:45:46+02:00
domenico,demaria,domenicodemaria610@gmail.com,3341305718,10.08.2025,17.08.2025,2,0,,Forsythia,Halbpension,it,Desktop (1349 x 615 px),herr,Italy,Yes,2025-06-29T13:41:30+02:00
Angela,Ignomeriello,Ignomerielloa@gmail.com,3336378567,26.07.2025,31.07.2025,2,0,,Loft,Übernachtung mit Frühstück,it,Mobile (320 x 575 px),frau,Italy,Yes,2025-06-29T07:36:52+02:00
Camelia,Bogdan,Cameliabogdan0@gmail.com,3469494585,05.07.2025,12.07.2025,2,0,,Fenice,Halbpension,it,Mobile (360 x 663 px),frau,Italy,Yes,2025-05-23T17:29:06+02:00
Carlo,Consani,c.consani1@gmail.com,3333015899,16.08.2025,23.08.2025,2,0,,Loft,Übernachtung mit Frühstück,it,Mobile (384 x 708 px),herr,Italy,Yes,2025-05-23T14:42:47+02:00
Mirko,Angeli,mirko2675@gmail.com,3388567415,17.08.2025,24.08.2025,2,0,,"Forsythia,Bellis",Halbpension,it,Mobile (411 x 790 px),herr,Italy,Yes,2025-05-23T13:32:24+02:00
Katia,Masciulli,Masciullikatia1977@gmail.com,,28.12.2025,04.01.2026,6,2,"11,16",,Halbpension,it,Desktop (834 x 1087 px),frau,--,Yes,2025-11-02T19:40:50+01:00
Elena,Onofrei,oelena7@gmail.com,,06.02.2026,08.02.2026,2,1,8,Loft,Übernachtung,it,Mobile (360 x 653 px),frau,Italy,Yes,2025-11-02T14:30:20+01:00
Luca,Asteggiano,asteluca82@gmail.com,3395692025,02.01.2026,05.01.2026,2,2,"8,12",Lavendula,Halbpension,it,Mobile (360 x 667 px),herr,Italy,Yes,2025-11-02T13:14:58+01:00
Alessia,Bignù,alex.down.the.rabbit.hole@gmail.com,3516221506,20.12.2025,01.01.2026,2,2,"13,17",,Übernachtung mit Frühstück,it,Mobile (411 x 780 px),frau,Italy,Yes,2025-11-02T13:05:07+01:00
maura dagnino,Dagnino,Mauradagnino@libero.it,3403815344,28.11.2025,30.11.2025,2,2,"8,11",,Übernachtung,it,Mobile (320 x 631 px),frau,--,Yes,2025-11-02T09:35:38+01:00
Robert,Nitschke,robert.nitschke@gmx.net,017624694617,13.02.2026,17.02.2026,2,2,"2,6","Loft,Peonia,Lavendula,Fenice,Forsythia",Übernachtung,de,Mobile (393 x 665 px),herr,Germany,Yes,2025-06-11T19:49:20+02:00
Carloalberto,Molina,molinacala@libero.it,,29.12.2025,03.01.2026,2,2,"1,8",,Halbpension,it,Mobile (392 x 739 px),herr,Italy,Yes,2025-11-14T02:05:10+01:00
Paola,De Carlo,Decarlopaola@gmail.com,,27.11.2025,27.12.2025,4,2,"7,11",Peonia,Halbpension,it,Mobile (402 x 677 px),frau,--,Yes,2025-11-13T14:33:07+01:00
Gabriele,Dr.Matuschek-Grohmann,gabriele@dr-matuschek-grohmann.de,02615791416,01.09.2025,10.09.2025,2,0,,Peonia,Übernachtung mit Frühstück,de,Mobile (430 x 739 px),frau,Germany,Yes,2025-08-01T17:09:11+02:00
Erica,Biondi,Ericabiondi77@gmail.com,349 1560995,11.08.2025,18.08.2025,5,0,,"Loft,Lavendula",Halbpension,it,Mobile (414 x 608 px),frau,Italy,Yes,2025-07-13T22:12:43+02:00
Giuseppe,Piovesan,piovesang26@gmail.com,3476676922,03.08.2025,10.08.2025,2,0,,Forsythia,Halbpension,it,Mobile (384 x 733 px),herr,Italy,Yes,2025-07-13T20:02:46+02:00
Anna,Mandolini,anna.mandolini57@gmail.com,3404039103,21.07.2025,27.07.2025,2,0,,Forsythia,Halbpension,it,Mobile (360 x 655 px),frau,Italy,Yes,2025-07-13T19:18:46+02:00
Paola,Passarin,pabli2580@gmail.com,,26.12.2025,04.01.2026,2,2,"3,8",Lavendula,Übernachtung,it,Mobile (384 x 727 px),frau,--,Yes,2025-07-13T17:50:58+02:00
Francesco,Valente,Francescovalente@ymail.com,3204988031,02.08.2025,09.08.2025,2,0,,"Loft,Forsythia,Bellis",Übernachtung mit Frühstück,it,Mobile (393 x 651 px),herr,--,Yes,2025-07-13T15:21:41+02:00
dumitrita bocancea,terenti,ionterenti@gmail.com,351887634,06.08.2025,10.08.2025,2,1,0,Bellis,Halbpension,it,Mobile (360 x 680 px),herr,Italy,Yes,2025-07-13T13:30:35+02:00
Antonio Vannacci,Vannacci,antonio.vannacci@gmail.com,3394942185,26.07.2025,01.08.2025,3,0,,Fenice,Halbpension,it,Mobile (360 x 661 px),herr,Italy,Yes,2025-06-15T18:57:11+02:00
Elisa,Lore,Elisaaaaa@gmail.com,,28.06.2025,03.07.2025,2,3,"10,13,16",,Halbpension,it,Mobile (390 x 663 px),frau,--,Yes,2025-06-15T09:01:22+02:00
Marco,Lovino,marcolovino17@gmail.com,3333677558,11.08.2025,14.08.2025,2,1,7,,Halbpension,it,Mobile (384 x 731 px),herr,--,Yes,2025-06-15T08:15:31+02:00
Andrea,Meini,falle.gname.72@gmail.com,3495618372,21.07.2025,28.07.2025,2,0,,Fenice,Halbpension,it,undefined,herr,--,Yes,2025-06-14T23:21:53+02:00
Enzo,Sberna,enzosberna@libero.it,,01.08.2025,08.08.2025,2,0,,Bellis,Halbpension,it,Mobile (320 x 551 px),herr,Italy,Yes,2025-06-14T20:56:32+02:00
Paolo,Antonucci,Palletto@gmail.com,,10.08.2025,20.08.2025,2,1,8,,Halbpension,it,Mobile (384 x 705 px),--,--,Yes,2025-06-14T19:37:35+02:00
Davis,Fabbi,Da.da2003@yahoo.it,3483637094,06.09.2025,08.09.2025,2,1,7,,Halbpension,it,Mobile (384 x 726 px),--,--,Yes,2025-09-03T08:17:40+02:00
Arianna,Taffetani,Arytaffi90@gmail.com,+393398430571,23.12.2025,28.12.2025,2,6,"2,3,5,9,14,14",Loft,Halbpension,it,Mobile (393 x 596 px),frau,Italy,Yes,2025-09-03T07:39:35+02:00
Vittoria,Sicolo,Vittoria.sicolo@icloud.com,+393892521295,30.12.2025,03.01.2026,2,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (393 x 658 px),frau,Italy,Yes,2025-10-13T16:48:53+02:00
Vittoria,Sicolo,Vittoria.sicolo@icloud.com,+393892521295,30.12.2025,03.01.2026,2,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (393 x 658 px),frau,Italy,Yes,2025-10-13T16:48:53+02:00
Elisa,Galassi,Eliga84@gmail.com,3402539330,05.12.2025,08.12.2025,2,2,"8,11","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (390 x 776 px),frau,Italy,Yes,2025-10-13T16:35:37+02:00
Hazel Silvia,Massone,hazel.massone@gmail.com,03925081848,18.08.2025,22.08.2025,2,2,"12,14",Lavendula,Übernachtung mit Frühstück,en,Desktop (1521 x 730 px),frau,Italy,Yes,2025-07-28T16:17:39+02:00
.lanfredi Rachele,Lanfredi,Lanfredi.rachele@gmail.com,348 865 4218,20.06.2025,30.09.2025,4,0,,Peonia,Übernachtung,it,Mobile (360 x 653 px),frau,Italy,Yes,2025-06-08T17:19:36+02:00
Roberta,Piron,robertapiron@gmail.com,3470906155,14.07.2025,21.07.2025,2,1,14,Peonia,Halbpension,it,Mobile (360 x 668 px),--,Italy,Yes,2025-06-08T11:21:57+02:00
Barbara,Magliani,barbara.magliani@gmail.com,,30.06.2025,06.07.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (384 x 681 px),--,Italy,Yes,2025-06-08T01:37:10+02:00
Davide,Montanari,davide.montanari72@gmail.com,,24.08.2025,31.08.2025,2,1,16,Lavendula,Übernachtung,it,Mobile (686 x 965 px),--,--,Yes,2025-06-07T19:20:44+02:00
Franca,Gravano,franca.asia@yahoo.it,069278163,29.08.2025,06.09.2025,2,0,,,Halbpension,it,Mobile (392 x 739 px),frau,Italy,Yes,2025-06-07T11:15:41+02:00
Alberto,Gandini,Alby.gandy@gmail.com,+393387032435,23.08.2025,30.08.2025,4,0,,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (384 x 726 px),herr,Italy,Yes,2025-06-07T07:52:56+02:00
Prof. Wolfhard,Cappel,wolfhard.cappel@t-online.de,01624782205,31.05.2025,11.06.2025,2,0,,Loft,Übernachtung,de,Desktop (1382 x 980 px),herr,Germany,Yes,2025-05-19T20:12:02+02:00
Gayan Msdurapperuma,Madurapperuma,gsgayan@gmail.com,3881033320,27.12.2025,30.12.2025,2,2,"8,12","Peonia,Lavendula",Halbpension,it,Mobile (411 x 504 px),herr,--,Yes,2025-11-12T12:03:58+01:00
Katharina,Campe,k.campe@t-online.de,+491719322029,13.09.2025,20.09.2025,2,0,,Forsythia,Übernachtung,de,Desktop (1468 x 711 px),frau,Germany,Yes,2025-05-30T17:35:33+02:00
Luca,Zottin,zottinluca04@gmail.com,3334234743,11.07.2025,13.07.2025,2,0,,Loft,Übernachtung mit Frühstück,it,Mobile (390 x 663 px),herr,Italy,Yes,2025-06-27T23:43:08+02:00
Elena,Razza,elena.razza@libero.it,3480316800,04.07.2025,07.07.2025,3,0,,Lavendula,Übernachtung mit Frühstück,it,Desktop (1521 x 703 px),frau,Italy,Yes,2025-06-27T20:55:03+02:00
Ombretta,Benattii,ombrettabenatti74@gmail.com,3496723430,09.08.2025,17.08.2025,3,1,15,"Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (392 x 512 px),frau,Italy,Yes,2025-06-27T16:18:18+02:00
Nazzarena,Ioannucci,nenaioannucci@gmail.com,3493675124,31.08.2025,06.09.2025,2,0,,Forsythia,Halbpension,it,Mobile (414 x 706 px),frau,Italy,Yes,2025-06-27T12:22:42+02:00
Emanuele,Capozzi,capozziemanuele27@gmail.com,3383051766,17.08.2025,24.08.2025,2,2,"12,15","Peonia,Fenice",Übernachtung,it,Mobile (360 x 668 px),herr,Italy,Yes,2025-06-27T12:05:48+02:00
Gabriele,Mansour,Manfadi4@gmail.com,388 169 0894,28.07.2025,02.08.2025,2,1,5,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (368 x 771 px),herr,--,Yes,2025-06-27T08:22:36+02:00
Marco,Quadrelli,soniacesaretti73@libero.it,3389783613,27.07.2025,04.08.2025,5,0,,Fenice,Halbpension,it,Mobile (360 x 691 px),herr,--,Yes,2025-06-27T07:50:42+02:00
Barbara Serragli,Serragli,barbaratiare3@gmail.com,,05.12.2025,08.12.2025,2,1,13,Peonia,Übernachtung mit Frühstück,it,Mobile (411 x 682 px),frau,Italy,Yes,2025-09-18T22:23:47+02:00
Marco,D'EMILIO,mardem76@gmail.com,,20.09.2025,27.09.2025,2,4,"9,10,15,17",Fenice,Halbpension,it,Mobile (384 x 705 px),herr,Italy,Yes,2025-09-18T13:47:36+02:00
Marina,D'Este,d.este.mary@gmail.com,,02.10.2025,09.10.2025,2,0,,,Halbpension,it,Mobile (392 x 740 px),frau,--,Yes,2025-09-06T16:51:58+02:00
Marina,D'Este,d.este.mary@gmail.com,,02.10.2025,09.10.2025,2,0,,,Übernachtung,it,Mobile (392 x 740 px),frau,Italy,Yes,2025-09-06T16:51:25+02:00
paola,Bosco,paola.bosco@policlinico.mi.it,,13.09.2025,16.09.2025,2,0,,"Peonia,Lavendula",Übernachtung,it,Mobile (600 x 806 px),frau,Italy,Yes,2025-09-06T16:32:57+02:00
Davide,Bonello,davide_bonello@libero.it,+393294139937,07.03.2026,14.03.2026,2,1,3,Peonia,Übernachtung,it,Mobile (360 x 589 px),herr,--,Yes,2025-09-06T12:00:33+02:00
Micaela,Mostacci,Micaela.mostacci@gmail.com,3382615080,21.02.2026,28.02.2026,2,2,"8,15",,Halbpension,it,Mobile (440 x 764 px),frau,--,Yes,2025-09-24T23:57:05+02:00
Flavia,Barattini,flavia.barattini28@gmail.com,,12.08.2025,19.08.2025,2,1,15,Lavendula,Übernachtung mit Frühstück,it,Mobile (360 x 659 px),frau,Italy,Yes,2025-06-21T15:16:57+02:00
Jacopo,Giannoni,Jacopo.giannoni@hotmail.it,+393357727375,06.08.2025,09.08.2025,2,0,,Bellis,Halbpension,it,Mobile (411 x 783 px),herr,--,Yes,2025-07-20T23:41:25+02:00
ANNA,Fiorenzo,Annafiorenzo@gmail.com,320484241,18.08.2025,23.08.2025,2,2,"10,16",,Halbpension,it,Mobile (384 x 600 px),--,--,Yes,2025-07-20T22:59:54+02:00
Valentina,Zanframundo,Vale@tallo.eu,3480340348,16.08.2025,23.08.2025,2,4,"3,5,6,10",,Übernachtung,it,Mobile (360 x 653 px),frau,Italy,Yes,2025-07-20T20:45:04+02:00
Max,Bernardini,bernamax.555@gmail.com,3462152149,14.08.2025,17.08.2025,2,1,12,Fenice,Übernachtung mit Frühstück,it,Mobile (320 x 511 px),herr,Italy,Yes,2025-07-20T20:05:06+02:00
Sara,Baroni,sarabaronima@gmail.com,3455876868,09.08.2025,16.08.2025,2,1,9,,Übernachtung,it,Mobile (360 x 660 px),frau,Italy,Yes,2025-07-20T13:22:08+02:00
Roberto,Marchesoli,robe.marche@gmail.com,334 343 4357,03.08.2025,10.08.2025,3,0,,,Übernachtung,it,Mobile (392 x 740 px),herr,Italy,Yes,2025-07-20T09:38:39+02:00
Daniela,Mercante,danielamercante@gmail.com,328 133 6726,11.08.2025,18.08.2025,4,4,"7,7,11,14","Peonia,Lavendula",Übernachtung mit Frühstück,it,Mobile (384 x 704 px),frau,Italy,Yes,2025-07-20T02:22:06+02:00
Daniela,Mercante,danielamercante@gmail.com,328 133 6726,11.08.2025,18.08.2025,4,4,"7,7,11,14",Lavendula,Übernachtung mit Frühstück,it,Mobile (384 x 704 px),frau,Italy,Yes,2025-07-20T01:48:36+02:00
Domenico,De Santis,2d.desantis@gmail.com,3316655319,10.08.2025,16.08.2025,7,0,,"Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (360 x 553 px),herr,--,Yes,2025-07-19T19:29:20+02:00
Francesco,Scaccia,sca.france@hotmail.it,,26.07.2025,02.08.2025,2,2,"0,4","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (376 x 701 px),herr,Italy,Yes,2025-07-19T12:21:06+02:00
Paola,Zanesi,Paola.zanesi81@gmail.com,,17.08.2025,21.08.2025,5,2,"6,10","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (393 x 673 px),frau,Italy,Yes,2025-07-19T10:14:57+02:00
Elena,Martini,Martjn76@gmail.com,+393476436905,10.08.2025,15.08.2025,2,1,8,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 653 px),frau,Italy,Yes,2025-07-19T06:28:01+02:00
Martina,Marchetti,martina_marchetti@hotmail.it,3492563144,25.08.2025,27.08.2025,2,1,1,"Lavendula,Fenice,Forsythia",Halbpension,it,Mobile (360 x 673 px),frau,Italy,Yes,2025-07-18T21:30:04+02:00
Massimo,Lattanzi,xmax.lattanzi@libero.it,3929114256,08.09.2025,12.09.2025,3,0,,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (360 x 668 px),herr,Italy,Yes,2025-07-18T20:53:35+02:00
Massimo,Lattanzi,xmax.lattanzi@libero.it,3929114256,08.09.2025,12.09.2025,3,0,,Lavendula,Halbpension,it,Mobile (360 x 571 px),herr,Italy,Yes,2025-07-18T20:49:10+02:00
Iuliana,Soroceanu,irsoroceanu@gmail.com,,26.07.2025,28.07.2025,2,0,,Bellis,Halbpension,it,Mobile (411 x 800 px),frau,--,Yes,2025-07-18T19:54:26+02:00
Chiara,Gandossi,gandossi.chiara@libero.it,3294415567,17.08.2025,23.08.2025,2,1,13,"Lavendula,Fenice",Halbpension,it,Mobile (411 x 771 px),frau,--,Yes,2025-07-18T18:13:23+02:00
Chiara,Caglio,chiara.caglio@libero.it,,11.08.2025,15.08.2025,4,1,13,,Übernachtung mit Frühstück,it,Mobile (390 x 663 px),frau,--,Yes,2025-07-18T17:59:19+02:00
Sara,Valbonesi,saravalbonesi@hotmail.it,,14.08.2025,17.08.2025,2,3,"8,9,11",,Übernachtung mit Frühstück,it,Mobile (360 x 673 px),frau,Italy,Yes,2025-07-18T15:39:43+02:00
Roberta Santacecilia,Santacecilia,robertasantacecilia@gmail.com,+39348,04.08.2025,08.08.2025,2,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung mit Frühstück,it,Mobile (360 x 678 px),frau,--,Yes,2025-07-18T11:59:29+02:00
Orietta,Sacchetto,Orietta.sacchetto@me.com,3393113587,18.07.2025,20.07.2025,2,1,12,,Halbpension,it,Mobile (414 x 718 px),frau,Italy,Yes,2025-07-18T07:21:15+02:00
Giulia,Rocca,giuliarocca1970@gmail.com,3409226740,09.08.2025,16.08.2025,2,0,,"Peonia,Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (360 x 653 px),frau,--,Yes,2025-07-18T06:14:20+02:00
Daniela,Mazzitelli,Mazzi84@inwind.it,3496436906,18.08.2025,25.08.2025,2,1,3,Lavendula,Halbpension,it,Mobile (384 x 671 px),frau,Italy,Yes,2025-07-17T23:46:36+02:00
Paola,Bartocci,paolavoliamo@virgilio.it,3475736848,21.07.2025,28.07.2025,2,0,,,Halbpension,it,Mobile (360 x 647 px),frau,Italy,Yes,2025-07-17T23:08:41+02:00
Simone,Croce,crocesimone@gmail.com,,15.08.2025,22.08.2025,2,2,"4,8","Peonia,Lavendula,Fenice,Forsythia",Übernachtung mit Frühstück,it,Mobile (392 x 739 px),--,--,Yes,2025-07-17T18:06:35+02:00
Stefania,Pietrangeli,Stefania_pie@yahoo.it,+393497879667,16.08.2025,23.08.2025,2,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung mit Frühstück,it,Mobile (360 x 653 px),frau,Italy,Yes,2025-07-17T15:02:45+02:00
valeria,magrino,valeire@hotmail.it,3935657931,13.09.2025,20.09.2025,2,2,"1,9",Lavendula,Halbpension,it,Desktop (1585 x 731 px),frau,Italy,Yes,2025-07-17T12:25:44+02:00
Simone,Croce,crocesimone@gmail.com,,15.08.2025,22.08.2025,2,2,"4,8","Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (392 x 739 px),herr,--,Yes,2025-07-17T12:04:23+02:00
Luca,Zottin,zottinluca04@gmail.com,3334234743,11.07.2025,13.07.2025,2,0,,"Loft,Lavendula,Forsythia",Übernachtung mit Frühstück,it,Mobile (390 x 663 px),herr,Italy,Yes,2025-06-26T18:50:20+02:00
Gabriella,Saronni,sa.gabri@libero.it,3495866827,10.08.2025,17.08.2025,3,0,,"Peonia,Lavendula",Übernachtung,it,Mobile (414 x 699 px),frau,Italy,Yes,2025-06-26T14:58:54+02:00
luca,zottin,zottinluca04@gmail.com,,11.07.2025,13.07.2025,2,0,,"Loft,Lavendula,Forsythia",Übernachtung mit Frühstück,it,Mobile (390 x 663 px),herr,Italy,Yes,2025-06-26T10:33:50+02:00
Sara,Forti,forti.sara@libero.it,,09.08.2025,16.08.2025,2,1,6,Fenice,Übernachtung,it,Mobile (411 x 783 px),--,--,Yes,2025-06-25T22:41:30+02:00
Jens,Winkelmann,skyline_84@web.de,,18.07.2026,28.07.2026,2,1,12,"Peonia,Lavendula,Fenice",Halbpension,de,Mobile (402 x 714 px),herr,Germany,Yes,2025-11-16T18:07:10+01:00
Marco,Provenzi,Marcoprovenzi@alice.it,3383330586,07.06.2025,12.06.2025,3,1,1,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung,it,Desktop (1080 x 704 px),herr,Italy,Yes,2025-05-27T15:49:31+02:00
Hazel,Mass,hazel.massone@gmail.com,3925981848,19.08.2025,23.08.2025,2,2,"11,13",Fenice,Übernachtung mit Frühstück,en,Mobile (384 x 656 px),frau,--,Yes,2025-07-27T09:37:17+02:00
Stefania,Martella,stefimart9@gmail.com,3471161198,27.12.2025,03.01.2026,4,3,"10,14,14","Lavendula,Forsythia",Halbpension,it,Mobile (360 x 667 px),--,--,Yes,2025-10-12T15:43:09+02:00
Andrea,Mazzer,andrea.mazzer88@gmail.com,349 539 4720,31.12.2025,04.01.2026,2,2,"6,8",,Halbpension,it,Mobile (390 x 663 px),herr,Italy,Yes,2025-10-12T06:24:11+02:00
Liliana,Alexeeva,Liliana.alexeeva@gmail.com,39 3409972074,21.12.2025,26.12.2025,2,0,,Fenice,Übernachtung mit Frühstück,it,Mobile (411 x 721 px),frau,Italy,Yes,2025-10-11T22:12:12+02:00
MASSIMO,MOCCI,maxmocci61@gmail.com,3295380005,01.08.2026,10.08.2026,2,0,,"Fenice,Forsythia",Übernachtung mit Frühstück,it,Desktop (1905 x 953 px),herr,Italy,Yes,2025-10-11T19:43:15+02:00
Simona,Reina,simona.reina1985@gmail.com,3471345714,12.12.2025,13.12.2025,2,0,,Peonia,Halbpension,it,Mobile (360 x 668 px),frau,--,Yes,2025-10-11T18:02:44+02:00
Tatiana,Ballarino,Tatianaballarino@hotmail.it,+393290126388,30.12.2025,04.01.2026,4,3,"0,2,3",,Halbpension,it,Mobile (390 x 570 px),frau,Italy,Yes,2025-10-11T14:36:10+02:00
Elisa,Pini,elisapini1@gmail.com,,29.08.2025,31.08.2025,2,1,7,"Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (360 x 648 px),frau,--,Yes,2025-08-21T19:37:44+02:00
Elisa,Canini,artelisa79@hotmail.com,3349207514,24.11.2025,30.11.2025,2,0,,Forsythia,Übernachtung mit Frühstück,it,Mobile (360 x 649 px),frau,San Marino,Yes,2025-08-21T12:23:08+02:00
Lidia Ciuraru,Ciursru,lidiaanaciuraru@gmail.com,3207242313,24.12.2025,28.12.2025,4,4,"3,3,6,16","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 668 px),frau,Italy,Yes,2025-09-29T18:42:33+02:00
Francesca,Calogiuri,Francescacalogiuri@hotmail.com,3401765276,08.08.2026,19.08.2026,2,2,"3,8","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (440 x 774 px),frau,Italy,Yes,2025-08-20T16:03:33+02:00
Alice,Lazzeri,alicelazzeri@libero.it,3294643748,29.12.2025,05.01.2026,2,1,14,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (393 x 576 px),frau,--,Yes,2025-08-20T10:57:10+02:00
Lorenzo,Fosca,Fosca2002@libero.it,+39 335 849 0091,16.08.2025,23.08.2025,2,0,,,Übernachtung mit Frühstück,it,Mobile (384 x 705 px),herr,--,Yes,2025-08-14T19:21:33+02:00
Giovanni,Pilla,giopilla86@gmail.com,,21.08.2025,24.08.2025,2,0,,Bellis,Halbpension,it,Mobile (390 x 777 px),herr,--,Yes,2025-08-14T18:02:29+02:00
luigi,nicolini,nicoliniluigi@hotmail.it,3466240846,06.09.2025,13.09.2025,2,0,,Forsythia,Übernachtung,it,Mobile (360 x 604 px),herr,Italy,Yes,2025-08-14T15:49:19+02:00
Leonardo,RICCIARELLI,Leonardoricciarelli@gmail.com,3476218658,17.08.2025,20.08.2025,2,0,,Forsythia,Übernachtung,it,Mobile (360 x 678 px),herr,Italy,Yes,2025-08-14T13:58:38+02:00
Leonardo,RICCIARELLI,Leonardoricciarelli@gmail.com,3476218658,17.08.2025,20.08.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 678 px),herr,Italy,Yes,2025-08-14T13:56:14+02:00
Alessandro,Cocchi,allecocchi@hotmail.it,3492810231,08.09.2025,11.09.2025,2,2,"0,3","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (390 x 655 px),herr,Italy,Yes,2025-08-14T12:39:13+02:00
Sara,De Cesco,Saradecesco1@gmail.com,,17.08.2025,24.08.2025,3,1,14,,Übernachtung,it,Mobile (390 x 655 px),--,--,Yes,2025-05-29T17:35:29+02:00
Mirka,Baiardi,mirkabaiardi@yahoo.it,3469674768,20.07.2025,24.07.2025,2,1,17,,Übernachtung mit Frühstück,it,Mobile (360 x 664 px),frau,Italy,Yes,2025-05-29T06:24:28+02:00
Cangini,Beatrice,bea.cangini@gmail.com,+393385850986,03.08.2025,10.08.2025,2,2,"11,17",Fenice,Halbpension,it,Mobile (360 x 616 px),frau,Italy,Yes,2025-06-13T21:58:37+02:00
Susanna,Sozzi,sozzisusanna@gmail.com,349 210 0236,05.07.2025,12.07.2025,4,0,,Peonia,Halbpension,it,Mobile (384 x 729 px),frau,Italy,Yes,2025-06-13T17:16:55+02:00
Italo,Ferrari,cilix028@gmail.com,3470853989,11.08.2025,18.08.2025,2,0,,"Loft,Forsythia,Bellis",Halbpension,it,Mobile (384 x 726 px),herr,Italy,Yes,2025-06-13T15:26:45+02:00
Sara,Rottini,sara.rottini@hotmail.it,3332252085,21.08.2025,28.08.2025,2,1,1,"Forsythia,Bellis",Übernachtung,it,Mobile (360 x 663 px),frau,Italy,Yes,2025-06-13T10:59:02+02:00
Massimo,Taroni,massimotaroni65@gmail.com,3791415848,04.07.2025,07.07.2025,2,0,,"Lavendula,Fenice,Forsythia",Halbpension,it,Mobile (432 x 816 px),herr,Italy,Yes,2025-06-13T10:30:03+02:00
alessia,proietti,alessiapro77@gmail.com,391 485 3388,13.07.2025,20.07.2025,3,1,12,Fenice,Halbpension,it,Mobile (360 x 691 px),frau,Italy,Yes,2025-06-12T23:12:00+02:00
Laura,Salvucci,laurasalvucci@hotmail.it,,24.08.2025,31.08.2025,2,2,"9,11","Loft,Lavendula,Fenice",Halbpension,it,Mobile (384 x 698 px),frau,Italy,Yes,2025-06-12T22:48:29+02:00
Enrico,Cavallucci,ecavallucci@libero.it,,01.07.2025,06.07.2025,3,1,11,Fenice,Übernachtung,it,Mobile (411 x 765 px),herr,--,Yes,2025-06-12T21:39:09+02:00
Magda,De vanna,Magdadevanna@libero.it,3494105942,16.08.2025,23.08.2025,2,1,2,Forsythia,Halbpension,it,Mobile (360 x 665 px),frau,--,Yes,2025-06-12T08:52:59+02:00
Anita,Bevilacqua,bevilacquaanita@gmail.com,,16.08.2025,23.08.2025,2,1,2,"Peonia,Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (375 x 625 px),frau,--,Yes,2025-06-03T22:02:25+02:00
Fabiola,Giffoni,F.giffonifabiola@gmail.com,3386570888,07.07.2025,14.07.2025,2,2,"2,9","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (440 x 759 px),frau,--,Yes,2025-06-03T19:35:33+02:00
Marco,Provenzi,Marcoprovenzi@alice.it,3383330586,07.06.2025,12.06.2025,2,0,,"Lavendula,Fenice,Forsythia",Übernachtung,it,Desktop (1080 x 704 px),herr,Italy,Yes,2025-06-03T17:07:48+02:00
Sabrina,Meli,sabriturris@gmail.com,+393282863597,11.08.2025,16.08.2025,2,1,10,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 731 px),frau,--,Yes,2025-06-03T07:11:04+02:00
Alessandra Faliva,Faliva,Gian.ale@alice.it,3495019535,19.07.2025,26.07.2025,2,1,15,,Halbpension,it,Mobile (432 x 862 px),--,Italy,Yes,2025-06-03T07:02:03+02:00
mirka,baiardi,mirkabaiardi@yahoo.it,3469674768,20.07.2025,24.07.2025,2,1,17,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Desktop (1513 x 786 px),frau,Italy,Yes,2025-06-02T22:38:51+02:00
Elisabetta,Ravasi,Elisabetta.ravasi@sappi.com,IT +393455131145,30.08.2025,06.09.2025,2,0,,,Übernachtung mit Frühstück,it,Mobile (393 x 643 px),frau,Italy,Yes,2025-06-02T21:27:46+02:00
Roberta,Bolognesi,robertabolognesi@icloud.com,,02.08.2025,09.08.2025,7,1,3,,Halbpension,it,Mobile (393 x 658 px),frau,--,Yes,2025-06-02T18:26:01+02:00
Felice,Lustrissimi,felicelustri@tiscali.it,3282744961,19.07.2025,26.07.2025,2,1,15,,Übernachtung mit Frühstück,it,Mobile (414 x 703 px),herr,Italy,Yes,2025-06-02T12:58:46+02:00
Elisa Franzini,Franzini,Elisa.franzi77@gmail.com,3406459744,14.08.2025,17.08.2025,2,3,"6,11,13",,Übernachtung mit Frühstück,it,Mobile (428 x 759 px),frau,Italy,Yes,2025-08-10T00:50:43+02:00
Luca,Mambrini,daybyday2007@hotmail.it,,13.08.2025,20.08.2025,2,0,,Forsythia,Übernachtung,it,Mobile (440 x 760 px),herr,Italy,Yes,2025-08-09T20:57:50+02:00
Elisa,Franzini,elisa.franzi77@gmail.com,3406459744,14.08.2025,17.08.2025,2,3,"6,11,13",,Übernachtung mit Frühstück,it,Mobile (428 x 744 px),frau,Italy,Yes,2025-08-09T18:41:22+02:00
Flavia mercadante/ascani,Mercadante Ascani,Ascani.flavia@gmail.com,3383705561,11.08.2025,16.08.2025,2,0,,"Loft,Forsythia",Halbpension,it,Mobile (428 x 856 px),frau,--,Yes,2025-08-09T16:10:48+02:00
Rosa,Galdieri,Rosa.1709@libero.it,3395471194,12.08.2025,14.08.2025,2,2,"3,4",Lavendula,Halbpension,it,Mobile (360 x 678 px),frau,Italy,Yes,2025-08-09T12:21:16+02:00
Ester,caserio,estercaser@gmail.com,339 805 5859,17.08.2025,22.08.2025,2,3,"3,6,13",,Halbpension,it,Mobile (430 x 731 px),frau,Italy,Yes,2025-08-09T11:58:41+02:00
Chiara,IANNIELLO,chiara.ianniello@gmail.com,3929402169,17.08.2025,24.08.2025,2,2,"8,10","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 603 px),frau,Italy,Yes,2025-08-09T09:35:56+02:00
Chiara,Bernabucci,chiarabernabucci1@gmail.com,+393498482965,23.08.2025,27.08.2025,2,0,,Forsythia,Übernachtung,it,Mobile (393 x 658 px),frau,--,Yes,2025-08-09T08:17:42+02:00
Luca,Manfredini,lucamanfredini89@libero.it,,17.08.2025,21.08.2025,2,0,,"Forsythia,Bellis",Halbpension,it,Mobile (384 x 721 px),herr,Italy,Yes,2025-08-09T07:58:58+02:00
Gimmi,Longo,gimmilongo@gmail.com,392 299 9016,23.08.2025,29.08.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 667 px),herr,Italy,Yes,2025-08-08T21:54:07+02:00
paola,floris,paulaflo@tiscali.it,3403309928,27.12.2025,03.01.2026,4,1,4,,Halbpension,it,Mobile (360 x 678 px),frau,Italy,Yes,2025-08-08T17:34:44+02:00
Laura,Sacco,laurasacco9@gmail.com,3881783486,19.08.2025,26.08.2025,4,2,"0,2",Loft,Halbpension,it,Mobile (392 x 743 px),frau,Italy,Yes,2025-08-08T15:29:36+02:00
Andrea,Crisafuli,andreacrisafuli46@hotmail.com,,21.06.2025,23.06.2025,2,2,"7,10",,Übernachtung mit Frühstück,it,Desktop (1265 x 639 px),herr,--,Yes,2025-06-06T07:24:22+02:00
Roberta,Bolofnesi,robertabolognesi@icloud.com,,02.08.2025,09.08.2025,7,1,3,,Halbpension,it,Mobile (393 x 658 px),--,--,Yes,2025-06-05T22:16:52+02:00
Andrea,Martino,andrea.martino89@hotmail.it,3201135544,20.08.2025,30.08.2025,2,1,1,,Halbpension,it,Mobile (360 x 668 px),herr,Italy,Yes,2025-06-05T17:51:16+02:00
Luca,Modafferi,lmodafferi@libero.it,,28.07.2025,03.08.2025,2,1,0,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 650 px),herr,--,Yes,2025-06-05T07:30:17+02:00
Cristina,Mandelli,Pulce73.cm@gmail.com,3922673165,08.08.2026,22.08.2026,2,1,16,Peonia,Übernachtung,it,Mobile (411 x 778 px),frau,Italy,Yes,2025-08-24T19:45:15+02:00
Lucia,Visintin,Luciavisintin@libero.it,3394268406,12.09.2025,15.09.2025,2,0,,Forsythia,Halbpension,it,Mobile (384 x 725 px),frau,Italy,Yes,2025-08-24T14:35:31+02:00
Davide,Gennari,Davide.gennari.64@gmail.com,3286482900,09.08.2026,16.08.2026,4,1,14,Lavendula,Übernachtung,it,Mobile (360 x 653 px),herr,Italy,Yes,2025-08-24T12:36:09+02:00
Luca,Saracca,Lucas.1978@hotmail.it,3397191581,26.12.2025,29.12.2025,2,2,"1,7",Forsythia,Halbpension,it,Mobile (369 x 724 px),herr,Italy,Yes,2025-09-07T09:07:54+02:00
Marta,Pettenò,Martap80@libero.it,,14.08.2025,17.08.2025,2,1,14,,Halbpension,it,Mobile (411 x 697 px),frau,--,Yes,2025-08-13T16:46:28+02:00
Alessio,Ridolfi,ridocr74@gmail.com,3313758106,25.08.2025,30.08.2025,2,0,,"Lavendula,Fenice,Forsythia",Halbpension,it,Mobile (390 x 657 px),herr,Italy,Yes,2025-08-13T15:01:51+02:00
Katy,Vitorbi,Katia.vitorbi79@gmail.com,3402264803,18.08.2025,23.08.2025,2,2,"5,8",Peonia,Halbpension,it,Mobile (320 x 531 px),frau,Italy,Yes,2025-08-13T03:04:13+02:00
Alessandra,De luca,aledeluca8576@gmail.com,350 181 4305,17.08.2025,24.08.2025,2,3,"6,11,12",Fenice,Halbpension,it,Mobile (360 x 410 px),frau,Italy,Yes,2025-08-12T21:29:46+02:00
Barbara,Tieri,btieri@gmail.com,3282121541,19.08.2025,21.08.2025,2,1,10,,Halbpension,it,Mobile (393 x 673 px),frau,Italy,Yes,2025-08-12T14:32:40+02:00
Barbara,Tieri,btieri@gmail.com,3282121541,19.08.2025,21.08.2025,2,1,10,,Halbpension,it,Mobile (393 x 673 px),frau,Italy,Yes,2025-08-12T14:32:40+02:00
eugen sandor,sandor,lianapaulasandor@yahoo.it,3405481688,15.08.2025,17.08.2025,2,1,12,Fenice,Halbpension,it,Mobile (390 x 580 px),herr,Italy,Yes,2025-08-12T09:54:15+02:00
Salvatore,Tulumello,tulumellosalvatore@virgilio.it,3383260038,16.08.2025,20.08.2025,2,0,,Bellis,Halbpension,it,Mobile (392 x 739 px),herr,Italy,Yes,2025-08-12T09:49:22+02:00
Laura,Levati,lauraaragon0@gmail.com,,18.08.2025,25.08.2025,4,2,"2,4",,Halbpension,it,Mobile (414 x 533 px),frau,--,Yes,2025-08-12T08:07:34+02:00
Mauro,Cerasti,antares.wlz@gmail.com,3474014445,23.08.2025,30.08.2025,2,2,"12,14",,Halbpension,it,Mobile (411 x 763 px),herr,--,Yes,2025-08-11T21:37:45+02:00
Salvatore,Spagnolo,spagnosalva13@gmail.com,3283040182,18.08.2025,22.08.2025,2,0,,,Übernachtung,it,Mobile (384 x 697 px),herr,Italy,Yes,2025-08-11T13:53:36+02:00
Enrico Maria,Sala,Enricomaria.sala@gmail.com,3496283936,17.08.2025,23.08.2025,2,1,10,,Halbpension,it,Mobile (360 x 616 px),herr,--,Yes,2025-08-11T11:16:31+02:00
Matteo,Pierleoni,Matteo.pierleoni@gmail.com,,29.08.2025,31.08.2025,2,1,1,"Peonia,Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (402 x 677 px),herr,Italy,Yes,2025-08-11T10:11:19+02:00
Martina Imberti,Imberti,Imberti.martina@gmail.com,3453398717,09.08.2026,16.08.2026,4,2,"1,4",,Übernachtung,it,Mobile (393 x 658 px),--,--,Yes,2025-08-11T09:51:39+02:00
Davis,Fabbi,Da.da2003@yahoo.it,3483637094,29.08.2025,31.08.2025,2,1,7,Peonia,Halbpension,it,Mobile (384 x 726 px),herr,--,Yes,2025-08-11T06:31:53+02:00
Vincenzo,Melissari,vincenzo.melissari@hotmail.it,,20.08.2025,27.08.2025,2,1,1,,Halbpension,it,Mobile (360 x 724 px),herr,--,Yes,2025-08-10T22:32:48+02:00
Turso Turso,Stefi,Stefiturso7@gmail.com,,30.08.2025,05.09.2025,3,1,2,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 759 px),frau,--,Yes,2025-08-10T15:19:35+02:00
Gimmi,Longo,gimmilongo@gmail.com,392 299 9016,23.08.2025,29.08.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 667 px),herr,Italy,Yes,2025-08-10T13:50:42+02:00
Andrea,Carbognani,Andreacarbognani1072@gmail.com,3391775255,18.08.2025,20.08.2025,2,2,"10,14",Peonia,Halbpension,it,Mobile (390 x 677 px),herr,Italy,Yes,2025-08-10T13:17:55+02:00
Nicola,Valbusa,valbusanicola@gmail.com,3483592114,16.08.2025,22.08.2025,2,2,"8,12",,Übernachtung,it,Mobile (390 x 663 px),herr,Italy,Yes,2025-05-22T20:40:19+02:00
johnny,carnevale,dittacarnevale@gmail.com,3337900230,27.08.2025,01.09.2025,2,1,12,,Halbpension,it,Desktop (1351 x 607 px),herr,Italy,Yes,2025-05-22T15:10:58+02:00
Karin,Becker,beckerkarin@hotmail.de,,05.07.2025,08.07.2025,2,0,,,Übernachtung,de,Mobile (390 x 652 px),frau,Germany,Yes,2025-06-15T16:29:01+02:00
Martina,Maffessanti,martimaffe@hotmail.com,3393460946,30.12.2025,03.01.2026,2,1,0,,Übernachtung,it,Mobile (411 x 796 px),frau,Italy,Yes,2025-10-24T21:37:11+02:00
Sara Zerbinati,Zerbinati,Sarazerbinati89@gmail.com,3334911170,14.02.2026,18.02.2026,2,2,"4,7",Lavendula,Übernachtung,it,Mobile (390 x 662 px),frau,Italy,Yes,2025-10-24T09:55:15+02:00
Anna,Filippitsch,anna.filippitsch@gmail.com,,15.10.2025,17.10.2025,2,0,,Lavendula,Übernachtung,de,Mobile (402 x 678 px),--,--,Yes,2025-10-11T17:48:05+02:00
Chiara,Di Emidio,chiara.diemidio88@gmail.com,3280393016,25.07.2025,29.07.2025,2,2,"4,5",Peonia,Halbpension,it,Mobile (384 x 707 px),frau,--,Yes,2025-05-18T07:22:17+02:00
Fee,Kandel,fee.kandel@gmx.at,,10.10.2025,12.10.2025,2,0,,,Übernachtung mit Frühstück,de,Mobile (402 x 678 px),frau,Austria,Yes,2025-09-25T13:03:10+02:00
Lisa,Mann,Lisa.beth.mann@gmail.com,6033403983,04.08.2025,07.08.2025,4,2,"6,8","Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung mit Frühstück,en,Mobile (430 x 739 px),frau,United States of America,Yes,2025-06-05T09:41:37+02:00
Edoardo,Domenichini,domenichiniedoardo@gmail.com,3348077427,31.12.2025,04.01.2026,6,3,"4,4,4",Bellis,Halbpension,it,Mobile (406 x 774 px),herr,Italy,Yes,2025-09-13T23:25:42+02:00
Giuseppe,Visicale,Giuseppevisicale151@gmail.com,339 215 9919,23.12.2025,26.12.2025,2,1,6,Bellis,Halbpension,it,Mobile (360 x 663 px),herr,Italy,Yes,2025-09-16T11:33:47+02:00
Maddalena,Cerroni,madda.84@icloud.com,0863995248,14.06.2026,21.06.2026,4,5,"2,2,5,5,10","Peonia,Lavendula",Halbpension,it,Mobile (393 x 673 px),frau,Italy,Yes,2025-09-16T06:53:43+02:00
Serena,Benetti,serena.benetti@gmail.com,,27.12.2025,03.01.2026,2,1,5,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (411 x 785 px),frau,--,Yes,2025-09-15T23:14:43+02:00
Bruno,Berselli,bruno.berselli77@gmail.com,,11.12.2025,14.12.2025,2,1,1,,Halbpension,it,Desktop (1440 x 837 px),herr,--,Yes,2025-10-26T10:50:16+01:00
Andrea,Cibin,a.cibin@yahoo.com,3479170150,22.02.2026,26.02.2026,2,2,"2,5","Peonia,Fenice",Übernachtung mit Frühstück,it,Mobile (393 x 663 px),herr,Italy,Yes,2025-10-26T07:34:12+01:00
Hans-Georg,Döring,hg.doering@t-online.de,016098927216,27.07.2025,02.08.2025,2,0,,"Loft,Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,de,undefined,herr,Germany,Yes,2025-07-06T17:51:24+02:00
Elena,Batoni,elebat72@gmail.com,3473794160,18.08.2025,22.08.2025,2,0,,"Loft,Forsythia",Übernachtung,it,Mobile (392 x 715 px),frau,Italy,Yes,2025-07-02T23:46:41+02:00
Giacomo,Spelta,Giacomospelta@libero.it,3355321619,13.07.2025,20.07.2025,2,2,"9,12",Fenice,Halbpension,it,Mobile (384 x 725 px),herr,Italy,Yes,2025-07-02T22:30:25+02:00
Laura,Andrelli,leogala78@gmail.com,3665273432,20.07.2025,26.07.2025,2,2,"8,14","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (375 x 740 px),frau,--,Yes,2025-07-02T13:26:51+02:00
Gianluca,Mazza,Gia.ma73@libero.it,+39 328 081 7271,09.08.2025,16.08.2025,2,2,"13,16",,Halbpension,it,Mobile (390 x 769 px),herr,Italy,Yes,2025-07-02T13:07:31+02:00
Raffaele,Buscemi,Rafbuscemi@gmail.com,,28.07.2025,10.08.2025,2,2,"2,3","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (390 x 655 px),herr,Italy,Yes,2025-07-02T12:53:06+02:00
Gianfranco,La torre,gianfrancolatorre41@gmail.com,348 566 3035,04.08.2025,10.08.2025,2,0,,Forsythia,Halbpension,it,Mobile (360 x 667 px),herr,Italy,Yes,2025-07-02T10:54:00+02:00
Marisa,Galli,marisapatrizia.galli@gmail.com,3427717487,19.09.2025,26.09.2025,2,0,,Peonia,Übernachtung,it,Mobile (392 x 743 px),frau,--,Yes,2025-07-02T00:20:17+02:00
Mauro,Sapia,rosamau.ice@gmail.com,3389233180,29.07.2025,07.08.2025,2,0,,,Übernachtung,it,Mobile (390 x 558 px),herr,Italy,Yes,2025-07-01T13:50:50+02:00
Patrizia Barbiani,Barbiani,pbarbiani@gmail.com,3457660305,18.08.2025,24.08.2025,2,0,,,Halbpension,it,Mobile (375 x 740 px),frau,Italy,Yes,2025-07-01T12:11:39+02:00
Silvia,Kostopoulos,Kostsilvia92@gmail.com,,03.08.2025,08.08.2025,2,1,2,"Loft,Peonia,Lavendula,Fenice,Forsythia",Übernachtung mit Frühstück,it,Mobile (375 x 620 px),frau,Italy,Yes,2025-07-01T09:50:30+02:00
Elisabetta,Buldini,elisabettabuldini@yahoo.it,3891128500,17.08.2025,23.08.2025,5,0,,"Peonia,Bellis",Halbpension,it,Mobile (360 x 668 px),frau,Italy,Yes,2025-06-30T21:56:07+02:00
Gianluca,Bronzetti,isabella.migliarini@gmail.com,3402262447,01.01.2026,05.01.2026,2,3,"9,9,13",,Halbpension,it,Mobile (384 x 733 px),--,--,Yes,2025-09-28T12:07:25+02:00
Alessandro,Zara,alessandrozara@yahoo.it,347 324 8352,31.07.2025,03.08.2025,2,2,"15,16",Fenice,Übernachtung,it,Mobile (411 x 789 px),herr,Italy,Yes,2025-07-07T21:29:38+02:00
Tiziana Perini,Perini,Tiziana.perini@libero.it,3334929271,09.08.2025,13.08.2025,2,2,"10,16",Fenice,Halbpension,it,Mobile (411 x 698 px),frau,--,Yes,2025-07-07T17:05:36+02:00
Viviana,Magoga,vivianamagoga@libero.it,333 583 1182,23.07.2025,25.07.2025,2,0,,Bellis,Halbpension,it,Mobile (384 x 721 px),frau,Italy,Yes,2025-07-07T15:41:23+02:00
Milena,Miccio,kigio@hotmail.com,,05.08.2025,14.08.2025,2,0,,Bellis,Halbpension,it,Mobile (384 x 717 px),frau,Italy,Yes,2025-07-07T08:18:14+02:00
Federico,Giovanardi,kimon32@gmail.com,3473455279,07.08.2025,17.08.2025,2,2,"12,14",,Übernachtung,it,Mobile (360 x 560 px),herr,Italy,Yes,2025-07-06T23:15:14+02:00
Alessia,Pavani,morinieleo@gmail.com,33160399388,16.08.2025,23.08.2025,2,2,"10,12",,Halbpension,it,Mobile (402 x 784 px),frau,Italy,Yes,2025-07-06T20:58:35+02:00
Elisa Mercati,Mercati,Elisa27francesco@gmail.com,3898488735,24.08.2025,31.08.2025,2,2,"4,11",,Halbpension,it,Mobile (390 x 655 px),frau,Italy,Yes,2025-07-06T19:11:51+02:00
Emanuele,Caronia,e.caronia@libero.it,3385058141,09.08.2025,23.08.2025,2,0,,,Übernachtung,it,Mobile (433 x 830 px),herr,Italy,Yes,2025-07-06T15:37:07+02:00
Gianpaolo,Ceruti,Gippao27@gmail.com,,31.08.2025,05.09.2025,2,2,"3,3",Fenice,Halbpension,it,Mobile (392 x 739 px),herr,--,Yes,2025-07-06T11:25:12+02:00
Ulisse,Magrini,Daniela.pianelli68@gmail.com,+39 333 333 333,22.07.2025,29.07.2025,2,1,9,Peonia,Halbpension,it,Mobile (360 x 494 px),herr,Italy,Yes,2025-07-06T11:12:15+02:00
Gaetano,Proscia,kyra1411@gmail.com,,13.07.2025,19.07.2025,2,2,"7,12","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (411 x 794 px),herr,--,Yes,2025-07-06T09:43:47+02:00
Benedetta,ronci,benedetta.ronci@hotmail.it,3284919316,26.07.2025,02.08.2025,2,2,"8,13","Forsythia,Bellis",Halbpension,it,Mobile (390 x 662 px),frau,Italy,Yes,2025-07-06T09:26:40+02:00
gianluca mazza,Mazza,Gia.ma73@libero.it,+39 328 081 7271,09.08.2025,16.08.2025,2,2,"13,16",Lavendula,Halbpension,it,Mobile (390 x 655 px),herr,Italy,Yes,2025-07-06T07:59:01+02:00
Desiree,Nannarelli,d.nannarelli@gmail.com,327 734 8572,20.07.2025,27.07.2025,2,1,16,,Übernachtung,it,Mobile (360 x 668 px),frau,Italy,Yes,2025-07-06T06:34:11+02:00
gianluca mazza,Mazza,Gia.ma73@libero.it,+39 328 081 7271,09.08.2025,16.08.2025,2,2,"13,16",Peonia,Halbpension,it,Mobile (390 x 655 px),herr,Italy,Yes,2025-07-05T20:06:44+02:00
Arberi,Beltoja,arberial@yahoo.it,+39329724158,01.01.2026,05.01.2026,2,2,"8,12","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (440 x 701 px),frau,Italy,Yes,2025-08-27T21:46:29+02:00
Carlo,Bragante,bragantecarlo@gmail.com,338 956 9195,07.09.2025,11.09.2025,2,0,,Bellis,Halbpension,it,Mobile (384 x 705 px),herr,Italy,Yes,2025-08-27T18:17:16+02:00
Mariangela,Caprini,caprinimariangela@gmail.com,3391263971,26.09.2025,29.09.2025,2,0,,Bellis,Halbpension,it,Mobile (392 x 642 px),frau,Italy,Yes,2025-08-27T13:05:20+02:00
ILARIA,ALGHISI,ILARIA.ALGHISI@LIVE.IT,,26.12.2025,02.01.2026,2,2,"8,12","Peonia,Lavendula,Fenice",Halbpension,it,Desktop (2545 x 1271 px),frau,--,Yes,2025-08-27T12:17:02+02:00
Vittoria,Carolo,Vittoria9185@libero.it,+393280836615,22.08.2025,24.08.2025,2,2,"2,2",Peonia,Halbpension,it,Mobile (338 x 604 px),herr,Italy,Yes,2025-07-30T20:29:33+02:00
Deborah,Limaschi,Limaschideborah@gmail.com,+393487490408,24.08.2025,31.08.2025,2,1,1,"Loft,Peonia,Forsythia,Bellis",Halbpension,it,Mobile (428 x 745 px),frau,Italy,Yes,2025-07-30T14:03:52+02:00
Francis,Abag,angelicoabag1984@gmail.com,+393289479442,20.08.2025,23.08.2025,4,2,"2,4","Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (411 x 790 px),herr,--,Yes,2025-07-30T10:59:54+02:00
Stefania,Rullini,Stefania.rullini@gmail.com,3487809455,09.08.2025,13.08.2025,1,0,,Bellis,Halbpension,it,Mobile (411 x 759 px),frau,Italy,Yes,2025-07-30T00:26:58+02:00
Maurizio,BORELLA,maurizioborella@gmail.com,+328 314 0148,25.08.2025,30.08.2025,3,1,1,Peonia,Halbpension,it,Mobile (384 x 703 px),herr,Italy,Yes,2025-07-29T23:23:20+02:00
Simona,Crespolini,simonacrespolini@alice.it,+393335886823,17.08.2025,24.08.2025,2,0,,Forsythia,Übernachtung mit Frühstück,it,Mobile (384 x 708 px),frau,Italy,Yes,2025-07-29T19:41:51+02:00
Donata,Brisotto,donata.brisotto@gmail.com,3453991011,26.12.2025,02.01.2026,2,1,12,"Peonia,Lavendula",Übernachtung mit Frühstück,it,Mobile (430 x 731 px),frau,Italy,Yes,2025-07-29T11:34:40+02:00
Turso,Stefi,Stefiturso7@gmail.com,,25.08.2025,01.09.2025,3,1,2,,Übernachtung mit Frühstück,it,Mobile (384 x 759 px),frau,Italy,Yes,2025-07-29T10:53:59+02:00
Simona,Burlacu,simona_antoni5042@yahoo.it,3481838149,03.01.2026,06.01.2026,2,1,15,Fenice,Übernachtung mit Frühstück,it,Mobile (320 x 599 px),frau,Italy,Yes,2025-11-10T18:35:13+01:00
Elena,Stirparo,fabriziocurcio1981@gmail.com,+393295620241,30.12.2025,03.01.2026,2,3,"3,13,16",Peonia,Halbpension,it,Mobile (360 x 720 px),frau,Italy,Yes,2025-11-10T09:25:45+01:00
Irene,Salari,Irenesalari@yahoo.it,,21.11.2025,23.11.2025,3,2,"1,8",Fenice,Übernachtung,it,Mobile (390 x 662 px),frau,Italy,Yes,2025-11-09T23:33:24+01:00
Mirko,Zoa,Zoa339@gmail.com,3453329509,09.02.2026,15.02.2026,2,2,"0,3",Fenice,Halbpension,it,Mobile (360 x 686 px),herr,Italy,Yes,2025-11-09T16:31:31+01:00
Emanuela,Filini,manufilini@gmail.com,,30.12.2025,01.01.2026,2,2,"6,9",,Halbpension,it,Mobile (390 x 777 px),--,--,Yes,2025-11-09T15:29:10+01:00
Daniela,Mazzitelli,mazzi84@inwind.it,,18.08.2025,25.08.2025,2,1,3,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 725 px),frau,--,Yes,2025-07-16T18:07:09+02:00
Roberta,Salvatore,roberta.salvatore@gmail.com,,03.08.2025,12.08.2025,2,1,11,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (390 x 662 px),frau,Italy,Yes,2025-07-16T16:27:22+02:00
Andrea,Lanzilotto,andrea.lanzilotto@libero.it,,04.08.2025,11.08.2025,2,2,"3,9",,Halbpension,it,Mobile (360 x 694 px),herr,--,Yes,2025-07-16T15:26:20+02:00
Lara,Fochesato,Lara.fochesato@live.it,+39 348 993 410 1___,11.08.2025,16.08.2025,2,0,,"Loft,Forsythia",Übernachtung,it,Mobile (320 x 518 px),frau,Italy,Yes,2025-07-16T06:54:53+02:00
Fabrizio,Turcato,Fabrizio_turcato@yahoo.com,00393487823030,14.08.2025,17.08.2025,2,2,"6,13",,Übernachtung mit Frühstück,it,Mobile (360 x 655 px),herr,--,Yes,2025-07-16T04:40:32+02:00
Simone,Denaro,zerosimone1@inwind.it,3475487509,24.08.2025,31.08.2025,2,2,"12,15","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 672 px),herr,Italy,Yes,2025-07-15T20:24:08+02:00
Andrea,Gonnella,leogala75@gmail.com,,22.07.2025,26.07.2025,2,2,"8,14",Bellis,Halbpension,it,Mobile (390 x 655 px),herr,--,Yes,2025-07-15T14:54:03+02:00
PAOLA,SIGNORI,Paola8.b@virgilio.it,340 484 1451,08.08.2025,17.08.2025,4,0,,Peonia,Übernachtung,it,Mobile (393 x 651 px),frau,Italy,Yes,2025-07-15T13:31:41+02:00
francesca.masserelli@virgilio.it,Masserelli,Francesca.masserelli@virgilio.it,,09.08.2025,19.08.2025,3,0,,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 702 px),frau,Italy,Yes,2025-07-15T13:25:40+02:00
Veronica,Urbinati,veronica.urbinati@gmail.com,3397381960,18.08.2025,21.08.2025,2,2,"4,7","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 752 px),frau,Italy,Yes,2025-07-15T12:21:09+02:00
Leonardo,INTINI,intinileo@gmail.com,3401618984,09.08.2025,20.08.2025,4,0,,,Übernachtung,it,Mobile (430 x 738 px),herr,Italy,Yes,2025-07-15T10:43:06+02:00
Katia,Bonaldo,katiabonaldo@gmail.com,348 984 3627,11.08.2025,18.08.2025,3,1,12,,Übernachtung mit Frühstück,it,Mobile (390 x 655 px),frau,--,Yes,2025-07-15T10:25:25+02:00
Katia,Corbara,corbara.katia@gmail.com,3403221080,09.08.2025,13.08.2025,2,2,"3,7",Peonia,Halbpension,it,Mobile (360 x 694 px),frau,Italy,Yes,2025-07-15T10:17:11+02:00
Francesco,Vecchiola,f.vecchiola@gmail.com,3316712985,04.08.2025,09.08.2025,2,1,1,Bellis,Halbpension,it,Mobile (393 x 651 px),herr,Italy,Yes,2025-06-11T18:13:22+02:00
Patrizia Santirocchi,Santirocchi,mauro_1711@yahoo.it,3281238285,09.08.2025,15.08.2025,3,0,,Peonia,Übernachtung,it,Mobile (390 x 655 px),frau,Italy,Yes,2025-06-11T14:07:37+02:00
Vitalba,Mezzocapo,ricevavit@gmail.com,3355638559,02.08.2025,12.08.2025,3,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (390 x 769 px),frau,--,Yes,2025-06-11T05:32:00+02:00
Susi,Bergamini,susibergamini@gmail.com,347 103 4812,10.08.2025,17.08.2025,2,0,,,Halbpension,it,Desktop (800 x 1209 px),herr,--,Yes,2025-06-10T21:06:54+02:00
Sara,Cavallaro,sarajuve1981@gmail.com,3395838265,28.06.2025,05.07.2025,2,0,,Loft,Halbpension,it,Mobile (360 x 663 px),frau,Italy,Yes,2025-06-10T13:34:01+02:00
Gian piero,Moretti,Gianpiero.moretti@hotmail.it,3288172990,12.07.2025,19.07.2025,1,0,,Bellis,Übernachtung,it,Mobile (360 x 647 px),herr,Italy,Yes,2025-06-10T06:54:28+02:00
Elena Martini,Martini,Martjn76@gmail.com,347 643 6905,10.08.2025,15.08.2025,2,1,8,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 657 px),frau,Italy,Yes,2025-07-22T19:18:05+02:00
Sara,Sanzi,Sarasanzi035@gmail.com,,20.08.2025,24.08.2025,2,0,,Forsythia,Halbpension,it,Mobile (411 x 678 px),frau,Italy,Yes,2025-07-22T18:23:48+02:00
Barbara,Murgia,barbara1aprile@gmail.com,3925519714,14.08.2025,18.08.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (392 x 739 px),frau,--,Yes,2025-07-22T17:05:22+02:00
Antonella,Marazia,marazia.antonella@gmail.com,,01.08.2025,07.08.2025,3,0,,Fenice,Übernachtung,it,Mobile (392 x 760 px),frau,--,Yes,2025-07-22T06:42:06+02:00
Simona Ferrigno,Ferrigno,Simo84f@libero.it,3498901318,18.08.2025,24.08.2025,2,1,14,Lavendula,Halbpension,it,Mobile (384 x 704 px),frau,Italy,Yes,2025-07-22T06:40:07+02:00
Gennaro,Piscopo,Gennaro.rosa98@hotmail.it,3490597097,28.12.2025,01.01.2026,2,0,,Loft,Halbpension,it,Mobile (360 x 638 px),herr,Italy,Yes,2025-07-22T06:38:21+02:00
marina,pellanda,marinapel1980@gmail.com,3466414764,13.08.2025,17.08.2025,2,1,2,,Halbpension,it,Mobile (392 x 743 px),frau,--,Yes,2025-07-21T23:47:44+02:00
Laura,Tomasi,arualtom@libero.it,3471473826,18.08.2025,21.08.2025,2,1,8,"Fenice,Forsythia",Halbpension,it,Mobile (390 x 662 px),frau,Italy,Yes,2025-07-21T21:58:04+02:00
Mandis,Mariana,m.mandis@yahoo.com,+393281137505,14.08.2025,17.08.2025,3,3,"2,8,9",,Übernachtung mit Frühstück,it,Mobile (390 x 580 px),frau,Italy,Yes,2025-07-21T20:52:53+02:00
Elisa,Malini,Elisa.malini@gmail.com,3806547696,16.08.2025,21.08.2025,2,2,"12,17",Lavendula,Halbpension,it,Mobile (411 x 760 px),frau,Italy,Yes,2025-07-21T19:28:18+02:00
Matteo,Sais,M.sais@libero.it,,11.08.2025,16.08.2025,3,0,,,Halbpension,it,Mobile (411 x 717 px),herr,--,Yes,2025-07-21T19:06:34+02:00
Cinzia,Vignatelli,cinziavigna.cv@gmail.com,3478745685,06.09.2025,09.09.2025,2,1,16,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,undefined,frau,Italy,Yes,2025-07-21T18:10:58+02:00
Sara,Rottini,sara.rottini@hotmail.it,3332252085,19.08.2025,23.08.2025,2,1,1,"Lavendula,Fenice,Forsythia",Halbpension,it,Mobile (360 x 671 px),frau,Italy,Yes,2025-07-21T16:41:40+02:00
Luana,Cascelli,Luana_0715@msn.com,3404056650,11.08.2025,17.08.2025,2,2,"6,10",,Übernachtung,it,Mobile (390 x 655 px),frau,--,Yes,2025-07-21T15:37:10+02:00
Maria Cristina,Leonardi,mcristina.leonardi@libero.it,3477905824,08.08.2025,18.08.2025,2,1,16,,Übernachtung mit Frühstück,it,Mobile (411 x 780 px),frau,Italy,Yes,2025-07-21T14:53:06+02:00
Walter,Bartoli,walterbartoli@gmail.com,3406562623,09.07.2026,14.07.2026,2,2,"8,12",Lavendula,Halbpension,it,Mobile (384 x 701 px),herr,Italy,Yes,2025-08-29T05:49:14+02:00
Anna,Bortolan,Spanna0000@gmail.com,3775297172,28.12.2025,02.01.2026,5,0,,,Übernachtung,it,Mobile (390 x 662 px),frau,--,Yes,2025-08-28T20:44:40+02:00
Arianna,Natale,arianna.natale92@gmail.com,+393932550830,06.12.2025,08.12.2025,4,4,"1,1,8,8","Peonia,Lavendula",Übernachtung mit Frühstück,it,Mobile (393 x 673 px),frau,Italy,Yes,2025-08-28T15:33:50+02:00
Stademann,Natalie,n.stademann@gmail.com,0049 176 95552518,03.10.2025,10.10.2025,2,0,,Fenice,Halbpension,de,Desktop (1905 x 967 px),frau,Germany,Yes,2025-09-28T10:40:52+02:00
Paola,Cerrone,p_cerrone@hotmail.it,3347850429,27.12.2025,03.01.2026,9,6,"6,7,7,10,11,12","Peonia,Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (338 x 606 px),frau,Italy,Yes,2025-08-18T06:53:35+02:00
Maria rosaria Bonofiglio,BONOFIGLIO,Maria.4277@yahoo.com,3477564244,27.09.2025,03.10.2025,2,2,"5,8",,Halbpension,it,Mobile (375 x 632 px),frau,Italy,Yes,2025-09-22T21:48:07+02:00
Maurizio Perugini,Perugini,perugini.maurizio@gmail.com,3334424116,27.12.2025,03.01.2026,6,6,"10,14,14,16,16,16",,Halbpension,it,Mobile (393 x 659 px),herr,Italy,Yes,2025-09-22T21:05:59+02:00
Alessia Rondelli,Rondelli,rondelli.alessia@gmail.com,3494218534,05.12.2025,07.12.2025,2,2,"5,11",Fenice,Halbpension,it,Mobile (393 x 586 px),frau,Italy,Yes,2025-09-22T12:52:22+02:00
Alessio,Castillenti,alessio.castillenti@gmail.com,+393396739858,26.12.2025,30.12.2025,4,0,,Lavendula,Übernachtung mit Frühstück,it,Mobile (375 x 748 px),herr,Italy,Yes,2025-09-27T20:38:08+02:00
Debby,Schiavon,deborahschiavon82@gmail.com,3382915851,03.01.2026,06.01.2026,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 752 px),--,Italy,Yes,2025-09-27T17:19:32+02:00
Annalisa,AMADIO,Annalisa76.amadio@gmail.com,,01.01.2026,04.01.2026,3,1,14,Fenice,Übernachtung,it,Mobile (411 x 784 px),frau,Italy,Yes,2025-09-27T14:09:19+02:00
Arnaldo Pietro,De Brito,arnaldopietrodebrito@libero.it,3408629862,27.07.2025,03.08.2025,2,1,10,Fenice,Halbpension,it,Mobile (392 x 739 px),herr,Italy,Yes,2025-06-20T08:52:11+02:00
Raffaele,Rondoni,Raffaelerondoni@gmail.com,3316005133,10.08.2025,17.08.2025,3,1,15,"Peonia,Lavendula,Fenice,Bellis",Halbpension,it,Mobile (411 x 769 px),herr,--,Yes,2025-05-17T17:17:45+02:00
Chiara,Brocani,brocanichiara@gmail.com,3284504689,16.07.2025,20.07.2025,2,1,2,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (384 x 657 px),frau,Italy,Yes,2025-05-17T15:20:05+02:00
Loretta,Alfei,loretta.alfei@gmail.com,3397668603,20.08.2025,29.08.2025,2,0,,Lavendula,Übernachtung,it,Mobile (360 x 674 px),frau,Italy,Yes,2025-05-17T15:17:16+02:00
Vittoriano,Gimmarrusti,gvittoriano@yahoo.com,3928287585,19.07.2025,25.07.2025,2,2,"9,15",Lavendula,Halbpension,it,Mobile (360 x 664 px),herr,Italy,Yes,2025-05-17T11:43:23+02:00
fabio,Martino,fabiomartino71@gmail.com,3343903454,09.08.2025,16.08.2025,3,1,14,"Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (432 x 820 px),herr,Italy,Yes,2025-05-17T09:03:29+02:00
Michela,Pincin,michela.pincin@gmail.com,3404058587,14.08.2025,18.08.2025,2,0,,Bellis,Halbpension,it,Mobile (360 x 665 px),frau,Italy,Yes,2025-08-05T11:01:43+02:00
Maria Rita,Barbone,barbonemariarita@gmail.com,3209066437,18.08.2025,23.08.2025,2,1,11,Lavendula,Halbpension,it,Mobile (392 x 660 px),frau,--,Yes,2025-08-05T09:09:09+02:00
Antonio,Giappichini,Giappichini.antonio@gmail.com,3491796586,21.08.2025,24.08.2025,2,2,"5,9","Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (384 x 702 px),herr,Italy,Yes,2025-08-05T08:05:01+02:00
Margherita,Cameli,gherimi@gmail.com,3396855735,04.01.2026,06.01.2026,2,1,6,Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 667 px),frau,Italy,Yes,2025-08-05T07:02:34+02:00
Barbara,Gherri,Barbara.gherri@gmail.com,,11.08.2025,18.08.2025,2,2,"6,9","Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (390 x 662 px),frau,Italy,Yes,2025-08-04T22:00:11+02:00
Alessia,Maggi,alemaggi18@gmail.com,3451579932,19.08.2025,22.08.2025,2,1,17,,Halbpension,it,Mobile (360 x 656 px),frau,Italy,Yes,2025-08-04T19:13:42+02:00
Riccardo,Mazzola,mazzori@petalmail.com,3479444899,20.08.2025,27.08.2025,3,0,,Fenice,Übernachtung,it,Mobile (360 x 569 px),herr,Italy,Yes,2025-08-04T18:32:55+02:00
Gian Luca,Cirimbelli,Gianluca.cirimbelli@gmail.com,3490892519,18.08.2025,22.08.2025,2,1,7,Bellis,Halbpension,it,Mobile (390 x 662 px),herr,Italy,Yes,2025-08-04T15:48:38+02:00
raffaele silipo,Silipo,avvsilipo.raffaele@gmail.com,3711714863,08.08.2025,18.08.2025,4,0,,"Peonia,Fenice",Übernachtung,it,Mobile (320 x 569 px),herr,Italy,Yes,2025-08-04T11:55:13+02:00
Maryna,Kulchak,marenochka3@gmail.com,3715622400,15.08.2025,17.08.2025,3,2,"6,12",,Übernachtung,it,Mobile (392 x 736 px),frau,Italy,Yes,2025-08-04T11:43:50+02:00
Livia,Villani,livi.villani@tiscali.it,,09.08.2025,13.08.2025,2,2,"4,9","Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (393 x 673 px),frau,--,Yes,2025-08-04T09:19:49+02:00
Robero,Stoissich,Stoissich@alice.it,3664226761,11.08.2025,15.08.2025,4,0,,Lavendula,Halbpension,it,Mobile (430 x 723 px),herr,Italy,Yes,2025-07-27T20:36:08+02:00
caterina,Holmberg,Cathyholmberg@hotmail.com,3472447554,29.08.2025,31.08.2025,4,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (390 x 777 px),frau,Italy,Yes,2025-07-27T17:53:27+02:00
Barbara,Fortunato,barbarafortunato8@gmail.com,+393332442130,27.08.2025,31.08.2025,4,0,,,Übernachtung,it,Mobile (390 x 677 px),frau,Italy,Yes,2025-07-27T16:15:22+02:00
Luciano,Caldana,caldanaluciano24@gmail.com,3898159881,18.08.2025,23.08.2025,2,0,,"Forsythia,Bellis",Übernachtung mit Frühstück,it,Mobile (369 x 724 px),herr,Italy,Yes,2025-07-27T13:49:16+02:00
Laura,Cosentino,Lpsanvittorio@gmail.com,389 872 6900,31.08.2025,05.09.2025,2,2,"9,12",,Halbpension,it,Mobile (430 x 731 px),frau,Italy,Yes,2025-07-27T13:19:28+02:00
Davide,Baglioni,davidesan1978@gmail.com,3335075425,17.08.2025,20.08.2025,2,2,"11,17",,Übernachtung mit Frühstück,it,Mobile (411 x 776 px),herr,Italy,Yes,2025-07-27T10:02:04+02:00
Stefania,Ballerano,Stefania.ballerano@gmail.com,,24.08.2025,31.08.2025,2,1,17,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (411 x 784 px),frau,--,Yes,2025-07-27T08:27:08+02:00
Fabrizio,Passalacqua,passalacquafabrizio71@gmail.com,336711379,23.08.2025,30.08.2025,4,0,,Fenice,Halbpension,it,Mobile (366 x 687 px),--,Italy,Yes,2025-07-26T23:51:14+02:00
Cinzia,Mandreoli,domegeg@gmail.com,340 392 5856,16.08.2025,20.08.2025,2,2,"5,10",Peonia,Übernachtung mit Frühstück,it,Mobile (339 x 620 px),herr,--,Yes,2025-07-26T21:15:29+02:00
Domenico,De Santis,2d.desantis@gmail.com,3316655319,09.08.2025,14.08.2025,2,0,,Bellis,Übernachtung,it,Mobile (360 x 635 px),herr,--,Yes,2025-07-26T19:21:12+02:00
Monica,Gemma,gemmamonica19@gmail.com,3383399114,28.08.2025,31.08.2025,2,1,15,,Übernachtung,it,Mobile (392 x 724 px),frau,Italy,Yes,2025-07-26T13:25:09+02:00
Di Lembo,Lina,linadilembo@gmail.com,3205742436,17.08.2025,23.08.2025,2,1,1,"Loft,Forsythia",Halbpension,it,Mobile (360 x 664 px),frau,Italy,Yes,2025-07-26T10:41:00+02:00
Simona,Taglieri,simona.taglieri@gmail.com,3476933052,05.08.2025,09.08.2025,2,0,,Peonia,Übernachtung,it,Mobile (360 x 672 px),frau,Italy,Yes,2025-07-26T08:32:37+02:00
Marica,Posa,posamarica@gmail.com,3293716913,30.07.2025,04.08.2025,2,2,"9,12",,Halbpension,it,Mobile (360 x 586 px),frau,--,Yes,2025-07-26T06:34:31+02:00
Clara,Bernardelli,clara.bernardelli@gmail.com,,31.12.2025,03.01.2026,6,5,"2,2,5,6,8",,Übernachtung,it,Mobile (392 x 743 px),--,Italy,Yes,2025-09-14T20:56:35+02:00
Monica,Rondelli,mrondelli@hotmail.it,3923454149,02.04.2026,05.04.2026,3,0,,,Halbpension,it,Mobile (428 x 739 px),frau,--,Yes,2025-09-14T16:54:23+02:00
Davide,Bonello,davide_bonello@libero.it,+393294139937,17.01.2026,24.01.2026,2,1,3,Peonia,Übernachtung,it,Mobile (360 x 667 px),herr,Italy,Yes,2025-09-14T16:06:29+02:00
Giuditta,Generoso,giuditta84@hotmail.it,340 978 7451,02.03.2026,09.03.2026,2,2,"3,5",Lavendula,Halbpension,it,Mobile (406 x 774 px),frau,--,Yes,2025-09-14T15:54:16+02:00
Natascia,Cantoni,natascia.cantoni@gmail.com,3393850628,28.12.2025,01.01.2026,2,0,,"Lavendula,Forsythia",Übernachtung mit Frühstück,it,Mobile (360 x 655 px),frau,Italy,Yes,2025-09-14T14:14:42+02:00
Claudio,Butti,Claudio_1971mi@yahoo.it,3470578207,31.12.2025,05.01.2026,2,0,,"Loft,Lavendula,Forsythia,Bellis",Halbpension,it,undefined,herr,Italy,Yes,2025-10-04T20:45:04+02:00
Nicola,Maradei,nicolamaradei@libero.it,3392128745,19.12.2025,23.12.2025,1,2,"11,14",,Halbpension,it,Mobile (384 x 700 px),herr,Italy,Yes,2025-10-04T19:34:01+02:00
Romina,Di Maio,rominadimaio@mail.com,3396834910,30.12.2025,03.01.2026,4,0,,Fenice,Übernachtung mit Frühstück,it,Mobile (375 x 739 px),frau,Italy,Yes,2025-10-01T12:21:14+02:00
Letizia,Berardi,berardi.letizia@gmail.com,,27.12.2025,03.01.2026,2,0,,,Halbpension,it,Mobile (384 x 604 px),frau,--,Yes,2025-10-01T11:13:43+02:00
Chiara,Petix,Chiarapetix82@gmail.com,3270546824,31.12.2025,05.01.2026,2,1,6,,Übernachtung mit Frühstück,it,Mobile (375 x 627 px),frau,--,Yes,2025-10-01T06:23:00+02:00
Rosetta,Merenda,tempiovenere@email.it,3202244008,15.08.2026,29.08.2026,3,0,,Lavendula,Halbpension,it,Mobile (430 x 850 px),frau,--,Yes,2025-09-30T22:19:45+02:00
Simone,Passaro,s.passaro93@gmail.com,,03.10.2025,05.10.2025,2,0,,"Loft,Forsythia,Bellis",Übernachtung mit Frühstück,it,Desktop (1114 x 670 px),herr,Italy,Yes,2025-09-30T17:20:41+02:00
Valter,Scarpa,valterscarpa@libero.it,3384056782,29.12.2025,03.01.2026,2,2,"7,12",Lavendula,Halbpension,it,Mobile (392 x 728 px),herr,Italy,Yes,2025-09-30T15:02:50+02:00
Vincenza,Foschillo,enzafoschillo@gmail.com,3336333320,27.12.2025,03.01.2026,2,1,6,Lavendula,Übernachtung mit Frühstück,it,Mobile (320 x 587 px),frau,Italy,Yes,2025-09-30T12:25:45+02:00
Monica,Montanari,monicamon2308@gmail.com,3396010803,16.08.2025,23.08.2025,2,0,,Forsythia,Halbpension,it,Mobile (339 x 628 px),frau,Italy,Yes,2025-06-04T14:14:57+02:00
andrea,crisafuli,andreacrisafuli46@hotmial.com,,21.06.2025,23.06.2025,2,2,"7,10","Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Desktop (1265 x 639 px),herr,--,Yes,2025-06-04T12:30:16+02:00
Conny,Reinhardt,conny.1999@gmx.net,,30.08.2025,06.09.2025,2,1,11,"Peonia,Lavendula,Fenice,Forsythia",Übernachtung,de,Desktop (1440 x 797 px),frau,Germany,Yes,2025-08-27T21:29:39+02:00
Federico,Lucarini,federicolucarini82@gmail.com,,16.07.2025,23.07.2025,2,2,"3,5",,Übernachtung,it,Mobile (393 x 773 px),--,--,Yes,2025-05-20T00:12:55+02:00
ombretta,benatti,ombrettabenatti74@gmail.com,3496723430,09.08.2025,20.08.2025,3,1,15,Peonia,Übernachtung,it,Mobile (392 x 739 px),frau,Italy,Yes,2025-05-20T00:01:25+02:00
Pierluigi,Giuliodori,Pierluigigiuliodori@gmail.com,3393159091,18.08.2025,21.08.2025,2,1,16,"Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (384 x 704 px),herr,Italy,Yes,2025-07-14T13:18:01+02:00
Rino,Festugato,rinoegrazia@alice.it,3393629894,10.08.2025,17.08.2025,2,0,,Bellis,Halbpension,it,Mobile (320 x 583 px),herr,Italy,Yes,2025-07-14T12:37:41+02:00
PATRIZIA,Solombrino,pattysolom@gmail.com,3926325794,13.08.2025,17.08.2025,2,0,,Forsythia,Übernachtung,it,Mobile (347 x 638 px),frau,Italy,Yes,2025-07-14T11:36:15+02:00
Eugenia,Malusa,Eugenia.malusa@gmail.com,,10.08.2025,20.08.2025,4,0,,,Halbpension,en,Mobile (390 x 662 px),frau,--,Yes,2025-05-23T09:02:51+02:00
Alessandro,Passador,passador_ale@tiscali.it,,18.08.2025,23.08.2025,2,1,17,,Halbpension,it,Mobile (360 x 414 px),herr,--,Yes,2025-08-03T20:38:55+02:00
Emanuela,Della porta,maolina80@gmail.com,3277574653,16.08.2025,23.08.2025,2,1,10,,Übernachtung mit Frühstück,it,Mobile (360 x 373 px),frau,--,Yes,2025-08-03T17:45:10+02:00
Elena,Fabbiani,elenafabbianii@gmail.com,,23.08.2025,31.08.2025,2,0,,"Loft,Lavendula,Forsythia,Bellis",Halbpension,it,Mobile (375 x 741 px),frau,--,Yes,2025-08-03T17:38:17+02:00
massimo,Granocchia,massimo.granocchia@gmail.com,+393920236584,21.08.2025,24.08.2025,1,3,"7,9,13",Fenice,Halbpension,it,Mobile (440 x 655 px),herr,Italy,Yes,2025-08-03T16:17:22+02:00
Antonella,Convertino,convertino.antonella@gmail.com,3290762812,01.09.2025,07.09.2025,2,1,8,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (392 x 662 px),frau,Italy,Yes,2025-08-03T14:18:43+02:00
Candido,Caserta,caserta.candido@libero.it,3494695112,09.08.2025,13.08.2025,2,1,3,Bellis,Halbpension,it,Mobile (392 x 739 px),herr,Italy,Yes,2025-08-03T12:59:07+02:00
Candido,Caserta,caserta.candido@libero.it,3494695112,09.08.2025,13.08.2025,2,1,3,Forsythia,Übernachtung mit Frühstück,it,Mobile (392 x 739 px),herr,Italy,Yes,2025-08-03T12:57:40+02:00
Letizia,De sanctis,Letizia.desanctis74@gmail.com,+393491328279,10.08.2025,17.08.2025,2,0,,Bellis,Übernachtung,it,Mobile (393 x 658 px),frau,Italy,Yes,2025-08-03T12:21:48+02:00
daniela,cavallaro,danielacavallaro74@gmail.com,+393393244936,05.12.2025,09.12.2025,3,0,,Peonia,Übernachtung,it,Mobile (360 x 665 px),frau,Italy,Yes,2025-08-03T12:19:00+02:00
Ettore,Rapezzi,ettorefederica@libero.it,,19.08.2025,21.08.2025,4,0,,,Übernachtung mit Frühstück,it,Mobile (360 x 672 px),herr,--,Yes,2025-08-03T11:48:24+02:00
Roberto,Zito,robertozitorz@gmail.com,+39 333 194 9312,18.08.2025,24.08.2025,4,0,,"Lavendula,Forsythia",Halbpension,it,Mobile (360 x 656 px),herr,Italy,Yes,2025-08-03T10:35:58+02:00
Negoita Nicoleta,Nicoleta,Negoitanicol85@gmail.com,+393457653842,15.08.2025,17.08.2025,4,0,,Lavendula,Halbpension,it,Mobile (390 x 580 px),frau,Italy,Yes,2025-08-03T07:24:12+02:00
Carmine,Cipro,carminecipro68@gmail.com,3920200041,17.08.2025,24.08.2025,4,0,,"Peonia,Lavendula",Halbpension,it,Mobile (393 x 651 px),herr,Italy,Yes,2025-08-02T21:28:52+02:00
Gabriele,Catanzaro,Gabricat81@gmail.com,,30.12.2025,06.01.2026,2,2,"6,9",,Halbpension,it,Mobile (360 x 645 px),herr,--,Yes,2025-08-02T17:09:05+02:00
Valentina,Nogara,evita89@alice.it,,11.08.2025,16.08.2025,2,1,4,,Halbpension,it,Mobile (392 x 656 px),frau,--,Yes,2025-08-02T14:22:24+02:00
Monica,Gemma,gemmamonica19@gmail.com,3383399114,28.08.2025,31.08.2025,2,1,15,Fenice,Übernachtung,it,Mobile (392 x 724 px),--,--,Yes,2025-08-02T12:42:54+02:00
Simona,Taglieri,simona.taglieri@gmail.com,3476933052,11.08.2025,14.08.2025,2,0,,"Lavendula,Fenice,Forsythia,Bellis",Übernachtung mit Frühstück,it,Mobile (360 x 672 px),frau,Italy,Yes,2025-08-02T09:40:18+02:00
Marica Bemer,Bemer,Marica.bemer@gmail.com,+39339123904,10.08.2025,17.08.2025,2,2,"13,15","Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (411 x 786 px),frau,--,Yes,2025-08-02T09:21:58+02:00
Claudio,Langianni,Claudio.langianni@alice.it,3346161792,15.08.2025,22.08.2025,2,1,15,Fenice,Halbpension,it,Mobile (320 x 620 px),herr,Italy,Yes,2025-08-01T23:43:10+02:00
Denise,Sartori,Tresjolie.denise@gmail.com,,09.08.2025,16.08.2025,2,2,"9,12",,Übernachtung,it,Mobile (390 x 662 px),--,--,Yes,2025-08-01T22:43:46+02:00
Roberta Stagni,STAGNI,robertastagni@yahoo.it,3404054316,17.07.2026,24.07.2026,2,0,,Forsythia,Übernachtung,it,Mobile (375 x 705 px),frau,Italy,Yes,2025-08-01T19:04:01+02:00
Vittoria,Carolo,Vittoria9185@libero.it,+393280836615,22.08.2025,24.08.2025,2,2,"3,9","Lavendula,Fenice",Halbpension,it,Mobile (338 x 604 px),frau,Italy,Yes,2025-08-01T15:10:53+02:00
Gabriele,Nardini,nardini.gabriele03@gmail.com,3468797167,25.08.2025,31.08.2025,2,1,1,"Fenice,Forsythia,Bellis",Halbpension,it,Mobile (384 x 627 px),herr,Italy,Yes,2025-08-01T12:05:02+02:00
Patrick,Bert,Patrickbert80@gmail.com,3491865149,18.08.2025,25.08.2025,2,1,12,,Halbpension,it,Mobile (360 x 631 px),herr,--,Yes,2025-08-01T06:55:04+02:00
Francesca Giovanna,Rapetta,fratore@gmail.com,+393343245719,22.08.2025,25.08.2025,3,1,13,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 657 px),frau,Italy,Yes,2025-07-31T22:30:42+02:00
paolo,rossignoli,rrpapl1977@gmail.com,3495009725,14.08.2025,17.08.2025,6,1,11,,Übernachtung mit Frühstück,it,Mobile (392 x 615 px),herr,Italy,Yes,2025-07-31T16:33:06+02:00
Silvia,Baldassari,baldassarisilvia134@gmail.com,+393274336780,04.08.2025,11.08.2025,2,0,,Forsythia,Übernachtung,it,Mobile (390 x 677 px),frau,Italy,Yes,2025-07-31T16:16:39+02:00
Angela Maria,Barbieri,angelabarbieriit@yahoo.it,339 853 0877,09.08.2025,16.08.2025,2,2,"5,7","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (411 x 749 px),frau,Italy,Yes,2025-07-31T15:22:42+02:00
Gabriele,Nardini,nardini.gabriele03@gmail.com,+393468797167,25.08.2025,31.08.2025,2,1,1,"Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (384 x 709 px),herr,Italy,Yes,2025-07-31T10:30:05+02:00
Laura,Berluti,Laura_berluti@yahoo.com,,16.08.2025,20.08.2025,2,1,5,"Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung mit Frühstück,it,Mobile (384 x 704 px),frau,--,Yes,2025-07-31T08:57:35+02:00
Tanja,Lerro,Tanja.lerro@gmail.com,3471916838,30.12.2025,04.01.2026,2,2,"2,11",Fenice,Halbpension,it,Mobile (390 x 677 px),frau,Italy,Yes,2025-09-04T14:03:15+02:00
Maria Rosaria,Lippi,Mariarosarialippi@yahoo.it,,16.02.2026,23.02.2026,2,0,,Loft,Halbpension,it,Mobile (360 x 657 px),frau,Italy,Yes,2025-10-19T22:04:26+02:00
Eno,Vebiu,Enovebiu11@outlook.com,3457232292,24.12.2025,29.12.2025,2,3,"2,7,16","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 733 px),herr,Italy,Yes,2025-10-19T18:57:03+02:00
Federica,Lazzaro,federica88lazzaro@gmail.com,3334590520,01.01.2026,04.01.2026,2,2,"0,3","Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (393 x 641 px),frau,Italy,Yes,2025-10-19T16:25:34+02:00
Karl,Traunspurger,karltraunspurger@gmail.com,015115591527,16.05.2026,23.05.2026,1,0,,Bellis,Übernachtung,de,Mobile (384 x 701 px),--,Germany,Yes,2025-10-29T17:42:53+01:00
P,Barni,patrizia_barni_91@libero.it,,29.09.2025,03.10.2025,2,2,"0,4","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (375 x 698 px),frau,--,Yes,2025-08-16T21:07:39+02:00
Ernesto,Annarumma,Ernesto.rosso@outlook.it,,27.12.2025,03.01.2026,2,2,"5,11",Fenice,Halbpension,it,Mobile (428 x 759 px),herr,--,Yes,2025-08-16T17:08:19+02:00
Fabio,Pareschi,fabiopareschi69@gmail.com,,20.08.2025,23.08.2025,3,1,12,Peonia,Halbpension,it,Mobile (392 x 642 px),--,--,Yes,2025-08-16T11:54:48+02:00
Isabella,Neri,isaneri@tiscali.it,,16.08.2025,24.08.2025,2,0,,"Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (390 x 669 px),frau,--,Yes,2025-05-20T22:40:21+02:00
Chiara,Iorio,chiara24475@gmail.com,3397362329,11.08.2025,18.08.2025,2,0,,"Loft,Forsythia",Halbpension,it,Mobile (384 x 702 px),frau,--,Yes,2025-05-20T16:22:13+02:00
Ramona,Gobetti,ramo77gob@tiscali.it,,27.12.2025,03.01.2026,5,1,1,Lavendula,Halbpension,it,Mobile (390 x 677 px),frau,--,Yes,2025-09-11T19:50:27+02:00
Mattia,Simonetto,m.simonetto@avvocatosimonetto.com,3453066044,30.12.2025,04.01.2026,2,2,"3,6","Peonia,Lavendula",Übernachtung,it,Desktop (1854 x 933 px),herr,--,Yes,2025-09-11T16:06:20+02:00
Alice,Bracci,alicebracci80@gmail.com,,20.12.2025,24.12.2025,2,3,"12,14,17",,Übernachtung,it,Mobile (384 x 700 px),frau,Italy,Yes,2025-09-11T08:47:33+02:00
Daniela Tonini,Tonini,Shakihavana@gmail.com,3396802008,01.01.2026,05.01.2026,2,2,"5,7",Lavendula,Übernachtung,it,Mobile (360 x 677 px),--,--,Yes,2025-10-07T20:49:22+02:00
Daniela,Arhip,gubilitvera@gmail.com,+393887268003,24.12.2025,27.12.2025,3,3,"8,9,15","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 707 px),frau,--,Yes,2025-10-07T19:54:01+02:00
Veronica Marchetti,Marchetti,Veronicamarchetti1977@gmail.com,3299476876,11.01.2026,17.01.2026,2,1,17,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (320 x 588 px),frau,Italy,Yes,2025-10-07T15:37:31+02:00
Maria Grazia,Ferri,marygten6@hotmail.com,,28.12.2025,04.01.2026,4,4,"6,6,11,11",,Übernachtung mit Frühstück,it,Mobile (430 x 743 px),--,Italy,Yes,2025-10-07T13:45:21+02:00
silvia,andreotti,silvia.andreotti@hotmail.it,3286552398,04.08.2025,13.08.2025,2,0,,"Loft,Forsythia",Halbpension,it,Desktop (1521 x 695 px),frau,--,Yes,2025-07-09T15:44:22+02:00
Mauro,Zecca,zeccam@yahoo.it,3483600062,06.09.2025,13.09.2025,2,0,,Bellis,Halbpension,it,Mobile (411 x 762 px),herr,Italy,Yes,2025-07-09T13:37:18+02:00
Simona,Migliari,migliari.simo@gmail.com,+393391399107,27.07.2025,06.08.2025,2,2,"5,7",,Halbpension,it,Mobile (411 x 765 px),frau,Italy,Yes,2025-07-09T13:20:37+02:00
Donatella,Ludovico,Donaludovico75@gmail.com,3477059300,27.12.2025,02.01.2026,2,2,"16,18",Fenice,Übernachtung,it,Mobile (360 x 654 px),frau,Italy,Yes,2025-07-09T12:56:04+02:00
Gian Carlo,Tamburini,tamburinigc@gmail.com,3294370531,26.07.2025,31.07.2025,2,1,13,"Peonia,Fenice",Übernachtung,it,Mobile (432 x 818 px),herr,--,Yes,2025-07-09T12:45:19+02:00
Elisa,Zucchini,elisazucchini79@gmail.com,347 957 4956,04.08.2025,08.08.2025,2,1,16,"Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (366 x 683 px),frau,Italy,Yes,2025-07-09T07:45:06+02:00
Mauro,Baccini,Baccini86@gmail.com,3483391097,26.08.2025,30.08.2025,2,2,"8,12","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (390 x 578 px),herr,--,Yes,2025-07-09T07:19:39+02:00
claudio,Boglioli,Claudioboglioli88@hotmail.it,3397104302,21.07.2025,25.07.2025,2,1,4,,Halbpension,it,Mobile (360 x 656 px),herr,Italy,Yes,2025-07-09T07:03:56+02:00
Angelica,Gramaccioni,agramaccioni@gmail.com,329/2011137,09.08.2025,14.08.2025,2,2,"6,9",Lavendula,Übernachtung mit Frühstück,it,Mobile (414 x 713 px),frau,Italy,Yes,2025-07-08T20:08:07+02:00
Luca,Acunzo,lacunzo@yahoo.it,,10.08.2025,24.08.2025,2,2,"11,15","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 651 px),herr,Italy,Yes,2025-07-08T19:49:10+02:00
Massimiliano,Ottolini,maxim8@inwind.it,3407192098,03.01.2026,06.01.2026,3,0,,"Peonia,Lavendula,Fenice",Übernachtung,it,Desktop (1327 x 642 px),herr,Italy,Yes,2025-11-16T22:34:04+01:00
Giuseppe,Giampietro,g.giampietro1@yahoo.it,3475927917,29.12.2025,03.01.2026,3,1,12,Peonia,Übernachtung,it,Mobile (393 x 651 px),herr,Italy,Yes,2025-11-16T21:46:06+01:00
Giovanna De palma,De palma,giovannadepalma@outlook.it,3201961554,02.01.2026,06.01.2026,2,2,"2,9",Peonia,Halbpension,it,Mobile (392 x 739 px),frau,Italy,Yes,2025-11-16T20:53:22+01:00
Ilaria,Battaglino,ilab56789@gmail.com,3394953825,29.12.2025,01.01.2026,3,0,,,Übernachtung mit Frühstück,it,Mobile (411 x 788 px),herr,--,Yes,2025-11-16T17:51:08+01:00
Pasquale,Donnarumma,pasqualedonnarum@gmail.com,333 135 6484,29.11.2025,30.11.2025,3,1,16,"Peonia,Lavendula,Fenice",Übernachtung,it,Desktop (800 x 1208 px),herr,--,Yes,2025-11-16T15:15:47+01:00
Edoardo,Forcella,edoardo.forcella@alice.it,,29.12.2025,04.01.2026,2,0,,"Loft,Peonia,Lavendula,Forsythia,Bellis",Halbpension,it,Mobile (375 x 495 px),herr,Italy,Yes,2025-11-16T09:37:35+01:00
Nicola Carfagna,Carfagna,Carfagna.nicola@libero.it,3383454008,28.12.2025,02.01.2026,2,3,"1,4,11",Peonia,Halbpension,it,Mobile (384 x 703 px),herr,Italy,Yes,2025-11-16T08:49:02+01:00
Viorica,Homenco,homencoviorica@gmail.com,+393245828180,29.12.2025,01.01.2026,4,1,11,Peonia,Halbpension,it,Mobile (411 x 780 px),frau,Italy,Yes,2025-11-16T07:35:33+01:00
Serena,Pranzini,serena.pranzini@alice.it,3382379905,17.08.2025,21.08.2025,2,1,11,,Halbpension,it,Mobile (428 x 736 px),frau,--,Yes,2025-07-05T00:04:54+02:00
Emanuela,Birini,emabirini@gmail.com,,09.08.2025,16.08.2025,4,0,,Peonia,Übernachtung,it,Mobile (392 x 743 px),--,Italy,Yes,2025-07-04T21:52:47+02:00
cinzia,caselli,cinzia.caselli@giustizia.it,3474287224,22.08.2025,26.08.2025,4,0,,Peonia,Halbpension,it,Mobile (360 x 672 px),frau,Italy,Yes,2025-07-04T18:34:30+02:00
Nicoletta,Mattiussi,nicoletta.mattiussi@gmail.com,3496183035,13.07.2025,19.07.2025,2,2,"0,2",Peonia,Halbpension,it,Mobile (414 x 820 px),frau,Italy,Yes,2025-06-17T19:40:32+02:00
Debora,Concialdi,deboraconcialdi74@gmail.com,+393478104628,10.07.2025,15.07.2025,2,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung,it,Mobile (320 x 566 px),frau,Italy,Yes,2025-06-17T14:21:07+02:00
Sara,Tartabini,Sara.tartabini1981@gmail.com,338 980 0551,16.08.2025,23.08.2025,3,2,"7,15",Peonia,Übernachtung mit Frühstück,it,Mobile (384 x 722 px),--,--,Yes,2025-06-17T08:25:29+02:00
Roberta,Morandini,Morandiniroberta@gmail.com,,24.08.2025,04.09.2025,3,2,"3,9",Peonia,Übernachtung,it,Mobile (414 x 609 px),frau,Italy,Yes,2025-06-16T22:30:16+02:00
Silvana,Tiberio,silvytiberio@gmail.com,3401468792,18.08.2025,23.08.2025,2,1,17,,Übernachtung,it,Mobile (392 x 743 px),frau,Italy,Yes,2025-06-16T17:09:25+02:00
Salvatore,Giacci,S.guacci@libero.it,3313621612,12.08.2025,18.08.2025,2,1,6,Peonia,Übernachtung mit Frühstück,it,Mobile (390 x 777 px),herr,Italy,Yes,2025-06-16T14:27:26+02:00
Daniela,Maffei,danielamaffei7@gmail.com,337 866 788,06.07.2025,13.07.2025,2,0,,Forsythia,Übernachtung,it,Mobile (384 x 599 px),frau,Italy,Yes,2025-06-16T14:22:33+02:00
Carlo,Alfei,loretta.alfei@gmail.com,3397668703,20.08.2025,29.08.2025,2,0,,Fenice,Übernachtung,it,Mobile (360 x 682 px),herr,Italy,Yes,2025-06-16T13:44:10+02:00
Rebecca,Cattaneo,rebecca_cattaneo@libero.it,,20.06.2026,27.06.2026,2,3,"2,6,9","Peonia,Fenice",Halbpension,it,Mobile (360 x 666 px),--,--,Yes,2025-07-25T18:29:36+02:00
Silvia,Seveso,silviaseveso83@gmail.com,,19.08.2025,22.08.2025,2,2,"1,8",,Halbpension,it,Desktop (1394 x 773 px),--,--,Yes,2025-07-25T14:57:02+02:00
Marco,Spigolon,orsopiteco@gmail.com,,01.09.2025,05.09.2025,2,1,14,,Halbpension,it,Mobile (411 x 797 px),herr,--,Yes,2025-07-25T12:21:14+02:00
Marcela,Pette,Marcelapette@icloud.com,3804650172,26.12.2025,03.01.2026,2,2,"1,5","Peonia,Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (393 x 773 px),frau,Italy,Yes,2025-07-25T09:15:13+02:00
MicaelA,Zampieri,Zampierimicaela@gmail.com,,27.12.2025,03.01.2026,2,1,3,"Lavendula,Fenice,Forsythia,Bellis",Übernachtung,it,undefined,frau,--,Yes,2025-07-24T21:25:15+02:00
Maria Cristina,Belgiovine,Cristinabelgiovine@libero.it,3406089775,26.12.2025,02.01.2026,2,2,"8,10","Peonia,Lavendula,Fenice",Halbpension,it,undefined,frau,--,Yes,2025-07-24T10:19:37+02:00
Sandra,Mazza,sandramazza@hotmail.it,329 403 8481,11.08.2025,16.08.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (393 x 643 px),frau,Italy,Yes,2025-07-23T23:56:50+02:00
Matteo,Sais,M.sais@libero.it,,11.08.2025,16.08.2025,2,0,,,Halbpension,it,Mobile (411 x 721 px),herr,--,Yes,2025-07-23T23:33:30+02:00
Matteo,Sais,M.sais@libero.it,,11.08.2025,16.08.2025,2,0,,,Halbpension,it,Mobile (411 x 721 px),herr,--,Yes,2025-07-23T23:33:30+02:00
Tatiana,Falcinelli,tatianafalcinelli79@gmail.com,3343421695,11.08.2025,16.08.2025,2,1,12,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 737 px),frau,Italy,Yes,2025-07-23T23:15:57+02:00
Davide Curcio,Curcio,Davidecurcio@libero.it,3394833660,02.08.2025,09.08.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (384 x 704 px),herr,Italy,Yes,2025-07-23T22:49:12+02:00
Milena,Miccio,kigio@hotmail.com,3338782859,04.08.2025,10.08.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (384 x 717 px),frau,--,Yes,2025-06-19T19:06:40+02:00
Maria Grazia,Gentile,gentilegrace@yahoo.it,3389338838,17.08.2025,24.08.2025,1,0,,Bellis,Halbpension,it,Mobile (411 x 734 px),frau,Italy,Yes,2025-06-19T18:18:49+02:00
Lucia,Moretti,morettilucia70@gmail.com,,11.08.2025,16.08.2025,2,3,"13,15,15",,Übernachtung mit Frühstück,it,Mobile (360 x 664 px),frau,Italy,Yes,2025-06-19T17:02:08+02:00
Simone,Venturato,venturatosimone@gmail.com,348 440 0858,10.08.2025,17.08.2025,2,0,,Loft,Übernachtung mit Frühstück,it,Mobile (360 x 668 px),herr,Italy,Yes,2025-06-19T09:39:41+02:00
Valeria,Barricelli,Valery06@libero.it,328 44 35671,16.08.2025,23.08.2025,4,4,"7,13,13,15",Lavendula,Übernachtung,it,Mobile (411 x 797 px),frau,Italy,Yes,2025-06-18T22:24:48+02:00
Benedtta,Cappiello,benedetta.cg@gmail.com,,03.08.2025,10.08.2025,2,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung mit Frühstück,it,Desktop (1180 x 713 px),frau,--,Yes,2025-06-18T22:17:23+02:00
Elena,Greco,grecoelena75@gmail.com,3355609794,03.01.2026,10.01.2026,1,2,"13,16",Peonia,Halbpension,it,Mobile (392 x 735 px),frau,Italy,Yes,2025-08-15T17:27:09+02:00
Lucia,Aversano,Lucia.aversano87@gmail.com,,23.08.2025,30.08.2025,2,2,"7,9",Fenice,Halbpension,it,Mobile (360 x 653 px),frau,--,Yes,2025-08-15T15:03:45+02:00
Marcella,Marchi,Marchi.marcella79@gmail.com,3384718165,06.07.2026,12.07.2026,3,1,1,"Lavendula,Fenice",Übernachtung,it,Mobile (375 x 552 px),frau,Italy,Yes,2025-08-15T14:15:43+02:00
Monica Moretti,Moretti,Mony.moretti25@gmail.com,3497776490,09.11.2025,15.11.2025,2,2,"6,10","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (402 x 682 px),frau,--,Yes,2025-10-27T21:56:17+01:00
Micaela,Zampieri,zampierimicaela@gmail.com,,27.12.2025,03.01.2026,2,1,3,"Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (414 x 828 px),frau,--,Yes,2025-08-26T20:47:49+02:00
Elena,Contarato,elena_contarato@hotmail.it,,27.12.2025,03.01.2026,5,1,10,,Halbpension,it,Mobile (390 x 677 px),frau,--,Yes,2025-08-26T19:44:18+02:00
Luigi,De Martino,luigi.demartino1972@libero.it,'+393491091286,30.12.2025,02.01.2026,2,2,"11,14",Peonia,Halbpension,it,Mobile (384 x 733 px),herr,--,Yes,2025-08-26T17:20:30+02:00
Valentina Corradin,Corradib,valentinacorradin@gmail.com,3484783911,30.12.2025,03.01.2026,2,2,"1,7",Lavendula,Halbpension,it,Mobile (375 x 561 px),frau,Italy,Yes,2025-08-26T08:34:26+02:00
Walter,Bartoli,walterbartoli@gmail.com,3406562623,09.07.2026,14.07.2026,2,2,"8,12",Fenice,Halbpension,it,Mobile (384 x 644 px),herr,Italy,Yes,2025-08-25T23:53:22+02:00
Denise Chistolini,Chistolini,Dchistolini6@gmail.com,3318307297,02.03.2026,08.03.2026,2,2,"0,9","Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (411 x 761 px),frau,Italy,Yes,2025-08-25T16:01:59+02:00
Francesca,Sorgato,cesca.85@hotmail.it,,27.12.2025,03.01.2026,2,2,"6,6","Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (390 x 663 px),frau,--,Yes,2025-08-25T15:04:20+02:00
Roberto O,Orsi,orsiroberto37@gmail.com,3333459372,25.08.2025,29.08.2025,5,0,,"Peonia,Bellis",Halbpension,it,Mobile (360 x 667 px),herr,Italy,Yes,2025-08-25T11:29:18+02:00
Teresa,Grillo,teagrillo@rocketmail.com,3348464542,02.08.2025,08.08.2025,2,0,,"Forsythia,Bellis",Halbpension,it,Mobile (393 x 651 px),frau,--,Yes,2025-06-30T08:41:01+02:00
Paolo,Disconzi,paolodisconzi@gmail.com,3477408769,27.08.2025,31.08.2025,3,2,"3,5",,Übernachtung,it,Mobile (360 x 672 px),herr,Italy,Yes,2025-06-30T08:34:52+02:00
Patrizia,Anatriello,patrizia.anatriello.caporale@gmail.com,3922658558,10.08.2025,17.08.2025,2,2,"13,13",,Übernachtung mit Frühstück,it,Mobile (392 x 743 px),frau,Italy,Yes,2025-06-30T05:51:21+02:00
Silvia,Anfos,silvia.anfos@gmail.com,,16.08.2025,23.08.2025,2,2,"0,5","Lavendula,Fenice",Halbpension,it,Mobile (360 x 636 px),--,--,Yes,2025-06-18T09:41:14+02:00
Valentina,Bonadonna,valentina.bnd@gmail.com,392 626 6400,17.08.2025,24.08.2025,2,2,"3,3",,Übernachtung,it,Mobile (392 x 744 px),frau,Italy,Yes,2025-05-19T10:53:46+02:00
Loretta,Alfei,loretta.alfei@gmail.com,3397668703,20.08.2025,29.08.2025,2,0,,Lavendula,Übernachtung,it,Mobile (360 x 674 px),frau,Italy,Yes,2025-05-19T09:22:47+02:00
Gianfranco,Marino,Gianfranco.marino@fiorentini.com,,11.08.2025,16.08.2025,3,2,"17,17",,Übernachtung mit Frühstück,it,Mobile (393 x 665 px),herr,--,Yes,2025-05-19T06:52:28+02:00
Alana,Gallini,alanagallini@gmail.com,,12.08.2025,19.08.2025,3,3,"0,2,4",,Halbpension,en,Mobile (393 x 644 px),--,--,Yes,2025-07-14T04:17:02+02:00
Susi,Bergamini,Susibergamini@gmail.com,347 1034812,10.08.2025,17.08.2025,2,0,,Loft,Halbpension,it,Desktop (800 x 1165 px),frau,Italy,Yes,2025-05-30T22:18:42+02:00
Marco,Barchiesi,m.barchiesi56@gmail.com,3486506303,15.07.2025,20.07.2025,2,0,,Forsythia,Übernachtung mit Frühstück,it,Mobile (338 x 605 px),herr,Italy,Yes,2025-05-30T21:41:15+02:00
Antonella,De Luca,a.deluca@raconsulting.it,335 760 2237,04.08.2025,10.08.2025,3,0,,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (430 x 733 px),frau,Italy,Yes,2025-05-30T14:34:04+02:00
Gaetano,Caiani,Gaetano.caiani@gmail.com,3381934017,04.10.2025,11.10.2025,2,0,,,Halbpension,it,Mobile (384 x 731 px),herr,Italy,Yes,2025-05-30T14:10:19+02:00
c,cook,heart1584@aol.com,+1 4096564686,13.07.2025,20.07.2025,2,0,,Loft,Halbpension,en,Desktop (1257 x 602 px),frau,United States of America,Yes,2025-06-15T23:20:33+02:00
Antonella Urban,Urban,antonellaurban7@gmail.com,338 954 7766,10.08.2025,18.08.2025,2,0,,Forsythia,Übernachtung,it,Mobile (320 x 589 px),frau,Italy,Yes,2025-07-28T13:49:52+02:00
Lina,Di Lembo,linadilembo@gmail.com,3205742436,17.08.2025,23.08.2025,2,1,1,Fenice,Übernachtung,it,Mobile (360 x 664 px),frau,--,Yes,2025-07-28T12:44:59+02:00
Roberta,Ghigi,robertagh@hotmail.it,,27.12.2025,02.01.2026,6,4,"3,6,6,8",Fenice,Halbpension,it,Mobile (360 x 674 px),frau,--,Yes,2025-09-20T14:24:05+02:00
Valentina,Zilli,vale_zilli@hotmail.com,,03.10.2025,06.10.2025,2,1,2,Bellis,Übernachtung mit Frühstück,it,Mobile (390 x 663 px),frau,--,Yes,2025-09-26T22:05:59+02:00
Michela,Paccagnan,pacca1990@gmail.com,,28.12.2025,04.01.2026,2,2,"4,6",Fenice,Halbpension,it,Mobile (360 x 648 px),frau,--,Yes,2025-09-26T20:56:39+02:00
Elena,Battiloro,E.battiloro1@gmail.com,,05.12.2025,08.12.2025,2,3,"0,1,3",Lavendula,Halbpension,it,Mobile (414 x 714 px),frau,Italy,Yes,2025-09-26T17:28:57+02:00
Teresa,Loria,teresa.loria81@libero.it,3425948239,05.12.2025,08.12.2025,2,2,"2,2",Lavendula,Halbpension,it,Mobile (360 x 419 px),frau,Italy,Yes,2025-09-26T15:48:38+02:00
Wolfhard,Cappel,Wolfhard.Cappel@t-online.de,,08.09.2025,17.09.2025,2,0,,Forsythia,Übernachtung mit Frühstück,de,Mobile (428 x 742 px),herr,Germany,Yes,2025-09-04T13:56:59+02:00
Luca,Marseglia,luca@marseglia.it,,03.01.2026,06.01.2026,5,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung,it,Mobile (393 x 658 px),herr,--,Yes,2025-11-01T15:25:27+01:00
Patrizia,Pizza,patripizza@gmail.com,3488747991,29.12.2025,01.01.2026,2,0,,Bellis,Halbpension,it,Mobile (392 x 739 px),frau,--,Yes,2025-11-01T10:26:34+01:00
1 name lastname mail tel anreise abreise erwachsene kinder kind_ages apartments verpflegung sprache device anrede land privacy received_date
2 Martina Contarin martinacontarin.mc@gmail.com 3473907005 30.12.2025 04.01.2026 2 0 Peonia,Lavendula,Fenice,Forsythia Übernachtung it Mobile (393 x 658 px) frau -- Yes 2025-11-04T23:06:31+01:00
3 giulia latini giulialatini@live.it 06.12.2025 08.12.2025 2 0 Halbpension it Desktop (1905 x 945 px) frau -- Yes 2025-10-15T12:50:15+02:00
4 Simona Buompadre Simi1983@hotmail.it 03.01.2026 10.01.2026 2 3 3,6,10 Lavendula Halbpension it Mobile (384 x 700 px) frau -- Yes 2025-10-03T18:40:58+02:00
5 Elke Arnold seppina@gmx.de 015127030369 28.11.2025 01.12.2025 2 0 Peonia Übernachtung mit Frühstück de Mobile (360 x 646 px) frau Germany Yes 2025-11-11T10:40:49+01:00
6 Tania Demetri Tania.demetri@yahoo.it 03.01.2026 06.01.2026 4 1 15 Übernachtung mit Frühstück it Mobile (411 x 779 px) -- -- Yes 2025-11-08T07:25:10+01:00
7 Mario Reita marioreita1985@gmail.com 30.12.2025 03.01.2026 4 4 2,7,10,12 Halbpension it Mobile (390 x 655 px) herr -- Yes 2025-11-07T23:12:27+01:00
8 Gianluca Biondo Gnlcbiondo@gmail.com +393520220616 22.08.2026 29.08.2026 2 3 1,13,14 Halbpension it Mobile (390 x 655 px) herr Italy Yes 2025-11-07T22:55:44+01:00
9 Franca Andreana francesca.andreana@alice.it +393476755045 28.12.2025 04.01.2026 2 1 14 Peonia Halbpension it Mobile (360 x 684 px) frau Italy Yes 2025-10-16T08:19:02+02:00
10 Barbara Baldacci bbaldacci73@gmail.com 3498020461 06.12.2025 08.12.2025 2 1 13 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (360 x 711 px) frau Italy Yes 2025-10-16T21:51:39+02:00
11 Silvia Silenzi silenzi.silvia@virgilio.it 345 703 7302 24.12.2025 29.12.2025 3 1 15 Übernachtung mit Frühstück it Mobile (392 x 684 px) frau Italy Yes 2025-10-10T22:55:06+02:00
12 Silvia Silenzi silenzi.silvia@virgilio.it 345 703 7302 24.12.2025 29.12.2025 3 1 15 Übernachtung mit Frühstück it Mobile (392 x 684 px) frau Italy Yes 2025-10-10T22:55:05+02:00
13 Alessia Orru orrual@gmail.com 10.11.2025 16.11.2025 2 1 11 Lavendula,Fenice Halbpension it Mobile (384 x 678 px) frau Italy Yes 2025-10-10T22:13:00+02:00
14 Clementina bisceglie Bisceglie bisceglieclementina@gmail.com 3204734570 27.12.2025 03.01.2026 2 3 8,14,17 Peonia,Lavendula,Fenice Halbpension it Mobile (428 x 729 px) frau Italy Yes 2025-10-10T18:08:26+02:00
15 Cristina Axinia Cristinaaxinia11a@gmail.com 3473439538 27.12.2025 30.12.2025 2 2 13,17 Peonia Halbpension it Mobile (402 x 682 px) frau Italy Yes 2025-10-28T13:51:28+01:00
16 Gerald Steiner gerald.steiner.gs@googlemail.com 30.05.2026 06.06.2026 2 0 Peonia,Lavendula,Fenice,Forsythia Halbpension de Desktop (1897 x 924 px) herr Germany Yes 2025-10-01T10:22:34+02:00
17 Dennis Sommer dennissommer@gmx.de 17.06.2026 21.06.2026 4 2 3,5 Lavendula,Bellis Übernachtung mit Frühstück de Mobile (375 x 547 px) herr -- Yes 2025-10-24T09:18:05+02:00
18 PAOLA AMBROSETTI paola_ambrosetti@yahoo.it 338 8097755 30.12.2025 01.01.2026 2 0 Forsythia Halbpension it Mobile (430 x 731 px) frau Italy Yes 2025-11-05T14:50:25+01:00
19 Marilena GIAQUINTO marilena.giaquinto73@gmail.com +393381531396 30.12.2025 03.01.2026 10 4 5,8,12,15 Übernachtung mit Frühstück it Mobile (360 x 668 px) frau -- Yes 2025-11-05T13:10:52+01:00
20 Alice Vaggelli Vaggelli Alicevaggelli820@gmail.com 3393723909 31.12.2025 04.01.2026 9 0 Loft,Lavendula,Forsythia,Bellis Übernachtung it Mobile (414 x 639 px) frau Italy Yes 2025-11-04T07:05:31+01:00
21 Giustina Ganci Giustinaganci@libero.it 3381256848 14.02.2026 17.02.2026 2 2 10,13 Fenice Halbpension it Mobile (384 x 697 px) frau Italy Yes 2025-10-08T09:55:03+02:00
22 Katherine OSULLIVAN kdugdaleosullivan@gmail.com 718-909-9008 14.02.2026 18.02.2026 2 2 16,18 Peonia,Lavendula,Fenice Übernachtung en Desktop (1440 x 820 px) frau -- Yes 2025-10-14T14:27:46+02:00
23 Marianna Faraci Faracimarianna27@gmail.com +393275715125 28.12.2025 04.01.2026 2 2 1,6 Fenice Halbpension it Mobile (414 x 706 px) frau Italy Yes 2025-11-11T22:37:43+01:00
24 Maurizio Marino mauryx05@icloud.com +393394697328 23.12.2025 27.12.2025 2 1 13 Peonia,Lavendula,Fenice Halbpension it Mobile (390 x 590 px) herr -- Yes 2025-11-11T13:29:44+01:00
25 Elisa Turri elisaturri76@gmail.com +393881695046 02.01.2026 05.01.2026 2 0 Übernachtung mit Frühstück it Mobile (411 x 793 px) frau -- Yes 2025-11-11T13:16:26+01:00
26 Lidia Ciuraru Ciuraru lidiaanaciuraru@gmail.com 3207242313 24.12.2025 28.12.2025 2 2 3,6 Halbpension it Mobile (360 x 668 px) frau Italy Yes 2025-09-21T16:52:44+02:00
27 Roberta La riccia robertalr89@hotmail.it 3923204310 30.12.2025 02.01.2026 6 5 0,3,5,8,11 Lavendula,Fenice,Forsythia Übernachtung mit Frühstück it Mobile (411 x 757 px) frau -- Yes 2025-09-21T11:38:08+02:00
28 Paola Fianchini Paola.f@hotmail.it 3270272667 28.11.2025 30.11.2025 2 0 Halbpension it Mobile (414 x 728 px) frau -- Yes 2025-11-06T19:56:30+01:00
29 Gayan Madurapperuma Madurapperuma gsgayan@gmail.com 3881033320 27.12.2025 30.12.2025 2 2 8,12 Peonia Halbpension it Mobile (411 x 780 px) herr -- Yes 2025-11-06T12:51:06+01:00
30 Stefania Guidi Guidi morettinamia@yahoo.it 3479573252 20.02.2026 24.02.2026 6 2 4,5 Fenice,Forsythia Halbpension it Mobile (414 x 708 px) frau Italy Yes 2025-10-14T18:02:48+02:00
31 Happy Mia Lhopital Lhopital Hmlhopital@gmail.com 017673564169 15.02.2026 20.02.2026 2 2 14,17 Peonia,Lavendula,Fenice Übernachtung de Mobile (390 x 667 px) frau -- Yes 2025-10-31T22:40:18+01:00
32 Michela Borrelli Michyborrelli@libero.it 22.08.2025 24.08.2025 2 2 2,6 Übernachtung mit Frühstück it Mobile (390 x 606 px) frau -- Yes 2025-08-18T20:45:44+02:00
33 Luisa Göddemeier Luisa.stoeckle@gmx.de 27.12.2025 02.01.2026 2 2 6,8 Peonia,Lavendula,Fenice Übernachtung de Desktop (1080 x 707 px) frau -- Yes 2025-11-18T11:04:07+01:00
34 Fabio panconi Panconi Panconifabio4@gmail.com 3284310119 26.12.2025 01.01.2026 4 4 9,10,12,12 Übernachtung it Mobile (392 x 739 px) herr Italy Yes 2025-09-01T21:57:18+02:00
35 Daniele Simonetti denny84844@libero.it 338 695 9081 31.12.2025 05.01.2026 2 2 5,13 Peonia Übernachtung mit Frühstück it Mobile (360 x 712 px) herr -- Yes 2025-09-17T21:11:26+02:00
36 Loredana Padedda lorypaddy@gmail.com 24.12.2025 01.01.2026 3 0 Peonia Halbpension it Mobile (393 x 770 px) frau Italy Yes 2025-09-17T20:27:18+02:00
37 Adriana Alfieri adrianaalfieri56@gmail.com 331 6516002 30.12.2025 04.01.2026 10 1 2 Loft,Fenice,Forsythia,Bellis Übernachtung mit Frühstück it Mobile (384 x 727 px) frau -- Yes 2025-09-17T11:18:53+02:00
38 Tiziano Conti Tiziconti@virgilio.it 3495250717 27.12.2025 03.01.2026 4 4 10,12,12,16 Übernachtung it Mobile (390 x 677 px) herr -- Yes 2025-09-17T00:45:17+02:00
39 Edoardo Grimaccia liftcar@hotmail.it 3921792572 07.09.2025 14.09.2025 2 0 Loft Halbpension it Mobile (433 x 830 px) herr Italy Yes 2025-08-23T17:38:21+02:00
40 Lara Marcatelli emanuelem83@gmail.com 30.11.2025 07.12.2025 2 2 6,14 Lavendula,Fenice Halbpension it Mobile (392 x 735 px) frau Italy Yes 2025-08-23T12:45:52+02:00
41 Maria Romoli mr.mariaromoli@gmail.com +393283996083 04.07.2026 11.07.2026 2 0 Bellis Übernachtung it Mobile (390 x 677 px) frau Italy Yes 2025-08-23T07:47:27+02:00
42 Christine Kappes Kappes christine_kappes@web.de +491791099892 03.10.2025 11.10.2025 2 0 Loft,Lavendula,Forsythia Übernachtung mit Frühstück de Desktop (1263 x 595 px) frau Germany Yes 2025-09-07T17:23:43+02:00
43 Flavio Tosetto flaviotosetto01@gmail.com 3286381429 01.01.2026 05.01.2026 2 2 5,11 Lavendula Übernachtung it Mobile (430 x 753 px) herr Italy Yes 2025-09-10T12:59:12+02:00
44 Simone Cinti simonec1984@live.it 3347902970 10.01.2026 17.01.2026 2 2 5,7 Halbpension it Mobile (411 x 785 px) herr Italy Yes 2025-09-10T10:14:37+02:00
45 Annunziata Fico Nunziafico09@gmail.com 3937737695 31.10.2025 02.11.2025 2 2 2,5 Peonia Halbpension it Mobile (393 x 770 px) frau Italy Yes 2025-09-10T07:11:19+02:00
46 Adriana Rullo adry.rullo@gmail.com 18.08.2025 24.08.2025 2 2 10,14 Peonia,Lavendula,Fenice Halbpension de Mobile (360 x 667 px) frau -- Yes 2025-06-23T14:55:25+02:00
47 Annamaria Pozzani Pasinifam@virgilio.it 3487353538 15.09.2025 18.09.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (360 x 660 px) frau Italy Yes 2025-08-22T18:05:52+02:00
48 Lakerta Malaj lakertamalaj@yahoo.it +3285909788 21.12.2025 28.12.2025 2 2 6,11 Lavendula Halbpension it Mobile (390 x 652 px) frau Italy Yes 2025-09-03T21:49:52+02:00
49 Luca Bottoni Luca.bottoni06@gmail.com +393389330916 18.07.2025 20.07.2025 2 1 11 Lavendula Halbpension it Mobile (375 x 539 px) herr -- Yes 2025-06-24T20:39:08+02:00
50 Luca Bottoni Luca.bottoni06@gmail.com +393389330916 18.07.2025 20.07.2025 2 1 11 Lavendula Halbpension it Mobile (375 x 539 px) herr -- Yes 2025-06-24T20:39:08+02:00
51 Emiliana Cottignoli emilianacottignoli@yahoo.it 3462495979 12.07.2025 16.07.2025 2 0 Übernachtung mit Frühstück it Mobile (411 x 783 px) frau Italy Yes 2025-06-24T15:26:08+02:00
52 Massimo Morandi mazzinomorandi@gmail.com 3272485641 13.07.2025 16.07.2025 4 0 Lavendula,Fenice Übernachtung it Mobile (338 x 609 px) herr -- Yes 2025-06-23T18:28:24+02:00
53 Marianna Sanna marianna762006@libero.it 28.08.2025 06.09.2025 2 0 Lavendula Übernachtung it Mobile (360 x 664 px) frau Italy Yes 2025-06-23T15:30:49+02:00
54 dumitrita bocanceai bocancea ionterenri@gmail.com 351887634 06.08.2025 10.08.2025 2 0 Forsythia,Bellis Halbpension it Mobile (360 x 602 px) -- -- Yes 2025-07-12T23:51:54+02:00
55 Danila Marenghi marenghidanila84@gmail.com 03.08.2025 10.08.2025 2 1 11 Lavendula,Fenice Übernachtung mit Frühstück it Mobile (411 x 780 px) frau Italy Yes 2025-07-12T23:50:24+02:00
56 Nadia Capurro Capurronadia68@gmail.com 3474614757 23.08.2025 28.08.2025 2 0 Bellis Halbpension it Mobile (360 x 655 px) frau Italy Yes 2025-07-12T15:25:25+02:00
57 Fabio Martino fabiomartino71@gmail.com +393343903454 16.08.2025 23.08.2025 3 1 14 Lavendula Übernachtung mit Frühstück it Mobile (432 x 816 px) herr Italy Yes 2025-07-12T14:52:09+02:00
58 Giuseppe Piovesan piovesang26@gmail.com 3476676922 04.08.2025 11.08.2025 2 0 Forsythia Halbpension it Mobile (384 x 733 px) herr Italy Yes 2025-07-12T14:01:28+02:00
59 Leonardo Intini Intinileo@gmIl.com 3401618984 09.08.2025 20.08.2025 4 0 Übernachtung it Mobile (430 x 853 px) herr Italy Yes 2025-07-12T11:10:06+02:00
60 Camelia GHEARASIM ghearasimcamelia@gmail.com 329 165 6518 01.09.2025 07.09.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (384 x 725 px) frau Italy Yes 2025-07-12T10:49:03+02:00
61 Michele Mainardi Mikimaina@hotmail.it +393355309213 13.08.2025 17.08.2025 2 0 Bellis Halbpension it Mobile (375 x 740 px) herr Italy Yes 2025-07-11T22:59:56+02:00
62 Edo Ciaralli Edocia74@gmail.com 3205781817 19.08.2025 23.08.2025 2 2 13,16 Fenice Halbpension it Mobile (390 x 652 px) herr Italy Yes 2025-07-11T17:07:50+02:00
63 Silvia Pelicioli Silvia.pelicioli@gmail.com 10.08.2025 18.08.2025 2 3 7,12,15 Loft Halbpension it Mobile (411 x 788 px) frau -- Yes 2025-07-11T14:12:14+02:00
64 Imma Carone nannaenea@gmail.com 05.09.2025 12.09.2025 1 0 Bellis Übernachtung it undefined frau Italy Yes 2025-07-11T13:17:06+02:00
65 Matteo Tommasi matteo.tommasi83@gmail.com 3208935492 13.08.2025 20.08.2025 2 1 0 Halbpension it Mobile (360 x 652 px) herr Italy Yes 2025-07-11T12:46:26+02:00
66 Nadia Baldino nadiabaldino80@gmail.com 347844340 18.08.2025 24.08.2025 2 2 14,17 Halbpension it Mobile (360 x 681 px) frau Italy Yes 2025-07-11T06:48:42+02:00
67 Concetta Pierro amministrazione@consulenzapierro.com 3488549935 01.08.2025 04.08.2025 3 0 Fenice Halbpension it Mobile (393 x 548 px) frau Italy Yes 2025-07-10T19:11:00+02:00
68 Laura Gaggioli coccinelle-75@libero.it 14.08.2025 22.08.2025 2 0 Loft,Bellis Halbpension it Mobile (360 x 669 px) frau -- Yes 2025-07-10T18:25:22+02:00
69 Diego Vendramin Vendramindiego70@gmail.com 335 194 2137 10.08.2025 17.08.2025 2 2 11,12 Fenice Halbpension it Mobile (375 x 740 px) herr Italy Yes 2025-07-10T10:27:13+02:00
70 Angela Nonino angy.nonino@gmail.com 15.02.2026 18.02.2026 2 2 9,14 Peonia,Fenice Übernachtung mit Frühstück it Mobile (411 x 759 px) frau Italy Yes 2025-09-19T20:48:56+02:00
71 Daniela Palusci dany_p85@hotmail.it 26.09.2025 29.09.2025 3 2 3,6 Forsythia Übernachtung mit Frühstück it Mobile (360 x 671 px) frau -- Yes 2025-09-19T15:52:06+02:00
72 Davide Bonello davide_bonello@libero.it 24.01.2026 31.01.2026 2 1 3 Peonia Übernachtung mit Frühstück it Mobile (360 x 663 px) herr -- Yes 2025-09-19T12:10:18+02:00
73 Marika Castelletti marikacastelletti@gmail.com 3285782640 22.12.2025 28.12.2025 2 2 5,10 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (360 x 668 px) frau -- Yes 2025-09-19T11:58:33+02:00
74 Alessandra Panacchia alessandra.panacchia@uniroma1.it 26.07.2025 02.08.2025 4 0 Übernachtung it Mobile (360 x 668 px) frau Italy Yes 2025-05-25T22:11:55+02:00
75 laura severini laura.severini@alice.it 3203309929 31.12.2025 03.01.2026 4 2 8,9 Bellis Übernachtung mit Frühstück it Mobile (360 x 609 px) frau Italy Yes 2025-05-25T14:39:27+02:00
76 Gabriele Borri gabriele.borri15@hotmail.com 3392969841 20.07.2025 27.07.2025 2 2 6,11 Fenice Halbpension it Mobile (384 x 725 px) herr Italy Yes 2025-05-25T14:04:22+02:00
77 Marta Novazzi marta.novazzi@gmail.com 06.07.2025 10.07.2025 2 0 Halbpension it Mobile (360 x 704 px) frau Italy Yes 2025-06-22T23:29:07+02:00
78 Gabriella Mury gmbaddy@gmail.com +39 347 149 3998 17.08.2025 24.08.2025 3 0 Peonia Halbpension it Mobile (414 x 824 px) frau Italy Yes 2025-06-22T23:12:02+02:00
79 Francesco Luongo francescoluongo-4176@libero.it 3470531852 22.08.2025 25.08.2025 2 0 Forsythia Halbpension it Mobile (423 x 837 px) herr Italy Yes 2025-06-22T21:45:55+02:00
80 Giuseppina Di Micco media.marilory@yahoo.it 329 123 4406 01.08.2025 25.08.2025 1 0 Bellis Übernachtung it Mobile (392 x 724 px) frau Italy Yes 2025-06-22T21:34:01+02:00
81 Monika Wolf wolf.monika@me.com 1782171156 08.08.2026 15.08.2026 9 4 3,8,8,9 Halbpension de Mobile (428 x 744 px) frau Germany Yes 2025-08-06T13:09:23+02:00
82 cathy cook heart1584@aol.com +1 4096564686 13.07.2025 20.07.2025 2 0 Loft Übernachtung en Desktop (1257 x 602 px) frau United States of America Yes 2025-06-16T14:45:28+02:00
83 Giancarlo Capraro giancarlocapraro8@gmail.com 3247839493 30.08.2025 04.09.2025 2 2 5,8 Peonia Halbpension it Mobile (360 x 364 px) herr Italy Yes 2025-08-17T15:34:55+02:00
84 Davis Fabbi Da.da2003@yahoo.it 3483637094 29.08.2025 31.08.2025 2 1 7 Übernachtung it Mobile (384 x 726 px) herr Italy Yes 2025-08-17T13:37:38+02:00
85 Marilena Ciobanu Ciobanu marilenaciobanu016@gmail.com 3284384077 23.12.2025 28.12.2025 3 0 Lavendula Übernachtung it Mobile (384 x 705 px) frau -- Yes 2025-10-05T17:17:34+02:00
86 Giulia Chiaranda giulia.chiaranda25@gmail.com 21.02.2026 24.02.2026 2 2 4,7 Peonia,Lavendula,Fenice Halbpension it Mobile (393 x 658 px) -- -- Yes 2025-10-05T14:03:14+02:00
87 Cristina Porcu porcucristina38@gmail.com 3338646289 02.12.2025 08.01.2026 3 1 7 Peonia Halbpension it Mobile (375 x 551 px) frau Italy Yes 2025-10-05T09:09:30+02:00
88 Millauer Kerstin kerstinmillauer@gmail.com 14.02.2026 17.02.2026 2 3 8,10,12 Übernachtung mit Frühstück de Mobile (375 x 634 px) -- -- Yes 2025-11-02T09:18:31+01:00
89 Alessandro Cannuni acannuni4@gmail.com 3450633788 02.01.2026 05.01.2026 4 3 6,9,9 Lavendula Halbpension it Mobile (360 x 589 px) herr Italy Yes 2025-10-10T00:00:02+02:00
90 Vittoria sicolo Vittoria.sicolo@icloud.com +393892521295 30.12.2025 03.01.2026 2 0 Forsythia Halbpension it Mobile (393 x 594 px) frau -- Yes 2025-10-09T16:49:27+02:00
91 Alueda Mucaj aluedaMucaj111@gmail.com 3806957164 14.11.2025 16.11.2025 2 3 0,3,5 Übernachtung it Mobile (430 x 853 px) frau Italy Yes 2025-10-09T14:00:10+02:00
92 Stefano Cassol stefanocassol91@gmail.com 3461223837 16.08.2025 23.08.2025 2 1 1 Halbpension it Mobile (354 x 660 px) herr Italy Yes 2025-05-24T15:40:08+02:00
93 Gabriella Margani Gabriella.margani@yahoo.it 3460102509 09.08.2025 16.08.2025 2 1 9 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 616 px) frau Italy Yes 2025-05-24T11:31:44+02:00
94 Luana Di carlo dicarloluana@libero.it 28.06.2025 05.07.2025 2 1 11 Lavendula,Fenice,Forsythia Übernachtung mit Frühstück it Mobile (375 x 626 px) frau -- Yes 2025-05-24T07:02:27+02:00
95 Concetta Salvatore Frantin.tina@icloud.com 349 612 8429 14.07.2025 16.07.2025 2 1 12 Fenice Übernachtung it Mobile (375 x 620 px) frau Italy Yes 2025-05-24T06:19:54+02:00
96 Giorgia Valenti Valenti Valentigiorgia@virgilio.it 340 128 8815 02.01.2026 05.01.2026 1 3 8,16,17 Peonia,Lavendula,Fenice Übernachtung it Mobile (384 x 703 px) -- -- Yes 2025-11-18T13:00:13+01:00
97 Michela Noris NORIS mnoris71@gmail.com +393460111365 29.12.2025 01.01.2026 2 0 Forsythia,Bellis Übernachtung it Mobile (375 x 633 px) frau Italy Yes 2025-11-18T12:22:42+01:00
98 Cristina Axinia Cristinaaxinia11a@gmail.com +393473439538 03.01.2026 06.01.2026 2 2 13,17 Lavendula Halbpension it Mobile (402 x 789 px) frau Italy Yes 2025-11-18T09:56:39+01:00
99 anna lastrucci lastruccianna4@gmail.com 3923827691 02.01.2026 06.01.2026 6 0 Peonia,Forsythia Halbpension it Mobile (320 x 587 px) frau Italy Yes 2025-09-25T15:28:44+02:00
100 Cristian Mariotti cristianmariotti2@gmail.com 3389332607 24.12.2025 28.12.2025 2 2 13,15 Peonia Halbpension it Mobile (423 x 840 px) herr Italy Yes 2025-09-09T14:52:01+02:00
101 silvia Lionello silvia.lionello10@gmail.com 340 395 0522 24.12.2025 30.12.2025 2 1 15 Forsythia Übernachtung it Mobile (360 x 678 px) frau Italy Yes 2025-09-09T06:53:14+02:00
102 Gaetano Gramano Ggramano@gmail.com 3935777775 06.12.2025 08.12.2025 2 2 2,4 Halbpension it Mobile (393 x 576 px) herr -- Yes 2025-09-08T19:33:47+02:00
103 Alessia Carroccia alessiacarroccia@gmail.com 3298046700 27.12.2025 03.01.2026 2 1 8 Lavendula Halbpension it Mobile (430 x 753 px) frau -- Yes 2025-09-08T09:44:10+02:00
104 Domenico Perotti amministrazione@squadracredit.com 3476351869 30.12.2025 05.01.2026 2 1 14 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (411 x 655 px) herr Italy Yes 2025-10-18T23:02:49+02:00
105 daniele dell uomo daniele.delluomo@gmail.com 3475953749 01.01.2026 04.01.2026 2 2 7,11 Halbpension it Desktop (1887 x 924 px) herr -- Yes 2025-10-18T12:45:21+02:00
106 daniele dell uomo daniele.delluomo@gmail.com 3475953749 01.01.2026 04.01.2026 2 2 7,11 Halbpension it Desktop (1887 x 924 px) herr Italy Yes 2025-10-18T12:43:27+02:00
107 Davis Fabbi Da.da2003@yahoo.it 3483637094 29.08.2025 31.08.2025 2 1 7 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 726 px) herr -- Yes 2025-08-07T14:47:37+02:00
108 Rosa Picchi Rosapicchi@tiscali.it 3356482246 16.08.2025 23.08.2025 2 0 Forsythia,Bellis Halbpension it Desktop (785 x 312 px) frau Italy Yes 2025-08-07T09:46:51+02:00
109 david pesaresi david_pesaresi@yahoo.it 3347022863 18.08.2025 22.08.2025 2 3 4,9,11 Übernachtung mit Frühstück it Mobile (411 x 770 px) herr Italy Yes 2025-08-07T08:49:20+02:00
110 Lara Malpezzi laramalpezzi4@gmail.com 3348488560 10.08.2025 16.08.2025 2 0 Loft Halbpension it Mobile (384 x 735 px) frau -- Yes 2025-08-07T03:16:08+02:00
111 Patrizia Tredici tredicipatrizia@gmail.com 24.08.2025 26.08.2025 2 0 Halbpension it Mobile (392 x 739 px) frau -- Yes 2025-08-06T23:19:00+02:00
112 Flori Kuka florikuka86@gmail.com 3801006603 11.08.2025 16.08.2025 2 2 5,15 Peonia Übernachtung mit Frühstück it Mobile (320 x 585 px) herr Italy Yes 2025-08-06T21:19:19+02:00
113 Agnese Carnevali federicomartina73@gmail.com 3471196161 16.08.2025 23.08.2025 2 3 11,14,17 Peonia Halbpension it Mobile (423 x 846 px) frau -- Yes 2025-08-06T12:31:17+02:00
114 LUCA Marcato lucamarcato490@gmail.com +393283469417 08.09.2025 10.09.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (360 x 667 px) herr Italy Yes 2025-08-31T17:49:01+02:00
115 Alessandro Camoletti a.camoletti@gmail.com 3762096182 02.01.2026 06.01.2026 3 0 Fenice Übernachtung it Desktop (1024 x 696 px) herr Italy Yes 2025-08-31T15:43:16+02:00
116 Paolo Mariani Paolo.mariani@casbot.com 3420853374 12.08.2025 21.08.2025 2 0 Peonia Halbpension it Mobile (360 x 627 px) herr Italy Yes 2025-05-21T19:17:43+02:00
117 Daniele Paiano Direzione@idea-vision.it 11.08.2025 24.08.2025 2 0 Forsythia Übernachtung mit Frühstück it Mobile (375 x 546 px) herr Italy Yes 2025-05-21T14:27:52+02:00
118 Enrico Breda Enrico@visibilia.net 27.06.2025 30.06.2025 4 0 Peonia,Lavendula,Fenice Übernachtung it Mobile (440 x 655 px) herr -- Yes 2025-05-21T14:09:42+02:00
119 Marco Predieri Predieri Famigliapredieri@gmail.com 3397810676 05.12.2025 08.12.2025 2 0 Forsythia Übernachtung mit Frühstück it Mobile (360 x 691 px) herr Italy Yes 2025-10-17T21:21:17+02:00
120 Silvia Pistilli silviapistilli@yahoo.it 4384221774 20.07.2025 27.07.2025 3 0 Peonia Halbpension it undefined frau Italy Yes 2025-06-29T17:27:29+02:00
121 Monica Pini moni.pini76@gmail.com 20.08.2025 27.08.2025 2 0 Forsythia Halbpension it Mobile (384 x 700 px) frau -- Yes 2025-06-29T15:21:34+02:00
122 Francesco Martinelli fmartinelli1976@gmail.com 09.08.2025 16.08.2025 2 1 17 Peonia,Lavendula,Fenice,Forsythia Übernachtung it Mobile (360 x 676 px) herr -- Yes 2025-06-29T15:00:16+02:00
123 Federica Ripiccini Ripiccini_federica@hotmail.com 3397429694 09.08.2025 16.08.2025 2 1 12 Halbpension it Mobile (414 x 706 px) frau Italy Yes 2025-06-29T14:45:46+02:00
124 domenico demaria domenicodemaria610@gmail.com 3341305718 10.08.2025 17.08.2025 2 0 Forsythia Halbpension it Desktop (1349 x 615 px) herr Italy Yes 2025-06-29T13:41:30+02:00
125 Angela Ignomeriello Ignomerielloa@gmail.com 3336378567 26.07.2025 31.07.2025 2 0 Loft Übernachtung mit Frühstück it Mobile (320 x 575 px) frau Italy Yes 2025-06-29T07:36:52+02:00
126 Camelia Bogdan Cameliabogdan0@gmail.com 3469494585 05.07.2025 12.07.2025 2 0 Fenice Halbpension it Mobile (360 x 663 px) frau Italy Yes 2025-05-23T17:29:06+02:00
127 Carlo Consani c.consani1@gmail.com 3333015899 16.08.2025 23.08.2025 2 0 Loft Übernachtung mit Frühstück it Mobile (384 x 708 px) herr Italy Yes 2025-05-23T14:42:47+02:00
128 Mirko Angeli mirko2675@gmail.com 3388567415 17.08.2025 24.08.2025 2 0 Forsythia,Bellis Halbpension it Mobile (411 x 790 px) herr Italy Yes 2025-05-23T13:32:24+02:00
129 Katia Masciulli Masciullikatia1977@gmail.com 28.12.2025 04.01.2026 6 2 11,16 Halbpension it Desktop (834 x 1087 px) frau -- Yes 2025-11-02T19:40:50+01:00
130 Elena Onofrei oelena7@gmail.com 06.02.2026 08.02.2026 2 1 8 Loft Übernachtung it Mobile (360 x 653 px) frau Italy Yes 2025-11-02T14:30:20+01:00
131 Luca Asteggiano asteluca82@gmail.com 3395692025 02.01.2026 05.01.2026 2 2 8,12 Lavendula Halbpension it Mobile (360 x 667 px) herr Italy Yes 2025-11-02T13:14:58+01:00
132 Alessia Bignù alex.down.the.rabbit.hole@gmail.com 3516221506 20.12.2025 01.01.2026 2 2 13,17 Übernachtung mit Frühstück it Mobile (411 x 780 px) frau Italy Yes 2025-11-02T13:05:07+01:00
133 maura dagnino Dagnino Mauradagnino@libero.it 3403815344 28.11.2025 30.11.2025 2 2 8,11 Übernachtung it Mobile (320 x 631 px) frau -- Yes 2025-11-02T09:35:38+01:00
134 Robert Nitschke robert.nitschke@gmx.net 017624694617 13.02.2026 17.02.2026 2 2 2,6 Loft,Peonia,Lavendula,Fenice,Forsythia Übernachtung de Mobile (393 x 665 px) herr Germany Yes 2025-06-11T19:49:20+02:00
135 Carloalberto Molina molinacala@libero.it 29.12.2025 03.01.2026 2 2 1,8 Halbpension it Mobile (392 x 739 px) herr Italy Yes 2025-11-14T02:05:10+01:00
136 Paola De Carlo Decarlopaola@gmail.com 27.11.2025 27.12.2025 4 2 7,11 Peonia Halbpension it Mobile (402 x 677 px) frau -- Yes 2025-11-13T14:33:07+01:00
137 Gabriele Dr.Matuschek-Grohmann gabriele@dr-matuschek-grohmann.de 02615791416 01.09.2025 10.09.2025 2 0 Peonia Übernachtung mit Frühstück de Mobile (430 x 739 px) frau Germany Yes 2025-08-01T17:09:11+02:00
138 Erica Biondi Ericabiondi77@gmail.com 349 1560995 11.08.2025 18.08.2025 5 0 Loft,Lavendula Halbpension it Mobile (414 x 608 px) frau Italy Yes 2025-07-13T22:12:43+02:00
139 Giuseppe Piovesan piovesang26@gmail.com 3476676922 03.08.2025 10.08.2025 2 0 Forsythia Halbpension it Mobile (384 x 733 px) herr Italy Yes 2025-07-13T20:02:46+02:00
140 Anna Mandolini anna.mandolini57@gmail.com 3404039103 21.07.2025 27.07.2025 2 0 Forsythia Halbpension it Mobile (360 x 655 px) frau Italy Yes 2025-07-13T19:18:46+02:00
141 Paola Passarin pabli2580@gmail.com 26.12.2025 04.01.2026 2 2 3,8 Lavendula Übernachtung it Mobile (384 x 727 px) frau -- Yes 2025-07-13T17:50:58+02:00
142 Francesco Valente Francescovalente@ymail.com 3204988031 02.08.2025 09.08.2025 2 0 Loft,Forsythia,Bellis Übernachtung mit Frühstück it Mobile (393 x 651 px) herr -- Yes 2025-07-13T15:21:41+02:00
143 dumitrita bocancea terenti ionterenti@gmail.com 351887634 06.08.2025 10.08.2025 2 1 0 Bellis Halbpension it Mobile (360 x 680 px) herr Italy Yes 2025-07-13T13:30:35+02:00
144 Antonio Vannacci Vannacci antonio.vannacci@gmail.com 3394942185 26.07.2025 01.08.2025 3 0 Fenice Halbpension it Mobile (360 x 661 px) herr Italy Yes 2025-06-15T18:57:11+02:00
145 Elisa Lore Elisaaaaa@gmail.com 28.06.2025 03.07.2025 2 3 10,13,16 Halbpension it Mobile (390 x 663 px) frau -- Yes 2025-06-15T09:01:22+02:00
146 Marco Lovino marcolovino17@gmail.com 3333677558 11.08.2025 14.08.2025 2 1 7 Halbpension it Mobile (384 x 731 px) herr -- Yes 2025-06-15T08:15:31+02:00
147 Andrea Meini falle.gname.72@gmail.com 3495618372 21.07.2025 28.07.2025 2 0 Fenice Halbpension it undefined herr -- Yes 2025-06-14T23:21:53+02:00
148 Enzo Sberna enzosberna@libero.it 01.08.2025 08.08.2025 2 0 Bellis Halbpension it Mobile (320 x 551 px) herr Italy Yes 2025-06-14T20:56:32+02:00
149 Paolo Antonucci Palletto@gmail.com 10.08.2025 20.08.2025 2 1 8 Halbpension it Mobile (384 x 705 px) -- -- Yes 2025-06-14T19:37:35+02:00
150 Davis Fabbi Da.da2003@yahoo.it 3483637094 06.09.2025 08.09.2025 2 1 7 Halbpension it Mobile (384 x 726 px) -- -- Yes 2025-09-03T08:17:40+02:00
151 Arianna Taffetani Arytaffi90@gmail.com +393398430571 23.12.2025 28.12.2025 2 6 2,3,5,9,14,14 Loft Halbpension it Mobile (393 x 596 px) frau Italy Yes 2025-09-03T07:39:35+02:00
152 Vittoria Sicolo Vittoria.sicolo@icloud.com +393892521295 30.12.2025 03.01.2026 2 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (393 x 658 px) frau Italy Yes 2025-10-13T16:48:53+02:00
153 Vittoria Sicolo Vittoria.sicolo@icloud.com +393892521295 30.12.2025 03.01.2026 2 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (393 x 658 px) frau Italy Yes 2025-10-13T16:48:53+02:00
154 Elisa Galassi Eliga84@gmail.com 3402539330 05.12.2025 08.12.2025 2 2 8,11 Peonia,Lavendula,Fenice Halbpension it Mobile (390 x 776 px) frau Italy Yes 2025-10-13T16:35:37+02:00
155 Hazel Silvia Massone hazel.massone@gmail.com 03925081848 18.08.2025 22.08.2025 2 2 12,14 Lavendula Übernachtung mit Frühstück en Desktop (1521 x 730 px) frau Italy Yes 2025-07-28T16:17:39+02:00
156 .lanfredi Rachele Lanfredi Lanfredi.rachele@gmail.com 348 865 4218 20.06.2025 30.09.2025 4 0 Peonia Übernachtung it Mobile (360 x 653 px) frau Italy Yes 2025-06-08T17:19:36+02:00
157 Roberta Piron robertapiron@gmail.com 3470906155 14.07.2025 21.07.2025 2 1 14 Peonia Halbpension it Mobile (360 x 668 px) -- Italy Yes 2025-06-08T11:21:57+02:00
158 Barbara Magliani barbara.magliani@gmail.com 30.06.2025 06.07.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (384 x 681 px) -- Italy Yes 2025-06-08T01:37:10+02:00
159 Davide Montanari davide.montanari72@gmail.com 24.08.2025 31.08.2025 2 1 16 Lavendula Übernachtung it Mobile (686 x 965 px) -- -- Yes 2025-06-07T19:20:44+02:00
160 Franca Gravano franca.asia@yahoo.it 069278163 29.08.2025 06.09.2025 2 0 Halbpension it Mobile (392 x 739 px) frau Italy Yes 2025-06-07T11:15:41+02:00
161 Alberto Gandini Alby.gandy@gmail.com +393387032435 23.08.2025 30.08.2025 4 0 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (384 x 726 px) herr Italy Yes 2025-06-07T07:52:56+02:00
162 Prof. Wolfhard Cappel wolfhard.cappel@t-online.de 01624782205 31.05.2025 11.06.2025 2 0 Loft Übernachtung de Desktop (1382 x 980 px) herr Germany Yes 2025-05-19T20:12:02+02:00
163 Gayan Msdurapperuma Madurapperuma gsgayan@gmail.com 3881033320 27.12.2025 30.12.2025 2 2 8,12 Peonia,Lavendula Halbpension it Mobile (411 x 504 px) herr -- Yes 2025-11-12T12:03:58+01:00
164 Katharina Campe k.campe@t-online.de +491719322029 13.09.2025 20.09.2025 2 0 Forsythia Übernachtung de Desktop (1468 x 711 px) frau Germany Yes 2025-05-30T17:35:33+02:00
165 Luca Zottin zottinluca04@gmail.com 3334234743 11.07.2025 13.07.2025 2 0 Loft Übernachtung mit Frühstück it Mobile (390 x 663 px) herr Italy Yes 2025-06-27T23:43:08+02:00
166 Elena Razza elena.razza@libero.it 3480316800 04.07.2025 07.07.2025 3 0 Lavendula Übernachtung mit Frühstück it Desktop (1521 x 703 px) frau Italy Yes 2025-06-27T20:55:03+02:00
167 Ombretta Benattii ombrettabenatti74@gmail.com 3496723430 09.08.2025 17.08.2025 3 1 15 Peonia,Lavendula,Fenice Übernachtung it Mobile (392 x 512 px) frau Italy Yes 2025-06-27T16:18:18+02:00
168 Nazzarena Ioannucci nenaioannucci@gmail.com 3493675124 31.08.2025 06.09.2025 2 0 Forsythia Halbpension it Mobile (414 x 706 px) frau Italy Yes 2025-06-27T12:22:42+02:00
169 Emanuele Capozzi capozziemanuele27@gmail.com 3383051766 17.08.2025 24.08.2025 2 2 12,15 Peonia,Fenice Übernachtung it Mobile (360 x 668 px) herr Italy Yes 2025-06-27T12:05:48+02:00
170 Gabriele Mansour Manfadi4@gmail.com 388 169 0894 28.07.2025 02.08.2025 2 1 5 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (368 x 771 px) herr -- Yes 2025-06-27T08:22:36+02:00
171 Marco Quadrelli soniacesaretti73@libero.it 3389783613 27.07.2025 04.08.2025 5 0 Fenice Halbpension it Mobile (360 x 691 px) herr -- Yes 2025-06-27T07:50:42+02:00
172 Barbara Serragli Serragli barbaratiare3@gmail.com 05.12.2025 08.12.2025 2 1 13 Peonia Übernachtung mit Frühstück it Mobile (411 x 682 px) frau Italy Yes 2025-09-18T22:23:47+02:00
173 Marco D'EMILIO mardem76@gmail.com 20.09.2025 27.09.2025 2 4 9,10,15,17 Fenice Halbpension it Mobile (384 x 705 px) herr Italy Yes 2025-09-18T13:47:36+02:00
174 Marina D'Este d.este.mary@gmail.com 02.10.2025 09.10.2025 2 0 Halbpension it Mobile (392 x 740 px) frau -- Yes 2025-09-06T16:51:58+02:00
175 Marina D'Este d.este.mary@gmail.com 02.10.2025 09.10.2025 2 0 Übernachtung it Mobile (392 x 740 px) frau Italy Yes 2025-09-06T16:51:25+02:00
176 paola Bosco paola.bosco@policlinico.mi.it 13.09.2025 16.09.2025 2 0 Peonia,Lavendula Übernachtung it Mobile (600 x 806 px) frau Italy Yes 2025-09-06T16:32:57+02:00
177 Davide Bonello davide_bonello@libero.it +393294139937 07.03.2026 14.03.2026 2 1 3 Peonia Übernachtung it Mobile (360 x 589 px) herr -- Yes 2025-09-06T12:00:33+02:00
178 Micaela Mostacci Micaela.mostacci@gmail.com 3382615080 21.02.2026 28.02.2026 2 2 8,15 Halbpension it Mobile (440 x 764 px) frau -- Yes 2025-09-24T23:57:05+02:00
179 Flavia Barattini flavia.barattini28@gmail.com 12.08.2025 19.08.2025 2 1 15 Lavendula Übernachtung mit Frühstück it Mobile (360 x 659 px) frau Italy Yes 2025-06-21T15:16:57+02:00
180 Jacopo Giannoni Jacopo.giannoni@hotmail.it +393357727375 06.08.2025 09.08.2025 2 0 Bellis Halbpension it Mobile (411 x 783 px) herr -- Yes 2025-07-20T23:41:25+02:00
181 ANNA Fiorenzo Annafiorenzo@gmail.com 320484241 18.08.2025 23.08.2025 2 2 10,16 Halbpension it Mobile (384 x 600 px) -- -- Yes 2025-07-20T22:59:54+02:00
182 Valentina Zanframundo Vale@tallo.eu 3480340348 16.08.2025 23.08.2025 2 4 3,5,6,10 Übernachtung it Mobile (360 x 653 px) frau Italy Yes 2025-07-20T20:45:04+02:00
183 Max Bernardini bernamax.555@gmail.com 3462152149 14.08.2025 17.08.2025 2 1 12 Fenice Übernachtung mit Frühstück it Mobile (320 x 511 px) herr Italy Yes 2025-07-20T20:05:06+02:00
184 Sara Baroni sarabaronima@gmail.com 3455876868 09.08.2025 16.08.2025 2 1 9 Übernachtung it Mobile (360 x 660 px) frau Italy Yes 2025-07-20T13:22:08+02:00
185 Roberto Marchesoli robe.marche@gmail.com 334 343 4357 03.08.2025 10.08.2025 3 0 Übernachtung it Mobile (392 x 740 px) herr Italy Yes 2025-07-20T09:38:39+02:00
186 Daniela Mercante danielamercante@gmail.com 328 133 6726 11.08.2025 18.08.2025 4 4 7,7,11,14 Peonia,Lavendula Übernachtung mit Frühstück it Mobile (384 x 704 px) frau Italy Yes 2025-07-20T02:22:06+02:00
187 Daniela Mercante danielamercante@gmail.com 328 133 6726 11.08.2025 18.08.2025 4 4 7,7,11,14 Lavendula Übernachtung mit Frühstück it Mobile (384 x 704 px) frau Italy Yes 2025-07-20T01:48:36+02:00
188 Domenico De Santis 2d.desantis@gmail.com 3316655319 10.08.2025 16.08.2025 7 0 Lavendula,Fenice Übernachtung mit Frühstück it Mobile (360 x 553 px) herr -- Yes 2025-07-19T19:29:20+02:00
189 Francesco Scaccia sca.france@hotmail.it 26.07.2025 02.08.2025 2 2 0,4 Peonia,Lavendula,Fenice Halbpension it Mobile (376 x 701 px) herr Italy Yes 2025-07-19T12:21:06+02:00
190 Paola Zanesi Paola.zanesi81@gmail.com 17.08.2025 21.08.2025 5 2 6,10 Peonia,Lavendula,Fenice Halbpension it Mobile (393 x 673 px) frau Italy Yes 2025-07-19T10:14:57+02:00
191 Elena Martini Martjn76@gmail.com +393476436905 10.08.2025 15.08.2025 2 1 8 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 653 px) frau Italy Yes 2025-07-19T06:28:01+02:00
192 Martina Marchetti martina_marchetti@hotmail.it 3492563144 25.08.2025 27.08.2025 2 1 1 Lavendula,Fenice,Forsythia Halbpension it Mobile (360 x 673 px) frau Italy Yes 2025-07-18T21:30:04+02:00
193 Massimo Lattanzi xmax.lattanzi@libero.it 3929114256 08.09.2025 12.09.2025 3 0 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (360 x 668 px) herr Italy Yes 2025-07-18T20:53:35+02:00
194 Massimo Lattanzi xmax.lattanzi@libero.it 3929114256 08.09.2025 12.09.2025 3 0 Lavendula Halbpension it Mobile (360 x 571 px) herr Italy Yes 2025-07-18T20:49:10+02:00
195 Iuliana Soroceanu irsoroceanu@gmail.com 26.07.2025 28.07.2025 2 0 Bellis Halbpension it Mobile (411 x 800 px) frau -- Yes 2025-07-18T19:54:26+02:00
196 Chiara Gandossi gandossi.chiara@libero.it 3294415567 17.08.2025 23.08.2025 2 1 13 Lavendula,Fenice Halbpension it Mobile (411 x 771 px) frau -- Yes 2025-07-18T18:13:23+02:00
197 Chiara Caglio chiara.caglio@libero.it 11.08.2025 15.08.2025 4 1 13 Übernachtung mit Frühstück it Mobile (390 x 663 px) frau -- Yes 2025-07-18T17:59:19+02:00
198 Sara Valbonesi saravalbonesi@hotmail.it 14.08.2025 17.08.2025 2 3 8,9,11 Übernachtung mit Frühstück it Mobile (360 x 673 px) frau Italy Yes 2025-07-18T15:39:43+02:00
199 Roberta Santacecilia Santacecilia robertasantacecilia@gmail.com +39348 04.08.2025 08.08.2025 2 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung mit Frühstück it Mobile (360 x 678 px) frau -- Yes 2025-07-18T11:59:29+02:00
200 Orietta Sacchetto Orietta.sacchetto@me.com 3393113587 18.07.2025 20.07.2025 2 1 12 Halbpension it Mobile (414 x 718 px) frau Italy Yes 2025-07-18T07:21:15+02:00
201 Giulia Rocca giuliarocca1970@gmail.com 3409226740 09.08.2025 16.08.2025 2 0 Peonia,Lavendula,Fenice,Forsythia Übernachtung it Mobile (360 x 653 px) frau -- Yes 2025-07-18T06:14:20+02:00
202 Daniela Mazzitelli Mazzi84@inwind.it 3496436906 18.08.2025 25.08.2025 2 1 3 Lavendula Halbpension it Mobile (384 x 671 px) frau Italy Yes 2025-07-17T23:46:36+02:00
203 Paola Bartocci paolavoliamo@virgilio.it 3475736848 21.07.2025 28.07.2025 2 0 Halbpension it Mobile (360 x 647 px) frau Italy Yes 2025-07-17T23:08:41+02:00
204 Simone Croce crocesimone@gmail.com 15.08.2025 22.08.2025 2 2 4,8 Peonia,Lavendula,Fenice,Forsythia Übernachtung mit Frühstück it Mobile (392 x 739 px) -- -- Yes 2025-07-17T18:06:35+02:00
205 Stefania Pietrangeli Stefania_pie@yahoo.it +393497879667 16.08.2025 23.08.2025 2 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung mit Frühstück it Mobile (360 x 653 px) frau Italy Yes 2025-07-17T15:02:45+02:00
206 valeria magrino valeire@hotmail.it 3935657931 13.09.2025 20.09.2025 2 2 1,9 Lavendula Halbpension it Desktop (1585 x 731 px) frau Italy Yes 2025-07-17T12:25:44+02:00
207 Simone Croce crocesimone@gmail.com 15.08.2025 22.08.2025 2 2 4,8 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (392 x 739 px) herr -- Yes 2025-07-17T12:04:23+02:00
208 Luca Zottin zottinluca04@gmail.com 3334234743 11.07.2025 13.07.2025 2 0 Loft,Lavendula,Forsythia Übernachtung mit Frühstück it Mobile (390 x 663 px) herr Italy Yes 2025-06-26T18:50:20+02:00
209 Gabriella Saronni sa.gabri@libero.it 3495866827 10.08.2025 17.08.2025 3 0 Peonia,Lavendula Übernachtung it Mobile (414 x 699 px) frau Italy Yes 2025-06-26T14:58:54+02:00
210 luca zottin zottinluca04@gmail.com 11.07.2025 13.07.2025 2 0 Loft,Lavendula,Forsythia Übernachtung mit Frühstück it Mobile (390 x 663 px) herr Italy Yes 2025-06-26T10:33:50+02:00
211 Sara Forti forti.sara@libero.it 09.08.2025 16.08.2025 2 1 6 Fenice Übernachtung it Mobile (411 x 783 px) -- -- Yes 2025-06-25T22:41:30+02:00
212 Jens Winkelmann skyline_84@web.de 18.07.2026 28.07.2026 2 1 12 Peonia,Lavendula,Fenice Halbpension de Mobile (402 x 714 px) herr Germany Yes 2025-11-16T18:07:10+01:00
213 Marco Provenzi Marcoprovenzi@alice.it 3383330586 07.06.2025 12.06.2025 3 1 1 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung it Desktop (1080 x 704 px) herr Italy Yes 2025-05-27T15:49:31+02:00
214 Hazel Mass hazel.massone@gmail.com 3925981848 19.08.2025 23.08.2025 2 2 11,13 Fenice Übernachtung mit Frühstück en Mobile (384 x 656 px) frau -- Yes 2025-07-27T09:37:17+02:00
215 Stefania Martella stefimart9@gmail.com 3471161198 27.12.2025 03.01.2026 4 3 10,14,14 Lavendula,Forsythia Halbpension it Mobile (360 x 667 px) -- -- Yes 2025-10-12T15:43:09+02:00
216 Andrea Mazzer andrea.mazzer88@gmail.com 349 539 4720 31.12.2025 04.01.2026 2 2 6,8 Halbpension it Mobile (390 x 663 px) herr Italy Yes 2025-10-12T06:24:11+02:00
217 Liliana Alexeeva Liliana.alexeeva@gmail.com 39 3409972074 21.12.2025 26.12.2025 2 0 Fenice Übernachtung mit Frühstück it Mobile (411 x 721 px) frau Italy Yes 2025-10-11T22:12:12+02:00
218 MASSIMO MOCCI maxmocci61@gmail.com 3295380005 01.08.2026 10.08.2026 2 0 Fenice,Forsythia Übernachtung mit Frühstück it Desktop (1905 x 953 px) herr Italy Yes 2025-10-11T19:43:15+02:00
219 Simona Reina simona.reina1985@gmail.com 3471345714 12.12.2025 13.12.2025 2 0 Peonia Halbpension it Mobile (360 x 668 px) frau -- Yes 2025-10-11T18:02:44+02:00
220 Tatiana Ballarino Tatianaballarino@hotmail.it +393290126388 30.12.2025 04.01.2026 4 3 0,2,3 Halbpension it Mobile (390 x 570 px) frau Italy Yes 2025-10-11T14:36:10+02:00
221 Elisa Pini elisapini1@gmail.com 29.08.2025 31.08.2025 2 1 7 Lavendula,Fenice Übernachtung mit Frühstück it Mobile (360 x 648 px) frau -- Yes 2025-08-21T19:37:44+02:00
222 Elisa Canini artelisa79@hotmail.com 3349207514 24.11.2025 30.11.2025 2 0 Forsythia Übernachtung mit Frühstück it Mobile (360 x 649 px) frau San Marino Yes 2025-08-21T12:23:08+02:00
223 Lidia Ciuraru Ciursru lidiaanaciuraru@gmail.com 3207242313 24.12.2025 28.12.2025 4 4 3,3,6,16 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 668 px) frau Italy Yes 2025-09-29T18:42:33+02:00
224 Francesca Calogiuri Francescacalogiuri@hotmail.com 3401765276 08.08.2026 19.08.2026 2 2 3,8 Peonia,Lavendula,Fenice Halbpension it Mobile (440 x 774 px) frau Italy Yes 2025-08-20T16:03:33+02:00
225 Alice Lazzeri alicelazzeri@libero.it 3294643748 29.12.2025 05.01.2026 2 1 14 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (393 x 576 px) frau -- Yes 2025-08-20T10:57:10+02:00
226 Lorenzo Fosca Fosca2002@libero.it +39 335 849 0091 16.08.2025 23.08.2025 2 0 Übernachtung mit Frühstück it Mobile (384 x 705 px) herr -- Yes 2025-08-14T19:21:33+02:00
227 Giovanni Pilla giopilla86@gmail.com 21.08.2025 24.08.2025 2 0 Bellis Halbpension it Mobile (390 x 777 px) herr -- Yes 2025-08-14T18:02:29+02:00
228 luigi nicolini nicoliniluigi@hotmail.it 3466240846 06.09.2025 13.09.2025 2 0 Forsythia Übernachtung it Mobile (360 x 604 px) herr Italy Yes 2025-08-14T15:49:19+02:00
229 Leonardo RICCIARELLI Leonardoricciarelli@gmail.com 3476218658 17.08.2025 20.08.2025 2 0 Forsythia Übernachtung it Mobile (360 x 678 px) herr Italy Yes 2025-08-14T13:58:38+02:00
230 Leonardo RICCIARELLI Leonardoricciarelli@gmail.com 3476218658 17.08.2025 20.08.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (360 x 678 px) herr Italy Yes 2025-08-14T13:56:14+02:00
231 Alessandro Cocchi allecocchi@hotmail.it 3492810231 08.09.2025 11.09.2025 2 2 0,3 Peonia,Lavendula,Fenice Halbpension it Mobile (390 x 655 px) herr Italy Yes 2025-08-14T12:39:13+02:00
232 Sara De Cesco Saradecesco1@gmail.com 17.08.2025 24.08.2025 3 1 14 Übernachtung it Mobile (390 x 655 px) -- -- Yes 2025-05-29T17:35:29+02:00
233 Mirka Baiardi mirkabaiardi@yahoo.it 3469674768 20.07.2025 24.07.2025 2 1 17 Übernachtung mit Frühstück it Mobile (360 x 664 px) frau Italy Yes 2025-05-29T06:24:28+02:00
234 Cangini Beatrice bea.cangini@gmail.com +393385850986 03.08.2025 10.08.2025 2 2 11,17 Fenice Halbpension it Mobile (360 x 616 px) frau Italy Yes 2025-06-13T21:58:37+02:00
235 Susanna Sozzi sozzisusanna@gmail.com 349 210 0236 05.07.2025 12.07.2025 4 0 Peonia Halbpension it Mobile (384 x 729 px) frau Italy Yes 2025-06-13T17:16:55+02:00
236 Italo Ferrari cilix028@gmail.com 3470853989 11.08.2025 18.08.2025 2 0 Loft,Forsythia,Bellis Halbpension it Mobile (384 x 726 px) herr Italy Yes 2025-06-13T15:26:45+02:00
237 Sara Rottini sara.rottini@hotmail.it 3332252085 21.08.2025 28.08.2025 2 1 1 Forsythia,Bellis Übernachtung it Mobile (360 x 663 px) frau Italy Yes 2025-06-13T10:59:02+02:00
238 Massimo Taroni massimotaroni65@gmail.com 3791415848 04.07.2025 07.07.2025 2 0 Lavendula,Fenice,Forsythia Halbpension it Mobile (432 x 816 px) herr Italy Yes 2025-06-13T10:30:03+02:00
239 alessia proietti alessiapro77@gmail.com 391 485 3388 13.07.2025 20.07.2025 3 1 12 Fenice Halbpension it Mobile (360 x 691 px) frau Italy Yes 2025-06-12T23:12:00+02:00
240 Laura Salvucci laurasalvucci@hotmail.it 24.08.2025 31.08.2025 2 2 9,11 Loft,Lavendula,Fenice Halbpension it Mobile (384 x 698 px) frau Italy Yes 2025-06-12T22:48:29+02:00
241 Enrico Cavallucci ecavallucci@libero.it 01.07.2025 06.07.2025 3 1 11 Fenice Übernachtung it Mobile (411 x 765 px) herr -- Yes 2025-06-12T21:39:09+02:00
242 Magda De vanna Magdadevanna@libero.it 3494105942 16.08.2025 23.08.2025 2 1 2 Forsythia Halbpension it Mobile (360 x 665 px) frau -- Yes 2025-06-12T08:52:59+02:00
243 Anita Bevilacqua bevilacquaanita@gmail.com 16.08.2025 23.08.2025 2 1 2 Peonia,Lavendula,Fenice,Forsythia Übernachtung it Mobile (375 x 625 px) frau -- Yes 2025-06-03T22:02:25+02:00
244 Fabiola Giffoni F.giffonifabiola@gmail.com 3386570888 07.07.2025 14.07.2025 2 2 2,9 Peonia,Lavendula,Fenice Halbpension it Mobile (440 x 759 px) frau -- Yes 2025-06-03T19:35:33+02:00
245 Marco Provenzi Marcoprovenzi@alice.it 3383330586 07.06.2025 12.06.2025 2 0 Lavendula,Fenice,Forsythia Übernachtung it Desktop (1080 x 704 px) herr Italy Yes 2025-06-03T17:07:48+02:00
246 Sabrina Meli sabriturris@gmail.com +393282863597 11.08.2025 16.08.2025 2 1 10 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 731 px) frau -- Yes 2025-06-03T07:11:04+02:00
247 Alessandra Faliva Faliva Gian.ale@alice.it 3495019535 19.07.2025 26.07.2025 2 1 15 Halbpension it Mobile (432 x 862 px) -- Italy Yes 2025-06-03T07:02:03+02:00
248 mirka baiardi mirkabaiardi@yahoo.it 3469674768 20.07.2025 24.07.2025 2 1 17 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Desktop (1513 x 786 px) frau Italy Yes 2025-06-02T22:38:51+02:00
249 Elisabetta Ravasi Elisabetta.ravasi@sappi.com IT +393455131145 30.08.2025 06.09.2025 2 0 Übernachtung mit Frühstück it Mobile (393 x 643 px) frau Italy Yes 2025-06-02T21:27:46+02:00
250 Roberta Bolognesi robertabolognesi@icloud.com 02.08.2025 09.08.2025 7 1 3 Halbpension it Mobile (393 x 658 px) frau -- Yes 2025-06-02T18:26:01+02:00
251 Felice Lustrissimi felicelustri@tiscali.it 3282744961 19.07.2025 26.07.2025 2 1 15 Übernachtung mit Frühstück it Mobile (414 x 703 px) herr Italy Yes 2025-06-02T12:58:46+02:00
252 Elisa Franzini Franzini Elisa.franzi77@gmail.com 3406459744 14.08.2025 17.08.2025 2 3 6,11,13 Übernachtung mit Frühstück it Mobile (428 x 759 px) frau Italy Yes 2025-08-10T00:50:43+02:00
253 Luca Mambrini daybyday2007@hotmail.it 13.08.2025 20.08.2025 2 0 Forsythia Übernachtung it Mobile (440 x 760 px) herr Italy Yes 2025-08-09T20:57:50+02:00
254 Elisa Franzini elisa.franzi77@gmail.com 3406459744 14.08.2025 17.08.2025 2 3 6,11,13 Übernachtung mit Frühstück it Mobile (428 x 744 px) frau Italy Yes 2025-08-09T18:41:22+02:00
255 Flavia mercadante/ascani Mercadante Ascani Ascani.flavia@gmail.com 3383705561 11.08.2025 16.08.2025 2 0 Loft,Forsythia Halbpension it Mobile (428 x 856 px) frau -- Yes 2025-08-09T16:10:48+02:00
256 Rosa Galdieri Rosa.1709@libero.it 3395471194 12.08.2025 14.08.2025 2 2 3,4 Lavendula Halbpension it Mobile (360 x 678 px) frau Italy Yes 2025-08-09T12:21:16+02:00
257 Ester caserio estercaser@gmail.com 339 805 5859 17.08.2025 22.08.2025 2 3 3,6,13 Halbpension it Mobile (430 x 731 px) frau Italy Yes 2025-08-09T11:58:41+02:00
258 Chiara IANNIELLO chiara.ianniello@gmail.com 3929402169 17.08.2025 24.08.2025 2 2 8,10 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 603 px) frau Italy Yes 2025-08-09T09:35:56+02:00
259 Chiara Bernabucci chiarabernabucci1@gmail.com +393498482965 23.08.2025 27.08.2025 2 0 Forsythia Übernachtung it Mobile (393 x 658 px) frau -- Yes 2025-08-09T08:17:42+02:00
260 Luca Manfredini lucamanfredini89@libero.it 17.08.2025 21.08.2025 2 0 Forsythia,Bellis Halbpension it Mobile (384 x 721 px) herr Italy Yes 2025-08-09T07:58:58+02:00
261 Gimmi Longo gimmilongo@gmail.com 392 299 9016 23.08.2025 29.08.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (360 x 667 px) herr Italy Yes 2025-08-08T21:54:07+02:00
262 paola floris paulaflo@tiscali.it 3403309928 27.12.2025 03.01.2026 4 1 4 Halbpension it Mobile (360 x 678 px) frau Italy Yes 2025-08-08T17:34:44+02:00
263 Laura Sacco laurasacco9@gmail.com 3881783486 19.08.2025 26.08.2025 4 2 0,2 Loft Halbpension it Mobile (392 x 743 px) frau Italy Yes 2025-08-08T15:29:36+02:00
264 Andrea Crisafuli andreacrisafuli46@hotmail.com 21.06.2025 23.06.2025 2 2 7,10 Übernachtung mit Frühstück it Desktop (1265 x 639 px) herr -- Yes 2025-06-06T07:24:22+02:00
265 Roberta Bolofnesi robertabolognesi@icloud.com 02.08.2025 09.08.2025 7 1 3 Halbpension it Mobile (393 x 658 px) -- -- Yes 2025-06-05T22:16:52+02:00
266 Andrea Martino andrea.martino89@hotmail.it 3201135544 20.08.2025 30.08.2025 2 1 1 Halbpension it Mobile (360 x 668 px) herr Italy Yes 2025-06-05T17:51:16+02:00
267 Luca Modafferi lmodafferi@libero.it 28.07.2025 03.08.2025 2 1 0 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 650 px) herr -- Yes 2025-06-05T07:30:17+02:00
268 Cristina Mandelli Pulce73.cm@gmail.com 3922673165 08.08.2026 22.08.2026 2 1 16 Peonia Übernachtung it Mobile (411 x 778 px) frau Italy Yes 2025-08-24T19:45:15+02:00
269 Lucia Visintin Luciavisintin@libero.it 3394268406 12.09.2025 15.09.2025 2 0 Forsythia Halbpension it Mobile (384 x 725 px) frau Italy Yes 2025-08-24T14:35:31+02:00
270 Davide Gennari Davide.gennari.64@gmail.com 3286482900 09.08.2026 16.08.2026 4 1 14 Lavendula Übernachtung it Mobile (360 x 653 px) herr Italy Yes 2025-08-24T12:36:09+02:00
271 Luca Saracca Lucas.1978@hotmail.it 3397191581 26.12.2025 29.12.2025 2 2 1,7 Forsythia Halbpension it Mobile (369 x 724 px) herr Italy Yes 2025-09-07T09:07:54+02:00
272 Marta Pettenò Martap80@libero.it 14.08.2025 17.08.2025 2 1 14 Halbpension it Mobile (411 x 697 px) frau -- Yes 2025-08-13T16:46:28+02:00
273 Alessio Ridolfi ridocr74@gmail.com 3313758106 25.08.2025 30.08.2025 2 0 Lavendula,Fenice,Forsythia Halbpension it Mobile (390 x 657 px) herr Italy Yes 2025-08-13T15:01:51+02:00
274 Katy Vitorbi Katia.vitorbi79@gmail.com 3402264803 18.08.2025 23.08.2025 2 2 5,8 Peonia Halbpension it Mobile (320 x 531 px) frau Italy Yes 2025-08-13T03:04:13+02:00
275 Alessandra De luca aledeluca8576@gmail.com 350 181 4305 17.08.2025 24.08.2025 2 3 6,11,12 Fenice Halbpension it Mobile (360 x 410 px) frau Italy Yes 2025-08-12T21:29:46+02:00
276 Barbara Tieri btieri@gmail.com 3282121541 19.08.2025 21.08.2025 2 1 10 Halbpension it Mobile (393 x 673 px) frau Italy Yes 2025-08-12T14:32:40+02:00
277 Barbara Tieri btieri@gmail.com 3282121541 19.08.2025 21.08.2025 2 1 10 Halbpension it Mobile (393 x 673 px) frau Italy Yes 2025-08-12T14:32:40+02:00
278 eugen sandor sandor lianapaulasandor@yahoo.it 3405481688 15.08.2025 17.08.2025 2 1 12 Fenice Halbpension it Mobile (390 x 580 px) herr Italy Yes 2025-08-12T09:54:15+02:00
279 Salvatore Tulumello tulumellosalvatore@virgilio.it 3383260038 16.08.2025 20.08.2025 2 0 Bellis Halbpension it Mobile (392 x 739 px) herr Italy Yes 2025-08-12T09:49:22+02:00
280 Laura Levati lauraaragon0@gmail.com 18.08.2025 25.08.2025 4 2 2,4 Halbpension it Mobile (414 x 533 px) frau -- Yes 2025-08-12T08:07:34+02:00
281 Mauro Cerasti antares.wlz@gmail.com 3474014445 23.08.2025 30.08.2025 2 2 12,14 Halbpension it Mobile (411 x 763 px) herr -- Yes 2025-08-11T21:37:45+02:00
282 Salvatore Spagnolo spagnosalva13@gmail.com 3283040182 18.08.2025 22.08.2025 2 0 Übernachtung it Mobile (384 x 697 px) herr Italy Yes 2025-08-11T13:53:36+02:00
283 Enrico Maria Sala Enricomaria.sala@gmail.com 3496283936 17.08.2025 23.08.2025 2 1 10 Halbpension it Mobile (360 x 616 px) herr -- Yes 2025-08-11T11:16:31+02:00
284 Matteo Pierleoni Matteo.pierleoni@gmail.com 29.08.2025 31.08.2025 2 1 1 Peonia,Lavendula,Fenice,Forsythia Übernachtung it Mobile (402 x 677 px) herr Italy Yes 2025-08-11T10:11:19+02:00
285 Martina Imberti Imberti Imberti.martina@gmail.com 3453398717 09.08.2026 16.08.2026 4 2 1,4 Übernachtung it Mobile (393 x 658 px) -- -- Yes 2025-08-11T09:51:39+02:00
286 Davis Fabbi Da.da2003@yahoo.it 3483637094 29.08.2025 31.08.2025 2 1 7 Peonia Halbpension it Mobile (384 x 726 px) herr -- Yes 2025-08-11T06:31:53+02:00
287 Vincenzo Melissari vincenzo.melissari@hotmail.it 20.08.2025 27.08.2025 2 1 1 Halbpension it Mobile (360 x 724 px) herr -- Yes 2025-08-10T22:32:48+02:00
288 Turso Turso Stefi Stefiturso7@gmail.com 30.08.2025 05.09.2025 3 1 2 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 759 px) frau -- Yes 2025-08-10T15:19:35+02:00
289 Gimmi Longo gimmilongo@gmail.com 392 299 9016 23.08.2025 29.08.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (360 x 667 px) herr Italy Yes 2025-08-10T13:50:42+02:00
290 Andrea Carbognani Andreacarbognani1072@gmail.com 3391775255 18.08.2025 20.08.2025 2 2 10,14 Peonia Halbpension it Mobile (390 x 677 px) herr Italy Yes 2025-08-10T13:17:55+02:00
291 Nicola Valbusa valbusanicola@gmail.com 3483592114 16.08.2025 22.08.2025 2 2 8,12 Übernachtung it Mobile (390 x 663 px) herr Italy Yes 2025-05-22T20:40:19+02:00
292 johnny carnevale dittacarnevale@gmail.com 3337900230 27.08.2025 01.09.2025 2 1 12 Halbpension it Desktop (1351 x 607 px) herr Italy Yes 2025-05-22T15:10:58+02:00
293 Karin Becker beckerkarin@hotmail.de 05.07.2025 08.07.2025 2 0 Übernachtung de Mobile (390 x 652 px) frau Germany Yes 2025-06-15T16:29:01+02:00
294 Martina Maffessanti martimaffe@hotmail.com 3393460946 30.12.2025 03.01.2026 2 1 0 Übernachtung it Mobile (411 x 796 px) frau Italy Yes 2025-10-24T21:37:11+02:00
295 Sara Zerbinati Zerbinati Sarazerbinati89@gmail.com 3334911170 14.02.2026 18.02.2026 2 2 4,7 Lavendula Übernachtung it Mobile (390 x 662 px) frau Italy Yes 2025-10-24T09:55:15+02:00
296 Anna Filippitsch anna.filippitsch@gmail.com 15.10.2025 17.10.2025 2 0 Lavendula Übernachtung de Mobile (402 x 678 px) -- -- Yes 2025-10-11T17:48:05+02:00
297 Chiara Di Emidio chiara.diemidio88@gmail.com 3280393016 25.07.2025 29.07.2025 2 2 4,5 Peonia Halbpension it Mobile (384 x 707 px) frau -- Yes 2025-05-18T07:22:17+02:00
298 Fee Kandel fee.kandel@gmx.at 10.10.2025 12.10.2025 2 0 Übernachtung mit Frühstück de Mobile (402 x 678 px) frau Austria Yes 2025-09-25T13:03:10+02:00
299 Lisa Mann Lisa.beth.mann@gmail.com 6033403983 04.08.2025 07.08.2025 4 2 6,8 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung mit Frühstück en Mobile (430 x 739 px) frau United States of America Yes 2025-06-05T09:41:37+02:00
300 Edoardo Domenichini domenichiniedoardo@gmail.com 3348077427 31.12.2025 04.01.2026 6 3 4,4,4 Bellis Halbpension it Mobile (406 x 774 px) herr Italy Yes 2025-09-13T23:25:42+02:00
301 Giuseppe Visicale Giuseppevisicale151@gmail.com 339 215 9919 23.12.2025 26.12.2025 2 1 6 Bellis Halbpension it Mobile (360 x 663 px) herr Italy Yes 2025-09-16T11:33:47+02:00
302 Maddalena Cerroni madda.84@icloud.com 0863995248 14.06.2026 21.06.2026 4 5 2,2,5,5,10 Peonia,Lavendula Halbpension it Mobile (393 x 673 px) frau Italy Yes 2025-09-16T06:53:43+02:00
303 Serena Benetti serena.benetti@gmail.com 27.12.2025 03.01.2026 2 1 5 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (411 x 785 px) frau -- Yes 2025-09-15T23:14:43+02:00
304 Bruno Berselli bruno.berselli77@gmail.com 11.12.2025 14.12.2025 2 1 1 Halbpension it Desktop (1440 x 837 px) herr -- Yes 2025-10-26T10:50:16+01:00
305 Andrea Cibin a.cibin@yahoo.com 3479170150 22.02.2026 26.02.2026 2 2 2,5 Peonia,Fenice Übernachtung mit Frühstück it Mobile (393 x 663 px) herr Italy Yes 2025-10-26T07:34:12+01:00
306 Hans-Georg Döring hg.doering@t-online.de 016098927216 27.07.2025 02.08.2025 2 0 Loft,Peonia,Lavendula,Fenice Übernachtung mit Frühstück de undefined herr Germany Yes 2025-07-06T17:51:24+02:00
307 Elena Batoni elebat72@gmail.com 3473794160 18.08.2025 22.08.2025 2 0 Loft,Forsythia Übernachtung it Mobile (392 x 715 px) frau Italy Yes 2025-07-02T23:46:41+02:00
308 Giacomo Spelta Giacomospelta@libero.it 3355321619 13.07.2025 20.07.2025 2 2 9,12 Fenice Halbpension it Mobile (384 x 725 px) herr Italy Yes 2025-07-02T22:30:25+02:00
309 Laura Andrelli leogala78@gmail.com 3665273432 20.07.2025 26.07.2025 2 2 8,14 Peonia,Lavendula,Fenice Halbpension it Mobile (375 x 740 px) frau -- Yes 2025-07-02T13:26:51+02:00
310 Gianluca Mazza Gia.ma73@libero.it +39 328 081 7271 09.08.2025 16.08.2025 2 2 13,16 Halbpension it Mobile (390 x 769 px) herr Italy Yes 2025-07-02T13:07:31+02:00
311 Raffaele Buscemi Rafbuscemi@gmail.com 28.07.2025 10.08.2025 2 2 2,3 Peonia,Lavendula,Fenice Halbpension it Mobile (390 x 655 px) herr Italy Yes 2025-07-02T12:53:06+02:00
312 Gianfranco La torre gianfrancolatorre41@gmail.com 348 566 3035 04.08.2025 10.08.2025 2 0 Forsythia Halbpension it Mobile (360 x 667 px) herr Italy Yes 2025-07-02T10:54:00+02:00
313 Marisa Galli marisapatrizia.galli@gmail.com 3427717487 19.09.2025 26.09.2025 2 0 Peonia Übernachtung it Mobile (392 x 743 px) frau -- Yes 2025-07-02T00:20:17+02:00
314 Mauro Sapia rosamau.ice@gmail.com 3389233180 29.07.2025 07.08.2025 2 0 Übernachtung it Mobile (390 x 558 px) herr Italy Yes 2025-07-01T13:50:50+02:00
315 Patrizia Barbiani Barbiani pbarbiani@gmail.com 3457660305 18.08.2025 24.08.2025 2 0 Halbpension it Mobile (375 x 740 px) frau Italy Yes 2025-07-01T12:11:39+02:00
316 Silvia Kostopoulos Kostsilvia92@gmail.com 03.08.2025 08.08.2025 2 1 2 Loft,Peonia,Lavendula,Fenice,Forsythia Übernachtung mit Frühstück it Mobile (375 x 620 px) frau Italy Yes 2025-07-01T09:50:30+02:00
317 Elisabetta Buldini elisabettabuldini@yahoo.it 3891128500 17.08.2025 23.08.2025 5 0 Peonia,Bellis Halbpension it Mobile (360 x 668 px) frau Italy Yes 2025-06-30T21:56:07+02:00
318 Gianluca Bronzetti isabella.migliarini@gmail.com 3402262447 01.01.2026 05.01.2026 2 3 9,9,13 Halbpension it Mobile (384 x 733 px) -- -- Yes 2025-09-28T12:07:25+02:00
319 Alessandro Zara alessandrozara@yahoo.it 347 324 8352 31.07.2025 03.08.2025 2 2 15,16 Fenice Übernachtung it Mobile (411 x 789 px) herr Italy Yes 2025-07-07T21:29:38+02:00
320 Tiziana Perini Perini Tiziana.perini@libero.it 3334929271 09.08.2025 13.08.2025 2 2 10,16 Fenice Halbpension it Mobile (411 x 698 px) frau -- Yes 2025-07-07T17:05:36+02:00
321 Viviana Magoga vivianamagoga@libero.it 333 583 1182 23.07.2025 25.07.2025 2 0 Bellis Halbpension it Mobile (384 x 721 px) frau Italy Yes 2025-07-07T15:41:23+02:00
322 Milena Miccio kigio@hotmail.com 05.08.2025 14.08.2025 2 0 Bellis Halbpension it Mobile (384 x 717 px) frau Italy Yes 2025-07-07T08:18:14+02:00
323 Federico Giovanardi kimon32@gmail.com 3473455279 07.08.2025 17.08.2025 2 2 12,14 Übernachtung it Mobile (360 x 560 px) herr Italy Yes 2025-07-06T23:15:14+02:00
324 Alessia Pavani morinieleo@gmail.com 33160399388 16.08.2025 23.08.2025 2 2 10,12 Halbpension it Mobile (402 x 784 px) frau Italy Yes 2025-07-06T20:58:35+02:00
325 Elisa Mercati Mercati Elisa27francesco@gmail.com 3898488735 24.08.2025 31.08.2025 2 2 4,11 Halbpension it Mobile (390 x 655 px) frau Italy Yes 2025-07-06T19:11:51+02:00
326 Emanuele Caronia e.caronia@libero.it 3385058141 09.08.2025 23.08.2025 2 0 Übernachtung it Mobile (433 x 830 px) herr Italy Yes 2025-07-06T15:37:07+02:00
327 Gianpaolo Ceruti Gippao27@gmail.com 31.08.2025 05.09.2025 2 2 3,3 Fenice Halbpension it Mobile (392 x 739 px) herr -- Yes 2025-07-06T11:25:12+02:00
328 Ulisse Magrini Daniela.pianelli68@gmail.com +39 333 333 333 22.07.2025 29.07.2025 2 1 9 Peonia Halbpension it Mobile (360 x 494 px) herr Italy Yes 2025-07-06T11:12:15+02:00
329 Gaetano Proscia kyra1411@gmail.com 13.07.2025 19.07.2025 2 2 7,12 Peonia,Lavendula,Fenice Halbpension it Mobile (411 x 794 px) herr -- Yes 2025-07-06T09:43:47+02:00
330 Benedetta ronci benedetta.ronci@hotmail.it 3284919316 26.07.2025 02.08.2025 2 2 8,13 Forsythia,Bellis Halbpension it Mobile (390 x 662 px) frau Italy Yes 2025-07-06T09:26:40+02:00
331 gianluca mazza Mazza Gia.ma73@libero.it +39 328 081 7271 09.08.2025 16.08.2025 2 2 13,16 Lavendula Halbpension it Mobile (390 x 655 px) herr Italy Yes 2025-07-06T07:59:01+02:00
332 Desiree Nannarelli d.nannarelli@gmail.com 327 734 8572 20.07.2025 27.07.2025 2 1 16 Übernachtung it Mobile (360 x 668 px) frau Italy Yes 2025-07-06T06:34:11+02:00
333 gianluca mazza Mazza Gia.ma73@libero.it +39 328 081 7271 09.08.2025 16.08.2025 2 2 13,16 Peonia Halbpension it Mobile (390 x 655 px) herr Italy Yes 2025-07-05T20:06:44+02:00
334 Arberi Beltoja arberial@yahoo.it +39329724158 01.01.2026 05.01.2026 2 2 8,12 Peonia,Lavendula,Fenice Halbpension it Mobile (440 x 701 px) frau Italy Yes 2025-08-27T21:46:29+02:00
335 Carlo Bragante bragantecarlo@gmail.com 338 956 9195 07.09.2025 11.09.2025 2 0 Bellis Halbpension it Mobile (384 x 705 px) herr Italy Yes 2025-08-27T18:17:16+02:00
336 Mariangela Caprini caprinimariangela@gmail.com 3391263971 26.09.2025 29.09.2025 2 0 Bellis Halbpension it Mobile (392 x 642 px) frau Italy Yes 2025-08-27T13:05:20+02:00
337 ILARIA ALGHISI ILARIA.ALGHISI@LIVE.IT 26.12.2025 02.01.2026 2 2 8,12 Peonia,Lavendula,Fenice Halbpension it Desktop (2545 x 1271 px) frau -- Yes 2025-08-27T12:17:02+02:00
338 Vittoria Carolo Vittoria9185@libero.it +393280836615 22.08.2025 24.08.2025 2 2 2,2 Peonia Halbpension it Mobile (338 x 604 px) herr Italy Yes 2025-07-30T20:29:33+02:00
339 Deborah Limaschi Limaschideborah@gmail.com +393487490408 24.08.2025 31.08.2025 2 1 1 Loft,Peonia,Forsythia,Bellis Halbpension it Mobile (428 x 745 px) frau Italy Yes 2025-07-30T14:03:52+02:00
340 Francis Abag angelicoabag1984@gmail.com +393289479442 20.08.2025 23.08.2025 4 2 2,4 Peonia,Lavendula,Fenice Übernachtung it Mobile (411 x 790 px) herr -- Yes 2025-07-30T10:59:54+02:00
341 Stefania Rullini Stefania.rullini@gmail.com 3487809455 09.08.2025 13.08.2025 1 0 Bellis Halbpension it Mobile (411 x 759 px) frau Italy Yes 2025-07-30T00:26:58+02:00
342 Maurizio BORELLA maurizioborella@gmail.com +328 314 0148 25.08.2025 30.08.2025 3 1 1 Peonia Halbpension it Mobile (384 x 703 px) herr Italy Yes 2025-07-29T23:23:20+02:00
343 Simona Crespolini simonacrespolini@alice.it +393335886823 17.08.2025 24.08.2025 2 0 Forsythia Übernachtung mit Frühstück it Mobile (384 x 708 px) frau Italy Yes 2025-07-29T19:41:51+02:00
344 Donata Brisotto donata.brisotto@gmail.com 3453991011 26.12.2025 02.01.2026 2 1 12 Peonia,Lavendula Übernachtung mit Frühstück it Mobile (430 x 731 px) frau Italy Yes 2025-07-29T11:34:40+02:00
345 Turso Stefi Stefiturso7@gmail.com 25.08.2025 01.09.2025 3 1 2 Übernachtung mit Frühstück it Mobile (384 x 759 px) frau Italy Yes 2025-07-29T10:53:59+02:00
346 Simona Burlacu simona_antoni5042@yahoo.it 3481838149 03.01.2026 06.01.2026 2 1 15 Fenice Übernachtung mit Frühstück it Mobile (320 x 599 px) frau Italy Yes 2025-11-10T18:35:13+01:00
347 Elena Stirparo fabriziocurcio1981@gmail.com +393295620241 30.12.2025 03.01.2026 2 3 3,13,16 Peonia Halbpension it Mobile (360 x 720 px) frau Italy Yes 2025-11-10T09:25:45+01:00
348 Irene Salari Irenesalari@yahoo.it 21.11.2025 23.11.2025 3 2 1,8 Fenice Übernachtung it Mobile (390 x 662 px) frau Italy Yes 2025-11-09T23:33:24+01:00
349 Mirko Zoa Zoa339@gmail.com 3453329509 09.02.2026 15.02.2026 2 2 0,3 Fenice Halbpension it Mobile (360 x 686 px) herr Italy Yes 2025-11-09T16:31:31+01:00
350 Emanuela Filini manufilini@gmail.com 30.12.2025 01.01.2026 2 2 6,9 Halbpension it Mobile (390 x 777 px) -- -- Yes 2025-11-09T15:29:10+01:00
351 Daniela Mazzitelli mazzi84@inwind.it 18.08.2025 25.08.2025 2 1 3 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 725 px) frau -- Yes 2025-07-16T18:07:09+02:00
352 Roberta Salvatore roberta.salvatore@gmail.com 03.08.2025 12.08.2025 2 1 11 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (390 x 662 px) frau Italy Yes 2025-07-16T16:27:22+02:00
353 Andrea Lanzilotto andrea.lanzilotto@libero.it 04.08.2025 11.08.2025 2 2 3,9 Halbpension it Mobile (360 x 694 px) herr -- Yes 2025-07-16T15:26:20+02:00
354 Lara Fochesato Lara.fochesato@live.it +39 348 993 410 1___ 11.08.2025 16.08.2025 2 0 Loft,Forsythia Übernachtung it Mobile (320 x 518 px) frau Italy Yes 2025-07-16T06:54:53+02:00
355 Fabrizio Turcato Fabrizio_turcato@yahoo.com 00393487823030 14.08.2025 17.08.2025 2 2 6,13 Übernachtung mit Frühstück it Mobile (360 x 655 px) herr -- Yes 2025-07-16T04:40:32+02:00
356 Simone Denaro zerosimone1@inwind.it 3475487509 24.08.2025 31.08.2025 2 2 12,15 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 672 px) herr Italy Yes 2025-07-15T20:24:08+02:00
357 Andrea Gonnella leogala75@gmail.com 22.07.2025 26.07.2025 2 2 8,14 Bellis Halbpension it Mobile (390 x 655 px) herr -- Yes 2025-07-15T14:54:03+02:00
358 PAOLA SIGNORI Paola8.b@virgilio.it 340 484 1451 08.08.2025 17.08.2025 4 0 Peonia Übernachtung it Mobile (393 x 651 px) frau Italy Yes 2025-07-15T13:31:41+02:00
359 francesca.masserelli@virgilio.it Masserelli Francesca.masserelli@virgilio.it 09.08.2025 19.08.2025 3 0 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 702 px) frau Italy Yes 2025-07-15T13:25:40+02:00
360 Veronica Urbinati veronica.urbinati@gmail.com 3397381960 18.08.2025 21.08.2025 2 2 4,7 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 752 px) frau Italy Yes 2025-07-15T12:21:09+02:00
361 Leonardo INTINI intinileo@gmail.com 3401618984 09.08.2025 20.08.2025 4 0 Übernachtung it Mobile (430 x 738 px) herr Italy Yes 2025-07-15T10:43:06+02:00
362 Katia Bonaldo katiabonaldo@gmail.com 348 984 3627 11.08.2025 18.08.2025 3 1 12 Übernachtung mit Frühstück it Mobile (390 x 655 px) frau -- Yes 2025-07-15T10:25:25+02:00
363 Katia Corbara corbara.katia@gmail.com 3403221080 09.08.2025 13.08.2025 2 2 3,7 Peonia Halbpension it Mobile (360 x 694 px) frau Italy Yes 2025-07-15T10:17:11+02:00
364 Francesco Vecchiola f.vecchiola@gmail.com 3316712985 04.08.2025 09.08.2025 2 1 1 Bellis Halbpension it Mobile (393 x 651 px) herr Italy Yes 2025-06-11T18:13:22+02:00
365 Patrizia Santirocchi Santirocchi mauro_1711@yahoo.it 3281238285 09.08.2025 15.08.2025 3 0 Peonia Übernachtung it Mobile (390 x 655 px) frau Italy Yes 2025-06-11T14:07:37+02:00
366 Vitalba Mezzocapo ricevavit@gmail.com 3355638559 02.08.2025 12.08.2025 3 0 Loft,Peonia,Lavendula,Fenice,Forsythia Übernachtung it Mobile (390 x 769 px) frau -- Yes 2025-06-11T05:32:00+02:00
367 Susi Bergamini susibergamini@gmail.com 347 103 4812 10.08.2025 17.08.2025 2 0 Halbpension it Desktop (800 x 1209 px) herr -- Yes 2025-06-10T21:06:54+02:00
368 Sara Cavallaro sarajuve1981@gmail.com 3395838265 28.06.2025 05.07.2025 2 0 Loft Halbpension it Mobile (360 x 663 px) frau Italy Yes 2025-06-10T13:34:01+02:00
369 Gian piero Moretti Gianpiero.moretti@hotmail.it 3288172990 12.07.2025 19.07.2025 1 0 Bellis Übernachtung it Mobile (360 x 647 px) herr Italy Yes 2025-06-10T06:54:28+02:00
370 Elena Martini Martini Martjn76@gmail.com 347 643 6905 10.08.2025 15.08.2025 2 1 8 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 657 px) frau Italy Yes 2025-07-22T19:18:05+02:00
371 Sara Sanzi Sarasanzi035@gmail.com 20.08.2025 24.08.2025 2 0 Forsythia Halbpension it Mobile (411 x 678 px) frau Italy Yes 2025-07-22T18:23:48+02:00
372 Barbara Murgia barbara1aprile@gmail.com 3925519714 14.08.2025 18.08.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (392 x 739 px) frau -- Yes 2025-07-22T17:05:22+02:00
373 Antonella Marazia marazia.antonella@gmail.com 01.08.2025 07.08.2025 3 0 Fenice Übernachtung it Mobile (392 x 760 px) frau -- Yes 2025-07-22T06:42:06+02:00
374 Simona Ferrigno Ferrigno Simo84f@libero.it 3498901318 18.08.2025 24.08.2025 2 1 14 Lavendula Halbpension it Mobile (384 x 704 px) frau Italy Yes 2025-07-22T06:40:07+02:00
375 Gennaro Piscopo Gennaro.rosa98@hotmail.it 3490597097 28.12.2025 01.01.2026 2 0 Loft Halbpension it Mobile (360 x 638 px) herr Italy Yes 2025-07-22T06:38:21+02:00
376 marina pellanda marinapel1980@gmail.com 3466414764 13.08.2025 17.08.2025 2 1 2 Halbpension it Mobile (392 x 743 px) frau -- Yes 2025-07-21T23:47:44+02:00
377 Laura Tomasi arualtom@libero.it 3471473826 18.08.2025 21.08.2025 2 1 8 Fenice,Forsythia Halbpension it Mobile (390 x 662 px) frau Italy Yes 2025-07-21T21:58:04+02:00
378 Mandis Mariana m.mandis@yahoo.com +393281137505 14.08.2025 17.08.2025 3 3 2,8,9 Übernachtung mit Frühstück it Mobile (390 x 580 px) frau Italy Yes 2025-07-21T20:52:53+02:00
379 Elisa Malini Elisa.malini@gmail.com 3806547696 16.08.2025 21.08.2025 2 2 12,17 Lavendula Halbpension it Mobile (411 x 760 px) frau Italy Yes 2025-07-21T19:28:18+02:00
380 Matteo Sais M.sais@libero.it 11.08.2025 16.08.2025 3 0 Halbpension it Mobile (411 x 717 px) herr -- Yes 2025-07-21T19:06:34+02:00
381 Cinzia Vignatelli cinziavigna.cv@gmail.com 3478745685 06.09.2025 09.09.2025 2 1 16 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it undefined frau Italy Yes 2025-07-21T18:10:58+02:00
382 Sara Rottini sara.rottini@hotmail.it 3332252085 19.08.2025 23.08.2025 2 1 1 Lavendula,Fenice,Forsythia Halbpension it Mobile (360 x 671 px) frau Italy Yes 2025-07-21T16:41:40+02:00
383 Luana Cascelli Luana_0715@msn.com 3404056650 11.08.2025 17.08.2025 2 2 6,10 Übernachtung it Mobile (390 x 655 px) frau -- Yes 2025-07-21T15:37:10+02:00
384 Maria Cristina Leonardi mcristina.leonardi@libero.it 3477905824 08.08.2025 18.08.2025 2 1 16 Übernachtung mit Frühstück it Mobile (411 x 780 px) frau Italy Yes 2025-07-21T14:53:06+02:00
385 Walter Bartoli walterbartoli@gmail.com 3406562623 09.07.2026 14.07.2026 2 2 8,12 Lavendula Halbpension it Mobile (384 x 701 px) herr Italy Yes 2025-08-29T05:49:14+02:00
386 Anna Bortolan Spanna0000@gmail.com 3775297172 28.12.2025 02.01.2026 5 0 Übernachtung it Mobile (390 x 662 px) frau -- Yes 2025-08-28T20:44:40+02:00
387 Arianna Natale arianna.natale92@gmail.com +393932550830 06.12.2025 08.12.2025 4 4 1,1,8,8 Peonia,Lavendula Übernachtung mit Frühstück it Mobile (393 x 673 px) frau Italy Yes 2025-08-28T15:33:50+02:00
388 Stademann Natalie n.stademann@gmail.com 0049 176 95552518 03.10.2025 10.10.2025 2 0 Fenice Halbpension de Desktop (1905 x 967 px) frau Germany Yes 2025-09-28T10:40:52+02:00
389 Paola Cerrone p_cerrone@hotmail.it 3347850429 27.12.2025 03.01.2026 9 6 6,7,7,10,11,12 Peonia,Lavendula,Fenice,Forsythia Übernachtung it Mobile (338 x 606 px) frau Italy Yes 2025-08-18T06:53:35+02:00
390 Maria rosaria Bonofiglio BONOFIGLIO Maria.4277@yahoo.com 3477564244 27.09.2025 03.10.2025 2 2 5,8 Halbpension it Mobile (375 x 632 px) frau Italy Yes 2025-09-22T21:48:07+02:00
391 Maurizio Perugini Perugini perugini.maurizio@gmail.com 3334424116 27.12.2025 03.01.2026 6 6 10,14,14,16,16,16 Halbpension it Mobile (393 x 659 px) herr Italy Yes 2025-09-22T21:05:59+02:00
392 Alessia Rondelli Rondelli rondelli.alessia@gmail.com 3494218534 05.12.2025 07.12.2025 2 2 5,11 Fenice Halbpension it Mobile (393 x 586 px) frau Italy Yes 2025-09-22T12:52:22+02:00
393 Alessio Castillenti alessio.castillenti@gmail.com +393396739858 26.12.2025 30.12.2025 4 0 Lavendula Übernachtung mit Frühstück it Mobile (375 x 748 px) herr Italy Yes 2025-09-27T20:38:08+02:00
394 Debby Schiavon deborahschiavon82@gmail.com 3382915851 03.01.2026 06.01.2026 2 0 Bellis Übernachtung mit Frühstück it Mobile (360 x 752 px) -- Italy Yes 2025-09-27T17:19:32+02:00
395 Annalisa AMADIO Annalisa76.amadio@gmail.com 01.01.2026 04.01.2026 3 1 14 Fenice Übernachtung it Mobile (411 x 784 px) frau Italy Yes 2025-09-27T14:09:19+02:00
396 Arnaldo Pietro De Brito arnaldopietrodebrito@libero.it 3408629862 27.07.2025 03.08.2025 2 1 10 Fenice Halbpension it Mobile (392 x 739 px) herr Italy Yes 2025-06-20T08:52:11+02:00
397 Raffaele Rondoni Raffaelerondoni@gmail.com 3316005133 10.08.2025 17.08.2025 3 1 15 Peonia,Lavendula,Fenice,Bellis Halbpension it Mobile (411 x 769 px) herr -- Yes 2025-05-17T17:17:45+02:00
398 Chiara Brocani brocanichiara@gmail.com 3284504689 16.07.2025 20.07.2025 2 1 2 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (384 x 657 px) frau Italy Yes 2025-05-17T15:20:05+02:00
399 Loretta Alfei loretta.alfei@gmail.com 3397668603 20.08.2025 29.08.2025 2 0 Lavendula Übernachtung it Mobile (360 x 674 px) frau Italy Yes 2025-05-17T15:17:16+02:00
400 Vittoriano Gimmarrusti gvittoriano@yahoo.com 3928287585 19.07.2025 25.07.2025 2 2 9,15 Lavendula Halbpension it Mobile (360 x 664 px) herr Italy Yes 2025-05-17T11:43:23+02:00
401 fabio Martino fabiomartino71@gmail.com 3343903454 09.08.2025 16.08.2025 3 1 14 Peonia,Lavendula,Fenice Übernachtung it Mobile (432 x 820 px) herr Italy Yes 2025-05-17T09:03:29+02:00
402 Michela Pincin michela.pincin@gmail.com 3404058587 14.08.2025 18.08.2025 2 0 Bellis Halbpension it Mobile (360 x 665 px) frau Italy Yes 2025-08-05T11:01:43+02:00
403 Maria Rita Barbone barbonemariarita@gmail.com 3209066437 18.08.2025 23.08.2025 2 1 11 Lavendula Halbpension it Mobile (392 x 660 px) frau -- Yes 2025-08-05T09:09:09+02:00
404 Antonio Giappichini Giappichini.antonio@gmail.com 3491796586 21.08.2025 24.08.2025 2 2 5,9 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (384 x 702 px) herr Italy Yes 2025-08-05T08:05:01+02:00
405 Margherita Cameli gherimi@gmail.com 3396855735 04.01.2026 06.01.2026 2 1 6 Bellis Übernachtung mit Frühstück it Mobile (360 x 667 px) frau Italy Yes 2025-08-05T07:02:34+02:00
406 Barbara Gherri Barbara.gherri@gmail.com 11.08.2025 18.08.2025 2 2 6,9 Peonia,Lavendula,Fenice Übernachtung it Mobile (390 x 662 px) frau Italy Yes 2025-08-04T22:00:11+02:00
407 Alessia Maggi alemaggi18@gmail.com 3451579932 19.08.2025 22.08.2025 2 1 17 Halbpension it Mobile (360 x 656 px) frau Italy Yes 2025-08-04T19:13:42+02:00
408 Riccardo Mazzola mazzori@petalmail.com 3479444899 20.08.2025 27.08.2025 3 0 Fenice Übernachtung it Mobile (360 x 569 px) herr Italy Yes 2025-08-04T18:32:55+02:00
409 Gian Luca Cirimbelli Gianluca.cirimbelli@gmail.com 3490892519 18.08.2025 22.08.2025 2 1 7 Bellis Halbpension it Mobile (390 x 662 px) herr Italy Yes 2025-08-04T15:48:38+02:00
410 raffaele silipo Silipo avvsilipo.raffaele@gmail.com 3711714863 08.08.2025 18.08.2025 4 0 Peonia,Fenice Übernachtung it Mobile (320 x 569 px) herr Italy Yes 2025-08-04T11:55:13+02:00
411 Maryna Kulchak marenochka3@gmail.com 3715622400 15.08.2025 17.08.2025 3 2 6,12 Übernachtung it Mobile (392 x 736 px) frau Italy Yes 2025-08-04T11:43:50+02:00
412 Livia Villani livi.villani@tiscali.it 09.08.2025 13.08.2025 2 2 4,9 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (393 x 673 px) frau -- Yes 2025-08-04T09:19:49+02:00
413 Robero Stoissich Stoissich@alice.it 3664226761 11.08.2025 15.08.2025 4 0 Lavendula Halbpension it Mobile (430 x 723 px) herr Italy Yes 2025-07-27T20:36:08+02:00
414 caterina Holmberg Cathyholmberg@hotmail.com 3472447554 29.08.2025 31.08.2025 4 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (390 x 777 px) frau Italy Yes 2025-07-27T17:53:27+02:00
415 Barbara Fortunato barbarafortunato8@gmail.com +393332442130 27.08.2025 31.08.2025 4 0 Übernachtung it Mobile (390 x 677 px) frau Italy Yes 2025-07-27T16:15:22+02:00
416 Luciano Caldana caldanaluciano24@gmail.com 3898159881 18.08.2025 23.08.2025 2 0 Forsythia,Bellis Übernachtung mit Frühstück it Mobile (369 x 724 px) herr Italy Yes 2025-07-27T13:49:16+02:00
417 Laura Cosentino Lpsanvittorio@gmail.com 389 872 6900 31.08.2025 05.09.2025 2 2 9,12 Halbpension it Mobile (430 x 731 px) frau Italy Yes 2025-07-27T13:19:28+02:00
418 Davide Baglioni davidesan1978@gmail.com 3335075425 17.08.2025 20.08.2025 2 2 11,17 Übernachtung mit Frühstück it Mobile (411 x 776 px) herr Italy Yes 2025-07-27T10:02:04+02:00
419 Stefania Ballerano Stefania.ballerano@gmail.com 24.08.2025 31.08.2025 2 1 17 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (411 x 784 px) frau -- Yes 2025-07-27T08:27:08+02:00
420 Fabrizio Passalacqua passalacquafabrizio71@gmail.com 336711379 23.08.2025 30.08.2025 4 0 Fenice Halbpension it Mobile (366 x 687 px) -- Italy Yes 2025-07-26T23:51:14+02:00
421 Cinzia Mandreoli domegeg@gmail.com 340 392 5856 16.08.2025 20.08.2025 2 2 5,10 Peonia Übernachtung mit Frühstück it Mobile (339 x 620 px) herr -- Yes 2025-07-26T21:15:29+02:00
422 Domenico De Santis 2d.desantis@gmail.com 3316655319 09.08.2025 14.08.2025 2 0 Bellis Übernachtung it Mobile (360 x 635 px) herr -- Yes 2025-07-26T19:21:12+02:00
423 Monica Gemma gemmamonica19@gmail.com 3383399114 28.08.2025 31.08.2025 2 1 15 Übernachtung it Mobile (392 x 724 px) frau Italy Yes 2025-07-26T13:25:09+02:00
424 Di Lembo Lina linadilembo@gmail.com 3205742436 17.08.2025 23.08.2025 2 1 1 Loft,Forsythia Halbpension it Mobile (360 x 664 px) frau Italy Yes 2025-07-26T10:41:00+02:00
425 Simona Taglieri simona.taglieri@gmail.com 3476933052 05.08.2025 09.08.2025 2 0 Peonia Übernachtung it Mobile (360 x 672 px) frau Italy Yes 2025-07-26T08:32:37+02:00
426 Marica Posa posamarica@gmail.com 3293716913 30.07.2025 04.08.2025 2 2 9,12 Halbpension it Mobile (360 x 586 px) frau -- Yes 2025-07-26T06:34:31+02:00
427 Clara Bernardelli clara.bernardelli@gmail.com 31.12.2025 03.01.2026 6 5 2,2,5,6,8 Übernachtung it Mobile (392 x 743 px) -- Italy Yes 2025-09-14T20:56:35+02:00
428 Monica Rondelli mrondelli@hotmail.it 3923454149 02.04.2026 05.04.2026 3 0 Halbpension it Mobile (428 x 739 px) frau -- Yes 2025-09-14T16:54:23+02:00
429 Davide Bonello davide_bonello@libero.it +393294139937 17.01.2026 24.01.2026 2 1 3 Peonia Übernachtung it Mobile (360 x 667 px) herr Italy Yes 2025-09-14T16:06:29+02:00
430 Giuditta Generoso giuditta84@hotmail.it 340 978 7451 02.03.2026 09.03.2026 2 2 3,5 Lavendula Halbpension it Mobile (406 x 774 px) frau -- Yes 2025-09-14T15:54:16+02:00
431 Natascia Cantoni natascia.cantoni@gmail.com 3393850628 28.12.2025 01.01.2026 2 0 Lavendula,Forsythia Übernachtung mit Frühstück it Mobile (360 x 655 px) frau Italy Yes 2025-09-14T14:14:42+02:00
432 Claudio Butti Claudio_1971mi@yahoo.it 3470578207 31.12.2025 05.01.2026 2 0 Loft,Lavendula,Forsythia,Bellis Halbpension it undefined herr Italy Yes 2025-10-04T20:45:04+02:00
433 Nicola Maradei nicolamaradei@libero.it 3392128745 19.12.2025 23.12.2025 1 2 11,14 Halbpension it Mobile (384 x 700 px) herr Italy Yes 2025-10-04T19:34:01+02:00
434 Romina Di Maio rominadimaio@mail.com 3396834910 30.12.2025 03.01.2026 4 0 Fenice Übernachtung mit Frühstück it Mobile (375 x 739 px) frau Italy Yes 2025-10-01T12:21:14+02:00
435 Letizia Berardi berardi.letizia@gmail.com 27.12.2025 03.01.2026 2 0 Halbpension it Mobile (384 x 604 px) frau -- Yes 2025-10-01T11:13:43+02:00
436 Chiara Petix Chiarapetix82@gmail.com 3270546824 31.12.2025 05.01.2026 2 1 6 Übernachtung mit Frühstück it Mobile (375 x 627 px) frau -- Yes 2025-10-01T06:23:00+02:00
437 Rosetta Merenda tempiovenere@email.it 3202244008 15.08.2026 29.08.2026 3 0 Lavendula Halbpension it Mobile (430 x 850 px) frau -- Yes 2025-09-30T22:19:45+02:00
438 Simone Passaro s.passaro93@gmail.com 03.10.2025 05.10.2025 2 0 Loft,Forsythia,Bellis Übernachtung mit Frühstück it Desktop (1114 x 670 px) herr Italy Yes 2025-09-30T17:20:41+02:00
439 Valter Scarpa valterscarpa@libero.it 3384056782 29.12.2025 03.01.2026 2 2 7,12 Lavendula Halbpension it Mobile (392 x 728 px) herr Italy Yes 2025-09-30T15:02:50+02:00
440 Vincenza Foschillo enzafoschillo@gmail.com 3336333320 27.12.2025 03.01.2026 2 1 6 Lavendula Übernachtung mit Frühstück it Mobile (320 x 587 px) frau Italy Yes 2025-09-30T12:25:45+02:00
441 Monica Montanari monicamon2308@gmail.com 3396010803 16.08.2025 23.08.2025 2 0 Forsythia Halbpension it Mobile (339 x 628 px) frau Italy Yes 2025-06-04T14:14:57+02:00
442 andrea crisafuli andreacrisafuli46@hotmial.com 21.06.2025 23.06.2025 2 2 7,10 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Desktop (1265 x 639 px) herr -- Yes 2025-06-04T12:30:16+02:00
443 Conny Reinhardt conny.1999@gmx.net 30.08.2025 06.09.2025 2 1 11 Peonia,Lavendula,Fenice,Forsythia Übernachtung de Desktop (1440 x 797 px) frau Germany Yes 2025-08-27T21:29:39+02:00
444 Federico Lucarini federicolucarini82@gmail.com 16.07.2025 23.07.2025 2 2 3,5 Übernachtung it Mobile (393 x 773 px) -- -- Yes 2025-05-20T00:12:55+02:00
445 ombretta benatti ombrettabenatti74@gmail.com 3496723430 09.08.2025 20.08.2025 3 1 15 Peonia Übernachtung it Mobile (392 x 739 px) frau Italy Yes 2025-05-20T00:01:25+02:00
446 Pierluigi Giuliodori Pierluigigiuliodori@gmail.com 3393159091 18.08.2025 21.08.2025 2 1 16 Peonia,Lavendula,Fenice Übernachtung it Mobile (384 x 704 px) herr Italy Yes 2025-07-14T13:18:01+02:00
447 Rino Festugato rinoegrazia@alice.it 3393629894 10.08.2025 17.08.2025 2 0 Bellis Halbpension it Mobile (320 x 583 px) herr Italy Yes 2025-07-14T12:37:41+02:00
448 PATRIZIA Solombrino pattysolom@gmail.com 3926325794 13.08.2025 17.08.2025 2 0 Forsythia Übernachtung it Mobile (347 x 638 px) frau Italy Yes 2025-07-14T11:36:15+02:00
449 Eugenia Malusa Eugenia.malusa@gmail.com 10.08.2025 20.08.2025 4 0 Halbpension en Mobile (390 x 662 px) frau -- Yes 2025-05-23T09:02:51+02:00
450 Alessandro Passador passador_ale@tiscali.it 18.08.2025 23.08.2025 2 1 17 Halbpension it Mobile (360 x 414 px) herr -- Yes 2025-08-03T20:38:55+02:00
451 Emanuela Della porta maolina80@gmail.com 3277574653 16.08.2025 23.08.2025 2 1 10 Übernachtung mit Frühstück it Mobile (360 x 373 px) frau -- Yes 2025-08-03T17:45:10+02:00
452 Elena Fabbiani elenafabbianii@gmail.com 23.08.2025 31.08.2025 2 0 Loft,Lavendula,Forsythia,Bellis Halbpension it Mobile (375 x 741 px) frau -- Yes 2025-08-03T17:38:17+02:00
453 massimo Granocchia massimo.granocchia@gmail.com +393920236584 21.08.2025 24.08.2025 1 3 7,9,13 Fenice Halbpension it Mobile (440 x 655 px) herr Italy Yes 2025-08-03T16:17:22+02:00
454 Antonella Convertino convertino.antonella@gmail.com 3290762812 01.09.2025 07.09.2025 2 1 8 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (392 x 662 px) frau Italy Yes 2025-08-03T14:18:43+02:00
455 Candido Caserta caserta.candido@libero.it 3494695112 09.08.2025 13.08.2025 2 1 3 Bellis Halbpension it Mobile (392 x 739 px) herr Italy Yes 2025-08-03T12:59:07+02:00
456 Candido Caserta caserta.candido@libero.it 3494695112 09.08.2025 13.08.2025 2 1 3 Forsythia Übernachtung mit Frühstück it Mobile (392 x 739 px) herr Italy Yes 2025-08-03T12:57:40+02:00
457 Letizia De sanctis Letizia.desanctis74@gmail.com +393491328279 10.08.2025 17.08.2025 2 0 Bellis Übernachtung it Mobile (393 x 658 px) frau Italy Yes 2025-08-03T12:21:48+02:00
458 daniela cavallaro danielacavallaro74@gmail.com +393393244936 05.12.2025 09.12.2025 3 0 Peonia Übernachtung it Mobile (360 x 665 px) frau Italy Yes 2025-08-03T12:19:00+02:00
459 Ettore Rapezzi ettorefederica@libero.it 19.08.2025 21.08.2025 4 0 Übernachtung mit Frühstück it Mobile (360 x 672 px) herr -- Yes 2025-08-03T11:48:24+02:00
460 Roberto Zito robertozitorz@gmail.com +39 333 194 9312 18.08.2025 24.08.2025 4 0 Lavendula,Forsythia Halbpension it Mobile (360 x 656 px) herr Italy Yes 2025-08-03T10:35:58+02:00
461 Negoita Nicoleta Nicoleta Negoitanicol85@gmail.com +393457653842 15.08.2025 17.08.2025 4 0 Lavendula Halbpension it Mobile (390 x 580 px) frau Italy Yes 2025-08-03T07:24:12+02:00
462 Carmine Cipro carminecipro68@gmail.com 3920200041 17.08.2025 24.08.2025 4 0 Peonia,Lavendula Halbpension it Mobile (393 x 651 px) herr Italy Yes 2025-08-02T21:28:52+02:00
463 Gabriele Catanzaro Gabricat81@gmail.com 30.12.2025 06.01.2026 2 2 6,9 Halbpension it Mobile (360 x 645 px) herr -- Yes 2025-08-02T17:09:05+02:00
464 Valentina Nogara evita89@alice.it 11.08.2025 16.08.2025 2 1 4 Halbpension it Mobile (392 x 656 px) frau -- Yes 2025-08-02T14:22:24+02:00
465 Monica Gemma gemmamonica19@gmail.com 3383399114 28.08.2025 31.08.2025 2 1 15 Fenice Übernachtung it Mobile (392 x 724 px) -- -- Yes 2025-08-02T12:42:54+02:00
466 Simona Taglieri simona.taglieri@gmail.com 3476933052 11.08.2025 14.08.2025 2 0 Lavendula,Fenice,Forsythia,Bellis Übernachtung mit Frühstück it Mobile (360 x 672 px) frau Italy Yes 2025-08-02T09:40:18+02:00
467 Marica Bemer Bemer Marica.bemer@gmail.com +39339123904 10.08.2025 17.08.2025 2 2 13,15 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (411 x 786 px) frau -- Yes 2025-08-02T09:21:58+02:00
468 Claudio Langianni Claudio.langianni@alice.it 3346161792 15.08.2025 22.08.2025 2 1 15 Fenice Halbpension it Mobile (320 x 620 px) herr Italy Yes 2025-08-01T23:43:10+02:00
469 Denise Sartori Tresjolie.denise@gmail.com 09.08.2025 16.08.2025 2 2 9,12 Übernachtung it Mobile (390 x 662 px) -- -- Yes 2025-08-01T22:43:46+02:00
470 Roberta Stagni STAGNI robertastagni@yahoo.it 3404054316 17.07.2026 24.07.2026 2 0 Forsythia Übernachtung it Mobile (375 x 705 px) frau Italy Yes 2025-08-01T19:04:01+02:00
471 Vittoria Carolo Vittoria9185@libero.it +393280836615 22.08.2025 24.08.2025 2 2 3,9 Lavendula,Fenice Halbpension it Mobile (338 x 604 px) frau Italy Yes 2025-08-01T15:10:53+02:00
472 Gabriele Nardini nardini.gabriele03@gmail.com 3468797167 25.08.2025 31.08.2025 2 1 1 Fenice,Forsythia,Bellis Halbpension it Mobile (384 x 627 px) herr Italy Yes 2025-08-01T12:05:02+02:00
473 Patrick Bert Patrickbert80@gmail.com 3491865149 18.08.2025 25.08.2025 2 1 12 Halbpension it Mobile (360 x 631 px) herr -- Yes 2025-08-01T06:55:04+02:00
474 Francesca Giovanna Rapetta fratore@gmail.com +393343245719 22.08.2025 25.08.2025 3 1 13 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 657 px) frau Italy Yes 2025-07-31T22:30:42+02:00
475 paolo rossignoli rrpapl1977@gmail.com 3495009725 14.08.2025 17.08.2025 6 1 11 Übernachtung mit Frühstück it Mobile (392 x 615 px) herr Italy Yes 2025-07-31T16:33:06+02:00
476 Silvia Baldassari baldassarisilvia134@gmail.com +393274336780 04.08.2025 11.08.2025 2 0 Forsythia Übernachtung it Mobile (390 x 677 px) frau Italy Yes 2025-07-31T16:16:39+02:00
477 Angela Maria Barbieri angelabarbieriit@yahoo.it 339 853 0877 09.08.2025 16.08.2025 2 2 5,7 Peonia,Lavendula,Fenice Halbpension it Mobile (411 x 749 px) frau Italy Yes 2025-07-31T15:22:42+02:00
478 Gabriele Nardini nardini.gabriele03@gmail.com +393468797167 25.08.2025 31.08.2025 2 1 1 Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (384 x 709 px) herr Italy Yes 2025-07-31T10:30:05+02:00
479 Laura Berluti Laura_berluti@yahoo.com 16.08.2025 20.08.2025 2 1 5 Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung mit Frühstück it Mobile (384 x 704 px) frau -- Yes 2025-07-31T08:57:35+02:00
480 Tanja Lerro Tanja.lerro@gmail.com 3471916838 30.12.2025 04.01.2026 2 2 2,11 Fenice Halbpension it Mobile (390 x 677 px) frau Italy Yes 2025-09-04T14:03:15+02:00
481 Maria Rosaria Lippi Mariarosarialippi@yahoo.it 16.02.2026 23.02.2026 2 0 Loft Halbpension it Mobile (360 x 657 px) frau Italy Yes 2025-10-19T22:04:26+02:00
482 Eno Vebiu Enovebiu11@outlook.com 3457232292 24.12.2025 29.12.2025 2 3 2,7,16 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 733 px) herr Italy Yes 2025-10-19T18:57:03+02:00
483 Federica Lazzaro federica88lazzaro@gmail.com 3334590520 01.01.2026 04.01.2026 2 2 0,3 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (393 x 641 px) frau Italy Yes 2025-10-19T16:25:34+02:00
484 Karl Traunspurger karltraunspurger@gmail.com 015115591527 16.05.2026 23.05.2026 1 0 Bellis Übernachtung de Mobile (384 x 701 px) -- Germany Yes 2025-10-29T17:42:53+01:00
485 P Barni patrizia_barni_91@libero.it 29.09.2025 03.10.2025 2 2 0,4 Peonia,Lavendula,Fenice Halbpension it Mobile (375 x 698 px) frau -- Yes 2025-08-16T21:07:39+02:00
486 Ernesto Annarumma Ernesto.rosso@outlook.it 27.12.2025 03.01.2026 2 2 5,11 Fenice Halbpension it Mobile (428 x 759 px) herr -- Yes 2025-08-16T17:08:19+02:00
487 Fabio Pareschi fabiopareschi69@gmail.com 20.08.2025 23.08.2025 3 1 12 Peonia Halbpension it Mobile (392 x 642 px) -- -- Yes 2025-08-16T11:54:48+02:00
488 Isabella Neri isaneri@tiscali.it 16.08.2025 24.08.2025 2 0 Lavendula,Fenice,Forsythia Übernachtung it Mobile (390 x 669 px) frau -- Yes 2025-05-20T22:40:21+02:00
489 Chiara Iorio chiara24475@gmail.com 3397362329 11.08.2025 18.08.2025 2 0 Loft,Forsythia Halbpension it Mobile (384 x 702 px) frau -- Yes 2025-05-20T16:22:13+02:00
490 Ramona Gobetti ramo77gob@tiscali.it 27.12.2025 03.01.2026 5 1 1 Lavendula Halbpension it Mobile (390 x 677 px) frau -- Yes 2025-09-11T19:50:27+02:00
491 Mattia Simonetto m.simonetto@avvocatosimonetto.com 3453066044 30.12.2025 04.01.2026 2 2 3,6 Peonia,Lavendula Übernachtung it Desktop (1854 x 933 px) herr -- Yes 2025-09-11T16:06:20+02:00
492 Alice Bracci alicebracci80@gmail.com 20.12.2025 24.12.2025 2 3 12,14,17 Übernachtung it Mobile (384 x 700 px) frau Italy Yes 2025-09-11T08:47:33+02:00
493 Daniela Tonini Tonini Shakihavana@gmail.com 3396802008 01.01.2026 05.01.2026 2 2 5,7 Lavendula Übernachtung it Mobile (360 x 677 px) -- -- Yes 2025-10-07T20:49:22+02:00
494 Daniela Arhip gubilitvera@gmail.com +393887268003 24.12.2025 27.12.2025 3 3 8,9,15 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 707 px) frau -- Yes 2025-10-07T19:54:01+02:00
495 Veronica Marchetti Marchetti Veronicamarchetti1977@gmail.com 3299476876 11.01.2026 17.01.2026 2 1 17 Peonia,Lavendula,Fenice Halbpension it Mobile (320 x 588 px) frau Italy Yes 2025-10-07T15:37:31+02:00
496 Maria Grazia Ferri marygten6@hotmail.com 28.12.2025 04.01.2026 4 4 6,6,11,11 Übernachtung mit Frühstück it Mobile (430 x 743 px) -- Italy Yes 2025-10-07T13:45:21+02:00
497 silvia andreotti silvia.andreotti@hotmail.it 3286552398 04.08.2025 13.08.2025 2 0 Loft,Forsythia Halbpension it Desktop (1521 x 695 px) frau -- Yes 2025-07-09T15:44:22+02:00
498 Mauro Zecca zeccam@yahoo.it 3483600062 06.09.2025 13.09.2025 2 0 Bellis Halbpension it Mobile (411 x 762 px) herr Italy Yes 2025-07-09T13:37:18+02:00
499 Simona Migliari migliari.simo@gmail.com +393391399107 27.07.2025 06.08.2025 2 2 5,7 Halbpension it Mobile (411 x 765 px) frau Italy Yes 2025-07-09T13:20:37+02:00
500 Donatella Ludovico Donaludovico75@gmail.com 3477059300 27.12.2025 02.01.2026 2 2 16,18 Fenice Übernachtung it Mobile (360 x 654 px) frau Italy Yes 2025-07-09T12:56:04+02:00
501 Gian Carlo Tamburini tamburinigc@gmail.com 3294370531 26.07.2025 31.07.2025 2 1 13 Peonia,Fenice Übernachtung it Mobile (432 x 818 px) herr -- Yes 2025-07-09T12:45:19+02:00
502 Elisa Zucchini elisazucchini79@gmail.com 347 957 4956 04.08.2025 08.08.2025 2 1 16 Lavendula,Fenice Übernachtung mit Frühstück it Mobile (366 x 683 px) frau Italy Yes 2025-07-09T07:45:06+02:00
503 Mauro Baccini Baccini86@gmail.com 3483391097 26.08.2025 30.08.2025 2 2 8,12 Peonia,Lavendula,Fenice Halbpension it Mobile (390 x 578 px) herr -- Yes 2025-07-09T07:19:39+02:00
504 claudio Boglioli Claudioboglioli88@hotmail.it 3397104302 21.07.2025 25.07.2025 2 1 4 Halbpension it Mobile (360 x 656 px) herr Italy Yes 2025-07-09T07:03:56+02:00
505 Angelica Gramaccioni agramaccioni@gmail.com 329/2011137 09.08.2025 14.08.2025 2 2 6,9 Lavendula Übernachtung mit Frühstück it Mobile (414 x 713 px) frau Italy Yes 2025-07-08T20:08:07+02:00
506 Luca Acunzo lacunzo@yahoo.it 10.08.2025 24.08.2025 2 2 11,15 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 651 px) herr Italy Yes 2025-07-08T19:49:10+02:00
507 Massimiliano Ottolini maxim8@inwind.it 3407192098 03.01.2026 06.01.2026 3 0 Peonia,Lavendula,Fenice Übernachtung it Desktop (1327 x 642 px) herr Italy Yes 2025-11-16T22:34:04+01:00
508 Giuseppe Giampietro g.giampietro1@yahoo.it 3475927917 29.12.2025 03.01.2026 3 1 12 Peonia Übernachtung it Mobile (393 x 651 px) herr Italy Yes 2025-11-16T21:46:06+01:00
509 Giovanna De palma De palma giovannadepalma@outlook.it 3201961554 02.01.2026 06.01.2026 2 2 2,9 Peonia Halbpension it Mobile (392 x 739 px) frau Italy Yes 2025-11-16T20:53:22+01:00
510 Ilaria Battaglino ilab56789@gmail.com 3394953825 29.12.2025 01.01.2026 3 0 Übernachtung mit Frühstück it Mobile (411 x 788 px) herr -- Yes 2025-11-16T17:51:08+01:00
511 Pasquale Donnarumma pasqualedonnarum@gmail.com 333 135 6484 29.11.2025 30.11.2025 3 1 16 Peonia,Lavendula,Fenice Übernachtung it Desktop (800 x 1208 px) herr -- Yes 2025-11-16T15:15:47+01:00
512 Edoardo Forcella edoardo.forcella@alice.it 29.12.2025 04.01.2026 2 0 Loft,Peonia,Lavendula,Forsythia,Bellis Halbpension it Mobile (375 x 495 px) herr Italy Yes 2025-11-16T09:37:35+01:00
513 Nicola Carfagna Carfagna Carfagna.nicola@libero.it 3383454008 28.12.2025 02.01.2026 2 3 1,4,11 Peonia Halbpension it Mobile (384 x 703 px) herr Italy Yes 2025-11-16T08:49:02+01:00
514 Viorica Homenco homencoviorica@gmail.com +393245828180 29.12.2025 01.01.2026 4 1 11 Peonia Halbpension it Mobile (411 x 780 px) frau Italy Yes 2025-11-16T07:35:33+01:00
515 Serena Pranzini serena.pranzini@alice.it 3382379905 17.08.2025 21.08.2025 2 1 11 Halbpension it Mobile (428 x 736 px) frau -- Yes 2025-07-05T00:04:54+02:00
516 Emanuela Birini emabirini@gmail.com 09.08.2025 16.08.2025 4 0 Peonia Übernachtung it Mobile (392 x 743 px) -- Italy Yes 2025-07-04T21:52:47+02:00
517 cinzia caselli cinzia.caselli@giustizia.it 3474287224 22.08.2025 26.08.2025 4 0 Peonia Halbpension it Mobile (360 x 672 px) frau Italy Yes 2025-07-04T18:34:30+02:00
518 Nicoletta Mattiussi nicoletta.mattiussi@gmail.com 3496183035 13.07.2025 19.07.2025 2 2 0,2 Peonia Halbpension it Mobile (414 x 820 px) frau Italy Yes 2025-06-17T19:40:32+02:00
519 Debora Concialdi deboraconcialdi74@gmail.com +393478104628 10.07.2025 15.07.2025 2 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung it Mobile (320 x 566 px) frau Italy Yes 2025-06-17T14:21:07+02:00
520 Sara Tartabini Sara.tartabini1981@gmail.com 338 980 0551 16.08.2025 23.08.2025 3 2 7,15 Peonia Übernachtung mit Frühstück it Mobile (384 x 722 px) -- -- Yes 2025-06-17T08:25:29+02:00
521 Roberta Morandini Morandiniroberta@gmail.com 24.08.2025 04.09.2025 3 2 3,9 Peonia Übernachtung it Mobile (414 x 609 px) frau Italy Yes 2025-06-16T22:30:16+02:00
522 Silvana Tiberio silvytiberio@gmail.com 3401468792 18.08.2025 23.08.2025 2 1 17 Übernachtung it Mobile (392 x 743 px) frau Italy Yes 2025-06-16T17:09:25+02:00
523 Salvatore Giacci S.guacci@libero.it 3313621612 12.08.2025 18.08.2025 2 1 6 Peonia Übernachtung mit Frühstück it Mobile (390 x 777 px) herr Italy Yes 2025-06-16T14:27:26+02:00
524 Daniela Maffei danielamaffei7@gmail.com 337 866 788 06.07.2025 13.07.2025 2 0 Forsythia Übernachtung it Mobile (384 x 599 px) frau Italy Yes 2025-06-16T14:22:33+02:00
525 Carlo Alfei loretta.alfei@gmail.com 3397668703 20.08.2025 29.08.2025 2 0 Fenice Übernachtung it Mobile (360 x 682 px) herr Italy Yes 2025-06-16T13:44:10+02:00
526 Rebecca Cattaneo rebecca_cattaneo@libero.it 20.06.2026 27.06.2026 2 3 2,6,9 Peonia,Fenice Halbpension it Mobile (360 x 666 px) -- -- Yes 2025-07-25T18:29:36+02:00
527 Silvia Seveso silviaseveso83@gmail.com 19.08.2025 22.08.2025 2 2 1,8 Halbpension it Desktop (1394 x 773 px) -- -- Yes 2025-07-25T14:57:02+02:00
528 Marco Spigolon orsopiteco@gmail.com 01.09.2025 05.09.2025 2 1 14 Halbpension it Mobile (411 x 797 px) herr -- Yes 2025-07-25T12:21:14+02:00
529 Marcela Pette Marcelapette@icloud.com 3804650172 26.12.2025 03.01.2026 2 2 1,5 Peonia,Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (393 x 773 px) frau Italy Yes 2025-07-25T09:15:13+02:00
530 MicaelA Zampieri Zampierimicaela@gmail.com 27.12.2025 03.01.2026 2 1 3 Lavendula,Fenice,Forsythia,Bellis Übernachtung it undefined frau -- Yes 2025-07-24T21:25:15+02:00
531 Maria Cristina Belgiovine Cristinabelgiovine@libero.it 3406089775 26.12.2025 02.01.2026 2 2 8,10 Peonia,Lavendula,Fenice Halbpension it undefined frau -- Yes 2025-07-24T10:19:37+02:00
532 Sandra Mazza sandramazza@hotmail.it 329 403 8481 11.08.2025 16.08.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (393 x 643 px) frau Italy Yes 2025-07-23T23:56:50+02:00
533 Matteo Sais M.sais@libero.it 11.08.2025 16.08.2025 2 0 Halbpension it Mobile (411 x 721 px) herr -- Yes 2025-07-23T23:33:30+02:00
534 Matteo Sais M.sais@libero.it 11.08.2025 16.08.2025 2 0 Halbpension it Mobile (411 x 721 px) herr -- Yes 2025-07-23T23:33:30+02:00
535 Tatiana Falcinelli tatianafalcinelli79@gmail.com 3343421695 11.08.2025 16.08.2025 2 1 12 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 737 px) frau Italy Yes 2025-07-23T23:15:57+02:00
536 Davide Curcio Curcio Davidecurcio@libero.it 3394833660 02.08.2025 09.08.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (384 x 704 px) herr Italy Yes 2025-07-23T22:49:12+02:00
537 Milena Miccio kigio@hotmail.com 3338782859 04.08.2025 10.08.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (384 x 717 px) frau -- Yes 2025-06-19T19:06:40+02:00
538 Maria Grazia Gentile gentilegrace@yahoo.it 3389338838 17.08.2025 24.08.2025 1 0 Bellis Halbpension it Mobile (411 x 734 px) frau Italy Yes 2025-06-19T18:18:49+02:00
539 Lucia Moretti morettilucia70@gmail.com 11.08.2025 16.08.2025 2 3 13,15,15 Übernachtung mit Frühstück it Mobile (360 x 664 px) frau Italy Yes 2025-06-19T17:02:08+02:00
540 Simone Venturato venturatosimone@gmail.com 348 440 0858 10.08.2025 17.08.2025 2 0 Loft Übernachtung mit Frühstück it Mobile (360 x 668 px) herr Italy Yes 2025-06-19T09:39:41+02:00
541 Valeria Barricelli Valery06@libero.it 328 44 35671 16.08.2025 23.08.2025 4 4 7,13,13,15 Lavendula Übernachtung it Mobile (411 x 797 px) frau Italy Yes 2025-06-18T22:24:48+02:00
542 Benedtta Cappiello benedetta.cg@gmail.com 03.08.2025 10.08.2025 2 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung mit Frühstück it Desktop (1180 x 713 px) frau -- Yes 2025-06-18T22:17:23+02:00
543 Elena Greco grecoelena75@gmail.com 3355609794 03.01.2026 10.01.2026 1 2 13,16 Peonia Halbpension it Mobile (392 x 735 px) frau Italy Yes 2025-08-15T17:27:09+02:00
544 Lucia Aversano Lucia.aversano87@gmail.com 23.08.2025 30.08.2025 2 2 7,9 Fenice Halbpension it Mobile (360 x 653 px) frau -- Yes 2025-08-15T15:03:45+02:00
545 Marcella Marchi Marchi.marcella79@gmail.com 3384718165 06.07.2026 12.07.2026 3 1 1 Lavendula,Fenice Übernachtung it Mobile (375 x 552 px) frau Italy Yes 2025-08-15T14:15:43+02:00
546 Monica Moretti Moretti Mony.moretti25@gmail.com 3497776490 09.11.2025 15.11.2025 2 2 6,10 Peonia,Lavendula,Fenice Halbpension it Mobile (402 x 682 px) frau -- Yes 2025-10-27T21:56:17+01:00
547 Micaela Zampieri zampierimicaela@gmail.com 27.12.2025 03.01.2026 2 1 3 Peonia,Lavendula,Fenice Übernachtung it Mobile (414 x 828 px) frau -- Yes 2025-08-26T20:47:49+02:00
548 Elena Contarato elena_contarato@hotmail.it 27.12.2025 03.01.2026 5 1 10 Halbpension it Mobile (390 x 677 px) frau -- Yes 2025-08-26T19:44:18+02:00
549 Luigi De Martino luigi.demartino1972@libero.it '+393491091286 30.12.2025 02.01.2026 2 2 11,14 Peonia Halbpension it Mobile (384 x 733 px) herr -- Yes 2025-08-26T17:20:30+02:00
550 Valentina Corradin Corradib valentinacorradin@gmail.com 3484783911 30.12.2025 03.01.2026 2 2 1,7 Lavendula Halbpension it Mobile (375 x 561 px) frau Italy Yes 2025-08-26T08:34:26+02:00
551 Walter Bartoli walterbartoli@gmail.com 3406562623 09.07.2026 14.07.2026 2 2 8,12 Fenice Halbpension it Mobile (384 x 644 px) herr Italy Yes 2025-08-25T23:53:22+02:00
552 Denise Chistolini Chistolini Dchistolini6@gmail.com 3318307297 02.03.2026 08.03.2026 2 2 0,9 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (411 x 761 px) frau Italy Yes 2025-08-25T16:01:59+02:00
553 Francesca Sorgato cesca.85@hotmail.it 27.12.2025 03.01.2026 2 2 6,6 Peonia,Lavendula,Fenice Übernachtung it Mobile (390 x 663 px) frau -- Yes 2025-08-25T15:04:20+02:00
554 Roberto O Orsi orsiroberto37@gmail.com 3333459372 25.08.2025 29.08.2025 5 0 Peonia,Bellis Halbpension it Mobile (360 x 667 px) herr Italy Yes 2025-08-25T11:29:18+02:00
555 Teresa Grillo teagrillo@rocketmail.com 3348464542 02.08.2025 08.08.2025 2 0 Forsythia,Bellis Halbpension it Mobile (393 x 651 px) frau -- Yes 2025-06-30T08:41:01+02:00
556 Paolo Disconzi paolodisconzi@gmail.com 3477408769 27.08.2025 31.08.2025 3 2 3,5 Übernachtung it Mobile (360 x 672 px) herr Italy Yes 2025-06-30T08:34:52+02:00
557 Patrizia Anatriello patrizia.anatriello.caporale@gmail.com 3922658558 10.08.2025 17.08.2025 2 2 13,13 Übernachtung mit Frühstück it Mobile (392 x 743 px) frau Italy Yes 2025-06-30T05:51:21+02:00
558 Silvia Anfos silvia.anfos@gmail.com 16.08.2025 23.08.2025 2 2 0,5 Lavendula,Fenice Halbpension it Mobile (360 x 636 px) -- -- Yes 2025-06-18T09:41:14+02:00
559 Valentina Bonadonna valentina.bnd@gmail.com 392 626 6400 17.08.2025 24.08.2025 2 2 3,3 Übernachtung it Mobile (392 x 744 px) frau Italy Yes 2025-05-19T10:53:46+02:00
560 Loretta Alfei loretta.alfei@gmail.com 3397668703 20.08.2025 29.08.2025 2 0 Lavendula Übernachtung it Mobile (360 x 674 px) frau Italy Yes 2025-05-19T09:22:47+02:00
561 Gianfranco Marino Gianfranco.marino@fiorentini.com 11.08.2025 16.08.2025 3 2 17,17 Übernachtung mit Frühstück it Mobile (393 x 665 px) herr -- Yes 2025-05-19T06:52:28+02:00
562 Alana Gallini alanagallini@gmail.com 12.08.2025 19.08.2025 3 3 0,2,4 Halbpension en Mobile (393 x 644 px) -- -- Yes 2025-07-14T04:17:02+02:00
563 Susi Bergamini Susibergamini@gmail.com 347 1034812 10.08.2025 17.08.2025 2 0 Loft Halbpension it Desktop (800 x 1165 px) frau Italy Yes 2025-05-30T22:18:42+02:00
564 Marco Barchiesi m.barchiesi56@gmail.com 3486506303 15.07.2025 20.07.2025 2 0 Forsythia Übernachtung mit Frühstück it Mobile (338 x 605 px) herr Italy Yes 2025-05-30T21:41:15+02:00
565 Antonella De Luca a.deluca@raconsulting.it 335 760 2237 04.08.2025 10.08.2025 3 0 Peonia,Lavendula,Fenice Halbpension it Mobile (430 x 733 px) frau Italy Yes 2025-05-30T14:34:04+02:00
566 Gaetano Caiani Gaetano.caiani@gmail.com 3381934017 04.10.2025 11.10.2025 2 0 Halbpension it Mobile (384 x 731 px) herr Italy Yes 2025-05-30T14:10:19+02:00
567 c cook heart1584@aol.com +1 4096564686 13.07.2025 20.07.2025 2 0 Loft Halbpension en Desktop (1257 x 602 px) frau United States of America Yes 2025-06-15T23:20:33+02:00
568 Antonella Urban Urban antonellaurban7@gmail.com 338 954 7766 10.08.2025 18.08.2025 2 0 Forsythia Übernachtung it Mobile (320 x 589 px) frau Italy Yes 2025-07-28T13:49:52+02:00
569 Lina Di Lembo linadilembo@gmail.com 3205742436 17.08.2025 23.08.2025 2 1 1 Fenice Übernachtung it Mobile (360 x 664 px) frau -- Yes 2025-07-28T12:44:59+02:00
570 Roberta Ghigi robertagh@hotmail.it 27.12.2025 02.01.2026 6 4 3,6,6,8 Fenice Halbpension it Mobile (360 x 674 px) frau -- Yes 2025-09-20T14:24:05+02:00
571 Valentina Zilli vale_zilli@hotmail.com 03.10.2025 06.10.2025 2 1 2 Bellis Übernachtung mit Frühstück it Mobile (390 x 663 px) frau -- Yes 2025-09-26T22:05:59+02:00
572 Michela Paccagnan pacca1990@gmail.com 28.12.2025 04.01.2026 2 2 4,6 Fenice Halbpension it Mobile (360 x 648 px) frau -- Yes 2025-09-26T20:56:39+02:00
573 Elena Battiloro E.battiloro1@gmail.com 05.12.2025 08.12.2025 2 3 0,1,3 Lavendula Halbpension it Mobile (414 x 714 px) frau Italy Yes 2025-09-26T17:28:57+02:00
574 Teresa Loria teresa.loria81@libero.it 3425948239 05.12.2025 08.12.2025 2 2 2,2 Lavendula Halbpension it Mobile (360 x 419 px) frau Italy Yes 2025-09-26T15:48:38+02:00
575 Wolfhard Cappel Wolfhard.Cappel@t-online.de 08.09.2025 17.09.2025 2 0 Forsythia Übernachtung mit Frühstück de Mobile (428 x 742 px) herr Germany Yes 2025-09-04T13:56:59+02:00
576 Luca Marseglia luca@marseglia.it 03.01.2026 06.01.2026 5 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung it Mobile (393 x 658 px) herr -- Yes 2025-11-01T15:25:27+01:00
577 Patrizia Pizza patripizza@gmail.com 3488747991 29.12.2025 01.01.2026 2 0 Bellis Halbpension it Mobile (392 x 739 px) frau -- Yes 2025-11-01T10:26:34+01:00

13199
leads_export.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,250 +0,0 @@
{
"timestamp": "2025-09-29T15:44:11.839852",
"client_ip": "127.0.0.1",
"headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "6920"
},
"data": {
"data": {
"formName": "Contact us",
"submissions": [
{
"label": "Angebot auswählen",
"value": "Herbstferien - Familienzeit mit Dolomitenblick"
},
{
"label": "Anreisedatum",
"value": "2025-10-31"
},
{
"label": "Abreisedatum",
"value": "2025-11-02"
},
{
"label": "Anzahl Erwachsene",
"value": "2"
},
{
"label": "Anzahl Kinder",
"value": "3"
},
{
"label": "Alter Kind 1",
"value": "3"
},
{
"label": "Alter Kind 2",
"value": "1"
},
{
"label": "Alter Kind 3",
"value": "0"
},
{
"label": "Anrede",
"value": "Frau"
},
{
"label": "Vorname",
"value": "Elena"
},
{
"label": "Nachname",
"value": "Battiloro"
},
{
"label": "Email",
"value": "e.battiloro1@gmail.com"
},
{
"label": "Phone",
"value": "+39 333 767 3262"
},
{
"label": "Einwilligung Marketing",
"value": "Non selezionato"
},
{
"label": "utm_Source",
"value": "ig"
},
{
"label": "utm_Medium",
"value": "Instagram_Stories"
},
{
"label": "utm_Campaign",
"value": "Conversions_Hotel_Bemelmans_ITA"
},
{
"label": "utm_Term",
"value": "Cold_Traffic_Conversions_Hotel_Bemelmans_ITA"
},
{
"label": "utm_Content",
"value": "Grafik_4_Spätsommer_23.08-07.09_Landingpage_ITA"
},
{
"label": "utm_term_id",
"value": "120232007764490196"
},
{
"label": "utm_content_id",
"value": "120232007764490196"
},
{
"label": "gad_source",
"value": ""
},
{
"label": "gad_campaignid",
"value": ""
},
{
"label": "gbraid",
"value": ""
},
{
"label": "gclid",
"value": ""
},
{
"label": "fbclid",
"value": "PAZXh0bgNhZW0BMABhZGlkAasmYBhk4DQBp02L46Rl1jAuccxsOaeFSv7WSFnP-MQCsOrz9yDnKRH4hwZ7GEgxF9gy0_OF_aem_qSvrs6xsBkvTaI_Y9_hfnQ"
}
],
"field:date_picker_7e65": "2025-11-02",
"field:number_7cf5": "2",
"field:utm_source": "ig",
"submissionTime": "2025-09-28T13:26:07.938Z",
"field:alter_kind_3": "3",
"field:gad_source": "",
"field:form_field_5a7b": "Non selezionato",
"field:gad_campaignid": "",
"field:utm_medium": "Instagram_Stories",
"field:utm_term_id": "120232007764490196",
"context": {
"metaSiteId": "1dea821c-8168-4736-96e4-4b92e8b364cf",
"activationId": "3fd865e1-f44a-49d2-ae29-19cf77ee488a"
},
"field:email_5139": "e.battiloro1@gmail.com",
"field:phone_4c77": "+39 333 767 3262",
"_context": {
"activation": {
"id": "3fd865e1-f44a-49d2-ae29-19cf77ee488a"
},
"configuration": {
"id": "a976f18c-fa86-495d-be1e-676df188eeae"
},
"app": {
"id": "225dd912-7dea-4738-8688-4b8c6955ffc2"
},
"action": {
"id": "152db4d7-5263-40c4-be2b-1c81476318b7"
},
"trigger": {
"key": "wix_form_app-form_submitted"
}
},
"field:gclid": "",
"formFieldMask": [
"field:angebot_auswaehlen",
"field:date_picker_a7c8",
"field:date_picker_7e65",
"field:number_7cf5",
"field:anzahl_kinder",
"field:alter_kind_3",
"field:alter_kind_25",
"field:alter_kind_4",
"field:alter_kind_5",
"field:alter_kind_6",
"field:alter_kind_7",
"field:alter_kind_8",
"field:alter_kind_9",
"field:alter_kind_10",
"field:alter_kind_11",
"field:anrede",
"field:first_name_abae",
"field:last_name_d97c",
"field:email_5139",
"field:phone_4c77",
"field:long_answer_3524",
"field:form_field_5a7b",
"field:utm_source",
"field:utm_medium",
"field:utm_campaign",
"field:utm_term",
"field:utm_content",
"field:utm_term_id",
"field:utm_content_id",
"field:gad_source",
"field:gad_campaignid",
"field:gbraid",
"field:gclid",
"field:fbclid",
"metaSiteId"
],
"field:alter_kind_4": "0",
"contact": {
"name": {
"first": "Elena",
"last": "Battiloro"
},
"email": "e.battiloro1@gmail.com",
"locale": "it-it",
"phones": [
{
"tag": "UNTAGGED",
"formattedPhone": "+39 333 767 3262",
"id": "7e5c8512-b88e-4cf0-8d0c-9ebe6b210924",
"countryCode": "IT",
"e164Phone": "+393337673262",
"primary": true,
"phone": "333 767 3262"
}
],
"contactId": "b9d47825-9f84-4ae7-873c-d169851b5888",
"emails": [
{
"id": "c5609c67-5eba-4068-ab21-8a2ab9a09a27",
"tag": "UNTAGGED",
"email": "e.battiloro1@gmail.com",
"primary": true
}
],
"updatedDate": "2025-09-28T13:26:09.916Z",
"phone": "+393337673262",
"createdDate": "2025-08-08T13:05:23.733Z"
},
"submissionId": "02fbc71c-745b-4c73-9cba-827d0958117a",
"field:anzahl_kinder": "3",
"field:alter_kind_25": "1",
"field:first_name_abae": "Elena",
"field:utm_content_id": "120232007764490196",
"field:utm_campaign": "Conversions_Hotel_Bemelmans_ITA",
"field:utm_term": "Cold_Traffic_Conversions_Hotel_Bemelmans_ITA",
"contactId": "b9d47825-9f84-4ae7-873c-d169851b5888",
"field:date_picker_a7c8": "2025-10-31",
"field:angebot_auswaehlen": "Herbstferien - Familienzeit mit Dolomitenblick",
"field:utm_content": "Grafik_4_Spätsommer_23.08-07.09_Landingpage_ITA",
"field:last_name_d97c": "Battiloro",
"submissionsLink": "https://manage.wix.app/forms/submissions/1dea821c-8168-4736-96e4-4b92e8b364cf/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F1dea821c-8168-4736-96e4-4b92e8b364cf%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
"field:gbraid": "",
"field:fbclid": "PAZXh0bgNhZW0BMABhZGlkAasmYBhk4DQBp02L46Rl1jAuccxsOaeFSv7WSFnP-MQCsOrz9yDnKRH4hwZ7GEgxF9gy0_OF_aem_qSvrs6xsBkvTaI_Y9_hfnQ",
"field:anrede": "Frau",
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
}
},
"origin_header": null,
"all_headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "6920"
}
}

View File

@@ -1,250 +0,0 @@
{
"timestamp": "2025-09-29T15:44:54.746579",
"client_ip": "127.0.0.1",
"headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "6920"
},
"data": {
"data": {
"formName": "Contact us",
"submissions": [
{
"label": "Angebot auswählen",
"value": "Herbstferien - Familienzeit mit Dolomitenblick"
},
{
"label": "Anreisedatum",
"value": "2025-10-31"
},
{
"label": "Abreisedatum",
"value": "2025-11-02"
},
{
"label": "Anzahl Erwachsene",
"value": "2"
},
{
"label": "Anzahl Kinder",
"value": "3"
},
{
"label": "Alter Kind 1",
"value": "3"
},
{
"label": "Alter Kind 2",
"value": "1"
},
{
"label": "Alter Kind 3",
"value": "0"
},
{
"label": "Anrede",
"value": "Frau"
},
{
"label": "Vorname",
"value": "Elena"
},
{
"label": "Nachname",
"value": "Battiloro"
},
{
"label": "Email",
"value": "e.battiloro1@gmail.com"
},
{
"label": "Phone",
"value": "+39 333 767 3262"
},
{
"label": "Einwilligung Marketing",
"value": "Non selezionato"
},
{
"label": "utm_Source",
"value": "ig"
},
{
"label": "utm_Medium",
"value": "Instagram_Stories"
},
{
"label": "utm_Campaign",
"value": "Conversions_Hotel_Bemelmans_ITA"
},
{
"label": "utm_Term",
"value": "Cold_Traffic_Conversions_Hotel_Bemelmans_ITA"
},
{
"label": "utm_Content",
"value": "Grafik_4_Spätsommer_23.08-07.09_Landingpage_ITA"
},
{
"label": "utm_term_id",
"value": "120232007764490196"
},
{
"label": "utm_content_id",
"value": "120232007764490196"
},
{
"label": "gad_source",
"value": ""
},
{
"label": "gad_campaignid",
"value": ""
},
{
"label": "gbraid",
"value": ""
},
{
"label": "gclid",
"value": ""
},
{
"label": "fbclid",
"value": "PAZXh0bgNhZW0BMABhZGlkAasmYBhk4DQBp02L46Rl1jAuccxsOaeFSv7WSFnP-MQCsOrz9yDnKRH4hwZ7GEgxF9gy0_OF_aem_qSvrs6xsBkvTaI_Y9_hfnQ"
}
],
"field:date_picker_7e65": "2025-11-02",
"field:number_7cf5": "2",
"field:utm_source": "ig",
"submissionTime": "2025-09-28T13:26:07.938Z",
"field:alter_kind_3": "3",
"field:gad_source": "",
"field:form_field_5a7b": "Non selezionato",
"field:gad_campaignid": "",
"field:utm_medium": "Instagram_Stories",
"field:utm_term_id": "120232007764490196",
"context": {
"metaSiteId": "1dea821c-8168-4736-96e4-4b92e8b364cf",
"activationId": "3fd865e1-f44a-49d2-ae29-19cf77ee488a"
},
"field:email_5139": "e.battiloro1@gmail.com",
"field:phone_4c77": "+39 333 767 3262",
"_context": {
"activation": {
"id": "3fd865e1-f44a-49d2-ae29-19cf77ee488a"
},
"configuration": {
"id": "a976f18c-fa86-495d-be1e-676df188eeae"
},
"app": {
"id": "225dd912-7dea-4738-8688-4b8c6955ffc2"
},
"action": {
"id": "152db4d7-5263-40c4-be2b-1c81476318b7"
},
"trigger": {
"key": "wix_form_app-form_submitted"
}
},
"field:gclid": "",
"formFieldMask": [
"field:angebot_auswaehlen",
"field:date_picker_a7c8",
"field:date_picker_7e65",
"field:number_7cf5",
"field:anzahl_kinder",
"field:alter_kind_3",
"field:alter_kind_25",
"field:alter_kind_4",
"field:alter_kind_5",
"field:alter_kind_6",
"field:alter_kind_7",
"field:alter_kind_8",
"field:alter_kind_9",
"field:alter_kind_10",
"field:alter_kind_11",
"field:anrede",
"field:first_name_abae",
"field:last_name_d97c",
"field:email_5139",
"field:phone_4c77",
"field:long_answer_3524",
"field:form_field_5a7b",
"field:utm_source",
"field:utm_medium",
"field:utm_campaign",
"field:utm_term",
"field:utm_content",
"field:utm_term_id",
"field:utm_content_id",
"field:gad_source",
"field:gad_campaignid",
"field:gbraid",
"field:gclid",
"field:fbclid",
"metaSiteId"
],
"field:alter_kind_4": "0",
"contact": {
"name": {
"first": "Elena",
"last": "Battiloro"
},
"email": "e.battiloro1@gmail.com",
"locale": "it-it",
"phones": [
{
"tag": "UNTAGGED",
"formattedPhone": "+39 333 767 3262",
"id": "7e5c8512-b88e-4cf0-8d0c-9ebe6b210924",
"countryCode": "IT",
"e164Phone": "+393337673262",
"primary": true,
"phone": "333 767 3262"
}
],
"contactId": "b9d47825-9f84-4ae7-873c-d169851b5888",
"emails": [
{
"id": "c5609c67-5eba-4068-ab21-8a2ab9a09a27",
"tag": "UNTAGGED",
"email": "e.battiloro1@gmail.com",
"primary": true
}
],
"updatedDate": "2025-09-28T13:26:09.916Z",
"phone": "+393337673262",
"createdDate": "2025-08-08T13:05:23.733Z"
},
"submissionId": "02fbc71c-745b-4c73-9cba-827d0958117a",
"field:anzahl_kinder": "3",
"field:alter_kind_25": "1",
"field:first_name_abae": "Elena",
"field:utm_content_id": "120232007764490196",
"field:utm_campaign": "Conversions_Hotel_Bemelmans_ITA",
"field:utm_term": "Cold_Traffic_Conversions_Hotel_Bemelmans_ITA",
"contactId": "b9d47825-9f84-4ae7-873c-d169851b5888",
"field:date_picker_a7c8": "2025-10-31",
"field:angebot_auswaehlen": "Herbstferien - Familienzeit mit Dolomitenblick",
"field:utm_content": "Grafik_4_Spätsommer_23.08-07.09_Landingpage_ITA",
"field:last_name_d97c": "Battiloro",
"submissionsLink": "https://manage.wix.app/forms/submissions/1dea821c-8168-4736-96e4-4b92e8b364cf/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F1dea821c-8168-4736-96e4-4b92e8b364cf%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
"field:gbraid": "",
"field:fbclid": "PAZXh0bgNhZW0BMABhZGlkAasmYBhk4DQBp02L46Rl1jAuccxsOaeFSv7WSFnP-MQCsOrz9yDnKRH4hwZ7GEgxF9gy0_OF_aem_qSvrs6xsBkvTaI_Y9_hfnQ",
"field:anrede": "Frau",
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
}
},
"origin_header": null,
"all_headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "6920"
}
}

View File

@@ -1,170 +0,0 @@
{
"timestamp": "2025-09-29T16:08:43.177480",
"client_ip": "127.0.0.1",
"headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "4518"
},
"data": {
"data": {
"formName": "Contact us",
"submissions": [
{
"label": "Anreisedatum",
"value": "2026-01-17"
},
{
"label": "Abreisedatum",
"value": "2026-01-24"
},
{
"label": "Anzahl Erwachsene",
"value": "2"
},
{
"label": "Anzahl Kinder",
"value": "0"
},
{
"label": "Anrede",
"value": "Herr"
},
{
"label": "Vorname",
"value": "Weislinger "
},
{
"label": "Nachname",
"value": "Alain "
},
{
"label": "Email",
"value": "alain-et-evelyne@hotmail.fr"
},
{
"label": "Phone",
"value": "+33 6 41 77 99 09"
},
{
"label": "Einwilligung Marketing",
"value": "Cochée"
}
],
"field:date_picker_7e65": "2026-01-24",
"field:number_7cf5": "2",
"submissionTime": "2025-09-27T19:36:39.137Z",
"field:form_field_5a7b": "Cochée",
"context": {
"metaSiteId": "7b28c2ce-1e20-4d07-9e86-73d822007e18",
"activationId": "d59c463c-96e0-4742-b4f7-70b8f0431168"
},
"field:email_5139": "alain-et-evelyne@hotmail.fr",
"field:phone_4c77": "+33 6 41 77 99 09",
"_context": {
"activation": {
"id": "d59c463c-96e0-4742-b4f7-70b8f0431168"
},
"configuration": {
"id": "483806f6-24ba-413f-9431-6b1ad9379f5c"
},
"app": {
"id": "225dd912-7dea-4738-8688-4b8c6955ffc2"
},
"action": {
"id": "a85d9873-f8ed-426a-90b0-fb64a8e50406"
},
"trigger": {
"key": "wix_form_app-form_submitted"
}
},
"formFieldMask": [
"field:angebot_auswaehlen",
"field:date_picker_a7c8",
"field:date_picker_7e65",
"field:number_7cf5",
"field:anzahl_kinder",
"field:alter_kind_3",
"field:alter_kind_25",
"field:alter_kind_4",
"field:alter_kind_5",
"field:alter_kind_6",
"field:alter_kind_7",
"field:alter_kind_8",
"field:alter_kind_9",
"field:alter_kind_10",
"field:alter_kind_11",
"field:anrede",
"field:first_name_abae",
"field:last_name_d97c",
"field:email_5139",
"field:phone_4c77",
"field:long_answer_3524",
"field:form_field_5a7b",
"field:utm_source",
"field:utm_medium",
"field:utm_campaign",
"field:utm_term",
"field:utm_content",
"field:utm_term_id",
"field:utm_content_id",
"field:gad_source",
"field:gad_campaignid",
"field:gbraid",
"field:gclid",
"field:fbclid",
"metaSiteId"
],
"contact": {
"name": {
"first": "Weislinger",
"last": "Alain"
},
"email": "alain-et-evelyne@hotmail.fr",
"locale": "de-de",
"phones": [
{
"tag": "UNTAGGED",
"formattedPhone": "+33 6 41 77 99 09",
"id": "90ffc824-1fd7-4167-b29f-24a4b62a0773",
"countryCode": "FR",
"e164Phone": "+33641779909",
"primary": true,
"phone": "6 41 77 99 09"
}
],
"contactId": "250e24db-d41e-4f6e-835d-75acdf2ef2b7",
"emails": [
{
"id": "2c071108-2410-4db8-99fa-b50b75a02493",
"tag": "UNTAGGED",
"email": "alain-et-evelyne@hotmail.fr",
"primary": true
}
],
"updatedDate": "2025-09-27T19:36:41.908Z",
"phone": "+33641779909",
"createdDate": "2025-09-27T19:36:41.054Z"
},
"submissionId": "6cfee967-69a8-454a-a10e-0aa03868ba6d",
"field:anzahl_kinder": "0",
"field:first_name_abae": "Weislinger ",
"contactId": "250e24db-d41e-4f6e-835d-75acdf2ef2b7",
"field:date_picker_a7c8": "2026-01-17",
"field:last_name_d97c": "Alain ",
"submissionsLink": "https://manage.wix.app/forms/submissions/7b28c2ce-1e20-4d07-9e86-73d822007e18/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F7b28c2ce-1e20-4d07-9e86-73d822007e18%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
"field:anrede": "Herr",
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
}
},
"origin_header": null,
"all_headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "4518"
}
}

View File

@@ -1,170 +0,0 @@
{
"timestamp": "2025-09-29T16:24:47.833595",
"client_ip": "127.0.0.1",
"headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "4518"
},
"data": {
"data": {
"formName": "Contact us",
"submissions": [
{
"label": "Anreisedatum",
"value": "2026-01-17"
},
{
"label": "Abreisedatum",
"value": "2026-01-24"
},
{
"label": "Anzahl Erwachsene",
"value": "2"
},
{
"label": "Anzahl Kinder",
"value": "0"
},
{
"label": "Anrede",
"value": "Herr"
},
{
"label": "Vorname",
"value": "Weislinger "
},
{
"label": "Nachname",
"value": "Alain "
},
{
"label": "Email",
"value": "alain-et-evelyne@hotmail.fr"
},
{
"label": "Phone",
"value": "+33 6 41 77 99 09"
},
{
"label": "Einwilligung Marketing",
"value": "Cochée"
}
],
"field:date_picker_7e65": "2026-01-24",
"field:number_7cf5": "2",
"submissionTime": "2025-09-27T19:36:39.137Z",
"field:form_field_5a7b": "Cochée",
"context": {
"metaSiteId": "7b28c2ce-1e20-4d07-9e86-73d822007e18",
"activationId": "d59c463c-96e0-4742-b4f7-70b8f0431168"
},
"field:email_5139": "alain-et-evelyne@hotmail.fr",
"field:phone_4c77": "+33 6 41 77 99 09",
"_context": {
"activation": {
"id": "d59c463c-96e0-4742-b4f7-70b8f0431168"
},
"configuration": {
"id": "483806f6-24ba-413f-9431-6b1ad9379f5c"
},
"app": {
"id": "225dd912-7dea-4738-8688-4b8c6955ffc2"
},
"action": {
"id": "a85d9873-f8ed-426a-90b0-fb64a8e50406"
},
"trigger": {
"key": "wix_form_app-form_submitted"
}
},
"formFieldMask": [
"field:angebot_auswaehlen",
"field:date_picker_a7c8",
"field:date_picker_7e65",
"field:number_7cf5",
"field:anzahl_kinder",
"field:alter_kind_3",
"field:alter_kind_25",
"field:alter_kind_4",
"field:alter_kind_5",
"field:alter_kind_6",
"field:alter_kind_7",
"field:alter_kind_8",
"field:alter_kind_9",
"field:alter_kind_10",
"field:alter_kind_11",
"field:anrede",
"field:first_name_abae",
"field:last_name_d97c",
"field:email_5139",
"field:phone_4c77",
"field:long_answer_3524",
"field:form_field_5a7b",
"field:utm_source",
"field:utm_medium",
"field:utm_campaign",
"field:utm_term",
"field:utm_content",
"field:utm_term_id",
"field:utm_content_id",
"field:gad_source",
"field:gad_campaignid",
"field:gbraid",
"field:gclid",
"field:fbclid",
"metaSiteId"
],
"contact": {
"name": {
"first": "Weislinger",
"last": "Alain"
},
"email": "alain-et-evelyne@hotmail.fr",
"locale": "de-de",
"phones": [
{
"tag": "UNTAGGED",
"formattedPhone": "+33 6 41 77 99 09",
"id": "90ffc824-1fd7-4167-b29f-24a4b62a0773",
"countryCode": "FR",
"e164Phone": "+33641779909",
"primary": true,
"phone": "6 41 77 99 09"
}
],
"contactId": "250e24db-d41e-4f6e-835d-75acdf2ef2b7",
"emails": [
{
"id": "2c071108-2410-4db8-99fa-b50b75a02493",
"tag": "UNTAGGED",
"email": "alain-et-evelyne@hotmail.fr",
"primary": true
}
],
"updatedDate": "2025-09-27T19:36:41.908Z",
"phone": "+33641779909",
"createdDate": "2025-09-27T19:36:41.054Z"
},
"submissionId": "6cfee967-69a8-454a-a10e-0aa03868ba6d",
"field:anzahl_kinder": "0",
"field:first_name_abae": "Weislinger ",
"contactId": "250e24db-d41e-4f6e-835d-75acdf2ef2b7",
"field:date_picker_a7c8": "2026-01-17",
"field:last_name_d97c": "Alain ",
"submissionsLink": "https://manage.wix.app/forms/submissions/7b28c2ce-1e20-4d07-9e86-73d822007e18/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F7b28c2ce-1e20-4d07-9e86-73d822007e18%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
"field:anrede": "Herr",
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
}
},
"origin_header": null,
"all_headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "4518"
}
}

View File

@@ -1,170 +0,0 @@
{
"timestamp": "2025-09-29T16:32:12.776585",
"client_ip": "127.0.0.1",
"headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "4518"
},
"data": {
"data": {
"formName": "Contact us",
"submissions": [
{
"label": "Anreisedatum",
"value": "2026-01-17"
},
{
"label": "Abreisedatum",
"value": "2026-01-24"
},
{
"label": "Anzahl Erwachsene",
"value": "2"
},
{
"label": "Anzahl Kinder",
"value": "0"
},
{
"label": "Anrede",
"value": "Herr"
},
{
"label": "Vorname",
"value": "Weislinger "
},
{
"label": "Nachname",
"value": "Alain "
},
{
"label": "Email",
"value": "alain-et-evelyne@hotmail.fr"
},
{
"label": "Phone",
"value": "+33 6 41 77 99 09"
},
{
"label": "Einwilligung Marketing",
"value": "Cochée"
}
],
"field:date_picker_7e65": "2026-01-24",
"field:number_7cf5": "2",
"submissionTime": "2025-09-27T19:36:39.137Z",
"field:form_field_5a7b": "Cochée",
"context": {
"metaSiteId": "7b28c2ce-1e20-4d07-9e86-73d822007e18",
"activationId": "d59c463c-96e0-4742-b4f7-70b8f0431168"
},
"field:email_5139": "alain-et-evelyne@hotmail.fr",
"field:phone_4c77": "+33 6 41 77 99 09",
"_context": {
"activation": {
"id": "d59c463c-96e0-4742-b4f7-70b8f0431168"
},
"configuration": {
"id": "483806f6-24ba-413f-9431-6b1ad9379f5c"
},
"app": {
"id": "225dd912-7dea-4738-8688-4b8c6955ffc2"
},
"action": {
"id": "a85d9873-f8ed-426a-90b0-fb64a8e50406"
},
"trigger": {
"key": "wix_form_app-form_submitted"
}
},
"formFieldMask": [
"field:angebot_auswaehlen",
"field:date_picker_a7c8",
"field:date_picker_7e65",
"field:number_7cf5",
"field:anzahl_kinder",
"field:alter_kind_3",
"field:alter_kind_25",
"field:alter_kind_4",
"field:alter_kind_5",
"field:alter_kind_6",
"field:alter_kind_7",
"field:alter_kind_8",
"field:alter_kind_9",
"field:alter_kind_10",
"field:alter_kind_11",
"field:anrede",
"field:first_name_abae",
"field:last_name_d97c",
"field:email_5139",
"field:phone_4c77",
"field:long_answer_3524",
"field:form_field_5a7b",
"field:utm_source",
"field:utm_medium",
"field:utm_campaign",
"field:utm_term",
"field:utm_content",
"field:utm_term_id",
"field:utm_content_id",
"field:gad_source",
"field:gad_campaignid",
"field:gbraid",
"field:gclid",
"field:fbclid",
"metaSiteId"
],
"contact": {
"name": {
"first": "Weislinger",
"last": "Alain"
},
"email": "alain-et-evelyne@hotmail.fr",
"locale": "de-de",
"phones": [
{
"tag": "UNTAGGED",
"formattedPhone": "+33 6 41 77 99 09",
"id": "90ffc824-1fd7-4167-b29f-24a4b62a0773",
"countryCode": "FR",
"e164Phone": "+33641779909",
"primary": true,
"phone": "6 41 77 99 09"
}
],
"contactId": "250e24db-d41e-4f6e-835d-75acdf2ef2b7",
"emails": [
{
"id": "2c071108-2410-4db8-99fa-b50b75a02493",
"tag": "UNTAGGED",
"email": "alain-et-evelyne@hotmail.fr",
"primary": true
}
],
"updatedDate": "2025-09-27T19:36:41.908Z",
"phone": "+33641779909",
"createdDate": "2025-09-27T19:36:41.054Z"
},
"submissionId": "6cfee967-69a8-454a-a10e-0aa03868ba6d",
"field:anzahl_kinder": "0",
"field:first_name_abae": "Weislinger ",
"contactId": "250e24db-d41e-4f6e-835d-75acdf2ef2b7",
"field:date_picker_a7c8": "2026-01-17",
"field:last_name_d97c": "Alain ",
"submissionsLink": "https://manage.wix.app/forms/submissions/7b28c2ce-1e20-4d07-9e86-73d822007e18/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F7b28c2ce-1e20-4d07-9e86-73d822007e18%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
"field:anrede": "Herr",
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
}
},
"origin_header": null,
"all_headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "4518"
}
}

View File

@@ -1,240 +0,0 @@
{
"timestamp": "2025-09-29T16:34:49.785457",
"client_ip": "127.0.0.1",
"headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "6638"
},
"data": {
"data": {
"formName": "Contact us",
"submissions": [
{
"label": "Angebot auswählen",
"value": "Zimmer: Doppelzimmer"
},
{
"label": "Anreisedatum",
"value": "2025-10-03"
},
{
"label": "Abreisedatum",
"value": "2025-10-05"
},
{
"label": "Anzahl Erwachsene",
"value": "2"
},
{
"label": "Anzahl Kinder",
"value": "1"
},
{
"label": "Alter Kind 1",
"value": "3"
},
{
"label": "Anrede",
"value": "Familie"
},
{
"label": "Vorname",
"value": "Miriana"
},
{
"label": "Nachname",
"value": "Darman"
},
{
"label": "Email",
"value": "miriana.m9@gmail.com"
},
{
"label": "Phone",
"value": "+39 348 443 0969"
},
{
"label": "Einwilligung Marketing",
"value": "Non selezionato"
},
{
"label": "utm_Source",
"value": "ig"
},
{
"label": "utm_Medium",
"value": "Instagram_Stories"
},
{
"label": "utm_Campaign",
"value": "Conversions_Hotel_Bemelmans_ITA"
},
{
"label": "utm_Term",
"value": "Cold_Traffic_Conversions_Hotel_Bemelmans_ITA"
},
{
"label": "utm_Content",
"value": "Grafik_4_Spätsommer_23.08-07.09_Landingpage_ITA"
},
{
"label": "utm_term_id",
"value": "120232007764490196"
},
{
"label": "utm_content_id",
"value": "120232007764490196"
},
{
"label": "gad_source",
"value": ""
},
{
"label": "gad_campaignid",
"value": ""
},
{
"label": "gbraid",
"value": ""
},
{
"label": "gclid",
"value": ""
},
{
"label": "fbclid",
"value": "PAZXh0bgNhZW0BMABhZGlkAasmYBTNE3QBp1jWuJ9zIpfEGRJMP63fMAMI405yvG5EtH-OT0PxSkAbBJaudFHR6cMtkdHu_aem_fopaFtECyVPNW9fmWfEkyA"
}
],
"field:date_picker_7e65": "2025-10-05",
"field:number_7cf5": "2",
"field:utm_source": "ig",
"submissionTime": "2025-09-27T07:04:55.843Z",
"field:alter_kind_3": "3",
"field:gad_source": "",
"field:form_field_5a7b": "Non selezionato",
"field:gad_campaignid": "",
"field:utm_medium": "Instagram_Stories",
"field:utm_term_id": "120232007764490196",
"context": {
"metaSiteId": "1dea821c-8168-4736-96e4-4b92e8b364cf",
"activationId": "d41b7796-dca2-40f1-8245-c2f26a096f19"
},
"field:email_5139": "miriana.m9@gmail.com",
"field:phone_4c77": "+39 348 443 0969",
"_context": {
"activation": {
"id": "d41b7796-dca2-40f1-8245-c2f26a096f19"
},
"configuration": {
"id": "a976f18c-fa86-495d-be1e-676df188eeae"
},
"app": {
"id": "225dd912-7dea-4738-8688-4b8c6955ffc2"
},
"action": {
"id": "152db4d7-5263-40c4-be2b-1c81476318b7"
},
"trigger": {
"key": "wix_form_app-form_submitted"
}
},
"field:gclid": "",
"formFieldMask": [
"field:angebot_auswaehlen",
"field:date_picker_a7c8",
"field:date_picker_7e65",
"field:number_7cf5",
"field:anzahl_kinder",
"field:alter_kind_3",
"field:alter_kind_25",
"field:alter_kind_4",
"field:alter_kind_5",
"field:alter_kind_6",
"field:alter_kind_7",
"field:alter_kind_8",
"field:alter_kind_9",
"field:alter_kind_10",
"field:alter_kind_11",
"field:anrede",
"field:first_name_abae",
"field:last_name_d97c",
"field:email_5139",
"field:phone_4c77",
"field:long_answer_3524",
"field:form_field_5a7b",
"field:utm_source",
"field:utm_medium",
"field:utm_campaign",
"field:utm_term",
"field:utm_content",
"field:utm_term_id",
"field:utm_content_id",
"field:gad_source",
"field:gad_campaignid",
"field:gbraid",
"field:gclid",
"field:fbclid",
"metaSiteId"
],
"contact": {
"name": {
"first": "Miriana",
"last": "Darman"
},
"email": "miriana.m9@gmail.com",
"locale": "it-it",
"phones": [
{
"tag": "UNTAGGED",
"formattedPhone": "+39 348 443 0969",
"id": "ac9d623e-6aaa-4022-856a-0dd64d0ff3fb",
"countryCode": "IT",
"e164Phone": "+393484430969",
"primary": true,
"phone": "348 443 0969"
}
],
"contactId": "bcc29403-82ac-445a-be52-90a67180f16f",
"emails": [
{
"id": "448de804-7353-46ed-9ae3-9c13ca521917",
"tag": "UNTAGGED",
"email": "miriana.m9@gmail.com",
"primary": true
}
],
"updatedDate": "2025-09-27T07:04:58.724Z",
"phone": "+393484430969",
"createdDate": "2025-09-27T07:04:57.752Z"
},
"submissionId": "3150614e-1b0a-47ba-a774-b0a0c71d8110",
"field:anzahl_kinder": "1",
"field:first_name_abae": "Miriana",
"field:utm_content_id": "120232007764490196",
"field:utm_campaign": "Conversions_Hotel_Bemelmans_ITA",
"field:utm_term": "Cold_Traffic_Conversions_Hotel_Bemelmans_ITA",
"contactId": "bcc29403-82ac-445a-be52-90a67180f16f",
"field:date_picker_a7c8": "2025-10-03",
"field:angebot_auswaehlen": "Zimmer: Doppelzimmer",
"field:utm_content": "Grafik_4_Spätsommer_23.08-07.09_Landingpage_ITA",
"field:last_name_d97c": "Darman",
"submissionsLink": "https://manage.wix.app/forms/submissions/1dea821c-8168-4736-96e4-4b92e8b364cf/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F1dea821c-8168-4736-96e4-4b92e8b364cf%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
"field:gbraid": "",
"field:fbclid": "PAZXh0bgNhZW0BMABhZGlkAasmYBTNE3QBp1jWuJ9zIpfEGRJMP63fMAMI405yvG5EtH-OT0PxSkAbBJaudFHR6cMtkdHu_aem_fopaFtECyVPNW9fmWfEkyA",
"field:anrede": "Familie",
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
}
},
"origin_header": null,
"all_headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "6638"
}
}

View File

@@ -1,262 +0,0 @@
{
"timestamp": "2025-10-06T10:46:42.527300",
"client_ip": "127.0.0.1",
"headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "7499"
},
"data": {
"data": {
"formName": "Contact us",
"submissions": [
{
"label": "Angebot auswählen",
"value": "Zimmer: Doppelzimmer"
},
{
"label": "Anreisedatum",
"value": "2025-12-21"
},
{
"label": "Abreisedatum",
"value": "2025-10-28"
},
{
"label": "Anzahl Erwachsene",
"value": "2"
},
{
"label": "Anzahl Kinder",
"value": "0"
},
{
"label": "Anrede",
"value": "Herr"
},
{
"label": "Vorname",
"value": "Ernst-Dieter"
},
{
"label": "Nachname",
"value": "Koepper"
},
{
"label": "Email",
"value": "koepper-ed@t-online.de"
},
{
"label": "Phone",
"value": "+49 175 8555456"
},
{
"label": "Message",
"value": "Guten Morgen,\nwir sind nicht gebau an die Reisedaten gebunden: Anreise ist möglich ab 20. Dezember, Aufenthalt mindestens eine Woche, gern auch 8 oder 9 Tage. Natürlich mit Halbpension. Mit freundlichem Gruß D. Köpper"
},
{
"label": "Einwilligung Marketing",
"value": "Angekreuzt"
},
{
"label": "utm_Source",
"value": ""
},
{
"label": "utm_Medium",
"value": ""
},
{
"label": "utm_Campaign",
"value": ""
},
{
"label": "utm_Term",
"value": ""
},
{
"label": "utm_Content",
"value": ""
},
{
"label": "utm_term_id",
"value": ""
},
{
"label": "utm_content_id",
"value": ""
},
{
"label": "gad_source",
"value": "5"
},
{
"label": "gad_campaignid",
"value": "23065043477"
},
{
"label": "gbraid",
"value": ""
},
{
"label": "gclid",
"value": "EAIaIQobChMI-d7Bn_-OkAMVuZJQBh09uD0vEAAYASAAEgKR8_D_BwE"
},
{
"label": "fbclid",
"value": ""
},
{
"label": "hotelid",
"value": "12345"
},
{
"label": "hotelname",
"value": "Bemelmans Post"
}
],
"field:date_picker_7e65": "2025-10-28",
"field:number_7cf5": "2",
"field:utm_source": "",
"submissionTime": "2025-10-06T07:05:34.001Z",
"field:gad_source": "5",
"field:form_field_5a7b": "Angekreuzt",
"field:gad_campaignid": "23065043477",
"field:utm_medium": "",
"field:utm_term_id": "",
"context": {
"metaSiteId": "1dea821c-8168-4736-96e4-4b92e8b364cf",
"activationId": "fd8e9c90-0335-4fd2-976d-985f065f3f80"
},
"field:email_5139": "koepper-ed@t-online.de",
"field:phone_4c77": "+49 175 8555456",
"_context": {
"activation": {
"id": "fd8e9c90-0335-4fd2-976d-985f065f3f80"
},
"configuration": {
"id": "a976f18c-fa86-495d-be1e-676df188eeae"
},
"app": {
"id": "225dd912-7dea-4738-8688-4b8c6955ffc2"
},
"action": {
"id": "152db4d7-5263-40c4-be2b-1c81476318b7"
},
"trigger": {
"key": "wix_form_app-form_submitted"
}
},
"field:gclid": "EAIaIQobChMI-d7Bn_-OkAMVuZJQBh09uD0vEAAYASAAEgKR8_D_BwE",
"formFieldMask": [
"field:",
"field:",
"field:angebot_auswaehlen",
"field:date_picker_a7c8",
"field:date_picker_7e65",
"field:",
"field:number_7cf5",
"field:anzahl_kinder",
"field:alter_kind_3",
"field:alter_kind_25",
"field:alter_kind_4",
"field:alter_kind_5",
"field:alter_kind_6",
"field:alter_kind_7",
"field:alter_kind_8",
"field:alter_kind_9",
"field:alter_kind_10",
"field:alter_kind_11",
"field:",
"field:anrede",
"field:first_name_abae",
"field:last_name_d97c",
"field:email_5139",
"field:phone_4c77",
"field:long_answer_3524",
"field:form_field_5a7b",
"field:",
"field:utm_source",
"field:utm_medium",
"field:utm_campaign",
"field:utm_term",
"field:utm_content",
"field:utm_term_id",
"field:utm_content_id",
"field:gad_source",
"field:gad_campaignid",
"field:gbraid",
"field:gclid",
"field:fbclid",
"field:hotelid",
"field:hotelname",
"field:",
"metaSiteId"
],
"contact": {
"name": {
"first": "Ernst-Dieter",
"last": "Koepper"
},
"email": "koepper-ed@t-online.de",
"locale": "de-de",
"phones": [
{
"tag": "UNTAGGED",
"formattedPhone": "+49 175 8555456",
"id": "530a3bf4-6dbe-4611-8963-a50df805785d",
"countryCode": "DE",
"e164Phone": "+491758555456",
"primary": true,
"phone": "175 8555456"
}
],
"contactId": "13659da8-4035-47fe-a66b-6ce461ad290f",
"emails": [
{
"id": "e1d2168e-ca3c-4844-8f93-f2e1b0ae70e3",
"tag": "UNTAGGED",
"email": "koepper-ed@t-online.de",
"primary": true
}
],
"updatedDate": "2025-10-06T07:05:35.675Z",
"phone": "+491758555456",
"createdDate": "2025-10-06T07:05:35.675Z"
},
"submissionId": "86d247dc-9d5a-4eb7-87a7-677bf64645ad",
"field:anzahl_kinder": "0",
"field:first_name_abae": "Ernst-Dieter",
"field:utm_content_id": "",
"field:utm_campaign": "",
"field:utm_term": "",
"contactId": "13659da8-4035-47fe-a66b-6ce461ad290f",
"field:date_picker_a7c8": "2025-12-21",
"field:hotelname": "Bemelmans Post",
"field:angebot_auswaehlen": "Zimmer: Doppelzimmer",
"field:utm_content": "",
"field:last_name_d97c": "Koepper",
"field:hotelid": "12345",
"submissionsLink": "https://manage.wix.app/forms/submissions/1dea821c-8168-4736-96e4-4b92e8b364cf/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F1dea821c-8168-4736-96e4-4b92e8b364cf%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
"field:gbraid": "",
"field:fbclid": "",
"submissionPdf": {
"fileName": "86d247dc-9d5a-4eb7-87a7-677bf64645ad.pdf",
"downloadUrl": "https://manage.wix.com/_api/form-submission-service/v4/submissions/86d247dc-9d5a-4eb7-87a7-677bf64645ad/download?accessToken=JWS.eyJraWQiOiJWLVNuLWhwZSIsImFsZyI6IkhTMjU2In0.eyJkYXRhIjoie1wibWV0YVNpdGVJZFwiOlwiMWRlYTgyMWMtODE2OC00NzM2LTk2ZTQtNGI5MmU4YjM2NGNmXCJ9IiwiaWF0IjoxNzU5NzM0MzM1LCJleHAiOjE3NTk3MzQ5MzV9.9koy-O_ptm0dRspjh01Yefkt2rCHiUlRCFtE_S3auYw"
},
"field:anrede": "Herr",
"field:long_answer_3524": "Guten Morgen,\nwir sind nicht gebau an die Reisedaten gebunden: Anreise ist möglich ab 20. Dezember, Aufenthalt mindestens eine Woche, gern auch 8 oder 9 Tage. Natürlich mit Halbpension. Mit freundlichem Gruß D. Köpper",
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
}
},
"origin_header": null,
"all_headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "7499"
}
}

View File

@@ -1,262 +0,0 @@
{
"timestamp": "2025-10-06T10:57:32.973217",
"client_ip": "127.0.0.1",
"headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "7499"
},
"data": {
"data": {
"formName": "Contact us",
"submissions": [
{
"label": "Angebot auswählen",
"value": "Zimmer: Doppelzimmer"
},
{
"label": "Anreisedatum",
"value": "2025-12-21"
},
{
"label": "Abreisedatum",
"value": "2025-10-28"
},
{
"label": "Anzahl Erwachsene",
"value": "2"
},
{
"label": "Anzahl Kinder",
"value": "0"
},
{
"label": "Anrede",
"value": "Herr"
},
{
"label": "Vorname",
"value": "Ernst-Dieter"
},
{
"label": "Nachname",
"value": "Koepper"
},
{
"label": "Email",
"value": "koepper-ed@t-online.de"
},
{
"label": "Phone",
"value": "+49 175 8555456"
},
{
"label": "Message",
"value": "Guten Morgen,\nwir sind nicht gebau an die Reisedaten gebunden: Anreise ist möglich ab 20. Dezember, Aufenthalt mindestens eine Woche, gern auch 8 oder 9 Tage. Natürlich mit Halbpension. Mit freundlichem Gruß D. Köpper"
},
{
"label": "Einwilligung Marketing",
"value": "Angekreuzt"
},
{
"label": "utm_Source",
"value": ""
},
{
"label": "utm_Medium",
"value": ""
},
{
"label": "utm_Campaign",
"value": ""
},
{
"label": "utm_Term",
"value": ""
},
{
"label": "utm_Content",
"value": ""
},
{
"label": "utm_term_id",
"value": ""
},
{
"label": "utm_content_id",
"value": ""
},
{
"label": "gad_source",
"value": "5"
},
{
"label": "gad_campaignid",
"value": "23065043477"
},
{
"label": "gbraid",
"value": ""
},
{
"label": "gclid",
"value": "EAIaIQobChMI-d7Bn_-OkAMVuZJQBh09uD0vEAAYASAAEgKR8_D_BwE"
},
{
"label": "fbclid",
"value": ""
},
{
"label": "hotelid",
"value": "12345"
},
{
"label": "hotelname",
"value": "Bemelmans Post"
}
],
"field:date_picker_7e65": "2025-10-28",
"field:number_7cf5": "2",
"field:utm_source": "",
"submissionTime": "2025-10-06T07:05:34.001Z",
"field:gad_source": "5",
"field:form_field_5a7b": "Angekreuzt",
"field:gad_campaignid": "23065043477",
"field:utm_medium": "",
"field:utm_term_id": "",
"context": {
"metaSiteId": "1dea821c-8168-4736-96e4-4b92e8b364cf",
"activationId": "fd8e9c90-0335-4fd2-976d-985f065f3f80"
},
"field:email_5139": "koepper-ed@t-online.de",
"field:phone_4c77": "+49 175 8555456",
"_context": {
"activation": {
"id": "fd8e9c90-0335-4fd2-976d-985f065f3f80"
},
"configuration": {
"id": "a976f18c-fa86-495d-be1e-676df188eeae"
},
"app": {
"id": "225dd912-7dea-4738-8688-4b8c6955ffc2"
},
"action": {
"id": "152db4d7-5263-40c4-be2b-1c81476318b7"
},
"trigger": {
"key": "wix_form_app-form_submitted"
}
},
"field:gclid": "EAIaIQobChMI-d7Bn_-OkAMVuZJQBh09uD0vEAAYASAAEgKR8_D_BwE",
"formFieldMask": [
"field:",
"field:",
"field:angebot_auswaehlen",
"field:date_picker_a7c8",
"field:date_picker_7e65",
"field:",
"field:number_7cf5",
"field:anzahl_kinder",
"field:alter_kind_3",
"field:alter_kind_25",
"field:alter_kind_4",
"field:alter_kind_5",
"field:alter_kind_6",
"field:alter_kind_7",
"field:alter_kind_8",
"field:alter_kind_9",
"field:alter_kind_10",
"field:alter_kind_11",
"field:",
"field:anrede",
"field:first_name_abae",
"field:last_name_d97c",
"field:email_5139",
"field:phone_4c77",
"field:long_answer_3524",
"field:form_field_5a7b",
"field:",
"field:utm_source",
"field:utm_medium",
"field:utm_campaign",
"field:utm_term",
"field:utm_content",
"field:utm_term_id",
"field:utm_content_id",
"field:gad_source",
"field:gad_campaignid",
"field:gbraid",
"field:gclid",
"field:fbclid",
"field:hotelid",
"field:hotelname",
"field:",
"metaSiteId"
],
"contact": {
"name": {
"first": "Ernst-Dieter",
"last": "Koepper"
},
"email": "koepper-ed@t-online.de",
"locale": "de-de",
"phones": [
{
"tag": "UNTAGGED",
"formattedPhone": "+49 175 8555456",
"id": "530a3bf4-6dbe-4611-8963-a50df805785d",
"countryCode": "DE",
"e164Phone": "+491758555456",
"primary": true,
"phone": "175 8555456"
}
],
"contactId": "13659da8-4035-47fe-a66b-6ce461ad290f",
"emails": [
{
"id": "e1d2168e-ca3c-4844-8f93-f2e1b0ae70e3",
"tag": "UNTAGGED",
"email": "koepper-ed@t-online.de",
"primary": true
}
],
"updatedDate": "2025-10-06T07:05:35.675Z",
"phone": "+491758555456",
"createdDate": "2025-10-06T07:05:35.675Z"
},
"submissionId": "86d247dc-9d5a-4eb7-87a7-677bf64645ad",
"field:anzahl_kinder": "0",
"field:first_name_abae": "Ernst-Dieter",
"field:utm_content_id": "",
"field:utm_campaign": "",
"field:utm_term": "",
"contactId": "13659da8-4035-47fe-a66b-6ce461ad290f",
"field:date_picker_a7c8": "2025-12-21",
"field:hotelname": "Bemelmans Post",
"field:angebot_auswaehlen": "Zimmer: Doppelzimmer",
"field:utm_content": "",
"field:last_name_d97c": "Koepper",
"field:hotelid": "12345",
"submissionsLink": "https://manage.wix.app/forms/submissions/1dea821c-8168-4736-96e4-4b92e8b364cf/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F1dea821c-8168-4736-96e4-4b92e8b364cf%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
"field:gbraid": "",
"field:fbclid": "",
"submissionPdf": {
"fileName": "86d247dc-9d5a-4eb7-87a7-677bf64645ad.pdf",
"downloadUrl": "https://manage.wix.com/_api/form-submission-service/v4/submissions/86d247dc-9d5a-4eb7-87a7-677bf64645ad/download?accessToken=JWS.eyJraWQiOiJWLVNuLWhwZSIsImFsZyI6IkhTMjU2In0.eyJkYXRhIjoie1wibWV0YVNpdGVJZFwiOlwiMWRlYTgyMWMtODE2OC00NzM2LTk2ZTQtNGI5MmU4YjM2NGNmXCJ9IiwiaWF0IjoxNzU5NzM0MzM1LCJleHAiOjE3NTk3MzQ5MzV9.9koy-O_ptm0dRspjh01Yefkt2rCHiUlRCFtE_S3auYw"
},
"field:anrede": "Herr",
"field:long_answer_3524": "Guten Morgen,\nwir sind nicht gebau an die Reisedaten gebunden: Anreise ist möglich ab 20. Dezember, Aufenthalt mindestens eine Woche, gern auch 8 oder 9 Tage. Natürlich mit Halbpension. Mit freundlichem Gruß D. Köpper",
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
}
},
"origin_header": null,
"all_headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "7499"
}
}

View File

@@ -1,262 +0,0 @@
{
"timestamp": "2025-10-06T15:43:06.732884",
"client_ip": "127.0.0.1",
"headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "7081"
},
"data": {
"data": {
"formName": "Contact us",
"submissions": [
{
"label": "Angebot auswählen",
"value": "Zimmer: Doppelzimmer"
},
{
"label": "Anreisedatum",
"value": "2025-10-21"
},
{
"label": "Abreisedatum",
"value": "2025-12-28"
},
{
"label": "Anzahl Erwachsene",
"value": "4"
},
{
"label": "Anzahl Kinder",
"value": "0"
},
{
"label": "Anrede",
"value": "Herr"
},
{
"label": "Vorname",
"value": "Jonas"
},
{
"label": "Nachname",
"value": "Linter"
},
{
"label": "Email",
"value": "jonas@vaius.ai"
},
{
"label": "Phone",
"value": "+39 392 007 6982"
},
{
"label": "Message",
"value": "Hallo nachricht in der Kommentarsection"
},
{
"label": "Einwilligung Marketing",
"value": "Angekreuzt"
},
{
"label": "utm_Source",
"value": ""
},
{
"label": "utm_Medium",
"value": ""
},
{
"label": "utm_Campaign",
"value": ""
},
{
"label": "utm_Term",
"value": ""
},
{
"label": "utm_Content",
"value": ""
},
{
"label": "utm_term_id",
"value": ""
},
{
"label": "utm_content_id",
"value": ""
},
{
"label": "gad_source",
"value": "5"
},
{
"label": "gad_campaignid",
"value": "23065043477"
},
{
"label": "gbraid",
"value": ""
},
{
"label": "gclid",
"value": "EAIaIQobChMI-d7Bn_-OkAMVuZJQBh09uD0vEAAYASAAEgKR8_D_BwE"
},
{
"label": "fbclid",
"value": ""
},
{
"label": "hotelid",
"value": "12345"
},
{
"label": "hotelname",
"value": "Bemelmans Post"
}
],
"field:date_picker_7e65": "2025-10-28",
"field:number_7cf5": "2",
"field:utm_source": "",
"submissionTime": "2025-10-06T07:05:34.001Z",
"field:gad_source": "5",
"field:form_field_5a7b": "Angekreuzt",
"field:gad_campaignid": "23065043477",
"field:utm_medium": "",
"field:utm_term_id": "",
"context": {
"metaSiteId": "1dea821c-8168-4736-96e4-4b92e8b364cf",
"activationId": "fd8e9c90-0335-4fd2-976d-985f065f3f80"
},
"field:email_5139": "jonas@vaius.ai",
"field:phone_4c77": "+39 392 007 6982",
"_context": {
"activation": {
"id": "fd8e9c90-0335-4fd2-976d-985f065f3f80"
},
"configuration": {
"id": "a976f18c-fa86-495d-be1e-676df188eeae"
},
"app": {
"id": "225dd912-7dea-4738-8688-4b8c6955ffc2"
},
"action": {
"id": "152db4d7-5263-40c4-be2b-1c81476318b7"
},
"trigger": {
"key": "wix_form_app-form_submitted"
}
},
"field:gclid": "EAIaIQobChMI-d7Bn_-OkAMVuZJQBh09uD0vEAAYASAAEgKR8_D_BwE",
"formFieldMask": [
"field:",
"field:",
"field:angebot_auswaehlen",
"field:date_picker_a7c8",
"field:date_picker_7e65",
"field:",
"field:number_7cf5",
"field:anzahl_kinder",
"field:alter_kind_3",
"field:alter_kind_25",
"field:alter_kind_4",
"field:alter_kind_5",
"field:alter_kind_6",
"field:alter_kind_7",
"field:alter_kind_8",
"field:alter_kind_9",
"field:alter_kind_10",
"field:alter_kind_11",
"field:",
"field:anrede",
"field:first_name_abae",
"field:last_name_d97c",
"field:email_5139",
"field:phone_4c77",
"field:long_answer_3524",
"field:form_field_5a7b",
"field:",
"field:utm_source",
"field:utm_medium",
"field:utm_campaign",
"field:utm_term",
"field:utm_content",
"field:utm_term_id",
"field:utm_content_id",
"field:gad_source",
"field:gad_campaignid",
"field:gbraid",
"field:gclid",
"field:fbclid",
"field:hotelid",
"field:hotelname",
"field:",
"metaSiteId"
],
"contact": {
"name": {
"first": "Jonas",
"last": "Linter"
},
"email": "jonas@vaius.ai",
"locale": "de-de",
"phones": [
{
"tag": "UNTAGGED",
"formattedPhone": "+39 392 007 6982",
"id": "530a3bf4-6dbe-4611-8963-a50df805785d",
"countryCode": "DE",
"e164Phone": "+493920076982",
"primary": true,
"phone": "392 0076982"
}
],
"contactId": "66659da8-4035-47fe-a66b-6ce461ad290f",
"emails": [
{
"id": "e1d2168e-ca3c-4844-8f93-f2e1b0ae70e3",
"tag": "UNTAGGED",
"email": "koepper-ed@t-online.de",
"primary": true
}
],
"updatedDate": "2025-10-06T07:05:35.675Z",
"phone": "+491758555456",
"createdDate": "2025-10-06T07:05:35.675Z"
},
"submissionId": "666247dc-9d5a-4eb7-87a7-677bf64645ad",
"field:anzahl_kinder": "0",
"field:first_name_abae": "Ernst-Dieter",
"field:utm_content_id": "",
"field:utm_campaign": "",
"field:utm_term": "",
"contactId": "66659da8-4035-47fe-a66b-6ce461ad290f",
"field:date_picker_a7c8": "2025-12-21",
"field:hotelname": "Testhotel",
"field:angebot_auswaehlen": "Zimmer: Doppelzimmer",
"field:utm_content": "",
"field:last_name_d97c": "Linter",
"field:hotelid": "135",
"submissionsLink": "https://manage.wix.app/forms/submissions/1dea821c-8168-4736-96e4-4b92e8b364cf/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F1dea821c-8168-4736-96e4-4b92e8b364cf%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
"field:gbraid": "",
"field:fbclid": "",
"submissionPdf": {
"fileName": "86d247dc-9d5a-4eb7-87a7-677bf64645ad.pdf",
"downloadUrl": "https://manage.wix.com/_api/form-submission-service/v4/submissions/86d247dc-9d5a-4eb7-87a7-677bf64645ad/download?accessToken=JWS.eyJraWQiOiJWLVNuLWhwZSIsImFsZyI6IkhTMjU2In0.eyJkYXRhIjoie1wibWV0YVNpdGVJZFwiOlwiMWRlYTgyMWMtODE2OC00NzM2LTk2ZTQtNGI5MmU4YjM2NGNmXCJ9IiwiaWF0IjoxNzU5NzM0MzM1LCJleHAiOjE3NTk3MzQ5MzV9.9koy-O_ptm0dRspjh01Yefkt2rCHiUlRCFtE_S3auYw"
},
"field:anrede": "Herr",
"field:long_answer_3524": "Kommentarsektion vermutlich",
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
}
},
"origin_header": null,
"all_headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "7081"
}
}

View File

@@ -1,262 +0,0 @@
{
"timestamp": "2025-10-06T15:44:35.341703",
"client_ip": "127.0.0.1",
"headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "7081"
},
"data": {
"data": {
"formName": "Contact us",
"submissions": [
{
"label": "Angebot auswählen",
"value": "Zimmer: Doppelzimmer"
},
{
"label": "Anreisedatum",
"value": "2025-10-21"
},
{
"label": "Abreisedatum",
"value": "2025-12-28"
},
{
"label": "Anzahl Erwachsene",
"value": "4"
},
{
"label": "Anzahl Kinder",
"value": "0"
},
{
"label": "Anrede",
"value": "Herr"
},
{
"label": "Vorname",
"value": "Jonas"
},
{
"label": "Nachname",
"value": "Linter"
},
{
"label": "Email",
"value": "jonas@vaius.ai"
},
{
"label": "Phone",
"value": "+39 392 007 6982"
},
{
"label": "Message",
"value": "Hallo nachricht in der Kommentarsection"
},
{
"label": "Einwilligung Marketing",
"value": "Angekreuzt"
},
{
"label": "utm_Source",
"value": ""
},
{
"label": "utm_Medium",
"value": ""
},
{
"label": "utm_Campaign",
"value": ""
},
{
"label": "utm_Term",
"value": ""
},
{
"label": "utm_Content",
"value": ""
},
{
"label": "utm_term_id",
"value": ""
},
{
"label": "utm_content_id",
"value": ""
},
{
"label": "gad_source",
"value": "5"
},
{
"label": "gad_campaignid",
"value": "23065043477"
},
{
"label": "gbraid",
"value": ""
},
{
"label": "gclid",
"value": "EAIaIQobChMI-d7Bn_-OkAMVuZJQBh09uD0vEAAYASAAEgKR8_D_BwE"
},
{
"label": "fbclid",
"value": ""
},
{
"label": "hotelid",
"value": "12345"
},
{
"label": "hotelname",
"value": "Bemelmans Post"
}
],
"field:date_picker_7e65": "2025-10-28",
"field:number_7cf5": "2",
"field:utm_source": "",
"submissionTime": "2025-10-06T07:05:34.001Z",
"field:gad_source": "5",
"field:form_field_5a7b": "Angekreuzt",
"field:gad_campaignid": "23065043477",
"field:utm_medium": "",
"field:utm_term_id": "",
"context": {
"metaSiteId": "1dea821c-8168-4736-96e4-4b92e8b364cf",
"activationId": "fd8e9c90-0335-4fd2-976d-985f065f3f80"
},
"field:email_5139": "jonas@vaius.ai",
"field:phone_4c77": "+39 392 007 6982",
"_context": {
"activation": {
"id": "fd8e9c90-0335-4fd2-976d-985f065f3f80"
},
"configuration": {
"id": "a976f18c-fa86-495d-be1e-676df188eeae"
},
"app": {
"id": "225dd912-7dea-4738-8688-4b8c6955ffc2"
},
"action": {
"id": "152db4d7-5263-40c4-be2b-1c81476318b7"
},
"trigger": {
"key": "wix_form_app-form_submitted"
}
},
"field:gclid": "EAIaIQobChMI-d7Bn_-OkAMVuZJQBh09uD0vEAAYASAAEgKR8_D_BwE",
"formFieldMask": [
"field:",
"field:",
"field:angebot_auswaehlen",
"field:date_picker_a7c8",
"field:date_picker_7e65",
"field:",
"field:number_7cf5",
"field:anzahl_kinder",
"field:alter_kind_3",
"field:alter_kind_25",
"field:alter_kind_4",
"field:alter_kind_5",
"field:alter_kind_6",
"field:alter_kind_7",
"field:alter_kind_8",
"field:alter_kind_9",
"field:alter_kind_10",
"field:alter_kind_11",
"field:",
"field:anrede",
"field:first_name_abae",
"field:last_name_d97c",
"field:email_5139",
"field:phone_4c77",
"field:long_answer_3524",
"field:form_field_5a7b",
"field:",
"field:utm_source",
"field:utm_medium",
"field:utm_campaign",
"field:utm_term",
"field:utm_content",
"field:utm_term_id",
"field:utm_content_id",
"field:gad_source",
"field:gad_campaignid",
"field:gbraid",
"field:gclid",
"field:fbclid",
"field:hotelid",
"field:hotelname",
"field:",
"metaSiteId"
],
"contact": {
"name": {
"first": "Jonas",
"last": "Linter"
},
"email": "jonas@vaius.ai",
"locale": "de-de",
"phones": [
{
"tag": "UNTAGGED",
"formattedPhone": "+39 392 007 6982",
"id": "530a3bf4-6dbe-4611-8963-a50df805785d",
"countryCode": "DE",
"e164Phone": "+493920076982",
"primary": true,
"phone": "392 0076982"
}
],
"contactId": "66659da8-4035-47fe-a66b-6ce461ad290f",
"emails": [
{
"id": "e1d2168e-ca3c-4844-8f93-f2e1b0ae70e3",
"tag": "UNTAGGED",
"email": "koepper-ed@t-online.de",
"primary": true
}
],
"updatedDate": "2025-10-06T07:05:35.675Z",
"phone": "+491758555456",
"createdDate": "2025-10-06T07:05:35.675Z"
},
"submissionId": "666247dc-9d5a-4eb7-87a7-677bf64645ad",
"field:anzahl_kinder": "0",
"field:first_name_abae": "Ernst-Dieter",
"field:utm_content_id": "",
"field:utm_campaign": "",
"field:utm_term": "",
"contactId": "66659da8-4035-47fe-a66b-6ce461ad290f",
"field:date_picker_a7c8": "2025-12-21",
"field:hotelname": "Testhotel",
"field:angebot_auswaehlen": "Zimmer: Doppelzimmer",
"field:utm_content": "",
"field:last_name_d97c": "Linter",
"field:hotelid": "135",
"submissionsLink": "https://manage.wix.app/forms/submissions/1dea821c-8168-4736-96e4-4b92e8b364cf/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F1dea821c-8168-4736-96e4-4b92e8b364cf%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
"field:gbraid": "",
"field:fbclid": "",
"submissionPdf": {
"fileName": "86d247dc-9d5a-4eb7-87a7-677bf64645ad.pdf",
"downloadUrl": "https://manage.wix.com/_api/form-submission-service/v4/submissions/86d247dc-9d5a-4eb7-87a7-677bf64645ad/download?accessToken=JWS.eyJraWQiOiJWLVNuLWhwZSIsImFsZyI6IkhTMjU2In0.eyJkYXRhIjoie1wibWV0YVNpdGVJZFwiOlwiMWRlYTgyMWMtODE2OC00NzM2LTk2ZTQtNGI5MmU4YjM2NGNmXCJ9IiwiaWF0IjoxNzU5NzM0MzM1LCJleHAiOjE3NTk3MzQ5MzV9.9koy-O_ptm0dRspjh01Yefkt2rCHiUlRCFtE_S3auYw"
},
"field:anrede": "Herr",
"field:long_answer_3524": "Kommentarsektion vermutlich",
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
}
},
"origin_header": null,
"all_headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "7081"
}
}

View File

@@ -1,257 +0,0 @@
{
"timestamp": "2025-10-07T15:54:26.898008",
"client_ip": "127.0.0.1",
"headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "7335"
},
"data": {
"data": {
"formName": "Contact us",
"submissions": [
{
"label": "Anreisedatum",
"value": "2026-01-02"
},
{
"label": "Abreisedatum",
"value": "2026-01-07"
},
{
"label": "Anzahl Erwachsene",
"value": "3"
},
{
"label": "Anzahl Kinder",
"value": "1"
},
{
"label": "Alter Kind 1",
"value": "12"
},
{
"label": "Anrede",
"value": "Frau"
},
{
"label": "Vorname",
"value": "Genesia "
},
{
"label": "Nachname",
"value": "Supino "
},
{
"label": "Email",
"value": "supinogenesia@gmail.com"
},
{
"label": "Phone",
"value": "+39 340 625 9979"
},
{
"label": "Einwilligung Marketing",
"value": "Selezionato"
},
{
"label": "utm_Source",
"value": "fb"
},
{
"label": "utm_Medium",
"value": "Facebook_Mobile_Feed"
},
{
"label": "utm_Campaign",
"value": "Conversions_Hotel_Bemelmans_ITA"
},
{
"label": "utm_Term",
"value": "Cold_Traffic_Conversions_Hotel_Bemelmans_ITA"
},
{
"label": "utm_Content",
"value": "Grafik_AuszeitDezember_9.12_23.12"
},
{
"label": "utm_term_id",
"value": "120238574626400196"
},
{
"label": "utm_content_id",
"value": "120238574626400196"
},
{
"label": "gad_source",
"value": ""
},
{
"label": "gad_campaignid",
"value": ""
},
{
"label": "gbraid",
"value": ""
},
{
"label": "gclid",
"value": ""
},
{
"label": "fbclid",
"value": "IwZXh0bgNhZW0BMABhZGlkAassWPh1b8QBHoRc2S24gMktdNKiPwEvGYMK3rB-mne_0IJQvQRIGH60wLvLfOm0XWP8wJ9s_aem_rbpAFMODwOh4UnF5UVxwWg"
},
{
"label": "hotelid",
"value": "12345"
},
{
"label": "hotelname",
"value": "Bemelmans Post"
}
],
"field:date_picker_7e65": "2026-01-07",
"field:number_7cf5": "3",
"field:utm_source": "fb",
"submissionTime": "2025-10-07T05:48:41.855Z",
"field:alter_kind_3": "12",
"field:gad_source": "",
"field:form_field_5a7b": "Selezionato",
"field:gad_campaignid": "",
"field:utm_medium": "Facebook_Mobile_Feed",
"field:utm_term_id": "120238574626400196",
"context": {
"metaSiteId": "1dea821c-8168-4736-96e4-4b92e8b364cf",
"activationId": "2421c9cd-6565-49ba-b60f-165d3dacccba"
},
"field:email_5139": "supinogenesia@gmail.com",
"field:phone_4c77": "+39 340 625 9979",
"_context": {
"activation": {
"id": "2421c9cd-6565-49ba-b60f-165d3dacccba"
},
"configuration": {
"id": "a976f18c-fa86-495d-be1e-676df188eeae"
},
"app": {
"id": "225dd912-7dea-4738-8688-4b8c6955ffc2"
},
"action": {
"id": "152db4d7-5263-40c4-be2b-1c81476318b7"
},
"trigger": {
"key": "wix_form_app-form_submitted"
}
},
"field:gclid": "",
"formFieldMask": [
"field:",
"field:",
"field:angebot_auswaehlen",
"field:date_picker_a7c8",
"field:date_picker_7e65",
"field:",
"field:number_7cf5",
"field:anzahl_kinder",
"field:alter_kind_3",
"field:alter_kind_25",
"field:alter_kind_4",
"field:alter_kind_5",
"field:alter_kind_6",
"field:alter_kind_7",
"field:alter_kind_8",
"field:alter_kind_9",
"field:alter_kind_10",
"field:alter_kind_11",
"field:",
"field:anrede",
"field:first_name_abae",
"field:last_name_d97c",
"field:email_5139",
"field:phone_4c77",
"field:long_answer_3524",
"field:form_field_5a7b",
"field:",
"field:utm_source",
"field:utm_medium",
"field:utm_campaign",
"field:utm_term",
"field:utm_content",
"field:utm_term_id",
"field:utm_content_id",
"field:gad_source",
"field:gad_campaignid",
"field:gbraid",
"field:gclid",
"field:fbclid",
"field:hotelid",
"field:hotelname",
"field:",
"metaSiteId"
],
"contact": {
"name": {
"first": "Genesia",
"last": "Supino"
},
"email": "supinogenesia@gmail.com",
"locale": "it-it",
"phones": [
{
"tag": "UNTAGGED",
"formattedPhone": "+39 340 625 9979",
"id": "198f04fb-5b2c-4a7b-b7ea-adc150ec4212",
"countryCode": "IT",
"e164Phone": "+393406259979",
"primary": true,
"phone": "340 625 9979"
}
],
"contactId": "4d695011-36c1-4480-b225-ae9c6eef9e83",
"emails": [
{
"id": "e09d7bab-1f11-4b5d-b3c5-32d43c1dc584",
"tag": "UNTAGGED",
"email": "supinogenesia@gmail.com",
"primary": true
}
],
"updatedDate": "2025-10-07T05:48:44.764Z",
"phone": "+393406259979",
"createdDate": "2025-10-07T05:48:43.567Z"
},
"submissionId": "c52702c9-55b9-44e1-b158-ec9544c73cc7",
"field:anzahl_kinder": "1",
"field:first_name_abae": "Genesia ",
"field:utm_content_id": "120238574626400196",
"field:utm_campaign": "Conversions_Hotel_Bemelmans_ITA",
"field:utm_term": "Cold_Traffic_Conversions_Hotel_Bemelmans_ITA",
"contactId": "4d695011-36c1-4480-b225-ae9c6eef9e83",
"field:date_picker_a7c8": "2026-01-02",
"field:hotelname": "Bemelmans Post",
"field:utm_content": "Grafik_AuszeitDezember_9.12_23.12",
"field:last_name_d97c": "Supino ",
"field:hotelid": "12345",
"submissionsLink": "https://manage.wix.app/forms/submissions/1dea821c-8168-4736-96e4-4b92e8b364cf/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F1dea821c-8168-4736-96e4-4b92e8b364cf%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
"field:gbraid": "",
"field:fbclid": "IwZXh0bgNhZW0BMABhZGlkAassWPh1b8QBHoRc2S24gMktdNKiPwEvGYMK3rB-mne_0IJQvQRIGH60wLvLfOm0XWP8wJ9s_aem_rbpAFMODwOh4UnF5UVxwWg",
"submissionPdf": {
"fileName": "c52702c9-55b9-44e1-b158-ec9544c73cc7.pdf",
"downloadUrl": "https://manage.wix.com/_api/form-submission-service/v4/submissions/c52702c9-55b9-44e1-b158-ec9544c73cc7/download?accessToken=JWS.eyJraWQiOiJWLVNuLWhwZSIsImFsZyI6IkhTMjU2In0.eyJkYXRhIjoie1wibWV0YVNpdGVJZFwiOlwiMWRlYTgyMWMtODE2OC00NzM2LTk2ZTQtNGI5MmU4YjM2NGNmXCJ9IiwiaWF0IjoxNzU5ODE2MTI0LCJleHAiOjE3NTk4MTY3MjR9.quBfp9UL9Ddqb2CWERXoVkh9OdmHlIBvlLAyhoXElaY"
},
"field:anrede": "Frau",
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
}
},
"origin_header": null,
"all_headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "7335"
}
}

View File

@@ -1,257 +0,0 @@
{
"timestamp": "2025-10-07T16:05:37.531417",
"client_ip": "127.0.0.1",
"headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "7335"
},
"data": {
"data": {
"formName": "Contact us",
"submissions": [
{
"label": "Anreisedatum",
"value": "2026-01-02"
},
{
"label": "Abreisedatum",
"value": "2026-01-07"
},
{
"label": "Anzahl Erwachsene",
"value": "3"
},
{
"label": "Anzahl Kinder",
"value": "1"
},
{
"label": "Alter Kind 1",
"value": "12"
},
{
"label": "Anrede",
"value": "Frau"
},
{
"label": "Vorname",
"value": "Genesia "
},
{
"label": "Nachname",
"value": "Supino "
},
{
"label": "Email",
"value": "supinogenesia@gmail.com"
},
{
"label": "Phone",
"value": "+39 340 625 9979"
},
{
"label": "Einwilligung Marketing",
"value": "Selezionato"
},
{
"label": "utm_Source",
"value": "fb"
},
{
"label": "utm_Medium",
"value": "Facebook_Mobile_Feed"
},
{
"label": "utm_Campaign",
"value": "Conversions_Hotel_Bemelmans_ITA"
},
{
"label": "utm_Term",
"value": "Cold_Traffic_Conversions_Hotel_Bemelmans_ITA"
},
{
"label": "utm_Content",
"value": "Grafik_AuszeitDezember_9.12_23.12"
},
{
"label": "utm_term_id",
"value": "120238574626400196"
},
{
"label": "utm_content_id",
"value": "120238574626400196"
},
{
"label": "gad_source",
"value": ""
},
{
"label": "gad_campaignid",
"value": ""
},
{
"label": "gbraid",
"value": ""
},
{
"label": "gclid",
"value": ""
},
{
"label": "fbclid",
"value": "IwZXh0bgNhZW0BMABhZGlkAassWPh1b8QBHoRc2S24gMktdNKiPwEvGYMK3rB-mne_0IJQvQRIGH60wLvLfOm0XWP8wJ9s_aem_rbpAFMODwOh4UnF5UVxwWg"
},
{
"label": "hotelid",
"value": "12345"
},
{
"label": "hotelname",
"value": "Bemelmans Post"
}
],
"field:date_picker_7e65": "2026-01-07",
"field:number_7cf5": "3",
"field:utm_source": "fb",
"submissionTime": "2025-10-07T05:48:41.855Z",
"field:alter_kind_3": "12",
"field:gad_source": "",
"field:form_field_5a7b": "Selezionato",
"field:gad_campaignid": "",
"field:utm_medium": "Facebook_Mobile_Feed",
"field:utm_term_id": "120238574626400196",
"context": {
"metaSiteId": "1dea821c-8168-4736-96e4-4b92e8b364cf",
"activationId": "2421c9cd-6565-49ba-b60f-165d3dacccba"
},
"field:email_5139": "supinogenesia@gmail.com",
"field:phone_4c77": "+39 340 625 9979",
"_context": {
"activation": {
"id": "2421c9cd-6565-49ba-b60f-165d3dacccba"
},
"configuration": {
"id": "a976f18c-fa86-495d-be1e-676df188eeae"
},
"app": {
"id": "225dd912-7dea-4738-8688-4b8c6955ffc2"
},
"action": {
"id": "152db4d7-5263-40c4-be2b-1c81476318b7"
},
"trigger": {
"key": "wix_form_app-form_submitted"
}
},
"field:gclid": "",
"formFieldMask": [
"field:",
"field:",
"field:angebot_auswaehlen",
"field:date_picker_a7c8",
"field:date_picker_7e65",
"field:",
"field:number_7cf5",
"field:anzahl_kinder",
"field:alter_kind_3",
"field:alter_kind_25",
"field:alter_kind_4",
"field:alter_kind_5",
"field:alter_kind_6",
"field:alter_kind_7",
"field:alter_kind_8",
"field:alter_kind_9",
"field:alter_kind_10",
"field:alter_kind_11",
"field:",
"field:anrede",
"field:first_name_abae",
"field:last_name_d97c",
"field:email_5139",
"field:phone_4c77",
"field:long_answer_3524",
"field:form_field_5a7b",
"field:",
"field:utm_source",
"field:utm_medium",
"field:utm_campaign",
"field:utm_term",
"field:utm_content",
"field:utm_term_id",
"field:utm_content_id",
"field:gad_source",
"field:gad_campaignid",
"field:gbraid",
"field:gclid",
"field:fbclid",
"field:hotelid",
"field:hotelname",
"field:",
"metaSiteId"
],
"contact": {
"name": {
"first": "Genesia",
"last": "Supino"
},
"email": "supinogenesia@gmail.com",
"locale": "it-it",
"phones": [
{
"tag": "UNTAGGED",
"formattedPhone": "+39 340 625 9979",
"id": "198f04fb-5b2c-4a7b-b7ea-adc150ec4212",
"countryCode": "IT",
"e164Phone": "+393406259979",
"primary": true,
"phone": "340 625 9979"
}
],
"contactId": "4d695011-36c1-4480-b225-ae9c6eef9e83",
"emails": [
{
"id": "e09d7bab-1f11-4b5d-b3c5-32d43c1dc584",
"tag": "UNTAGGED",
"email": "supinogenesia@gmail.com",
"primary": true
}
],
"updatedDate": "2025-10-07T05:48:44.764Z",
"phone": "+393406259979",
"createdDate": "2025-10-07T05:48:43.567Z"
},
"submissionId": "c52702c9-55b9-44e1-b158-ec9544c73cc7",
"field:anzahl_kinder": "1",
"field:first_name_abae": "Genesia ",
"field:utm_content_id": "120238574626400196",
"field:utm_campaign": "Conversions_Hotel_Bemelmans_ITA",
"field:utm_term": "Cold_Traffic_Conversions_Hotel_Bemelmans_ITA",
"contactId": "4d695011-36c1-4480-b225-ae9c6eef9e83",
"field:date_picker_a7c8": "2026-01-02",
"field:hotelname": "Bemelmans Post",
"field:utm_content": "Grafik_AuszeitDezember_9.12_23.12",
"field:last_name_d97c": "Supino ",
"field:hotelid": "12345",
"submissionsLink": "https://manage.wix.app/forms/submissions/1dea821c-8168-4736-96e4-4b92e8b364cf/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F1dea821c-8168-4736-96e4-4b92e8b364cf%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
"field:gbraid": "",
"field:fbclid": "IwZXh0bgNhZW0BMABhZGlkAassWPh1b8QBHoRc2S24gMktdNKiPwEvGYMK3rB-mne_0IJQvQRIGH60wLvLfOm0XWP8wJ9s_aem_rbpAFMODwOh4UnF5UVxwWg",
"submissionPdf": {
"fileName": "c52702c9-55b9-44e1-b158-ec9544c73cc7.pdf",
"downloadUrl": "https://manage.wix.com/_api/form-submission-service/v4/submissions/c52702c9-55b9-44e1-b158-ec9544c73cc7/download?accessToken=JWS.eyJraWQiOiJWLVNuLWhwZSIsImFsZyI6IkhTMjU2In0.eyJkYXRhIjoie1wibWV0YVNpdGVJZFwiOlwiMWRlYTgyMWMtODE2OC00NzM2LTk2ZTQtNGI5MmU4YjM2NGNmXCJ9IiwiaWF0IjoxNzU5ODE2MTI0LCJleHAiOjE3NTk4MTY3MjR9.quBfp9UL9Ddqb2CWERXoVkh9OdmHlIBvlLAyhoXElaY"
},
"field:anrede": "Frau",
"formId": "e084006b-ae83-4e4d-b2f5-074118cdb3b1"
}
},
"origin_header": null,
"all_headers": {
"host": "localhost:8080",
"content-type": "application/json",
"user-agent": "insomnia/2023.5.8",
"accept": "*/*",
"content-length": "7335"
}
}

View File

@@ -13,10 +13,12 @@ dependencies = [
"alembic>=1.17.2",
"annotatedyaml>=1.0.0",
"asyncpg>=0.30.0",
"bcrypt>=5.0.0",
"dotenv>=0.9.9",
"fast-langdetect>=1.0.0",
"fastapi>=0.117.1",
"generateds>=2.44.3",
"git-filter-repo>=2.47.0",
"httpx>=0.28.1",
"lxml>=6.0.1",
"pandas>=2.3.3",

View File

@@ -1,47 +0,0 @@
#!/bin/bash
# Reset database and initialize Alembic from scratch
echo "=== Database Reset Script ==="
echo "This will drop all tables and reinitialize with Alembic"
echo ""
read -p "Are you sure? (type 'yes' to continue): " confirm
if [ "$confirm" != "yes" ]; then
echo "Aborted."
exit 1
fi
echo ""
echo "Step 1: Dropping all tables in the database..."
echo "Connect to your database and run:"
echo ""
echo " -- For PostgreSQL:"
echo " DROP SCHEMA public CASCADE;"
echo " CREATE SCHEMA public;"
echo " GRANT ALL ON SCHEMA public TO <your_user>;"
echo " GRANT ALL ON SCHEMA public TO public;"
echo ""
echo " -- Or if using a custom schema (e.g., alpinebits):"
echo " DROP SCHEMA alpinebits CASCADE;"
echo " CREATE SCHEMA alpinebits;"
echo ""
echo "Press Enter after you've run the SQL commands..."
read
echo ""
echo "Step 2: Running Alembic migrations..."
uv run alembic upgrade head
if [ $? -eq 0 ]; then
echo ""
echo "=== Success! ==="
echo "Database has been reset and migrations applied."
echo ""
echo "Current migration status:"
uv run alembic current
else
echo ""
echo "=== Error ==="
echo "Migration failed. Check the error messages above."
exit 1
fi

28
reset_db.sh Executable file
View File

@@ -0,0 +1,28 @@
#!/bin/bash
# Recreate the database: run DROP and CREATE in separate psql calls (DROP DATABASE cannot run inside a transaction block)
if ! docker exec -i meta_timescaledb psql -U meta_user -d postgres -c "DROP DATABASE IF EXISTS meta_insights;"; then
echo "Error: failed to drop database 'meta_insights'." >&2
exit 1
fi
if ! docker exec -i meta_timescaledb psql -U meta_user -d postgres -c "CREATE DATABASE meta_insights;"; then
echo "Error: failed to create database 'meta_insights'." >&2
exit 1
fi
# then import dump specified by argument only if previous commands succeeded
if [ -n "$1" ]; then
DUMP_FILE="$1"
if [ ! -r "$DUMP_FILE" ]; then
echo "Error: dump file '$DUMP_FILE' does not exist or is not readable." >&2
exit 2
fi
echo "Importing dump from $DUMP_FILE"
if ! docker exec -i meta_timescaledb psql -U meta_user -d meta_insights < "$DUMP_FILE"; then
echo "Error: failed to import dump '$DUMP_FILE' into 'meta_insights'." >&2
exit 3
fi
fi

View File

@@ -3,25 +3,58 @@
select sum(room.total_revenue::float)
from alpinebits.conversions as con
join alpinebits.room_reservations as room on room.conversion_id = con.id
join alpinebits.conversion_rooms as room on room.conversion_id = con.id
join alpinebits.reservations as res on res.id = con.reservation_id
where con.reservation_id is not null and room.total_revenue is not null
and res.start_date <= room.arrival_date + INTERVAL '7 days'
;
```
```
select res.created_at, con.reservation_date, res.start_date, room.arrival_date,res.end_date,
select res.created_at,directly_attributable ,con.reservation_date, res.start_date, room.arrival_date,res.end_date,
room.departure_date, reservation_type, booking_channel, advertising_medium,
guest_first_name,guest_last_name, total_revenue,
guest_first_name,guest_last_name, total_revenue,is_regular,
room.room_status
from alpinebits.conversions as con
join alpinebits.room_reservations as room on room.conversion_id = con.id
join alpinebits.conversion_rooms as room on room.conversion_id = con.id
join alpinebits.reservations as res on res.id = con.reservation_id
join alpinebits.conversion_guests as guest on guest.guest_id = con.guest_id
where con.reservation_id is not null and room.total_revenue is not null
order by reservation_date;
```
Um zu schaugn wie viele schon bearbeitet wurden und als Anfragen in ASA drins sein
```
select res.id, res.created_at, con.created_at as "Con Created at", con.updated_at as "Con Updated at", given_name, surname, guest_first_name, guest_last_name,
meta_account_id, google_account_id, con.id
from alpinebits.reservations as res
join alpinebits.customers as cus on res.customer_id = cus.id
left join alpinebits.conversions as con on con.reservation_id = res.id
left join alpinebits.conversion_guests as g on g.guest_id = con.guest_id
where hotel_id = '39054_001'
order by res.created_at desc limit 400
```
```
select hotel_id
from alpinebits.conversions as con
join alpinebits.conversion_rooms as room on room.conversion_id = con.id
join alpinebits.reservations as res on res.id = con.reservation_id
@@ -30,14 +63,13 @@ select res.created_at, con.reservation_date, res.start_date, room.arrival_date,r
and res.start_date <= room.arrival_date + INTERVAL '7 days'
order by reservation_date;
```
```
select round(sum(room.total_revenue::numeric)::numeric, 3), con.advertising_medium
from alpinebits.conversions as con
join alpinebits.room_reservations as room on room.conversion_id = con.id
join alpinebits.conversion_rooms as room on room.conversion_id = con.id
@@ -48,4 +80,61 @@ select round(sum(room.total_revenue::numeric)::numeric, 3), con.advertising_medi
;
```
```
select sum(room.total_revenue::float), is_regular
from alpinebits.conversions as con
join alpinebits.conversion_rooms as room on room.conversion_id = con.id
join alpinebits.reservations as res on res.id = con.reservation_id
join alpinebits.conversion_guests as g on g.guest_id = con.guest_id
where room.total_revenue is not null
and directly_attributable = true
group by is_regular
;
```
```
SELECT res.created_at AS "AnfrageDatum",
directly_attributable,
con.reservation_date,
res.start_date,
room.arrival_date,
res.end_date,
room.departure_date,
advertising_medium,
guest_first_name,
cus.given_name,
guest_last_name,
cus.surname,
total_revenue,
room.room_status,
room_number,
is_regular,
is_awareness_guest,
guest_matched,
con.hotel_id,
guest.guest_id
FROM alpinebits.conversions AS con
JOIN alpinebits.conversion_rooms AS room ON room.conversion_id = con.id
JOIN alpinebits.conversion_guests AS guest ON guest.guest_id = con.guest_id
LEFT JOIN alpinebits.reservations AS res ON res.id = con.reservation_id
LEFT JOIN alpinebits.customers AS cus ON cus.id = con.customer_id
WHERE reservation_date > '2025-01-01'
AND guest.guest_id IN (
SELECT DISTINCT g.guest_id
FROM alpinebits.conversions AS c
JOIN alpinebits.conversion_rooms AS r ON r.conversion_id = c.id
JOIN alpinebits.conversion_guests AS g ON g.guest_id = c.guest_id
WHERE c.reservation_date > '2025-01-01'
AND r.total_revenue > 0
)
ORDER BY guest_first_name, guest_last_name, room_status;
```

View File

@@ -733,14 +733,15 @@ def _process_single_reservation(
room_stay=[room_stay],
)
# Always send md5_unique_id as the primary tracking ID
# This is guaranteed to fit in 64 chars and has low collision risk
res_id_value = reservation.md5_unique_id
res_id_source = "website"
klick_id = None
# Determine the source based on available click tracking data (for informational purposes)
if reservation.fbclid != "":
klick_id = str(reservation.fbclid)
res_id_source = "meta"
elif reservation.gclid != "":
klick_id = str(reservation.gclid)
res_id_source = "google"
# Get utm_medium if available, otherwise use source
@@ -757,7 +758,7 @@ def _process_single_reservation(
hotel_res_id_data = HotelReservationIdData(
res_id_type=RESERVATION_ID_TYPE,
res_id_value=klick_id,
res_id_value=res_id_value,
res_id_source=res_id_source,
res_id_source_context=res_id_source_context,
)
@@ -767,9 +768,9 @@ def _process_single_reservation(
hotel_reservation_id=[hotel_res_id]
)
if reservation.hotel_code is None:
if reservation.hotel_id is None:
raise ValueError("Reservation hotel_code is None")
hotel_code = str(reservation.hotel_code)
hotel_code = str(reservation.hotel_id)
hotel_name = None if reservation.hotel_name is None else str(reservation.hotel_name)
basic_property_info = HotelReservation.ResGlobalInfo.BasicPropertyInfo(

View File

@@ -15,6 +15,7 @@ from enum import Enum
from typing import Any, Optional, override
from xsdata.formats.dataclass.serializers.config import SerializerConfig
from xsdata.exceptions import ParserError
from xsdata_pydantic.bindings import XmlParser, XmlSerializer
from alpine_bits_python.alpine_bits_helpers import (
@@ -33,6 +34,7 @@ from .generated.alpinebits import (
OtaReadRq,
WarningStatus,
)
from .hotel_service import HotelService
from .reservation_service import ReservationService
# Configure logging
@@ -86,6 +88,10 @@ class AlpineBitsActionName(Enum):
"action_OTA_HotelRatePlan_BaseRates",
"OTA_HotelRatePlan:BaseRates",
)
OTA_HOTEL_INV_COUNT_NOTIF_FREE_ROOMS = (
"action_OTA_HotelInvCountNotif",
"OTA_HotelInvCountNotif:FreeRooms",
)
def __init__(self, capability_name: str, request_name: str):
self.capability_name = capability_name
@@ -409,20 +415,24 @@ def strip_control_chars(s):
return re.sub(r"[\x00-\x1F\x7F]", "", s)
def validate_hotel_authentication(
username: str, password: str, hotelid: str, config: dict
async def validate_hotel_authentication(
username: str,
password: str,
hotelid: str,
config: dict,
dbsession=None,
) -> bool:
"""Validate hotel authentication based on username, password, and hotel ID.
"""Validate hotel authentication against the database (fallback to config)."""
if dbsession is not None:
hotel_service = HotelService(dbsession)
hotel = await hotel_service.authenticate_hotel(username, password)
if hotel:
return hotel.hotel_id == hotelid
Example config
alpine_bits_auth:
- hotel_id: "123"
hotel_name: "Frangart Inn"
username: "alice"
password: !secret ALICE_PASSWORD
"""
# Fallback to config for legacy scenarios (e.g., during migration)
if not config or "alpine_bits_auth" not in config:
return False
auth_list = config["alpine_bits_auth"]
for auth in auth_list:
if (
@@ -467,8 +477,12 @@ class ReadAction(AlpineBitsAction):
return AlpineBitsResponse(
"Error: Something went wrong", HttpStatusCode.INTERNAL_SERVER_ERROR
)
read_request = XmlParser().from_string(request_xml, OtaReadRq)
try:
read_request = XmlParser().from_string(request_xml, OtaReadRq)
except ParserError:
return AlpineBitsResponse(
"Error: Invalid XML request", HttpStatusCode.BAD_REQUEST
)
hotel_read_request = read_request.read_requests.hotel_read_request
@@ -484,8 +498,12 @@ class ReadAction(AlpineBitsAction):
HttpStatusCode.UNAUTHORIZED,
)
if not validate_hotel_authentication(
client_info.username, client_info.password, hotelid, self.config
if not await validate_hotel_authentication(
client_info.username,
client_info.password,
hotelid,
self.config,
dbsession,
):
return AlpineBitsResponse(
f"Error: Unauthorized Read Request for this specific hotel {hotelname}. Check credentials",
@@ -518,7 +536,7 @@ class ReadAction(AlpineBitsAction):
await reservation_service.get_unacknowledged_reservations(
username=client_info.username,
client_id=client_info.client_id,
hotel_code=hotelid
hotel_code=hotelid,
)
)
else:
@@ -615,7 +633,9 @@ class NotifReportReadAction(AlpineBitsAction):
): # type: ignore
md5_unique_id = entry.unique_id.id
await reservation_service.record_acknowledgement(
client_id=client_info.client_id, unique_id=md5_unique_id, username=client_info.username
client_id=client_info.client_id,
unique_id=md5_unique_id,
username=client_info.username,
)
return AlpineBitsResponse(response_xml, HttpStatusCode.OK)
@@ -819,3 +839,7 @@ class AlpineBitsServer:
return False
return True
# Ensure FreeRoomsAction is registered with ServerCapabilities discovery
from .free_rooms_action import FreeRoomsAction

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,6 @@
import os
from pathlib import Path
from typing import Any
from annotatedyaml.loader import Secrets
from annotatedyaml.loader import load_yaml as load_annotated_yaml
@@ -329,3 +330,47 @@ class Config:
# For backward compatibility
def load_config():
return Config().config
def get_username_for_hotel(config: dict, hotel_code: str) -> str:
"""Get the username associated with a hotel_code from config."""
return next(h.get("username") for h in config.get("alpine_bits_auth", []) if h.get("hotel_id") == hotel_code)
def get_advertising_account_ids(
config: dict[str, Any], hotel_code: str, fbclid: str | None, gclid: str | None
) -> tuple[str | None, str | None]:
"""Get advertising account IDs based on hotel config and click IDs.
Args:
config: Application configuration dict
hotel_code: Hotel identifier to look up in config
fbclid: Facebook click ID (if present, meta_account_id will be returned)
gclid: Google click ID (if present, google_account_id will be returned)
Returns:
Tuple of (meta_account_id, google_account_id) based on conditional logic:
- meta_account_id is set only if fbclid is present AND hotel has
meta_account configured
- google_account_id is set only if gclid is present AND hotel has
google_account configured
"""
meta_account_id = None
google_account_id = None
# Look up hotel in config
alpine_bits_auth = config.get("alpine_bits_auth", [])
for hotel in alpine_bits_auth:
if hotel.get(CONF_HOTEL_ID) == hotel_code:
# Conditionally set meta_account_id if fbclid is present
if fbclid:
meta_account_id = hotel.get(CONF_META_ACCOUNT)
# Conditionally set google_account_id if gclid is present
if gclid:
google_account_id = hotel.get(CONF_GOOGLE_ACCOUNT)
break
return meta_account_id, google_account_id

View File

@@ -1,7 +1,16 @@
from enum import IntEnum
from enum import IntEnum, StrEnum
from typing import Final
class WebhookStatus(StrEnum):
"""Allowed webhook processing statuses for AlpineBits."""
PROCESSING = "processing"
COMPLETED = "completed"
FAILED = "failed"
PENDING = "pending"
class HttpStatusCode(IntEnum):
"""Allowed HTTP status codes for AlpineBits responses."""

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,11 @@
"""CSV import functionality for landing page forms.
"""CSV import functionality for landing page forms and email lead exports.
Handles importing CSV data from landing_page_form.csv and creating/updating
reservations and customers in the database.
Handles importing CSV data from landing_page_form.csv and email lead exports
(from extract_leads.py) and creating/updating reservations and customers in
the database. Supports both German (landing page form) and English (email lead
export) column names.
Supported CSV columns:
Supported CSV columns (German - Landing Page Form):
- Zeit der Einreichung: Submission timestamp
- Angebot auswählen: Room offer
- Anreisedatum: Check-in date (YYYY-MM-DD or DD.MM.YYYY)
@@ -24,6 +26,24 @@ Supported CSV columns:
- hotelid: Hotel ID
- hotelname: Hotel name
Supported CSV columns (English - Email Lead Export):
- name: First name (required)
- lastname: Last name (required)
- mail: Email address
- tel: Phone number
- anreise: Check-in date (YYYY-MM-DD or DD.MM.YYYY)
- abreise: Check-out date (YYYY-MM-DD or DD.MM.YYYY)
- erwachsene: Number of adults
- kinder: Number of children
- kind_ages: Child ages as comma-separated string (e.g., "3,6,10")
- apartments: Apartment preferences
- verpflegung: Meal plan preference
- sprache: Language preference
- device: Device information
- anrede: Title/salutation
- land: Country
- privacy: Privacy consent
Duplicate detection uses: name + email + dates + fbclid/gclid combination
"""
@@ -57,6 +77,7 @@ class CSVImporter:
# Column rename mapping for CSV import
COLUMN_RENAME_MAP = {
# German column names (from landing page form CSV)
"Zeit der Einreichung": "submission_timestamp",
"Angebot auswählen": "room_offer",
"Anreisedatum": "check_in_date",
@@ -82,6 +103,31 @@ class CSVImporter:
"Phone": "phone",
"Message": "message",
"Einwilligung Marketing": "newsletter_opt_in",
"Kinder": "children",
# English column names (from leads export CSV)
"name": "first_name",
"lastname": "last_name",
"mail": "email",
"tel": "phone",
"anreise": "check_in_date",
"abreise": "check_out_date",
"erwachsene": "num_adults",
"kinder": "num_children",
"kind_ages": "kind_ages_csv", # Special handling - comma-separated ages
"apartments": "room_offer",
"verpflegung": "meal_plan",
"sprache": "language",
"device": "device",
"anrede": "salutation",
"land": "country",
"privacy": "privacy_consent",
# German alternate names for leads export columns
"Erwachsene": "num_adults",
"Kinder": "num_children",
# Standard tracking columns
"utm_Source": "utm_source",
"utm_Medium": "utm_medium",
"utm_Campaign": "utm_campaign",
@@ -98,7 +144,6 @@ class CSVImporter:
"hotelname": "hotel_name",
"roomtypecode": "room_type_code",
"roomclassificationcode": "room_classification_code",
"Kinder": "children",
# Handle unnamed columns - these get default names like "Unnamed: 0"
# The age columns appear to be in positions 6-15 (0-indexed) based on dry run output
# We'll handle these via positional renaming in import_csv_file
@@ -116,6 +161,62 @@ class CSVImporter:
self.customer_service = CustomerService(db_session)
self.reservation_service = ReservationService(db_session)
def _dryrun_csv_file(self, csv_file_path: str) -> dict[str, Any]:
"""Parse CSV file and return first 10 rows without importing.
Args:
csv_file_path: Path to CSV file
Returns:
Dictionary with headers and rows
"""
df = pd.read_csv(csv_file_path, encoding="utf-8-sig", nrows=10).fillna("")
df = self._normalize_csv_columns(df)
return {
"headers": df.columns.tolist(),
"rows": df.to_dict(orient="records"),
}
def _normalize_csv_columns(self, df: pd.DataFrame) -> pd.DataFrame:
"""Normalize and rename CSV columns based on mapping.
Handles both standard column renames and positional renaming for child age columns
that appear in the landing page form CSV format.
"""
# Apply standard column rename mapping
rename_dict = {col: self.COLUMN_RENAME_MAP.get(col, col) for col in df.columns}
df = df.rename(columns=rename_dict)
# Handle positional renaming for child age columns (landing page form format)
# These appear as unnamed columns immediately after num_children
col_list = list(df.columns)
if "num_children" in col_list and "kind_ages_csv" not in col_list:
num_children_idx = col_list.index("num_children")
# Rename the next 10 columns as child ages (1-10)
for i in range(1, 11):
if num_children_idx + i < len(col_list):
col_name = col_list[num_children_idx + i]
if not col_name.startswith("child_"):
df.rename(columns={col_name: f"child_{i}_age"}, inplace=True)
return df
def _get_hotel_info(self, hotel_code: str) -> tuple[str, str]:
"""Get hotel name from config by hotel_code.
Args:
hotel_code: Hotel code to look up
Returns:
Tuple of (hotel_code, hotel_name) from config
"""
for hotel in self.config.get("alpine_bits_auth", []):
if hotel.get("hotel_id") == hotel_code:
return hotel_code, hotel.get("hotel_name", "")
# Fallback to default if not found
return hotel_code, self.config.get("default_hotel_name", "Frangart Inn")
async def find_duplicate_reservation(
self,
first_name: str,
@@ -184,14 +285,17 @@ class CSVImporter:
return None
async def import_csv_file(
self, csv_file_path: str, hotel_code: Optional[str] = None, dryrun: bool = False
self, csv_file_path: str, hotel_code: str, dryrun: bool = False, pre_acknowledge: bool = False, client_id: Optional[str] = None, username: Optional[str] = None
) -> dict[str, Any]:
"""Import reservations from a CSV file.
Args:
csv_file_path: Path to CSV file
hotel_code: Optional hotel code to override CSV values
hotel_code: Hotel code (mandatory) - used to look up hotel name from config
dryrun: If True, parse and print first 10 rows as JSON without importing
pre_acknowledge: If True, pre-acknowledges all imported reservations
client_id: Client ID for pre-acknowledgement (required if pre_acknowledge=True)
username: Username for pre-acknowledgement (optional, but recommended)
Returns:
Dictionary with import statistics or parsed data (if dryrun=True)
@@ -200,70 +304,20 @@ class CSVImporter:
if not path.exists():
raise FileNotFoundError(f"CSV file not found: {csv_file_path}")
if pre_acknowledge and not client_id:
raise ValueError("client_id is required when pre_acknowledge=True")
# Start a transaction - will rollback on any exception
await self.db_session.begin()
try:
# Handle dry-run mode
if dryrun:
df = pd.read_csv(path, encoding="utf-8-sig", nrows=10).fillna("")
return self._dryrun_csv_file(path)
# Rename columns based on mapping
rename_dict = {col: self.COLUMN_RENAME_MAP.get(col, col) for col in df.columns}
df = df.rename(columns=rename_dict)
dryrun_data = {
"headers": df.columns.tolist(),
"rows": df.to_dict(orient="records"),
}
# Print formatted output
print("\n=== CSV Import Dry Run ===")
print(f"\nHeaders ({len(df.columns)} columns):")
for i, header in enumerate(df.columns, 1):
print(f" {i}. {header}")
print(f"\nFirst {len(df)} rows:")
print(df.to_string())
# Find and print rows with num_children > 0
print("\n=== Rows with num_children > 0 ===")
for row_num, row in df.iterrows():
try:
num_children = int(row.get("num_children", 0) or 0)
if num_children > 0:
print(f"\nRow {row_num + 2}:")
print(row.to_string())
except:
pass
return dryrun_data
# Load CSV with pandas
# Load and prepare CSV
df = pd.read_csv(path, encoding="utf-8-sig").fillna("")
# Rename columns based on mapping
rename_dict = {col: self.COLUMN_RENAME_MAP.get(col, col) for col in df.columns}
df = df.rename(columns=rename_dict)
# Handle positional renaming for child age columns
# After "num_children" (column 5, 0-indexed), the next 10 columns are child ages
# and columns after that are duplicates (child_1_age_duplicate, child_2_age_duplicate)
col_list = list(df.columns)
if "num_children" in col_list:
num_children_idx = col_list.index("num_children")
# The 10 columns after num_children are child ages (1-10)
for i in range(1, 11):
if num_children_idx + i < len(col_list):
col_name = col_list[num_children_idx + i]
# Only rename if not already renamed
if not col_name.startswith("child_"):
df.rename(columns={col_name: f"child_{i}_age"}, inplace=True)
col_list[num_children_idx + i] = f"child_{i}_age"
# Debug: log the column names after renaming
_LOGGER.debug("CSV columns after rename: %s", list(df.columns))
df = self._normalize_csv_columns(df)
stats = {
"total_rows": 0,
@@ -272,44 +326,28 @@ class CSVImporter:
"existing_customers": 0,
"created_reservations": 0,
"skipped_duplicates": 0,
"pre_acknowledged": 0,
"errors": [],
}
# Helper function to parse dates
def parse_date_str(date_str: str) -> Optional[date]:
"""Parse date string in various formats."""
if not date_str or not isinstance(date_str, str):
return None
date_str = date_str.strip()
for fmt in ["%Y-%m-%d", "%d.%m.%Y", "%d/%m/%Y"]:
try:
return datetime.strptime(date_str, fmt).date()
except ValueError:
continue
return None
# Process each row - stop on first error for debugging
# Process each row
for row_num, row in df.iterrows():
stats["total_rows"] += 1
row_num += 2 # Convert to 1-based and account for header
# Extract required fields (using renamed column names)
# Extract and validate required fields
first_name = str(row.get("first_name", "")).strip()
last_name = str(row.get("last_name", "")).strip()
email = str(row.get("email", "")).strip()
# Validate required name fields
if not first_name or not last_name:
_LOGGER.warning("Skipping row %d: missing name", row_num)
stats["skipped_empty"] += 1
continue
# Parse and validate dates
start_date_str = str(row.get("check_in_date", "")).strip()
end_date_str = str(row.get("check_out_date", "")).strip()
start_date = parse_date_str(start_date_str)
end_date = parse_date_str(end_date_str)
start_date = self._parse_date(str(row.get("check_in_date", "")).strip())
end_date = self._parse_date(str(row.get("check_out_date", "")).strip())
if not start_date or not end_date:
_LOGGER.warning("Skipping row %d: invalid or missing dates", row_num)
@@ -334,144 +372,43 @@ class CSVImporter:
stats["skipped_duplicates"] += 1
continue
# Build customer data from CSV row
customer_data = {
"given_name": first_name,
"surname": last_name,
"name_prefix": str(row.get("salutation", "")).strip() or None,
"email_address": email or None,
"phone": str(row.get("phone", "")).strip() or None,
"email_newsletter": self._parse_bool(row.get("newsletter_opt_in")),
"address_line": None,
"city_name": None,
"postal_code": None,
"country_code": None,
"gender": None,
"birth_date": None,
"language": "de",
"address_catalog": False,
"name_title": None,
}
# Get or create customer
customer = await self._find_or_create_customer(customer_data)
customer_data = self._build_customer_data(first_name, last_name, email, row)
customer = await self._find_or_create_customer(customer_data, auto_commit=False)
if customer.id is None:
await self.db_session.refresh(customer)
await self.db_session.flush()
stats["created_customers"] += 1
else:
stats["existing_customers"] += 1
# Build reservation data from CSV row
num_adults = int(row.get("num_adults", 1) or 1)
num_children = int(row.get("num_children", 0) or 0)
# Parse adult/children counts and extract ages
num_adults = self._parse_int(row.get("num_adults", 1), default=1)
num_children = self._parse_int(row.get("num_children", 0), default=0)
children_ages, age_adjustment, adjusted_num_children = self._extract_children_ages(row, num_children)
num_adults += age_adjustment
num_children = adjusted_num_children if adjusted_num_children > 0 else num_children
# Extract children ages from columns (including duplicates)
children_ages = []
# Try to extract ages from renamed columns first
# Check primary child age columns (1-10)
for i in range(1, 11):
age_key = f"child_{i}_age"
age_val = row.get(age_key, "")
if age_val != "" and age_val is not None:
try:
# Handle both int and float values (e.g., 3, 3.0)
age = int(float(age_val))
if 0 <= age <= 17:
children_ages.append(age)
except (ValueError, TypeError):
pass
# Check for duplicate child age columns (e.g., child_1_age_duplicate, child_2_age_duplicate)
for i in range(1, 3): # Only 1.1 and 2.1 duplicates mentioned
age_key = f"child_{i}_age_duplicate"
age_val = row.get(age_key, "")
if age_val != "" and age_val is not None:
try:
# Handle both int and float values (e.g., 3, 3.0)
age = int(float(age_val))
if 0 <= age <= 17:
children_ages.append(age)
except (ValueError, TypeError):
pass
# Debug: log extraction details
_LOGGER.debug(
"Row %d: num_children=%d, extracted %d ages: %s",
row_num,
num_children,
len(children_ages),
children_ages,
# Build and create reservation
reservation = self._build_reservation_data(
row, start_date, end_date, num_adults, num_children,
children_ages, fbclid, gclid, hotel_code, row_num
)
# If we extracted ages but num_children says there are different number,
# compact the list to match num_children. Remove ages "0" first
if len(children_ages) > num_children:
# Remove ages "0" first, but only as many as needed
num_to_remove = len(children_ages) - num_children
for _ in range(num_to_remove):
if 0 in children_ages:
children_ages.remove(0)
else:
# If no "0" ages left, just remove the last one
children_ages.pop()
# Generate unique ID (use submission timestamp if available, else row number)
submission_ts = str(row.get("submission_timestamp", "")).strip()
if submission_ts:
submission_id = submission_ts
else:
submission_id = f"csv_import_{row_num}_{datetime.now().isoformat()}"
# Determine hotel code and name
final_hotel_code = (
hotel_code
or str(row.get("hotel_id", "")).strip()
or self.config.get("default_hotel_code", "123")
)
final_hotel_name = (
str(row.get("hotel_name", "")).strip()
or self.config.get("default_hotel_name", "Frangart Inn")
db_reservation = await self.reservation_service.create_reservation(
reservation, customer.id, auto_commit=False
)
stats["created_reservations"] += 1
_LOGGER.info("Created reservation for %s %s", first_name, last_name)
# Parse room type fields if available
room_type_code = str(row.get("room_type_code", "")).strip() or None
room_class_code = str(row.get("room_classification_code", "")).strip() or None
# Build and validate ReservationData
reservation = ReservationData(
unique_id=submission_id,
start_date=start_date,
end_date=end_date,
num_adults=num_adults,
num_children=num_children,
children_ages=children_ages,
hotel_code=final_hotel_code,
hotel_name=final_hotel_name,
offer=str(row.get("room_offer", "")).strip() or None,
user_comment=str(row.get("message", "")).strip() or None,
fbclid=fbclid,
gclid=gclid,
utm_source=str(row.get("utm_source", "")).strip() or None,
utm_medium=str(row.get("utm_medium", "")).strip() or None,
utm_campaign=str(row.get("utm_campaign", "")).strip() or None,
utm_term=str(row.get("utm_term", "")).strip() or None,
utm_content=str(row.get("utm_content", "")).strip() or None,
room_type_code=room_type_code,
room_classification_code=room_class_code,
)
# Create reservation if customer exists
if customer.id:
await self.reservation_service.create_reservation(
reservation, customer.id
# Pre-acknowledge if requested
if pre_acknowledge and db_reservation.md5_unique_id:
await self.reservation_service.record_acknowledgement(
client_id=client_id,
unique_id=db_reservation.md5_unique_id,
username=username,
auto_commit=False
)
stats["created_reservations"] += 1
_LOGGER.info("Created reservation for %s %s", first_name, last_name)
else:
raise ValueError("Failed to get or create customer")
stats["pre_acknowledged"] += 1
@@ -488,6 +425,148 @@ class CSVImporter:
return stats
def _parse_int(self, value: Any, default: int = 0) -> int:
"""Parse value to int, returning default if parsing fails."""
try:
return int(value) if value else default
except (ValueError, TypeError):
return default
def _build_customer_data(self, first_name: str, last_name: str, email: str, row: Any) -> dict:
"""Build customer data dictionary from CSV row."""
return {
"given_name": first_name,
"surname": last_name,
"name_prefix": str(row.get("salutation", "")).strip() or None,
"email_address": email or None,
"phone": str(row.get("phone", "")).strip() or None,
"email_newsletter": self._parse_bool(row.get("newsletter_opt_in")),
"address_line": None,
"city_name": None,
"postal_code": None,
"country_code": None,
"gender": None,
"birth_date": None,
"language": "de",
"address_catalog": False,
"name_title": None,
}
def _build_reservation_data(
self, row: Any, start_date: date, end_date: date, num_adults: int,
num_children: int, children_ages: list[int], fbclid: Optional[str],
gclid: Optional[str], hotel_code: str, row_num: int
) -> ReservationData:
"""Build ReservationData from CSV row."""
submission_ts = str(row.get("submission_timestamp", "")).strip()
submission_id = submission_ts if submission_ts else f"csv_import_{row_num}_{datetime.now().isoformat()}"
final_hotel_code, final_hotel_name = self._get_hotel_info(hotel_code)
room_type_code = str(row.get("room_type_code", "")).strip() or None
room_class_code = str(row.get("room_classification_code", "")).strip() or None
return ReservationData(
unique_id=submission_id,
start_date=start_date,
end_date=end_date,
num_adults=num_adults,
num_children=num_children,
children_ages=children_ages,
hotel_id=final_hotel_code,
hotel_name=final_hotel_name,
offer=str(row.get("room_offer", "")).strip() or None,
user_comment=str(row.get("message", "")).strip() or None,
fbclid=fbclid,
gclid=gclid,
utm_source=str(row.get("utm_source", "")).strip() or None,
utm_medium=str(row.get("utm_medium", "")).strip() or None,
utm_campaign=str(row.get("utm_campaign", "")).strip() or None,
utm_term=str(row.get("utm_term", "")).strip() or None,
utm_content=str(row.get("utm_content", "")).strip() or None,
room_type_code=room_type_code,
room_classification_code=room_class_code,
)
def _parse_date(self, date_str: str) -> Optional[date]:
"""Parse date string in various formats.
Supports: YYYY-MM-DD, DD.MM.YYYY, DD/MM/YYYY
"""
if not date_str or not isinstance(date_str, str):
return None
date_str = date_str.strip()
for fmt in ["%Y-%m-%d", "%d.%m.%Y", "%d/%m/%Y"]:
try:
return datetime.strptime(date_str, fmt).date()
except ValueError:
continue
return None
def _extract_children_ages(self, row: Any, num_children: int) -> tuple[list[int], int, int]:
"""Extract and parse children ages from CSV row.
Handles both CSV format (comma-separated) and individual columns.
Returns (children_ages, adjusted_num_adults, adjusted_num_children) where:
- adjusted_num_adults accounts for 18+ year-olds in the ages list
- adjusted_num_children is the actual count of extracted children ages
"""
children_ages = []
num_adults_adjustment = 0
# Try comma-separated ages first (from leads export format)
kind_ages_csv = str(row.get("kind_ages_csv", "")).strip()
if kind_ages_csv and kind_ages_csv.lower() != "nan":
try:
ages_list = [int(age.strip()) for age in kind_ages_csv.split(",") if age.strip()]
children_ages = [age for age in ages_list if 0 <= age <= 17]
young_adults = [age for age in ages_list if age >= 18]
num_adults_adjustment = len(young_adults)
adjusted_num_children = len(children_ages)
return children_ages, num_adults_adjustment, adjusted_num_children
except (ValueError, TypeError):
pass
# Try individual column ages if no CSV format found
young_adults = []
for i in range(1, 11): # Check child_1_age through child_10_age
age_val = row.get(f"child_{i}_age", "")
if age_val != "" and age_val is not None:
try:
age = int(float(age_val))
if 0 <= age <= 17:
children_ages.append(age)
elif age >= 18:
young_adults.append(age)
except (ValueError, TypeError):
pass
# Check for duplicate child age columns
for i in range(1, 3): # child_1_age_duplicate, child_2_age_duplicate
age_val = row.get(f"child_{i}_age_duplicate", "")
if age_val != "" and age_val is not None:
try:
age = int(float(age_val))
if 0 <= age <= 17:
children_ages.append(age)
elif age >= 18:
young_adults.append(age)
except (ValueError, TypeError):
pass
num_adults_adjustment = len(young_adults)
# Trim ages list if it exceeds num_children
if len(children_ages) > num_children:
num_to_remove = len(children_ages) - num_children
for _ in range(num_to_remove):
if 0 in children_ages:
children_ages.remove(0)
else:
children_ages.pop()
adjusted_num_children = len(children_ages)
return children_ages, num_adults_adjustment, adjusted_num_children
def _parse_bool(self, value: Any) -> Optional[bool]:
"""Parse various boolean representations to bool or None.
@@ -505,7 +584,7 @@ class CSVImporter:
else:
return None
async def _find_or_create_customer(self, customer_data: dict) -> Customer:
async def _find_or_create_customer(self, customer_data: dict, auto_commit: bool = True) -> Customer:
"""Find existing customer or create new one.
Args:
@@ -548,20 +627,10 @@ class CSVImporter:
if existing:
# Update customer data if needed
try:
existing_customer = await self.customer_service.update_customer(
existing, customer_data
)
except Exception as e:
print(customer_data)
print("---")
print(existing)
raise
existing_customer = await self.customer_service.update_customer(
existing, customer_data, auto_commit=auto_commit
)
return existing_customer
# Create new customer
return await self.customer_service.create_customer(customer_data)
return await self.customer_service.create_customer(customer_data, auto_commit=auto_commit)

View File

@@ -6,7 +6,7 @@ from pydantic import ValidationError
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from .db import Customer, HashedCustomer
from .db import Customer
from .logging_config import get_logger
from .schemas import CustomerData
@@ -23,11 +23,12 @@ class CustomerService:
def __init__(self, session: AsyncSession):
self.session = session
async def create_customer(self, customer_data: dict) -> Customer:
async def create_customer(self, customer_data: dict, auto_commit: bool = True) -> Customer:
"""Create a new customer and automatically create its hashed version.
Args:
customer_data: Dictionary containing customer fields
auto_commit: If True, commits the transaction. If False, caller must commit.
Returns:
The created Customer instance (with hashed_version relationship populated)
@@ -52,25 +53,27 @@ class CustomerService:
if "phone" in customer_data:
customer.phone = customer_data["phone"]
# Set creation timestamp
customer.created_at = datetime.now(UTC)
# Update hashed fields
customer.update_hashed_fields()
self.session.add(customer)
await self.session.flush() # Flush to get the customer.id
# Create hashed version
hashed_customer = customer.create_hashed_customer()
hashed_customer.created_at = datetime.now(UTC)
self.session.add(hashed_customer)
await self.session.commit()
await self.session.refresh(customer)
if auto_commit:
await self.session.commit()
await self.session.refresh(customer)
return customer
async def update_customer(self, customer: Customer, update_data: dict) -> Customer:
async def update_customer(self, customer: Customer, update_data: dict, auto_commit: bool = True) -> Customer:
"""Update an existing customer and sync its hashed version.
Args:
customer: The customer to update
update_data: Dictionary of fields to update
auto_commit: If True, commits the transaction. If False, caller must commit.
Returns:
The updated Customer instance
@@ -127,32 +130,12 @@ class CustomerService:
if "phone" in update_data:
customer.phone = update_data["phone"]
# Update or create hashed version
result = await self.session.execute(
select(HashedCustomer).where(HashedCustomer.customer_id == customer.id)
)
hashed_customer = result.scalar_one_or_none()
# Update hashed fields
customer.update_hashed_fields()
if hashed_customer:
# Update existing hashed customer
new_hashed = customer.create_hashed_customer()
hashed_customer.hashed_email = new_hashed.hashed_email
hashed_customer.hashed_phone = new_hashed.hashed_phone
hashed_customer.hashed_given_name = new_hashed.hashed_given_name
hashed_customer.hashed_surname = new_hashed.hashed_surname
hashed_customer.hashed_city = new_hashed.hashed_city
hashed_customer.hashed_postal_code = new_hashed.hashed_postal_code
hashed_customer.hashed_country_code = new_hashed.hashed_country_code
hashed_customer.hashed_gender = new_hashed.hashed_gender
hashed_customer.hashed_birth_date = new_hashed.hashed_birth_date
else:
# Create new hashed customer if it doesn't exist
hashed_customer = customer.create_hashed_customer()
hashed_customer.created_at = datetime.now(UTC)
self.session.add(hashed_customer)
await self.session.commit()
await self.session.refresh(customer)
if auto_commit:
await self.session.commit()
await self.session.refresh(customer)
return customer
@@ -171,7 +154,7 @@ class CustomerService:
)
return result.scalar_one_or_none()
async def get_or_create_customer(self, customer_data: dict) -> Customer:
async def get_or_create_customer(self, customer_data: dict, auto_commit: bool = True) -> Customer:
"""Get existing customer or create new one if not found.
Uses contact_id to identify existing customers if provided.
@@ -179,6 +162,7 @@ class CustomerService:
Args:
customer_data: Dictionary containing customer fields
(contact_id is optional)
auto_commit: If True, commits the transaction. If False, caller must commit.
Returns:
Existing or newly created Customer instance
@@ -190,31 +174,32 @@ class CustomerService:
existing = await self.get_customer_by_contact_id(contact_id)
if existing:
# Update existing customer
return await self.update_customer(existing, customer_data)
return await self.update_customer(existing, customer_data, auto_commit=auto_commit)
# Create new customer (either no contact_id or customer doesn't exist)
return await self.create_customer(customer_data)
return await self.create_customer(customer_data, auto_commit=auto_commit)
async def get_hashed_customer(self, customer_id: int) -> HashedCustomer | None:
async def get_customer(self, customer_id: int) -> Customer | None:
"""Get the hashed version of a customer.
Args:
customer_id: The customer ID
Returns:
HashedCustomer instance if found, None otherwise
Customer instance if found, None otherwise
"""
result = await self.session.execute(
select(HashedCustomer).where(HashedCustomer.customer_id == customer_id)
select(Customer).where(Customer.id == customer_id)
)
return result.scalar_one_or_none()
async def hash_existing_customers(self) -> int:
"""Hash all existing customers that don't have a hashed version yet.
"""Hash all existing customers that don't have hashed fields populated yet.
This is useful for backfilling hashed data for customers created
before the hashing system was implemented.
before the hashing system was implemented, or after migrating from
the separate hashed_customers table.
Also validates and sanitizes customer data (e.g., normalizes country
codes to uppercase). Customers with invalid data that cannot be fixed
@@ -224,62 +209,64 @@ class CustomerService:
Number of customers that were hashed
"""
# Get all customers
result = await self.session.execute(select(Customer))
# Get all customers without hashed data
result = await self.session.execute(
select(Customer).where(Customer.hashed_email.is_(None))
)
customers = result.scalars().all()
hashed_count = 0
skipped_count = 0
for customer in customers:
# Check if this customer already has a hashed version
existing_hashed = await self.get_hashed_customer(customer.id)
if not existing_hashed:
# Validate and sanitize customer data before hashing
customer_dict = {
"given_name": customer.given_name,
"surname": customer.surname,
"name_prefix": customer.name_prefix,
"email_address": customer.email_address,
"phone": customer.phone,
"email_newsletter": customer.email_newsletter,
"address_line": customer.address_line,
"city_name": customer.city_name,
"postal_code": customer.postal_code,
"country_code": customer.country_code,
"gender": customer.gender,
"birth_date": customer.birth_date,
"language": customer.language,
"address_catalog": customer.address_catalog,
"name_title": customer.name_title,
}
# Validate and sanitize customer data before hashing
customer_dict = {
"given_name": customer.given_name,
"surname": customer.surname,
"name_prefix": customer.name_prefix,
"email_address": customer.email_address,
"phone": customer.phone,
"email_newsletter": customer.email_newsletter,
"address_line": customer.address_line,
"city_name": customer.city_name,
"postal_code": customer.postal_code,
"country_code": customer.country_code,
"gender": customer.gender,
"birth_date": customer.birth_date,
"language": customer.language,
"address_catalog": customer.address_catalog,
"name_title": customer.name_title,
}
try:
# Validate through Pydantic (normalizes country code)
validated = CustomerData(**customer_dict)
try:
# Validate through Pydantic (normalizes country code)
validated = CustomerData(**customer_dict)
# Update customer with sanitized data
# Exclude 'phone_numbers' as Customer model uses 'phone' field
for key, value in validated.model_dump(
exclude_none=True, exclude={"phone_numbers"}
).items():
if hasattr(customer, key):
setattr(customer, key, value)
# Update customer with sanitized data
# Exclude 'phone_numbers' as Customer model uses 'phone' field
for key, value in validated.model_dump(
exclude_none=True, exclude={"phone_numbers"}
).items():
if hasattr(customer, key):
setattr(customer, key, value)
# Create hashed version with sanitized data
hashed_customer = customer.create_hashed_customer()
hashed_customer.created_at = datetime.now(UTC)
self.session.add(hashed_customer)
hashed_count += 1
# Update hashed fields with sanitized data
customer.update_hashed_fields()
except ValidationError as e:
# Skip customers with invalid data and log
skipped_count += 1
_LOGGER.warning(
"Skipping customer ID %s due to validation error: %s",
customer.id,
e,
)
# Set created_at if not already set
if not customer.created_at:
customer.created_at = datetime.now(UTC)
hashed_count += 1
except ValidationError as e:
# Skip customers with invalid data and log
skipped_count += 1
_LOGGER.warning(
"Skipping customer ID %s due to validation error: %s",
customer.id,
e,
)
if hashed_count > 0:
await self.session.commit()

View File

@@ -10,9 +10,16 @@ from sqlalchemy import (
Column,
Date,
DateTime,
Double,
ForeignKey,
ForeignKeyConstraint,
Index,
Integer,
MetaData,
PrimaryKeyConstraint,
String,
UniqueConstraint,
func,
)
from sqlalchemy.exc import DBAPIError
from sqlalchemy.ext.asyncio import (
@@ -21,8 +28,9 @@ from sqlalchemy.ext.asyncio import (
async_sessionmaker,
create_async_engine,
)
from sqlalchemy.orm import declarative_base, relationship
from sqlalchemy.orm import backref, declarative_base, foreign, relationship
from .const import WebhookStatus
from .logging_config import get_logger
_LOGGER = get_logger(__name__)
@@ -51,7 +59,16 @@ class Base:
# __table_args__ = {"schema": _SCHEMA}
Base = declarative_base(cls=Base)
# Define naming convention for constraints
metadata = MetaData(naming_convention={
"ix": "ix_%(column_0_label)s",
"uq": "uq_%(table_name)s_%(column_0_name)s",
"ck": "ck_%(table_name)s_%(constraint_name)s",
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
"pk": "pk_%(table_name)s"
})
Base = declarative_base(cls=Base, metadata=metadata)
# Type variable for async functions
T = TypeVar("T")
@@ -295,6 +312,20 @@ class Customer(Base):
language = Column(String)
address_catalog = Column(Boolean) # Added for XML
name_title = Column(String) # Added for XML
# Hashed fields for Meta Conversion API (SHA256)
hashed_email = Column(String(64))
hashed_phone = Column(String(64))
hashed_given_name = Column(String(64))
hashed_surname = Column(String(64))
hashed_city = Column(String(64))
hashed_postal_code = Column(String(64))
hashed_country_code = Column(String(64))
hashed_gender = Column(String(64))
hashed_birth_date = Column(String(64))
created_at = Column(DateTime(timezone=True))
reservations = relationship("Reservation", back_populates="customer")
def __repr__(self):
@@ -319,54 +350,161 @@ class Customer(Base):
# SHA256 hash
return hashlib.sha256(normalized.encode("utf-8")).hexdigest()
def create_hashed_customer(self):
"""Create a HashedCustomer instance from this Customer."""
return HashedCustomer(
customer_id=self.id,
contact_id=self.contact_id,
hashed_email=self._normalize_and_hash(self.email_address),
hashed_phone=self._normalize_and_hash(self.phone),
hashed_given_name=self._normalize_and_hash(self.given_name),
hashed_surname=self._normalize_and_hash(self.surname),
hashed_city=self._normalize_and_hash(self.city_name),
hashed_postal_code=self._normalize_and_hash(self.postal_code),
hashed_country_code=self._normalize_and_hash(self.country_code),
hashed_gender=self._normalize_and_hash(self.gender),
hashed_birth_date=self._normalize_and_hash(self.birth_date),
)
def update_hashed_fields(self):
"""Update the hashed fields based on current plaintext values."""
self.hashed_email = self._normalize_and_hash(self.email_address)
self.hashed_phone = self._normalize_and_hash(self.phone)
self.hashed_given_name = self._normalize_and_hash(self.given_name)
self.hashed_surname = self._normalize_and_hash(self.surname)
self.hashed_city = self._normalize_and_hash(self.city_name)
self.hashed_postal_code = self._normalize_and_hash(self.postal_code)
self.hashed_country_code = self._normalize_and_hash(self.country_code)
self.hashed_gender = self._normalize_and_hash(self.gender)
self.hashed_birth_date = self._normalize_and_hash(self.birth_date)
class HashedCustomer(Base):
"""Hashed customer data for Meta Conversion API.
Stores SHA256 hashed versions of customer PII according to Meta's requirements.
This allows sending conversion events without exposing raw customer data.
class ConversionGuest(Base):
"""Guest information from hotel PMS conversions, with hashed fields for privacy.
Stores both unhashed (for reference during transition) and hashed (SHA256 per Meta API)
versions of guest PII. Uses composite primary key (hotel_id, guest_id) from the PMS.
When multiple conversions for the same guest arrive with different guest info,
the most recent (by last_seen) data is kept as the canonical version.
"""
__tablename__ = "hashed_customers"
id = Column(Integer, primary_key=True)
customer_id = Column(
Integer, ForeignKey("customers.id"), unique=True, nullable=False
)
contact_id = Column(String, unique=True) # Keep unhashed for reference
hashed_email = Column(String(64)) # SHA256 produces 64 hex chars
hashed_phone = Column(String(64))
hashed_given_name = Column(String(64))
hashed_surname = Column(String(64))
hashed_city = Column(String(64))
hashed_postal_code = Column(String(64))
hashed_country_code = Column(String(64))
hashed_gender = Column(String(64))
hashed_birth_date = Column(String(64))
created_at = Column(DateTime(timezone=True))
__tablename__ = "conversion_guests"
customer = relationship("Customer", backref="hashed_version")
# Natural keys from PMS - composite primary key
hotel_id = Column(
String(50),
ForeignKey("hotels.hotel_id", ondelete="CASCADE"),
nullable=False,
primary_key=True,
index=True,
)
guest_id = Column(Integer, nullable=False, primary_key=True, index=True)
# Unhashed guest information (for reference/transition period)
guest_first_name = Column(String)
guest_last_name = Column(String)
guest_email = Column(String)
guest_country_code = Column(String)
guest_birth_date = Column(Date)
# Hashed guest information (SHA256, for privacy compliance)
hashed_first_name = Column(String(64), index=True)
hashed_last_name = Column(String(64), index=True)
hashed_email = Column(String(64), index=True)
hashed_country_code = Column(String(64))
hashed_birth_date = Column(String(64))
# Guest classification
is_regular = Column(
Boolean, default=False
) # True if guest has many prior stays before appearing in our reservations
# Guest classification
is_awareness_guest = Column(
Boolean, default=False
) # True if guests first stay was from our campaigns
# Metadata
first_seen = Column(DateTime(timezone=True))
last_seen = Column(DateTime(timezone=True))
# Relationships
conversions = relationship(
"Conversion",
back_populates="guest",
foreign_keys="[Conversion.hotel_id, Conversion.guest_id]",
primaryjoin="and_(ConversionGuest.hotel_id == foreign(Conversion.hotel_id), "
"ConversionGuest.guest_id == foreign(Conversion.guest_id))",
)
@staticmethod
def _normalize_and_hash(value):
"""Normalize and hash a value according to Meta Conversion API requirements."""
if not value:
return None
# Normalize: lowercase, strip whitespace
normalized = str(value).lower().strip()
# SHA256 hash
return hashlib.sha256(normalized.encode("utf-8")).hexdigest()
@classmethod
def create_from_conversion_data(
cls,
hotel_id: str,
guest_id: int | None,
guest_first_name: str | None,
guest_last_name: str | None,
guest_email: str | None,
guest_country_code: str | None,
guest_birth_date: Date | None,
now: DateTime,
is_regular: bool = False,
):
"""Create a ConversionGuest from conversion guest data."""
return cls(
hotel_id=hotel_id,
guest_id=guest_id,
guest_first_name=guest_first_name,
guest_last_name=guest_last_name,
guest_email=guest_email,
guest_country_code=guest_country_code,
guest_birth_date=guest_birth_date,
hashed_first_name=cls._normalize_and_hash(guest_first_name),
hashed_last_name=cls._normalize_and_hash(guest_last_name),
hashed_email=cls._normalize_and_hash(guest_email),
hashed_country_code=cls._normalize_and_hash(guest_country_code),
hashed_birth_date=cls._normalize_and_hash(
guest_birth_date.isoformat() if guest_birth_date else None
),
is_regular=is_regular,
first_seen=now,
last_seen=now,
)
def update_from_conversion_data(
self,
guest_first_name: str | None,
guest_last_name: str | None,
guest_email: str | None,
guest_country_code: str | None,
guest_birth_date: Date | None,
now: DateTime,
):
"""Update ConversionGuest with newer guest data, preferring non-null values."""
# Only update if new data is provided (not null)
if guest_first_name:
self.guest_first_name = guest_first_name
self.hashed_first_name = self._normalize_and_hash(guest_first_name)
if guest_last_name:
self.guest_last_name = guest_last_name
self.hashed_last_name = self._normalize_and_hash(guest_last_name)
if guest_email:
self.guest_email = guest_email
self.hashed_email = self._normalize_and_hash(guest_email)
if guest_country_code:
self.guest_country_code = guest_country_code
self.hashed_country_code = self._normalize_and_hash(guest_country_code)
if guest_birth_date:
self.guest_birth_date = guest_birth_date
self.hashed_birth_date = self._normalize_and_hash(
guest_birth_date.isoformat()
)
self.last_seen = now
class Reservation(Base):
__tablename__ = "reservations"
id = Column(Integer, primary_key=True)
customer_id = Column(Integer, ForeignKey("customers.id"))
customer_id = Column(Integer, ForeignKey("customers.id", ondelete="SET NULL"))
unique_id = Column(String, unique=True)
md5_unique_id = Column(String(32), unique=True) # max length 32 guaranteed
start_date = Column(Date)
@@ -388,8 +526,8 @@ class Reservation(Base):
# Advertising account IDs (stored conditionally based on fbclid/gclid presence)
meta_account_id = Column(String)
google_account_id = Column(String)
# Add hotel_code and hotel_name for XML
hotel_code = Column(String)
# Add hotel_id and hotel_name for XML
hotel_id = Column(String, ForeignKey("hotels.hotel_id", ondelete="CASCADE"))
hotel_name = Column(String)
# RoomTypes fields (optional)
room_type_code = Column(String)
@@ -415,7 +553,7 @@ class AckedRequest(Base):
) # Username of the client making the request
unique_id = Column(
String, index=True
) # Should match Reservation.form_id or another unique field
) # Matches the md5_unique_id in Reservation
timestamp = Column(DateTime(timezone=True))
@@ -431,6 +569,12 @@ class Conversion(Base):
The tracking data transferered by the PMS is however somewhat shorter.
We therefore also need to match on guest name/email and other metadata.
Attribution flags:
- directly_attributable: True if matched by ID (reservation_id is set), meaning
this conversion is directly responsible for this reservation
- guest_matched: True if matched only by guest details (customer_id/hashed_customer_id set),
meaning the same person made this request but the reservation may not be directly attributable
"""
__tablename__ = "conversions"
@@ -441,25 +585,27 @@ class Conversion(Base):
Integer, ForeignKey("reservations.id"), nullable=True, index=True
)
customer_id = Column(Integer, ForeignKey("customers.id"), nullable=True, index=True)
hashed_customer_id = Column(
Integer, ForeignKey("hashed_customers.id"), nullable=True, index=True
)
# Reservation metadata from XML
hotel_id = Column(String, index=True) # hotelID attribute
pms_reservation_id = Column(String, index=True) # id attribute from reservation
hotel_id = Column(
String(50),
ForeignKey("hotels.hotel_id", ondelete="CASCADE"),
nullable=False,
index=True,
) # hotelID attribute
pms_reservation_id = Column(
Integer, nullable=False, index=True
) # id attribute from reservation
guest_id = Column(
Integer, nullable=True, index=True
) # PMS guest ID, FK to conversion_guests
reservation_number = Column(String) # number attribute
reservation_date = Column(Date) # date attribute (when reservation was made)
creation_time = Column(DateTime(timezone=True)) # creationTime attribute
reservation_type = Column(String) # type attribute (e.g., "reservation")
booking_channel = Column(String) # bookingChannel attribute
# Guest information from reservation XML - used for matching
guest_first_name = Column(String, index=True) # firstName from guest element
guest_last_name = Column(String, index=True) # lastName from guest element
guest_email = Column(String, index=True) # email from guest element
guest_country_code = Column(String) # countryCode from guest element
# Advertising/tracking data - used for matching to existing reservations
advertising_medium = Column(
String, index=True
@@ -471,14 +617,38 @@ class Conversion(Base):
String, index=True
) # advertisingCampagne (contains fbclid/gclid)
# Attribution flags - track how this conversion was matched
directly_attributable = Column(
Boolean, default=False
) # Matched by ID (high confidence)
guest_matched = Column(Boolean, default=False) # Matched by guest details only
# Metadata
created_at = Column(DateTime(timezone=True)) # When this record was imported
updated_at = Column(DateTime(timezone=True)) # When this record was last updated
# Table constraints
__table_args__ = (
UniqueConstraint(
"hotel_id", "pms_reservation_id", name="uq_conversion_hotel_reservation"
),
ForeignKeyConstraint(
["hotel_id", "guest_id"],
["conversion_guests.hotel_id", "conversion_guests.guest_id"],
name="fk_conversions_guest",
),
)
# Relationships
reservation = relationship("Reservation", backref="conversions")
customer = relationship("Customer", backref="conversions")
hashed_customer = relationship("HashedCustomer", backref="conversions")
guest = relationship(
"ConversionGuest",
back_populates="conversions",
foreign_keys="[Conversion.hotel_id, Conversion.guest_id]",
primaryjoin="and_(Conversion.hotel_id == ConversionGuest.hotel_id, "
"Conversion.guest_id == ConversionGuest.guest_id)",
)
conversion_rooms = relationship(
"ConversionRoom", back_populates="conversion", cascade="all, delete-orphan"
)
@@ -527,7 +697,7 @@ class ConversionRoom(Base):
# Extracted total revenue for efficient querying (sum of all revenue_total in daily_sales)
# Kept as string to preserve decimal precision
total_revenue = Column(String, nullable=True)
total_revenue = Column(Double, nullable=True)
# Metadata
created_at = Column(DateTime(timezone=True)) # When this record was imported
@@ -535,3 +705,192 @@ class ConversionRoom(Base):
# Relationships
conversion = relationship("Conversion", back_populates="conversion_rooms")
class HotelInventory(Base):
"""Room and category definitions synchronized via AlpineBits."""
__tablename__ = "hotel_inventory"
id = Column(Integer, primary_key=True)
hotel_id = Column(
String(50),
ForeignKey("hotels.hotel_id", ondelete="CASCADE"),
nullable=False,
index=True,
)
inv_type_code = Column(String(8), nullable=False, index=True)
inv_code = Column(String(16), nullable=True, index=True)
room_name = Column(String(200), nullable=True)
max_occupancy = Column(Integer, nullable=True)
source = Column(String(20), nullable=False)
first_seen = Column(DateTime(timezone=True), nullable=False)
last_updated = Column(DateTime(timezone=True), nullable=False)
hotel = relationship("Hotel", back_populates="inventory_items")
availability = relationship(
"RoomAvailability",
back_populates="inventory_item",
cascade="all, delete-orphan",
passive_deletes=True,
)
__table_args__ = (
Index(
"uq_hotel_inventory_unique_key",
"hotel_id",
"inv_type_code",
func.coalesce(inv_code, ""),
unique=True,
),
)
class RoomAvailability(Base):
"""Daily availability counts for inventory items."""
__tablename__ = "room_availability"
inventory_id = Column(
Integer,
ForeignKey("hotel_inventory.id", ondelete="CASCADE"),
nullable=False,
)
date = Column(Date, nullable=False)
bookable_type_2 = Column(Integer, nullable=True)
out_of_order_type_6 = Column(Integer, nullable=True)
not_bookable_type_9 = Column(Integer, nullable=True)
is_closing_season = Column(Boolean, nullable=False, default=False)
last_updated = Column(DateTime(timezone=True), nullable=False)
update_type = Column(String(20), nullable=False)
inventory_item = relationship("HotelInventory", back_populates="availability")
__table_args__ = (
PrimaryKeyConstraint("inventory_id", "date", name="pk_room_availability"),
)
class Hotel(Base):
"""Hotel configuration (migrated from alpine_bits_auth in config.yaml)."""
__tablename__ = "hotels"
id = Column(Integer, primary_key=True)
# Core identification
hotel_id = Column(String(50), unique=True, nullable=False, index=True)
hotel_name = Column(String(200), nullable=False)
# AlpineBits authentication
username = Column(String(100), unique=True, nullable=False, index=True)
password_hash = Column(String(200), nullable=False) # bcrypt
# Advertising accounts
meta_account_id = Column(String(50), nullable=True)
google_account_id = Column(String(50), nullable=True)
# Push endpoint (optional)
push_endpoint_url = Column(String(500), nullable=True)
push_endpoint_token = Column(String(200), nullable=True)
push_endpoint_username = Column(String(100), nullable=True)
# Metadata
created_at = Column(DateTime(timezone=True), nullable=False)
updated_at = Column(DateTime(timezone=True), nullable=False)
is_active = Column(Boolean, default=True, nullable=False, index=True)
# Relationships
webhook_endpoints = relationship("WebhookEndpoint", back_populates="hotel")
inventory_items = relationship(
"HotelInventory", back_populates="hotel", cascade="all, delete-orphan"
)
class WebhookEndpoint(Base):
"""Webhook configurations per hotel (supports multiple webhook types per hotel)."""
__tablename__ = "webhook_endpoints"
id = Column(Integer, primary_key=True)
# Hotel association
hotel_id = Column(
String(50), ForeignKey("hotels.hotel_id"), nullable=False, index=True
)
# Webhook configuration
webhook_secret = Column(String(64), unique=True, nullable=False, index=True)
webhook_type = Column(String(50), nullable=False) # 'wix_form', 'generic', etc.
# Metadata
description = Column(String(200), nullable=True) # Human-readable label
is_enabled = Column(Boolean, default=True, nullable=False)
created_at = Column(DateTime(timezone=True), nullable=False)
# Relationships
hotel = relationship("Hotel", back_populates="webhook_endpoints")
webhook_requests = relationship("WebhookRequest", back_populates="webhook_endpoint")
__table_args__ = (
Index("idx_webhook_endpoint_hotel_type", "hotel_id", "webhook_type"),
)
class WebhookRequest(Base):
"""Tracks incoming webhooks for deduplication and retry handling."""
__tablename__ = "webhook_requests"
id = Column(Integer, primary_key=True)
# Request identification
payload_hash = Column(String(64), unique=True, nullable=False, index=True) # SHA256
webhook_endpoint_id = Column(
Integer, ForeignKey("webhook_endpoints.id"), nullable=True, index=True
)
hotel_id = Column(
String(50), ForeignKey("hotels.hotel_id"), nullable=True, index=True
)
# Processing tracking
status = Column(
String(20), nullable=False, default=WebhookStatus.PENDING.value, index=True
)
# Status values: 'pending', 'processing', 'completed', 'failed' set by Enum WebhookStatus
processing_started_at = Column(DateTime(timezone=True), nullable=True)
processing_completed_at = Column(DateTime(timezone=True), nullable=True)
# Retry handling
retry_count = Column(Integer, default=0)
last_error = Column(String(2000), nullable=True)
# Payload storage
payload_json = Column(JSON, nullable=True) # NULL after purge, kept for retries
purged_at = Column(DateTime(timezone=True), nullable=True) # When JSON was purged
# Metadata
created_at = Column(DateTime(timezone=True), nullable=False, index=True)
source_ip = Column(String(45), nullable=True)
user_agent = Column(String(500), nullable=True)
# Result tracking
created_customer_id = Column(Integer, ForeignKey("customers.id"), nullable=True)
created_reservation_id = Column(
Integer, ForeignKey("reservations.id"), nullable=True
)
# Relationships
webhook_endpoint = relationship(
"WebhookEndpoint", back_populates="webhook_requests"
)
hotel = relationship("Hotel")
customer = relationship("Customer")
reservation = relationship("Reservation")
__table_args__ = (
Index("idx_webhook_status_created", "status", "created_at"),
Index("idx_webhook_hotel_created", "hotel_id", "created_at"),
Index("idx_webhook_purge_candidate", "status", "purged_at", "created_at"),
)

View File

@@ -7,13 +7,18 @@ before the application starts accepting requests. It includes:
"""
import asyncio
from datetime import UTC, datetime
from typing import Any
from sqlalchemy import select, text
from sqlalchemy.ext.asyncio import AsyncEngine, async_sessionmaker
from sqlalchemy.orm import selectinload
from .const import CONF_GOOGLE_ACCOUNT, CONF_HOTEL_ID, CONF_META_ACCOUNT, WebhookStatus
from .customer_service import CustomerService
from .db import create_database_engine
from .db import WebhookEndpoint, WebhookRequest, create_database_engine
from .logging_config import get_logger
from .webhook_processor import webhook_registry
_LOGGER = get_logger(__name__)
@@ -62,8 +67,332 @@ async def setup_database(config: dict[str, Any] | None = None) -> tuple[AsyncEng
raise
async def backfill_advertising_account_ids(
engine: AsyncEngine, config: dict[str, Any]
) -> None:
"""Backfill advertising account IDs for existing reservations.
Updates existing reservations to populate meta_account_id and google_account_id
based on the conditional logic:
- If fbclid is present, set meta_account_id from hotel config
- If gclid is present, set google_account_id from hotel config
This is a startup task that runs after schema migrations to ensure
existing data is consistent with config.
Args:
engine: SQLAlchemy async engine
config: Application configuration dict
"""
_LOGGER.info("Backfilling advertising account IDs for existing reservations...")
# Build a mapping of hotel_id -> account IDs from config
hotel_accounts = {}
alpine_bits_auth = config.get("alpine_bits_auth", [])
for hotel in alpine_bits_auth:
hotel_id = hotel.get(CONF_HOTEL_ID)
meta_account = hotel.get(CONF_META_ACCOUNT)
google_account = hotel.get(CONF_GOOGLE_ACCOUNT)
if hotel_id:
hotel_accounts[hotel_id] = {
"meta_account": meta_account,
"google_account": google_account,
}
if not hotel_accounts:
_LOGGER.debug("No hotel accounts found in config, skipping backfill")
return
_LOGGER.info("Found %d hotel(s) with account configurations", len(hotel_accounts))
# Update reservations with meta_account_id where fbclid is present
meta_updated = 0
for hotel_id, accounts in hotel_accounts.items():
if accounts["meta_account"]:
async with engine.begin() as conn:
sql = text(
"UPDATE reservations "
"SET meta_account_id = :meta_account "
"WHERE hotel_id = :hotel_id "
"AND fbclid IS NOT NULL "
"AND fbclid != '' "
"AND (meta_account_id IS NULL OR meta_account_id = '')"
)
result = await conn.execute(
sql,
{"meta_account": accounts["meta_account"], "hotel_id": hotel_id},
)
count = result.rowcount
if count > 0:
_LOGGER.info(
"Updated %d reservations with meta_account_id for hotel %s",
count,
hotel_id,
)
meta_updated += count
# Update reservations with google_account_id where gclid is present
google_updated = 0
for hotel_id, accounts in hotel_accounts.items():
if accounts["google_account"]:
async with engine.begin() as conn:
sql = text(
"UPDATE reservations "
"SET google_account_id = :google_account "
"WHERE hotel_id = :hotel_id "
"AND gclid IS NOT NULL "
"AND gclid != '' "
"AND (google_account_id IS NULL OR google_account_id = '')"
)
result = await conn.execute(
sql,
{
"google_account": accounts["google_account"],
"hotel_id": hotel_id,
},
)
count = result.rowcount
if count > 0:
_LOGGER.info(
"Updated %d reservations with google_account_id for hotel %s",
count,
hotel_id,
)
google_updated += count
if meta_updated > 0 or google_updated > 0:
_LOGGER.info(
"Backfill complete: %d reservations updated with meta_account_id, "
"%d with google_account_id",
meta_updated,
google_updated,
)
async def backfill_acked_requests_username(
engine: AsyncEngine, config: dict[str, Any]
) -> None:
"""Backfill username for existing acked_requests records.
For each acknowledgement, find the corresponding reservation to determine
its hotel_code, then look up the username for that hotel in the config
and update the acked_request record.
This is a startup task that runs after schema migrations to ensure
existing data is consistent with config.
Args:
engine: SQLAlchemy async engine
config: Application configuration dict
"""
_LOGGER.info("Backfilling usernames for existing acked_requests...")
# Build a mapping of hotel_id -> username from config
hotel_usernames = {}
alpine_bits_auth = config.get("alpine_bits_auth", [])
for hotel in alpine_bits_auth:
hotel_id = hotel.get(CONF_HOTEL_ID)
username = hotel.get("username")
if hotel_id and username:
hotel_usernames[hotel_id] = username
if not hotel_usernames:
_LOGGER.debug("No hotel usernames found in config, skipping backfill")
return
_LOGGER.info("Found %d hotel(s) with usernames in config", len(hotel_usernames))
# Update acked_requests with usernames by matching to reservations
total_updated = 0
async with engine.begin() as conn:
for hotel_id, username in hotel_usernames.items():
sql = text(
"""
UPDATE acked_requests
SET username = :username
WHERE unique_id IN (
SELECT md5_unique_id FROM reservations WHERE hotel_id = :hotel_id
)
AND username IS NULL
"""
)
result = await conn.execute(
sql, {"username": username, "hotel_id": hotel_id}
)
count = result.rowcount
if count > 0:
_LOGGER.info(
"Updated %d acknowledgements with username for hotel %s",
count,
hotel_id,
)
total_updated += count
if total_updated > 0:
_LOGGER.info(
"Backfill complete: %d acknowledgements updated with username",
total_updated,
)
async def reprocess_stuck_webhooks(
sessionmaker: async_sessionmaker,
config: dict[str, Any] | None = None,
) -> None:
"""Reprocess webhooks that were stuck in 'processing' state.
Finds webhooks with status='processing' and reprocesses them.
These are webhooks that were not fully processed in the previous run,
likely due to a crash or unexpected shutdown.
This function is designed to NEVER block application startup.
All errors are caught and logged, but the app will start regardless.
Args:
sessionmaker: SQLAlchemy async sessionmaker
config: Application configuration dictionary
"""
try:
_LOGGER.info("Checking for stuck webhooks to reprocess...")
async with sessionmaker() as session:
# Find all webhooks stuck in 'processing' state
result = await session.execute(
select(WebhookRequest)
.where(WebhookRequest.status == WebhookStatus.PROCESSING)
.options(
selectinload(WebhookRequest.webhook_endpoint).selectinload(
WebhookEndpoint.hotel
)
)
)
stuck_webhooks: list[WebhookRequest] = result.scalars().all()
if not stuck_webhooks:
_LOGGER.info("No stuck webhooks found")
return
_LOGGER.info("Found %d stuck webhooks to reprocess", len(stuck_webhooks))
reprocessed_count = 0
failed_count = 0
for webhook_request in stuck_webhooks:
webhook_id = webhook_request.id
webhook_endpoint = webhook_request.webhook_endpoint
if not webhook_endpoint:
_LOGGER.error(
"Webhook request %d has no webhook_endpoint, skipping", webhook_id
)
webhook_request.status = WebhookStatus.FAILED
webhook_request.last_error = (
"No webhook endpoint found during startup reprocessing"
)
webhook_request.processing_completed_at = datetime.now(UTC)
failed_count += 1
continue
if not webhook_request.payload_json:
_LOGGER.error(
"Webhook request %d has no payload (purged?), marking as failed",
webhook_id,
)
webhook_request.status = WebhookStatus.FAILED
webhook_request.last_error = (
"No payload available for reprocessing (purged)"
)
webhook_request.processing_completed_at = datetime.now(UTC)
failed_count += 1
continue
try:
_LOGGER.info(
"Reprocessing webhook %d (hotel=%s, type=%s)",
webhook_id,
webhook_endpoint.hotel_id,
webhook_endpoint.webhook_type,
)
# Get processor for webhook_type
processor = webhook_registry.get_processor(
webhook_endpoint.webhook_type
)
if not processor:
raise ValueError(
f"No processor for type: {webhook_endpoint.webhook_type}"
)
# Reprocess webhook with simplified interface
result = await processor.process(
webhook_request=webhook_request,
db_session=session,
config=config,
)
# Check result status
result_status = result.get("status") if isinstance(result, dict) else "success"
if result_status == "duplicate":
# Duplicate is not an error - mark as completed and continue
webhook_request.status = WebhookStatus.COMPLETED
webhook_request.processing_completed_at = datetime.now(UTC)
reprocessed_count += 1
_LOGGER.info(
"Webhook %d was a duplicate (already processed), marked as completed",
webhook_id
)
elif result_status in ("success", "completed"):
# Update status to completed
webhook_request.status = WebhookStatus.COMPLETED
webhook_request.processing_completed_at = datetime.now(UTC)
reprocessed_count += 1
_LOGGER.info("Successfully reprocessed webhook %d", webhook_id)
else:
# Unexpected status - treat as failure
_LOGGER.warning(
"Webhook %d returned unexpected status: %s",
webhook_id,
result_status
)
webhook_request.status = WebhookStatus.FAILED
webhook_request.last_error = f"Unexpected status: {result_status}"
webhook_request.processing_completed_at = datetime.now(UTC)
failed_count += 1
except Exception as e:
_LOGGER.exception("Failed to reprocess webhook %d: %s", webhook_id, e)
webhook_request.status = WebhookStatus.FAILED
webhook_request.last_error = (
f"Reprocessing failed during startup: {str(e)[:1950]}"
)
webhook_request.processing_completed_at = datetime.now(UTC)
failed_count += 1
# Commit all changes
await session.commit()
_LOGGER.info(
"Webhook reprocessing complete: %d successful, %d failed",
reprocessed_count,
failed_count,
)
except Exception as e:
# CRITICAL: Never let reprocessing block application startup
_LOGGER.exception(
"CRITICAL ERROR during webhook reprocessing, but allowing app to start: %s",
e
)
async def run_startup_tasks(
sessionmaker: async_sessionmaker, config: dict[str, Any] | None = None
sessionmaker: async_sessionmaker,
config: dict[str, Any] | None = None,
engine: AsyncEngine | None = None,
) -> None:
"""Run one-time startup tasks.
@@ -73,7 +402,20 @@ async def run_startup_tasks(
Args:
sessionmaker: SQLAlchemy async sessionmaker
config: Application configuration dictionary
engine: SQLAlchemy async engine (optional, for backfill tasks)
"""
# Sync config to database (hotels and webhook endpoints)
if config:
from .hotel_service import sync_config_to_database
async with sessionmaker() as session:
stats = await sync_config_to_database(session, config)
_LOGGER.info(
"Config sync: %d hotels created, %d updated, %d endpoints created",
stats["hotels_created"],
stats["hotels_updated"],
stats["endpoints_created"]
)
# Hash any existing customers that don't have hashed data
async with sessionmaker() as session:
customer_service = CustomerService(session)
@@ -83,4 +425,18 @@ async def run_startup_tasks(
"Backfilled hashed data for %d existing customers", hashed_count
)
else:
_LOGGER.info("All existing customers already have hashed data")
_LOGGER.debug("All existing customers already have hashed data")
# Backfill advertising account IDs and usernames based on config
# This ensures existing data is consistent with current configuration
if config and engine:
await backfill_advertising_account_ids(engine, config)
await backfill_acked_requests_username(engine, config)
elif config and not engine:
_LOGGER.warning(
"No engine provided to run_startup_tasks, "
"skipping config-based backfill tasks"
)
# Reprocess stuck webhooks (those stuck in 'processing' state)
await reprocess_stuck_webhooks(sessionmaker, config)

View File

@@ -523,10 +523,10 @@ class ReservationStatsCollector:
async with self.async_sessionmaker() as session:
# Query reservations created in the reporting period
result = await session.execute(
select(Reservation.hotel_code, func.count(Reservation.id))
select(Reservation.hotel_id, func.count(Reservation.id))
.where(Reservation.created_at >= period_start)
.where(Reservation.created_at < period_end)
.group_by(Reservation.hotel_code)
.group_by(Reservation.hotel_id)
)
hotel_counts = dict(result.all())

View File

@@ -0,0 +1,777 @@
"""Action handler for OTA_HotelInvCountNotif:FreeRooms."""
from __future__ import annotations
from dataclasses import dataclass
from datetime import UTC, date, datetime, timedelta
from typing import Any
from sqlalchemy import delete, select
from sqlalchemy.dialects.postgresql import insert as pg_insert
from sqlalchemy.dialects.sqlite import insert as sqlite_insert
from sqlalchemy.ext.asyncio import AsyncSession
from xsdata.formats.dataclass.serializers.config import SerializerConfig
from xsdata_pydantic.bindings import XmlParser, XmlSerializer
from .alpinebits_server import (
AlpineBitsAction,
AlpineBitsActionName,
AlpineBitsClientInfo,
AlpineBitsResponse,
Version,
validate_hotel_authentication,
)
from .const import HttpStatusCode
from .db import Hotel, HotelInventory, RoomAvailability
from .generated import (
ErrorType,
InvCountCountType,
OtaHotelInvCountNotifRq,
OtaHotelInvCountNotifRs,
UniqueIdInstance,
)
from .logging_config import get_logger
_LOGGER = get_logger(__name__)
SUPPORTED_CAPABILITIES = [
"OTA_HotelInvCountNotif_accept_rooms",
"OTA_HotelInvCountNotif_accept_categories",
"OTA_HotelInvCountNotif_accept_deltas",
"OTA_HotelInvCountNotif_accept_complete_set",
"OTA_HotelInvCountNotif_accept_out_of_order",
"OTA_HotelInvCountNotif_accept_out_of_market",
"OTA_HotelInvCountNotif_accept_closing_seasons",
]
CLOSING_SEASON_TYPE = "__CLOSE" # <= 8 chars per spec
SOURCE_FREEROOMS = "FreeRooms"
COUNT_TYPE_MAP = {
InvCountCountType.VALUE_2: "bookable_type_2",
InvCountCountType.VALUE_6: "out_of_order_type_6",
InvCountCountType.VALUE_9: "not_bookable_type_9",
}
@dataclass
class FreeRoomsProcessingError(Exception):
"""Custom exception that carries HTTP and OTA error metadata."""
message: str
status_code: HttpStatusCode = HttpStatusCode.BAD_REQUEST
error_type: ErrorType = ErrorType.VALUE_13
code: str = "450"
def __str__(self) -> str:
return self.message
class FreeRoomsAction(AlpineBitsAction):
"""Handler for OTA_HotelInvCountNotif:FreeRooms requests."""
def __init__(self, config: dict | None = None):
self.name = AlpineBitsActionName.OTA_HOTEL_INV_COUNT_NOTIF_FREE_ROOMS
self.version = [Version.V2024_10, Version.V2022_10]
self.config = config or {}
self.supports = SUPPORTED_CAPABILITIES
self._parser = XmlParser()
self._serializer = XmlSerializer(
config=SerializerConfig(
pretty_print=True,
xml_declaration=True,
encoding="UTF-8",
)
)
async def handle(
self,
action: str,
request_xml: str,
version: Version,
client_info: AlpineBitsClientInfo,
dbsession: AsyncSession | None = None,
server_capabilities=None,
) -> AlpineBitsResponse:
"""Process FreeRooms inventory updates."""
try:
self._validate_action_name(action)
if request_xml is None:
raise FreeRoomsProcessingError("Missing request payload")
if dbsession is None:
raise FreeRoomsProcessingError(
"Database session unavailable",
HttpStatusCode.INTERNAL_SERVER_ERROR,
)
try:
request = self._parser.from_string(request_xml, OtaHotelInvCountNotifRq)
except Exception as exc: # pragma: no cover - serialization already tested upstream
_LOGGER.exception("Failed to parse FreeRooms request: %s", exc)
raise FreeRoomsProcessingError("Invalid XML payload") from exc
hotel_code = request.inventories.hotel_code if request.inventories else None
if not hotel_code:
raise FreeRoomsProcessingError("HotelCode attribute is required")
if not client_info or not client_info.username or not client_info.password:
raise FreeRoomsProcessingError(
"Missing authentication context",
HttpStatusCode.UNAUTHORIZED,
error_type=ErrorType.VALUE_11,
code="401",
)
if not await validate_hotel_authentication(
client_info.username,
client_info.password,
hotel_code,
self.config,
dbsession,
):
raise FreeRoomsProcessingError(
f"Unauthorized FreeRooms notification for hotel {hotel_code}",
HttpStatusCode.UNAUTHORIZED,
error_type=ErrorType.VALUE_11,
code="401",
)
hotel = await self._fetch_hotel(dbsession, hotel_code)
if hotel is None:
raise FreeRoomsProcessingError(
f"Hotel {hotel_code} is not provisioned on this server"
)
is_complete_set = (
request.unique_id is not None
and request.unique_id.instance == UniqueIdInstance.COMPLETE_SET
)
update_type = "CompleteSet" if is_complete_set else "Delta"
inventory_cache: dict[tuple[str, str | None], HotelInventory] = {}
try:
if is_complete_set:
await self._process_complete_set(
dbsession, hotel, request, update_type, inventory_cache
)
else:
await self._process_delta(
dbsession, hotel, request, update_type, inventory_cache
)
await dbsession.commit()
except FreeRoomsProcessingError:
await dbsession.rollback()
raise
except Exception as exc: # pragma: no cover - defensive
await dbsession.rollback()
_LOGGER.exception("Unexpected FreeRooms failure: %s", exc)
return self._error_response(
"Internal server error while processing FreeRooms notification",
HttpStatusCode.INTERNAL_SERVER_ERROR,
)
_LOGGER.info(
"Processed FreeRooms %s update for hotel %s (%d inventory items)",
update_type,
hotel_code,
len(request.inventories.inventory),
)
return self._success_response()
except FreeRoomsProcessingError as exc:
return self._error_response(
exc.message,
exc.status_code,
error_type=exc.error_type,
code=exc.code,
)
def _validate_action_name(self, action: str) -> None:
expected = self.name.value[1]
if (action or "").strip() != expected:
raise FreeRoomsProcessingError(
f"Invalid action {action}, expected {expected}",
HttpStatusCode.BAD_REQUEST,
)
async def _fetch_hotel(self, session: AsyncSession, hotel_code: str) -> Hotel | None:
stmt = select(Hotel).where(Hotel.hotel_id == hotel_code, Hotel.is_active.is_(True))
result = await session.execute(stmt)
return result.scalar_one_or_none()
def _validate_request(
self,
request: OtaHotelInvCountNotifRq,
update_type: str,
enforce_closing_order: bool,
) -> None:
"""
Validate the entire request before making any database changes.
This performs all validation checks upfront to fail fast and avoid
expensive rollbacks of database operations.
Args:
request: The parsed OTA request
update_type: "CompleteSet" or "Delta"
enforce_closing_order: Whether to enforce closing seasons must come first
Raises:
FreeRoomsProcessingError: If any validation fails
"""
inventories = request.inventories.inventory if request.inventories else []
if not inventories:
raise FreeRoomsProcessingError(
"Request must include at least one Inventory block",
HttpStatusCode.BAD_REQUEST,
)
# Special case: CompleteSet with single empty Inventory element to reset all availability
if (
update_type == "CompleteSet"
and len(inventories) == 1
and inventories[0].status_application_control is None
and inventories[0].inv_counts is None
):
# This is valid - it's a reset request
return
encountered_standard = False
has_categories = False # Tracks if we've seen category reports (no InvCode)
has_rooms = False # Tracks if we've seen individual room reports (with InvCode)
closing_season_ranges: list[tuple[date, date]] = []
# Track date ranges per room/category to detect overlaps
inventory_ranges: dict[tuple[str, str | None], list[tuple[date, date]]] = {}
for inventory in inventories:
sac = inventory.status_application_control
if sac is None:
raise FreeRoomsProcessingError(
"StatusApplicationControl element is required for each Inventory",
HttpStatusCode.BAD_REQUEST,
)
is_closing = self._is_closing_season(sac)
# Validate closing seasons
if is_closing:
# Closing seasons are only allowed in CompleteSet - fail fast
if update_type != "CompleteSet":
raise FreeRoomsProcessingError(
"Closing seasons are only allowed on CompleteSet updates",
HttpStatusCode.BAD_REQUEST,
)
if inventory.inv_counts is not None:
raise FreeRoomsProcessingError(
"Closing seasons cannot contain InvCounts data",
HttpStatusCode.BAD_REQUEST,
)
if enforce_closing_order and encountered_standard:
raise FreeRoomsProcessingError(
"Closing seasons must appear before other inventory entries",
HttpStatusCode.BAD_REQUEST,
)
if sac.inv_type_code or sac.inv_code:
raise FreeRoomsProcessingError(
"Closing season entries cannot specify InvTypeCode or InvCode",
HttpStatusCode.BAD_REQUEST,
)
# Validate and store date range
start_date, end_date = self._parse_date_range(sac.start, sac.end)
closing_season_ranges.append((start_date, end_date))
continue
# Mark that we've seen a non-closing inventory entry
encountered_standard = True
# Validate standard inventory entries
inv_type_code = (sac.inv_type_code or "").strip()
if not inv_type_code:
error_message = "InvTypeCode is required unless AllInvCode=\"true\" or similar truthy values"
_LOGGER.info(error_message)
raise FreeRoomsProcessingError(
error_message,
HttpStatusCode.BAD_REQUEST,
)
# Validate date range
start_date, end_date = self._parse_date_range(sac.start, sac.end)
# Check if this inventory entry has any counts (available rooms)
# Entries without counts represent unavailable rooms
has_availability = inventory.inv_counts is not None and inventory.inv_counts.inv_count
# Check for overlap with closing seasons
# Only entries with availability (counts) cannot overlap with closing seasons
# Entries without counts (unavailable rooms) can overlap with closing seasons
if has_availability:
for closing_start, closing_end in closing_season_ranges:
if self._date_ranges_overlap(start_date, end_date, closing_start, closing_end):
error_message = f"Inventory entry ({start_date} to {end_date}) overlaps with closing season ({closing_start} to {closing_end})"
_LOGGER.info(error_message)
raise FreeRoomsProcessingError(
error_message,
HttpStatusCode.BAD_REQUEST,
)
# Check for overlap with other inventory entries for the same room/category
inv_code = sac.inv_code.strip() if sac.inv_code else None
inventory_key = (inv_type_code, inv_code)
if inventory_key in inventory_ranges:
for existing_start, existing_end in inventory_ranges[inventory_key]:
if self._date_ranges_overlap(start_date, end_date, existing_start, existing_end):
room_desc = f"room '{inv_code}'" if inv_code else f"category '{inv_type_code}'"
raise FreeRoomsProcessingError(
f"Overlapping date ranges for {room_desc}: ({start_date} to {end_date}) and ({existing_start} to {existing_end})",
HttpStatusCode.BAD_REQUEST,
)
else:
inventory_ranges[inventory_key] = []
inventory_ranges[inventory_key].append((start_date, end_date))
# Validate that we don't mix categories and individual rooms
has_inv_code = sac.inv_code is not None and sac.inv_code.strip() != ""
if has_inv_code:
if has_categories:
raise FreeRoomsProcessingError(
"Mixing room categories and individual rooms in one request is not allowed",
HttpStatusCode.BAD_REQUEST,
)
has_rooms = True
else:
if has_rooms:
raise FreeRoomsProcessingError(
"Mixing room categories and individual rooms in one request is not allowed",
HttpStatusCode.BAD_REQUEST,
)
has_categories = True
# Validate counts
self._extract_counts(inventory.inv_counts)
# Check for overlapping closing seasons
for i, (start1, end1) in enumerate(closing_season_ranges):
for start2, end2 in closing_season_ranges[i + 1:]:
if self._date_ranges_overlap(start1, end1, start2, end2):
raise FreeRoomsProcessingError(
f"Closing seasons overlap: ({start1} to {end1}) and ({start2} to {end2})",
HttpStatusCode.BAD_REQUEST,
)
async def _process_complete_set(
self,
session: AsyncSession,
hotel: Hotel,
request: OtaHotelInvCountNotifRq,
update_type: str,
inventory_cache: dict[tuple[str, str | None], HotelInventory],
) -> None:
# Validate first before making any database changes
self._validate_request(request, update_type, enforce_closing_order=True)
# Only delete if validation passes
# Delete availability data for all FreeRooms-sourced inventory
await self._delete_existing_availability(session, hotel.hotel_id)
# Delete stale inventory items that are sourced from FreeRooms
await self._delete_existing_inventory(session, hotel.hotel_id)
# Process the validated request
await self._process_inventories(
session, hotel, request, update_type, inventory_cache, enforce_closing_order=True
)
async def _process_delta(
self,
session: AsyncSession,
hotel: Hotel,
request: OtaHotelInvCountNotifRq,
update_type: str,
inventory_cache: dict[tuple[str, str | None], HotelInventory],
) -> None:
# Validate first before making any database changes
self._validate_request(request, update_type, enforce_closing_order=False)
# Process the validated request
await self._process_inventories(
session, hotel, request, update_type, inventory_cache, enforce_closing_order=False
)
async def _delete_existing_availability(
self,
session: AsyncSession,
hotel_id: str,
) -> None:
"""Delete all room availability data for a hotel (regardless of source)."""
subquery = select(HotelInventory.id).where(HotelInventory.hotel_id == hotel_id)
await session.execute(
delete(RoomAvailability).where(RoomAvailability.inventory_id.in_(subquery))
)
async def _delete_existing_inventory(
self,
session: AsyncSession,
hotel_id: str,
) -> None:
"""Delete inventory items sourced from FreeRooms.
This preserves inventory items from other sources (e.g., HotelInventory endpoint)
as they are not managed by FreeRooms and should persist across CompleteSet updates.
"""
await session.execute(
delete(HotelInventory).where(
HotelInventory.hotel_id == hotel_id,
HotelInventory.source == SOURCE_FREEROOMS,
)
)
async def _process_inventories(
self,
session: AsyncSession,
hotel: Hotel,
request: OtaHotelInvCountNotifRq,
update_type: str,
inventory_cache: dict[tuple[str, str | None], HotelInventory],
enforce_closing_order: bool,
) -> None:
"""
Process validated inventory data and store in database.
Note: Validation should be done before calling this method via _validate_request().
This method focuses on data transformation and persistence.
"""
inventories = request.inventories.inventory if request.inventories else []
rows_to_upsert: list[dict[str, Any]] = []
now = datetime.now(UTC)
for inventory in inventories:
sac = inventory.status_application_control
if sac is None:
continue # Should not happen after validation
is_closing = self._is_closing_season(sac)
if is_closing:
rows_to_upsert.extend(
await self._process_closing_season(
session, hotel, sac, update_type, now, inventory_cache
)
)
continue
rows_to_upsert.extend(
await self._process_inventory_item(
session,
hotel,
sac,
inventory.inv_counts,
update_type,
now,
inventory_cache,
)
)
await self._upsert_availability_rows(session, rows_to_upsert)
async def _process_closing_season(
self,
session: AsyncSession,
hotel: Hotel,
sac: OtaHotelInvCountNotifRq.Inventories.Inventory.StatusApplicationControl,
update_type: str,
timestamp: datetime,
inventory_cache: dict[tuple[str, str | None], HotelInventory],
) -> list[dict[str, Any]]:
"""Process a closing season entry. Assumes validation already done."""
start_date, end_date = self._parse_date_range(sac.start, sac.end)
inventory_item = await self._ensure_inventory_item(
session,
hotel.hotel_id,
CLOSING_SEASON_TYPE,
None,
timestamp,
inventory_cache,
)
base_payload = {
"inventory_id": inventory_item.id,
"bookable_type_2": None,
"out_of_order_type_6": None,
"not_bookable_type_9": None,
"is_closing_season": True,
"last_updated": timestamp,
"update_type": update_type,
}
rows = []
for day in self._iter_days(start_date, end_date):
payload = dict(base_payload)
payload["date"] = day
rows.append(payload)
return rows
async def _process_inventory_item(
self,
session: AsyncSession,
hotel: Hotel,
sac: OtaHotelInvCountNotifRq.Inventories.Inventory.StatusApplicationControl,
inv_counts: (
OtaHotelInvCountNotifRq.Inventories.Inventory.InvCounts | None
),
update_type: str,
timestamp: datetime,
inventory_cache: dict[tuple[str, str | None], HotelInventory],
) -> list[dict[str, Any]]:
"""Process a standard inventory item. Assumes validation already done."""
inv_type_code = (sac.inv_type_code or "").strip()
inv_code = sac.inv_code.strip() if sac.inv_code else None
start_date, end_date = self._parse_date_range(sac.start, sac.end)
counts = self._extract_counts(inv_counts)
base_counts = {
"bookable_type_2": counts.get("bookable_type_2"),
"out_of_order_type_6": counts.get("out_of_order_type_6"),
"not_bookable_type_9": counts.get("not_bookable_type_9"),
}
inventory_item = await self._ensure_inventory_item(
session,
hotel.hotel_id,
inv_type_code,
inv_code,
timestamp,
inventory_cache,
)
base_payload = {
"inventory_id": inventory_item.id,
"is_closing_season": False,
"last_updated": timestamp,
"update_type": update_type,
**base_counts,
}
rows = []
for day in self._iter_days(start_date, end_date):
payload = dict(base_payload)
payload["date"] = day
rows.append(payload)
return rows
def _parse_date_range(self, start_str: str, end_str: str) -> tuple[date, date]:
try:
start_date = date.fromisoformat(start_str)
end_date = date.fromisoformat(end_str)
except ValueError as exc:
raise FreeRoomsProcessingError(
f"Invalid date format: {exc!s}",
HttpStatusCode.BAD_REQUEST,
) from exc
if end_date < start_date:
raise FreeRoomsProcessingError(
"StatusApplicationControl End date cannot be before Start date",
HttpStatusCode.BAD_REQUEST,
)
return start_date, end_date
def _date_ranges_overlap(
self, start1: date, end1: date, start2: date, end2: date
) -> bool:
"""Check if two date ranges overlap (inclusive).
Returns True if the ranges have any dates in common.
"""
return start1 <= end2 and start2 <= end1
def _iter_days(self, start_date: date, end_date: date):
current = start_date
while current <= end_date:
yield current
current += timedelta(days=1)
def _is_closing_season(
self,
sac: OtaHotelInvCountNotifRq.Inventories.Inventory.StatusApplicationControl,
) -> bool:
"""Check if AllInvCode is a truthy boolean value.
Accepts: "true", "True", "TRUE", "1", "yes", "Yes", "YES", etc.
"""
value = (sac.all_inv_code or "").strip().lower()
return value in ("true", "1", "yes")
def _extract_counts(
self,
inv_counts: OtaHotelInvCountNotifRq.Inventories.Inventory.InvCounts | None,
) -> dict[str, int | None]:
if inv_counts is None or not inv_counts.inv_count:
return {}
parsed: dict[str, int] = {}
for count in inv_counts.inv_count:
column_name = COUNT_TYPE_MAP.get(count.count_type)
if column_name is None:
raise FreeRoomsProcessingError(
f"Unsupported CountType {count.count_type}",
HttpStatusCode.BAD_REQUEST,
)
if column_name in parsed:
raise FreeRoomsProcessingError(
f"Duplicate CountType {count.count_type.value} detected",
HttpStatusCode.BAD_REQUEST,
)
try:
value = int(count.count)
except ValueError as exc:
raise FreeRoomsProcessingError(
f"Invalid Count value '{count.count}'",
HttpStatusCode.BAD_REQUEST,
) from exc
if value < 0:
raise FreeRoomsProcessingError(
"Count values must be non-negative",
HttpStatusCode.BAD_REQUEST,
)
parsed[column_name] = value
return parsed
async def _ensure_inventory_item(
self,
session: AsyncSession,
hotel_id: str,
inv_type_code: str,
inv_code: str | None,
timestamp: datetime,
cache: dict[tuple[str, str | None], HotelInventory],
) -> HotelInventory:
cache_key = (inv_type_code, inv_code)
if cache_key in cache:
return cache[cache_key]
filters = [
HotelInventory.hotel_id == hotel_id,
HotelInventory.inv_type_code == inv_type_code,
]
if inv_code is None:
filters.append(HotelInventory.inv_code.is_(None))
else:
filters.append(HotelInventory.inv_code == inv_code)
stmt = select(HotelInventory).where(*filters)
result = await session.execute(stmt)
inventory_item = result.scalar_one_or_none()
if inventory_item:
inventory_item.last_updated = timestamp
else:
inventory_item = HotelInventory(
hotel_id=hotel_id,
inv_type_code=inv_type_code,
inv_code=inv_code,
source=SOURCE_FREEROOMS,
first_seen=timestamp,
last_updated=timestamp,
)
session.add(inventory_item)
await session.flush()
cache[cache_key] = inventory_item
return inventory_item
async def _upsert_availability_rows(
self,
session: AsyncSession,
rows: list[dict[str, Any]],
) -> None:
if not rows:
return
bind = session.get_bind()
dialect_name = bind.dialect.name if bind else ""
table = RoomAvailability.__table__
if dialect_name == "postgresql":
stmt = pg_insert(table).values(rows)
stmt = stmt.on_conflict_do_update(
index_elements=["inventory_id", "date"],
set_=self._build_upsert_set(stmt),
)
await session.execute(stmt)
return
if dialect_name == "sqlite":
stmt = sqlite_insert(table).values(rows)
stmt = stmt.on_conflict_do_update(
index_elements=["inventory_id", "date"],
set_=self._build_upsert_set(stmt),
)
await session.execute(stmt)
return
await self._upsert_with_fallback(session, rows)
def _build_upsert_set(self, stmt):
return {
"bookable_type_2": stmt.excluded.bookable_type_2,
"out_of_order_type_6": stmt.excluded.out_of_order_type_6,
"not_bookable_type_9": stmt.excluded.not_bookable_type_9,
"is_closing_season": stmt.excluded.is_closing_season,
"last_updated": stmt.excluded.last_updated,
"update_type": stmt.excluded.update_type,
}
async def _upsert_with_fallback(
self, session: AsyncSession, rows: list[dict[str, Any]]
) -> None:
for row in rows:
stmt = select(RoomAvailability).where(
RoomAvailability.inventory_id == row["inventory_id"],
RoomAvailability.date == row["date"],
)
result = await session.execute(stmt)
existing = result.scalar_one_or_none()
if existing:
existing.bookable_type_2 = row["bookable_type_2"]
existing.out_of_order_type_6 = row["out_of_order_type_6"]
existing.not_bookable_type_9 = row["not_bookable_type_9"]
existing.is_closing_season = row["is_closing_season"]
existing.last_updated = row["last_updated"]
existing.update_type = row["update_type"]
else:
session.add(RoomAvailability(**row))
def _success_response(self) -> AlpineBitsResponse:
response = OtaHotelInvCountNotifRs(version="7.000", success="")
xml = self._serializer.render(
response, ns_map={None: "http://www.opentravel.org/OTA/2003/05"}
)
return AlpineBitsResponse(xml, HttpStatusCode.OK)
def _error_response(
self,
message: str,
status_code: HttpStatusCode,
error_type: ErrorType = ErrorType.VALUE_13,
code: str = "450",
) -> AlpineBitsResponse:
error = OtaHotelInvCountNotifRs.Errors.Error(
type_value=error_type,
code=code,
content=[message],
)
errors = OtaHotelInvCountNotifRs.Errors(error=[error])
response = OtaHotelInvCountNotifRs(version="7.000", errors=errors)
xml = self._serializer.render(
response, ns_map={None: "http://www.opentravel.org/OTA/2003/05"}
)
return AlpineBitsResponse(xml, status_code)

View File

@@ -0,0 +1,269 @@
"""Hotel service for managing hotel configuration."""
import secrets
from datetime import UTC, datetime
from typing import Any
import bcrypt
from sqlalchemy import and_, select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import joinedload
from .db import Hotel, WebhookEndpoint
from .logging_config import get_logger
_LOGGER = get_logger(__name__)
def hash_password(password: str) -> str:
"""Hash password using bcrypt.
Args:
password: Plain text password
Returns:
Bcrypt hashed password
"""
salt = bcrypt.gensalt(rounds=12)
return bcrypt.hashpw(password.encode('utf-8'), salt).decode('utf-8')
def verify_password(password: str, password_hash: str) -> bool:
"""Verify password against bcrypt hash.
Args:
password: Plain text password
password_hash: Bcrypt hash to verify against
Returns:
True if password matches, False otherwise
"""
return bcrypt.checkpw(
password.encode('utf-8'),
password_hash.encode('utf-8')
)
def generate_webhook_secret() -> str:
"""Generate cryptographically secure webhook secret.
Returns:
64-character URL-safe random string
"""
return secrets.token_urlsafe(48) # 48 bytes = 64 URL-safe chars
async def sync_config_to_database(
db_session: AsyncSession,
config: dict[str, Any]
) -> dict[str, int]:
"""Sync alpine_bits_auth from config.yaml to database.
Creates/updates hotels and generates webhook_endpoints if missing.
Idempotent - safe to run on every startup.
Args:
db_session: Database session
config: Application configuration dict
Returns:
Statistics dict with counts of created/updated records
"""
stats = {"hotels_created": 0, "hotels_updated": 0, "endpoints_created": 0}
alpine_bits_auth = config.get("alpine_bits_auth", [])
if not alpine_bits_auth:
_LOGGER.info("No hotels found in alpine_bits_auth config")
return stats
for hotel_config in alpine_bits_auth:
hotel_id = hotel_config.get("hotel_id")
if not hotel_id:
_LOGGER.warning("Skipping hotel config without hotel_id: %s", hotel_config)
continue
# Check if hotel exists
result = await db_session.execute(
select(Hotel).where(Hotel.hotel_id == hotel_id)
)
hotel = result.scalar_one_or_none()
if not hotel:
# Create new hotel
password_hash = hash_password(hotel_config["password"])
hotel = Hotel(
hotel_id=hotel_id,
hotel_name=hotel_config.get("hotel_name", hotel_id),
username=hotel_config["username"],
password_hash=password_hash,
meta_account_id=hotel_config.get("meta_account"),
google_account_id=hotel_config.get("google_account"),
push_endpoint_url=hotel_config.get("push_endpoint", {}).get("url"),
push_endpoint_token=hotel_config.get("push_endpoint", {}).get("token"),
push_endpoint_username=hotel_config.get("push_endpoint", {}).get("username"),
created_at=datetime.now(UTC),
updated_at=datetime.now(UTC),
is_active=True,
)
db_session.add(hotel)
await db_session.flush()
stats["hotels_created"] += 1
_LOGGER.info("Created hotel: %s", hotel_id)
else:
# Update existing hotel (config may have changed)
# Note: We do NOT update password_hash for security reasons
hotel.hotel_name = hotel_config.get("hotel_name", hotel_id)
hotel.meta_account_id = hotel_config.get("meta_account")
hotel.google_account_id = hotel_config.get("google_account")
push_endpoint = hotel_config.get("push_endpoint", {})
hotel.push_endpoint_url = push_endpoint.get("url")
hotel.push_endpoint_token = push_endpoint.get("token")
hotel.push_endpoint_username = push_endpoint.get("username")
hotel.updated_at = datetime.now(UTC)
stats["hotels_updated"] += 1
_LOGGER.debug("Updated hotel: %s", hotel_id)
# Ensure hotel has at least default webhook endpoints
result = await db_session.execute(
select(WebhookEndpoint).where(WebhookEndpoint.hotel_id == hotel_id)
)
existing_endpoints = result.scalars().all()
if not existing_endpoints:
# Create default webhook endpoints for backward compatibility
for webhook_type in ["wix_form", "generic"]:
webhook_secret = generate_webhook_secret()
endpoint = WebhookEndpoint(
hotel_id=hotel_id,
webhook_secret=webhook_secret,
webhook_type=webhook_type,
description=f"Auto-generated {webhook_type} endpoint",
is_enabled=True,
created_at=datetime.now(UTC),
)
db_session.add(endpoint)
stats["endpoints_created"] += 1
_LOGGER.info(
"Created webhook endpoint for hotel %s, type=%s, secret=%s",
hotel_id,
webhook_type,
webhook_secret
)
await db_session.commit()
_LOGGER.info(
"Config sync complete: %d hotels created, %d updated, %d endpoints created",
stats["hotels_created"],
stats["hotels_updated"],
stats["endpoints_created"]
)
return stats
class HotelService:
"""Service for hotel configuration access.
Always reads from database (synced from config at startup).
"""
def __init__(self, db_session: AsyncSession):
"""Initialize HotelService.
Args:
db_session: Database session
"""
self.db_session = db_session
async def get_hotel_by_id(self, hotel_id: str) -> Hotel | None:
"""Get hotel by hotel_id.
Args:
hotel_id: Hotel identifier
Returns:
Hotel instance or None if not found
"""
result = await self.db_session.execute(
select(Hotel)
.where(
and_(
Hotel.hotel_id == hotel_id,
Hotel.is_active == True
)
)
)
return result.scalar_one_or_none()
async def get_hotel_by_webhook_secret(
self,
webhook_secret: str
) -> tuple[Hotel, WebhookEndpoint] | tuple[None, None]:
"""Get hotel and webhook_endpoint by webhook_secret.
Args:
webhook_secret: Webhook secret string
Returns:
Tuple of (Hotel, WebhookEndpoint) or (None, None) if not found
"""
result = await self.db_session.execute(
select(WebhookEndpoint)
.where(
and_(
WebhookEndpoint.webhook_secret == webhook_secret,
WebhookEndpoint.is_enabled == True
)
)
.options(joinedload(WebhookEndpoint.hotel))
)
endpoint = result.scalar_one_or_none()
if endpoint and endpoint.hotel.is_active:
return endpoint.hotel, endpoint
return None, None
async def get_hotel_by_username(self, username: str) -> Hotel | None:
"""Get hotel by AlpineBits username.
Args:
username: AlpineBits username
Returns:
Hotel instance or None if not found
"""
result = await self.db_session.execute(
select(Hotel)
.where(
and_(
Hotel.username == username,
Hotel.is_active == True
)
)
)
return result.scalar_one_or_none()
async def authenticate_hotel(self, username: str, password: str) -> Hotel | None:
"""Authenticate a hotel using username and password.
Args:
username: AlpineBits username
password: Plain text password submitted via HTTP basic auth
Returns:
Hotel instance if the credentials are valid and the hotel is active,
otherwise None.
"""
hotel = await self.get_hotel_by_username(username)
if not hotel:
return None
if not password:
return None
if verify_password(password, hotel.password_hash):
return hotel
return None

View File

@@ -1,7 +1,24 @@
"""Database migrations for AlpineBits.
"""DEPRECATED: Legacy database migrations for AlpineBits.
This module contains migration functions that are automatically run at app startup
to update existing database schemas without losing data.
⚠️ WARNING: This module is deprecated and no longer used. ⚠️
SCHEMA MIGRATIONS are now handled by Alembic (see alembic/versions/).
STARTUP TASKS (data backfills) are now in db_setup.py.
Migration History:
- migrate_add_room_types: Schema migration (should be in Alembic)
- migrate_add_advertising_account_ids: Schema + backfill (split into Alembic + db_setup.py)
- migrate_add_username_to_acked_requests: Schema + backfill (split into Alembic + db_setup.py)
- migrate_normalize_conversions: Schema migration (should be in Alembic)
Current Status:
- All schema changes are now managed via Alembic migrations
- All data backfills are now in db_setup.py as startup tasks
- This file is kept for reference but is no longer executed
Do not add new migrations here. Instead:
1. For schema changes: Create Alembic migration with `uv run alembic revision --autogenerate -m "description"`
2. For data backfills: Add to db_setup.py as a startup task
"""
from typing import Any

View File

@@ -48,13 +48,14 @@ class ReservationService:
return Reservation(**data)
async def create_reservation(
self, reservation_data: ReservationData, customer_id: int
self, reservation_data: ReservationData, customer_id: int, auto_commit: bool = True
) -> Reservation:
"""Create a new reservation.
Args:
reservation_data: ReservationData containing reservation details
customer_id: ID of the customer making the reservation
auto_commit: If True, commits the transaction. If False, caller must commit.
Returns:
Created Reservation instance
@@ -62,9 +63,16 @@ class ReservationService:
reservation = self._convert_reservation_data_to_db(
reservation_data, customer_id
)
self.session.add(reservation)
await self.session.commit()
await self.session.refresh(reservation)
if auto_commit:
await self.session.commit()
await self.session.refresh(reservation)
else:
await self.session.flush() # Flush to get the reservation.id
return reservation
async def get_reservation_by_unique_id(
@@ -162,7 +170,7 @@ class ReservationService:
if end_date:
filters.append(Reservation.created_at <= end_date)
if hotel_code:
filters.append(Reservation.hotel_code == hotel_code)
filters.append(Reservation.hotel_id == hotel_code)
if filters:
query = query.where(and_(*filters))
@@ -220,7 +228,7 @@ class ReservationService:
]
async def record_acknowledgement(
self, client_id: str, unique_id: str, username: Optional[str] = None
self, client_id: str, unique_id: str, username: Optional[str] = None, auto_commit: bool = True
) -> AckedRequest:
"""Record that a client has acknowledged a reservation.
@@ -228,6 +236,7 @@ class ReservationService:
client_id: The client ID
unique_id: The unique_id of the reservation (md5_unique_id)
username: The username of the client making the request (optional)
auto_commit: If True, commits the transaction. If False, caller must commit.
Returns:
Created AckedRequest instance
@@ -239,8 +248,13 @@ class ReservationService:
timestamp=datetime.now(UTC),
)
self.session.add(acked)
await self.session.commit()
await self.session.refresh(acked)
if auto_commit:
await self.session.commit()
await self.session.refresh(acked)
else:
await self.session.flush() # Flush to get the acked.id
return acked
async def is_acknowledged(self, unique_id: str, username: Optional[str] = None, client_id: Optional[str] = None) -> bool:

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""Startup script for the Wix Form Handler API.
"""Startup script for the Alpine Bits Python Server API.
This script:
1. Runs database migrations using Alembic
@@ -10,13 +10,94 @@ is up to date. This approach works well with multiple workers since migrations
complete before any worker starts processing requests.
"""
import argparse
import sys
import uvicorn
from alpine_bits_python.run_migrations import run_migrations
def parse_args() -> argparse.Namespace:
"""Parse command line arguments for uvicorn configuration."""
parser = argparse.ArgumentParser(
description="Run Alpine Bits Python Server with database migrations"
)
parser.add_argument(
"--host",
type=str,
default="0.0.0.0",
help="Host to bind to (default: 0.0.0.0)",
)
parser.add_argument(
"--port",
type=int,
default=8080,
help="Port to bind to (default: 8080)",
)
parser.add_argument(
"--workers",
type=int,
default=1,
help="Number of worker processes (default: 1)",
)
parser.add_argument(
"--reload",
action="store_true",
default=False,
help="Enable auto-reload for development (default: False)",
)
parser.add_argument(
"--log-level",
type=str,
default="info",
choices=["critical", "error", "warning", "info", "debug", "trace"],
help="Log level (default: info)",
)
parser.add_argument(
"--access-log",
action="store_true",
default=False,
help="Enable access log (default: False)",
)
parser.add_argument(
"--forwarded-allow-ips",
type=str,
default="127.0.0.1",
help=(
"Comma-separated list of IPs to trust for proxy headers "
"(default: 127.0.0.1)"
),
)
parser.add_argument(
"--proxy-headers",
action="store_true",
default=False,
help="Enable proxy headers (X-Forwarded-* headers) (default: False)",
)
parser.add_argument(
"--no-server-header",
action="store_true",
default=False,
help="Disable Server header in responses (default: False)",
)
parser.add_argument(
"--timeout-graceful-shutdown",
type=int,
default=300,
help=(
"Graceful shutdown timeout in seconds. Workers have this long to finish "
"background tasks before being killed (default: 300)"
),
)
return parser.parse_args()
if __name__ == "__main__":
# Parse command line arguments
args = parse_args()
# Run database migrations before starting the server
# This ensures the schema is up to date before any workers start
print("Running database migrations...")
@@ -31,8 +112,14 @@ if __name__ == "__main__":
print("Starting API server...")
uvicorn.run(
"alpine_bits_python.api:app",
host="0.0.0.0",
port=8080,
reload=True, # Enable auto-reload during development
log_level="info",
host=args.host,
port=args.port,
workers=args.workers,
reload=args.reload,
log_level=args.log_level,
access_log=args.access_log,
forwarded_allow_ips=args.forwarded_allow_ips,
proxy_headers=args.proxy_headers,
server_header=not args.no_server_header,
timeout_graceful_shutdown=args.timeout_graceful_shutdown,
)

View File

@@ -5,6 +5,10 @@ This script should be run before starting the application to ensure
the database schema is up to date. It can be run standalone or called
from run_api.py before starting uvicorn.
If the database is completely empty (no tables), it will create all tables
from the current SQLAlchemy models and stamp the database with the latest
migration version, avoiding the need to run historical migrations.
Usage:
uv run python -m alpine_bits_python.run_migrations
or
@@ -12,24 +16,160 @@ Usage:
run_migrations()
"""
import asyncio
import subprocess
import sys
from pathlib import Path
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine
from .config_loader import load_config
from .db import Base, get_database_schema, get_database_url
from .logging_config import get_logger
_LOGGER = get_logger(__name__)
async def is_database_empty() -> bool:
"""Check if the database has any tables in our schema.
Returns:
True if the database has no tables in the target schema, False otherwise.
"""
try:
app_config = load_config()
db_url = get_database_url(app_config)
schema = get_database_schema(app_config)
if not db_url:
_LOGGER.error("Database URL not configured")
return False
# Create async engine for checking
engine = create_async_engine(db_url, echo=False)
async with engine.connect() as conn:
# Set search path if schema is configured
if schema:
await conn.execute(text(f"SET search_path TO {schema}"))
# Check for any tables in the schema
result = await conn.execute(
text(
"""
SELECT COUNT(*)
FROM information_schema.tables
WHERE table_schema = :schema
"""
),
{"schema": schema or "public"},
)
count = result.scalar()
await engine.dispose()
return count == 0
except Exception as e:
_LOGGER.warning(f"Could not check if database is empty: {e}")
return False
async def create_all_tables() -> None:
"""Create all tables from SQLAlchemy models in an empty database."""
try:
app_config = load_config()
db_url = get_database_url(app_config)
schema = get_database_schema(app_config)
if not db_url:
_LOGGER.error("Database URL not configured")
sys.exit(1)
_LOGGER.info("Creating all database tables from SQLAlchemy models...")
# Create async engine
engine = create_async_engine(db_url, echo=False)
async with engine.begin() as conn:
# Set search path if schema is configured
if schema:
# Only create schema if it's not 'public' (public always exists)
if schema != "public":
await conn.execute(text(f"CREATE SCHEMA IF NOT EXISTS {schema}"))
await conn.execute(text(f"SET search_path TO {schema}"))
# Create all tables
await conn.run_sync(Base.metadata.create_all)
await engine.dispose()
_LOGGER.info("All tables created successfully")
except Exception as e:
_LOGGER.error(f"Failed to create tables: {e}")
sys.exit(1)
def stamp_database() -> None:
"""Stamp the database with the latest migration version.
This tells Alembic that the database is at the 'head' revision without
actually running the migration scripts.
"""
_LOGGER.info("Stamping database with latest migration version...")
project_root = Path(__file__).parent.parent.parent
try:
result = subprocess.run(
["alembic", "stamp", "head"],
cwd=project_root,
capture_output=True,
text=True,
check=True,
)
_LOGGER.info("Database stamped successfully")
_LOGGER.debug("Stamp output: %s", result.stdout)
except subprocess.CalledProcessError as e:
_LOGGER.error("Failed to stamp database:")
_LOGGER.error("Exit code: %d", e.returncode)
_LOGGER.error("stdout: %s", e.stdout)
_LOGGER.error("stderr: %s", e.stderr)
sys.exit(1)
except FileNotFoundError:
_LOGGER.error(
"Alembic not found. Please ensure it's installed: uv pip install alembic"
)
sys.exit(1)
def run_migrations() -> None:
"""Run Alembic migrations to upgrade database to latest schema.
This function runs 'alembic upgrade head' to apply all pending migrations.
It will exit the process if migrations fail.
If the database is empty, creates all tables from SQLAlchemy models
and stamps the database with the latest migration version.
Otherwise, runs 'alembic upgrade head' to apply all pending migrations.
Raises:
SystemExit: If migrations fail
"""
_LOGGER.info("Checking database state...")
# Check if database is empty
is_empty = asyncio.run(is_database_empty())
if is_empty:
_LOGGER.info(
"Database is empty - creating all tables from models and stamping version"
)
asyncio.run(create_all_tables())
stamp_database()
_LOGGER.info("Database initialization completed successfully")
return
# Database has tables, run normal migrations
_LOGGER.info("Running database migrations...")
# Get the project root directory (where alembic.ini is located)

View File

@@ -10,11 +10,44 @@ from XML generation (xsdata) follows clean architecture principles.
"""
import hashlib
from datetime import date, datetime
import json
from datetime import UTC, date, datetime
from enum import Enum
from typing import Any
from pydantic import BaseModel, EmailStr, Field, field_validator, model_validator
from .const import WebhookStatus
# Generalized integer validator for reuse across models
def convert_to_int(field_name: str, v: Any) -> int:
"""Convert a value to integer, handling string inputs.
Args:
field_name: Name of the field being validated (for error messages)
v: Value to convert (can be int, str, or None)
Returns:
Integer value
Raises:
ValueError: If value is None or cannot be converted to int
"""
if v is None:
msg = f"{field_name} cannot be None"
raise ValueError(msg)
if isinstance(v, int):
return v
if isinstance(v, str):
try:
return int(v)
except ValueError as e:
msg = f"{field_name} must be a valid integer, got: {v}"
raise ValueError(msg) from e
msg = f"{field_name} must be int or str, got: {type(v)}"
raise ValueError(msg)
# Country name to ISO 3166-1 alpha-2 code mapping
COUNTRY_NAME_TO_CODE = {
@@ -98,7 +131,7 @@ class ReservationData(BaseModel):
num_adults: int = Field(..., ge=1)
num_children: int = Field(0, ge=0, le=10)
children_ages: list[int] = Field(default_factory=list)
hotel_code: str = Field(..., min_length=1, max_length=50)
hotel_id: str = Field(..., min_length=1, max_length=50)
hotel_name: str | None = Field(None, max_length=200)
offer: str | None = Field(None, max_length=500)
user_comment: str | None = Field(None, max_length=2000)
@@ -191,6 +224,7 @@ class CustomerData(BaseModel):
Returns:
2-letter ISO country code (uppercase) or None if input is None/empty
"""
if not v:
return None
@@ -308,36 +342,274 @@ class CommentsData(BaseModel):
model_config = {"from_attributes": True}
# Example usage in a service layer
class ReservationService:
"""Example service showing how to use Pydantic models with SQLAlchemy."""
class HotelData(BaseModel):
"""Validated hotel configuration data."""
def __init__(self, db_session):
self.db_session = db_session
hotel_id: str = Field(..., min_length=1, max_length=50)
hotel_name: str = Field(..., min_length=1, max_length=200)
username: str = Field(..., min_length=1, max_length=100)
password_hash: str = Field(..., min_length=1, max_length=200)
meta_account_id: str | None = Field(None, max_length=50)
google_account_id: str | None = Field(None, max_length=50)
push_endpoint_url: str | None = Field(None, max_length=500)
push_endpoint_token: str | None = Field(None, max_length=200)
push_endpoint_username: str | None = Field(None, max_length=100)
created_at: datetime = Field(default_factory=lambda: datetime.now())
updated_at: datetime = Field(default_factory=lambda: datetime.now())
is_active: bool = Field(default=True)
async def create_reservation(
self, reservation_data: ReservationData, customer_data: CustomerData
):
"""Create a reservation with validated data.
@field_validator("hotel_id", "hotel_name", "username")
@classmethod
def strip_whitespace(cls, v: str) -> str:
"""Remove leading/trailing whitespace."""
return v.strip()
The data has already been validated by Pydantic before reaching here.
model_config = {"from_attributes": True}
class WebhookEndpointData(BaseModel):
"""Validated webhook endpoint configuration data."""
hotel_id: str = Field(..., min_length=1, max_length=50)
webhook_secret: str = Field(..., min_length=1, max_length=64)
webhook_type: str = Field(..., min_length=1, max_length=50)
description: str | None = Field(None, max_length=200)
is_enabled: bool = Field(default=True)
created_at: datetime = Field(default_factory=lambda: datetime.now())
@field_validator("hotel_id", "webhook_secret", "webhook_type")
@classmethod
def strip_whitespace(cls, v: str) -> str:
"""Remove leading/trailing whitespace."""
return v.strip()
model_config = {"from_attributes": True}
class WebhookRequestData(BaseModel):
"""Validated webhook request data.
This model handles the special case where:
- payload_json is required for creation (to calculate payload_hash)
- payload_json becomes optional after processing (can be purged for privacy/storage)
- payload_hash is auto-calculated from payload_json when provided
"""
# Required fields
payload_json: dict[str, Any] | None = Field(
..., description="Webhook payload (required for creation, nullable after purge)"
)
# Auto-calculated from payload_json
payload_hash: str | None = Field(
None,
min_length=64,
max_length=64,
description="SHA256 hash of canonical JSON payload (auto-calculated)",
)
# Optional foreign keys
webhook_endpoint_id: int | None = Field(None, gt=0)
hotel_id: str | None = Field(None, max_length=50)
# Processing tracking
status: WebhookStatus = Field(default=WebhookStatus.PENDING)
processing_started_at: datetime | None = None
processing_completed_at: datetime | None = None
# Retry handling
retry_count: int = Field(default=0, ge=0)
last_error: str | None = Field(None, max_length=2000)
# Payload metadata
purged_at: datetime | None = None
# Request metadata
created_at: datetime = Field(default_factory=lambda: datetime.now())
source_ip: str | None = Field(None, max_length=45)
user_agent: str | None = Field(None, max_length=500)
# Result tracking
created_customer_id: int | None = Field(None, gt=0)
created_reservation_id: int | None = Field(None, gt=0)
@model_validator(mode="after")
def calculate_payload_hash(self) -> "WebhookRequestData":
"""Auto-calculate payload_hash from payload_json if not provided.
Uses the same hashing algorithm as api.py:
- Canonical JSON with sorted keys
- UTF-8 encoding
- SHA256 hash
This runs after all field validation, so we can access the validated payload_json.
"""
from alpine_bits_python.db import Customer, Reservation
# Only calculate if payload_json is provided and payload_hash is not set
if self.payload_json is not None and self.payload_hash is None:
# Create canonical JSON string (sorted keys for consistency)
payload_json_str = json.dumps(self.payload_json, sort_keys=True)
# Calculate SHA256 hash
self.payload_hash = hashlib.sha256(
payload_json_str.encode("utf-8")
).hexdigest()
# Convert validated Pydantic model to SQLAlchemy model
db_customer = Customer(**customer_data.model_dump(exclude_none=True))
self.db_session.add(db_customer)
await self.db_session.flush() # Get the customer ID
return self
# Create reservation linked to customer
db_reservation = Reservation(
customer_id=db_customer.id,
**reservation_data.model_dump(
exclude={"children_ages"}
), # Handle separately
children_ages=",".join(map(str, reservation_data.children_ages)),
)
self.db_session.add(db_reservation)
await self.db_session.commit()
@model_validator(mode="after")
def validate_payload_hash_requirements(self) -> "WebhookRequestData":
"""Ensure payload_hash is present (either provided or calculated).
return db_reservation, db_customer
This validator runs after calculate_payload_hash, so payload_hash should
be set if payload_json was provided.
"""
if self.payload_hash is None:
raise ValueError(
"payload_hash is required. It can be auto-calculated from payload_json "
"or explicitly provided."
)
return self
@field_validator("status", mode="before")
@classmethod
def normalize_status(cls, v: str | WebhookStatus) -> WebhookStatus:
"""Normalize status to WebhookStatus enum."""
if isinstance(v, WebhookStatus):
return v
if isinstance(v, str):
return WebhookStatus(v)
raise ValueError(f"Invalid webhook status: {v}")
model_config = {"from_attributes": True}
# Example usage in a service layer
class ConversionGuestData(BaseModel):
"""Validated conversion guest data from PMS XML.
Handles validation and hashing for guest records extracted from
hotel PMS conversion XML files.
"""
hotel_id: str = Field(..., min_length=1, max_length=50)
guest_id: int = Field(..., gt=0)
guest_first_name: str | None = Field(None, max_length=100)
guest_last_name: str | None = Field(None, max_length=100)
guest_email: str | None = Field(None, max_length=200)
guest_country_code: str | None = Field(None, max_length=10)
guest_birth_date: date | None = None
# Auto-calculated hashed fields
hashed_first_name: str | None = Field(None, max_length=64)
hashed_last_name: str | None = Field(None, max_length=64)
hashed_email: str | None = Field(None, max_length=64)
hashed_country_code: str | None = Field(None, max_length=64)
hashed_birth_date: str | None = Field(None, max_length=64)
# Timestamps
first_seen: datetime = Field(default_factory=lambda: datetime.now(UTC))
last_seen: datetime = Field(default_factory=lambda: datetime.now(UTC))
@staticmethod
def _normalize_and_hash(value: str | None) -> str | None:
"""Normalize and hash a value for privacy-preserving matching.
Uses the same logic as ConversionGuest._normalize_and_hash.
"""
if value is None or value == "":
return None
# Normalize: lowercase, strip whitespace
normalized = value.lower().strip()
if not normalized:
return None
# Hash with SHA256
return hashlib.sha256(normalized.encode("utf-8")).hexdigest()
@model_validator(mode="after")
def calculate_hashes(self) -> "ConversionGuestData":
"""Auto-calculate hashed fields from plain text fields."""
if self.hashed_first_name is None:
self.hashed_first_name = self._normalize_and_hash(self.guest_first_name)
if self.hashed_last_name is None:
self.hashed_last_name = self._normalize_and_hash(self.guest_last_name)
if self.hashed_email is None:
self.hashed_email = self._normalize_and_hash(self.guest_email)
if self.hashed_country_code is None:
self.hashed_country_code = self._normalize_and_hash(self.guest_country_code)
if self.hashed_birth_date is None and self.guest_birth_date is not None:
self.hashed_birth_date = self._normalize_and_hash(
self.guest_birth_date.isoformat()
)
return self
@field_validator("guest_id", mode="before")
@classmethod
def convert_guest_id_to_int(cls, v: Any) -> int:
"""Convert guest_id to integer (handles string input from XML)."""
return convert_to_int("guest_id", v)
model_config = {"from_attributes": True}
class ConversionData(BaseModel):
"""Validated conversion data from PMS XML.
Handles validation for conversion records extracted from
hotel PMS conversion XML files. This model ensures proper type conversion
and validation before creating a Conversion database entry.
"""
# Foreign key references (nullable - matched after creation)
reservation_id: int | None = Field(None, gt=0)
customer_id: int | None = Field(None, gt=0)
# Required reservation metadata from PMS
hotel_id: str = Field(..., min_length=1, max_length=50)
pms_reservation_id: int = Field(..., gt=0)
guest_id: int | None = Field(None, gt=0)
# Optional reservation metadata
reservation_number: str | None = Field(None, max_length=100)
reservation_date: date | None = None
creation_time: datetime | None = None
reservation_type: str | None = Field(None, max_length=50)
booking_channel: str | None = Field(None, max_length=100)
# Advertising/tracking data (used for matching)
advertising_medium: str | None = Field(None, max_length=200)
advertising_partner: str | None = Field(None, max_length=200)
advertising_campagne: str | None = Field(None, max_length=500)
# Attribution flags
directly_attributable: bool = Field(default=False)
guest_matched: bool = Field(default=False)
# Timestamps (auto-managed)
created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
updated_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
@field_validator(
"pms_reservation_id", "guest_id", "reservation_id", "customer_id",
mode="before"
)
@classmethod
def convert_int_fields(cls, v: Any) -> int | None:
"""Convert integer fields from string to int (handles XML input)."""
if v is None or v == "":
return None
# Get the field name from the validation context if available
# For now, use a generic name since we handle multiple fields
return convert_to_int("field", v)
@field_validator("hotel_id", "reservation_number", "reservation_type",
"booking_channel", "advertising_medium", "advertising_partner",
"advertising_campagne", mode="before")
@classmethod
def strip_string_fields(cls, v: str | None) -> str | None:
"""Strip whitespace from string fields."""
if v is None:
return None
stripped = str(v).strip()
return stripped if stripped else None
model_config = {"from_attributes": True}

View File

@@ -51,7 +51,6 @@ from alpine_bits_python.db import (
AckedRequest,
Base,
Customer,
HashedCustomer,
Reservation,
get_database_url,
)
@@ -306,7 +305,7 @@ async def migrate_data(
user_comment=reservation.user_comment,
fbclid=reservation.fbclid,
gclid=reservation.gclid,
hotel_code=reservation.hotel_code,
hotel_code=reservation.hotel_id,
hotel_name=reservation.hotel_name,
room_type_code=reservation.room_type_code,
room_classification_code=reservation.room_classification_code,

View File

@@ -0,0 +1,719 @@
"""Webhook processor interface and implementations."""
import asyncio
from datetime import date, datetime
from typing import Any, Protocol
from fastapi import HTTPException
from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession
from alpine_bits_python.auth import generate_unique_id
from alpine_bits_python.config_loader import get_advertising_account_ids
from alpine_bits_python.customer_service import CustomerService
from alpine_bits_python.reservation_service import ReservationService
from alpine_bits_python.schemas import ReservationData
from .db import WebhookRequest
from .logging_config import get_logger
_LOGGER = get_logger(__name__)
class WebhookProcessorProtocol(Protocol):
"""Protocol for webhook processors."""
@property
def webhook_type(self) -> str:
"""Return webhook type identifier (e.g., 'wix_form', 'generic')."""
...
async def process(
self,
webhook_request: WebhookRequest,
db_session: AsyncSession,
config: dict[str, Any] | None = None,
event_dispatcher: Any | None = None,
) -> dict[str, Any]:
"""Process webhook payload.
Args:
webhook_request: WebhookRequest database record (contains payload_json and hotel_id)
db_session: Database session
config: Application configuration (optional)
event_dispatcher: Event dispatcher for push notifications (optional)
Returns:
Response dict with status, message, customer_id, reservation_id
Raises:
HTTPException on processing errors
"""
...
class WebhookProcessorRegistry:
"""Registry for webhook processors."""
def __init__(self):
"""Initialize the registry."""
self._processors: dict[str, WebhookProcessorProtocol] = {}
def register(self, processor: WebhookProcessorProtocol) -> None:
"""Register a webhook processor.
Args:
processor: Processor instance to register
"""
self._processors[processor.webhook_type] = processor
_LOGGER.info("Registered webhook processor: %s", processor.webhook_type)
def get_processor(self, webhook_type: str) -> WebhookProcessorProtocol | None:
"""Get processor for webhook type.
Args:
webhook_type: Type of webhook to process
Returns:
Processor instance or None if not found
"""
return self._processors.get(webhook_type)
async def process_wix_form_submission(
data: dict[str, Any],
db_session: AsyncSession,
config: dict[str, Any] | None = None,
hotel_id: str | None = None,
event_dispatcher: Any | None = None,
):
"""Shared business logic for handling Wix form submissions (test and production).
Args:
data: Webhook payload data
db_session: Database session
config: Application config (optional)
hotel_id: Hotel ID (optional, will use from data or config default if not provided)
event_dispatcher: Event dispatcher for push notifications (optional)
"""
timestamp = datetime.now().isoformat()
_LOGGER.info("Received Wix form data at %s", timestamp)
# Provide fallback config if still None
if config is None:
config = {}
data = data.get("data") # Handle nested "data" key if present
# save customer and reservation to DB
contact_info = data.get("contact", {})
first_name = contact_info.get("name", {}).get("first")
last_name = contact_info.get("name", {}).get("last")
email = contact_info.get("email")
phone_number = contact_info.get("phones", [{}])[0].get("e164Phone")
contact_info.get("locale", "de-de")
contact_id = contact_info.get("contactId")
name_prefix = data.get("field:anrede")
email_newsletter = data.get("field:form_field_5a7b", False)
# if email_newsletter is a string, attempt to convert to boolean, else false
if isinstance(email_newsletter, str):
email_newsletter = email_newsletter.lower() in [
"yes",
"true",
"1",
"on",
"selezionato",
"angekreuzt",
]
address_line = None
city_name = None
postal_code = None
country_code = None
gender = None
birth_date = None
language = data.get("contact", {}).get("locale", "en")[:2]
# Dates
start_date = (
data.get("field:date_picker_a7c8")
or data.get("Anreisedatum")
or data.get("submissions", [{}])[1].get("value")
)
end_date = (
data.get("field:date_picker_7e65")
or data.get("Abreisedatum")
or data.get("submissions", [{}])[2].get("value")
)
# Room/guest info
num_adults = int(data.get("field:number_7cf5") or 1)
num_children = int(data.get("field:anzahl_kinder") or 0)
children_ages = []
if num_children > 0:
# Collect all child age fields, then take only the first num_children
# This handles form updates that may send extra padded/zero fields
temp_ages = []
for k in data:
if k.startswith("field:alter_kind_"):
if data[k] is None or data[k] == "":
continue
try:
age = int(data[k])
temp_ages.append(age)
except ValueError:
_LOGGER.warning("Invalid age value for %s: %s", k, data[k])
# Only keep the first num_children ages, regardless of their values
children_ages = temp_ages[:num_children]
offer = data.get("field:angebot_auswaehlen")
# get submissionId and ensure max length 35. Generate one if not present
unique_id = data.get("submissionId", generate_unique_id())
# Use CustomerService to handle customer creation/update with hashing
customer_service = CustomerService(db_session)
customer_data = {
"given_name": first_name,
"surname": last_name,
"contact_id": contact_id,
"name_prefix": name_prefix,
"email_address": email,
"phone": phone_number,
"email_newsletter": email_newsletter,
"address_line": address_line,
"city_name": city_name,
"postal_code": postal_code,
"country_code": country_code,
"gender": gender,
"birth_date": birth_date,
"language": language,
"address_catalog": False,
"name_title": None,
}
# This automatically creates/updates Customer
db_customer = await customer_service.get_or_create_customer(customer_data)
# Determine hotel_code and hotel_name
# Priority: 1) Passed hotel_id, 2) Form field, 3) Config default, 4) Fallback
hotel_code = hotel_id or data.get("field:hotelid", None)
if hotel_code is None:
_LOGGER.warning("No hotel_code provided, using default from config")
hotel_code = config.get("default_hotel_code", "123")
hotel_name = (
data.get("field:hotelname")
or data.get("hotelname")
or config.get("default_hotel_name")
or "Frangart Inn" # fallback
)
submissionTime = data.get("submissionTime") # 2025-10-07T05:48:41.855Z
try:
if submissionTime:
submissionTime = datetime.fromisoformat(
submissionTime[:-1]
) # Remove Z and convert
except Exception as e:
_LOGGER.exception("Error parsing submissionTime: %s", e)
submissionTime = None
# Extract fbclid and gclid for conditional account ID lookup
fbclid = data.get("field:fbclid")
gclid = data.get("field:gclid")
# Get advertising account IDs conditionally based on fbclid/gclid presence
meta_account_id, google_account_id = get_advertising_account_ids(
config, hotel_code, fbclid, gclid
)
reservation = ReservationData(
unique_id=unique_id,
start_date=date.fromisoformat(start_date),
end_date=date.fromisoformat(end_date),
num_adults=num_adults,
num_children=num_children,
children_ages=children_ages,
hotel_id=hotel_code,
hotel_name=hotel_name,
offer=offer,
created_at=submissionTime,
utm_source=data.get("field:utm_source"),
utm_medium=data.get("field:utm_medium"),
utm_campaign=data.get("field:utm_campaign"),
utm_term=data.get("field:utm_term"),
utm_content=data.get("field:utm_content"),
user_comment=data.get("field:long_answer_3524", ""),
fbclid=fbclid,
gclid=gclid,
meta_account_id=meta_account_id,
google_account_id=google_account_id,
)
if reservation.md5_unique_id is None:
raise HTTPException(status_code=400, detail="Failed to generate md5_unique_id")
# Use ReservationService to create reservation
reservation_service = ReservationService(db_session)
try:
db_reservation = await reservation_service.create_reservation(
reservation, db_customer.id
)
except IntegrityError as e:
await db_session.rollback()
# Check if this is a duplicate (unique constraint violation)
error_msg = str(e.orig) if hasattr(e, 'orig') else str(e)
is_duplicate = any(keyword in error_msg.lower() for keyword in ['unique', 'duplicate', 'already exists'])
if is_duplicate:
_LOGGER.info(
"Duplicate reservation detected for unique_id=%s, skipping (this is expected for reprocessing)",
unique_id
)
return {
"status": "duplicate",
"message": "Reservation already exists (duplicate submission)",
"unique_id": unique_id,
"timestamp": timestamp,
}
else:
# Real integrity error (not a duplicate)
_LOGGER.exception("Database integrity error creating reservation: %s", e)
raise HTTPException(
status_code=500, detail="Database error creating reservation"
) from e
async def push_event():
# Fire event for listeners (push, etc.) - hotel-specific dispatch
if event_dispatcher:
# Get hotel_code from reservation to target the right listeners
hotel_code = getattr(db_reservation, "hotel_code", None)
if hotel_code and hotel_code.strip():
await event_dispatcher.dispatch_for_hotel(
"form_processed", hotel_code, db_customer, db_reservation
)
_LOGGER.info("Dispatched form_processed event for hotel %s", hotel_code)
else:
_LOGGER.warning(
"No hotel_code in reservation, skipping push notifications"
)
# Create task and store reference to prevent it from being garbage collected
# The task runs independently and we don't need to await it here
task = asyncio.create_task(push_event())
# Add done callback to log any exceptions that occur in the background task
task.add_done_callback(lambda t: t.exception() if not t.cancelled() else None)
return {
"status": "success",
"message": "Wix form data received successfully",
"received_keys": list(data.keys()),
"timestamp": timestamp,
"note": "No authentication required for this endpoint",
"customer_id": db_customer.id,
"reservation_id": db_reservation.id,
}
class WixFormProcessor:
"""Processor for Wix form webhooks."""
@property
def webhook_type(self) -> str:
"""Return webhook type identifier."""
return "wix_form"
async def process(
self,
webhook_request: WebhookRequest,
db_session: AsyncSession,
config: dict[str, Any] | None = None,
event_dispatcher: Any | None = None,
) -> dict[str, Any]:
"""Process Wix form webhook payload.
Args:
webhook_request: WebhookRequest database record
db_session: Database session
config: Application configuration (optional)
event_dispatcher: Event dispatcher for push notifications (optional)
Returns:
Response dict with status and details
"""
# Call processing function with data from webhook_request
result = await process_wix_form_submission(
data=webhook_request.payload_json,
db_session=db_session,
config=config,
hotel_id=webhook_request.hotel_id,
event_dispatcher=event_dispatcher,
)
return result
async def process_generic_webhook_submission(
data: dict[str, Any],
db_session: AsyncSession,
config: dict[str, Any] | None = None,
hotel_id: str | None = None,
event_dispatcher: Any | None = None,
):
"""Process generic webhook submissions with nested structure.
Args:
data: Webhook payload data
db_session: Database session
config: Application config (optional)
hotel_id: Hotel ID (optional, will use from data or config default)
event_dispatcher: Event dispatcher for push notifications (optional)
Expected structure:
{
"hotel_data": {"hotelname": "...", "hotelcode": "..."},
"form_data": {
"sprache": "de/it/en",
"anreise": "DD.MM.YYYY",
"abreise": "DD.MM.YYYY",
"erwachsene": "N",
"kinder": "N",
"alter": {"1": "age1", "2": "age2", ...},
"anrede": "...",
"name": "...",
"nachname": "...",
"mail": "...",
"tel": "...",
"nachricht": "..."
},
"tracking_data": {
"utm_source": "...",
"utm_medium": "...",
"utm_campaign": "...",
"utm_content": "...",
"utm_term": "...",
"fbclid": "...",
"gclid": "..."
},
"timestamp": "ISO8601"
}
"""
timestamp = datetime.now().isoformat()
_LOGGER.info("Processing generic webhook submission at %s", timestamp)
# Provide fallback config if still None
if config is None:
config = {}
# Extract nested data
hotel_data = data.get("hotel_data", {})
form_data = data.get("form_data", {})
tracking_data = data.get("tracking_data", {})
offer_data = form_data.get("unterkunftTyp", {})
selected_offers = []
if offer_data:
# grab keys and values. If value is "on" add the key not the value to a list of selected offers
offer_data: dict[str, str]
for key, value in offer_data.items():
if value == "on":
selected_offers.append(key)
selected_offers_str = ", ".join(selected_offers) if selected_offers else None
# Extract hotel information
# Priority: 1) Passed hotel_id, 2) Webhook data, 3) Config default, 4) Fallback
hotel_code = hotel_id or hotel_data.get("hotelcode")
hotel_name = hotel_data.get("hotelname")
if not hotel_code:
_LOGGER.warning("No hotel_code provided, using default from config")
hotel_code = config.get("default_hotel_code", "123")
if not hotel_name:
hotel_name = config.get("default_hotel_name") or "Frangart Inn"
# Extract customer information
first_name = form_data.get("name")
last_name = form_data.get("nachname")
email = form_data.get("mail")
phone_number = form_data.get("tel")
name_prefix = form_data.get("anrede")
language = form_data.get("sprache", "de")[:2]
user_comment = form_data.get("nachricht", "")
plz = form_data.get("plz", "")
city = form_data.get("stadt", "")
country = form_data.get("land", "")
# Parse dates - handle DD.MM.YYYY format
start_date_str = form_data.get("anreise")
end_date_str = form_data.get("abreise")
if not start_date_str or not end_date_str:
raise HTTPException(
status_code=400, detail="Missing required dates (anreise/abreise)"
)
try:
# Parse DD.MM.YYYY format using strptime
start_date = datetime.strptime(start_date_str, "%d.%m.%Y").date()
end_date = datetime.strptime(end_date_str, "%d.%m.%Y").date()
except ValueError as e:
_LOGGER.error(
"Error parsing dates: start=%s, end=%s, error=%s",
start_date_str,
end_date_str,
e,
)
raise HTTPException(status_code=400, detail=f"Invalid date format: {e}") from e
# Extract room/guest info
num_adults = int(form_data.get("erwachsene", 2))
num_children = int(form_data.get("kinder", 0))
# Extract children ages from nested structure
children_ages = []
if num_children > 0:
alter_data = form_data.get("alter", {})
for i in range(1, num_children + 1):
age_str = alter_data.get(str(i))
if age_str:
try:
children_ages.append(int(age_str))
except ValueError:
_LOGGER.warning("Invalid age value for child %d: %s", i, age_str)
# Extract tracking information
utm_source = None
utm_medium = None
utm_campaign = None
utm_term = None
utm_content = None
fbclid = None
gclid = None
if tracking_data:
utm_source = tracking_data.get("utm_source")
utm_medium = tracking_data.get("utm_medium")
utm_campaign = tracking_data.get("utm_campaign")
utm_term = tracking_data.get("utm_term")
utm_content = tracking_data.get("utm_content")
fbclid = tracking_data.get("fbclid")
gclid = tracking_data.get("gclid")
# Parse submission timestamp
submission_time = data.get("timestamp")
try:
if submission_time:
# Handle ISO8601 format with timezone
if submission_time.endswith("Z"):
submission_time = datetime.fromisoformat(submission_time[:-1])
elif "+" in submission_time:
# Remove timezone info (e.g., +02:00)
submission_time = datetime.fromisoformat(submission_time.split("+")[0])
else:
submission_time = datetime.fromisoformat(submission_time)
except Exception as e:
_LOGGER.exception("Error parsing submission timestamp: %s", e)
submission_time = None
# Generate unique ID
unique_id = generate_unique_id()
# Use CustomerService to handle customer creation/update with hashing
customer_service = CustomerService(db_session)
customer_data = {
"given_name": first_name,
"surname": last_name,
"contact_id": None,
"name_prefix": name_prefix if name_prefix != "--" else None,
"email_address": email,
"phone": phone_number if phone_number else None,
"email_newsletter": False,
"address_line": None,
"city_name": city if city else None,
"postal_code": plz if plz else None,
"country_code": country if country else None,
"gender": None,
"birth_date": None,
"language": language,
"address_catalog": False,
"name_title": None,
}
# Create/update customer
db_customer = await customer_service.get_or_create_customer(customer_data)
# Get advertising account IDs conditionally based on fbclid/gclid presence
meta_account_id, google_account_id = get_advertising_account_ids(
config, hotel_code, fbclid, gclid
)
# Create reservation
reservation_kwargs = {
"unique_id": unique_id,
"start_date": start_date,
"end_date": end_date,
"num_adults": num_adults,
"num_children": num_children,
"children_ages": children_ages,
"hotel_id": hotel_code,
"hotel_name": hotel_name,
"offer": selected_offers_str,
"utm_source": utm_source,
"utm_medium": utm_medium,
"utm_campaign": utm_campaign,
"utm_term": utm_term,
"utm_content": utm_content,
"user_comment": user_comment,
"fbclid": fbclid,
"gclid": gclid,
"meta_account_id": meta_account_id,
"google_account_id": google_account_id,
}
# Only include created_at if we have a valid submission_time
if submission_time:
reservation_kwargs["created_at"] = submission_time
reservation = ReservationData(**reservation_kwargs)
if reservation.md5_unique_id is None:
raise HTTPException(status_code=400, detail="Failed to generate md5_unique_id")
# Use ReservationService to create reservation
reservation_service = ReservationService(db_session)
try:
db_reservation = await reservation_service.create_reservation(
reservation, db_customer.id
)
except IntegrityError as e:
await db_session.rollback()
# Check if this is a duplicate (unique constraint violation)
error_msg = str(e.orig) if hasattr(e, 'orig') else str(e)
is_duplicate = any(keyword in error_msg.lower() for keyword in ['unique', 'duplicate', 'already exists'])
if is_duplicate:
_LOGGER.info(
"Duplicate reservation detected for unique_id=%s, skipping (this is expected for reprocessing)",
unique_id
)
return {
"status": "duplicate",
"message": "Reservation already exists (duplicate submission)",
"unique_id": unique_id,
"timestamp": timestamp,
}
else:
# Real integrity error (not a duplicate)
_LOGGER.exception("Database integrity error creating reservation: %s", e)
raise HTTPException(
status_code=500, detail="Database error creating reservation"
) from e
async def push_event():
# Fire event for listeners (push, etc.) - hotel-specific dispatch
if event_dispatcher:
# Get hotel_code from reservation to target the right listeners
hotel_code = getattr(db_reservation, "hotel_code", None)
if hotel_code and hotel_code.strip():
await event_dispatcher.dispatch_for_hotel(
"form_processed", hotel_code, db_customer, db_reservation
)
_LOGGER.info("Dispatched form_processed event for hotel %s", hotel_code)
else:
_LOGGER.warning(
"No hotel_code in reservation, skipping push notifications"
)
# Create task and store reference to prevent garbage collection
task = asyncio.create_task(push_event())
# Add done callback to log any exceptions
task.add_done_callback(lambda t: t.exception() if not t.cancelled() else None)
_LOGGER.info(
"Successfully processed generic webhook: customer_id=%s, reservation_id=%s",
db_customer.id,
db_reservation.id,
)
return {
"status": "success",
"message": "Generic webhook data processed successfully",
"customer_id": db_customer.id,
"reservation_id": db_reservation.id,
"timestamp": timestamp,
}
class GenericWebhookProcessor:
"""Processor for generic webhooks."""
@property
def webhook_type(self) -> str:
"""Return webhook type identifier."""
return "generic"
async def process(
self,
webhook_request: WebhookRequest,
db_session: AsyncSession,
config: dict[str, Any] | None = None,
event_dispatcher: Any | None = None,
) -> dict[str, Any]:
"""Process generic webhook payload.
Args:
webhook_request: WebhookRequest database record
db_session: Database session
config: Application configuration (optional)
event_dispatcher: Event dispatcher for push notifications (optional)
Returns:
Response dict with status and details
"""
# Call processing function with data from webhook_request
result = await process_generic_webhook_submission(
data=webhook_request.payload_json,
db_session=db_session,
config=config,
hotel_id=webhook_request.hotel_id,
event_dispatcher=event_dispatcher,
)
return result
# Global registry instance
webhook_registry = WebhookProcessorRegistry()
def initialize_webhook_processors() -> None:
"""Initialize and register all webhook processors.
This should be called during application startup.
"""
# Register built-in processors
webhook_registry.register(WixFormProcessor())
webhook_registry.register(GenericWebhookProcessor())
_LOGGER.info("Webhook processors initialized")

View File

@@ -1,12 +1,30 @@
#!/usr/bin/env python3
"""Convenience launcher for the Wix Form Handler API."""
"""Convenience launcher for the Alpine Bits Python Server API (Development Mode)."""
import os
import subprocess
# Change to src directory
src_dir = os.path.join(os.path.dirname(__file__), "src/alpine_bits_python")
# Run the API using uv
# Run the API using uv with development settings
# This includes:
# - Auto-reload enabled for code changes
# - Single worker for easier debugging
# - Port 8080 for development
if __name__ == "__main__":
subprocess.run(["uv", "run", "python", os.path.join(src_dir, "run_api.py")], check=False)
subprocess.run(
[
"uv",
"run",
"python",
"-m",
"alpine_bits_python.run_api",
"--host",
"0.0.0.0",
"--port",
"8080",
"--workers",
"1",
"--reload",
"--log-level",
"info",
],
check=False,
)

View File

@@ -59,7 +59,7 @@ async def load_test_data_from_db():
result = []
for reservation, customer in reservations_with_customers:
# Get hashed customer data
hashed_customer = await customer_service.get_hashed_customer(customer.id)
hashed_customer = await customer_service.get_customer(customer.id)
result.append(
{

197
tests/helpers/README.md Normal file
View File

@@ -0,0 +1,197 @@
# Test Helpers
This directory contains helper utilities for creating test data.
## XML Builders
The `xml_builders` module provides convenient builder classes for creating reservation XML structures used in conversion service tests.
### Quick Start
```python
from tests.helpers import ReservationXMLBuilder
# Create a simple reservation
xml = (
ReservationXMLBuilder(
hotel_id="39054_001",
reservation_id="12345",
reservation_number="RES-001",
reservation_date="2025-11-14",
)
.set_guest(
guest_id="guest_001",
first_name="John",
last_name="Doe",
email="john@example.com",
)
.add_room(
arrival="2025-12-01",
departure="2025-12-05",
revenue_logis_per_day=150.0, # Fixed revenue per night
)
.build_xml()
)
```
### Features
#### ReservationXMLBuilder
The main builder class for creating reservation XML structures.
**Key Features:**
- Fluent API for method chaining
- Automatic daily sales generation from arrival to departure
- Convenient revenue-per-day specification (no need to manually create each dailySale)
- Support for advertising campaign data
- Guest information with optional fields
**Example - Multi-room reservation:**
```python
xml = (
ReservationXMLBuilder(
hotel_id="39054_001",
reservation_id="12345",
reservation_number="RES-001",
reservation_date="2025-11-14",
)
.set_guest(
guest_id="guest_001",
first_name="Jane",
last_name="Smith",
email="jane@example.com",
country_code="US",
)
.add_room(
arrival="2025-12-01",
departure="2025-12-05",
room_number="101",
room_type="DZV",
revenue_logis_per_day=150.0,
)
.add_room(
arrival="2025-12-01",
departure="2025-12-05",
room_number="102",
room_type="DZM",
revenue_logis_per_day=200.0,
)
.build_xml()
)
```
#### Daily Sales Generation
The builder automatically generates `<dailySale>` entries for each day from arrival to departure (inclusive).
- **Days before departure**: Include `revenueTotal` and `revenueLogis` attributes
- **Departure day**: No revenue attributes (just the date)
**Example:**
```python
# A 3-night stay (Dec 1-4)
.add_room(
arrival="2025-12-01",
departure="2025-12-04",
revenue_logis_per_day=160.0,
)
```
Generates:
```xml
<dailySales>
<dailySale date="2025-12-01" revenueTotal="160.0" revenueLogis="160.0"/>
<dailySale date="2025-12-02" revenueTotal="160.0" revenueLogis="160.0"/>
<dailySale date="2025-12-03" revenueTotal="160.0" revenueLogis="160.0"/>
<dailySale date="2025-12-04"/> <!-- No revenue on departure day -->
</dailySales>
```
#### MultiReservationXMLBuilder
For creating XML documents with multiple reservations:
```python
from tests.helpers import ReservationXMLBuilder, MultiReservationXMLBuilder
multi_builder = MultiReservationXMLBuilder()
# Add first reservation
res1 = (
ReservationXMLBuilder(...)
.set_guest(...)
.add_room(...)
)
multi_builder.add_reservation(res1)
# Add second reservation
res2 = (
ReservationXMLBuilder(...)
.set_guest(...)
.add_room(...)
)
multi_builder.add_reservation(res2)
xml = multi_builder.build_xml()
```
#### RoomReservationBuilder
Low-level builder for creating individual room reservations. Usually you'll use `ReservationXMLBuilder.add_room()` instead, but this is available for advanced use cases.
```python
from tests.helpers import RoomReservationBuilder
room_builder = RoomReservationBuilder(
arrival="2025-12-01",
departure="2025-12-05",
room_type="DZV",
room_number="101",
revenue_logis_per_day=150.0,
)
# Get the XML element (not a string)
room_elem = room_builder.build()
```
### Common Parameters
**ReservationXMLBuilder:**
- `hotel_id` - Hotel ID (required)
- `reservation_id` - Reservation ID (required)
- `reservation_number` - Reservation number (required)
- `reservation_date` - Reservation date YYYY-MM-DD (required)
- `creation_time` - Creation timestamp (optional, defaults to reservation_date + T00:00:00)
- `advertising_medium` - Advertising medium (optional)
- `advertising_partner` - Advertising partner (optional)
- `advertising_campagne` - Advertising campaign (optional)
**set_guest() parameters:**
- `guest_id` - Guest ID (required)
- `first_name` - First name (required)
- `last_name` - Last name (required)
- `email` - Email address (required)
- `language` - Language code (default: "en")
- `gender` - Gender (optional)
- `country_code` - Country code (optional)
- `country` - Country name (optional)
**add_room() parameters:**
- `arrival` - Arrival date YYYY-MM-DD (required)
- `departure` - Departure date YYYY-MM-DD (required)
- `room_type` - Room type code (default: "DZV")
- `room_number` - Room number (default: "101")
- `status` - Reservation status (default: "reserved")
- `adults` - Number of adults (default: 2)
- `children` - Number of children (default: 0)
- `infants` - Number of infants (default: 0)
- `rate_plan_code` - Rate plan code (default: "STANDARD")
- `revenue_logis_per_day` - Fixed revenue per night (optional, generates daily sales)
- `revenue_total_per_day` - Total revenue per night (optional, defaults to revenue_logis_per_day)
### See Also
- [tests/test_xml_builders.py](../test_xml_builders.py) - Unit tests demonstrating all features
- [tests/test_conversion_service.py](../test_conversion_service.py) - Integration examples (TestXMLBuilderUsage class)

13
tests/helpers/__init__.py Normal file
View File

@@ -0,0 +1,13 @@
"""Test helper utilities for creating test data."""
from .xml_builders import (
ReservationXMLBuilder,
MultiReservationXMLBuilder,
RoomReservationBuilder,
)
__all__ = [
"ReservationXMLBuilder",
"MultiReservationXMLBuilder",
"RoomReservationBuilder",
]

View File

@@ -0,0 +1,430 @@
"""XML builder helpers for creating test reservation data.
This module provides convenient builder classes for generating reservation XML
structures used in conversion service tests.
"""
from datetime import datetime, timedelta
from typing import Optional
from xml.etree import ElementTree as ET
def validate_and_convert_id(field_name: str, value: str | int) -> str:
"""Validate that an ID field is convertible to integer and return as string.
This helper ensures ID fields (like reservation_id, guest_id) are valid integers,
which is important since the Pydantic models will convert them from strings to ints.
Args:
field_name: Name of the field for error messages
value: The ID value (can be string or int)
Returns:
String representation of the validated integer ID
Raises:
ValueError: If value cannot be converted to a valid positive integer
"""
def _raise_invalid_type_error():
"""Raise error for invalid ID type."""
msg = (
f"{field_name} must be convertible to a positive integer, "
f"got: {value!r} (type: {type(value).__name__})"
)
raise ValueError(msg)
try:
# Convert to int first to validate it's a valid integer
int_value = int(value)
if int_value <= 0:
msg = f"{field_name} must be a positive integer, got: {value}"
raise ValueError(msg)
# Return as string for XML attributes
return str(int_value)
except (ValueError, TypeError):
_raise_invalid_type_error()
class RoomReservationBuilder:
"""Builder for creating roomReservation XML elements with daily sales."""
def __init__(
self,
arrival: str,
departure: str,
room_type: str = "DZV",
room_number: str = "101",
status: str = "reserved",
adults: int = 2,
children: int = 0,
infants: int = 0,
rate_plan_code: str = "STANDARD",
connected_room_type: str = "0",
revenue_logis_per_day: Optional[float] = None,
revenue_total_per_day: Optional[float] = None,
):
"""Initialize room reservation builder.
Args:
arrival: Arrival date in YYYY-MM-DD format
departure: Departure date in YYYY-MM-DD format
room_type: Room type code
room_number: Room number
status: Reservation status (reserved, request, confirmed, etc.)
adults: Number of adults
children: Number of children
infants: Number of infants
rate_plan_code: Rate plan code
connected_room_type: Connected room type code
revenue_logis_per_day: Revenue per day (if None, no revenue attributes)
revenue_total_per_day: Total revenue per day (defaults to revenue_logis_per_day)
"""
self.arrival = arrival
self.departure = departure
self.room_type = room_type
self.room_number = room_number
self.status = status
self.adults = adults
self.children = children
self.infants = infants
self.rate_plan_code = rate_plan_code
self.connected_room_type = connected_room_type
self.revenue_logis_per_day = revenue_logis_per_day
self.revenue_total_per_day = revenue_total_per_day or revenue_logis_per_day
def build(self) -> ET.Element:
"""Build the roomReservation XML element with daily sales.
Returns:
XML Element for the room reservation
"""
room_attrs = {
"arrival": self.arrival,
"departure": self.departure,
"status": self.status,
"roomType": self.room_type,
"roomNumber": self.room_number,
"adults": str(self.adults),
"ratePlanCode": self.rate_plan_code,
"connectedRoomType": self.connected_room_type,
}
if self.children > 0:
room_attrs["children"] = str(self.children)
if self.infants > 0:
room_attrs["infants"] = str(self.infants)
room_elem = ET.Element("roomReservation", room_attrs)
# Create dailySales element
daily_sales_elem = ET.SubElement(room_elem, "dailySales")
# Generate daily sale entries from arrival to departure (inclusive of departure for the no-revenue entry)
arrival_date = datetime.strptime(self.arrival, "%Y-%m-%d")
departure_date = datetime.strptime(self.departure, "%Y-%m-%d")
current_date = arrival_date
while current_date <= departure_date:
date_str = current_date.strftime("%Y-%m-%d")
daily_sale_attrs = {"date": date_str}
# Add revenue attributes for all days except departure day
if current_date < departure_date and self.revenue_logis_per_day is not None:
daily_sale_attrs["revenueTotal"] = str(self.revenue_total_per_day)
daily_sale_attrs["revenueLogis"] = str(self.revenue_logis_per_day)
ET.SubElement(daily_sales_elem, "dailySale", daily_sale_attrs)
current_date += timedelta(days=1)
return room_elem
class ReservationXMLBuilder:
"""Builder for creating complete reservation XML structures for testing.
This builder provides a fluent interface for constructing reservation XML
that matches the format expected by the ConversionService.
Example usage:
builder = ReservationXMLBuilder(
hotel_id="39054_001",
reservation_id="12345",
reservation_number="RES-001",
reservation_date="2025-11-14"
)
builder.set_guest(
guest_id="guest_001",
first_name="John",
last_name="Doe",
email="john@example.com"
)
builder.add_room(
arrival="2025-12-01",
departure="2025-12-05",
revenue_logis_per_day=150.0
)
xml_string = builder.build_xml()
"""
def __init__(
self,
hotel_id: str,
reservation_id: str | int,
reservation_number: str,
reservation_date: str,
creation_time: Optional[str] = None,
reservation_type: str = "reservation",
advertising_medium: Optional[str] = None,
advertising_partner: Optional[str] = None,
advertising_campagne: Optional[str] = None,
):
"""Initialize reservation builder.
Args:
hotel_id: Hotel ID
reservation_id: Reservation ID (must be convertible to positive integer)
reservation_number: Reservation number
reservation_date: Reservation date in YYYY-MM-DD format
creation_time: Creation timestamp (defaults to reservation_date + T00:00:00)
reservation_type: Type of reservation (reservation, request, etc.)
advertising_medium: Advertising medium
advertising_partner: Advertising partner
advertising_campagne: Advertising campaign
"""
self.hotel_id = hotel_id
self.reservation_id = validate_and_convert_id("reservation_id", reservation_id)
self.reservation_number = reservation_number
self.reservation_date = reservation_date
self.creation_time = creation_time or f"{reservation_date}T00:00:00"
self.reservation_type = reservation_type
self.advertising_medium = advertising_medium
self.advertising_partner = advertising_partner
self.advertising_campagne = advertising_campagne
self.guest_data: Optional[dict] = None
self.rooms: list[RoomReservationBuilder] = []
def set_guest(
self,
guest_id: str | int,
first_name: str,
last_name: str,
email: str,
language: str = "en",
gender: Optional[str] = None,
country_code: Optional[str] = None,
country: Optional[str] = None,
) -> "ReservationXMLBuilder":
"""Set guest information for the reservation.
Args:
guest_id: Guest ID (must be convertible to positive integer)
first_name: Guest first name
last_name: Guest last name
email: Guest email
language: Guest language code
gender: Guest gender
country_code: Guest country code
country: Guest country name
Returns:
Self for method chaining
"""
validated_guest_id = validate_and_convert_id("guest_id", guest_id)
self.guest_data = {
"id": validated_guest_id,
"firstName": first_name,
"lastName": last_name,
"email": email,
"language": language,
}
if gender:
self.guest_data["gender"] = gender
if country_code:
self.guest_data["countryCode"] = country_code
if country:
self.guest_data["country"] = country
return self
def add_room(
self,
arrival: str,
departure: str,
room_type: str = "DZV",
room_number: str = "101",
status: str = "reserved",
adults: int = 2,
children: int = 0,
infants: int = 0,
rate_plan_code: str = "STANDARD",
connected_room_type: str = "0",
revenue_logis_per_day: Optional[float] = None,
revenue_total_per_day: Optional[float] = None,
) -> "ReservationXMLBuilder":
"""Add a room reservation with convenient daily sales generation.
Args:
arrival: Arrival date in YYYY-MM-DD format
departure: Departure date in YYYY-MM-DD format
room_type: Room type code
room_number: Room number
status: Reservation status
adults: Number of adults
children: Number of children
infants: Number of infants
rate_plan_code: Rate plan code
connected_room_type: Connected room type
revenue_logis_per_day: Fixed revenue per day (auto-generates dailySale entries)
revenue_total_per_day: Total revenue per day (defaults to revenue_logis_per_day)
Returns:
Self for method chaining
"""
room_builder = RoomReservationBuilder(
arrival=arrival,
departure=departure,
room_type=room_type,
room_number=room_number,
status=status,
adults=adults,
children=children,
infants=infants,
rate_plan_code=rate_plan_code,
connected_room_type=connected_room_type,
revenue_logis_per_day=revenue_logis_per_day,
revenue_total_per_day=revenue_total_per_day,
)
self.rooms.append(room_builder)
return self
def add_room_builder(
self, room_builder: RoomReservationBuilder
) -> "ReservationXMLBuilder":
"""Add a pre-configured room builder.
Args:
room_builder: RoomReservationBuilder instance
Returns:
Self for method chaining
"""
self.rooms.append(room_builder)
return self
def build(self) -> ET.Element:
"""Build the reservation XML element.
Returns:
XML Element for the reservation
"""
reservation_attrs = {
"hotelID": self.hotel_id,
"id": self.reservation_id,
"number": self.reservation_number,
"date": self.reservation_date,
"creationTime": self.creation_time,
"type": self.reservation_type,
}
if self.advertising_medium:
reservation_attrs["advertisingMedium"] = self.advertising_medium
if self.advertising_partner:
reservation_attrs["advertisingPartner"] = self.advertising_partner
if self.advertising_campagne:
reservation_attrs["advertisingCampagne"] = self.advertising_campagne
reservation_elem = ET.Element("reservation", reservation_attrs)
# Add guest element
if self.guest_data:
ET.SubElement(reservation_elem, "guest", self.guest_data)
# Add roomReservations
if self.rooms:
room_reservations_elem = ET.SubElement(
reservation_elem, "roomReservations"
)
for room_builder in self.rooms:
room_elem = room_builder.build()
room_reservations_elem.append(room_elem)
return reservation_elem
def build_xml(self, include_xml_declaration: bool = True) -> str:
"""Build the complete XML string for this reservation.
Args:
include_xml_declaration: Whether to include <?xml version="1.0"?> declaration
Returns:
XML string
"""
reservation_elem = self.build()
# Wrap in <reservations> root element
root = ET.Element("reservations")
root.append(reservation_elem)
xml_str = ET.tostring(root, encoding="unicode")
if include_xml_declaration:
xml_str = '<?xml version="1.0" ?>\n' + xml_str
return xml_str
class MultiReservationXMLBuilder:
"""Builder for creating XML documents with multiple reservations.
Example:
builder = MultiReservationXMLBuilder()
builder.add_reservation(
ReservationXMLBuilder(...).set_guest(...).add_room(...)
)
builder.add_reservation(
ReservationXMLBuilder(...).set_guest(...).add_room(...)
)
xml_string = builder.build_xml()
"""
def __init__(self):
"""Initialize multi-reservation builder."""
self.reservations: list[ReservationXMLBuilder] = []
def add_reservation(
self, reservation_builder: ReservationXMLBuilder
) -> "MultiReservationXMLBuilder":
"""Add a reservation to the document.
Args:
reservation_builder: ReservationXMLBuilder instance
Returns:
Self for method chaining
"""
self.reservations.append(reservation_builder)
return self
def build_xml(self, include_xml_declaration: bool = True) -> str:
"""Build the complete XML string with all reservations.
Args:
include_xml_declaration: Whether to include <?xml version="1.0"?> declaration
Returns:
XML string with multiple reservations
"""
root = ET.Element("reservations")
for reservation_builder in self.reservations:
reservation_elem = reservation_builder.build()
root.append(reservation_elem)
xml_str = ET.tostring(root, encoding="unicode")
if include_xml_declaration:
xml_str = '<?xml version="1.0" ?>\n' + xml_str
return xml_str

View File

@@ -98,7 +98,7 @@ def sample_reservation(sample_customer):
user_comment="Late check-in requested",
fbclid="PAZXh0bgNhZW0BMABhZGlkAasmYBTNE3QBp1jWuJ9zIpfEGRJMP63fMAMI405yvG5EtH-OT0PxSkAbBJaudFHR6cMtkdHu_aem_fopaFtECyVPNW9fmWfEkyA",
gclid="",
hotel_code="HOTEL123",
hotel_id="HOTEL123",
hotel_name="Alpine Paradise Resort",
)
data = reservation.model_dump(exclude_none=True)
@@ -136,7 +136,7 @@ def minimal_reservation(minimal_customer):
num_adults=1,
num_children=0,
children_ages=[],
hotel_code="HOTEL123",
hotel_id="HOTEL123",
created_at=datetime(2024, 12, 2, 12, 0, 0, tzinfo=UTC),
hotel_name="Alpine Paradise Resort",
)
@@ -403,7 +403,7 @@ class TestEdgeCases:
num_adults=1,
num_children=0,
children_ages="",
hotel_code="HOTEL123",
hotel_id="HOTEL123",
created_at=datetime.now(UTC),
)
@@ -434,7 +434,7 @@ class TestEdgeCases:
num_adults=2,
num_children=0,
children_ages=[],
hotel_code="HOTEL123",
hotel_id="HOTEL123",
created_at=datetime.now(UTC),
utm_source="facebook",
utm_medium="social",
@@ -851,7 +851,7 @@ class TestAcknowledgments:
num_adults=2,
num_children=0,
children_ages=[],
hotel_code="HOTEL123",
hotel_id="HOTEL123",
hotel_name="Alpine Paradise Resort",
created_at=datetime(2024, 11, 1, 12, 0, 0, tzinfo=UTC),
)
@@ -863,7 +863,7 @@ class TestAcknowledgments:
num_adults=2,
num_children=1,
children_ages=[10],
hotel_code="HOTEL123",
hotel_id="HOTEL123",
hotel_name="Alpine Paradise Resort",
created_at=datetime(2024, 11, 15, 10, 0, 0, tzinfo=UTC),
)

View File

@@ -18,6 +18,8 @@ from unittest.mock import patch
import pytest
import pytest_asyncio
from alembic import command
from alembic.config import Config
from fastapi.testclient import TestClient
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
@@ -26,6 +28,26 @@ from alpine_bits_python.const import HttpStatusCode
from alpine_bits_python.db import Base, Customer, Reservation
def run_alembic_migrations(connection):
"""Run Alembic migrations on a SQLAlchemy connection.
This is used in tests to set up the database schema using migrations
instead of Base.metadata.create_all().
"""
# Get path to alembic.ini
project_root = Path(__file__).parent.parent
alembic_ini_path = project_root / "alembic.ini"
# Create Alembic config
alembic_cfg = Config(str(alembic_ini_path))
# Override the database URL to use the test connection
# For SQLite, we can't use the in-memory connection URL directly,
# so we'll use Base.metadata.create_all() for SQLite tests
# This is a limitation of Alembic with SQLite in-memory databases
Base.metadata.create_all(bind=connection)
@pytest_asyncio.fixture
async def test_db_engine():
"""Create an in-memory SQLite database for testing."""
@@ -34,7 +56,8 @@ async def test_db_engine():
echo=False,
)
# Create tables
# Create tables using Base.metadata.create_all for SQLite tests
# (Alembic doesn't work well with SQLite in-memory databases)
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
@@ -73,6 +96,12 @@ def test_config():
"hotel_name": "Test Hotel",
"username": "testuser",
"password": "testpass",
},
{
"hotel_id": "135",
"hotel_name": "Another Hotel",
"username": "anotheruser",
"password": "anotherpass",
}
],
"default_hotel_code": "HOTEL123",
@@ -88,17 +117,29 @@ def client(test_config):
Each test gets a fresh TestClient instance to avoid database conflicts.
Mocks load_config to return test_config instead of production config.
"""
import asyncio # noqa: PLC0415
# Import locally to avoid circular imports
from alpine_bits_python.alpinebits_server import AlpineBitsServer # noqa: PLC0415
# Mock load_config to return test_config instead of production config
with patch("alpine_bits_python.api.load_config", return_value=test_config):
# Create a new in-memory database for each test
engine = create_async_engine(
"sqlite+aiosqlite:///:memory:",
echo=False,
)
# Create a new in-memory database for each test
engine = create_async_engine(
"sqlite+aiosqlite:///:memory:",
echo=False,
)
# Create tables before TestClient starts (which triggers lifespan)
# This ensures tables exist when run_startup_tasks() runs
async def create_tables():
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
asyncio.run(create_tables())
# Mock both load_config and create_database_engine
# This ensures the lifespan uses our test database instead of creating a new one
with patch("alpine_bits_python.api.load_config", return_value=test_config), \
patch("alpine_bits_python.api.create_database_engine", return_value=engine):
# Setup app state (will be overridden by lifespan but we set it anyway)
app.state.engine = engine
app.state.async_sessionmaker = async_sessionmaker(
@@ -107,8 +148,9 @@ def client(test_config):
app.state.config = test_config
app.state.alpine_bits_server = AlpineBitsServer(test_config)
# TestClient will trigger lifespan events which create the tables
# TestClient will trigger lifespan events
# The mocked load_config will ensure test_config is used
# The mocked create_database_engine will ensure our test database is used
with TestClient(app) as test_client:
yield test_client
@@ -259,7 +301,7 @@ class TestWixWebhookEndpoint:
def test_wix_webhook_test_endpoint(self, client, sample_wix_form_data):
"""Test the test endpoint works identically."""
response = client.post("/api/webhook/wix-form/test", json=sample_wix_form_data)
response = client.post("/api/webhook/wix-form", json=sample_wix_form_data)
assert response.status_code == HttpStatusCode.OK
data = response.json()
assert data["status"] == "success"
@@ -282,7 +324,7 @@ class TestWixWebhookEndpoint:
with test_form_file.open() as f:
form_data = json.load(f)
response = client.post("/api/webhook/wix-form/test", json=form_data)
response = client.post("/api/webhook/wix-form", json=form_data)
assert response.status_code == HttpStatusCode.OK
data = response.json()
assert data["status"] == "success"
@@ -381,7 +423,7 @@ class TestGenericWebhookEndpoint:
"""Test successful generic webhook submission with real form data."""
unique_id = uuid.uuid4().hex[:8]
test_data = {
"hotel_data": {"hotelname": "Bemelmans", "hotelcode": "39054_001"},
"hotel_data": {"hotelname": "Bemelmans", "hotelcode": "HOTEL123"},
"form_data": {
"sprache": "it",
"anreise": "14.10.2025",
@@ -415,14 +457,14 @@ class TestGenericWebhookEndpoint:
assert "timestamp" in data
assert (
data["message"]
== "Generic webhook data received and processed successfully"
== "Generic webhook data processed successfully"
)
def test_generic_webhook_creates_customer_and_reservation(self, client):
"""Test that webhook creates customer and reservation in database."""
unique_id = uuid.uuid4().hex[:8]
test_data = {
"hotel_data": {"hotelname": "Test Hotel", "hotelcode": "TEST123"},
"hotel_data": {"hotelname": "Test Hotel", "hotelcode": "HOTEL123"},
"form_data": {
"sprache": "de",
"anreise": "25.12.2025",
@@ -481,7 +523,7 @@ class TestGenericWebhookEndpoint:
(r for r in reservations if r.customer_id == customer.id), None
)
assert reservation is not None, "Reservation should be created"
assert reservation.hotel_code == "TEST123"
assert reservation.hotel_id == "HOTEL123"
assert reservation.hotel_name == "Test Hotel"
assert reservation.num_adults == 2
assert reservation.num_children == 1
@@ -501,7 +543,7 @@ class TestGenericWebhookEndpoint:
def test_generic_webhook_missing_dates(self, client):
"""Test webhook with missing required dates."""
test_data = {
"hotel_data": {"hotelname": "Test", "hotelcode": "123"},
"hotel_data": {"hotelname": "Test", "hotelcode": "HOTEL123"},
"form_data": {
"sprache": "de",
"name": "John",
@@ -519,7 +561,7 @@ class TestGenericWebhookEndpoint:
def test_generic_webhook_invalid_date_format(self, client):
"""Test webhook with invalid date format."""
test_data = {
"hotel_data": {"hotelname": "Test", "hotelcode": "123"},
"hotel_data": {"hotelname": "Test", "hotelcode": "HOTEL123"},
"form_data": {
"sprache": "en",
"anreise": "2025-10-14", # Wrong format, should be DD.MM.YYYY
@@ -541,7 +583,7 @@ class TestGenericWebhookEndpoint:
"""Test webhook properly handles children ages."""
unique_id = uuid.uuid4().hex[:8]
test_data = {
"hotel_data": {"hotelname": "Family Hotel", "hotelcode": "FAM001"},
"hotel_data": {"hotelname": "Family Hotel", "hotelcode": "HOTEL123"},
"form_data": {
"sprache": "it",
"anreise": "01.08.2025",
@@ -572,9 +614,9 @@ class TestGenericWebhookEndpoint:
result = await session.execute(select(Reservation))
reservations = result.scalars().all()
reservation = next(
(r for r in reservations if r.hotel_code == "FAM001"), None
(r for r in reservations if r.hotel_id == "HOTEL123"), None
)
assert reservation is not None
assert reservation is not None, "Reservation should be created"
assert reservation.num_children == 3
# children_ages is stored as CSV string
children_ages = [
@@ -595,9 +637,9 @@ class TestGenericWebhookEndpoint:
),
None,
)
assert customer is not None
assert customer.phone is None # Empty phone should be None
assert customer.name_prefix is None # -- should be filtered out
assert customer is not None, "Customer should be created"
assert customer.phone is None, "Empty phone should be None"
assert customer.name_prefix is None, "Name prefix '--' should be filtered out"
import asyncio
@@ -737,8 +779,9 @@ class TestXMLUploadEndpoint:
headers={**basic_auth_headers, "Content-Type": "application/xml"},
)
assert response.status_code == HttpStatusCode.OK
assert "Xml received" in response.text
# Returns 202 Accepted since processing is now asynchronous
assert response.status_code == 202
assert "received and queued for processing" in response.text
def test_xml_upload_gzip_compressed(self, client, basic_auth_headers):
"""Test XML upload with gzip compression."""
@@ -761,7 +804,8 @@ class TestXMLUploadEndpoint:
headers=headers,
)
assert response.status_code == HttpStatusCode.OK
# Returns 202 Accepted since processing is now asynchronous
assert response.status_code == 202
def test_xml_upload_missing_auth(self, client):
"""Test XML upload without authentication."""
@@ -876,7 +920,7 @@ class TestErrorHandling:
headers={"Content-Type": "application/json"},
)
assert response.status_code == 422
assert response.status_code == 400
def test_wix_webhook_missing_required_fields(self, client):
"""Test webhook with missing required fields."""

216
tests/test_api_freerooms.py Normal file
View File

@@ -0,0 +1,216 @@
"""Integration tests for the FreeRooms endpoint."""
from __future__ import annotations
import asyncio
import gzip
import urllib.parse
from datetime import UTC, datetime
from unittest.mock import patch
import pytest
from fastapi.testclient import TestClient
from sqlalchemy import select
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
from alpine_bits_python.alpinebits_server import AlpineBitsServer
from alpine_bits_python.api import app
from alpine_bits_python.const import HttpStatusCode
from alpine_bits_python.db import Base, Hotel, RoomAvailability
from alpine_bits_python.hotel_service import hash_password
def build_request_xml(body: str, include_unique_id: bool = True) -> str:
unique = (
'<UniqueID Type="16" ID="1" Instance="CompleteSet"/>'
if include_unique_id
else ""
)
return f"""<?xml version="1.0" encoding="UTF-8"?>
<OTA_HotelInvCountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" Version="7.000">
{unique}
<Inventories HotelCode="HOTEL123" HotelName="Integration Hotel">
{body}
</Inventories>
</OTA_HotelInvCountNotifRQ>"""
INVENTORY_A = """
<Inventory>
<StatusApplicationControl Start="2025-10-01" End="2025-10-03" InvTypeCode="DBL"/>
<InvCounts>
<InvCount CountType="2" Count="3"/>
</InvCounts>
</Inventory>
"""
INVENTORY_B = """
<Inventory>
<StatusApplicationControl Start="2025-10-02" End="2025-10-02" InvTypeCode="DBL"/>
<InvCounts>
<InvCount CountType="2" Count="1"/>
</InvCounts>
</Inventory>
"""
@pytest.fixture
def freerooms_test_config():
return {
"server": {
"codecontext": "ADVERTISING",
"code": "70597314",
"companyname": "99tales Gmbh",
"res_id_source_context": "99tales",
},
"alpine_bits_auth": [
{
"hotel_id": "HOTEL123",
"hotel_name": "Integration Hotel",
"username": "testuser",
"password": "testpass",
}
],
"database": {"url": "sqlite+aiosqlite:///:memory:"},
}
@pytest.fixture
def freerooms_client(freerooms_test_config):
engine = create_async_engine("sqlite+aiosqlite:///:memory:", echo=False)
async def create_tables():
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
asyncio.run(create_tables())
with patch("alpine_bits_python.api.load_config", return_value=freerooms_test_config), patch(
"alpine_bits_python.api.create_database_engine", return_value=engine
):
app.state.engine = engine
app.state.async_sessionmaker = async_sessionmaker(engine, expire_on_commit=False)
app.state.config = freerooms_test_config
app.state.alpine_bits_server = AlpineBitsServer(freerooms_test_config)
with TestClient(app) as test_client:
yield test_client
@pytest.fixture
def freerooms_headers():
return {
"Authorization": "Basic dGVzdHVzZXI6dGVzdHBhc3M=",
"X-AlpineBits-ClientProtocolVersion": "2024-10",
}
def seed_hotel_if_missing(client: TestClient):
async def _seed():
async_sessionmaker = client.app.state.async_sessionmaker
async with async_sessionmaker() as session:
result = await session.execute(
select(Hotel).where(Hotel.hotel_id == "HOTEL123")
)
if result.scalar_one_or_none():
return
session.add(
Hotel(
hotel_id="HOTEL123",
hotel_name="Integration Hotel",
username="testuser",
password_hash=hash_password("testpass"),
created_at=datetime.now(UTC),
updated_at=datetime.now(UTC),
is_active=True,
)
)
await session.commit()
asyncio.run(_seed())
def fetch_availability(client: TestClient):
async def _fetch():
async_sessionmaker = client.app.state.async_sessionmaker
async with async_sessionmaker() as session:
result = await session.execute(
select(RoomAvailability).order_by(RoomAvailability.date)
)
return result.scalars().all()
return asyncio.run(_fetch())
def test_freerooms_endpoint_complete_set(freerooms_client: TestClient, freerooms_headers):
seed_hotel_if_missing(freerooms_client)
xml = build_request_xml(INVENTORY_A, include_unique_id=True)
response = freerooms_client.post(
"/api/alpinebits/server-2024-10",
data={"action": "OTA_HotelInvCountNotif:FreeRooms", "request": xml},
headers=freerooms_headers,
)
assert response.status_code == HttpStatusCode.OK
assert "<Success" in response.text
rows = fetch_availability(freerooms_client)
assert len(rows) == 3
assert rows[0].bookable_type_2 == 3
def test_freerooms_endpoint_delta_updates_existing_rows(
freerooms_client: TestClient, freerooms_headers
):
seed_hotel_if_missing(freerooms_client)
complete_xml = build_request_xml(INVENTORY_A, include_unique_id=True)
delta_xml = build_request_xml(INVENTORY_B, include_unique_id=False)
response = freerooms_client.post(
"/api/alpinebits/server-2024-10",
data={"action": "OTA_HotelInvCountNotif:FreeRooms", "request": complete_xml},
headers=freerooms_headers,
)
assert response.status_code == HttpStatusCode.OK
response = freerooms_client.post(
"/api/alpinebits/server-2024-10",
data={"action": "OTA_HotelInvCountNotif:FreeRooms", "request": delta_xml},
headers=freerooms_headers,
)
assert response.status_code == HttpStatusCode.OK
rows = fetch_availability(freerooms_client)
counts = {row.date.isoformat(): row.bookable_type_2 for row in rows}
assert counts["2025-10-02"] == 1
assert counts["2025-10-01"] == 3
def test_freerooms_endpoint_accepts_gzip_payload(
freerooms_client: TestClient, freerooms_headers
):
seed_hotel_if_missing(freerooms_client)
xml = build_request_xml(INVENTORY_A, include_unique_id=True)
encoded = urllib.parse.urlencode(
{"action": "OTA_HotelInvCountNotif:FreeRooms", "request": xml}
).encode("utf-8")
compressed = gzip.compress(encoded)
headers = {
**freerooms_headers,
"Content-Encoding": "gzip",
"Content-Type": "application/x-www-form-urlencoded",
}
response = freerooms_client.post(
"/api/alpinebits/server-2024-10",
data=compressed,
headers=headers,
)
assert response.status_code == HttpStatusCode.OK
assert "<Success" in response.text
rows = fetch_availability(freerooms_client)
assert len(rows) == 3

File diff suppressed because it is too large Load Diff

169
tests/test_csv_import.py Normal file
View File

@@ -0,0 +1,169 @@
"""Tests for CSV import functionality with both German and English formats.
Tests the CSVImporter class with:
- German landing page form CSV (landing_page_form.csv)
- English email leads export CSV (leads_export.csv)
"""
from pathlib import Path
import pytest
import pytest_asyncio
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
from alpine_bits_python.csv_import import CSVImporter
from alpine_bits_python.db import Base
@pytest_asyncio.fixture
async def test_db_engine():
"""Create an in-memory SQLite database for testing."""
engine = create_async_engine(
"sqlite+aiosqlite:///:memory:",
echo=False,
)
# Create tables
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
yield engine
# Cleanup
await engine.dispose()
@pytest_asyncio.fixture
async def test_db_session(test_db_engine):
"""Create a test database session."""
async_session = async_sessionmaker(
test_db_engine,
class_=AsyncSession,
expire_on_commit=False,
)
async with async_session() as session:
yield session
@pytest.fixture
def test_config():
"""Test configuration."""
return {
"server": {
"codecontext": "ADVERTISING",
"code": "70597314",
"companyname": "99tales Gmbh",
"res_id_source_context": "99tales",
},
"alpine_bits_auth": [
{
"hotel_id": "bemelmans",
"hotel_name": "Bemelmans Apartments",
"username": "bemelmans_user",
"password": "testpass",
}
],
}
@pytest.fixture
def test_data_dir():
"""Return path to test data directory."""
return Path(__file__).parent / "test_data"
class TestCSVImport:
"""Test CSV import functionality."""
@pytest.mark.asyncio
async def test_import_leads_export_csv(self, test_db_session, test_config, test_data_dir):
"""Test importing English leads export CSV - just verify it doesn't error."""
csv_file = test_data_dir / "leads_export.csv"
if not csv_file.exists():
pytest.skip(f"Test data file not found: {csv_file}")
importer = CSVImporter(test_db_session, test_config)
# Import the CSV - just check it doesn't raise an exception
stats = await importer.import_csv_file(
csv_file_path=str(csv_file),
hotel_code="bemelmans",
dryrun=False,
)
# Just verify stats dict returned without errors
assert isinstance(stats, dict)
assert "total_rows" in stats
assert "errors" in stats
@pytest.mark.asyncio
async def test_import_leads_export_csv_dryrun(self, test_db_session, test_config, test_data_dir):
"""Test dry-run mode with English leads export CSV."""
csv_file = test_data_dir / "leads_export.csv"
if not csv_file.exists():
pytest.skip(f"Test data file not found: {csv_file}")
importer = CSVImporter(test_db_session, test_config)
# Dry-run import - just check it doesn't raise an exception
result = await importer.import_csv_file(
csv_file_path=str(csv_file),
hotel_code="bemelmans",
dryrun=True,
)
# Just verify result dict structure
assert isinstance(result, dict)
assert "headers" in result
assert "rows" in result
@pytest.mark.asyncio
async def test_import_landing_page_form_csv(self, test_db_session, test_config, test_data_dir):
"""Test importing German landing page form CSV - may have validation errors due to data quality."""
csv_file = test_data_dir / "landing_page_form.csv"
if not csv_file.exists():
pytest.skip(f"Test data file not found: {csv_file}")
importer = CSVImporter(test_db_session, test_config)
# Import the CSV - may fail due to data quality issues in test file
try:
stats = await importer.import_csv_file(
csv_file_path=str(csv_file),
hotel_code="bemelmans",
dryrun=False,
)
# Just verify stats dict returned
assert isinstance(stats, dict)
assert "total_rows" in stats
assert "errors" in stats
except Exception as e:
# Test data file may have invalid data - that's OK for this test
# Just verify the importer tried to process it
assert "vogel_marion" in str(e) or "email" in str(e).lower()
@pytest.mark.asyncio
async def test_import_landing_page_form_csv_dryrun(self, test_db_session, test_config, test_data_dir):
"""Test dry-run mode with German landing page form CSV."""
csv_file = test_data_dir / "landing_page_form.csv"
if not csv_file.exists():
pytest.skip(f"Test data file not found: {csv_file}")
importer = CSVImporter(test_db_session, test_config)
# Dry-run import - just check it doesn't raise an exception
result = await importer.import_csv_file(
csv_file_path=str(csv_file),
hotel_code="bemelmans",
dryrun=True,
)
# Just verify result dict structure
assert isinstance(result, dict)
assert "headers" in result
assert "rows" in result

View File

@@ -6,7 +6,7 @@ from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
from alpine_bits_python.customer_service import CustomerService
from alpine_bits_python.db import Base, Customer, HashedCustomer
from alpine_bits_python.db import Base, Customer
@pytest_asyncio.fixture
@@ -42,9 +42,9 @@ async def test_create_customer_creates_hashed_version(async_session: AsyncSessio
assert customer.given_name == "John"
# Check that hashed version was created
hashed = await service.get_hashed_customer(customer.id)
hashed = await service.get_customer(customer.id)
assert hashed is not None
assert hashed.customer_id == customer.id
assert hashed.id == customer.id
assert hashed.hashed_email is not None
assert hashed.hashed_phone is not None
assert hashed.hashed_given_name is not None
@@ -66,7 +66,7 @@ async def test_update_customer_updates_hashed_version(async_session: AsyncSessio
customer = await service.create_customer(customer_data)
# Get initial hashed email
hashed = await service.get_hashed_customer(customer.id)
hashed = await service.get_customer(customer.id)
original_hashed_email = hashed.hashed_email
# Update customer email
@@ -74,7 +74,7 @@ async def test_update_customer_updates_hashed_version(async_session: AsyncSessio
updated_customer = await service.update_customer(customer, update_data)
# Check that hashed version was updated
updated_hashed = await service.get_hashed_customer(updated_customer.id)
updated_hashed = await service.get_customer(updated_customer.id)
assert updated_hashed.hashed_email != original_hashed_email
@@ -95,7 +95,7 @@ async def test_get_or_create_customer_creates_new(async_session: AsyncSession):
assert customer.contact_id == "new123"
# Verify hashed version exists
hashed = await service.get_hashed_customer(customer.id)
hashed = await service.get_customer(customer.id)
assert hashed is not None
@@ -145,10 +145,13 @@ async def test_hash_existing_customers_backfills(async_session: AsyncSession):
# Verify no hashed version exists
result = await async_session.execute(
select(HashedCustomer).where(HashedCustomer.customer_id == customer.id)
select(Customer).where(Customer.id == customer.id)
)
hashed = result.scalar_one_or_none()
assert hashed is None
assert hashed, "Customer should exist."
assert hashed.hashed_given_name is None, "Hashed given name should be None."
assert hashed.hashed_email is None, "Hashed email should be None."
# Run backfill
service = CustomerService(async_session)
@@ -158,11 +161,12 @@ async def test_hash_existing_customers_backfills(async_session: AsyncSession):
# Verify hashed version now exists
result = await async_session.execute(
select(HashedCustomer).where(HashedCustomer.customer_id == customer.id)
select(Customer).where(Customer.id == customer.id)
)
hashed = result.scalar_one_or_none()
assert hashed is not None
assert hashed.hashed_email is not None
assert hashed is not None, "Customer should still exist after backfill."
assert hashed.hashed_email is not None, "Hashed email should be populated."
assert hashed.hashed_given_name is not None, "Hashed given name should be populated."
@pytest.mark.asyncio
@@ -201,7 +205,7 @@ async def test_hashing_normalization(async_session: AsyncSession):
}
customer = await service.create_customer(customer_data)
hashed = await service.get_hashed_customer(customer.id)
hashed = await service.get_customer(customer.id)
# Verify hashes exist (normalization should have occurred)
assert hashed.hashed_email is not None
@@ -244,13 +248,17 @@ async def test_hash_existing_customers_normalizes_country_code(
# Verify no hashed version exists yet
result = await async_session.execute(
select(HashedCustomer).where(HashedCustomer.customer_id == customer.id)
select(Customer).where(Customer.id == customer.id)
)
hashed = result.scalar_one_or_none()
assert hashed is None
assert hashed is not None, "Customer should exist."
assert hashed.hashed_given_name is None, "Hashed given name should be None."
assert hashed.hashed_email is None, "Hashed email should be None."
assert hashed.hashed_country_code is None, "Hashed country code should be None."
# Verify the customer has the invalid country code stored in the DB
assert customer.country_code == "Italy"
assert hashed.country_code == "Italy"
# Run hash_existing_customers - this should normalize "Italy" to "IT"
# during validation and successfully create a hashed customer
@@ -263,7 +271,7 @@ async def test_hash_existing_customers_normalizes_country_code(
# Verify hashed version was created
await async_session.refresh(customer)
result = await async_session.execute(
select(HashedCustomer).where(HashedCustomer.customer_id == customer.id)
select(Customer).where(Customer.id == customer.id)
)
hashed = result.scalar_one_or_none()
assert hashed is not None
@@ -302,7 +310,7 @@ async def test_hash_existing_customers_normalizes_country_code(
# Verify hashed version was created with correct hash
result = await async_session.execute(
select(HashedCustomer).where(HashedCustomer.customer_id == customer2.id)
select(Customer).where(Customer.id == customer2.id)
)
hashed = result.scalar_one_or_none()
assert hashed is not None

View File

@@ -0,0 +1,549 @@
<?xml version="1.0" ?>
<!--
Bespielfile von Sebastian zum testen der Closing Seasons Funktionalität
-->
<OTA_HotelInvCountNotifRQ xmlns='http://www.opentravel.org/OTA/2003/05' Version='3.000' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.opentravel.org/OTA/2003/05 OTA_HotelInvCountNotifRQ.xsd'>
<UniqueID Type='16' ID='1' Instance='CompleteSet'/>
<Inventories HotelCode='TESTHOTEL'>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' AllInvCode='1'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='106' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='106' InvTypeCode='EZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='106' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-09' InvCode='107' InvTypeCode='EZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-10' End='2025-12-19' InvCode='107' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='107' InvTypeCode='EZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2025-12-28' InvCode='107' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-29' End='2026-01-04' InvCode='107' InvTypeCode='EZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2026-01-05' End='2026-01-31' InvCode='107' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='108' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='108' InvTypeCode='EZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='108' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='206' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='206' InvTypeCode='EZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='206' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='207' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='207' InvTypeCode='EZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='207' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='208' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='208' InvTypeCode='EZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='208' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='306' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='306' InvTypeCode='EZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='306' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='307' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='307' InvTypeCode='EZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='307' InvTypeCode='EZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='101' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-25' InvCode='101' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-26' End='2026-01-31' InvCode='101' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2026-01-31' InvCode='102' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='103' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-25' InvCode='103' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-26' End='2026-01-31' InvCode='103' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='104' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-25' InvCode='104' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-26' End='2026-01-04' InvCode='104' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2026-01-05' End='2026-01-05' InvCode='104' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2026-01-06' End='2026-01-31' InvCode='104' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='105' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-25' InvCode='105' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-26' End='2026-01-31' InvCode='105' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='201' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-25' InvCode='201' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-26' End='2026-01-31' InvCode='201' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='202' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-25' InvCode='202' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-26' End='2026-01-31' InvCode='202' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='203' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-25' InvCode='203' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-26' End='2026-01-31' InvCode='203' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='204' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-25' InvCode='204' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-26' End='2026-01-31' InvCode='204' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='205' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2026-01-05' InvCode='205' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2026-01-06' End='2026-01-31' InvCode='205' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='301' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-25' InvCode='301' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-26' End='2026-01-31' InvCode='301' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='302' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-25' InvCode='302' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-26' End='2026-01-31' InvCode='302' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='303' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-25' InvCode='303' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-26' End='2026-01-31' InvCode='303' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='304' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-25' InvCode='304' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-26' End='2026-01-31' InvCode='304' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='305' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='305' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='305' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='501' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='501' InvTypeCode='DZ'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='501' InvTypeCode='DZ'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-11' InvCode='109' InvTypeCode='SUI'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-12' End='2025-12-24' InvCode='109' InvTypeCode='SUI'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-25' End='2025-12-25' InvCode='109' InvTypeCode='SUI'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-26' End='2025-12-26' InvCode='109' InvTypeCode='SUI'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-27' End='2026-01-13' InvCode='109' InvTypeCode='SUI'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2026-01-14' End='2026-01-14' InvCode='109' InvTypeCode='SUI'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2026-01-15' End='2026-01-31' InvCode='109' InvTypeCode='SUI'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-16' InvCode='110' InvTypeCode='SUI'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-17' End='2025-12-23' InvCode='110' InvTypeCode='SUI'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='110' InvTypeCode='SUI'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-17' InvCode='209' InvTypeCode='SUI'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-18' End='2025-12-23' InvCode='209' InvTypeCode='SUI'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='209' InvTypeCode='SUI'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='210' InvTypeCode='SUI'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='210' InvTypeCode='SUI'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='210' InvTypeCode='SUI'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='309' InvTypeCode='SUI'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='309' InvTypeCode='SUI'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='309' InvTypeCode='SUI'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='310' InvTypeCode='SUI'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='310' InvTypeCode='SUI'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='310' InvTypeCode='SUI'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='401' InvTypeCode='FW'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='401' InvTypeCode='FW'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='401' InvTypeCode='FW'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='402' InvTypeCode='FW'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='402' InvTypeCode='FW'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='402' InvTypeCode='FW'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='403' InvTypeCode='FW'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='403' InvTypeCode='FW'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='403' InvTypeCode='FW'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-09' End='2025-12-19' InvCode='308' InvTypeCode='COD'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-20' End='2025-12-23' InvCode='308' InvTypeCode='COD'/>
</Inventory>
<Inventory>
<StatusApplicationControl Start='2025-12-24' End='2026-01-31' InvCode='308' InvTypeCode='COD'/>
<InvCounts>
<InvCount CountType='2' Count='1'/>
</InvCounts>
</Inventory>
</Inventories>
</OTA_HotelInvCountNotifRQ>

View File

@@ -1,53 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
AlpineBits 2024-10
https://www.alpinebits.org/
Sample message file for a Handshake response
Changelog:
v. 2024-10 1.2 Example extended with all capabilities and two supported releases
v. 2024-10 1.1 Removed the OTA_Ping action
v. 2024-10 1.0 added supported version 2024-10 in the example
v. 2018-10 1.0 initial example
-->
<OTA_PingRS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.opentravel.org/OTA/2003/05"
xsi:schemaLocation="http://www.opentravel.org/OTA/2003/05 OTA_PingRS.xsd"
Version="8.000">
<Success/>
<OTA_PingRS
xmlns="http://www.opentravel.org/OTA/2003/05" Version="7.000">
<Success/>
<Warnings>
<Warning Type="11" Status="ALPINEBITS_HANDSHAKE">{
"versions": [
{
"version": "2024-10",
"actions": [
{
"action": "action_OTA_Read"
},
{
"action": "action_OTA_HotelResNotif_GuestRequests"
}
]
},
{
"version": "2022-10",
"actions": [
{
"action": "action_OTA_Ping"
},
{
"action": "action_OTA_Read"
},
{
"action": "action_OTA_HotelResNotif_GuestRequests"
}
]
}
]
}</Warning>
<Warning Type="11" Status="ALPINEBITS_HANDSHAKE">{"versions": [{"version": "2024-10", "actions": [{"action": "action_OTA_Read"}, {"action": "action_OTA_HotelResNotif_GuestRequests"}, {"action": "action_OTA_HotelInvCountNotif", "supports": ["OTA_HotelInvCountNotif_accept_rooms", "OTA_HotelInvCountNotif_accept_categories", "OTA_HotelInvCountNotif_accept_deltas", "OTA_HotelInvCountNotif_accept_complete_set", "OTA_HotelInvCountNotif_accept_out_of_order", "OTA_HotelInvCountNotif_accept_out_of_market", "OTA_HotelInvCountNotif_accept_closing_seasons"]}]}, {"version": "2022-10", "actions": [{"action": "action_OTA_Ping"}, {"action": "action_OTA_Read"}, {"action": "action_OTA_HotelResNotif_GuestRequests"}, {"action": "action_OTA_HotelInvCountNotif", "supports": ["OTA_HotelInvCountNotif_accept_rooms", "OTA_HotelInvCountNotif_accept_categories", "OTA_HotelInvCountNotif_accept_deltas", "OTA_HotelInvCountNotif_accept_complete_set", "OTA_HotelInvCountNotif_accept_out_of_order", "OTA_HotelInvCountNotif_accept_out_of_market", "OTA_HotelInvCountNotif_accept_closing_seasons"]}]}]}</Warning>
</Warnings>
<EchoData>
{

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,577 @@
name,lastname,mail,tel,anreise,abreise,erwachsene,kinder,kind_ages,apartments,verpflegung,sprache,device,anrede,land,privacy
Martina,Contarin,martinacontarin.mc@gmail.com,3473907005,30.12.2025,04.01.2026,2,0,,"Peonia,Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (393 x 658 px),frau,--,Yes
giulia,latini,giulialatini@live.it,,06.12.2025,08.12.2025,2,0,,,Halbpension,it,Desktop (1905 x 945 px),frau,--,Yes
Simona,Buompadre,Simi1983@hotmail.it,,03.01.2026,10.01.2026,2,3,"3,6,10",Lavendula,Halbpension,it,Mobile (384 x 700 px),frau,--,Yes
Elke,Arnold,seppina@gmx.de,015127030369,28.11.2025,01.12.2025,2,0,,Peonia,Übernachtung mit Frühstück,de,Mobile (360 x 646 px),frau,Germany,Yes
Tania,Demetri,Tania.demetri@yahoo.it,,03.01.2026,06.01.2026,4,1,15,,Übernachtung mit Frühstück,it,Mobile (411 x 779 px),--,--,Yes
Mario,Reita,marioreita1985@gmail.com,,30.12.2025,03.01.2026,4,4,"2,7,10,12",,Halbpension,it,Mobile (390 x 655 px),herr,--,Yes
Gianluca,Biondo,Gnlcbiondo@gmail.com,+393520220616,22.08.2026,29.08.2026,2,3,"1,13,14",,Halbpension,it,Mobile (390 x 655 px),herr,Italy,Yes
Franca,Andreana,francesca.andreana@alice.it,+393476755045,28.12.2025,04.01.2026,2,1,14,Peonia,Halbpension,it,Mobile (360 x 684 px),frau,Italy,Yes
Barbara,Baldacci,bbaldacci73@gmail.com,3498020461,06.12.2025,08.12.2025,2,1,13,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (360 x 711 px),frau,Italy,Yes
Silvia,Silenzi,silenzi.silvia@virgilio.it,345 703 7302,24.12.2025,29.12.2025,3,1,15,,Übernachtung mit Frühstück,it,Mobile (392 x 684 px),frau,Italy,Yes
Silvia,Silenzi,silenzi.silvia@virgilio.it,345 703 7302,24.12.2025,29.12.2025,3,1,15,,Übernachtung mit Frühstück,it,Mobile (392 x 684 px),frau,Italy,Yes
Alessia,Orru,orrual@gmail.com,,10.11.2025,16.11.2025,2,1,11,"Lavendula,Fenice",Halbpension,it,Mobile (384 x 678 px),frau,Italy,Yes
Clementina bisceglie,Bisceglie,bisceglieclementina@gmail.com,3204734570,27.12.2025,03.01.2026,2,3,"8,14,17","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (428 x 729 px),frau,Italy,Yes
Cristina,Axinia,Cristinaaxinia11a@gmail.com,3473439538,27.12.2025,30.12.2025,2,2,"13,17",Peonia,Halbpension,it,Mobile (402 x 682 px),frau,Italy,Yes
Gerald,Steiner,gerald.steiner.gs@googlemail.com,,30.05.2026,06.06.2026,2,0,,"Peonia,Lavendula,Fenice,Forsythia",Halbpension,de,Desktop (1897 x 924 px),herr,Germany,Yes
Dennis,Sommer,dennissommer@gmx.de,,17.06.2026,21.06.2026,4,2,"3,5","Lavendula,Bellis",Übernachtung mit Frühstück,de,Mobile (375 x 547 px),herr,--,Yes
PAOLA,AMBROSETTI,paola_ambrosetti@yahoo.it,338 8097755,30.12.2025,01.01.2026,2,0,,Forsythia,Halbpension,it,Mobile (430 x 731 px),frau,Italy,Yes
Marilena,GIAQUINTO,marilena.giaquinto73@gmail.com,+393381531396,30.12.2025,03.01.2026,10,4,"5,8,12,15",,Übernachtung mit Frühstück,it,Mobile (360 x 668 px),frau,--,Yes
Alice Vaggelli,Vaggelli,Alicevaggelli820@gmail.com,3393723909,31.12.2025,04.01.2026,9,0,,"Loft,Lavendula,Forsythia,Bellis",Übernachtung,it,Mobile (414 x 639 px),frau,Italy,Yes
Giustina,Ganci,Giustinaganci@libero.it,3381256848,14.02.2026,17.02.2026,2,2,"10,13",Fenice,Halbpension,it,Mobile (384 x 697 px),frau,Italy,Yes
Katherine,OSULLIVAN,kdugdaleosullivan@gmail.com,718-909-9008,14.02.2026,18.02.2026,2,2,"16,18","Peonia,Lavendula,Fenice",Übernachtung,en,Desktop (1440 x 820 px),frau,--,Yes
Marianna,Faraci,Faracimarianna27@gmail.com,+393275715125,28.12.2025,04.01.2026,2,2,"1,6",Fenice,Halbpension,it,Mobile (414 x 706 px),frau,Italy,Yes
Maurizio,Marino,mauryx05@icloud.com,+393394697328,23.12.2025,27.12.2025,2,1,13,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (390 x 590 px),herr,--,Yes
Elisa,Turri,elisaturri76@gmail.com,+393881695046,02.01.2026,05.01.2026,2,0,,,Übernachtung mit Frühstück,it,Mobile (411 x 793 px),frau,--,Yes
Lidia Ciuraru,Ciuraru,lidiaanaciuraru@gmail.com,3207242313,24.12.2025,28.12.2025,2,2,"3,6",,Halbpension,it,Mobile (360 x 668 px),frau,Italy,Yes
Roberta,La riccia,robertalr89@hotmail.it,3923204310,30.12.2025,02.01.2026,6,5,"0,3,5,8,11","Lavendula,Fenice,Forsythia",Übernachtung mit Frühstück,it,Mobile (411 x 757 px),frau,--,Yes
Paola,Fianchini,Paola.f@hotmail.it,3270272667,28.11.2025,30.11.2025,2,0,,,Halbpension,it,Mobile (414 x 728 px),frau,--,Yes
Gayan Madurapperuma,Madurapperuma,gsgayan@gmail.com,3881033320,27.12.2025,30.12.2025,2,2,"8,12",Peonia,Halbpension,it,Mobile (411 x 780 px),herr,--,Yes
Stefania Guidi,Guidi,morettinamia@yahoo.it,3479573252,20.02.2026,24.02.2026,6,2,"4,5","Fenice,Forsythia",Halbpension,it,Mobile (414 x 708 px),frau,Italy,Yes
Happy Mia Lhopital,Lhopital,Hmlhopital@gmail.com,017673564169,15.02.2026,20.02.2026,2,2,"14,17","Peonia,Lavendula,Fenice",Übernachtung,de,Mobile (390 x 667 px),frau,--,Yes
Michela,Borrelli,Michyborrelli@libero.it,,22.08.2025,24.08.2025,2,2,"2,6",,Übernachtung mit Frühstück,it,Mobile (390 x 606 px),frau,--,Yes
Luisa,Göddemeier,Luisa.stoeckle@gmx.de,,27.12.2025,02.01.2026,2,2,"6,8","Peonia,Lavendula,Fenice",Übernachtung,de,Desktop (1080 x 707 px),frau,--,Yes
Fabio panconi,Panconi,Panconifabio4@gmail.com,3284310119,26.12.2025,01.01.2026,4,4,"9,10,12,12",,Übernachtung,it,Mobile (392 x 739 px),herr,Italy,Yes
Daniele,Simonetti,denny84844@libero.it,338 695 9081,31.12.2025,05.01.2026,2,2,"5,13",Peonia,Übernachtung mit Frühstück,it,Mobile (360 x 712 px),herr,--,Yes
Loredana,Padedda,lorypaddy@gmail.com,,24.12.2025,01.01.2026,3,0,,Peonia,Halbpension,it,Mobile (393 x 770 px),frau,Italy,Yes
Adriana,Alfieri,adrianaalfieri56@gmail.com,331 6516002,30.12.2025,04.01.2026,10,1,2,"Loft,Fenice,Forsythia,Bellis",Übernachtung mit Frühstück,it,Mobile (384 x 727 px),frau,--,Yes
Tiziano,Conti,Tiziconti@virgilio.it,3495250717,27.12.2025,03.01.2026,4,4,"10,12,12,16",,Übernachtung,it,Mobile (390 x 677 px),herr,--,Yes
Edoardo,Grimaccia,liftcar@hotmail.it,3921792572,07.09.2025,14.09.2025,2,0,,Loft,Halbpension,it,Mobile (433 x 830 px),herr,Italy,Yes
Lara,Marcatelli,emanuelem83@gmail.com,,30.11.2025,07.12.2025,2,2,"6,14","Lavendula,Fenice",Halbpension,it,Mobile (392 x 735 px),frau,Italy,Yes
Maria,Romoli,mr.mariaromoli@gmail.com,+393283996083,04.07.2026,11.07.2026,2,0,,Bellis,Übernachtung,it,Mobile (390 x 677 px),frau,Italy,Yes
Christine Kappes,Kappes,christine_kappes@web.de,+491791099892,03.10.2025,11.10.2025,2,0,,"Loft,Lavendula,Forsythia",Übernachtung mit Frühstück,de,Desktop (1263 x 595 px),frau,Germany,Yes
Flavio,Tosetto,flaviotosetto01@gmail.com,3286381429,01.01.2026,05.01.2026,2,2,"5,11",Lavendula,Übernachtung,it,Mobile (430 x 753 px),herr,Italy,Yes
Simone,Cinti,simonec1984@live.it,3347902970,10.01.2026,17.01.2026,2,2,"5,7",,Halbpension,it,Mobile (411 x 785 px),herr,Italy,Yes
Annunziata,Fico,Nunziafico09@gmail.com,3937737695,31.10.2025,02.11.2025,2,2,"2,5",Peonia,Halbpension,it,Mobile (393 x 770 px),frau,Italy,Yes
Adriana,Rullo,adry.rullo@gmail.com,,18.08.2025,24.08.2025,2,2,"10,14","Peonia,Lavendula,Fenice",Halbpension,de,Mobile (360 x 667 px),frau,--,Yes
Annamaria,Pozzani,Pasinifam@virgilio.it,3487353538,15.09.2025,18.09.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 660 px),frau,Italy,Yes
Lakerta,Malaj,lakertamalaj@yahoo.it,+3285909788,21.12.2025,28.12.2025,2,2,"6,11",Lavendula,Halbpension,it,Mobile (390 x 652 px),frau,Italy,Yes
Luca,Bottoni,Luca.bottoni06@gmail.com,+393389330916,18.07.2025,20.07.2025,2,1,11,Lavendula,Halbpension,it,Mobile (375 x 539 px),herr,--,Yes
Luca,Bottoni,Luca.bottoni06@gmail.com,+393389330916,18.07.2025,20.07.2025,2,1,11,Lavendula,Halbpension,it,Mobile (375 x 539 px),herr,--,Yes
Emiliana,Cottignoli,emilianacottignoli@yahoo.it,3462495979,12.07.2025,16.07.2025,2,0,,,Übernachtung mit Frühstück,it,Mobile (411 x 783 px),frau,Italy,Yes
Massimo,Morandi,mazzinomorandi@gmail.com,3272485641,13.07.2025,16.07.2025,4,0,,"Lavendula,Fenice",Übernachtung,it,Mobile (338 x 609 px),herr,--,Yes
Marianna,Sanna,marianna762006@libero.it,,28.08.2025,06.09.2025,2,0,,Lavendula,Übernachtung,it,Mobile (360 x 664 px),frau,Italy,Yes
dumitrita bocanceai,bocancea,ionterenri@gmail.com,351887634,06.08.2025,10.08.2025,2,0,,"Forsythia,Bellis",Halbpension,it,Mobile (360 x 602 px),--,--,Yes
Danila,Marenghi,marenghidanila84@gmail.com,,03.08.2025,10.08.2025,2,1,11,"Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (411 x 780 px),frau,Italy,Yes
Nadia,Capurro,Capurronadia68@gmail.com,3474614757,23.08.2025,28.08.2025,2,0,,Bellis,Halbpension,it,Mobile (360 x 655 px),frau,Italy,Yes
Fabio,Martino,fabiomartino71@gmail.com,+393343903454,16.08.2025,23.08.2025,3,1,14,Lavendula,Übernachtung mit Frühstück,it,Mobile (432 x 816 px),herr,Italy,Yes
Giuseppe,Piovesan,piovesang26@gmail.com,3476676922,04.08.2025,11.08.2025,2,0,,Forsythia,Halbpension,it,Mobile (384 x 733 px),herr,Italy,Yes
Leonardo,Intini,Intinileo@gmIl.com,3401618984,09.08.2025,20.08.2025,4,0,,,Übernachtung,it,Mobile (430 x 853 px),herr,Italy,Yes
Camelia,GHEARASIM,ghearasimcamelia@gmail.com,329 165 6518,01.09.2025,07.09.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (384 x 725 px),frau,Italy,Yes
Michele,Mainardi,Mikimaina@hotmail.it,+393355309213,13.08.2025,17.08.2025,2,0,,Bellis,Halbpension,it,Mobile (375 x 740 px),herr,Italy,Yes
Edo,Ciaralli,Edocia74@gmail.com,3205781817,19.08.2025,23.08.2025,2,2,"13,16",Fenice,Halbpension,it,Mobile (390 x 652 px),herr,Italy,Yes
Silvia,Pelicioli,Silvia.pelicioli@gmail.com,,10.08.2025,18.08.2025,2,3,"7,12,15",Loft,Halbpension,it,Mobile (411 x 788 px),frau,--,Yes
Imma,Carone,nannaenea@gmail.com,,05.09.2025,12.09.2025,1,0,,Bellis,Übernachtung,it,undefined,frau,Italy,Yes
Matteo,Tommasi,matteo.tommasi83@gmail.com,3208935492,13.08.2025,20.08.2025,2,1,0,,Halbpension,it,Mobile (360 x 652 px),herr,Italy,Yes
Nadia,Baldino,nadiabaldino80@gmail.com,347844340,18.08.2025,24.08.2025,2,2,"14,17",,Halbpension,it,Mobile (360 x 681 px),frau,Italy,Yes
Concetta,Pierro,amministrazione@consulenzapierro.com,3488549935,01.08.2025,04.08.2025,3,0,,Fenice,Halbpension,it,Mobile (393 x 548 px),frau,Italy,Yes
Laura,Gaggioli,coccinelle-75@libero.it,,14.08.2025,22.08.2025,2,0,,"Loft,Bellis",Halbpension,it,Mobile (360 x 669 px),frau,--,Yes
Diego,Vendramin,Vendramindiego70@gmail.com,335 194 2137,10.08.2025,17.08.2025,2,2,"11,12",Fenice,Halbpension,it,Mobile (375 x 740 px),herr,Italy,Yes
Angela,Nonino,angy.nonino@gmail.com,,15.02.2026,18.02.2026,2,2,"9,14","Peonia,Fenice",Übernachtung mit Frühstück,it,Mobile (411 x 759 px),frau,Italy,Yes
Daniela,Palusci,dany_p85@hotmail.it,,26.09.2025,29.09.2025,3,2,"3,6",Forsythia,Übernachtung mit Frühstück,it,Mobile (360 x 671 px),frau,--,Yes
Davide,Bonello,davide_bonello@libero.it,,24.01.2026,31.01.2026,2,1,3,Peonia,Übernachtung mit Frühstück,it,Mobile (360 x 663 px),herr,--,Yes
Marika,Castelletti,marikacastelletti@gmail.com,3285782640,22.12.2025,28.12.2025,2,2,"5,10","Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (360 x 668 px),frau,--,Yes
Alessandra,Panacchia,alessandra.panacchia@uniroma1.it,,26.07.2025,02.08.2025,4,0,,,Übernachtung,it,Mobile (360 x 668 px),frau,Italy,Yes
laura,severini,laura.severini@alice.it,3203309929,31.12.2025,03.01.2026,4,2,"8,9",Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 609 px),frau,Italy,Yes
Gabriele,Borri,gabriele.borri15@hotmail.com,3392969841,20.07.2025,27.07.2025,2,2,"6,11",Fenice,Halbpension,it,Mobile (384 x 725 px),herr,Italy,Yes
Marta,Novazzi,marta.novazzi@gmail.com,,06.07.2025,10.07.2025,2,0,,,Halbpension,it,Mobile (360 x 704 px),frau,Italy,Yes
Gabriella,Mury,gmbaddy@gmail.com,+39 347 149 3998,17.08.2025,24.08.2025,3,0,,Peonia,Halbpension,it,Mobile (414 x 824 px),frau,Italy,Yes
Francesco,Luongo,francescoluongo-4176@libero.it,3470531852,22.08.2025,25.08.2025,2,0,,Forsythia,Halbpension,it,Mobile (423 x 837 px),herr,Italy,Yes
Giuseppina,Di Micco,media.marilory@yahoo.it,329 123 4406,01.08.2025,25.08.2025,1,0,,Bellis,Übernachtung,it,Mobile (392 x 724 px),frau,Italy,Yes
Monika,Wolf,wolf.monika@me.com,1782171156,08.08.2026,15.08.2026,9,4,"3,8,8,9",,Halbpension,de,Mobile (428 x 744 px),frau,Germany,Yes
cathy,cook,heart1584@aol.com,+1 4096564686,13.07.2025,20.07.2025,2,0,,Loft,Übernachtung,en,Desktop (1257 x 602 px),frau,United States of America,Yes
Giancarlo,Capraro,giancarlocapraro8@gmail.com,3247839493,30.08.2025,04.09.2025,2,2,"5,8",Peonia,Halbpension,it,Mobile (360 x 364 px),herr,Italy,Yes
Davis,Fabbi,Da.da2003@yahoo.it,3483637094,29.08.2025,31.08.2025,2,1,7,,Übernachtung,it,Mobile (384 x 726 px),herr,Italy,Yes
Marilena Ciobanu,Ciobanu,marilenaciobanu016@gmail.com,3284384077,23.12.2025,28.12.2025,3,0,,Lavendula,Übernachtung,it,Mobile (384 x 705 px),frau,--,Yes
Giulia,Chiaranda,giulia.chiaranda25@gmail.com,,21.02.2026,24.02.2026,2,2,"4,7","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (393 x 658 px),--,--,Yes
Cristina,Porcu,porcucristina38@gmail.com,3338646289,02.12.2025,08.01.2026,3,1,7,Peonia,Halbpension,it,Mobile (375 x 551 px),frau,Italy,Yes
Millauer,Kerstin,kerstinmillauer@gmail.com,,14.02.2026,17.02.2026,2,3,"8,10,12",,Übernachtung mit Frühstück,de,Mobile (375 x 634 px),--,--,Yes
Alessandro,Cannuni,acannuni4@gmail.com,3450633788,02.01.2026,05.01.2026,4,3,"6,9,9",Lavendula,Halbpension,it,Mobile (360 x 589 px),herr,Italy,Yes
Vittoria,sicolo,Vittoria.sicolo@icloud.com,+393892521295,30.12.2025,03.01.2026,2,0,,Forsythia,Halbpension,it,Mobile (393 x 594 px),frau,--,Yes
Alueda,Mucaj,aluedaMucaj111@gmail.com,3806957164,14.11.2025,16.11.2025,2,3,"0,3,5",,Übernachtung,it,Mobile (430 x 853 px),frau,Italy,Yes
Stefano,Cassol,stefanocassol91@gmail.com,3461223837,16.08.2025,23.08.2025,2,1,1,,Halbpension,it,Mobile (354 x 660 px),herr,Italy,Yes
Gabriella,Margani,Gabriella.margani@yahoo.it,3460102509,09.08.2025,16.08.2025,2,1,9,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 616 px),frau,Italy,Yes
Luana,Di carlo,dicarloluana@libero.it,,28.06.2025,05.07.2025,2,1,11,"Lavendula,Fenice,Forsythia",Übernachtung mit Frühstück,it,Mobile (375 x 626 px),frau,--,Yes
Concetta,Salvatore,Frantin.tina@icloud.com,349 612 8429,14.07.2025,16.07.2025,2,1,12,Fenice,Übernachtung,it,Mobile (375 x 620 px),frau,Italy,Yes
Giorgia Valenti,Valenti,Valentigiorgia@virgilio.it,340 128 8815,02.01.2026,05.01.2026,1,3,"8,16,17","Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (384 x 703 px),--,--,Yes
Michela Noris,NORIS,mnoris71@gmail.com,+393460111365,29.12.2025,01.01.2026,2,0,,"Forsythia,Bellis",Übernachtung,it,Mobile (375 x 633 px),frau,Italy,Yes
Cristina,Axinia,Cristinaaxinia11a@gmail.com,+393473439538,03.01.2026,06.01.2026,2,2,"13,17",Lavendula,Halbpension,it,Mobile (402 x 789 px),frau,Italy,Yes
anna,lastrucci,lastruccianna4@gmail.com,3923827691,02.01.2026,06.01.2026,6,0,,"Peonia,Forsythia",Halbpension,it,Mobile (320 x 587 px),frau,Italy,Yes
Cristian,Mariotti,cristianmariotti2@gmail.com,3389332607,24.12.2025,28.12.2025,2,2,"13,15",Peonia,Halbpension,it,Mobile (423 x 840 px),herr,Italy,Yes
silvia,Lionello,silvia.lionello10@gmail.com,340 395 0522,24.12.2025,30.12.2025,2,1,15,Forsythia,Übernachtung,it,Mobile (360 x 678 px),frau,Italy,Yes
Gaetano,Gramano,Ggramano@gmail.com,3935777775,06.12.2025,08.12.2025,2,2,"2,4",,Halbpension,it,Mobile (393 x 576 px),herr,--,Yes
Alessia,Carroccia,alessiacarroccia@gmail.com,3298046700,27.12.2025,03.01.2026,2,1,8,Lavendula,Halbpension,it,Mobile (430 x 753 px),frau,--,Yes
Domenico,Perotti,amministrazione@squadracredit.com,3476351869,30.12.2025,05.01.2026,2,1,14,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (411 x 655 px),herr,Italy,Yes
daniele,dell uomo,daniele.delluomo@gmail.com,3475953749,01.01.2026,04.01.2026,2,2,"7,11",,Halbpension,it,Desktop (1887 x 924 px),herr,--,Yes
daniele,dell uomo,daniele.delluomo@gmail.com,3475953749,01.01.2026,04.01.2026,2,2,"7,11",,Halbpension,it,Desktop (1887 x 924 px),herr,Italy,Yes
Davis,Fabbi,Da.da2003@yahoo.it,3483637094,29.08.2025,31.08.2025,2,1,7,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 726 px),herr,--,Yes
Rosa,Picchi,Rosapicchi@tiscali.it,3356482246,16.08.2025,23.08.2025,2,0,,"Forsythia,Bellis",Halbpension,it,Desktop (785 x 312 px),frau,Italy,Yes
david,pesaresi,david_pesaresi@yahoo.it,3347022863,18.08.2025,22.08.2025,2,3,"4,9,11",,Übernachtung mit Frühstück,it,Mobile (411 x 770 px),herr,Italy,Yes
Lara,Malpezzi,laramalpezzi4@gmail.com,3348488560,10.08.2025,16.08.2025,2,0,,Loft,Halbpension,it,Mobile (384 x 735 px),frau,--,Yes
Patrizia,Tredici,tredicipatrizia@gmail.com,,24.08.2025,26.08.2025,2,0,,,Halbpension,it,Mobile (392 x 739 px),frau,--,Yes
Flori,Kuka,florikuka86@gmail.com,3801006603,11.08.2025,16.08.2025,2,2,"5,15",Peonia,Übernachtung mit Frühstück,it,Mobile (320 x 585 px),herr,Italy,Yes
Agnese,Carnevali,federicomartina73@gmail.com,3471196161,16.08.2025,23.08.2025,2,3,"11,14,17",Peonia,Halbpension,it,Mobile (423 x 846 px),frau,--,Yes
LUCA,Marcato,lucamarcato490@gmail.com,+393283469417,08.09.2025,10.09.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 667 px),herr,Italy,Yes
Alessandro,Camoletti,a.camoletti@gmail.com,3762096182,02.01.2026,06.01.2026,3,0,,Fenice,Übernachtung,it,Desktop (1024 x 696 px),herr,Italy,Yes
Paolo,Mariani,Paolo.mariani@casbot.com,3420853374,12.08.2025,21.08.2025,2,0,,Peonia,Halbpension,it,Mobile (360 x 627 px),herr,Italy,Yes
Daniele,Paiano,Direzione@idea-vision.it,,11.08.2025,24.08.2025,2,0,,Forsythia,Übernachtung mit Frühstück,it,Mobile (375 x 546 px),herr,Italy,Yes
Enrico,Breda,Enrico@visibilia.net,,27.06.2025,30.06.2025,4,0,,"Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (440 x 655 px),herr,--,Yes
Marco Predieri,Predieri,Famigliapredieri@gmail.com,3397810676,05.12.2025,08.12.2025,2,0,,Forsythia,Übernachtung mit Frühstück,it,Mobile (360 x 691 px),herr,Italy,Yes
Silvia,Pistilli,silviapistilli@yahoo.it,4384221774,20.07.2025,27.07.2025,3,0,,Peonia,Halbpension,it,undefined,frau,Italy,Yes
Monica,Pini,moni.pini76@gmail.com,,20.08.2025,27.08.2025,2,0,,Forsythia,Halbpension,it,Mobile (384 x 700 px),frau,--,Yes
Francesco,Martinelli,fmartinelli1976@gmail.com,,09.08.2025,16.08.2025,2,1,17,"Peonia,Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (360 x 676 px),herr,--,Yes
Federica,Ripiccini,Ripiccini_federica@hotmail.com,3397429694,09.08.2025,16.08.2025,2,1,12,,Halbpension,it,Mobile (414 x 706 px),frau,Italy,Yes
domenico,demaria,domenicodemaria610@gmail.com,3341305718,10.08.2025,17.08.2025,2,0,,Forsythia,Halbpension,it,Desktop (1349 x 615 px),herr,Italy,Yes
Angela,Ignomeriello,Ignomerielloa@gmail.com,3336378567,26.07.2025,31.07.2025,2,0,,Loft,Übernachtung mit Frühstück,it,Mobile (320 x 575 px),frau,Italy,Yes
Camelia,Bogdan,Cameliabogdan0@gmail.com,3469494585,05.07.2025,12.07.2025,2,0,,Fenice,Halbpension,it,Mobile (360 x 663 px),frau,Italy,Yes
Carlo,Consani,c.consani1@gmail.com,3333015899,16.08.2025,23.08.2025,2,0,,Loft,Übernachtung mit Frühstück,it,Mobile (384 x 708 px),herr,Italy,Yes
Mirko,Angeli,mirko2675@gmail.com,3388567415,17.08.2025,24.08.2025,2,0,,"Forsythia,Bellis",Halbpension,it,Mobile (411 x 790 px),herr,Italy,Yes
Katia,Masciulli,Masciullikatia1977@gmail.com,,28.12.2025,04.01.2026,6,2,"11,16",,Halbpension,it,Desktop (834 x 1087 px),frau,--,Yes
Elena,Onofrei,oelena7@gmail.com,,06.02.2026,08.02.2026,2,1,8,Loft,Übernachtung,it,Mobile (360 x 653 px),frau,Italy,Yes
Luca,Asteggiano,asteluca82@gmail.com,3395692025,02.01.2026,05.01.2026,2,2,"8,12",Lavendula,Halbpension,it,Mobile (360 x 667 px),herr,Italy,Yes
Alessia,Bignù,alex.down.the.rabbit.hole@gmail.com,3516221506,20.12.2025,01.01.2026,2,2,"13,17",,Übernachtung mit Frühstück,it,Mobile (411 x 780 px),frau,Italy,Yes
maura dagnino,Dagnino,Mauradagnino@libero.it,3403815344,28.11.2025,30.11.2025,2,2,"8,11",,Übernachtung,it,Mobile (320 x 631 px),frau,--,Yes
Robert,Nitschke,robert.nitschke@gmx.net,017624694617,13.02.2026,17.02.2026,2,2,"2,6","Loft,Peonia,Lavendula,Fenice,Forsythia",Übernachtung,de,Mobile (393 x 665 px),herr,Germany,Yes
Carloalberto,Molina,molinacala@libero.it,,29.12.2025,03.01.2026,2,2,"1,8",,Halbpension,it,Mobile (392 x 739 px),herr,Italy,Yes
Paola,De Carlo,Decarlopaola@gmail.com,,27.11.2025,27.12.2025,4,2,"7,11",Peonia,Halbpension,it,Mobile (402 x 677 px),frau,--,Yes
Gabriele,Dr.Matuschek-Grohmann,gabriele@dr-matuschek-grohmann.de,02615791416,01.09.2025,10.09.2025,2,0,,Peonia,Übernachtung mit Frühstück,de,Mobile (430 x 739 px),frau,Germany,Yes
Erica,Biondi,Ericabiondi77@gmail.com,349 1560995,11.08.2025,18.08.2025,5,0,,"Loft,Lavendula",Halbpension,it,Mobile (414 x 608 px),frau,Italy,Yes
Giuseppe,Piovesan,piovesang26@gmail.com,3476676922,03.08.2025,10.08.2025,2,0,,Forsythia,Halbpension,it,Mobile (384 x 733 px),herr,Italy,Yes
Anna,Mandolini,anna.mandolini57@gmail.com,3404039103,21.07.2025,27.07.2025,2,0,,Forsythia,Halbpension,it,Mobile (360 x 655 px),frau,Italy,Yes
Paola,Passarin,pabli2580@gmail.com,,26.12.2025,04.01.2026,2,2,"3,8",Lavendula,Übernachtung,it,Mobile (384 x 727 px),frau,--,Yes
Francesco,Valente,Francescovalente@ymail.com,3204988031,02.08.2025,09.08.2025,2,0,,"Loft,Forsythia,Bellis",Übernachtung mit Frühstück,it,Mobile (393 x 651 px),herr,--,Yes
dumitrita bocancea,terenti,ionterenti@gmail.com,351887634,06.08.2025,10.08.2025,2,1,0,Bellis,Halbpension,it,Mobile (360 x 680 px),herr,Italy,Yes
Antonio Vannacci,Vannacci,antonio.vannacci@gmail.com,3394942185,26.07.2025,01.08.2025,3,0,,Fenice,Halbpension,it,Mobile (360 x 661 px),herr,Italy,Yes
Elisa,Lore,Elisaaaaa@gmail.com,,28.06.2025,03.07.2025,2,3,"10,13,16",,Halbpension,it,Mobile (390 x 663 px),frau,--,Yes
Marco,Lovino,marcolovino17@gmail.com,3333677558,11.08.2025,14.08.2025,2,1,7,,Halbpension,it,Mobile (384 x 731 px),herr,--,Yes
Andrea,Meini,falle.gname.72@gmail.com,3495618372,21.07.2025,28.07.2025,2,0,,Fenice,Halbpension,it,undefined,herr,--,Yes
Enzo,Sberna,enzosberna@libero.it,,01.08.2025,08.08.2025,2,0,,Bellis,Halbpension,it,Mobile (320 x 551 px),herr,Italy,Yes
Paolo,Antonucci,Palletto@gmail.com,,10.08.2025,20.08.2025,2,1,8,,Halbpension,it,Mobile (384 x 705 px),--,--,Yes
Davis,Fabbi,Da.da2003@yahoo.it,3483637094,06.09.2025,08.09.2025,2,1,7,,Halbpension,it,Mobile (384 x 726 px),--,--,Yes
Arianna,Taffetani,Arytaffi90@gmail.com,+393398430571,23.12.2025,28.12.2025,2,6,"2,3,5,9,14,14",Loft,Halbpension,it,Mobile (393 x 596 px),frau,Italy,Yes
Vittoria,Sicolo,Vittoria.sicolo@icloud.com,+393892521295,30.12.2025,03.01.2026,2,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (393 x 658 px),frau,Italy,Yes
Vittoria,Sicolo,Vittoria.sicolo@icloud.com,+393892521295,30.12.2025,03.01.2026,2,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (393 x 658 px),frau,Italy,Yes
Elisa,Galassi,Eliga84@gmail.com,3402539330,05.12.2025,08.12.2025,2,2,"8,11","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (390 x 776 px),frau,Italy,Yes
Hazel Silvia,Massone,hazel.massone@gmail.com,03925081848,18.08.2025,22.08.2025,2,2,"12,14",Lavendula,Übernachtung mit Frühstück,en,Desktop (1521 x 730 px),frau,Italy,Yes
.lanfredi Rachele,Lanfredi,Lanfredi.rachele@gmail.com,348 865 4218,20.06.2025,30.09.2025,4,0,,Peonia,Übernachtung,it,Mobile (360 x 653 px),frau,Italy,Yes
Roberta,Piron,robertapiron@gmail.com,3470906155,14.07.2025,21.07.2025,2,1,14,Peonia,Halbpension,it,Mobile (360 x 668 px),--,Italy,Yes
Barbara,Magliani,barbara.magliani@gmail.com,,30.06.2025,06.07.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (384 x 681 px),--,Italy,Yes
Davide,Montanari,davide.montanari72@gmail.com,,24.08.2025,31.08.2025,2,1,16,Lavendula,Übernachtung,it,Mobile (686 x 965 px),--,--,Yes
Franca,Gravano,franca.asia@yahoo.it,069278163,29.08.2025,06.09.2025,2,0,,,Halbpension,it,Mobile (392 x 739 px),frau,Italy,Yes
Alberto,Gandini,Alby.gandy@gmail.com,+393387032435,23.08.2025,30.08.2025,4,0,,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (384 x 726 px),herr,Italy,Yes
Prof. Wolfhard,Cappel,wolfhard.cappel@t-online.de,01624782205,31.05.2025,11.06.2025,2,0,,Loft,Übernachtung,de,Desktop (1382 x 980 px),herr,Germany,Yes
Gayan Msdurapperuma,Madurapperuma,gsgayan@gmail.com,3881033320,27.12.2025,30.12.2025,2,2,"8,12","Peonia,Lavendula",Halbpension,it,Mobile (411 x 504 px),herr,--,Yes
Katharina,Campe,k.campe@t-online.de,+491719322029,13.09.2025,20.09.2025,2,0,,Forsythia,Übernachtung,de,Desktop (1468 x 711 px),frau,Germany,Yes
Luca,Zottin,zottinluca04@gmail.com,3334234743,11.07.2025,13.07.2025,2,0,,Loft,Übernachtung mit Frühstück,it,Mobile (390 x 663 px),herr,Italy,Yes
Elena,Razza,elena.razza@libero.it,3480316800,04.07.2025,07.07.2025,3,0,,Lavendula,Übernachtung mit Frühstück,it,Desktop (1521 x 703 px),frau,Italy,Yes
Ombretta,Benattii,ombrettabenatti74@gmail.com,3496723430,09.08.2025,17.08.2025,3,1,15,"Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (392 x 512 px),frau,Italy,Yes
Nazzarena,Ioannucci,nenaioannucci@gmail.com,3493675124,31.08.2025,06.09.2025,2,0,,Forsythia,Halbpension,it,Mobile (414 x 706 px),frau,Italy,Yes
Emanuele,Capozzi,capozziemanuele27@gmail.com,3383051766,17.08.2025,24.08.2025,2,2,"12,15","Peonia,Fenice",Übernachtung,it,Mobile (360 x 668 px),herr,Italy,Yes
Gabriele,Mansour,Manfadi4@gmail.com,388 169 0894,28.07.2025,02.08.2025,2,1,5,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (368 x 771 px),herr,--,Yes
Marco,Quadrelli,soniacesaretti73@libero.it,3389783613,27.07.2025,04.08.2025,5,0,,Fenice,Halbpension,it,Mobile (360 x 691 px),herr,--,Yes
Barbara Serragli,Serragli,barbaratiare3@gmail.com,,05.12.2025,08.12.2025,2,1,13,Peonia,Übernachtung mit Frühstück,it,Mobile (411 x 682 px),frau,Italy,Yes
Marco,D'EMILIO,mardem76@gmail.com,,20.09.2025,27.09.2025,2,4,"9,10,15,17",Fenice,Halbpension,it,Mobile (384 x 705 px),herr,Italy,Yes
Marina,D'Este,d.este.mary@gmail.com,,02.10.2025,09.10.2025,2,0,,,Halbpension,it,Mobile (392 x 740 px),frau,--,Yes
Marina,D'Este,d.este.mary@gmail.com,,02.10.2025,09.10.2025,2,0,,,Übernachtung,it,Mobile (392 x 740 px),frau,Italy,Yes
paola,Bosco,paola.bosco@policlinico.mi.it,,13.09.2025,16.09.2025,2,0,,"Peonia,Lavendula",Übernachtung,it,Mobile (600 x 806 px),frau,Italy,Yes
Davide,Bonello,davide_bonello@libero.it,+393294139937,07.03.2026,14.03.2026,2,1,3,Peonia,Übernachtung,it,Mobile (360 x 589 px),herr,--,Yes
Micaela,Mostacci,Micaela.mostacci@gmail.com,3382615080,21.02.2026,28.02.2026,2,2,"8,15",,Halbpension,it,Mobile (440 x 764 px),frau,--,Yes
Flavia,Barattini,flavia.barattini28@gmail.com,,12.08.2025,19.08.2025,2,1,15,Lavendula,Übernachtung mit Frühstück,it,Mobile (360 x 659 px),frau,Italy,Yes
Jacopo,Giannoni,Jacopo.giannoni@hotmail.it,+393357727375,06.08.2025,09.08.2025,2,0,,Bellis,Halbpension,it,Mobile (411 x 783 px),herr,--,Yes
ANNA,Fiorenzo,Annafiorenzo@gmail.com,320484241,18.08.2025,23.08.2025,2,2,"10,16",,Halbpension,it,Mobile (384 x 600 px),--,--,Yes
Valentina,Zanframundo,Vale@tallo.eu,3480340348,16.08.2025,23.08.2025,2,4,"3,5,6,10",,Übernachtung,it,Mobile (360 x 653 px),frau,Italy,Yes
Max,Bernardini,bernamax.555@gmail.com,3462152149,14.08.2025,17.08.2025,2,1,12,Fenice,Übernachtung mit Frühstück,it,Mobile (320 x 511 px),herr,Italy,Yes
Sara,Baroni,sarabaronima@gmail.com,3455876868,09.08.2025,16.08.2025,2,1,9,,Übernachtung,it,Mobile (360 x 660 px),frau,Italy,Yes
Roberto,Marchesoli,robe.marche@gmail.com,334 343 4357,03.08.2025,10.08.2025,3,0,,,Übernachtung,it,Mobile (392 x 740 px),herr,Italy,Yes
Daniela,Mercante,danielamercante@gmail.com,328 133 6726,11.08.2025,18.08.2025,4,4,"7,7,11,14","Peonia,Lavendula",Übernachtung mit Frühstück,it,Mobile (384 x 704 px),frau,Italy,Yes
Daniela,Mercante,danielamercante@gmail.com,328 133 6726,11.08.2025,18.08.2025,4,4,"7,7,11,14",Lavendula,Übernachtung mit Frühstück,it,Mobile (384 x 704 px),frau,Italy,Yes
Domenico,De Santis,2d.desantis@gmail.com,3316655319,10.08.2025,16.08.2025,7,0,,"Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (360 x 553 px),herr,--,Yes
Francesco,Scaccia,sca.france@hotmail.it,,26.07.2025,02.08.2025,2,2,"0,4","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (376 x 701 px),herr,Italy,Yes
Paola,Zanesi,Paola.zanesi81@gmail.com,,17.08.2025,21.08.2025,5,2,"6,10","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (393 x 673 px),frau,Italy,Yes
Elena,Martini,Martjn76@gmail.com,+393476436905,10.08.2025,15.08.2025,2,1,8,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 653 px),frau,Italy,Yes
Martina,Marchetti,martina_marchetti@hotmail.it,3492563144,25.08.2025,27.08.2025,2,1,1,"Lavendula,Fenice,Forsythia",Halbpension,it,Mobile (360 x 673 px),frau,Italy,Yes
Massimo,Lattanzi,xmax.lattanzi@libero.it,3929114256,08.09.2025,12.09.2025,3,0,,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (360 x 668 px),herr,Italy,Yes
Massimo,Lattanzi,xmax.lattanzi@libero.it,3929114256,08.09.2025,12.09.2025,3,0,,Lavendula,Halbpension,it,Mobile (360 x 571 px),herr,Italy,Yes
Iuliana,Soroceanu,irsoroceanu@gmail.com,,26.07.2025,28.07.2025,2,0,,Bellis,Halbpension,it,Mobile (411 x 800 px),frau,--,Yes
Chiara,Gandossi,gandossi.chiara@libero.it,3294415567,17.08.2025,23.08.2025,2,1,13,"Lavendula,Fenice",Halbpension,it,Mobile (411 x 771 px),frau,--,Yes
Chiara,Caglio,chiara.caglio@libero.it,,11.08.2025,15.08.2025,4,1,13,,Übernachtung mit Frühstück,it,Mobile (390 x 663 px),frau,--,Yes
Sara,Valbonesi,saravalbonesi@hotmail.it,,14.08.2025,17.08.2025,2,3,"8,9,11",,Übernachtung mit Frühstück,it,Mobile (360 x 673 px),frau,Italy,Yes
Roberta Santacecilia,Santacecilia,robertasantacecilia@gmail.com,+39348,04.08.2025,08.08.2025,2,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung mit Frühstück,it,Mobile (360 x 678 px),frau,--,Yes
Orietta,Sacchetto,Orietta.sacchetto@me.com,3393113587,18.07.2025,20.07.2025,2,1,12,,Halbpension,it,Mobile (414 x 718 px),frau,Italy,Yes
Giulia,Rocca,giuliarocca1970@gmail.com,3409226740,09.08.2025,16.08.2025,2,0,,"Peonia,Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (360 x 653 px),frau,--,Yes
Daniela,Mazzitelli,Mazzi84@inwind.it,3496436906,18.08.2025,25.08.2025,2,1,3,Lavendula,Halbpension,it,Mobile (384 x 671 px),frau,Italy,Yes
Paola,Bartocci,paolavoliamo@virgilio.it,3475736848,21.07.2025,28.07.2025,2,0,,,Halbpension,it,Mobile (360 x 647 px),frau,Italy,Yes
Simone,Croce,crocesimone@gmail.com,,15.08.2025,22.08.2025,2,2,"4,8","Peonia,Lavendula,Fenice,Forsythia",Übernachtung mit Frühstück,it,Mobile (392 x 739 px),--,--,Yes
Stefania,Pietrangeli,Stefania_pie@yahoo.it,+393497879667,16.08.2025,23.08.2025,2,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung mit Frühstück,it,Mobile (360 x 653 px),frau,Italy,Yes
valeria,magrino,valeire@hotmail.it,3935657931,13.09.2025,20.09.2025,2,2,"1,9",Lavendula,Halbpension,it,Desktop (1585 x 731 px),frau,Italy,Yes
Simone,Croce,crocesimone@gmail.com,,15.08.2025,22.08.2025,2,2,"4,8","Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (392 x 739 px),herr,--,Yes
Luca,Zottin,zottinluca04@gmail.com,3334234743,11.07.2025,13.07.2025,2,0,,"Loft,Lavendula,Forsythia",Übernachtung mit Frühstück,it,Mobile (390 x 663 px),herr,Italy,Yes
Gabriella,Saronni,sa.gabri@libero.it,3495866827,10.08.2025,17.08.2025,3,0,,"Peonia,Lavendula",Übernachtung,it,Mobile (414 x 699 px),frau,Italy,Yes
luca,zottin,zottinluca04@gmail.com,,11.07.2025,13.07.2025,2,0,,"Loft,Lavendula,Forsythia",Übernachtung mit Frühstück,it,Mobile (390 x 663 px),herr,Italy,Yes
Sara,Forti,forti.sara@libero.it,,09.08.2025,16.08.2025,2,1,6,Fenice,Übernachtung,it,Mobile (411 x 783 px),--,--,Yes
Jens,Winkelmann,skyline_84@web.de,,18.07.2026,28.07.2026,2,1,12,"Peonia,Lavendula,Fenice",Halbpension,de,Mobile (402 x 714 px),herr,Germany,Yes
Marco,Provenzi,Marcoprovenzi@alice.it,3383330586,07.06.2025,12.06.2025,3,1,1,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung,it,Desktop (1080 x 704 px),herr,Italy,Yes
Hazel,Mass,hazel.massone@gmail.com,3925981848,19.08.2025,23.08.2025,2,2,"11,13",Fenice,Übernachtung mit Frühstück,en,Mobile (384 x 656 px),frau,--,Yes
Stefania,Martella,stefimart9@gmail.com,3471161198,27.12.2025,03.01.2026,4,3,"10,14,14","Lavendula,Forsythia",Halbpension,it,Mobile (360 x 667 px),--,--,Yes
Andrea,Mazzer,andrea.mazzer88@gmail.com,349 539 4720,31.12.2025,04.01.2026,2,2,"6,8",,Halbpension,it,Mobile (390 x 663 px),herr,Italy,Yes
Liliana,Alexeeva,Liliana.alexeeva@gmail.com,39 3409972074,21.12.2025,26.12.2025,2,0,,Fenice,Übernachtung mit Frühstück,it,Mobile (411 x 721 px),frau,Italy,Yes
MASSIMO,MOCCI,maxmocci61@gmail.com,3295380005,01.08.2026,10.08.2026,2,0,,"Fenice,Forsythia",Übernachtung mit Frühstück,it,Desktop (1905 x 953 px),herr,Italy,Yes
Simona,Reina,simona.reina1985@gmail.com,3471345714,12.12.2025,13.12.2025,2,0,,Peonia,Halbpension,it,Mobile (360 x 668 px),frau,--,Yes
Tatiana,Ballarino,Tatianaballarino@hotmail.it,+393290126388,30.12.2025,04.01.2026,4,3,"0,2,3",,Halbpension,it,Mobile (390 x 570 px),frau,Italy,Yes
Elisa,Pini,elisapini1@gmail.com,,29.08.2025,31.08.2025,2,1,7,"Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (360 x 648 px),frau,--,Yes
Elisa,Canini,artelisa79@hotmail.com,3349207514,24.11.2025,30.11.2025,2,0,,Forsythia,Übernachtung mit Frühstück,it,Mobile (360 x 649 px),frau,San Marino,Yes
Lidia Ciuraru,Ciursru,lidiaanaciuraru@gmail.com,3207242313,24.12.2025,28.12.2025,4,4,"3,3,6,16","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 668 px),frau,Italy,Yes
Francesca,Calogiuri,Francescacalogiuri@hotmail.com,3401765276,08.08.2026,19.08.2026,2,2,"3,8","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (440 x 774 px),frau,Italy,Yes
Alice,Lazzeri,alicelazzeri@libero.it,3294643748,29.12.2025,05.01.2026,2,1,14,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (393 x 576 px),frau,--,Yes
Lorenzo,Fosca,Fosca2002@libero.it,+39 335 849 0091,16.08.2025,23.08.2025,2,0,,,Übernachtung mit Frühstück,it,Mobile (384 x 705 px),herr,--,Yes
Giovanni,Pilla,giopilla86@gmail.com,,21.08.2025,24.08.2025,2,0,,Bellis,Halbpension,it,Mobile (390 x 777 px),herr,--,Yes
luigi,nicolini,nicoliniluigi@hotmail.it,3466240846,06.09.2025,13.09.2025,2,0,,Forsythia,Übernachtung,it,Mobile (360 x 604 px),herr,Italy,Yes
Leonardo,RICCIARELLI,Leonardoricciarelli@gmail.com,3476218658,17.08.2025,20.08.2025,2,0,,Forsythia,Übernachtung,it,Mobile (360 x 678 px),herr,Italy,Yes
Leonardo,RICCIARELLI,Leonardoricciarelli@gmail.com,3476218658,17.08.2025,20.08.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 678 px),herr,Italy,Yes
Alessandro,Cocchi,allecocchi@hotmail.it,3492810231,08.09.2025,11.09.2025,2,2,"0,3","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (390 x 655 px),herr,Italy,Yes
Sara,De Cesco,Saradecesco1@gmail.com,,17.08.2025,24.08.2025,3,1,14,,Übernachtung,it,Mobile (390 x 655 px),--,--,Yes
Mirka,Baiardi,mirkabaiardi@yahoo.it,3469674768,20.07.2025,24.07.2025,2,1,17,,Übernachtung mit Frühstück,it,Mobile (360 x 664 px),frau,Italy,Yes
Cangini,Beatrice,bea.cangini@gmail.com,+393385850986,03.08.2025,10.08.2025,2,2,"11,17",Fenice,Halbpension,it,Mobile (360 x 616 px),frau,Italy,Yes
Susanna,Sozzi,sozzisusanna@gmail.com,349 210 0236,05.07.2025,12.07.2025,4,0,,Peonia,Halbpension,it,Mobile (384 x 729 px),frau,Italy,Yes
Italo,Ferrari,cilix028@gmail.com,3470853989,11.08.2025,18.08.2025,2,0,,"Loft,Forsythia,Bellis",Halbpension,it,Mobile (384 x 726 px),herr,Italy,Yes
Sara,Rottini,sara.rottini@hotmail.it,3332252085,21.08.2025,28.08.2025,2,1,1,"Forsythia,Bellis",Übernachtung,it,Mobile (360 x 663 px),frau,Italy,Yes
Massimo,Taroni,massimotaroni65@gmail.com,3791415848,04.07.2025,07.07.2025,2,0,,"Lavendula,Fenice,Forsythia",Halbpension,it,Mobile (432 x 816 px),herr,Italy,Yes
alessia,proietti,alessiapro77@gmail.com,391 485 3388,13.07.2025,20.07.2025,3,1,12,Fenice,Halbpension,it,Mobile (360 x 691 px),frau,Italy,Yes
Laura,Salvucci,laurasalvucci@hotmail.it,,24.08.2025,31.08.2025,2,2,"9,11","Loft,Lavendula,Fenice",Halbpension,it,Mobile (384 x 698 px),frau,Italy,Yes
Enrico,Cavallucci,ecavallucci@libero.it,,01.07.2025,06.07.2025,3,1,11,Fenice,Übernachtung,it,Mobile (411 x 765 px),herr,--,Yes
Magda,De vanna,Magdadevanna@libero.it,3494105942,16.08.2025,23.08.2025,2,1,2,Forsythia,Halbpension,it,Mobile (360 x 665 px),frau,--,Yes
Anita,Bevilacqua,bevilacquaanita@gmail.com,,16.08.2025,23.08.2025,2,1,2,"Peonia,Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (375 x 625 px),frau,--,Yes
Fabiola,Giffoni,F.giffonifabiola@gmail.com,3386570888,07.07.2025,14.07.2025,2,2,"2,9","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (440 x 759 px),frau,--,Yes
Marco,Provenzi,Marcoprovenzi@alice.it,3383330586,07.06.2025,12.06.2025,2,0,,"Lavendula,Fenice,Forsythia",Übernachtung,it,Desktop (1080 x 704 px),herr,Italy,Yes
Sabrina,Meli,sabriturris@gmail.com,+393282863597,11.08.2025,16.08.2025,2,1,10,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 731 px),frau,--,Yes
Alessandra Faliva,Faliva,Gian.ale@alice.it,3495019535,19.07.2025,26.07.2025,2,1,15,,Halbpension,it,Mobile (432 x 862 px),--,Italy,Yes
mirka,baiardi,mirkabaiardi@yahoo.it,3469674768,20.07.2025,24.07.2025,2,1,17,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Desktop (1513 x 786 px),frau,Italy,Yes
Elisabetta,Ravasi,Elisabetta.ravasi@sappi.com,IT +393455131145,30.08.2025,06.09.2025,2,0,,,Übernachtung mit Frühstück,it,Mobile (393 x 643 px),frau,Italy,Yes
Roberta,Bolognesi,robertabolognesi@icloud.com,,02.08.2025,09.08.2025,7,1,3,,Halbpension,it,Mobile (393 x 658 px),frau,--,Yes
Felice,Lustrissimi,felicelustri@tiscali.it,3282744961,19.07.2025,26.07.2025,2,1,15,,Übernachtung mit Frühstück,it,Mobile (414 x 703 px),herr,Italy,Yes
Elisa Franzini,Franzini,Elisa.franzi77@gmail.com,3406459744,14.08.2025,17.08.2025,2,3,"6,11,13",,Übernachtung mit Frühstück,it,Mobile (428 x 759 px),frau,Italy,Yes
Luca,Mambrini,daybyday2007@hotmail.it,,13.08.2025,20.08.2025,2,0,,Forsythia,Übernachtung,it,Mobile (440 x 760 px),herr,Italy,Yes
Elisa,Franzini,elisa.franzi77@gmail.com,3406459744,14.08.2025,17.08.2025,2,3,"6,11,13",,Übernachtung mit Frühstück,it,Mobile (428 x 744 px),frau,Italy,Yes
Flavia mercadante/ascani,Mercadante Ascani,Ascani.flavia@gmail.com,3383705561,11.08.2025,16.08.2025,2,0,,"Loft,Forsythia",Halbpension,it,Mobile (428 x 856 px),frau,--,Yes
Rosa,Galdieri,Rosa.1709@libero.it,3395471194,12.08.2025,14.08.2025,2,2,"3,4",Lavendula,Halbpension,it,Mobile (360 x 678 px),frau,Italy,Yes
Ester,caserio,estercaser@gmail.com,339 805 5859,17.08.2025,22.08.2025,2,3,"3,6,13",,Halbpension,it,Mobile (430 x 731 px),frau,Italy,Yes
Chiara,IANNIELLO,chiara.ianniello@gmail.com,3929402169,17.08.2025,24.08.2025,2,2,"8,10","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 603 px),frau,Italy,Yes
Chiara,Bernabucci,chiarabernabucci1@gmail.com,+393498482965,23.08.2025,27.08.2025,2,0,,Forsythia,Übernachtung,it,Mobile (393 x 658 px),frau,--,Yes
Luca,Manfredini,lucamanfredini89@libero.it,,17.08.2025,21.08.2025,2,0,,"Forsythia,Bellis",Halbpension,it,Mobile (384 x 721 px),herr,Italy,Yes
Gimmi,Longo,gimmilongo@gmail.com,392 299 9016,23.08.2025,29.08.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 667 px),herr,Italy,Yes
paola,floris,paulaflo@tiscali.it,3403309928,27.12.2025,03.01.2026,4,1,4,,Halbpension,it,Mobile (360 x 678 px),frau,Italy,Yes
Laura,Sacco,laurasacco9@gmail.com,3881783486,19.08.2025,26.08.2025,4,2,"0,2",Loft,Halbpension,it,Mobile (392 x 743 px),frau,Italy,Yes
Andrea,Crisafuli,andreacrisafuli46@hotmail.com,,21.06.2025,23.06.2025,2,2,"7,10",,Übernachtung mit Frühstück,it,Desktop (1265 x 639 px),herr,--,Yes
Roberta,Bolofnesi,robertabolognesi@icloud.com,,02.08.2025,09.08.2025,7,1,3,,Halbpension,it,Mobile (393 x 658 px),--,--,Yes
Andrea,Martino,andrea.martino89@hotmail.it,3201135544,20.08.2025,30.08.2025,2,1,1,,Halbpension,it,Mobile (360 x 668 px),herr,Italy,Yes
Luca,Modafferi,lmodafferi@libero.it,,28.07.2025,03.08.2025,2,1,0,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 650 px),herr,--,Yes
Cristina,Mandelli,Pulce73.cm@gmail.com,3922673165,08.08.2026,22.08.2026,2,1,16,Peonia,Übernachtung,it,Mobile (411 x 778 px),frau,Italy,Yes
Lucia,Visintin,Luciavisintin@libero.it,3394268406,12.09.2025,15.09.2025,2,0,,Forsythia,Halbpension,it,Mobile (384 x 725 px),frau,Italy,Yes
Davide,Gennari,Davide.gennari.64@gmail.com,3286482900,09.08.2026,16.08.2026,4,1,14,Lavendula,Übernachtung,it,Mobile (360 x 653 px),herr,Italy,Yes
Luca,Saracca,Lucas.1978@hotmail.it,3397191581,26.12.2025,29.12.2025,2,2,"1,7",Forsythia,Halbpension,it,Mobile (369 x 724 px),herr,Italy,Yes
Marta,Pettenò,Martap80@libero.it,,14.08.2025,17.08.2025,2,1,14,,Halbpension,it,Mobile (411 x 697 px),frau,--,Yes
Alessio,Ridolfi,ridocr74@gmail.com,3313758106,25.08.2025,30.08.2025,2,0,,"Lavendula,Fenice,Forsythia",Halbpension,it,Mobile (390 x 657 px),herr,Italy,Yes
Katy,Vitorbi,Katia.vitorbi79@gmail.com,3402264803,18.08.2025,23.08.2025,2,2,"5,8",Peonia,Halbpension,it,Mobile (320 x 531 px),frau,Italy,Yes
Alessandra,De luca,aledeluca8576@gmail.com,350 181 4305,17.08.2025,24.08.2025,2,3,"6,11,12",Fenice,Halbpension,it,Mobile (360 x 410 px),frau,Italy,Yes
Barbara,Tieri,btieri@gmail.com,3282121541,19.08.2025,21.08.2025,2,1,10,,Halbpension,it,Mobile (393 x 673 px),frau,Italy,Yes
Barbara,Tieri,btieri@gmail.com,3282121541,19.08.2025,21.08.2025,2,1,10,,Halbpension,it,Mobile (393 x 673 px),frau,Italy,Yes
eugen sandor,sandor,lianapaulasandor@yahoo.it,3405481688,15.08.2025,17.08.2025,2,1,12,Fenice,Halbpension,it,Mobile (390 x 580 px),herr,Italy,Yes
Salvatore,Tulumello,tulumellosalvatore@virgilio.it,3383260038,16.08.2025,20.08.2025,2,0,,Bellis,Halbpension,it,Mobile (392 x 739 px),herr,Italy,Yes
Laura,Levati,lauraaragon0@gmail.com,,18.08.2025,25.08.2025,4,2,"2,4",,Halbpension,it,Mobile (414 x 533 px),frau,--,Yes
Mauro,Cerasti,antares.wlz@gmail.com,3474014445,23.08.2025,30.08.2025,2,2,"12,14",,Halbpension,it,Mobile (411 x 763 px),herr,--,Yes
Salvatore,Spagnolo,spagnosalva13@gmail.com,3283040182,18.08.2025,22.08.2025,2,0,,,Übernachtung,it,Mobile (384 x 697 px),herr,Italy,Yes
Enrico Maria,Sala,Enricomaria.sala@gmail.com,3496283936,17.08.2025,23.08.2025,2,1,10,,Halbpension,it,Mobile (360 x 616 px),herr,--,Yes
Matteo,Pierleoni,Matteo.pierleoni@gmail.com,,29.08.2025,31.08.2025,2,1,1,"Peonia,Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (402 x 677 px),herr,Italy,Yes
Martina Imberti,Imberti,Imberti.martina@gmail.com,3453398717,09.08.2026,16.08.2026,4,2,"1,4",,Übernachtung,it,Mobile (393 x 658 px),--,--,Yes
Davis,Fabbi,Da.da2003@yahoo.it,3483637094,29.08.2025,31.08.2025,2,1,7,Peonia,Halbpension,it,Mobile (384 x 726 px),herr,--,Yes
Vincenzo,Melissari,vincenzo.melissari@hotmail.it,,20.08.2025,27.08.2025,2,1,1,,Halbpension,it,Mobile (360 x 724 px),herr,--,Yes
Turso Turso,Stefi,Stefiturso7@gmail.com,,30.08.2025,05.09.2025,3,1,2,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 759 px),frau,--,Yes
Gimmi,Longo,gimmilongo@gmail.com,392 299 9016,23.08.2025,29.08.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 667 px),herr,Italy,Yes
Andrea,Carbognani,Andreacarbognani1072@gmail.com,3391775255,18.08.2025,20.08.2025,2,2,"10,14",Peonia,Halbpension,it,Mobile (390 x 677 px),herr,Italy,Yes
Nicola,Valbusa,valbusanicola@gmail.com,3483592114,16.08.2025,22.08.2025,2,2,"8,12",,Übernachtung,it,Mobile (390 x 663 px),herr,Italy,Yes
johnny,carnevale,dittacarnevale@gmail.com,3337900230,27.08.2025,01.09.2025,2,1,12,,Halbpension,it,Desktop (1351 x 607 px),herr,Italy,Yes
Karin,Becker,beckerkarin@hotmail.de,,05.07.2025,08.07.2025,2,0,,,Übernachtung,de,Mobile (390 x 652 px),frau,Germany,Yes
Martina,Maffessanti,martimaffe@hotmail.com,3393460946,30.12.2025,03.01.2026,2,1,0,,Übernachtung,it,Mobile (411 x 796 px),frau,Italy,Yes
Sara Zerbinati,Zerbinati,Sarazerbinati89@gmail.com,3334911170,14.02.2026,18.02.2026,2,2,"4,7",Lavendula,Übernachtung,it,Mobile (390 x 662 px),frau,Italy,Yes
Anna,Filippitsch,anna.filippitsch@gmail.com,,15.10.2025,17.10.2025,2,0,,Lavendula,Übernachtung,de,Mobile (402 x 678 px),--,--,Yes
Chiara,Di Emidio,chiara.diemidio88@gmail.com,3280393016,25.07.2025,29.07.2025,2,2,"4,5",Peonia,Halbpension,it,Mobile (384 x 707 px),frau,--,Yes
Fee,Kandel,fee.kandel@gmx.at,,10.10.2025,12.10.2025,2,0,,,Übernachtung mit Frühstück,de,Mobile (402 x 678 px),frau,Austria,Yes
Lisa,Mann,Lisa.beth.mann@gmail.com,6033403983,04.08.2025,07.08.2025,4,2,"6,8","Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung mit Frühstück,en,Mobile (430 x 739 px),frau,United States of America,Yes
Edoardo,Domenichini,domenichiniedoardo@gmail.com,3348077427,31.12.2025,04.01.2026,6,3,"4,4,4",Bellis,Halbpension,it,Mobile (406 x 774 px),herr,Italy,Yes
Giuseppe,Visicale,Giuseppevisicale151@gmail.com,339 215 9919,23.12.2025,26.12.2025,2,1,6,Bellis,Halbpension,it,Mobile (360 x 663 px),herr,Italy,Yes
Maddalena,Cerroni,madda.84@icloud.com,0863995248,14.06.2026,21.06.2026,4,5,"2,2,5,5,10","Peonia,Lavendula",Halbpension,it,Mobile (393 x 673 px),frau,Italy,Yes
Serena,Benetti,serena.benetti@gmail.com,,27.12.2025,03.01.2026,2,1,5,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (411 x 785 px),frau,--,Yes
Bruno,Berselli,bruno.berselli77@gmail.com,,11.12.2025,14.12.2025,2,1,1,,Halbpension,it,Desktop (1440 x 837 px),herr,--,Yes
Andrea,Cibin,a.cibin@yahoo.com,3479170150,22.02.2026,26.02.2026,2,2,"2,5","Peonia,Fenice",Übernachtung mit Frühstück,it,Mobile (393 x 663 px),herr,Italy,Yes
Hans-Georg,Döring,hg.doering@t-online.de,016098927216,27.07.2025,02.08.2025,2,0,,"Loft,Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,de,undefined,herr,Germany,Yes
Elena,Batoni,elebat72@gmail.com,3473794160,18.08.2025,22.08.2025,2,0,,"Loft,Forsythia",Übernachtung,it,Mobile (392 x 715 px),frau,Italy,Yes
Giacomo,Spelta,Giacomospelta@libero.it,3355321619,13.07.2025,20.07.2025,2,2,"9,12",Fenice,Halbpension,it,Mobile (384 x 725 px),herr,Italy,Yes
Laura,Andrelli,leogala78@gmail.com,3665273432,20.07.2025,26.07.2025,2,2,"8,14","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (375 x 740 px),frau,--,Yes
Gianluca,Mazza,Gia.ma73@libero.it,+39 328 081 7271,09.08.2025,16.08.2025,2,2,"13,16",,Halbpension,it,Mobile (390 x 769 px),herr,Italy,Yes
Raffaele,Buscemi,Rafbuscemi@gmail.com,,28.07.2025,10.08.2025,2,2,"2,3","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (390 x 655 px),herr,Italy,Yes
Gianfranco,La torre,gianfrancolatorre41@gmail.com,348 566 3035,04.08.2025,10.08.2025,2,0,,Forsythia,Halbpension,it,Mobile (360 x 667 px),herr,Italy,Yes
Marisa,Galli,marisapatrizia.galli@gmail.com,3427717487,19.09.2025,26.09.2025,2,0,,Peonia,Übernachtung,it,Mobile (392 x 743 px),frau,--,Yes
Mauro,Sapia,rosamau.ice@gmail.com,3389233180,29.07.2025,07.08.2025,2,0,,,Übernachtung,it,Mobile (390 x 558 px),herr,Italy,Yes
Patrizia Barbiani,Barbiani,pbarbiani@gmail.com,3457660305,18.08.2025,24.08.2025,2,0,,,Halbpension,it,Mobile (375 x 740 px),frau,Italy,Yes
Silvia,Kostopoulos,Kostsilvia92@gmail.com,,03.08.2025,08.08.2025,2,1,2,"Loft,Peonia,Lavendula,Fenice,Forsythia",Übernachtung mit Frühstück,it,Mobile (375 x 620 px),frau,Italy,Yes
Elisabetta,Buldini,elisabettabuldini@yahoo.it,3891128500,17.08.2025,23.08.2025,5,0,,"Peonia,Bellis",Halbpension,it,Mobile (360 x 668 px),frau,Italy,Yes
Gianluca,Bronzetti,isabella.migliarini@gmail.com,3402262447,01.01.2026,05.01.2026,2,3,"9,9,13",,Halbpension,it,Mobile (384 x 733 px),--,--,Yes
Alessandro,Zara,alessandrozara@yahoo.it,347 324 8352,31.07.2025,03.08.2025,2,2,"15,16",Fenice,Übernachtung,it,Mobile (411 x 789 px),herr,Italy,Yes
Tiziana Perini,Perini,Tiziana.perini@libero.it,3334929271,09.08.2025,13.08.2025,2,2,"10,16",Fenice,Halbpension,it,Mobile (411 x 698 px),frau,--,Yes
Viviana,Magoga,vivianamagoga@libero.it,333 583 1182,23.07.2025,25.07.2025,2,0,,Bellis,Halbpension,it,Mobile (384 x 721 px),frau,Italy,Yes
Milena,Miccio,kigio@hotmail.com,,05.08.2025,14.08.2025,2,0,,Bellis,Halbpension,it,Mobile (384 x 717 px),frau,Italy,Yes
Federico,Giovanardi,kimon32@gmail.com,3473455279,07.08.2025,17.08.2025,2,2,"12,14",,Übernachtung,it,Mobile (360 x 560 px),herr,Italy,Yes
Alessia,Pavani,morinieleo@gmail.com,33160399388,16.08.2025,23.08.2025,2,2,"10,12",,Halbpension,it,Mobile (402 x 784 px),frau,Italy,Yes
Elisa Mercati,Mercati,Elisa27francesco@gmail.com,3898488735,24.08.2025,31.08.2025,2,2,"4,11",,Halbpension,it,Mobile (390 x 655 px),frau,Italy,Yes
Emanuele,Caronia,e.caronia@libero.it,3385058141,09.08.2025,23.08.2025,2,0,,,Übernachtung,it,Mobile (433 x 830 px),herr,Italy,Yes
Gianpaolo,Ceruti,Gippao27@gmail.com,,31.08.2025,05.09.2025,2,2,"3,3",Fenice,Halbpension,it,Mobile (392 x 739 px),herr,--,Yes
Ulisse,Magrini,Daniela.pianelli68@gmail.com,+39 333 333 333,22.07.2025,29.07.2025,2,1,9,Peonia,Halbpension,it,Mobile (360 x 494 px),herr,Italy,Yes
Gaetano,Proscia,kyra1411@gmail.com,,13.07.2025,19.07.2025,2,2,"7,12","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (411 x 794 px),herr,--,Yes
Benedetta,ronci,benedetta.ronci@hotmail.it,3284919316,26.07.2025,02.08.2025,2,2,"8,13","Forsythia,Bellis",Halbpension,it,Mobile (390 x 662 px),frau,Italy,Yes
gianluca mazza,Mazza,Gia.ma73@libero.it,+39 328 081 7271,09.08.2025,16.08.2025,2,2,"13,16",Lavendula,Halbpension,it,Mobile (390 x 655 px),herr,Italy,Yes
Desiree,Nannarelli,d.nannarelli@gmail.com,327 734 8572,20.07.2025,27.07.2025,2,1,16,,Übernachtung,it,Mobile (360 x 668 px),frau,Italy,Yes
gianluca mazza,Mazza,Gia.ma73@libero.it,+39 328 081 7271,09.08.2025,16.08.2025,2,2,"13,16",Peonia,Halbpension,it,Mobile (390 x 655 px),herr,Italy,Yes
Arberi,Beltoja,arberial@yahoo.it,+39329724158,01.01.2026,05.01.2026,2,2,"8,12","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (440 x 701 px),frau,Italy,Yes
Carlo,Bragante,bragantecarlo@gmail.com,338 956 9195,07.09.2025,11.09.2025,2,0,,Bellis,Halbpension,it,Mobile (384 x 705 px),herr,Italy,Yes
Mariangela,Caprini,caprinimariangela@gmail.com,3391263971,26.09.2025,29.09.2025,2,0,,Bellis,Halbpension,it,Mobile (392 x 642 px),frau,Italy,Yes
ILARIA,ALGHISI,ILARIA.ALGHISI@LIVE.IT,,26.12.2025,02.01.2026,2,2,"8,12","Peonia,Lavendula,Fenice",Halbpension,it,Desktop (2545 x 1271 px),frau,--,Yes
Vittoria,Carolo,Vittoria9185@libero.it,+393280836615,22.08.2025,24.08.2025,2,2,"2,2",Peonia,Halbpension,it,Mobile (338 x 604 px),herr,Italy,Yes
Deborah,Limaschi,Limaschideborah@gmail.com,+393487490408,24.08.2025,31.08.2025,2,1,1,"Loft,Peonia,Forsythia,Bellis",Halbpension,it,Mobile (428 x 745 px),frau,Italy,Yes
Francis,Abag,angelicoabag1984@gmail.com,+393289479442,20.08.2025,23.08.2025,4,2,"2,4","Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (411 x 790 px),herr,--,Yes
Stefania,Rullini,Stefania.rullini@gmail.com,3487809455,09.08.2025,13.08.2025,1,0,,Bellis,Halbpension,it,Mobile (411 x 759 px),frau,Italy,Yes
Maurizio,BORELLA,maurizioborella@gmail.com,+328 314 0148,25.08.2025,30.08.2025,3,1,1,Peonia,Halbpension,it,Mobile (384 x 703 px),herr,Italy,Yes
Simona,Crespolini,simonacrespolini@alice.it,+393335886823,17.08.2025,24.08.2025,2,0,,Forsythia,Übernachtung mit Frühstück,it,Mobile (384 x 708 px),frau,Italy,Yes
Donata,Brisotto,donata.brisotto@gmail.com,3453991011,26.12.2025,02.01.2026,2,1,12,"Peonia,Lavendula",Übernachtung mit Frühstück,it,Mobile (430 x 731 px),frau,Italy,Yes
Turso,Stefi,Stefiturso7@gmail.com,,25.08.2025,01.09.2025,3,1,2,,Übernachtung mit Frühstück,it,Mobile (384 x 759 px),frau,Italy,Yes
Simona,Burlacu,simona_antoni5042@yahoo.it,3481838149,03.01.2026,06.01.2026,2,1,15,Fenice,Übernachtung mit Frühstück,it,Mobile (320 x 599 px),frau,Italy,Yes
Elena,Stirparo,fabriziocurcio1981@gmail.com,+393295620241,30.12.2025,03.01.2026,2,3,"3,13,16",Peonia,Halbpension,it,Mobile (360 x 720 px),frau,Italy,Yes
Irene,Salari,Irenesalari@yahoo.it,,21.11.2025,23.11.2025,3,2,"1,8",Fenice,Übernachtung,it,Mobile (390 x 662 px),frau,Italy,Yes
Mirko,Zoa,Zoa339@gmail.com,3453329509,09.02.2026,15.02.2026,2,2,"0,3",Fenice,Halbpension,it,Mobile (360 x 686 px),herr,Italy,Yes
Emanuela,Filini,manufilini@gmail.com,,30.12.2025,01.01.2026,2,2,"6,9",,Halbpension,it,Mobile (390 x 777 px),--,--,Yes
Daniela,Mazzitelli,mazzi84@inwind.it,,18.08.2025,25.08.2025,2,1,3,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 725 px),frau,--,Yes
Roberta,Salvatore,roberta.salvatore@gmail.com,,03.08.2025,12.08.2025,2,1,11,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (390 x 662 px),frau,Italy,Yes
Andrea,Lanzilotto,andrea.lanzilotto@libero.it,,04.08.2025,11.08.2025,2,2,"3,9",,Halbpension,it,Mobile (360 x 694 px),herr,--,Yes
Lara,Fochesato,Lara.fochesato@live.it,+39 348 993 410 1___,11.08.2025,16.08.2025,2,0,,"Loft,Forsythia",Übernachtung,it,Mobile (320 x 518 px),frau,Italy,Yes
Fabrizio,Turcato,Fabrizio_turcato@yahoo.com,00393487823030,14.08.2025,17.08.2025,2,2,"6,13",,Übernachtung mit Frühstück,it,Mobile (360 x 655 px),herr,--,Yes
Simone,Denaro,zerosimone1@inwind.it,3475487509,24.08.2025,31.08.2025,2,2,"12,15","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 672 px),herr,Italy,Yes
Andrea,Gonnella,leogala75@gmail.com,,22.07.2025,26.07.2025,2,2,"8,14",Bellis,Halbpension,it,Mobile (390 x 655 px),herr,--,Yes
PAOLA,SIGNORI,Paola8.b@virgilio.it,340 484 1451,08.08.2025,17.08.2025,4,0,,Peonia,Übernachtung,it,Mobile (393 x 651 px),frau,Italy,Yes
francesca.masserelli@virgilio.it,Masserelli,Francesca.masserelli@virgilio.it,,09.08.2025,19.08.2025,3,0,,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 702 px),frau,Italy,Yes
Veronica,Urbinati,veronica.urbinati@gmail.com,3397381960,18.08.2025,21.08.2025,2,2,"4,7","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 752 px),frau,Italy,Yes
Leonardo,INTINI,intinileo@gmail.com,3401618984,09.08.2025,20.08.2025,4,0,,,Übernachtung,it,Mobile (430 x 738 px),herr,Italy,Yes
Katia,Bonaldo,katiabonaldo@gmail.com,348 984 3627,11.08.2025,18.08.2025,3,1,12,,Übernachtung mit Frühstück,it,Mobile (390 x 655 px),frau,--,Yes
Katia,Corbara,corbara.katia@gmail.com,3403221080,09.08.2025,13.08.2025,2,2,"3,7",Peonia,Halbpension,it,Mobile (360 x 694 px),frau,Italy,Yes
Francesco,Vecchiola,f.vecchiola@gmail.com,3316712985,04.08.2025,09.08.2025,2,1,1,Bellis,Halbpension,it,Mobile (393 x 651 px),herr,Italy,Yes
Patrizia Santirocchi,Santirocchi,mauro_1711@yahoo.it,3281238285,09.08.2025,15.08.2025,3,0,,Peonia,Übernachtung,it,Mobile (390 x 655 px),frau,Italy,Yes
Vitalba,Mezzocapo,ricevavit@gmail.com,3355638559,02.08.2025,12.08.2025,3,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (390 x 769 px),frau,--,Yes
Susi,Bergamini,susibergamini@gmail.com,347 103 4812,10.08.2025,17.08.2025,2,0,,,Halbpension,it,Desktop (800 x 1209 px),herr,--,Yes
Sara,Cavallaro,sarajuve1981@gmail.com,3395838265,28.06.2025,05.07.2025,2,0,,Loft,Halbpension,it,Mobile (360 x 663 px),frau,Italy,Yes
Gian piero,Moretti,Gianpiero.moretti@hotmail.it,3288172990,12.07.2025,19.07.2025,1,0,,Bellis,Übernachtung,it,Mobile (360 x 647 px),herr,Italy,Yes
Elena Martini,Martini,Martjn76@gmail.com,347 643 6905,10.08.2025,15.08.2025,2,1,8,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 657 px),frau,Italy,Yes
Sara,Sanzi,Sarasanzi035@gmail.com,,20.08.2025,24.08.2025,2,0,,Forsythia,Halbpension,it,Mobile (411 x 678 px),frau,Italy,Yes
Barbara,Murgia,barbara1aprile@gmail.com,3925519714,14.08.2025,18.08.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (392 x 739 px),frau,--,Yes
Antonella,Marazia,marazia.antonella@gmail.com,,01.08.2025,07.08.2025,3,0,,Fenice,Übernachtung,it,Mobile (392 x 760 px),frau,--,Yes
Simona Ferrigno,Ferrigno,Simo84f@libero.it,3498901318,18.08.2025,24.08.2025,2,1,14,Lavendula,Halbpension,it,Mobile (384 x 704 px),frau,Italy,Yes
Gennaro,Piscopo,Gennaro.rosa98@hotmail.it,3490597097,28.12.2025,01.01.2026,2,0,,Loft,Halbpension,it,Mobile (360 x 638 px),herr,Italy,Yes
marina,pellanda,marinapel1980@gmail.com,3466414764,13.08.2025,17.08.2025,2,1,2,,Halbpension,it,Mobile (392 x 743 px),frau,--,Yes
Laura,Tomasi,arualtom@libero.it,3471473826,18.08.2025,21.08.2025,2,1,8,"Fenice,Forsythia",Halbpension,it,Mobile (390 x 662 px),frau,Italy,Yes
Mandis,Mariana,m.mandis@yahoo.com,+393281137505,14.08.2025,17.08.2025,3,3,"2,8,9",,Übernachtung mit Frühstück,it,Mobile (390 x 580 px),frau,Italy,Yes
Elisa,Malini,Elisa.malini@gmail.com,3806547696,16.08.2025,21.08.2025,2,2,"12,17",Lavendula,Halbpension,it,Mobile (411 x 760 px),frau,Italy,Yes
Matteo,Sais,M.sais@libero.it,,11.08.2025,16.08.2025,3,0,,,Halbpension,it,Mobile (411 x 717 px),herr,--,Yes
Cinzia,Vignatelli,cinziavigna.cv@gmail.com,3478745685,06.09.2025,09.09.2025,2,1,16,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,undefined,frau,Italy,Yes
Sara,Rottini,sara.rottini@hotmail.it,3332252085,19.08.2025,23.08.2025,2,1,1,"Lavendula,Fenice,Forsythia",Halbpension,it,Mobile (360 x 671 px),frau,Italy,Yes
Luana,Cascelli,Luana_0715@msn.com,3404056650,11.08.2025,17.08.2025,2,2,"6,10",,Übernachtung,it,Mobile (390 x 655 px),frau,--,Yes
Maria Cristina,Leonardi,mcristina.leonardi@libero.it,3477905824,08.08.2025,18.08.2025,2,1,16,,Übernachtung mit Frühstück,it,Mobile (411 x 780 px),frau,Italy,Yes
Walter,Bartoli,walterbartoli@gmail.com,3406562623,09.07.2026,14.07.2026,2,2,"8,12",Lavendula,Halbpension,it,Mobile (384 x 701 px),herr,Italy,Yes
Anna,Bortolan,Spanna0000@gmail.com,3775297172,28.12.2025,02.01.2026,5,0,,,Übernachtung,it,Mobile (390 x 662 px),frau,--,Yes
Arianna,Natale,arianna.natale92@gmail.com,+393932550830,06.12.2025,08.12.2025,4,4,"1,1,8,8","Peonia,Lavendula",Übernachtung mit Frühstück,it,Mobile (393 x 673 px),frau,Italy,Yes
Stademann,Natalie,n.stademann@gmail.com,0049 176 95552518,03.10.2025,10.10.2025,2,0,,Fenice,Halbpension,de,Desktop (1905 x 967 px),frau,Germany,Yes
Paola,Cerrone,p_cerrone@hotmail.it,3347850429,27.12.2025,03.01.2026,9,6,"6,7,7,10,11,12","Peonia,Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (338 x 606 px),frau,Italy,Yes
Maria rosaria Bonofiglio,BONOFIGLIO,Maria.4277@yahoo.com,3477564244,27.09.2025,03.10.2025,2,2,"5,8",,Halbpension,it,Mobile (375 x 632 px),frau,Italy,Yes
Maurizio Perugini,Perugini,perugini.maurizio@gmail.com,3334424116,27.12.2025,03.01.2026,6,6,"10,14,14,16,16,16",,Halbpension,it,Mobile (393 x 659 px),herr,Italy,Yes
Alessia Rondelli,Rondelli,rondelli.alessia@gmail.com,3494218534,05.12.2025,07.12.2025,2,2,"5,11",Fenice,Halbpension,it,Mobile (393 x 586 px),frau,Italy,Yes
Alessio,Castillenti,alessio.castillenti@gmail.com,+393396739858,26.12.2025,30.12.2025,4,0,,Lavendula,Übernachtung mit Frühstück,it,Mobile (375 x 748 px),herr,Italy,Yes
Debby,Schiavon,deborahschiavon82@gmail.com,3382915851,03.01.2026,06.01.2026,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 752 px),--,Italy,Yes
Annalisa,AMADIO,Annalisa76.amadio@gmail.com,,01.01.2026,04.01.2026,3,1,14,Fenice,Übernachtung,it,Mobile (411 x 784 px),frau,Italy,Yes
Arnaldo Pietro,De Brito,arnaldopietrodebrito@libero.it,3408629862,27.07.2025,03.08.2025,2,1,10,Fenice,Halbpension,it,Mobile (392 x 739 px),herr,Italy,Yes
Raffaele,Rondoni,Raffaelerondoni@gmail.com,3316005133,10.08.2025,17.08.2025,3,1,15,"Peonia,Lavendula,Fenice,Bellis",Halbpension,it,Mobile (411 x 769 px),herr,--,Yes
Chiara,Brocani,brocanichiara@gmail.com,3284504689,16.07.2025,20.07.2025,2,1,2,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (384 x 657 px),frau,Italy,Yes
Loretta,Alfei,loretta.alfei@gmail.com,3397668603,20.08.2025,29.08.2025,2,0,,Lavendula,Übernachtung,it,Mobile (360 x 674 px),frau,Italy,Yes
Vittoriano,Gimmarrusti,gvittoriano@yahoo.com,3928287585,19.07.2025,25.07.2025,2,2,"9,15",Lavendula,Halbpension,it,Mobile (360 x 664 px),herr,Italy,Yes
fabio,Martino,fabiomartino71@gmail.com,3343903454,09.08.2025,16.08.2025,3,1,14,"Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (432 x 820 px),herr,Italy,Yes
Michela,Pincin,michela.pincin@gmail.com,3404058587,14.08.2025,18.08.2025,2,0,,Bellis,Halbpension,it,Mobile (360 x 665 px),frau,Italy,Yes
Maria Rita,Barbone,barbonemariarita@gmail.com,3209066437,18.08.2025,23.08.2025,2,1,11,Lavendula,Halbpension,it,Mobile (392 x 660 px),frau,--,Yes
Antonio,Giappichini,Giappichini.antonio@gmail.com,3491796586,21.08.2025,24.08.2025,2,2,"5,9","Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (384 x 702 px),herr,Italy,Yes
Margherita,Cameli,gherimi@gmail.com,3396855735,04.01.2026,06.01.2026,2,1,6,Bellis,Übernachtung mit Frühstück,it,Mobile (360 x 667 px),frau,Italy,Yes
Barbara,Gherri,Barbara.gherri@gmail.com,,11.08.2025,18.08.2025,2,2,"6,9","Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (390 x 662 px),frau,Italy,Yes
Alessia,Maggi,alemaggi18@gmail.com,3451579932,19.08.2025,22.08.2025,2,1,17,,Halbpension,it,Mobile (360 x 656 px),frau,Italy,Yes
Riccardo,Mazzola,mazzori@petalmail.com,3479444899,20.08.2025,27.08.2025,3,0,,Fenice,Übernachtung,it,Mobile (360 x 569 px),herr,Italy,Yes
Gian Luca,Cirimbelli,Gianluca.cirimbelli@gmail.com,3490892519,18.08.2025,22.08.2025,2,1,7,Bellis,Halbpension,it,Mobile (390 x 662 px),herr,Italy,Yes
raffaele silipo,Silipo,avvsilipo.raffaele@gmail.com,3711714863,08.08.2025,18.08.2025,4,0,,"Peonia,Fenice",Übernachtung,it,Mobile (320 x 569 px),herr,Italy,Yes
Maryna,Kulchak,marenochka3@gmail.com,3715622400,15.08.2025,17.08.2025,3,2,"6,12",,Übernachtung,it,Mobile (392 x 736 px),frau,Italy,Yes
Livia,Villani,livi.villani@tiscali.it,,09.08.2025,13.08.2025,2,2,"4,9","Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (393 x 673 px),frau,--,Yes
Robero,Stoissich,Stoissich@alice.it,3664226761,11.08.2025,15.08.2025,4,0,,Lavendula,Halbpension,it,Mobile (430 x 723 px),herr,Italy,Yes
caterina,Holmberg,Cathyholmberg@hotmail.com,3472447554,29.08.2025,31.08.2025,4,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (390 x 777 px),frau,Italy,Yes
Barbara,Fortunato,barbarafortunato8@gmail.com,+393332442130,27.08.2025,31.08.2025,4,0,,,Übernachtung,it,Mobile (390 x 677 px),frau,Italy,Yes
Luciano,Caldana,caldanaluciano24@gmail.com,3898159881,18.08.2025,23.08.2025,2,0,,"Forsythia,Bellis",Übernachtung mit Frühstück,it,Mobile (369 x 724 px),herr,Italy,Yes
Laura,Cosentino,Lpsanvittorio@gmail.com,389 872 6900,31.08.2025,05.09.2025,2,2,"9,12",,Halbpension,it,Mobile (430 x 731 px),frau,Italy,Yes
Davide,Baglioni,davidesan1978@gmail.com,3335075425,17.08.2025,20.08.2025,2,2,"11,17",,Übernachtung mit Frühstück,it,Mobile (411 x 776 px),herr,Italy,Yes
Stefania,Ballerano,Stefania.ballerano@gmail.com,,24.08.2025,31.08.2025,2,1,17,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (411 x 784 px),frau,--,Yes
Fabrizio,Passalacqua,passalacquafabrizio71@gmail.com,336711379,23.08.2025,30.08.2025,4,0,,Fenice,Halbpension,it,Mobile (366 x 687 px),--,Italy,Yes
Cinzia,Mandreoli,domegeg@gmail.com,340 392 5856,16.08.2025,20.08.2025,2,2,"5,10",Peonia,Übernachtung mit Frühstück,it,Mobile (339 x 620 px),herr,--,Yes
Domenico,De Santis,2d.desantis@gmail.com,3316655319,09.08.2025,14.08.2025,2,0,,Bellis,Übernachtung,it,Mobile (360 x 635 px),herr,--,Yes
Monica,Gemma,gemmamonica19@gmail.com,3383399114,28.08.2025,31.08.2025,2,1,15,,Übernachtung,it,Mobile (392 x 724 px),frau,Italy,Yes
Di Lembo,Lina,linadilembo@gmail.com,3205742436,17.08.2025,23.08.2025,2,1,1,"Loft,Forsythia",Halbpension,it,Mobile (360 x 664 px),frau,Italy,Yes
Simona,Taglieri,simona.taglieri@gmail.com,3476933052,05.08.2025,09.08.2025,2,0,,Peonia,Übernachtung,it,Mobile (360 x 672 px),frau,Italy,Yes
Marica,Posa,posamarica@gmail.com,3293716913,30.07.2025,04.08.2025,2,2,"9,12",,Halbpension,it,Mobile (360 x 586 px),frau,--,Yes
Clara,Bernardelli,clara.bernardelli@gmail.com,,31.12.2025,03.01.2026,6,5,"2,2,5,6,8",,Übernachtung,it,Mobile (392 x 743 px),--,Italy,Yes
Monica,Rondelli,mrondelli@hotmail.it,3923454149,02.04.2026,05.04.2026,3,0,,,Halbpension,it,Mobile (428 x 739 px),frau,--,Yes
Davide,Bonello,davide_bonello@libero.it,+393294139937,17.01.2026,24.01.2026,2,1,3,Peonia,Übernachtung,it,Mobile (360 x 667 px),herr,Italy,Yes
Giuditta,Generoso,giuditta84@hotmail.it,340 978 7451,02.03.2026,09.03.2026,2,2,"3,5",Lavendula,Halbpension,it,Mobile (406 x 774 px),frau,--,Yes
Natascia,Cantoni,natascia.cantoni@gmail.com,3393850628,28.12.2025,01.01.2026,2,0,,"Lavendula,Forsythia",Übernachtung mit Frühstück,it,Mobile (360 x 655 px),frau,Italy,Yes
Claudio,Butti,Claudio_1971mi@yahoo.it,3470578207,31.12.2025,05.01.2026,2,0,,"Loft,Lavendula,Forsythia,Bellis",Halbpension,it,undefined,herr,Italy,Yes
Nicola,Maradei,nicolamaradei@libero.it,3392128745,19.12.2025,23.12.2025,1,2,"11,14",,Halbpension,it,Mobile (384 x 700 px),herr,Italy,Yes
Romina,Di Maio,rominadimaio@mail.com,3396834910,30.12.2025,03.01.2026,4,0,,Fenice,Übernachtung mit Frühstück,it,Mobile (375 x 739 px),frau,Italy,Yes
Letizia,Berardi,berardi.letizia@gmail.com,,27.12.2025,03.01.2026,2,0,,,Halbpension,it,Mobile (384 x 604 px),frau,--,Yes
Chiara,Petix,Chiarapetix82@gmail.com,3270546824,31.12.2025,05.01.2026,2,1,6,,Übernachtung mit Frühstück,it,Mobile (375 x 627 px),frau,--,Yes
Rosetta,Merenda,tempiovenere@email.it,3202244008,15.08.2026,29.08.2026,3,0,,Lavendula,Halbpension,it,Mobile (430 x 850 px),frau,--,Yes
Simone,Passaro,s.passaro93@gmail.com,,03.10.2025,05.10.2025,2,0,,"Loft,Forsythia,Bellis",Übernachtung mit Frühstück,it,Desktop (1114 x 670 px),herr,Italy,Yes
Valter,Scarpa,valterscarpa@libero.it,3384056782,29.12.2025,03.01.2026,2,2,"7,12",Lavendula,Halbpension,it,Mobile (392 x 728 px),herr,Italy,Yes
Vincenza,Foschillo,enzafoschillo@gmail.com,3336333320,27.12.2025,03.01.2026,2,1,6,Lavendula,Übernachtung mit Frühstück,it,Mobile (320 x 587 px),frau,Italy,Yes
Monica,Montanari,monicamon2308@gmail.com,3396010803,16.08.2025,23.08.2025,2,0,,Forsythia,Halbpension,it,Mobile (339 x 628 px),frau,Italy,Yes
andrea,crisafuli,andreacrisafuli46@hotmial.com,,21.06.2025,23.06.2025,2,2,"7,10","Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Desktop (1265 x 639 px),herr,--,Yes
Conny,Reinhardt,conny.1999@gmx.net,,30.08.2025,06.09.2025,2,1,11,"Peonia,Lavendula,Fenice,Forsythia",Übernachtung,de,Desktop (1440 x 797 px),frau,Germany,Yes
Federico,Lucarini,federicolucarini82@gmail.com,,16.07.2025,23.07.2025,2,2,"3,5",,Übernachtung,it,Mobile (393 x 773 px),--,--,Yes
ombretta,benatti,ombrettabenatti74@gmail.com,3496723430,09.08.2025,20.08.2025,3,1,15,Peonia,Übernachtung,it,Mobile (392 x 739 px),frau,Italy,Yes
Pierluigi,Giuliodori,Pierluigigiuliodori@gmail.com,3393159091,18.08.2025,21.08.2025,2,1,16,"Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (384 x 704 px),herr,Italy,Yes
Rino,Festugato,rinoegrazia@alice.it,3393629894,10.08.2025,17.08.2025,2,0,,Bellis,Halbpension,it,Mobile (320 x 583 px),herr,Italy,Yes
PATRIZIA,Solombrino,pattysolom@gmail.com,3926325794,13.08.2025,17.08.2025,2,0,,Forsythia,Übernachtung,it,Mobile (347 x 638 px),frau,Italy,Yes
Eugenia,Malusa,Eugenia.malusa@gmail.com,,10.08.2025,20.08.2025,4,0,,,Halbpension,en,Mobile (390 x 662 px),frau,--,Yes
Alessandro,Passador,passador_ale@tiscali.it,,18.08.2025,23.08.2025,2,1,17,,Halbpension,it,Mobile (360 x 414 px),herr,--,Yes
Emanuela,Della porta,maolina80@gmail.com,3277574653,16.08.2025,23.08.2025,2,1,10,,Übernachtung mit Frühstück,it,Mobile (360 x 373 px),frau,--,Yes
Elena,Fabbiani,elenafabbianii@gmail.com,,23.08.2025,31.08.2025,2,0,,"Loft,Lavendula,Forsythia,Bellis",Halbpension,it,Mobile (375 x 741 px),frau,--,Yes
massimo,Granocchia,massimo.granocchia@gmail.com,+393920236584,21.08.2025,24.08.2025,1,3,"7,9,13",Fenice,Halbpension,it,Mobile (440 x 655 px),herr,Italy,Yes
Antonella,Convertino,convertino.antonella@gmail.com,3290762812,01.09.2025,07.09.2025,2,1,8,"Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (392 x 662 px),frau,Italy,Yes
Candido,Caserta,caserta.candido@libero.it,3494695112,09.08.2025,13.08.2025,2,1,3,Bellis,Halbpension,it,Mobile (392 x 739 px),herr,Italy,Yes
Candido,Caserta,caserta.candido@libero.it,3494695112,09.08.2025,13.08.2025,2,1,3,Forsythia,Übernachtung mit Frühstück,it,Mobile (392 x 739 px),herr,Italy,Yes
Letizia,De sanctis,Letizia.desanctis74@gmail.com,+393491328279,10.08.2025,17.08.2025,2,0,,Bellis,Übernachtung,it,Mobile (393 x 658 px),frau,Italy,Yes
daniela,cavallaro,danielacavallaro74@gmail.com,+393393244936,05.12.2025,09.12.2025,3,0,,Peonia,Übernachtung,it,Mobile (360 x 665 px),frau,Italy,Yes
Ettore,Rapezzi,ettorefederica@libero.it,,19.08.2025,21.08.2025,4,0,,,Übernachtung mit Frühstück,it,Mobile (360 x 672 px),herr,--,Yes
Roberto,Zito,robertozitorz@gmail.com,+39 333 194 9312,18.08.2025,24.08.2025,4,0,,"Lavendula,Forsythia",Halbpension,it,Mobile (360 x 656 px),herr,Italy,Yes
Negoita Nicoleta,Nicoleta,Negoitanicol85@gmail.com,+393457653842,15.08.2025,17.08.2025,4,0,,Lavendula,Halbpension,it,Mobile (390 x 580 px),frau,Italy,Yes
Carmine,Cipro,carminecipro68@gmail.com,3920200041,17.08.2025,24.08.2025,4,0,,"Peonia,Lavendula",Halbpension,it,Mobile (393 x 651 px),herr,Italy,Yes
Gabriele,Catanzaro,Gabricat81@gmail.com,,30.12.2025,06.01.2026,2,2,"6,9",,Halbpension,it,Mobile (360 x 645 px),herr,--,Yes
Valentina,Nogara,evita89@alice.it,,11.08.2025,16.08.2025,2,1,4,,Halbpension,it,Mobile (392 x 656 px),frau,--,Yes
Monica,Gemma,gemmamonica19@gmail.com,3383399114,28.08.2025,31.08.2025,2,1,15,Fenice,Übernachtung,it,Mobile (392 x 724 px),--,--,Yes
Simona,Taglieri,simona.taglieri@gmail.com,3476933052,11.08.2025,14.08.2025,2,0,,"Lavendula,Fenice,Forsythia,Bellis",Übernachtung mit Frühstück,it,Mobile (360 x 672 px),frau,Italy,Yes
Marica Bemer,Bemer,Marica.bemer@gmail.com,+39339123904,10.08.2025,17.08.2025,2,2,"13,15","Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (411 x 786 px),frau,--,Yes
Claudio,Langianni,Claudio.langianni@alice.it,3346161792,15.08.2025,22.08.2025,2,1,15,Fenice,Halbpension,it,Mobile (320 x 620 px),herr,Italy,Yes
Denise,Sartori,Tresjolie.denise@gmail.com,,09.08.2025,16.08.2025,2,2,"9,12",,Übernachtung,it,Mobile (390 x 662 px),--,--,Yes
Roberta Stagni,STAGNI,robertastagni@yahoo.it,3404054316,17.07.2026,24.07.2026,2,0,,Forsythia,Übernachtung,it,Mobile (375 x 705 px),frau,Italy,Yes
Vittoria,Carolo,Vittoria9185@libero.it,+393280836615,22.08.2025,24.08.2025,2,2,"3,9","Lavendula,Fenice",Halbpension,it,Mobile (338 x 604 px),frau,Italy,Yes
Gabriele,Nardini,nardini.gabriele03@gmail.com,3468797167,25.08.2025,31.08.2025,2,1,1,"Fenice,Forsythia,Bellis",Halbpension,it,Mobile (384 x 627 px),herr,Italy,Yes
Patrick,Bert,Patrickbert80@gmail.com,3491865149,18.08.2025,25.08.2025,2,1,12,,Halbpension,it,Mobile (360 x 631 px),herr,--,Yes
Francesca Giovanna,Rapetta,fratore@gmail.com,+393343245719,22.08.2025,25.08.2025,3,1,13,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 657 px),frau,Italy,Yes
paolo,rossignoli,rrpapl1977@gmail.com,3495009725,14.08.2025,17.08.2025,6,1,11,,Übernachtung mit Frühstück,it,Mobile (392 x 615 px),herr,Italy,Yes
Silvia,Baldassari,baldassarisilvia134@gmail.com,+393274336780,04.08.2025,11.08.2025,2,0,,Forsythia,Übernachtung,it,Mobile (390 x 677 px),frau,Italy,Yes
Angela Maria,Barbieri,angelabarbieriit@yahoo.it,339 853 0877,09.08.2025,16.08.2025,2,2,"5,7","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (411 x 749 px),frau,Italy,Yes
Gabriele,Nardini,nardini.gabriele03@gmail.com,+393468797167,25.08.2025,31.08.2025,2,1,1,"Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (384 x 709 px),herr,Italy,Yes
Laura,Berluti,Laura_berluti@yahoo.com,,16.08.2025,20.08.2025,2,1,5,"Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung mit Frühstück,it,Mobile (384 x 704 px),frau,--,Yes
Tanja,Lerro,Tanja.lerro@gmail.com,3471916838,30.12.2025,04.01.2026,2,2,"2,11",Fenice,Halbpension,it,Mobile (390 x 677 px),frau,Italy,Yes
Maria Rosaria,Lippi,Mariarosarialippi@yahoo.it,,16.02.2026,23.02.2026,2,0,,Loft,Halbpension,it,Mobile (360 x 657 px),frau,Italy,Yes
Eno,Vebiu,Enovebiu11@outlook.com,3457232292,24.12.2025,29.12.2025,2,3,"2,7,16","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 733 px),herr,Italy,Yes
Federica,Lazzaro,federica88lazzaro@gmail.com,3334590520,01.01.2026,04.01.2026,2,2,"0,3","Peonia,Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (393 x 641 px),frau,Italy,Yes
Karl,Traunspurger,karltraunspurger@gmail.com,015115591527,16.05.2026,23.05.2026,1,0,,Bellis,Übernachtung,de,Mobile (384 x 701 px),--,Germany,Yes
P,Barni,patrizia_barni_91@libero.it,,29.09.2025,03.10.2025,2,2,"0,4","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (375 x 698 px),frau,--,Yes
Ernesto,Annarumma,Ernesto.rosso@outlook.it,,27.12.2025,03.01.2026,2,2,"5,11",Fenice,Halbpension,it,Mobile (428 x 759 px),herr,--,Yes
Fabio,Pareschi,fabiopareschi69@gmail.com,,20.08.2025,23.08.2025,3,1,12,Peonia,Halbpension,it,Mobile (392 x 642 px),--,--,Yes
Isabella,Neri,isaneri@tiscali.it,,16.08.2025,24.08.2025,2,0,,"Lavendula,Fenice,Forsythia",Übernachtung,it,Mobile (390 x 669 px),frau,--,Yes
Chiara,Iorio,chiara24475@gmail.com,3397362329,11.08.2025,18.08.2025,2,0,,"Loft,Forsythia",Halbpension,it,Mobile (384 x 702 px),frau,--,Yes
Ramona,Gobetti,ramo77gob@tiscali.it,,27.12.2025,03.01.2026,5,1,1,Lavendula,Halbpension,it,Mobile (390 x 677 px),frau,--,Yes
Mattia,Simonetto,m.simonetto@avvocatosimonetto.com,3453066044,30.12.2025,04.01.2026,2,2,"3,6","Peonia,Lavendula",Übernachtung,it,Desktop (1854 x 933 px),herr,--,Yes
Alice,Bracci,alicebracci80@gmail.com,,20.12.2025,24.12.2025,2,3,"12,14,17",,Übernachtung,it,Mobile (384 x 700 px),frau,Italy,Yes
Daniela Tonini,Tonini,Shakihavana@gmail.com,3396802008,01.01.2026,05.01.2026,2,2,"5,7",Lavendula,Übernachtung,it,Mobile (360 x 677 px),--,--,Yes
Daniela,Arhip,gubilitvera@gmail.com,+393887268003,24.12.2025,27.12.2025,3,3,"8,9,15","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 707 px),frau,--,Yes
Veronica Marchetti,Marchetti,Veronicamarchetti1977@gmail.com,3299476876,11.01.2026,17.01.2026,2,1,17,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (320 x 588 px),frau,Italy,Yes
Maria Grazia,Ferri,marygten6@hotmail.com,,28.12.2025,04.01.2026,4,4,"6,6,11,11",,Übernachtung mit Frühstück,it,Mobile (430 x 743 px),--,Italy,Yes
silvia,andreotti,silvia.andreotti@hotmail.it,3286552398,04.08.2025,13.08.2025,2,0,,"Loft,Forsythia",Halbpension,it,Desktop (1521 x 695 px),frau,--,Yes
Mauro,Zecca,zeccam@yahoo.it,3483600062,06.09.2025,13.09.2025,2,0,,Bellis,Halbpension,it,Mobile (411 x 762 px),herr,Italy,Yes
Simona,Migliari,migliari.simo@gmail.com,+393391399107,27.07.2025,06.08.2025,2,2,"5,7",,Halbpension,it,Mobile (411 x 765 px),frau,Italy,Yes
Donatella,Ludovico,Donaludovico75@gmail.com,3477059300,27.12.2025,02.01.2026,2,2,"16,18",Fenice,Übernachtung,it,Mobile (360 x 654 px),frau,Italy,Yes
Gian Carlo,Tamburini,tamburinigc@gmail.com,3294370531,26.07.2025,31.07.2025,2,1,13,"Peonia,Fenice",Übernachtung,it,Mobile (432 x 818 px),herr,--,Yes
Elisa,Zucchini,elisazucchini79@gmail.com,347 957 4956,04.08.2025,08.08.2025,2,1,16,"Lavendula,Fenice",Übernachtung mit Frühstück,it,Mobile (366 x 683 px),frau,Italy,Yes
Mauro,Baccini,Baccini86@gmail.com,3483391097,26.08.2025,30.08.2025,2,2,"8,12","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (390 x 578 px),herr,--,Yes
claudio,Boglioli,Claudioboglioli88@hotmail.it,3397104302,21.07.2025,25.07.2025,2,1,4,,Halbpension,it,Mobile (360 x 656 px),herr,Italy,Yes
Angelica,Gramaccioni,agramaccioni@gmail.com,329/2011137,09.08.2025,14.08.2025,2,2,"6,9",Lavendula,Übernachtung mit Frühstück,it,Mobile (414 x 713 px),frau,Italy,Yes
Luca,Acunzo,lacunzo@yahoo.it,,10.08.2025,24.08.2025,2,2,"11,15","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (360 x 651 px),herr,Italy,Yes
Massimiliano,Ottolini,maxim8@inwind.it,3407192098,03.01.2026,06.01.2026,3,0,,"Peonia,Lavendula,Fenice",Übernachtung,it,Desktop (1327 x 642 px),herr,Italy,Yes
Giuseppe,Giampietro,g.giampietro1@yahoo.it,3475927917,29.12.2025,03.01.2026,3,1,12,Peonia,Übernachtung,it,Mobile (393 x 651 px),herr,Italy,Yes
Giovanna De palma,De palma,giovannadepalma@outlook.it,3201961554,02.01.2026,06.01.2026,2,2,"2,9",Peonia,Halbpension,it,Mobile (392 x 739 px),frau,Italy,Yes
Ilaria,Battaglino,ilab56789@gmail.com,3394953825,29.12.2025,01.01.2026,3,0,,,Übernachtung mit Frühstück,it,Mobile (411 x 788 px),herr,--,Yes
Pasquale,Donnarumma,pasqualedonnarum@gmail.com,333 135 6484,29.11.2025,30.11.2025,3,1,16,"Peonia,Lavendula,Fenice",Übernachtung,it,Desktop (800 x 1208 px),herr,--,Yes
Edoardo,Forcella,edoardo.forcella@alice.it,,29.12.2025,04.01.2026,2,0,,"Loft,Peonia,Lavendula,Forsythia,Bellis",Halbpension,it,Mobile (375 x 495 px),herr,Italy,Yes
Nicola Carfagna,Carfagna,Carfagna.nicola@libero.it,3383454008,28.12.2025,02.01.2026,2,3,"1,4,11",Peonia,Halbpension,it,Mobile (384 x 703 px),herr,Italy,Yes
Viorica,Homenco,homencoviorica@gmail.com,+393245828180,29.12.2025,01.01.2026,4,1,11,Peonia,Halbpension,it,Mobile (411 x 780 px),frau,Italy,Yes
Serena,Pranzini,serena.pranzini@alice.it,3382379905,17.08.2025,21.08.2025,2,1,11,,Halbpension,it,Mobile (428 x 736 px),frau,--,Yes
Emanuela,Birini,emabirini@gmail.com,,09.08.2025,16.08.2025,4,0,,Peonia,Übernachtung,it,Mobile (392 x 743 px),--,Italy,Yes
cinzia,caselli,cinzia.caselli@giustizia.it,3474287224,22.08.2025,26.08.2025,4,0,,Peonia,Halbpension,it,Mobile (360 x 672 px),frau,Italy,Yes
Nicoletta,Mattiussi,nicoletta.mattiussi@gmail.com,3496183035,13.07.2025,19.07.2025,2,2,"0,2",Peonia,Halbpension,it,Mobile (414 x 820 px),frau,Italy,Yes
Debora,Concialdi,deboraconcialdi74@gmail.com,+393478104628,10.07.2025,15.07.2025,2,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung,it,Mobile (320 x 566 px),frau,Italy,Yes
Sara,Tartabini,Sara.tartabini1981@gmail.com,338 980 0551,16.08.2025,23.08.2025,3,2,"7,15",Peonia,Übernachtung mit Frühstück,it,Mobile (384 x 722 px),--,--,Yes
Roberta,Morandini,Morandiniroberta@gmail.com,,24.08.2025,04.09.2025,3,2,"3,9",Peonia,Übernachtung,it,Mobile (414 x 609 px),frau,Italy,Yes
Silvana,Tiberio,silvytiberio@gmail.com,3401468792,18.08.2025,23.08.2025,2,1,17,,Übernachtung,it,Mobile (392 x 743 px),frau,Italy,Yes
Salvatore,Giacci,S.guacci@libero.it,3313621612,12.08.2025,18.08.2025,2,1,6,Peonia,Übernachtung mit Frühstück,it,Mobile (390 x 777 px),herr,Italy,Yes
Daniela,Maffei,danielamaffei7@gmail.com,337 866 788,06.07.2025,13.07.2025,2,0,,Forsythia,Übernachtung,it,Mobile (384 x 599 px),frau,Italy,Yes
Carlo,Alfei,loretta.alfei@gmail.com,3397668703,20.08.2025,29.08.2025,2,0,,Fenice,Übernachtung,it,Mobile (360 x 682 px),herr,Italy,Yes
Rebecca,Cattaneo,rebecca_cattaneo@libero.it,,20.06.2026,27.06.2026,2,3,"2,6,9","Peonia,Fenice",Halbpension,it,Mobile (360 x 666 px),--,--,Yes
Silvia,Seveso,silviaseveso83@gmail.com,,19.08.2025,22.08.2025,2,2,"1,8",,Halbpension,it,Desktop (1394 x 773 px),--,--,Yes
Marco,Spigolon,orsopiteco@gmail.com,,01.09.2025,05.09.2025,2,1,14,,Halbpension,it,Mobile (411 x 797 px),herr,--,Yes
Marcela,Pette,Marcelapette@icloud.com,3804650172,26.12.2025,03.01.2026,2,2,"1,5","Peonia,Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (393 x 773 px),frau,Italy,Yes
MicaelA,Zampieri,Zampierimicaela@gmail.com,,27.12.2025,03.01.2026,2,1,3,"Lavendula,Fenice,Forsythia,Bellis",Übernachtung,it,undefined,frau,--,Yes
Maria Cristina,Belgiovine,Cristinabelgiovine@libero.it,3406089775,26.12.2025,02.01.2026,2,2,"8,10","Peonia,Lavendula,Fenice",Halbpension,it,undefined,frau,--,Yes
Sandra,Mazza,sandramazza@hotmail.it,329 403 8481,11.08.2025,16.08.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (393 x 643 px),frau,Italy,Yes
Matteo,Sais,M.sais@libero.it,,11.08.2025,16.08.2025,2,0,,,Halbpension,it,Mobile (411 x 721 px),herr,--,Yes
Matteo,Sais,M.sais@libero.it,,11.08.2025,16.08.2025,2,0,,,Halbpension,it,Mobile (411 x 721 px),herr,--,Yes
Tatiana,Falcinelli,tatianafalcinelli79@gmail.com,3343421695,11.08.2025,16.08.2025,2,1,12,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (384 x 737 px),frau,Italy,Yes
Davide Curcio,Curcio,Davidecurcio@libero.it,3394833660,02.08.2025,09.08.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (384 x 704 px),herr,Italy,Yes
Milena,Miccio,kigio@hotmail.com,3338782859,04.08.2025,10.08.2025,2,0,,Bellis,Übernachtung mit Frühstück,it,Mobile (384 x 717 px),frau,--,Yes
Maria Grazia,Gentile,gentilegrace@yahoo.it,3389338838,17.08.2025,24.08.2025,1,0,,Bellis,Halbpension,it,Mobile (411 x 734 px),frau,Italy,Yes
Lucia,Moretti,morettilucia70@gmail.com,,11.08.2025,16.08.2025,2,3,"13,15,15",,Übernachtung mit Frühstück,it,Mobile (360 x 664 px),frau,Italy,Yes
Simone,Venturato,venturatosimone@gmail.com,348 440 0858,10.08.2025,17.08.2025,2,0,,Loft,Übernachtung mit Frühstück,it,Mobile (360 x 668 px),herr,Italy,Yes
Valeria,Barricelli,Valery06@libero.it,328 44 35671,16.08.2025,23.08.2025,4,4,"7,13,13,15",Lavendula,Übernachtung,it,Mobile (411 x 797 px),frau,Italy,Yes
Benedtta,Cappiello,benedetta.cg@gmail.com,,03.08.2025,10.08.2025,2,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung mit Frühstück,it,Desktop (1180 x 713 px),frau,--,Yes
Elena,Greco,grecoelena75@gmail.com,3355609794,03.01.2026,10.01.2026,1,2,"13,16",Peonia,Halbpension,it,Mobile (392 x 735 px),frau,Italy,Yes
Lucia,Aversano,Lucia.aversano87@gmail.com,,23.08.2025,30.08.2025,2,2,"7,9",Fenice,Halbpension,it,Mobile (360 x 653 px),frau,--,Yes
Marcella,Marchi,Marchi.marcella79@gmail.com,3384718165,06.07.2026,12.07.2026,3,1,1,"Lavendula,Fenice",Übernachtung,it,Mobile (375 x 552 px),frau,Italy,Yes
Monica Moretti,Moretti,Mony.moretti25@gmail.com,3497776490,09.11.2025,15.11.2025,2,2,"6,10","Peonia,Lavendula,Fenice",Halbpension,it,Mobile (402 x 682 px),frau,--,Yes
Micaela,Zampieri,zampierimicaela@gmail.com,,27.12.2025,03.01.2026,2,1,3,"Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (414 x 828 px),frau,--,Yes
Elena,Contarato,elena_contarato@hotmail.it,,27.12.2025,03.01.2026,5,1,10,,Halbpension,it,Mobile (390 x 677 px),frau,--,Yes
Luigi,De Martino,luigi.demartino1972@libero.it,'+393491091286,30.12.2025,02.01.2026,2,2,"11,14",Peonia,Halbpension,it,Mobile (384 x 733 px),herr,--,Yes
Valentina Corradin,Corradib,valentinacorradin@gmail.com,3484783911,30.12.2025,03.01.2026,2,2,"1,7",Lavendula,Halbpension,it,Mobile (375 x 561 px),frau,Italy,Yes
Walter,Bartoli,walterbartoli@gmail.com,3406562623,09.07.2026,14.07.2026,2,2,"8,12",Fenice,Halbpension,it,Mobile (384 x 644 px),herr,Italy,Yes
Denise Chistolini,Chistolini,Dchistolini6@gmail.com,3318307297,02.03.2026,08.03.2026,2,2,"0,9","Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Halbpension,it,Mobile (411 x 761 px),frau,Italy,Yes
Francesca,Sorgato,cesca.85@hotmail.it,,27.12.2025,03.01.2026,2,2,"6,6","Peonia,Lavendula,Fenice",Übernachtung,it,Mobile (390 x 663 px),frau,--,Yes
Roberto O,Orsi,orsiroberto37@gmail.com,3333459372,25.08.2025,29.08.2025,5,0,,"Peonia,Bellis",Halbpension,it,Mobile (360 x 667 px),herr,Italy,Yes
Teresa,Grillo,teagrillo@rocketmail.com,3348464542,02.08.2025,08.08.2025,2,0,,"Forsythia,Bellis",Halbpension,it,Mobile (393 x 651 px),frau,--,Yes
Paolo,Disconzi,paolodisconzi@gmail.com,3477408769,27.08.2025,31.08.2025,3,2,"3,5",,Übernachtung,it,Mobile (360 x 672 px),herr,Italy,Yes
Patrizia,Anatriello,patrizia.anatriello.caporale@gmail.com,3922658558,10.08.2025,17.08.2025,2,2,"13,13",,Übernachtung mit Frühstück,it,Mobile (392 x 743 px),frau,Italy,Yes
Silvia,Anfos,silvia.anfos@gmail.com,,16.08.2025,23.08.2025,2,2,"0,5","Lavendula,Fenice",Halbpension,it,Mobile (360 x 636 px),--,--,Yes
Valentina,Bonadonna,valentina.bnd@gmail.com,392 626 6400,17.08.2025,24.08.2025,2,2,"3,3",,Übernachtung,it,Mobile (392 x 744 px),frau,Italy,Yes
Loretta,Alfei,loretta.alfei@gmail.com,3397668703,20.08.2025,29.08.2025,2,0,,Lavendula,Übernachtung,it,Mobile (360 x 674 px),frau,Italy,Yes
Gianfranco,Marino,Gianfranco.marino@fiorentini.com,,11.08.2025,16.08.2025,3,2,"17,17",,Übernachtung mit Frühstück,it,Mobile (393 x 665 px),herr,--,Yes
Alana,Gallini,alanagallini@gmail.com,,12.08.2025,19.08.2025,3,3,"0,2,4",,Halbpension,en,Mobile (393 x 644 px),--,--,Yes
Susi,Bergamini,Susibergamini@gmail.com,347 1034812,10.08.2025,17.08.2025,2,0,,Loft,Halbpension,it,Desktop (800 x 1165 px),frau,Italy,Yes
Marco,Barchiesi,m.barchiesi56@gmail.com,3486506303,15.07.2025,20.07.2025,2,0,,Forsythia,Übernachtung mit Frühstück,it,Mobile (338 x 605 px),herr,Italy,Yes
Antonella,De Luca,a.deluca@raconsulting.it,335 760 2237,04.08.2025,10.08.2025,3,0,,"Peonia,Lavendula,Fenice",Halbpension,it,Mobile (430 x 733 px),frau,Italy,Yes
Gaetano,Caiani,Gaetano.caiani@gmail.com,3381934017,04.10.2025,11.10.2025,2,0,,,Halbpension,it,Mobile (384 x 731 px),herr,Italy,Yes
c,cook,heart1584@aol.com,+1 4096564686,13.07.2025,20.07.2025,2,0,,Loft,Halbpension,en,Desktop (1257 x 602 px),frau,United States of America,Yes
Antonella Urban,Urban,antonellaurban7@gmail.com,338 954 7766,10.08.2025,18.08.2025,2,0,,Forsythia,Übernachtung,it,Mobile (320 x 589 px),frau,Italy,Yes
Lina,Di Lembo,linadilembo@gmail.com,3205742436,17.08.2025,23.08.2025,2,1,1,Fenice,Übernachtung,it,Mobile (360 x 664 px),frau,--,Yes
Roberta,Ghigi,robertagh@hotmail.it,,27.12.2025,02.01.2026,6,4,"3,6,6,8",Fenice,Halbpension,it,Mobile (360 x 674 px),frau,--,Yes
Valentina,Zilli,vale_zilli@hotmail.com,,03.10.2025,06.10.2025,2,1,2,Bellis,Übernachtung mit Frühstück,it,Mobile (390 x 663 px),frau,--,Yes
Michela,Paccagnan,pacca1990@gmail.com,,28.12.2025,04.01.2026,2,2,"4,6",Fenice,Halbpension,it,Mobile (360 x 648 px),frau,--,Yes
Elena,Battiloro,E.battiloro1@gmail.com,,05.12.2025,08.12.2025,2,3,"0,1,3",Lavendula,Halbpension,it,Mobile (414 x 714 px),frau,Italy,Yes
Teresa,Loria,teresa.loria81@libero.it,3425948239,05.12.2025,08.12.2025,2,2,"2,2",Lavendula,Halbpension,it,Mobile (360 x 419 px),frau,Italy,Yes
Wolfhard,Cappel,Wolfhard.Cappel@t-online.de,,08.09.2025,17.09.2025,2,0,,Forsythia,Übernachtung mit Frühstück,de,Mobile (428 x 742 px),herr,Germany,Yes
Luca,Marseglia,luca@marseglia.it,,03.01.2026,06.01.2026,5,0,,"Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis",Übernachtung,it,Mobile (393 x 658 px),herr,--,Yes
Patrizia,Pizza,patripizza@gmail.com,3488747991,29.12.2025,01.01.2026,2,0,,Bellis,Halbpension,it,Mobile (392 x 739 px),frau,--,Yes
1 name lastname mail tel anreise abreise erwachsene kinder kind_ages apartments verpflegung sprache device anrede land privacy
2 Martina Contarin martinacontarin.mc@gmail.com 3473907005 30.12.2025 04.01.2026 2 0 Peonia,Lavendula,Fenice,Forsythia Übernachtung it Mobile (393 x 658 px) frau -- Yes
3 giulia latini giulialatini@live.it 06.12.2025 08.12.2025 2 0 Halbpension it Desktop (1905 x 945 px) frau -- Yes
4 Simona Buompadre Simi1983@hotmail.it 03.01.2026 10.01.2026 2 3 3,6,10 Lavendula Halbpension it Mobile (384 x 700 px) frau -- Yes
5 Elke Arnold seppina@gmx.de 015127030369 28.11.2025 01.12.2025 2 0 Peonia Übernachtung mit Frühstück de Mobile (360 x 646 px) frau Germany Yes
6 Tania Demetri Tania.demetri@yahoo.it 03.01.2026 06.01.2026 4 1 15 Übernachtung mit Frühstück it Mobile (411 x 779 px) -- -- Yes
7 Mario Reita marioreita1985@gmail.com 30.12.2025 03.01.2026 4 4 2,7,10,12 Halbpension it Mobile (390 x 655 px) herr -- Yes
8 Gianluca Biondo Gnlcbiondo@gmail.com +393520220616 22.08.2026 29.08.2026 2 3 1,13,14 Halbpension it Mobile (390 x 655 px) herr Italy Yes
9 Franca Andreana francesca.andreana@alice.it +393476755045 28.12.2025 04.01.2026 2 1 14 Peonia Halbpension it Mobile (360 x 684 px) frau Italy Yes
10 Barbara Baldacci bbaldacci73@gmail.com 3498020461 06.12.2025 08.12.2025 2 1 13 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (360 x 711 px) frau Italy Yes
11 Silvia Silenzi silenzi.silvia@virgilio.it 345 703 7302 24.12.2025 29.12.2025 3 1 15 Übernachtung mit Frühstück it Mobile (392 x 684 px) frau Italy Yes
12 Silvia Silenzi silenzi.silvia@virgilio.it 345 703 7302 24.12.2025 29.12.2025 3 1 15 Übernachtung mit Frühstück it Mobile (392 x 684 px) frau Italy Yes
13 Alessia Orru orrual@gmail.com 10.11.2025 16.11.2025 2 1 11 Lavendula,Fenice Halbpension it Mobile (384 x 678 px) frau Italy Yes
14 Clementina bisceglie Bisceglie bisceglieclementina@gmail.com 3204734570 27.12.2025 03.01.2026 2 3 8,14,17 Peonia,Lavendula,Fenice Halbpension it Mobile (428 x 729 px) frau Italy Yes
15 Cristina Axinia Cristinaaxinia11a@gmail.com 3473439538 27.12.2025 30.12.2025 2 2 13,17 Peonia Halbpension it Mobile (402 x 682 px) frau Italy Yes
16 Gerald Steiner gerald.steiner.gs@googlemail.com 30.05.2026 06.06.2026 2 0 Peonia,Lavendula,Fenice,Forsythia Halbpension de Desktop (1897 x 924 px) herr Germany Yes
17 Dennis Sommer dennissommer@gmx.de 17.06.2026 21.06.2026 4 2 3,5 Lavendula,Bellis Übernachtung mit Frühstück de Mobile (375 x 547 px) herr -- Yes
18 PAOLA AMBROSETTI paola_ambrosetti@yahoo.it 338 8097755 30.12.2025 01.01.2026 2 0 Forsythia Halbpension it Mobile (430 x 731 px) frau Italy Yes
19 Marilena GIAQUINTO marilena.giaquinto73@gmail.com +393381531396 30.12.2025 03.01.2026 10 4 5,8,12,15 Übernachtung mit Frühstück it Mobile (360 x 668 px) frau -- Yes
20 Alice Vaggelli Vaggelli Alicevaggelli820@gmail.com 3393723909 31.12.2025 04.01.2026 9 0 Loft,Lavendula,Forsythia,Bellis Übernachtung it Mobile (414 x 639 px) frau Italy Yes
21 Giustina Ganci Giustinaganci@libero.it 3381256848 14.02.2026 17.02.2026 2 2 10,13 Fenice Halbpension it Mobile (384 x 697 px) frau Italy Yes
22 Katherine OSULLIVAN kdugdaleosullivan@gmail.com 718-909-9008 14.02.2026 18.02.2026 2 2 16,18 Peonia,Lavendula,Fenice Übernachtung en Desktop (1440 x 820 px) frau -- Yes
23 Marianna Faraci Faracimarianna27@gmail.com +393275715125 28.12.2025 04.01.2026 2 2 1,6 Fenice Halbpension it Mobile (414 x 706 px) frau Italy Yes
24 Maurizio Marino mauryx05@icloud.com +393394697328 23.12.2025 27.12.2025 2 1 13 Peonia,Lavendula,Fenice Halbpension it Mobile (390 x 590 px) herr -- Yes
25 Elisa Turri elisaturri76@gmail.com +393881695046 02.01.2026 05.01.2026 2 0 Übernachtung mit Frühstück it Mobile (411 x 793 px) frau -- Yes
26 Lidia Ciuraru Ciuraru lidiaanaciuraru@gmail.com 3207242313 24.12.2025 28.12.2025 2 2 3,6 Halbpension it Mobile (360 x 668 px) frau Italy Yes
27 Roberta La riccia robertalr89@hotmail.it 3923204310 30.12.2025 02.01.2026 6 5 0,3,5,8,11 Lavendula,Fenice,Forsythia Übernachtung mit Frühstück it Mobile (411 x 757 px) frau -- Yes
28 Paola Fianchini Paola.f@hotmail.it 3270272667 28.11.2025 30.11.2025 2 0 Halbpension it Mobile (414 x 728 px) frau -- Yes
29 Gayan Madurapperuma Madurapperuma gsgayan@gmail.com 3881033320 27.12.2025 30.12.2025 2 2 8,12 Peonia Halbpension it Mobile (411 x 780 px) herr -- Yes
30 Stefania Guidi Guidi morettinamia@yahoo.it 3479573252 20.02.2026 24.02.2026 6 2 4,5 Fenice,Forsythia Halbpension it Mobile (414 x 708 px) frau Italy Yes
31 Happy Mia Lhopital Lhopital Hmlhopital@gmail.com 017673564169 15.02.2026 20.02.2026 2 2 14,17 Peonia,Lavendula,Fenice Übernachtung de Mobile (390 x 667 px) frau -- Yes
32 Michela Borrelli Michyborrelli@libero.it 22.08.2025 24.08.2025 2 2 2,6 Übernachtung mit Frühstück it Mobile (390 x 606 px) frau -- Yes
33 Luisa Göddemeier Luisa.stoeckle@gmx.de 27.12.2025 02.01.2026 2 2 6,8 Peonia,Lavendula,Fenice Übernachtung de Desktop (1080 x 707 px) frau -- Yes
34 Fabio panconi Panconi Panconifabio4@gmail.com 3284310119 26.12.2025 01.01.2026 4 4 9,10,12,12 Übernachtung it Mobile (392 x 739 px) herr Italy Yes
35 Daniele Simonetti denny84844@libero.it 338 695 9081 31.12.2025 05.01.2026 2 2 5,13 Peonia Übernachtung mit Frühstück it Mobile (360 x 712 px) herr -- Yes
36 Loredana Padedda lorypaddy@gmail.com 24.12.2025 01.01.2026 3 0 Peonia Halbpension it Mobile (393 x 770 px) frau Italy Yes
37 Adriana Alfieri adrianaalfieri56@gmail.com 331 6516002 30.12.2025 04.01.2026 10 1 2 Loft,Fenice,Forsythia,Bellis Übernachtung mit Frühstück it Mobile (384 x 727 px) frau -- Yes
38 Tiziano Conti Tiziconti@virgilio.it 3495250717 27.12.2025 03.01.2026 4 4 10,12,12,16 Übernachtung it Mobile (390 x 677 px) herr -- Yes
39 Edoardo Grimaccia liftcar@hotmail.it 3921792572 07.09.2025 14.09.2025 2 0 Loft Halbpension it Mobile (433 x 830 px) herr Italy Yes
40 Lara Marcatelli emanuelem83@gmail.com 30.11.2025 07.12.2025 2 2 6,14 Lavendula,Fenice Halbpension it Mobile (392 x 735 px) frau Italy Yes
41 Maria Romoli mr.mariaromoli@gmail.com +393283996083 04.07.2026 11.07.2026 2 0 Bellis Übernachtung it Mobile (390 x 677 px) frau Italy Yes
42 Christine Kappes Kappes christine_kappes@web.de +491791099892 03.10.2025 11.10.2025 2 0 Loft,Lavendula,Forsythia Übernachtung mit Frühstück de Desktop (1263 x 595 px) frau Germany Yes
43 Flavio Tosetto flaviotosetto01@gmail.com 3286381429 01.01.2026 05.01.2026 2 2 5,11 Lavendula Übernachtung it Mobile (430 x 753 px) herr Italy Yes
44 Simone Cinti simonec1984@live.it 3347902970 10.01.2026 17.01.2026 2 2 5,7 Halbpension it Mobile (411 x 785 px) herr Italy Yes
45 Annunziata Fico Nunziafico09@gmail.com 3937737695 31.10.2025 02.11.2025 2 2 2,5 Peonia Halbpension it Mobile (393 x 770 px) frau Italy Yes
46 Adriana Rullo adry.rullo@gmail.com 18.08.2025 24.08.2025 2 2 10,14 Peonia,Lavendula,Fenice Halbpension de Mobile (360 x 667 px) frau -- Yes
47 Annamaria Pozzani Pasinifam@virgilio.it 3487353538 15.09.2025 18.09.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (360 x 660 px) frau Italy Yes
48 Lakerta Malaj lakertamalaj@yahoo.it +3285909788 21.12.2025 28.12.2025 2 2 6,11 Lavendula Halbpension it Mobile (390 x 652 px) frau Italy Yes
49 Luca Bottoni Luca.bottoni06@gmail.com +393389330916 18.07.2025 20.07.2025 2 1 11 Lavendula Halbpension it Mobile (375 x 539 px) herr -- Yes
50 Luca Bottoni Luca.bottoni06@gmail.com +393389330916 18.07.2025 20.07.2025 2 1 11 Lavendula Halbpension it Mobile (375 x 539 px) herr -- Yes
51 Emiliana Cottignoli emilianacottignoli@yahoo.it 3462495979 12.07.2025 16.07.2025 2 0 Übernachtung mit Frühstück it Mobile (411 x 783 px) frau Italy Yes
52 Massimo Morandi mazzinomorandi@gmail.com 3272485641 13.07.2025 16.07.2025 4 0 Lavendula,Fenice Übernachtung it Mobile (338 x 609 px) herr -- Yes
53 Marianna Sanna marianna762006@libero.it 28.08.2025 06.09.2025 2 0 Lavendula Übernachtung it Mobile (360 x 664 px) frau Italy Yes
54 dumitrita bocanceai bocancea ionterenri@gmail.com 351887634 06.08.2025 10.08.2025 2 0 Forsythia,Bellis Halbpension it Mobile (360 x 602 px) -- -- Yes
55 Danila Marenghi marenghidanila84@gmail.com 03.08.2025 10.08.2025 2 1 11 Lavendula,Fenice Übernachtung mit Frühstück it Mobile (411 x 780 px) frau Italy Yes
56 Nadia Capurro Capurronadia68@gmail.com 3474614757 23.08.2025 28.08.2025 2 0 Bellis Halbpension it Mobile (360 x 655 px) frau Italy Yes
57 Fabio Martino fabiomartino71@gmail.com +393343903454 16.08.2025 23.08.2025 3 1 14 Lavendula Übernachtung mit Frühstück it Mobile (432 x 816 px) herr Italy Yes
58 Giuseppe Piovesan piovesang26@gmail.com 3476676922 04.08.2025 11.08.2025 2 0 Forsythia Halbpension it Mobile (384 x 733 px) herr Italy Yes
59 Leonardo Intini Intinileo@gmIl.com 3401618984 09.08.2025 20.08.2025 4 0 Übernachtung it Mobile (430 x 853 px) herr Italy Yes
60 Camelia GHEARASIM ghearasimcamelia@gmail.com 329 165 6518 01.09.2025 07.09.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (384 x 725 px) frau Italy Yes
61 Michele Mainardi Mikimaina@hotmail.it +393355309213 13.08.2025 17.08.2025 2 0 Bellis Halbpension it Mobile (375 x 740 px) herr Italy Yes
62 Edo Ciaralli Edocia74@gmail.com 3205781817 19.08.2025 23.08.2025 2 2 13,16 Fenice Halbpension it Mobile (390 x 652 px) herr Italy Yes
63 Silvia Pelicioli Silvia.pelicioli@gmail.com 10.08.2025 18.08.2025 2 3 7,12,15 Loft Halbpension it Mobile (411 x 788 px) frau -- Yes
64 Imma Carone nannaenea@gmail.com 05.09.2025 12.09.2025 1 0 Bellis Übernachtung it undefined frau Italy Yes
65 Matteo Tommasi matteo.tommasi83@gmail.com 3208935492 13.08.2025 20.08.2025 2 1 0 Halbpension it Mobile (360 x 652 px) herr Italy Yes
66 Nadia Baldino nadiabaldino80@gmail.com 347844340 18.08.2025 24.08.2025 2 2 14,17 Halbpension it Mobile (360 x 681 px) frau Italy Yes
67 Concetta Pierro amministrazione@consulenzapierro.com 3488549935 01.08.2025 04.08.2025 3 0 Fenice Halbpension it Mobile (393 x 548 px) frau Italy Yes
68 Laura Gaggioli coccinelle-75@libero.it 14.08.2025 22.08.2025 2 0 Loft,Bellis Halbpension it Mobile (360 x 669 px) frau -- Yes
69 Diego Vendramin Vendramindiego70@gmail.com 335 194 2137 10.08.2025 17.08.2025 2 2 11,12 Fenice Halbpension it Mobile (375 x 740 px) herr Italy Yes
70 Angela Nonino angy.nonino@gmail.com 15.02.2026 18.02.2026 2 2 9,14 Peonia,Fenice Übernachtung mit Frühstück it Mobile (411 x 759 px) frau Italy Yes
71 Daniela Palusci dany_p85@hotmail.it 26.09.2025 29.09.2025 3 2 3,6 Forsythia Übernachtung mit Frühstück it Mobile (360 x 671 px) frau -- Yes
72 Davide Bonello davide_bonello@libero.it 24.01.2026 31.01.2026 2 1 3 Peonia Übernachtung mit Frühstück it Mobile (360 x 663 px) herr -- Yes
73 Marika Castelletti marikacastelletti@gmail.com 3285782640 22.12.2025 28.12.2025 2 2 5,10 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (360 x 668 px) frau -- Yes
74 Alessandra Panacchia alessandra.panacchia@uniroma1.it 26.07.2025 02.08.2025 4 0 Übernachtung it Mobile (360 x 668 px) frau Italy Yes
75 laura severini laura.severini@alice.it 3203309929 31.12.2025 03.01.2026 4 2 8,9 Bellis Übernachtung mit Frühstück it Mobile (360 x 609 px) frau Italy Yes
76 Gabriele Borri gabriele.borri15@hotmail.com 3392969841 20.07.2025 27.07.2025 2 2 6,11 Fenice Halbpension it Mobile (384 x 725 px) herr Italy Yes
77 Marta Novazzi marta.novazzi@gmail.com 06.07.2025 10.07.2025 2 0 Halbpension it Mobile (360 x 704 px) frau Italy Yes
78 Gabriella Mury gmbaddy@gmail.com +39 347 149 3998 17.08.2025 24.08.2025 3 0 Peonia Halbpension it Mobile (414 x 824 px) frau Italy Yes
79 Francesco Luongo francescoluongo-4176@libero.it 3470531852 22.08.2025 25.08.2025 2 0 Forsythia Halbpension it Mobile (423 x 837 px) herr Italy Yes
80 Giuseppina Di Micco media.marilory@yahoo.it 329 123 4406 01.08.2025 25.08.2025 1 0 Bellis Übernachtung it Mobile (392 x 724 px) frau Italy Yes
81 Monika Wolf wolf.monika@me.com 1782171156 08.08.2026 15.08.2026 9 4 3,8,8,9 Halbpension de Mobile (428 x 744 px) frau Germany Yes
82 cathy cook heart1584@aol.com +1 4096564686 13.07.2025 20.07.2025 2 0 Loft Übernachtung en Desktop (1257 x 602 px) frau United States of America Yes
83 Giancarlo Capraro giancarlocapraro8@gmail.com 3247839493 30.08.2025 04.09.2025 2 2 5,8 Peonia Halbpension it Mobile (360 x 364 px) herr Italy Yes
84 Davis Fabbi Da.da2003@yahoo.it 3483637094 29.08.2025 31.08.2025 2 1 7 Übernachtung it Mobile (384 x 726 px) herr Italy Yes
85 Marilena Ciobanu Ciobanu marilenaciobanu016@gmail.com 3284384077 23.12.2025 28.12.2025 3 0 Lavendula Übernachtung it Mobile (384 x 705 px) frau -- Yes
86 Giulia Chiaranda giulia.chiaranda25@gmail.com 21.02.2026 24.02.2026 2 2 4,7 Peonia,Lavendula,Fenice Halbpension it Mobile (393 x 658 px) -- -- Yes
87 Cristina Porcu porcucristina38@gmail.com 3338646289 02.12.2025 08.01.2026 3 1 7 Peonia Halbpension it Mobile (375 x 551 px) frau Italy Yes
88 Millauer Kerstin kerstinmillauer@gmail.com 14.02.2026 17.02.2026 2 3 8,10,12 Übernachtung mit Frühstück de Mobile (375 x 634 px) -- -- Yes
89 Alessandro Cannuni acannuni4@gmail.com 3450633788 02.01.2026 05.01.2026 4 3 6,9,9 Lavendula Halbpension it Mobile (360 x 589 px) herr Italy Yes
90 Vittoria sicolo Vittoria.sicolo@icloud.com +393892521295 30.12.2025 03.01.2026 2 0 Forsythia Halbpension it Mobile (393 x 594 px) frau -- Yes
91 Alueda Mucaj aluedaMucaj111@gmail.com 3806957164 14.11.2025 16.11.2025 2 3 0,3,5 Übernachtung it Mobile (430 x 853 px) frau Italy Yes
92 Stefano Cassol stefanocassol91@gmail.com 3461223837 16.08.2025 23.08.2025 2 1 1 Halbpension it Mobile (354 x 660 px) herr Italy Yes
93 Gabriella Margani Gabriella.margani@yahoo.it 3460102509 09.08.2025 16.08.2025 2 1 9 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 616 px) frau Italy Yes
94 Luana Di carlo dicarloluana@libero.it 28.06.2025 05.07.2025 2 1 11 Lavendula,Fenice,Forsythia Übernachtung mit Frühstück it Mobile (375 x 626 px) frau -- Yes
95 Concetta Salvatore Frantin.tina@icloud.com 349 612 8429 14.07.2025 16.07.2025 2 1 12 Fenice Übernachtung it Mobile (375 x 620 px) frau Italy Yes
96 Giorgia Valenti Valenti Valentigiorgia@virgilio.it 340 128 8815 02.01.2026 05.01.2026 1 3 8,16,17 Peonia,Lavendula,Fenice Übernachtung it Mobile (384 x 703 px) -- -- Yes
97 Michela Noris NORIS mnoris71@gmail.com +393460111365 29.12.2025 01.01.2026 2 0 Forsythia,Bellis Übernachtung it Mobile (375 x 633 px) frau Italy Yes
98 Cristina Axinia Cristinaaxinia11a@gmail.com +393473439538 03.01.2026 06.01.2026 2 2 13,17 Lavendula Halbpension it Mobile (402 x 789 px) frau Italy Yes
99 anna lastrucci lastruccianna4@gmail.com 3923827691 02.01.2026 06.01.2026 6 0 Peonia,Forsythia Halbpension it Mobile (320 x 587 px) frau Italy Yes
100 Cristian Mariotti cristianmariotti2@gmail.com 3389332607 24.12.2025 28.12.2025 2 2 13,15 Peonia Halbpension it Mobile (423 x 840 px) herr Italy Yes
101 silvia Lionello silvia.lionello10@gmail.com 340 395 0522 24.12.2025 30.12.2025 2 1 15 Forsythia Übernachtung it Mobile (360 x 678 px) frau Italy Yes
102 Gaetano Gramano Ggramano@gmail.com 3935777775 06.12.2025 08.12.2025 2 2 2,4 Halbpension it Mobile (393 x 576 px) herr -- Yes
103 Alessia Carroccia alessiacarroccia@gmail.com 3298046700 27.12.2025 03.01.2026 2 1 8 Lavendula Halbpension it Mobile (430 x 753 px) frau -- Yes
104 Domenico Perotti amministrazione@squadracredit.com 3476351869 30.12.2025 05.01.2026 2 1 14 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (411 x 655 px) herr Italy Yes
105 daniele dell uomo daniele.delluomo@gmail.com 3475953749 01.01.2026 04.01.2026 2 2 7,11 Halbpension it Desktop (1887 x 924 px) herr -- Yes
106 daniele dell uomo daniele.delluomo@gmail.com 3475953749 01.01.2026 04.01.2026 2 2 7,11 Halbpension it Desktop (1887 x 924 px) herr Italy Yes
107 Davis Fabbi Da.da2003@yahoo.it 3483637094 29.08.2025 31.08.2025 2 1 7 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 726 px) herr -- Yes
108 Rosa Picchi Rosapicchi@tiscali.it 3356482246 16.08.2025 23.08.2025 2 0 Forsythia,Bellis Halbpension it Desktop (785 x 312 px) frau Italy Yes
109 david pesaresi david_pesaresi@yahoo.it 3347022863 18.08.2025 22.08.2025 2 3 4,9,11 Übernachtung mit Frühstück it Mobile (411 x 770 px) herr Italy Yes
110 Lara Malpezzi laramalpezzi4@gmail.com 3348488560 10.08.2025 16.08.2025 2 0 Loft Halbpension it Mobile (384 x 735 px) frau -- Yes
111 Patrizia Tredici tredicipatrizia@gmail.com 24.08.2025 26.08.2025 2 0 Halbpension it Mobile (392 x 739 px) frau -- Yes
112 Flori Kuka florikuka86@gmail.com 3801006603 11.08.2025 16.08.2025 2 2 5,15 Peonia Übernachtung mit Frühstück it Mobile (320 x 585 px) herr Italy Yes
113 Agnese Carnevali federicomartina73@gmail.com 3471196161 16.08.2025 23.08.2025 2 3 11,14,17 Peonia Halbpension it Mobile (423 x 846 px) frau -- Yes
114 LUCA Marcato lucamarcato490@gmail.com +393283469417 08.09.2025 10.09.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (360 x 667 px) herr Italy Yes
115 Alessandro Camoletti a.camoletti@gmail.com 3762096182 02.01.2026 06.01.2026 3 0 Fenice Übernachtung it Desktop (1024 x 696 px) herr Italy Yes
116 Paolo Mariani Paolo.mariani@casbot.com 3420853374 12.08.2025 21.08.2025 2 0 Peonia Halbpension it Mobile (360 x 627 px) herr Italy Yes
117 Daniele Paiano Direzione@idea-vision.it 11.08.2025 24.08.2025 2 0 Forsythia Übernachtung mit Frühstück it Mobile (375 x 546 px) herr Italy Yes
118 Enrico Breda Enrico@visibilia.net 27.06.2025 30.06.2025 4 0 Peonia,Lavendula,Fenice Übernachtung it Mobile (440 x 655 px) herr -- Yes
119 Marco Predieri Predieri Famigliapredieri@gmail.com 3397810676 05.12.2025 08.12.2025 2 0 Forsythia Übernachtung mit Frühstück it Mobile (360 x 691 px) herr Italy Yes
120 Silvia Pistilli silviapistilli@yahoo.it 4384221774 20.07.2025 27.07.2025 3 0 Peonia Halbpension it undefined frau Italy Yes
121 Monica Pini moni.pini76@gmail.com 20.08.2025 27.08.2025 2 0 Forsythia Halbpension it Mobile (384 x 700 px) frau -- Yes
122 Francesco Martinelli fmartinelli1976@gmail.com 09.08.2025 16.08.2025 2 1 17 Peonia,Lavendula,Fenice,Forsythia Übernachtung it Mobile (360 x 676 px) herr -- Yes
123 Federica Ripiccini Ripiccini_federica@hotmail.com 3397429694 09.08.2025 16.08.2025 2 1 12 Halbpension it Mobile (414 x 706 px) frau Italy Yes
124 domenico demaria domenicodemaria610@gmail.com 3341305718 10.08.2025 17.08.2025 2 0 Forsythia Halbpension it Desktop (1349 x 615 px) herr Italy Yes
125 Angela Ignomeriello Ignomerielloa@gmail.com 3336378567 26.07.2025 31.07.2025 2 0 Loft Übernachtung mit Frühstück it Mobile (320 x 575 px) frau Italy Yes
126 Camelia Bogdan Cameliabogdan0@gmail.com 3469494585 05.07.2025 12.07.2025 2 0 Fenice Halbpension it Mobile (360 x 663 px) frau Italy Yes
127 Carlo Consani c.consani1@gmail.com 3333015899 16.08.2025 23.08.2025 2 0 Loft Übernachtung mit Frühstück it Mobile (384 x 708 px) herr Italy Yes
128 Mirko Angeli mirko2675@gmail.com 3388567415 17.08.2025 24.08.2025 2 0 Forsythia,Bellis Halbpension it Mobile (411 x 790 px) herr Italy Yes
129 Katia Masciulli Masciullikatia1977@gmail.com 28.12.2025 04.01.2026 6 2 11,16 Halbpension it Desktop (834 x 1087 px) frau -- Yes
130 Elena Onofrei oelena7@gmail.com 06.02.2026 08.02.2026 2 1 8 Loft Übernachtung it Mobile (360 x 653 px) frau Italy Yes
131 Luca Asteggiano asteluca82@gmail.com 3395692025 02.01.2026 05.01.2026 2 2 8,12 Lavendula Halbpension it Mobile (360 x 667 px) herr Italy Yes
132 Alessia Bignù alex.down.the.rabbit.hole@gmail.com 3516221506 20.12.2025 01.01.2026 2 2 13,17 Übernachtung mit Frühstück it Mobile (411 x 780 px) frau Italy Yes
133 maura dagnino Dagnino Mauradagnino@libero.it 3403815344 28.11.2025 30.11.2025 2 2 8,11 Übernachtung it Mobile (320 x 631 px) frau -- Yes
134 Robert Nitschke robert.nitschke@gmx.net 017624694617 13.02.2026 17.02.2026 2 2 2,6 Loft,Peonia,Lavendula,Fenice,Forsythia Übernachtung de Mobile (393 x 665 px) herr Germany Yes
135 Carloalberto Molina molinacala@libero.it 29.12.2025 03.01.2026 2 2 1,8 Halbpension it Mobile (392 x 739 px) herr Italy Yes
136 Paola De Carlo Decarlopaola@gmail.com 27.11.2025 27.12.2025 4 2 7,11 Peonia Halbpension it Mobile (402 x 677 px) frau -- Yes
137 Gabriele Dr.Matuschek-Grohmann gabriele@dr-matuschek-grohmann.de 02615791416 01.09.2025 10.09.2025 2 0 Peonia Übernachtung mit Frühstück de Mobile (430 x 739 px) frau Germany Yes
138 Erica Biondi Ericabiondi77@gmail.com 349 1560995 11.08.2025 18.08.2025 5 0 Loft,Lavendula Halbpension it Mobile (414 x 608 px) frau Italy Yes
139 Giuseppe Piovesan piovesang26@gmail.com 3476676922 03.08.2025 10.08.2025 2 0 Forsythia Halbpension it Mobile (384 x 733 px) herr Italy Yes
140 Anna Mandolini anna.mandolini57@gmail.com 3404039103 21.07.2025 27.07.2025 2 0 Forsythia Halbpension it Mobile (360 x 655 px) frau Italy Yes
141 Paola Passarin pabli2580@gmail.com 26.12.2025 04.01.2026 2 2 3,8 Lavendula Übernachtung it Mobile (384 x 727 px) frau -- Yes
142 Francesco Valente Francescovalente@ymail.com 3204988031 02.08.2025 09.08.2025 2 0 Loft,Forsythia,Bellis Übernachtung mit Frühstück it Mobile (393 x 651 px) herr -- Yes
143 dumitrita bocancea terenti ionterenti@gmail.com 351887634 06.08.2025 10.08.2025 2 1 0 Bellis Halbpension it Mobile (360 x 680 px) herr Italy Yes
144 Antonio Vannacci Vannacci antonio.vannacci@gmail.com 3394942185 26.07.2025 01.08.2025 3 0 Fenice Halbpension it Mobile (360 x 661 px) herr Italy Yes
145 Elisa Lore Elisaaaaa@gmail.com 28.06.2025 03.07.2025 2 3 10,13,16 Halbpension it Mobile (390 x 663 px) frau -- Yes
146 Marco Lovino marcolovino17@gmail.com 3333677558 11.08.2025 14.08.2025 2 1 7 Halbpension it Mobile (384 x 731 px) herr -- Yes
147 Andrea Meini falle.gname.72@gmail.com 3495618372 21.07.2025 28.07.2025 2 0 Fenice Halbpension it undefined herr -- Yes
148 Enzo Sberna enzosberna@libero.it 01.08.2025 08.08.2025 2 0 Bellis Halbpension it Mobile (320 x 551 px) herr Italy Yes
149 Paolo Antonucci Palletto@gmail.com 10.08.2025 20.08.2025 2 1 8 Halbpension it Mobile (384 x 705 px) -- -- Yes
150 Davis Fabbi Da.da2003@yahoo.it 3483637094 06.09.2025 08.09.2025 2 1 7 Halbpension it Mobile (384 x 726 px) -- -- Yes
151 Arianna Taffetani Arytaffi90@gmail.com +393398430571 23.12.2025 28.12.2025 2 6 2,3,5,9,14,14 Loft Halbpension it Mobile (393 x 596 px) frau Italy Yes
152 Vittoria Sicolo Vittoria.sicolo@icloud.com +393892521295 30.12.2025 03.01.2026 2 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (393 x 658 px) frau Italy Yes
153 Vittoria Sicolo Vittoria.sicolo@icloud.com +393892521295 30.12.2025 03.01.2026 2 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (393 x 658 px) frau Italy Yes
154 Elisa Galassi Eliga84@gmail.com 3402539330 05.12.2025 08.12.2025 2 2 8,11 Peonia,Lavendula,Fenice Halbpension it Mobile (390 x 776 px) frau Italy Yes
155 Hazel Silvia Massone hazel.massone@gmail.com 03925081848 18.08.2025 22.08.2025 2 2 12,14 Lavendula Übernachtung mit Frühstück en Desktop (1521 x 730 px) frau Italy Yes
156 .lanfredi Rachele Lanfredi Lanfredi.rachele@gmail.com 348 865 4218 20.06.2025 30.09.2025 4 0 Peonia Übernachtung it Mobile (360 x 653 px) frau Italy Yes
157 Roberta Piron robertapiron@gmail.com 3470906155 14.07.2025 21.07.2025 2 1 14 Peonia Halbpension it Mobile (360 x 668 px) -- Italy Yes
158 Barbara Magliani barbara.magliani@gmail.com 30.06.2025 06.07.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (384 x 681 px) -- Italy Yes
159 Davide Montanari davide.montanari72@gmail.com 24.08.2025 31.08.2025 2 1 16 Lavendula Übernachtung it Mobile (686 x 965 px) -- -- Yes
160 Franca Gravano franca.asia@yahoo.it 069278163 29.08.2025 06.09.2025 2 0 Halbpension it Mobile (392 x 739 px) frau Italy Yes
161 Alberto Gandini Alby.gandy@gmail.com +393387032435 23.08.2025 30.08.2025 4 0 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (384 x 726 px) herr Italy Yes
162 Prof. Wolfhard Cappel wolfhard.cappel@t-online.de 01624782205 31.05.2025 11.06.2025 2 0 Loft Übernachtung de Desktop (1382 x 980 px) herr Germany Yes
163 Gayan Msdurapperuma Madurapperuma gsgayan@gmail.com 3881033320 27.12.2025 30.12.2025 2 2 8,12 Peonia,Lavendula Halbpension it Mobile (411 x 504 px) herr -- Yes
164 Katharina Campe k.campe@t-online.de +491719322029 13.09.2025 20.09.2025 2 0 Forsythia Übernachtung de Desktop (1468 x 711 px) frau Germany Yes
165 Luca Zottin zottinluca04@gmail.com 3334234743 11.07.2025 13.07.2025 2 0 Loft Übernachtung mit Frühstück it Mobile (390 x 663 px) herr Italy Yes
166 Elena Razza elena.razza@libero.it 3480316800 04.07.2025 07.07.2025 3 0 Lavendula Übernachtung mit Frühstück it Desktop (1521 x 703 px) frau Italy Yes
167 Ombretta Benattii ombrettabenatti74@gmail.com 3496723430 09.08.2025 17.08.2025 3 1 15 Peonia,Lavendula,Fenice Übernachtung it Mobile (392 x 512 px) frau Italy Yes
168 Nazzarena Ioannucci nenaioannucci@gmail.com 3493675124 31.08.2025 06.09.2025 2 0 Forsythia Halbpension it Mobile (414 x 706 px) frau Italy Yes
169 Emanuele Capozzi capozziemanuele27@gmail.com 3383051766 17.08.2025 24.08.2025 2 2 12,15 Peonia,Fenice Übernachtung it Mobile (360 x 668 px) herr Italy Yes
170 Gabriele Mansour Manfadi4@gmail.com 388 169 0894 28.07.2025 02.08.2025 2 1 5 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (368 x 771 px) herr -- Yes
171 Marco Quadrelli soniacesaretti73@libero.it 3389783613 27.07.2025 04.08.2025 5 0 Fenice Halbpension it Mobile (360 x 691 px) herr -- Yes
172 Barbara Serragli Serragli barbaratiare3@gmail.com 05.12.2025 08.12.2025 2 1 13 Peonia Übernachtung mit Frühstück it Mobile (411 x 682 px) frau Italy Yes
173 Marco D'EMILIO mardem76@gmail.com 20.09.2025 27.09.2025 2 4 9,10,15,17 Fenice Halbpension it Mobile (384 x 705 px) herr Italy Yes
174 Marina D'Este d.este.mary@gmail.com 02.10.2025 09.10.2025 2 0 Halbpension it Mobile (392 x 740 px) frau -- Yes
175 Marina D'Este d.este.mary@gmail.com 02.10.2025 09.10.2025 2 0 Übernachtung it Mobile (392 x 740 px) frau Italy Yes
176 paola Bosco paola.bosco@policlinico.mi.it 13.09.2025 16.09.2025 2 0 Peonia,Lavendula Übernachtung it Mobile (600 x 806 px) frau Italy Yes
177 Davide Bonello davide_bonello@libero.it +393294139937 07.03.2026 14.03.2026 2 1 3 Peonia Übernachtung it Mobile (360 x 589 px) herr -- Yes
178 Micaela Mostacci Micaela.mostacci@gmail.com 3382615080 21.02.2026 28.02.2026 2 2 8,15 Halbpension it Mobile (440 x 764 px) frau -- Yes
179 Flavia Barattini flavia.barattini28@gmail.com 12.08.2025 19.08.2025 2 1 15 Lavendula Übernachtung mit Frühstück it Mobile (360 x 659 px) frau Italy Yes
180 Jacopo Giannoni Jacopo.giannoni@hotmail.it +393357727375 06.08.2025 09.08.2025 2 0 Bellis Halbpension it Mobile (411 x 783 px) herr -- Yes
181 ANNA Fiorenzo Annafiorenzo@gmail.com 320484241 18.08.2025 23.08.2025 2 2 10,16 Halbpension it Mobile (384 x 600 px) -- -- Yes
182 Valentina Zanframundo Vale@tallo.eu 3480340348 16.08.2025 23.08.2025 2 4 3,5,6,10 Übernachtung it Mobile (360 x 653 px) frau Italy Yes
183 Max Bernardini bernamax.555@gmail.com 3462152149 14.08.2025 17.08.2025 2 1 12 Fenice Übernachtung mit Frühstück it Mobile (320 x 511 px) herr Italy Yes
184 Sara Baroni sarabaronima@gmail.com 3455876868 09.08.2025 16.08.2025 2 1 9 Übernachtung it Mobile (360 x 660 px) frau Italy Yes
185 Roberto Marchesoli robe.marche@gmail.com 334 343 4357 03.08.2025 10.08.2025 3 0 Übernachtung it Mobile (392 x 740 px) herr Italy Yes
186 Daniela Mercante danielamercante@gmail.com 328 133 6726 11.08.2025 18.08.2025 4 4 7,7,11,14 Peonia,Lavendula Übernachtung mit Frühstück it Mobile (384 x 704 px) frau Italy Yes
187 Daniela Mercante danielamercante@gmail.com 328 133 6726 11.08.2025 18.08.2025 4 4 7,7,11,14 Lavendula Übernachtung mit Frühstück it Mobile (384 x 704 px) frau Italy Yes
188 Domenico De Santis 2d.desantis@gmail.com 3316655319 10.08.2025 16.08.2025 7 0 Lavendula,Fenice Übernachtung mit Frühstück it Mobile (360 x 553 px) herr -- Yes
189 Francesco Scaccia sca.france@hotmail.it 26.07.2025 02.08.2025 2 2 0,4 Peonia,Lavendula,Fenice Halbpension it Mobile (376 x 701 px) herr Italy Yes
190 Paola Zanesi Paola.zanesi81@gmail.com 17.08.2025 21.08.2025 5 2 6,10 Peonia,Lavendula,Fenice Halbpension it Mobile (393 x 673 px) frau Italy Yes
191 Elena Martini Martjn76@gmail.com +393476436905 10.08.2025 15.08.2025 2 1 8 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 653 px) frau Italy Yes
192 Martina Marchetti martina_marchetti@hotmail.it 3492563144 25.08.2025 27.08.2025 2 1 1 Lavendula,Fenice,Forsythia Halbpension it Mobile (360 x 673 px) frau Italy Yes
193 Massimo Lattanzi xmax.lattanzi@libero.it 3929114256 08.09.2025 12.09.2025 3 0 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (360 x 668 px) herr Italy Yes
194 Massimo Lattanzi xmax.lattanzi@libero.it 3929114256 08.09.2025 12.09.2025 3 0 Lavendula Halbpension it Mobile (360 x 571 px) herr Italy Yes
195 Iuliana Soroceanu irsoroceanu@gmail.com 26.07.2025 28.07.2025 2 0 Bellis Halbpension it Mobile (411 x 800 px) frau -- Yes
196 Chiara Gandossi gandossi.chiara@libero.it 3294415567 17.08.2025 23.08.2025 2 1 13 Lavendula,Fenice Halbpension it Mobile (411 x 771 px) frau -- Yes
197 Chiara Caglio chiara.caglio@libero.it 11.08.2025 15.08.2025 4 1 13 Übernachtung mit Frühstück it Mobile (390 x 663 px) frau -- Yes
198 Sara Valbonesi saravalbonesi@hotmail.it 14.08.2025 17.08.2025 2 3 8,9,11 Übernachtung mit Frühstück it Mobile (360 x 673 px) frau Italy Yes
199 Roberta Santacecilia Santacecilia robertasantacecilia@gmail.com +39348 04.08.2025 08.08.2025 2 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung mit Frühstück it Mobile (360 x 678 px) frau -- Yes
200 Orietta Sacchetto Orietta.sacchetto@me.com 3393113587 18.07.2025 20.07.2025 2 1 12 Halbpension it Mobile (414 x 718 px) frau Italy Yes
201 Giulia Rocca giuliarocca1970@gmail.com 3409226740 09.08.2025 16.08.2025 2 0 Peonia,Lavendula,Fenice,Forsythia Übernachtung it Mobile (360 x 653 px) frau -- Yes
202 Daniela Mazzitelli Mazzi84@inwind.it 3496436906 18.08.2025 25.08.2025 2 1 3 Lavendula Halbpension it Mobile (384 x 671 px) frau Italy Yes
203 Paola Bartocci paolavoliamo@virgilio.it 3475736848 21.07.2025 28.07.2025 2 0 Halbpension it Mobile (360 x 647 px) frau Italy Yes
204 Simone Croce crocesimone@gmail.com 15.08.2025 22.08.2025 2 2 4,8 Peonia,Lavendula,Fenice,Forsythia Übernachtung mit Frühstück it Mobile (392 x 739 px) -- -- Yes
205 Stefania Pietrangeli Stefania_pie@yahoo.it +393497879667 16.08.2025 23.08.2025 2 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung mit Frühstück it Mobile (360 x 653 px) frau Italy Yes
206 valeria magrino valeire@hotmail.it 3935657931 13.09.2025 20.09.2025 2 2 1,9 Lavendula Halbpension it Desktop (1585 x 731 px) frau Italy Yes
207 Simone Croce crocesimone@gmail.com 15.08.2025 22.08.2025 2 2 4,8 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (392 x 739 px) herr -- Yes
208 Luca Zottin zottinluca04@gmail.com 3334234743 11.07.2025 13.07.2025 2 0 Loft,Lavendula,Forsythia Übernachtung mit Frühstück it Mobile (390 x 663 px) herr Italy Yes
209 Gabriella Saronni sa.gabri@libero.it 3495866827 10.08.2025 17.08.2025 3 0 Peonia,Lavendula Übernachtung it Mobile (414 x 699 px) frau Italy Yes
210 luca zottin zottinluca04@gmail.com 11.07.2025 13.07.2025 2 0 Loft,Lavendula,Forsythia Übernachtung mit Frühstück it Mobile (390 x 663 px) herr Italy Yes
211 Sara Forti forti.sara@libero.it 09.08.2025 16.08.2025 2 1 6 Fenice Übernachtung it Mobile (411 x 783 px) -- -- Yes
212 Jens Winkelmann skyline_84@web.de 18.07.2026 28.07.2026 2 1 12 Peonia,Lavendula,Fenice Halbpension de Mobile (402 x 714 px) herr Germany Yes
213 Marco Provenzi Marcoprovenzi@alice.it 3383330586 07.06.2025 12.06.2025 3 1 1 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung it Desktop (1080 x 704 px) herr Italy Yes
214 Hazel Mass hazel.massone@gmail.com 3925981848 19.08.2025 23.08.2025 2 2 11,13 Fenice Übernachtung mit Frühstück en Mobile (384 x 656 px) frau -- Yes
215 Stefania Martella stefimart9@gmail.com 3471161198 27.12.2025 03.01.2026 4 3 10,14,14 Lavendula,Forsythia Halbpension it Mobile (360 x 667 px) -- -- Yes
216 Andrea Mazzer andrea.mazzer88@gmail.com 349 539 4720 31.12.2025 04.01.2026 2 2 6,8 Halbpension it Mobile (390 x 663 px) herr Italy Yes
217 Liliana Alexeeva Liliana.alexeeva@gmail.com 39 3409972074 21.12.2025 26.12.2025 2 0 Fenice Übernachtung mit Frühstück it Mobile (411 x 721 px) frau Italy Yes
218 MASSIMO MOCCI maxmocci61@gmail.com 3295380005 01.08.2026 10.08.2026 2 0 Fenice,Forsythia Übernachtung mit Frühstück it Desktop (1905 x 953 px) herr Italy Yes
219 Simona Reina simona.reina1985@gmail.com 3471345714 12.12.2025 13.12.2025 2 0 Peonia Halbpension it Mobile (360 x 668 px) frau -- Yes
220 Tatiana Ballarino Tatianaballarino@hotmail.it +393290126388 30.12.2025 04.01.2026 4 3 0,2,3 Halbpension it Mobile (390 x 570 px) frau Italy Yes
221 Elisa Pini elisapini1@gmail.com 29.08.2025 31.08.2025 2 1 7 Lavendula,Fenice Übernachtung mit Frühstück it Mobile (360 x 648 px) frau -- Yes
222 Elisa Canini artelisa79@hotmail.com 3349207514 24.11.2025 30.11.2025 2 0 Forsythia Übernachtung mit Frühstück it Mobile (360 x 649 px) frau San Marino Yes
223 Lidia Ciuraru Ciursru lidiaanaciuraru@gmail.com 3207242313 24.12.2025 28.12.2025 4 4 3,3,6,16 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 668 px) frau Italy Yes
224 Francesca Calogiuri Francescacalogiuri@hotmail.com 3401765276 08.08.2026 19.08.2026 2 2 3,8 Peonia,Lavendula,Fenice Halbpension it Mobile (440 x 774 px) frau Italy Yes
225 Alice Lazzeri alicelazzeri@libero.it 3294643748 29.12.2025 05.01.2026 2 1 14 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (393 x 576 px) frau -- Yes
226 Lorenzo Fosca Fosca2002@libero.it +39 335 849 0091 16.08.2025 23.08.2025 2 0 Übernachtung mit Frühstück it Mobile (384 x 705 px) herr -- Yes
227 Giovanni Pilla giopilla86@gmail.com 21.08.2025 24.08.2025 2 0 Bellis Halbpension it Mobile (390 x 777 px) herr -- Yes
228 luigi nicolini nicoliniluigi@hotmail.it 3466240846 06.09.2025 13.09.2025 2 0 Forsythia Übernachtung it Mobile (360 x 604 px) herr Italy Yes
229 Leonardo RICCIARELLI Leonardoricciarelli@gmail.com 3476218658 17.08.2025 20.08.2025 2 0 Forsythia Übernachtung it Mobile (360 x 678 px) herr Italy Yes
230 Leonardo RICCIARELLI Leonardoricciarelli@gmail.com 3476218658 17.08.2025 20.08.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (360 x 678 px) herr Italy Yes
231 Alessandro Cocchi allecocchi@hotmail.it 3492810231 08.09.2025 11.09.2025 2 2 0,3 Peonia,Lavendula,Fenice Halbpension it Mobile (390 x 655 px) herr Italy Yes
232 Sara De Cesco Saradecesco1@gmail.com 17.08.2025 24.08.2025 3 1 14 Übernachtung it Mobile (390 x 655 px) -- -- Yes
233 Mirka Baiardi mirkabaiardi@yahoo.it 3469674768 20.07.2025 24.07.2025 2 1 17 Übernachtung mit Frühstück it Mobile (360 x 664 px) frau Italy Yes
234 Cangini Beatrice bea.cangini@gmail.com +393385850986 03.08.2025 10.08.2025 2 2 11,17 Fenice Halbpension it Mobile (360 x 616 px) frau Italy Yes
235 Susanna Sozzi sozzisusanna@gmail.com 349 210 0236 05.07.2025 12.07.2025 4 0 Peonia Halbpension it Mobile (384 x 729 px) frau Italy Yes
236 Italo Ferrari cilix028@gmail.com 3470853989 11.08.2025 18.08.2025 2 0 Loft,Forsythia,Bellis Halbpension it Mobile (384 x 726 px) herr Italy Yes
237 Sara Rottini sara.rottini@hotmail.it 3332252085 21.08.2025 28.08.2025 2 1 1 Forsythia,Bellis Übernachtung it Mobile (360 x 663 px) frau Italy Yes
238 Massimo Taroni massimotaroni65@gmail.com 3791415848 04.07.2025 07.07.2025 2 0 Lavendula,Fenice,Forsythia Halbpension it Mobile (432 x 816 px) herr Italy Yes
239 alessia proietti alessiapro77@gmail.com 391 485 3388 13.07.2025 20.07.2025 3 1 12 Fenice Halbpension it Mobile (360 x 691 px) frau Italy Yes
240 Laura Salvucci laurasalvucci@hotmail.it 24.08.2025 31.08.2025 2 2 9,11 Loft,Lavendula,Fenice Halbpension it Mobile (384 x 698 px) frau Italy Yes
241 Enrico Cavallucci ecavallucci@libero.it 01.07.2025 06.07.2025 3 1 11 Fenice Übernachtung it Mobile (411 x 765 px) herr -- Yes
242 Magda De vanna Magdadevanna@libero.it 3494105942 16.08.2025 23.08.2025 2 1 2 Forsythia Halbpension it Mobile (360 x 665 px) frau -- Yes
243 Anita Bevilacqua bevilacquaanita@gmail.com 16.08.2025 23.08.2025 2 1 2 Peonia,Lavendula,Fenice,Forsythia Übernachtung it Mobile (375 x 625 px) frau -- Yes
244 Fabiola Giffoni F.giffonifabiola@gmail.com 3386570888 07.07.2025 14.07.2025 2 2 2,9 Peonia,Lavendula,Fenice Halbpension it Mobile (440 x 759 px) frau -- Yes
245 Marco Provenzi Marcoprovenzi@alice.it 3383330586 07.06.2025 12.06.2025 2 0 Lavendula,Fenice,Forsythia Übernachtung it Desktop (1080 x 704 px) herr Italy Yes
246 Sabrina Meli sabriturris@gmail.com +393282863597 11.08.2025 16.08.2025 2 1 10 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 731 px) frau -- Yes
247 Alessandra Faliva Faliva Gian.ale@alice.it 3495019535 19.07.2025 26.07.2025 2 1 15 Halbpension it Mobile (432 x 862 px) -- Italy Yes
248 mirka baiardi mirkabaiardi@yahoo.it 3469674768 20.07.2025 24.07.2025 2 1 17 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Desktop (1513 x 786 px) frau Italy Yes
249 Elisabetta Ravasi Elisabetta.ravasi@sappi.com IT +393455131145 30.08.2025 06.09.2025 2 0 Übernachtung mit Frühstück it Mobile (393 x 643 px) frau Italy Yes
250 Roberta Bolognesi robertabolognesi@icloud.com 02.08.2025 09.08.2025 7 1 3 Halbpension it Mobile (393 x 658 px) frau -- Yes
251 Felice Lustrissimi felicelustri@tiscali.it 3282744961 19.07.2025 26.07.2025 2 1 15 Übernachtung mit Frühstück it Mobile (414 x 703 px) herr Italy Yes
252 Elisa Franzini Franzini Elisa.franzi77@gmail.com 3406459744 14.08.2025 17.08.2025 2 3 6,11,13 Übernachtung mit Frühstück it Mobile (428 x 759 px) frau Italy Yes
253 Luca Mambrini daybyday2007@hotmail.it 13.08.2025 20.08.2025 2 0 Forsythia Übernachtung it Mobile (440 x 760 px) herr Italy Yes
254 Elisa Franzini elisa.franzi77@gmail.com 3406459744 14.08.2025 17.08.2025 2 3 6,11,13 Übernachtung mit Frühstück it Mobile (428 x 744 px) frau Italy Yes
255 Flavia mercadante/ascani Mercadante Ascani Ascani.flavia@gmail.com 3383705561 11.08.2025 16.08.2025 2 0 Loft,Forsythia Halbpension it Mobile (428 x 856 px) frau -- Yes
256 Rosa Galdieri Rosa.1709@libero.it 3395471194 12.08.2025 14.08.2025 2 2 3,4 Lavendula Halbpension it Mobile (360 x 678 px) frau Italy Yes
257 Ester caserio estercaser@gmail.com 339 805 5859 17.08.2025 22.08.2025 2 3 3,6,13 Halbpension it Mobile (430 x 731 px) frau Italy Yes
258 Chiara IANNIELLO chiara.ianniello@gmail.com 3929402169 17.08.2025 24.08.2025 2 2 8,10 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 603 px) frau Italy Yes
259 Chiara Bernabucci chiarabernabucci1@gmail.com +393498482965 23.08.2025 27.08.2025 2 0 Forsythia Übernachtung it Mobile (393 x 658 px) frau -- Yes
260 Luca Manfredini lucamanfredini89@libero.it 17.08.2025 21.08.2025 2 0 Forsythia,Bellis Halbpension it Mobile (384 x 721 px) herr Italy Yes
261 Gimmi Longo gimmilongo@gmail.com 392 299 9016 23.08.2025 29.08.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (360 x 667 px) herr Italy Yes
262 paola floris paulaflo@tiscali.it 3403309928 27.12.2025 03.01.2026 4 1 4 Halbpension it Mobile (360 x 678 px) frau Italy Yes
263 Laura Sacco laurasacco9@gmail.com 3881783486 19.08.2025 26.08.2025 4 2 0,2 Loft Halbpension it Mobile (392 x 743 px) frau Italy Yes
264 Andrea Crisafuli andreacrisafuli46@hotmail.com 21.06.2025 23.06.2025 2 2 7,10 Übernachtung mit Frühstück it Desktop (1265 x 639 px) herr -- Yes
265 Roberta Bolofnesi robertabolognesi@icloud.com 02.08.2025 09.08.2025 7 1 3 Halbpension it Mobile (393 x 658 px) -- -- Yes
266 Andrea Martino andrea.martino89@hotmail.it 3201135544 20.08.2025 30.08.2025 2 1 1 Halbpension it Mobile (360 x 668 px) herr Italy Yes
267 Luca Modafferi lmodafferi@libero.it 28.07.2025 03.08.2025 2 1 0 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 650 px) herr -- Yes
268 Cristina Mandelli Pulce73.cm@gmail.com 3922673165 08.08.2026 22.08.2026 2 1 16 Peonia Übernachtung it Mobile (411 x 778 px) frau Italy Yes
269 Lucia Visintin Luciavisintin@libero.it 3394268406 12.09.2025 15.09.2025 2 0 Forsythia Halbpension it Mobile (384 x 725 px) frau Italy Yes
270 Davide Gennari Davide.gennari.64@gmail.com 3286482900 09.08.2026 16.08.2026 4 1 14 Lavendula Übernachtung it Mobile (360 x 653 px) herr Italy Yes
271 Luca Saracca Lucas.1978@hotmail.it 3397191581 26.12.2025 29.12.2025 2 2 1,7 Forsythia Halbpension it Mobile (369 x 724 px) herr Italy Yes
272 Marta Pettenò Martap80@libero.it 14.08.2025 17.08.2025 2 1 14 Halbpension it Mobile (411 x 697 px) frau -- Yes
273 Alessio Ridolfi ridocr74@gmail.com 3313758106 25.08.2025 30.08.2025 2 0 Lavendula,Fenice,Forsythia Halbpension it Mobile (390 x 657 px) herr Italy Yes
274 Katy Vitorbi Katia.vitorbi79@gmail.com 3402264803 18.08.2025 23.08.2025 2 2 5,8 Peonia Halbpension it Mobile (320 x 531 px) frau Italy Yes
275 Alessandra De luca aledeluca8576@gmail.com 350 181 4305 17.08.2025 24.08.2025 2 3 6,11,12 Fenice Halbpension it Mobile (360 x 410 px) frau Italy Yes
276 Barbara Tieri btieri@gmail.com 3282121541 19.08.2025 21.08.2025 2 1 10 Halbpension it Mobile (393 x 673 px) frau Italy Yes
277 Barbara Tieri btieri@gmail.com 3282121541 19.08.2025 21.08.2025 2 1 10 Halbpension it Mobile (393 x 673 px) frau Italy Yes
278 eugen sandor sandor lianapaulasandor@yahoo.it 3405481688 15.08.2025 17.08.2025 2 1 12 Fenice Halbpension it Mobile (390 x 580 px) herr Italy Yes
279 Salvatore Tulumello tulumellosalvatore@virgilio.it 3383260038 16.08.2025 20.08.2025 2 0 Bellis Halbpension it Mobile (392 x 739 px) herr Italy Yes
280 Laura Levati lauraaragon0@gmail.com 18.08.2025 25.08.2025 4 2 2,4 Halbpension it Mobile (414 x 533 px) frau -- Yes
281 Mauro Cerasti antares.wlz@gmail.com 3474014445 23.08.2025 30.08.2025 2 2 12,14 Halbpension it Mobile (411 x 763 px) herr -- Yes
282 Salvatore Spagnolo spagnosalva13@gmail.com 3283040182 18.08.2025 22.08.2025 2 0 Übernachtung it Mobile (384 x 697 px) herr Italy Yes
283 Enrico Maria Sala Enricomaria.sala@gmail.com 3496283936 17.08.2025 23.08.2025 2 1 10 Halbpension it Mobile (360 x 616 px) herr -- Yes
284 Matteo Pierleoni Matteo.pierleoni@gmail.com 29.08.2025 31.08.2025 2 1 1 Peonia,Lavendula,Fenice,Forsythia Übernachtung it Mobile (402 x 677 px) herr Italy Yes
285 Martina Imberti Imberti Imberti.martina@gmail.com 3453398717 09.08.2026 16.08.2026 4 2 1,4 Übernachtung it Mobile (393 x 658 px) -- -- Yes
286 Davis Fabbi Da.da2003@yahoo.it 3483637094 29.08.2025 31.08.2025 2 1 7 Peonia Halbpension it Mobile (384 x 726 px) herr -- Yes
287 Vincenzo Melissari vincenzo.melissari@hotmail.it 20.08.2025 27.08.2025 2 1 1 Halbpension it Mobile (360 x 724 px) herr -- Yes
288 Turso Turso Stefi Stefiturso7@gmail.com 30.08.2025 05.09.2025 3 1 2 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 759 px) frau -- Yes
289 Gimmi Longo gimmilongo@gmail.com 392 299 9016 23.08.2025 29.08.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (360 x 667 px) herr Italy Yes
290 Andrea Carbognani Andreacarbognani1072@gmail.com 3391775255 18.08.2025 20.08.2025 2 2 10,14 Peonia Halbpension it Mobile (390 x 677 px) herr Italy Yes
291 Nicola Valbusa valbusanicola@gmail.com 3483592114 16.08.2025 22.08.2025 2 2 8,12 Übernachtung it Mobile (390 x 663 px) herr Italy Yes
292 johnny carnevale dittacarnevale@gmail.com 3337900230 27.08.2025 01.09.2025 2 1 12 Halbpension it Desktop (1351 x 607 px) herr Italy Yes
293 Karin Becker beckerkarin@hotmail.de 05.07.2025 08.07.2025 2 0 Übernachtung de Mobile (390 x 652 px) frau Germany Yes
294 Martina Maffessanti martimaffe@hotmail.com 3393460946 30.12.2025 03.01.2026 2 1 0 Übernachtung it Mobile (411 x 796 px) frau Italy Yes
295 Sara Zerbinati Zerbinati Sarazerbinati89@gmail.com 3334911170 14.02.2026 18.02.2026 2 2 4,7 Lavendula Übernachtung it Mobile (390 x 662 px) frau Italy Yes
296 Anna Filippitsch anna.filippitsch@gmail.com 15.10.2025 17.10.2025 2 0 Lavendula Übernachtung de Mobile (402 x 678 px) -- -- Yes
297 Chiara Di Emidio chiara.diemidio88@gmail.com 3280393016 25.07.2025 29.07.2025 2 2 4,5 Peonia Halbpension it Mobile (384 x 707 px) frau -- Yes
298 Fee Kandel fee.kandel@gmx.at 10.10.2025 12.10.2025 2 0 Übernachtung mit Frühstück de Mobile (402 x 678 px) frau Austria Yes
299 Lisa Mann Lisa.beth.mann@gmail.com 6033403983 04.08.2025 07.08.2025 4 2 6,8 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung mit Frühstück en Mobile (430 x 739 px) frau United States of America Yes
300 Edoardo Domenichini domenichiniedoardo@gmail.com 3348077427 31.12.2025 04.01.2026 6 3 4,4,4 Bellis Halbpension it Mobile (406 x 774 px) herr Italy Yes
301 Giuseppe Visicale Giuseppevisicale151@gmail.com 339 215 9919 23.12.2025 26.12.2025 2 1 6 Bellis Halbpension it Mobile (360 x 663 px) herr Italy Yes
302 Maddalena Cerroni madda.84@icloud.com 0863995248 14.06.2026 21.06.2026 4 5 2,2,5,5,10 Peonia,Lavendula Halbpension it Mobile (393 x 673 px) frau Italy Yes
303 Serena Benetti serena.benetti@gmail.com 27.12.2025 03.01.2026 2 1 5 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (411 x 785 px) frau -- Yes
304 Bruno Berselli bruno.berselli77@gmail.com 11.12.2025 14.12.2025 2 1 1 Halbpension it Desktop (1440 x 837 px) herr -- Yes
305 Andrea Cibin a.cibin@yahoo.com 3479170150 22.02.2026 26.02.2026 2 2 2,5 Peonia,Fenice Übernachtung mit Frühstück it Mobile (393 x 663 px) herr Italy Yes
306 Hans-Georg Döring hg.doering@t-online.de 016098927216 27.07.2025 02.08.2025 2 0 Loft,Peonia,Lavendula,Fenice Übernachtung mit Frühstück de undefined herr Germany Yes
307 Elena Batoni elebat72@gmail.com 3473794160 18.08.2025 22.08.2025 2 0 Loft,Forsythia Übernachtung it Mobile (392 x 715 px) frau Italy Yes
308 Giacomo Spelta Giacomospelta@libero.it 3355321619 13.07.2025 20.07.2025 2 2 9,12 Fenice Halbpension it Mobile (384 x 725 px) herr Italy Yes
309 Laura Andrelli leogala78@gmail.com 3665273432 20.07.2025 26.07.2025 2 2 8,14 Peonia,Lavendula,Fenice Halbpension it Mobile (375 x 740 px) frau -- Yes
310 Gianluca Mazza Gia.ma73@libero.it +39 328 081 7271 09.08.2025 16.08.2025 2 2 13,16 Halbpension it Mobile (390 x 769 px) herr Italy Yes
311 Raffaele Buscemi Rafbuscemi@gmail.com 28.07.2025 10.08.2025 2 2 2,3 Peonia,Lavendula,Fenice Halbpension it Mobile (390 x 655 px) herr Italy Yes
312 Gianfranco La torre gianfrancolatorre41@gmail.com 348 566 3035 04.08.2025 10.08.2025 2 0 Forsythia Halbpension it Mobile (360 x 667 px) herr Italy Yes
313 Marisa Galli marisapatrizia.galli@gmail.com 3427717487 19.09.2025 26.09.2025 2 0 Peonia Übernachtung it Mobile (392 x 743 px) frau -- Yes
314 Mauro Sapia rosamau.ice@gmail.com 3389233180 29.07.2025 07.08.2025 2 0 Übernachtung it Mobile (390 x 558 px) herr Italy Yes
315 Patrizia Barbiani Barbiani pbarbiani@gmail.com 3457660305 18.08.2025 24.08.2025 2 0 Halbpension it Mobile (375 x 740 px) frau Italy Yes
316 Silvia Kostopoulos Kostsilvia92@gmail.com 03.08.2025 08.08.2025 2 1 2 Loft,Peonia,Lavendula,Fenice,Forsythia Übernachtung mit Frühstück it Mobile (375 x 620 px) frau Italy Yes
317 Elisabetta Buldini elisabettabuldini@yahoo.it 3891128500 17.08.2025 23.08.2025 5 0 Peonia,Bellis Halbpension it Mobile (360 x 668 px) frau Italy Yes
318 Gianluca Bronzetti isabella.migliarini@gmail.com 3402262447 01.01.2026 05.01.2026 2 3 9,9,13 Halbpension it Mobile (384 x 733 px) -- -- Yes
319 Alessandro Zara alessandrozara@yahoo.it 347 324 8352 31.07.2025 03.08.2025 2 2 15,16 Fenice Übernachtung it Mobile (411 x 789 px) herr Italy Yes
320 Tiziana Perini Perini Tiziana.perini@libero.it 3334929271 09.08.2025 13.08.2025 2 2 10,16 Fenice Halbpension it Mobile (411 x 698 px) frau -- Yes
321 Viviana Magoga vivianamagoga@libero.it 333 583 1182 23.07.2025 25.07.2025 2 0 Bellis Halbpension it Mobile (384 x 721 px) frau Italy Yes
322 Milena Miccio kigio@hotmail.com 05.08.2025 14.08.2025 2 0 Bellis Halbpension it Mobile (384 x 717 px) frau Italy Yes
323 Federico Giovanardi kimon32@gmail.com 3473455279 07.08.2025 17.08.2025 2 2 12,14 Übernachtung it Mobile (360 x 560 px) herr Italy Yes
324 Alessia Pavani morinieleo@gmail.com 33160399388 16.08.2025 23.08.2025 2 2 10,12 Halbpension it Mobile (402 x 784 px) frau Italy Yes
325 Elisa Mercati Mercati Elisa27francesco@gmail.com 3898488735 24.08.2025 31.08.2025 2 2 4,11 Halbpension it Mobile (390 x 655 px) frau Italy Yes
326 Emanuele Caronia e.caronia@libero.it 3385058141 09.08.2025 23.08.2025 2 0 Übernachtung it Mobile (433 x 830 px) herr Italy Yes
327 Gianpaolo Ceruti Gippao27@gmail.com 31.08.2025 05.09.2025 2 2 3,3 Fenice Halbpension it Mobile (392 x 739 px) herr -- Yes
328 Ulisse Magrini Daniela.pianelli68@gmail.com +39 333 333 333 22.07.2025 29.07.2025 2 1 9 Peonia Halbpension it Mobile (360 x 494 px) herr Italy Yes
329 Gaetano Proscia kyra1411@gmail.com 13.07.2025 19.07.2025 2 2 7,12 Peonia,Lavendula,Fenice Halbpension it Mobile (411 x 794 px) herr -- Yes
330 Benedetta ronci benedetta.ronci@hotmail.it 3284919316 26.07.2025 02.08.2025 2 2 8,13 Forsythia,Bellis Halbpension it Mobile (390 x 662 px) frau Italy Yes
331 gianluca mazza Mazza Gia.ma73@libero.it +39 328 081 7271 09.08.2025 16.08.2025 2 2 13,16 Lavendula Halbpension it Mobile (390 x 655 px) herr Italy Yes
332 Desiree Nannarelli d.nannarelli@gmail.com 327 734 8572 20.07.2025 27.07.2025 2 1 16 Übernachtung it Mobile (360 x 668 px) frau Italy Yes
333 gianluca mazza Mazza Gia.ma73@libero.it +39 328 081 7271 09.08.2025 16.08.2025 2 2 13,16 Peonia Halbpension it Mobile (390 x 655 px) herr Italy Yes
334 Arberi Beltoja arberial@yahoo.it +39329724158 01.01.2026 05.01.2026 2 2 8,12 Peonia,Lavendula,Fenice Halbpension it Mobile (440 x 701 px) frau Italy Yes
335 Carlo Bragante bragantecarlo@gmail.com 338 956 9195 07.09.2025 11.09.2025 2 0 Bellis Halbpension it Mobile (384 x 705 px) herr Italy Yes
336 Mariangela Caprini caprinimariangela@gmail.com 3391263971 26.09.2025 29.09.2025 2 0 Bellis Halbpension it Mobile (392 x 642 px) frau Italy Yes
337 ILARIA ALGHISI ILARIA.ALGHISI@LIVE.IT 26.12.2025 02.01.2026 2 2 8,12 Peonia,Lavendula,Fenice Halbpension it Desktop (2545 x 1271 px) frau -- Yes
338 Vittoria Carolo Vittoria9185@libero.it +393280836615 22.08.2025 24.08.2025 2 2 2,2 Peonia Halbpension it Mobile (338 x 604 px) herr Italy Yes
339 Deborah Limaschi Limaschideborah@gmail.com +393487490408 24.08.2025 31.08.2025 2 1 1 Loft,Peonia,Forsythia,Bellis Halbpension it Mobile (428 x 745 px) frau Italy Yes
340 Francis Abag angelicoabag1984@gmail.com +393289479442 20.08.2025 23.08.2025 4 2 2,4 Peonia,Lavendula,Fenice Übernachtung it Mobile (411 x 790 px) herr -- Yes
341 Stefania Rullini Stefania.rullini@gmail.com 3487809455 09.08.2025 13.08.2025 1 0 Bellis Halbpension it Mobile (411 x 759 px) frau Italy Yes
342 Maurizio BORELLA maurizioborella@gmail.com +328 314 0148 25.08.2025 30.08.2025 3 1 1 Peonia Halbpension it Mobile (384 x 703 px) herr Italy Yes
343 Simona Crespolini simonacrespolini@alice.it +393335886823 17.08.2025 24.08.2025 2 0 Forsythia Übernachtung mit Frühstück it Mobile (384 x 708 px) frau Italy Yes
344 Donata Brisotto donata.brisotto@gmail.com 3453991011 26.12.2025 02.01.2026 2 1 12 Peonia,Lavendula Übernachtung mit Frühstück it Mobile (430 x 731 px) frau Italy Yes
345 Turso Stefi Stefiturso7@gmail.com 25.08.2025 01.09.2025 3 1 2 Übernachtung mit Frühstück it Mobile (384 x 759 px) frau Italy Yes
346 Simona Burlacu simona_antoni5042@yahoo.it 3481838149 03.01.2026 06.01.2026 2 1 15 Fenice Übernachtung mit Frühstück it Mobile (320 x 599 px) frau Italy Yes
347 Elena Stirparo fabriziocurcio1981@gmail.com +393295620241 30.12.2025 03.01.2026 2 3 3,13,16 Peonia Halbpension it Mobile (360 x 720 px) frau Italy Yes
348 Irene Salari Irenesalari@yahoo.it 21.11.2025 23.11.2025 3 2 1,8 Fenice Übernachtung it Mobile (390 x 662 px) frau Italy Yes
349 Mirko Zoa Zoa339@gmail.com 3453329509 09.02.2026 15.02.2026 2 2 0,3 Fenice Halbpension it Mobile (360 x 686 px) herr Italy Yes
350 Emanuela Filini manufilini@gmail.com 30.12.2025 01.01.2026 2 2 6,9 Halbpension it Mobile (390 x 777 px) -- -- Yes
351 Daniela Mazzitelli mazzi84@inwind.it 18.08.2025 25.08.2025 2 1 3 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 725 px) frau -- Yes
352 Roberta Salvatore roberta.salvatore@gmail.com 03.08.2025 12.08.2025 2 1 11 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (390 x 662 px) frau Italy Yes
353 Andrea Lanzilotto andrea.lanzilotto@libero.it 04.08.2025 11.08.2025 2 2 3,9 Halbpension it Mobile (360 x 694 px) herr -- Yes
354 Lara Fochesato Lara.fochesato@live.it +39 348 993 410 1___ 11.08.2025 16.08.2025 2 0 Loft,Forsythia Übernachtung it Mobile (320 x 518 px) frau Italy Yes
355 Fabrizio Turcato Fabrizio_turcato@yahoo.com 00393487823030 14.08.2025 17.08.2025 2 2 6,13 Übernachtung mit Frühstück it Mobile (360 x 655 px) herr -- Yes
356 Simone Denaro zerosimone1@inwind.it 3475487509 24.08.2025 31.08.2025 2 2 12,15 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 672 px) herr Italy Yes
357 Andrea Gonnella leogala75@gmail.com 22.07.2025 26.07.2025 2 2 8,14 Bellis Halbpension it Mobile (390 x 655 px) herr -- Yes
358 PAOLA SIGNORI Paola8.b@virgilio.it 340 484 1451 08.08.2025 17.08.2025 4 0 Peonia Übernachtung it Mobile (393 x 651 px) frau Italy Yes
359 francesca.masserelli@virgilio.it Masserelli Francesca.masserelli@virgilio.it 09.08.2025 19.08.2025 3 0 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 702 px) frau Italy Yes
360 Veronica Urbinati veronica.urbinati@gmail.com 3397381960 18.08.2025 21.08.2025 2 2 4,7 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 752 px) frau Italy Yes
361 Leonardo INTINI intinileo@gmail.com 3401618984 09.08.2025 20.08.2025 4 0 Übernachtung it Mobile (430 x 738 px) herr Italy Yes
362 Katia Bonaldo katiabonaldo@gmail.com 348 984 3627 11.08.2025 18.08.2025 3 1 12 Übernachtung mit Frühstück it Mobile (390 x 655 px) frau -- Yes
363 Katia Corbara corbara.katia@gmail.com 3403221080 09.08.2025 13.08.2025 2 2 3,7 Peonia Halbpension it Mobile (360 x 694 px) frau Italy Yes
364 Francesco Vecchiola f.vecchiola@gmail.com 3316712985 04.08.2025 09.08.2025 2 1 1 Bellis Halbpension it Mobile (393 x 651 px) herr Italy Yes
365 Patrizia Santirocchi Santirocchi mauro_1711@yahoo.it 3281238285 09.08.2025 15.08.2025 3 0 Peonia Übernachtung it Mobile (390 x 655 px) frau Italy Yes
366 Vitalba Mezzocapo ricevavit@gmail.com 3355638559 02.08.2025 12.08.2025 3 0 Loft,Peonia,Lavendula,Fenice,Forsythia Übernachtung it Mobile (390 x 769 px) frau -- Yes
367 Susi Bergamini susibergamini@gmail.com 347 103 4812 10.08.2025 17.08.2025 2 0 Halbpension it Desktop (800 x 1209 px) herr -- Yes
368 Sara Cavallaro sarajuve1981@gmail.com 3395838265 28.06.2025 05.07.2025 2 0 Loft Halbpension it Mobile (360 x 663 px) frau Italy Yes
369 Gian piero Moretti Gianpiero.moretti@hotmail.it 3288172990 12.07.2025 19.07.2025 1 0 Bellis Übernachtung it Mobile (360 x 647 px) herr Italy Yes
370 Elena Martini Martini Martjn76@gmail.com 347 643 6905 10.08.2025 15.08.2025 2 1 8 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 657 px) frau Italy Yes
371 Sara Sanzi Sarasanzi035@gmail.com 20.08.2025 24.08.2025 2 0 Forsythia Halbpension it Mobile (411 x 678 px) frau Italy Yes
372 Barbara Murgia barbara1aprile@gmail.com 3925519714 14.08.2025 18.08.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (392 x 739 px) frau -- Yes
373 Antonella Marazia marazia.antonella@gmail.com 01.08.2025 07.08.2025 3 0 Fenice Übernachtung it Mobile (392 x 760 px) frau -- Yes
374 Simona Ferrigno Ferrigno Simo84f@libero.it 3498901318 18.08.2025 24.08.2025 2 1 14 Lavendula Halbpension it Mobile (384 x 704 px) frau Italy Yes
375 Gennaro Piscopo Gennaro.rosa98@hotmail.it 3490597097 28.12.2025 01.01.2026 2 0 Loft Halbpension it Mobile (360 x 638 px) herr Italy Yes
376 marina pellanda marinapel1980@gmail.com 3466414764 13.08.2025 17.08.2025 2 1 2 Halbpension it Mobile (392 x 743 px) frau -- Yes
377 Laura Tomasi arualtom@libero.it 3471473826 18.08.2025 21.08.2025 2 1 8 Fenice,Forsythia Halbpension it Mobile (390 x 662 px) frau Italy Yes
378 Mandis Mariana m.mandis@yahoo.com +393281137505 14.08.2025 17.08.2025 3 3 2,8,9 Übernachtung mit Frühstück it Mobile (390 x 580 px) frau Italy Yes
379 Elisa Malini Elisa.malini@gmail.com 3806547696 16.08.2025 21.08.2025 2 2 12,17 Lavendula Halbpension it Mobile (411 x 760 px) frau Italy Yes
380 Matteo Sais M.sais@libero.it 11.08.2025 16.08.2025 3 0 Halbpension it Mobile (411 x 717 px) herr -- Yes
381 Cinzia Vignatelli cinziavigna.cv@gmail.com 3478745685 06.09.2025 09.09.2025 2 1 16 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it undefined frau Italy Yes
382 Sara Rottini sara.rottini@hotmail.it 3332252085 19.08.2025 23.08.2025 2 1 1 Lavendula,Fenice,Forsythia Halbpension it Mobile (360 x 671 px) frau Italy Yes
383 Luana Cascelli Luana_0715@msn.com 3404056650 11.08.2025 17.08.2025 2 2 6,10 Übernachtung it Mobile (390 x 655 px) frau -- Yes
384 Maria Cristina Leonardi mcristina.leonardi@libero.it 3477905824 08.08.2025 18.08.2025 2 1 16 Übernachtung mit Frühstück it Mobile (411 x 780 px) frau Italy Yes
385 Walter Bartoli walterbartoli@gmail.com 3406562623 09.07.2026 14.07.2026 2 2 8,12 Lavendula Halbpension it Mobile (384 x 701 px) herr Italy Yes
386 Anna Bortolan Spanna0000@gmail.com 3775297172 28.12.2025 02.01.2026 5 0 Übernachtung it Mobile (390 x 662 px) frau -- Yes
387 Arianna Natale arianna.natale92@gmail.com +393932550830 06.12.2025 08.12.2025 4 4 1,1,8,8 Peonia,Lavendula Übernachtung mit Frühstück it Mobile (393 x 673 px) frau Italy Yes
388 Stademann Natalie n.stademann@gmail.com 0049 176 95552518 03.10.2025 10.10.2025 2 0 Fenice Halbpension de Desktop (1905 x 967 px) frau Germany Yes
389 Paola Cerrone p_cerrone@hotmail.it 3347850429 27.12.2025 03.01.2026 9 6 6,7,7,10,11,12 Peonia,Lavendula,Fenice,Forsythia Übernachtung it Mobile (338 x 606 px) frau Italy Yes
390 Maria rosaria Bonofiglio BONOFIGLIO Maria.4277@yahoo.com 3477564244 27.09.2025 03.10.2025 2 2 5,8 Halbpension it Mobile (375 x 632 px) frau Italy Yes
391 Maurizio Perugini Perugini perugini.maurizio@gmail.com 3334424116 27.12.2025 03.01.2026 6 6 10,14,14,16,16,16 Halbpension it Mobile (393 x 659 px) herr Italy Yes
392 Alessia Rondelli Rondelli rondelli.alessia@gmail.com 3494218534 05.12.2025 07.12.2025 2 2 5,11 Fenice Halbpension it Mobile (393 x 586 px) frau Italy Yes
393 Alessio Castillenti alessio.castillenti@gmail.com +393396739858 26.12.2025 30.12.2025 4 0 Lavendula Übernachtung mit Frühstück it Mobile (375 x 748 px) herr Italy Yes
394 Debby Schiavon deborahschiavon82@gmail.com 3382915851 03.01.2026 06.01.2026 2 0 Bellis Übernachtung mit Frühstück it Mobile (360 x 752 px) -- Italy Yes
395 Annalisa AMADIO Annalisa76.amadio@gmail.com 01.01.2026 04.01.2026 3 1 14 Fenice Übernachtung it Mobile (411 x 784 px) frau Italy Yes
396 Arnaldo Pietro De Brito arnaldopietrodebrito@libero.it 3408629862 27.07.2025 03.08.2025 2 1 10 Fenice Halbpension it Mobile (392 x 739 px) herr Italy Yes
397 Raffaele Rondoni Raffaelerondoni@gmail.com 3316005133 10.08.2025 17.08.2025 3 1 15 Peonia,Lavendula,Fenice,Bellis Halbpension it Mobile (411 x 769 px) herr -- Yes
398 Chiara Brocani brocanichiara@gmail.com 3284504689 16.07.2025 20.07.2025 2 1 2 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (384 x 657 px) frau Italy Yes
399 Loretta Alfei loretta.alfei@gmail.com 3397668603 20.08.2025 29.08.2025 2 0 Lavendula Übernachtung it Mobile (360 x 674 px) frau Italy Yes
400 Vittoriano Gimmarrusti gvittoriano@yahoo.com 3928287585 19.07.2025 25.07.2025 2 2 9,15 Lavendula Halbpension it Mobile (360 x 664 px) herr Italy Yes
401 fabio Martino fabiomartino71@gmail.com 3343903454 09.08.2025 16.08.2025 3 1 14 Peonia,Lavendula,Fenice Übernachtung it Mobile (432 x 820 px) herr Italy Yes
402 Michela Pincin michela.pincin@gmail.com 3404058587 14.08.2025 18.08.2025 2 0 Bellis Halbpension it Mobile (360 x 665 px) frau Italy Yes
403 Maria Rita Barbone barbonemariarita@gmail.com 3209066437 18.08.2025 23.08.2025 2 1 11 Lavendula Halbpension it Mobile (392 x 660 px) frau -- Yes
404 Antonio Giappichini Giappichini.antonio@gmail.com 3491796586 21.08.2025 24.08.2025 2 2 5,9 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (384 x 702 px) herr Italy Yes
405 Margherita Cameli gherimi@gmail.com 3396855735 04.01.2026 06.01.2026 2 1 6 Bellis Übernachtung mit Frühstück it Mobile (360 x 667 px) frau Italy Yes
406 Barbara Gherri Barbara.gherri@gmail.com 11.08.2025 18.08.2025 2 2 6,9 Peonia,Lavendula,Fenice Übernachtung it Mobile (390 x 662 px) frau Italy Yes
407 Alessia Maggi alemaggi18@gmail.com 3451579932 19.08.2025 22.08.2025 2 1 17 Halbpension it Mobile (360 x 656 px) frau Italy Yes
408 Riccardo Mazzola mazzori@petalmail.com 3479444899 20.08.2025 27.08.2025 3 0 Fenice Übernachtung it Mobile (360 x 569 px) herr Italy Yes
409 Gian Luca Cirimbelli Gianluca.cirimbelli@gmail.com 3490892519 18.08.2025 22.08.2025 2 1 7 Bellis Halbpension it Mobile (390 x 662 px) herr Italy Yes
410 raffaele silipo Silipo avvsilipo.raffaele@gmail.com 3711714863 08.08.2025 18.08.2025 4 0 Peonia,Fenice Übernachtung it Mobile (320 x 569 px) herr Italy Yes
411 Maryna Kulchak marenochka3@gmail.com 3715622400 15.08.2025 17.08.2025 3 2 6,12 Übernachtung it Mobile (392 x 736 px) frau Italy Yes
412 Livia Villani livi.villani@tiscali.it 09.08.2025 13.08.2025 2 2 4,9 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (393 x 673 px) frau -- Yes
413 Robero Stoissich Stoissich@alice.it 3664226761 11.08.2025 15.08.2025 4 0 Lavendula Halbpension it Mobile (430 x 723 px) herr Italy Yes
414 caterina Holmberg Cathyholmberg@hotmail.com 3472447554 29.08.2025 31.08.2025 4 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (390 x 777 px) frau Italy Yes
415 Barbara Fortunato barbarafortunato8@gmail.com +393332442130 27.08.2025 31.08.2025 4 0 Übernachtung it Mobile (390 x 677 px) frau Italy Yes
416 Luciano Caldana caldanaluciano24@gmail.com 3898159881 18.08.2025 23.08.2025 2 0 Forsythia,Bellis Übernachtung mit Frühstück it Mobile (369 x 724 px) herr Italy Yes
417 Laura Cosentino Lpsanvittorio@gmail.com 389 872 6900 31.08.2025 05.09.2025 2 2 9,12 Halbpension it Mobile (430 x 731 px) frau Italy Yes
418 Davide Baglioni davidesan1978@gmail.com 3335075425 17.08.2025 20.08.2025 2 2 11,17 Übernachtung mit Frühstück it Mobile (411 x 776 px) herr Italy Yes
419 Stefania Ballerano Stefania.ballerano@gmail.com 24.08.2025 31.08.2025 2 1 17 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (411 x 784 px) frau -- Yes
420 Fabrizio Passalacqua passalacquafabrizio71@gmail.com 336711379 23.08.2025 30.08.2025 4 0 Fenice Halbpension it Mobile (366 x 687 px) -- Italy Yes
421 Cinzia Mandreoli domegeg@gmail.com 340 392 5856 16.08.2025 20.08.2025 2 2 5,10 Peonia Übernachtung mit Frühstück it Mobile (339 x 620 px) herr -- Yes
422 Domenico De Santis 2d.desantis@gmail.com 3316655319 09.08.2025 14.08.2025 2 0 Bellis Übernachtung it Mobile (360 x 635 px) herr -- Yes
423 Monica Gemma gemmamonica19@gmail.com 3383399114 28.08.2025 31.08.2025 2 1 15 Übernachtung it Mobile (392 x 724 px) frau Italy Yes
424 Di Lembo Lina linadilembo@gmail.com 3205742436 17.08.2025 23.08.2025 2 1 1 Loft,Forsythia Halbpension it Mobile (360 x 664 px) frau Italy Yes
425 Simona Taglieri simona.taglieri@gmail.com 3476933052 05.08.2025 09.08.2025 2 0 Peonia Übernachtung it Mobile (360 x 672 px) frau Italy Yes
426 Marica Posa posamarica@gmail.com 3293716913 30.07.2025 04.08.2025 2 2 9,12 Halbpension it Mobile (360 x 586 px) frau -- Yes
427 Clara Bernardelli clara.bernardelli@gmail.com 31.12.2025 03.01.2026 6 5 2,2,5,6,8 Übernachtung it Mobile (392 x 743 px) -- Italy Yes
428 Monica Rondelli mrondelli@hotmail.it 3923454149 02.04.2026 05.04.2026 3 0 Halbpension it Mobile (428 x 739 px) frau -- Yes
429 Davide Bonello davide_bonello@libero.it +393294139937 17.01.2026 24.01.2026 2 1 3 Peonia Übernachtung it Mobile (360 x 667 px) herr Italy Yes
430 Giuditta Generoso giuditta84@hotmail.it 340 978 7451 02.03.2026 09.03.2026 2 2 3,5 Lavendula Halbpension it Mobile (406 x 774 px) frau -- Yes
431 Natascia Cantoni natascia.cantoni@gmail.com 3393850628 28.12.2025 01.01.2026 2 0 Lavendula,Forsythia Übernachtung mit Frühstück it Mobile (360 x 655 px) frau Italy Yes
432 Claudio Butti Claudio_1971mi@yahoo.it 3470578207 31.12.2025 05.01.2026 2 0 Loft,Lavendula,Forsythia,Bellis Halbpension it undefined herr Italy Yes
433 Nicola Maradei nicolamaradei@libero.it 3392128745 19.12.2025 23.12.2025 1 2 11,14 Halbpension it Mobile (384 x 700 px) herr Italy Yes
434 Romina Di Maio rominadimaio@mail.com 3396834910 30.12.2025 03.01.2026 4 0 Fenice Übernachtung mit Frühstück it Mobile (375 x 739 px) frau Italy Yes
435 Letizia Berardi berardi.letizia@gmail.com 27.12.2025 03.01.2026 2 0 Halbpension it Mobile (384 x 604 px) frau -- Yes
436 Chiara Petix Chiarapetix82@gmail.com 3270546824 31.12.2025 05.01.2026 2 1 6 Übernachtung mit Frühstück it Mobile (375 x 627 px) frau -- Yes
437 Rosetta Merenda tempiovenere@email.it 3202244008 15.08.2026 29.08.2026 3 0 Lavendula Halbpension it Mobile (430 x 850 px) frau -- Yes
438 Simone Passaro s.passaro93@gmail.com 03.10.2025 05.10.2025 2 0 Loft,Forsythia,Bellis Übernachtung mit Frühstück it Desktop (1114 x 670 px) herr Italy Yes
439 Valter Scarpa valterscarpa@libero.it 3384056782 29.12.2025 03.01.2026 2 2 7,12 Lavendula Halbpension it Mobile (392 x 728 px) herr Italy Yes
440 Vincenza Foschillo enzafoschillo@gmail.com 3336333320 27.12.2025 03.01.2026 2 1 6 Lavendula Übernachtung mit Frühstück it Mobile (320 x 587 px) frau Italy Yes
441 Monica Montanari monicamon2308@gmail.com 3396010803 16.08.2025 23.08.2025 2 0 Forsythia Halbpension it Mobile (339 x 628 px) frau Italy Yes
442 andrea crisafuli andreacrisafuli46@hotmial.com 21.06.2025 23.06.2025 2 2 7,10 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Desktop (1265 x 639 px) herr -- Yes
443 Conny Reinhardt conny.1999@gmx.net 30.08.2025 06.09.2025 2 1 11 Peonia,Lavendula,Fenice,Forsythia Übernachtung de Desktop (1440 x 797 px) frau Germany Yes
444 Federico Lucarini federicolucarini82@gmail.com 16.07.2025 23.07.2025 2 2 3,5 Übernachtung it Mobile (393 x 773 px) -- -- Yes
445 ombretta benatti ombrettabenatti74@gmail.com 3496723430 09.08.2025 20.08.2025 3 1 15 Peonia Übernachtung it Mobile (392 x 739 px) frau Italy Yes
446 Pierluigi Giuliodori Pierluigigiuliodori@gmail.com 3393159091 18.08.2025 21.08.2025 2 1 16 Peonia,Lavendula,Fenice Übernachtung it Mobile (384 x 704 px) herr Italy Yes
447 Rino Festugato rinoegrazia@alice.it 3393629894 10.08.2025 17.08.2025 2 0 Bellis Halbpension it Mobile (320 x 583 px) herr Italy Yes
448 PATRIZIA Solombrino pattysolom@gmail.com 3926325794 13.08.2025 17.08.2025 2 0 Forsythia Übernachtung it Mobile (347 x 638 px) frau Italy Yes
449 Eugenia Malusa Eugenia.malusa@gmail.com 10.08.2025 20.08.2025 4 0 Halbpension en Mobile (390 x 662 px) frau -- Yes
450 Alessandro Passador passador_ale@tiscali.it 18.08.2025 23.08.2025 2 1 17 Halbpension it Mobile (360 x 414 px) herr -- Yes
451 Emanuela Della porta maolina80@gmail.com 3277574653 16.08.2025 23.08.2025 2 1 10 Übernachtung mit Frühstück it Mobile (360 x 373 px) frau -- Yes
452 Elena Fabbiani elenafabbianii@gmail.com 23.08.2025 31.08.2025 2 0 Loft,Lavendula,Forsythia,Bellis Halbpension it Mobile (375 x 741 px) frau -- Yes
453 massimo Granocchia massimo.granocchia@gmail.com +393920236584 21.08.2025 24.08.2025 1 3 7,9,13 Fenice Halbpension it Mobile (440 x 655 px) herr Italy Yes
454 Antonella Convertino convertino.antonella@gmail.com 3290762812 01.09.2025 07.09.2025 2 1 8 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (392 x 662 px) frau Italy Yes
455 Candido Caserta caserta.candido@libero.it 3494695112 09.08.2025 13.08.2025 2 1 3 Bellis Halbpension it Mobile (392 x 739 px) herr Italy Yes
456 Candido Caserta caserta.candido@libero.it 3494695112 09.08.2025 13.08.2025 2 1 3 Forsythia Übernachtung mit Frühstück it Mobile (392 x 739 px) herr Italy Yes
457 Letizia De sanctis Letizia.desanctis74@gmail.com +393491328279 10.08.2025 17.08.2025 2 0 Bellis Übernachtung it Mobile (393 x 658 px) frau Italy Yes
458 daniela cavallaro danielacavallaro74@gmail.com +393393244936 05.12.2025 09.12.2025 3 0 Peonia Übernachtung it Mobile (360 x 665 px) frau Italy Yes
459 Ettore Rapezzi ettorefederica@libero.it 19.08.2025 21.08.2025 4 0 Übernachtung mit Frühstück it Mobile (360 x 672 px) herr -- Yes
460 Roberto Zito robertozitorz@gmail.com +39 333 194 9312 18.08.2025 24.08.2025 4 0 Lavendula,Forsythia Halbpension it Mobile (360 x 656 px) herr Italy Yes
461 Negoita Nicoleta Nicoleta Negoitanicol85@gmail.com +393457653842 15.08.2025 17.08.2025 4 0 Lavendula Halbpension it Mobile (390 x 580 px) frau Italy Yes
462 Carmine Cipro carminecipro68@gmail.com 3920200041 17.08.2025 24.08.2025 4 0 Peonia,Lavendula Halbpension it Mobile (393 x 651 px) herr Italy Yes
463 Gabriele Catanzaro Gabricat81@gmail.com 30.12.2025 06.01.2026 2 2 6,9 Halbpension it Mobile (360 x 645 px) herr -- Yes
464 Valentina Nogara evita89@alice.it 11.08.2025 16.08.2025 2 1 4 Halbpension it Mobile (392 x 656 px) frau -- Yes
465 Monica Gemma gemmamonica19@gmail.com 3383399114 28.08.2025 31.08.2025 2 1 15 Fenice Übernachtung it Mobile (392 x 724 px) -- -- Yes
466 Simona Taglieri simona.taglieri@gmail.com 3476933052 11.08.2025 14.08.2025 2 0 Lavendula,Fenice,Forsythia,Bellis Übernachtung mit Frühstück it Mobile (360 x 672 px) frau Italy Yes
467 Marica Bemer Bemer Marica.bemer@gmail.com +39339123904 10.08.2025 17.08.2025 2 2 13,15 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (411 x 786 px) frau -- Yes
468 Claudio Langianni Claudio.langianni@alice.it 3346161792 15.08.2025 22.08.2025 2 1 15 Fenice Halbpension it Mobile (320 x 620 px) herr Italy Yes
469 Denise Sartori Tresjolie.denise@gmail.com 09.08.2025 16.08.2025 2 2 9,12 Übernachtung it Mobile (390 x 662 px) -- -- Yes
470 Roberta Stagni STAGNI robertastagni@yahoo.it 3404054316 17.07.2026 24.07.2026 2 0 Forsythia Übernachtung it Mobile (375 x 705 px) frau Italy Yes
471 Vittoria Carolo Vittoria9185@libero.it +393280836615 22.08.2025 24.08.2025 2 2 3,9 Lavendula,Fenice Halbpension it Mobile (338 x 604 px) frau Italy Yes
472 Gabriele Nardini nardini.gabriele03@gmail.com 3468797167 25.08.2025 31.08.2025 2 1 1 Fenice,Forsythia,Bellis Halbpension it Mobile (384 x 627 px) herr Italy Yes
473 Patrick Bert Patrickbert80@gmail.com 3491865149 18.08.2025 25.08.2025 2 1 12 Halbpension it Mobile (360 x 631 px) herr -- Yes
474 Francesca Giovanna Rapetta fratore@gmail.com +393343245719 22.08.2025 25.08.2025 3 1 13 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 657 px) frau Italy Yes
475 paolo rossignoli rrpapl1977@gmail.com 3495009725 14.08.2025 17.08.2025 6 1 11 Übernachtung mit Frühstück it Mobile (392 x 615 px) herr Italy Yes
476 Silvia Baldassari baldassarisilvia134@gmail.com +393274336780 04.08.2025 11.08.2025 2 0 Forsythia Übernachtung it Mobile (390 x 677 px) frau Italy Yes
477 Angela Maria Barbieri angelabarbieriit@yahoo.it 339 853 0877 09.08.2025 16.08.2025 2 2 5,7 Peonia,Lavendula,Fenice Halbpension it Mobile (411 x 749 px) frau Italy Yes
478 Gabriele Nardini nardini.gabriele03@gmail.com +393468797167 25.08.2025 31.08.2025 2 1 1 Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (384 x 709 px) herr Italy Yes
479 Laura Berluti Laura_berluti@yahoo.com 16.08.2025 20.08.2025 2 1 5 Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung mit Frühstück it Mobile (384 x 704 px) frau -- Yes
480 Tanja Lerro Tanja.lerro@gmail.com 3471916838 30.12.2025 04.01.2026 2 2 2,11 Fenice Halbpension it Mobile (390 x 677 px) frau Italy Yes
481 Maria Rosaria Lippi Mariarosarialippi@yahoo.it 16.02.2026 23.02.2026 2 0 Loft Halbpension it Mobile (360 x 657 px) frau Italy Yes
482 Eno Vebiu Enovebiu11@outlook.com 3457232292 24.12.2025 29.12.2025 2 3 2,7,16 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 733 px) herr Italy Yes
483 Federica Lazzaro federica88lazzaro@gmail.com 3334590520 01.01.2026 04.01.2026 2 2 0,3 Peonia,Lavendula,Fenice Übernachtung mit Frühstück it Mobile (393 x 641 px) frau Italy Yes
484 Karl Traunspurger karltraunspurger@gmail.com 015115591527 16.05.2026 23.05.2026 1 0 Bellis Übernachtung de Mobile (384 x 701 px) -- Germany Yes
485 P Barni patrizia_barni_91@libero.it 29.09.2025 03.10.2025 2 2 0,4 Peonia,Lavendula,Fenice Halbpension it Mobile (375 x 698 px) frau -- Yes
486 Ernesto Annarumma Ernesto.rosso@outlook.it 27.12.2025 03.01.2026 2 2 5,11 Fenice Halbpension it Mobile (428 x 759 px) herr -- Yes
487 Fabio Pareschi fabiopareschi69@gmail.com 20.08.2025 23.08.2025 3 1 12 Peonia Halbpension it Mobile (392 x 642 px) -- -- Yes
488 Isabella Neri isaneri@tiscali.it 16.08.2025 24.08.2025 2 0 Lavendula,Fenice,Forsythia Übernachtung it Mobile (390 x 669 px) frau -- Yes
489 Chiara Iorio chiara24475@gmail.com 3397362329 11.08.2025 18.08.2025 2 0 Loft,Forsythia Halbpension it Mobile (384 x 702 px) frau -- Yes
490 Ramona Gobetti ramo77gob@tiscali.it 27.12.2025 03.01.2026 5 1 1 Lavendula Halbpension it Mobile (390 x 677 px) frau -- Yes
491 Mattia Simonetto m.simonetto@avvocatosimonetto.com 3453066044 30.12.2025 04.01.2026 2 2 3,6 Peonia,Lavendula Übernachtung it Desktop (1854 x 933 px) herr -- Yes
492 Alice Bracci alicebracci80@gmail.com 20.12.2025 24.12.2025 2 3 12,14,17 Übernachtung it Mobile (384 x 700 px) frau Italy Yes
493 Daniela Tonini Tonini Shakihavana@gmail.com 3396802008 01.01.2026 05.01.2026 2 2 5,7 Lavendula Übernachtung it Mobile (360 x 677 px) -- -- Yes
494 Daniela Arhip gubilitvera@gmail.com +393887268003 24.12.2025 27.12.2025 3 3 8,9,15 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 707 px) frau -- Yes
495 Veronica Marchetti Marchetti Veronicamarchetti1977@gmail.com 3299476876 11.01.2026 17.01.2026 2 1 17 Peonia,Lavendula,Fenice Halbpension it Mobile (320 x 588 px) frau Italy Yes
496 Maria Grazia Ferri marygten6@hotmail.com 28.12.2025 04.01.2026 4 4 6,6,11,11 Übernachtung mit Frühstück it Mobile (430 x 743 px) -- Italy Yes
497 silvia andreotti silvia.andreotti@hotmail.it 3286552398 04.08.2025 13.08.2025 2 0 Loft,Forsythia Halbpension it Desktop (1521 x 695 px) frau -- Yes
498 Mauro Zecca zeccam@yahoo.it 3483600062 06.09.2025 13.09.2025 2 0 Bellis Halbpension it Mobile (411 x 762 px) herr Italy Yes
499 Simona Migliari migliari.simo@gmail.com +393391399107 27.07.2025 06.08.2025 2 2 5,7 Halbpension it Mobile (411 x 765 px) frau Italy Yes
500 Donatella Ludovico Donaludovico75@gmail.com 3477059300 27.12.2025 02.01.2026 2 2 16,18 Fenice Übernachtung it Mobile (360 x 654 px) frau Italy Yes
501 Gian Carlo Tamburini tamburinigc@gmail.com 3294370531 26.07.2025 31.07.2025 2 1 13 Peonia,Fenice Übernachtung it Mobile (432 x 818 px) herr -- Yes
502 Elisa Zucchini elisazucchini79@gmail.com 347 957 4956 04.08.2025 08.08.2025 2 1 16 Lavendula,Fenice Übernachtung mit Frühstück it Mobile (366 x 683 px) frau Italy Yes
503 Mauro Baccini Baccini86@gmail.com 3483391097 26.08.2025 30.08.2025 2 2 8,12 Peonia,Lavendula,Fenice Halbpension it Mobile (390 x 578 px) herr -- Yes
504 claudio Boglioli Claudioboglioli88@hotmail.it 3397104302 21.07.2025 25.07.2025 2 1 4 Halbpension it Mobile (360 x 656 px) herr Italy Yes
505 Angelica Gramaccioni agramaccioni@gmail.com 329/2011137 09.08.2025 14.08.2025 2 2 6,9 Lavendula Übernachtung mit Frühstück it Mobile (414 x 713 px) frau Italy Yes
506 Luca Acunzo lacunzo@yahoo.it 10.08.2025 24.08.2025 2 2 11,15 Peonia,Lavendula,Fenice Halbpension it Mobile (360 x 651 px) herr Italy Yes
507 Massimiliano Ottolini maxim8@inwind.it 3407192098 03.01.2026 06.01.2026 3 0 Peonia,Lavendula,Fenice Übernachtung it Desktop (1327 x 642 px) herr Italy Yes
508 Giuseppe Giampietro g.giampietro1@yahoo.it 3475927917 29.12.2025 03.01.2026 3 1 12 Peonia Übernachtung it Mobile (393 x 651 px) herr Italy Yes
509 Giovanna De palma De palma giovannadepalma@outlook.it 3201961554 02.01.2026 06.01.2026 2 2 2,9 Peonia Halbpension it Mobile (392 x 739 px) frau Italy Yes
510 Ilaria Battaglino ilab56789@gmail.com 3394953825 29.12.2025 01.01.2026 3 0 Übernachtung mit Frühstück it Mobile (411 x 788 px) herr -- Yes
511 Pasquale Donnarumma pasqualedonnarum@gmail.com 333 135 6484 29.11.2025 30.11.2025 3 1 16 Peonia,Lavendula,Fenice Übernachtung it Desktop (800 x 1208 px) herr -- Yes
512 Edoardo Forcella edoardo.forcella@alice.it 29.12.2025 04.01.2026 2 0 Loft,Peonia,Lavendula,Forsythia,Bellis Halbpension it Mobile (375 x 495 px) herr Italy Yes
513 Nicola Carfagna Carfagna Carfagna.nicola@libero.it 3383454008 28.12.2025 02.01.2026 2 3 1,4,11 Peonia Halbpension it Mobile (384 x 703 px) herr Italy Yes
514 Viorica Homenco homencoviorica@gmail.com +393245828180 29.12.2025 01.01.2026 4 1 11 Peonia Halbpension it Mobile (411 x 780 px) frau Italy Yes
515 Serena Pranzini serena.pranzini@alice.it 3382379905 17.08.2025 21.08.2025 2 1 11 Halbpension it Mobile (428 x 736 px) frau -- Yes
516 Emanuela Birini emabirini@gmail.com 09.08.2025 16.08.2025 4 0 Peonia Übernachtung it Mobile (392 x 743 px) -- Italy Yes
517 cinzia caselli cinzia.caselli@giustizia.it 3474287224 22.08.2025 26.08.2025 4 0 Peonia Halbpension it Mobile (360 x 672 px) frau Italy Yes
518 Nicoletta Mattiussi nicoletta.mattiussi@gmail.com 3496183035 13.07.2025 19.07.2025 2 2 0,2 Peonia Halbpension it Mobile (414 x 820 px) frau Italy Yes
519 Debora Concialdi deboraconcialdi74@gmail.com +393478104628 10.07.2025 15.07.2025 2 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung it Mobile (320 x 566 px) frau Italy Yes
520 Sara Tartabini Sara.tartabini1981@gmail.com 338 980 0551 16.08.2025 23.08.2025 3 2 7,15 Peonia Übernachtung mit Frühstück it Mobile (384 x 722 px) -- -- Yes
521 Roberta Morandini Morandiniroberta@gmail.com 24.08.2025 04.09.2025 3 2 3,9 Peonia Übernachtung it Mobile (414 x 609 px) frau Italy Yes
522 Silvana Tiberio silvytiberio@gmail.com 3401468792 18.08.2025 23.08.2025 2 1 17 Übernachtung it Mobile (392 x 743 px) frau Italy Yes
523 Salvatore Giacci S.guacci@libero.it 3313621612 12.08.2025 18.08.2025 2 1 6 Peonia Übernachtung mit Frühstück it Mobile (390 x 777 px) herr Italy Yes
524 Daniela Maffei danielamaffei7@gmail.com 337 866 788 06.07.2025 13.07.2025 2 0 Forsythia Übernachtung it Mobile (384 x 599 px) frau Italy Yes
525 Carlo Alfei loretta.alfei@gmail.com 3397668703 20.08.2025 29.08.2025 2 0 Fenice Übernachtung it Mobile (360 x 682 px) herr Italy Yes
526 Rebecca Cattaneo rebecca_cattaneo@libero.it 20.06.2026 27.06.2026 2 3 2,6,9 Peonia,Fenice Halbpension it Mobile (360 x 666 px) -- -- Yes
527 Silvia Seveso silviaseveso83@gmail.com 19.08.2025 22.08.2025 2 2 1,8 Halbpension it Desktop (1394 x 773 px) -- -- Yes
528 Marco Spigolon orsopiteco@gmail.com 01.09.2025 05.09.2025 2 1 14 Halbpension it Mobile (411 x 797 px) herr -- Yes
529 Marcela Pette Marcelapette@icloud.com 3804650172 26.12.2025 03.01.2026 2 2 1,5 Peonia,Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (393 x 773 px) frau Italy Yes
530 MicaelA Zampieri Zampierimicaela@gmail.com 27.12.2025 03.01.2026 2 1 3 Lavendula,Fenice,Forsythia,Bellis Übernachtung it undefined frau -- Yes
531 Maria Cristina Belgiovine Cristinabelgiovine@libero.it 3406089775 26.12.2025 02.01.2026 2 2 8,10 Peonia,Lavendula,Fenice Halbpension it undefined frau -- Yes
532 Sandra Mazza sandramazza@hotmail.it 329 403 8481 11.08.2025 16.08.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (393 x 643 px) frau Italy Yes
533 Matteo Sais M.sais@libero.it 11.08.2025 16.08.2025 2 0 Halbpension it Mobile (411 x 721 px) herr -- Yes
534 Matteo Sais M.sais@libero.it 11.08.2025 16.08.2025 2 0 Halbpension it Mobile (411 x 721 px) herr -- Yes
535 Tatiana Falcinelli tatianafalcinelli79@gmail.com 3343421695 11.08.2025 16.08.2025 2 1 12 Peonia,Lavendula,Fenice Halbpension it Mobile (384 x 737 px) frau Italy Yes
536 Davide Curcio Curcio Davidecurcio@libero.it 3394833660 02.08.2025 09.08.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (384 x 704 px) herr Italy Yes
537 Milena Miccio kigio@hotmail.com 3338782859 04.08.2025 10.08.2025 2 0 Bellis Übernachtung mit Frühstück it Mobile (384 x 717 px) frau -- Yes
538 Maria Grazia Gentile gentilegrace@yahoo.it 3389338838 17.08.2025 24.08.2025 1 0 Bellis Halbpension it Mobile (411 x 734 px) frau Italy Yes
539 Lucia Moretti morettilucia70@gmail.com 11.08.2025 16.08.2025 2 3 13,15,15 Übernachtung mit Frühstück it Mobile (360 x 664 px) frau Italy Yes
540 Simone Venturato venturatosimone@gmail.com 348 440 0858 10.08.2025 17.08.2025 2 0 Loft Übernachtung mit Frühstück it Mobile (360 x 668 px) herr Italy Yes
541 Valeria Barricelli Valery06@libero.it 328 44 35671 16.08.2025 23.08.2025 4 4 7,13,13,15 Lavendula Übernachtung it Mobile (411 x 797 px) frau Italy Yes
542 Benedtta Cappiello benedetta.cg@gmail.com 03.08.2025 10.08.2025 2 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung mit Frühstück it Desktop (1180 x 713 px) frau -- Yes
543 Elena Greco grecoelena75@gmail.com 3355609794 03.01.2026 10.01.2026 1 2 13,16 Peonia Halbpension it Mobile (392 x 735 px) frau Italy Yes
544 Lucia Aversano Lucia.aversano87@gmail.com 23.08.2025 30.08.2025 2 2 7,9 Fenice Halbpension it Mobile (360 x 653 px) frau -- Yes
545 Marcella Marchi Marchi.marcella79@gmail.com 3384718165 06.07.2026 12.07.2026 3 1 1 Lavendula,Fenice Übernachtung it Mobile (375 x 552 px) frau Italy Yes
546 Monica Moretti Moretti Mony.moretti25@gmail.com 3497776490 09.11.2025 15.11.2025 2 2 6,10 Peonia,Lavendula,Fenice Halbpension it Mobile (402 x 682 px) frau -- Yes
547 Micaela Zampieri zampierimicaela@gmail.com 27.12.2025 03.01.2026 2 1 3 Peonia,Lavendula,Fenice Übernachtung it Mobile (414 x 828 px) frau -- Yes
548 Elena Contarato elena_contarato@hotmail.it 27.12.2025 03.01.2026 5 1 10 Halbpension it Mobile (390 x 677 px) frau -- Yes
549 Luigi De Martino luigi.demartino1972@libero.it '+393491091286 30.12.2025 02.01.2026 2 2 11,14 Peonia Halbpension it Mobile (384 x 733 px) herr -- Yes
550 Valentina Corradin Corradib valentinacorradin@gmail.com 3484783911 30.12.2025 03.01.2026 2 2 1,7 Lavendula Halbpension it Mobile (375 x 561 px) frau Italy Yes
551 Walter Bartoli walterbartoli@gmail.com 3406562623 09.07.2026 14.07.2026 2 2 8,12 Fenice Halbpension it Mobile (384 x 644 px) herr Italy Yes
552 Denise Chistolini Chistolini Dchistolini6@gmail.com 3318307297 02.03.2026 08.03.2026 2 2 0,9 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Halbpension it Mobile (411 x 761 px) frau Italy Yes
553 Francesca Sorgato cesca.85@hotmail.it 27.12.2025 03.01.2026 2 2 6,6 Peonia,Lavendula,Fenice Übernachtung it Mobile (390 x 663 px) frau -- Yes
554 Roberto O Orsi orsiroberto37@gmail.com 3333459372 25.08.2025 29.08.2025 5 0 Peonia,Bellis Halbpension it Mobile (360 x 667 px) herr Italy Yes
555 Teresa Grillo teagrillo@rocketmail.com 3348464542 02.08.2025 08.08.2025 2 0 Forsythia,Bellis Halbpension it Mobile (393 x 651 px) frau -- Yes
556 Paolo Disconzi paolodisconzi@gmail.com 3477408769 27.08.2025 31.08.2025 3 2 3,5 Übernachtung it Mobile (360 x 672 px) herr Italy Yes
557 Patrizia Anatriello patrizia.anatriello.caporale@gmail.com 3922658558 10.08.2025 17.08.2025 2 2 13,13 Übernachtung mit Frühstück it Mobile (392 x 743 px) frau Italy Yes
558 Silvia Anfos silvia.anfos@gmail.com 16.08.2025 23.08.2025 2 2 0,5 Lavendula,Fenice Halbpension it Mobile (360 x 636 px) -- -- Yes
559 Valentina Bonadonna valentina.bnd@gmail.com 392 626 6400 17.08.2025 24.08.2025 2 2 3,3 Übernachtung it Mobile (392 x 744 px) frau Italy Yes
560 Loretta Alfei loretta.alfei@gmail.com 3397668703 20.08.2025 29.08.2025 2 0 Lavendula Übernachtung it Mobile (360 x 674 px) frau Italy Yes
561 Gianfranco Marino Gianfranco.marino@fiorentini.com 11.08.2025 16.08.2025 3 2 17,17 Übernachtung mit Frühstück it Mobile (393 x 665 px) herr -- Yes
562 Alana Gallini alanagallini@gmail.com 12.08.2025 19.08.2025 3 3 0,2,4 Halbpension en Mobile (393 x 644 px) -- -- Yes
563 Susi Bergamini Susibergamini@gmail.com 347 1034812 10.08.2025 17.08.2025 2 0 Loft Halbpension it Desktop (800 x 1165 px) frau Italy Yes
564 Marco Barchiesi m.barchiesi56@gmail.com 3486506303 15.07.2025 20.07.2025 2 0 Forsythia Übernachtung mit Frühstück it Mobile (338 x 605 px) herr Italy Yes
565 Antonella De Luca a.deluca@raconsulting.it 335 760 2237 04.08.2025 10.08.2025 3 0 Peonia,Lavendula,Fenice Halbpension it Mobile (430 x 733 px) frau Italy Yes
566 Gaetano Caiani Gaetano.caiani@gmail.com 3381934017 04.10.2025 11.10.2025 2 0 Halbpension it Mobile (384 x 731 px) herr Italy Yes
567 c cook heart1584@aol.com +1 4096564686 13.07.2025 20.07.2025 2 0 Loft Halbpension en Desktop (1257 x 602 px) frau United States of America Yes
568 Antonella Urban Urban antonellaurban7@gmail.com 338 954 7766 10.08.2025 18.08.2025 2 0 Forsythia Übernachtung it Mobile (320 x 589 px) frau Italy Yes
569 Lina Di Lembo linadilembo@gmail.com 3205742436 17.08.2025 23.08.2025 2 1 1 Fenice Übernachtung it Mobile (360 x 664 px) frau -- Yes
570 Roberta Ghigi robertagh@hotmail.it 27.12.2025 02.01.2026 6 4 3,6,6,8 Fenice Halbpension it Mobile (360 x 674 px) frau -- Yes
571 Valentina Zilli vale_zilli@hotmail.com 03.10.2025 06.10.2025 2 1 2 Bellis Übernachtung mit Frühstück it Mobile (390 x 663 px) frau -- Yes
572 Michela Paccagnan pacca1990@gmail.com 28.12.2025 04.01.2026 2 2 4,6 Fenice Halbpension it Mobile (360 x 648 px) frau -- Yes
573 Elena Battiloro E.battiloro1@gmail.com 05.12.2025 08.12.2025 2 3 0,1,3 Lavendula Halbpension it Mobile (414 x 714 px) frau Italy Yes
574 Teresa Loria teresa.loria81@libero.it 3425948239 05.12.2025 08.12.2025 2 2 2,2 Lavendula Halbpension it Mobile (360 x 419 px) frau Italy Yes
575 Wolfhard Cappel Wolfhard.Cappel@t-online.de 08.09.2025 17.09.2025 2 0 Forsythia Übernachtung mit Frühstück de Mobile (428 x 742 px) herr Germany Yes
576 Luca Marseglia luca@marseglia.it 03.01.2026 06.01.2026 5 0 Loft,Peonia,Lavendula,Fenice,Forsythia,Bellis Übernachtung it Mobile (393 x 658 px) herr -- Yes
577 Patrizia Pizza patripizza@gmail.com 3488747991 29.12.2025 01.01.2026 2 0 Bellis Halbpension it Mobile (392 x 739 px) frau -- Yes

View File

@@ -124,7 +124,7 @@
},
{
"label": "hotelid",
"value": "39054_001"
"value": "135"
},
{
"label": "hotelname",
@@ -260,7 +260,7 @@
"field:angebot_auswaehlen": "Zimmer: Doppelzimmer",
"field:utm_content": "",
"field:last_name_d97c": "Pohl",
"field:hotelid": "39054_001",
"field:hotelid": "135",
"submissionsLink": "https://manage.wix.app/forms/submissions/1dea821c-8168-4736-96e4-4b92e8b364cf/e084006b-ae83-4e4d-b2f5-074118cdb3b1?d=https%3A%2F%2Fmanage.wix.com%2Fdashboard%2F1dea821c-8168-4736-96e4-4b92e8b364cf%2Fwix-forms%2Fform%2Fe084006b-ae83-4e4d-b2f5-074118cdb3b1%2Fsubmissions&s=true",
"field:gbraid": "0AAAAADxR52Ad0oCzeogeTrupgGeMwD7Yp",
"field:fbclid": "",

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,218 @@
"""Tests for webhook-related Pydantic schemas."""
import hashlib
import json
from datetime import datetime
import pytest
from pydantic import ValidationError
from alpine_bits_python.const import WebhookStatus
from alpine_bits_python.schemas import (
HotelData,
WebhookEndpointData,
WebhookRequestData,
)
class TestHotelData:
"""Tests for HotelData schema."""
def test_valid_hotel_data(self):
"""Test creating a valid HotelData instance."""
data = HotelData(
hotel_id="hotel123",
hotel_name="Test Hotel",
username="admin",
password_hash="hashed_password_123",
)
assert data.hotel_id == "hotel123"
assert data.hotel_name == "Test Hotel"
assert data.username == "admin"
assert data.password_hash == "hashed_password_123"
assert data.is_active is True
assert isinstance(data.created_at, datetime)
def test_whitespace_stripping(self):
"""Test that whitespace is stripped from string fields."""
data = HotelData(
hotel_id=" hotel123 ",
hotel_name=" Test Hotel ",
username=" admin ",
password_hash="hashed_password_123",
)
assert data.hotel_id == "hotel123"
assert data.hotel_name == "Test Hotel"
assert data.username == "admin"
def test_optional_fields(self):
"""Test that optional fields can be None."""
data = HotelData(
hotel_id="hotel123",
hotel_name="Test Hotel",
username="admin",
password_hash="hashed_password_123",
meta_account_id=None,
google_account_id=None,
)
assert data.meta_account_id is None
assert data.google_account_id is None
class TestWebhookEndpointData:
"""Tests for WebhookEndpointData schema."""
def test_valid_webhook_endpoint(self):
"""Test creating a valid WebhookEndpointData instance."""
data = WebhookEndpointData(
hotel_id="hotel123",
webhook_secret="secret_abc123",
webhook_type="wix_form",
)
assert data.hotel_id == "hotel123"
assert data.webhook_secret == "secret_abc123"
assert data.webhook_type == "wix_form"
assert data.is_enabled is True
assert isinstance(data.created_at, datetime)
def test_webhook_endpoint_with_description(self):
"""Test WebhookEndpointData with optional description."""
data = WebhookEndpointData(
hotel_id="hotel123",
webhook_secret="secret_abc123",
webhook_type="generic",
description="Main booking form",
)
assert data.description == "Main booking form"
def test_whitespace_stripping(self):
"""Test that whitespace is stripped from string fields."""
data = WebhookEndpointData(
hotel_id=" hotel123 ",
webhook_secret=" secret_abc123 ",
webhook_type=" wix_form ",
)
assert data.hotel_id == "hotel123"
assert data.webhook_secret == "secret_abc123"
assert data.webhook_type == "wix_form"
class TestWebhookRequestData:
"""Tests for WebhookRequestData schema."""
def test_auto_calculate_payload_hash(self):
"""Test that payload_hash is auto-calculated from payload_json."""
payload = {"name": "John", "email": "john@example.com"}
data = WebhookRequestData(payload_json=payload)
# Verify hash was calculated
assert data.payload_hash is not None
assert len(data.payload_hash) == 64 # SHA256 produces 64 hex chars
# Verify it matches the expected hash (same algorithm as api.py)
payload_json_str = json.dumps(payload, sort_keys=True)
expected_hash = hashlib.sha256(payload_json_str.encode("utf-8")).hexdigest()
assert data.payload_hash == expected_hash
def test_explicit_payload_hash(self):
"""Test providing payload_hash explicitly (for purged payloads)."""
explicit_hash = "a" * 64
data = WebhookRequestData(
payload_json=None,
payload_hash=explicit_hash,
)
assert data.payload_hash == explicit_hash
assert data.payload_json is None
def test_payload_hash_required(self):
"""Test that payload_hash is required (either calculated or explicit)."""
with pytest.raises(ValidationError) as exc_info:
WebhookRequestData(
payload_json=None,
payload_hash=None,
)
assert "payload_hash is required" in str(exc_info.value)
def test_consistent_hashing(self):
"""Test that the same payload always produces the same hash."""
payload = {"b": 2, "a": 1, "c": 3} # Unordered keys
data1 = WebhookRequestData(payload_json=payload.copy())
data2 = WebhookRequestData(payload_json=payload.copy())
assert data1.payload_hash == data2.payload_hash
def test_default_status(self):
"""Test that status defaults to PENDING."""
data = WebhookRequestData(payload_json={"test": "data"})
assert data.status == WebhookStatus.PENDING
def test_status_normalization(self):
"""Test that status is normalized to WebhookStatus enum."""
data = WebhookRequestData(
payload_json={"test": "data"},
status="completed", # String
)
assert data.status == WebhookStatus.COMPLETED
assert isinstance(data.status, WebhookStatus)
def test_retry_count_default(self):
"""Test that retry_count defaults to 0."""
data = WebhookRequestData(payload_json={"test": "data"})
assert data.retry_count == 0
def test_optional_foreign_keys(self):
"""Test optional foreign key fields."""
data = WebhookRequestData(
payload_json={"test": "data"},
webhook_endpoint_id=123,
hotel_id="hotel456",
)
assert data.webhook_endpoint_id == 123
assert data.hotel_id == "hotel456"
def test_result_tracking(self):
"""Test result tracking fields."""
data = WebhookRequestData(
payload_json={"test": "data"},
created_customer_id=1,
created_reservation_id=2,
)
assert data.created_customer_id == 1
assert data.created_reservation_id == 2
def test_purged_payload(self):
"""Test representing a purged webhook request (after processing)."""
explicit_hash = "b" * 64
data = WebhookRequestData(
payload_json=None,
payload_hash=explicit_hash,
status=WebhookStatus.COMPLETED,
purged_at=datetime.now(),
)
assert data.payload_json is None
assert data.payload_hash == explicit_hash
assert data.status == WebhookStatus.COMPLETED
assert data.purged_at is not None
def test_processing_metadata(self):
"""Test processing tracking fields."""
now = datetime.now()
data = WebhookRequestData(
payload_json={"test": "data"},
status=WebhookStatus.PROCESSING,
processing_started_at=now,
)
assert data.status == WebhookStatus.PROCESSING
assert data.processing_started_at == now
assert data.processing_completed_at is None
def test_request_metadata(self):
"""Test request metadata fields."""
data = WebhookRequestData(
payload_json={"test": "data"},
source_ip="192.168.1.1",
user_agent="Mozilla/5.0",
)
assert data.source_ip == "192.168.1.1"
assert data.user_agent == "Mozilla/5.0"

View File

@@ -0,0 +1,341 @@
"""Tests for webhook duplicate handling and reprocessing.
This module tests:
- Duplicate detection during normal operation
- Duplicate handling during app startup reprocessing
- Stuck webhooks that are duplicates
"""
import asyncio
import json
import uuid
from datetime import UTC, datetime
from pathlib import Path
from unittest.mock import patch
import pytest
import pytest_asyncio
from fastapi.testclient import TestClient
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
from alpine_bits_python.api import app
from alpine_bits_python.const import WebhookStatus
from alpine_bits_python.db import Base, Reservation, WebhookRequest
from alpine_bits_python.db_setup import reprocess_stuck_webhooks
from alpine_bits_python.hotel_service import hash_password
from alpine_bits_python.schemas import WebhookRequestData
from alpine_bits_python.webhook_processor import initialize_webhook_processors, webhook_registry
@pytest_asyncio.fixture
async def test_db_engine():
"""Create an in-memory SQLite database for testing."""
engine = create_async_engine(
"sqlite+aiosqlite:///:memory:",
echo=False,
)
# Create tables
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
yield engine
# Cleanup
await engine.dispose()
@pytest.fixture
def test_config():
"""Test configuration."""
return {
"server": {
"codecontext": "ADVERTISING",
"code": "70597314",
"companyname": "99tales Gmbh",
"res_id_source_context": "99tales",
},
"alpine_bits_auth": [
{
"hotel_id": "HOTEL123",
"hotel_name": "Test Hotel",
"username": "testuser",
"password": "testpass",
}
],
"default_hotel_code": "HOTEL123",
"default_hotel_name": "Test Hotel",
"database": {"url": "sqlite+aiosqlite:///:memory:"},
}
@pytest.fixture
def sample_wix_form_data():
"""Sample Wix form submission data with FIXED submissionId for duplicate testing."""
return {
"data": {
"submissionId": "FIXED-DUPLICATE-TEST-ID", # Fixed ID to trigger duplicates
"submissionTime": "2025-10-07T05:48:41.855Z",
"contact": {
"name": {"first": "John", "last": "Doe"},
"email": "john.doe.duplicate.test@example.com",
"phones": [{"e164Phone": "+1234567890"}],
"locale": "en-US",
"contactId": "contact-duplicate-test",
},
"field:anrede": "Mr.",
"field:form_field_5a7b": True,
"field:date_picker_a7c8": "2024-12-25",
"field:date_picker_7e65": "2024-12-31",
"field:number_7cf5": "2",
"field:anzahl_kinder": "1",
"field:alter_kind_1": "8",
"field:angebot_auswaehlen": "Christmas Special",
"field:utm_source": "google",
"field:utm_medium": "cpc",
"field:utm_campaign": "winter2024",
"field:fbclid": "test_fbclid_123",
"field:long_answer_3524": "Late check-in please",
}
}
class TestWebhookDuplicateHandling:
"""Test duplicate webhook handling during normal operation."""
def test_duplicate_webhook_during_operation(self, test_config, sample_wix_form_data):
"""Test that sending the same webhook twice handles duplicates gracefully."""
# Create engine and tables
engine = create_async_engine(
"sqlite+aiosqlite:///:memory:",
echo=False,
)
async def create_tables():
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
asyncio.run(create_tables())
# Mock config and database to use our test database
with patch("alpine_bits_python.api.load_config", return_value=test_config), \
patch("alpine_bits_python.api.create_database_engine", return_value=engine):
from alpine_bits_python.alpinebits_server import AlpineBitsServer
# Setup app state
app.state.engine = engine
app.state.async_sessionmaker = async_sessionmaker(
engine, expire_on_commit=False
)
app.state.config = test_config
app.state.alpine_bits_server = AlpineBitsServer(test_config)
with TestClient(app) as client:
# First submission - should succeed
response1 = client.post(
"/api/webhook/wix-form",
json=sample_wix_form_data
)
assert response1.status_code == 200
data1 = response1.json()
assert data1["status"] == "success"
# Second submission with same data - should detect duplicate at API level
response2 = client.post(
"/api/webhook/wix-form",
json=sample_wix_form_data
)
assert response2.status_code == 200
data2 = response2.json()
# API returns success for already-processed webhooks, but sets duplicate flag
assert data2["status"] == "success"
assert data2.get("duplicate") is True
assert "already processed" in data2["message"].lower()
# Cleanup
asyncio.run(engine.dispose())
class TestWebhookReprocessing:
"""Test webhook reprocessing on app restart."""
@pytest.mark.asyncio
async def test_reprocess_stuck_duplicate_webhook(self, test_db_engine, test_config):
"""Test that stuck webhooks that are duplicates are handled correctly on restart."""
AsyncSessionLocal = async_sessionmaker(test_db_engine, expire_on_commit=False)
# Step 1: Process a webhook normally to create a reservation
from alpine_bits_python.webhook_processor import process_wix_form_submission
test_form_file = Path(__file__).parent / "test_data" / f"test_form{1}.json"
if not test_form_file.exists():
pytest.skip(f"{test_form_file.name} not found")
# Load test form data
with test_form_file.open() as f:
test_data = json.load(f)
test_data["data"]["submissionId"] = "STUCK-WEBHOOK-TEST-ID" # Fixed ID for duplicate test
async with AsyncSessionLocal() as session:
result = await process_wix_form_submission(
test_data, session, config=test_config
)
await session.commit()
assert result["status"] == "success"
# Step 2: Verify the reservation was created
async with AsyncSessionLocal() as session:
stmt = select(Reservation).where(
Reservation.unique_id == "STUCK-WEBHOOK-TEST-ID"
)
result = await session.execute(stmt)
reservation = result.scalar_one_or_none()
assert reservation is not None, "Reservation should exist"
assert reservation.unique_id == "STUCK-WEBHOOK-TEST-ID"
# Step 3: Manually create a webhook request stuck in "processing" status
# This simulates a webhook that was being processed when the app crashed
from alpine_bits_python.db import WebhookEndpoint, Hotel
async with AsyncSessionLocal() as session:
# Create hotel
hotel = Hotel(
hotel_id="HOTEL123",
hotel_name="Test Hotel",
username="testuser",
password_hash=hash_password("testpass"),
created_at=datetime.now(UTC),
updated_at=datetime.now(UTC),
is_active=True,
)
session.add(hotel)
await session.flush()
# Create webhook endpoint
endpoint = WebhookEndpoint(
hotel_id="HOTEL123",
webhook_type="wix_form",
webhook_secret="test-secret-123",
is_enabled=True,
created_at=datetime.now(UTC),
)
session.add(endpoint)
await session.flush()
# Create stuck webhook request with the SAME payload
stuck_webhook_data = WebhookRequestData(
webhook_endpoint_id=endpoint.id,
hotel_id="HOTEL123",
payload_json=test_data,
status=WebhookStatus.PROCESSING, # Stuck in processing!
created_at=datetime.now(UTC),
)
stuck_webhook = WebhookRequest(**stuck_webhook_data.model_dump())
session.add(stuck_webhook)
await session.commit()
# initialize wix_form processor
initialize_webhook_processors()
# Step 4: Run reprocessing (simulates app restart)
await reprocess_stuck_webhooks(AsyncSessionLocal, test_config)
# Step 5: Verify the stuck webhook was marked as completed (not failed)
async with AsyncSessionLocal() as session:
stmt = select(WebhookRequest).where(
WebhookRequest.status == WebhookStatus.COMPLETED
)
result = await session.execute(stmt)
completed_webhooks = result.scalars().all()
assert len(completed_webhooks) == 1
assert completed_webhooks[0].last_error is None
# Verify no failed webhooks
stmt = select(WebhookRequest).where(
WebhookRequest.status == WebhookStatus.FAILED
)
result = await session.execute(stmt)
failed_webhooks = result.scalars().all()
assert len(failed_webhooks) == 0
# Step 6: Verify only ONE reservation exists (no duplicate)
async with AsyncSessionLocal() as session:
stmt = select(Reservation)
result = await session.execute(stmt)
reservations = result.scalars().all()
assert len(reservations) == 1
class TestWebhookReprocessingNeverBlocksStartup:
"""Test that reprocessing never blocks app startup."""
@pytest.mark.asyncio
async def test_reprocessing_error_does_not_block_startup(
self, test_db_engine, test_config
):
"""Test that even if reprocessing fails, app startup continues."""
AsyncSessionLocal = async_sessionmaker(test_db_engine, expire_on_commit=False)
from alpine_bits_python.db import WebhookEndpoint, Hotel
# Create a stuck webhook with invalid data that will cause processing to fail
async with AsyncSessionLocal() as session:
# Create hotel
hotel = Hotel(
hotel_id="HOTEL123",
hotel_name="Test Hotel",
username="testuser",
password_hash=hash_password("testpass"),
created_at=datetime.now(UTC),
updated_at=datetime.now(UTC),
is_active=True,
)
session.add(hotel)
await session.flush()
# Create webhook endpoint
endpoint = WebhookEndpoint(
hotel_id="HOTEL123",
webhook_type="wix_form",
webhook_secret="test-secret-123",
is_enabled=True,
created_at=datetime.now(UTC),
)
session.add(endpoint)
await session.flush()
webhook_request = WebhookRequestData(
hotel_id="HOTEL123",
payload_json={"data": {"invalid": "data"}}, # Missing required fields
status=WebhookStatus.PROCESSING
)
stuck_webhook = WebhookRequest(**webhook_request.model_dump())
session.add(stuck_webhook) ## Cannot add the stuck webhook. Integrity Error payload_hash is missing
await session.commit()
# This should NOT raise an exception - it should log and continue
try:
await reprocess_stuck_webhooks(AsyncSessionLocal, test_config)
except Exception as e:
pytest.fail(
f"reprocess_stuck_webhooks should NEVER raise exceptions, but got: {e}"
)
# Verify the webhook was marked as failed
async with AsyncSessionLocal() as session:
stmt = select(WebhookRequest).where(
WebhookRequest.status == WebhookStatus.FAILED
)
result = await session.execute(stmt)
failed_webhooks = result.scalars().all()
assert len(failed_webhooks) == 1
assert failed_webhooks[0].last_error is not None

327
tests/test_xml_builders.py Normal file
View File

@@ -0,0 +1,327 @@
"""Tests for XML builder helpers."""
import pytest
from xml.etree import ElementTree as ET
from tests.helpers.xml_builders import (
ReservationXMLBuilder,
MultiReservationXMLBuilder,
RoomReservationBuilder,
)
class TestRoomReservationBuilder:
"""Test RoomReservationBuilder functionality."""
def test_basic_room_without_revenue(self):
"""Test creating a basic room reservation without revenue."""
builder = RoomReservationBuilder(
arrival="2025-12-01",
departure="2025-12-03",
room_type="DZV",
room_number="101",
)
elem = builder.build()
assert elem.tag == "roomReservation"
assert elem.get("arrival") == "2025-12-01"
assert elem.get("departure") == "2025-12-03"
assert elem.get("roomType") == "DZV"
assert elem.get("roomNumber") == "101"
# Check daily sales - should have 3 entries (12-01, 12-02, 12-03)
daily_sales = elem.find("dailySales")
assert daily_sales is not None
daily_sale_elements = daily_sales.findall("dailySale")
assert len(daily_sale_elements) == 3
# First two should have no revenue attributes
assert daily_sale_elements[0].get("revenueTotal") is None
assert daily_sale_elements[0].get("revenueLogis") is None
def test_room_with_revenue(self):
"""Test creating a room with revenue per day."""
builder = RoomReservationBuilder(
arrival="2025-12-01",
departure="2025-12-03",
room_type="DZV",
room_number="101",
revenue_logis_per_day=150.0,
)
elem = builder.build()
daily_sales = elem.find("dailySales")
daily_sale_elements = daily_sales.findall("dailySale")
# Should have 3 entries total
assert len(daily_sale_elements) == 3
# First two days should have revenue
assert daily_sale_elements[0].get("revenueTotal") == "150.0"
assert daily_sale_elements[0].get("revenueLogis") == "150.0"
assert daily_sale_elements[1].get("revenueTotal") == "150.0"
assert daily_sale_elements[1].get("revenueLogis") == "150.0"
# Departure day should have no revenue
assert daily_sale_elements[2].get("revenueTotal") is None
assert daily_sale_elements[2].get("revenueLogis") is None
def test_room_with_children_and_infants(self):
"""Test room with children and infants attributes."""
builder = RoomReservationBuilder(
arrival="2025-12-01",
departure="2025-12-02",
adults=2,
children=1,
infants=1,
)
elem = builder.build()
assert elem.get("adults") == "2"
assert elem.get("children") == "1"
assert elem.get("infants") == "1"
class TestReservationXMLBuilder:
"""Test ReservationXMLBuilder functionality."""
def test_basic_reservation(self):
"""Test creating a basic reservation with one room."""
builder = ReservationXMLBuilder(
hotel_id="39054_001",
reservation_id="12345",
reservation_number="RES-001",
reservation_date="2025-11-14",
)
builder.set_guest(
guest_id="1001",
first_name="John",
last_name="Doe",
email="john@example.com",
)
builder.add_room(
arrival="2025-12-01",
departure="2025-12-05",
revenue_logis_per_day=150.0,
)
xml_string = builder.build_xml()
# Parse and verify structure
root = ET.fromstring(xml_string)
assert root.tag == "reservations"
reservation = root.find("reservation")
assert reservation is not None
assert reservation.get("hotelID") == "39054_001"
assert reservation.get("id") == "12345"
assert reservation.get("number") == "RES-001"
guest = reservation.find("guest")
assert guest is not None
assert guest.get("firstName") == "John"
assert guest.get("lastName") == "Doe"
assert guest.get("email") == "john@example.com"
room_reservations = reservation.find("roomReservations")
assert room_reservations is not None
rooms = room_reservations.findall("roomReservation")
assert len(rooms) == 1
def test_reservation_with_multiple_rooms(self):
"""Test reservation with multiple rooms."""
builder = ReservationXMLBuilder(
hotel_id="39054_001",
reservation_id="12345",
reservation_number="RES-001",
reservation_date="2025-11-14",
)
builder.set_guest(
guest_id="1001",
first_name="John",
last_name="Doe",
email="john@example.com",
)
builder.add_room(
arrival="2025-12-01",
departure="2025-12-05",
room_number="101",
revenue_logis_per_day=150.0,
)
builder.add_room(
arrival="2025-12-01",
departure="2025-12-05",
room_number="102",
revenue_logis_per_day=200.0,
)
xml_string = builder.build_xml()
root = ET.fromstring(xml_string)
reservation = root.find("reservation")
room_reservations = reservation.find("roomReservations")
rooms = room_reservations.findall("roomReservation")
assert len(rooms) == 2
assert rooms[0].get("roomNumber") == "101"
assert rooms[1].get("roomNumber") == "102"
def test_reservation_with_advertising_data(self):
"""Test reservation with advertising campaign data."""
builder = ReservationXMLBuilder(
hotel_id="39054_001",
reservation_id="12345",
reservation_number="RES-001",
reservation_date="2025-11-14",
advertising_medium="99TALES",
advertising_partner="google",
advertising_campagne="EAIaIQobChMI...",
)
builder.set_guest(
guest_id="1001",
first_name="John",
last_name="Doe",
email="john@example.com",
)
builder.add_room(
arrival="2025-12-01",
departure="2025-12-05",
)
xml_string = builder.build_xml()
root = ET.fromstring(xml_string)
reservation = root.find("reservation")
assert reservation.get("advertisingMedium") == "99TALES"
assert reservation.get("advertisingPartner") == "google"
assert reservation.get("advertisingCampagne") == "EAIaIQobChMI..."
class TestMultiReservationXMLBuilder:
"""Test MultiReservationXMLBuilder functionality."""
def test_multiple_reservations(self):
"""Test creating XML with multiple reservations."""
multi_builder = MultiReservationXMLBuilder()
# Add first reservation
res1 = ReservationXMLBuilder(
hotel_id="39054_001",
reservation_id="12345",
reservation_number="RES-001",
reservation_date="2025-11-14",
)
res1.set_guest(
guest_id="1001",
first_name="John",
last_name="Doe",
email="john@example.com",
)
res1.add_room(
arrival="2025-12-01",
departure="2025-12-03",
revenue_logis_per_day=150.0,
)
multi_builder.add_reservation(res1)
# Add second reservation
res2 = ReservationXMLBuilder(
hotel_id="39054_001",
reservation_id="12346",
reservation_number="RES-002",
reservation_date="2025-11-15",
)
res2.set_guest(
guest_id="1002",
first_name="Jane",
last_name="Smith",
email="jane@example.com",
)
res2.add_room(
arrival="2025-12-10",
departure="2025-12-12",
revenue_logis_per_day=200.0,
)
multi_builder.add_reservation(res2)
xml_string = multi_builder.build_xml()
root = ET.fromstring(xml_string)
assert root.tag == "reservations"
reservations = root.findall("reservation")
assert len(reservations) == 2
assert reservations[0].get("id") == "12345"
assert reservations[1].get("id") == "12346"
class TestConvenienceFeatures:
"""Test convenience features for common test scenarios."""
def test_simple_one_liner_reservation(self):
"""Test creating a simple reservation in a fluent style."""
xml = (
ReservationXMLBuilder(
hotel_id="39054_001",
reservation_id="12345",
reservation_number="RES-001",
reservation_date="2025-11-14",
)
.set_guest(
guest_id="1001",
first_name="John",
last_name="Doe",
email="john@example.com",
)
.add_room(
arrival="2025-12-01",
departure="2025-12-05",
revenue_logis_per_day=160.0,
)
.build_xml()
)
assert '<?xml version="1.0" ?>' in xml
assert 'hotelID="39054_001"' in xml
assert 'revenueLogis="160.0"' in xml
def test_revenue_calculation_for_multi_day_stay(self):
"""Test that daily sales are correctly generated for multi-day stays."""
builder = ReservationXMLBuilder(
hotel_id="39054_001",
reservation_id="12345",
reservation_number="RES-001",
reservation_date="2025-11-14",
)
builder.set_guest(
guest_id="1001",
first_name="John",
last_name="Doe",
email="john@example.com",
)
# 7-day stay (June 25 - July 2, 7 nights)
builder.add_room(
arrival="2026-06-25",
departure="2026-07-02",
revenue_logis_per_day=160.0,
)
elem = builder.build()
room_reservations = elem.find("roomReservations")
room = room_reservations.find("roomReservation")
daily_sales = room.find("dailySales")
daily_sale_elements = daily_sales.findall("dailySale")
# Should have 8 daily sale entries (7 nights + departure day)
assert len(daily_sale_elements) == 8
# First 7 should have revenue
for i in range(7):
assert daily_sale_elements[i].get("revenueLogis") == "160.0"
# Departure day should not have revenue
assert daily_sale_elements[7].get("revenueLogis") is None
if __name__ == "__main__":
pytest.main([__file__, "-v"])

101
update_csv_import_dates.py Normal file
View File

@@ -0,0 +1,101 @@
#!/usr/bin/env python3
"""
Update the created_at timestamps for CSV-imported leads with the new email receive dates.
"""
import asyncio
import csv
from datetime import datetime
from sqlalchemy import text, select
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
from src.alpine_bits_python.config_loader import load_config
from src.alpine_bits_python.db import Reservation, Customer
async def main():
# Load config
config = load_config()
db_url = config["database"]["url"]
schema = config["database"]["schema"]
# Create async engine
engine = create_async_engine(db_url)
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
async with engine.begin() as conn:
await conn.execute(text(f"SET search_path TO {schema}"))
# Load the CSV with the new dates
csv_dates = {}
try:
with open("leads_export.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
name = row.get("name", "").strip()
lastname = row.get("lastname", "").strip()
email = row.get("mail", "").strip()
received_date = row.get("received_date", "").strip()
if email and received_date:
# Use email as primary key since it's unique
csv_dates[email.lower()] = {
"name": name,
"lastname": lastname,
"received_date": received_date,
}
except FileNotFoundError:
print("ERROR: leads_export.csv not found. Run extract_leads.py first.")
return
print(f"Loaded {len(csv_dates)} date entries from CSV")
# Fetch CSV-imported reservations
async with async_session() as session:
async with engine.begin() as conn:
await conn.execute(text(f"SET search_path TO {schema}"))
# Query for CSV imports
result = await session.execute(
select(Reservation, Customer).join(
Customer, Reservation.customer_id == Customer.id
).where(Reservation.unique_id.like("csv_%"))
)
rows = result.all()
print(f"\nFound {len(rows)} CSV-imported reservations to update")
updated = 0
failed = 0
for reservation, customer in rows:
email = customer.email_address
if email and email.lower() in csv_dates:
new_date_str = csv_dates[email.lower()]["received_date"]
try:
# Parse ISO format date
new_date = datetime.fromisoformat(new_date_str)
old_date = reservation.created_at
print(f" Updating: {customer.given_name} ({email})")
print(f" Old: {old_date}")
print(f" New: {new_date}")
reservation.created_at = new_date
updated += 1
except ValueError as e:
print(f" FAILED to parse date for {email}: {e}")
failed += 1
elif email:
print(f" WARNING: No CSV date found for {customer.given_name} ({email})")
print(f"\nSummary: {updated} updated, {failed} failed")
if updated > 0:
await session.commit()
print("Changes committed to database")
else:
print("No changes made")
await engine.dispose()
if __name__ == "__main__":
asyncio.run(main())

79
uv.lock generated
View File

@@ -37,10 +37,12 @@ dependencies = [
{ name = "alembic" },
{ name = "annotatedyaml" },
{ name = "asyncpg" },
{ name = "bcrypt" },
{ name = "dotenv" },
{ name = "fast-langdetect" },
{ name = "fastapi" },
{ name = "generateds" },
{ name = "git-filter-repo" },
{ name = "httpx" },
{ name = "lxml" },
{ name = "pandas" },
@@ -69,10 +71,12 @@ requires-dist = [
{ name = "alembic", specifier = ">=1.17.2" },
{ name = "annotatedyaml", specifier = ">=1.0.0" },
{ name = "asyncpg", specifier = ">=0.30.0" },
{ name = "bcrypt", specifier = ">=5.0.0" },
{ name = "dotenv", specifier = ">=0.9.9" },
{ name = "fast-langdetect", specifier = ">=1.0.0" },
{ name = "fastapi", specifier = ">=0.117.1" },
{ name = "generateds", specifier = ">=2.44.3" },
{ name = "git-filter-repo", specifier = ">=2.47.0" },
{ name = "httpx", specifier = ">=0.28.1" },
{ name = "lxml", specifier = ">=6.0.1" },
{ name = "pandas", specifier = ">=2.3.3" },
@@ -171,6 +175,72 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/c8/a4/cec76b3389c4c5ff66301cd100fe88c318563ec8a520e0b2e792b5b84972/asyncpg-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:f59b430b8e27557c3fb9869222559f7417ced18688375825f8f12302c34e915e", size = 621623, upload-time = "2024-10-20T00:30:09.024Z" },
]
[[package]]
name = "bcrypt"
version = "5.0.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d4/36/3329e2518d70ad8e2e5817d5a4cac6bba05a47767ec416c7d020a965f408/bcrypt-5.0.0.tar.gz", hash = "sha256:f748f7c2d6fd375cc93d3fba7ef4a9e3a092421b8dbf34d8d4dc06be9492dfdd", size = 25386, upload-time = "2025-09-25T19:50:47.829Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/13/85/3e65e01985fddf25b64ca67275bb5bdb4040bd1a53b66d355c6c37c8a680/bcrypt-5.0.0-cp313-cp313t-macosx_10_12_universal2.whl", hash = "sha256:f3c08197f3039bec79cee59a606d62b96b16669cff3949f21e74796b6e3cd2be", size = 481806, upload-time = "2025-09-25T19:49:05.102Z" },
{ url = "https://files.pythonhosted.org/packages/44/dc/01eb79f12b177017a726cbf78330eb0eb442fae0e7b3dfd84ea2849552f3/bcrypt-5.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:200af71bc25f22006f4069060c88ed36f8aa4ff7f53e67ff04d2ab3f1e79a5b2", size = 268626, upload-time = "2025-09-25T19:49:06.723Z" },
{ url = "https://files.pythonhosted.org/packages/8c/cf/e82388ad5959c40d6afd94fb4743cc077129d45b952d46bdc3180310e2df/bcrypt-5.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:baade0a5657654c2984468efb7d6c110db87ea63ef5a4b54732e7e337253e44f", size = 271853, upload-time = "2025-09-25T19:49:08.028Z" },
{ url = "https://files.pythonhosted.org/packages/ec/86/7134b9dae7cf0efa85671651341f6afa695857fae172615e960fb6a466fa/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c58b56cdfb03202b3bcc9fd8daee8e8e9b6d7e3163aa97c631dfcfcc24d36c86", size = 269793, upload-time = "2025-09-25T19:49:09.727Z" },
{ url = "https://files.pythonhosted.org/packages/cc/82/6296688ac1b9e503d034e7d0614d56e80c5d1a08402ff856a4549cb59207/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4bfd2a34de661f34d0bda43c3e4e79df586e4716ef401fe31ea39d69d581ef23", size = 289930, upload-time = "2025-09-25T19:49:11.204Z" },
{ url = "https://files.pythonhosted.org/packages/d1/18/884a44aa47f2a3b88dd09bc05a1e40b57878ecd111d17e5bba6f09f8bb77/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ed2e1365e31fc73f1825fa830f1c8f8917ca1b3ca6185773b349c20fd606cec2", size = 272194, upload-time = "2025-09-25T19:49:12.524Z" },
{ url = "https://files.pythonhosted.org/packages/0e/8f/371a3ab33c6982070b674f1788e05b656cfbf5685894acbfef0c65483a59/bcrypt-5.0.0-cp313-cp313t-manylinux_2_34_aarch64.whl", hash = "sha256:83e787d7a84dbbfba6f250dd7a5efd689e935f03dd83b0f919d39349e1f23f83", size = 269381, upload-time = "2025-09-25T19:49:14.308Z" },
{ url = "https://files.pythonhosted.org/packages/b1/34/7e4e6abb7a8778db6422e88b1f06eb07c47682313997ee8a8f9352e5a6f1/bcrypt-5.0.0-cp313-cp313t-manylinux_2_34_x86_64.whl", hash = "sha256:137c5156524328a24b9fac1cb5db0ba618bc97d11970b39184c1d87dc4bf1746", size = 271750, upload-time = "2025-09-25T19:49:15.584Z" },
{ url = "https://files.pythonhosted.org/packages/c0/1b/54f416be2499bd72123c70d98d36c6cd61a4e33d9b89562c22481c81bb30/bcrypt-5.0.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:38cac74101777a6a7d3b3e3cfefa57089b5ada650dce2baf0cbdd9d65db22a9e", size = 303757, upload-time = "2025-09-25T19:49:17.244Z" },
{ url = "https://files.pythonhosted.org/packages/13/62/062c24c7bcf9d2826a1a843d0d605c65a755bc98002923d01fd61270705a/bcrypt-5.0.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:d8d65b564ec849643d9f7ea05c6d9f0cd7ca23bdd4ac0c2dbef1104ab504543d", size = 306740, upload-time = "2025-09-25T19:49:18.693Z" },
{ url = "https://files.pythonhosted.org/packages/d5/c8/1fdbfc8c0f20875b6b4020f3c7dc447b8de60aa0be5faaf009d24242aec9/bcrypt-5.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:741449132f64b3524e95cd30e5cd3343006ce146088f074f31ab26b94e6c75ba", size = 334197, upload-time = "2025-09-25T19:49:20.523Z" },
{ url = "https://files.pythonhosted.org/packages/a6/c1/8b84545382d75bef226fbc6588af0f7b7d095f7cd6a670b42a86243183cd/bcrypt-5.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:212139484ab3207b1f0c00633d3be92fef3c5f0af17cad155679d03ff2ee1e41", size = 352974, upload-time = "2025-09-25T19:49:22.254Z" },
{ url = "https://files.pythonhosted.org/packages/10/a6/ffb49d4254ed085e62e3e5dd05982b4393e32fe1e49bb1130186617c29cd/bcrypt-5.0.0-cp313-cp313t-win32.whl", hash = "sha256:9d52ed507c2488eddd6a95bccee4e808d3234fa78dd370e24bac65a21212b861", size = 148498, upload-time = "2025-09-25T19:49:24.134Z" },
{ url = "https://files.pythonhosted.org/packages/48/a9/259559edc85258b6d5fc5471a62a3299a6aa37a6611a169756bf4689323c/bcrypt-5.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f6984a24db30548fd39a44360532898c33528b74aedf81c26cf29c51ee47057e", size = 145853, upload-time = "2025-09-25T19:49:25.702Z" },
{ url = "https://files.pythonhosted.org/packages/2d/df/9714173403c7e8b245acf8e4be8876aac64a209d1b392af457c79e60492e/bcrypt-5.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:9fffdb387abe6aa775af36ef16f55e318dcda4194ddbf82007a6f21da29de8f5", size = 139626, upload-time = "2025-09-25T19:49:26.928Z" },
{ url = "https://files.pythonhosted.org/packages/f8/14/c18006f91816606a4abe294ccc5d1e6f0e42304df5a33710e9e8e95416e1/bcrypt-5.0.0-cp314-cp314t-macosx_10_12_universal2.whl", hash = "sha256:4870a52610537037adb382444fefd3706d96d663ac44cbb2f37e3919dca3d7ef", size = 481862, upload-time = "2025-09-25T19:49:28.365Z" },
{ url = "https://files.pythonhosted.org/packages/67/49/dd074d831f00e589537e07a0725cf0e220d1f0d5d8e85ad5bbff251c45aa/bcrypt-5.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48f753100931605686f74e27a7b49238122aa761a9aefe9373265b8b7aa43ea4", size = 268544, upload-time = "2025-09-25T19:49:30.39Z" },
{ url = "https://files.pythonhosted.org/packages/f5/91/50ccba088b8c474545b034a1424d05195d9fcbaaf802ab8bfe2be5a4e0d7/bcrypt-5.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f70aadb7a809305226daedf75d90379c397b094755a710d7014b8b117df1ebbf", size = 271787, upload-time = "2025-09-25T19:49:32.144Z" },
{ url = "https://files.pythonhosted.org/packages/aa/e7/d7dba133e02abcda3b52087a7eea8c0d4f64d3e593b4fffc10c31b7061f3/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:744d3c6b164caa658adcb72cb8cc9ad9b4b75c7db507ab4bc2480474a51989da", size = 269753, upload-time = "2025-09-25T19:49:33.885Z" },
{ url = "https://files.pythonhosted.org/packages/33/fc/5b145673c4b8d01018307b5c2c1fc87a6f5a436f0ad56607aee389de8ee3/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a28bc05039bdf3289d757f49d616ab3efe8cf40d8e8001ccdd621cd4f98f4fc9", size = 289587, upload-time = "2025-09-25T19:49:35.144Z" },
{ url = "https://files.pythonhosted.org/packages/27/d7/1ff22703ec6d4f90e62f1a5654b8867ef96bafb8e8102c2288333e1a6ca6/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:7f277a4b3390ab4bebe597800a90da0edae882c6196d3038a73adf446c4f969f", size = 272178, upload-time = "2025-09-25T19:49:36.793Z" },
{ url = "https://files.pythonhosted.org/packages/c8/88/815b6d558a1e4d40ece04a2f84865b0fef233513bd85fd0e40c294272d62/bcrypt-5.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:79cfa161eda8d2ddf29acad370356b47f02387153b11d46042e93a0a95127493", size = 269295, upload-time = "2025-09-25T19:49:38.164Z" },
{ url = "https://files.pythonhosted.org/packages/51/8c/e0db387c79ab4931fc89827d37608c31cc57b6edc08ccd2386139028dc0d/bcrypt-5.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a5393eae5722bcef046a990b84dff02b954904c36a194f6cfc817d7dca6c6f0b", size = 271700, upload-time = "2025-09-25T19:49:39.917Z" },
{ url = "https://files.pythonhosted.org/packages/06/83/1570edddd150f572dbe9fc00f6203a89fc7d4226821f67328a85c330f239/bcrypt-5.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7f4c94dec1b5ab5d522750cb059bb9409ea8872d4494fd152b53cca99f1ddd8c", size = 334034, upload-time = "2025-09-25T19:49:41.227Z" },
{ url = "https://files.pythonhosted.org/packages/c9/f2/ea64e51a65e56ae7a8a4ec236c2bfbdd4b23008abd50ac33fbb2d1d15424/bcrypt-5.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0cae4cb350934dfd74c020525eeae0a5f79257e8a201c0c176f4b84fdbf2a4b4", size = 352766, upload-time = "2025-09-25T19:49:43.08Z" },
{ url = "https://files.pythonhosted.org/packages/d7/d4/1a388d21ee66876f27d1a1f41287897d0c0f1712ef97d395d708ba93004c/bcrypt-5.0.0-cp314-cp314t-win32.whl", hash = "sha256:b17366316c654e1ad0306a6858e189fc835eca39f7eb2cafd6aaca8ce0c40a2e", size = 152449, upload-time = "2025-09-25T19:49:44.971Z" },
{ url = "https://files.pythonhosted.org/packages/3f/61/3291c2243ae0229e5bca5d19f4032cecad5dfb05a2557169d3a69dc0ba91/bcrypt-5.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:92864f54fb48b4c718fc92a32825d0e42265a627f956bc0361fe869f1adc3e7d", size = 149310, upload-time = "2025-09-25T19:49:46.162Z" },
{ url = "https://files.pythonhosted.org/packages/3e/89/4b01c52ae0c1a681d4021e5dd3e45b111a8fb47254a274fa9a378d8d834b/bcrypt-5.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dd19cf5184a90c873009244586396a6a884d591a5323f0e8a5922560718d4993", size = 143761, upload-time = "2025-09-25T19:49:47.345Z" },
{ url = "https://files.pythonhosted.org/packages/84/29/6237f151fbfe295fe3e074ecc6d44228faa1e842a81f6d34a02937ee1736/bcrypt-5.0.0-cp38-abi3-macosx_10_12_universal2.whl", hash = "sha256:fc746432b951e92b58317af8e0ca746efe93e66555f1b40888865ef5bf56446b", size = 494553, upload-time = "2025-09-25T19:49:49.006Z" },
{ url = "https://files.pythonhosted.org/packages/45/b6/4c1205dde5e464ea3bd88e8742e19f899c16fa8916fb8510a851fae985b5/bcrypt-5.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c2388ca94ffee269b6038d48747f4ce8df0ffbea43f31abfa18ac72f0218effb", size = 275009, upload-time = "2025-09-25T19:49:50.581Z" },
{ url = "https://files.pythonhosted.org/packages/3b/71/427945e6ead72ccffe77894b2655b695ccf14ae1866cd977e185d606dd2f/bcrypt-5.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:560ddb6ec730386e7b3b26b8b4c88197aaed924430e7b74666a586ac997249ef", size = 278029, upload-time = "2025-09-25T19:49:52.533Z" },
{ url = "https://files.pythonhosted.org/packages/17/72/c344825e3b83c5389a369c8a8e58ffe1480b8a699f46c127c34580c4666b/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d79e5c65dcc9af213594d6f7f1fa2c98ad3fc10431e7aa53c176b441943efbdd", size = 275907, upload-time = "2025-09-25T19:49:54.709Z" },
{ url = "https://files.pythonhosted.org/packages/0b/7e/d4e47d2df1641a36d1212e5c0514f5291e1a956a7749f1e595c07a972038/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2b732e7d388fa22d48920baa267ba5d97cca38070b69c0e2d37087b381c681fd", size = 296500, upload-time = "2025-09-25T19:49:56.013Z" },
{ url = "https://files.pythonhosted.org/packages/0f/c3/0ae57a68be2039287ec28bc463b82e4b8dc23f9d12c0be331f4782e19108/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0c8e093ea2532601a6f686edbc2c6b2ec24131ff5c52f7610dd64fa4553b5464", size = 278412, upload-time = "2025-09-25T19:49:57.356Z" },
{ url = "https://files.pythonhosted.org/packages/45/2b/77424511adb11e6a99e3a00dcc7745034bee89036ad7d7e255a7e47be7d8/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5b1589f4839a0899c146e8892efe320c0fa096568abd9b95593efac50a87cb75", size = 275486, upload-time = "2025-09-25T19:49:59.116Z" },
{ url = "https://files.pythonhosted.org/packages/43/0a/405c753f6158e0f3f14b00b462d8bca31296f7ecfc8fc8bc7919c0c7d73a/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:89042e61b5e808b67daf24a434d89bab164d4de1746b37a8d173b6b14f3db9ff", size = 277940, upload-time = "2025-09-25T19:50:00.869Z" },
{ url = "https://files.pythonhosted.org/packages/62/83/b3efc285d4aadc1fa83db385ec64dcfa1707e890eb42f03b127d66ac1b7b/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:e3cf5b2560c7b5a142286f69bde914494b6d8f901aaa71e453078388a50881c4", size = 310776, upload-time = "2025-09-25T19:50:02.393Z" },
{ url = "https://files.pythonhosted.org/packages/95/7d/47ee337dacecde6d234890fe929936cb03ebc4c3a7460854bbd9c97780b8/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f632fd56fc4e61564f78b46a2269153122db34988e78b6be8b32d28507b7eaeb", size = 312922, upload-time = "2025-09-25T19:50:04.232Z" },
{ url = "https://files.pythonhosted.org/packages/d6/3a/43d494dfb728f55f4e1cf8fd435d50c16a2d75493225b54c8d06122523c6/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:801cad5ccb6b87d1b430f183269b94c24f248dddbbc5c1f78b6ed231743e001c", size = 341367, upload-time = "2025-09-25T19:50:05.559Z" },
{ url = "https://files.pythonhosted.org/packages/55/ab/a0727a4547e383e2e22a630e0f908113db37904f58719dc48d4622139b5c/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3cf67a804fc66fc217e6914a5635000259fbbbb12e78a99488e4d5ba445a71eb", size = 359187, upload-time = "2025-09-25T19:50:06.916Z" },
{ url = "https://files.pythonhosted.org/packages/1b/bb/461f352fdca663524b4643d8b09e8435b4990f17fbf4fea6bc2a90aa0cc7/bcrypt-5.0.0-cp38-abi3-win32.whl", hash = "sha256:3abeb543874b2c0524ff40c57a4e14e5d3a66ff33fb423529c88f180fd756538", size = 153752, upload-time = "2025-09-25T19:50:08.515Z" },
{ url = "https://files.pythonhosted.org/packages/41/aa/4190e60921927b7056820291f56fc57d00d04757c8b316b2d3c0d1d6da2c/bcrypt-5.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:35a77ec55b541e5e583eb3436ffbbf53b0ffa1fa16ca6782279daf95d146dcd9", size = 150881, upload-time = "2025-09-25T19:50:09.742Z" },
{ url = "https://files.pythonhosted.org/packages/54/12/cd77221719d0b39ac0b55dbd39358db1cd1246e0282e104366ebbfb8266a/bcrypt-5.0.0-cp38-abi3-win_arm64.whl", hash = "sha256:cde08734f12c6a4e28dc6755cd11d3bdfea608d93d958fffbe95a7026ebe4980", size = 144931, upload-time = "2025-09-25T19:50:11.016Z" },
{ url = "https://files.pythonhosted.org/packages/5d/ba/2af136406e1c3839aea9ecadc2f6be2bcd1eff255bd451dd39bcf302c47a/bcrypt-5.0.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0c418ca99fd47e9c59a301744d63328f17798b5947b0f791e9af3c1c499c2d0a", size = 495313, upload-time = "2025-09-25T19:50:12.309Z" },
{ url = "https://files.pythonhosted.org/packages/ac/ee/2f4985dbad090ace5ad1f7dd8ff94477fe089b5fab2040bd784a3d5f187b/bcrypt-5.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddb4e1500f6efdd402218ffe34d040a1196c072e07929b9820f363a1fd1f4191", size = 275290, upload-time = "2025-09-25T19:50:13.673Z" },
{ url = "https://files.pythonhosted.org/packages/e4/6e/b77ade812672d15cf50842e167eead80ac3514f3beacac8902915417f8b7/bcrypt-5.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7aeef54b60ceddb6f30ee3db090351ecf0d40ec6e2abf41430997407a46d2254", size = 278253, upload-time = "2025-09-25T19:50:15.089Z" },
{ url = "https://files.pythonhosted.org/packages/36/c4/ed00ed32f1040f7990dac7115f82273e3c03da1e1a1587a778d8cea496d8/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f0ce778135f60799d89c9693b9b398819d15f1921ba15fe719acb3178215a7db", size = 276084, upload-time = "2025-09-25T19:50:16.699Z" },
{ url = "https://files.pythonhosted.org/packages/e7/c4/fa6e16145e145e87f1fa351bbd54b429354fd72145cd3d4e0c5157cf4c70/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a71f70ee269671460b37a449f5ff26982a6f2ba493b3eabdd687b4bf35f875ac", size = 297185, upload-time = "2025-09-25T19:50:18.525Z" },
{ url = "https://files.pythonhosted.org/packages/24/b4/11f8a31d8b67cca3371e046db49baa7c0594d71eb40ac8121e2fc0888db0/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8429e1c410b4073944f03bd778a9e066e7fad723564a52ff91841d278dfc822", size = 278656, upload-time = "2025-09-25T19:50:19.809Z" },
{ url = "https://files.pythonhosted.org/packages/ac/31/79f11865f8078e192847d2cb526e3fa27c200933c982c5b2869720fa5fce/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:edfcdcedd0d0f05850c52ba3127b1fce70b9f89e0fe5ff16517df7e81fa3cbb8", size = 275662, upload-time = "2025-09-25T19:50:21.567Z" },
{ url = "https://files.pythonhosted.org/packages/d4/8d/5e43d9584b3b3591a6f9b68f755a4da879a59712981ef5ad2a0ac1379f7a/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:611f0a17aa4a25a69362dcc299fda5c8a3d4f160e2abb3831041feb77393a14a", size = 278240, upload-time = "2025-09-25T19:50:23.305Z" },
{ url = "https://files.pythonhosted.org/packages/89/48/44590e3fc158620f680a978aafe8f87a4c4320da81ed11552f0323aa9a57/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:db99dca3b1fdc3db87d7c57eac0c82281242d1eabf19dcb8a6b10eb29a2e72d1", size = 311152, upload-time = "2025-09-25T19:50:24.597Z" },
{ url = "https://files.pythonhosted.org/packages/5f/85/e4fbfc46f14f47b0d20493669a625da5827d07e8a88ee460af6cd9768b44/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:5feebf85a9cefda32966d8171f5db7e3ba964b77fdfe31919622256f80f9cf42", size = 313284, upload-time = "2025-09-25T19:50:26.268Z" },
{ url = "https://files.pythonhosted.org/packages/25/ae/479f81d3f4594456a01ea2f05b132a519eff9ab5768a70430fa1132384b1/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3ca8a166b1140436e058298a34d88032ab62f15aae1c598580333dc21d27ef10", size = 341643, upload-time = "2025-09-25T19:50:28.02Z" },
{ url = "https://files.pythonhosted.org/packages/df/d2/36a086dee1473b14276cd6ea7f61aef3b2648710b5d7f1c9e032c29b859f/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:61afc381250c3182d9078551e3ac3a41da14154fbff647ddf52a769f588c4172", size = 359698, upload-time = "2025-09-25T19:50:31.347Z" },
{ url = "https://files.pythonhosted.org/packages/c0/f6/688d2cd64bfd0b14d805ddb8a565e11ca1fb0fd6817175d58b10052b6d88/bcrypt-5.0.0-cp39-abi3-win32.whl", hash = "sha256:64d7ce196203e468c457c37ec22390f1a61c85c6f0b8160fd752940ccfb3a683", size = 153725, upload-time = "2025-09-25T19:50:34.384Z" },
{ url = "https://files.pythonhosted.org/packages/9f/b9/9d9a641194a730bda138b3dfe53f584d61c58cd5230e37566e83ec2ffa0d/bcrypt-5.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:64ee8434b0da054d830fa8e89e1c8bf30061d539044a39524ff7dec90481e5c2", size = 150912, upload-time = "2025-09-25T19:50:35.69Z" },
{ url = "https://files.pythonhosted.org/packages/27/44/d2ef5e87509158ad2187f4dd0852df80695bb1ee0cfe0a684727b01a69e0/bcrypt-5.0.0-cp39-abi3-win_arm64.whl", hash = "sha256:f2347d3534e76bf50bca5500989d6c1d05ed64b440408057a37673282c654927", size = 144953, upload-time = "2025-09-25T19:50:37.32Z" },
]
[[package]]
name = "certifi"
version = "2025.8.3"
@@ -448,6 +518,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/b2/84/79ca1e01337fe898cd303ac8d51151b4bea4891028b93ae5bf5e9cc911a9/generateDS-2.44.3-py3-none-any.whl", hash = "sha256:ae5db7105ca777182ba6549118c9aba1690ea341400af13ffbdbfbe1bc022299", size = 147394, upload-time = "2024-10-08T21:54:34.506Z" },
]
[[package]]
name = "git-filter-repo"
version = "2.47.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/b9/bb/7a283f568af6b0528ade65e8ace84bd6ba46003e429101bcd62c232d01a5/git_filter_repo-2.47.0.tar.gz", hash = "sha256:411b27e68a080c07a69c233cb526dbc2d848b09a72f10477f4444dd0822cf290", size = 275743, upload-time = "2024-12-04T03:10:48.2Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/60/60/d3943f0880ebcb7e0bdf79254d10dddd39c7b656eeecae32b8806ff66dec/git_filter_repo-2.47.0-py3-none-any.whl", hash = "sha256:2cd04929b9024e83e65db571cbe36aec65ead0cb5f9ec5abe42158654af5ad83", size = 76282, upload-time = "2024-12-04T03:10:46.064Z" },
]
[[package]]
name = "greenlet"
version = "3.2.4"