Repository navigation
Expand file tree
/
Copy pathpiw.html
More file actions
375 lines (370 loc) · 96.2 KB
/
Copy pathpiw.html
File metadata and controls
375 lines (370 loc) · 96.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>PIW Builder · Aperture</title>
<meta name="description" content="Interactive OPERA Cloud Property Information Worksheet: capture configuration by area, validate required fields and export to Excel.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
:root{--bg:#eef1f4;--surface:#fff;--ink:#14212b;--muted:#5b6b77;--line:#d6dde2;--accent:#0b6e79;--accent-ink:#fff;--warn:#b25e00;--bad:#b3261e;--ok:#157347;--chip:#e5eef0;--mono:'JetBrains Mono',ui-monospace,monospace}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){--bg:#0f161b;--surface:#172128;--ink:#e6edf1;--muted:#9aabb6;--line:#2a3943;--accent:#3fb5c1;--accent-ink:#06282c;--chip:#1f2e36;--warn:#f0a44b;--bad:#ff8a80;--ok:#6fd49a}}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.5 Inter,system-ui,sans-serif}
a{color:var(--accent)}
header.top{display:flex;align-items:center;gap:20px;padding:14px 24px;background:var(--surface);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:5;flex-wrap:wrap}
header.top .brand{font-weight:700;text-decoration:none;color:var(--ink);font-size:17px}
header.top nav{display:flex;gap:16px;flex-wrap:wrap}
header.top nav a{text-decoration:none;color:var(--muted);font-size:14px}
header.top nav a:hover,header.top nav a[aria-current]{color:var(--accent)}
.layout{display:grid;grid-template-columns:290px 1fr;min-height:calc(100vh - 56px)}
aside{border-right:1px solid var(--line);background:var(--surface);padding:16px;overflow:auto;max-height:calc(100vh - 56px);position:sticky;top:56px}
aside input{width:100%;padding:9px 10px;border:1px solid var(--line);border-radius:8px;background:var(--bg);color:var(--ink);font:inherit;margin-bottom:10px}
aside h3{font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin:16px 0 6px}
aside button.nav{display:flex;justify-content:space-between;align-items:center;gap:8px;width:100%;text-align:left;border:0;background:none;color:var(--ink);padding:6px 8px;border-radius:6px;font:inherit;font-size:14px;cursor:pointer}
aside button.nav:hover{background:var(--chip)}
aside button.nav[aria-current="true"]{background:var(--accent);color:var(--accent-ink)}
.dot{width:8px;height:8px;border-radius:50%;flex:none;background:var(--line)}
.dot.req{background:var(--warn)}.dot.done{background:var(--ok)}.dot.err{background:var(--bad)}
main{padding:24px 32px 80px;min-width:0}
.eyebrow{font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--accent);font-weight:600;margin:0}
h1{font-size:30px;margin:4px 0 8px;letter-spacing:-.01em}
h2{font-size:22px;margin:0 0 4px}
.lead{color:var(--muted);max-width:820px;margin:0 0 18px}
.toolbar{display:flex;gap:8px;flex-wrap:wrap;margin:14px 0 20px}
.btn{border:1px solid var(--line);background:var(--surface);color:var(--ink);padding:8px 14px;border-radius:8px;font:inherit;font-size:14px;cursor:pointer}
.btn:hover{border-color:var(--accent)}
.btn.primary{background:var(--accent);color:var(--accent-ink);border-color:var(--accent)}
.btn.small{padding:4px 10px;font-size:13px}
.card{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:20px;margin-bottom:18px}
.meta{display:flex;gap:10px;flex-wrap:wrap;font-size:13px;color:var(--muted);margin:6px 0 14px}
.pill{background:var(--chip);border-radius:999px;padding:2px 10px;font-size:12px;color:var(--ink)}
.pill.Required{background:#fbe3c8;color:#6b3a00}.pill.Recommended{background:#dbeef1;color:#094b53}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]) .pill.Required{background:#4a3317;color:#ffd7a8}:root:not([data-theme="light"]) .pill.Recommended{background:#16373c;color:#a9e3ea}}
.path{font-family:var(--mono);font-size:12px;color:var(--muted);word-break:break-word}
.grid-wrap{overflow:auto;border:1px solid var(--line);border-radius:8px;max-height:60vh}
table.grid{border-collapse:collapse;min-width:100%;font-size:13px}
table.grid th{position:sticky;top:0;background:var(--chip);text-align:left;padding:8px;border-bottom:1px solid var(--line);white-space:nowrap;font-weight:600;z-index:1}
table.grid th small{display:block;font-weight:400;color:var(--muted);font-size:11px}
table.grid th .star{color:var(--bad)}
table.grid td{border-bottom:1px solid var(--line);padding:0;min-width:120px}
table.grid td.rowctl{min-width:34px;text-align:center;color:var(--muted)}
table.grid td input{width:100%;border:0;background:transparent;color:var(--ink);padding:8px;font:inherit;font-size:13px}
table.grid td input:focus{outline:2px solid var(--accent);outline-offset:-2px;background:var(--surface)}
table.grid td input.invalid{background:rgba(179,38,30,.10)}
.x{border:0;background:none;color:var(--muted);cursor:pointer;font-size:16px}
.x:hover{color:var(--bad)}
.issues{font-size:13px;color:var(--bad);margin:8px 0 0}
.form{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px}
.form label{display:block;font-size:13px;font-weight:600;margin-bottom:4px}
.form input,.form select,.form textarea{width:100%;padding:9px 10px;border:1px solid var(--line);border-radius:8px;background:var(--bg);color:var(--ink);font:inherit}
.stats{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:12px;margin-bottom:18px}
.stat{background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:14px}
.stat b{display:block;font-size:26px}
.stat span{font-size:13px;color:var(--muted)}
.area-table{width:100%;border-collapse:collapse;font-size:14px}
.area-table td,.area-table th{padding:8px;border-bottom:1px solid var(--line);text-align:left}
.area-table button{border:0;background:none;color:var(--accent);cursor:pointer;font:inherit;padding:0;text-align:left}
.note{font-size:13px;color:var(--muted)}
#toast{position:fixed;bottom:20px;right:20px;background:var(--ink);color:var(--bg);padding:10px 16px;border-radius:8px;font-size:14px;opacity:0;transition:opacity .2s;pointer-events:none}
#toast.show{opacity:.95}
@media (max-width:860px){.layout{grid-template-columns:1fr}aside{position:static;max-height:none;border-right:0;border-bottom:1px solid var(--line)}main{padding:18px 16px 60px}}
.guide{border-left:3px solid var(--accent,#3fb5c1)}
.guide .about{font-size:15px;line-height:1.6;margin:0 0 14px;max-width:900px}
.guide ol{margin:6px 0 0 18px;padding:0;line-height:1.55}
.guide ol li{margin-bottom:6px}
.guide .tip{margin-top:14px;padding:10px 14px;border-radius:8px;background:rgba(63,181,193,.10);font-size:14px}
.guide .tip b{color:var(--accent,#3fb5c1);font-weight:600;margin-right:6px}
.guide-toggle{float:right}
details.example{margin:12px 0 4px;border:1px dashed rgba(127,127,127,.35);border-radius:10px;padding:0 14px}
details.example summary{cursor:pointer;padding:10px 0;font-size:14px;list-style:none;display:flex;align-items:center;gap:10px}
details.example summary::-webkit-details-marker{display:none}
details.example summary::before{content:"▸";transition:transform .25s;display:inline-block}
details.example[open] summary::before{transform:rotate(90deg)}
details.example .ex-wrap{overflow-x:auto;padding-bottom:12px}
details.example table{border-collapse:collapse;font-size:13px;min-width:100%}
details.example th,details.example td{text-align:left;padding:6px 10px;border-bottom:1px solid rgba(127,127,127,.2);white-space:nowrap}
details.example td{font-family:'JetBrains Mono',ui-monospace,monospace;opacity:.85}
details.example .tag{font-size:11px;letter-spacing:.08em;text-transform:uppercase;opacity:.6}
</style>
</head>
<body>
<header class="top">
<a class="brand" href="index.html">Aperture.</a>
<nav aria-label="Main navigation">
<a href="index.html">Home</a>
<a href="opera-library.html">Library</a>
<a href="fiscal.html">Fiscal</a>
<a href="piw.html" aria-current="page">PIW Builder</a>
<a href="opera-doc.html?file=ifc8-guides-index.md">IFC8 Guides</a>
<a href="copilot.html">Copilot</a>
<a href="maintenance.html">Status</a>
</nav>
</header>
<div class="layout">
<aside aria-label="Worksheet sections">
<input id="navFilter" type="search" placeholder="Find a worksheet" aria-label="Find a worksheet">
<button class="nav" data-go="overview"><span>Overview and export</span></button>
<button class="nav" data-go="property"><span>Property information</span><span class="dot req" id="dot-property"></span></button>
<div id="navList"></div>
</aside>
<main id="main"></main>
</div>
<div id="toast" role="status" aria-live="polite"></div>
<input type="file" id="importFile" accept=".xlsx,.json" hidden>
<script src="assets/xlsx.full.min.js"></script>
<script>
const SCHEMA = [{"tab":"Note Types","item":"Note Types","area":"Enterprise","scope":"SHARED","requirement":"Optional","path":"Administration Home > Enterprise > Chain and Property Management > Note Types","tables":[{"name":"Note Types","fields":[{"label":"Notes Group","hint":"","required":true},{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false},{"label":"Internal","hint":"","required":false},{"label":"Override Internal","hint":"","required":false},{"label":"Default Note Type","hint":"","required":false},{"label":"Default Note Text","hint":"","required":false}]}]},{"tab":"Departments","item":"Departments","area":"Enterprise","scope":"SHARED","requirement":"Required","path":"Administration Home > Enterprise > Chain and Property Management > Departments","tables":[{"name":"Departments","fields":[{"label":"Location","hint":"","required":true},{"label":"Code","hint":"Alpha Numeric (5)","required":true},{"label":"Description","hint":"Alpha Numeric (30)","required":true},{"label":"Email","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Transportation","item":"Transportation","area":"Enterprise","scope":"SHARED","requirement":"Optional","path":"Administration Home > Enterprise > Chain and Property Management > Transportation","tables":[{"name":"Transportation","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Label","hint":"","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Phone","hint":"","required":false},{"label":"Website","hint":"","required":false},{"label":"Price Range","hint":"Alpha Numeric (40)","required":false},{"label":"Distance","hint":"Numeric (Whole Numbers)","required":false},{"label":"Distance Type","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":false},{"label":"Notes","hint":"","required":false}]}]},{"tab":"Airports","item":"Airports","area":"Enterprise","scope":"SHARED","requirement":"Optional","path":"Administration Home > Enterprise > Chain and Property Management > Airports","tables":[{"name":"Airports","fields":[{"label":"Code","hint":"Alpha Numeric (3)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Website","hint":"","required":false},{"label":"Driving Directions","hint":"","required":false},{"label":"Driving Time","hint":"Alpha Numeric (20)","required":false},{"label":"Distance","hint":"Numeric (Whole Numbers)","required":false},{"label":"Distance Type","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Amenities","item":"Amenities","area":"Enterprise","scope":"SHAREDCLOUD","requirement":"Optional","path":"Administration Home > Enterprise > Chain and Property Management > Amenities","tables":[{"name":"Amenities","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Type (Mandatory)","hint":"","required":true},{"label":"Start Date","hint":"Date","required":true},{"label":"Hours","hint":"","required":false},{"label":"Price","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":false},{"label":"Notes","hint":"","required":false}]}]},{"tab":"Attraction Categories & Codes","item":"Attraction Categories & Codes","area":"Enterprise","scope":"SHAREDCLOUD","requirement":"Optional","path":"Administration Home > Enterprise > Chain and Property Management > Attraction Categories","tables":[{"name":"Attraction Categories","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false},{"label":"State","hint":"","required":false},{"label":"City","hint":"","required":false},{"label":"Distance","hint":"","required":false},{"label":"Distance Type","hint":"","required":false},{"label":"Driving Time","hint":"","required":false},{"label":"Price Range","hint":"","required":false},{"label":"Hours of Operation","hint":"","required":false},{"label":"Website","hint":"","required":false},{"label":"General Directions","hint":"","required":false}]},{"name":"Attractions","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Category","hint":"","required":true}]}]},{"tab":"Dining & Retail","item":"Dining & Retail","area":"Enterprise","scope":"SHAREDCLOUD","requirement":"Optional","path":"Administration Home > Enterprise > Chain and Property Management > Properties","tables":[{"name":"Dining & Retail","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (32)","required":true},{"label":"Type","hint":"Alpha Numeric (40)","required":true},{"label":"Category","hint":"","required":true},{"label":"Start Date","hint":"Date","required":true},{"label":"Hours","hint":"","required":false},{"label":"Price","hint":"","required":false},{"label":"Sequence","hint":"There is no sequence","required":false},{"label":"Notes","hint":"Alpha Numeric (250)","required":false}]}]},{"tab":"Prop Detail Categories & Codes","item":"Prop Detail Categories & Codes","area":"Enterprise","scope":"SHAREDCLOUD","requirement":"Optional","path":"Administration Home > Enterprise > Chain and Property Management > Property Detail Categories","tables":[{"name":"Property Detail Categories","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"99999","required":false}]},{"name":"Property Details","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Category","hint":"","required":true},{"label":"Sequence","hint":"99999","required":false}]}]},{"tab":"Track It - Types","item":"Track It - Types","area":"Enterprise","scope":"PMS","requirement":"Optional","path":"Administration Home > Enterprise > Track It > Types","tables":[{"name":"Track It - Types","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Track It Groups (Minimum One Selection)","hint":"","required":false},{"label":"Parcel (Tick)","hint":"","required":false},{"label":"Baggage (Tick)","hint":"","required":false},{"label":"Lost (Tick)","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Track It - Location","item":"Track It - Location","area":"Enterprise","scope":"PMS","requirement":"Optional","path":"Administration Home > Enterprise > Track It > Track It Location","tables":[{"name":"Track It - Location","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Track It Groups (Minimum One Selection)","hint":"","required":false},{"label":"Parcel (Tick)","hint":"","required":false},{"label":"Baggage (Tick)","hint":"","required":false},{"label":"Lost (Tick)","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Track It - Actions","item":"Track It - Actions","area":"Enterprise","scope":"PMS","requirement":"Optional","path":"Administration Home > Enterprise > Track It > Track It Actions","tables":[{"name":"Track It - Actions","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Status","hint":"","required":false},{"label":"Track It Groups (Minimum One Selection)","hint":"","required":false},{"label":"Parcel (Tick)","hint":"","required":false},{"label":"Baggage (Tick)","hint":"","required":false},{"label":"Lost (Tick)","hint":"","required":false},{"label":"Sequence","hint":"99999","required":false}]}]},{"tab":"Housekeeping Attendants","item":"Housekeeping Attendants","area":"Inventory","scope":"PMS","requirement":"Recommended","path":"Administration Home > Inventory > Accommodation Management > Housekeeping Attendants","tables":[{"name":"Housekeeping Attendants","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (30)","required":true},{"label":"Application User","hint":"","required":false},{"label":"Section","hint":"","required":false},{"label":"Floor","hint":"","required":false},{"label":"Mobile Number","hint":"","required":false},{"label":"Working Days","hint":"Tick Where Applicable","required":false},{"label":"Mon","hint":"","required":false},{"label":"Tue","hint":"","required":false},{"label":"Wed","hint":"","required":false},{"label":"Thu","hint":"","required":false},{"label":"Fri","hint":"","required":false},{"label":"Sat","hint":"","required":false}]}]},{"tab":"Hsk Section Groups & Codes","item":"Hsk Section Groups & Codes","area":"Inventory","scope":"PMS","requirement":"Recommended","path":"Administration Home > Inventory > Accommodation Management > Housekeeping Section Codes","tables":[{"name":"Housekeeping Section Groups","fields":[{"label":"Code","hint":"Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Target Credit","hint":"Numeric","required":false},{"label":"Sequence","hint":"99999","required":false}]},{"name":"Housekeeping Section Codes","fields":[{"label":"Code","hint":"Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Section Group","hint":"","required":false},{"label":"Target Credit","hint":"Numeric","required":false},{"label":"Sequence","hint":"99999","required":false}]}]},{"tab":"Room Features","item":"Room Features","area":"Inventory","scope":"PMS","requirement":"Recommended","path":"Inventory > Accommodation Management > Room Features","tables":[{"name":"Room Features","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"99999","required":false}]}]},{"tab":"Bed Types & Room Class","item":"Bed Types & Room Class","area":"Inventory","scope":"SHARED","requirement":"Recommended","path":"Inventory > Accommodation Management > Bed Types","tables":[{"name":"Bed Types","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Room Class","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Room Types","item":"Room Types","area":"Inventory","scope":"SHARED","requirement":"Required","path":"Inventory > Accommodation Management > Room Types","tables":[{"name":"Room Types","fields":[{"label":"Physical or Pseudo","hint":"Select","required":false},{"label":"Room Type","hint":"Alpha Numeric (8)","required":true},{"label":"Room Class","hint":"","required":true},{"label":"Bed Types","hint":"","required":false},{"label":"Smoking","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":false},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Long Description","hint":"Alpha Numeric (250)","required":false},{"label":"Meeting (Y/N)","hint":"","required":false},{"label":"Housekeeping (Y/N)","hint":"","required":false},{"label":"Send IFC (Y/N)","hint":"","required":false},{"label":"Auto Populate (Y/N)","hint":"","required":false},{"label":"Always Checked In (Y/N)","hint":"","required":false},{"label":"Maintenance (Y/N)","hint":"","required":false},{"label":"Default Occupancy","hint":"","required":false},{"label":"Minimum Occupancy","hint":"","required":false},{"label":"Maximum Occupancy","hint":"","required":false},{"label":"Maximum Adults","hint":"","required":false},{"label":"Maximum Children","hint":"","required":false},{"label":"Room Features","hint":"","required":false},{"label":"Optional Data Entry Information and Notes","hint":"","required":false}]}]},{"tab":"OSEM Room Pool Codes","item":"OSEM Room Pool Codes","area":"Inventory","scope":"SHARED","requirement":"Optional","path":"Administration Home > Inventory > Accommodation Management > Room Pool Codes","tables":[{"name":"Room Pool Codes","fields":[{"label":"Code","hint":"Alpha Numeric (20)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"99999","required":true}]}]},{"tab":"OSEM Room Pool Mapping","item":"OSEM Room Pool Mapping","area":"Inventory","scope":"SHARED","requirement":"Optional","path":"Administration Home > Inventory > Accommodation Management > Room Pool Codes","tables":[{"name":"Room Pool Mapping","fields":[{"label":"Room Type","hint":"Select","required":true},{"label":"Room Pool","hint":"Select","required":true},{"label":"Restricted","hint":"Select","required":false},{"label":"Sequence","hint":"99999","required":true}]}]},{"tab":"Rooms","item":"Rooms","area":"Inventory","scope":"PMS","requirement":"Required","path":"Inventory > Accommodation Management > Rooms","tables":[{"name":"Rooms","fields":[{"label":"Room #","hint":"Alpha Numeric (6)","required":true},{"label":"Room Type","hint":"","required":true},{"label":"Description","hint":"Alpha numeric (>100)","required":false},{"label":"Maximum Occupancy","hint":"","required":false},{"label":"Floors","hint":"","required":false},{"label":"Square Units","hint":"","required":false},{"label":"Measurement","hint":"","required":false},{"label":"Smoking","hint":"","required":false},{"label":"Sequence","hint":"99999","required":false},{"label":"Turndown Y/N","hint":"","required":false},{"label":"Sections","hint":"","required":false},{"label":"Evening Section","hint":"","required":false},{"label":"Credits","hint":"","required":false},{"label":"Stayover Credits","hint":"","required":false},{"label":"Departure Credits","hint":"","required":false},{"label":"Turndown Credits","hint":"","required":false},{"label":"Connecting Rooms","hint":"Alpha Numeric (6)","required":false},{"label":"Room Features","hint":"","required":false},{"label":"Data Entry Info /Notes","hint":"","required":false}]}]},{"tab":"Room Hierarchy","item":"Room Hierarchy","area":"Inventory","scope":"PMS","requirement":"Optional","path":"Administration Home > Inventory > Accommodation Management > Room Hierarchy Classes","tables":[{"name":"Room Hierachy","fields":[{"label":"From Room Class","hint":"From List","required":true},{"label":"To Room Classes","hint":"From List","required":true},{"label":"Sequence","hint":"1 to 99999","required":true},{"label":"From Room Type","hint":"From List","required":true},{"label":"To Room Types","hint":"From List","required":true}]}]},{"tab":"OOO & OOS Reasons","item":"OOO & OOS Reasons","area":"Inventory","scope":"SHARED","requirement":"Required","path":"Inventory > Accommodation Management > Out of Order/Service Reasons","tables":[{"name":"Out of Order / Service Reasons","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false},{"label":"Out of Order","hint":"If a room is placed Out of Order, it is not available for the front desk for assignment. It will also be removed from the total room inventory counts. This effectively reduces the total number of rooms in your property. Therefore, for the period the room remains out of order, 100% occupancy is calculated using only the remaining rooms. (Example: If you have a 100 room property and place 5 rooms out of order, 100% occupancy is reached when 95 rooms are occupied.)","required":false}]}]},{"tab":"Room Maintenance","item":"Room Maintenance","area":"Inventory","scope":"PMS","requirement":"Recommended","path":"Inventory > Accommodation Management > Room Maintenance","tables":[{"name":"Room Maintenance","fields":[{"label":"Code","hint":"Alpha Numeric (20)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Room Conditions","item":"Room Conditions","area":"Inventory","scope":"PMS","requirement":"Optional","path":"Inventory > Accommodation Management > Room Conditions","tables":[{"name":"Room Conditions","fields":[{"label":"Code","hint":"Alpha Numeric (20)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Notes","hint":"Alpha Numeric (250)","required":false},{"label":"Display in Room Assignment (Y/N)","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Tasks","item":"Tasks","area":"Inventory","scope":"PMS","requirement":"Required","path":"Inventory > Task Sheets > Tasks","tables":[{"name":"Tasks","fields":[{"label":"Task Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Instructions","hint":"Alpha Numeric (250)","required":false},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Tasks (for Housekeeping Task Scheduling)","fields":[{"label":"Task Code","hint":"Alpha Numeric (8)","required":false},{"label":"Colors","hint":"","required":false},{"label":"Linen Change (Y/N)","hint":"","required":false},{"label":"Departure Room Default Task (Y/N)","hint":"","required":false},{"label":"Guest Requested Task (Y/N)","hint":"","required":false}]}]},{"tab":"Supplies","item":"Supplies","area":"Inventory","scope":"PMS","requirement":"Optional","path":"Inventory > Task Sheets > Supplies","tables":[{"name":"Supplies","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Schedules","item":"Schedules","area":"Inventory","scope":"PMS","requirement":"Optional","path":"Inventory > Task Sheets > Tasks","tables":[{"name":"Schedules","fields":[{"label":"Room Type","hint":"","required":true},{"label":"Task","hint":"","required":true},{"label":"Market Codes","hint":"","required":false},{"label":"Special Requests","hint":"","required":false},{"label":"Rate Codes","hint":"","required":false},{"label":"Priority (Number Only)","hint":"","required":true},{"label":"VIP Levels","hint":"","required":false},{"label":"Message Text","hint":"","required":false},{"label":"Supplies","hint":"","required":false},{"label":"Schedule","hint":"","required":true},{"label":"# of Days","hint":"","required":false},{"label":"Starting On Day (Number Only)","hint":"","required":false},{"label":"Include on Arrival Day (Y/N)","hint":"","required":false},{"label":"Move up if falls on Day before Departure (Y/N)","hint":"","required":false},{"label":"Days of the Week","hint":"Tick Where Applicable","required":false},{"label":"Mon","hint":"","required":false},{"label":"Tue","hint":"","required":false},{"label":"Wed","hint":"","required":false},{"label":"Thu","hint":"","required":false},{"label":"Fri","hint":"","required":false},{"label":"Sat","hint":"","required":false}]}]},{"tab":"OSEM Event Types","item":"OSEM Event Types","area":"Inventory","scope":"SHARED","requirement":"Optional","path":"Administration Home >Inventory > Function Space Management > Event Types","tables":[{"name":"Event Types","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Start Time","hint":"","required":false},{"label":"End Time","hint":"","required":false},{"label":"Meal Period","hint":"Select","required":false},{"label":"Sequence","hint":"99999","required":false}]}]},{"tab":"OSEM Function Space Locations","item":"OSEM Function Space Locations","area":"Inventory","scope":"SHARED","requirement":"Optional","path":"Administration Home > Inventory > Function Space Management > Locations","tables":[{"name":"Function Space Locations","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"99999","required":false}]}]},{"tab":"OSEM Function Space Types","item":"OSEM Function Space Types","area":"Inventory","scope":"SHARED","requirement":"Optional","path":"Administration Home > Inventory > Function Space Management > Function Space Types","tables":[{"name":"Function Space Types","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"99999","required":false}]}]},{"tab":"OSEM Setup Styles","item":"OSEM Setup Styles","area":"Inventory","scope":"SHARED","requirement":"Optional","path":"Administration Home > Inventory > Function Space Management > Setup Styles","tables":[{"name":"Setup Styles","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"99999","required":false}]}]},{"tab":"OSEM Function Spaces","item":"OSEM Function Spaces","area":"Inventory","scope":"SHARED","requirement":"Optional","path":"Administration Home >Inventory > Function Space Management > Function Spaces","tables":[{"name":"Function Spaces","fields":[{"label":"Room Type","hint":"Select","required":true},{"label":"Room","hint":"Alpha Numeric (8)","required":true},{"label":"Space Name","hint":"Alpha Numeric (40)","required":true},{"label":"Space Type","hint":"Select","required":true},{"label":"Minimum Capacity","hint":"","required":true},{"label":"Maximum Capacity","hint":"","required":true},{"label":"Short Name","hint":"Alpha Numeric (40)","required":false},{"label":"Location","hint":"Select","required":true},{"label":"Floor","hint":"","required":false},{"label":"Description","hint":"","required":false},{"label":"Custom Order 1","hint":"","required":false},{"label":"Custom Order 2","hint":"","required":false},{"label":"Custom Order 3","hint":"","required":false},{"label":"Display in Diary","hint":"","required":false},{"label":"Shareable","hint":"","required":false},{"label":"Accessible","hint":"","required":false},{"label":"Maximum Groups","hint":"","required":false},{"label":"100 % Occupancy","hint":"","required":false},{"label":"Area","hint":"","required":false},{"label":"Length","hint":"","required":false},{"label":"Width","hint":"","required":false},{"label":"Minimum Height","hint":"","required":false},{"label":"Maximum Height","hint":"","required":false},{"label":"Weight","hint":"","required":false},{"label":"Code","hint":"","required":false},{"label":"Default","hint":"","required":false},{"label":"Setup Time","hint":"","required":false},{"label":"Setdown Time","hint":"","required":false}]},{"name":"Function Spaces","fields":[{"label":"Code","hint":"","required":false},{"label":"Revenue Type","hint":"","required":false},{"label":"Charge Type","hint":"","required":false},{"label":"Amount","hint":"","required":false},{"label":"Set as Default","hint":"","required":false},{"label":"Hourly Rate","hint":"","required":false}]}]},{"tab":"Foreign Currency Codes","item":"Foreign Currency Codes","area":"Financial","scope":"SHARED","requirement":"Optional","path":"","tables":[{"name":"Foreign Currency Codes","fields":[{"label":"Code","hint":"Alpha (8)","required":false},{"label":"Description","hint":"Alpha numeric (40)","required":false},{"label":"Currency Symbol","hint":"Alpha Numeric (40)","required":false},{"label":"Decimals (0-3)","hint":"","required":false},{"label":"Sell Currency","hint":"","required":false}]}]},{"tab":"Tax Types","item":"Tax Types","area":"Financial","scope":"SHARED","requirement":"Optional","path":"Financial > Cashiering Management > Tax Types","tables":[{"name":"Tax Types","fields":[{"label":"Code","hint":"","required":false},{"label":"Description","hint":"Alpha Numeric (250)","required":false}]}]},{"tab":"No Show Posting Rules","item":"No Show Posting Rules","area":"Financial","scope":"PMS","requirement":"Optional","path":"Financial > Cashiering Management > No Show Posting Rules","tables":[{"name":"No Show Posting Rules","fields":[{"label":"Reservation Type","hint":"","required":false},{"label":"Source Code","hint":"","required":false},{"label":"Posting Rule","hint":"","required":true}]}]},{"tab":"Adjustment Codes","item":"Adjustment Codes","area":"Financial","scope":"PMS","requirement":"Required","path":"Financial > Cashiering Management > Adjustment Codes","tables":[{"name":"Adjustment Codes / Service Recovery","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":false},{"label":"Description","hint":"Alpha Numeric (40)","required":false},{"label":"Code Type","hint":"","required":false}]}]},{"tab":"Folio Arrangement Codes","item":"Folio Arrangement Codes","area":"Financial","scope":"SHARED","requirement":"Optional","path":"Financial > Cashiering Management > Folio Arrangement Codes","tables":[{"name":"Folio Arrangement Codes","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Transaction Codes","hint":"","required":true}]}]},{"tab":"Group & Expense Arr Codes","item":"Group & Expense Arr Codes","area":"Financial","scope":"SHARED","requirement":"Optional","path":"Financial > Cashiering Management > Group Arrangement Codes","tables":[{"name":"Group Arrangement Codes","fields":[{"label":"Code","hint":"","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Transaction Codes","hint":"","required":true}]},{"name":"Expense Arrangement Codes","fields":[{"label":"Code","hint":"","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Transaction Codes","hint":"","required":true}]}]},{"tab":"Auto Folio Settlement Types","item":"Auto Folio Settlement Types","area":"Financial","scope":"PMS","requirement":"Optional","path":"Financial > Cashiering Management > Auto Folio Settlement Types","tables":[{"name":"Auto Folio Settlement Types","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Commission Codes","item":"Commission Codes","area":"Financial","scope":"PMS","requirement":"Optional","path":"Financial > Commission Management > Commission Codes","tables":[{"name":"Commission Codes","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":false},{"label":"Description","hint":"Alpha Numeric (40)","required":false},{"label":"Sequence","hint":"1-99999","required":true},{"label":"Hold Status (Optional)","hint":"","required":false},{"label":"Accounts Receivables","hint":"","required":false},{"label":"Prepaid","hint":"","required":false},{"label":"Reservation History Records","hint":"","required":false},{"label":"Amount","hint":"","required":false},{"label":"Calculation","hint":"","required":false},{"label":"Commission Calculation","hint":"","required":false},{"label":"Based On: Reservation","hint":"","required":false},{"label":"Based On: Revenue","hint":"","required":false},{"label":"Tax % (Optional)","hint":"","required":false}]}]},{"tab":"Stop Processing Reasons","item":"Stop Processing Reasons","area":"Financial","scope":"PMS","requirement":"Optional","path":"Financial > Commission Management > Stop Processing Reasons","tables":[{"name":"Stop Processing Reasons","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Display Sets & Pkg Forecast Grp","item":"Display Sets & Pkg Forecast Grp","area":"Financial","scope":"PMS","requirement":"Recommended","path":"Financial > Rate Management > Display Sets","tables":[{"name":"Display Sets","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":true}]},{"name":"Package Forecast Groups","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":true}]}]},{"tab":"Rate Classes & Categories","item":"Rate Classes & Categories","area":"Financial","scope":"PMS","requirement":"Required","path":"Financial > Rate Management > Rate Classes","tables":[{"name":"Rate Classes","fields":[{"label":"Code","hint":"Alpha Numeric (20)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Begin Date","hint":"Date","required":true},{"label":"Sequence","hint":"1-99999","required":false}]},{"name":"Rate Categories","fields":[{"label":"Code","hint":"Alpha Numeric (20)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Rate Class","hint":"Select","required":true},{"label":"Begin Date","hint":"Date","required":true},{"label":"Sequence","hint":"999","required":false}]}]},{"tab":"Rate Codes","item":"Rate Codes","area":"Financial","scope":"PMS","requirement":"Required","path":"Financial > Rate Management > Rate Codes","tables":[{"name":"Rate Codes","fields":[{"label":"Rate Code","hint":"Alpha Numeric (8)","required":true},{"label":"Start Sell Date","hint":"Date","required":true},{"label":"End Sell Date","hint":"Date","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Room Types","hint":"","required":true},{"label":"Rate Category","hint":"","required":true},{"label":"Market","hint":"","required":false},{"label":"Source","hint":"","required":false},{"label":"Display Set","hint":"","required":false},{"label":"Sequence","hint":"Numeric (3)","required":false},{"label":"Transaction Code","hint":"","required":true},{"label":"Pkg Tran Code","hint":"","required":false},{"label":"Commission Code (OPERA)","hint":"","required":false},{"label":"Commission % (GDS)","hint":"","required":false},{"label":"Folio Text","hint":"Alpha Numeric","required":false},{"label":"Print Rate","hint":"","required":false},{"label":"Suppress Rate","hint":"Select","required":false},{"label":"Discount","hint":"Select","required":false},{"label":"Day Use","hint":"Select","required":false},{"label":"Comp","hint":"Select","required":false},{"label":"House Use","hint":"Select","required":false},{"label":"Negotiated","hint":"Select","required":false},{"label":"Standard Rate","hint":"","required":false},{"label":"Daily Rates","hint":"","required":false},{"label":"Base Rate","hint":"","required":false},{"label":"Amount","hint":"","required":false},{"label":"Flat or Percentage","hint":"","required":false},{"label":"Rounding","hint":"","required":false},{"label":"Dynamic Base Rate","hint":"","required":false},{"label":"Amount","hint":"","required":false},{"label":"Flat or Percentage","hint":"","required":false},{"label":"Rounding","hint":"","required":false},{"label":"Compare With Rate Detail","hint":"","required":false},{"label":"Advanced Dynamic Base Rate","hint":"","required":false},{"label":"Rounding","hint":"","required":false},{"label":"Max Occupancy","hint":"","required":false},{"label":"Min Stay Through","hint":"","required":false},{"label":"MaxLos","hint":"","required":false},{"label":"Min Advance Booking","hint":"","required":false}]}]},{"tab":"Pricing Schedules - Standard","item":"Pricing Schedules - Standard","area":"Financial","scope":"PMS","requirement":"Recommended","path":"Financial > Rate Management > Rate Codes > Pricing Schedules","tables":[{"name":"Pricing Schedules - Standard Rates","fields":[{"label":"Rate Code","hint":"","required":true},{"label":"Room Types","hint":"","required":true},{"label":"1 Person Rate Amount","hint":"","required":true},{"label":"2 Person Rate Amount","hint":"","required":false},{"label":"3 Person Rate Amount","hint":"","required":false},{"label":"4 Person Rate Amount","hint":"","required":false},{"label":"Additional Person Amount","hint":"","required":false},{"label":"Begin Date","hint":"Date","required":true},{"label":"End Date","hint":"Date","required":true}]}]},{"tab":"Pricing Schedules - Daily Rates","item":"Pricing Schedules - Daily Rates","area":"Financial","scope":"PMS","requirement":"Recommended","path":"Financial > Rate Management > Rate Codes > Pricing Schedules","tables":[{"name":"Pricing Schedules - Daily Rates","fields":[{"label":"Rate Code","hint":"","required":true},{"label":"Room Types","hint":"","required":true},{"label":"1 Person Rate Amount","hint":"","required":true},{"label":"2 Person Rate Amount","hint":"","required":false},{"label":"Additional Person Amount","hint":"","required":false},{"label":"Additional Child Amount","hint":"","required":false},{"label":"Begin Date","hint":"Date","required":true},{"label":"End Date","hint":"Date","required":true}]}]},{"tab":"Package Codes","item":"Package Codes","area":"Financial","scope":"PMS","requirement":"Recommended","path":"Financial > Rate Management > Packages Codes","tables":[{"name":"Package Codes","fields":[{"label":"Package Code","hint":"Alpha Numeric (8)","required":true},{"label":"Package Forecast Group","hint":"","required":false},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Transaction Code","hint":"","required":true},{"label":"Package Overage","hint":"","required":false},{"label":"Package Allowance","hint":"Tick","required":false},{"label":"Package Profit","hint":"","required":false},{"label":"Package Loss","hint":"","required":false},{"label":"Alternate Codes","hint":"","required":false},{"label":"Posting Type","hint":"Select","required":true},{"label":"Calculation Rule","hint":"Select","required":true},{"label":"Posting Rhythm","hint":"Select","required":true},{"label":"Sell Separate","hint":"Tick","required":false},{"label":"Post Next Day","hint":"Tick","required":false},{"label":"Forecast Next Day","hint":"Tick","required":false},{"label":"Start Date","hint":"Date","required":true},{"label":"End Date","hint":"Date","required":true},{"label":"Price","hint":"","required":true},{"label":"Allowance","hint":"","required":false},{"label":"Overage code Tax Inclusive?","hint":"","required":false}]}]},{"tab":"Event Codes","item":"Event Codes","area":"Financial","scope":"SHARED","requirement":"Optional","path":"Financial > Rate Management > Event Codes","tables":[{"name":"Event Codes","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Promotion Group","item":"Promotion Group","area":"Financial","scope":"PMS","requirement":"Optional","path":"Administration Home > Financial > Rate Management > Promotion Groups","tables":[{"name":"Promotion Group","fields":[{"label":"Promotion Group","hint":"Alpha Numeric (20)","required":true},{"label":"Promotion Name","hint":"Alpha Numeric (100)","required":false},{"label":"Program Type","hint":"Alpha Numeric (100)","required":false},{"label":"Description","hint":"Alpha Numeric (250)","required":false}]}]},{"tab":"Promotion Code","item":"Promotion Code","area":"Financial","scope":"PMS","requirement":"Optional","path":"Administration Home > Financial > Rate Management > Promotion Codes","tables":[{"name":"Promotion Code","fields":[{"label":"Promotion Code","hint":"Alpha Numeric (20)","required":true},{"label":"Description","hint":"Alpha Numeric (250","required":true},{"label":"Promotion Group","hint":"","required":true},{"label":"Category","hint":"Alpha Numeric (100)","required":false},{"label":"Booking Start Date","hint":"","required":true},{"label":"Booking End Date","hint":"","required":true},{"label":"Check-In Time","hint":"","required":false},{"label":"Check-Out Time","hint":"","required":false},{"label":"Stay Start Date","hint":"","required":true},{"label":"Stay End Date","hint":"","required":true},{"label":"Upgrade Allowed","hint":"Tick","required":false},{"label":"Update Outside Booking Dates","hint":"Tick","required":false},{"label":"Long Description","hint":"Alpha Numeric","required":false},{"label":"Instructions","hint":"Alpha Numeric","required":false},{"label":"Information","hint":"Alpha Numeric","required":false},{"label":"Rate Codes","hint":"","required":false}]}]},{"tab":"AR Acct Types & Restricted Reas","item":"AR Acct Types & Restricted Reas","area":"Financial","scope":"PMS","requirement":"Recommended","path":"Financial > Accounts Receivables Management > Account Types","tables":[{"name":"AR Acct Types & Restricted Reas","fields":[{"label":"Type","hint":"Alpha Numeric (20)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Credit Limit","hint":"","required":false},{"label":"Statement Mode","hint":"","required":false},{"label":"Reminder Cycle","hint":"","required":false},{"label":"Statement Printing","hint":"","required":false},{"label":"Daily Reminder Letter Cycles","hint":"","required":false},{"label":"Reminder Letter 2","hint":"","required":false},{"label":"Reminder Letter 3","hint":"","required":false},{"label":"Reminder Letter 4","hint":"","required":false},{"label":"Code","hint":"Alpha Numeric (20)","required":true},{"label":"Sequence","hint":"1 to 99999","required":true},{"label":"Add","hint":"","required":false},{"label":"more Rows","hint":"","required":false}]}]},{"tab":"Transaction Groups","item":"Transaction Groups","area":"Financial","scope":"SHARED","requirement":"Required","path":"Financial > Transaction Management > Transaction Groups","tables":[{"name":"Transaction Groups","fields":[{"label":"Code","hint":"Alpha Numeric (20)","required":false},{"label":"Description","hint":"Alpha Numeric (40)","required":false},{"label":"Type","hint":"Select","required":false},{"label":"Sequence","hint":"1-99999","required":false}]}]},{"tab":"Transaction Subgroups","item":"Transaction Subgroups","area":"Financial","scope":"SHARED","requirement":"Required","path":"Financial > Transaction Management > Transaction Subgroups","tables":[{"name":"Transaction Subgroups","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Group","hint":"","required":true},{"label":"Sequence","hint":"1-99999","required":false}]}]},{"tab":"Transaction Codes","item":"Transaction Codes","area":"Financial","scope":"SHARED","requirement":"Required","path":"Financial > Transaction Management > Transaction Codes","tables":[{"name":"Transaction Codes","fields":[{"label":"Code","hint":"Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Subgroup","hint":"","required":true},{"label":"Group","hint":"","required":true},{"label":"Transaction Type","hint":"","required":false},{"label":"Adjustment Code","hint":"","required":false},{"label":"Service Recovery Code (Optional)","hint":"","required":false},{"label":"Default Price (Optional)","hint":"","required":false},{"label":"Payment Type (Payments Only)","hint":"","required":false},{"label":"Processing Type (Credit Card Payments Only)","hint":"","required":false},{"label":"Include in Deposit / CXL Rule","hint":"","required":false},{"label":"Paidout","hint":"","required":false},{"label":"Cashier Payments","hint":"","required":false},{"label":"Membership","hint":"","required":false},{"label":"Generates Inclusive","hint":"","required":false},{"label":"AR Payments","hint":"","required":false},{"label":"Check Number Mandatory","hint":"","required":false},{"label":"Manual Posting","hint":"","required":false},{"label":"Deposit Payments","hint":"","required":false},{"label":"Print Receipt","hint":"","required":false},{"label":"Generates Transaction Code (1)","hint":"","required":false},{"label":"Tax Type or Non-Tax Type (1)","hint":"","required":false},{"label":"Percentage or Amount (1)","hint":"","required":false},{"label":"Percent or Amount Number (1)","hint":"","required":false},{"label":"Generates Transaction Code (2)","hint":"","required":false},{"label":"Tax Type or Non-Tax Type (2)","hint":"","required":false},{"label":"Percentage or Amount (2)","hint":"","required":false},{"label":"Percent or Amount Number (2)","hint":"","required":false}]}]},{"tab":"Routing Codes","item":"Routing Codes","area":"Financial","scope":"SHARED","requirement":"Recommended","path":"Financial > Transaction Management > Routing Codes","tables":[{"name":"Routing Codes","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Transaction Codes","hint":"","required":true}]}]},{"tab":"Payment Types","item":"Payment Types","area":"Financial","scope":"SHARED","requirement":"Required","path":"Financial > Transaction Management > Payment Types","tables":[{"name":"Payment Types","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Transaction Code","hint":"","required":true},{"label":"Credit Card Type","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":false},{"label":"No Post","hint":"","required":false},{"label":"Reservation","hint":"","required":false}]}]},{"tab":"Articles","item":"Articles","area":"Financial","scope":"PMS","requirement":"Optional","path":"Financial > Transaction Management > Articles","tables":[{"name":"Articles","fields":[{"label":"Article Code","hint":"Numeric (8)","required":true},{"label":"Transaction Code","hint":"","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Default Price (Numeric)","hint":"","required":false},{"label":"Available in Charge It","hint":"","required":false},{"label":"Display Color","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Cancellation & Discount Reasons","item":"Cancellation & Discount Reasons","area":"Booking","scope":"PMS","requirement":"Required","path":"Booking > Reservation Management > Cancellation Reasons","tables":[{"name":"Cancellation Reasons","fields":[{"label":"Code","hint":"Alpha Numeric (20)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Discount Reasons","fields":[{"label":"Code","hint":"Alpha Numeric (20)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Turnaway Codes","item":"Turnaway Codes","area":"Booking","scope":"PMS","requirement":"Recommended","path":"Booking > Reservation Management > Turnaway Codes","tables":[{"name":"Turnaway Codes","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Turnaway Group","hint":"Select","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Guest Messages & Guest Locators","item":"Guest Messages & Guest Locators","area":"Booking","scope":"PMS","requirement":"Recommended","path":"Booking > Reservation Management > Guest Messages","tables":[{"name":"Guest Messages","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Locators","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Trace Texts","item":"Trace Texts","area":"Booking","scope":"PMS","requirement":"Recommended","path":"Booking > Reservation Management > Trace Texts","tables":[{"name":"Trace Texts","fields":[{"label":"Department","hint":"","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":false},{"label":"Sequence","hint":"1 to 99999","required":true}]}]},{"tab":"Room Move & Prop Move Reasons","item":"Room Move & Prop Move Reasons","area":"Booking","scope":"PMS","requirement":"Recommended","path":"Booking > Reservation Management > Room Move Reasons","tables":[{"name":"Room Move Reasons","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Property Move Reasons","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Waitlist Codes & Priorities","item":"Waitlist Codes & Priorities","area":"Booking","scope":"PMS","requirement":"Recommended","path":"Booking > Reservation Management > Waitlist Codes","tables":[{"name":"Waitlist Codes","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Waitlist Priorities","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Purpose of Stay & Guest Types","item":"Purpose of Stay & Guest Types","area":"Booking","scope":"PMS","requirement":"Optional","path":"Booking > Reservation Management > Purpose of Stay","tables":[{"name":"Purpose of Stay","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Guest Types","fields":[{"label":"Code","hint":"Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Guest Status & Cntry Entry Pnt","item":"Guest Status & Cntry Entry Pnt","area":"Booking","scope":"PMS","requirement":"Optional","path":"Booking > Reservation Management > Guest Status","tables":[{"name":"Guest Status","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Country Entry Point","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Immigration Status","item":"Immigration Status","area":"Booking","scope":"PMS","requirement":"Optional","path":"Booking > Reservation Management > Immigration Status","tables":[{"name":"Immigration Status","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Business Blk Type & Res Methods","item":"Business Blk Type & Res Methods","area":"Booking","scope":"SHARED","requirement":"Optional","path":"Booking > Block Management > Booking Types","tables":[{"name":"Business Block Type","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Reservation Methods","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Block Cxl & Refused Reasons","item":"Block Cxl & Refused Reasons","area":"Booking","scope":"SHARED","requirement":"Required","path":"Booking > Block Management > Cancellation Reasons","tables":[{"name":"Cancellation Reasons","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Refused Reasons","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Lost Reasons & Destination Code","item":"Lost Reasons & Destination Code","area":"Booking","scope":"SHARED","requirement":"Optional","path":"Booking > Block Management > Lost Reasons","tables":[{"name":"Lost Reasons","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Destination Codes","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Rate Override Reasons","item":"Rate Override Reasons","area":"Booking","scope":"SHARED","requirement":"Recommended","path":"Booking > Block Management > Rate Override Reasons","tables":[{"name":"Rate Override Reasons","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Status Codes & Flow","item":"Status Codes & Flow","area":"Booking","scope":"SHARED","requirement":"Required","path":"Booking > Block Status > Status Codes","tables":[{"name":"Status Codes","fields":[{"label":"Code","hint":"Alpha Numeric (4)","required":true},{"label":"Description","hint":"Alpha Numeric (20)","required":true},{"label":"Sequence","hint":"1 to 99999","required":true},{"label":"Room Status Type","hint":"","required":true},{"label":"Default Reservation Type","hint":"","required":false},{"label":"Reason Type","hint":"","required":false},{"label":"Display Color","hint":"","required":false},{"label":"Starting (Tick)","hint":"","required":false},{"label":"Return Inventory (Tick)","hint":"","required":false},{"label":"Current Status Code","hint":"","required":true},{"label":"Next Available Status Codes","hint":"","required":true}]},{"name":"Status Code Flow","fields":[{"label":"Code","hint":"Alpha Numeric (4)","required":false},{"label":"Allow Pickup (Tick)","hint":"","required":false},{"label":"Show in Diary (Tick)","hint":"","required":false},{"label":"Lead Status","hint":"","required":false},{"label":"Log Catering Changes (Tick)","hint":"","required":false}]}]},{"tab":"Item Class","item":"Item Class","area":"Booking","scope":"SHARED","requirement":"Recommended","path":"Booking > Resource Management > Item Class","tables":[{"name":"Item Class","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Responsible Department","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":true},{"label":"Reservation","hint":"","required":false},{"label":"Events","hint":"","required":false},{"label":"Discountable","hint":"","required":false}]}]},{"tab":"Item Inventory","item":"Item Inventory","area":"Booking","scope":"SHARED","requirement":"Recommended","path":"Booking > Resource Management > Item Inventory","tables":[{"name":"Item Inventory","fields":[{"label":"Item Class","hint":"","required":true},{"label":"Item Name","hint":"","required":true},{"label":"Code","hint":"","required":true},{"label":"Department","hint":"","required":false},{"label":"Quantity","hint":"","required":false},{"label":"Reservation (Y/N)","hint":"","required":false},{"label":"Events (Y/N)","hint":"","required":false}]}]},{"tab":"Reservation Types","item":"Reservation Types","area":"Booking","scope":"SHARED","requirement":"Required","path":"Booking > Booking Rules and Schedules > Reservation Types","tables":[{"name":"Reservation Types","fields":[{"label":"Reservation Type","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1-99999","required":false},{"label":"Address Required","hint":"","required":false},{"label":"Deposit Required","hint":"","required":false},{"label":"Arrival Time","hint":"","required":false},{"label":"Deduct Inventory","hint":"","required":false},{"label":"Auto Mass Cancel","hint":"","required":false},{"label":"Phone Required","hint":"","required":false},{"label":"Credit Card","hint":"","required":false}]}]},{"tab":"Deposit Rules","item":"Deposit Rules","area":"Booking","scope":"SHARED","requirement":"Optional","path":"Booking > Booking Rules and Schedules > Deposit Rules","tables":[{"name":"Deposit Rules","fields":[{"label":"Deposit Rule","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (100)","required":true},{"label":"Type","hint":"Select","required":true},{"label":"Amount","hint":"Numeric","required":false},{"label":"Days Before Arrival 1-99999","hint":"","required":false},{"label":"Days After Booking 1-99999","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Deposit Rule Schedules","item":"Deposit Rule Schedules","area":"Booking","scope":"SHARED","requirement":"Optional","path":"Booking > Booking Rules and Schedules > Deposit Rule Schedule","tables":[{"name":"Deposit Rule Schedules","fields":[{"label":"Begin Date","hint":"Date","required":true},{"label":"End Date","hint":"Date","required":true},{"label":"Rule","hint":"Select","required":true},{"label":"Rate Code","hint":"","required":false},{"label":"Reservation Type","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":false},{"label":"Override?","hint":"Select","required":false}]}]},{"tab":"Cancel Penalties","item":"Cancel Penalties","area":"Booking","scope":"SHARED","requirement":"Optional","path":"Booking > Booking Rules and Schedules > Cancel Penalties","tables":[{"name":"Cancel Penalties","fields":[{"label":"Cancellation Rule","hint":"","required":true},{"label":"Description","hint":"Alpha Numeric (100)","required":true},{"label":"Type","hint":"","required":true},{"label":"Amount (Penalty)","hint":"","required":true},{"label":"Days Before Arrival","hint":"","required":true},{"label":"Cancel Before Time","hint":"","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Cancel Penalty Schedules","item":"Cancel Penalty Schedules","area":"Booking","scope":"SHARED","requirement":"Optional","path":"Booking > Booking Rules and Schedules > Cancel Penalty Schedules","tables":[{"name":"Cancel Penalty Schedules","fields":[{"label":"Begin Date","hint":"Date","required":true},{"label":"End Date","hint":"Date","required":true},{"label":"Rule","hint":"Select","required":true},{"label":"Rate Code","hint":"","required":false},{"label":"Reservation Type","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":false},{"label":"Override?","hint":"Tick","required":false}]}]},{"tab":"Alert Messages","item":"Alert Messages","area":"Booking","scope":"PMS","requirement":"Recommended","path":"Booking > Alerts > Alert Messages","tables":[{"name":"Alert Messages","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Global Alerts","item":"Global Alerts","area":"Booking","scope":"PMS","requirement":"Optional","path":"Booking > Alerts > Global Alert Definitions","tables":[{"name":"Global Alerts","fields":[{"label":"Alert Code","hint":"Select","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Area","hint":"Select","required":true},{"label":"Conditions","hint":"","required":false}]}]},{"tab":"Market Groups & Codes","item":"Market Groups & Codes","area":"Booking","scope":"SHARED","requirement":"Required","path":"Booking > Marketing Management > Market Groups","tables":[{"name":"Market Groups","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":true}]},{"name":"Market Codes","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Market Group","hint":"","required":true},{"label":"Sequence","hint":"1 to 99999","required":true},{"label":"Color","hint":"Select","required":true}]}]},{"tab":"Source Groups & Codes","item":"Source Groups & Codes","area":"Booking","scope":"SHARED","requirement":"Required","path":"Booking > Marketing Management > Source Groups","tables":[{"name":"Source Groups","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":false},{"label":"Sequence","hint":"1 to 99999","required":true}]},{"name":"Source Codes","fields":[{"label":"Code","hint":"Alpha Numeric (20)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Source Group","hint":"","required":true},{"label":"Sequence","hint":"1 to 99999","required":true}]}]},{"tab":"Origin Codes & Marketing Region","item":"Origin Codes & Marketing Region","area":"Booking","scope":"SHARED","requirement":"Recommended","path":"Booking > Marketing Management > Origin Codes","tables":[{"name":"Origin Codes","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Marketing Regions","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Marketing Cities","item":"Marketing Cities","area":"Booking","scope":"SHAREDCLOUD","requirement":"Optional","path":"Booking > Marketing Management > Marketing Cities","tables":[{"name":"Marketing Cities","fields":[{"label":"Marketing City","hint":"Alpha Numeric (40)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Region Code","hint":"Select","required":true},{"label":"Distance","hint":"Numeric (Whole)","required":false},{"label":"Driving Time","hint":"Alpha Numeric","required":false},{"label":"Distance Type","hint":"","required":false},{"label":"Direction","hint":"","required":false}]}]},{"tab":"VIP Levels","item":"VIP Levels","area":"Client Relations","scope":"PMS","requirement":"Recommended","path":"Client Relations > Profile Management > VIP Levels","tables":[{"name":"VIP Levels","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false},{"label":"Display Color","hint":"Select","required":false}]}]},{"tab":"Titles","item":"Titles","area":"Client Relations","scope":"SHARED","requirement":"Required","path":"Client Relations > Profile Management > Titles","tables":[{"name":"Titles","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Language","hint":"","required":true},{"label":"Salutation","hint":"Alpha Numeric (250)","required":true},{"label":"Envelope Greeting","hint":"Alpha Numeric (250)","required":false},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Preference Groups","item":"Preference Groups","area":"Client Relations","scope":"SHARED","requirement":"Required","path":"Client Relations > Profile Management > Preference Groups","tables":[{"name":"Preference Groups","fields":[{"label":"Code","hint":"Alpha Numeric","required":false},{"label":"Description","hint":"Alpha Numeric","required":false},{"label":"Quantity","hint":"","required":false},{"label":"Sequence","hint":"1 to 99999","required":false},{"label":"Reservation","hint":"","required":false}]}]},{"tab":"Floors","item":"Floors","area":"Client Relations","scope":"SHARED","requirement":"Recommended","path":"Client Relations > Profile Management > Preferences","tables":[{"name":"Floors","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Special Requests","item":"Special Requests","area":"Client Relations","scope":"PMS","requirement":"Recommended","path":"Client Relations > Profile Management > Preferences","tables":[{"name":"Special Requests","fields":[{"label":"Code","hint":"Alpha Numeric (20)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Preferences","item":"Preferences","area":"Client Relations","scope":"SHARED","requirement":"Optional","path":"Client Relations > Profile Management > Preferences","tables":[{"name":"Preferences","fields":[{"label":"Preference Group","hint":"","required":true},{"label":"Code","hint":"Alpha Numeric (20)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Communication & Address Types","item":"Communication & Address Types","area":"Client Relations","scope":"SHARED","requirement":"Optional","path":"Client Relations > Profile Management > Communication Types","tables":[{"name":"Communication & Address Types","fields":[{"label":"Role","hint":"","required":true},{"label":"Type","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (30)","required":true},{"label":"Sequence","hint":"1 to 999999","required":false},{"label":"Code","hint":"","required":true}]}]},{"tab":"Inactive Reasons","item":"Inactive Reasons","area":"Client Relations","scope":"SHARED","requirement":"Recommended","path":"Client Relations > Profile Management > Inactive Reasons","tables":[{"name":"Inactive Reasons","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1-99999","required":false}]}]},{"tab":"OSEM Territories","item":"OSEM Territories","area":"Client Relations","scope":"SHARED","requirement":"Optional","path":"Administration Home > Client Relations > Profile Management > Territories","tables":[{"name":"Territories","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1-99999","required":false}]}]},{"tab":"OSEM Districts","item":"OSEM Districts","area":"Client Relations","scope":"SHARED","requirement":"Optional","path":"Administration Home > Client Relations > Geographic Management > Districts","tables":[{"name":"Districts","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1-99999","required":false}]}]},{"tab":"Company & Account Types","item":"Company & Account Types","area":"Client Relations","scope":"SHARED","requirement":"Optional","path":"Client Relations > Profile Management > Company Types","tables":[{"name":"Company Types","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":false},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"(Profile) Account Types","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Business Seg & Mailing Actions","item":"Business Seg & Mailing Actions","area":"Client Relations","scope":"SHARED","requirement":"Optional","path":"Client Relations > Profile Management > Business Segments","tables":[{"name":"Business Segments","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Mailing Action Codes","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Languages","item":"Languages","area":"Client Relations","scope":"SHARED","requirement":"Optional","path":"Client Relations > Geographic Management > Languages","tables":[{"name":"Languages","fields":[{"label":"Code","hint":"Alpha Numeric (5)","required":true},{"label":"Description","hint":"Numeric (30)","required":true}]}]},{"tab":"Regions","item":"Regions","area":"Client Relations","scope":"SHARED","requirement":"Optional","path":"Client Relations > Geographic Management > Regions","tables":[{"name":"Regions","fields":[{"label":"Code","hint":"Alpha Numeric (3)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Identification Type & Country","item":"Identification Type & Country","area":"Client Relations","scope":"PMS","requirement":"Optional","path":"Client Relations > Geographic Management > Identification Type","tables":[{"name":"Identification Type","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (40)","required":true},{"label":"ID Role","hint":"","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Identification Country","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]},{"tab":"Nationalities & Birth Country","item":"Nationalities & Birth Country","area":"Client Relations","scope":"PMS","requirement":"Recommended","path":"Client Relations > Geographic Management > Nationalities","tables":[{"name":"Nationalities","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]},{"name":"Birth Country","fields":[{"label":"Code","hint":"Alpha Numeric (8)","required":true},{"label":"Description","hint":"Alpha Numeric (250)","required":true},{"label":"Sequence","hint":"1 to 99999","required":false}]}]}];
const STORE_KEY = 'oc-practice-piw-v1';
const PROPERTY_FIELDS = [
['propertyName','Property name',true],['propertyCode','Property code',true],['chainCode','Chain code',true],
['environment','OPERA Cloud environment name',false],['country','Country',true],['countryMode','Country Mode (e.g. PT, ES, FR)',true],
['currency','Base currency',true],['timezone','Time zone',false],['rooms','Number of rooms',true],
['products','Products (PMS, OSEM, R&A, OPI…)',true],['goLive','Target go-live date',true],['fiscalPartner','Fiscal partner (if fiscalised)',false],
['interfaces','Interfaces (PBX, keys, POS, channel manager, RMS…)',false],['consultant','Consultant',true],['propertyContact','Property contact',true],
['notes','Notes',false]
];
let state = { property:{}, data:{} , updated:null};
try { const s = localStorage.getItem(STORE_KEY); if (s) state = Object.assign(state, JSON.parse(s)); } catch(e) {}
const byId = {}; SCHEMA.forEach((s,i)=>{ s.id = 's'+i; byId[s.id]=s; });
const main = document.getElementById('main');
let GUIDE = null;
fetch('/assets/piw-guide.json').then(r => r.ok ? r.json() : null).then(g => { GUIDE = g; if (byId[current]) render(); }).catch(() => {});
function guideOpen(){ try { return localStorage.getItem('oc-piw-guide') !== 'closed'; } catch(e) { return true; } }
function exampleRows(s, t){
const g = GUIDE && GUIDE[s.tab]; if (!g || !g.examples) return [];
const labels = new Set(t.fields.map(f => f.label));
const rowsFor = g.examples[t.name] || [];
return rowsFor.filter(r => Object.keys(r).filter(k => labels.has(k)).length >= Math.min(2, t.fields.length));
}
function insertExample(t, data, ex, paint){
ex.forEach(r => {
const row = t.fields.map(f => r[f.label] === undefined ? '' : String(r[f.label]));
const slot = data.findIndex(d => !t.fields.some((f, fi) => (d[fi] || '').trim()));
if (slot >= 0) data[slot] = row; else data.push(row);
});
save(); paint(); toast(ex.length + ' example rows added. Replace them with the property data.');
}
let current = location.hash.slice(1) || 'overview';
function save(){ state.updated = new Date().toISOString(); try{ localStorage.setItem(STORE_KEY, JSON.stringify(state)); }catch(e){} refreshDots(); }
function toast(msg){ const t=document.getElementById('toast'); t.textContent=msg; t.classList.add('show'); clearTimeout(toast.t); toast.t=setTimeout(()=>t.classList.remove('show'),2200); }
function el(tag, attrs, ...kids){ const e=document.createElement(tag); if(attrs) for(const [k,v] of Object.entries(attrs)){ if(k==='class') e.className=v; else if(k.startsWith('on')) e.addEventListener(k.slice(2),v); else if(v!==undefined&&v!==null) e.setAttribute(k,v);} kids.flat().forEach(k=>{ if(k==null) return; e.append(k.nodeType?k:document.createTextNode(k)); }); return e; }
function rows(sid, ti){ state.data[sid] = state.data[sid] || {}; state.data[sid][ti] = state.data[sid][ti] || []; return state.data[sid][ti]; }
function maxLen(hint){ const m=(hint||'').match(/\((\d+)\)/); return m?+m[1]:null; }
function isNumericHint(hint){ return /^Numeric/i.test(hint||''); }
function validateTable(t, data){
const issues=[]; const seen=new Map();
let ki = t.fields.findIndex(f=>/(^|\s)code$|^room #$|^room type$|^type$|^reservation type$|^cancellation rule$|^deposit rule$|^package code$|^rate code$|^marketing city$|^promotion code$|^promotion group$|^article code$|^task code$|^alert code$/i.test(f.label));
const checkDup = ki>=0 && !/schedule|mapping|hierarchy|pricing|posting rules|preferences$/i.test(t.name);
if(ki<0) ki=0; const firstKey=t.fields[ki];
data.forEach((r,ri)=>{
const empty = t.fields.every((f,fi)=>!(r[fi]||'').trim()); if(empty) return;
t.fields.forEach((f,fi)=>{
const v=(r[fi]||'').trim();
if(f.required && !v) issues.push({ri,fi,msg:`Row ${ri+1}: ${f.label} is required`});
const ml=maxLen(f.hint); if(v && ml && v.length>ml) issues.push({ri,fi,msg:`Row ${ri+1}: ${f.label} exceeds ${ml} characters`});
if(v && isNumericHint(f.hint) && !/^\d+$/.test(v)) issues.push({ri,fi,msg:`Row ${ri+1}: ${f.label} must be numeric`});
if(v && /^Sequence$/i.test(f.label) && (!/^\d+$/.test(v) || +v<1 || +v>99999)) issues.push({ri,fi,msg:`Row ${ri+1}: Sequence must be 1 to 99999`});
});
const k=(r[ki]||'').trim().toUpperCase(); if(k && checkDup){ if(seen.has(k)) issues.push({ri,fi:ki,msg:`Row ${ri+1}: duplicate ${firstKey.label} "${k}"`}); seen.set(k,ri); }
});
return issues;
}
function sheetStatus(s){
let filled=0, issues=0;
s.tables.forEach((t,ti)=>{ const d=(state.data[s.id]||{})[ti]||[]; const n=d.filter(r=>t.fields.some((f,fi)=>(r[fi]||'').trim())).length; filled+=n; issues+=validateTable(t,d).length; });
return {filled, issues};
}
function refreshDots(){
SCHEMA.forEach(s=>{ const d=document.getElementById('dot-'+s.id); if(!d) return; const st=sheetStatus(s); d.className='dot '+(st.issues?'err':st.filled?'done':(s.requirement==='Required'?'req':'')); d.title=st.issues?st.issues+' issues':st.filled?st.filled+' rows':s.requirement; });
const pd=document.getElementById('dot-property'); const miss=PROPERTY_FIELDS.filter(f=>f[2]&&!(state.property[f[0]]||'').trim()).length; pd.className='dot '+(miss?'req':'done');
}
function buildNav(filter){
const nav=document.getElementById('navList'); nav.textContent='';
const areas=[...new Set(SCHEMA.map(s=>s.area))];
areas.forEach(a=>{
const list=SCHEMA.filter(s=>s.area===a && (!filter || (s.item+' '+s.tables.map(t=>t.name).join(' ')).toLowerCase().includes(filter)));
if(!list.length) return;
nav.append(el('h3',null,a));
list.forEach(s=>nav.append(el('button',{class:'nav','data-go':s.id,onclick:()=>go(s.id)}, el('span',null,s.item), el('span',{class:'dot',id:'dot-'+s.id}))));
});
document.querySelectorAll('aside button.nav').forEach(b=>b.setAttribute('aria-current', b.dataset.go===current?'true':'false'));
refreshDots();
}
function go(id){ current=id; history.replaceState(null,'','#'+id); render(); document.querySelectorAll('aside button.nav').forEach(b=>b.setAttribute('aria-current', b.dataset.go===id?'true':'false')); window.scrollTo(0,0); }
function renderOverview(){
let req=0,reqDone=0,rowsTotal=0,issues=0;
SCHEMA.forEach(s=>{ const st=sheetStatus(s); rowsTotal+=st.filled; issues+=st.issues; if(s.requirement==='Required'){ req++; if(st.filled) reqDone++; } });
const prop=state.property.propertyName?`${state.property.propertyName} (${state.property.propertyCode||'no code'})`:'No property yet';
main.append(
el('p',{class:'eyebrow'},'Property Information Worksheet'),
el('h1',null,'PIW Builder'),
el('p',{class:'lead'},'Capture an OPERA Cloud property build by configuration area, check required fields as you go and export a clean workbook for the client or the build team. Data stays in this browser until you export it.'),
el('div',{class:'toolbar'},
el('button',{class:'btn primary',onclick:exportXlsx},'Export to Excel'),
el('button',{class:'btn',onclick:exportJson},'Save project file (.json)'),
el('button',{class:'btn',onclick:()=>document.getElementById('importFile').click()},'Open project or workbook'),
el('button',{class:'btn',onclick:loadDemo},'Load demo property'),
el('button',{class:'btn',onclick:clearAll},'Start new property')),
el('div',{class:'stats'},
el('div',{class:'stat'},el('b',null,prop.length>28?prop.slice(0,28)+'…':prop),el('span',null,'Current property')),
el('div',{class:'stat'},el('b',null,`${reqDone} / ${req}`),el('span',null,'Required worksheets started')),
el('div',{class:'stat'},el('b',null,String(rowsTotal)),el('span',null,'Rows captured')),
el('div',{class:'stat'},el('b',{style:issues?'color:var(--bad)':''},String(issues)),el('span',null,'Validation issues'))),
);
const tbl=el('table',{class:'area-table'},el('thead',null,el('tr',null,el('th',null,'Worksheet'),el('th',null,'Area'),el('th',null,'Requirement'),el('th',null,'Rows'),el('th',null,'Issues'))));
const tb=el('tbody'); SCHEMA.filter(s=>s.requirement==='Required'||sheetStatus(s).filled).forEach(s=>{ const st=sheetStatus(s); tb.append(el('tr',null,el('td',null,el('button',{onclick:()=>go(s.id)},s.item)),el('td',null,s.area),el('td',null,el('span',{class:'pill '+s.requirement},s.requirement)),el('td',null,String(st.filled)),el('td',{style:st.issues?'color:var(--bad)':''},String(st.issues)))); });
tbl.append(tb);
main.append(el('div',{class:'card'},el('h2',null,'Required worksheets and progress'),el('p',{class:'note'},'Every worksheet from the global pre-installation workbook is in the left menu. Required ones show an amber dot until they have data, green when filled, red with validation issues.'),tbl));
main.append(el('div',{class:'card'},el('h2',null,'How to use it'),
el('ol',null,
el('li',null,'Fill Property information first. Country Mode drives the fiscal build.'),
el('li',null,'Work through Required worksheets. Paste straight from Excel: click the first cell and press Ctrl+V. Tab-separated rows fill across the grid.'),
el('li',null,'Fix red cells. Rules check required fields, maximum lengths from the field hints, numeric codes, sequence ranges and duplicate codes.'),
el('li',null,'Export to Excel for the client and the build team. Save the project file to carry on later or on another machine.')),
el('p',{class:'note'},'Field structure follows the global OPERA Cloud pre-installation workbook. Always check the administration path against the client\'s OPERA Cloud release.')));
}
function renderProperty(){
main.append(el('p',{class:'eyebrow'},'Start here'),el('h1',null,'Property information'),el('p',{class:'lead'},'Scope of the build. Required fields are marked.'));
const f=el('div',{class:'form'});
PROPERTY_FIELDS.forEach(([k,label,req])=>{
const input = k==='notes'||k==='interfaces' ? el('textarea',{id:'p-'+k,rows:'3'}) : el('input',{id:'p-'+k,type:k==='goLive'?'date':(k==='rooms'?'number':'text')});
input.value = state.property[k]||''; input.addEventListener('input',()=>{ state.property[k]=input.value; save(); });
f.append(el('div',null,el('label',{for:'p-'+k},label+(req?' *':'')),input));
});
main.append(el('div',{class:'card'},f));
}
function renderSheet(s){
main.append(el('p',{class:'eyebrow'},s.area+' · '+s.scope),el('h1',null,s.item),
el('div',{class:'meta'},el('span',{class:'pill '+s.requirement},s.requirement), s.path?el('span',{class:'path'},s.path):null));
const g = GUIDE && GUIDE[s.tab];
if (g) {
const open = guideOpen();
const body = el('div', { class: 'guide-body' },
el('p', { class: 'about' }, g.about || ''),
(g.fill && g.fill.length) ? el('h3', null, 'How to fill it') : null,
(g.fill && g.fill.length) ? el('ol', null, g.fill.map(x => el('li', null, x))) : null,
g.tip ? el('div', { class: 'tip' }, el('b', null, 'Field tip'), g.tip) : null);
if (!open) body.hidden = true;
const btn = el('button', { class: 'btn small guide-toggle', onclick: () => { body.hidden = !body.hidden; btn.textContent = body.hidden ? 'Show guide' : 'Hide guide'; try { localStorage.setItem('oc-piw-guide', body.hidden ? 'closed' : 'open'); } catch(e) {} } }, open ? 'Hide guide' : 'Show guide');
main.append(el('div', { class: 'card guide' }, btn, el('h2', null, 'About this worksheet'), body));
}
s.tables.forEach((t,ti)=>{
const data=rows(s.id,ti); if(!data.length){ for(let i=0;i<3;i++) data.push([]); }
const card=el('div',{class:'card'}); const issuesEl=el('div',{class:'issues'});
const head=el('tr',null,el('th',null,'#'), ...t.fields.map(f=>el('th',{title:f.hint||''}, f.required?el('span',{class:'star'},'* '):null, f.label, f.hint?el('small',null,f.hint):null)), el('th',null,''));
const body=el('tbody');
const table=el('table',{class:'grid'},el('thead',null,head),body);
function paint(){
body.textContent='';
const issues=validateTable(t,data); const bad=new Set(issues.map(i=>i.ri+':'+i.fi));
data.forEach((r,ri)=>{
const tr=el('tr',null,el('td',{class:'rowctl'},String(ri+1)));
t.fields.forEach((f,fi)=>{
const inp=el('input',{value:r[fi]||'','aria-label':`${t.name} row ${ri+1} ${f.label}`});
inp.value=r[fi]||''; if(bad.has(ri+':'+fi)) inp.classList.add('invalid');
inp.addEventListener('change',()=>{ r[fi]=inp.value; save(); paint(); });
inp.addEventListener('paste',ev=>{ const txt=(ev.clipboardData||window.clipboardData).getData('text'); if(!/[\t\n]/.test(txt)) return; ev.preventDefault();
const lines=txt.replace(/\r/g,'').split('\n'); if(lines[lines.length-1]==='') lines.pop();
lines.forEach((line,li)=>{ const cells=line.split('\t'); const row=data[ri+li]||(data[ri+li]=[]); cells.forEach((c,ci)=>{ if(fi+ci<t.fields.length) row[fi+ci]=c.trim(); }); });
save(); paint(); toast(lines.length+' rows pasted'); });
tr.append(el('td',null,inp));
});
tr.append(el('td',{class:'rowctl'},el('button',{class:'x',title:'Remove row','aria-label':'Remove row '+(ri+1),onclick:()=>{ data.splice(ri,1); save(); paint(); }},'×')));
body.append(tr);
});
issuesEl.textContent=''; issues.slice(0,8).forEach(i=>issuesEl.append(el('div',null,i.msg))); if(issues.length>8) issuesEl.append(el('div',null,`…and ${issues.length-8} more`));
}
paint();
card.append(el('h2',null,t.name), el('div',{class:'toolbar'},
el('button',{class:'btn small',onclick:()=>{ data.push([]); save(); paint(); }},'Add row'),
el('button',{class:'btn small',onclick:()=>{ for(let i=0;i<10;i++) data.push([]); save(); paint(); }},'Add 10 rows'),
el('button',{class:'btn small',onclick:()=>{ const clean=data.filter(r=>t.fields.some((f,fi)=>(r[fi]||'').trim())); data.length=0; data.push(...clean); save(); paint(); }},'Remove empty rows')),
exampleBlock(t, data, paint),
el('div',{class:'grid-wrap'},table), issuesEl);
main.append(card);
});
}
function exampleBlock(t, data, paint){
const ex = exampleRows(byId[current], t); if (!ex.length) return null;
const cols = t.fields.filter(f => ex.some(r => r[f.label] !== undefined && r[f.label] !== ''));
const tbl = el('table', null,
el('thead', null, el('tr', null, cols.map(f => el('th', null, f.label)))),
el('tbody', null, ex.map(r => el('tr', null, cols.map(f => el('td', null, r[f.label] === undefined ? '' : String(r[f.label])))))));
return el('details', { class: 'example' },
el('summary', null, el('span', null, 'Example: ' + ex.length + ' rows'), el('span', { class: 'tag' }, 'Synthetic demo hotel')),
el('div', { class: 'ex-wrap' }, tbl),
el('div', { class: 'toolbar', style: 'padding-bottom:12px' }, el('button', { class: 'btn small', onclick: () => insertExample(t, data, ex, paint) }, 'Copy example into this table')));
}
function render(){ main.textContent=''; if(current==='overview') renderOverview(); else if(current==='property') renderProperty(); else if(byId[current]) renderSheet(byId[current]); else renderOverview(); }
function sheetName(s, t, ti){ let n=(s.tables.length>1?t.name:s.item).replace(/[\\\/\?\*\[\]:]/g,' ').slice(0,31); return n; }
function exportXlsx(){
if(typeof XLSX==='undefined'){ toast('Excel library did not load. Use Save project file instead.'); return; }
const wb=XLSX.utils.book_new(); const used=new Set();
const summary=[['Aperture PIW Builder export'],['Exported',new Date().toLocaleString('en-GB')],[],['Property information']];
PROPERTY_FIELDS.forEach(([k,label])=>summary.push([label,state.property[k]||'']));
summary.push([],['Worksheet','Area','Requirement','Rows','Issues','Administration path']);
SCHEMA.forEach(s=>{ const st=sheetStatus(s); summary.push([s.item,s.area,s.requirement,st.filled,st.issues,s.path]); });
const ws0=XLSX.utils.aoa_to_sheet(summary); ws0['!cols']=[{wch:38},{wch:18},{wch:14},{wch:8},{wch:8},{wch:80}]; XLSX.utils.book_append_sheet(wb,ws0,'Summary'); used.add('Summary');
SCHEMA.forEach(s=>s.tables.forEach((t,ti)=>{
const d=((state.data[s.id]||{})[ti]||[]).filter(r=>t.fields.some((f,fi)=>(r[fi]||'').trim()));
if(!d.length && s.requirement!=='Required') return;
let n=sheetName(s,t,ti); let k=1; while(used.has(n)){ n=n.slice(0,28)+' '+(++k); } used.add(n);
const aoa=[t.fields.map(f=>(f.required?'* ':'')+f.label), t.fields.map(f=>f.hint||''), ...d.map(r=>t.fields.map((f,fi)=>r[fi]||''))];
const ws=XLSX.utils.aoa_to_sheet(aoa); ws['!cols']=t.fields.map(f=>({wch:Math.max(12,Math.min(40,f.label.length+4))}));
XLSX.utils.book_append_sheet(wb,ws,n);
}));
const code=(state.property.propertyCode||'PROPERTY').replace(/[^A-Za-z0-9_-]/g,'');
XLSX.writeFile(wb,`PIW_${code}_${new Date().toISOString().slice(0,10)}.xlsx`); toast('Workbook exported');
}
function exportJson(){
const blob=new Blob([JSON.stringify({format:'oc-practice-piw',version:1,state},null,1)],{type:'application/json'});
const a=el('a',{href:URL.createObjectURL(blob),download:`PIW_${(state.property.propertyCode||'PROPERTY').replace(/[^A-Za-z0-9_-]/g,'')}.json`}); document.body.append(a); a.click(); a.remove(); toast('Project file saved');
}
document.getElementById('importFile').addEventListener('change',async ev=>{
const file=ev.target.files[0]; if(!file) return; ev.target.value='';
try{
if(file.name.endsWith('.json')){ const j=JSON.parse(await file.text()); if(j.format!=='oc-practice-piw') throw Error('Not a PIW project file'); state=j.state; }
else {
if(typeof XLSX==='undefined') throw Error('Excel library did not load');
const wb=XLSX.read(await file.arrayBuffer()); let n=0;
SCHEMA.forEach(s=>s.tables.forEach((t,ti)=>{
const name=wb.SheetNames.find(x=>x===sheetName(s,t,ti)); if(!name) return;
const aoa=XLSX.utils.sheet_to_json(wb.Sheets[name],{header:1,defval:''});
const hdr=(aoa[0]||[]).map(h=>String(h).replace(/^\*\s*/,'').trim());
const map=t.fields.map(f=>hdr.indexOf(f.label));
const data=aoa.slice(2).filter(r=>r.some(c=>String(c).trim())).map(r=>map.map(ix=>ix>=0?String(r[ix]):''));
if(data.length){ state.data[s.id]=state.data[s.id]||{}; state.data[s.id][ti]=data; n+=data.length; }
}));
const sum=wb.Sheets['Summary']; if(sum){ const aoa=XLSX.utils.sheet_to_json(sum,{header:1,defval:''}); PROPERTY_FIELDS.forEach(([k,label])=>{ const r=aoa.find(x=>x[0]===label); if(r) state.property[k]=String(r[1]); }); }
toast(n+' rows imported');
}
save(); buildNav(); render();
}catch(e){ toast('Could not open file: '+e.message); }
});
function clearAll(){ if(!confirm('Start a new property? Unsaved data in this browser will be cleared. Save a project file first if you need it.')) return; state={property:{},data:{},updated:null}; save(); render(); }
function setRows(item, tableIndex, rowsIn){ const s=SCHEMA.find(x=>x.item===item); if(!s) return; state.data[s.id]=state.data[s.id]||{}; state.data[s.id][tableIndex]=rowsIn; }
function colRows(item, tableIndex, objs){ const s=SCHEMA.find(x=>x.item===item); if(!s) return; const t=s.tables[tableIndex]; setRows(item,tableIndex,objs.map(o=>t.fields.map(f=>o[f.label]!==undefined?String(o[f.label]):''))); }
function loadDemo(){
if(Object.keys(state.data).length && !confirm('Replace the current data with the demo property?')) return;
state={property:{propertyName:'Demo Lisbon Riverside Hotel',propertyCode:'DEMOLIS',chainCode:'DEMO',environment:'UAT',country:'Portugal',countryMode:'PT',currency:'EUR',timezone:'Europe/Lisbon',rooms:'12',products:'PMS, R&A, OPI',goLive:'',fiscalPartner:'To confirm',interfaces:'PBX, key cards, POS, channel manager',consultant:'',propertyContact:'',notes:'Synthetic demo data. Not a real property.'},data:{},updated:null};
colRows('Market Groups & Codes',0,[{Code:'TRN',Description:'Transient',Sequence:1},{Code:'GRP',Description:'Group',Sequence:2}]);
colRows('Market Groups & Codes',1,[{Code:'BAR',Description:'Best available rate','Market Group':'TRN',Sequence:1,Color:'Blue'},{Code:'COR',Description:'Corporate negotiated','Market Group':'TRN',Sequence:2,Color:'Green'},{Code:'GCO',Description:'Group corporate','Market Group':'GRP',Sequence:3,Color:'Orange'}]);
colRows('Bed Types & Room Class',1,[{Code:'ALL',Description:'All rooms',Sequence:1}]);
colRows('Room Types',0,[{'Physical or Pseudo':'Physical','Room Type':'STD','Room Class':'ALL','Bed Types':'KING',Description:'Standard King',Sequence:1,'Maximum Occupancy':2},{'Physical or Pseudo':'Physical','Room Type':'DLX','Room Class':'ALL','Bed Types':'KING',Description:'Deluxe River View',Sequence:2,'Maximum Occupancy':3},{'Physical or Pseudo':'Pseudo','Room Type':'PM','Room Class':'PSE',Description:'Posting Master',Sequence:99}]);
colRows('Rooms',0,Array.from({length:10},(_,i)=>({'Room #':String(101+i),'Room Type':i<6?'STD':'DLX',Description:i<6?'Standard King':'Deluxe River View','Maximum Occupancy':i<6?2:3,Floors:'1',Sequence:i+1})));
colRows('Transaction Groups',0,[{Code:'REV',Description:'Revenue',Type:'Revenue',Sequence:1},{Code:'PAY',Description:'Payments',Type:'Payment',Sequence:2}]);
colRows('Transaction Subgroups',0,[{Code:'RMREV',Description:'Room revenue',Group:'REV',Sequence:1},{Code:'CARDS',Description:'Credit cards',Group:'PAY',Sequence:2}]);
colRows('Transaction Codes',0,[{Code:'1000',Description:'Accommodation',Subgroup:'RMREV',Group:'REV','Transaction Type':'Revenue'},{Code:'9000',Description:'Visa',Subgroup:'CARDS',Group:'PAY','Transaction Type':'Payment','Payment Type (Payments Only)':'VA'}]);
colRows('Payment Types',0,[{Code:'VA',Description:'Visa','Transaction Code':'9000','Credit Card Type':'VA',Sequence:1}]);
colRows('Reservation Types',0,[{'Reservation Type':'GTD',Description:'Guaranteed',Sequence:1,'Deduct Inventory':'Y'},{'Reservation Type':'6PM',Description:'Hold until 18:00',Sequence:2,'Deduct Inventory':'Y'}]);
save(); buildNav(); go('overview'); toast('Demo property loaded');
}
document.getElementById('navFilter').addEventListener('input',e=>buildNav(e.target.value.trim().toLowerCase()));
document.querySelectorAll('aside > button.nav').forEach(b=>b.addEventListener('click',()=>go(b.dataset.go)));
window.addEventListener('hashchange',()=>{ const h=location.hash.slice(1); if(h && h!==current){ current=h; render(); } });
buildNav(); render();
</script>
</body>
</html>