api integrate cont.

design_3.0_demo_module
Sikander Saleem 7 hours ago
parent a103eae1c1
commit 7a5db103e0

@ -4,13 +4,14 @@ class URLs {
static const String appReleaseBuildNumber = "31"; static const String appReleaseBuildNumber = "31";
// static const host1 = "https://atomsm.hmg.com"; // production url // static const host1 = "https://atomsm.hmg.com"; // production url
// static const host1 = "https://atomsmdev.hmg.com"; // local DEV 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://atomsmuat.hmg.com"; // local UAT url
// static final String _baseUrl = "$_host/mobile"; // host local UAT // 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/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/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 final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation
static const String chatHubUrl = "https://apiderichat.hmg.com/chathub"; 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 getTrafRequestTypeLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=416";
static get getYesNoRequestTypeLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=4"; static get getYesNoRequestTypeLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=4";
static get getDemoPeriodLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=4101";
static get getClassificationTypeLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=450"; static get getClassificationTypeLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=450";

@ -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/cm_module/create_cm_request.dart';
import 'package:test_sa/modules/cx_module/chat/chat_provider.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/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/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/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'; 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: (_) => LoanPeriodProvider()),
ChangeNotifierProvider(create: (_) => MedicalDepartmentProvider()), ChangeNotifierProvider(create: (_) => MedicalDepartmentProvider()),
ChangeNotifierProvider(create: (_) => DemoProvider()), ChangeNotifierProvider(create: (_) => DemoProvider()),
ChangeNotifierProvider(create: (_) => DemoPeriodLookupProvider()),
], ],
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {

@ -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/models/service_request/supplier_details.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.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/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/loan_form_model.dart';
import 'package:test_sa/modules/loan_module/models/medical_department_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'; 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 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import '../../../../../../new_views/common_widgets/default_app_bar.dart'; import '../../../../../../new_views/common_widgets/default_app_bar.dart';
import 'demo_detail_view_page.dart'; import 'demo_detail_view_page.dart';
import 'demo_form_model.dart';
class CreateDemoRequestPage extends StatefulWidget { class CreateDemoRequestPage extends StatefulWidget {
static const String id = "/create-demo-request"; static const String id = "/create-demo-request";
@ -54,12 +56,14 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TaskType? selectedType; TaskType? selectedType;
final LoanFormModel _loanFormModel = LoanFormModel(); final DemoFormModel _demoFormModel = DemoFormModel();
TextEditingController commentController = TextEditingController(); TextEditingController commentController = TextEditingController();
SupplierDetails? supplier; SupplierDetails? supplier;
Lookup? demoPeriodLookup;
// List<Lookup> loanTypes = []; // List<Lookup> loanTypes = [];
@override @override
@ -85,10 +89,29 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
// SingleItemDropDownMenu<Lookup, DemoPeriodLookupProvider>(
// 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(), ...siteSection(),
16.height, 16.height,
...doctorInfoSection(), ...doctorInfoSection(),
16.height, 16.height,
...assetSection(),
16.height,
...vendorDetailsSection(), ...vendorDetailsSection(),
16.height, 16.height,
AttachmentPicker( AttachmentPicker(
@ -128,7 +151,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
SingleItemDropDownMenu<Site, SiteProvider>( SingleItemDropDownMenu<Site, SiteProvider>(
context: context, context: context,
title: context.translation.site, title: context.translation.site,
initialValue: _loanFormModel.site, initialValue: _demoFormModel.site,
showShadow: false, showShadow: false,
validator: (value) { validator: (value) {
if (value == null) return "Please select a site"; if (value == null) return "Please select a site";
@ -137,7 +160,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
backgroundColor: AppColor.fieldBgColor(context), backgroundColor: AppColor.fieldBgColor(context),
showAsBottomSheet: true, showAsBottomSheet: true,
onSelect: (value) { onSelect: (value) {
_loanFormModel.site = value; _demoFormModel.site = value;
setState(() {}); setState(() {});
}, },
), ),
@ -151,11 +174,11 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
return null; return null;
}, },
showAsBottomSheet: true, showAsBottomSheet: true,
initialValue: _loanFormModel.department, initialValue: _demoFormModel.department,
requestById: context.userProvider.user?.clientId, requestById: context.userProvider.user?.clientId,
backgroundColor: AppColor.fieldBgColor(context), backgroundColor: AppColor.fieldBgColor(context),
onSelect: (value) { onSelect: (value) {
_loanFormModel.department = value; _demoFormModel.department = value;
setState(() {}); setState(() {});
}, },
), ),
@ -179,7 +202,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
showShadow: false, showShadow: false,
textInputType: TextInputType.text, textInputType: TextInputType.text,
onChange: (value) { onChange: (value) {
_loanFormModel.docName = value; _demoFormModel.docName = value;
}, },
), ),
8.height, 8.height,
@ -196,7 +219,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
showShadow: false, showShadow: false,
textInputType: TextInputType.phone, textInputType: TextInputType.phone,
onChange: (value) { onChange: (value) {
_loanFormModel.docNumber = value; _demoFormModel.docNumber = value;
}, },
), ),
8.height, 8.height,
@ -216,7 +239,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
showShadow: false, showShadow: false,
textInputType: TextInputType.emailAddress, textInputType: TextInputType.emailAddress,
onChange: (value) { onChange: (value) {
_loanFormModel.docEmail = value; _demoFormModel.docEmail = value;
}, },
), ),
8.height, 8.height,
@ -234,16 +257,16 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
textInputType: TextInputType.text, textInputType: TextInputType.text,
textInputAction: TextInputAction.next, textInputAction: TextInputAction.next,
onChange: (value) { onChange: (value) {
_loanFormModel.itemDescription = value; _demoFormModel.itemDescription = value;
}, },
), ),
8.height, 8.height,
AppTextFormField( AppTextFormField(
labelText: "Request Description", labelText: "Request Description",
validator: (value) { // validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory"; // if ((value ?? "").isEmpty) return "Mandatory";
return null; // return null;
}, // },
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context), backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
@ -252,7 +275,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
textInputType: TextInputType.text, textInputType: TextInputType.text,
textInputAction: TextInputAction.next, textInputAction: TextInputAction.next,
onChange: (value) { onChange: (value) {
_loanFormModel.requestDescription = value; _demoFormModel.requestDescription = value;
}, },
), ),
]; ];
@ -276,7 +299,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
textInputType: TextInputType.text, textInputType: TextInputType.text,
textInputAction: TextInputAction.next, textInputAction: TextInputAction.next,
onChange: (value) { onChange: (value) {
_loanFormModel.model = value; _demoFormModel.model = value;
}, },
), ),
8.height, 8.height,
@ -294,30 +317,27 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
textInputType: TextInputType.text, textInputType: TextInputType.text,
textInputAction: TextInputAction.next, textInputAction: TextInputAction.next,
onChange: (value) { onChange: (value) {
_loanFormModel.manufacturer = value; _demoFormModel.manufacturer = value;
}, },
), ),
8.height, 8.height,
SingleItemDropDownMenu<Lookup, LoanPeriodProvider>( SingleItemDropDownMenu<Lookup, DemoPeriodLookupProvider>(
context: context, context: context,
height: 56.toScreenHeight, height: 56.toScreenHeight,
title: 'Demo Period'.addTranslation, title: "Demo Period",
initialValue: demoPeriodLookup,
showShadow: false, showShadow: false,
validator: (value) { validator: (value) {
if (value == null) return "Please select loan period"; if (value == null) return "Mandatory";
return null; return null;
}, },
backgroundColor: AppColor.fieldBgColor(context), backgroundColor: AppColor.fieldBgColor(context),
showAsBottomSheet: true, showAsBottomSheet: true,
initialValue: _loanFormModel.loanProvided, onSelect: (value) {
onSelect: (status) { demoPeriodLookup = value;
if (status != null) { setState(() {});
_loanFormModel.loanProvided = status;
setState(() {});
}
}, },
), ),
8.height,
]; ];
} }
@ -339,7 +359,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
textInputType: TextInputType.name, textInputType: TextInputType.name,
textInputAction: TextInputAction.next, textInputAction: TextInputAction.next,
onChange: (value) { onChange: (value) {
_loanFormModel.vendorName = value; _demoFormModel.vendorName = value;
}, },
), ),
8.height, 8.height,
@ -357,7 +377,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
textInputType: TextInputType.name, textInputType: TextInputType.name,
textInputAction: TextInputAction.next, textInputAction: TextInputAction.next,
onChange: (value) { onChange: (value) {
_loanFormModel.vendorRepresentativeName = value; _demoFormModel.vendorRepresentativeName = value;
}, },
), ),
8.height, 8.height,
@ -375,7 +395,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
textInputType: TextInputType.phone, textInputType: TextInputType.phone,
textInputAction: TextInputAction.next, textInputAction: TextInputAction.next,
onChange: (value) { onChange: (value) {
_loanFormModel.vendorNumber = value; _demoFormModel.vendorNumber = value;
}, },
), ),
8.height, 8.height,
@ -396,30 +416,28 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
textInputType: TextInputType.emailAddress, textInputType: TextInputType.emailAddress,
textInputAction: TextInputAction.next, textInputAction: TextInputAction.next,
onChange: (value) { onChange: (value) {
_loanFormModel.vendorEmail = value; _demoFormModel.vendorEmail = value;
}, },
), ),
]; ];
} }
Future<void> _submit() async { Future<void> _submit() async {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => DemoDetailViewPage(demoId: 0)));
return;
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
if (_formKey.currentState!.validate()) { if (_formKey.currentState!.validate()) {
_formKey.currentState!.save(); _formKey.currentState!.save();
_loanFormModel.loanAttachment = []; _demoFormModel.demoAttachment = [];
for (var item in attachments) { for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; 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); Utils.showLoading(context);
LoanProvider loanProvider = Provider.of<LoanProvider>(context, listen: false); LoanProvider loanProvider = Provider.of<LoanProvider>(context, listen: false);
Map<String, dynamic> body = _loanFormModel.toJson(); Map<String, dynamic> body = _demoFormModel.toJson();
body["id"] = 0; body["id"] = 0;
body["LoanTypeId"] = 0; // body["LoanTypeId"] = 0;
body["requestorUserID"] = context.userProvider.user!.userID; // body["requestorUserID"] = context.userProvider.user!.userID;
bool isSuccess = await loanProvider.addLoanRequest(body); bool isSuccess = await loanProvider.addLoanRequest(body);
Utils.hideLoading(context); Utils.hideLoading(context);

@ -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<DemoAttachments>? 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<String, dynamic> 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<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['attachmentTypeId'] = attachmentTypeId;
map['attachmentName'] = attachmentName;
map['demoRequestId'] = demoRequestId;
map['originalName'] = originalName;
return map;
}
}

@ -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<Lookup> {
@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;
}
}
}
Loading…
Cancel
Save