- News
- Press Release
- Tỷ giá trung tâm
- Tỷ giá tham khảo tại giữa đồng Việt Nam và các loại ngoại tệ tại Cục Quản lý ngoại hối
- Tỷ giá tính chéo của Đồng Việt Nam với một số ngoại tệ để xác định giá tính thuế
- Lãi suất NHNN quy định
- Lãi suất thị trường liên ngân hàng
- Statistics
- CPI
- Legal Documents
- Monetary Policy
- Payment & Treasury
- Money Issuance
- Quản lý hoạt động ngoại hối và hoạt động kinh doanh vàng
- Cải cách hành chính
- Diễn đàn NHNN
- About SBV
- News
- Press Release
- Tỷ giá trung tâm
- Tỷ giá tham khảo tại giữa đồng Việt Nam và các loại ngoại tệ tại Cục Quản lý ngoại hối
- Tỷ giá tính chéo của Đồng Việt Nam với một số ngoại tệ để xác định giá tính thuế
- Lãi suất NHNN quy định
- Lãi suất thị trường liên ngân hàng
- Statistics
- CPI
- Legal Documents
- Monetary Policy
- Payment & Treasury
- Money Issuance
- Quản lý hoạt động ngoại hối và hoạt động kinh doanh vàng
- Cải cách hành chính
- Diễn đàn NHNN
- About SBV
HOẠT ĐỘNG TỔ CHỨC TÍN DỤNG
RESEARCH - DISCUSSION
Developing an integrated digital ecosystem connecting banking with other sectors
In the coming period, the banking sector will continue to implement cross-sectoral cooperation: integrating, connecting, and sharing information between the banking sector and other industries to expand the digital ecosystem and develop digital banking and payment services. This will help form an interconnected digital ecosystem, creating favorable conditions for people and businesses to access services quickly, safely, and effectively.
Cross-border payments: An inevitable trend in the context of international integration and digital transformation
To promote cross-border payment connectivity within the region and globally, and to meet the needs of individuals and businesses for fast, secure, and convenient transactions, it is necessary to establish a comprehensive legal framework, synchronized modern technical infrastructure, sustainable and secure payment technology platforms, and stronger inter-sectoral coordination and international cooperation.
The following has evaluated to null or missing:
==> article.getDisplayDate() [in template "29795641980326#20120#139054" at line 24, column 21]
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign dt = article.getDisplayDate() [in template "29795641980326#20120#139054" at line 24, column 7]
----
1<#if entries?has_content>
2
3 <#-- Tạo mảng tạm để lưu entry kèm ngày -->
4 <#assign sortedEntries = [] />
5
6 <#list entries as entry>
7 <#assign article = entry.getAssetRenderer().getArticle() />
8
9 <#-- Lấy map các DDM field -->
10 <#assign ddmMap = entry.getAssetRenderer()
11 .getDDMFormValuesReader()
12 .getDDMFormValues()
13 .getDDMFormFieldValuesMap() />
14
15 <#-- Lấy ngày từ DDM field "Date48362898", fallback về ngày xuất bản -->
16 <#assign rawDate = "">
17 <#if ddmMap?? && ddmMap["Date48362898"]?? && ddmMap["Date48362898"]?has_content>
18 <#assign rawDate = ddmMap["Date48362898"][0].getValue().getString(locale)!"" >
19 </#if>
20
21 <#if rawDate?has_content>
22 <#assign dt = rawDate?date("yyyy-MM-dd") />
23 <#else>
24 <#assign dt = article.getDisplayDate() />
25 </#if>
26
27 <#-- Thêm vào mảng sortedEntries -->
28 <#assign sortedEntries = sortedEntries + [{
29 "entry": entry,
30 "date": dt
31 }] />
32 </#list>
33
34 <#-- Sắp xếp entries theo ngày tăng dần -->
35 <#assign entries = sortedEntries?sort_by("date")?map(item -> item.entry) />
36
37 <#-- Nhóm theo quý, chỉ lấy bài mới nhất của mỗi quý -->
38 <#assign quarterMap = {} />
39
40 <#list entries as entry>
41 <#-- Lấy ngày theo DDM logic -->
42 <#assign ddmMap = entry.getAssetRenderer()
43 .getDDMFormValuesReader()
44 .getDDMFormValues()
45 .getDDMFormFieldValuesMap() />
46
47 <#assign rawDate = "">
48 <#if ddmMap?? && ddmMap["Date48362898"]?? && ddmMap["Date48362898"]?has_content>
49 <#assign rawDate = ddmMap["Date48362898"][0].getValue().getString(locale)!"" >
50 </#if>
51
52 <#if rawDate?has_content>
53 <#assign dt = rawDate?date("yyyy-MM-dd") />
54 <#else>
55 <#assign dt = entry.getAssetRenderer().getArticle().getDisplayDate() />
56 </#if>
57
58 <#assign month = dt?string("M")?number />
59 <#assign year = dt?string("yyyy") />
60
61 <#if month <= 3>
62 <#assign quarter = "I">
63 <#elseif month <= 6>
64 <#assign quarter = "II">
65 <#elseif month <= 9>
66 <#assign quarter = "III">
67 <#else>
68 <#assign quarter = "IV">
69 </#if>
70
71 <#assign key = year + "-" + quarter />
72
73 <#-- Nếu chưa có hoặc entry hiện tại mới hơn thì cập nhật -->
74 <#if !quarterMap[key]?? || (dt?long > quarterMap[key].date?long)>
75 <#assign quarterMap = quarterMap + {
76 key: {
77 "entry": entry,
78 "date": dt
79 }
80 } />
81 </#if>
82 </#list>
83
84 <#-- Lấy entries sau khi nhóm theo quý, sort theo ngày tăng dần -->
85 <#assign entries = quarterMap?values?sort_by("date")?map(item -> item.entry) />
86
87 <#-- Chỉ lấy 4 quý mới nhất -->
88 <#if entries?size gt 4>
89 <#assign entries = entries[entries?size - 4 .. entries?size - 1] />
90 </#if>
91
92 <#-- Entry mới nhất (quý gần nhất) -->
93 <#assign lastEntry = entries[entries?size - 1] />
94
95 <#-- Lấy ngày theo DDM logic cho lastEntry -->
96 <#assign ddmMap = lastEntry.getAssetRenderer()
97 .getDDMFormValuesReader()
98 .getDDMFormValues()
99 .getDDMFormFieldValuesMap() />
100
101 <#assign rawDate = "">
102 <#if ddmMap?? && ddmMap["Date48362898"]?? && ddmMap["Date48362898"]?has_content>
103 <#assign rawDate = ddmMap["Date48362898"][0].getValue().getString(locale)!"" >
104 </#if>
105
106 <#if rawDate?has_content>
107 <#assign dtLast = rawDate?date("yyyy-MM-dd") />
108 <#else>
109 <#assign dtLast = lastEntry.getAssetRenderer().getArticle().getDisplayDate() />
110 </#if>
111
112 <#assign monthLast = dtLast?string("M")?number />
113 <#assign yearLast = dtLast?string("yyyy") />
114
115 <#if monthLast <= 3>
116 <#assign quarterLast = "I">
117 <#elseif monthLast <= 6>
118 <#assign quarterLast = "II">
119 <#elseif monthLast <= 9>
120 <#assign quarterLast = "III">
121 <#else>
122 <#assign quarterLast = "IV">
123 </#if>
124
125 <div class="max-[1170px]:w-[calc(100%/2-12px)] max-[768px]:w-[calc(100%/2-4px)] max-[768px]:p-2 max-[650px]:w-full max-[650px]:px-0 sbv-chart">
126 <#if currentURL?contains("/vi/")>
127 <div class="flex flex-col space-y-[4px] mb-3">
128 <a href="/can-can-thanh-toan-quoc-te" class="text-[#000000] text-[20px] leading-[1.15] font-bold uppercase">
129 CÁN CÂN THANH TOÁN QUỐC TẾ
130 </a>
131 <span class="text-[var(--unnamed-color-000000)] leading-[21px] text-[16px]">QUÝ ${quarterLast} NĂM ${yearLast} (Triệu USD)</span>
132 </div>
133 <#else>
134 <div class="flex flex-col space-y-[4px] mb-2">
135 <a style="text-align: start" href="/can-can-thanh-toan-quoc-te" class="text-[#000000] text-[20px] leading-[1.15] font-bold uppercase">
136 Balance of International Payment
137 </a>
138 <span class="text-[var(--unnamed-color-000000)] leading-[21px] text-[16px]">QUARTER ${quarterLast} YEAR ${yearLast} (In million of USD)</span>
139 </div>
140 </#if>
141 <div class="w-[370px] h-[270px] max-[1170px]:w-full max-[1170px]:h-[370px] bg-white p-1">
142 <!-- Bar chart would be rendered here -->
143 <canvas id="statChart" width="400" height="300"></canvas>
144 </div>
145 <div class="text-end mt-2">
146 <span class="text-[#9D1B43] rounded-full flex justify-start items-center space-x-[6px]">
147 <#if currentURL?contains("/vi/")>
148 <a href="/can-can-thanh-toan-quoc-te" class="text-[#9D1B43] inline-block text-[14px] leading-[1.5] space-x-[6px]">
149 Xem chi tiết <i class="fa-solid fa-caret-right"></i>
150 </a>
151 <#else>
152 <a href="/can-can-thanh-toan-quoc-te" class="text-[#9D1B43] inline-block text-[14px] leading-[1.5] space-x-[6px]">
153 Details <i class="fa-solid fa-caret-right"></i>
154 </a>
155 </#if>
156
157 </div>
158 </div>
159<style>
160 .sbv-chart .text-end a{color: #9D1B43;}
161 .sbv-chart .text-end a:hover{color: var(--btn-link-hover-color);}
162</style>
163<script>
164// Khi DOM xong thì build chart
165document.addEventListener("DOMContentLoaded", function() {
166 // 3) Tạo mảng label: [ "QI/2024", "QII/2024", ... ]
167const labels = [
168 <#list entries as curEntry>
169
170 <#-- Lấy ngày theo DDM logic -->
171 <#assign ddmMap = curEntry.getAssetRenderer()
172 .getDDMFormValuesReader()
173 .getDDMFormValues()
174 .getDDMFormFieldValuesMap() />
175
176 <#assign rawDate = "">
177 <#if ddmMap?? && ddmMap["Date48362898"]?? && ddmMap["Date48362898"]?has_content>
178 <#assign rawDate = ddmMap["Date48362898"][0].getValue().getString(locale)!"" >
179 </#if>
180
181 <#if rawDate?has_content>
182 <#assign dt = rawDate?date("yyyy-MM-dd") />
183 <#else>
184 <#assign dt = curEntry.getAssetRenderer().getArticle().getDisplayDate() />
185 </#if>
186
187 <#assign month = dt?string("M")?number />
188 <#assign year = dt?string("yyyy") />
189
190 <#if month <= 3>
191 <#assign quarter = "I">
192 <#elseif month <= 6>
193 <#assign quarter = "II">
194 <#elseif month <= 9>
195 <#assign quarter = "III">
196 <#else>
197 <#assign quarter = "IV">
198 </#if>
199
200 <#assign label = "Q" + quarter + "/" + year />
201
202 "${label}"<#if curEntry_has_next>,</#if>
203
204 </#list>
205];
206
207 // Mỗi mảng số liệu build tách biệt:
208const canCanVangLai = [
209 <#list entries as e>
210 <#assign ddm = e.getAssetRenderer()
211 .getDDMFormValuesReader()
212 .getDDMFormValues()
213 .getDDMFormFieldValuesMap() />
214
215 <#assign v = 0 />
216
217 <#if ddm["canCanVangLai"]?has_content>
218 <#assign raw = ddm["canCanVangLai"][0].getValue().getString(locale)!"" />
219
220 <#if raw?has_content>
221 <#-- xử lý format số nếu có dấu -->
222 <#assign raw = raw?replace(",", ".") />
223 <#assign v = raw?number />
224 </#if>
225 </#if>
226
227 ${v}<#if e_has_next>,</#if>
228 </#list>
229];
230
231const canCanVon = [
232 <#list entries as e>
233 <#assign ddm = e.getAssetRenderer()
234 .getDDMFormValuesReader()
235 .getDDMFormValues()
236 .getDDMFormFieldValuesMap() />
237
238 <#assign v = 0 />
239
240 <#if ddm["canCanVon"]?has_content>
241 <#assign raw = ddm["canCanVon"][0].getValue().getString(locale)!"" />
242
243 <#if raw?has_content>
244 <#assign raw = raw?replace(",", ".") />
245 <#assign v = raw?number />
246 </#if>
247 </#if>
248
249 ${v}<#if e_has_next>,</#if>
250 </#list>
251];
252 const canCanTaiChinh = [
253 <#list entries as e>
254 <#assign ddm = e.getAssetRenderer()
255 .getDDMFormValuesReader()
256 .getDDMFormValues()
257 .getDDMFormFieldValuesMap() />
258 <#assign v = 0 />
259 <#if ddm["canCanTaiChinh"]?has_content>
260 <#assign v = ddm["canCanTaiChinh"][0].getValue().getString(locale)?number />
261 </#if>
262 ${v}<#if e_has_next>,</#if>
263 </#list>
264 ];
265
266 const loiVaSaiSot = [
267 <#list entries as e>
268 <#assign ddm = e.getAssetRenderer()
269 .getDDMFormValuesReader()
270 .getDDMFormValues()
271 .getDDMFormFieldValuesMap() />
272 <#assign v = 0 />
273 <#if ddm["loiVaSaiSot"]?has_content>
274 <#assign v = ddm["loiVaSaiSot"][0].getValue().getString(locale)?number />
275 </#if>
276 ${v}<#if e_has_next>,</#if>
277 </#list>
278 ];
279
280 const canCanTongThe = [
281 <#list entries as e>
282 <#assign ddm = e.getAssetRenderer()
283 .getDDMFormValuesReader()
284 .getDDMFormValues()
285 .getDDMFormFieldValuesMap() />
286 <#assign v = 0 />
287 <#if ddm["canCanTongThe"]?has_content>
288 <#assign v = ddm["canCanTongThe"][0].getValue().getString(locale)?number />
289 </#if>
290 ${v}<#if e_has_next>,</#if>
291 </#list>
292 ];
293
294 const duTruLienQuan = [
295 <#list entries as e>
296 <#assign ddm = e.getAssetRenderer()
297 .getDDMFormValuesReader()
298 .getDDMFormValues()
299 .getDDMFormFieldValuesMap() />
300 <#assign v = 0 />
301 <#if ddm["duTruVaCacHangMucLien"]?has_content>
302 <#assign v = ddm["duTruVaCacHangMucLien"][0].getValue().getString(locale)?number />
303 </#if>
304 ${v}<#if e_has_next>,</#if>
305 </#list>
306 ];
307
308 // Vẽ chart
309 const ctx = document.getElementById("statChart").getContext("2d");
310 new Chart(ctx, {
311 type: "line",
312 data: {
313 labels: labels,
314 datasets: [
315 <#if currentURL?contains("/vi/")>
316 { label: "Cán cân vãng lai", data: canCanVangLai, borderColor: "#6f42c1", pointBackgroundColor: "#6f42c1", fill: false, tension: 0.3, borderWidth: 1 },
317 { label: "Cán cân vốn", data: canCanVon, borderColor: "#fd7e14", pointBackgroundColor: "#fd7e14", fill: false, tension: 0.3, borderWidth: 1 },
318 { label: "Cán cân tài chính", data: canCanTaiChinh, borderColor: "#0d6efd", pointBackgroundColor: "#0d6efd", fill: false, tension: 0.3, borderWidth: 1 },
319 { label: "Lỗi và sai sót", data: loiVaSaiSot, borderColor: "#198754", pointBackgroundColor: "#198754", fill: false, tension: 0.3, borderWidth: 1 },
320 { label: "Cán cân tổng thể", data: canCanTongThe, borderColor: "#6610f2", pointBackgroundColor: "#6610f2", fill: false, tension: 0.3, borderWidth: 1 },
321 { label: "Dự trữ & hạng mục liên quan",data: duTruLienQuan, borderColor: "#0dcaf0", pointBackgroundColor: "#0dcaf0", fill: false, tension: 0.3, borderWidth: 1 }
322 <#else>
323 { label: "Current Account", data: canCanVangLai, borderColor: "#6f42c1", pointBackgroundColor: "#6f42c1", fill: false, tension: 0.3, borderWidth: 1 },
324 { label: "Capital Account", data: canCanVon, borderColor: "#fd7e14", pointBackgroundColor: "#fd7e14", fill: false, tension: 0.3, borderWidth: 1 },
325 { label: "Financial account", data: canCanTaiChinh, borderColor: "#0d6efd", pointBackgroundColor: "#0d6efd", fill: false, tension: 0.3, borderWidth: 1 },
326 { label: "Net Errors and Omissions", data: loiVaSaiSot, borderColor: "#198754", pointBackgroundColor: "#198754", fill: false, tension: 0.3, borderWidth: 1 },
327 { label: "Overall balance", data: canCanTongThe, borderColor: "#6610f2", pointBackgroundColor: "#6610f2", fill: false, tension: 0.3, borderWidth: 1 },
328 { label: "Reserve and related items",data: duTruLienQuan, borderColor: "#0dcaf0", pointBackgroundColor: "#0dcaf0", fill: false, tension: 0.3, borderWidth: 1 }
329 </#if>
330
331 ]
332 },
333 options: {
334 responsive: true,
335 plugins: {
336 tooltip: {
337 callbacks: {
338 title: function() {
339 return [];
340 },
341 label: function(context) {
342 const label = context.dataset.label || '';
343 const time = context.label || '';
344 const value = context.formattedValue || '';
345
346 <#if currentURL?contains("/vi/")>
347 return [
348 "Chỉ tiêu: " + label,
349 "Thời gian: " + time,
350 "Giá trị: " + value + " Triệu USD"
351 ];
352 <#else>
353 return [
354 "Standard: " + label,
355 "Time: " + time,
356 "Value: " + value + " Million of USD"
357 ];
358 </#if>
359
360 }
361 }
362},
363legend: {
364 position: 'top',
365 labels: {
366 usePointStyle: true,
367 pointStyle: 'circle',
368 boxWidth: 5,
369 boxHeight: 5,
370 padding: 10,
371 color: "#000000",
372 font: { size: 10 },
373 generateLabels: function(chart) {
374 const items = Chart.defaults.plugins.legend.labels.generateLabels(chart);
375 // Group items thành mảng con 3 phần tử
376 const grouped = [];
377 for (let i = 0; i < items.length; i += 3) {
378 grouped.push(items.slice(i, i + 3));
379 }
380 // Flatten lại nhưng thêm dấu xuống dòng vào cuối mỗi dòng (hack wrap)
381 return grouped.flatMap((group, idx, arr) => {
382 if (idx < arr.length - 1) {
383 group[group.length - 1].text += '\n';
384 }
385 return group;
386 });
387 }
388 }
389},
390 title: {
391 display: false,
392 text: "DỮ LIỆU THỐNG KÊ\nQUÝ III NĂM 2024 (Triệu USD)",
393 font: { size: 16, weight: "bold" }
394 }
395 },
396 scales: {
397 x: {
398 ticks: {
399 color: '#000000'
400 },
401 title: { display: true,
402 <#if currentURL?contains("/vi/")>
403 text: "Thời gian: Quý/Năm",
404 <#else>
405 text: "Time: Quarter/Year",
406 </#if>
407 align: 'end',
408 color: "#000000",
409 font: { weight: "bold" } }
410 },
411 y: {
412 ticks: {
413 color: '#000000'
414 },
415 title: {
416 display: true,
417 <#if currentURL?contains("/vi/")>
418 text: "Triệu USD",
419 <#else>
420 text: "Million of USD",
421 </#if>
422 position: 'top',
423 align: 'end',
424 color: "#000000",
425 font: { weight: "bold" } },
426 beginAtZero: false
427 }
428 }
429 }
430 });
431});
432</script>
433 </#if>