summary hide and show
This commit is contained in:
parent
c9030d557e
commit
1ee02c793f
@ -19,12 +19,12 @@ if (project.hasProperty('google-services.json')) {
|
||||
|
||||
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
|
||||
if (flutterVersionCode == null) {
|
||||
flutterVersionCode = '69'
|
||||
flutterVersionCode = '70'
|
||||
}
|
||||
|
||||
def flutterVersionName = localProperties.getProperty('flutter.versionName')
|
||||
if (flutterVersionName == null) {
|
||||
flutterVersionName = '2.0.30'
|
||||
flutterVersionName = '2.0.31'
|
||||
}
|
||||
|
||||
def keystoreProperties = new Properties()
|
||||
|
||||
@ -104,7 +104,8 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
dynamic opdSiPremiumValue;
|
||||
dynamic opdSiPremiumGst;
|
||||
dynamic opdSiTotalAmt;
|
||||
bool opdIsPremiumSummary = false;
|
||||
/// 0 = hide, 1 = full summary, 2 = total only
|
||||
int opdIsPremiumSummary = 0;
|
||||
dynamic topUpSiParentPolicies = [];
|
||||
dynamic topUpParentClientPolicyId;
|
||||
dynamic topUpParentSlabRates;
|
||||
@ -118,7 +119,8 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
dynamic topUpParentSiPremiumValue;
|
||||
dynamic topUpParentSiPremiumGst;
|
||||
dynamic topUpParentSiTotalAmt;
|
||||
bool topUpParentIsPremiumSummary = false;
|
||||
/// 0 = hide, 1 = full summary, 2 = total only
|
||||
int topUpParentIsPremiumSummary = 0;
|
||||
dynamic topUpParentTypeName;
|
||||
int topUpParentOpenForEnrollment = 0;
|
||||
dynamic addOnsDependentPolicies = [];
|
||||
@ -130,7 +132,8 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
dynamic addOnsDependentPolicyName;
|
||||
dynamic addOnsDependentPolicyType;
|
||||
dynamic addOnsDependentECardDownload;
|
||||
bool addOnsDependentIsPremiumSummary = false;
|
||||
/// 0 = hide, 1 = full summary, 2 = total only
|
||||
int addOnsDependentIsPremiumSummary = 0;
|
||||
dynamic addOnsDependentRelationShip;
|
||||
int addOnsDependentOpenForEnrollment = 0;
|
||||
dynamic siValue;
|
||||
@ -142,7 +145,8 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
dynamic addOnsDependentTotalAmt;
|
||||
// dynamic topUpSiTotalAmt;
|
||||
dynamic topUpSiTotalAmt;
|
||||
bool topUpIsPremiumSummary = false;
|
||||
/// 0 = hide, 1 = full summary, 2 = total only
|
||||
int topUpIsPremiumSummary = 0;
|
||||
late TextEditingController _relationShipController;
|
||||
late TextEditingController _dobController;
|
||||
late TextEditingController _memberNameController;
|
||||
@ -259,25 +263,107 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
}
|
||||
|
||||
bool isPremiumEnabled(dynamic value) {
|
||||
if (value == null) return false;
|
||||
if (value is bool) return value;
|
||||
if (value is num) return value.toInt() != 0;
|
||||
final normalized = value.toString().trim().toLowerCase();
|
||||
if (normalized == 'true' || normalized == 'yes') return true;
|
||||
final intValue = int.tryParse(normalized) ?? 0;
|
||||
return intValue != 0;
|
||||
return parsePremiumSummaryMode(value) != 0;
|
||||
}
|
||||
|
||||
bool shouldShowPremiumSummary({
|
||||
required bool isPremiumSummary,
|
||||
dynamic premiumValue,
|
||||
dynamic gstValue,
|
||||
dynamic totalValue,
|
||||
/// 0 = hide premium summary, 1 = full summary, 2 = total only
|
||||
int parsePremiumSummaryMode(dynamic value) {
|
||||
if (value == null) return 0;
|
||||
if (value is bool) return value ? 1 : 0;
|
||||
if (value is num) return value.toInt();
|
||||
final normalized = value.toString().trim().toLowerCase();
|
||||
if (normalized == 'true' || normalized == 'yes') return 1;
|
||||
if (normalized == 'false' || normalized == 'no') return 0;
|
||||
return int.tryParse(normalized) ?? 0;
|
||||
}
|
||||
|
||||
bool shouldShowPremiumSummary(int mode) => mode == 1 || mode == 2;
|
||||
|
||||
bool shouldShowFullPremiumBreakdown(int mode) => mode == 1;
|
||||
|
||||
bool _policyListHasFullPremiumBreakdown(dynamic policies) {
|
||||
if (policies is! List) return false;
|
||||
for (final policy in policies) {
|
||||
if (policy is! Map) continue;
|
||||
if (shouldShowFullPremiumBreakdown(
|
||||
parsePremiumSummaryMode(policy['is_premium_summery']))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// True when any visible premium-summary row needs Additional Premium / GST columns.
|
||||
bool hasAnyFullPremiumBreakdown() {
|
||||
return _policyListHasFullPremiumBreakdown(gpaPolicies) ||
|
||||
_policyListHasFullPremiumBreakdown(gmcPolicies);
|
||||
}
|
||||
|
||||
Widget _premiumSummaryHeaderCell(
|
||||
BuildContext context,
|
||||
String label, {
|
||||
TextAlign textAlign = TextAlign.start,
|
||||
}) {
|
||||
return isPremiumSummary ||
|
||||
premiumValue != null ||
|
||||
gstValue != null ||
|
||||
totalValue != null;
|
||||
return TableCell(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8.0),
|
||||
child: SizedBox(
|
||||
width: double.infinity,
|
||||
child: Text(
|
||||
label,
|
||||
textAlign: textAlign,
|
||||
style: GoogleFonts.poppins(
|
||||
fontSize: Responsive.isDesktop(context) ? 16 : 13,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _premiumSummaryValueCell(
|
||||
BuildContext context,
|
||||
String value, {
|
||||
TextAlign textAlign = TextAlign.start,
|
||||
}) {
|
||||
return TableCell(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8.0),
|
||||
child: SizedBox(
|
||||
width: double.infinity,
|
||||
child: Text(
|
||||
value,
|
||||
textAlign: textAlign,
|
||||
style: GoogleFonts.poppins(
|
||||
fontSize: Responsive.isDesktop(context) ? 14 : 12,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
List<Widget> buildPremiumSummaryRowCells({
|
||||
required BuildContext context,
|
||||
required String policyLabel,
|
||||
required String premiumValue,
|
||||
required String gstValue,
|
||||
required String totalValue,
|
||||
required bool includeBreakdownColumns,
|
||||
required bool showBreakdownValues,
|
||||
}) {
|
||||
final totalAlign =
|
||||
includeBreakdownColumns ? TextAlign.start : TextAlign.end;
|
||||
return [
|
||||
_premiumSummaryValueCell(context, policyLabel),
|
||||
if (includeBreakdownColumns) ...[
|
||||
_premiumSummaryValueCell(
|
||||
context, showBreakdownValues ? premiumValue : ''),
|
||||
_premiumSummaryValueCell(context, showBreakdownValues ? gstValue : ''),
|
||||
],
|
||||
_premiumSummaryValueCell(context, totalValue, textAlign: totalAlign),
|
||||
];
|
||||
}
|
||||
|
||||
List<String> _extractUniqueSiValues(dynamic slabRates) {
|
||||
@ -598,7 +684,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
topUpSiTotalAmt = topUpSiPremiumValue + topUpSiPremiumGst;
|
||||
|
||||
setState(() {
|
||||
topUpIsPremiumSummary = isPremiumEnabled(topUpSiPolicies['gmc_si_topup']?['is_premium_summery']);
|
||||
topUpIsPremiumSummary = parsePremiumSummaryMode(topUpSiPolicies['gmc_si_topup']?['is_premium_summery']);
|
||||
});
|
||||
|
||||
|
||||
@ -688,7 +774,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
opdSiTotalAmt = opdSiPremiumValue + opdSiPremiumGst;
|
||||
|
||||
setState(() {
|
||||
opdIsPremiumSummary = isPremiumEnabled(opdPolicies['gmc_opd']?['is_premium_summery']);
|
||||
opdIsPremiumSummary = parsePremiumSummaryMode(opdPolicies['gmc_opd']?['is_premium_summery']);
|
||||
});
|
||||
|
||||
|
||||
@ -817,7 +903,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
topUpParentSiPremiumValue + topUpParentSiPremiumGst;
|
||||
|
||||
setState(() {
|
||||
topUpParentIsPremiumSummary = isPremiumEnabled(topUpSiParentPolicies['gmc_si_parent_topup']?['is_premium_summery']);
|
||||
topUpParentIsPremiumSummary = parsePremiumSummaryMode(topUpSiParentPolicies['gmc_si_parent_topup']?['is_premium_summery']);
|
||||
logDebug(topUpParentECardDownload);
|
||||
});
|
||||
|
||||
@ -938,7 +1024,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
['eCardDownload'];
|
||||
|
||||
setState(() {
|
||||
addOnsDependentIsPremiumSummary = isPremiumEnabled(addOnsDependentPolicies['gmc_dependent_addon']?['is_premium_summery']);
|
||||
addOnsDependentIsPremiumSummary = parsePremiumSummaryMode(addOnsDependentPolicies['gmc_dependent_addon']?['is_premium_summery']);
|
||||
});
|
||||
|
||||
logDebug('addOnsDependentIsPremiumSummery $addOnsDependentIsPremiumSummary');
|
||||
@ -1488,8 +1574,6 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
print('topUpSiPremiumGst $topUpSiPremiumGst');
|
||||
print('topUpSiTotalAmt $topUpSiTotalAmt');
|
||||
|
||||
topUpIsPremiumSummary = true;
|
||||
|
||||
// topUpSiTotalAmt = (topUpSum as double).toInt();
|
||||
});
|
||||
sendAddonsGmcSiToAPI();
|
||||
@ -1616,7 +1700,6 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
opdSiPremiumGst = opdGstSum.toInt();
|
||||
opdSiTotalAmt = opdSiPremiumValue + opdSiPremiumGst;
|
||||
print('opdSiPremiumValue $opdSiTotalAmt');
|
||||
opdIsPremiumSummary = true;
|
||||
});
|
||||
sendAddonsGmcOPDToAPI();
|
||||
}
|
||||
@ -2813,15 +2896,13 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
if (Responsive.isDesktop(context) &&
|
||||
_addOnsDependentSwitcher &&
|
||||
shouldShowPremiumSummary(
|
||||
isPremiumSummary: addOnsDependentIsPremiumSummary,
|
||||
premiumValue: addOnDependentPremiumValue,
|
||||
gstValue: addOnsDependentPremiumGst,
|
||||
totalValue: addOnsDependentTotalAmt,
|
||||
))
|
||||
addOnsDependentIsPremiumSummary))
|
||||
Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (shouldShowFullPremiumBreakdown(
|
||||
addOnsDependentIsPremiumSummary)) ...[
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -2900,6 +2981,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
),
|
||||
],
|
||||
))),
|
||||
],
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -2944,16 +3026,14 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
if (!Responsive.isDesktop(context) &&
|
||||
_addOnsDependentSwitcher == true &&
|
||||
shouldShowPremiumSummary(
|
||||
isPremiumSummary: addOnsDependentIsPremiumSummary,
|
||||
premiumValue: addOnDependentPremiumValue,
|
||||
gstValue: addOnsDependentPremiumGst,
|
||||
totalValue: addOnsDependentTotalAmt,
|
||||
))
|
||||
addOnsDependentIsPremiumSummary))
|
||||
Container(
|
||||
child: Column(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (shouldShowFullPremiumBreakdown(
|
||||
addOnsDependentIsPremiumSummary)) ...[
|
||||
Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
@ -3082,6 +3162,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
))),
|
||||
],
|
||||
),
|
||||
],
|
||||
Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
@ -3466,16 +3547,12 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
SizedBox(height: 20),
|
||||
if (Responsive.isDesktop(context) &&
|
||||
_topUpSiSwitcher == true &&
|
||||
shouldShowPremiumSummary(
|
||||
isPremiumSummary: topUpIsPremiumSummary,
|
||||
premiumValue: topUpSiPremiumValue,
|
||||
gstValue: topUpSiPremiumGst,
|
||||
totalValue: topUpSiTotalAmt,
|
||||
))
|
||||
shouldShowPremiumSummary(topUpIsPremiumSummary))
|
||||
Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (shouldShowFullPremiumBreakdown(topUpIsPremiumSummary)) ...[
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -3550,6 +3627,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
),
|
||||
],
|
||||
))),
|
||||
],
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -3591,17 +3669,13 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
),
|
||||
if (!Responsive.isDesktop(context) &&
|
||||
_topUpSiSwitcher == true &&
|
||||
shouldShowPremiumSummary(
|
||||
isPremiumSummary: topUpIsPremiumSummary,
|
||||
premiumValue: topUpSiPremiumValue,
|
||||
gstValue: topUpSiPremiumGst,
|
||||
totalValue: topUpSiTotalAmt,
|
||||
))
|
||||
shouldShowPremiumSummary(topUpIsPremiumSummary))
|
||||
Container(
|
||||
child: Column(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (shouldShowFullPremiumBreakdown(topUpIsPremiumSummary)) ...[
|
||||
Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
@ -3730,6 +3804,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
))),
|
||||
],
|
||||
),
|
||||
],
|
||||
Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
@ -4115,16 +4190,12 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
SizedBox(height: 20),
|
||||
if (Responsive.isDesktop(context) &&
|
||||
_opdSwitcher == true &&
|
||||
shouldShowPremiumSummary(
|
||||
isPremiumSummary: opdIsPremiumSummary,
|
||||
premiumValue: opdSiPremiumValue,
|
||||
gstValue: opdSiPremiumGst,
|
||||
totalValue: opdSiTotalAmt,
|
||||
))
|
||||
shouldShowPremiumSummary(opdIsPremiumSummary))
|
||||
Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (shouldShowFullPremiumBreakdown(opdIsPremiumSummary)) ...[
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -4199,6 +4270,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
),
|
||||
],
|
||||
))),
|
||||
],
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -4240,17 +4312,13 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
),
|
||||
if (!Responsive.isDesktop(context) &&
|
||||
_opdSwitcher == true &&
|
||||
shouldShowPremiumSummary(
|
||||
isPremiumSummary: opdIsPremiumSummary,
|
||||
premiumValue: opdSiPremiumValue,
|
||||
gstValue: opdSiPremiumGst,
|
||||
totalValue: opdSiTotalAmt,
|
||||
))
|
||||
shouldShowPremiumSummary(opdIsPremiumSummary))
|
||||
Container(
|
||||
child: Column(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (shouldShowFullPremiumBreakdown(opdIsPremiumSummary)) ...[
|
||||
Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
@ -4379,6 +4447,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
))),
|
||||
],
|
||||
),
|
||||
],
|
||||
Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
@ -4763,16 +4832,12 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
SizedBox(height: 20),
|
||||
if (Responsive.isDesktop(context) &&
|
||||
_topUpParentSiSwitcher == true &&
|
||||
shouldShowPremiumSummary(
|
||||
isPremiumSummary: topUpParentIsPremiumSummary,
|
||||
premiumValue: topUpParentSiPremiumValue,
|
||||
gstValue: topUpParentSiPremiumGst,
|
||||
totalValue: topUpParentSiTotalAmt,
|
||||
))
|
||||
shouldShowPremiumSummary(topUpParentIsPremiumSummary))
|
||||
Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (shouldShowFullPremiumBreakdown(topUpParentIsPremiumSummary)) ...[
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -4847,6 +4912,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
),
|
||||
],
|
||||
))),
|
||||
],
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -4888,17 +4954,13 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
),
|
||||
if (!Responsive.isDesktop(context) &&
|
||||
_topUpParentSiSwitcher == true &&
|
||||
shouldShowPremiumSummary(
|
||||
isPremiumSummary: topUpParentIsPremiumSummary,
|
||||
premiumValue: topUpParentSiPremiumValue,
|
||||
gstValue: topUpParentSiPremiumGst,
|
||||
totalValue: topUpParentSiTotalAmt,
|
||||
))
|
||||
shouldShowPremiumSummary(topUpParentIsPremiumSummary))
|
||||
Container(
|
||||
child: Column(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (shouldShowFullPremiumBreakdown(topUpParentIsPremiumSummary)) ...[
|
||||
Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
@ -5027,6 +5089,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
))),
|
||||
],
|
||||
),
|
||||
],
|
||||
Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
@ -5155,111 +5218,65 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
child: Container(
|
||||
alignment: Alignment
|
||||
.centerLeft, // Adjust padding as needed
|
||||
child: Table(
|
||||
columnWidths: {
|
||||
0: FlexColumnWidth(
|
||||
2), // Adjust column width as needed
|
||||
child: Builder(
|
||||
builder: (context) {
|
||||
final bool includeBreakdownColumns =
|
||||
hasAnyFullPremiumBreakdown();
|
||||
return Table(
|
||||
columnWidths: includeBreakdownColumns
|
||||
? {
|
||||
0: FlexColumnWidth(2),
|
||||
1: FlexColumnWidth(2),
|
||||
2: FlexColumnWidth(
|
||||
2), // Adjust column width as needed
|
||||
2: FlexColumnWidth(2),
|
||||
3: FlexColumnWidth(2),
|
||||
}
|
||||
: {
|
||||
0: FlexColumnWidth(3),
|
||||
1: FlexColumnWidth(1),
|
||||
},
|
||||
children: [
|
||||
TableRow(
|
||||
children: [
|
||||
TableCell(
|
||||
child: Padding(
|
||||
padding:
|
||||
EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
'Policy',
|
||||
textAlign:
|
||||
TextAlign.start,
|
||||
style: GoogleFonts.poppins(
|
||||
fontSize: Responsive
|
||||
.isDesktop(
|
||||
context)
|
||||
? 16
|
||||
: 13,
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.bold),
|
||||
),
|
||||
),
|
||||
),
|
||||
TableCell(
|
||||
child: Padding(
|
||||
padding:
|
||||
EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
'Additional Premium',
|
||||
textAlign:
|
||||
TextAlign.start,
|
||||
style: GoogleFonts.poppins(
|
||||
fontSize: Responsive
|
||||
.isDesktop(
|
||||
context)
|
||||
? 16
|
||||
: 13,
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.bold),
|
||||
),
|
||||
),
|
||||
),
|
||||
TableCell(
|
||||
child: Padding(
|
||||
padding:
|
||||
EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
'GST',
|
||||
textAlign:
|
||||
TextAlign.start,
|
||||
style: GoogleFonts.poppins(
|
||||
fontSize: Responsive
|
||||
.isDesktop(
|
||||
context)
|
||||
? 16
|
||||
: 13,
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.bold),
|
||||
),
|
||||
),
|
||||
),
|
||||
TableCell(
|
||||
child: Padding(
|
||||
padding:
|
||||
EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
_premiumSummaryHeaderCell(
|
||||
context, 'Policy'),
|
||||
if (includeBreakdownColumns) ...[
|
||||
_premiumSummaryHeaderCell(
|
||||
context,
|
||||
'Additional Premium'),
|
||||
_premiumSummaryHeaderCell(
|
||||
context, 'GST'),
|
||||
],
|
||||
_premiumSummaryHeaderCell(
|
||||
context,
|
||||
'Total',
|
||||
textAlign:
|
||||
TextAlign.start,
|
||||
style: GoogleFonts.poppins(
|
||||
fontSize: Responsive
|
||||
.isDesktop(
|
||||
context)
|
||||
? 16
|
||||
: 13,
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.bold),
|
||||
),
|
||||
),
|
||||
textAlign: includeBreakdownColumns
|
||||
? TextAlign.start
|
||||
: TextAlign.end,
|
||||
),
|
||||
],
|
||||
),
|
||||
if (gpaPolicies != null &&
|
||||
gpaPolicies.length > 0)
|
||||
...gpaBuildPolicyRows(
|
||||
gpaPolicies, context),
|
||||
gpaPolicies,
|
||||
context,
|
||||
includeBreakdownColumns:
|
||||
includeBreakdownColumns,
|
||||
),
|
||||
if (gmcPolicies != null &&
|
||||
gmcPolicies.length > 0)
|
||||
...gmcBuildPolicyRows(
|
||||
gmcPolicies, context),
|
||||
],
|
||||
gmcPolicies,
|
||||
context,
|
||||
includeBreakdownColumns:
|
||||
includeBreakdownColumns,
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
))
|
||||
],
|
||||
),
|
||||
),
|
||||
@ -6407,6 +6424,13 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
double gmcTotalableValue = gmcGstValue + gmcSiPremiumValue;
|
||||
|
||||
bool gmcIsValueValid = (gmcSiPremiumValue > 0 && gmcGstValue > 0);
|
||||
final int gmcPremiumSummaryMode =
|
||||
parsePremiumSummaryMode(item['is_premium_summery']);
|
||||
// 0 = hide, 1 = full summary, 2 = total only
|
||||
final bool showFullGmcPremiumSummary =
|
||||
gmcPremiumSummaryMode == 1 && gmcIsValueValid;
|
||||
final bool showGmcPremiumTotalOnly =
|
||||
gmcPremiumSummaryMode == 2 && gmcTotalableValue != 0;
|
||||
|
||||
List gmcMappedFamilyFloaters = item['mapped_family_floaters'] ?? [];
|
||||
|
||||
@ -6577,10 +6601,12 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
}).toList(),
|
||||
),
|
||||
),
|
||||
if (Responsive.isDesktop(context) && gmcIsValueValid)
|
||||
if (Responsive.isDesktop(context) &&
|
||||
(showFullGmcPremiumSummary || showGmcPremiumTotalOnly))
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (showFullGmcPremiumSummary) ...[
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -6633,6 +6659,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
),
|
||||
],
|
||||
))),
|
||||
],
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -6661,11 +6688,13 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
))),
|
||||
],
|
||||
),
|
||||
if (!Responsive.isDesktop(context) && gmcIsValueValid)
|
||||
if (!Responsive.isDesktop(context) &&
|
||||
(showFullGmcPremiumSummary || showGmcPremiumTotalOnly))
|
||||
Container(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (showFullGmcPremiumSummary) ...[
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
@ -6754,6 +6783,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
))),
|
||||
],
|
||||
),
|
||||
],
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
@ -6825,6 +6855,13 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
double gpaTotalableValue = gpaSiPremiumValue + gpaGstValue;
|
||||
|
||||
bool isValueValid = gpaSiPremiumValue != 0 && gpaGstValue != 0;
|
||||
final int premiumSummaryMode =
|
||||
parsePremiumSummaryMode(item['is_premium_summery']);
|
||||
// 0 = hide, 1 = full summary, 2 = total only
|
||||
final bool showFullPremiumSummary =
|
||||
premiumSummaryMode == 1 && isValueValid;
|
||||
final bool showPremiumTotalOnly =
|
||||
premiumSummaryMode == 2 && gpaTotalableValue != 0;
|
||||
|
||||
// -------------------------------
|
||||
// FIX: mapped_family_floaters is ALREADY a list
|
||||
@ -7011,10 +7048,12 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
Column(
|
||||
children: familyFloaterContainers,
|
||||
),
|
||||
if (Responsive.isDesktop(context) && isValueValid)
|
||||
if (Responsive.isDesktop(context) &&
|
||||
(showFullPremiumSummary || showPremiumTotalOnly))
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (showFullPremiumSummary) ...[
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -7065,6 +7104,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
),
|
||||
],
|
||||
))),
|
||||
],
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -7092,11 +7132,13 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
))),
|
||||
],
|
||||
),
|
||||
if (!Responsive.isDesktop(context) && isValueValid)
|
||||
if (!Responsive.isDesktop(context) &&
|
||||
(showFullPremiumSummary || showPremiumTotalOnly))
|
||||
Container(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (showFullPremiumSummary) ...[
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
@ -7181,6 +7223,7 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
))),
|
||||
],
|
||||
),
|
||||
],
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
@ -7237,7 +7280,10 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
|
||||
double calculateGpaTotalAmt(List<Map<String, dynamic>> policies) {
|
||||
double total = policies
|
||||
.where((policy) => policy is Map<String, dynamic>)
|
||||
.where((policy) =>
|
||||
policy is Map<String, dynamic> &&
|
||||
shouldShowPremiumSummary(
|
||||
parsePremiumSummaryMode(policy['is_premium_summery'])))
|
||||
.map((policy) =>
|
||||
(policy["si_gst_value"] ?? 0) + (policy["si_premium_value"] ?? 0))
|
||||
.fold(0.0, (sum, value) => sum + value);
|
||||
@ -7246,7 +7292,11 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
return total;
|
||||
}
|
||||
|
||||
List<TableRow> gpaBuildPolicyRows(dynamic policies, BuildContext context) {
|
||||
List<TableRow> gpaBuildPolicyRows(
|
||||
dynamic policies,
|
||||
BuildContext context, {
|
||||
bool includeBreakdownColumns = true,
|
||||
}) {
|
||||
if (policies is! List) {
|
||||
return []; // Return empty list if policies is not a list
|
||||
}
|
||||
@ -7259,59 +7309,36 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
.map((policy) {
|
||||
var siGstValue = policy["si_gst_value"] ?? 0;
|
||||
var siPremiumValue = policy["si_premium_value"] ?? 0;
|
||||
final int premiumMode =
|
||||
parsePremiumSummaryMode(policy['is_premium_summery']);
|
||||
final total = (siPremiumValue is num ? siPremiumValue.toDouble() : 0.0) +
|
||||
(siGstValue is num ? siGstValue.toDouble() : 0.0);
|
||||
|
||||
if (siGstValue == 0 || siPremiumValue == 0)
|
||||
return null; // Skip invalid policies
|
||||
// 0 = hide, 1 = full, 2 = total only
|
||||
if (premiumMode == 0) return null;
|
||||
if (premiumMode == 1 && (siGstValue == 0 || siPremiumValue == 0)) {
|
||||
return null;
|
||||
}
|
||||
if (premiumMode == 2 && total == 0) return null;
|
||||
|
||||
final bool showBreakdownValues =
|
||||
shouldShowFullPremiumBreakdown(premiumMode);
|
||||
final policyLabel = Responsive.isDesktop(context)
|
||||
? (policy["Policy_Name"] ?? 'Default Policy Name')
|
||||
: policy['type'];
|
||||
final totalValue =
|
||||
'₹${(policy["si_premium_value"] ?? 0) + (policy["si_gst_value"] ?? 0)}/-';
|
||||
|
||||
return TableRow(
|
||||
children: [
|
||||
TableCell(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
Responsive.isDesktop(context)
|
||||
? (policy["Policy_Name"] ?? 'Default Policy Name')
|
||||
: policy['type'],
|
||||
textAlign: TextAlign.start,
|
||||
style: GoogleFonts.poppins(
|
||||
fontSize: Responsive.isDesktop(context) ? 14 : 12),
|
||||
children: buildPremiumSummaryRowCells(
|
||||
context: context,
|
||||
policyLabel: policyLabel?.toString() ?? '',
|
||||
premiumValue: '₹${policy["si_premium_value"]}/Year',
|
||||
gstValue: '₹${policy["si_gst_value"]}/-',
|
||||
totalValue: totalValue,
|
||||
includeBreakdownColumns: includeBreakdownColumns,
|
||||
showBreakdownValues: showBreakdownValues,
|
||||
),
|
||||
),
|
||||
),
|
||||
TableCell(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
'₹${policy["si_premium_value"]}/Year',
|
||||
textAlign: TextAlign.start,
|
||||
style: GoogleFonts.poppins(
|
||||
fontSize: Responsive.isDesktop(context) ? 14 : 12),
|
||||
),
|
||||
),
|
||||
),
|
||||
TableCell(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
'₹${policy["si_gst_value"]}/-',
|
||||
textAlign: TextAlign.start,
|
||||
style: GoogleFonts.poppins(
|
||||
fontSize: Responsive.isDesktop(context) ? 14 : 12),
|
||||
),
|
||||
),
|
||||
),
|
||||
TableCell(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
'₹${(policy["si_premium_value"] ?? 0) + (policy["si_gst_value"] ?? 0)}/-',
|
||||
textAlign: TextAlign.start,
|
||||
style: GoogleFonts.poppins(
|
||||
fontSize: Responsive.isDesktop(context) ? 14 : 12),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
})
|
||||
.whereType<TableRow>() // Filter out null values
|
||||
@ -7320,7 +7347,10 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
|
||||
double calculateGmcTotalAmt(List<Map<String, dynamic>> policies) {
|
||||
double total = policies
|
||||
.where((policy) => policy is Map<String, dynamic>)
|
||||
.where((policy) =>
|
||||
policy is Map<String, dynamic> &&
|
||||
shouldShowPremiumSummary(
|
||||
parsePremiumSummaryMode(policy['is_premium_summery'])))
|
||||
.map((policy) =>
|
||||
(policy["family_floaters_of_dependent_and_gst_value"] ?? 0) +
|
||||
(policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0))
|
||||
@ -7330,7 +7360,11 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
return total;
|
||||
}
|
||||
|
||||
List<TableRow> gmcBuildPolicyRows(dynamic policies, BuildContext context) {
|
||||
List<TableRow> gmcBuildPolicyRows(
|
||||
dynamic policies,
|
||||
BuildContext context, {
|
||||
bool includeBreakdownColumns = true,
|
||||
}) {
|
||||
logDebug('gmcBuildPolicyRows $policies');
|
||||
|
||||
if (policies is! List) {
|
||||
@ -7347,59 +7381,38 @@ class _addOnsDetailsState extends State<addOnsDetails> {
|
||||
policy["family_floaters_of_dependent_and_gst_value"] ?? 0;
|
||||
var siPremiumValue =
|
||||
policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0;
|
||||
final int premiumMode =
|
||||
parsePremiumSummaryMode(policy['is_premium_summery']);
|
||||
final total = (siPremiumValue is num ? siPremiumValue.toDouble() : 0.0) +
|
||||
(siGstValue is num ? siGstValue.toDouble() : 0.0);
|
||||
|
||||
if (siGstValue == 0 || siPremiumValue == 0)
|
||||
return null; // Skip invalid policies
|
||||
// 0 = hide, 1 = full, 2 = total only
|
||||
if (premiumMode == 0) return null;
|
||||
if (premiumMode == 1 && (siGstValue == 0 || siPremiumValue == 0)) {
|
||||
return null;
|
||||
}
|
||||
if (premiumMode == 2 && total == 0) return null;
|
||||
|
||||
final bool showBreakdownValues =
|
||||
shouldShowFullPremiumBreakdown(premiumMode);
|
||||
final policyLabel = Responsive.isDesktop(context)
|
||||
? (policy["Policy_Name"] ?? 'Default Policy Name')
|
||||
: policy['type'];
|
||||
final totalValue =
|
||||
'₹${(policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0) + (policy["family_floaters_of_dependent_and_gst_value"] ?? 0)}/-';
|
||||
|
||||
return TableRow(
|
||||
children: [
|
||||
TableCell(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
Responsive.isDesktop(context)
|
||||
? (policy["Policy_Name"] ?? 'Default Policy Name')
|
||||
: policy['type'],
|
||||
textAlign: TextAlign.start,
|
||||
style: GoogleFonts.poppins(
|
||||
fontSize: Responsive.isDesktop(context) ? 14 : 12),
|
||||
),
|
||||
),
|
||||
),
|
||||
TableCell(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
children: buildPremiumSummaryRowCells(
|
||||
context: context,
|
||||
policyLabel: policyLabel?.toString() ?? '',
|
||||
premiumValue:
|
||||
'₹${policy["family_floaters_of_dependent_and_si_premium_value"]}/Year',
|
||||
textAlign: TextAlign.start,
|
||||
style: GoogleFonts.poppins(
|
||||
fontSize: Responsive.isDesktop(context) ? 14 : 12),
|
||||
),
|
||||
),
|
||||
),
|
||||
TableCell(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
gstValue:
|
||||
'₹${policy["family_floaters_of_dependent_and_gst_value"]}/-',
|
||||
textAlign: TextAlign.start,
|
||||
style: GoogleFonts.poppins(
|
||||
fontSize: Responsive.isDesktop(context) ? 14 : 12),
|
||||
totalValue: totalValue,
|
||||
includeBreakdownColumns: includeBreakdownColumns,
|
||||
showBreakdownValues: showBreakdownValues,
|
||||
),
|
||||
),
|
||||
),
|
||||
TableCell(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
'₹${(policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0) + (policy["family_floaters_of_dependent_and_gst_value"] ?? 0)}/-',
|
||||
textAlign: TextAlign.start,
|
||||
style: GoogleFonts.poppins(
|
||||
fontSize: Responsive.isDesktop(context) ? 14 : 12),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
})
|
||||
.whereType<TableRow>() // Filter out null values
|
||||
|
||||
@ -1930,6 +1930,13 @@ class _empDetailsState extends State<empDetails> {
|
||||
double gpaTotalableValue = gpaSiPremiumValue + gpaGstValue;
|
||||
|
||||
bool isValueValid = gpaSiPremiumValue != 0 && gpaGstValue != 0;
|
||||
final int premiumSummaryMode =
|
||||
parsePremiumSummaryMode(item['is_premium_summery']);
|
||||
// 0 = hide, 1 = full summary, 2 = total only
|
||||
final bool showFullPremiumSummary =
|
||||
premiumSummaryMode == 1 && isValueValid;
|
||||
final bool showPremiumTotalOnly =
|
||||
premiumSummaryMode == 2 && gpaTotalableValue != 0;
|
||||
|
||||
|
||||
List<dynamic> gpaMappedFamilyFloaters = [];
|
||||
@ -2179,10 +2186,12 @@ class _empDetailsState extends State<empDetails> {
|
||||
Column(
|
||||
children: familyFloaterContainers,
|
||||
),
|
||||
if (Responsive.isDesktop(context) && isValueValid)
|
||||
if (Responsive.isDesktop(context) &&
|
||||
(showFullPremiumSummary || showPremiumTotalOnly))
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (showFullPremiumSummary) ...[
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -2233,6 +2242,7 @@ class _empDetailsState extends State<empDetails> {
|
||||
),
|
||||
],
|
||||
))),
|
||||
],
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -2260,11 +2270,13 @@ class _empDetailsState extends State<empDetails> {
|
||||
))),
|
||||
],
|
||||
),
|
||||
if (!Responsive.isDesktop(context) && isValueValid)
|
||||
if (!Responsive.isDesktop(context) &&
|
||||
(showFullPremiumSummary || showPremiumTotalOnly))
|
||||
Container(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (showFullPremiumSummary) ...[
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
@ -2349,6 +2361,7 @@ class _empDetailsState extends State<empDetails> {
|
||||
))),
|
||||
],
|
||||
),
|
||||
],
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
@ -2409,6 +2422,17 @@ class _empDetailsState extends State<empDetails> {
|
||||
: value.toStringAsFixed(2);
|
||||
}
|
||||
|
||||
/// 0 = hide premium summary, 1 = full summary, 2 = total only
|
||||
int parsePremiumSummaryMode(dynamic value) {
|
||||
if (value == null) return 0;
|
||||
if (value is bool) return value ? 1 : 0;
|
||||
if (value is num) return value.toInt();
|
||||
final normalized = value.toString().trim().toLowerCase();
|
||||
if (normalized == 'true' || normalized == 'yes') return 1;
|
||||
if (normalized == 'false' || normalized == 'no') return 0;
|
||||
return int.tryParse(normalized) ?? 0;
|
||||
}
|
||||
|
||||
List<Widget> generateCards(List<dynamic> data) {
|
||||
List<Widget> cards = [];
|
||||
|
||||
@ -2444,6 +2468,13 @@ class _empDetailsState extends State<empDetails> {
|
||||
double gmcTotalableValue = gmcGstValue + gmcSiPremiumValue;
|
||||
|
||||
bool gmcIsValueValid = (gmcSiPremiumValue > 0 && gmcGstValue > 0);
|
||||
final int gmcPremiumSummaryMode =
|
||||
parsePremiumSummaryMode(item['is_premium_summery']);
|
||||
// 0 = hide, 1 = full summary, 2 = total only
|
||||
final bool showFullGmcPremiumSummary =
|
||||
gmcPremiumSummaryMode == 1 && gmcIsValueValid;
|
||||
final bool showGmcPremiumTotalOnly =
|
||||
gmcPremiumSummaryMode == 2 && gmcTotalableValue != 0;
|
||||
|
||||
|
||||
List gmcRelationShip = item['relationship'];
|
||||
@ -2954,10 +2985,12 @@ class _empDetailsState extends State<empDetails> {
|
||||
|
||||
],
|
||||
SizedBox(height: 15),
|
||||
if (Responsive.isDesktop(context) && gmcIsValueValid)
|
||||
if (Responsive.isDesktop(context) &&
|
||||
(showFullGmcPremiumSummary || showGmcPremiumTotalOnly))
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (showFullGmcPremiumSummary) ...[
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -3008,6 +3041,7 @@ class _empDetailsState extends State<empDetails> {
|
||||
),
|
||||
],
|
||||
))),
|
||||
],
|
||||
Expanded(
|
||||
flex: 5,
|
||||
child: Container(
|
||||
@ -3035,11 +3069,13 @@ class _empDetailsState extends State<empDetails> {
|
||||
))),
|
||||
],
|
||||
),
|
||||
if (!Responsive.isDesktop(context) && gmcIsValueValid)
|
||||
if (!Responsive.isDesktop(context) &&
|
||||
(showFullGmcPremiumSummary || showGmcPremiumTotalOnly))
|
||||
Container(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (showFullGmcPremiumSummary) ...[
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
@ -3128,6 +3164,7 @@ class _empDetailsState extends State<empDetails> {
|
||||
))),
|
||||
],
|
||||
),
|
||||
],
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -17,8 +17,8 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||
# In Windows, build-name is used as the major, minor, and patch parts
|
||||
# of the product and file versions while build-number is used as the build suffix.
|
||||
#version: 1.2.42+99
|
||||
version: 1.0.42+49
|
||||
#version: 2.0.30+69
|
||||
version: 1.0.43+50
|
||||
#version: 2.0.31+70
|
||||
|
||||
environment:
|
||||
sdk: '>=3.3.3 <4.0.0'
|
||||
|
||||
Loading…
Reference in New Issue
Block a user