Module:WADP Backend
This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected. |
Usage
Render organizations information
{{#invoke:WADP_Backend|render_org_infos_table}}
This loops through the organizational information Lua table and render onto WAD Portal Org Info.
Render affiliate reports
{{#invoke:WADP_Backend|render_arp_table}}
This loops through the affiliate reports Lua table and render onto WAD Portal Reports.
Render affiliate sandbox reports
{{#invoke:WADP_Backend|render_arp_sandbox_table}}
This loops through the affiliate sandbox reports Lua table and render onto WAD Portal Sandbox Reports.
Render derecognized affiliates
{{#invoke:WADP_Backend|render_derecognized_affiliates}}
{{#invoke:WADP_Backend|count_affiliates_in_derecognition}}
This loops through the derecognized affiliates Lua table and renders onto WAD Portal derecognized affiliates.
Count and render affiliates that are up to date reporting
{{#invoke:WADP_Backend|render_affiliates_up_to_date}}
{{#invoke:WADP_Backend|count_affiliates_up_to_date}}
This loops through the affiliates Lua table, counts and renders onto Affiliates Status Reports page.
Count and render affiliates that are not yet due for reporting
{{#invoke:WADP_Backend|render_affiliates_not_yet_due}}
{{#invoke:WADP_Backend|count_affiliates_not_yet_due}}
Count and render affiliates that are in suspension
{{#invoke:WADP_Backend|render_affiliates_in_suspension}}
{{#invoke:WADP_Backend|count_affiliates_in_suspension}}
Count and render affiliates that are in initial review OOC
{{#invoke:WADP_Backend|render_affiliates_in_initial_review}}
{{#invoke:WADP_Backend|count_affiliates_in_initial_review}}
Count and render affiliates that are in first notice OOC
{{#invoke:WADP_Backend|render_affiliates_in_first_notice}}
{{#invoke:WADP_Backend|count_affiliates_in_first_notice}}
Count and render affiliates that are in second notice OOC
{{#invoke:WADP_Backend|render_affiliates_in_second_notice}}
{{#invoke:WADP_Backend|count_affiliates_in_second_notice}}
Count and render affiliates that are in third notice OOC
{{#invoke:WADP_Backend|render_affiliates_in_third_notice}}
{{#invoke:WADP_Backend|count_affiliates_in_third_notice}}
Count and render affiliates that are in final notice OOC
{{#invoke:WADP_Backend|render_affiliates_in_final_notice}}
{{#invoke:WADP_Backend|count_affiliates_in_final_notice}}
Count and render number of affiliates in good standing
{{#invoke:WADP_Backend|count_affiliates_in_good_standing}}
This loops through the affiliates Lua table, counts and renders onto Affiliates Status Reports page.
Translation
The strings for this module are contained in Template:i18n/Reports.
-- Lua script to render user facing information on [[m:WADP]] & its sub-pages.
local p = {}
-- Constants: Note that, these constants are not used during if()
-- conditions, they're only used during assignment of a value to
-- a variable.
COMPLIANT_NOR_TEXT = "''Compliant''"
CROSS = 'Cross'
CROSS_NEW = 'Cross-N'
DERECONISED_STATUS = 'derecognised'
DERECONIZED_STATUS = 'derecognized'
DEFERRED_STATUS = 'deferred'
DEFER = "<span style='color: #ffc800'>''Deferred''</span>"
NEW_AFFILIATE_NOR_TEXT = "<span style='color: blue'>''New affiliate''</span>"
NON_COMPLIANT_NOR_TEXT = "<span style='color: red'>''Report past due''</span>"
NOT_APPLICABLE_TEXT = 'Not applicable'
NOT_REQUIRED = "''Not Required''"
TICK = 'Tick'
TICK_NEW = 'Tick-N'
-- [DB Storage]: Lua tables for Org Infos and Reports data.
activities_reports = require( 'Module:Activities_Reports' )
financial_reports = require( 'Module:Financial_Reports' )
grant_reports = require( 'Module:Grant_Reports' ) -- To be used in future.
org_infos = require( 'Module:Organizational_Informations' )
-- [DB Storage]: Lua tables for Sandbox Reports data **only** (for tests).
sandbox_activities_reports = require( 'Module:Activities_Reports/Sandbox' )
sandbox_financial_reports = require( 'Module:Financial_Reports/Sandbox' )
-- [Util]: Months number to name map (e.g. 1 -> January, 12 -> December).
months = {
'January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December',
}
-- [Util]: Months number to short name map (e.g. 1 -> Jan, 12 -> Dec).
short_months = {
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec',
}
-- [Util]: Helper modules related to translations and text direction.
is_rtl = require( 'Module:Is rtl' )
lang = mw.getCurrentFrame():preprocess( '{{int:lang}}' )
ModuleMsg = require( 'Module:ModuleMsg' )
msg = ModuleMsg:get_msgs( 'Template:I18n/Reports', lang )
function get_translation( entry )
-- Get WADP forms strings and their translations.
--
-- Usage:
-- entry: table containing the entries to translate
--
-- Return table: translated entry (with English as fallback)
if entry.unique_id == nil or lang == 'en' then
-- This system assumes that a unique id is assigned.
return entry
end
for k, v in pairs( entry ) do
if msg[k] ~= nil then
entry[k] = msg[k]
end
end
return entry
end
function get_directionality()
-- Should something be left-aligned or right-aligned?
if is_rtl[lang] == true then
return 'right'
end
return 'left'
end
function is_current_report( ts )
-- Check if the report year matches the current year
--
-- Usage:
-- ts: time stamp of the report
--
-- Return boolean: If report is current (true) or not (false)
local c_year, ts_year
c_year = os.date( '%Y' )
ts_year = mw.text.split( ts, '-' )[1]
if ts_year == c_year then
return true
end
return false
end
function format_date( old_date, format )
-- Format date to a format specified by `format`
-- e.g. YYYY-MM-DD, YYYY/MM/DD etc
--
-- Usage:
-- date: date submitted
-- format: format specified
--
-- Return string: In the format specified
local date_splitted, new_date
if format == 'YYYY-MM-DD' then
date_splitted = mw.text.split( old_date, '/' )
new_date = date_splitted[1] .. '-' .. date_splitted[2] .. '-' .. date_splitted[3]
elseif format == 'TS-TO-YYYY-MM-DD' then
new_date = string.sub( old_date, 1, 10 )
end
return new_date
end
function iter( ar, fr, gr )
-- Iterate over multiple Lua tables at the same time
--
-- Usage:
-- ar: Activities reports Lua table
-- fr: Financial reports Lua table
-- gr: Grant report Lua table
--
-- Return table: Entries at index i of the tables
local i = 0
return function()
i = i + 1
return ar[i], fr[i], gr[i]
end
end
function iter_absolute( reports )
-- Iterate over one lua table of reports
--
-- Usage:
-- reports: The reports to iterate over
--
-- Return table: entry at index i of the table
local i = 0
return function()
i = i + 1
return reports[i]
end
end
function add_days_to_date( reporting_date, days )
-- Add specific number of days to current date
--
-- Usage:
-- days: Number of days to add
--
-- Return date: with number of days added
local r_date, current_time, date
if reporting_date ~= nil then
r_date = mw.text.split( reporting_date, "/" );
current_time = os.time( { year=tonumber( r_date[3] ), month=tonumber( r_date[2] ), day=tonumber( r_date[1] ) } )
else
current_time = os.time()
end
current_time = current_time + days * 24 * 60 * 60
date = os.date("%d/%m/%Y", current_time)
return date
end
function get_affiliate_latest_reports( org_info, activities_reports, financial_reports, grant_reports )
-- Function to fetch the all latest reports for an affiliate available in
-- different report tables. In the case of multiple reports submitted
-- for the same day, month or year, this function will use the timestamp
-- to get the latest report.
--
-- Usage:
-- org_info: organizational information used for creating the relationship
-- activities_reports: activities reports Lua table.
-- financial_reports: financial reports Lua table.
-- grant_reports: grant reports Lua table.
--
--
-- Return table: entry for the latest activities_report, financial_report, grant report
local tmp_ar, tmp_fr, tmp_gr
tmp_ar = { dos_stamp = '1800-01-01:T00:00:00Z' }
tmp_fr = { dos_stamp = '1800-01-01T00:00:00Z' }
tmp_gr = { dos_stamp = '1800-01-01T00:00:00Z' }
for activities_report in iter_absolute( activities_reports ) do
if activities_report ~= nil and org_info.group_name == activities_report.group_name then
if activities_report.dos_stamp > tmp_ar.dos_stamp then
tmp_ar = activities_report
end
end
end
for financial_report in iter_absolute( financial_reports ) do
if financial_report ~= nil and org_info.group_name == financial_report.group_name then
if financial_report.dos_stamp > tmp_fr.dos_stamp then
tmp_fr = financial_report
end
end
end
for grant_report in iter_absolute( grant_reports ) do
if grant_report ~= nil and org_info.group_name == grant_report.group_name then
if grant_report.dos_stamp > tmp_gr.dos_stamp then
tmp_gr = grant_report
end
end
end
return tmp_ar, tmp_fr, tmp_gr
end
function get_affiliate_latest_report( org_info, reports )
-- Fetch latest reports from particular set of reports
--
-- Usage:
-- org_info: organizational information used for creating the relationship
-- reports: the set of reports to search from
--
--
-- Return table: entry for the latest report
local tmp
tmp = { dos_stamp = '1800-01-01:T00:00:00Z' }
for report in iter_absolute( reports ) do
if report ~= nil and org_info.group_name == report.group_name then
if report.dos_stamp > tmp.dos_stamp then
tmp = report
end
end
end
return tmp
end
function build_arp_template( frame, org_info, activities_report, financial_report, grant_report )
-- Build entries for the WADP Reports table template.
--
-- Usage:
-- frame: The frame object
-- org_info: Organization information
-- activities_report: Activities report for that organization in the current year
-- financial_report: Financial report for that organization in the current year
-- grant_report: Grant report for that organization for the current year
--
-- Return string: wikitext
local template_args = {}
local reporting_year, sd_month_number, ed_month_number, end_year, temp, end_year_sub
local translatable_report_link, fy_start_month, fy_end_month, agreement_date
local agreement_date_month, reporting_date, reporting_month, start_year, affiliate_record
org_info = get_translation( org_info )
if org_info.affiliate_code ~= nil then
template_args.affiliate_code = org_info.affiliate_code
end
if org_info.group_name ~= nil then
template_args.affiliate_name = '[[' .. org_info.group_name .. ']]'
end
if org_info.org_type ~= nil then
if org_info.org_type == 'User Group' then
template_args.org_type = 'WUG'
elseif org_info.org_type == 'Chapter' then
template_args.org_type = 'Chap'
elseif org_info.org_type == 'Thematic Organization' then
template_args.org_type = 'ThOrg'
elseif org_info.org_type == 'Allied or other organization' then
template_args.org_type = 'AOrg'
end
end
if org_info.legal_entity ~= nil and org_info.legal_entity == 'No' then
template_args.financial_report = NOT_REQUIRED
end
if activities_report.report_link ~= nil then
reporting_year = mw.text.split( activities_report.end_date, '/' )[3]
sd_month_number = tonumber( mw.text.split( activities_report.start_date, '/' )[2] )
ed_month_number = tonumber( mw.text.split( activities_report.end_date, '/' )[2] )
-- Compute AAR identifiers
end_year = tonumber( mw.text.split( activities_report.end_date, '/' )[3] )
if end_year ~= nil then
temp = end_year - 1 -- To be used to construct the year identifier
end_year_sub = mw.ustring.sub( tostring( end_year ), -2 )
end
-- Compose the translatable link for activity reports
if activities_report.report_link_en ~= nil then
translatable_report_link = '<sup>[' ..
activities_report.report_link_en .. ' [' .. activities_report.report_lang_code ..
']]</sup>'
elseif activities_report.report_lang_code ~= nil and activities_report.report_link_en == nil then
translatable_report_link = '(' .. activities_report.report_lang_code .. ')'
else
translatable_report_link = ' (en)'
end
if activities_report.report_type ~= nil and end_year_sub ~= nil then
if mw.ustring.find( activities_report.report_link, "https://" ) then
template_args.activities_report = '[' ..
activities_report.report_link .. ' ' .. temp .. '-'.. end_year_sub ..
'] ' .. translatable_report_link
-- TODO: When the link is in the [[link]] format, decide how to render it
-- with the aliased reporting year marker.
else
template_args.activities_report = '[[' ..
activities_report.report_link .. '|' .. temp .. '-'.. end_year_sub ..
']] ' .. translatable_report_link
end
if org_info.fiscal_year_end ~= nil and org_info.fiscal_year_end ~= '' then
-- Compute fiscal year based on the end of the FY
fy_start_month = tonumber( mw.text.split( org_info.fiscal_year_start, '/' )[2] )
fy_end_month = tonumber( mw.text.split( org_info.fiscal_year_end, '/' )[2] )
template_args.fiscal_year = short_months[fy_start_month] .. ' - ' .. short_months[fy_end_month]
elseif org_info.agreement_date ~= nil then
agreement_date_month = tonumber( mw.text.split( org_info.agreement_date, '/' )[2] )
if agreement_date_month - 1 < 1 then
template_args.fiscal_year = short_months[agreement_date_month] .. ' - ' .. short_months[agreement_date_month + 12 - 1]
else
template_args.fiscal_year = short_months[agreement_date_month] .. ' - ' .. short_months[agreement_date_month - 1]
end
end
end
-- [feat] Add reporting month
if org_info.fiscal_year_start ~= nil and org_info.fiscal_year_start ~= '' then
-- Attempt to compute reporting date from fiscal year in DB
-- NOTE: use current year which matches reporting month year
reporting_date = org_info.fiscal_year_start .. '/' .. os.date( "%Y" )
elseif org_info.agreement_date ~= nil then
-- break and reconstruct reporting date based on agreement date
-- NOTE: add 30 days if no fiscal year is specified.
agreement_date = mw.text.split( org_info.agreement_date, "/" )
reporting_date = agreement_date[1] .. '/' .. agreement_date[2] .. '/' .. os.date( "%Y" )
reporting_date = add_days_to_date( reporting_date, 30 )
end
if org_info.org_type == 'User Group' then
reporting_month = tonumber( mw.text.split( reporting_date, "/" )[2] )
template_args.reporting_month = short_months[reporting_month]
-- +120 days for Chapters and ThOrgs
elseif org_info.org_type == 'Chapter' or org_info.org_type == 'Thematic Organization' then
reporting_date = add_days_to_date( reporting_date, 120 )
reporting_month = tonumber( mw.text.split( reporting_date, "/" )[2] )
template_args.reporting_month = short_months[reporting_month]
end
end
if financial_report.report_link ~= nil then
-- Compose the translatable link for financial reports
if financial_report.report_link_en ~= nil then
translatable_report_link = '<sup>[' ..
financial_report.report_link_en .. ' [' .. financial_report.report_lang_code..
']]</sup>'
elseif financial_report.report_lang_code ~= nil
and financial_report.report_link_en == nil then
translatable_report_link = '(' .. financial_report.report_lang_code .. ')'
else
translatable_report_link = '(en)'
end
if financial_report.report_type == 'Annual Financial Report' then
-- Compute AAR & FR identifiers
end_year = tonumber( mw.text.split( financial_report.end_date, '/' )[3])
temp = end_year - 1 -- To be used to contruct the year identifier
end_year_sub = mw.ustring.sub( tostring( end_year ), -2 )
if mw.ustring.find( financial_report.report_link, "https://" ) then
template_args.financial_report = '[' ..
financial_report.report_link .. ' ' .. temp .. '-'.. end_year_sub ..
'] ' .. translatable_report_link
else
template_args.financial_report = '[[' ..
financial_report.report_link .. '|' .. temp .. '-'.. end_year_sub ..
']] ' .. translatable_report_link
end
elseif financial_report.report_type == 'Multi-year Financial Report' then
end_year = mw.text.split( financial_report.end_date, '/' )[3]
start_year = mw.text.split( financial_report.start_date, '/' )[3]
if mw.ustring.find( financial_report.report_link, "https://" ) then
template_args.financial_report = '[' ..
financial_report.report_link .. ' ' .. start_year .. '-'.. end_year ..
'] ' .. translatable_report_link
-- TODO: When the link is in the [[link]] format, decide how to render it
-- with the aliased reporting year marker.
else
template_args.financial_report = '[[' ..
financial_report.report_link .. '|' .. start_year .. '-'.. end_year ..
']] ' .. translatable_report_link
end
end
end
-- TODO: Logic to be revisited in Phase II
-- if grant_report.report_link ~= nil then
-- template_args.grant_report = '[' .. grant_report.report_link .. ' ' .. grant_report.report_type .. ']'
-- if is_current_report(grant_report.dos_stamp) then
-- template_args.uptodate_reporting = frame:expandTemplate{title = 'Tick'}
-- else
-- template_args.uptodate_reporting = frame:expandTemplate{title = 'Cross'}
-- end
--end
--if org_info.legal_entity ~= nil then
-- if ( is_current_report(financial_report.dos_stamp) and is_current_report(activities_report.dos_stamp) ) then
-- template_args.uptodate_reporting = frame:expandTemplate{title = 'Tick'}
-- elseif org_info.legal_entity == 'No' then
-- if is_current_report(activities_report.dos_stamp) then
-- template_args.uptodate_reporting = frame:expandTemplate{title = 'Tick'}
-- end
-- else
-- template_args.uptodate_reporting = frame:expandTemplate{title = 'Cross'}
-- end
--end
--if org_info.notes_on_reporting == '' then
-- template_args.notes_on_reporting = 'Awaiting M&E staff\'s remark...'
--else
-- template_args.notes_on_reporting = "'''''" .. org_info.notes_on_reporting .. "'''''"
--end
if org_info.org_type == 'Allied or other organization' then
template_args.uptodate_reporting = NOT_REQUIRED
template_args.notes_on_reporting = NOT_REQUIRED
end
-- M&E staff priority override
-- @note: We want to check this first as it takes precedence over
-- recognition_status and compliance_status
if org_info.recognition_status == DEFERRED_STATUS then
template_args.uptodate_reporting = '⚠️'
template_args.notes_on_reporting = DEFER
elseif org_info.uptodate_reporting == TICK then
template_args.uptodate_reporting = frame:expandTemplate{ title = TICK }
template_args.notes_on_reporting = COMPLIANT_NOR_TEXT
elseif org_info.uptodate_reporting == CROSS and org_info.notes_on_reporting ~= '' then
template_args.uptodate_reporting = frame:expandTemplate{ title = CROSS }
template_args.notes_on_reporting = "<span style='color: red'>''" .. org_info.notes_on_reporting .. "''</span>"
elseif org_info.uptodate_reporting == CROSS then
template_args.uptodate_reporting = frame:expandTemplate{ title = CROSS }
template_args.notes_on_reporting = NON_COMPLIANT_NOR_TEXT
end
affiliate_record = frame:expandTemplate{
title = 'Reports record s1',
args = template_args
}
return affiliate_record
end
function build_org_infos_template( frame, entry )
-- Build entries for the organizational information template.
--
-- Usage:
-- frame: The frame object
-- entry: An org infos entry with relevant data
--
-- Return string: wikitext
local social_media = ''
local type, entrycontent
local template_args = {}
entry = get_translation(entry)
if entry.org_type == 'User Group' then
type = 'UG'
elseif entry.org_type == 'Chapter' then
type = 'Chap'
elseif entry.org_type == 'Thematic Organization' then
type = 'ThOrg'
else
type = 'AO'
end
if entry.unique_id ~= nil then
template_args.unique_id = entry.unique_id
end
if entry.affiliate_code ~= nil then
template_args.affiliate_code = entry.affiliate_code
end
if entry.group_name ~= nil then
if entry.me_bypass_ooc_autochecks == "Yes" then
template_args.name = '[[' .. entry.group_name .. "]] ('''" .. type .. "''') <sup>bp</sup>"
else
template_args.name = '[[' .. entry.group_name .. "]] ('''" .. type .. "''')"
end
end
if entry.other ~= nil then
template_args.blog_or_news = '[' .. entry.other .. ' ' .. entry.affiliate_code .. "'s news 🔗]"
end
if entry.agreement_date ~= nil then
if entry.org_type == 'Allied or other organization' then
template_args.agreement_date = NOT_APPLICABLE_TEXT
else
template_args.agreement_date = entry.agreement_date
end
end
if entry.twitter ~= nil then
social_media = social_media .. '[[File:Twitter_Logo.png|26px|link=' .. entry.twitter .. ']]'
end
if entry.facebook ~= nil then
social_media = social_media .. ' [[File:Facebook_icon_192.png |26px|link=' .. entry.facebook .. ']]'
end
template_args.social_media = social_media
if entry.reporting_due_date ~= nil then
template_args.reporting_due_date = format_date(
entry.reporting_due_date, 'TS-TO-YYYY-MM-DD'
)
end
if entry.dos_stamp ~= nil then
template_args.last_updated_on = format_date( entry.dos_stamp, 'YYYY-MM-DD' )
end
entrycontent = frame:expandTemplate{
title = 'Reports record s2',
args = template_args
}
return entrycontent
end
function build_derecog_template( frame, entry )
-- Build entries for derecognized affiliates template.
--
-- Usage:
-- frame: The frame object
-- entry: An org infos entry with relevant data
--
-- Return string: wikitext
local template_args = { type = entry.org_type, }
local latest_ar, latest_fr, latest_gr, reporting_year, end_year, temp, end_year_sub
local entrycontent
entry = get_translation( entry )
if entry.affiliate_code ~= nil then
template_args.affiliate_code = entry.affiliate_code
end
if entry.group_name ~= nil then
template_args.name = '[[' .. entry.group_name .. ']]'
end
for _, activities_report in ipairs( activities_reports ) do
if ( entry.group_name == activities_report.group_name ) then
-- Let's keep this logic if we intend to show other reports in the future
latest_ar, latest_fr, latest_gr = get_affiliate_latest_reports(
entry, activities_reports, financial_reports, grant_reports
)
if ( latest_ar ~= nil ) then
reporting_year = mw.text.split( latest_ar.end_date, '/' )[3]
-- Compute AAR identifiers
end_year = tonumber( mw.text.split( latest_ar.end_date, '/' )[3] )
temp = end_year - 1 -- To be used to construct the year identifier
end_year_sub = mw.ustring.sub( tostring( end_year ), -2 )
template_args.activities_report = '[' .. latest_ar.report_link .. ' ' .. temp .. '-'.. end_year_sub .. ']'
end
break
end
end
if entry.agreement_date ~= nil then
template_args.agreement_date = entry.agreement_date
end
if entry.derecognition_date ~= nil then
template_args.derecognition_date = entry.derecognition_date
end
if entry.derecognition_note ~= nil then
template_args.derecognition_status = entry.derecognition_note
end
entrycontent = frame:expandTemplate{
title = 'Reports derecognized affiliates',
args = template_args
}
return entrycontent
end
function p.render_arp_table( frame )
-- Function to render the affiliates Report table
-- using the 'Reports record s2' template.
--
-- Usage:
-- frame: The frame object
--
-- Return string: wikitext
local reports = ''
local template_args = {}
local latest_ar, latest_fr, affiliate_record
for _, org_info in ipairs( org_infos ) do
-- TODO: Decide whether to hide the reports for derecognized groups as well.
for activities_report, financial_report, grant_report in iter(
activities_reports, financial_reports, grant_reports
) do
if activities_report == nil then
activities_report = {}
end
if financial_report == nil then
financial_report = {}
end
if grant_report == nil then
grant_report = {}
end
-- Do not render reports for affiliates that have been derecognised.
if org_info.recognition_status == 'derecognised' then
break
end
-- Special Cases: M&E Staff override for new affiliates: "Tick-N"
-- and "Cross-N"
if org_info.uptodate_reporting == 'Tick-N' then
template_args.affiliate_code = org_info.affiliate_code
template_args.affiliate_name = '[[' .. org_info.group_name .. ']]'
if org_info.org_type ~= nil then
if org_info.org_type == 'User Group' then
template_args.org_type = 'WUG'
template_args.reporting_month = '-'
elseif org_info.org_type == 'Chapter' then
template_args.org_type = 'Chap'
template_args.reporting_month = '-'
elseif org_info.org_type == 'Thematic Organization' then
template_args.org_type = 'ThOrg'
template_args.reporting_month = '-'
end
end
latest_ar = get_affiliate_latest_report( org_info, activities_reports )
if latest_ar.report_link_en ~= nil then
if mw.ustring.find( latest_ar.report_link_en, "https://" ) then
template_args.activities_report = '[' .. latest_ar.report_link_en .. ' ' .. 'Pending report (en)]'
else
template_args.activities_report = '[[' .. latest_ar.report_link_en .. '|' .. 'Pending report (en)]]'
end
elseif latest_ar.report_link ~= nil then
if mw.ustring.find( latest_ar.report_link, "https://" ) then
template_args.activities_report = '[' .. latest_ar.report_link .. ' ' .. 'Pending report]'
else
template_args.activities_report = '[[' .. latest_ar.report_link .. '|' .. 'Pending report]]'
end
else
template_args.activities_report = '-'
end
latest_fr = get_affiliate_latest_report( org_info, financial_reports )
if latest_fr.report_link_en ~= nil then
if mw.ustring.find( latest_fr.report_link_en, "https://" ) then
template_args.financial_report = '[' .. latest_fr.report_link_en .. ' ' .. 'Pending report (en)]'
else
template_args.financial_report = '[[' .. latest_fr.report_link_en .. '|' .. 'Pending report (en)]]'
end
elseif latest_fr.report_link ~= nil then
if mw.ustring.find( latest_fr.report_link, "https://" ) then
template_args.financial_report = '[' .. latest_fr.report_link .. ' ' .. 'Pending report]'
else
template_args.financial_report = '[[' .. latest_fr.report_link .. '|' .. 'Pending report]]'
end
elseif org_info.legal_entity ~= nil and org_info.legal_entity == 'No' then
template_args.financial_report = NOT_REQUIRED
else
template_args.financial_report = '-'
end
template_args.fiscal_year = '-'
template_args.uptodate_reporting = frame:expandTemplate{ title = TICK }
template_args.notes_on_reporting = NEW_AFFILIATE_NOR_TEXT
affiliate_record = frame:expandTemplate{
title = 'Reports record s1',
args = template_args
}
reports = reports .. "\n" .. affiliate_record
break
elseif org_info.uptodate_reporting == CROSS_NEW then
template_args.affiliate_code = org_info.affiliate_code
template_args.affiliate_name = '[[' .. org_info.group_name .. ']]'
if org_info.org_type ~= nil then
if org_info.org_type == 'User Group' then
template_args.org_type = 'WUG'
template_args.reporting_month = '-'
elseif org_info.org_type == 'Chapter' then
template_args.org_type = 'Chap'
template_args.reporting_month = '-'
elseif org_info.org_type == 'Thematic Organization' then
template_args.org_type = 'ThOrg'
template_args.reporting_month = '-'
end
end
latest_ar = get_affiliate_latest_report( org_info, activities_reports )
if latest_ar.report_link_en ~= nil then
if mw.ustring.find( latest_ar.report_link_en, "https://" ) then
template_args.activities_report = '[' .. latest_ar.report_link_en .. ' ' .. 'Pending report (en)]'
else
template_args.activities_report = '[[' .. latest_ar.report_link_en .. '|' .. 'Pending report (en)]]'
end
elseif latest_ar.report_link ~= nil then
if mw.ustring.find( latest_ar.report_link, "https://" ) then
template_args.activities_report = '[' .. latest_ar.report_link .. ' ' .. 'Pending report]'
else
template_args.activities_report = '[[' .. latest_ar.report_link .. '|' .. 'Pending report]]'
end
else
template_args.activities_report = '-'
end
latest_fr = get_affiliate_latest_report( org_info, financial_reports )
if latest_fr.report_link_en ~= nil then
if mw.ustring.find( latest_fr.report_link_en, "https://" ) then
template_args.financial_report = '[' .. latest_fr.report_link_en .. ' ' .. 'Pending report (en)]'
else
template_args.financial_report = '[[' .. latest_fr.report_link_en .. '|' .. 'Pending report (en)]]'
end
elseif latest_fr.report_link ~= nil then
if mw.ustring.find( latest_fr.report_link, "https://" ) then
template_args.financial_report = '[' .. latest_fr.report_link .. ' ' .. 'Pending report]'
else
template_args.financial_report = '[[' .. latest_fr.report_link .. '|' .. 'Pending report]]'
end
elseif org_info.legal_entity ~= nil and org_info.legal_entity == 'No' then
template_args.financial_report = NOT_REQUIRED
else
template_args.financial_report = '-'
end
template_args.fiscal_year = '-'
template_args.uptodate_reporting = frame:expandTemplate{ title = CROSS }
template_args.notes_on_reporting = NON_COMPLIANT_NOR_TEXT
affiliate_record = frame:expandTemplate{
title = 'Reports record s1',
args = template_args
}
reports = reports .. "\n" .. affiliate_record
break
-- End of special case
elseif (
org_info.group_name == grant_report.group_name
or org_info.group_name == activities_report.group_name
or org_info.group_name == financial_report.group_name
) then
latest_ar, latest_fr, latest_gr = get_affiliate_latest_reports(
org_info, activities_reports, financial_reports, grant_reports
)
reports = reports .. "\n" .. build_arp_template( frame, org_info, latest_ar, latest_fr, latest_gr )
break
end
end
end
return reports
end
-- Sandbox Reports code section
function p.render_arp_sandbox_table( frame )
-- Function to render the SAR (Sandbox Affiliates Reports) table
-- using the 'Reports record s2' template.
--
-- Usage:
-- frame: The frame object
--
-- Return string: wikitext
local reports = ''
local template_args = {}
local latest_sb_ar, latest_sb_fr, affiliate_record
for _, org_info in ipairs( org_infos ) do
-- TODO: Decide whether to hide the reports for derecognized groups as well.
for sandbox_activities_report,
sandbox_financial_report,
-- no-op for grant report
grant_report in iter( sandbox_activities_reports, sandbox_financial_reports, grant_reports ) do
if sandbox_activities_report == nil then
sandbox_activities_report = {}
end
if sandbox_financial_report == nil then
sandbox_financial_report = {}
end
if grant_report == nil then
grant_report = {}
end
-- Special Cases: M&E Staff override for new affiliates: "Tick-N"
-- and "Cross-N"
if org_info.uptodate_reporting == TICK_NEW then
if org_info.affiliate_code ~= nil then
template_args.affiliate_code = org_info.affiliate_code
end
template_args.affiliate_name = '[[' .. org_info.group_name .. ']]'
if org_info.org_type ~= nil then
if org_info.org_type == 'User Group' then
template_args.org_type = 'WUG'
template_args.reporting_month = '-'
elseif org_info.org_type == 'Chapter' then
template_args.org_type = 'Chap'
template_args.reporting_month = '-'
elseif org_info.org_type == 'Thematic Organization' then
template_args.org_type = 'ThOrg'
template_args.reporting_month = '-'
end
end
latest_sb_ar = get_affiliate_latest_report( org_info, sandbox_activities_reports )
if latest_sb_ar.report_link_en ~= nil then
if mw.ustring.find( latest_sb_ar.report_link_en, "https://" ) then
template_args.activities_report = '[' .. latest_sb_ar.report_link_en .. ' ' .. 'Pending report (en)]'
else
template_args.activities_report = '[[' .. latest_sb_ar.report_link_en .. '|' .. 'Pending report (en)]]'
end
elseif latest_sb_ar.report_link ~= nil then
if mw.ustring.find( latest_sb_ar.report_link, "https://" ) then
template_args.activities_report = '[' .. latest_sb_ar.report_link .. ' ' .. 'Pending report]'
else
template_args.activities_report = '[[' .. latest_sb_ar.report_link .. '|' .. 'Pending report]]'
end
else
template_args.activities_report = '-'
end
latest_sb_fr = get_affiliate_latest_report( org_info, sandbox_financial_reports )
if latest_sb_fr.report_link_en ~= nil then
if mw.ustring.find( latest_sb_fr.report_link_en, "https://" ) then
template_args.financial_report = '[' .. latest_sb_fr.report_link_en .. ' ' .. 'Pending report (en)]'
else
template_args.financial_report = '[[' .. latest_sb_fr.report_link_en .. '|' .. 'Pending report (en)]]'
end
elseif latest_sb_fr.report_link ~= nil then
if mw.ustring.find( latest_sb_fr.report_link, "https://" ) then
template_args.financial_report = '[' .. latest_sb_fr.report_link .. ' ' .. 'Pending report]'
else
template_args.financial_report = '[[' .. latest_sb_fr.report_link .. '|' .. 'Pending report]]'
end
template_args.financial_report = '[' .. latest_sb_fr.report_link .. ' ' .. 'Pending report]'
elseif org_info.legal_entity ~= nil and org_info.legal_entity == 'No' then
template_args.financial_report = NOT_REQUIRED
else
template_args.financial_report = '-'
end
template_args.fiscal_year = '-'
template_args.uptodate_reporting = frame:expandTemplate{ title = TICK }
template_args.notes_on_reporting = NEW_AFFILIATE_NOR_TEXT
affiliate_record = frame:expandTemplate{
title = 'Reports record s1',
args = template_args
}
reports = reports .. "\n" .. affiliate_record
break
elseif org_info.uptodate_reporting == 'Cross-N' then
if org_info.affiliate_code ~= nil then
template_args.affiliate_code = org_info.affiliate_code
end
template_args.affiliate_name = '[[' .. org_info.group_name .. ']]'
if org_info.org_type ~= nil then
if org_info.org_type == 'User Group' then
template_args.org_type = 'WUG'
template_args.reporting_month = '-'
elseif org_info.org_type == 'Chapter' then
template_args.org_type = 'Chap'
template_args.reporting_month = '-'
elseif org_info.org_type == 'Thematic Organization' then
template_args.org_type = 'ThOrg'
template_args.reporting_month = '-'
end
end
latest_sb_ar = get_affiliate_latest_report( org_info, sandbox_activities_reports )
if latest_sb_ar.report_link_en ~= nil then
if mw.ustring.find( latest_sb_ar.report_link_en, "https://" ) then
template_args.activities_report = '[' .. latest_sb_ar.report_link_en .. ' ' .. 'Pending report (en)]'
else
template_args.activities_report = '[[' .. latest_sb_ar.report_link_en .. '|' .. 'Pending report (en)]]'
end
elseif latest_sb_ar.report_link ~= nil then
if mw.ustring.find( latest_sb_ar.report_link, "https://" ) then
template_args.activities_report = '[' .. latest_sb_ar.report_link .. ' ' .. 'Pending report]'
else
template_args.activities_report = '[[' .. latest_sb_ar.report_link .. '|' .. 'Pending report]]'
end
else
template_args.activities_report = '-'
end
latest_sb_fr = get_affiliate_latest_report( org_info, sandbox_financial_reports )
if latest_sb_fr.report_link_en ~= nil then
if mw.ustring.find( latest_sb_fr.report_link_en, "https://" ) then
template_args.financial_report = '[' .. latest_sb_fr.report_link_en .. ' ' .. 'Pending report (en)]'
else
template_args.financial_report = '[[' .. latest_sb_fr.report_link_en .. '|' .. 'Pending report (en)]]'
end
elseif latest_sb_fr.report_link ~= nil then
if mw.ustring.find( latest_sb_fr.report_link, "https://" ) then
template_args.financial_report = '[' .. latest_sb_fr.report_link .. ' ' .. 'Pending report]'
else
template_args.financial_report = '[[' .. latest_sb_fr.report_link .. '|' .. 'Pending report]]'
end
elseif org_info.legal_entity ~= nil and org_info.legal_entity == 'No' then
template_args.financial_report = NOT_REQUIRED
else
template_args.financial_report = '-'
end
template_args.fiscal_year = '-'
template_args.uptodate_reporting = frame:expandTemplate{ title = CROSS }
template_args.notes_on_reporting = NEW_AFFILIATE_NOR_TEXT
affiliate_record = frame:expandTemplate{
title = 'Reports record s1',
args = template_args
}
reports = reports .. "\n" .. affiliate_record
break
-- End of special case
elseif (
org_info.group_name == grant_report.group_name
or org_info.group_name == sandbox_activities_report.group_name
or org_info.group_name == sandbox_financial_report.group_name
) then
latest_sb_ar, latest_sb_fr, latest_gr = get_affiliate_latest_reports(
org_info, sandbox_activities_reports, sandbox_financial_reports, grant_reports
)
reports = reports .. "\n" .. build_arp_template( frame, org_info, latest_sb_ar, latest_sb_fr, latest_gr )
break
end
end
end
return reports
end
function p.render_org_infos_table( frame )
-- Function for rendering or displaying organizational
-- information table using the 'Reports record s2' template.
--
-- Usage:
-- frame: The frame object
--
-- Return string: wikitext
local orgInfoTable = ''
for _, org_info in ipairs( org_infos ) do
if org_info.recognition_status == DERECONIZED_STATUS or org_info.recognition_status == DERECONISED_STATUS then
-- Ignore!
else
orgInfoTable = orgInfoTable .. "\n" .. build_org_infos_template( frame, org_info )
end
end
return orgInfoTable
end
function p.render_derecognized_affiliates( frame )
-- Function for rendering or displaying derecognized affiliates.
--
-- Usage:
-- frame: The frame object
--
-- Return string: wikitext
local derecogTable = ''
for _, org_info in ipairs( org_infos ) do
if org_info.recognition_status == DERECONIZED_STATUS or org_info.recognition_status == DERECONISED_STATUS then
derecogTable = derecogTable .. "\n" .. build_derecog_template( frame, org_info )
end
end
return derecogTable
end
function p.render_affiliates_up_to_date()
-- Function for displaying affiliates up to date reporting
--
-- Return string: wikitext
local affiliates_uptodate = ''
for _, org_info in ipairs( org_infos ) do
if org_info.uptodate_reporting == TICK and org_info.recognition_status == 'recognised' then
affiliates_uptodate = affiliates_uptodate .. "* [[" .. org_info.group_name .. "]]\n\n"
end
end
return affiliates_uptodate
end
function p.count_affiliates_uptodate()
-- Function for count and display affiliates up to date reporting
--
-- Return integer: number of affiliates up to date
local affiliates_uptodate = 0
for _, org_info in ipairs( org_infos ) do
if org_info.uptodate_reporting == TICK and org_info.recognition_status == 'recognised' then
affiliates_uptodate = affiliates_uptodate + 1
end
end
return affiliates_uptodate
end
function p.render_affiliates_not_yet_due()
-- Function for displaying affiliates up to date reporting
--
-- Return string: wikitext
local affiliates_not_yet_due = ''
for _, org_info in ipairs( org_infos ) do
if org_info.uptodate_reporting == TICK_NEW and org_info.recognition_status == 'recognised' then
affiliates_not_yet_due = affiliates_not_yet_due .. "* [[" .. org_info.group_name .. "]]\n\n"
end
end
return affiliates_not_yet_due
end
function p.count_affiliates_not_yet_due()
-- Function for count and display affiliates not yet due reporting
--
-- Return integer: number of affiliates not yet due
local affiliates_not_yet_due = 0
for _, org_info in ipairs( org_infos ) do
if org_info.uptodate_reporting == TICK_NEW and org_info.recognition_status == 'recognised' then
affiliates_not_yet_due = affiliates_not_yet_due + 1
end
end
return affiliates_not_yet_due
end
function p.count_affiliates_in_good_standing()
-- Function for counting affiliates in good standing
--
-- Return integer: number of affiliates in good standing
local affiliates_in_good_standing = 0
for _, org_info in ipairs( org_infos ) do
if ( org_info.uptodate_reporting == TICK or org_info.uptodate_reporting == TICK_NEW ) and org_info.recognition_status == 'recognised' then
affiliates_in_good_standing = affiliates_in_good_standing + 1
end
end
return affiliates_in_good_standing
end
function p.count_affiliates_out_of_compliance()
-- Function for counting affiliates that are out of compliance
--
-- Return integer: number of affiliates out of compliance
local affiliates_out_of_compliance = 0
for _, org_info in ipairs( org_infos ) do
if ( org_info.uptodate_reporting == CROSS or org_info.uptodate_reporting == CROSS_NEW ) and org_info.recognition_status == 'recognised' then
affiliates_out_of_compliance = affiliates_out_of_compliance + 1
end
end
return affiliates_out_of_compliance
end
function p.count_affiliates_in_derecognition()
-- Function for counting affiliates in a derecognized state
--
-- Return integer: number of affiliates in a derecognized state
local affiliates_in_derecognition = 0
for _, org_info in ipairs( org_infos ) do
if org_info.recognition_status == 'derecognised' then
affiliates_in_derecognition = affiliates_in_derecognition + 1
end
end
return affiliates_in_derecognition
end
function p.render_affiliates_in_suspension()
-- Function for displaying affiliates that have been suspended
--
-- Return string: wikitext
local affiliates_in_suspension = ''
for _, org_info in ipairs( org_infos ) do
if org_info.recognition_status == 'suspended' then
affiliates_in_suspension = affiliates_in_suspension .. "* [[" .. org_info.group_name .. "]]\n\n"
end
end
if affiliates_in_suspension == '' then
affiliates_in_suspension = "''No affiliates are in suspension at the moment.''"
end
return affiliates_in_suspension
end
function p.count_affiliates_in_suspension()
-- Function for counting affiliates in a suspension state
--
-- Return integer: number of affiliates in a suspension state
local affiliates_in_suspension = 0
for _, org_info in ipairs( org_infos ) do
if org_info.recognition_status == 'suspended' then
affiliates_in_suspension = affiliates_in_suspension + 1
end
end
return affiliates_in_suspension
end
function p.render_affiliates_in_initial_review()
-- Function for displaying affiliates out of compliance in initial review
--
-- Return string: wikitext
local affiliates_in_review = ''
for _, org_info in ipairs( org_infos ) do
if ( org_info.uptodate_reporting == CROSS or
org_info.uptodate_reporting == CROSS_NEW ) and
org_info.out_of_compliance_level == '2' and
org_info.recognition_status == 'recognised'
then
affiliates_in_review = affiliates_in_review .. "* [[" .. org_info.group_name .. "]]\n\n"
end
end
if affiliates_in_review == '' then
affiliates_in_review = "''No affiliates are in review at the moment.''"
end
return affiliates_in_review
end
function p.count_affiliates_in_initial_review()
-- Function for counting affiliates out of compliance in initial review
--
-- Return integer: number of affiliates in review
local affiliates_in_review = 0
for _, org_info in ipairs( org_infos ) do
if ( org_info.uptodate_reporting == CROSS or
org_info.uptodate_reporting == CROSS_NEW ) and
org_info.out_of_compliance_level == '2' and
org_info.recognition_status == 'recognised'
then
affiliates_in_review = affiliates_in_review + 1
end
end
return affiliates_in_review
end
function p.render_affiliates_in_first_notice()
-- Function for displaying affiliates out of compliance in first notice
--
-- Return string: wikitext
local affiliates_in_first_notice = ''
for _, org_info in ipairs( org_infos ) do
if ( org_info.uptodate_reporting == CROSS or
org_info.uptodate_reporting == CROSS_NEW ) and
org_info.out_of_compliance_level == '3' and
org_info.recognition_status == 'recognised'
then
affiliates_in_first_notice = affiliates_in_first_notice .. "* [[" .. org_info.group_name .. "]]\n\n"
end
end
if affiliates_in_first_notice == '' then
affiliates_in_first_notice = "''No affiliates are in first notice at the moment.''"
end
return affiliates_in_first_notice
end
function p.count_affiliates_in_first_notice()
-- Function for counting affiliates out of compliance in first notice
--
-- Return integer: number of affiliates in first notice of OOC
local affiliates_in_first_notice = 0
for _, org_info in ipairs( org_infos ) do
if ( org_info.uptodate_reporting == CROSS or
org_info.uptodate_reporting == CROSS_NEW ) and
org_info.out_of_compliance_level == '3' and
org_info.recognition_status == 'recognised'
then
affiliates_in_first_notice = affiliates_in_first_notice + 1
end
end
return affiliates_in_first_notice
end
function p.render_affiliates_in_second_notice()
-- Function for displaying affiliates out of compliance in second notice
--
-- Return string: wikitext
local affiliates_in_second_notice = ''
for _, org_info in ipairs( org_infos ) do
if ( org_info.uptodate_reporting == CROSS or
org_info.uptodate_reporting == CROSS_NEW ) and
org_info.out_of_compliance_level == '4' and
org_info.recognition_status == 'recognised'
then
affiliates_in_second_notice = affiliates_in_second_notice .. "* [[" .. org_info.group_name .. "]]\n\n"
end
end
if affiliates_in_second_notice == '' then
affiliates_in_second_notice = "''No affiliates are in second notice at the moment.''"
end
return affiliates_in_second_notice
end
function p.count_affiliates_in_second_notice()
-- Function for counting affiliates out of compliance in second notice
--
-- Return integer: number of affiliates in second notice of OOC
local affiliates_in_second_notice = 0
for _, org_info in ipairs( org_infos ) do
if ( org_info.uptodate_reporting == CROSS or
org_info.uptodate_reporting == CROSS_NEW ) and
org_info.out_of_compliance_level == '4' and
org_info.recognition_status == 'recognised'
then
affiliates_in_second_notice = affiliates_in_second_notice + 1
end
end
return affiliates_in_second_notice
end
function p.render_affiliates_in_third_notice()
-- Function for displaying affiliates out of compliance in third notice
--
-- Return string: wikitext
local affiliates_in_third_notice = ''
for _, org_info in ipairs( org_infos ) do
if ( org_info.uptodate_reporting == CROSS or
org_info.uptodate_reporting == CROSS_NEW ) and
org_info.out_of_compliance_level == '5' and
org_info.recognition_status == 'recognised'
then
affiliates_in_third_notice = affiliates_in_third_notice .. "* [[" .. org_info.group_name .. "]]\n\n"
end
end
if affiliates_in_third_notice == '' then
affiliates_in_third_notice = "''No affiliates are in third notice at the moment.''"
end
return affiliates_in_third_notice
end
function p.count_affiliates_in_third_notice()
-- Function for counting affiliates out of compliance in third notice
--
-- Return integer: number of affiliates in third notice of OOC
local affiliates_in_third_notice_count = 0
for _, org_info in ipairs( org_infos ) do
if ( org_info.uptodate_reporting == CROSS or
org_info.uptodate_reporting == CROSS_NEW ) and
org_info.out_of_compliance_level == '5' and
org_info.recognition_status == 'recognised'
then
affiliates_in_third_notice_count = affiliates_in_third_notice_count + 1
end
end
return affiliates_in_third_notice_count
end
function p.render_affiliates_in_final_notice()
-- Function for displaying affiliates out of compliance in final notice
--
-- Return string: wikitext
local affiliates_in_final_notice = ''
for _, org_info in ipairs( org_infos ) do
if ( org_info.uptodate_reporting == CROSS or
org_info.uptodate_reporting == CROSS_NEW ) and
org_info.out_of_compliance_level == '6' and
org_info.recognition_status == 'recognised'
then
affiliates_in_final_notice = affiliates_in_final_notice .. "* [[" .. org_info.group_name .. "]]\n\n"
end
end
if affiliates_in_final_notice == '' then
affiliates_in_final_notice = "''No affiliates are in final notice at the moment.''"
end
return affiliates_in_final_notice
end
function p.count_affiliates_in_final_notice()
-- Function for counting affiliates out of compliance in final notice
--
-- Return integer: number of affiliates in final notice of OOC
local affiliates_in_final_notice_count = 0
for _, org_info in ipairs( org_infos ) do
if ( org_info.uptodate_reporting == CROSS or
org_info.uptodate_reporting == CROSS_NEW ) and
org_info.out_of_compliance_level == '6' and
org_info.recognition_status == 'recognised'
then
affiliates_in_final_notice_count = affiliates_in_final_notice_count + 1
end
end
return affiliates_in_final_notice_count
end
return p