diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_claim_or_statement.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_claim_or_statement.dart new file mode 100644 index 00000000..6f96351a --- /dev/null +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_claim_or_statement.dart @@ -0,0 +1,151 @@ +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_apis/mih_claim_statement_generation_api.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_package/mih-app_tool_body.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/claim_statement_file.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/components/Claim_Statement_Window.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/list_builders/build_claim_statement_files_list.dart'; +import 'package:flutter/material.dart'; + +class PatientClaimOrStatement extends StatefulWidget { + final int patientIndex; + final Patient selectedPatient; + final AppUser signedInUser; + final Business? business; + final BusinessUser? businessUser; + final String type; + const PatientClaimOrStatement({ + super.key, + required this.patientIndex, + required this.selectedPatient, + required this.signedInUser, + required this.business, + required this.businessUser, + required this.type, + }); + + @override + State createState() => + _PatientClaimOrStatementState(); +} + +class _PatientClaimOrStatementState extends State { + late Future> futueFiles; + + void claimOrStatementWindow() { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => ClaimStatementWindow( + selectedPatient: widget.selectedPatient, + signedInUser: widget.signedInUser, + business: widget.business, + businessUser: widget.businessUser, + ), + ); + } + + List setIcons() { + if (widget.type == "personal") { + return [ + Text( + "Claims/ Statements", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + ]; + } else { + return [ + Text( + "Claims/ Statements", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + IconButton( + onPressed: () { + // new window to input fields for claim/ statements + claimOrStatementWindow(); + }, + icon: Icon( + Icons.add, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ) + ]; + } + } + + @override + void initState() { + if (widget.business == null) { + futueFiles = + MIHClaimStatementGenerationApi.getClaimStatementFilesByPatient( + widget.signedInUser.app_id); + } else { + futueFiles = + MIHClaimStatementGenerationApi.getClaimStatementFilesByBusiness( + widget.business!.business_id); + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + return MihAppToolBody( + borderOn: true, + bodyItem: getBody(), + ); + } + + Widget getBody() { + return FutureBuilder( + future: futueFiles, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center( + child: Mihloadingcircle(), + ); + } else if (snapshot.hasData) { + final filesList = snapshot.data!; + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: setIcons(), + ), + Divider( + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor()), + const SizedBox(height: 10), + //const Placeholder(), + BuildClaimStatementFileList( + files: filesList, + signedInUser: widget.signedInUser, + selectedPatient: widget.selectedPatient, + business: widget.business, + businessUser: widget.businessUser, + type: widget.type, + ), + ], + ); + } else { + return const Center( + child: Text("Error Loading Notes"), + ); + } + }, + ); + } +} diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/components/Claim_Statement_Window.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/Claim_Statement_Window.dart new file mode 100644 index 00000000..3c0b0970 --- /dev/null +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/Claim_Statement_Window.dart @@ -0,0 +1,511 @@ +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_apis/mih_claim_statement_generation_api.dart'; +import 'package:Mzansi_Innovation_Hub/mih_apis/mih_icd10_code_api.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_button.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_date_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_dropdown_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_search_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_text_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_window.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/arguments.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/icd10_code.dart.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/icd10_search_window.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class ClaimStatementWindow extends StatefulWidget { + final Patient selectedPatient; + final AppUser signedInUser; + final Business? business; + final BusinessUser? businessUser; + const ClaimStatementWindow({ + super.key, + required this.selectedPatient, + required this.signedInUser, + required this.business, + required this.businessUser, + }); + + @override + State createState() => _ClaimStatementWindowState(); +} + +class _ClaimStatementWindowState extends State { + final TextEditingController _docTypeController = TextEditingController(); + final TextEditingController _fullNameController = TextEditingController(); + final TextEditingController _idController = TextEditingController(); + final TextEditingController _medAidController = TextEditingController(); + final TextEditingController _medAidNoController = TextEditingController(); + final TextEditingController _medAidCodeController = TextEditingController(); + final TextEditingController _medAidNameController = TextEditingController(); + final TextEditingController _medAidSchemeController = TextEditingController(); + final TextEditingController _providerNameController = TextEditingController(); + final TextEditingController _practiceNoController = TextEditingController(); + final TextEditingController _vatNoController = TextEditingController(); + final TextEditingController _serviceDateController = TextEditingController(); + final TextEditingController _serviceDescController = TextEditingController(); + final TextEditingController _serviceDescOptionsController = + TextEditingController(); + final TextEditingController _prcedureNameController = TextEditingController(); + // final TextEditingController _procedureDateController = + // TextEditingController(); + final TextEditingController _proceedureAdditionalInfoController = + TextEditingController(); + final TextEditingController _icd10CodeController = TextEditingController(); + final TextEditingController _amountController = TextEditingController(); + final TextEditingController _preauthNoController = TextEditingController(); + final ValueNotifier serviceDesc = ValueNotifier(""); + final ValueNotifier medAid = ValueNotifier(""); + List icd10codeList = []; + + void icd10SearchWindow(List codeList) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => ICD10SearchWindow( + icd10CodeController: _icd10CodeController, + icd10codeList: codeList, + ), + ); + } + + Widget getWindowBody() { + return Column( + children: [ + MIHDropdownField( + controller: _docTypeController, + hintText: "Document Type", + dropdownOptions: const ["Claim", "Statement"], + required: true, + editable: true, + enableSearch: false, + ), + const SizedBox(height: 10), + // Text( + // "Patient Details", + // textAlign: TextAlign.center, + // style: TextStyle( + // fontSize: 20, + // fontWeight: FontWeight.bold, + // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + // ), + // ), + // Divider(color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), + // const SizedBox(height: 10), + // MIHTextField( + // controller: _fullNameController, + // hintText: "Full Name", + // editable: false, + // required: true, + // ), + // const SizedBox(height: 10), + // MIHTextField( + // controller: _idController, + // hintText: "ID No.", + // editable: false, + // required: true, + // ), + // const SizedBox(height: 10), + // MIHTextField( + // controller: _medAidController, + // hintText: "Has Medical Aid", + // editable: false, + // required: true, + // ), + // const SizedBox(height: 10), + // ValueListenableBuilder( + // valueListenable: serviceDesc, + // builder: (BuildContext context, String value, Widget? child) { + // return Visibility( + // visible: value == "Yes", + // child: Column( + // children: [ + // MIHTextField( + // controller: _medAidNoController, + // hintText: "Medical Aid No.", + // editable: false, + // required: true, + // ), + // const SizedBox(height: 10), + // MIHTextField( + // controller: _medAidCodeController, + // hintText: "Medical Aid Code", + // editable: false, + // required: true, + // ), + // const SizedBox(height: 10), + // MIHTextField( + // controller: _medAidNameController, + // hintText: "Medical Aid Name", + // editable: false, + // required: true, + // ), + // const SizedBox(height: 10), + // MIHTextField( + // controller: _medAidSchemeController, + // hintText: "Medical Aid Scheme", + // editable: false, + // required: true, + // ), + // const SizedBox(height: 10), + // ], + // ), + // ); + // }, + // ), + // Text( + // "Provider Details", + // textAlign: TextAlign.center, + // style: TextStyle( + // fontSize: 20, + // fontWeight: FontWeight.bold, + // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + // ), + // ), + // Divider(color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), + // const SizedBox(height: 10), + // MIHTextField( + // controller: _providerNameController, + // hintText: "Provider Name", + // editable: false, + // required: true, + // ), + // const SizedBox(height: 10), + // MIHTextField( + // controller: _practiceNoController, + // hintText: "Practice No.", + // editable: false, + // required: true, + // ), + // const SizedBox(height: 10), + // MIHTextField( + // controller: _vatNoController, + // hintText: "VAT No.", + // editable: false, + // required: true, + // ), + // const SizedBox(height: 10), + Text( + "Service Details", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + Divider(color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), + const SizedBox(height: 10), + MIHDateField( + controller: _serviceDateController, + lableText: "Date of Service", + required: true, + ), + const SizedBox(height: 10), + MIHDropdownField( + controller: _serviceDescController, + hintText: "Service Decription", + dropdownOptions: const [ + "Consultation", + "Procedure", + "Other", + ], + required: true, + editable: true, + enableSearch: false, + ), + const SizedBox(height: 10), + ValueListenableBuilder( + valueListenable: serviceDesc, + builder: (BuildContext context, String value, Widget? child) { + Widget returnWidget; + switch (value) { + case 'Consultation': + returnWidget = Column( + children: [ + MIHDropdownField( + controller: _serviceDescOptionsController, + hintText: "Service Decription Options", + dropdownOptions: const [ + "General Consultation", + "Follow-Up Consultation", + "Specialist Consultation", + "Emergency Consultation", + ], + required: true, + editable: true, + enableSearch: false, + ), + const SizedBox(height: 10), + ], + ); + case 'Procedure': + returnWidget = Column( + children: [ + MIHTextField( + controller: _prcedureNameController, + hintText: "Procedure Name", + editable: true, + required: true, + ), + const SizedBox(height: 10), + // MIHDateField( + // controller: _procedureDateController, + // lableText: "Procedure Date", + // required: true, + // ), + // const SizedBox(height: 10), + MIHTextField( + controller: _proceedureAdditionalInfoController, + hintText: "Additional Information", + editable: true, + required: true, + ), + const SizedBox(height: 10), + ], + ); + case 'Other': + returnWidget = Column( + children: [ + MIHTextField( + controller: _serviceDescOptionsController, + hintText: "Service Decription text", + editable: false, + required: true, + ), + const SizedBox(height: 10), + ], + ); + default: + returnWidget = const SizedBox(); + } + return returnWidget; + }, + ), + //const SizedBox(height: 10), + MIHSearchField( + controller: _icd10CodeController, + hintText: "ICD-10 Code & Description", + required: true, + editable: true, + onTap: () { + //api + MIHIcd10CodeApis.getIcd10Codes(_icd10CodeController.text, context) + .then((result) { + icd10SearchWindow(result); + }); + }, + ), + const SizedBox(height: 10), + MIHTextField( + controller: _amountController, + hintText: "Amount", + editable: true, + required: true, + ), + Text( + "Additional Infomation", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + Divider(color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), + const SizedBox(height: 10), + MIHTextField( + controller: _preauthNoController, + hintText: "Pre-authorisation No.", + editable: true, + required: false, + ), + const SizedBox(height: 15), + SizedBox( + width: 500, + height: 50, + child: MIHButton( + onTap: () { + //generate document and uploud it + if (isInputValid()) { + MIHClaimStatementGenerationApi().generateClaimStatement( + ClaimStatementGenerationArguments( + _docTypeController.text, + widget.selectedPatient.app_id, + _fullNameController.text, + _idController.text, + _medAidController.text, + _medAidNoController.text, + _medAidCodeController.text, + _medAidNameController.text, + _medAidSchemeController.text, + widget.business!.Name, + "*To-Be Added*", + widget.business!.contact_no, + widget.business!.bus_email, + _providerNameController.text, + _practiceNoController.text, + _vatNoController.text, + _serviceDateController.text, + _serviceDescController.text, + _serviceDescOptionsController.text, + _prcedureNameController.text, + _proceedureAdditionalInfoController.text, + _icd10CodeController.text, + _amountController.text, + _preauthNoController.text, + widget.business!.logo_path, + widget.businessUser!.sig_path, + ), + PatientViewArguments( + widget.signedInUser, + widget.selectedPatient, + widget.businessUser, + widget.business, + "business", + ), + context); + } else { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Input Error"); + }, + ); + } + }, + buttonText: "Generate", + buttonColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + textColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + ) + ], + ); + } + + void serviceDescriptionSelected() { + if (_serviceDescController.text.isNotEmpty) { + serviceDesc.value = _serviceDescController.text; + } else { + serviceDesc.value = ""; + } + } + + void hasMedAid() { + if (_medAidController.text.isNotEmpty) { + medAid.value = _medAidController.text; + } else { + medAid.value = ""; + } + } + + bool isInputValid() { + switch (_serviceDescController.text) { + case 'Procedure': + if (_docTypeController.text.isEmpty || + _serviceDateController.text.isEmpty || + _icd10CodeController.text.isEmpty || + _amountController.text.isEmpty || + _prcedureNameController.text.isEmpty || + _proceedureAdditionalInfoController.text.isEmpty) { + return false; + } else { + return true; + } + default: + if (_docTypeController.text.isEmpty || + _serviceDateController.text.isEmpty || + _icd10CodeController.text.isEmpty || + _amountController.text.isEmpty || + _serviceDescOptionsController.text.isEmpty) { + return false; + } else { + return true; + } + } + } + + String getUserTitle() { + if (widget.businessUser!.title == "Doctor") { + return "Dr."; + } else { + return widget.businessUser!.title; + } + } + + String getTodayDate() { + DateTime today = DateTime.now(); + return DateFormat('yyyy-MM-dd').format(today); + } + + @override + void dispose() { + _docTypeController.dispose(); + _fullNameController.dispose(); + _idController.dispose(); + _medAidController.dispose(); + _medAidNoController.dispose(); + _medAidCodeController.dispose(); + _medAidNameController.dispose(); + _medAidSchemeController.dispose(); + _providerNameController.dispose(); + _practiceNoController.dispose(); + _vatNoController.dispose(); + _serviceDateController.dispose(); + _serviceDescController.dispose(); + _serviceDescOptionsController.dispose(); + _prcedureNameController.dispose(); + // _procedureDateController.dispose(); + _proceedureAdditionalInfoController.dispose(); + _icd10CodeController.dispose(); + _preauthNoController.dispose(); + super.dispose(); + } + + @override + void initState() { + _serviceDescController.addListener(serviceDescriptionSelected); + _medAidController.addListener(hasMedAid); + _fullNameController.text = + "${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}"; + _idController.text = widget.selectedPatient.id_no; + _medAidController.text = widget.selectedPatient.medical_aid; + _medAidNameController.text = widget.selectedPatient.medical_aid_name; + _medAidCodeController.text = widget.selectedPatient.medical_aid_code; + _medAidNoController.text = widget.selectedPatient.medical_aid_no; + _medAidSchemeController.text = widget.selectedPatient.medical_aid_scheme; + _serviceDateController.text = getTodayDate(); + _providerNameController.text = + "${getUserTitle()} ${widget.signedInUser.fname} ${widget.signedInUser.lname}"; + _practiceNoController.text = widget.business!.practice_no; + _vatNoController.text = widget.business!.vat_no; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return MIHWindow( + fullscreen: false, + windowTitle: "Generate Claim/ Statement Document", + windowTools: const [], + onWindowTapClose: () { + // medicineController.clear(); + // quantityController.clear(); + // dosageController.clear(); + // timesDailyController.clear(); + // noDaysController.clear(); + // noRepeatsController.clear(); + Navigator.pop(context); + }, + windowBody: [ + getWindowBody(), + ], + ); + } +} diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/components/prescip_input.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/prescip_input.dart new file mode 100644 index 00000000..411fcaff --- /dev/null +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/prescip_input.dart @@ -0,0 +1,573 @@ +import 'dart:convert'; + +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/medicine_search.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_button.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_dropdown_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_search_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_success_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_env/env.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/arguments.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/perscription.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:supertokens_flutter/http.dart' as http; + +class PrescripInput extends StatefulWidget { + final TextEditingController medicineController; + final TextEditingController quantityController; + final TextEditingController dosageController; + final TextEditingController timesDailyController; + final TextEditingController noDaysController; + final TextEditingController noRepeatsController; + final TextEditingController outputController; + final Patient selectedPatient; + final AppUser signedInUser; + final Business? business; + final BusinessUser? businessUser; + const PrescripInput({ + super.key, + required this.medicineController, + required this.quantityController, + required this.dosageController, + required this.timesDailyController, + required this.noDaysController, + required this.noRepeatsController, + required this.outputController, + required this.selectedPatient, + required this.signedInUser, + required this.business, + required this.businessUser, + }); + + @override + State createState() => _PrescripInputState(); +} + +class _PrescripInputState extends State { + final FocusNode _focusNode = FocusNode(); + List perscriptionObjOutput = []; + late double width; + late double height; + + final numberOptions = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27", + "28", + "29", + "30" + ]; + + Future generatePerscription() async { + //start loading circle + showDialog( + context: context, + builder: (context) { + return const Mihloadingcircle(); + }, + ); + + var response1 = await http.post( + Uri.parse("${AppEnviroment.baseApiUrl}/minio/generate/perscription/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "app_id": widget.selectedPatient.app_id, + "fullName": + "${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}", + "id_no": widget.selectedPatient.id_no, + "docfname": + "DR. ${widget.signedInUser.fname} ${widget.signedInUser.lname}", + "busName": widget.business!.Name, + "busAddr": "*TO BE ADDED IN THE FUTURE*", + "busNo": widget.business!.contact_no, + "busEmail": widget.business!.bus_email, + "logo_path": widget.business!.logo_path, + "sig_path": widget.businessUser!.sig_path, + "data": perscriptionObjOutput, + }), + ); + //print(response1.statusCode); + DateTime now = new DateTime.now(); + DateTime date = new DateTime(now.year, now.month, now.day); + String fileName = + "Perscription-${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}-${date.toString().substring(0, 10)}.pdf"; + if (response1.statusCode == 200) { + var response2 = await http.post( + Uri.parse("${AppEnviroment.baseApiUrl}/files/insert/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "file_path": + "${widget.selectedPatient.app_id}/patient_files/$fileName", + "file_name": fileName, + "app_id": widget.selectedPatient.app_id + }), + ); + //print(response2.statusCode); + if (response2.statusCode == 201) { + setState(() { + //To do + widget.medicineController.clear(); + widget.dosageController.clear(); + widget.timesDailyController.clear(); + widget.noDaysController.clear(); + widget.timesDailyController.clear(); + widget.noRepeatsController.clear(); + widget.quantityController.clear(); + widget.outputController.clear(); + // futueFiles = fetchFiles(); + }); + // end loading circle + Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.of(context).pushNamed('/patient-manager/patient', + arguments: PatientViewArguments( + widget.signedInUser, + widget.selectedPatient, + widget.businessUser, + widget.business, + "business", + )); + String message = + "The perscription $fileName has been successfully generated and added to ${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}'s record. You can now access and download it for their use."; + successPopUp(message); + } else { + internetConnectionPopUp(); + } + } else { + internetConnectionPopUp(); + } + } + + void internetConnectionPopUp() { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Internet Connection"); + }, + ); + } + + void successPopUp(String message) { + showDialog( + context: context, + builder: (context) { + return MIHSuccessMessage( + successType: "Success", + successMessage: message, + ); + }, + ); + } + + void getMedsPopUp(TextEditingController medSearch) { + showDialog( + context: context, + builder: (context) { + return MedicineSearch( + searchVlaue: medSearch, + ); + }, + ); + } + + bool isFieldsFilled() { + if (widget.medicineController.text.isEmpty || + // widget.quantityController.text.isEmpty || + widget.dosageController.text.isEmpty || + widget.timesDailyController.text.isEmpty || + widget.noDaysController.text.isEmpty || + widget.noRepeatsController.text.isEmpty) { + return false; + } else { + return true; + } + } + + void updatePerscriptionList() { + String name; + String unit; + String form; + List medNameList = widget.medicineController.text.split("%t"); + if (medNameList.length == 1) { + name = medNameList[0]; + unit = ""; + form = ""; + } else { + name = medNameList[0]; + unit = medNameList[1]; + form = medNameList[2]; + } + int quantityCalc = calcQuantity( + widget.dosageController.text, + widget.timesDailyController.text, + widget.noDaysController.text, + medNameList[2].toLowerCase()); + Perscription tempObj = Perscription( + name: name, + unit: unit, + form: form, + fullForm: getFullDoagesForm(form), + quantity: "$quantityCalc", + dosage: widget.dosageController.text, + times: widget.timesDailyController.text, + days: widget.noDaysController.text, + repeats: widget.noRepeatsController.text, + ); + perscriptionObjOutput.add(tempObj); + } + + String getPerscTitle(int index) { + return "${perscriptionObjOutput[index].name} - ${perscriptionObjOutput[index].form}"; + } + + String getPerscSubtitle(int index) { + if (perscriptionObjOutput[index].form.toLowerCase() == "syr") { + String unit = perscriptionObjOutput[index].unit.toLowerCase(); + if (perscriptionObjOutput[index].unit.toLowerCase().contains("ml")) { + unit = "ml"; + } + return "${perscriptionObjOutput[index].dosage} $unit, ${perscriptionObjOutput[index].times} time(s) daily, for ${perscriptionObjOutput[index].days} day(s)\nQuantity: ${perscriptionObjOutput[index].quantity}\nNo. of repeats: ${perscriptionObjOutput[index].repeats}"; + } else { + return "${perscriptionObjOutput[index].dosage} ${perscriptionObjOutput[index].fullForm}(s), ${perscriptionObjOutput[index].times} time(s) daily, for ${perscriptionObjOutput[index].days} day(s)\nQuantity: ${perscriptionObjOutput[index].quantity}\nNo. of repeats: ${perscriptionObjOutput[index].repeats}"; + } + } + + String getFullDoagesForm(String abr) { + var dosageFormList = { + "liq": "liquid", + "tab": "tablet", + "cap": "capsule", + "cps": "capsule", + "oin": "ointment", + "lit": "lotion", + "lot": "lotion", + "inj": "injection", + "syr": "syrup", + "dsp": "effervescent tablet", + "eft": "effervescent tablet", + "ear": "drops", + "drp": "drops", + "opd": "drops", + "udv": "vial", + "sus": "suspension", + "susp": "suspension", + "cal": "calasthetic", + "sol": "solution", + "sln": "solution", + "neb": "nebuliser", + "inh": "inhaler", + "spo": "inhaler", + "inf": "infusion", + "chg": "chewing Gum", + "vac": "vacutainer", + "vag": "vaginal gel", + "jel": "gel", + "eyo": "eye ointment", + "vat": "vaginal cream", + "poi": "injection", + "ped": "powder", + "pow": "powder", + "por": "powder", + "sac": "sachet", + "sup": "suppository", + "cre": "cream", + "ptd": "patch", + "ect": "tablet", + "nas": "spray", + }; + String form; + if (dosageFormList[abr.toLowerCase()] == null) { + form = abr; + } else { + form = dosageFormList[abr.toLowerCase()]!; + } + return form; + } + + int calcQuantity(String dosage, String times, String days, String form) { + var dosageFormList = [ + "tab", + "cap", + "cps", + "dsp", + "eft", + "udv", + "chg", + "sac", + "sup", + "ptd", + "ect", + ]; + if (dosageFormList.contains(form)) { + return int.parse(dosage) * int.parse(times) * int.parse(days); + } else { + return 1; + } + } + + Widget displayMedInput() { + return Column( + children: [ + //const SizedBox(height: 25.0), + + KeyboardListener( + focusNode: _focusNode, + autofocus: true, + onKeyEvent: (event) async { + if (event is KeyDownEvent && + event.logicalKey == LogicalKeyboardKey.enter) { + getMedsPopUp(widget.medicineController); + } + }, + child: MIHSearchField( + controller: widget.medicineController, + hintText: "Medicine", + required: true, + editable: true, + onTap: () { + getMedsPopUp(widget.medicineController); + }, + ), + ), + const SizedBox(height: 10.0), + // SizedBox( + // width: 300, + // child: MIHDropdownField( + // controller: widget.quantityController, + // hintText: "Quantity", + // dropdownOptions: numberOptions, + // required: true, + // editable: true, + // ), + // ), + // const SizedBox(height: 10.0), + MIHDropdownField( + controller: widget.dosageController, + hintText: "Dosage", + dropdownOptions: numberOptions, + required: true, + editable: true, + enableSearch: false, + ), + const SizedBox(height: 10.0), + MIHDropdownField( + controller: widget.timesDailyController, + hintText: "Times Daily", + dropdownOptions: numberOptions, + required: true, + editable: true, + enableSearch: false, + ), + const SizedBox(height: 10.0), + MIHDropdownField( + controller: widget.noDaysController, + hintText: "No. Days", + dropdownOptions: numberOptions, + required: true, + editable: true, + enableSearch: false, + ), + const SizedBox(height: 10.0), + MIHDropdownField( + controller: widget.noRepeatsController, + hintText: "No. Repeats", + dropdownOptions: numberOptions, + required: true, + editable: true, + enableSearch: false, + ), + const SizedBox(height: 15.0), + SizedBox( + width: 300, + height: 50, + child: MIHButton( + buttonText: "Add", + buttonColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + textColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + onTap: () { + if (isFieldsFilled()) { + // int quantity; + // int.parse(widget.dosageController.text) * + // int.parse(widget.timesDailyController.text) * + // int.parse(widget.noDaysController.text); + setState(() { + //widget.quantityController.text = "$quantity"; + updatePerscriptionList(); + widget.medicineController.clear(); + widget.quantityController.clear(); + widget.dosageController.clear(); + widget.timesDailyController.clear(); + widget.noDaysController.clear(); + widget.noRepeatsController.clear(); + }); + + //addPatientAPICall(); + } else { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Input Error"); + }, + ); + } + }, + ), + ) + ], + ); + } + + Widget displayPerscList() { + return Column( + children: [ + Container( + width: 550, + height: 325, + decoration: BoxDecoration( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + borderRadius: BorderRadius.circular(25.0), + border: Border.all( + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + width: 3.0), + ), + child: ListView.separated( + separatorBuilder: (BuildContext context, int index) { + return const Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Divider(), + ); + }, + itemCount: perscriptionObjOutput.length, + itemBuilder: (context, index) { + //final patient = widget.patients[index].id_no.contains(widget.searchString); + return ListTile( + title: Text( + getPerscTitle(index), + style: TextStyle( + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + subtitle: Text( + getPerscSubtitle(index), + style: TextStyle( + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + //onTap: () {}, + trailing: IconButton( + icon: Icon( + Icons.delete_forever_outlined, + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + onPressed: () { + setState(() { + perscriptionObjOutput.removeAt(index); + }); + }, + ), + ); + }, + ), + ), + const SizedBox(height: 15.0), + SizedBox( + width: 300, + height: 50, + child: MIHButton( + onTap: () async { + if (perscriptionObjOutput.isNotEmpty) { + //print(jsonEncode(perscriptionObjOutput)); + await generatePerscription(); + Navigator.pop(context); + } else { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Input Error"); + }, + ); + } + }, + buttonText: "Generate", + buttonColor: MzanziInnovationHub.of(context)!.theme.successColor(), + textColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + ) + ], + ); + } + + @override + void dispose() { + _focusNode.dispose(); + super.dispose(); + } + + @override + void initState() { + //futueMeds = getMedList(endpointMeds); + super.initState(); + } + + @override + Widget build(BuildContext context) { + var size = MediaQuery.of(context).size; + setState(() { + width = size.width; + height = size.height; + }); + return Wrap( + direction: Axis.horizontal, + alignment: WrapAlignment.center, + spacing: 10, + runSpacing: 10, + // mainAxisAlignment: MainAxisAlignment.center, + // mainAxisSize: MainAxisSize.max, + // crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox(width: 500, child: displayMedInput()), + displayPerscList(), + ], + ); + } +}