passo_mobile_app/lib/screens/offline/passo/building/add/AddExtraItemsOffline.dart

782 lines
41 KiB
Dart

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:form_builder_validators/form_builder_validators.dart';
import 'package:intl/intl.dart';
import 'package:searchfield/searchfield.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:unit2/bloc/offline/offline_passo/admin/class_components_admin.dart/class_components_admin_bloc.dart';
import 'package:unit2/bloc/offline/offline_passo/admin/unit_construction/unit_construction_admin_bloc.dart';
import 'package:unit2/bloc/offline/offline_passo/building/additional_items_offline/additional_items_offline_bloc.dart';
import 'package:unit2/model/offline/offline_profile.dart';
import 'package:unit2/model/passo/additional_items.dart';
import 'package:unit2/model/passo/class_components%20_offline.dart';
import 'package:unit2/model/passo/class_components.dart';
import 'package:unit2/model/passo/unit_construct.dart';
import 'package:unit2/theme-data.dart/form-style.dart';
import 'package:unit2/utils/text_container.dart';
import 'package:unit2/widgets/error_state.dart';
// Function to get stored building type
Future<UnitConstruct> getStoredBldgType() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String? jsonString = prefs.getString('selected_bldg_type');
if (jsonString != null) {
Map<String, dynamic> json = jsonDecode(jsonString);
return UnitConstruct.fromJson(json);
}
// Return a default UnitConstruct if no data is found
return UnitConstruct.defaultConstruct();
}
class AddExtraItemsOffline extends StatefulWidget {
final OfflineProfile offlineProfile;
AddExtraItemsOffline(this.offlineProfile);
@override
_AddExtraItemsOffline createState() => _AddExtraItemsOffline();
}
class _AddExtraItemsOffline extends State<AddExtraItemsOffline> {
GlobalKey<FormBuilderState> formKey = GlobalKey<FormBuilderState>();
final focus = FocusNode();
final focusAddItems = FocusNode();
bool isPainted = false;
bool isSecondHand = false;
TextEditingController textEditingController = TextEditingController();
double _unitBase = 0;
double _areaValue = 0;
final double _depValue = 0;
double _unitValue = 0;
String _className = "";
int _classId = 0;
String _structureType = "";
bool _withoutBUCC = false;
int _notPaintedUnitVal = 0;
int _secondHandUnitVal = 0;
final DateTime now;
final String formatter;
_AddExtraItemsOffline()
: now = DateTime.now(),
formatter = DateFormat.yMMMMd('en_US').format(DateTime.now()),
_unitConstruct = UnitConstruct.defaultConstruct();
UnitConstruct _unitConstruct;
bool _isLoading = true;
@override
void initState() {
super.initState();
_loadData();
}
Future<void> _loadData() async {
UnitConstruct unitConstruct = await getStoredBldgType();
setState(() {
_unitConstruct = unitConstruct;
_isLoading = false;
});
}
BoxDecoration box1() {
return const BoxDecoration(boxShadow: [
BoxShadow(color: Colors.black12, spreadRadius: 5, blurRadius: 5)
], color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(3)));
}
double _amountofDepreciation(unitVal, unitBase, area, depreciation) {
return ((unitVal * unitBase) * area) * depreciation;
}
double _totalMarketValue(unitVal, unitBase, area, depreciation, withBUCC,
className, painted, secondHand, paintedUnitVal, secondhandUntVal) {
if (withBUCC == false) {
if (painted == true || secondHand == true) {
final deductions = (paintedUnitVal + secondhandUntVal) / 100;
print(deductions);
return (((unitVal - deductions) * unitBase) * area);
} else {
return ((unitVal * unitBase) * area);
}
} else {
return (unitVal * area);
}
}
double _calculateMarketValue(unitVal, unitBase, area, withBUCC) {
if (withBUCC == false) {
return ((unitVal * unitBase) * area);
} else {
return (unitVal * area);
}
}
void assignSelectedBldgValues() async {
UnitConstruct? storedBldgType = await getStoredBldgType();
if (_withoutBUCC) {
_unitBase = _unitValue;
_structureType =
storedBldgType!.bldgType + ' - ' + storedBldgType.building;
formKey.currentState!.patchValue({'buccValue': '100'});
} else {
_unitBase = double.parse(storedBldgType!.unitValue);
_structureType =
storedBldgType!.bldgType + ' - ' + storedBldgType.building;
;
formKey.currentState!.patchValue({'unitValue': storedBldgType.unitValue});
}
}
@override
Widget build(BuildContext context) {
return BlocBuilder<AdditionalItemsOfflineBloc, AdditionalItemsOfflineState>(
buildWhen: (previous, current) {
return false;
}, builder: (context, state) {
if (state is ShowAddItemsScreen) {
return BlocConsumer<ClassComponentsAdminBloc,
ClassComponentsAdminState>(
listener: (context, state) {
// TODO: implement listener
},
builder: (context, state) {
if (state is ClassComponentsAdminLoaded) {
final classes = state.classes;
return BlocConsumer<UnitConstructionAdminBloc,
UnitConstructionAdminState>(
listener: (context, state) {
// TODO: implement listener
},
builder: (context, state) {
if (state is UnitConstructLoaded) {
return FormBuilder(
key: formKey,
onChanged: () {
formKey.currentState?.save();
},
autovalidateMode: AutovalidateMode.disabled,
child: SingleChildScrollView(
padding: const EdgeInsets.all(2.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
margin: const EdgeInsets.only(
left: 0, top: 10, right: 0, bottom: 0),
child: SizedBox(
height: 45,
child: SearchField(
itemHeight: 70,
suggestions: classes
.map((ClassComponentsOffline clss) =>
SearchFieldListItem(
'${clss.componentName}',
item: clss,
child: ListTile(
title: Text(
'${clss.componentName}',
overflow:
TextOverflow.ellipsis,
),
)))
.toList(),
validator: FormBuilderValidators.required(
errorText: "This field is required"),
searchInputDecoration: normalTextFieldStyle(
"Additional Improvements", "")
.copyWith(
suffixIcon: const Icon(
Icons.arrow_drop_down)),
////agency suggestion tap
focusNode: focusAddItems,
suggestionState: Suggestion.expand,
onSuggestionTap: (value) {
setState(() {
if (value.item!.minBaseUnitvalPercent !=
'0.00') {
setState(() {
_unitValue = double.parse(value
.item!.minBaseUnitvalPercent!);
_className =
value.item!.componentName!;
_classId = value.item!.id!;
_withoutBUCC =
value.item!.withoutBucc == 1
? true
: false;
});
formKey.currentState!.patchValue({
'unitValue': value
.item!.minBaseUnitvalPercent
});
formKey.currentState!.patchValue({
'buccValue': (double.parse(value
.item!
.minBaseUnitvalPercent!) *
100)
.toString()
});
}
if (value.item!.maxBaseUnitvalPercent !=
'0.00') {
setState(() {
_unitValue = double.parse(value
.item!.maxBaseUnitvalPercent!);
_className =
value.item!.componentName!;
_classId = value.item!.id!;
_withoutBUCC =
value.item!.withoutBucc == 1
? true
: false;
});
formKey.currentState!.patchValue({
'unitValue': value
.item!.maxBaseUnitvalPercent
});
formKey.currentState!.patchValue({
'buccValue': (double.parse(value
.item!
.maxBaseUnitvalPercent!) *
100)
.toString()
});
}
if (value.item!.minUnitvalSqrmtr !=
'0.00') {
setState(() {
_unitValue = double.parse(
value.item!.minUnitvalSqrmtr!);
_className =
value.item!.componentName!;
_classId = value.item!.id!;
_withoutBUCC =
value.item!.withoutBucc == 1
? true
: false;
});
formKey.currentState!.patchValue({
'unitValue':
value.item!.minUnitvalSqrmtr
});
formKey.currentState!
.patchValue({'buccValue': '100'});
}
if (value.item!.maxUnitvalSqrmtr !=
'0.00') {
setState(() {
_unitValue = double.parse(
value.item!.maxUnitvalSqrmtr!);
_className =
value.item!.componentName!;
_classId = value.item!.id!;
_withoutBUCC =
value.item!.withoutBucc == 1
? true
: false;
});
formKey.currentState!.patchValue({
'unitValue':
value.item!.maxUnitvalSqrmtr
});
formKey.currentState!
.patchValue({'buccValue': '100'});
}
if (value.item!.minAddBaseunitval !=
'0.00') {
setState(() {
_unitValue = double.parse(
value.item!.minAddBaseunitval!);
_className =
value.item!.componentName!;
_classId = value.item!.id!;
_withoutBUCC =
value.item!.withoutBucc == 1
? true
: false;
});
formKey.currentState!.patchValue({
'unitValue':
value.item!.minAddBaseunitval
});
formKey.currentState!
.patchValue({'buccValue': '100'});
}
if (value.item!.maxAddBaseunitval !=
'0.00') {
setState(() {
_unitValue = double.parse(
value.item!.maxAddBaseunitval!);
_className =
value.item!.componentName!;
_classId = value.item!.id!;
_withoutBUCC =
value.item!.withoutBucc == 1
? true
: false;
});
formKey.currentState!.patchValue({
'unitValue':
value.item!.maxAddBaseunitval
});
formKey.currentState!
.patchValue({'buccValue': '100'});
}
if (value.item!.minDeductBaserate !=
'0.00') {
setState(() {
_unitValue = double.parse(
value.item!.minDeductBaserate!);
_className =
value.item!.componentName!;
_classId = value.item!.id!;
_withoutBUCC =
value.item!.withoutBucc == 1
? true
: false;
});
formKey.currentState!.patchValue({
'unitValue':
value.item!.minDeductBaserate
});
formKey.currentState!
.patchValue({'buccValue': '100'});
}
if (value.item!.maxDeductBaserate !=
'0.00') {
setState(() {
_unitValue = double.parse(
value.item!.maxDeductBaserate!);
_className =
value.item!.componentName!;
_classId = value.item!.id!;
_withoutBUCC =
value.item!.withoutBucc == 1
? true
: false;
});
formKey.currentState!.patchValue({
'unitValue':
value.item!.maxDeductBaserate
});
formKey.currentState!
.patchValue({'buccValue': '100'});
}
assignSelectedBldgValues();
focusAddItems.unfocus();
});
},
),
),
),
const SizedBox(height: 10),
Container(
margin: const EdgeInsets.only(
left: 0, top: 10, right: 0, bottom: 0),
child: SizedBox(
height: 45,
child: SearchField(
enabled: false,
itemHeight: 70,
suggestions: state.unit
.map((UnitConstruct unit) =>
SearchFieldListItem(
_unitConstruct.bldgType +
' - ' +
_unitConstruct.building,
item: unit,
child: ListTile(
title: Text(
_unitConstruct.bldgType +
' - ' +
_unitConstruct.building,
overflow:
TextOverflow.ellipsis,
),
)))
.toList(),
validator: FormBuilderValidators.required(
errorText: "This field is required"),
searchInputDecoration: normalTextFieldStyle(
_unitConstruct.bldgType +
' - ' +
_unitConstruct.building,
"")
.copyWith(
suffixIcon: const Icon(
Icons.arrow_drop_down)),
////agency suggestion tap
focusNode: focus,
suggestionState: Suggestion.expand,
onSuggestionTap: (unit) {
setState(() {});
focus.unfocus();
},
),
),
),
const SizedBox(height: 10),
Row(
children: [
Expanded(
flex: 1,
child: FormBuilderTextField(
name: 'unitValue',
decoration: normalTextFieldStyle(
"Unit Value", ""),
keyboardType: TextInputType.phone,
validator:
FormBuilderValidators.compose([]),
),
),
const SizedBox(width: 10),
Expanded(
flex: 1,
child: FormBuilderTextField(
name: 'buccValue',
decoration:
normalTextFieldStyle("BUCC", ""),
keyboardType: TextInputType.phone,
validator:
FormBuilderValidators.compose([]),
onChanged: (value) {
// setState(() {
// _areaValue = double.parse(value!);
// });
},
),
),
const SizedBox(
height: 40,
width: 40,
child: Center(
child: Text(
'%',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold),
),
),
)
],
),
SizedBox(
height: 10,
),
Row(
children: [
Expanded(
flex: 1,
child: FormBuilderTextField(
name: 'areaValue',
decoration:
normalTextFieldStyle("Area", ""),
keyboardType: TextInputType.phone,
validator:
FormBuilderValidators.compose([]),
onChanged: (value) {
setState(() {
_areaValue = double.parse(value!);
});
},
),
),
],
),
Visibility(
visible: !_withoutBUCC,
child: Column(
children: [
const SizedBox(height: 10),
const Text('Building is not painted?'),
const SizedBox(height: 5),
Container(
child: Row(
children: [
Checkbox(
value: isPainted,
onChanged: (bool? value) {
setState(() {
isPainted = value!;
if (value == false) {
_notPaintedUnitVal = 0;
} else {
_notPaintedUnitVal = 10;
}
});
},
),
const SizedBox(width: 10),
Container(
height: 40.0,
width: 100,
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(
color: Colors.grey,
width: 1.0,
),
borderRadius:
BorderRadius.circular(5.0),
),
child: Align(
alignment: Alignment.center,
child: Text(' - ' +
_notPaintedUnitVal
.toString() +
'%')),
),
],
),
),
const SizedBox(height: 10),
const Text('Uses second hand materials?'),
const SizedBox(height: 5),
Container(
child: Row(
children: [
Checkbox(
value: isSecondHand,
onChanged: (bool? value) {
setState(() {
isSecondHand = value!;
if (isSecondHand == false) {
_secondHandUnitVal = 0;
formKey.currentState!
.patchValue({
'secondHandMat': '0'
});
} else {
_secondHandUnitVal = 5;
formKey.currentState!
.patchValue({
'secondHandMat': '5'
});
}
});
},
),
const SizedBox(width: 10),
Row(
children: [
SizedBox(
height: 40,
width: 100,
child: FormBuilderTextField(
enabled: isSecondHand,
name: 'secondHandMat',
keyboardType:
TextInputType.phone,
textAlign: TextAlign.center,
decoration:
normalTextFieldStyle(
"Unit Value", ""),
validator:
FormBuilderValidators
.compose([]),
onChanged: (value) {
// Check if the value is not null before parsing to double
if (value != null &&
value.isNotEmpty) {
setState(() {
_secondHandUnitVal =
int.parse(value);
});
} else {
// Handle the case when the value is empty or null
// For example, set _secondHandUnitVal to a default value or show an error message.
}
},
),
),
const SizedBox(
height: 40,
width: 40,
child: Center(
child: Text(
'%',
style: TextStyle(
fontSize: 18,
fontWeight:
FontWeight.bold),
),
),
)
],
),
],
),
),
],
),
),
const SizedBox(height: 10),
const Text('Market Value'),
const SizedBox(height: 5),
Container(
height: 45.0,
width: double.infinity,
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(
color: Colors.grey,
width: 1.0,
),
borderRadius: BorderRadius.circular(5.0),
),
child: Align(
alignment: Alignment.center,
child: Text(NumberFormat.currency(
locale: 'en-PH', symbol: "")
.format(_totalMarketValue(
_unitValue,
_unitBase,
_areaValue,
_depValue,
_withoutBUCC,
_className,
isPainted,
isSecondHand,
_notPaintedUnitVal,
_secondHandUnitVal)))),
),
const SizedBox(height: 40),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
children: [
Container(
width: 120,
height: 60,
padding: const EdgeInsets.all(8.0),
child: ElevatedButton(
onPressed: () async {
try {
final tempID = await SharedPreferences
.getInstance();
context.read<AdditionalItemsOfflineBloc>().add(
AddAdditionalItems(
id: 1,
bldgapprDetailsId:
tempID.getInt('tempid')!,
classId: _classId,
assessedById: widget
.offlineProfile.id
.toString(),
assessedByName: widget
.offlineProfile
.firstName!,
dateCreated: formatter,
dateModified: 'None',
className: _className,
structType: _structureType,
unitValue: _withoutBUCC == true
? 100
: _unitValue * 100,
baseUnitValue: _unitBase,
area: _areaValue,
marketValue:
_calculateMarketValue(
_unitValue,
_unitBase,
_areaValue,
_withoutBUCC),
depreciationRate: _depValue,
adjustedMarketVal:
_totalMarketValue(
_unitValue,
_unitBase,
_areaValue,
_depValue,
_withoutBUCC,
_className,
isPainted,
isSecondHand,
_notPaintedUnitVal,
_secondHandUnitVal),
actualUse: 'Test',
amtDepreciation:
_amountofDepreciation(
_unitValue,
_unitBase,
_areaValue,
_depValue,
),
painted: true,
secondhand: true,
paintedUnitval: '1',
secondhandUnitval: '1',
genCode: "5th"));
} catch (e) {
Fluttertoast.showToast(
msg:
"Slow internet connection, please try again!",
);
}
},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.black,
),
child: const Text("Submit"),
),
),
const SizedBox(
width:
5), // Use SizedBox for horizontal spacing in a Row
Container(
width: 120,
height: 60,
padding: const EdgeInsets.all(8.0),
child: ElevatedButton(
onPressed: () {
context
.read<AdditionalItemsOfflineBloc>()
.add(const LoadAdditionalItems());
},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.black,
),
child: const Text("Cancel"),
),
),
],
)
],
),
)); // Use your actual widget
}
return Container();
},
);
}
return Container();
},
);
}
// if (state is Add) {
// return SomethingWentWrong(
// message: onError,
// onpressed: () {
// context.read<AdditionalItemBloc>().add(LoadAdditionalItems());
// },
// );
// }
return Container();
});
}
}