Modul:Death date and age

Dokumentasi untuk modul ini dapat dibuat di Modul:Death date and age/doc

local p = {}

-- Nama bulan dalam bahasa Indonesia
local months = {
    "Januari", "Februari", "Maret", "April", "Mei", "Juni",
    "Juli", "Agustus", "September", "Oktober", "November", "Desember"
}

-- Fungsi untuk mengurai/parse string YYYY-MM-DD
local function parseDateString(str)
    if not str then return nil, nil, nil end
    local y, m, d = str:match("(%d%d%d%d)[%-/](%d%d?)[%-/](%d%d?)")
    if y and m and d then
        return tonumber(y), tonumber(m), tonumber(d)
    end
    return nil, nil, nil
end

-- Fungsi menghitung umur pada saat meninggal
local function calculateAgeAtDeath(bYear, bMonth, bDay, dYear, dMonth, dDay)
    local age = dYear - bYear
    if dMonth < bMonth or (dMonth == bMonth and dDay < bDay) then
        age = age - 1
    end
    return age
end

function p.main(frame)
    local args = frame:getParent().args
    local dYear, dMonth, dDay
    local bYear, bMonth, bDay

    -- Skenario 1: Menggunakan string format YYYY-MM-DD (2 parameter string: Parameter 1 = Wafat, Parameter 2 = Lahir)
    if args[1] and tostring(args[1]):find("%d%d%d%d") and args[2] and tostring(args[2]):find("%d%d%d%d") then
        dYear, dMonth, dDay = parseDateString(args[1])
        bYear, bMonth, bDay = parseDateString(args[2])
    end

    -- Skenario 2: Menggunakan parameter terpisah (6 parameter: Wafat_Thn|Wafat_Bln|Wafat_Tgl|Lahir_Thn|Lahir_Bln|Lahir_Tgl)
    if not (dYear and bYear) then
        dYear = tonumber(args[1] or args.dyear)
        dMonth = tonumber(args[2] or args.dmonth)
        dDay = tonumber(args[3] or args.dday)
        
        bYear = tonumber(args[4] or args.byear)
        bMonth = tonumber(args[5] or args.bmonth)
        bDay = tonumber(args[6] or args.bday)
    end

    -- Validasi Tanggal
    if not dYear or not dMonth or not dDay or not bYear or not bMonth or not bDay or
       dMonth < 1 or dMonth > 12 or dDay < 1 or dDay > 31 or
       bMonth < 1 or bMonth > 12 or bDay < 1 or bDay > 31 then
        return '<span style="color:red; font-weight:bold;">[Format Tanggal Meninggal/Lahir Salah]</span>'
    end

    local age = calculateAgeAtDeath(bYear, bMonth, bDay, dYear, dMonth, dDay)
    
    -- Cek jika tanggal meninggal lebih awal dari tanggal lahir
    if age < 0 then
        return '<span style="color:red; font-weight:bold;">[Tanggal Meninggal Tidak Boleh Sebelum Tanggal Lahir]</span>'
    end

    local monthName = months[dMonth] or ""

    -- Format Output: "20 Mei 2020 (umur 50)"
    return string.format('%d %s %d&#160;<span class="force-break">(umur&#160;%d)</span>', dDay, monthName, dYear, age)
end

return p