diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index a143a94a..ed077246 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -4,13 +4,14 @@ class URLs { static const String appReleaseBuildNumber = "31"; // static const host1 = "https://atomsm.hmg.com"; // production url - // static const host1 = "https://atomsmdev.hmg.com"; // local DEV url - static const host1 = "https://atomsmuat.hmg.com"; // local UAT url + static const host1 = "https://atomsmdev.hmg.com"; // local DEV url + // static const host1 = "https://atomsmuat.hmg.com"; // local UAT url // static final String _baseUrl = "$_host/mobile"; // host local UAT - static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis + // static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis // static final String _baseUrl = "$_host/mobile"; // host local UAT and for internal audit dev // static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM + static final String _baseUrl = "$_host/v4/mobile"; // v4 for Demo module // static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation static const String chatHubUrl = "https://apiderichat.hmg.com/chathub"; @@ -242,6 +243,7 @@ class URLs { static get getTrafRequestTypeLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=416"; static get getYesNoRequestTypeLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=4"; + static get getDemoPeriodLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=4101"; static get getClassificationTypeLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=450"; diff --git a/lib/main.dart b/lib/main.dart index 49caab45..aedb7794 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -32,6 +32,7 @@ import 'package:test_sa/modules/cm_module/cm_detail_provider.dart'; import 'package:test_sa/modules/cm_module/create_cm_request.dart'; import 'package:test_sa/modules/cx_module/chat/chat_provider.dart'; import 'package:test_sa/modules/demo_module/create_demo_request_page.dart'; +import 'package:test_sa/modules/demo_module/demo_period_lookup_provider.dart'; import 'package:test_sa/modules/demo_module/demo_provider.dart'; import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/create_equipment_internal_audit_form.dart'; import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/create_system_internal_audit_form.dart'; @@ -320,6 +321,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => LoanPeriodProvider()), ChangeNotifierProvider(create: (_) => MedicalDepartmentProvider()), ChangeNotifierProvider(create: (_) => DemoProvider()), + ChangeNotifierProvider(create: (_) => DemoPeriodLookupProvider()), ], child: GestureDetector( onTap: () { diff --git a/lib/modules/demo_module/create_demo_request_page.dart b/lib/modules/demo_module/create_demo_request_page.dart index 72898cee..69c981e6 100644 --- a/lib/modules/demo_module/create_demo_request_page.dart +++ b/lib/modules/demo_module/create_demo_request_page.dart @@ -22,6 +22,7 @@ import 'package:test_sa/models/new_models/work_order_detail_model.dart'; import 'package:test_sa/models/service_request/supplier_details.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; +import 'package:test_sa/modules/demo_module/demo_period_lookup_provider.dart'; import 'package:test_sa/modules/loan_module/models/loan_form_model.dart'; import 'package:test_sa/modules/loan_module/models/medical_department_model.dart'; import 'package:test_sa/modules/loan_module/provider/loan_period_provider.dart'; @@ -39,6 +40,7 @@ import 'package:test_sa/providers/work_order/vendor_provider.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import '../../../../../../new_views/common_widgets/default_app_bar.dart'; import 'demo_detail_view_page.dart'; +import 'demo_form_model.dart'; class CreateDemoRequestPage extends StatefulWidget { static const String id = "/create-demo-request"; @@ -54,12 +56,14 @@ class _CreateDemoRequestPageState extends State with Tick final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); TaskType? selectedType; - final LoanFormModel _loanFormModel = LoanFormModel(); + final DemoFormModel _demoFormModel = DemoFormModel(); TextEditingController commentController = TextEditingController(); SupplierDetails? supplier; + Lookup? demoPeriodLookup; + // List loanTypes = []; @override @@ -85,10 +89,29 @@ class _CreateDemoRequestPageState extends State with Tick crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ + // SingleItemDropDownMenu( + // context: context, + // title: "Demo Period", + // initialValue: demoPeriodLookup, + // showShadow: false, + // validator: (value) { + // if (value == null) return "Mandatory"; + // return null; + // }, + // backgroundColor: AppColor.fieldBgColor(context), + // showAsBottomSheet: true, + // onSelect: (value) { + // demoPeriodLookup = value; + // setState(() {}); + // }, + // ), + // 16.height, ...siteSection(), 16.height, ...doctorInfoSection(), 16.height, + ...assetSection(), + 16.height, ...vendorDetailsSection(), 16.height, AttachmentPicker( @@ -128,7 +151,7 @@ class _CreateDemoRequestPageState extends State with Tick SingleItemDropDownMenu( context: context, title: context.translation.site, - initialValue: _loanFormModel.site, + initialValue: _demoFormModel.site, showShadow: false, validator: (value) { if (value == null) return "Please select a site"; @@ -137,7 +160,7 @@ class _CreateDemoRequestPageState extends State with Tick backgroundColor: AppColor.fieldBgColor(context), showAsBottomSheet: true, onSelect: (value) { - _loanFormModel.site = value; + _demoFormModel.site = value; setState(() {}); }, ), @@ -151,11 +174,11 @@ class _CreateDemoRequestPageState extends State with Tick return null; }, showAsBottomSheet: true, - initialValue: _loanFormModel.department, + initialValue: _demoFormModel.department, requestById: context.userProvider.user?.clientId, backgroundColor: AppColor.fieldBgColor(context), onSelect: (value) { - _loanFormModel.department = value; + _demoFormModel.department = value; setState(() {}); }, ), @@ -179,7 +202,7 @@ class _CreateDemoRequestPageState extends State with Tick showShadow: false, textInputType: TextInputType.text, onChange: (value) { - _loanFormModel.docName = value; + _demoFormModel.docName = value; }, ), 8.height, @@ -196,7 +219,7 @@ class _CreateDemoRequestPageState extends State with Tick showShadow: false, textInputType: TextInputType.phone, onChange: (value) { - _loanFormModel.docNumber = value; + _demoFormModel.docNumber = value; }, ), 8.height, @@ -216,7 +239,7 @@ class _CreateDemoRequestPageState extends State with Tick showShadow: false, textInputType: TextInputType.emailAddress, onChange: (value) { - _loanFormModel.docEmail = value; + _demoFormModel.docEmail = value; }, ), 8.height, @@ -234,16 +257,16 @@ class _CreateDemoRequestPageState extends State with Tick textInputType: TextInputType.text, textInputAction: TextInputAction.next, onChange: (value) { - _loanFormModel.itemDescription = value; + _demoFormModel.itemDescription = value; }, ), 8.height, AppTextFormField( labelText: "Request Description", - validator: (value) { - if ((value ?? "").isEmpty) return "Mandatory"; - return null; - }, + // validator: (value) { + // if ((value ?? "").isEmpty) return "Mandatory"; + // return null; + // }, style: Theme.of(context).textTheme.titleMedium, backgroundColor: AppColor.fieldBgColor(context), labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), @@ -252,7 +275,7 @@ class _CreateDemoRequestPageState extends State with Tick textInputType: TextInputType.text, textInputAction: TextInputAction.next, onChange: (value) { - _loanFormModel.requestDescription = value; + _demoFormModel.requestDescription = value; }, ), ]; @@ -276,7 +299,7 @@ class _CreateDemoRequestPageState extends State with Tick textInputType: TextInputType.text, textInputAction: TextInputAction.next, onChange: (value) { - _loanFormModel.model = value; + _demoFormModel.model = value; }, ), 8.height, @@ -294,30 +317,27 @@ class _CreateDemoRequestPageState extends State with Tick textInputType: TextInputType.text, textInputAction: TextInputAction.next, onChange: (value) { - _loanFormModel.manufacturer = value; + _demoFormModel.manufacturer = value; }, ), 8.height, - SingleItemDropDownMenu( + SingleItemDropDownMenu( context: context, height: 56.toScreenHeight, - title: 'Demo Period'.addTranslation, + title: "Demo Period", + initialValue: demoPeriodLookup, showShadow: false, validator: (value) { - if (value == null) return "Please select loan period"; + if (value == null) return "Mandatory"; return null; }, backgroundColor: AppColor.fieldBgColor(context), showAsBottomSheet: true, - initialValue: _loanFormModel.loanProvided, - onSelect: (status) { - if (status != null) { - _loanFormModel.loanProvided = status; - setState(() {}); - } + onSelect: (value) { + demoPeriodLookup = value; + setState(() {}); }, ), - 8.height, ]; } @@ -339,7 +359,7 @@ class _CreateDemoRequestPageState extends State with Tick textInputType: TextInputType.name, textInputAction: TextInputAction.next, onChange: (value) { - _loanFormModel.vendorName = value; + _demoFormModel.vendorName = value; }, ), 8.height, @@ -357,7 +377,7 @@ class _CreateDemoRequestPageState extends State with Tick textInputType: TextInputType.name, textInputAction: TextInputAction.next, onChange: (value) { - _loanFormModel.vendorRepresentativeName = value; + _demoFormModel.vendorRepresentativeName = value; }, ), 8.height, @@ -375,7 +395,7 @@ class _CreateDemoRequestPageState extends State with Tick textInputType: TextInputType.phone, textInputAction: TextInputAction.next, onChange: (value) { - _loanFormModel.vendorNumber = value; + _demoFormModel.vendorNumber = value; }, ), 8.height, @@ -396,30 +416,28 @@ class _CreateDemoRequestPageState extends State with Tick textInputType: TextInputType.emailAddress, textInputAction: TextInputAction.next, onChange: (value) { - _loanFormModel.vendorEmail = value; + _demoFormModel.vendorEmail = value; }, ), ]; } Future _submit() async { - Navigator.of(context).push(MaterialPageRoute(builder: (_) => DemoDetailViewPage(demoId: 0))); - return; FocusScope.of(context).unfocus(); if (_formKey.currentState!.validate()) { _formKey.currentState!.save(); - _loanFormModel.loanAttachment = []; + _demoFormModel.demoAttachment = []; for (var item in attachments) { String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; - _loanFormModel.loanAttachment?.add(LoanAttachments(id: 0, attachmentName: fileName, loanId: 0)); + _demoFormModel.demoAttachment?.add(DemoAttachments(id: 0, attachmentName: fileName, demoRequestId: 0)); } Utils.showLoading(context); LoanProvider loanProvider = Provider.of(context, listen: false); - Map body = _loanFormModel.toJson(); + Map body = _demoFormModel.toJson(); body["id"] = 0; - body["LoanTypeId"] = 0; - body["requestorUserID"] = context.userProvider.user!.userID; + // body["LoanTypeId"] = 0; + // body["requestorUserID"] = context.userProvider.user!.userID; bool isSuccess = await loanProvider.addLoanRequest(body); Utils.hideLoading(context); diff --git a/lib/modules/demo_module/demo_form_model.dart b/lib/modules/demo_module/demo_form_model.dart new file mode 100644 index 00000000..af27e5ab --- /dev/null +++ b/lib/modules/demo_module/demo_form_model.dart @@ -0,0 +1,157 @@ +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/new_models/building.dart'; +import 'package:test_sa/models/new_models/department.dart'; +import 'package:test_sa/models/new_models/floor.dart'; +import 'package:test_sa/models/new_models/site.dart'; +import 'package:test_sa/modules/loan_module/models/medical_department_model.dart'; + +class DemoFormModel { + String? docName; + String? docNumber; + String? docEmail; + String? itemDescription; + String? requestDescription; + String? model; + String? manufacturer; + Lookup? loanProvided; + String? vendorName; + String? vendorRepresentativeName; + String? vendorNumber; + String? vendorEmail; + Site? site; + MedicalDepartmentModel? department; + List? demoAttachment; + + DemoFormModel({ + this.docName, + this.docNumber, + this.docEmail, + this.itemDescription, + this.requestDescription, + this.model, + this.manufacturer, + this.loanProvided, + this.vendorName, + this.vendorRepresentativeName, + this.vendorNumber, + this.vendorEmail, + this.demoAttachment, + this.site, + this.department, + }); + + //{ + // "id": 0, + // "employeeId": "fa29a9de-1337-4729-b823-68c6ecffdd33", + // "requestorUserID": "fa29a9de-1337-4729-b823-68c6ecffdd33", + // "employeeName": "engineer-dev", + // "employeeEmail": "Engineer_Dev@yahoo.com", + // "positionName": "High", + // "requesterExtensionNumber": "7726", + // "requesterContactNumber": "72132197", + // "siteId": 1, + // "departmentId": 5, + // "loanTypeId": 6448, + // "doctorName": "Doctor A", + // "doctorContact": "0561432451", + // "doctorEmail": "doctor@test.com", + // "itemDescription": "Test item", + // "requestDescription": "Test request", + // "loanPeriodId": 6453, + // "assetId": null, + // "assetNumber": "", + // "assetName": "", + // "assetSerialNumber": "", + // "model": "Model A", + // "manufacturer": "Siemens", + // "vendorName": "Vendor A", + // "vendorRepName": "Vendor Rep A", + // "vendorContact": "0561432455", + // "vendorEmail": "vendor@test.com", + // "loanStatusId": 1, + // "loanAttachments": [], + // "submittedAt": "2025-11-13T12:11:12.673Z", + // "updatedAt": null, + // "cMWOItemId": null + // } + + Map toJson() { + var abc = { + "id": 0, + "siteId": 0, + "buildingId": 0, + "floorId": 0, + "departmentId": 0, + "assetName": "string", + "model": "string", + "manufacturer": "string", + "doctorName": "string", + "doctorContactNumber": "string", + "doctorContactEmail": "string", + "itemDescription": "string", + "requestDescription": "string", + "demoPeriodId": 0, + "supplierId": 0, + "suppPersonId": 0, + "isSubmit": true, + "demoAttachments": [ + { + "id": 0, + "attachmentName": "string", + "originalName": "string", + "demoRequestId": 0, + "attachmentTypeId": 0 + } + ] + }; + + + return { + "doctorName": docName, + "doctorContact": docNumber, + "doctorEmail": docEmail, + "itemDescription": itemDescription, + "requestDescription": requestDescription, + "model": model, + "manufacturer": manufacturer, + "demoPeriodId": loanProvided?.id, + "vendorName": vendorName, + "vendorRepresentativeName": vendorRepresentativeName, + "vendorRepName": vendorRepresentativeName, + "vendorNumber": vendorNumber, + "vendorContact": vendorNumber, + "vendorEmail": vendorEmail, + 'siteId': site?.id, + 'departmentId': department?.id, + "demoAttachments": demoAttachment != null ? demoAttachment!.map((v) => v.toJson()).toList() : [], + }; + } +} + +class DemoAttachments { + num? id; + num? demoRequestId; + num? attachmentTypeId; + String? attachmentName; + String? originalName; + + DemoAttachments({this.id, this.attachmentTypeId, this.attachmentName, this.demoRequestId, this.originalName}); + + DemoAttachments.fromJson(dynamic json) { + id = json['id']; + attachmentTypeId = json['attachmentTypeId']; + demoRequestId = json['demoRequestId']; + attachmentName = json['attachmentName']; + originalName = json['originalName']; + } + + Map toJson() { + final map = {}; + map['id'] = id; + map['attachmentTypeId'] = attachmentTypeId; + map['attachmentName'] = attachmentName; + map['demoRequestId'] = demoRequestId; + map['originalName'] = originalName; + return map; + } +} diff --git a/lib/modules/demo_module/demo_period_lookup_provider.dart b/lib/modules/demo_module/demo_period_lookup_provider.dart new file mode 100644 index 00000000..35f0e027 --- /dev/null +++ b/lib/modules/demo_module/demo_period_lookup_provider.dart @@ -0,0 +1,33 @@ +import 'dart:convert'; + +import 'package:http/http.dart'; +import 'package:test_sa/providers/loading_list_notifier.dart'; + +import '../../controllers/api_routes/api_manager.dart'; +import '../../controllers/api_routes/urls.dart'; +import '../../models/lookup.dart'; + +class DemoPeriodLookupProvider extends LoadingListNotifier { + @override + Future getData({int? id}) async { + if (loading == true) return -2; + loading = true; + notifyListeners(); + try { + Response response = await ApiManager.instance.get(URLs.getDemoPeriodLookup); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + 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; + } + } +}