/*
Insurance MIS — Salesforce Implementation (Option 1: Full Salesforce App)
This document contains:
1) Recommended Custom Object schema XML snippets (metadata outline)
2) Apex classes (service layer, REST endpoints, schedulable batch)
3) Example Triggers
4) Lightning Web Component (LWC) prototypes (JS + HTML)
5) Deployment & Security notes (Profiles, Permission Sets, Sharing)
6) Reporting & Dashboard guidance
-- IMPORTANT --
This is a developer-ready blueprint. Metadata XML files should be placed under force-app/main/default/objects for deployment via SFDX, and LWC under force-app/main/default/lwc.
*/
/* ===================================================
1) CUSTOM OBJECTS (metadata outline)
- Create one custom object per module. Below are sample fields (API names end with __c).
- Use Setup -> Object Manager or metadata XML to create these.
=================================================== */
/* Matured_Case__c.object (summary of fields)
- Label: Matured Case
- Plural Label: Matured Cases
- Fields:
* Policy_Number__c (Text, 50)
* EMP_ID_CSS__c (Text, 50)
* Date_of_Maturity__c (Date)
* Cases__c (Number, 0)
* Amount__c (Currency)
* Case_Status__c (Picklist): Outstanding, Paid, Writeback
* Outstanding_At_YearStart__c (Number)
* Outstanding_At_MonthStart__c (Number)
* Paid_During_Month__c (Number)
* Writeback_During_Month__c (Number)
* Closing_Outstanding__c (Formula/Number)
* Reason_Discharge_Voucher__c (Number)
* Reason_Policy_Doc__c (Number)
* Reason_Claimant_Not_Traceable__c (Number)
* Reason_Reassignment__c (Number)
* Reason_Record_Not_Available__c (Number)
* Reason_Under_Process__c (Number)
* Reason_Other__c (Number)
* Reason_Grand_Total__c (Formula SUM of reasons)
* Zone__c (Lookup: Zone__c)
* Region__c (Lookup: Region__c)
* CreatedByZoneUser__c (Checkbox)
*/
/* Death_Claim__c.object (outline)
- Fields pulled/integrated from DCMS
* DCMS_Claim_ID__c (Text)
* Policy_Number__c
* Deceased_Name__c
* Claim_Date__c
* Claim_Status__c (Picklist)
* Outstanding_Reason__c (Long Text)
* Linked_DCMS_Synced__c (Checkbox)
* Zone__c, Region__c
*/
/* Surrender_Case__c.object
- Fields: Policy_Number__c, Date_of_Surrender__c, Amount__c, Status__c, Zone__c, Region__c */
/* Suspense_Account__c.object
- Fields: Zone__c (Lookup), Opening_Balance__c (Currency), Credit__c (Currency), Debit__c (Currency), Closing_Balance__c (Formula: Opening+Credit-Debit), Month__c (Date), Year__c (Number)
*/
/* Loan_Case__c.object
- Fields: Policy_Number__c, Loan_Amount__c, Loan_Date__c, Recovery_Status__c (Picklist), Outstanding_Amount__c, Zone__c, Region__c
*/
/* Revival__c.object
- Fields: Policy_Number__c, Revival_Date__c, Status__c, Remarks__c, Zone__c, Region__c
*/
/* Reinstatement__c.object
- Fields: Policy_Number__c, Reinstatement_Date__c, Premium_Due__c, Status__c, Zone__c, Region__c
*/
/* Region__c and Zone__c simple master objects
- Region__c: Name, Region_Code__c
- Zone__c: Name, Zone_Code__c, Region__c (Master-Detail to Region)
*/
/* ===================================================
2) APEX: Service Layer & REST endpoints
- Core service class handles calculations and aggregation
- REST endpoint for external DCMS sync or for front-end React app
=================================================== */
// File: ApexClasses/MISService.cls
public with sharing class MISService {
// Calculate closing outstanding for a matured case record
public static Decimal calculateClosingOutstanding(Decimal opening, Decimal matured, Decimal paid, Decimal writeback){
if(opening == null) opening = 0;
if(matured == null) matured = 0;
if(paid == null) paid = 0;
if(writeback == null) writeback = 0;
return opening + matured - (paid + writeback);
}
// Aggregate outstanding by zone for a given month
public class ZoneOutstanding {
public Id zoneId;
public String zoneName;
public Integer cases;
public Decimal amount;
public ZoneOutstanding(Id zId, String zName){ zoneId = zId; zoneName = zName; cases=0; amount=0; }
}
public static List<ZoneOutstanding> aggregateOutstandingByZone(Date monthStart, Date monthEnd){
// Query matured cases with closing outstanding > 0
List<AggregateResult> agg = [
SELECT Zone__c z, SUM(Cases__c) sumCases, SUM(Amount__c) sumAmount
FROM Matured_Case__c
WHERE Date_of_Maturity__c <= :monthEnd AND Closing_Outstanding__c > 0
GROUP BY Zone__c
];
Map<Id, ZoneOutstanding> mapRes = new Map<Id, ZoneOutstanding>();
for(AggregateResult ar : agg){
Id zid = (Id) ar.get('z');
Integer c = ((Decimal) ar.get('sumCases')).intValue();
Decimal a = (Decimal) ar.get('sumAmount');
ZoneOutstanding zo = new ZoneOutstanding(zid, (String) '');
zo.cases = c; zo.amount = a;
mapRes.put(zid, zo);
}
return mapRes.values();
}
}
// File: ApexClasses/MISRestController.cls
@RestResource(urlMapping='/MIS/*')
global with sharing class MISRestController {
@HttpGet
global static void getOutstandingByZone(){
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
Date now = Date.today();
Date monthStart = now.toStartOfMonth();
Date monthEnd = monthStart.addMonths(1).addDays(-1);
List<MISService.ZoneOutstanding> result = MISService.aggregateOutstandingByZone(monthStart, monthEnd);
res.responseBody = Blob.valueOf(JSON.serialize(result));
res.statusCode = 200;
}
@HttpPost
global static void createMaturedCase(){
RestRequest req = RestContext.request;
String body = req.requestBody.toString();
Map<String, Object> payload = (Map<String, Object>) JSON.deserializeUntyped(body);
Matured_Case__c m = new Matured_Case__c();
m.Policy_Number__c = (String) payload.get('Policy_Number__c');
m.EMP_ID_CSS__c = (String) payload.get('EMP_ID_CSS__c');
m.Date_of_Maturity__c = Date.valueOf((String) payload.get('Date_of_Maturity__c'));
m.Cases__c = (Decimal) payload.get('Cases__c');
m.Amount__c = (Decimal) payload.get('Amount__c');
insert m;
RestContext.response.responseBody = Blob.valueOf(JSON.serialize(m));
RestContext.response.statusCode = 201;
}
}
/* ===================================================
3) TRIGGERS
- Example: trigger on Matured_Case__c to compute Closing_Outstanding__c and reason total
=================================================== */
// File: triggers/MaturedCaseTrigger.trigger
trigger MaturedCaseTrigger on Matured_Case__c (before insert, before update) {
if(Trigger.isBefore){
if(Trigger.isInsert || Trigger.isUpdate){
for(Matured_Case__c m : Trigger.new){
// Ensure null safety
m.Outstanding_At_YearStart__c = m.Outstanding_At_YearStart__c == null ? 0 : m.Outstanding_At_YearStart__c;
m.Outstanding_At_MonthStart__c = m.Outstanding_At_MonthStart__c == null ? 0 : m.Outstanding_At_MonthStart__c;
m.Paid_During_Month__c = m.Paid_During_Month__c == null ? 0 : m.Paid_During_Month__c;
m.Writeback_During_Month__c = m.Writeback_During_Month__c == null ? 0 : m.Writeback_During_Month__c;
// calculate closing
m.Closing_Outstanding__c = MISService.calculateClosingOutstanding(m.Outstanding_At_MonthStart__c, m.Cases__c, m.Paid_During_Month__c, m.Writeback_During_Month__c);
// reason grand total
Decimal reasonsSum = 0;
reasonsSum += (m.Reason_Discharge_Voucher__c == null ? 0 : m.Reason_Discharge_Voucher__c);
reasonsSum += (m.Reason_Policy_Doc__c == null ? 0 : m.Reason_Policy_Doc__c);
reasonsSum += (m.Reason_Claimant_Not_Traceable__c == null ? 0 : m.Reason_Claimant_Not_Traceable__c);
reasonsSum += (m.Reason_Reassignment__c == null ? 0 : m.Reason_Reassignment__c);
reasonsSum += (m.Reason_Record_Not_Available__c == null ? 0 : m.Reason_Record_Not_Available__c);
reasonsSum += (m.Reason_Under_Process__c == null ? 0 : m.Reason_Under_Process__c);
reasonsSum += (m.Reason_Other__c == null ? 0 : m.Reason_Other__c);
m.Reason_Grand_Total__c = reasonsSum;
}
}
}
}
/* ===================================================
4) Schedulable Batch to generate monthly reports (example)
=================================================== */
// File: ApexClasses/MonthlyReportBatch.cls
global class MonthlyReportBatch implements Database.Batchable<sObject>, Schedulable {
global Database.QueryLocator start(Database.BatchableContext bc){
Date now = Date.today();
Date monthEnd = now.toStartOfMonth().addDays(-1);
// Query matured cases for last month
String q = 'SELECT Id, Zone__c, Cases__c, Amount__c, Closing_Outstanding__c FROM Matured_Case__c WHERE Date_of_Maturity__c >= :Date.newInstance(monthEnd.year(), monthEnd.month(), 1) AND Date_of_Maturity__c <= :monthEnd';
return Database.getQueryLocator([SELECT Id, Zone__c, Cases__c, Amount__c, Closing_Outstanding__c FROM Matured_Case__c WHERE Date_of_Maturity__c >= :Date.newInstance(monthEnd.year(), monthEnd.month(), 1) AND Date_of_Maturity__c <= :monthEnd]);
}
global void execute(Database.BatchableContext bc, List<sObject> scope){
// transform and store report rows into a custom Report__c object or send email
List<Report_Row__c> rows = new List<Report_Row__c>();
for(sObject s : scope){
Matured_Case__c m = (Matured_Case__c) s;
rows.add(new Report_Row__c(Name = 'Matured-'+m.Id, Zone__c = m.Zone__c, Cases__c = m.Cases__c, Amount__c = m.Amount__c));
}
if(!rows.isEmpty()) insert rows;
}
global void finish(Database.BatchableContext bc){
// notify admins
}
global void execute(SchedulableContext sc){
Database.executeBatch(this, 200);
}
}
/* ===================================================
5) LWC Prototype (folder: force-app/main/default/lwc/misDashboard)
- misDashboard.html, misDashboard.js, misDashboard.js-meta.xml
=================================================== */
/* misDashboard.html
<template>
<lightning-card title="Insurance MIS — Dashboard">
<div class="slds-p-around_medium">
<lightning-combobox label="Level" value={level} options={levelOptions} onchange={handleLevelChange}></lightning-combobox>
<lightning-button label="Generate PDF" onclick={generatePdf}></lightning-button>
<div class="slds-m-top_medium">
<template if:true={zoneData}>
<c-mis-zone-summary data={zoneData}></c-mis-zone-summary>
</template>
</div>
</div>
</lightning-card>
</template>
*/
/* misDashboard.js
import { LightningElement, track } from 'lwc';
import getOutstandingByZone from '@salesforce/apex/MISRestController.getOutstandingByZone';
export default class MisDashboard extends LightningElement {
@track level = 'Principal';
levelOptions = [{label:'Principal', value:'Principal'},{label:'Regional', value:'Regional'},{label:'Zonal', value:'Zonal'}];
@track zoneData;
connectedCallback(){ this.loadZoneData(); }
loadZoneData(){
// call Apex REST or Apex class
}
handleLevelChange(e){ this.level = e.detail.value; }
generatePdf(){ /* use Lightning Reporting or export functionality */ }
}
*/
/* misDashboard.js-meta.xml
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://s...content-available-to-author-only...e.com/2006/04/metadata">
<apiVersion>58.0</apiVersion>
<isExposed>true</isExposed>
<targets>
<target>lightning__AppPage</target>
<target>lightning__RecordPage</target>
<target>lightning__HomePage</target>
</targets>
</LightningComponentBundle>
*/
/* ===================================================
6) SECURITY, SHARING & DEPLOYMENT NOTES
- Create Permission Sets for Principal, Regional, Zonal with object-level CRUD
- Sharing rules: Zone-level sharing (criteria-based using Zone__c)
- Profiles: Admin profile for Principal Office
- Data validation rules: ensure Reason_Grand_Total__c equals explicit outstanding counts when needed
- Use SFDX to deploy metadata, or use Change Sets for smaller teams
=================================================== */
/* ===================================================
7) REPORTS & DASHBOARDS
- Create standard Salesforce Reports grouped by Region, Zone, and Case Status
- Dashboard components:
* KPI tile: Total Outstanding Cases
* Bar chart: Outstanding by Zone
* Pie: Reasons breakdown (use report formula fields)
- Schedule the dashboard refresh monthly and email to Principal Office
=================================================== */
/* ===================================================
8) DATA MIGRATION & DCMS SYNC
- Create a middleware (Heroku/External service) to pull DCMS and push into Death_Claim__c via REST endpoint (/services/apexrest/MIS/)
- Use Bulk API for large historical data
=================================================== */
/* ===================================================
9) NEXT STEPS I CAN DELIVER (choose any):
- Full set of metadata XML files for each custom object and fields (ready for SFDX deploy)
- Full Apex test classes with 75%+ coverage for deployment
- Complete LWC components (Zone summary, Module forms) with Apex controllers
- Permission Set and Sharing rule XML templates
- Example data migration scripts (Apex + Data Loader CSV templates)
Tell me which of the above you want next and I will generate the files.
*/