diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 66e56401..74b60575 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -58,6 +58,7 @@ class URLs { static get getSingleServiceRequest => "$_baseUrl/return/call/information"; // get static get getSuppliersAutoComplete => "$_baseUrl/Supplier/GetSuppliersAutoComplete"; + static get addSupplierEngineer => "$_baseUrl/Supplier/AddSupplierEngineer"; static get getSystemNotifications => "$_baseUrl/SystemNotification/GetSystemNotifications"; // get static get getRecentNotifications => "$_baseUrl/return/user/recent/notification"; // get @@ -86,6 +87,7 @@ class URLs { static get getServiceReportStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=521"; // get static get getServiceReportLastCalls => "$_baseUrl/WorkOrder/GetLookupCallLastSituationBasedOnCase"; // get static get getAssetTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=500"; // get + static get getPersonRoles => "$_baseUrl/Lookups/GetLookup?lookupEnum=36"; // get static get getPartNumber => "$_baseUrl/PartCatalog/GetPartAutoComplete"; // get static get getServiceReportPriority => "$_baseUrl/Lookups/GetLookup?lookupEnum=4"; // get static get getServiceReportDefectTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; // get diff --git a/lib/controllers/notification/firebase_notification_manger.dart b/lib/controllers/notification/firebase_notification_manger.dart index 39c6aa24..fbae40d4 100644 --- a/lib/controllers/notification/firebase_notification_manger.dart +++ b/lib/controllers/notification/firebase_notification_manger.dart @@ -1,16 +1,13 @@ import 'dart:convert'; import 'dart:io'; -import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/controllers/notification/notification_manger.dart'; -import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/models/device/asset_transfer.dart'; import 'package:test_sa/models/new_models/gas_refill_model.dart'; import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/system_notification_model.dart'; import 'package:test_sa/views/pages/device_transfer/device_transfer_details.dart'; import 'package:test_sa/views/pages/user/gas_refill/gas_refill_details.dart'; import 'package:test_sa/views/pages/user/ppm/ppm_details_page.dart'; @@ -35,7 +32,9 @@ class FirebaseNotificationManger { ); if (settings.authorizationStatus == AuthorizationStatus.authorized) { - token = await messaging.getToken(); + try { + token = await messaging.getToken(); + } catch (ex) {} } print("pushToken:$token"); return token; diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index b069de74..c0a1b28d 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -16,6 +16,8 @@ import 'package:test_sa/models/service_request/pending_service_request_model.dar import 'package:test_sa/models/service_request/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request_search.dart'; +import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart'; +import 'package:test_sa/models/service_request/supplier_engineer_model.dart'; import 'package:test_sa/models/timer_model.dart'; import '../../../models/service_request/search_work_order.dart'; @@ -671,4 +673,25 @@ class ServiceRequestsProvider extends ChangeNotifier { return []; } } + + Future addSupplierEngineer(SupplierEngineer supplierEngineer) async { + isLoading = true; + notifyListeners(); + Response response; + SuppEngineerWorkOrders res; + try { + response = await ApiManager.instance.post(URLs.addSupplierEngineer, body: supplierEngineer.toJson()); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + res = SuppEngineerWorkOrders.fromJson(json.decode(response.body)["data"]); + } + isLoading = false; + notifyListeners(); + return res; + } catch (error) { + isLoading = false; + notifyListeners(); + return res; + } + } } diff --git a/lib/controllers/providers/settings/setting_provider.dart b/lib/controllers/providers/settings/setting_provider.dart index 4758e232..4824b6f3 100644 --- a/lib/controllers/providers/settings/setting_provider.dart +++ b/lib/controllers/providers/settings/setting_provider.dart @@ -17,6 +17,7 @@ class SettingProvider extends ChangeNotifier { user = null; _assetGroup = null; prefs.remove(ASettings.user); + prefs.remove(ASettings.localAuth); prefs.remove(ASettings.assetGroup); notifyListeners(); } diff --git a/lib/main.dart b/lib/main.dart index 3c346f7c..836d9c0f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -75,6 +75,7 @@ import 'package:test_sa/providers/service_request_providers/type_of_request_prov import 'package:test_sa/providers/work_order/asset_types_provider.dart'; import 'package:test_sa/providers/work_order/reason_provider.dart'; import 'package:test_sa/providers/work_order/service_type_provider.dart'; +import 'package:test_sa/providers/work_order/supplier_engineer_provider.dart'; import 'package:test_sa/providers/work_order/vendor_provider.dart'; import 'package:test_sa/views/pages/device_transfer/asset_filter_screen.dart'; import 'package:test_sa/views/pages/device_transfer/asset_search_screen.dart'; @@ -183,6 +184,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => ServiceRequestedThroughProvider()), ChangeNotifierProvider(create: (_) => ServiceRequestStatusProvider()), ChangeNotifierProvider(create: (_) => EngineersProvider()), + ChangeNotifierProvider(create: (_) => SupplierEngineerProvider()), /// Loan availability not required // ChangeNotifierProvider(create: (_) => ServiceLoanAvailabilityProvider()), diff --git a/lib/models/service_request/supplier_engineer_model.dart b/lib/models/service_request/supplier_engineer_model.dart new file mode 100644 index 00000000..f2e6838d --- /dev/null +++ b/lib/models/service_request/supplier_engineer_model.dart @@ -0,0 +1,30 @@ +class SupplierEngineer { + int id; + int supplierId; + String personName; + int personRoleId; + String contact; + String email; + + SupplierEngineer({this.id, this.supplierId, this.personName, this.personRoleId, this.contact, this.email}); + + SupplierEngineer.fromJson(Map json) { + id = json['id']; + supplierId = json['supplierId']; + personName = json['personName']; + personRoleId = json['personRoleId']; + contact = json['contact']; + email = json['email']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['supplierId'] = this.supplierId; + data['personName'] = this.personName; + data['personRoleId'] = this.personRoleId; + data['contact'] = this.contact; + data['email'] = this.email; + return data; + } +} diff --git a/lib/new_views/common_widgets/app_drawer.dart b/lib/new_views/common_widgets/app_drawer.dart index 9f6fc2b0..c78e0bf5 100644 --- a/lib/new_views/common_widgets/app_drawer.dart +++ b/lib/new_views/common_widgets/app_drawer.dart @@ -5,6 +5,7 @@ import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/new_views/pages/login_page.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; @@ -90,7 +91,8 @@ class AppDrawer extends StatelessWidget { userProvider.reset(); Navigator.of(context).pop(); Navigator.of(context).pop(); - // Navigator.of(context).pop(); + Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); + } }), 18.height, diff --git a/lib/new_views/pages/login_page.dart b/lib/new_views/pages/login_page.dart index 124ff5b0..33cbaad8 100644 --- a/lib/new_views/pages/login_page.dart +++ b/lib/new_views/pages/login_page.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:test_sa/controllers/providers/settings/app_settings.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; @@ -122,6 +124,7 @@ class _LoginPageState extends State { int status = await _userProvider.login(context: context, user: _user); if (status >= 200 && status < 300 && _userProvider.user.isAuthenticated ?? false) { await _settingProvider.setUser(_userProvider.user); + (await SharedPreferences.getInstance()).remove(ASettings.localAuth); await _settingProvider.setRememberMe(_user.userName, _user.password, rememberMe); /// The below line for the new design diff --git a/lib/providers/work_order/supplier_engineer_provider.dart b/lib/providers/work_order/supplier_engineer_provider.dart new file mode 100644 index 00000000..5b08bede --- /dev/null +++ b/lib/providers/work_order/supplier_engineer_provider.dart @@ -0,0 +1,35 @@ +import 'dart:convert'; + +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/providers/loading_list_notifier.dart'; + +class SupplierEngineerProvider extends LoadingListNotifier { + @override + Future getDate() async { + if (loading == true) return -2; + loading = true; + notifyListeners(); + loading = true; + notifyListeners(); + try { + Response response = await ApiManager.instance.get(URLs.getPersonRoles); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); + } + loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + loading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index eee409d8..4f9143f1 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -19,11 +19,13 @@ import 'package:test_sa/models/new_models/assigned_employee.dart'; import 'package:test_sa/models/new_models/assistant_employee.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/service_request/service_report.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/providers/service_request_providers/equipment_status_provider.dart'; import 'package:test_sa/providers/service_request_providers/loan_availability_provider.dart'; import 'package:test_sa/providers/work_order/vendor_provider.dart'; +import 'package:test_sa/views/pages/user/requests/add_supplier_engineer_bottom_sheet.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/pick_asset.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; @@ -315,6 +317,7 @@ class _CreateSubWorkOrderPageState extends State { context: context, title: context.translation.supplier, initialValue: _subWorkOrders.supplier ?? initialSupplier, + showAsBottomSheet: true, onSelect: (supplier) { if (supplier != null) { _subWorkOrders.supplier = supplier; @@ -325,23 +328,65 @@ class _CreateSubWorkOrderPageState extends State { ), if (_showVendorFields) const SizedBox(height: 8), if (_showVendorFields) - SingleItemDropDownMenu( - context: context, - title: context.translation.supplierEngineer, - enabled: _subWorkOrders?.supplier?.suppPersons?.isNotEmpty ?? false, - staticData: _subWorkOrders?.supplier?.suppPersons, - onSelect: (suppPerson) { - if (suppPerson != null) { - engineer = SuppEngineerWorkOrders( - id: suppPerson?.supplierId, - supplierContactId: suppPerson?.id, - personName: suppPerson?.personName, - contact: suppPerson?.contact, - externalEngCode: suppPerson?.externalEngCode, - email: suppPerson?.email, - ); - } - }, + Row( + children: [ + SingleItemDropDownMenu( + context: context, + title: context.translation.supplierEngineer, + enabled: _subWorkOrders?.supplier?.suppPersons?.isNotEmpty ?? false, + staticData: _subWorkOrders?.supplier?.suppPersons, + showAsBottomSheet: true, + initialValue: engineer == null ? null : SuppPersons.fromJson(engineer.toJson()), + onSelect: (suppPerson) { + print(suppPerson?.toJson()); + if (suppPerson != null) { + engineer = SuppEngineerWorkOrders.fromJson(suppPerson.toJson()); + + // engineer = SuppEngineerWorkOrders( + // id: suppPerson?.supplierId, + // supplierContactId: suppPerson?.id, + // personName: suppPerson?.personName, + // contact: suppPerson?.contact, + // externalEngCode: suppPerson?.externalEngCode, + // email: suppPerson?.email, + // ); + setState(() {}); + } + }, + ).expanded, + 8.width, + Container( + height: 60.toScreenHeight, + width: 60.toScreenWidth, + decoration: BoxDecoration( + color: _subWorkOrders.supplier?.suppliername == null ? AppColor.neutral40 : AppColor.background(context), + borderRadius: BorderRadius.circular(10), + boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], + ), + child: Icon( + Icons.add, + color: context.isDark ? null : AppColor.neutral60, + ), + ).onPress(_subWorkOrders.supplier?.suppliername == null + ? null + : () async { + SuppEngineerWorkOrders suppEngineer = (await showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (context) => AddSupplierEngineerBottomSheet(_subWorkOrders.supplier.id), + )) as SuppEngineerWorkOrders; + if (suppEngineer != null) { + if (_subWorkOrders?.supplier?.suppPersons == null) { + _subWorkOrders?.supplier?.suppPersons = []; + } + _subWorkOrders?.supplier?.suppPersons?.add(SuppPersons.fromJson(suppEngineer.toJson())); + engineer = suppEngineer; + setState(() {}); + } + }), + ], ), 8.height, ServiceReportFaultDescription( diff --git a/lib/views/pages/user/requests/add_supplier_engineer_bottom_sheet.dart b/lib/views/pages/user/requests/add_supplier_engineer_bottom_sheet.dart new file mode 100644 index 00000000..584fa7ae --- /dev/null +++ b/lib/views/pages/user/requests/add_supplier_engineer_bottom_sheet.dart @@ -0,0 +1,151 @@ +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/string_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart'; +import 'package:test_sa/models/service_request/supplier_engineer_model.dart'; +import 'package:test_sa/providers/work_order/supplier_engineer_provider.dart'; + +import '../../../../controllers/providers/api/service_requests_provider.dart'; +import '../../../../models/lookup.dart'; +import '../../../../new_views/app_style/app_color.dart'; +import '../../../../new_views/common_widgets/app_filled_button.dart'; +import '../../../../new_views/common_widgets/app_text_form_field.dart'; +import '../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; + +class AddSupplierEngineerBottomSheet extends StatefulWidget { + final int supplierId; + + const AddSupplierEngineerBottomSheet(this.supplierId, {Key key}) : super(key: key); + + @override + State createState() => _AddSupplierEngineerBottomSheetState(); +} + +class _AddSupplierEngineerBottomSheetState extends State { + final GlobalKey _formKey = GlobalKey(); + + Lookup suppEngRole; + + SupplierEngineer engineer = SupplierEngineer(); + + @override + void initState() { + super.initState(); + engineer.id = 0; + engineer.supplierId = widget.supplierId; + } + + @override + Widget build(BuildContext context) { + final userProvider = Provider.of(context, listen: false); + return Wrap( + children: [ + Container( + clipBehavior: Clip.antiAlias, + margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + decoration: BoxDecoration( + color: Theme.of(context).scaffoldBackgroundColor, + borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), + ), + padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), + child: Form( + key: _formKey, + child: SingleChildScrollView( + child: Column( + children: [ + Container( + width: 40.toScreenWidth, + height: 5.toScreenHeight, + decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)), + ), + Align( + alignment: AlignmentDirectional.centerStart, + child: "Add Engineer For Supplier".heading5(context).custom(fontWeight: FontWeight.w600).paddingOnly(top: 16, bottom: 16), + ), + 8.height, + AppTextFormField( + labelText: "Engineer Supplier Name".addTranslation, + textInputType: TextInputType.name, + onChange: (text) { + engineer.personName = text.isEmpty ? null : text; + }, + onSaved: (text) { + engineer.personName = text.isEmpty ? null : text; + }, + ), + 8.height, + SingleItemDropDownMenu( + context: context, + title: "Role", + initialValue: suppEngRole, + onSelect: (value) { + if (value != null) { + suppEngRole = value; + } + }, + ), + 8.height, + AppTextFormField( + labelText: "Contact".addTranslation, + textInputType: TextInputType.name, + onChange: (text) { + engineer.contact = text.isEmpty ? null : text; + }, + onSaved: (text) { + engineer.contact = text.isEmpty ? null : text; + }, + ), + 8.height, + AppTextFormField( + labelText: "Email".addTranslation, + textInputType: TextInputType.name, + onChange: (text) { + engineer.email = text.isEmpty ? null : text; + }, + onSaved: (text) { + engineer.email = text.isEmpty ? null : text; + }, + ), + 8.height, + 16.height, + Consumer( + builder: (context, snapshot, _) => AppFilledButton( + label: context.translation.save, + loading: snapshot.isLoading ?? false, + onPressed: () async { + _formKey.currentState.save(); + + if (engineer.personName.isEmpty) { + "Engineer supplier name is empty".showToast; + return; + } + + engineer.personRoleId = suppEngRole?.id; + // print(engineer.toJson()); + // return; + SuppEngineerWorkOrders suppEngineer = await snapshot.addSupplierEngineer(engineer); + if (suppEngineer == null) { + Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest}"); + return; + } + Fluttertoast.showToast(msg: context.translation.successfulRequestMessage); + Navigator.pop(context, suppEngineer); + }, + ), + ), + 16.height, + ], + ), + ), + ), + ) + ], + ); + } +}