plac-micro-common 1.3.2 → 1.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
@@ -0,0 +1,528 @@
1
+ <!DOCTYPE html>
2
+ <html lang="km">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>ពាក្យស្នើសុំធានារ៉ាប់រងអាយុជីវិត</title>
7
+ <style>
8
+ /* ── Khmer Font ── */
9
+ @font-face {
10
+ font-family: 'Khmer OS';
11
+ src: url('data:font/truetype;base64,<%= font_base64 %>') format('truetype');
12
+ font-weight: normal;
13
+ font-style: normal;
14
+ }
15
+
16
+ /* ── Reset & Base ── */
17
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
18
+
19
+ body {
20
+ font-family: 'Khmer OS', sans-serif;
21
+ font-size: 9pt;
22
+ color: #1a1a1a;
23
+ background: #fff;
24
+ padding: 14mm 12mm;
25
+ line-height: 1.5;
26
+ -webkit-print-color-adjust: exact;
27
+ print-color-adjust: exact;
28
+ }
29
+
30
+ /* ── Logo & Header ── */
31
+ .logo {
32
+ color: #005bac;
33
+ font-size: 13pt;
34
+ font-weight: bold;
35
+ letter-spacing: 0.5px;
36
+ margin-bottom: 4px;
37
+ }
38
+
39
+ .form-title {
40
+ text-align: center;
41
+ font-size: 11pt;
42
+ font-weight: bold;
43
+ margin-bottom: 10px;
44
+ line-height: 1.6;
45
+ }
46
+
47
+ /* ── Top Meta Row ── */
48
+ .meta-grid {
49
+ display: grid;
50
+ grid-template-columns: 1fr 1fr;
51
+ gap: 4px 16px;
52
+ margin-bottom: 8px;
53
+ }
54
+
55
+ .meta-row {
56
+ display: flex;
57
+ align-items: center;
58
+ gap: 4px;
59
+ border-bottom: 1px solid #333;
60
+ padding-bottom: 2px;
61
+ font-size: 8.5pt;
62
+ }
63
+
64
+ .meta-row span.label { white-space: nowrap; }
65
+ .meta-row span.value { flex: 1; min-width: 0; }
66
+
67
+ /* ── Section Header ── */
68
+ .section-header {
69
+ background-color: #005bac;
70
+ color: #fff;
71
+ text-align: center;
72
+ font-weight: bold;
73
+ font-size: 9pt;
74
+ padding: 4px 8px;
75
+ margin: 8px 0 6px;
76
+ }
77
+
78
+ /* ── Field Row ── */
79
+ .field-row {
80
+ display: flex;
81
+ align-items: center;
82
+ flex-wrap: wrap;
83
+ gap: 4px 10px;
84
+ margin-bottom: 5px;
85
+ font-size: 8.5pt;
86
+ }
87
+
88
+ .field-row .label { white-space: nowrap; }
89
+
90
+ .underline {
91
+ border-bottom: 1px solid #333;
92
+ min-width: 60px;
93
+ display: inline-block;
94
+ padding-bottom: 1px;
95
+ }
96
+
97
+ .underline.lg { min-width: 140px; }
98
+ .underline.md { min-width: 90px; }
99
+ .underline.sm { min-width: 50px; }
100
+ .underline.xs { min-width: 30px; }
101
+ .underline.full { flex: 1; min-width: 120px; }
102
+
103
+ /* ── Checkbox ── */
104
+ .cb-group { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
105
+
106
+ .cb-item {
107
+ display: flex;
108
+ align-items: center;
109
+ gap: 4px;
110
+ white-space: nowrap;
111
+ }
112
+
113
+ .cb-box {
114
+ width: 11px;
115
+ height: 11px;
116
+ border: 1.2px solid #333;
117
+ display: inline-flex;
118
+ align-items: center;
119
+ justify-content: center;
120
+ font-size: 8pt;
121
+ flex-shrink: 0;
122
+ }
123
+
124
+ .cb-box.checked::after { content: '✔'; color: #005bac; }
125
+
126
+ /* ── Table ── */
127
+ table {
128
+ width: 100%;
129
+ border-collapse: collapse;
130
+ font-size: 8.5pt;
131
+ margin-bottom: 6px;
132
+ }
133
+
134
+ th {
135
+ background-color: #dce9f7;
136
+ border: 1px solid #aac4e0;
137
+ padding: 4px 6px;
138
+ text-align: center;
139
+ font-weight: bold;
140
+ }
141
+
142
+ td {
143
+ border: 1px solid #aac4e0;
144
+ padding: 4px 6px;
145
+ text-align: center;
146
+ min-height: 20px;
147
+ }
148
+
149
+ .td-empty { height: 20px; }
150
+
151
+ /* ── Note ── */
152
+ .note {
153
+ font-size: 8pt;
154
+ display: flex;
155
+ justify-content: space-between;
156
+ align-items: center;
157
+ margin-top: 2px;
158
+ }
159
+
160
+ /* ── Health Questions ── */
161
+ .health-q {
162
+ font-size: 8.5pt;
163
+ margin-bottom: 6px;
164
+ line-height: 1.6;
165
+ }
166
+
167
+ .health-q .q-text { display: inline; }
168
+
169
+ .detail-line {
170
+ border-bottom: 1px solid #333;
171
+ min-height: 14px;
172
+ margin-top: 3px;
173
+ width: 100%;
174
+ }
175
+
176
+ /* ── Declaration ── */
177
+ .declaration {
178
+ font-size: 8pt;
179
+ line-height: 1.6;
180
+ margin-bottom: 6px;
181
+ }
182
+
183
+ .declaration p { margin-bottom: 5px; }
184
+
185
+ /* ── Signature Row ── */
186
+ .sig-row {
187
+ display: grid;
188
+ grid-template-columns: 1fr 1fr;
189
+ gap: 16px;
190
+ margin-top: 10px;
191
+ font-size: 8.5pt;
192
+ }
193
+
194
+ .sig-block { display: flex; flex-direction: column; gap: 6px; }
195
+
196
+ .sig-line {
197
+ border-bottom: 1px solid #333;
198
+ min-height: 36px;
199
+ margin-bottom: 4px;
200
+ }
201
+
202
+ /* ── Page number ── */
203
+ .page-num {
204
+ text-align: right;
205
+ font-size: 7.5pt;
206
+ color: #555;
207
+ margin-bottom: 4px;
208
+ }
209
+
210
+ /* ── Page break ── */
211
+ .page-break { page-break-before: always; }
212
+ </style>
213
+ </head>
214
+ <body>
215
+
216
+ <!-- PAGE 1 -->
217
+ <div class="page-num">ទំព័រ 1 នៃ 2</div>
218
+
219
+ <div class="logo">PhillipLife</div>
220
+
221
+ <div class="form-title">
222
+ ពាក្យស្នើសុំធានារ៉ាប់រងអាយុជីវិត<br/>
223
+ សម្រាប់ទម្រង់សាមញ្ញសម្រាប់អតិថិជនជោគជ័យហ្វាយនែន (SIO)
224
+ </div>
225
+
226
+ <!-- Meta -->
227
+ <div class="meta-grid">
228
+ <div class="meta-row">
229
+ <span class="label">ឈ្មោះនិងលេខកូដសាខា</span>
230
+ <span class="value underline full"><%= branchName %> <%= branchCode %></span>
231
+ </div>
232
+ <div class="meta-row">
233
+ <span class="label">ឈ្មោះនិងលេខកូដបុគ្គលិកធានារ៉ាប់រង់</span>
234
+ <span class="value underline full"><%= insurerName %> <%= insurerCode %></span>
235
+ </div>
236
+ <div class="meta-row">
237
+ <span class="label">ឈ្មោះនិងលេខកូដបុគ្គលិកធនាគារ</span>
238
+ <span class="value underline full"><%= bankStaffName %> <%= bankStaffCode %></span>
239
+ </div>
240
+ <div class="meta-row">
241
+ <span class="label">លេខពាក្យស្នើសុំ</span>
242
+ <span class="value underline full"><%= applicationNo %></span>
243
+ </div>
244
+ </div>
245
+
246
+ <!-- Section: Applicant -->
247
+ <div class="section-header">ព័ត៌មានអំពីអ្នកស្នើសុំពណ្ណសន្យារ៉ាប់រង់</div>
248
+
249
+ <div class="field-row">
250
+ <span class="label">ឈ្មោះពេញដូចបង្ហាញនៅក្នុងឯកសារអត្តសញ្ញាណ ជាភាសាខ្មែរ:</span>
251
+ <span class="underline lg"><%= fullNameKh %></span>
252
+ <span class="label">ជាភាសាអង់គ្លេស</span>
253
+ <span class="underline lg"><%= fullNameEn %></span>
254
+ <span class="label">ភេទ:</span>
255
+ <div class="cb-group">
256
+ <div class="cb-item"><div class="cb-box <%= gender === 'male' ? 'checked' : '' %>"></div><span>ប្រុស</span></div>
257
+ <div class="cb-item"><div class="cb-box <%= gender === 'female' ? 'checked' : '' %>"></div><span>ស្រី</span></div>
258
+ </div>
259
+ </div>
260
+
261
+ <div class="field-row">
262
+ <span class="label">ស្ថានភាពគ្រួសារ:</span>
263
+ <div class="cb-group">
264
+ <div class="cb-item"><div class="cb-box <%= maritalStatus === 'single' ? 'checked' : '' %>"></div><span>នៅឡាវ</span></div>
265
+ <div class="cb-item"><div class="cb-box <%= maritalStatus === 'married' ? 'checked' : '' %>"></div><span>រៀបការ</span></div>
266
+ <div class="cb-item"><div class="cb-box <%= maritalStatus === 'pregnant' ? 'checked' : '' %>"></div><span>ពោះម្ដាយ</span></div>
267
+ </div>
268
+ <span class="label">តួនាទីនិងប្រភេទការងារ:</span>
269
+ <span class="underline md"><%= occupation %></span>
270
+ </div>
271
+
272
+ <div class="field-row">
273
+ <span class="label">ឯកសារបញ្ចាក់អត្តសញ្ញាណ:</span>
274
+ <div class="cb-group">
275
+ <div class="cb-item"><div class="cb-box <%= idType === 'nid' ? 'checked' : '' %>"></div><span>អត្តសញ្ញាណបណ្ណ</span></div>
276
+ <div class="cb-item"><div class="cb-box <%= idType === 'passport' ? 'checked' : '' %>"></div><span>លិខិតឆ្លងដែន</span></div>
277
+ <div class="cb-item"><div class="cb-box <%= idType === 'birth' ? 'checked' : '' %>"></div><span>សំបុត្រកំណើត</span></div>
278
+ </div>
279
+ </div>
280
+
281
+ <div class="field-row">
282
+ <span class="label">ផ្សេងទៀត:</span>
283
+ <span class="underline sm"><%= idType === 'other' ? idNumber : '' %></span>
284
+ <span class="label">លេខអត្តសញ្ញាណ:</span>
285
+ <span class="underline md"><%= idNumber %></span>
286
+ <span class="label">ថ្ងៃខែឆ្នាំកំណើត:</span>
287
+ <span class="underline md"><%= dob %></span>
288
+ <span class="label">អាយុ:</span>
289
+ <span class="underline xs"><%= age %></span>
290
+ <span class="label">សញ្ជាតិ:</span>
291
+ <span class="underline sm"><%= nationality %></span>
292
+ <span class="label">លេខទូរស័ព្ទ:</span>
293
+ <span class="underline md"><%= phone %></span>
294
+ </div>
295
+
296
+ <div class="field-row">
297
+ <span class="label">អាសយដ្ឋានបច្ចុប្បន្ន:</span>
298
+ <span class="underline full"><%= address %></span>
299
+ </div>
300
+
301
+ <!-- FATCA -->
302
+ <div class="section-header" style="background:#e8f0fb; color:#005bac; border:1px solid #aac4e0; font-size:8.5pt;">
303
+ សេចក្ដីប្រកាសសម្រាប់ការអនុវត្ដ FATCA
304
+ </div>
305
+
306
+ <div class="field-row">
307
+ អ្នកស្នើរសុំបណ្ណសន្យារ៉ាប់រង់មិនមែនជាពលរដ្ឋអាមេរិក ឬ ជាប់ពន្ធស្នាក់នៅអាមេរិក ឬ មានសិទ្ធិកាន់ Green Card នោះទេ។
308
+ </div>
309
+
310
+ <div class="field-row">
311
+ <div class="cb-group">
312
+ <div class="cb-item"><div class="cb-box <%= !isFatca ? 'checked' : '' %>"></div><span>មិនមែន</span></div>
313
+ <div class="cb-item"><div class="cb-box <%= isFatca ? 'checked' : '' %>"></div><span>មែន</span></div>
314
+ </div>
315
+ <span class="label">US TIN:</span>
316
+ <span class="underline md"><%= usTin %></span>
317
+ <span class="label">លេខកូដលើកលែង FATCA (ប្រសិនមាន):</span>
318
+ <span class="underline md"><%= fatcaExemptCode %></span>
319
+ </div>
320
+
321
+ <div class="health-q" style="font-size:7.8pt; color:#333;">
322
+ ប្រសិនបើការបញ្ចាក់អះអាងណាមួយមិនត្រឹមត្រូវ ខ្ញុំនឹងប្រគល់ជូននូវឯកសារថ្មីក្នុងរយះពេល ៣០ថ្ងៃហើយអះអាងថាខ្ញុំមិនជាប់ពន្ធកាត់ទុករបស់សហរដ្ឋអាមេរិកទេ។
323
+ </div>
324
+
325
+ <!-- Section: Product -->
326
+ <div class="section-header">ព័ត៌មានអំពីផលិតផល</div>
327
+
328
+ <table>
329
+ <thead>
330
+ <tr>
331
+ <th>ឈ្មោះផលិតផល និងរយះពេលធានា</th>
332
+ <th>ទឹកប្រាក់ត្រូវធានា<br/>(ដុល្លារអរាមេរិក)</th>
333
+ <th>របៀបបង់បុព្វលាភ</th>
334
+ <th>បុព្វលាភធានារ៉ាប់រង់<br/>(ដុល្លារអរាមេរិក)</th>
335
+ </tr>
336
+ </thead>
337
+ <tbody>
338
+ <% if (products && products.length > 0) { %>
339
+ <% products.forEach((p) => { %>
340
+ <tr>
341
+ <td><%= p.name || '' %></td>
342
+ <td><%= p.sumAssured || '' %></td>
343
+ <td><%= p.paymentMethod || '' %></td>
344
+ <td><%= p.premium || '' %></td>
345
+ </tr>
346
+ <% }) %>
347
+ <% } else { %>
348
+ <tr>
349
+ <td class="td-empty"></td>
350
+ <td class="td-empty"></td>
351
+ <td class="td-empty"></td>
352
+ <td class="td-empty"></td>
353
+ </tr>
354
+ <tr>
355
+ <td class="td-empty"></td>
356
+ <td class="td-empty"></td>
357
+ <td class="td-empty"></td>
358
+ <td class="td-empty"></td>
359
+ </tr>
360
+ <% } %>
361
+ </tbody>
362
+ </table>
363
+
364
+ <div class="field-row">
365
+ <span class="label">វិឌីសាស្រ្ដបង់បុព្វលាភធានារ៉ាប់រង់:</span>
366
+ <div class="cb-group">
367
+ <div class="cb-item">
368
+ <div class="cb-box <%= paymentVia === 'transfer' ? 'checked' : '' %>"></div>
369
+ <span>ការផ្ទេរប្រាក់ចូលទៅក្នុងគណនីរបស់ហ្វីលីឡាយហ្វ៍ តាមរយះដៃគូររបស់ហ្វីលីឡាយហ្វ៍</span>
370
+ </div>
371
+ <div class="cb-item">
372
+ <div class="cb-box <%= paymentVia === 'cash' ? 'checked' : '' %>"></div>
373
+ <span>តាមរយៈដៃគូរបស់ហ្វីលីឡាយហ្វ៍</span>
374
+ </div>
375
+ </div>
376
+ </div>
377
+
378
+ <!-- Section: Beneficiaries -->
379
+ <div class="section-header">ព័ត៌មានអំពីអ្នកទទួលផល</div>
380
+
381
+ <table>
382
+ <thead>
383
+ <tr>
384
+ <th>ឈ្មោះពេញរបស់អ្នកទទួលផល</th>
385
+ <th>អាយុ</th>
386
+ <th>ទំនាក់ទំនង</th>
387
+ <th>លេខអតិថិជន/ឯកសារ</th>
388
+ <th>% នៃការបែងចែក</th>
389
+ </tr>
390
+ </thead>
391
+ <tbody>
392
+ <% if (beneficiaries && beneficiaries.length > 0) { %>
393
+ <% beneficiaries.forEach((b) => { %>
394
+ <tr>
395
+ <td><%= b.fullName || '' %></td>
396
+ <td><%= b.age || '' %></td>
397
+ <td><%= b.relationship || '' %></td>
398
+ <td><%= b.idNumber || '' %></td>
399
+ <td><%= b.percentage || '' %></td>
400
+ </tr>
401
+ <% }) %>
402
+ <% } else { %>
403
+ <tr>
404
+ <td class="td-empty"></td>
405
+ <td class="td-empty"></td>
406
+ <td class="td-empty"></td>
407
+ <td class="td-empty"></td>
408
+ <td class="td-empty"></td>
409
+ </tr>
410
+ <tr>
411
+ <td class="td-empty"></td>
412
+ <td class="td-empty"></td>
413
+ <td class="td-empty"></td>
414
+ <td class="td-empty"></td>
415
+ <td class="td-empty"></td>
416
+ </tr>
417
+ <tr>
418
+ <td class="td-empty"></td>
419
+ <td class="td-empty"></td>
420
+ <td class="td-empty"></td>
421
+ <td class="td-empty"></td>
422
+ <td class="td-empty"></td>
423
+ </tr>
424
+ <% } %>
425
+ </tbody>
426
+ </table>
427
+
428
+ <div class="note">
429
+ <span>កណត់សម្គាល់៖ ប្រសិនបើភាគរយមិនត្រូវបានបញ្ជាក់ចំនួនទឹកប្រាក់នឹងត្រូវបែងចែកស្មើៗគ្នា</span>
430
+ <span>% សរុបស្មើរ ១០០%</span>
431
+ </div>
432
+
433
+ <!-- Section: Health -->
434
+ <div class="section-header">ព័ត៌មានពាក់ព័ន្ទនឹងសុខភាពរបស់ អ្នកស្នើសុំបណ្ណសន្យារ៉ាប់រង់</div>
435
+
436
+ <!-- Q1 -->
437
+ <div class="health-q">
438
+ <span class="q-text">1) កម្ពស់:</span>
439
+ <span class="underline xs"><%= height %></span> ស.ម
440
+ <span class="q-text" style="margin-left:8px;">ទម្ងន់:</span>
441
+ <span class="underline xs"><%= weight %></span> គ.ក
442
+ <span class="q-text" style="margin-left:8px;">តើលោកអ្នកពិសារបារីដែរឬទេ?:</span>
443
+ <div class="cb-group" style="display:inline-flex; margin-left:4px;">
444
+ <div class="cb-item"><div class="cb-box <%= !smokes ? 'checked' : '' %>"></div><span>មិនមាន</span></div>
445
+ <div class="cb-item"><div class="cb-box <%= smokes ? 'checked' : '' %>"></div><span>មាន</span></div>
446
+ </div>
447
+ <span class="underline xs"><%= smokesCount %></span> ក្នុងមួយថ្ងៃ
448
+ </div>
449
+
450
+ <!-- Q2 -->
451
+ <div class="health-q">
452
+ <span class="q-text">2) តើលោកអ្នកពិសារគ្រឿងស្រវឹងដែរឬទេ?:</span>
453
+ <div class="cb-group" style="display:inline-flex; margin-left:4px;">
454
+ <div class="cb-item"><div class="cb-box <%= !drinksAlcohol ? 'checked' : '' %>"></div><span>មិនមាន</span></div>
455
+ <div class="cb-item"><div class="cb-box <%= drinksAlcohol ? 'checked' : '' %>"></div><span>មាន</span></div>
456
+ </div>
457
+ <span class="underline xs"><%= alcoholCount %></span> ក្នុងមួយសប្ដាហ៍
458
+ </div>
459
+
460
+ <!-- Q3 -->
461
+ <div class="health-q">
462
+ <span class="q-text">3) ក្នុងរយៈពេល០២(ពីរ)ឆ្នាំចុងក្រោយនេះតើលោកអ្នកធ្លាប់បានសម្រាកក្នុងមន្ទីរពេទ្យ ធ្លាប់បានទទួលការវះកាត់ ឬធ្លាប់ទទួលបានលទ្ធផលខុសប្រក្រតីអំពីការវិភាគឈាម ការវិភាគទឹកនោម ការថតកាំរស្មីអុិច (X-ray) ម៉ាស៊ីនវាស់ចង្វាក់បេះដូង អេកូសាស្រ្ដស្កេន ការច្រឹបសាច់យកពិនិត្យ ឬលទ្ធផលវិភាគផ្សេងៗទៀតដែលមិនបានរៀបរាប់ខាងដើមពីគ្រូពេទ្យដែរឬទេ?:</span>
463
+ <div class="cb-group" style="display:inline-flex; margin-left:4px;">
464
+ <div class="cb-item"><div class="cb-box <%= !hospitalizedQ3 ? 'checked' : '' %>"></div><span>មិនមាន</span></div>
465
+ <div class="cb-item"><div class="cb-box <%= hospitalizedQ3 ? 'checked' : '' %>"></div><span>មាន</span></div>
466
+ </div>
467
+
468
+ <% if (hospitalizedQ3) { %>
469
+ <div class="detail-line"><%= hospitalizedQ3Detail %></div>
470
+ <% } %>
471
+ </div>
472
+
473
+ <!-- PAGE 2 -->
474
+ <div class="page-break"></div>
475
+ <div class="page-num">ទំព័រ 2 នៃ 2</div>
476
+
477
+ <!-- Q4 -->
478
+ <div class="health-q">
479
+ <span class="q-text">4) តើលោកអ្នកធ្លាប់បានធ្វើរោគវិនិច្ឆ័យ ពិគ្រោះជំងឺឬទទួលការព្យាបាលដូចជា លើសសម្ពាធឈាម ទឹកនោមផ្អែម ជំងឺបេះដូង ចុកទ្រូង ជំងឺសួត ជំងឺថ្លើម ជំងឺតម្រងនោម មហារីក ជំងឺដាច់សសៃឈាមខួរក្បាល ជំងឺអេដស៍ ជំងឺផ្លូវចិត្ត ពិការភាព ឬរាងកាយមិនប្រក្រតី ប្រើប្រាស់ថ្នាំញៀន ឬញៀនស្រា ឬជំងឺផ្សេងទៀតដែលមិនបានរៀបរាប់ខាងលើដែរឬទេ?</span>
480
+ <div class="cb-group" style="display:inline-flex; margin-left:4px;">
481
+ <div class="cb-item"><div class="cb-box <%= !diagnosedQ4 ? 'checked' : '' %>"></div><span>មិនមាន</span></div>
482
+ <div class="cb-item"><div class="cb-box <%= diagnosedQ4 ? 'checked' : '' %>"></div><span>មាន</span></div>
483
+ </div>
484
+
485
+ <% if (diagnosedQ4) { %>
486
+ <div style="margin-top:4px; font-size:8pt;">បើមានសូមបញ្ជាក់លម្អិតខាងក្រោម៖</div>
487
+ <div class="detail-line"><%= diagnosedQ4Detail %></div>
488
+ <% } %>
489
+ </div>
490
+
491
+ <!-- Declaration -->
492
+ <div class="section-header">សេចក្ដីប្រកាសរបស់អ្នកស្នើសុំធានារ៉ាប់រង់</div>
493
+
494
+ <div class="declaration">
495
+ <p>1) ខ្ញុំអនុញ្ញាត និងយល់ព្រមឲ្យក្រុមហ៊ុនប្រើប្រាស់ព័ត៌មាន និងទិន្នន័យទាំងស្រុងដែលខ្ញុំបានផ្ដល់នៅក្នុងពាក្យស្នើសុំរបស់ខ្ញុំក្នុងគោលបំណង ស្របតាមច្បាប់ ដូចជា ការផ្សព្វផ្សាយទីផ្សារ ការសិក្សាទីផ្សារ និង ការបម្រើអតិថិជនដោយក្រុមហ៊ុន សម្ព័ន្ធក្រុមហ៊ុន ឬ ជាដៃគូពាណិជ្ជកម្មរបស់ក្រុមហ៊ុន ដោយមិនចាំបាច់មានការយល់ព្រម និងជូនដំណឹងបន្ថែមពីខ្ញុំឡើយ។ ក្រុមហ៊ុនមិនត្រូវបានអនុញ្ញាតឲ្យបញ្ចេញព័ត៌មានណាមួយទៅភាគីទីបីណាមួយ ឬប្រើប្រាស់ព័ត៌មាននោះសម្រាប់គោលបំណងផ្សេងទៀតដែលមិនទាក់ទងនឹងគោលបំណងទាំងឡាយខាងលើឡើយ ប្រសិនបើគ្មានការយល់ព្រមព្រៀងជាលាយលក្ខណ៍អក្សរនោះ។</p>
496
+ <p>2) ខ្ញុំសូមអះអាងថាបានអាន និងយល់ស្របនូវគ្រប់ព័ត៌មានក្នុងឯកសារនេះ។ ខ្ញុំសូមប្រកាសថាគ្រប់ព័ត៌មានដែលបានផ្ដល់នៅក្នុងពាក្យស្នើសុំនេះ ពិតជាមានភាពពេញលេញ និងត្រឹមត្រូវពិតប្រាកដមែន។</p>
497
+ </div>
498
+
499
+ <!-- Signatures -->
500
+ <div class="sig-row">
501
+ <div class="sig-block">
502
+ <div>ហត្ថលេខា ឬស្នាមមេដៃរបស់អ្នកស្នើសុំធានារ៉ាប់រង</div>
503
+ <div class="sig-line"></div>
504
+ <div class="field-row">
505
+ <span class="label">ឈ្មោះ</span>
506
+ <span class="underline full"><%= applicantSignatureName %></span>
507
+ </div>
508
+ <div class="field-row">
509
+ <span class="label">កាលបរិច្ឆេទ</span>
510
+ <span class="underline full"><%= signatureDate %></span>
511
+ </div>
512
+ </div>
513
+ <div class="sig-block">
514
+ <div>ហត្ថលេខា ឬស្នាមមេដៃរបស់សាក្សី</div>
515
+ <div class="sig-line"></div>
516
+ <div class="field-row">
517
+ <span class="label">ឈ្មោះ</span>
518
+ <span class="underline full"><%= witnessName %></span>
519
+ </div>
520
+ <div class="field-row">
521
+ <span class="label">កាលបរិច្ឆេទ</span>
522
+ <span class="underline full"><%= witnessDate %></span>
523
+ </div>
524
+ </div>
525
+ </div>
526
+
527
+ </body>
528
+ </html>
@@ -0,0 +1,528 @@
1
+ <!DOCTYPE html>
2
+ <html lang="km">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>ពាក្យស្នើសុំធានារ៉ាប់រងអាយុជីវិត</title>
7
+ <style>
8
+ /* ── Khmer Font ── */
9
+ @font-face {
10
+ font-family: 'Khmer OS';
11
+ src: url('data:font/truetype;base64,<%= font_base64 %>') format('truetype');
12
+ font-weight: normal;
13
+ font-style: normal;
14
+ }
15
+
16
+ /* ── Reset & Base ── */
17
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
18
+
19
+ body {
20
+ font-family: 'Khmer OS', sans-serif;
21
+ font-size: 9pt;
22
+ color: #1a1a1a;
23
+ background: #fff;
24
+ padding: 14mm 12mm;
25
+ line-height: 1.5;
26
+ -webkit-print-color-adjust: exact;
27
+ print-color-adjust: exact;
28
+ }
29
+
30
+ /* ── Logo & Header ── */
31
+ .logo {
32
+ color: #005bac;
33
+ font-size: 13pt;
34
+ font-weight: bold;
35
+ letter-spacing: 0.5px;
36
+ margin-bottom: 4px;
37
+ }
38
+
39
+ .form-title {
40
+ text-align: center;
41
+ font-size: 11pt;
42
+ font-weight: bold;
43
+ margin-bottom: 10px;
44
+ line-height: 1.6;
45
+ }
46
+
47
+ /* ── Top Meta Row ── */
48
+ .meta-grid {
49
+ display: grid;
50
+ grid-template-columns: 1fr 1fr;
51
+ gap: 4px 16px;
52
+ margin-bottom: 8px;
53
+ }
54
+
55
+ .meta-row {
56
+ display: flex;
57
+ align-items: center;
58
+ gap: 4px;
59
+ border-bottom: 1px solid #333;
60
+ padding-bottom: 2px;
61
+ font-size: 8.5pt;
62
+ }
63
+
64
+ .meta-row span.label { white-space: nowrap; }
65
+ .meta-row span.value { flex: 1; min-width: 0; }
66
+
67
+ /* ── Section Header ── */
68
+ .section-header {
69
+ background-color: #005bac;
70
+ color: #fff;
71
+ text-align: center;
72
+ font-weight: bold;
73
+ font-size: 9pt;
74
+ padding: 4px 8px;
75
+ margin: 8px 0 6px;
76
+ }
77
+
78
+ /* ── Field Row ── */
79
+ .field-row {
80
+ display: flex;
81
+ align-items: center;
82
+ flex-wrap: wrap;
83
+ gap: 4px 10px;
84
+ margin-bottom: 5px;
85
+ font-size: 8.5pt;
86
+ }
87
+
88
+ .field-row .label { white-space: nowrap; }
89
+
90
+ .underline {
91
+ border-bottom: 1px solid #333;
92
+ min-width: 60px;
93
+ display: inline-block;
94
+ padding-bottom: 1px;
95
+ }
96
+
97
+ .underline.lg { min-width: 140px; }
98
+ .underline.md { min-width: 90px; }
99
+ .underline.sm { min-width: 50px; }
100
+ .underline.xs { min-width: 30px; }
101
+ .underline.full { flex: 1; min-width: 120px; }
102
+
103
+ /* ── Checkbox ── */
104
+ .cb-group { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
105
+
106
+ .cb-item {
107
+ display: flex;
108
+ align-items: center;
109
+ gap: 4px;
110
+ white-space: nowrap;
111
+ }
112
+
113
+ .cb-box {
114
+ width: 11px;
115
+ height: 11px;
116
+ border: 1.2px solid #333;
117
+ display: inline-flex;
118
+ align-items: center;
119
+ justify-content: center;
120
+ font-size: 8pt;
121
+ flex-shrink: 0;
122
+ }
123
+
124
+ .cb-box.checked::after { content: '✔'; color: #005bac; }
125
+
126
+ /* ── Table ── */
127
+ table {
128
+ width: 100%;
129
+ border-collapse: collapse;
130
+ font-size: 8.5pt;
131
+ margin-bottom: 6px;
132
+ }
133
+
134
+ th {
135
+ background-color: #dce9f7;
136
+ border: 1px solid #aac4e0;
137
+ padding: 4px 6px;
138
+ text-align: center;
139
+ font-weight: bold;
140
+ }
141
+
142
+ td {
143
+ border: 1px solid #aac4e0;
144
+ padding: 4px 6px;
145
+ text-align: center;
146
+ min-height: 20px;
147
+ }
148
+
149
+ .td-empty { height: 20px; }
150
+
151
+ /* ── Note ── */
152
+ .note {
153
+ font-size: 8pt;
154
+ display: flex;
155
+ justify-content: space-between;
156
+ align-items: center;
157
+ margin-top: 2px;
158
+ }
159
+
160
+ /* ── Health Questions ── */
161
+ .health-q {
162
+ font-size: 8.5pt;
163
+ margin-bottom: 6px;
164
+ line-height: 1.6;
165
+ }
166
+
167
+ .health-q .q-text { display: inline; }
168
+
169
+ .detail-line {
170
+ border-bottom: 1px solid #333;
171
+ min-height: 14px;
172
+ margin-top: 3px;
173
+ width: 100%;
174
+ }
175
+
176
+ /* ── Declaration ── */
177
+ .declaration {
178
+ font-size: 8pt;
179
+ line-height: 1.6;
180
+ margin-bottom: 6px;
181
+ }
182
+
183
+ .declaration p { margin-bottom: 5px; }
184
+
185
+ /* ── Signature Row ── */
186
+ .sig-row {
187
+ display: grid;
188
+ grid-template-columns: 1fr 1fr;
189
+ gap: 16px;
190
+ margin-top: 10px;
191
+ font-size: 8.5pt;
192
+ }
193
+
194
+ .sig-block { display: flex; flex-direction: column; gap: 6px; }
195
+
196
+ .sig-line {
197
+ border-bottom: 1px solid #333;
198
+ min-height: 36px;
199
+ margin-bottom: 4px;
200
+ }
201
+
202
+ /* ── Page number ── */
203
+ .page-num {
204
+ text-align: right;
205
+ font-size: 7.5pt;
206
+ color: #555;
207
+ margin-bottom: 4px;
208
+ }
209
+
210
+ /* ── Page break ── */
211
+ .page-break { page-break-before: always; }
212
+ </style>
213
+ </head>
214
+ <body>
215
+
216
+ <!-- PAGE 1 -->
217
+ <div class="page-num">ទំព័រ 1 នៃ 2</div>
218
+
219
+ <div class="logo">PhillipLife</div>
220
+
221
+ <div class="form-title">
222
+ ពាក្យស្នើសុំធានារ៉ាប់រងអាយុជីវិត<br/>
223
+ សម្រាប់ទម្រង់សាមញ្ញសម្រាប់អតិថិជនជោគជ័យហ្វាយនែន (SIO)
224
+ </div>
225
+
226
+ <!-- Meta -->
227
+ <div class="meta-grid">
228
+ <div class="meta-row">
229
+ <span class="label">ឈ្មោះនិងលេខកូដសាខា</span>
230
+ <span class="value underline full"><%= branchName %> <%= branchCode %></span>
231
+ </div>
232
+ <div class="meta-row">
233
+ <span class="label">ឈ្មោះនិងលេខកូដបុគ្គលិកធានារ៉ាប់រង់</span>
234
+ <span class="value underline full"><%= insurerName %> <%= insurerCode %></span>
235
+ </div>
236
+ <div class="meta-row">
237
+ <span class="label">ឈ្មោះនិងលេខកូដបុគ្គលិកធនាគារ</span>
238
+ <span class="value underline full"><%= bankStaffName %> <%= bankStaffCode %></span>
239
+ </div>
240
+ <div class="meta-row">
241
+ <span class="label">លេខពាក្យស្នើសុំ</span>
242
+ <span class="value underline full"><%= applicationNo %></span>
243
+ </div>
244
+ </div>
245
+
246
+ <!-- Section: Applicant -->
247
+ <div class="section-header">ព័ត៌មានអំពីអ្នកស្នើសុំពណ្ណសន្យារ៉ាប់រង់</div>
248
+
249
+ <div class="field-row">
250
+ <span class="label">ឈ្មោះពេញដូចបង្ហាញនៅក្នុងឯកសារអត្តសញ្ញាណ ជាភាសាខ្មែរ:</span>
251
+ <span class="underline lg"><%= fullNameKh %></span>
252
+ <span class="label">ជាភាសាអង់គ្លេស</span>
253
+ <span class="underline lg"><%= fullNameEn %></span>
254
+ <span class="label">ភេទ:</span>
255
+ <div class="cb-group">
256
+ <div class="cb-item"><div class="cb-box <%= gender === 'male' ? 'checked' : '' %>"></div><span>ប្រុស</span></div>
257
+ <div class="cb-item"><div class="cb-box <%= gender === 'female' ? 'checked' : '' %>"></div><span>ស្រី</span></div>
258
+ </div>
259
+ </div>
260
+
261
+ <div class="field-row">
262
+ <span class="label">ស្ថានភាពគ្រួសារ:</span>
263
+ <div class="cb-group">
264
+ <div class="cb-item"><div class="cb-box <%= maritalStatus === 'single' ? 'checked' : '' %>"></div><span>នៅឡាវ</span></div>
265
+ <div class="cb-item"><div class="cb-box <%= maritalStatus === 'married' ? 'checked' : '' %>"></div><span>រៀបការ</span></div>
266
+ <div class="cb-item"><div class="cb-box <%= maritalStatus === 'pregnant' ? 'checked' : '' %>"></div><span>ពោះម្ដាយ</span></div>
267
+ </div>
268
+ <span class="label">តួនាទីនិងប្រភេទការងារ:</span>
269
+ <span class="underline md"><%= occupation %></span>
270
+ </div>
271
+
272
+ <div class="field-row">
273
+ <span class="label">ឯកសារបញ្ចាក់អត្តសញ្ញាណ:</span>
274
+ <div class="cb-group">
275
+ <div class="cb-item"><div class="cb-box <%= idType === 'nid' ? 'checked' : '' %>"></div><span>អត្តសញ្ញាណបណ្ណ</span></div>
276
+ <div class="cb-item"><div class="cb-box <%= idType === 'passport' ? 'checked' : '' %>"></div><span>លិខិតឆ្លងដែន</span></div>
277
+ <div class="cb-item"><div class="cb-box <%= idType === 'birth' ? 'checked' : '' %>"></div><span>សំបុត្រកំណើត</span></div>
278
+ </div>
279
+ </div>
280
+
281
+ <div class="field-row">
282
+ <span class="label">ផ្សេងទៀត:</span>
283
+ <span class="underline sm"><%= idType === 'other' ? idNumber : '' %></span>
284
+ <span class="label">លេខអត្តសញ្ញាណ:</span>
285
+ <span class="underline md"><%= idNumber %></span>
286
+ <span class="label">ថ្ងៃខែឆ្នាំកំណើត:</span>
287
+ <span class="underline md"><%= dob %></span>
288
+ <span class="label">អាយុ:</span>
289
+ <span class="underline xs"><%= age %></span>
290
+ <span class="label">សញ្ជាតិ:</span>
291
+ <span class="underline sm"><%= nationality %></span>
292
+ <span class="label">លេខទូរស័ព្ទ:</span>
293
+ <span class="underline md"><%= phone %></span>
294
+ </div>
295
+
296
+ <div class="field-row">
297
+ <span class="label">អាសយដ្ឋានបច្ចុប្បន្ន:</span>
298
+ <span class="underline full"><%= address %></span>
299
+ </div>
300
+
301
+ <!-- FATCA -->
302
+ <div class="section-header" style="background:#e8f0fb; color:#005bac; border:1px solid #aac4e0; font-size:8.5pt;">
303
+ សេចក្ដីប្រកាសសម្រាប់ការអនុវត្ដ FATCA
304
+ </div>
305
+
306
+ <div class="field-row">
307
+ អ្នកស្នើរសុំបណ្ណសន្យារ៉ាប់រង់មិនមែនជាពលរដ្ឋអាមេរិក ឬ ជាប់ពន្ធស្នាក់នៅអាមេរិក ឬ មានសិទ្ធិកាន់ Green Card នោះទេ។
308
+ </div>
309
+
310
+ <div class="field-row">
311
+ <div class="cb-group">
312
+ <div class="cb-item"><div class="cb-box <%= !isFatca ? 'checked' : '' %>"></div><span>មិនមែន</span></div>
313
+ <div class="cb-item"><div class="cb-box <%= isFatca ? 'checked' : '' %>"></div><span>មែន</span></div>
314
+ </div>
315
+ <span class="label">US TIN:</span>
316
+ <span class="underline md"><%= usTin %></span>
317
+ <span class="label">លេខកូដលើកលែង FATCA (ប្រសិនមាន):</span>
318
+ <span class="underline md"><%= fatcaExemptCode %></span>
319
+ </div>
320
+
321
+ <div class="health-q" style="font-size:7.8pt; color:#333;">
322
+ ប្រសិនបើការបញ្ចាក់អះអាងណាមួយមិនត្រឹមត្រូវ ខ្ញុំនឹងប្រគល់ជូននូវឯកសារថ្មីក្នុងរយះពេល ៣០ថ្ងៃហើយអះអាងថាខ្ញុំមិនជាប់ពន្ធកាត់ទុករបស់សហរដ្ឋអាមេរិកទេ។
323
+ </div>
324
+
325
+ <!-- Section: Product -->
326
+ <div class="section-header">ព័ត៌មានអំពីផលិតផល</div>
327
+
328
+ <table>
329
+ <thead>
330
+ <tr>
331
+ <th>ឈ្មោះផលិតផល និងរយះពេលធានា</th>
332
+ <th>ទឹកប្រាក់ត្រូវធានា<br/>(ដុល្លារអរាមេរិក)</th>
333
+ <th>របៀបបង់បុព្វលាភ</th>
334
+ <th>បុព្វលាភធានារ៉ាប់រង់<br/>(ដុល្លារអរាមេរិក)</th>
335
+ </tr>
336
+ </thead>
337
+ <tbody>
338
+ <% if (products && products.length > 0) { %>
339
+ <% products.forEach((p) => { %>
340
+ <tr>
341
+ <td><%= p.name || '' %></td>
342
+ <td><%= p.sumAssured || '' %></td>
343
+ <td><%= p.paymentMethod || '' %></td>
344
+ <td><%= p.premium || '' %></td>
345
+ </tr>
346
+ <% }) %>
347
+ <% } else { %>
348
+ <tr>
349
+ <td class="td-empty"></td>
350
+ <td class="td-empty"></td>
351
+ <td class="td-empty"></td>
352
+ <td class="td-empty"></td>
353
+ </tr>
354
+ <tr>
355
+ <td class="td-empty"></td>
356
+ <td class="td-empty"></td>
357
+ <td class="td-empty"></td>
358
+ <td class="td-empty"></td>
359
+ </tr>
360
+ <% } %>
361
+ </tbody>
362
+ </table>
363
+
364
+ <div class="field-row">
365
+ <span class="label">វិឌីសាស្រ្ដបង់បុព្វលាភធានារ៉ាប់រង់:</span>
366
+ <div class="cb-group">
367
+ <div class="cb-item">
368
+ <div class="cb-box <%= paymentVia === 'transfer' ? 'checked' : '' %>"></div>
369
+ <span>ការផ្ទេរប្រាក់ចូលទៅក្នុងគណនីរបស់ហ្វីលីឡាយហ្វ៍ តាមរយះដៃគូររបស់ហ្វីលីឡាយហ្វ៍</span>
370
+ </div>
371
+ <div class="cb-item">
372
+ <div class="cb-box <%= paymentVia === 'cash' ? 'checked' : '' %>"></div>
373
+ <span>តាមរយៈដៃគូរបស់ហ្វីលីឡាយហ្វ៍</span>
374
+ </div>
375
+ </div>
376
+ </div>
377
+
378
+ <!-- Section: Beneficiaries -->
379
+ <div class="section-header">ព័ត៌មានអំពីអ្នកទទួលផល</div>
380
+
381
+ <table>
382
+ <thead>
383
+ <tr>
384
+ <th>ឈ្មោះពេញរបស់អ្នកទទួលផល</th>
385
+ <th>អាយុ</th>
386
+ <th>ទំនាក់ទំនង</th>
387
+ <th>លេខអតិថិជន/ឯកសារ</th>
388
+ <th>% នៃការបែងចែក</th>
389
+ </tr>
390
+ </thead>
391
+ <tbody>
392
+ <% if (beneficiaries && beneficiaries.length > 0) { %>
393
+ <% beneficiaries.forEach((b) => { %>
394
+ <tr>
395
+ <td><%= b.fullName || '' %></td>
396
+ <td><%= b.age || '' %></td>
397
+ <td><%= b.relationship || '' %></td>
398
+ <td><%= b.idNumber || '' %></td>
399
+ <td><%= b.percentage || '' %></td>
400
+ </tr>
401
+ <% }) %>
402
+ <% } else { %>
403
+ <tr>
404
+ <td class="td-empty"></td>
405
+ <td class="td-empty"></td>
406
+ <td class="td-empty"></td>
407
+ <td class="td-empty"></td>
408
+ <td class="td-empty"></td>
409
+ </tr>
410
+ <tr>
411
+ <td class="td-empty"></td>
412
+ <td class="td-empty"></td>
413
+ <td class="td-empty"></td>
414
+ <td class="td-empty"></td>
415
+ <td class="td-empty"></td>
416
+ </tr>
417
+ <tr>
418
+ <td class="td-empty"></td>
419
+ <td class="td-empty"></td>
420
+ <td class="td-empty"></td>
421
+ <td class="td-empty"></td>
422
+ <td class="td-empty"></td>
423
+ </tr>
424
+ <% } %>
425
+ </tbody>
426
+ </table>
427
+
428
+ <div class="note">
429
+ <span>កណត់សម្គាល់៖ ប្រសិនបើភាគរយមិនត្រូវបានបញ្ជាក់ចំនួនទឹកប្រាក់នឹងត្រូវបែងចែកស្មើៗគ្នា</span>
430
+ <span>% សរុបស្មើរ ១០០%</span>
431
+ </div>
432
+
433
+ <!-- Section: Health -->
434
+ <div class="section-header">ព័ត៌មានពាក់ព័ន្ទនឹងសុខភាពរបស់ អ្នកស្នើសុំបណ្ណសន្យារ៉ាប់រង់</div>
435
+
436
+ <!-- Q1 -->
437
+ <div class="health-q">
438
+ <span class="q-text">1) កម្ពស់:</span>
439
+ <span class="underline xs"><%= height %></span> ស.ម
440
+ <span class="q-text" style="margin-left:8px;">ទម្ងន់:</span>
441
+ <span class="underline xs"><%= weight %></span> គ.ក
442
+ <span class="q-text" style="margin-left:8px;">តើលោកអ្នកពិសារបារីដែរឬទេ?:</span>
443
+ <div class="cb-group" style="display:inline-flex; margin-left:4px;">
444
+ <div class="cb-item"><div class="cb-box <%= !smokes ? 'checked' : '' %>"></div><span>មិនមាន</span></div>
445
+ <div class="cb-item"><div class="cb-box <%= smokes ? 'checked' : '' %>"></div><span>មាន</span></div>
446
+ </div>
447
+ <span class="underline xs"><%= smokesCount %></span> ក្នុងមួយថ្ងៃ
448
+ </div>
449
+
450
+ <!-- Q2 -->
451
+ <div class="health-q">
452
+ <span class="q-text">2) តើលោកអ្នកពិសារគ្រឿងស្រវឹងដែរឬទេ?:</span>
453
+ <div class="cb-group" style="display:inline-flex; margin-left:4px;">
454
+ <div class="cb-item"><div class="cb-box <%= !drinksAlcohol ? 'checked' : '' %>"></div><span>មិនមាន</span></div>
455
+ <div class="cb-item"><div class="cb-box <%= drinksAlcohol ? 'checked' : '' %>"></div><span>មាន</span></div>
456
+ </div>
457
+ <span class="underline xs"><%= alcoholCount %></span> ក្នុងមួយសប្ដាហ៍
458
+ </div>
459
+
460
+ <!-- Q3 -->
461
+ <div class="health-q">
462
+ <span class="q-text">3) ក្នុងរយៈពេល០២(ពីរ)ឆ្នាំចុងក្រោយនេះតើលោកអ្នកធ្លាប់បានសម្រាកក្នុងមន្ទីរពេទ្យ ធ្លាប់បានទទួលការវះកាត់ ឬធ្លាប់ទទួលបានលទ្ធផលខុសប្រក្រតីអំពីការវិភាគឈាម ការវិភាគទឹកនោម ការថតកាំរស្មីអុិច (X-ray) ម៉ាស៊ីនវាស់ចង្វាក់បេះដូង អេកូសាស្រ្ដស្កេន ការច្រឹបសាច់យកពិនិត្យ ឬលទ្ធផលវិភាគផ្សេងៗទៀតដែលមិនបានរៀបរាប់ខាងដើមពីគ្រូពេទ្យដែរឬទេ?:</span>
463
+ <div class="cb-group" style="display:inline-flex; margin-left:4px;">
464
+ <div class="cb-item"><div class="cb-box <%= !hospitalizedQ3 ? 'checked' : '' %>"></div><span>មិនមាន</span></div>
465
+ <div class="cb-item"><div class="cb-box <%= hospitalizedQ3 ? 'checked' : '' %>"></div><span>មាន</span></div>
466
+ </div>
467
+
468
+ <% if (hospitalizedQ3) { %>
469
+ <div class="detail-line"><%= hospitalizedQ3Detail %></div>
470
+ <% } %>
471
+ </div>
472
+
473
+ <!-- PAGE 2 -->
474
+ <div class="page-break"></div>
475
+ <div class="page-num">ទំព័រ 2 នៃ 2</div>
476
+
477
+ <!-- Q4 -->
478
+ <div class="health-q">
479
+ <span class="q-text">4) តើលោកអ្នកធ្លាប់បានធ្វើរោគវិនិច្ឆ័យ ពិគ្រោះជំងឺឬទទួលការព្យាបាលដូចជា លើសសម្ពាធឈាម ទឹកនោមផ្អែម ជំងឺបេះដូង ចុកទ្រូង ជំងឺសួត ជំងឺថ្លើម ជំងឺតម្រងនោម មហារីក ជំងឺដាច់សសៃឈាមខួរក្បាល ជំងឺអេដស៍ ជំងឺផ្លូវចិត្ត ពិការភាព ឬរាងកាយមិនប្រក្រតី ប្រើប្រាស់ថ្នាំញៀន ឬញៀនស្រា ឬជំងឺផ្សេងទៀតដែលមិនបានរៀបរាប់ខាងលើដែរឬទេ?</span>
480
+ <div class="cb-group" style="display:inline-flex; margin-left:4px;">
481
+ <div class="cb-item"><div class="cb-box <%= !diagnosedQ4 ? 'checked' : '' %>"></div><span>មិនមាន</span></div>
482
+ <div class="cb-item"><div class="cb-box <%= diagnosedQ4 ? 'checked' : '' %>"></div><span>មាន</span></div>
483
+ </div>
484
+
485
+ <% if (diagnosedQ4) { %>
486
+ <div style="margin-top:4px; font-size:8pt;">បើមានសូមបញ្ជាក់លម្អិតខាងក្រោម៖</div>
487
+ <div class="detail-line"><%= diagnosedQ4Detail %></div>
488
+ <% } %>
489
+ </div>
490
+
491
+ <!-- Declaration -->
492
+ <div class="section-header">សេចក្ដីប្រកាសរបស់អ្នកស្នើសុំធានារ៉ាប់រង់</div>
493
+
494
+ <div class="declaration">
495
+ <p>1) ខ្ញុំអនុញ្ញាត និងយល់ព្រមឲ្យក្រុមហ៊ុនប្រើប្រាស់ព័ត៌មាន និងទិន្នន័យទាំងស្រុងដែលខ្ញុំបានផ្ដល់នៅក្នុងពាក្យស្នើសុំរបស់ខ្ញុំក្នុងគោលបំណង ស្របតាមច្បាប់ ដូចជា ការផ្សព្វផ្សាយទីផ្សារ ការសិក្សាទីផ្សារ និង ការបម្រើអតិថិជនដោយក្រុមហ៊ុន សម្ព័ន្ធក្រុមហ៊ុន ឬ ជាដៃគូពាណិជ្ជកម្មរបស់ក្រុមហ៊ុន ដោយមិនចាំបាច់មានការយល់ព្រម និងជូនដំណឹងបន្ថែមពីខ្ញុំឡើយ។ ក្រុមហ៊ុនមិនត្រូវបានអនុញ្ញាតឲ្យបញ្ចេញព័ត៌មានណាមួយទៅភាគីទីបីណាមួយ ឬប្រើប្រាស់ព័ត៌មាននោះសម្រាប់គោលបំណងផ្សេងទៀតដែលមិនទាក់ទងនឹងគោលបំណងទាំងឡាយខាងលើឡើយ ប្រសិនបើគ្មានការយល់ព្រមព្រៀងជាលាយលក្ខណ៍អក្សរនោះ។</p>
496
+ <p>2) ខ្ញុំសូមអះអាងថាបានអាន និងយល់ស្របនូវគ្រប់ព័ត៌មានក្នុងឯកសារនេះ។ ខ្ញុំសូមប្រកាសថាគ្រប់ព័ត៌មានដែលបានផ្ដល់នៅក្នុងពាក្យស្នើសុំនេះ ពិតជាមានភាពពេញលេញ និងត្រឹមត្រូវពិតប្រាកដមែន។</p>
497
+ </div>
498
+
499
+ <!-- Signatures -->
500
+ <div class="sig-row">
501
+ <div class="sig-block">
502
+ <div>ហត្ថលេខា ឬស្នាមមេដៃរបស់អ្នកស្នើសុំធានារ៉ាប់រង</div>
503
+ <div class="sig-line"></div>
504
+ <div class="field-row">
505
+ <span class="label">ឈ្មោះ</span>
506
+ <span class="underline full"><%= applicantSignatureName %></span>
507
+ </div>
508
+ <div class="field-row">
509
+ <span class="label">កាលបរិច្ឆេទ</span>
510
+ <span class="underline full"><%= signatureDate %></span>
511
+ </div>
512
+ </div>
513
+ <div class="sig-block">
514
+ <div>ហត្ថលេខា ឬស្នាមមេដៃរបស់សាក្សី</div>
515
+ <div class="sig-line"></div>
516
+ <div class="field-row">
517
+ <span class="label">ឈ្មោះ</span>
518
+ <span class="underline full"><%= witnessName %></span>
519
+ </div>
520
+ <div class="field-row">
521
+ <span class="label">កាលបរិច្ឆេទ</span>
522
+ <span class="underline full"><%= witnessDate %></span>
523
+ </div>
524
+ </div>
525
+ </div>
526
+
527
+ </body>
528
+ </html>
@@ -37,15 +37,59 @@ exports.generateFormSIO = generateFormSIO;
37
37
  const fs = __importStar(require("fs"));
