Devs,

 

I have noted that the reports showing Portfolio at Risk % are not really
reporting the right PAR but Arrears Rate.

 

There is a difference between the two:

 

PAR is how much does the MFI stand to lose if all delinquent clients
completely default and thus its calculated by taking sum of all unpaid
balance for loan with past due repayments divided by total outstanding
balance.

 

Arrears rate determine what percentage of the portfolio is overdue and this
is simple principal overdue divided by principal outstanding (what the
reports are currently reporting as PAR now).

 

I would like to add "Loan Balance in Arrears" in the below code, could
someone please guide me on how I can do that?

 

select concat(repeat("..",

((LENGTH(mo.`hierarchy`) - LENGTH(REPLACE(mo.`hierarchy`, '.', '')) - 1))),
mo.`name`) as "Office/Branch", x.currency as Currency,

x.client_count as "No. of Clients", x.active_loan_count as "No. Active
Loans", x. loans_in_arrears_count as "No. of Loans in Arrears",

x.principal as "Total Loans Disbursed", x.principal_repaid as "Principal
Repaid", x.principal_outstanding as "Principal Outstanding",
x.principal_overdue as "Principal Overdue",

x.interest as "Total Interest", x.interest_repaid as "Interest Repaid",
x.interest_outstanding as "Interest Outstanding", x.interest_overdue as
"Interest Overdue",

x.fees as "Total Fees", x.fees_repaid as "Fees Repaid", x.fees_outstanding
as "Fees Outstanding", x.fees_overdue as "Fees Overdue",

x.penalties as "Total Penalties", x.penalties_repaid as "Penalties Repaid",
x.penalties_outstanding as "Penalties Outstanding", x.penalties_overdue as
"Penalties Overdue",

 

(case

when ${parType} = 1 then

cast(round((x.principal_overdue * 100) / x.principal_outstanding, 2) as
char)

when ${parType} = 2 then

cast(round(((x.principal_overdue + x.interest_overdue) * 100) /
(x.principal_outstanding + x.interest_outstanding), 2) as char)

when ${parType} = 3 then

cast(round(((x.principal_overdue + x.interest_overdue + x.fees_overdue) *
100) / (x.principal_outstanding + x.interest_outstanding +
x.fees_outstanding), 2) as char)

when ${parType} = 4 then

cast(round(((x.principal_overdue + x.interest_overdue + x.fees_overdue +
x.penalties_overdue) * 100) / (x.principal_outstanding +
x.interest_outstanding + x.fees_outstanding + x.penalties_overdue), 2) as
char)

else "invalid PAR Type"

end) as "Portfolio at Risk %"

from m_office mo

join

(select ounder.id as branch,

ifnull(cur.display_symbol, l.currency_code) as currency,

count(distinct(c.id)) as client_count,

count(distinct(l.id)) as  active_loan_count,

count(distinct(if(laa.loan_id is not null,  l.id, null)  )) as
loans_in_arrears_count,

 

sum(l.principal_disbursed_derived) as principal,

sum(l.principal_repaid_derived) as principal_repaid,

sum(l.principal_outstanding_derived) as principal_outstanding,

sum(laa.principal_overdue_derived) as principal_overdue,

 

sum(l.interest_charged_derived) as interest,

sum(l.interest_repaid_derived) as interest_repaid,

sum(l.interest_outstanding_derived) as interest_outstanding,

sum(laa.interest_overdue_derived) as interest_overdue,

 

sum(l.fee_charges_charged_derived) as fees,

sum(l.fee_charges_repaid_derived) as fees_repaid,

sum(l.fee_charges_outstanding_derived)  as fees_outstanding,

sum(laa.fee_charges_overdue_derived) as fees_overdue,

 

sum(l.penalty_charges_charged_derived) as penalties,

sum(l.penalty_charges_repaid_derived) as penalties_repaid,

sum(l.penalty_charges_outstanding_derived) as penalties_outstanding,

sum(laa.penalty_charges_overdue_derived) as penalties_overdue

 

from m_office o

join m_office ounder on ounder.hierarchy like concat(o.hierarchy, '%')

and ounder.hierarchy like concat('${currentUserHierarchy}', '%')

join m_client c on c.office_id = ounder.id

join m_loan l on l.client_id = c.id

left join m_loan_arrears_aging laa on laa.loan_id = l.id

left join m_currency cur on cur.code = l.currency_code

 

where o.id = ${officeId}

and (l.currency_code = "${currencyId}" or "-1" = "${currencyId}")

and (l.product_id = "${loanProductId}" or "-1" = "${loanProductId}")

and (ifnull(l.loan_officer_id, -10) = "${loanOfficerId}" or "-1" =
"${loanOfficerId}")

and (ifnull(l.fund_id, -10) = ${fundId} or -1 = ${fundId})

and (ifnull(l.loanpurpose_cv_id, -10) = ${loanPurposeId} or -1 =
${loanPurposeId})

and l.loan_status_id = 300

group by ounder.id, l.currency_code) x on x.branch = mo.id

order by mo.hierarchy, x.Currency

 

 

Thanks & Regards;

 

 

*******

Zayyad A. Said | Chairman & C.E.O

 

Cell No.: +254 716 615274 | Skype: zsaid2011

Email:  <mailto:zay...@intrasofttechnologies.com>
zay...@intrasofttechnologies.com 

 



 

Reply via email to