exchange

行前花費

  • 機票:
    • 臺灣到瑞典:29428 NT
    • 瑞典、丹麥來回:3345 NT
  • 衣物:6948 NT
  • 證件:
    • 簽證:4511 NT (1500 SEK)
    • 國際駕照:250 NT
    • ISIC學生證:480 NT
  • 食物:1093 NT
  • 保險:20934 NT
  • 網路:300 NT (七天)
  • 配件:
    • 讀卡機:255 NT
    • 鎖:210 NT
    • 保溫杯:980 NT
    • 快煮鍋:1380 NT
    • 保溫瓶:1024 NT
  • 藥:850(300掛號費、550普拿疼)
  • 中華電信:1525 (違約金+月付)
  • 總共:70168 NT

各月花費

// Get all the pages in the folder.
// Display the total expense for each type and payment method
// in each day and month.

const folderPath = `"notes/plans/expense"`;     
const pages = dv.pages(folderPath);

// Define the period
const startDate = new Date("2024-08-01"); // Start of the period
const endDate = new Date("2025-07-03"); // End of the period

// Initialize variables
let resultMonths = new Map(); // key: year-month (string), value: total expense (map)

// Function to add months
function nextMonth(date) {
  let newDate = new Date(date);
  newDate.setMonth(newDate.getMonth() + 1);
  return newDate;
}

// Initialize the value for each month in the period
let currentDate = startDate;
while (currentDate <= endDate) {
  const yearMonth = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}`;
  
  let resultMonth = new Map([["Food", 0], ["Transport", 0], ["Utilities", 0], ["Entertainment", 0], ["Travel", 0], ["Other", 0]]);

  resultMonths.set(yearMonth, resultMonth);
  currentDate = nextMonth(currentDate);
}

for (let page of pages) {
  const date = new Date(page.file.name);

  // Check if the page's date falls within the specified period
  if (date >= startDate && date <= endDate) {
    const monthKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;
    let currentMonth = resultMonths.get(monthKey);

    const content = await dv.io.load(page.file.path);
    const lines = content.split("\n");

    for (let line of lines) {
      if (line.startsWith("RAW:")) {
        const rawInfo = line.substring(4).split(", ");
        const [item, price, type, method] = rawInfo;
        currentMonth.set(type, currentMonth.get(type) + parseInt(price));
      }
    }
  }
}

// Display
let tableData = [];
resultMonths.forEach((expenses, yearMonth) => {
  dv.header(2, yearMonth);

  let rowData = [];
  let totalMonth = 0;
  expenses.forEach((total, type) => {
    totalMonth += total;
    rowData.push([type, total]);
  });
  rowData.push(["Total", totalMonth]);
  dv.table(["Type", "Price"], rowData);
  dv.paragraph("---");
});