38
38
  const path = __importStar(require("path"));
39
39
  const ejs = __importStar(require("ejs"));
40
+ /*
41
+ |--------------------------------------------------------------------------
42
+ | Cache storage
43
+ |--------------------------------------------------------------------------
44
+ */
45
+ let cached_font_base64 = null;
46
+ const cached_templates = {};
47
+ /*
48
+ |--------------------------------------------------------------------------
49
+ | Resolve assets root
50
+ |--------------------------------------------------------------------------
51
+ */
52
+ function getAssetsRootPath() {
53
+ return path.join(__dirname, "..", "..", "assets");
54
+ }
55
+ /*
56
+ |--------------------------------------------------------------------------
57
+ | Load font (cached)
58
+ |--------------------------------------------------------------------------
59
+ */
60
+ function getFontBase64() {
61
+ if (!cached_font_base64) {
62
+ const font_path = path.join(getAssetsRootPath(), "fonts", "KhmerOS.ttf");
63
+ const font_buffer = fs.readFileSync(font_path);
64
+ cached_font_base64 = font_buffer.toString("base64");
65
+ }
66
+ return cached_font_base64;
67
+ }
68
+ /*
69
+ |--------------------------------------------------------------------------
70
+ | Load template (cached)
71
+ |--------------------------------------------------------------------------
72
+ */
73
+ function getTemplate(lang) {
74
+ if (!cached_templates[lang]) {
75
+ const template_path = lang === "en"
76
+ ? path.join(getAssetsRootPath(), "templates", "sio-form-en.ejs")
77
+ : path.join(getAssetsRootPath(), "templates", "sio-form-kh.ejs");
78
+ const template = fs.readFileSync(template_path, "utf8");
79
+ cached_templates[lang] = ejs.compile(template);
80
+ }
81
+ return cached_templates[lang];
82
+ }
83
+ /*
84
+ |--------------------------------------------------------------------------
85
+ | Main generator
86
+ |--------------------------------------------------------------------------
87
+ */
40
88
  async function generateFormSIO(data, lang) {
41
- const template_path = lang === "en"
42
- ? path.join(__dirname, "templates", "sio-form-en.ejs")
43
- : path.join(__dirname, "templates", "sio-form-kh.ejs");
44
- const font_path = path.join(__dirname, "fonts", "KhmerOS.ttf");
45
- const template = fs.readFileSync(template_path, "utf8");
46
- const view_data = {
89
+ const template = getTemplate(lang);
90
+ const font_base64 = getFontBase64();
91
+ return template({
47
92
  ...data,
48
- font_url: `file://${font_path}`,
49
- };
50
- return ejs.render(template, view_data);
93
+ font_base64,
94
+ });
51
95
  }
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "plac-micro-common",
3
- "version": "1.3.2",
3
+ "version": "1.3.4",
4
4
  "types": "dist/index.d.ts",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
7
- "build": "tsc",
7
+ "build": "tsc && npm run copy:assets",
8
8
  "v:patch": "npm version patch",
9
9
  "v:minor": "npm version minor",
10
10
  "v:major": "npm version major",
11
+ "copy:assets": "mkdir -p dist/assets && cp -R src/assets/* dist/assets/",
11
12
  "publish:public": "npm publish --access public",
12
13
  "test": "echo \"Error: no test specified\" && exit 1"
13
14
  },
@@ -23,6 +24,7 @@
23
24
  "dependencies": {
24
25
  "class-transformer": "^0.5.1",
25
26
  "class-validator": "^0.14.2",
27
+ "copyfiles": "^2.4.1",
26
28
  "ejs": "^5.0.1",
27
29
  "rxjs": "^7.8.2"
28
30
  },