Policy - Primary Indicators Module
https://openimis.atlassian.net/browse/OMT-333
The Policy/New Policy and Insuree/New Insuree figures are always identical and refer to insurees, not policies and insurees as one would expect.
This report is based on the uspSSRSPrimaryIndicators1 stored procedure. It will separately runs queries for each month in the given range from sub-procedures that are all very similar. They are run in two modes that only differ by adding the Officer to grouping. The modular version is using the same queries, just adding the grouping where applicable.
Total policies:
AND PL."PolicyStatus" > 1
AND PL.EffectiveDate <= %(LastDay)s
AND PL.ExpiryDate > %(LastDay)s
join with new policies:
Pol-Fam-Vil-War-Dist-Reg-Ins
where policy status > 1 (IDLE)
and policy_Stage = 'N' (so not renewals)
and enrollment date is @year-@month (so enrolled during that month while the total above is all policies active during that month)
mode 2 adds Officer, LastName, OtherNames of course
join with suspended policies:
where policy ValidityFrom is @year-@month
and policy status = 4 (SUSPENDED)
join with expired policies:
where policy status > 1 (IDLE)
and policy Expiry Date is @year-@month
join with udfPolicyRenewal
PolicyStatus > 1
PL.PolicyStage = 'R'
enrollment date is @year-@month
join with udfPolicyInsuree same as Total Policies ?
Pol-Prod-Fam-Ins-Loc
PolicyStatus > 1
EffectiveDate <= LastDay
ExpiryDate > LastDay
join with udfNewPolicyInsuree same as new policies ?
PolicyStatus > 1 (IDLE)
Policy_Stage = 'N' (so not renewals)
EnrollmentDate is @year-@month (so enrolled during that month while the total above is all policies active during that month)
join with udfNewlyPremiumCollected
left join Premium
sum(prem.amount)
where paydate is @year-@month
join with udfAvailablePremium
inner join Premium ?
PolicyStatus <> 1
PR."PayDate" <= PL."ExpiryDate"
group by PL."ProdID", PL."ExpiryDate", PR."PayDate",PL."EffectiveDate"
gros case => group by ProdId
Then the data is joined with a complex condition to dispatch the premiums depending on the date within the month. The original:
CASE
WHEN MONTH(DATEADD_DAY(-1,PL."ExpiryDate")) = theMonth AND YEAR(DATEADD_DAY(-1,PL."ExpiryDate")) = theYear AND (DAY(PL."ExpiryDate")) > 1
THEN CASE WHEN DATEDIFF_DAY(CASE WHEN PR."PayDate" < theDate THEN theDate ELSE PR."PayDate" END,PL."ExpiryDate") = 0 THEN 1 ELSE DATEDIFF_DAY(CASE WHEN PR."PayDate" < theDate THEN theDate ELSE PR."PayDate" END,PL."ExpiryDate") END * ((SUM(PR."Amount"))/(CASE WHEN (DATEDIFF_DAY(CASE WHEN PR."PayDate" < PL."EffectiveDate" THEN PL."EffectiveDate" ELSE PR."PayDate" END,PL."ExpiryDate")) <= 0 THEN 1 ELSE DATEDIFF_DAY(CASE WHEN PR."PayDate" < PL."EffectiveDate" THEN PL."EffectiveDate" ELSE PR."PayDate" END,PL."ExpiryDate") END))
WHEN MONTH(CASE WHEN PR."PayDate" < PL."EffectiveDate" THEN PL."EffectiveDate" ELSE PR."PayDate" END) = theMonth AND YEAR(CASE WHEN PR."PayDate" < PL."EffectiveDate" THEN PL."EffectiveDate" ELSE PR."PayDate" END) = theYear
THEN ((DaysInMonth + 1 - DAY(CASE WHEN PR."PayDate" < PL."EffectiveDate" THEN PL."EffectiveDate" ELSE PR."PayDate" END)) * ((SUM(PR."Amount"))/CASE WHEN DATEDIFF_DAY(CASE WHEN PR."PayDate" < PL."EffectiveDate" THEN PL."EffectiveDate" ELSE PR."PayDate" END,PL."ExpiryDate") <= 0 THEN 1 ELSE DATEDIFF_DAY(CASE WHEN PR."PayDate" < PL."EffectiveDate" THEN PL."EffectiveDate" ELSE PR."PayDate" END,PL."ExpiryDate") END))
WHEN PL."EffectiveDate" < theDate AND PL."ExpiryDate" > EndDate AND PR."PayDate" < theDate
THEN DaysInMonth * (SUM(PR."Amount")/CASE WHEN (DATEDIFF_DAY(CASE WHEN PR."PayDate" < PL."EffectiveDate" THEN PL."EffectiveDate" ELSE PR."PayDate" END,DATEADD_DAY(-1,PL."ExpiryDate"))) <= 0 THEN 1 ELSE DATEDIFF_DAY(CASE WHEN PR."PayDate" < PL."EffectiveDate" THEN PL."EffectiveDate" ELSE PR."PayDate" END,PL."ExpiryDate") END)
END Allocated
Was rewritten as:
CASE
WHEN MONTH(DATEADD_DAY(-1,PL."ExpiryDate")) = theMonth AND YEAR(DATEADD_DAY(-1,PL."ExpiryDate")) = theYear AND (DAY(PL."ExpiryDate")) > 1
THEN GREATEST(1, DATEDIFF_DAY(GREATEST(PR."PayDate", theDate),PL."ExpiryDate"))
* ((SUM(PR."Amount"))
/GREATEST(1, DATEDIFF_DAY(GREATEST(PR."PayDate", PL."EffectiveDate"),PL."ExpiryDate")))
WHEN MONTH(GREATEST(PR."PayDate", PL."EffectiveDate")) = theMonth AND YEAR(GREATEST(PR."PayDate", PL."EffectiveDate")) = theYear
THEN ((DaysInMonth + 1 - DAY(GREATEST(PR."PayDate", PL."EffectiveDate")))
* (SUM(PR."Amount")
/GREATEST(1, DATEDIFF_DAY(GREATEST(PR."PayDate", PL."EffectiveDate"),PL."ExpiryDate"))))
WHEN PL."EffectiveDate" < theDate AND PL."ExpiryDate" > EndDate AND PR."PayDate" < theDate
THEN DaysInMonth
* (SUM(PR."Amount")
/GREATEST(1, DATEDIFF_DAY(GREATEST(PR."PayDate", PL."EffectiveDate"),DATEADD_DAY(-1,PL."ExpiryDate"))))
END Allocated
Did you encounter a problem or do you have a suggestion?
Please contact our Service Desk
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. https://creativecommons.org/licenses/by-sa/4.0/