From 1b7014498fe801c1e4e113d32f05d6f0620accd6 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Sun, 26 Nov 2023 17:54:45 +0530 Subject: [PATCH 01/70] Flutter version upgrade (#657) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Flutter version upgrade Flutter 3.16.0 • channel stable • https://github.com/flutter/flutter.git Framework • revision db7ef5bf9f (10 days ago) • 2023-11-15 11:25:44 -0800 Engine • revision 74d16627b9 Tools • Dart 3.2.0 • DevTools 2.28.2 * fixes for supporting latest version * privacy policy placeholder * privacy policy placeholder * dartfix latest * build gradle upgrade * ios fixes * config changes * updated Deperacated cirrusci to cirruslabs * PFM-5044 * PFM-4878 --- frontend/mgramseva/.metadata | 39 +- frontend/mgramseva/README.md | 1 + .../android/app/src/main/AndroidManifest.xml | 10 +- frontend/mgramseva/android/build.gradle | 8 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- frontend/mgramseva/docker/Dockerfile | 2 +- .../integration_test/add_expense.dart | 2 - .../integration_test/dashboard_test.dart | 6 +- .../forgot_password_test.dart | 4 - .../integration_test/log_out_test.dart | 1 - .../integration_test/login_test.dart | 5 - .../integration_test/update_expense.dart | 1 - frontend/mgramseva/ios/Podfile | 2 +- frontend/mgramseva/ios/Podfile.lock | 297 +++++ .../ios/Runner.xcodeproj/project.pbxproj | 7 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- frontend/mgramseva/ios/Runner/Info.plist | 2 + .../lib/components/dashboard/bills_table.dart | 2 - .../components/dashboard/dashboard_card.dart | 2 +- .../consumer_bill_payment.dart | 44 +- .../generate_new_bill.dart | 4 +- .../new_consumer_bill.dart | 25 +- frontend/mgramseva/lib/env/app_config.dart | 20 + frontend/mgramseva/lib/main.dart | 32 +- .../mgramseva/lib/model/common/demand.dart | 1 - .../lib/model/dashboard/revenue_chart.dart | 2 +- .../expenses_details/expenses_details.dart | 3 - .../lib/model/expenses_details/vendor.dart | 2 - .../mgramseva/lib/model/file/file_store.dart | 1 - .../lib/model/localization/language.dart | 2 +- .../localization/localization_label.dart | 1 - .../lib/model/mdms/payment_type.dart | 2 +- .../mgramseva/lib/model/mdms/tax_period.dart | 5 + .../mgramseva/lib/model/success_handler.dart | 1 - .../providers/authentication_provider.dart | 38 +- .../bill_generation_details_provider.dart | 210 ++- .../change_password_details_provider.dart | 14 +- .../providers/collect_payment_provider.dart | 11 +- .../lib/providers/common_provider.dart | 8 +- .../providers/consumer_details_provider.dart | 111 +- .../lib/providers/dashboard_provider.dart | 60 +- .../providers/expenses_details_provider.dart | 21 +- .../lib/providers/fetch_bill_provider.dart | 18 +- .../providers/forgot_password_provider.dart | 8 +- .../providers/household_details_provider.dart | 3 +- .../household_register_provider.dart | 89 +- .../notification_screen_provider.dart | 2 +- .../lib/providers/notifications_provider.dart | 2 +- .../lib/providers/reports_provider.dart | 105 +- .../providers/revenue_dashboard_provider.dart | 2 +- .../providers/search_connection_provider.dart | 48 +- .../lib/providers/tenants_provider.dart | 8 +- .../providers/user_edit_profile_provider.dart | 26 +- .../lib/providers/user_profile_provider.dart | 8 +- .../mgramseva/lib/repository/core_repo.dart | 21 +- frontend/mgramseva/lib/routing.dart | 2 +- .../expense_walk_through.dart | 1 + .../screeens/add_expense/expense_details.dart | 89 +- .../change_password/change_password.dart | 2 +- .../lib/screeens/common/payment_failure.dart | 2 +- .../connection_details_card.dart | 2 - .../connection_results.dart | 3 +- .../connection_results/search_connection.dart | 4 +- .../consumer_details/consumer_details.dart | 15 +- .../walk_through.dart | 3 + .../walkthrough_1.dart | 3 + .../lib/screeens/dashboard/IndividualTab.dart | 4 +- .../screeens/dashboard/individual_tab.dart | 4 +- .../custom_tooltip_label_render.dart | 11 +- .../revenue_expense_dashboard/revenue.dart | 4 +- .../revenue_charts.dart | 2 +- .../lib/screeens/expense/expense_results.dart | 2 +- .../lib/screeens/expense/search_expense.dart | 6 +- .../lib/screeens/feedback/feed_back.dart | 2 +- .../screeens/generate_bill/generate_bill.dart | 15 +- .../gpwsc_boundary_detail_card.dart | 1 - .../gpwsc_details/gpwsc_rate_card.dart | 5 +- .../mgramseva/lib/screeens/home/home.dart | 2 +- .../home_walk_through_container.dart | 15 +- .../household_detail/household_detail.dart | 2 +- .../household_register/household_list.dart | 2 +- .../mgramseva/lib/screeens/login/login.dart | 1 + .../notifications/notification_screen.dart | 2 +- .../password_success/password_success.dart | 2 - .../privacy_and_terms/PrivacyAndTerms.dart | 5 +- .../lib/screeens/profile/edit_profile.dart | 2 +- .../lib/screeens/reports/bill_report.dart | 2 - .../screeens/reports/collection_report.dart | 2 - .../reports/generic_report_table.dart | 3 - .../reports/inactive_consumer_report.dart | 2 - .../lib/screeens/reports/reports.dart | 9 +- .../lib/screeens/reports/view_table.dart | 2 - .../reset_password/reset_password.dart | 14 +- .../language_selection_desktop_view.dart | 2 - frontend/mgramseva/lib/theme.dart | 26 +- .../mgramseva/lib/utils/common_printer.dart | 103 -- .../mgramseva/lib/utils/common_widgets.dart | 2 +- .../mgramseva/lib/utils/date_formats.dart | 16 +- .../excel_download/save_file_mobile.dart | 8 +- .../utils/excel_download/save_file_web.dart | 4 +- frontend/mgramseva/lib/utils/loaders.dart | 2 +- .../application_localizations.dart | 2 - frontend/mgramseva/lib/utils/notifiers.dart | 3 + .../mgramseva/lib/utils/print_bluetooth.dart | 109 -- .../lib/utils/printer/image_utils.dart | 47 + .../lib/utils/validators/validators.dart | 1 - .../lib/widgets/bluetooth_printer.dart | 432 +++++++ .../lib/widgets/bottom_button_bar.dart | 3 +- frontend/mgramseva/lib/widgets/button.dart | 5 +- .../mgramseva/lib/widgets/button_group.dart | 20 +- .../mgramseva/lib/widgets/custom_app_bar.dart | 15 +- .../mgramseva/lib/widgets/file_picker.dart | 4 +- .../mgramseva/lib/widgets/label_text.dart | 2 +- .../mgramseva/lib/widgets/pagination.dart | 2 +- .../widgets/radio_button_field_builder.dart | 3 +- .../widgets/search_select_field_builder.dart | 37 +- .../lib/widgets/select_field_builder.dart | 71 +- .../mgramseva/lib/widgets/short_button.dart | 5 +- .../mgramseva/lib/widgets/success_page.dart | 12 +- .../mgramseva/lib/widgets/toast/toster.dart | 2 +- frontend/mgramseva/pubspec.lock | 1130 +++++++++++------ frontend/mgramseva/pubspec.yaml | 47 +- frontend/mgramseva/web/index.html | 138 +- 123 files changed, 2434 insertions(+), 1423 deletions(-) create mode 100644 frontend/mgramseva/ios/Podfile.lock delete mode 100644 frontend/mgramseva/lib/utils/common_printer.dart delete mode 100644 frontend/mgramseva/lib/utils/print_bluetooth.dart create mode 100644 frontend/mgramseva/lib/utils/printer/image_utils.dart create mode 100644 frontend/mgramseva/lib/widgets/bluetooth_printer.dart diff --git a/frontend/mgramseva/.metadata b/frontend/mgramseva/.metadata index 56bfc2c4d..d22992edb 100644 --- a/frontend/mgramseva/.metadata +++ b/frontend/mgramseva/.metadata @@ -4,7 +4,42 @@ # This file should be version controlled and should not be manually edited. version: - revision: f4abaa0735eba4dfd8f33f73363911d63931fe03 - channel: stable + revision: "db7ef5bf9f59442b0e200a90587e8fa5e0c6336a" + channel: "stable" project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + - platform: android + create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + - platform: ios + create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + - platform: linux + create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + - platform: macos + create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + - platform: web + create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + - platform: windows + create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/frontend/mgramseva/README.md b/frontend/mgramseva/README.md index 02c1210a3..968155668 100644 --- a/frontend/mgramseva/README.md +++ b/frontend/mgramseva/README.md @@ -8,6 +8,7 @@ mGramSeva is a Hybrid Application (web + App(Android + IOS)) built using Open So ## Commands for flutter - **flutter run** : Command to run the app +- **flutter run --no-enable-impeller** : Command to run the app on mac virtual machine without GPU Passthrough - **flutter build web** : Command to build web - **flutter build apk --release** : Command to build the apk of the application diff --git a/frontend/mgramseva/android/app/src/main/AndroidManifest.xml b/frontend/mgramseva/android/app/src/main/AndroidManifest.xml index 5e9b650e1..b97fd4e28 100644 --- a/frontend/mgramseva/android/app/src/main/AndroidManifest.xml +++ b/frontend/mgramseva/android/app/src/main/AndroidManifest.xml @@ -1,8 +1,11 @@ - - + + + + + @@ -14,7 +17,8 @@ 10.18.0) + - Firebase/CoreOnly (10.18.0): + - FirebaseCore (= 10.18.0) + - firebase_analytics (10.7.1): + - Firebase/Analytics (= 10.18.0) + - firebase_core + - Flutter + - firebase_core (2.23.0): + - Firebase/CoreOnly (= 10.18.0) + - Flutter + - FirebaseAnalytics (10.18.0): + - FirebaseAnalytics/AdIdSupport (= 10.18.0) + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseAnalytics/AdIdSupport (10.18.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleAppMeasurement (= 10.18.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseCore (10.18.0): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.12) + - GoogleUtilities/Logger (~> 7.12) + - FirebaseCoreInternal (10.18.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseInstallations (10.18.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - PromisesObjC (~> 2.1) + - Flutter (1.0.0) + - flutter_downloader (0.0.1): + - Flutter + - flutter_keyboard_visibility (0.0.1): + - Flutter + - flutter_secure_storage (3.3.1): + - Flutter + - flutter_share_me (0.0.1): + - FBSDKCoreKit (~> 14.0.0) + - FBSDKLoginKit (~> 14.0.0) + - FBSDKShareKit (~> 14.0.0) + - Flutter + - GoogleAppMeasurement (10.18.0): + - GoogleAppMeasurement/AdIdSupport (= 10.18.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement/AdIdSupport (10.18.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 10.18.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement/WithoutAdIdSupport (10.18.0): + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleUtilities/AppDelegateSwizzler (7.12.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (7.12.0): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.12.0): + - GoogleUtilities/Environment + - GoogleUtilities/MethodSwizzler (7.12.0): + - GoogleUtilities/Logger + - GoogleUtilities/Network (7.12.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.12.0)" + - GoogleUtilities/Reachability (7.12.0): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (7.12.0): + - GoogleUtilities/Logger + - image_picker_ios (0.0.1): + - Flutter + - integration_test (0.0.1): + - Flutter + - nanopb (2.30909.1): + - nanopb/decode (= 2.30909.1) + - nanopb/encode (= 2.30909.1) + - nanopb/decode (2.30909.1) + - nanopb/encode (2.30909.1) + - open_filex (0.0.2): + - Flutter + - package_info_plus (0.4.5): + - Flutter + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - "permission_handler (5.1.0+2)": + - Flutter + - print_bluetooth_thermal (0.0.1): + - Flutter + - printing (1.0.0): + - Flutter + - PromisesObjC (2.3.1) + - SDWebImage (5.18.5): + - SDWebImage/Core (= 5.18.5) + - SDWebImage/Core (5.18.5) + - SwiftyGif (5.4.4) + - url_launcher_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - bluetooth_thermal_printer (from `.symlinks/plugins/bluetooth_thermal_printer/ios`) + - charset_converter (from `.symlinks/plugins/charset_converter/ios`) + - file_picker (from `.symlinks/plugins/file_picker/ios`) + - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - Flutter (from `Flutter`) + - flutter_downloader (from `.symlinks/plugins/flutter_downloader/ios`) + - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) + - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) + - flutter_share_me (from `.symlinks/plugins/flutter_share_me/ios`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + - integration_test (from `.symlinks/plugins/integration_test/ios`) + - open_filex (from `.symlinks/plugins/open_filex/ios`) + - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - permission_handler (from `.symlinks/plugins/permission_handler/ios`) + - print_bluetooth_thermal (from `.symlinks/plugins/print_bluetooth_thermal/ios`) + - printing (from `.symlinks/plugins/printing/ios`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + +SPEC REPOS: + trunk: + - DKImagePickerController + - DKPhotoGallery + - FBAEMKit + - FBSDKCoreKit + - FBSDKCoreKit_Basics + - FBSDKLoginKit + - FBSDKShareKit + - Firebase + - FirebaseAnalytics + - FirebaseCore + - FirebaseCoreInternal + - FirebaseInstallations + - GoogleAppMeasurement + - GoogleUtilities + - nanopb + - PromisesObjC + - SDWebImage + - SwiftyGif + +EXTERNAL SOURCES: + bluetooth_thermal_printer: + :path: ".symlinks/plugins/bluetooth_thermal_printer/ios" + charset_converter: + :path: ".symlinks/plugins/charset_converter/ios" + file_picker: + :path: ".symlinks/plugins/file_picker/ios" + firebase_analytics: + :path: ".symlinks/plugins/firebase_analytics/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + Flutter: + :path: Flutter + flutter_downloader: + :path: ".symlinks/plugins/flutter_downloader/ios" + flutter_keyboard_visibility: + :path: ".symlinks/plugins/flutter_keyboard_visibility/ios" + flutter_secure_storage: + :path: ".symlinks/plugins/flutter_secure_storage/ios" + flutter_share_me: + :path: ".symlinks/plugins/flutter_share_me/ios" + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + integration_test: + :path: ".symlinks/plugins/integration_test/ios" + open_filex: + :path: ".symlinks/plugins/open_filex/ios" + package_info_plus: + :path: ".symlinks/plugins/package_info_plus/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + permission_handler: + :path: ".symlinks/plugins/permission_handler/ios" + print_bluetooth_thermal: + :path: ".symlinks/plugins/print_bluetooth_thermal/ios" + printing: + :path: ".symlinks/plugins/printing/ios" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + +SPEC CHECKSUMS: + bluetooth_thermal_printer: 65b8304b3a1d8c67d466642a28cc2b4984409346 + charset_converter: 215c7b04932ec2b9ba43be96a9bc34afed3e5322 + DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac + DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 + FBAEMKit: d00064597439e75885c70d9adbcb5f3e9ad84f5d + FBSDKCoreKit: e5d3acfffe5063a9d0b967ba2ad1f5afc460cf43 + FBSDKCoreKit_Basics: 1ff46a12e80f0b66e6c00e1ef32d6a5b5b9008a5 + FBSDKLoginKit: dbe86ef42ab142f3bd0f1c904a21bb33f31c5569 + FBSDKShareKit: 2f6a6a1445cc1b8ea0f733e60d02d2f7c4ebf8be + file_picker: ce3938a0df3cc1ef404671531facef740d03f920 + Firebase: 414ad272f8d02dfbf12662a9d43f4bba9bec2a06 + firebase_analytics: 3e5dba777bb51d1e0358b5a37adefa69746a94bd + firebase_core: 29d66baf806970cda37c93621b27cd369b27db1b + FirebaseAnalytics: 4d310b35c48eaa4a058ddc04bdca6bdb5dc0fe80 + FirebaseCore: 2322423314d92f946219c8791674d2f3345b598f + FirebaseCoreInternal: 8eb002e564b533bdcf1ba011f33f2b5c10e2ed4a + FirebaseInstallations: e842042ec6ac1fd2e37d7706363ebe7f662afea4 + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + flutter_downloader: b7301ae057deadd4b1650dc7c05375f10ff12c39 + flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069 + flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec + flutter_share_me: 1fb559741e0dff56a9d2bdeaf4d966b0b47449ae + GoogleAppMeasurement: 70ce9aa438cff1cfb31ea3e660bcc67734cb716e + GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 + image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5 + integration_test: 13825b8a9334a850581300559b8839134b124670 + nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 + open_filex: 6e26e659846ec990262224a12ef1c528bb4edbe4 + package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0 + print_bluetooth_thermal: 54a9ba9436479dd633d18f393669ee793ee498fa + printing: 233e1b73bd1f4a05615548e9b5a324c98588640b + PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 + SDWebImage: 7ac2b7ddc5e8484c79aa90fc4e30b149d6a2c88f + SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f + url_launcher_ios: bf5ce03e0e2088bad9cc378ea97fa0ed5b49673b + +PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 + +COCOAPODS: 1.14.3 diff --git a/frontend/mgramseva/ios/Runner.xcodeproj/project.pbxproj b/frontend/mgramseva/ios/Runner.xcodeproj/project.pbxproj index a85457607..00c7b1d2f 100644 --- a/frontend/mgramseva/ios/Runner.xcodeproj/project.pbxproj +++ b/frontend/mgramseva/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -162,7 +162,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -207,10 +207,12 @@ /* Begin PBXShellScriptBuildPhase section */ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( @@ -260,6 +262,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); diff --git a/frontend/mgramseva/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/frontend/mgramseva/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c87d15a33..a6b826db2 100644 --- a/frontend/mgramseva/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/frontend/mgramseva/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ CADisableMinimumFrameDurationOnPhone + UIApplicationSupportsIndirectInputEvents + diff --git a/frontend/mgramseva/lib/components/dashboard/bills_table.dart b/frontend/mgramseva/lib/components/dashboard/bills_table.dart index 8a75c9cf5..7eb43c4c2 100644 --- a/frontend/mgramseva/lib/components/dashboard/bills_table.dart +++ b/frontend/mgramseva/lib/components/dashboard/bills_table.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; import 'package:horizontal_data_table/horizontal_data_table.dart'; import 'package:mgramseva/utils/localization/application_localizations.dart'; import 'package:mgramseva/utils/models.dart'; @@ -83,7 +82,6 @@ class _BillsTable extends State { var index = 0; return widget.headerList.map((e) { index++; - ; if (e.isSortingRequired ?? false) { return TextButton( style: TextButton.styleFrom( diff --git a/frontend/mgramseva/lib/components/dashboard/dashboard_card.dart b/frontend/mgramseva/lib/components/dashboard/dashboard_card.dart index cd6ed3c8d..c73746779 100644 --- a/frontend/mgramseva/lib/components/dashboard/dashboard_card.dart +++ b/frontend/mgramseva/lib/components/dashboard/dashboard_card.dart @@ -38,7 +38,7 @@ class DashboardCard extends StatelessWidget { dashBoardProvider.selectedMonth, context), style: Theme.of(context) .textTheme - .subtitle1 + .titleMedium ?.apply( color: Theme.of(context).primaryColor), ), diff --git a/frontend/mgramseva/lib/components/house_connection_and_bill/consumer_bill_payment.dart b/frontend/mgramseva/lib/components/house_connection_and_bill/consumer_bill_payment.dart index dfd56f969..a6b235d27 100644 --- a/frontend/mgramseva/lib/components/house_connection_and_bill/consumer_bill_payment.dart +++ b/frontend/mgramseva/lib/components/house_connection_and_bill/consumer_bill_payment.dart @@ -1,6 +1,5 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:image/image.dart' as img; import 'package:mgramseva/model/bill/bill_payments.dart'; import 'package:mgramseva/model/connection/water_connection.dart'; import 'package:mgramseva/providers/bill_payments_provider.dart'; @@ -12,7 +11,7 @@ import 'package:mgramseva/utils/common_styles.dart'; import 'package:mgramseva/utils/date_formats.dart'; import 'package:mgramseva/utils/global_variables.dart'; import 'package:mgramseva/utils/loaders.dart'; -import 'package:mgramseva/utils/print_bluetooth.dart'; +import 'package:mgramseva/widgets/bluetooth_printer.dart'; import 'package:mgramseva/widgets/list_label_text.dart'; import 'package:number_to_words/number_to_words.dart'; import 'package:provider/provider.dart'; @@ -117,10 +116,10 @@ class ConsumerBillPaymentsState extends State { navigatorKey.currentContext!) .translate(i18.consumerReciepts .GRAM_PANCHAYAT_WATER_SUPPLY_AND_SANITATION), - textScaleFactor: kIsWeb ? 3 : 1, + textScaler: TextScaler.linear(kIsWeb ? 3 : 1), maxLines: 3, style: TextStyle( - color: Colors.blue, + color: Colors.black, fontSize: 10, height: 1, fontWeight: FontWeight.bold, @@ -140,9 +139,9 @@ class ConsumerBillPaymentsState extends State { ApplicationLocalizations.of( navigatorKey.currentContext!) .translate(i18.consumerReciepts.WATER_RECEIPT), - textScaleFactor: kIsWeb ? 3 : 1, + textScaler: TextScaler.linear(kIsWeb ? 3 : 1), style: TextStyle( - color: Colors.blue, + color: Colors.black, fontSize: 10, height: 1, fontWeight: FontWeight.bold, @@ -232,7 +231,7 @@ class ConsumerBillPaymentsState extends State { height: 8, ), Text('- - *** - -', - textScaleFactor: kIsWeb ? 3 : 1, + textScaler: TextScaler.linear(kIsWeb ? 3 : 1), textAlign: TextAlign.start, style: TextStyle( color: Colors.red, @@ -240,7 +239,7 @@ class ConsumerBillPaymentsState extends State { fontWeight: FontWeight.bold)), Text( "${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(i18.common.RECEIPT_FOOTER)}", - textScaleFactor: kIsWeb ? 3 : 1, + textScaler: TextScaler.linear(kIsWeb ? 3 : 1), textAlign: TextAlign.start, style: TextStyle( color: Colors.red, @@ -253,9 +252,12 @@ class ConsumerBillPaymentsState extends State { kIsWeb ? js.onButtonClick( value, stateProvider.stateInfo!.stateLogoURL.toString()) - : PrintBluetooth.printTicket( - img.decodeImage(value), navigatorKey.currentContext!) + :showDialog( + context: context, + builder: (_) => BluetoothPrinterScreen(imageData: value) + ) }); + return null; } afterViewBuild() { @@ -364,18 +366,9 @@ class ConsumerBillPaymentsState extends State { "tenantId": commonProvider .userDetails!.selectedtenant!.code, }, item.mobileNumber, item, "Share"), - style: ButtonStyle( - alignment: Alignment.center, - padding: MaterialStateProperty.all( - EdgeInsets.symmetric(vertical: 8)), - shape: MaterialStateProperty.all( - RoundedRectangleBorder( - side: BorderSide( - width: 2, - color: Theme.of(context).primaryColor), - borderRadius: BorderRadius.circular(0.0), - )), - ), + style: ElevatedButton.styleFrom(padding:EdgeInsets.symmetric(vertical: 8),alignment: Alignment.center,side:BorderSide( + width: 1, + color: Theme.of(context).disabledColor)), icon: (Image.asset('assets/png/whats_app.png')), label: Padding( padding: const EdgeInsets.symmetric(vertical: 5), @@ -383,7 +376,7 @@ class ConsumerBillPaymentsState extends State { ApplicationLocalizations.of(context).translate(i18 .consumerReciepts .CONSUMER_RECIEPT_SHARE_RECEIPT), - style: Theme.of(context).textTheme.subtitle2, + style: Theme.of(context).textTheme.titleSmall, ), ), ), @@ -395,14 +388,15 @@ class ConsumerBillPaymentsState extends State { : MediaQuery.of(context).size.width / 2.2, child: ElevatedButton.icon( onPressed: () => _capturePng(item), - icon: Icon(Icons.print), + icon: Icon(Icons.print,color: Colors.white,), + style: ElevatedButton.styleFrom(backgroundColor: Color.fromRGBO(244, 119, 56, 1)), label: Text( ApplicationLocalizations.of(context).translate( i18.consumerReciepts .CONSUMER_RECEIPT_PRINT), style: Theme.of(context) .textTheme - .subtitle1! + .titleMedium! .apply(color: Colors.white))), ), ]), diff --git a/frontend/mgramseva/lib/components/house_connection_and_bill/generate_new_bill.dart b/frontend/mgramseva/lib/components/house_connection_and_bill/generate_new_bill.dart index fcae9b2a7..c34d417b1 100644 --- a/frontend/mgramseva/lib/components/house_connection_and_bill/generate_new_bill.dart +++ b/frontend/mgramseva/lib/components/house_connection_and_bill/generate_new_bill.dart @@ -53,7 +53,7 @@ class _GenerateNewBillState extends State { if (demandList.demands!.isNotEmpty) { int? num = demandList.demands?.first.auditDetails?.createdTime; var houseHoldProvider = - Provider.of(context, listen: false);; + Provider.of(context, listen: false); return LayoutBuilder(builder: (context, constraints) { return Column( children: [ @@ -222,7 +222,7 @@ class _GenerateNewBillState extends State { .GENERATE_BILL_LABEL), style: Theme.of(context) .textTheme - .subtitle2)), + .titleSmall)), )), Expanded( child: ShortButton( diff --git a/frontend/mgramseva/lib/components/house_connection_and_bill/new_consumer_bill.dart b/frontend/mgramseva/lib/components/house_connection_and_bill/new_consumer_bill.dart index 45c43ef42..e78dcd00d 100644 --- a/frontend/mgramseva/lib/components/house_connection_and_bill/new_consumer_bill.dart +++ b/frontend/mgramseva/lib/components/house_connection_and_bill/new_consumer_bill.dart @@ -347,28 +347,9 @@ class NewConsumerBillState extends State { billList.bill!.first, "Share", ), - style: ButtonStyle( - alignment: - Alignment.center, - padding: - MaterialStateProperty - .all(EdgeInsets - .symmetric( - vertical: - 0)), - shape: MaterialStateProperty - .all( - RoundedRectangleBorder( - side: BorderSide( - width: 2, - color: Theme.of( - context) - .primaryColor), - borderRadius: - BorderRadius - .circular(0.0), - )), - ), + style: ElevatedButton.styleFrom(padding:EdgeInsets.symmetric(vertical: 8),alignment: Alignment.center,side:BorderSide( + width: 1, + color: Theme.of(context).disabledColor)), icon: (Image.asset( 'assets/png/whats_app.png')), label: Padding( diff --git a/frontend/mgramseva/lib/env/app_config.dart b/frontend/mgramseva/lib/env/app_config.dart index f10823029..a5dc5ba55 100644 --- a/frontend/mgramseva/lib/env/app_config.dart +++ b/frontend/mgramseva/lib/env/app_config.dart @@ -1,3 +1,4 @@ +import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/foundation.dart'; import 'package:universal_html/html.dart'; @@ -38,3 +39,22 @@ Map stageConstants = { Map prodConstants = { _baseUrl: "https://api.production.com/", }; + +class FirebaseConfigurations { + static const _apiKey = "AIzaSyBWQkRGvXiKu_fLAA5O8SvQzZTWeQTqMZ8"; + static const _authDomain = "mgramseva-qa.egov.org.in"; + static const _projectId = "sample-mgramseva"; + static const _storageBucket = "sample-mgramseva.appspot.com"; + static const _messagingSenderId ="1026518772539"; + static const _appId = "1:1026518772539:android:bfa7ff7ef250f28789251e"; + +//Make some getter functions + String get apiKey => _apiKey; + String get authDomain => _authDomain; + String get projectId => _projectId; + String get storageBucket => _storageBucket; + String get messagingSenderId => _messagingSenderId; + String get appId => _appId; + + static FirebaseOptions get firebaseOptions => FirebaseOptions(apiKey: _apiKey, appId: _appId, messagingSenderId: _messagingSenderId, projectId: _projectId, storageBucket: _storageBucket, authDomain: _authDomain); +} diff --git a/frontend/mgramseva/lib/main.dart b/frontend/mgramseva/lib/main.dart index 0effec991..169653719 100644 --- a/frontend/mgramseva/lib/main.dart +++ b/frontend/mgramseva/lib/main.dart @@ -3,8 +3,8 @@ import 'dart:io'; import 'dart:isolate'; import 'dart:ui'; +import 'package:dart_ping_ios/dart_ping_ios.dart'; import 'package:firebase_analytics/firebase_analytics.dart'; -import 'package:firebase_analytics/observer.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -46,7 +46,7 @@ import 'package:mgramseva/utils/error_logging.dart'; import 'package:mgramseva/utils/global_variables.dart'; import 'package:mgramseva/utils/loaders.dart'; import 'package:mgramseva/utils/notifiers.dart'; -import 'package:open_file/open_file.dart'; +import 'package:open_filex/open_filex.dart'; import 'package:provider/provider.dart'; import 'package:url_strategy/url_strategy.dart'; @@ -59,6 +59,10 @@ void main() { setPathUrlStrategy(); //configureApp(); setEnvironment(Environment.dev); + // Register DartPingIOS + if (Platform.isIOS) { + DartPingIOS.register(); + } runZonedGuarded(() async { FlutterError.onError = (FlutterErrorDetails details) { @@ -68,10 +72,14 @@ void main() { }; WidgetsFlutterBinding.ensureInitialized(); - - if (Firebase.apps.length == 0) { + if(kIsWeb){ + await Firebase.initializeApp(options: FirebaseConfigurations.firebaseOptions); + }else{ await Firebase.initializeApp(); } + if (Firebase.apps.length == 0) { + + } if (!kIsWeb) { await FlutterDownloader.initialize( @@ -104,7 +112,7 @@ class MyApp extends StatefulWidget { class _MyAppState extends State { late Locale _locale = Locale('en', 'IN'); - static FirebaseAnalytics analytics = FirebaseAnalytics(); + static FirebaseAnalytics analytics = FirebaseAnalytics.instance; static FirebaseAnalyticsObserver observer = FirebaseAnalyticsObserver(analytics: analytics); ReceivePort _port = ReceivePort(); @@ -126,13 +134,13 @@ class _MyAppState extends State { IsolateNameServer.removePortNameMapping('downloader_send_port'); super.dispose(); } - + @pragma('vm:entry-point') static void downloadCallback( - String id, DownloadTaskStatus status, int progress) { + String id, int status, int progress) { final SendPort send = IsolateNameServer.lookupPortByName('downloader_send_port')!; - send.send([id, status, progress]); + send.send([id, DownloadTaskStatus.values.elementAt(status), progress]); } afterViewBuild() async { @@ -143,10 +151,10 @@ class _MyAppState extends State { String id = data[0]; DownloadTaskStatus status = data[1]; int progress = data[2]; + print("Download progress: "+progress.toString()); if (status == DownloadTaskStatus.complete) { if (CommonProvider.downloadUrl.containsKey(id)) { - if (Platform.isIOS && CommonProvider.downloadUrl[id] != null) - OpenFile.open(CommonProvider.downloadUrl[id] ?? ''); + if (CommonProvider.downloadUrl[id] != null) OpenFilex.open(CommonProvider.downloadUrl[id] ?? ''); CommonProvider.downloadUrl.remove(id); } else if (status == DownloadTaskStatus.failed || status == DownloadTaskStatus.canceled || @@ -155,7 +163,9 @@ class _MyAppState extends State { CommonProvider.downloadUrl.remove(id); } } - setState(() {}); + setState(() { + print("Download progress: "+progress.toString()); + }); }); FlutterDownloader.registerCallback(downloadCallback); } diff --git a/frontend/mgramseva/lib/model/common/demand.dart b/frontend/mgramseva/lib/model/common/demand.dart index 37212510a..23dec86b7 100644 --- a/frontend/mgramseva/lib/model/common/demand.dart +++ b/frontend/mgramseva/lib/model/common/demand.dart @@ -1,4 +1,3 @@ -import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; part 'demand.g.dart'; diff --git a/frontend/mgramseva/lib/model/dashboard/revenue_chart.dart b/frontend/mgramseva/lib/model/dashboard/revenue_chart.dart index 4fc0454bb..d00297d77 100644 --- a/frontend/mgramseva/lib/model/dashboard/revenue_chart.dart +++ b/frontend/mgramseva/lib/model/dashboard/revenue_chart.dart @@ -1,5 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:charts_flutter/flutter.dart' as charts; +import 'package:community_charts_flutter/community_charts_flutter.dart' as charts; import '../../screeens/dashboard/revenue_expense_dashboard/revenue.dart'; diff --git a/frontend/mgramseva/lib/model/expenses_details/expenses_details.dart b/frontend/mgramseva/lib/model/expenses_details/expenses_details.dart index 68c6ae4d1..018f62fa8 100644 --- a/frontend/mgramseva/lib/model/expenses_details/expenses_details.dart +++ b/frontend/mgramseva/lib/model/expenses_details/expenses_details.dart @@ -2,11 +2,8 @@ import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:mgramseva/model/expenses_details/vendor.dart'; import 'package:mgramseva/model/file/file_store.dart'; -import 'package:mgramseva/providers/expenses_details_provider.dart'; import 'package:mgramseva/utils/date_formats.dart'; -import 'package:provider/provider.dart'; -import '../../utils/global_variables.dart'; part 'expenses_details.g.dart'; diff --git a/frontend/mgramseva/lib/model/expenses_details/vendor.dart b/frontend/mgramseva/lib/model/expenses_details/vendor.dart index 62eef28bb..0fd90569c 100644 --- a/frontend/mgramseva/lib/model/expenses_details/vendor.dart +++ b/frontend/mgramseva/lib/model/expenses_details/vendor.dart @@ -1,6 +1,4 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:flutter/material.dart'; -import 'package:mgramseva/utils/date_formats.dart'; part 'vendor.g.dart'; diff --git a/frontend/mgramseva/lib/model/file/file_store.dart b/frontend/mgramseva/lib/model/file/file_store.dart index 96cfecf44..3bc2eb663 100644 --- a/frontend/mgramseva/lib/model/file/file_store.dart +++ b/frontend/mgramseva/lib/model/file/file_store.dart @@ -1,4 +1,3 @@ -import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; part 'file_store.g.dart'; diff --git a/frontend/mgramseva/lib/model/localization/language.dart b/frontend/mgramseva/lib/model/localization/language.dart index a91299a3a..6884e5804 100644 --- a/frontend/mgramseva/lib/model/localization/language.dart +++ b/frontend/mgramseva/lib/model/localization/language.dart @@ -9,7 +9,7 @@ import 'package:mgramseva/model/mdms/tax_period.dart'; import '../../repository/water_services_calculation.dart'; class LanguageList { - dynamic? responseInfo; + dynamic responseInfo; MdmsRes? mdmsRes; LanguageList({this.responseInfo, this.mdmsRes}); diff --git a/frontend/mgramseva/lib/model/localization/localization_label.dart b/frontend/mgramseva/lib/model/localization/localization_label.dart index 7627eed0b..248aba7d0 100644 --- a/frontend/mgramseva/lib/model/localization/localization_label.dart +++ b/frontend/mgramseva/lib/model/localization/localization_label.dart @@ -1,4 +1,3 @@ -import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; part 'localization_label.g.dart'; diff --git a/frontend/mgramseva/lib/model/mdms/payment_type.dart b/frontend/mgramseva/lib/model/mdms/payment_type.dart index d45117918..79a4243e7 100644 --- a/frontend/mgramseva/lib/model/mdms/payment_type.dart +++ b/frontend/mgramseva/lib/model/mdms/payment_type.dart @@ -3,7 +3,7 @@ import '../localization/language.dart'; class PaymentType { - dynamic? responseInfo; + dynamic responseInfo; MdmsRes? mdmsRes; PaymentType({this.responseInfo, this.mdmsRes}); diff --git a/frontend/mgramseva/lib/model/mdms/tax_period.dart b/frontend/mgramseva/lib/model/mdms/tax_period.dart index 8e308d8cc..26b3bdfc2 100644 --- a/frontend/mgramseva/lib/model/mdms/tax_period.dart +++ b/frontend/mgramseva/lib/model/mdms/tax_period.dart @@ -29,6 +29,11 @@ class TaxPeriod { factory TaxPeriod.fromJson(Map json) => _$TaxPeriodFromJson(json); Map toJson() => _$TaxPeriodToJson(this); + + @override + String toString() { + return '$financialYear'; + } } diff --git a/frontend/mgramseva/lib/model/success_handler.dart b/frontend/mgramseva/lib/model/success_handler.dart index 065566105..ac808a5a1 100644 --- a/frontend/mgramseva/lib/model/success_handler.dart +++ b/frontend/mgramseva/lib/model/success_handler.dart @@ -1,4 +1,3 @@ -import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; part 'success_handler.g.dart'; diff --git a/frontend/mgramseva/lib/providers/authentication_provider.dart b/frontend/mgramseva/lib/providers/authentication_provider.dart index b6f080985..7e7943d55 100644 --- a/frontend/mgramseva/lib/providers/authentication_provider.dart +++ b/frontend/mgramseva/lib/providers/authentication_provider.dart @@ -43,27 +43,25 @@ class AuthenticationProvider with ChangeNotifier { Navigator.pop(context); - if (loginResponse != null) { - var userInfo = await AuthenticationRepository().getProfile({ - "tenantId": loginResponse.userRequest!.tenantId, - "id": [loginResponse.userRequest!.id], - "mobileNumber": loginResponse.userRequest!.mobileNumber - }, loginResponse.accessToken!); - var commonProvider = - Provider.of(context, listen: false); - loginResponse.isFirstTimeLogin = userInfo.user!.first.defaultPwdChgd; - commonProvider.loginCredentials = loginResponse; - if (userInfo.user!.first.defaultPwdChgd == false) { - commonProvider.userProfile = userInfo; - Navigator.pushNamed(context, Routes.UPDATE_PASSWORD, - arguments: loginResponse); - return; - } else { - Navigator.of(context).pushNamedAndRemoveUntil( - Routes.HOME, (Route route) => false); - } + var userInfo = await AuthenticationRepository().getProfile({ + "tenantId": loginResponse.userRequest!.tenantId, + "id": [loginResponse.userRequest!.id], + "mobileNumber": loginResponse.userRequest!.mobileNumber + }, loginResponse.accessToken!); + var commonProvider = + Provider.of(context, listen: false); + loginResponse.isFirstTimeLogin = userInfo.user!.first.defaultPwdChgd; + commonProvider.loginCredentials = loginResponse; + if (userInfo.user!.first.defaultPwdChgd == false) { + commonProvider.userProfile = userInfo; + Navigator.pushNamed(context, Routes.UPDATE_PASSWORD, + arguments: loginResponse); + return; + } else { + Navigator.of(context).pushNamedAndRemoveUntil( + Routes.HOME, (Route route) => false); } - } on CustomException catch (e, s) { + } on CustomException catch (e, s) { Navigator.pop(context); if (ErrorHandler.handleApiException(context, e, s)) { Notifiers.getToastMessage(context, e.message, 'ERROR'); diff --git a/frontend/mgramseva/lib/providers/bill_generation_details_provider.dart b/frontend/mgramseva/lib/providers/bill_generation_details_provider.dart index ce93b1da3..dc322ad4d 100644 --- a/frontend/mgramseva/lib/providers/bill_generation_details_provider.dart +++ b/frontend/mgramseva/lib/providers/bill_generation_details_provider.dart @@ -177,9 +177,10 @@ class BillGenerationProvider with ChangeNotifier { notifyListeners(); } - void onChangeOfBillCycle(val) { - var result = DateTime.parse(val); - selectedBillCycle = (DateFormats.getMonth(result)); + void onChangeOfBillCycle(cycle) { + var val = cycle['code']; + DateTime result = DateTime.parse(val.toString()); + selectedBillCycle = cycle; selectedBillPeriod = (DateFormats.getFilteredDate( result.toLocal().toString(), dateFormat: "dd/MM/yyyy")) + @@ -189,7 +190,7 @@ class BillGenerationProvider with ChangeNotifier { .toLocal() .toString(), dateFormat: "dd/MM/yyyy"); - billGenerateDetails.billCycle = val; + billGenerateDetails.billCycle = result.toLocal().toString(); notifyListeners(); } @@ -284,59 +285,57 @@ class BillGenerationProvider with ChangeNotifier { "businessService": "WS" }).then((value) => billList = value); Navigator.pop(context); - if (billResponse1 != null) { - late String localizationText; - localizationText = - '${ApplicationLocalizations.of(context).translate(i18.demandGenerate.GENERATE_BILL_SUCCESS_SUBTEXT)}'; - localizationText = localizationText.replaceFirst( - '{number}', '(+91 - ${billList.bill!.first.mobileNumber})'); - Navigator.of(context).pushReplacement( - new MaterialPageRoute(builder: (BuildContext context) { - return CommonSuccess( - SuccessHandler( - ApplicationLocalizations.of(context) - .translate(i18.demandGenerate.GENERATE_BILL_SUCCESS), - localizationText, - ApplicationLocalizations.of(context) - .translate(i18.common.COLLECT_PAYMENT), - Routes.BILL_GENERATE, - downloadLink: '', - downloadLinkLabel: ApplicationLocalizations.of(context) - .translate(i18.common.DOWNLOAD), - whatsAppShare: '', - subHeader: - '${ApplicationLocalizations.of(context).translate(i18.demandGenerate.BILL_ID_NO)}', - subHeaderText: - '${billList.bill!.first.billNumber.toString()}'), - callBack: () => - onClickOfCollectPayment(billList.bill!.first, context), - callBackDownload: () => commonProvider - .getFileFromPDFBillService({ - "Bill": [billList.bill!.first] - }, { - "key": waterconnection.connectionType == 'Metered' - ? "ws-bill" - : "ws-bill-nm", - "tenantId": - commonProvider.userDetails!.selectedtenant!.code, - }, billList.bill!.first.mobileNumber, billList.bill!.first, - "Download"), - callBackWhatsApp: () => commonProvider - .getFileFromPDFBillService({ - "Bill": [billList.bill!.first], - }, { - "key": waterconnection.connectionType == 'Metered' - ? "ws-bill" - : "ws-bill-nm", - "tenantId": - commonProvider.userDetails!.selectedtenant!.code, - }, billList.bill!.first.mobileNumber, billList.bill!.first, - "Share"), - backButton: true, - ); - })); - } - } catch (e) { + late String localizationText; + localizationText = + '${ApplicationLocalizations.of(context).translate(i18.demandGenerate.GENERATE_BILL_SUCCESS_SUBTEXT)}'; + localizationText = localizationText.replaceFirst( + '{number}', '(+91 - ${billList.bill!.first.mobileNumber})'); + Navigator.of(context).pushReplacement( + new MaterialPageRoute(builder: (BuildContext context) { + return CommonSuccess( + SuccessHandler( + ApplicationLocalizations.of(context) + .translate(i18.demandGenerate.GENERATE_BILL_SUCCESS), + localizationText, + ApplicationLocalizations.of(context) + .translate(i18.common.COLLECT_PAYMENT), + Routes.BILL_GENERATE, + downloadLink: '', + downloadLinkLabel: ApplicationLocalizations.of(context) + .translate(i18.common.DOWNLOAD), + whatsAppShare: '', + subHeader: + '${ApplicationLocalizations.of(context).translate(i18.demandGenerate.BILL_ID_NO)}', + subHeaderText: + '${billList.bill!.first.billNumber.toString()}'), + callBack: () => + onClickOfCollectPayment(billList.bill!.first, context), + callBackDownload: () => commonProvider + .getFileFromPDFBillService({ + "Bill": [billList.bill!.first] + }, { + "key": waterconnection.connectionType == 'Metered' + ? "ws-bill" + : "ws-bill-nm", + "tenantId": + commonProvider.userDetails!.selectedtenant!.code, + }, billList.bill!.first.mobileNumber, billList.bill!.first, + "Download"), + callBackWhatsApp: () => commonProvider + .getFileFromPDFBillService({ + "Bill": [billList.bill!.first], + }, { + "key": waterconnection.connectionType == 'Metered' + ? "ws-bill" + : "ws-bill-nm", + "tenantId": + commonProvider.userDetails!.selectedtenant!.code, + }, billList.bill!.first.mobileNumber, billList.bill!.first, + "Share"), + backButton: true, + ); + })); + } catch (e) { Navigator.pop(context); Navigator.of(context).pushReplacement( new MaterialPageRoute(builder: (BuildContext context) { @@ -361,23 +360,21 @@ class BillGenerationProvider with ChangeNotifier { }; var billResponse2 = await BillGenerateRepository().bulkDemand(res2); Navigator.pop(context); - if (billResponse2 != null) { - String localizationText = getSubtitleText(context); - Navigator.of(context).pushReplacement( - new MaterialPageRoute(builder: (BuildContext context) { - return CommonSuccess(SuccessHandler( - ApplicationLocalizations.of(context) - .translate(i18.demandGenerate.GENERATE_DEMAND_SUCCESS), - localizationText, - i18.common.BACK_HOME, - Routes.BILL_GENERATE, - subHeader: - '${ApplicationLocalizations.of(context).translate(i18.demandGenerate.BILLING_CYCLE_LABEL)}', - subTextFun: () => getLocalizedText(context), - subtitleFun: () => getSubtitleText(context))); - })); - } - } catch (e) { + String localizationText = getSubtitleText(context); + Navigator.of(context).pushReplacement( + new MaterialPageRoute(builder: (BuildContext context) { + return CommonSuccess(SuccessHandler( + ApplicationLocalizations.of(context) + .translate(i18.demandGenerate.GENERATE_DEMAND_SUCCESS), + localizationText, + i18.common.BACK_HOME, + Routes.BILL_GENERATE, + subHeader: + '${ApplicationLocalizations.of(context).translate(i18.demandGenerate.BILLING_CYCLE_LABEL)}', + subTextFun: () => getLocalizedText(context), + subtitleFun: () => getSubtitleText(context))); + })); + } catch (e) { Navigator.of(context).pushReplacement( new MaterialPageRoute(builder: (BuildContext context) { return ErrorPage(e.toString()); @@ -396,78 +393,64 @@ class BillGenerationProvider with ChangeNotifier { '${ApplicationLocalizations.of(context).translate(i18.demandGenerate.GENERATE_DEMAND_SUCCESS_SUBTEXT)}'; localizationText = localizationText.replaceFirst( '{billing cycle}', - '${ApplicationLocalizations.of(context).translate(selectedBillCycle.toString())}' + + '${ApplicationLocalizations.of(context).translate(selectedBillCycle['name'].toString())} | ' + ' ${selectedBillYear.financialYear!.toString().substring(2)}'); return localizationText; } String getLocalizedText(BuildContext context) { - return '${ApplicationLocalizations.of(context).translate(selectedBillCycle)}' + + return '${ApplicationLocalizations.of(context).translate(selectedBillCycle['name'])} | ' + ' ${selectedBillYear.financialYear!.toString().substring(2)}'; } - List> getPropertyTypeList() { + List getPropertyTypeList() { if (languageList?.mdmsRes?.propertyTax?.PropertyTypeList != null) { return (languageList?.mdmsRes?.propertyTax?.PropertyTypeList ?? []) .map((value) { - return DropdownMenuItem( - value: value.code, - child: new Text(value.code!), - ); + return value.code!; }).toList(); } - return >[]; + return []; } - List> getConnectionTypeList() { + List getConnectionTypeList() { if (languageList?.mdmsRes?.connection?.connectionTypeList != null) { return (languageList?.mdmsRes?.connection?.connectionTypeList ?? []) .map((value) { - return DropdownMenuItem( - value: value.code, - child: new Text( - ApplicationLocalizations.of(navigatorKey.currentContext!) - .translate(value.code!)), - ); + return value.code!; }).toList(); } - return >[]; + return []; } - List> getFinancialYearList() { + List getFinancialYearList() { if (languageList?.mdmsRes?.billingService?.taxPeriodList != null) { CommonMethods.getFilteredFinancialYearList(languageList?.mdmsRes?.billingService?.taxPeriodList ?? []); languageList?.mdmsRes?.billingService?.taxPeriodList!.sort((a,b)=>a.fromDate!.compareTo(b.fromDate!)); return (languageList?.mdmsRes?.billingService?.taxPeriodList ?? []) .map((value) { - return DropdownMenuItem( - value: value, - child: new Text((value.financialYear!)), - ); + return value; }).toList().reversed.toList(); } - return >[]; + return []; } - List> getServiceCategoryList() { + List getServiceCategoryList() { if (languageList?.mdmsRes?.billingService?.taxHeadMasterList != null) { return (languageList?.mdmsRes?.billingService?.taxHeadMasterList ?? []) .map((value) { - return DropdownMenuItem( - value: value.code, - child: new Text((value.code!)), - ); + return value.code!; }).toList(); } - return >[]; + return []; } - List> getBillingCycle() { - dates = []; + List> getBillingCycle() { + var dates = >[]; if (billGenerateDetails.billYear != null && selectedBillYear != null) { DatePeriod ytd; var fromDate = DateFormats.getFormattedDateToDateTime( @@ -486,23 +469,16 @@ class BillGenerationProvider with ChangeNotifier { for (var i = 0; i < months.length; i++) { var prevMonth = months[i].startDate; - var r = {"code": prevMonth, "name": prevMonth}; + Map r = {"code": prevMonth, "name": "${ApplicationLocalizations.of(navigatorKey.currentContext!) + .translate((Constants.MONTHS[prevMonth.month - 1])) + + " - " + + prevMonth.year.toString()}"}; dates.add(r); } } if (dates.length > 0) { - return (dates).map((value) { - var d = value['name']; - return DropdownMenuItem( - value: value['code'].toLocal().toString(), - child: new Text( - ApplicationLocalizations.of(navigatorKey.currentContext!) - .translate((Constants.MONTHS[d.month - 1])) + - " - " + - d.year.toString()), - ); - }).toList(); + return dates; } - return >[]; + return >[]; } } diff --git a/frontend/mgramseva/lib/providers/change_password_details_provider.dart b/frontend/mgramseva/lib/providers/change_password_details_provider.dart index 83bd560d9..beac78ded 100644 --- a/frontend/mgramseva/lib/providers/change_password_details_provider.dart +++ b/frontend/mgramseva/lib/providers/change_password_details_provider.dart @@ -19,15 +19,13 @@ class ChangePasswordProvider with ChangeNotifier { var changePasswordResponse = await ChangePasswordRepository().updatePassword(body); Navigator.pop(context); - if (changePasswordResponse != null) { - Notifiers.getToastMessage( - context, i18.password.CHANGE_PASSWORD_SUCCESS, 'SUCCESS'); - new Future.delayed(const Duration(seconds: 5), - () => Navigator.pop(context), - ); + Notifiers.getToastMessage( + context, i18.password.CHANGE_PASSWORD_SUCCESS, 'SUCCESS'); + new Future.delayed(const Duration(seconds: 5), + () => Navigator.pop(context), + ); - } - } catch (e, s) { + } catch (e, s) { Navigator.pop(context); ErrorHandler().allExceptionsHandler(context, e, s); } diff --git a/frontend/mgramseva/lib/providers/collect_payment_provider.dart b/frontend/mgramseva/lib/providers/collect_payment_provider.dart index 160318192..c9fb773e5 100644 --- a/frontend/mgramseva/lib/providers/collect_payment_provider.dart +++ b/frontend/mgramseva/lib/providers/collect_payment_provider.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:image/image.dart' as img; import 'package:mgramseva/model/bill/bill_payments.dart'; import 'package:mgramseva/model/bill/billing.dart'; import 'package:mgramseva/model/common/fetch_bill.dart'; @@ -26,7 +25,6 @@ import 'package:mgramseva/utils/global_variables.dart'; import 'package:mgramseva/utils/loaders.dart'; import 'package:mgramseva/utils/models.dart'; import 'package:mgramseva/utils/notifiers.dart'; -import 'package:mgramseva/utils/print_bluetooth.dart'; import 'package:mgramseva/widgets/common_success_page.dart'; import 'package:number_to_words/number_to_words.dart'; import 'package:provider/provider.dart'; @@ -36,6 +34,7 @@ import '../components/house_connection_and_bill/js_connnector.dart' as js; import '../env/app_config.dart'; import '../model/localization/language.dart'; import '../repository/core_repo.dart'; +import '../widgets/bluetooth_printer.dart'; import 'common_provider.dart'; class CollectPaymentProvider with ChangeNotifier { @@ -400,7 +399,7 @@ class CollectPaymentProvider with ChangeNotifier { height: 8, ), Text('- - *** - -', - textScaleFactor: kIsWeb ? 3 : 1, + textScaler: TextScaler.linear(kIsWeb ? 3 : 1), textAlign: TextAlign.start, style: TextStyle( color: Colors.red, @@ -408,7 +407,7 @@ class CollectPaymentProvider with ChangeNotifier { fontWeight: FontWeight.bold)), Text( "${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(i18.common.RECEIPT_FOOTER)}", - textScaleFactor: kIsWeb ? 3 : 1, + textScaler: TextScaler.linear(kIsWeb ? 3 : 1), textAlign: TextAlign.start, style: TextStyle( color: Colors.red, @@ -421,9 +420,9 @@ class CollectPaymentProvider with ChangeNotifier { kIsWeb ? js.onButtonClick( value, stateProvider.stateInfo!.stateLogoURL.toString()) - : PrintBluetooth.printTicket( - img.decodeImage(value), navigatorKey.currentContext!) + :Navigator.push(navigatorKey.currentContext!, new MaterialPageRoute(builder: (context)=>BluetoothPrinterScreen(imageData: value))) }); + return null; } Future getPaymentModes(FetchBill fetchBill, String tenantId, diff --git a/frontend/mgramseva/lib/providers/common_provider.dart b/frontend/mgramseva/lib/providers/common_provider.dart index 0b2378a41..15a23f3c5 100644 --- a/frontend/mgramseva/lib/providers/common_provider.dart +++ b/frontend/mgramseva/lib/providers/common_provider.dart @@ -76,11 +76,9 @@ class CommonProvider with ChangeNotifier { }; var response = await CoreRepository().getLocilisation(query); - if (response != null) { - labels = localizedStrings = response; - setLocalizationLabels(response); - } - } catch (e) { + labels = localizedStrings = response; + setLocalizationLabels(response); + } catch (e) { print(e); } return labels; diff --git a/frontend/mgramseva/lib/providers/consumer_details_provider.dart b/frontend/mgramseva/lib/providers/consumer_details_provider.dart index 897198ddf..2048a5d92 100644 --- a/frontend/mgramseva/lib/providers/consumer_details_provider.dart +++ b/frontend/mgramseva/lib/providers/consumer_details_provider.dart @@ -152,11 +152,15 @@ class ConsumerProvider with ChangeNotifier { isEdit = true; waterconnection = data; waterconnection.getText(); - selectedcycle = DateFormats.timeStampToDate( - waterconnection.previousReadingDate, - format: 'yyyy-MM-dd') - .toString() + - " 00:00:00.000"; + selectedcycle = {'code':DateTime.fromMillisecondsSinceEpoch(waterconnection.previousReadingDate!), + 'name':"${ApplicationLocalizations.of(navigatorKey.currentContext!) + .translate(DateFormats.timeStampToDate( + waterconnection.previousReadingDate, + format: 'MMMM')) + + " - " + + DateFormats.timeStampToDate( + waterconnection.previousReadingDate, + format: 'yyyy')}"}; if (waterconnection.previousReadingDate != null && (languageList?.mdmsRes?.billingService?.taxPeriodList?.isNotEmpty ?? false)) { @@ -346,7 +350,7 @@ class ConsumerProvider with ChangeNotifier { streamController.add(property); Notifiers.getToastMessage( context, i18.consumer.REGISTER_SUCCESS, 'SUCCESS'); - selectedcycle = ''; + selectedcycle = null; waterconnection.connectionType = ''; Navigator.pop(context); } @@ -460,6 +464,7 @@ class ConsumerProvider with ChangeNotifier { } catch (e) { print(e); } + return null; } Future fetchBoundary() async { @@ -514,57 +519,43 @@ class ConsumerProvider with ChangeNotifier { notifyListeners(); } - List> getBoundaryList() { + List getBoundaryList() { if (boundaryList.length > 0) { - return (boundaryList).map((value) { - return DropdownMenuItem( - value: value, - child: new Text(value.code!), - ); - }).toList(); + return boundaryList; } - return >[]; + return []; } - List> getCategoryList() { + List getCategoryList() { if (languageList?.mdmsRes?.category != null) { return (languageList?.mdmsRes?.category?.categoryList ?? []) .map((value) { - return DropdownMenuItem( - value: value.code, - child: new Text((value.code!)), - ); - }).toList(); - } - return >[]; + return value.code!; + }).toList(); + } + return []; } - List> getSubCategoryList() { + List getSubCategoryList() { if (languageList?.mdmsRes?.subCategory != null) { return (languageList?.mdmsRes?.subCategory?.subcategoryList ?? []) .map((value) { - return DropdownMenuItem( - value: value.code, - child: new Text((value.code!)), - ); + return value.code!; }).toList(); } - return >[]; + return []; } - List> getPropertyTypeList() { + List getPropertyTypeList() { if (languageList?.mdmsRes?.propertyTax?.PropertyTypeList != null) { return (languageList?.mdmsRes?.propertyTax?.PropertyTypeList ?? []) .map((value) { - return DropdownMenuItem( - value: value.code, - child: new Text(value.code!), - ); + return value.code!; }).toList(); } - return >[]; + return []; } onChangeOfConnectionType(val) { @@ -582,30 +573,28 @@ class ConsumerProvider with ChangeNotifier { onChangeBillingCycle(val) { selectedcycle = val; + DateTime result = DateTime.parse(val['code'].toString()); waterconnection.previousReadingDateCtrl.clear(); - waterconnection.BillingCycleCtrl.text = selectedcycle ?? ''; - waterconnection.meterInstallationDateCtrl.text = selectedcycle ?? ''; + waterconnection.BillingCycleCtrl.text = result.toLocal().toString(); + waterconnection.meterInstallationDateCtrl.text = result.toLocal().toString(); notifyListeners(); } //Displaying ConnectionType data Fetched From MDMD (Ex Metered, Non Metered..) - List> getConnectionTypeList() { + List getConnectionTypeList() { if (languageList?.mdmsRes?.connection?.connectionTypeList != null) { return (languageList?.mdmsRes?.connection?.connectionTypeList ?? []) .map((value) { - return DropdownMenuItem( - value: value.code, - child: new Text((value.code!)), - ); + return value.code!; }).toList(); } - return >[]; + return []; } //Displaying Billing Cycle Vaule (EX- JAN-2021,,) - List> getBillingCycle() { - dates = []; + List> getBillingCycle() { + var dates = >[]; if (billYear != null) { DatePeriod ytd; var fromDate = DateFormats.getFormattedDateToDateTime( @@ -624,24 +613,17 @@ class ConsumerProvider with ChangeNotifier { for (var i = 0; i < months.length; i++) { var prevMonth = months[i].startDate; - var r = {"code": prevMonth, "name": prevMonth}; + var r = {"code": prevMonth, "name": '${ApplicationLocalizations.of(navigatorKey.currentContext!) + .translate((Constants.MONTHS[prevMonth.month - 1])) + + " - " + + prevMonth.year.toString()}'}; dates.add(r); } } if (dates.length > 0 && waterconnection.connectionType == 'Non_Metered') { - return (dates).map((value) { - var d = value['name']; - return DropdownMenuItem( - value: value['code'].toLocal().toString(), - child: new Text( - ApplicationLocalizations.of(navigatorKey.currentContext!) - .translate((Constants.MONTHS[d.month - 1])) + - " - " + - d.year.toString()), - ); - }).toList(); + return dates; } - return >[]; + return >[]; } incrementIndex(index, consumerGenderKey) async { @@ -673,22 +655,17 @@ class ConsumerProvider with ChangeNotifier { notifyListeners(); } - List> getFinancialYearList() { + List getFinancialYearList() { if (languageList?.mdmsRes?.billingService?.taxPeriodList != null) { - CommonMethods.getFilteredFinancialYearList( - languageList?.mdmsRes?.billingService?.taxPeriodList ?? - []); + CommonMethods.getFilteredFinancialYearList(languageList?.mdmsRes?.billingService?.taxPeriodList ?? []); languageList?.mdmsRes?.billingService?.taxPeriodList!.sort((a,b)=>a.fromDate!.compareTo(b.fromDate!)); return (languageList?.mdmsRes?.billingService?.taxPeriodList ?? - []) + []) .map((value) { - return DropdownMenuItem( - value: value, - child: new Text((value.financialYear!)), - ); + return value; }).toList().reversed.toList(); } - return >[]; + return []; } void onChangeOfAmountType(value) { diff --git a/frontend/mgramseva/lib/providers/dashboard_provider.dart b/frontend/mgramseva/lib/providers/dashboard_provider.dart index 95f92d8cc..6798a477c 100644 --- a/frontend/mgramseva/lib/providers/dashboard_provider.dart +++ b/frontend/mgramseva/lib/providers/dashboard_provider.dart @@ -307,41 +307,39 @@ class DashBoardProvider with ChangeNotifier { isLoaderEnabled = false; if (selectedDashboardType != DashBoardType.collections) return; - if (response != null) { - if (waterConnectionsDetails == null) { - waterConnectionsDetails = response; - - if (selectedTab == 'all') { - collectionCountHolder['all'] = response.totalCount ?? 0; - propertyTaxList.forEach((key) { - collectionCountHolder[key.code!] = - int.parse(response.tabData?[key.code!] ?? '0'); - }); - } else if (searchResponse != null) { - collectionCountHolder['all'] = searchResponse.totalCount ?? 0; - propertyTaxList.forEach((key) { - collectionCountHolder[key.code!] = - int.parse(searchResponse.tabData?[key.code!] ?? '0'); - }); - } + if (waterConnectionsDetails == null) { + waterConnectionsDetails = response; - notifyListeners(); - } else { - waterConnectionsDetails?.totalCount = response.totalCount; - waterConnectionsDetails?.waterConnection - ?.addAll(response.waterConnection ?? []); + if (selectedTab == 'all') { + collectionCountHolder['all'] = response.totalCount ?? 0; + propertyTaxList.forEach((key) { + collectionCountHolder[key.code!] = + int.parse(response.tabData?[key.code!] ?? '0'); + }); + } else if (searchResponse != null) { + collectionCountHolder['all'] = searchResponse.totalCount ?? 0; + propertyTaxList.forEach((key) { + collectionCountHolder[key.code!] = + int.parse(searchResponse.tabData?[key.code!] ?? '0'); + }); } + notifyListeners(); - streamController.add(waterConnectionsDetails!.waterConnection!.isEmpty - ? [] - : waterConnectionsDetails?.waterConnection?.sublist( - offSet - 1, - ((offset + limit - 1) > - (waterConnectionsDetails?.totalCount ?? 0)) - ? (waterConnectionsDetails!.totalCount!) - : (offset + limit) - 1)); + } else { + waterConnectionsDetails?.totalCount = response.totalCount; + waterConnectionsDetails?.waterConnection + ?.addAll(response.waterConnection ?? []); } - } catch (e, s) { + notifyListeners(); + streamController.add(waterConnectionsDetails!.waterConnection!.isEmpty + ? [] + : waterConnectionsDetails?.waterConnection?.sublist( + offSet - 1, + ((offset + limit - 1) > + (waterConnectionsDetails?.totalCount ?? 0)) + ? (waterConnectionsDetails!.totalCount!) + : (offset + limit) - 1)); + } catch (e, s) { isLoaderEnabled = false; notifyListeners(); streamController.addError('error'); diff --git a/frontend/mgramseva/lib/providers/expenses_details_provider.dart b/frontend/mgramseva/lib/providers/expenses_details_provider.dart index b6495b768..c7aa47077 100644 --- a/frontend/mgramseva/lib/providers/expenses_details_provider.dart +++ b/frontend/mgramseva/lib/providers/expenses_details_provider.dart @@ -61,7 +61,7 @@ class ExpensesDetailsProvider with ChangeNotifier { Provider.of(context, listen: false); if (languageList?.mdmsRes?.expense?.expenseList != null) { var res = languageList?.mdmsRes?.pspclIntegration?.accountNumberGpMapping?.where((element) => element.departmentEntityCode==commonProvider.userDetails?.selectedtenant?.city?.code).toList(); - if(res!.isNotEmpty){ + if(res!=null && res.isNotEmpty){ isPSPCLEnabled = true; notifyListeners(); }else{ @@ -98,6 +98,7 @@ class ExpensesDetailsProvider with ChangeNotifier { if(this.expenditureDetails.expenseType=='ELECTRICITY_BILL' && isPSPCLEnabled){ this.expenditureDetails.allowEdit = false; } + notifyListeners(); streamController.add(this.expenditureDetails); } on CustomException catch (e, s) { ErrorHandler.handleApiException(context, e, s); @@ -545,25 +546,22 @@ class ExpensesDetailsProvider with ChangeNotifier { notifyListeners(); } - List> getExpenseTypeList({bool isSearch=false}) { + List getExpenseTypeList({bool isSearch=false}) { var commonProvider = Provider.of( navigatorKey.currentContext!, listen: false); if (languageList?.mdmsRes?.expense?.expenseList != null) { var res = languageList?.mdmsRes?.pspclIntegration?.accountNumberGpMapping?.where((element) => element.departmentEntityCode==commonProvider.userDetails?.selectedtenant?.city?.code).toList(); - var temp_list = languageList?.mdmsRes?.expense?.expenseList?.toList(); - if(res!.isNotEmpty){ - isSearch?{}:temp_list!.removeWhere((element) => element.code=="ELECTRICITY_BILL"); + var tempList = languageList?.mdmsRes?.expense?.expenseList?.toList(); + if(res!=null && res.isNotEmpty){ + isSearch?{}:tempList!.removeWhere((element) => element.code=="ELECTRICITY_BILL"); } - return (temp_list ?? []) + return (tempList ?? []) .map((value) { - return DropdownMenuItem( - value: value.code, - child: new Text((value.code!)), - ); + return value.code; }).toList(); } - return >[]; + return []; } incrementindex(index, expenseKey) async { @@ -584,6 +582,7 @@ class ExpensesDetailsProvider with ChangeNotifier { Vendor(vendorList[index].name.trim(), vendorList[index].id); expenditureDetails.selectedVendor?.owner ??= Owner(mobileNumber); } + notifyListeners(); } callNotifyer() { diff --git a/frontend/mgramseva/lib/providers/fetch_bill_provider.dart b/frontend/mgramseva/lib/providers/fetch_bill_provider.dart index 274c63d5a..c3b71941f 100644 --- a/frontend/mgramseva/lib/providers/fetch_bill_provider.dart +++ b/frontend/mgramseva/lib/providers/fetch_bill_provider.dart @@ -19,23 +19,17 @@ class FetchBillProvider with ChangeNotifier { "consumerCode": data.connectionNo.toString(), "businessService": "WS" }); - if (res != null) { - if (res.bill!.isNotEmpty) { - res.bill?.first.billDetails - ?.sort((a, b) => b.fromPeriod!.compareTo(a.fromPeriod!)); - billList = res; - streamController.add(res); - } else { - billList = new BillList(); - billList.bill = []; - streamController.add(billList); - } + if (res.bill!.isNotEmpty) { + res.bill?.first.billDetails + ?.sort((a, b) => b.fromPeriod!.compareTo(a.fromPeriod!)); + billList = res; + streamController.add(res); } else { billList = new BillList(); billList.bill = []; streamController.add(billList); } - } catch (e, s) { + } catch (e, s) { ErrorHandler().allExceptionsHandler(navigatorKey.currentContext!, e, s); streamController.addError('error'); } diff --git a/frontend/mgramseva/lib/providers/forgot_password_provider.dart b/frontend/mgramseva/lib/providers/forgot_password_provider.dart index a699d3cec..f64ec3835 100644 --- a/frontend/mgramseva/lib/providers/forgot_password_provider.dart +++ b/frontend/mgramseva/lib/providers/forgot_password_provider.dart @@ -30,11 +30,9 @@ class ForgotPasswordProvider with ChangeNotifier { await ForgotPasswordRepository().forgotPassword(body, context); Navigator.pop(context); - if (otpResponse != null) { - Navigator.of(context) - .pushNamed(Routes.RESET_PASSWORD, arguments: {"id": mobileNumber}); - } - } catch (e, s) { + Navigator.of(context) + .pushNamed(Routes.RESET_PASSWORD, arguments: {"id": mobileNumber}); + } catch (e, s) { Navigator.pop(context); ErrorHandler().allExceptionsHandler(context, e, s); } diff --git a/frontend/mgramseva/lib/providers/household_details_provider.dart b/frontend/mgramseva/lib/providers/household_details_provider.dart index fe59b7e33..98a40253e 100644 --- a/frontend/mgramseva/lib/providers/household_details_provider.dart +++ b/frontend/mgramseva/lib/providers/household_details_provider.dart @@ -61,8 +61,7 @@ class HouseHoldProvider with ChangeNotifier { "tenantId": commonProvider.userDetails!.selectedtenant!.code, ...{'connectionNumber': id}, }); - if (res != null && - res.waterConnection != null && + if (res.waterConnection != null && res.waterConnection!.isNotEmpty) { data = res.waterConnection!.first; } diff --git a/frontend/mgramseva/lib/providers/household_register_provider.dart b/frontend/mgramseva/lib/providers/household_register_provider.dart index 5b3c3c285..0208c0e63 100644 --- a/frontend/mgramseva/lib/providers/household_register_provider.dart +++ b/frontend/mgramseva/lib/providers/household_register_provider.dart @@ -128,40 +128,38 @@ class HouseholdRegisterProvider with ChangeNotifier { isLoaderEnabled = false; - if (response != null) { - if (selectedTab == Constants.ALL) { - collectionCountHolder[Constants.ALL] = response.totalCount ?? 0; - collectionCountHolder[Constants.PAID] = - response.collectionDataCount?.collectionPaid ?? 0; - collectionCountHolder[Constants.PENDING] = - response.collectionDataCount?.collectionPending ?? 0; - } else if (searchResponse != null) { - collectionCountHolder[Constants.ALL] = searchResponse.totalCount ?? 0; - collectionCountHolder[Constants.PAID] = - searchResponse.collectionDataCount?.collectionPaid ?? 0; - collectionCountHolder[Constants.PENDING] = - searchResponse.collectionDataCount?.collectionPending ?? 0; - } - - if (waterConnectionsDetails == null) { - waterConnectionsDetails = response; - notifyListeners(); - } else { - waterConnectionsDetails?.totalCount = response.totalCount; - waterConnectionsDetails?.waterConnection - ?.addAll(response.waterConnection ?? []); - } + if (selectedTab == Constants.ALL) { + collectionCountHolder[Constants.ALL] = response.totalCount ?? 0; + collectionCountHolder[Constants.PAID] = + response.collectionDataCount?.collectionPaid ?? 0; + collectionCountHolder[Constants.PENDING] = + response.collectionDataCount?.collectionPending ?? 0; + } else if (searchResponse != null) { + collectionCountHolder[Constants.ALL] = searchResponse.totalCount ?? 0; + collectionCountHolder[Constants.PAID] = + searchResponse.collectionDataCount?.collectionPaid ?? 0; + collectionCountHolder[Constants.PENDING] = + searchResponse.collectionDataCount?.collectionPending ?? 0; + } + + if (waterConnectionsDetails == null) { + waterConnectionsDetails = response; notifyListeners(); - streamController.add(waterConnectionsDetails!.waterConnection!.isEmpty - ? [] - : waterConnectionsDetails?.waterConnection?.sublist( - offSet - 1, - ((offset + limit - 1) > - (waterConnectionsDetails?.totalCount ?? 0)) - ? (waterConnectionsDetails!.totalCount!) - : (offset + limit) - 1)); + } else { + waterConnectionsDetails?.totalCount = response.totalCount; + waterConnectionsDetails?.waterConnection + ?.addAll(response.waterConnection ?? []); } - } catch (e, s) { + notifyListeners(); + streamController.add(waterConnectionsDetails!.waterConnection!.isEmpty + ? [] + : waterConnectionsDetails?.waterConnection?.sublist( + offSet - 1, + ((offset + limit - 1) > + (waterConnectionsDetails?.totalCount ?? 0)) + ? (waterConnectionsDetails!.totalCount!) + : (offset + limit) - 1)); + } catch (e, s) { isLoaderEnabled = false; notifyListeners(); streamController.addError('error'); @@ -399,6 +397,33 @@ class HouseholdRegisterProvider with ChangeNotifier { i18.householdRegister.ACTIVE_INACTIVE, i18.householdRegister.LAST_BILL_GEN_DATE ]; + var downloadheaderList = [ + i18.common.VILLAGE_CODE, + i18.common.VILLAGE_NAME, + i18.common.TENANT_ID, + i18.common.NAME, + i18.common.GENDER, + i18.consumer.FATHER_SPOUSE_NAME, + i18.common.MOBILE_NUMBER, + i18.consumer.OLD_CONNECTION_ID, + i18.common.CONNECTION_ID, + i18.consumer.CONSUMER_CATEGORY, + i18.consumer.CONSUMER_SUBCATEGORY, + i18.searchWaterConnection.PROPERTY_TYPE, + i18.searchWaterConnection.CONNECTION_TYPE, + i18.demandGenerate.METER_READING_DATE, + i18.searchWaterConnection.METER_NUMBER, + i18.demandGenerate.PREV_METER_READING_LABEL, + i18.householdRegister.LAST_BILL_GEN_DATE, + i18.common.ARREARS, + i18.common.CORE_PENALTY, + i18.common.CORE_ADVANCE, + i18.householdRegister.PENDING_COLLECTIONS, + i18.common.CORE_ADVANCE, + i18.householdRegister.PENDING_COLLECTIONS, + i18.householdRegister.ACTIVE_INACTIVE + + ]; var pdfTableData = waterConnectionsDetails.waterConnection ?.map>((connection) => [ diff --git a/frontend/mgramseva/lib/providers/notification_screen_provider.dart b/frontend/mgramseva/lib/providers/notification_screen_provider.dart index 884c062c6..891d11d38 100644 --- a/frontend/mgramseva/lib/providers/notification_screen_provider.dart +++ b/frontend/mgramseva/lib/providers/notification_screen_provider.dart @@ -28,7 +28,7 @@ class NotificationScreenProvider with ChangeNotifier { var commonProvider = Provider.of( navigatorKey.currentContext!, listen: false); - if (notifications != null && notifications.length > 0) { + if (notifications.length > 0) { final jsonList = notifications.map((item) => jsonEncode(item)).toList(); final uniqueJsonList = jsonList.toSet().toList(); var result = new EventsList.fromJson( diff --git a/frontend/mgramseva/lib/providers/notifications_provider.dart b/frontend/mgramseva/lib/providers/notifications_provider.dart index 14f29ae50..ddf39661d 100644 --- a/frontend/mgramseva/lib/providers/notifications_provider.dart +++ b/frontend/mgramseva/lib/providers/notifications_provider.dart @@ -22,7 +22,7 @@ class NotificationProvider with ChangeNotifier { List res = [] ..addAll(notifications2!.events!) ..addAll(notifications1!.events!); - if (res != null && res.length > 0) { + if (res.length > 0) { final jsonList = res.map((item) => jsonEncode(item)).toList(); final uniqueJsonList = jsonList.toSet().toList(); var result = EventsList.fromJson({ diff --git a/frontend/mgramseva/lib/providers/reports_provider.dart b/frontend/mgramseva/lib/providers/reports_provider.dart index 6b20c213f..12bfb02c2 100644 --- a/frontend/mgramseva/lib/providers/reports_provider.dart +++ b/frontend/mgramseva/lib/providers/reports_provider.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:mgramseva/model/reports/InactiveConsumerReportData.dart'; -import 'package:mgramseva/utils/common_widgets.dart'; import 'package:provider/provider.dart'; import 'package:syncfusion_flutter_xlsio/xlsio.dart'; @@ -18,8 +17,7 @@ import '../utils/constants.dart'; import 'package:mgramseva/utils/constants/i18_key_constants.dart'; import '../utils/date_formats.dart'; import '../utils/error_logging.dart'; -import 'package:mgramseva/utils/excel_download/save_file_mobile.dart' - if (dart.library.html) 'package:mgramseva/utils/excel_download/save_file_web.dart'; +import 'package:mgramseva/utils/excel_download/save_file_mobile.dart'; import '../utils/global_variables.dart'; import '../utils/localization/application_localizations.dart'; import '../utils/models.dart'; @@ -28,7 +26,7 @@ import 'package:mgramseva/services/mdms.dart' as mdms; class ReportsProvider with ChangeNotifier { var streamController = StreamController.broadcast(); - LanguageList? languageList; + LanguageList? billingYearList; var selectedBillYear; var selectedBillPeriod; var selectedBillCycle; @@ -179,15 +177,18 @@ class ReportsProvider with ChangeNotifier { void onChangeOfBillYear(val) { selectedBillYear = val; + print(val.toString()); + billingyearCtrl.text = val.toString(); billingcycleCtrl.clear(); selectedBillCycle = null; selectedBillPeriod = null; notifyListeners(); } - void onChangeOfBillCycle(val) { - var result = DateTime.parse(val); - selectedBillCycle = (DateFormats.getMonth(result)); + void onChangeOfBillCycle(cycle) { + var val = cycle['code']; + var result = DateTime.parse(val.toString()); + selectedBillCycle = cycle; selectedBillPeriod = (DateFormats.getFilteredDate( result.toLocal().toString(), dateFormat: "dd/MM/yyyy")) + @@ -207,16 +208,70 @@ class ReportsProvider with ChangeNotifier { listen: false); var res = await CoreRepository().getMdms(mdms.getTenantFinancialYearList( commonProvider.userDetails!.userRequest!.tenantId.toString())); - languageList = res; + billingYearList = res; notifyListeners(); - streamController.add(languageList); + streamController.add(billingYearList); } catch (e, s) { ErrorHandler().allExceptionsHandler(navigatorKey.currentContext!, e, s); streamController.addError('error'); } } + List getFinancialYearListDropdownA( + LanguageList? languageList) { + if (languageList?.mdmsRes?.billingService?.taxPeriodList != null) { + CommonMethods.getFilteredFinancialYearList( + languageList?.mdmsRes?.billingService?.taxPeriodList ?? + []); + languageList?.mdmsRes?.billingService?.taxPeriodList! + .sort((a, b) => a.fromDate!.compareTo(b.fromDate!)); + return (languageList?.mdmsRes?.billingService?.taxPeriodList ?? + []) + .reversed + .toList(); + } + return []; + } + List> getBillingCycleDropdownA( + dynamic selectedBillYear) { + List> dates = []; + if (selectedBillYear != null) { + DatePeriod ytd; + var fromDate = DateFormats.getFormattedDateToDateTime( + DateFormats.timeStampToDate(selectedBillYear.fromDate)) as DateTime; - List> getFinancialYearListDropdown( + var toDate = DateFormats.getFormattedDateToDateTime( + DateFormats.timeStampToDate(selectedBillYear.toDate)) as DateTime; + + ytd = DatePeriod(fromDate, toDate, DateType.YTD); + + /// Get months based on selected billing year + var months = CommonMethods.getPastMonthUntilFinancialYTD(ytd, + showCurrentMonth: true); + + /// if selected year is future year means all the months will be removed + if (fromDate.year > ytd.endDate.year) months.clear(); + + for (var i = 0; i < months.length; i++) { + var prevMonth = months[i].startDate; + var r = {"code": prevMonth, "name": '${ApplicationLocalizations.of(navigatorKey.currentContext!) + .translate((Constants.MONTHS[prevMonth.month - 1])) + + " - " + + prevMonth.year.toString()}'}; + dates.add(r); + } + } + // if (dates.length > 0) { + // return (dates).map((value) { + // var d = value['name']; + // return "${ApplicationLocalizations.of(navigatorKey.currentContext!) + // .translate((Constants.MONTHS[d.month - 1])) + + // " - " + + // d.year.toString()}"; + // }).toList(); + // } + return dates; + } + List getFinancialYearListDropdown( LanguageList? languageList) { if (languageList?.mdmsRes?.billingService?.taxPeriodList != null) { CommonMethods.getFilteredFinancialYearList( @@ -227,21 +282,18 @@ class ReportsProvider with ChangeNotifier { return (languageList?.mdmsRes?.billingService?.taxPeriodList ?? []) .map((value) { - return DropdownMenuItem( - value: value, - child: new Text((value.financialYear!)), - ); + return value; }) .toList() .reversed .toList(); } - return >[]; + return []; } - List> getBillingCycleDropdown( + List> getBillingCycleDropdown( dynamic selectedBillYear) { - var dates = []; + var dates = >[]; if (selectedBillYear != null) { DatePeriod ytd; var fromDate = DateFormats.getFormattedDateToDateTime( @@ -261,24 +313,17 @@ class ReportsProvider with ChangeNotifier { for (var i = 0; i < months.length; i++) { var prevMonth = months[i].startDate; - var r = {"code": prevMonth, "name": prevMonth}; + Map r = {"code": prevMonth, "name": "${ApplicationLocalizations.of(navigatorKey.currentContext!) + .translate((Constants.MONTHS[prevMonth.month - 1])) + + " - " + + prevMonth.year.toString()}"}; dates.add(r); } } if (dates.length > 0) { - return (dates).map((value) { - var d = value['name']; - return DropdownMenuItem( - value: value['code'].toLocal().toString(), - child: new Text( - ApplicationLocalizations.of(navigatorKey.currentContext!) - .translate((Constants.MONTHS[d.month - 1])) + - " - " + - d.year.toString()), - ); - }).toList(); + return dates; } - return >[]; + return >[]; } Future getDemandReport( diff --git a/frontend/mgramseva/lib/providers/revenue_dashboard_provider.dart b/frontend/mgramseva/lib/providers/revenue_dashboard_provider.dart index e2c7f8ceb..ab687738c 100644 --- a/frontend/mgramseva/lib/providers/revenue_dashboard_provider.dart +++ b/frontend/mgramseva/lib/providers/revenue_dashboard_provider.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:community_charts_flutter/community_charts_flutter.dart' as charts; import 'package:flutter/material.dart'; import 'package:mgramseva/model/dashboard/revenue_dashboard.dart'; import 'package:mgramseva/providers/common_provider.dart'; @@ -14,7 +15,6 @@ import 'package:mgramseva/model/dashboard/revenue_dashboard.dart' as expense; import '../screeens/dashboard/revenue_expense_dashboard/revenue.dart'; import 'dashboard_provider.dart'; -import 'package:charts_flutter/flutter.dart' as charts; class RevenueDashboard with ChangeNotifier { int selectedIndex = 0; diff --git a/frontend/mgramseva/lib/providers/search_connection_provider.dart b/frontend/mgramseva/lib/providers/search_connection_provider.dart index 5beab8563..e5ea0342b 100644 --- a/frontend/mgramseva/lib/providers/search_connection_provider.dart +++ b/frontend/mgramseva/lib/providers/search_connection_provider.dart @@ -59,7 +59,7 @@ class SearchConnectionProvider with ChangeNotifier { try { Loaders.showLoadingDialog(context); var inputJson = searchconnection.toJson(); - inputJson.removeWhere((key, value) => key == null || value == ""); + inputJson.removeWhere((key, value) => value == ""); var connectionresults = isNameSearch == true ? SearchConnectionRepository().getConnectionName({ "tenantId": commonProvider.userDetails!.selectedtenant!.code, ...inputJson @@ -70,30 +70,28 @@ class SearchConnectionProvider with ChangeNotifier { /// popping the loader - if (connectionresults != null) { - connectionresults.then( - (value) => { - Navigator.pop(context), - if (value.waterConnectionData!.length > 0 || value.waterConnection!.length > 0) - { - waterConnections = value, - Navigator.pushNamed( - context, Routes.SEARCH_CONSUMER_RESULT, - arguments: {...inputJson, ...arguments, "isNameSearch" : isNameSearch }) - } - else - { - Notifiers.getToastMessage( - context, - i18.searchWaterConnection.NO_CONNECTION_FOUND, - "ERROR") - } - }, onError: (e, s) { - Navigator.pop(context); - ErrorHandler().allExceptionsHandler(context, e, s); - }); - } - } catch (e, s) { + connectionresults.then( + (value) => { + Navigator.pop(context), + if (value.waterConnectionData!.length > 0 || value.waterConnection!.length > 0) + { + waterConnections = value, + Navigator.pushNamed( + context, Routes.SEARCH_CONSUMER_RESULT, + arguments: {...inputJson, ...arguments, "isNameSearch" : isNameSearch }) + } + else + { + Notifiers.getToastMessage( + context, + i18.searchWaterConnection.NO_CONNECTION_FOUND, + "ERROR") + } + }, onError: (e, s) { + Navigator.pop(context); + ErrorHandler().allExceptionsHandler(context, e, s); + }); + } catch (e, s) { Navigator.pop(context); ErrorHandler().allExceptionsHandler(context, e, s); } diff --git a/frontend/mgramseva/lib/providers/tenants_provider.dart b/frontend/mgramseva/lib/providers/tenants_provider.dart index fe45b15f4..90d6c4e41 100644 --- a/frontend/mgramseva/lib/providers/tenants_provider.dart +++ b/frontend/mgramseva/lib/providers/tenants_provider.dart @@ -25,11 +25,9 @@ class TenantsProvider with ChangeNotifier { navigatorKey.currentContext!, listen: false); var userResponse = await TenantRepo().fetchTenants(getTenantsMDMS(commonProvider.userDetails!.userRequest!.tenantId.toString())); - if (userResponse != null) { - tenants = userResponse; - streamController.add(userResponse); - } - } catch (e, s) { + tenants = userResponse; + streamController.add(userResponse); + } catch (e, s) { ErrorHandler().allExceptionsHandler(navigatorKey.currentContext!, e, s); streamController.addError('error'); } diff --git a/frontend/mgramseva/lib/providers/user_edit_profile_provider.dart b/frontend/mgramseva/lib/providers/user_edit_profile_provider.dart index ac0c6e111..723768a37 100644 --- a/frontend/mgramseva/lib/providers/user_edit_profile_provider.dart +++ b/frontend/mgramseva/lib/providers/user_edit_profile_provider.dart @@ -25,21 +25,19 @@ class UserEditProfileProvider with ChangeNotifier { var edituserResponse = await UserEditProfileRepository().editProfile(body); Navigator.pop(context); - if (edituserResponse != null) { - Notifiers.getToastMessage( - context, i18.profileEdit.PROFILE_EDIT_SUCCESS, 'SUCCESS'); - streamController.add(edituserResponse); - if(edituserResponse.user?.isNotEmpty ?? false) { - Provider.of(context, listen: false) - ..userDetails?.userRequest?.name = edituserResponse.user?.first.name - ..userDetails?.userRequest?.emailId = edituserResponse.user?.first - .emailId - ..loginCredentials = Provider.of(context, listen: false).userDetails; - } - Navigator.pop(context); - Navigator.pop(context); + Notifiers.getToastMessage( + context, i18.profileEdit.PROFILE_EDIT_SUCCESS, 'SUCCESS'); + streamController.add(edituserResponse); + if(edituserResponse.user?.isNotEmpty ?? false) { + Provider.of(context, listen: false) + ..userDetails?.userRequest?.name = edituserResponse.user?.first.name + ..userDetails?.userRequest?.emailId = edituserResponse.user?.first + .emailId + ..loginCredentials = Provider.of(context, listen: false).userDetails; } - } catch (e, s) { + Navigator.pop(context); + Navigator.pop(context); + } catch (e, s) { Navigator.pop(context); ErrorHandler().allExceptionsHandler(context, e, s); } diff --git a/frontend/mgramseva/lib/providers/user_profile_provider.dart b/frontend/mgramseva/lib/providers/user_profile_provider.dart index 2a1bad62d..3c2f2cfc0 100644 --- a/frontend/mgramseva/lib/providers/user_profile_provider.dart +++ b/frontend/mgramseva/lib/providers/user_profile_provider.dart @@ -19,11 +19,9 @@ class UserProfileProvider with ChangeNotifier { Future getUserProfileDetails(body, BuildContext context) async { try { var userResponse = await UserProfileRepository().getProfile(body); - if (userResponse != null) { - streamController.add(userResponse.user?.first); - profileDetails = userResponse.user!.first; - } - } catch (e, s) { + streamController.add(userResponse.user?.first); + profileDetails = userResponse.user!.first; + } catch (e, s) { ErrorHandler().allExceptionsHandler(context, e, s); streamController.addError('error'); } diff --git a/frontend/mgramseva/lib/repository/core_repo.dart b/frontend/mgramseva/lib/repository/core_repo.dart index 1b83ffcdd..b65bd4d97 100644 --- a/frontend/mgramseva/lib/repository/core_repo.dart +++ b/frontend/mgramseva/lib/repository/core_repo.dart @@ -248,12 +248,11 @@ class CoreRepository extends BaseService { headers: header, body: jsonEncode({"url": inputUrl})); - if (response.body != null) { - return response.body; - } - } catch (e, s) { + return response.body; + } catch (e, s) { ErrorHandler().allExceptionsHandler(navigatorKey.currentContext!, e, s); } + return null; } Future getFileStorefromPdfService(body, params) async { @@ -288,6 +287,7 @@ class CoreRepository extends BaseService { } catch (e, s) { ErrorHandler().allExceptionsHandler(navigatorKey.currentContext!, e, s); } + return null; } Future fetchNotifications(params) async { @@ -320,6 +320,7 @@ class CoreRepository extends BaseService { } catch (e, s) { ErrorHandler().allExceptionsHandler(navigatorKey.currentContext!, e, s); } + return null; } Future updateNotifications(events) async { @@ -350,6 +351,7 @@ class CoreRepository extends BaseService { } catch (e, s) { ErrorHandler().allExceptionsHandler(navigatorKey.currentContext!, e, s); } + return null; } Future fileDownload(BuildContext context, String url, @@ -370,11 +372,19 @@ class CoreRepository extends BaseService { } else if (Platform.isIOS) { downloadPath = (await getApplicationDocumentsDirectory()).path; } else { - downloadPath = (await getExternalStorageDirectory())?.path; + downloadPath = (await getDownloadsDirectory())?.path; } var status = await Permission.storage.status; + var status2 = await Permission.photos.status; + var status1 = await Permission.notification.status; if (!status.isGranted) { await Permission.storage.request(); + }if (!status1.isGranted) { + await Permission.notification.request(); + } + if (!status2.isGranted) { + await Permission.photos.request(); + await Permission.videos.request(); } final response = await FlutterDownloader.enqueue( @@ -392,6 +402,7 @@ class CoreRepository extends BaseService { } catch (e, s) { ErrorHandler().allExceptionsHandler(context, e, s); } + return null; } Future submitFeedBack(Map body) async { diff --git a/frontend/mgramseva/lib/routing.dart b/frontend/mgramseva/lib/routing.dart index 759901f36..08b7fb3c3 100644 --- a/frontend/mgramseva/lib/routing.dart +++ b/frontend/mgramseva/lib/routing.dart @@ -167,7 +167,7 @@ class Routing { } if (kIsWeb) { - FirebaseAnalytics analytics = FirebaseAnalytics(); + FirebaseAnalytics analytics = FirebaseAnalytics.instance; analytics.logEvent(name: "screen_view", parameters: { 'firebase_screen': "$path", 'screen_name': "$path", diff --git a/frontend/mgramseva/lib/screeens/add_expense/add_expense_walk_through/expense_walk_through.dart b/frontend/mgramseva/lib/screeens/add_expense/add_expense_walk_through/expense_walk_through.dart index 4e426135c..4d256d1a6 100644 --- a/frontend/mgramseva/lib/screeens/add_expense/add_expense_walk_through/expense_walk_through.dart +++ b/frontend/mgramseva/lib/screeens/add_expense/add_expense_walk_through/expense_walk_through.dart @@ -20,6 +20,7 @@ var json = [ (val) => {}, [], true, + itemAsString: (i) =>i.toString(), ), }, { diff --git a/frontend/mgramseva/lib/screeens/add_expense/expense_details.dart b/frontend/mgramseva/lib/screeens/add_expense/expense_details.dart index 292cc5e96..2ad06955a 100644 --- a/frontend/mgramseva/lib/screeens/add_expense/expense_details.dart +++ b/frontend/mgramseva/lib/screeens/add_expense/expense_details.dart @@ -1,5 +1,3 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:mgramseva/widgets/keyboard_focus_watcher.dart'; @@ -108,7 +106,7 @@ class _ExpenseDetailsState extends State { return CommonWidgets.buildEmptyMessage( snapshot.data, context); } - return _buildUserView(snapshot.data); + return _buildUserView(); } else if (snapshot.hasError) { return Notifiers.networkErrorPage( context, @@ -155,7 +153,7 @@ class _ExpenseDetailsState extends State { print(context); } - Widget _buildUserView(ExpensesDetailsModel expenseDetails) { + Widget _buildUserView() { return FormWrapper(Consumer( builder: (_, expenseProvider, child) => Column( mainAxisAlignment: MainAxisAlignment.start, @@ -206,28 +204,31 @@ class _ExpenseDetailsState extends State { if (isUpdate) BuildTextField( '${i18.common.BILL_ID}', - expenseDetails.challanNumberCtrl, + expensesDetailsProvider.expenditureDetails.challanNumberCtrl, isDisabled: true, ), SelectFieldBuilder( i18.expense.EXPENSE_TYPE, - expenseDetails.expenseType, + expensesDetailsProvider.expenditureDetails.expenseType, '', '', expensesDetailsProvider.onChangeOfExpenses, expensesDetailsProvider.getExpenseTypeList(isSearch: isUpdate), true, - isEnabled: expenseDetails.allowEdit, + readOnly: !expensesDetailsProvider.expenditureDetails.allowEdit!, requiredMessage: i18.expense.SELECT_EXPENDITURE_CATEGORY, contextKey: expenseProvider.expenseWalkthrougList[0].key, - controller: expenseDetails.expenseTypeController, + controller: expensesDetailsProvider.expenditureDetails.expenseTypeController, key: Keys.expense.EXPENSE_TYPE, + itemAsString: (i) =>'${ApplicationLocalizations.of(context) + .translate( + i.toString())}', ), AutoCompleteView( labelText: i18.expense.VENDOR_NAME, - controller: expenseDetails.vendorNameCtrl, + controller: expensesDetailsProvider.expenditureDetails.vendorNameCtrl, suggestionsBoxController: expensesDetailsProvider .suggestionsBoxController, onSuggestionSelected: @@ -236,7 +237,7 @@ class _ExpenseDetailsState extends State { expensesDetailsProvider.onSearchVendorList, listTile: buildTile, isRequired: true, - isEnabled: expenseDetails.allowEdit, + isEnabled: expensesDetailsProvider.expenditureDetails.allowEdit, requiredMessage: i18.expense.MENTION_NAME_OF_VENDOR, inputFormatter: [ @@ -247,10 +248,10 @@ class _ExpenseDetailsState extends State { expenseProvider.expenseWalkthrougList[1].key, key: Keys.expense.VENDOR_NAME, ), - if (expenseDetails.vendorNameCtrl.text.trim().isNotEmpty) + if (expensesDetailsProvider.expenditureDetails.vendorNameCtrl.text.trim().isNotEmpty) BuildTextField( '${i18.common.MOBILE_NUMBER}', - expenseDetails.mobileNumberController, + expensesDetailsProvider.expenditureDetails.mobileNumberController, isRequired: true, prefixText: '+91 - ', textInputType: TextInputType.number, @@ -270,7 +271,7 @@ class _ExpenseDetailsState extends State { ), BuildTextField( '${i18.expense.AMOUNT}', - expenseDetails.expensesAmount!.first.amountCtrl, + expensesDetailsProvider.expenditureDetails.expensesAmount!.first.amountCtrl, isRequired: true, textInputType: TextInputType.number, inputFormatter: [ @@ -279,7 +280,7 @@ class _ExpenseDetailsState extends State { ], placeHolder: '${i18.expense.AMOUNT} (₹)', labelSuffix: '(₹)', - isDisabled: (expenseDetails.allowEdit ?? true) + isDisabled: (expensesDetailsProvider.expenditureDetails.allowEdit ?? true) ? false : true, requiredMessage: @@ -307,23 +308,23 @@ class _ExpenseDetailsState extends State { BasicDateField( i18.expense.BILL_DATE, true, - expenseDetails.billDateCtrl, - firstDate: expenseDetails.billIssuedDateCtrl.text + expensesDetailsProvider.expenditureDetails.billDateCtrl, + firstDate: expensesDetailsProvider.expenditureDetails.billIssuedDateCtrl.text .trim() .isEmpty ? null : DateFormats.getFormattedDateToDateTime( - expenseDetails.billIssuedDateCtrl.text + expensesDetailsProvider.expenditureDetails.billIssuedDateCtrl.text .trim(), ), initialDate: DateFormats.getFormattedDateToDateTime( - expenseDetails.billDateCtrl.text.trim(), + expensesDetailsProvider.expenditureDetails.billDateCtrl.text.trim(), ), lastDate: DateTime.now(), onChangeOfDate: expensesDetailsProvider.onChangeOfBillDate, - isEnabled: expenseDetails.allowEdit, + isEnabled: expensesDetailsProvider.expenditureDetails.allowEdit, requiredMessage: i18.expense.DATE_BILL_ENTERED_IN_RECORDS, contextKey: @@ -334,13 +335,13 @@ class _ExpenseDetailsState extends State { BasicDateField( i18.expense.EXPENSE_START_DATE, true, - expenseDetails.fromDateCtrl, + expensesDetailsProvider.expenditureDetails.fromDateCtrl, onChangeOfDate: expensesDetailsProvider.onChangeOfStartEndDate, lastDate: DateFormats.getFormattedDateToDateTime( - expenseDetails.billDateCtrl.text.trim(), + expensesDetailsProvider.expenditureDetails.billDateCtrl.text.trim(), ) ?? DateTime.now(), - isEnabled: expenseDetails.allowEdit, + isEnabled: expensesDetailsProvider.expenditureDetails.allowEdit, validator: (val) => expensesDetailsProvider.fromToDateValidator(val, true), autoValidation: expenseProvider.dateAutoValidation ? AutovalidateMode.always : AutovalidateMode.disabled, @@ -349,16 +350,16 @@ class _ExpenseDetailsState extends State { BasicDateField( i18.expense.EXPENSE_END_DATE, true, - expenseDetails.toDateCtrl, + expensesDetailsProvider.expenditureDetails.toDateCtrl, initialDate: DateFormats.getFormattedDateToDateTime( - expenseDetails.billDateCtrl.text.trim(), + expensesDetailsProvider.expenditureDetails.billDateCtrl.text.trim(), ), lastDate: DateFormats.getFormattedDateToDateTime( - expenseDetails.billDateCtrl.text.trim(), + expensesDetailsProvider.expenditureDetails.billDateCtrl.text.trim(), ) ?? DateTime.now(), onChangeOfDate: expensesDetailsProvider.onChangeOfStartEndDate, - isEnabled: expenseDetails.allowEdit, + isEnabled: expensesDetailsProvider.expenditureDetails.allowEdit, validator: expensesDetailsProvider.fromToDateValidator, autoValidation: expenseProvider.dateAutoValidation ? AutovalidateMode.always : AutovalidateMode.disabled, @@ -372,20 +373,20 @@ class _ExpenseDetailsState extends State { BasicDateField( i18.expense.PARTY_BILL_DATE, false, - expenseDetails.billIssuedDateCtrl, + expensesDetailsProvider.expenditureDetails.billIssuedDateCtrl, initialDate: DateFormats.getFormattedDateToDateTime( - expenseDetails.billIssuedDateCtrl.text.trim(), + expensesDetailsProvider.expenditureDetails.billIssuedDateCtrl.text.trim(), ), - lastDate: expenseDetails.billDateCtrl.text + lastDate: expensesDetailsProvider.expenditureDetails.billDateCtrl.text .trim() .isEmpty ? DateTime.now() : DateFormats.getFormattedDateToDateTime( - expenseDetails.billDateCtrl.text.trim()), + expensesDetailsProvider.expenditureDetails.billDateCtrl.text.trim()), onChangeOfDate: expensesDetailsProvider.onChangeOfDate, - isEnabled: expenseDetails.allowEdit, + isEnabled: expensesDetailsProvider.expenditureDetails.allowEdit, contextKey: expenseProvider.expenseWalkthrougList[4].key, key: Keys.expense.EXPENSE_PARTY_DATE, @@ -393,31 +394,31 @@ class _ExpenseDetailsState extends State { RadioButtonFieldBuilder( context, i18.expense.HAS_THIS_BILL_PAID, - expenseDetails.isBillPaid, + expensesDetailsProvider.expenditureDetails.isBillPaid, '', '', true, Constants.EXPENSESTYPE, expensesDetailsProvider.onChangeOfBillPaid, - isEnabled: expenseDetails.allowEdit), - if (expenseDetails.isBillPaid ?? false) + isEnabled: expensesDetailsProvider.expenditureDetails.allowEdit), + if (expensesDetailsProvider.expenditureDetails.isBillPaid ?? false) BasicDateField(i18.expense.PAYMENT_DATE, true, - expenseDetails.paidDateCtrl, + expensesDetailsProvider.expenditureDetails.paidDateCtrl, firstDate: DateFormats.getFormattedDateToDateTime( - expenseDetails.billDateCtrl.text + expensesDetailsProvider.expenditureDetails.billDateCtrl.text .trim()), lastDate: DateTime.now(), initialDate: DateFormats.getFormattedDateToDateTime( - expenseDetails.paidDateCtrl.text + expensesDetailsProvider.expenditureDetails.paidDateCtrl.text .trim()), onChangeOfDate: expensesDetailsProvider.onChangeOfDate, - isEnabled: expenseDetails.allowEdit), + isEnabled: expensesDetailsProvider.expenditureDetails.allowEdit), if (isUpdate && - expenseDetails.fileStoreList != null && - expenseDetails.fileStoreList!.isNotEmpty) + expensesDetailsProvider.expenditureDetails.fileStoreList != null && + expensesDetailsProvider.expenditureDetails.fileStoreList!.isNotEmpty) Container( margin: const EdgeInsets.only( top: 20.0, bottom: 5, right: 20, left: 20), @@ -432,7 +433,7 @@ class _ExpenseDetailsState extends State { fontSize: 19, fontWeight: FontWeight.normal)), Wrap( - children: expenseDetails.fileStoreList! + children: expensesDetailsProvider.expenditureDetails.fileStoreList! .map((e) => InkWell( onTap: () => expensesDetailsProvider @@ -463,7 +464,7 @@ class _ExpenseDetailsState extends State { ], ), ), - if (expenseDetails.allowEdit ?? true) + if (expensesDetailsProvider.expenditureDetails.allowEdit ?? true) FilePickerDemo( key: expensesDetailsProvider.filePickerKey, callBack: @@ -473,7 +474,7 @@ class _ExpenseDetailsState extends State { .expenseWalkthrougList[5].key, ), if (isUpdate) - expensesDetailsProvider.isPSPCLEnabled && expenseDetails.expenseType=='ELECTRICITY_BILL'?Container(): + expensesDetailsProvider.isPSPCLEnabled && expensesDetailsProvider.expenditureDetails.expenseType=='ELECTRICITY_BILL'?Container(): Container( alignment: Alignment.centerLeft, padding: EdgeInsets.symmetric( @@ -487,7 +488,7 @@ class _ExpenseDetailsState extends State { width: 20, height: 20, child: Checkbox( - value: expenseDetails.isBillCancelled, + value: expensesDetailsProvider.expenditureDetails.isBillCancelled, onChanged: expensesDetailsProvider .onChangeOfCheckBox), ), diff --git a/frontend/mgramseva/lib/screeens/change_password/change_password.dart b/frontend/mgramseva/lib/screeens/change_password/change_password.dart index 1300326f6..ea786bedf 100644 --- a/frontend/mgramseva/lib/screeens/change_password/change_password.dart +++ b/frontend/mgramseva/lib/screeens/change_password/change_password.dart @@ -135,7 +135,7 @@ class _ChangePasswordState extends State { Provider.of(context, listen: false); return FocusWatcher( child: Scaffold( - backgroundColor: Theme.of(context).backgroundColor, + backgroundColor: Theme.of(context).colorScheme.background, appBar: BaseAppBar( Text(i18.common.MGRAM_SEVA), AppBar(), diff --git a/frontend/mgramseva/lib/screeens/common/payment_failure.dart b/frontend/mgramseva/lib/screeens/common/payment_failure.dart index 4e99e2439..d0ce426e2 100644 --- a/frontend/mgramseva/lib/screeens/common/payment_failure.dart +++ b/frontend/mgramseva/lib/screeens/common/payment_failure.dart @@ -38,7 +38,7 @@ class _PaymentFailureState extends State { var languageProvider = Provider.of(context, listen: false); return Scaffold( - backgroundColor: Theme.of(context).backgroundColor, + backgroundColor: Theme.of(context).colorScheme.background, appBar: AppBar( title: Text('mGramSeva'), automaticallyImplyLeading: false, diff --git a/frontend/mgramseva/lib/screeens/connection_results/connection_details_card.dart b/frontend/mgramseva/lib/screeens/connection_results/connection_details_card.dart index 037ed349f..da6729b67 100644 --- a/frontend/mgramseva/lib/screeens/connection_results/connection_details_card.dart +++ b/frontend/mgramseva/lib/screeens/connection_results/connection_details_card.dart @@ -1,6 +1,4 @@ -import 'dart:ui'; import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; import 'package:mgramseva/model/connection/water_connections.dart'; import 'package:mgramseva/providers/common_provider.dart'; import 'package:mgramseva/routers/routers.dart'; diff --git a/frontend/mgramseva/lib/screeens/connection_results/connection_results.dart b/frontend/mgramseva/lib/screeens/connection_results/connection_results.dart index eea4d2c7b..f37112189 100644 --- a/frontend/mgramseva/lib/screeens/connection_results/connection_results.dart +++ b/frontend/mgramseva/lib/screeens/connection_results/connection_results.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:mgramseva/model/connection/water_connections.dart'; import 'package:mgramseva/providers/search_connection_provider.dart'; import 'package:mgramseva/screeens/connection_results/connection_details_card.dart'; @@ -43,7 +42,7 @@ class _SearchConsumerResultState extends State { Provider.of(context, listen: false); return Scaffold( - backgroundColor: Theme.of(context).backgroundColor, + backgroundColor: Theme.of(context).colorScheme.background, appBar: CustomAppBar(), drawer: DrawerWrapper( Drawer(child: SideBar()), diff --git a/frontend/mgramseva/lib/screeens/connection_results/search_connection.dart b/frontend/mgramseva/lib/screeens/connection_results/search_connection.dart index 480b6875e..cf5db6c13 100644 --- a/frontend/mgramseva/lib/screeens/connection_results/search_connection.dart +++ b/frontend/mgramseva/lib/screeens/connection_results/search_connection.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_focus_watcher/flutter_focus_watcher.dart'; import 'package:mgramseva/model/connection/search_connection.dart'; import 'package:mgramseva/providers/search_connection_provider.dart'; @@ -44,7 +42,7 @@ class _SearchConsumerConnectionState extends State { Provider.of(context, listen: false); return FocusWatcher( child: Scaffold( - backgroundColor: Theme.of(context).backgroundColor, + backgroundColor: Theme.of(context).colorScheme.background, appBar: CustomAppBar(), drawer: DrawerWrapper( Drawer(child: SideBar()), diff --git a/frontend/mgramseva/lib/screeens/consumer_details/consumer_details.dart b/frontend/mgramseva/lib/screeens/consumer_details/consumer_details.dart index d670622b2..226c66d02 100644 --- a/frontend/mgramseva/lib/screeens/consumer_details/consumer_details.dart +++ b/frontend/mgramseva/lib/screeens/consumer_details/consumer_details.dart @@ -298,6 +298,7 @@ class _ConsumerDetailsState extends State { false, // contextkey: consumerProvider // .consmerWalkthrougList[6].key, + itemAsString: (i) =>'${ApplicationLocalizations.of(context).translate(i.toString())}', controller: consumerProvider.waterconnection.categoryCtrl, key: Keys.createConsumer.CONSUMER_CATEORY_KEY, @@ -315,6 +316,7 @@ class _ConsumerDetailsState extends State { consumerProvider.onChangeOfSubCategory, consumerProvider.getSubCategoryList(), false, + itemAsString: (i) =>'${ApplicationLocalizations.of(context).translate(i.toString())}', // contextkey: consumerProvider // .consmerWalkthrougList[6].key, controller: consumerProvider @@ -364,6 +366,7 @@ class _ConsumerDetailsState extends State { consumerProvider.onChangeOfLocality, consumerProvider.getBoundaryList(), true, + itemAsString: (i) =>'${ApplicationLocalizations.of(context).translate(i.code!.toString())}', contextKey: consumerProvider .consmerWalkthrougList[5].key) : Container()), @@ -379,6 +382,7 @@ class _ConsumerDetailsState extends State { consumerProvider.onChangeOfPropertyType, consumerProvider.getPropertyTypeList(), true, + itemAsString: (i) =>'${ApplicationLocalizations.of(context).translate(i.toString())}', contextKey: consumerProvider.consmerWalkthrougList[6].key, controller: property.address.propertyCtrl, @@ -400,14 +404,15 @@ class _ConsumerDetailsState extends State { consumerProvider .getConnectionTypeList(), true, + itemAsString: (i) =>'${ApplicationLocalizations.of(context).translate(i.toString())}', contextKey: consumerProvider .consmerWalkthrougList[7].key, controller: consumerProvider .waterconnection.ServiceTypeCtrl, - isEnabled: consumerProvider.isEdit == - false || + readOnly: consumerProvider.isEdit == + true || consumerProvider.isFirstDemand == - false, + true, key: Keys.createConsumer .CONSUMER_SERVICE_KEY, ), @@ -510,6 +515,7 @@ class _ConsumerDetailsState extends State { consumerProvider .getFinancialYearList(), true, + itemAsString: (i) =>'${ApplicationLocalizations.of(context).translate(i.financialYear)}', controller: consumerProvider .waterconnection .billingCycleYearCtrl, @@ -528,6 +534,7 @@ class _ConsumerDetailsState extends State { consumerProvider .getBillingCycle(), true, + itemAsString: (i) =>"${ApplicationLocalizations.of(context).translate(i['name'])}", controller: consumerProvider .waterconnection .BillingCycleCtrl, @@ -619,7 +626,7 @@ class _ConsumerDetailsState extends State { var userProvider = Provider.of(context, listen: false); return KeyboardFocusWatcher( child: Scaffold( - backgroundColor: Theme.of(context).backgroundColor, + backgroundColor: Theme.of(context).colorScheme.background, appBar: CustomAppBar(), drawer: DrawerWrapper( Drawer(child: SideBar()), diff --git a/frontend/mgramseva/lib/screeens/consumer_details/consumer_details_walk_through/walk_through.dart b/frontend/mgramseva/lib/screeens/consumer_details/consumer_details_walk_through/walk_through.dart index 8062bedbe..f5ed41bd0 100644 --- a/frontend/mgramseva/lib/screeens/consumer_details/consumer_details_walk_through/walk_through.dart +++ b/frontend/mgramseva/lib/screeens/consumer_details/consumer_details_walk_through/walk_through.dart @@ -63,6 +63,7 @@ var json = [ (val) => {}, [], true, + itemAsString: (i) =>i.toString(), ) }, { @@ -75,6 +76,7 @@ var json = [ (val) => {}, [], true, + itemAsString: (i) =>i.toString(), ) }, { @@ -87,6 +89,7 @@ var json = [ (val) => {}, [], true, + itemAsString: (i) =>i.toString(), ) }, { diff --git a/frontend/mgramseva/lib/screeens/consumer_details/consumer_details_walk_through/walkthrough_1.dart b/frontend/mgramseva/lib/screeens/consumer_details/consumer_details_walk_through/walkthrough_1.dart index 8062bedbe..f5ed41bd0 100644 --- a/frontend/mgramseva/lib/screeens/consumer_details/consumer_details_walk_through/walkthrough_1.dart +++ b/frontend/mgramseva/lib/screeens/consumer_details/consumer_details_walk_through/walkthrough_1.dart @@ -63,6 +63,7 @@ var json = [ (val) => {}, [], true, + itemAsString: (i) =>i.toString(), ) }, { @@ -75,6 +76,7 @@ var json = [ (val) => {}, [], true, + itemAsString: (i) =>i.toString(), ) }, { @@ -87,6 +89,7 @@ var json = [ (val) => {}, [], true, + itemAsString: (i) =>i.toString(), ) }, { diff --git a/frontend/mgramseva/lib/screeens/dashboard/IndividualTab.dart b/frontend/mgramseva/lib/screeens/dashboard/IndividualTab.dart index 7b239998e..4f9794f04 100644 --- a/frontend/mgramseva/lib/screeens/dashboard/IndividualTab.dart +++ b/frontend/mgramseva/lib/screeens/dashboard/IndividualTab.dart @@ -62,7 +62,7 @@ class _IndividualTabState extends State { (expenseList is List ? 5 : 3)); var tableData = expenseList is List ? dashBoardProvider - .getExpenseData(expenseList as List) + .getExpenseData(expenseList) : dashBoardProvider .getCollectionsData(expenseList as List); var extraHeight = 0.0; @@ -70,7 +70,7 @@ class _IndividualTabState extends State { if (e.tableRow.first.label.length > 28) extraHeight += e.tableRow.first.label.substring(28).length.toDouble(); }); - return tableData == null || tableData.isEmpty + return tableData.isEmpty ? SizedBox( height: 100, child: CommonWidgets.buildEmptyMessage( diff --git a/frontend/mgramseva/lib/screeens/dashboard/individual_tab.dart b/frontend/mgramseva/lib/screeens/dashboard/individual_tab.dart index 72ce20505..1fa49938c 100644 --- a/frontend/mgramseva/lib/screeens/dashboard/individual_tab.dart +++ b/frontend/mgramseva/lib/screeens/dashboard/individual_tab.dart @@ -62,7 +62,7 @@ class _IndividualTabState extends State { (expenseList is List ? 5 : 3)); var tableData = expenseList is List ? dashBoardProvider - .getExpenseData(expenseList as List) + .getExpenseData(expenseList) : dashBoardProvider .getCollectionsData(expenseList as List); var extraHeight = 0.0; @@ -70,7 +70,7 @@ class _IndividualTabState extends State { if (e.tableRow.first.label.length > 28) extraHeight += e.tableRow.first.label.substring(28).length.toDouble(); }); - return tableData == null || tableData.isEmpty + return tableData.isEmpty ? SizedBox( height: 100, child: CommonWidgets.buildEmptyMessage( diff --git a/frontend/mgramseva/lib/screeens/dashboard/revenue_expense_dashboard/custom_label_widget/custom_tooltip_label_render.dart b/frontend/mgramseva/lib/screeens/dashboard/revenue_expense_dashboard/custom_label_widget/custom_tooltip_label_render.dart index 2089b6164..17e4b7c87 100644 --- a/frontend/mgramseva/lib/screeens/dashboard/revenue_expense_dashboard/custom_label_widget/custom_tooltip_label_render.dart +++ b/frontend/mgramseva/lib/screeens/dashboard/revenue_expense_dashboard/custom_label_widget/custom_tooltip_label_render.dart @@ -1,13 +1,12 @@ import 'dart:math'; -import 'package:charts_flutter/src/text_element.dart' as ChartText; -import 'package:charts_flutter/src/text_style.dart' as ChartStyle; -import 'package:charts_flutter/flutter.dart'; +import 'package:community_charts_flutter/community_charts_flutter.dart'; +import 'package:community_charts_flutter/src/text_element.dart' as ChartTextElement; +import 'package:community_charts_flutter/src/text_style.dart' as ChartTextStyle; String? _xAxis; String? _pointColor; num? _maxVal; - class ToolTipMgr { static String? get xAxis => _xAxis; @@ -57,14 +56,14 @@ class CustomTooltipLabelRenderer extends CircleSymbolRenderer { roundTopLeft: true, roundTopRight: true, roundBottomLeft: true, roundBottomRight: true, radius: 4); - ChartStyle.TextStyle textStyle = ChartStyle.TextStyle(); + ChartTextStyle.TextStyle textStyle = ChartTextStyle.TextStyle(); textStyle.color = Color.fromHex(code: ToolTipMgr.pointColor ?? '#505A5F'); textStyle.fontSize = 12; canvas.drawText( - ChartText.TextElement('₹ ${ToolTipMgr.xAxis}', style: textStyle), + ChartTextElement.TextElement('₹ ${ToolTipMgr.xAxis}', style: textStyle), (bounds.left - bounds.width ).round(), -10); } diff --git a/frontend/mgramseva/lib/screeens/dashboard/revenue_expense_dashboard/revenue.dart b/frontend/mgramseva/lib/screeens/dashboard/revenue_expense_dashboard/revenue.dart index f8231f54c..01bad0e16 100644 --- a/frontend/mgramseva/lib/screeens/dashboard/revenue_expense_dashboard/revenue.dart +++ b/frontend/mgramseva/lib/screeens/dashboard/revenue_expense_dashboard/revenue.dart @@ -1,9 +1,9 @@ -import 'package:charts_flutter/flutter.dart'; +import 'package:community_charts_flutter/community_charts_flutter.dart'; import 'package:mgramseva/model/dashboard/revenue_dashboard.dart'; import 'package:mgramseva/model/dashboard/revenue_chart.dart'; -import 'package:charts_flutter/flutter.dart' as charts; +import 'package:community_charts_flutter/community_charts_flutter.dart' as charts; import 'package:mgramseva/utils/models.dart'; class RevenueDataHolder { diff --git a/frontend/mgramseva/lib/screeens/dashboard/revenue_expense_dashboard/revenue_charts.dart b/frontend/mgramseva/lib/screeens/dashboard/revenue_expense_dashboard/revenue_charts.dart index 2ba826eac..10bc4fbd3 100644 --- a/frontend/mgramseva/lib/screeens/dashboard/revenue_expense_dashboard/revenue_charts.dart +++ b/frontend/mgramseva/lib/screeens/dashboard/revenue_expense_dashboard/revenue_charts.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:charts_flutter/flutter.dart' as charts; +import 'package:community_charts_flutter/community_charts_flutter.dart' as charts; import 'package:mgramseva/providers/revenue_dashboard_provider.dart'; import 'package:mgramseva/utils/localization/application_localizations.dart'; import 'package:mgramseva/utils/common_widgets.dart'; diff --git a/frontend/mgramseva/lib/screeens/expense/expense_results.dart b/frontend/mgramseva/lib/screeens/expense/expense_results.dart index ecbcabdc6..6a13b8fdb 100644 --- a/frontend/mgramseva/lib/screeens/expense/expense_results.dart +++ b/frontend/mgramseva/lib/screeens/expense/expense_results.dart @@ -22,7 +22,7 @@ class ExpenseResults extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Theme.of(context).backgroundColor, + backgroundColor: Theme.of(context).colorScheme.background, appBar: CustomAppBar(), drawer: DrawerWrapper( Drawer(child: SideBar()), diff --git a/frontend/mgramseva/lib/screeens/expense/search_expense.dart b/frontend/mgramseva/lib/screeens/expense/search_expense.dart index f7cc46c0f..046fbeff9 100644 --- a/frontend/mgramseva/lib/screeens/expense/search_expense.dart +++ b/frontend/mgramseva/lib/screeens/expense/search_expense.dart @@ -45,7 +45,7 @@ class _SearchExpenseState extends State { @override Widget build(BuildContext context) { return KeyboardFocusWatcher(child:Scaffold( - backgroundColor: Theme.of(context).backgroundColor, + backgroundColor: Theme.of(context).colorScheme.background, appBar: CustomAppBar(), drawer: DrawerWrapper( Drawer(child: SideBar()), @@ -87,7 +87,9 @@ class _SearchExpenseState extends State { hint: '${ApplicationLocalizations.of(context).translate(i18.common.ELECTRICITY_HINT)}', controller: expenseTypeCtrl, - key: Keys.expense.SEARCH_EXPENSE_TYPE, + key: Keys.expense.SEARCH_EXPENSE_TYPE, itemAsString: (i) =>'${ApplicationLocalizations.of(context) + .translate( + i.toString())}', ); } , diff --git a/frontend/mgramseva/lib/screeens/feedback/feed_back.dart b/frontend/mgramseva/lib/screeens/feedback/feed_back.dart index 37ecdffe6..572e816b5 100644 --- a/frontend/mgramseva/lib/screeens/feedback/feed_back.dart +++ b/frontend/mgramseva/lib/screeens/feedback/feed_back.dart @@ -52,7 +52,7 @@ class _PaymentFeedBackState extends State { Widget build(BuildContext context) { return FocusWatcher( child: Scaffold( - backgroundColor: Theme.of(context).backgroundColor, + backgroundColor: Theme.of(context).colorScheme.background, appBar: AppBar( title: Text('mGramSeva'), automaticallyImplyLeading: false, diff --git a/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart b/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart index bd4e35fec..89e13efb6 100644 --- a/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart +++ b/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart @@ -22,6 +22,8 @@ import 'package:mgramseva/widgets/text_field_builder.dart'; import 'package:mgramseva/widgets/footer.dart'; import 'package:provider/provider.dart'; +import '../../utils/localization/application_localizations.dart'; + class GenerateBill extends StatefulWidget { final String? id; final WaterConnection? waterconnection; @@ -96,8 +98,8 @@ class _GenerateBillState extends State { billgenerationprovider .getServiceCategoryList(), true, + itemAsString: (i) =>"${ApplicationLocalizations.of(context).translate(i.toString())}", readOnly: true, - isEnabled: false, controller: billgenerationprovider .billGenerateDetails .serviceCategoryCtrl, @@ -118,8 +120,8 @@ class _GenerateBillState extends State { billgenerationprovider .getConnectionTypeList(), true, + itemAsString: (i) =>"${ApplicationLocalizations.of(context).translate(i.toString())}", readOnly: true, - isEnabled: false, controller: billgenerationprovider .billGenerateDetails @@ -150,8 +152,8 @@ class _GenerateBillState extends State { billgenerationprovider .getPropertyTypeList(), true, + itemAsString: (i) =>"${ApplicationLocalizations.of(context).translate(i.toString())}", readOnly: true, - isEnabled: false, controller: billgenerationprovider .billGenerateDetails .propertyTypeCtrl)), @@ -262,6 +264,7 @@ class _GenerateBillState extends State { billgenerationprovider .getFinancialYearList(), true, + itemAsString: (i) =>"${ApplicationLocalizations.of(context).translate(i.financialYear)}", controller: billgenerationprovider .billGenerateDetails .billingyearCtrl, @@ -276,8 +279,7 @@ class _GenerateBillState extends State { i18.demandGenerate .BILLING_CYCLE_LABEL, billgenerationprovider - .billGenerateDetails - .billCycle, + .selectedBillCycle, '', '', billgenerationprovider @@ -285,6 +287,7 @@ class _GenerateBillState extends State { billgenerationprovider .getBillingCycle(), true, + itemAsString: (i) =>"${ApplicationLocalizations.of(context).translate(i['name'])}", controller: billgenerationprovider .billGenerateDetails .billingcycleCtrl, @@ -301,7 +304,7 @@ class _GenerateBillState extends State { Provider.of(context, listen: false); return KeyboardFocusWatcher( child: Scaffold( - backgroundColor: Theme.of(context).backgroundColor, + backgroundColor: Theme.of(context).colorScheme.background, appBar: BaseAppBar( Text(i18.common.MGRAM_SEVA), AppBar(), diff --git a/frontend/mgramseva/lib/screeens/gpwsc_details/gpwsc_boundary_detail_card.dart b/frontend/mgramseva/lib/screeens/gpwsc_details/gpwsc_boundary_detail_card.dart index 0da24079b..8682d3aa0 100644 --- a/frontend/mgramseva/lib/screeens/gpwsc_details/gpwsc_boundary_detail_card.dart +++ b/frontend/mgramseva/lib/screeens/gpwsc_details/gpwsc_boundary_detail_card.dart @@ -9,7 +9,6 @@ import 'package:provider/provider.dart'; import '../../utils/localization/application_localizations.dart'; import '../../utils/common_widgets.dart'; import '../../utils/loaders.dart'; -import '../../utils/notifiers.dart'; import '../../widgets/label_text.dart'; import 'gpwsc_card.dart'; diff --git a/frontend/mgramseva/lib/screeens/gpwsc_details/gpwsc_rate_card.dart b/frontend/mgramseva/lib/screeens/gpwsc_details/gpwsc_rate_card.dart index dc1360066..defa16463 100644 --- a/frontend/mgramseva/lib/screeens/gpwsc_details/gpwsc_rate_card.dart +++ b/frontend/mgramseva/lib/screeens/gpwsc_details/gpwsc_rate_card.dart @@ -93,8 +93,7 @@ class GPWSCRateCard extends StatelessWidget { wcBillingSlabs.wCBillingSlabs ?.where( (element) => element.connectionType?.compareTo("Metered") == 0) - .forEach((e) => { - e.slabs?.forEach((slabs) => rows.add(DataRow(cells: [ + .forEach((e) => e.slabs?.forEach((slabs) => rows.add(DataRow(cells: [ DataCell(Text( "${ApplicationLocalizations.of(context).translate(i18.common.WATER_CHARGES)}-10101")), DataCell(Text( @@ -104,7 +103,7 @@ class GPWSCRateCard extends StatelessWidget { "${ApplicationLocalizations.of(context).translate("${e.buildingType}")}")), DataCell(Text("${slabs.charge}")) ]))) - }); + ); return rows; } diff --git a/frontend/mgramseva/lib/screeens/home/home.dart b/frontend/mgramseva/lib/screeens/home/home.dart index 4f86e8b3d..456266158 100644 --- a/frontend/mgramseva/lib/screeens/home/home.dart +++ b/frontend/mgramseva/lib/screeens/home/home.dart @@ -80,7 +80,7 @@ class _HomeState extends State { var languageProvider = Provider.of(context, listen: false); return Scaffold( - backgroundColor: Theme.of(context).backgroundColor, + backgroundColor: Theme.of(context).colorScheme.background, appBar: CustomAppBar(), drawer: DrawerWrapper( Drawer(child: SideBar()), diff --git a/frontend/mgramseva/lib/screeens/home/home_walk_through/home_walk_through_container.dart b/frontend/mgramseva/lib/screeens/home/home_walk_through/home_walk_through_container.dart index de4f39976..d4dc2126a 100644 --- a/frontend/mgramseva/lib/screeens/home/home_walk_through/home_walk_through_container.dart +++ b/frontend/mgramseva/lib/screeens/home/home_walk_through/home_walk_through_container.dart @@ -81,11 +81,11 @@ class _HomeWalkThroughContainerState extends State { ))))), Consumer(builder: (_, notificationProvider, child) => Positioned( - left: position.dx + 5, + left: position.dx + 3.7, top: notificationProvider.enableNotification == true ? box.size.height + position.dy : (homeProvider.activeIndex == 6 || homeProvider.activeIndex == 7 || homeProvider.activeIndex == 8) - ? position.dy - 25 + ? position.dy - 15 : box.size.height + position.dy, child: CustomPaint( painter: TrianglePainter( @@ -94,8 +94,8 @@ class _HomeWalkThroughContainerState extends State { paintingStyle: PaintingStyle.fill, ), child: Container( - height: 30, - width: 30, + height: 20, + width: 20, ), ))), Consumer(builder: (_, notificationProvider, child) => @@ -103,13 +103,13 @@ class _HomeWalkThroughContainerState extends State { left: ((homeProvider.activeIndex + 1) % 3 == 0) ? position.dx - 140 : position.dx, - top: notificationProvider.enableNotification == true ? box.size.height + position.dy + 25 : (homeProvider.activeIndex == 6 || + top: notificationProvider.enableNotification == true ? box.size.height + position.dy + 15 : (homeProvider.activeIndex == 6 || homeProvider.activeIndex == 7 || homeProvider.activeIndex == 8) ? position.dy - box.size.height - (MediaQuery.of(context).size.width > 720 ? 55 : 25) - : box.size.height + position.dy + 25, + : box.size.height + position.dy + 15, child: Container( width: MediaQuery.of(context).size.width > 720 ? MediaQuery.of(context).size.width / 3 @@ -118,6 +118,9 @@ class _HomeWalkThroughContainerState extends State { alignment: Alignment.centerRight, padding: EdgeInsets.only(right: 15), child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.only(topLeft:((homeProvider.activeIndex + 1) % 3 == 0)?Radius.circular(10):Radius.circular(0),topRight:Radius.circular(10),bottomLeft: Radius.circular(10),bottomRight: Radius.circular(10)), + ), child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, diff --git a/frontend/mgramseva/lib/screeens/household_detail/household_detail.dart b/frontend/mgramseva/lib/screeens/household_detail/household_detail.dart index 6f6d510c0..623505356 100644 --- a/frontend/mgramseva/lib/screeens/household_detail/household_detail.dart +++ b/frontend/mgramseva/lib/screeens/household_detail/household_detail.dart @@ -91,7 +91,7 @@ class _HouseholdDetailState extends State { var houseHoldProvider = Provider.of(context, listen: false); return Scaffold( - backgroundColor: Theme.of(context).backgroundColor, + backgroundColor: Theme.of(context).colorScheme.background, appBar: CustomAppBar(), drawer: DrawerWrapper( Drawer(child: SideBar()), diff --git a/frontend/mgramseva/lib/screeens/household_register/household_list.dart b/frontend/mgramseva/lib/screeens/household_register/household_list.dart index afb96c25a..148583319 100644 --- a/frontend/mgramseva/lib/screeens/household_register/household_list.dart +++ b/frontend/mgramseva/lib/screeens/household_register/household_list.dart @@ -58,7 +58,7 @@ class _HouseholdListState extends State { constraints.maxWidth < 760 ? 115.0 : (constraints.maxWidth / 6); var tableData = householdProvider .getCollectionsData(expenseList as List); - return tableData == null || tableData.isEmpty + return tableData.isEmpty ? CommonWidgets.buildEmptyMessage( ApplicationLocalizations.of(context) .translate(i18.dashboard.NO_RECORDS_MSG), diff --git a/frontend/mgramseva/lib/screeens/login/login.dart b/frontend/mgramseva/lib/screeens/login/login.dart index 85ea80595..6c6be1b92 100644 --- a/frontend/mgramseva/lib/screeens/login/login.dart +++ b/frontend/mgramseva/lib/screeens/login/login.dart @@ -131,6 +131,7 @@ class _LoginState extends State { ))), ), RichText( + maxLines: 3, text: TextSpan( children: [ TextSpan( diff --git a/frontend/mgramseva/lib/screeens/notifications/notification_screen.dart b/frontend/mgramseva/lib/screeens/notifications/notification_screen.dart index 7e6e71979..6117e7f72 100644 --- a/frontend/mgramseva/lib/screeens/notifications/notification_screen.dart +++ b/frontend/mgramseva/lib/screeens/notifications/notification_screen.dart @@ -44,7 +44,7 @@ class _NotificationScreen extends State { ..notifications.clear() ..getNotifications(notificationProvider.offset, notificationProvider.limit); } - catch (e, s) { + catch (e) { ErrorHandler().allExceptionsHandler(navigatorKey.currentContext!, e); } } diff --git a/frontend/mgramseva/lib/screeens/password_success/password_success.dart b/frontend/mgramseva/lib/screeens/password_success/password_success.dart index 416cebbb9..4638be568 100644 --- a/frontend/mgramseva/lib/screeens/password_success/password_success.dart +++ b/frontend/mgramseva/lib/screeens/password_success/password_success.dart @@ -1,4 +1,3 @@ -import 'package:mgramseva/providers/common_provider.dart'; import 'package:mgramseva/routers/routers.dart'; import 'package:mgramseva/utils/constants/i18_key_constants.dart'; import 'package:mgramseva/utils/localization/application_localizations.dart'; @@ -8,7 +7,6 @@ import 'package:mgramseva/widgets/logo.dart'; import 'package:mgramseva/widgets/mobile_view.dart'; import 'package:mgramseva/widgets/success_page.dart'; import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class PasswordSuccess extends StatefulWidget { State createState() { diff --git a/frontend/mgramseva/lib/screeens/privacy_and_terms/PrivacyAndTerms.dart b/frontend/mgramseva/lib/screeens/privacy_and_terms/PrivacyAndTerms.dart index 1517b4fec..c0b6c82ac 100644 --- a/frontend/mgramseva/lib/screeens/privacy_and_terms/PrivacyAndTerms.dart +++ b/frontend/mgramseva/lib/screeens/privacy_and_terms/PrivacyAndTerms.dart @@ -22,8 +22,11 @@ class _PrivacyAndTermsState extends State { var languageProvider = Provider.of(context, listen: false); return Scaffold( - backgroundColor: Theme.of(context).backgroundColor, + backgroundColor: Theme.of(context).colorScheme.background, appBar: AppBar( + iconTheme: IconThemeData( + color: Colors.white, //change your color here + ), titleSpacing: 0, centerTitle: true, automaticallyImplyLeading: widget.showLeading, diff --git a/frontend/mgramseva/lib/screeens/profile/edit_profile.dart b/frontend/mgramseva/lib/screeens/profile/edit_profile.dart index 92002024d..55ff220e6 100644 --- a/frontend/mgramseva/lib/screeens/profile/edit_profile.dart +++ b/frontend/mgramseva/lib/screeens/profile/edit_profile.dart @@ -136,7 +136,7 @@ class _EditProfileState extends State { var userProvider = Provider.of(context, listen: false); return FocusWatcher(child: Scaffold( - backgroundColor: Theme.of(context).backgroundColor, + backgroundColor: Theme.of(context).colorScheme.background, appBar: BaseAppBar( Text(i18.common.MGRAM_SEVA), AppBar(), diff --git a/frontend/mgramseva/lib/screeens/reports/bill_report.dart b/frontend/mgramseva/lib/screeens/reports/bill_report.dart index fe83f5a16..f3f202f49 100644 --- a/frontend/mgramseva/lib/screeens/reports/bill_report.dart +++ b/frontend/mgramseva/lib/screeens/reports/bill_report.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import '../../model/common/BillsTableData.dart'; import '../../providers/reports_provider.dart'; import '../../utils/localization/application_localizations.dart'; @@ -10,7 +9,6 @@ import 'package:mgramseva/utils/constants/i18_key_constants.dart'; import '../../utils/notifiers.dart'; import '../../utils/testing_keys/testing_keys.dart'; import '../../widgets/button.dart'; -import 'generic_report_table.dart'; class BillReport extends StatefulWidget { final Function onViewClick; diff --git a/frontend/mgramseva/lib/screeens/reports/collection_report.dart b/frontend/mgramseva/lib/screeens/reports/collection_report.dart index d6e228832..dbae58d3c 100644 --- a/frontend/mgramseva/lib/screeens/reports/collection_report.dart +++ b/frontend/mgramseva/lib/screeens/reports/collection_report.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:mgramseva/model/common/BillsTableData.dart'; import 'package:provider/provider.dart'; import '../../providers/reports_provider.dart'; @@ -10,7 +9,6 @@ import 'package:mgramseva/utils/constants/i18_key_constants.dart'; import '../../utils/notifiers.dart'; import '../../utils/testing_keys/testing_keys.dart'; import '../../widgets/button.dart'; -import 'generic_report_table.dart'; class CollectionReport extends StatefulWidget { final Function onViewClick; diff --git a/frontend/mgramseva/lib/screeens/reports/generic_report_table.dart b/frontend/mgramseva/lib/screeens/reports/generic_report_table.dart index fb060d743..d1f502591 100644 --- a/frontend/mgramseva/lib/screeens/reports/generic_report_table.dart +++ b/frontend/mgramseva/lib/screeens/reports/generic_report_table.dart @@ -1,10 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mgramseva/components/dashboard/bills_table.dart'; -import 'package:provider/provider.dart'; import '../../model/common/BillsTableData.dart'; -import '../../providers/reports_provider.dart'; -import '../../utils/common_widgets.dart'; import '../../utils/localization/application_localizations.dart'; import 'package:mgramseva/utils/constants/i18_key_constants.dart'; diff --git a/frontend/mgramseva/lib/screeens/reports/inactive_consumer_report.dart b/frontend/mgramseva/lib/screeens/reports/inactive_consumer_report.dart index f5ee4fa51..bce975982 100644 --- a/frontend/mgramseva/lib/screeens/reports/inactive_consumer_report.dart +++ b/frontend/mgramseva/lib/screeens/reports/inactive_consumer_report.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:mgramseva/model/common/BillsTableData.dart'; import 'package:provider/provider.dart'; import '../../providers/reports_provider.dart'; @@ -10,7 +9,6 @@ import 'package:mgramseva/utils/constants/i18_key_constants.dart'; import '../../utils/notifiers.dart'; import '../../utils/testing_keys/testing_keys.dart'; import '../../widgets/button.dart'; -import 'generic_report_table.dart'; class InactiveConsumerReport extends StatefulWidget { final Function onViewClick; diff --git a/frontend/mgramseva/lib/screeens/reports/reports.dart b/frontend/mgramseva/lib/screeens/reports/reports.dart index 8f00250ed..95fe976a2 100644 --- a/frontend/mgramseva/lib/screeens/reports/reports.dart +++ b/frontend/mgramseva/lib/screeens/reports/reports.dart @@ -17,7 +17,6 @@ import '../../widgets/select_field_builder.dart'; import '../../widgets/side_bar.dart'; import 'bill_report.dart'; import 'collection_report.dart'; -import 'generic_report_table.dart'; class Reports extends StatefulWidget { const Reports({Key? key}) : super(key: key); @@ -166,12 +165,13 @@ class _Reports extends State with SingleTickerProviderStateMixin { reportProvider .getFinancialYearListDropdown( reportProvider - .languageList), + .billingYearList), true, + readOnly: false, controller: reportProvider .billingyearCtrl, key: Keys.billReport - .BILL_REPORT_BILLING_YEAR, + .BILL_REPORT_BILLING_YEAR, itemAsString: (i) =>"${ApplicationLocalizations.of(context).translate(i.financialYear)}", ), SelectFieldBuilder( i18.demandGenerate @@ -187,10 +187,11 @@ class _Reports extends State with SingleTickerProviderStateMixin { reportProvider .selectedBillYear), true, + readOnly: false, controller: reportProvider .billingcycleCtrl, key: Keys.billReport - .BILL_REPORT_BILLING_CYCLE, + .BILL_REPORT_BILLING_CYCLE, itemAsString: (i) =>"${ApplicationLocalizations.of(context).translate(i['name'])}", ), ], ), diff --git a/frontend/mgramseva/lib/screeens/reports/view_table.dart b/frontend/mgramseva/lib/screeens/reports/view_table.dart index 457e78eed..ac837027b 100644 --- a/frontend/mgramseva/lib/screeens/reports/view_table.dart +++ b/frontend/mgramseva/lib/screeens/reports/view_table.dart @@ -1,7 +1,5 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:mgramseva/utils/constants/i18_key_constants.dart'; import '../../providers/reports_provider.dart'; import '../../utils/constants.dart'; import '../../utils/date_formats.dart'; diff --git a/frontend/mgramseva/lib/screeens/reset_password/reset_password.dart b/frontend/mgramseva/lib/screeens/reset_password/reset_password.dart index 9a9b8eaa0..cee5a42d5 100644 --- a/frontend/mgramseva/lib/screeens/reset_password/reset_password.dart +++ b/frontend/mgramseva/lib/screeens/reset_password/reset_password.dart @@ -298,14 +298,12 @@ class _ResetPasswordState extends State { var resetResponse = await ResetPasswordRepository().forgotPassword(body, context); Navigator.pop(context); - if (resetResponse != null) { - Navigator.push( - context, - MaterialPageRoute( - builder: (_) => PasswordSuccess(), - settings: RouteSettings(name: '/resetPasswordSuccess'))); - } - } catch (e, s) { + Navigator.push( + context, + MaterialPageRoute( + builder: (_) => PasswordSuccess(), + settings: RouteSettings(name: '/resetPasswordSuccess'))); + } catch (e, s) { Navigator.pop(context); ErrorHandler().allExceptionsHandler(context, e, s); } diff --git a/frontend/mgramseva/lib/screeens/select_language/language_selection_desktop_view.dart b/frontend/mgramseva/lib/screeens/select_language/language_selection_desktop_view.dart index 35fede434..99ebab331 100644 --- a/frontend/mgramseva/lib/screeens/select_language/language_selection_desktop_view.dart +++ b/frontend/mgramseva/lib/screeens/select_language/language_selection_desktop_view.dart @@ -8,9 +8,7 @@ import 'package:mgramseva/widgets/background_container.dart'; import 'package:mgramseva/widgets/button.dart'; import 'package:mgramseva/widgets/language_card.dart'; import 'package:mgramseva/widgets/footer_banner.dart'; -import 'package:provider/provider.dart'; -import '../../providers/language.dart'; class LanguageSelectionDesktopView extends StatelessWidget { final StateInfo stateInfo; diff --git a/frontend/mgramseva/lib/theme.dart b/frontend/mgramseva/lib/theme.dart index af06d0cc3..eb312864f 100644 --- a/frontend/mgramseva/lib/theme.dart +++ b/frontend/mgramseva/lib/theme.dart @@ -2,13 +2,19 @@ import 'package:flutter/material.dart'; import 'package:mgramseva/utils/color_codes.dart'; ThemeData get theme => ThemeData( - primarySwatch: createMaterialColor(Color(0XFFf47738)), highlightColor: createMaterialColor(Color(0XFFC7E0F1)), - backgroundColor: createMaterialColor(Color.fromRGBO(238, 238, 238, 1)), hintColor: createMaterialColor(Color(0XFF3498DB)), primaryColorDark: Color.fromRGBO(11, 12, 12, 1), primaryColorLight: Color.fromRGBO(80, 90, 95, 1), + primaryColor: Color.fromRGBO(244, 119, 56, 1), disabledColor: Colors.grey, + cardTheme: CardTheme(surfaceTintColor: Colors.white), + datePickerTheme: DatePickerThemeData( + surfaceTintColor: Colors.white + ), + drawerTheme: DrawerThemeData( + surfaceTintColor: Colors.white + ), // accentColor: Color(0xff0B4B66), appBarTheme: AppBarTheme( @@ -16,15 +22,17 @@ ThemeData get theme => ThemeData( centerTitle: false, ), textTheme: TextTheme( - headline1: TextStyle(fontWeight: FontWeight.w700, fontSize: 32, fontStyle: FontStyle.normal, color: Color.fromRGBO(11, 12, 12, 1)), - headline2: TextStyle(fontWeight: FontWeight.w700, fontSize: 24), - button: TextStyle(fontWeight: FontWeight.w500, fontSize: 19, color: Colors.white), // Elevated Button(Orange) - subtitle1: TextStyle(fontWeight: FontWeight.w400, fontSize: 16), - subtitle2: TextStyle(fontWeight: FontWeight.w400, fontSize: 16, color: Color.fromRGBO(244, 119, 56, 1)) // Only for outlined button text + displayLarge: TextStyle(fontWeight: FontWeight.w700, fontSize: 32, fontStyle: FontStyle.normal, color: Color.fromRGBO(11, 12, 12, 1)), + displayMedium: TextStyle(fontWeight: FontWeight.w700, fontSize: 24), + labelLarge: TextStyle(fontWeight: FontWeight.w500, fontSize: 19, color: Colors.white), // Elevated Button(Orange) + labelMedium: TextStyle(fontWeight: FontWeight.w500, fontSize: 14, color: Colors.white), // Elevated Button(Orange) + labelSmall: TextStyle(fontWeight: FontWeight.w500, fontSize: 10, color: Colors.white), // Elevated Button(Orange) + titleMedium: TextStyle(fontWeight: FontWeight.w400, fontSize: 16), + titleSmall: TextStyle(fontWeight: FontWeight.w400, fontSize: 16, color: Color.fromRGBO(244, 119, 56, 1)) // Only for outlined button text ), /// Background color - // scaffoldBackgroundColor: Color.fromRGBO(238, 238, 238, 1), + scaffoldBackgroundColor: Color.fromRGBO(238, 238, 238, 1), textButtonTheme: TextButtonThemeData( style: TextButton.styleFrom( @@ -67,7 +75,7 @@ ThemeData get theme => ThemeData( iconTheme: IconThemeData( color: ColorCodes.HOME_ICON, // size: 25 - )); + ), colorScheme: ColorScheme.fromSwatch(primarySwatch: createMaterialColor(Color(0XFFf47738))).copyWith(background: createMaterialColor(Color.fromRGBO(238, 238, 238, 1)))); MaterialColor createMaterialColor(Color color) { List strengths = [.05]; diff --git a/frontend/mgramseva/lib/utils/common_printer.dart b/frontend/mgramseva/lib/utils/common_printer.dart deleted file mode 100644 index 683814357..000000000 --- a/frontend/mgramseva/lib/utils/common_printer.dart +++ /dev/null @@ -1,103 +0,0 @@ -import 'package:bluetooth_thermal_printer/bluetooth_thermal_printer.dart'; -import 'package:esc_pos_utils/esc_pos_utils.dart'; -import 'package:flutter/material.dart'; -import 'package:mgramseva/utils/constants/i18_key_constants.dart'; - -import 'localization/application_localizations.dart'; -import 'global_variables.dart'; - -class CommonPrinter { - static bool connected = false; - - static setConnect(String mac, value, context) async { - if (connected) { - CommonPrinter.printTicket(value, context); - Navigator.of(context).pop(); - } else { - final String? result = await BluetoothThermalPrinter.connect(mac); - - print("state conneected $result"); - if (result == "true") { - connected = true; - CommonPrinter.printTicket(value, context); - Navigator.of(context).pop(); - } - } - } - - static Future showMyDialog(context, value) async { - connected = false; - Widget setupAlertDialoadContainer(availableBluetoothDevices, context) { - return Container( - height: 300.0, // Change as per your requirement - width: 300.0, - child: ListView.builder( - shrinkWrap: true, - itemCount: availableBluetoothDevices.length > 0 - ? availableBluetoothDevices.length - : 0, - itemBuilder: (context, index) { - return ListTile( - onTap: () { - String select = availableBluetoothDevices[index]; - List list = select.split("#"); - // String name = list[0]; - String mac = list[1]; - setConnect(mac, value, context); - }, - title: Text('${availableBluetoothDevices[index]}'), - subtitle: Text("Click to connect"), - ); - }, - ), - ); - } - - final List? availableBluetoothDevices = - await BluetoothThermalPrinter.getBluetooths; - return showDialog( - context: context, - barrierDismissible: false, // user must tap button! - builder: (BuildContext context) { - return AlertDialog( - title: const Text('Connect to Device'), - content: - setupAlertDialoadContainer(availableBluetoothDevices, context), - actions: [ - TextButton( - child: const Text('Close'), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], - ); - }, - ); - } - - static Future printTicket(value, context) async { - String? isConnected = await BluetoothThermalPrinter.connectionStatus; - print(isConnected); - if (isConnected == "true") { - List bytes = await getTicket(value); - final result = await BluetoothThermalPrinter.writeBytes(bytes); - print("Print $result"); - } else { - CommonPrinter.showMyDialog(context, value); - print("connction not established"); - } - } - - static Future> getTicket(value) async { - print(value); - List bytes = []; - CapabilityProfile profile = await CapabilityProfile.load(); - final generator = Generator(PaperSize.mm80, profile); - bytes += generator.image(value); - - // ticket.feed(2); - bytes += generator.cut(); - return bytes; - } -} diff --git a/frontend/mgramseva/lib/utils/common_widgets.dart b/frontend/mgramseva/lib/utils/common_widgets.dart index e6bc0b09f..5032db618 100644 --- a/frontend/mgramseva/lib/utils/common_widgets.dart +++ b/frontend/mgramseva/lib/utils/common_widgets.dart @@ -17,7 +17,7 @@ class CommonWidgets { static Widget buildEmptyMessage(String label, BuildContext context) { return Container( alignment: Alignment.center, - child: Text('${ApplicationLocalizations.of(context).translate(label)}', style: Theme.of(context).textTheme.subtitle1), + child: Text('${ApplicationLocalizations.of(context).translate(label)}', style: Theme.of(context).textTheme.titleMedium), ); } } \ No newline at end of file diff --git a/frontend/mgramseva/lib/utils/date_formats.dart b/frontend/mgramseva/lib/utils/date_formats.dart index 41fae3fbf..7007c13b1 100644 --- a/frontend/mgramseva/lib/utils/date_formats.dart +++ b/frontend/mgramseva/lib/utils/date_formats.dart @@ -9,21 +9,21 @@ import 'models.dart'; class DateFormats { static getFilteredDate(String date, {String? dateFormat}) { - if (date == null || date.trim().isEmpty) return ''; + if (date.trim().isEmpty) return ''; try { var dateTime = DateTime.parse(date).toLocal(); return DateFormat(dateFormat ?? "dd-MM-yyyy").format(dateTime); - } on Exception catch (e) { + } on Exception { return ''; } } static DateTime? getDateFromString(String date) { - if (date == null || date.trim().isEmpty) return null; + if (date.trim().isEmpty) return null; try { var dateTime = DateTime.parse(date).toLocal(); return dateTime; - } on Exception catch (e) { + } on Exception { return null; } } @@ -38,17 +38,17 @@ class DateFormats { } var inputDate = inputFormat.parse(date); return inputDate; - } on Exception catch (e) { + } on Exception { return null; } } static String getTime(String date) { - if (date == null || date.trim().isEmpty) return ''; + if (date.trim().isEmpty) return ''; try { var dateTime = getDateFromString(date); return DateFormat.Hms().format(dateTime!); - } on Exception catch (e, stackTrace) { + } on Exception { return ''; } } @@ -57,7 +57,7 @@ class DateFormats { try { var dateTime = getDateFromString(date); return DateFormat.jm().format(dateTime!); - } on Exception catch (e, stackTrace) { + } on Exception { return ''; } } diff --git a/frontend/mgramseva/lib/utils/excel_download/save_file_mobile.dart b/frontend/mgramseva/lib/utils/excel_download/save_file_mobile.dart index c7ddbff8b..72954f956 100644 --- a/frontend/mgramseva/lib/utils/excel_download/save_file_mobile.dart +++ b/frontend/mgramseva/lib/utils/excel_download/save_file_mobile.dart @@ -1,9 +1,11 @@ import 'dart:io'; -import 'package:open_file/open_file.dart' as open_file; +import 'package:flutter/foundation.dart'; +import 'package:open_filex/open_filex.dart' as open_file; import 'package:path_provider/path_provider.dart' as path_provider; // ignore: depend_on_referenced_packages import 'package:path_provider_platform_interface/path_provider_platform_interface.dart'; +import 'save_file_web.dart' as sfw; ///To save the Excel file in the device ///To save the Excel file in the device @@ -25,7 +27,7 @@ Future saveAndLaunchFile(List bytes, String fileName) async { await file.writeAsBytes(bytes, flush: true); if (Platform.isAndroid || Platform.isIOS) { //Launch the file (used open_file package) - await open_file.OpenFile.open('$path/$fileName'); + await open_file.OpenFilex.open('$path/$fileName'); } else if (Platform.isWindows) { await Process.run('start', ['$path\\$fileName'], runInShell: true); } else if (Platform.isMacOS) { @@ -33,5 +35,7 @@ Future saveAndLaunchFile(List bytes, String fileName) async { } else if (Platform.isLinux) { await Process.run('xdg-open', ['$path/$fileName'], runInShell: true); + }else if (kIsWeb){ + sfw.saveAndLaunchFile(bytes,fileName); } } diff --git a/frontend/mgramseva/lib/utils/excel_download/save_file_web.dart b/frontend/mgramseva/lib/utils/excel_download/save_file_web.dart index 08f09f2d3..5503dcff0 100644 --- a/frontend/mgramseva/lib/utils/excel_download/save_file_web.dart +++ b/frontend/mgramseva/lib/utils/excel_download/save_file_web.dart @@ -1,12 +1,12 @@ import 'dart:async'; import 'dart:convert'; // ignore: avoid_web_libraries_in_flutter -import 'dart:html'; +import 'package:universal_html/html.dart' as htmlk; ///To save the Excel file in the device ///To save the Excel file in the device Future saveAndLaunchFile(List bytes, String fileName) async { - AnchorElement( + htmlk.AnchorElement( href: 'data:application/octet-stream;charset=utf-16le;base64,${base64.encode(bytes)}') ..setAttribute('download', fileName) diff --git a/frontend/mgramseva/lib/utils/loaders.dart b/frontend/mgramseva/lib/utils/loaders.dart index 242314651..a4dce80bf 100644 --- a/frontend/mgramseva/lib/utils/loaders.dart +++ b/frontend/mgramseva/lib/utils/loaders.dart @@ -34,7 +34,7 @@ class Loaders { // controller: AnimationController(vsync: this, duration: const Duration(milliseconds: 1200)), // ), CircularProgressIndicator( - color: Theme.of(context).accentColor, + color: Theme.of(context).primaryColor, ), const SizedBox( height: 10, diff --git a/frontend/mgramseva/lib/utils/localization/application_localizations.dart b/frontend/mgramseva/lib/utils/localization/application_localizations.dart index a83fe129f..922961f06 100644 --- a/frontend/mgramseva/lib/utils/localization/application_localizations.dart +++ b/frontend/mgramseva/lib/utils/localization/application_localizations.dart @@ -1,6 +1,4 @@ import 'dart:async'; -import 'dart:convert'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:mgramseva/model/localization/localization_label.dart'; import 'package:mgramseva/providers/common_provider.dart'; diff --git a/frontend/mgramseva/lib/utils/notifiers.dart b/frontend/mgramseva/lib/utils/notifiers.dart index f37b7a3b9..a7771eba3 100644 --- a/frontend/mgramseva/lib/utils/notifiers.dart +++ b/frontend/mgramseva/lib/utils/notifiers.dart @@ -20,6 +20,9 @@ class Notifiers { Padding( padding: EdgeInsets.all(12.0), child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Color.fromRGBO(244, 119, 56, 0.7) + ), onPressed: callBack, child: Text( 'Retry', diff --git a/frontend/mgramseva/lib/utils/print_bluetooth.dart b/frontend/mgramseva/lib/utils/print_bluetooth.dart deleted file mode 100644 index 24678fed5..000000000 --- a/frontend/mgramseva/lib/utils/print_bluetooth.dart +++ /dev/null @@ -1,109 +0,0 @@ -import 'package:esc_pos_utils/esc_pos_utils.dart'; -import 'package:flutter/material.dart'; -import 'package:mgramseva/utils/constants/i18_key_constants.dart'; -import 'package:nearby_connections/nearby_connections.dart'; -import 'package:print_bluetooth_thermal/print_bluetooth_thermal.dart'; - -import 'localization/application_localizations.dart'; - -class PrintBluetooth { - static bool connected = false; - - static setConnect(String mac, value, context) async { - if (connected) { - PrintBluetooth.printTicket(value, context); - Navigator.of(context).pop(); - } else { - final result = - await PrintBluetoothThermal.connect(macPrinterAddress: mac); - - if (result) { - connected = true; - PrintBluetooth.printTicket(value, context); - Navigator.of(context).pop(); - } - } - } - - static Future showMyDialog(context, value) async { - connected = false; - Widget setupAlertDialogContainer( - List availableBluetoothDevices, context) { - return Container( - height: 300.0, // Change as per your requirement - width: 300.0, - child: ListView.builder( - shrinkWrap: true, - itemCount: availableBluetoothDevices.length > 0 - ? availableBluetoothDevices.length - : 0, - itemBuilder: (context, index) { - return ListTile( - onTap: () { - String select = availableBluetoothDevices[index].macAdress; - setConnect(select, value, context); - }, - title: Text('${availableBluetoothDevices[index].name}'), - subtitle: Text(ApplicationLocalizations.of(context) - .translate(i18.consumerReciepts.CLICK_TO_CONNECT)), - ); - }, - ), - ); - } - - final List availableBluetoothDevices = - await PrintBluetoothThermal.pairedBluetooths; - return showDialog( - context: context, - barrierDismissible: false, // user must tap button! - builder: (BuildContext context) { - return AlertDialog( - title: Text(ApplicationLocalizations.of(context) - .translate(i18.consumerReciepts.CONNECT_TO_DEVICE)), - content: - setupAlertDialogContainer(availableBluetoothDevices, context), - actions: [ - TextButton( - child: Text(ApplicationLocalizations.of(context) - .translate(i18.consumerReciepts.CLOSE)), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], - ); - }, - ); - } - - static Future printTicket(value, context) async { - bool? isPermissionGranted = - await PrintBluetoothThermal.isPermissionBluetoothGranted; - print(isPermissionGranted); - if (!isPermissionGranted) { - Nearby().askBluetoothPermission(); - } - bool? isConnected = await PrintBluetoothThermal.connectionStatus; - if (isConnected) { - List bytes = await getTicket(value); - final result = await PrintBluetoothThermal.writeBytes(bytes); - } else { - PrintBluetooth.showMyDialog(context, value); - print(ApplicationLocalizations.of(context) - .translate(i18.consumerReciepts.CONNECTION_NOT_ESTABLISHED)); - } - } - - static Future> getTicket(value) async { - print(value); - List bytes = []; - CapabilityProfile profile = await CapabilityProfile.load(); - final generator = Generator(PaperSize.mm80, profile); - bytes += generator.image(value); - - // ticket.feed(2); - bytes += generator.cut(); - return bytes; - } -} diff --git a/frontend/mgramseva/lib/utils/printer/image_utils.dart b/frontend/mgramseva/lib/utils/printer/image_utils.dart new file mode 100644 index 000000000..922981f0c --- /dev/null +++ b/frontend/mgramseva/lib/utils/printer/image_utils.dart @@ -0,0 +1,47 @@ +import 'package:image/image.dart' as img; + +/// Draw the image [src] onto the image [dst]. +/// +/// In other words, drawImage will take an rectangular area from src of +/// width [src_w] and height [src_h] at position ([src_x],[src_y]) and place it +/// in a rectangular area of [dst] of width [dst_w] and height [dst_h] at +/// position ([dst_x],[dst_y]). +/// +/// If the source and destination coordinates and width and heights differ, +/// appropriate stretching or shrinking of the image fragment will be performed. +/// The coordinates refer to the upper left corner. This function can be used to +/// copy regions within the same image (if [dst] is the same as [src]) +/// but if the regions overlap the results will be unpredictable. +img.Image drawImage(img.Image dst, img.Image src, + {int? dstX, int? dstY, int? dstW, int? dstH, int? srcX, int? srcY, int? srcW, int? srcH, bool blend = true}) { + dstX ??= 0; + dstY ??= 0; + srcX ??= 0; + srcY ??= 0; + srcW ??= src.width; + srcH ??= src.height; + dstW ??= (dst.width < src.width) ? dstW = dst.width : src.width; + dstH ??= (dst.height < src.height) ? dst.height : src.height; + + if (blend) { + for (var y = 0; y < dstH; ++y) { + for (var x = 0; x < dstW; ++x) { + final stepX = (x * (srcW / dstW)).toInt(); + final stepY = (y * (srcH / dstH)).toInt(); + final srcPixel = src.getPixel(srcX + stepX, srcY + stepY); + img.drawPixel(dst, dstX + x, dstY + y, srcPixel); + } + } + } else { + for (var y = 0; y < dstH; ++y) { + for (var x = 0; x < dstW; ++x) { + final stepX = (x * (srcW / dstW)).toInt(); + final stepY = (y * (srcH / dstH)).toInt(); + final srcPixel = src.getPixel(srcX + stepX, srcY + stepY); + dst.setPixel(dstX + x, dstY + y, srcPixel); + } + } + } + + return dst; +} diff --git a/frontend/mgramseva/lib/utils/validators/validators.dart b/frontend/mgramseva/lib/utils/validators/validators.dart index 1fb309612..dffa31df9 100644 --- a/frontend/mgramseva/lib/utils/validators/validators.dart +++ b/frontend/mgramseva/lib/utils/validators/validators.dart @@ -1,7 +1,6 @@ import 'package:mgramseva/utils/constants/i18_key_constants.dart'; import 'package:mgramseva/utils/localization/application_localizations.dart'; import 'package:mgramseva/utils/global_variables.dart'; -import 'dart:math' as math; class Validators { static validate(value, type) { diff --git a/frontend/mgramseva/lib/widgets/bluetooth_printer.dart b/frontend/mgramseva/lib/widgets/bluetooth_printer.dart new file mode 100644 index 000000000..37a76932a --- /dev/null +++ b/frontend/mgramseva/lib/widgets/bluetooth_printer.dart @@ -0,0 +1,432 @@ +import 'dart:async'; +import 'dart:developer'; +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:thermal_printer/esc_pos_utils_platform/esc_pos_utils_platform.dart'; +import 'package:thermal_printer/thermal_printer.dart'; +import 'package:image/image.dart' as img; +import '../utils/printer/image_utils.dart'; + + +class BluetoothPrinterScreen extends StatefulWidget { + final Uint8List imageData; + const BluetoothPrinterScreen({Key? key, required this.imageData}) : super(key: key); + + @override + State createState() => _BluetoothPrinterScreenState(); +} + +class _BluetoothPrinterScreenState extends State { + // Printer Type [bluetooth, usb, network] + var defaultPrinterType = PrinterType.bluetooth; + var _isBle = false; + var _reconnect = false; + var _isConnected = false; + var printerManager = PrinterManager.instance; + var devices = []; + StreamSubscription? _subscription; + StreamSubscription? _subscriptionBtStatus; + StreamSubscription? _subscriptionUsbStatus; + StreamSubscription? _subscriptionTCPStatus; + BTStatus _currentStatus = BTStatus.none; + // ignore: unused_field + TCPStatus _currentTCPStatus = TCPStatus.none; + // _currentUsbStatus is only supports on Android + // ignore: unused_field + USBStatus _currentUsbStatus = USBStatus.none; + List? pendingTask; + String _ipAddress = ''; + String _port = '9100'; + final _ipController = TextEditingController(); + final _portController = TextEditingController(); + BluetoothPrinter? selectedPrinter; + + @override + void initState() { + if (Platform.isWindows) defaultPrinterType = PrinterType.usb; + super.initState(); + _portController.text = _port; + _scan(); + + // subscription to listen change status of bluetooth connection + _subscriptionBtStatus = PrinterManager.instance.stateBluetooth.listen((status) { + log(' ----------------- status bt $status ------------------ '); + _currentStatus = status; + if (status == BTStatus.connected) { + setState(() { + _isConnected = true; + }); + } + if (status == BTStatus.none) { + setState(() { + _isConnected = false; + }); + } + if (status == BTStatus.connected && pendingTask != null) { + if (Platform.isAndroid) { + Future.delayed(const Duration(milliseconds: 1000), () { + PrinterManager.instance.send(type: PrinterType.bluetooth, bytes: pendingTask!); + pendingTask = null; + }); + } else if (Platform.isIOS) { + PrinterManager.instance.send(type: PrinterType.bluetooth, bytes: pendingTask!); + pendingTask = null; + } + } + }); + // PrinterManager.instance.stateUSB is only supports on Android + _subscriptionUsbStatus = PrinterManager.instance.stateUSB.listen((status) { + log(' ----------------- status usb $status ------------------ '); + _currentUsbStatus = status; + if (Platform.isAndroid) { + if (status == USBStatus.connected && pendingTask != null) { + Future.delayed(const Duration(milliseconds: 1000), () { + PrinterManager.instance.send(type: PrinterType.usb, bytes: pendingTask!); + pendingTask = null; + }); + } + } + }); + + // PrinterManager.instance.stateUSB is only supports on Android + _subscriptionTCPStatus = PrinterManager.instance.stateTCP.listen((status) { + log(' ----------------- status tcp $status ------------------ '); + _currentTCPStatus = status; + }); + } + + @override + void dispose() { + _subscription?.cancel(); + _subscriptionBtStatus?.cancel(); + _subscriptionUsbStatus?.cancel(); + _subscriptionTCPStatus?.cancel(); + _portController.dispose(); + _ipController.dispose(); + super.dispose(); + } + + // method to scan devices according PrinterType + void _scan() { + devices.clear(); + _subscription = printerManager.discovery(type: defaultPrinterType, isBle: _isBle).listen((device) { + devices.add(BluetoothPrinter( + deviceName: device.name, + address: device.address, + isBle: _isBle, + vendorId: device.vendorId, + productId: device.productId, + typePrinter: defaultPrinterType, + )); + setState(() {}); + }); + } + + void setPort(String value) { + if (value.isEmpty) value = '9100'; + _port = value; + var device = BluetoothPrinter( + deviceName: value, + address: _ipAddress, + port: _port, + typePrinter: PrinterType.network, + state: false, + ); + selectDevice(device); + } + + void setIpAddress(String value) { + _ipAddress = value; + var device = BluetoothPrinter( + deviceName: value, + address: _ipAddress, + port: _port, + typePrinter: PrinterType.network, + state: false, + ); + selectDevice(device); + } + + Future selectDevice(BluetoothPrinter device) async { + try{ + if (selectedPrinter != null) { + if ((device.address != selectedPrinter!.address) || (device.typePrinter == PrinterType.usb && selectedPrinter!.vendorId != device.vendorId)) { + await PrinterManager.instance.disconnect(type: selectedPrinter!.typePrinter); + } + } + + selectedPrinter = device; + setState(() {}); + return true; + }catch(e){ + return false; + } + } + + Future _printReceiveTest() async { + List bytes = []; + + // Xprinter XP-N160I + final profile = await CapabilityProfile.load(name: 'XP-N160I'); + + // PaperSize.mm80 or PaperSize.mm58 + final generator = Generator(PaperSize.mm58, profile); + bytes += generator.setGlobalCodeTable('CP1252'); + + + final Uint8List imageBytes = widget.imageData; + // decode the bytes into an image + final decodedImage = img.decodeImage(imageBytes)!; + // Create a black bottom layer + // Resize the image to a 130x? thumbnail (maintaining the aspect ratio). + img.Image thumbnail = img.copyResize(decodedImage, height: decodedImage.height); + // creates a copy of the original image with set dimensions + img.Image originalImg = img.copyResize(decodedImage, width: PaperSize.mm58.width, height: decodedImage.height); + // fills the original image with a white background + img.fill(originalImg, color: img.ColorRgb8(255, 255, 255)); + // var padding = (originalImg.width - thumbnail.width) / 2; + // + // //insert the image inside the frame and center it + drawImage(originalImg, thumbnail, dstX: 0); + // + // // convert image to grayscale + // var grayscaleImage = img.grayscale(originalImg); + + bytes += generator.feed(1); + // bytes += generator.imageRaster(img.decodeImage(imageBytes)!, align: PosAlign.center); + bytes += generator.imageRaster(originalImg, align: PosAlign.center); + bytes += generator.feed(1); + + _printEscPos(bytes, generator); + } + + /// print ticket + void _printEscPos(List bytes, Generator generator) async { + var connectedTCP = false; + if (selectedPrinter == null) return; + var bluetoothPrinter = selectedPrinter!; + + switch (bluetoothPrinter.typePrinter) { + case PrinterType.usb: + bytes += generator.feed(2); + bytes += generator.cut(); + await printerManager.connect( + type: bluetoothPrinter.typePrinter, + model: UsbPrinterInput(name: bluetoothPrinter.deviceName, productId: bluetoothPrinter.productId, vendorId: bluetoothPrinter.vendorId)); + pendingTask = null; + break; + case PrinterType.bluetooth: + bytes += generator.cut(); + await printerManager.connect( + type: bluetoothPrinter.typePrinter, + model: BluetoothPrinterInput( + name: bluetoothPrinter.deviceName, + address: bluetoothPrinter.address!, + isBle: bluetoothPrinter.isBle ?? false, + autoConnect: _reconnect)); + pendingTask = null; + if (Platform.isAndroid) pendingTask = bytes; + break; + case PrinterType.network: + bytes += generator.feed(2); + bytes += generator.cut(); + connectedTCP = await printerManager.connect(type: bluetoothPrinter.typePrinter, model: TcpPrinterInput(ipAddress: bluetoothPrinter.address!)); + if (!connectedTCP) print(' --- please review your connection ---'); + break; + default: + } + if (bluetoothPrinter.typePrinter == PrinterType.bluetooth && Platform.isAndroid) { + if (_currentStatus == BTStatus.connected) { + printerManager.send(type: bluetoothPrinter.typePrinter, bytes: bytes); + pendingTask = null; + } + } else { + printerManager.send(type: bluetoothPrinter.typePrinter, bytes: bytes); + } + } + + // conectar dispositivo + _connectDevice() async { + _isConnected = false; + if (selectedPrinter == null) return; + switch (selectedPrinter!.typePrinter) { + case PrinterType.usb: + await printerManager.connect( + type: selectedPrinter!.typePrinter, + model: UsbPrinterInput(name: selectedPrinter!.deviceName, productId: selectedPrinter!.productId, vendorId: selectedPrinter!.vendorId)); + _isConnected = true; + break; + case PrinterType.bluetooth: + await printerManager.connect( + type: selectedPrinter!.typePrinter, + model: BluetoothPrinterInput( + name: selectedPrinter!.deviceName, + address: selectedPrinter!.address!, + isBle: selectedPrinter!.isBle ?? false, + autoConnect: _reconnect)); + break; + case PrinterType.network: + await printerManager.connect(type: selectedPrinter!.typePrinter, model: TcpPrinterInput(ipAddress: selectedPrinter!.address!)); + _isConnected = true; + break; + default: + } + + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + surfaceTintColor: Colors.white, + content: Container( + height: MediaQuery.of(context).size.height*0.5, + constraints: const BoxConstraints(maxWidth: 400), + child: SingleChildScrollView( + padding: EdgeInsets.zero, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Expanded( + child: ElevatedButton( + onPressed: selectedPrinter == null || _isConnected + ? null + : () { + _connectDevice(); + }, + child: const Text("Connect", textAlign: TextAlign.center), + ), + ), + const SizedBox(width: 8), + Expanded( + child: ElevatedButton( + onPressed: selectedPrinter == null || !_isConnected + ? null + : () { + if (selectedPrinter != null) printerManager.disconnect(type: selectedPrinter!.typePrinter); + setState(() { + _isConnected = false; + }); + }, + child: const Text("Disconnect", textAlign: TextAlign.center), + ), + ), + ], + ), + ), + Column( + children: devices + .map( + (device) => ListTile( + selected: selectedPrinter != null && + ((device.typePrinter == PrinterType.usb && Platform.isWindows + ? device.deviceName == selectedPrinter!.deviceName + : device.vendorId != null && selectedPrinter!.vendorId == device.vendorId) || + (device.address != null && selectedPrinter!.address == device.address)), + selectedColor: Theme.of(context).primaryColor, + title: Text('${device.deviceName}'), + subtitle: Platform.isAndroid && defaultPrinterType == PrinterType.usb + ? null + : Visibility(visible: !Platform.isWindows, child: Text("${device.address}")), + onTap: () { + // do something + selectDevice(device).then((value) async => { + if(value==true){ + await _printReceiveTest() + } + }); + }, + leading: selectedPrinter != null && + ((device.typePrinter == PrinterType.usb && Platform.isWindows + ? device.deviceName == selectedPrinter!.deviceName + : device.vendorId != null && selectedPrinter!.vendorId == device.vendorId) || + (device.address != null && selectedPrinter!.address == device.address)) + ? const Icon( + Icons.check, + color: Colors.green, + ) + : null, + + ), + ) + .toList()), + Visibility( + visible: defaultPrinterType == PrinterType.network && Platform.isWindows, + child: Padding( + padding: const EdgeInsets.only(top: 10.0), + child: TextFormField( + controller: _ipController, + keyboardType: const TextInputType.numberWithOptions(signed: true), + decoration: const InputDecoration( + label: Text("Ip Address"), + prefixIcon: Icon(Icons.wifi, size: 24), + ), + onChanged: setIpAddress, + ), + ), + ), + Visibility( + visible: defaultPrinterType == PrinterType.network && Platform.isWindows, + child: Padding( + padding: const EdgeInsets.only(top: 10.0), + child: TextFormField( + controller: _portController, + keyboardType: const TextInputType.numberWithOptions(signed: true), + decoration: const InputDecoration( + label: Text("Port"), + prefixIcon: Icon(Icons.numbers_outlined, size: 24), + ), + onChanged: setPort, + ), + ), + ), + Visibility( + visible: defaultPrinterType == PrinterType.network && Platform.isWindows, + child: Padding( + padding: const EdgeInsets.only(top: 10.0), + child: OutlinedButton( + onPressed: () async { + if (_ipController.text.isNotEmpty) setIpAddress(_ipController.text); + _printReceiveTest(); + }, + child: const Padding( + padding: EdgeInsets.symmetric(vertical: 4, horizontal: 50), + child: Text("Print", textAlign: TextAlign.center), + ), + ), + ), + ) + ], + ), + ), + ), + ); + } +} + +class BluetoothPrinter { + int? id; + String? deviceName; + String? address; + String? port; + String? vendorId; + String? productId; + bool? isBle; + + PrinterType typePrinter; + bool? state; + + BluetoothPrinter( + {this.deviceName, + this.address, + this.port, + this.state, + this.vendorId, + this.productId, + this.typePrinter = PrinterType.bluetooth, + this.isBle = false}); +} diff --git a/frontend/mgramseva/lib/widgets/bottom_button_bar.dart b/frontend/mgramseva/lib/widgets/bottom_button_bar.dart index 65489bfa2..674756c32 100644 --- a/frontend/mgramseva/lib/widgets/bottom_button_bar.dart +++ b/frontend/mgramseva/lib/widgets/bottom_button_bar.dart @@ -45,10 +45,11 @@ class BottomButtonBar extends StatelessWidget { print(ApplicationLocalizations.of(context).translate(this.label)); return ElevatedButton( style: ElevatedButton.styleFrom( - primary: callBack != null ? Color.fromRGBO(244, 119, 56, 0.7) : Color.fromRGBO(235,235,228, 0.7) + backgroundColor: callBack != null ? Color.fromRGBO(244, 119, 56, 1) : Color.fromRGBO(235,235,228, 0.7) ), child: Text( ApplicationLocalizations.of(context).translate(this.label), + style: Theme.of(context).textTheme.labelLarge, ), onPressed: () => callBack != null ? callBack!() : null, ); diff --git a/frontend/mgramseva/lib/widgets/button.dart b/frontend/mgramseva/lib/widgets/button.dart index b399b0101..8c91a1d58 100644 --- a/frontend/mgramseva/lib/widgets/button.dart +++ b/frontend/mgramseva/lib/widgets/button.dart @@ -15,12 +15,11 @@ class Button extends StatelessWidget { decoration: CommonStyles.buttonBottomDecoration, child: new ElevatedButton( style: ElevatedButton.styleFrom( - minimumSize: Size(double.infinity, 50), - primary: widgetFunction == null ? Color.fromRGBO(244, 119, 56, 0.7) : null + minimumSize: Size(double.infinity, 50), backgroundColor: widgetFunction != null ? Color.fromRGBO(244, 119, 56, 1) : Color.fromRGBO(244, 119, 56, 0.7) // padding: EdgeInsets.all(15), ), child: new Text(ApplicationLocalizations.of(context).translate(label), - style: Theme.of(context).textTheme.button), + style: Theme.of(context).textTheme.labelLarge), onPressed: () => widgetFunction != null ? widgetFunction!() : null ), )); diff --git a/frontend/mgramseva/lib/widgets/button_group.dart b/frontend/mgramseva/lib/widgets/button_group.dart index dfd579bc8..09cfc952f 100644 --- a/frontend/mgramseva/lib/widgets/button_group.dart +++ b/frontend/mgramseva/lib/widgets/button_group.dart @@ -34,25 +34,17 @@ class ButtonGroup extends StatelessWidget { Expanded( child: OutlinedButton.icon( onPressed: callBackIcon, - style: ButtonStyle( - alignment: Alignment.center, - padding: MaterialStateProperty.all( - EdgeInsets.symmetric(vertical: 0.0)), - shape: - MaterialStateProperty.all(RoundedRectangleBorder( - borderRadius: BorderRadius.circular(0.0), - side: BorderSide( - width: 2, - color: Theme.of(context).primaryColor), - )), - ), + style: ElevatedButton.styleFrom(padding:EdgeInsets.symmetric(vertical: 8),alignment: Alignment.center,side:BorderSide( + width: 1, + color: Theme.of(context).disabledColor), + ), icon: (Image.asset('assets/png/whats_app.png', fit: BoxFit.fitHeight,)), label: Padding( - padding: const EdgeInsets.symmetric(vertical: 15), + padding: const EdgeInsets.symmetric(vertical: 12), child: Text( ApplicationLocalizations.of(context) .translate(i18.common.SHARE_BILL_PDF), - style: Theme.of(context).textTheme.subtitle2)), + style: Theme.of(context).textTheme.titleSmall)), )), Expanded(child: ShortButton(label, callBack)) ], diff --git a/frontend/mgramseva/lib/widgets/custom_app_bar.dart b/frontend/mgramseva/lib/widgets/custom_app_bar.dart index cdbd0bf51..b6bb07c1b 100644 --- a/frontend/mgramseva/lib/widgets/custom_app_bar.dart +++ b/frontend/mgramseva/lib/widgets/custom_app_bar.dart @@ -130,15 +130,13 @@ class _CustomAppBarState extends State { ), onChanged: (text) { if(text.isEmpty){ - stateSetter(()=>{ - visibleTenants = tenants.asMap().values.toList() - }); + stateSetter(()=>visibleTenants = tenants.asMap().values.toList() + ); }else{ var tresult = tenants.where((e) => "${ApplicationLocalizations.of(context) .translate(e.code!)}-${e.city!.code!}".toLowerCase().trim().contains(text.toLowerCase().trim())).toList(); - stateSetter(()=>{ - visibleTenants = tresult - }); + stateSetter(()=>visibleTenants = tresult + ); } }, ), @@ -236,10 +234,10 @@ class _CustomAppBarState extends State { children: [ Text(ApplicationLocalizations.of(context) .translate(commonProvider - .userDetails!.selectedtenant!.code!)), + .userDetails!.selectedtenant!.code!),style: Theme.of(context).textTheme.labelMedium,), Text(ApplicationLocalizations.of(context) .translate(commonProvider.userDetails! - .selectedtenant!.city!.code!)) + .selectedtenant!.city!.code!),style: Theme.of(context).textTheme.labelSmall,) ])), Icon(Icons.arrow_drop_down) ], @@ -255,6 +253,7 @@ class _CustomAppBarState extends State { Provider.of(context, listen: false); return AppBar( titleSpacing: 0, + iconTheme: IconThemeData(color: Colors.white), title: Image( width: 130, image: NetworkImage( diff --git a/frontend/mgramseva/lib/widgets/file_picker.dart b/frontend/mgramseva/lib/widgets/file_picker.dart index 1835bda00..dfce5ab44 100644 --- a/frontend/mgramseva/lib/widgets/file_picker.dart +++ b/frontend/mgramseva/lib/widgets/file_picker.dart @@ -60,7 +60,7 @@ class FilePickerDemoState extends State { if(paths != null){ var isNotValidSize = false; for(var path in paths){ - if (!(await CommonMethods.isValidFileSize(path.size))) isNotValidSize = true;; + if (!(await CommonMethods.isValidFileSize(path.size))) isNotValidSize = true; } if(isNotValidSize){ @@ -333,7 +333,7 @@ class FilePickerDemoState extends State { if (!(await CommonMethods.isValidFileSize(await file.length()))){ Notifiers.getToastMessage(context, i18.common.FILE_SIZE, 'ERROR'); return; - }; + } if(_multiPick){ _selectedFiles.addAll([file]); }else{ diff --git a/frontend/mgramseva/lib/widgets/label_text.dart b/frontend/mgramseva/lib/widgets/label_text.dart index 53c7a29fa..d9034d392 100644 --- a/frontend/mgramseva/lib/widgets/label_text.dart +++ b/frontend/mgramseva/lib/widgets/label_text.dart @@ -15,7 +15,7 @@ class LabelText extends StatelessWidget { padding: padding ?? (constraints.maxWidth > 760 ? const EdgeInsets.all(20.0) : const EdgeInsets.all(8.0)), child: Text( ApplicationLocalizations.of(context).translate(input), - style: Theme.of(context).textTheme.headline1, + style: Theme.of(context).textTheme.displayLarge, textAlign: TextAlign.left, ), ))); diff --git a/frontend/mgramseva/lib/widgets/pagination.dart b/frontend/mgramseva/lib/widgets/pagination.dart index 144e4544e..1042f88af 100644 --- a/frontend/mgramseva/lib/widgets/pagination.dart +++ b/frontend/mgramseva/lib/widgets/pagination.dart @@ -52,7 +52,7 @@ class _PaginationState extends State { } get dropDownItems { - return [1,2,3,10, 20, 30, 40, 50].map((value) { + return [10, 20, 30, 40, 50].map((value) { return DropdownMenuItem( key: Key('$value'), value: value, diff --git a/frontend/mgramseva/lib/widgets/radio_button_field_builder.dart b/frontend/mgramseva/lib/widgets/radio_button_field_builder.dart index 82a2a6d5b..f21641bf7 100644 --- a/frontend/mgramseva/lib/widgets/radio_button_field_builder.dart +++ b/frontend/mgramseva/lib/widgets/radio_button_field_builder.dart @@ -1,4 +1,3 @@ -import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:mgramseva/utils/localization/application_localizations.dart'; @@ -7,7 +6,7 @@ import 'package:mgramseva/utils/models.dart'; class RadioButtonFieldBuilder extends StatelessWidget { final BuildContext context; final String labelText; - final dynamic? controller; + final dynamic controller; final bool isRequired; final String input; diff --git a/frontend/mgramseva/lib/widgets/search_select_field_builder.dart b/frontend/mgramseva/lib/widgets/search_select_field_builder.dart index 41088136f..11c34414d 100644 --- a/frontend/mgramseva/lib/widgets/search_select_field_builder.dart +++ b/frontend/mgramseva/lib/widgets/search_select_field_builder.dart @@ -7,7 +7,7 @@ import 'package:provider/provider.dart'; class SearchSelectField extends StatefulWidget { final String labelText; - final List> options; + final List options; final dynamic value; final Function(dynamic) widget; final bool? isEnabled; @@ -35,7 +35,7 @@ class SearchSelectFieldState extends State { _focusNode.addListener(() { if (_focusNode.hasFocus) { this._overlayEntry = this._createOverlayEntry(); - Overlay.of(context)!.insert(this._overlayEntry); + Overlay.of(context).insert(this._overlayEntry); } else { this._overlayEntry.remove(); } @@ -47,10 +47,10 @@ class SearchSelectFieldState extends State { afterViewBuild() { var res = widget.options - .where((e) => (e.value == (widget.value))); + .where((e) => (e.toString() == (widget.value))); if (res.isNotEmpty && _focusNode.hasFocus == false) { widget.controller?.text = ApplicationLocalizations.of(context) - .translate((res.first.child as Text).data.toString()); + .translate((res.first).toString()); } } @@ -59,16 +59,24 @@ class SearchSelectFieldState extends State { setState(() { isInit = true; Options = widget.options - .where((element) => (element.child as Text) - .data + .where((element) => element .toString() .toLowerCase() - .contains(val.toString().toLowerCase())) - .toList(); + .contains(val.toString().toLowerCase())).map((e) => + DropdownMenuItem( + value: e, + child: new Text(('${e.toString()}')), + ), + ).toList(); }); } else { setState(() { - Options = widget.options; + Options = widget.options.map((e) => + DropdownMenuItem( + value: e, + child: new Text(('${e.toString()}')), + ), + ).toList(); }); } } @@ -105,16 +113,15 @@ class SearchSelectFieldState extends State { child: ListTile( title: Text(ApplicationLocalizations.of(context) .translate( - (item.child as Text).data.toString())), + item.toString())), onTap: () { - Text txt = item.child as Text; - widget.widget(item.value); + widget.widget(item.toString()); setState(() { - selectedCode = item.value; + selectedCode = item; }); widget.controller?.text = ApplicationLocalizations.of(context) - .translate((txt.data.toString())); + .translate((item.toString())); _focusNode.unfocus(); }, )), @@ -156,7 +163,7 @@ class SearchSelectFieldState extends State { } else if (widget.options .where((element) => ApplicationLocalizations.of(context) - .translate((element.child as Text).data.toString()) + .translate((element).toString()) .toLowerCase() == (value.toString().toLowerCase())) .toList() diff --git a/frontend/mgramseva/lib/widgets/select_field_builder.dart b/frontend/mgramseva/lib/widgets/select_field_builder.dart index fa30ec834..2945df97c 100644 --- a/frontend/mgramseva/lib/widgets/select_field_builder.dart +++ b/frontend/mgramseva/lib/widgets/select_field_builder.dart @@ -1,3 +1,4 @@ +import 'package:dropdown_search/dropdown_search.dart'; import 'package:flutter/material.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:mgramseva/providers/language.dart'; @@ -12,11 +13,12 @@ class SelectFieldBuilder extends StatefulWidget { final String input; final String prefixText; final Function(dynamic) widget; - final List> options; + final String Function(dynamic) itemAsString; + final List options; final bool isRequired; final String? hint; final bool? readOnly; - final bool? isEnabled; + final bool showSearchBox; final String? requiredMessage; final GlobalKey? contextKey; final TextEditingController? controller; @@ -26,11 +28,10 @@ class SelectFieldBuilder extends StatefulWidget { const SelectFieldBuilder(this.labelText, this.value, this.input, this.prefixText, this.widget, this.options, this.isRequired, {this.hint, - this.isEnabled, - this.readOnly, + this.readOnly = false, this.requiredMessage, this.contextKey, - this.controller,this.key, this.suggestionKey}); + this.controller,this.key, this.suggestionKey, required this.itemAsString, this.showSearchBox = false}); @override State createState() => SelectFieldBuilderState(); @@ -49,7 +50,7 @@ class SelectFieldBuilderState extends State { style: TextStyle( fontWeight: FontWeight.w400, fontSize: 16, - color: (widget.isEnabled ?? true) + color: (!widget.readOnly!) ? Theme.of(context).primaryColorDark : Colors.grey)), Visibility( @@ -59,7 +60,7 @@ class SelectFieldBuilderState extends State { style: TextStyle( fontWeight: FontWeight.w400, fontSize: 16, - color: (widget.isEnabled ?? true) + color: (!widget.readOnly! ?? true) ? Theme.of(context).primaryColorDark : Colors.grey)), ), @@ -107,15 +108,31 @@ class SelectFieldBuilderState extends State { children: [ Consumer( builder: (_, consumerProvider, child) => - SearchSelectField( - widget.labelText, - widget.options, - widget.controller, - widget.widget, - widget.value, - widget.isEnabled, - widget.isRequired, - widget.requiredMessage, key : widget.suggestionKey)), + // SearchSelectField( + // widget.labelText, + // widget.options, + // widget.controller, + // widget.widget, + // widget.value, + // widget.isEnabled, + // widget.isRequired, + // widget.requiredMessage, key : widget.suggestionKey), + DropdownSearch( + key: widget.suggestionKey, + selectedItem: widget.value, + itemAsString: widget.itemAsString, + items: widget.options, + onChanged: widget.widget, + enabled: !widget.readOnly!, + popupProps: PopupProps.menu( + showSearchBox: widget.showSearchBox, + fit: FlexFit.loose, + searchDelay: Duration(seconds: 0), + //comment this if you want that the items do not takes all available height + constraints: BoxConstraints(maxHeight: 400), + ), + ) + ), CommonWidgets().buildHint( widget.hint, context, @@ -134,8 +151,26 @@ class SelectFieldBuilderState extends State { child: new Align( alignment: Alignment.centerLeft, child: textLabelWidget)), Consumer(builder: (_, consumerProvider, child) { - return SearchSelectField(widget.labelText, widget.options, widget.controller, widget.widget, - widget.value, widget.isEnabled, widget.isRequired, widget.requiredMessage, key: widget.suggestionKey,); + return DropdownSearch( + key: widget.suggestionKey, + selectedItem: widget.value, + itemAsString: widget.itemAsString, + items: widget.options, + onChanged: widget.widget, + enabled: !widget.readOnly!, + dropdownDecoratorProps: DropDownDecoratorProps( + baseStyle: TextStyle( + color: !widget.readOnly!?Theme.of(context).primaryColorDark:Colors.grey + ) + ), + popupProps: PopupProps.menu( + showSearchBox: widget.showSearchBox, + fit: FlexFit.loose, + searchDelay: Duration(seconds: 0), + //comment this if you want that the items do not takes all available height + constraints: BoxConstraints(maxHeight: 200), + ), + ); }), CommonWidgets().buildHint(widget.hint, context) ]), diff --git a/frontend/mgramseva/lib/widgets/short_button.dart b/frontend/mgramseva/lib/widgets/short_button.dart index 168143037..2d1e1964e 100644 --- a/frontend/mgramseva/lib/widgets/short_button.dart +++ b/frontend/mgramseva/lib/widgets/short_button.dart @@ -17,13 +17,14 @@ class ShortButton extends StatelessWidget { decoration: CommonStyles.buttonBottomDecoration, child: new ElevatedButton( style: ElevatedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 13) + padding: EdgeInsets.symmetric(vertical: 13), + backgroundColor: callBack!=null?Theme.of(context).primaryColor:Theme.of(context).disabledColor ), key: key, child: new Text( ApplicationLocalizations.of(context).translate(label), style: - Theme.of(context).textTheme.subtitle1!.apply(color: Colors.white) + Theme.of(context).textTheme.titleMedium!.apply(color: Colors.white) ), onPressed: callBack ), diff --git a/frontend/mgramseva/lib/widgets/success_page.dart b/frontend/mgramseva/lib/widgets/success_page.dart index 3834102f1..a0a9b4641 100644 --- a/frontend/mgramseva/lib/widgets/success_page.dart +++ b/frontend/mgramseva/lib/widgets/success_page.dart @@ -23,7 +23,7 @@ class SuccessPage extends StatelessWidget { child: Text(ApplicationLocalizations.of(context).translate(label), textAlign: TextAlign.center, style: TextStyle( - color: Theme.of(context).backgroundColor, + color: Theme.of(context).colorScheme.background, fontSize: 32, fontFamily: 'Roboto Condensed', fontWeight: FontWeight.w700 @@ -35,10 +35,10 @@ class SuccessPage extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - amount==null?SizedBox():Text('₹${amount}', + amount==null?SizedBox():Text('₹$amount', textAlign: TextAlign.center, style: TextStyle( - color: Theme.of(context).backgroundColor, + color: Theme.of(context).colorScheme.background, fontSize: 32, fontFamily: 'Roboto Condensed', fontWeight: FontWeight.w700 @@ -46,7 +46,7 @@ class SuccessPage extends StatelessWidget { SizedBox(width: 8,), Icon( Icons.check_circle, - color: Theme.of(context).backgroundColor, + color: Theme.of(context).colorScheme.background, size: 32, ), ], @@ -60,7 +60,7 @@ class SuccessPage extends StatelessWidget { child: Text(ApplicationLocalizations.of(context).translate(subTextHeader ?? ''), textAlign: TextAlign.center, style: TextStyle( - color: Theme.of(context).backgroundColor, + color: Theme.of(context).colorScheme.background, fontSize: 18, fontWeight: FontWeight.w700 )), @@ -71,7 +71,7 @@ class SuccessPage extends StatelessWidget { child: Text(ApplicationLocalizations.of(context).translate(subText ?? ''), textAlign: TextAlign.center, style: TextStyle( - color: Theme.of(context).backgroundColor, + color: Theme.of(context).colorScheme.background, fontSize: 24, fontWeight: FontWeight.w700 )), diff --git a/frontend/mgramseva/lib/widgets/toast/toster.dart b/frontend/mgramseva/lib/widgets/toast/toster.dart index 3a1dc2539..00579b32a 100644 --- a/frontend/mgramseva/lib/widgets/toast/toster.dart +++ b/frontend/mgramseva/lib/widgets/toast/toster.dart @@ -20,7 +20,7 @@ class ToastUtils { } _overlayEntry = createOverlayEntry(context, message, type); - Overlay.of(context)!.insert(_overlayEntry!); + Overlay.of(context).insert(_overlayEntry!); toastTimer = Timer(Duration(seconds: 10), () { if (_overlayEntry != null) { _overlayEntry!.remove(); diff --git a/frontend/mgramseva/pubspec.lock b/frontend/mgramseva/pubspec.lock index 87e1ebf01..958c1b311 100644 --- a/frontend/mgramseva/pubspec.lock +++ b/frontend/mgramseva/pubspec.lock @@ -5,331 +5,450 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051 + url: "https://pub.dev" source: hosted - version: "22.0.0" + version: "64.0.0" + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: dd68ecea9f1e3556d385521bd21c7bafd6311a8c1e11abe2595ca27974f468ee + url: "https://pub.dev" + source: hosted + version: "1.3.13" analyzer: dependency: transitive description: name: analyzer - url: "https://pub.dartlang.org" + sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893" + url: "https://pub.dev" source: hosted - version: "1.7.2" + version: "6.2.0" archive: dependency: transitive description: name: archive - url: "https://pub.dartlang.org" + sha256: "7b875fd4a20b165a3084bd2d210439b22ebc653f21cea4842729c0c30c82596b" + url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.4.9" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.4.2" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.11.0" barcode: dependency: transitive description: name: barcode - url: "https://pub.dartlang.org" + sha256: "789f898eef0bd88312470bdb2cc996f895ad7dd5f89e9adde84b204546a90b45" + url: "https://pub.dev" source: hosted - version: "2.2.0" - bluetooth_thermal_printer: - dependency: "direct main" + version: "2.2.4" + bidi: + dependency: transitive description: - name: bluetooth_thermal_printer - url: "https://pub.dartlang.org" + name: bidi + sha256: "1a7d0c696324b2089f72e7671fd1f1f64fef44c980f3cebc84e803967c597b63" + url: "https://pub.dev" source: hosted - version: "0.0.6" + version: "2.0.10" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" build: dependency: transitive description: name: build - url: "https://pub.dartlang.org" + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.4.1" build_config: dependency: transitive description: name: build_config - url: "https://pub.dartlang.org" + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon - url: "https://pub.dartlang.org" + sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.0.1" build_resolvers: dependency: transitive description: name: build_resolvers - url: "https://pub.dartlang.org" + sha256: "64e12b0521812d1684b1917bc80945625391cb9bdd4312536b1d69dcb6133ed8" + url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.4.1" build_runner: dependency: "direct dev" description: name: build_runner - url: "https://pub.dartlang.org" + sha256: "10c6bcdbf9d049a0b666702cf1cee4ddfdc38f02a19d35ae392863b47519848b" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.4.6" build_runner_core: dependency: transitive description: name: build_runner_core - url: "https://pub.dartlang.org" + sha256: c9e32d21dd6626b5c163d48b037ce906bbe428bc23ab77bcd77bb21e593b6185 + url: "https://pub.dev" source: hosted - version: "7.1.0" + version: "7.2.11" built_collection: dependency: transitive description: name: built_collection - url: "https://pub.dartlang.org" + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - url: "https://pub.dartlang.org" + sha256: "723b4021e903217dfc445ec4cf5b42e27975aece1fc4ebbc1ca6329c2d9fb54e" + url: "https://pub.dev" source: hosted - version: "8.1.2" + version: "8.7.0" buttons_tabbar: dependency: "direct main" description: name: buttons_tabbar - url: "https://pub.dartlang.org" + sha256: "3f0969c26574ef15c0c9ff1dee42c3c4b0d3563d2c8607804372490fb8b76896" + url: "https://pub.dev" source: hosted - version: "1.3.6" + version: "1.3.8" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.0" charcode: dependency: transitive description: name: charcode - url: "https://pub.dartlang.org" + sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 + url: "https://pub.dev" source: hosted version: "1.3.1" charset_converter: dependency: "direct main" description: name: charset_converter - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - charts_common: - dependency: transitive - description: - name: charts_common - url: "https://pub.dartlang.org" + sha256: e4827b2d623ab75c2b6767d69e03485ea5bc894db6f6bdcb2ffeda58446bbe26 + url: "https://pub.dev" source: hosted - version: "0.12.0" - charts_flutter: - dependency: "direct main" - description: - name: charts_flutter - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.0" + version: "2.1.1" checked_yaml: dependency: transitive description: name: checked_yaml - url: "https://pub.dartlang.org" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.3" cli_util: dependency: transitive description: name: cli_util - url: "https://pub.dartlang.org" + sha256: b8db3080e59b2503ca9e7922c3df2072cf13992354d5e944074ffa836fba43b7 + url: "https://pub.dev" source: hosted - version: "0.3.3" + version: "0.4.0" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - url: "https://pub.dartlang.org" + sha256: b2151ce26a06171005b379ecff6e08d34c470180ffe16b8e14b6d52be292b55f + url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "4.8.0" collection: dependency: "direct main" description: name: collection - url: "https://pub.dartlang.org" + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + community_charts_common: + dependency: transitive + description: + name: community_charts_common + sha256: "20697244c826df0545237ebe01d61caa96a2a2e4d23c6f88890441636a4d5220" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + community_charts_flutter: + dependency: "direct main" + description: + name: community_charts_flutter + sha256: ca5bd07337e162daee13c19679f602cd8b3f704520d242beeebbc2e312f84f89 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.0.2" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.1" cross_file: dependency: transitive description: name: cross_file - url: "https://pub.dartlang.org" + sha256: "445db18de832dba8d851e287aff8ccf169bed30d2e94243cb54c7d2f1ed2142c" + url: "https://pub.dev" source: hosted - version: "0.3.1+5" + version: "0.3.3+6" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" csslib: dependency: transitive description: name: csslib - url: "https://pub.dartlang.org" + sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" + url: "https://pub.dev" source: hosted - version: "0.17.0" + version: "1.0.0" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.6" + dart_ping: + dependency: transitive + description: + name: dart_ping + sha256: "91ee37e5bf5316caca5bd6f7b6016e73cd861b6a4b99565a2fd89b1d65003e1a" + url: "https://pub.dev" + source: hosted + version: "8.0.1" + dart_ping_ios: + dependency: "direct main" + description: + name: dart_ping_ios + sha256: ade22dedb8bbe37b6ba69bbfb0cbb36b6a20f55f6a63abcb4583373f9ea8eebd + url: "https://pub.dev" + source: hosted + version: "3.0.0" dart_style: dependency: transitive description: name: dart_style - url: "https://pub.dartlang.org" + sha256: "40ae61a5d43feea6d24bd22c0537a6629db858963b99b4bc1c3db80676f32368" + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.3.4" datetime_picker_formfield: dependency: "direct main" description: name: datetime_picker_formfield - url: "https://pub.dartlang.org" + sha256: "6d0412c98cc5da18a5dca1f81f82a834fbacdb5d249fd6d9bed42d912339720e" + url: "https://pub.dev" source: hosted - version: "2.0.0" - esc_pos_utils: + version: "2.0.1" + dbus: + dependency: transitive + description: + name: dbus + sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" + url: "https://pub.dev" + source: hosted + version: "0.7.10" + dropdown_search: dependency: "direct main" description: - name: esc_pos_utils - url: "https://pub.dartlang.org" + name: dropdown_search + sha256: "55106e8290acaa97ed15bea1fdad82c3cf0c248dd410e651f5a8ac6870f783ab" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "5.0.6" + enum_to_string: + dependency: transitive + description: + name: enum_to_string + sha256: bd9e83a33b754cb43a75b36a9af2a0b92a757bfd9847d2621ca0b1bed45f8e7a + url: "https://pub.dev" + source: hosted + version: "2.0.1" + esc_pos_utils_plus: + dependency: "direct main" + description: + name: esc_pos_utils_plus + sha256: dca660e2bf5622c3b9bc54ce098128606a8942ff07f1e2d2f4c88e483df3fe74 + url: "https://pub.dev" + source: hosted + version: "2.0.2" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "2.1.0" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.4" file_picker: dependency: "direct main" description: name: file_picker - url: "https://pub.dartlang.org" + sha256: be325344c1f3070354a1d84a231a1ba75ea85d413774ec4bdf444c023342e030 + url: "https://pub.dev" source: hosted - version: "4.0.0" - firebase: + version: "5.5.0" + file_selector_linux: dependency: transitive description: - name: firebase - url: "https://pub.dartlang.org" + name: file_selector_linux + sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" + url: "https://pub.dev" source: hosted - version: "9.0.3" + version: "0.9.2+1" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6 + url: "https://pub.dev" + source: hosted + version: "0.9.3+3" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: "0aa47a725c346825a2bd396343ce63ac00bda6eff2fbc43eabe99737dede8262" + url: "https://pub.dev" + source: hosted + version: "2.6.1" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 + url: "https://pub.dev" + source: hosted + version: "0.9.3+1" firebase_analytics: dependency: "direct main" description: name: firebase_analytics - url: "https://pub.dartlang.org" + sha256: de3d73b5c5618bf31004308b017b4067b7d9156b96e97b62d59ae5eab71081ec + url: "https://pub.dev" source: hosted - version: "8.3.4" + version: "10.7.1" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface - url: "https://pub.dartlang.org" + sha256: ffc59c0b00a572cd1fbf915a1d50cb4ccdc61e429614aa6ae9a598ee5723b96a + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.8.1" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web - url: "https://pub.dartlang.org" + sha256: "0e725a7dcdeb0a59e44d93d1d45dfec94efe54329ac9d6aa145e24d31429100c" + url: "https://pub.dev" source: hosted - version: "0.3.0+1" + version: "0.5.5+8" firebase_core: - dependency: transitive + dependency: "direct main" description: name: firebase_core - url: "https://pub.dartlang.org" + sha256: "471b46ea6a9af503184d4de691566887daedd312aec5baac5baa42d819f56446" + url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "2.23.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - url: "https://pub.dartlang.org" + sha256: c437ae5d17e6b5cc7981cf6fd458a5db4d12979905f9aafd1fea930428a9fe63 + url: "https://pub.dev" source: hosted - version: "4.4.1" + version: "5.0.0" firebase_core_web: dependency: transitive description: name: firebase_core_web - url: "https://pub.dartlang.org" + sha256: "0631a2ec971dbc540275e2fa00c3a8a2676f0a7adbc3c197d6fba569db689d97" + url: "https://pub.dev" source: hosted - version: "1.6.5" + version: "2.8.1" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -339,16 +458,18 @@ packages: dependency: "direct main" description: name: flutter_countdown_timer - url: "https://pub.dartlang.org" + sha256: dfcbd7d6f76a5589f78f3f3ba2f9ea2e199368eccc1adce4153ce985b9587bc5 + url: "https://pub.dev" source: hosted version: "4.1.0" flutter_downloader: dependency: "direct main" description: name: flutter_downloader - url: "https://pub.dartlang.org" + sha256: "36c16cc6657274f3cf7ccb681aeca89df62531ff5956f85e175f6be4b8d6b140" + url: "https://pub.dev" source: hosted - version: "1.8.0+1" + version: "1.11.5" flutter_driver: dependency: transitive description: flutter @@ -358,37 +479,74 @@ packages: dependency: "direct main" description: name: flutter_focus_watcher - url: "https://pub.dartlang.org" + sha256: a72ee539ae0237961308a25839887ca93a0b1cb6f87b0d492b139c8fccff8e79 + url: "https://pub.dev" source: hosted version: "2.0.0" + flutter_icmp_ping: + dependency: transitive + description: + name: flutter_icmp_ping + sha256: de9633cf65a8c733fae29d08a35d3d4b343620cd1d13e1bfa88eccf56696d896 + url: "https://pub.dev" + source: hosted + version: "3.1.3" flutter_keyboard_visibility: dependency: transitive description: name: flutter_keyboard_visibility - url: "https://pub.dartlang.org" + sha256: "4983655c26ab5b959252ee204c2fffa4afeb4413cd030455194ec0caa3b8e7cb" + url: "https://pub.dev" + source: hosted + version: "5.4.1" + flutter_keyboard_visibility_linux: + dependency: transitive + description: + name: flutter_keyboard_visibility_linux + sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_macos: + dependency: transitive + description: + name: flutter_keyboard_visibility_macos + sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 + url: "https://pub.dev" source: hosted - version: "5.0.3" + version: "1.0.0" flutter_keyboard_visibility_platform_interface: dependency: transitive description: name: flutter_keyboard_visibility_platform_interface - url: "https://pub.dartlang.org" + sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 + url: "https://pub.dev" source: hosted version: "2.0.0" flutter_keyboard_visibility_web: dependency: transitive description: name: flutter_keyboard_visibility_web - url: "https://pub.dartlang.org" + sha256: d3771a2e752880c79203f8d80658401d0c998e4183edca05a149f5098ce6e3d1 + url: "https://pub.dev" source: hosted version: "2.0.0" + flutter_keyboard_visibility_windows: + dependency: transitive + description: + name: flutter_keyboard_visibility_windows + sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 + url: "https://pub.dev" + source: hosted + version: "1.0.0" flutter_launcher_icons: dependency: "direct dev" description: name: flutter_launcher_icons - url: "https://pub.dartlang.org" + sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" + url: "https://pub.dev" source: hosted - version: "0.9.2" + version: "0.13.1" flutter_localizations: dependency: "direct main" description: flutter @@ -398,44 +556,50 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - url: "https://pub.dartlang.org" + sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.17" flutter_rating_bar: dependency: "direct main" description: name: flutter_rating_bar - url: "https://pub.dartlang.org" + sha256: d2af03469eac832c591a1eba47c91ecc871fe5708e69967073c043b2d775ed93 + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.1" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage - url: "https://pub.dartlang.org" + sha256: "9f3dd2ac3b6875b0fde5b04734789c3ef35ba3965c18e99dd564a7a2f8056df6" + url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "4.2.1" flutter_share_me: dependency: "direct main" description: name: flutter_share_me - url: "https://pub.dartlang.org" + sha256: "2cd97783bcd7c61eaee20b11c2952bb57a94608f25c3504ff3c08803134609c2" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" flutter_spinkit: dependency: "direct main" description: name: flutter_spinkit - url: "https://pub.dartlang.org" + sha256: b39c753e909d4796906c5696a14daf33639a76e017136c8d82bf3e620ce5bb8e + url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.2.0" flutter_svg: dependency: "direct main" description: name: flutter_svg - url: "https://pub.dartlang.org" + sha256: d39e7f95621fc84376bc0f7d504f05c3a41488c562f4a8ad410569127507402c + url: "https://pub.dev" source: hosted - version: "0.22.0" + version: "2.0.9" flutter_test: dependency: "direct dev" description: flutter @@ -445,9 +609,10 @@ packages: dependency: "direct main" description: name: flutter_typeahead - url: "https://pub.dartlang.org" + sha256: b9942bd5b7611a6ec3f0730c477146cffa4cd4b051077983ba67ddfc9e7ee818 + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.8.0" flutter_web_plugins: dependency: "direct main" description: flutter @@ -457,9 +622,10 @@ packages: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "3.2.0" fuchsia_remote_debug_protocol: dependency: transitive description: flutter @@ -469,93 +635,146 @@ packages: dependency: transitive description: name: gbk_codec - url: "https://pub.dartlang.org" + sha256: "3af5311fc9393115e3650ae6023862adf998051a804a08fb804f042724999f61" + url: "https://pub.dev" source: hosted version: "0.4.0" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.2" graphs: dependency: transitive description: name: graphs - url: "https://pub.dartlang.org" + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.3.1" hex: dependency: transitive description: name: hex - url: "https://pub.dartlang.org" + sha256: "4e7cd54e4b59ba026432a6be2dd9d96e4c5205725194997193bf871703b82c4a" + url: "https://pub.dev" source: hosted version: "0.2.0" horizontal_data_table: dependency: "direct main" description: name: horizontal_data_table - url: "https://pub.dartlang.org" + sha256: c8ab5256bbced698a729f3e0ff2cb0e8e97416cdbb082860370eaf883badf722 + url: "https://pub.dev" source: hosted - version: "4.1.4" + version: "4.3.1" html: dependency: transitive description: name: html - url: "https://pub.dartlang.org" + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + url: "https://pub.dev" source: hosted - version: "0.15.0" + version: "0.15.4" http: dependency: "direct main" description: name: http - url: "https://pub.dartlang.org" + sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" + url: "https://pub.dev" source: hosted - version: "0.13.3" + version: "1.1.0" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.2" image: dependency: transitive description: name: image - url: "https://pub.dartlang.org" + sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "4.1.3" image_picker: dependency: "direct main" description: name: image_picker - url: "https://pub.dartlang.org" + sha256: b6951e25b795d053a6ba03af5f710069c99349de9341af95155d52665cb4607c + url: "https://pub.dev" source: hosted - version: "0.8.4" + version: "0.8.9" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: d6a6e78821086b0b737009b09363018309bbc6de3fd88cc5c26bc2bb44a4957f + url: "https://pub.dev" + source: hosted + version: "0.8.8+2" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - url: "https://pub.dartlang.org" + sha256: "869fe8a64771b7afbc99fc433a5f7be2fea4d1cb3d7c11a48b6b579eb9c797f0" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: "76ec722aeea419d03aa915c2c96bf5b47214b053899088c9abb4086ceecf97a7" + url: "https://pub.dev" + source: hosted + version: "0.8.8+4" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" + url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "0.2.1+1" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - url: "https://pub.dartlang.org" + sha256: ed9b00e63977c93b0d2d2b343685bed9c324534ba5abafbb3dfbd6a780b1b514 + url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.9.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" integration_test: dependency: "direct dev" description: flutter @@ -565,359 +784,458 @@ packages: dependency: transitive description: name: intl - url: "https://pub.dartlang.org" + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + url: "https://pub.dev" source: hosted - version: "0.17.0" + version: "0.18.1" io: dependency: transitive description: name: io - url: "https://pub.dartlang.org" + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" jiffy: dependency: transitive description: name: jiffy - url: "https://pub.dartlang.org" + sha256: c3c1da3fe0c08bba3c2c455e8a3e724dfe7ea34dbe8069b992cab90ea1fe40b6 + url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.0.1" js: dependency: "direct main" description: name: js - url: "https://pub.dartlang.org" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.7" json_annotation: dependency: "direct main" description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "4.8.1" json_serializable: dependency: "direct dev" description: name: json_serializable - url: "https://pub.dartlang.org" + sha256: aa1f5a8912615733e0fdc7a02af03308933c93235bdc8d50d0b0c8a8ccb0b969 + url: "https://pub.dev" source: hosted - version: "4.1.4" + version: "6.7.1" lint: dependency: transitive description: name: lint - url: "https://pub.dartlang.org" + sha256: "4a539aa34ec5721a2c7574ae2ca0336738ea4adc2a34887d54b7596310b33c85" + url: "https://pub.dev" source: hosted - version: "1.7.2" + version: "1.10.0" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.2.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.5.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.10.0" mime: dependency: "direct main" description: name: mime - url: "https://pub.dartlang.org" + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.4" nearby_connections: dependency: "direct main" description: name: nearby_connections - url: "https://pub.dartlang.org" + sha256: "95fbc4fb01a199a02e6498b32800a89ea10e4e40b1e6ccae2033fe3e31453309" + url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.3.1" nested: dependency: transitive description: name: nested - url: "https://pub.dartlang.org" + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" source: hosted version: "1.0.0" - new_version: + network_info_plus: + dependency: transitive + description: + name: network_info_plus + sha256: "2d9e88b9a459e5d4e224f828d26cc38ea140511e89b943116939994324be5c96" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + network_info_plus_platform_interface: + dependency: transitive + description: + name: network_info_plus_platform_interface + sha256: "881f5029c5edaf19c616c201d3d8b366c5b1384afd5c1da5a49e4345de82fb8b" + url: "https://pub.dev" + source: hosted + version: "1.1.3" + new_version_plus: dependency: "direct main" description: - name: new_version - url: "https://pub.dartlang.org" + name: new_version_plus + sha256: e0d8027223488cc7f7c78f6ff286f1b5d9808f88814aecfa0bb12254d25f48ca + url: "https://pub.dev" source: hosted - version: "0.2.3" + version: "0.0.11" + nm: + dependency: transitive + description: + name: nm + sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" + url: "https://pub.dev" + source: hosted + version: "0.5.0" number_to_words: dependency: "direct main" description: name: number_to_words - url: "https://pub.dartlang.org" + sha256: "279af97baabe7460e3e724be5e797ab1902bcf0ce52d065dd2409a4be423f05c" + url: "https://pub.dev" source: hosted version: "1.0.0" - open_file: + open_filex: dependency: "direct main" description: - name: open_file - url: "https://pub.dartlang.org" + name: open_filex + sha256: a6c95237767c5647e68b71a476602fcf4f1bfc530c126265e53addae22ef5fc2 + url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "4.3.4" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" package_info_plus: dependency: "direct main" description: name: package_info_plus - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - package_info_plus_linux: - dependency: transitive - description: - name: package_info_plus_linux - url: "https://pub.dartlang.org" + sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017" + url: "https://pub.dev" source: hosted - version: "1.0.3" - package_info_plus_macos: - dependency: transitive - description: - name: package_info_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "4.2.0" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - package_info_plus_web: - dependency: transitive - description: - name: package_info_plus_web - url: "https://pub.dartlang.org" + sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + url: "https://pub.dev" source: hosted - version: "1.0.4" - package_info_plus_windows: - dependency: transitive - description: - name: package_info_plus_windows - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" + version: "2.0.1" path: dependency: "direct main" description: name: path - url: "https://pub.dartlang.org" + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" source: hosted - version: "1.8.2" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" + version: "1.8.3" path_parsing: dependency: transitive description: name: path_parsing - url: "https://pub.dartlang.org" + sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + url: "https://pub.dev" source: hosted - version: "0.2.1" + version: "1.0.1" path_provider: dependency: "direct main" description: name: path_provider - url: "https://pub.dartlang.org" + sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa + url: "https://pub.dev" source: hosted - version: "2.0.2" - path_provider_linux: + version: "2.1.1" + path_provider_android: dependency: transitive description: - name: path_provider_linux - url: "https://pub.dartlang.org" + name: path_provider_android + sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72 + url: "https://pub.dev" source: hosted - version: "2.0.2" - path_provider_macos: + version: "2.2.1" + path_provider_foundation: dependency: transitive description: - name: path_provider_macos - url: "https://pub.dartlang.org" + name: path_provider_foundation + sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d" + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.3.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.1" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.2.1" pdf: dependency: "direct main" description: name: pdf - url: "https://pub.dartlang.org" - source: hosted - version: "3.8.1" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" + sha256: aa8835fcb9cfaf57ab2f1970e8548ceed3d0cb53eda7da906648f8153eaf37c9 + url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "3.10.6" permission_handler: dependency: "direct main" description: name: permission_handler - url: "https://pub.dartlang.org" + sha256: "860c6b871c94c78e202dc69546d4d8fd84bd59faeb36f8fb9888668a53ff4f78" + url: "https://pub.dev" + source: hosted + version: "11.1.0" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "2f1bec180ee2f5665c22faada971a8f024761f632e93ddc23310487df52dcfa6" + url: "https://pub.dev" + source: hosted + version: "12.0.1" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: "1a816084338ada8d574b1cb48390e6e8b19305d5120fe3a37c98825bacc78306" + url: "https://pub.dev" source: hosted - version: "8.1.4+2" + version: "9.2.0" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: d96ff56a757b7f04fa825c469d296c5aebc55f743e87bd639fef91a466a24da8 + url: "https://pub.dev" + source: hosted + version: "0.1.0+1" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - url: "https://pub.dartlang.org" + sha256: d87349312f7eaf6ce0adaf668daf700ac5b06af84338bd8b8574dfbd93ffe1a1 + url: "https://pub.dev" source: hosted - version: "3.6.1" + version: "4.0.2" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1e8640c1e39121128da6b816d236e714d2cf17fac5a105dd6acdd3403a628004" + url: "https://pub.dev" + source: hosted + version: "0.2.0" petitparser: dependency: transitive description: name: petitparser - url: "https://pub.dartlang.org" + sha256: eeb2d1428ee7f4170e2bd498827296a18d4e7fc462b71727d111c0ac7707cfa6 + url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "6.0.1" pin_input_text_field: dependency: "direct main" description: name: pin_input_text_field - url: "https://pub.dartlang.org" + sha256: "8d6fc670aa673a4df5976086f0e8039972a5b2bcb783c8db8dd3b9b4b072ca90" + url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "4.5.1" + ping_discover_network_forked: + dependency: transitive + description: + name: ping_discover_network_forked + sha256: d3975c4f3fbaa388f78fb4037ad9c33059d8e2ec0e804ed45e05277d2451fe77 + url: "https://pub.dev" + source: hosted + version: "0.0.1" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102 + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.2" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: f4f88d4a900933e7267e2b353594774fc0d07fb072b47eedcd5b54e1ea3269f8 + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.7" + pointer_interceptor: + dependency: transitive + description: + name: pointer_interceptor + sha256: adf7a637f97c077041d36801b43be08559fd4322d2127b3f20bb7be1b9eebc22 + url: "https://pub.dev" + source: hosted + version: "0.9.3+7" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" + url: "https://pub.dev" + source: hosted + version: "3.7.3" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "1.5.1" print_bluetooth_thermal: dependency: "direct main" description: name: print_bluetooth_thermal - url: "https://pub.dartlang.org" + sha256: aecc2c8e799e524e4622e3ab298bfc8cc44bc3d61de425591e17f1cacf6a3f5a + url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.0.9" printing: dependency: "direct main" description: name: printing - url: "https://pub.dartlang.org" + sha256: ad39a42a5f83125952457dfd94f395c8cf0eb1f7759583dadb769be5c7f99d24 + url: "https://pub.dev" source: hosted - version: "5.9.1" + version: "5.11.1" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" source: hosted version: "4.2.4" provider: dependency: "direct main" description: name: provider - url: "https://pub.dartlang.org" + sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" + url: "https://pub.dev" source: hosted - version: "6.0.5" + version: "6.1.1" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.4" pubspec_parse: dependency: transitive description: name: pubspec_parse - url: "https://pub.dartlang.org" + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.2.3" qr: dependency: transitive description: name: qr - url: "https://pub.dartlang.org" + sha256: "64957a3930367bf97cc211a5af99551d630f2f4625e38af10edd6b19131b64b3" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.1" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + url: "https://pub.dev" + source: hosted + version: "0.27.7" screenshot: dependency: "direct main" description: name: screenshot - url: "https://pub.dartlang.org" + sha256: "455284ff1f5b911d94a43c25e1385485cf6b4f288293eba68f15dad711c7b81c" + url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "2.1.0" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.4.1" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.4" sky_engine: dependency: transitive description: flutter @@ -927,226 +1245,322 @@ packages: dependency: transitive description: name: source_gen - url: "https://pub.dartlang.org" + sha256: fc0da689e5302edb6177fdd964efcb7f58912f43c28c2047a808f5bfff643d16 + url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.4.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" + url: "https://pub.dev" + source: hosted + version: "1.3.4" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" stream_transform: dependency: transitive description: name: stream_transform - url: "https://pub.dartlang.org" + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" sync_http: dependency: transitive description: name: sync_http - url: "https://pub.dartlang.org" + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.dev" source: hosted version: "0.3.1" syncfusion_flutter_core: dependency: transitive description: name: syncfusion_flutter_core - url: "https://pub.dartlang.org" + sha256: "3979f0b1c5a97422cadae52d476c21fa3e0fb671ef51de6cae1d646d8b99fe1f" + url: "https://pub.dev" source: hosted - version: "20.3.60" + version: "20.4.54" syncfusion_flutter_xlsio: dependency: "direct main" description: name: syncfusion_flutter_xlsio - url: "https://pub.dartlang.org" + sha256: a73bb379ab01f37a764038667d1e3636a46cc55a4bfa573e98475a35659b7bff + url: "https://pub.dev" source: hosted - version: "20.3.60-beta" + version: "20.4.54-beta" syncfusion_officecore: dependency: transitive description: name: syncfusion_officecore - url: "https://pub.dartlang.org" + sha256: "2ca66b01fb903bb8444d02c122078917d34edf2e5ad640cb41e3f07076c3b677" + url: "https://pub.dev" source: hosted - version: "20.3.60-beta" + version: "20.4.54-beta" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://pub.dev" + source: hosted + version: "0.6.1" + thermal_printer: + dependency: "direct main" + description: + name: thermal_printer + sha256: "0434f1c18a58b03d46139917e58e7236ad9776fccc36fd9ffd2f17a75fbbc333" + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "1.0.1" timing: dependency: transitive description: name: timing - url: "https://pub.dartlang.org" + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" universal_html: dependency: "direct main" description: name: universal_html - url: "https://pub.dartlang.org" + sha256: "56536254004e24d9d8cfdb7dbbf09b74cf8df96729f38a2f5c238163e3d58971" + url: "https://pub.dev" source: hosted - version: "2.0.8" + version: "2.2.4" universal_io: dependency: transitive description: name: universal_io - url: "https://pub.dartlang.org" + sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" + url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.2.2" url_launcher: dependency: "direct main" description: name: url_launcher - url: "https://pub.dartlang.org" + sha256: b1c9e98774adf8820c96fbc7ae3601231d324a7d5ebd8babe27b6dfac91357ba + url: "https://pub.dev" source: hosted - version: "6.0.9" + version: "6.2.1" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: bba3373219b7abb6b5e0d071b0fe66dfbe005d07517a68e38d4fc3638f35c6d3 + url: "https://pub.dev" + source: hosted + version: "6.2.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - url: "https://pub.dartlang.org" + sha256: "9f2d390e096fdbe1e6e6256f97851e51afc2d9c423d3432f1d6a02a8a9a8b9fd" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.1.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - url: "https://pub.dartlang.org" + sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.1.0" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - url: "https://pub.dartlang.org" + sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" + url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.2.0" url_launcher_web: dependency: transitive description: name: url_launcher_web - url: "https://pub.dartlang.org" + sha256: "138bd45b3a456dcfafc46d1a146787424f8d2edfbf2809c9324361e58f851cf7" + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.2.1" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - url: "https://pub.dartlang.org" + sha256: "7754a1ad30ee896b265f8d14078b0513a4dba28d358eabb9d5f339886f4a1adc" + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "3.1.0" url_strategy: dependency: "direct main" description: name: url_strategy - url: "https://pub.dartlang.org" + sha256: "42b68b42a9864c4d710401add17ad06e28f1c1d5500c93b98c431f6b0ea4ab87" + url: "https://pub.dev" source: hosted version: "0.2.0" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "0f0c746dd2d6254a0057218ff980fc7f5670fd0fcf5e4db38a490d31eed4ad43" + url: "https://pub.dev" + source: hosted + version: "1.1.9+1" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "0edf6d630d1bfd5589114138ed8fada3234deacc37966bec033d3047c29248b7" + url: "https://pub.dev" + source: hosted + version: "1.1.9+1" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: d24333727332d9bd20990f1483af4e09abdb9b1fc7c3db940b56ab5c42790c26 + url: "https://pub.dev" + source: hosted + version: "1.1.9+1" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" vm_service: dependency: transitive description: name: vm_service - url: "https://pub.dartlang.org" + sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 + url: "https://pub.dev" source: hosted - version: "9.0.0" + version: "11.10.0" watcher: dependency: transitive description: name: watcher - url: "https://pub.dartlang.org" + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + url: "https://pub.dev" + source: hosted + version: "0.3.0" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.4.0" webdriver: dependency: transitive description: name: webdriver - url: "https://pub.dartlang.org" + sha256: "3c923e918918feeb90c4c9fdf1fe39220fa4c0e8e2c0fffaded174498ef86c49" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.2" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: "7c99c0e1e2fa190b48d25c81ca5e42036d5cac81430ef249027d97b0935c553f" + url: "https://pub.dev" source: hosted - version: "2.2.6" + version: "5.1.0" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2" + url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "1.0.3" xml: dependency: transitive description: name: xml - url: "https://pub.dartlang.org" + sha256: af5e77e9b83f2f4adc5d3f0a4ece1c7f45a2467b695c2540381bac793e34e556 + url: "https://pub.dev" source: hosted - version: "5.1.2" + version: "6.4.2" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.2" sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=3.0.0" \ No newline at end of file + dart: ">=3.2.0 <4.0.0" + flutter: ">=3.16.0" diff --git a/frontend/mgramseva/pubspec.yaml b/frontend/mgramseva/pubspec.yaml index 2f597eb81..8fe269f84 100644 --- a/frontend/mgramseva/pubspec.yaml +++ b/frontend/mgramseva/pubspec.yaml @@ -15,66 +15,69 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.2.14+31 + +version: 1.2.15+32 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.12.0 <4.0.0" dependencies: flutter: sdk: flutter cupertino_icons: ^1.0.2 - bluetooth_thermal_printer: ^0.0.6 + thermal_printer: ^1.0.1 + dart_ping_ios: ^3.0.0 universal_html: ^2.0.8 flutter_secure_storage: ^4.2.0 - flutter_svg: ^0.22.0 + flutter_svg: ^2.0.7 datetime_picker_formfield: ^2.0.0 horizontal_data_table: ^4.1.3 - file_picker: ^4.0.3 - http: ^0.13.3 + file_picker: ^5.5.0 + http: ^1.1.0 provider: ^6.0.0 flutter_spinkit: ^5.0.0 json_annotation: ^4.8.0 url_strategy: ^0.2.0 - charset_converter: ^2.0.0 - screenshot: ^1.2.3 + charset_converter: ^2.1.1 + screenshot: ^2.1.0 number_to_words: ^1.0.0 flutter_localizations: sdk: flutter flutter_typeahead: ^4.0.0 - flutter_downloader: ^1.8.0+1 + flutter_downloader: ^1.11.5 js: ^0.6.3 - path_provider: ^2.0.2 - permission_handler: ^8.1.4+2 + path_provider: ^2.1.1 + permission_handler: ^11.1.0 buttons_tabbar: ^1.3.6 url_launcher: ^6.0.9 pin_input_text_field: ^4.1.0 flutter_countdown_timer: ^4.1.0 - flutter_rating_bar: ^4.0.0 + flutter_rating_bar: ^4.0.1 collection: ^1.15.0 image_picker: ^0.8.4 flutter_focus_watcher: ^2.0.0 path: ^1.8.0 - esc_pos_utils: ^1.1.0 - new_version: ^0.2.3 + esc_pos_utils_plus: ^2.0.2 + new_version_plus: ^0.0.11 pdf: ^3.8.1 flutter_share_me: ^1.3.0 - printing: ^5.9.1 + printing: ^5.10.4 mime: ^1.0.1 - charts_flutter: ^0.12.0 + community_charts_flutter: ^1.0.1 flutter_web_plugins: sdk: flutter - firebase_analytics: ^8.3.4 - package_info_plus: ^1.3.0 - open_file: ^3.2.1 #use for web - #open_file_safe: ^3.2.3 #use for mobiles + firebase_analytics: ^10.7.0 + firebase_core: ^2.22.0 + package_info_plus: ^4.2.0 + open_filex: ^4.3.4 syncfusion_flutter_xlsio: ^20.3.59-beta print_bluetooth_thermal: ^1.0.5 - nearby_connections: ^3.2.0 + nearby_connections: ^3.3.0 + dropdown_search: ^5.0.6 dev_dependencies: - flutter_launcher_icons: "^0.9.2" + flutter_launcher_icons: ^0.13.1 build_runner: ^2.1.2 flutter_test: sdk: flutter diff --git a/frontend/mgramseva/web/index.html b/frontend/mgramseva/web/index.html index 68f2b2563..c9f112ddb 100644 --- a/frontend/mgramseva/web/index.html +++ b/frontend/mgramseva/web/index.html @@ -21,12 +21,18 @@ - + - mgramseva + mGramSeva + + + - - - - - loading.. - loading.. +loading.. +loading.. - - - - - - - - + + + - -
-
-
+
+
+
From 1a76d51905f1a936f65db9496ff141f8b9df7e97 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Sun, 26 Nov 2023 13:29:24 +0530 Subject: [PATCH 02/70] manifest.json update --- frontend/mgramseva/package.json | 2 +- frontend/mgramseva/web/favicon-32x32.png | Bin 1246 -> 0 bytes frontend/mgramseva/web/favicon-48x48.png | Bin 0 -> 15406 bytes frontend/mgramseva/web/favicon.png | Bin 15406 -> 1246 bytes frontend/mgramseva/web/icons/Icon-16.png | Bin 0 -> 601 bytes frontend/mgramseva/web/icons/Icon-192.png | Bin 601 -> 6991 bytes frontend/mgramseva/web/icons/Icon-512.png | Bin 1246 -> 26214 bytes frontend/mgramseva/web/manifest.json | 26 ++++++++++++++---- .../web/screenshots/mGramSeva-web.png | Bin 0 -> 16976 bytes .../mgramseva/web/screenshots/mGramSeva.jpg | Bin 0 -> 42578 bytes 10 files changed, 22 insertions(+), 6 deletions(-) delete mode 100644 frontend/mgramseva/web/favicon-32x32.png create mode 100644 frontend/mgramseva/web/favicon-48x48.png create mode 100644 frontend/mgramseva/web/icons/Icon-16.png create mode 100644 frontend/mgramseva/web/screenshots/mGramSeva-web.png create mode 100644 frontend/mgramseva/web/screenshots/mGramSeva.jpg diff --git a/frontend/mgramseva/package.json b/frontend/mgramseva/package.json index 651dd7a74..58f1f6376 100644 --- a/frontend/mgramseva/package.json +++ b/frontend/mgramseva/package.json @@ -1,5 +1,5 @@ { "name": "mgramseva", - "version": "1.2.15", + "version": "1.2.16", "license": "egov" } diff --git a/frontend/mgramseva/web/favicon-32x32.png b/frontend/mgramseva/web/favicon-32x32.png deleted file mode 100644 index 14bf16898a0de3f81f50bb3872a4e862c76092cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1246 zcmV<41R?v0P)Px(m`OxIR9HvVmw#xLWfaH1-}im*59hYhbPH`ErW6U5WyMV0y-9^)O4fo_e+6?; z*)KEa)OZP;!})^*kxf@rO1KiKOk*r}_d}_cU`iNK6tq%msdLumz3=;elY0B#46JCrU7S3oz#HqUe43Z881pbd`_=rn{LbUbV$c*A85pc97hbf6;g0RUb6 zf6w;f(S9$umBJzrRw~HB-wB+9u-1S0Y%TliX51wBJ4jxi+JH__xGzu<`6j7j+b}A} zg{lEAAFktz^$45?QO5rI(DMK{0boi)gb1w;ltc)l*Y1i*$XNx+MI^oZ`F zfw)H-X5QwyzIp=F2c3iq=$HX5_AhSjyzGW-o*U>7^i>+-^S%&it#d+Y6)$*(dmb=xn-vj=EFjq!O4WR);-3|>T-~Olw0Od+7P zqNSSgmOFI(6Fm*+cA~r+>q~wZ_^_&VvgLV)2#!hDUj(ho1OU9!G|p%F_akMmU`%pX zIf1tIux&3vBwAIiD@fQtiZBSrVqR>1W`MZCWv!DfpQ z{ZtTt3S>{}zPvN1H=4VUFy=#=D8^sK`~t4C^X1v?$K##hFU(QEnulktjQ{`u07*qo IM6N<$f?n`Od;kCd diff --git a/frontend/mgramseva/web/favicon-48x48.png b/frontend/mgramseva/web/favicon-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..ac0f4ecad078dbcdfdcc83c2625d75367ccbded6 GIT binary patch literal 15406 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 literal 0 HcmV?d00001 diff --git a/frontend/mgramseva/web/favicon.png b/frontend/mgramseva/web/favicon.png index ac0f4ecad078dbcdfdcc83c2625d75367ccbded6..14bf16898a0de3f81f50bb3872a4e862c76092cd 100644 GIT binary patch literal 1246 zcmV<41R?v0P)Px(m`OxIR9HvVmw#xLWfaH1-}im*59hYhbPH`ErW6U5WyMV0y-9^)O4fo_e+6?; z*)KEa)OZP;!})^*kxf@rO1KiKOk*r}_d}_cU`iNK6tq%msdLumz3=;elY0B#46JCrU7S3oz#HqUe43Z881pbd`_=rn{LbUbV$c*A85pc97hbf6;g0RUb6 zf6w;f(S9$umBJzrRw~HB-wB+9u-1S0Y%TliX51wBJ4jxi+JH__xGzu<`6j7j+b}A} zg{lEAAFktz^$45?QO5rI(DMK{0boi)gb1w;ltc)l*Y1i*$XNx+MI^oZ`F zfw)H-X5QwyzIp=F2c3iq=$HX5_AhSjyzGW-o*U>7^i>+-^S%&it#d+Y6)$*(dmb=xn-vj=EFjq!O4WR);-3|>T-~Olw0Od+7P zqNSSgmOFI(6Fm*+cA~r+>q~wZ_^_&VvgLV)2#!hDUj(ho1OU9!G|p%F_akMmU`%pX zIf1tIux&3vBwAIiD@fQtiZBSrVqR>1W`MZCWv!DfpQ z{ZtTt3S>{}zPvN1H=4VUFy=#=D8^sK`~t4C^X1v?$K##hFU(QEnulktjQ{`u07*qo IM6N<$f?n`Od;kCd literal 15406 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 diff --git a/frontend/mgramseva/web/icons/Icon-16.png b/frontend/mgramseva/web/icons/Icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..7d607a21f89bdc6f496d1a1260dd99e6ad2bd625 GIT binary patch literal 601 zcmV-f0;c_mP)Px%6G=otR5(wK(@SU*Q4|K?|DQ)=VcAJO)G0$C7D?j5PYYd?K}ji&p@mT zY6Ij&C|Wwgqce`&?cB7Ws}lgW)E_VB1U&QgW zF5gFV5mDf}WqBVtKQ&tcYDV|CijLTNSmEEez1Lb6Kl?n44Y3x$nMWq+)&Tl|xf==| z0oX3UJi$xlp~P5#=;_JR0vTp-BO-GUoTvrT<}`p^RlC|{SK9*37ajgr0O6(Elw0m1~M5aEh*y(g~tE{d1awoY#6xpdjB@4`V0WI>Qnt_7|7&}Xe7kX09va$%ry)I nNjKjl;)=o>5Viv-5bXa8BYnK)C>=B(00000NkvXXu0mjfl=%G1 literal 0 HcmV?d00001 diff --git a/frontend/mgramseva/web/icons/Icon-192.png b/frontend/mgramseva/web/icons/Icon-192.png index 7d607a21f89bdc6f496d1a1260dd99e6ad2bd625..f3f595226d2f4f8833c05f4964b33dc66dcdd096 100644 GIT binary patch literal 6991 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 DF;Z)K literal 601 zcmV-f0;c_mP)Px%6G=otR5(wK(@SU*Q4|K?|DQ)=VcAJO)G0$C7D?j5PYYd?K}ji&p@mT zY6Ij&C|Wwgqce`&?cB7Ws}lgW)E_VB1U&QgW zF5gFV5mDf}WqBVtKQ&tcYDV|CijLTNSmEEez1Lb6Kl?n44Y3x$nMWq+)&Tl|xf==| z0oX3UJi$xlp~P5#=;_JR0vTp-BO-GUoTvrT<}`p^RlC|{SK9*37ajgr0O6(Elw0m1~M5aEh*y(g~tE{d1awoY#6xpdjB@4`V0WI>Qnt_7|7&}Xe7kX09va$%ry)I nNjKjl;)=o>5Viv-5bXa8BYnK)C>=B(00000NkvXXu0mjfl=%G1 diff --git a/frontend/mgramseva/web/icons/Icon-512.png b/frontend/mgramseva/web/icons/Icon-512.png index 14bf16898a0de3f81f50bb3872a4e862c76092cd..a56794ceff628228a06b33db34e728b49b72c894 100644 GIT binary patch literal 26214 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 IM6N<$f?n`Od;kCd diff --git a/frontend/mgramseva/web/manifest.json b/frontend/mgramseva/web/manifest.json index 94d618ec1..ad7b90830 100644 --- a/frontend/mgramseva/web/manifest.json +++ b/frontend/mgramseva/web/manifest.json @@ -1,11 +1,11 @@ { - "name": "mgramseva", - "short_name": "mgramseva", + "name": "mGramSeva", + "short_name": "mGramSeva", "start_url": ".", "display": "standalone", - "background_color": "#0175C2", - "theme_color": "#0175C2", - "description": "A new Flutter project.", + "background_color": "#eeeeee", + "theme_color": "#f47738", + "description": "A mobile-based application that enables the gram panchayat water committee to collect & manage revenue and expenditure.", "orientation": "portrait-primary", "prefer_related_applications": false, "icons": [ @@ -19,5 +19,21 @@ "sizes": "512x512", "type": "image/png" } + ], + "screenshots": [ + { + "src": "screenshots/mGramSeva.jpg", + "sizes": "320x640", + "type": "image/jpeg", + "form_factor": "narrow", + "label": "mGramSeva" + }, + { + "src": "screenshots/mGramSeva-web.png", + "sizes": "640x320", + "type": "image/png", + "form_factor": "wide", + "label": "mGramSeva-web" + } ] } diff --git a/frontend/mgramseva/web/screenshots/mGramSeva-web.png b/frontend/mgramseva/web/screenshots/mGramSeva-web.png new file mode 100644 index 0000000000000000000000000000000000000000..ddccffd9cd0cddea39a9a574de618161b6987607 GIT binary patch literal 16976 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%0A&@1{uV^thN(ooM|&;!!hX zoM}mB3TB6i#0wt_wL5SRDZ(#Kmt_}~ZulS5`DuO?l4X($xMfNEDdyu7S~)}4ew+g~ z!Q_|2{yj7@{Lq!dGR(Ht_Pz8wsq#f+JVny20J`SoXd_{i{D%kL)`jD-X2u0+X?Pab zdu_cQHTBK5et3Tw*SX5y(e9t8W+0i}J}x8nkes!)FYV4bJU?c1E*W1#X1|a9u=aI{ ztgaJ5LFnGY*4vF9ke9jBlx`d!PeH3Dux_?x(lk=z&x3RJ`z@k+uU)6bQh2srvLY`F z8AJ(@(1*!blRXCiKNzH~dve^;k8Lu+7|pn;;0;Lt(XE(L?~LaOSzzmd)BU zrZBnd{G}lSwasJhyRvGbQ+H2Q^7<3Y2TZ5}k*L~)y(@C9a~7Yo2*E~gy5=YwH2u&l z3*E7PJX-?Pu1PM>qkotA9;WVFHo4CAMVrXIh^x_eesaRW=MyuEZACM+p~S~D;7o3V z>)FB;Xv5mCzC89^jx}}n=PeU!+P;5H-!nd~WTdneUh4HF0#iX9wJ6#z=NbgOPhzlH@bkdBDSg+XP zhfVmORr#8N(vUySP#QCyeZi;?7-U&UAGdVE;#NO3c6C!b&!rii=pImTbDANmDB4aE zyg|_~D;;y;wS)d#E8D;(xJEBZ(NL!2g5kmd1A|ou_uW9Pl5&yi#l7FcIyyeMT`4fF zoGB|WeOPGh2FO+B;sA#GxO3n2RI}qW;;n-1j+||PyL!FxRY%!xCz)M0C7kSytX@&E z`6EUN4q)`%nJ;gg#s@s0XAFoq6bHII3=LjjTZ_12ud7Z3cAmiRW!|;rsee^<>zq;X zZVH!V?wWUedcYXcmJboy@`np2a-7CQB*0+;)E;%uq zDvTpK*hvgiyN!KQW*+3Yg9c$UM`PPEBTRKC{GtKK;+3&7YVT3vemoTre#W>sgln%G=TSY=A zJ`$J6sGYi~0pEji&lqUMw)6|Ff-fk-_#CGngPOtB2EUMp$?~l6NjH3B_s5r^&vH@B^$TA@p-LZ~k;MR6*63;G=5qoNr7=Ja)bS}YDj zwJ;aCGKg1SeABOdC+SDClSzC<-6rO@nWL9qYjFvts#{|54Vak-v>61Ru9PJlJyqUg zbG4jv1Y#Y|TD)88rx7?^vzGlVO&+=jaY5 zt4Wg+o4jT;vI3JW;}Xi|BLXNI!OF1TfMUy#`SyaRgN389hgBv#eXj9m>eixO^sa`t zKz02<$nB%vSHEIjwUfr7|jWG8Dyf;IxHGYlwJ!YUDWg!%=`Uuv<#e6f_ z`?#VW)zBLw7VF3-SbDKYEq*_M1S$%Dh~>lpf8CII-HuB6o*7x4o%vxZEXJ;$RlRR! zN}sNC;yA!%fu9@E&h1L1Jmsl|V-6N+o>e1dj*~I27*_}iRofXURjL!>Wm6NJBALgp}0cm2;*iY<~2~sAfgu_yN|>m~~oVTz1na)&JC>h-@j<|9OF@kr7$%JFqQ5FPR+Oy+^2#wj{Bd)9XCjqn_rG#OH(=Md`uXeV{72U2$8~0`*#K7 z9aqIIiiTiq+?@lX!Ro5&*vf0QQFnfKha6lYOT3qoG{9xqU~c0ca6Ga7_8Pt_IdH=% zUS-q65VNE(d&>yOZ4*DY0|3V@h?oK&( zbBlJ!L>--e4h=fOogbF;xZ7mj9W4}UG0ylAeS@ou$!(8k0J{$-)FJoE%u{k-csXVd z#a|hmIt^ZXG)Dt{R(b>N97T4ZW=90@I-+=S7!MH`%v@x`vym8x4yzp=7bSXqrJ5hIPL@e=Hm1$u)7ck74%Hs&nnFOInU zb^i~aJ`!3B@Y{I%e?1TMk1jU5G%pBzAp&qx7rPmtzwXyK;|oFmJ23w{F#kJa{{L_* ziI>Bj0JIYSqSz(%I6feJS9%Vc(ssQ9r2%U-EIckiaM0 zMti*}g?fDIEV`e}7C$NI)yNWG?4Ev>16rOVkcjVziXtMgAzYJy-V_-Ok;1m?)$lyE zw_Mh3_T$`9;fF&L+G;^A2`8jwExP$g(hYX1FBQxWj>;Ac--POaZN9gIg^Of7bY1Y) zs1BhK5eeQA&VqmL{y3z=ww`_4REHJ#KiRCZ@Q={_gip=|?%!^5DcW;;X$qMpZzSF( zuj8Z=usOIRk;WDoFCJSsU_fB^Vd=t(Gteq++)z( zftzQ~=6cBO-HZ%THGjp4_y+Gy7l^4wgg4PtBYzRPU4!ZMxSe9dd!FmJMTk`VHgthR zE+~gL82TP7XV~PAe5fA#J;bh+cePb(`APam=w)<4q;&G?w1Ks!$%<2*|J$PN>!JW| zNpU%dw;i4_xLQ+Jeze=?fv+nKYQEpw2p3uF3GpU_gL%k5tu)Y+&y+{5*rh| zw#oe?bNCA9Rrcpv=}QUM#Rqms*q(HKFv^6^IAbE9FM_y%(E69lw)OBDrfoP*tbQ8d zf9SP3z{K+=Rjr|<#|9@-X>cnoN0Tz0j;D!q<3FQ){3m0S3wyTK101a$6 zjKCV43OiYlIYYzRUJB;q<48z)zYUC=CjkKgCpZB@s)s-Y&>yJ_i$eN9cyt;83tG^d zbS47X7m2_e6<+L|xH!0ygqbu*@U@8vYkEYwkkN&#+EfQ%HO1d)?&zjfPg(zmj!Y=--E0241-XAQnT(B1=C3CF)o4IR$KbCf zX#HvRb!Jnuvp=0p_>0YdeAVZvhdmJ{pc&ADNePunuQvIN$+;mN`qq2N&!~hm0I?!= zn#U$Rtg!`&y|2Um;T!(R$^X0K*?>EWA_6HeEGhqe)Kx$P@{-3tBKt1KHCY2amh%a1 z|G@!+R3FFn^E(nZ&=mHc-m0Ev>*M=<{6NG|(hmR1*hUOo`*|zZ|ezYw9sG-0Rs=Og1%^HlmWCSJ2b5rUdV>9fA+ym=MLk>k&2sn)>V~zhKfV$ZMk2=r9GBoESPv>EZ!bd zJQu&Ci~C&qWBKx+KZ`Qf7y8*L3{0Fenydh`%np>^w)l$A-M$ zBtQggeF&Sd?a`X+=UGj!pJ!W`V}ZHSXs|5ym0j%Ci$_oGTSD{%U(ip#<@SH0&% z@sx8(B|xsl6cR(~rm5(}*E!!*hwV39fvwj;%+TiS-g&UB5%Ako|IEFl+!9C7<{;s9 z1mTSh5dXO)ywm=s$Y1V z;>2>Skl&KL+en+sCyuRK}7M(ZV;hIyrB7PFJ;;U<{7 z#w=n251<5u>1y+LD|ve*QkKZCG8$8iJio zG5nbUCDRjnOz)hZ&}qc)Rx^BzoBjGzt7e;d%LXzfgcb5WG75zoM(HDeeg3hAL0rWu zOX%ccs~%5POAbvH5<2W=Yn?#i&t1#WEoSB3>u+v*NlbSa2^Sr*f&uBecA}v+s0=V20^NmDUQNq~}zUY9gh{Q@9B0;|k z2>rGeZ~oG__Xivy!w7UIoJjCrA_C>4n=fbVTf!u2!`B|v^=;V_Z3z3kLGY-*TmR~V zs?aM&#-R_)cFq5EJnW^v&n7(p3pBWT}*i7y|W(=v>Snz)Fxw!&S@3+P+aCXxC>mLoBD+6vRop;?=w?3nQG8=!lx~;yT;i z6M8UdnQuOoayh3~Mbc(;AAojYcgie%=dgsxv)zsBd{TdeN@xMjT2@PKxC_D!X(3g9 z62O*LR~HAuvpF#R2UZ!V^rPwbOM6L#AxVf`N~{psuMCWQEW_P)>UA?$r7@iAp7YRS zt~f~qZ-wHBw|<#aaIlS*GTOM^K46i#o?EKHC)2*kD_#7vvNNBtCWG&|KvhD#l*dYj zq1KEZcbel-;Q;XXxV)ex8#G9u!%lbkTX6^Dta}1hZ1tYJGK`5`qNooWj9;xcG&ssZ zH?G3{&bbE8zj*Z6Yz*Tl%sjB`K7Xw)#9|vXRa|3guK<5C?szEa>6&%sd=~TSooMff zyRAYdPVXmqms$)~vq6C#G#Tf2)Q+oI^_os-+yMJw?cYG0ZwoJHs_2WJwK}k%MHiUD zH6G3@{PHWiG>ghi7n0+N&OOn+cCDOh1AKF8s?*V(p+TaO)6`L?N5$kCrEyKLGUI~^ z*2{-6!-ht(wZ{hbO8Z*sZ+v*AujI51hMB$2@6W07oGJlH*NWuCNbE2T(1TfFB_w7B z0YCeExB~v44^1yPcFv>MY_ZXdpfV zY*dv7t!0$PHXo0Xok?uokyyj1@-uNc+>hz0-5IY$YHvP+>c4+*ZLn=&$~5lOzP^6T zXVv&TUICkl?!MntJ@oY81a1;%vgsk_^2kDXnLI2zsOXe?o3y|>;H}f|?qN?SrK{l5 zDln4#=Ofb@Wn)f^*mAX4`(#(%iDh4UUei{{WpGr5N;J;etl-BnG#crJ0i!FH!Blwi zMK~?Cuj5-W^iC_C>hwJkm=)-SU+2#L3wHQd zAR!=!e~jf=Y-WZW5dq7g?WN|bhN<}zOxO3D;o{m!8`EQTaZK}wP7s5AW|{a;53PkX zM}4oto39a{+V>>3xg}P_(Wr}Mu2yTwDFH)ea~@2{+|G$j705!}WwB0?V$Y3$vANK_ zHM}5*545&xLMp@Lf$;W$$W|~Dc3MBu6y9aEZ!DZ|i9)%D%3haG{Vq(u9I)e%spG%! zJP=}2TwJ26IMlnfr?KrBY{he9@Ey0eajB#8@$4U&IcEQ|UD+`{LWTtY!Ds9>qgE2Z zMBwrpB5*uT1a!&(y+4D2Me$G4>L@Ts1RBr8$n#0p2>7RsoZ~-VFcB6Qz0-Q8(-RWE z@8w{Dy9MiM#v2lW3P*DyFs$!FKIr~=ga|BkO%v)6du%_(4M|v|I}Ul~16~$8*Xc|u zkKD*70*_&Cq!pQzm^dv3Og9|t$$oGS@n6#L+p=NXOE>~|Fkzhqs$p%03(Z(veB<0C z5kSY!1XuOojAwAh(??z;Xx7t>Qy@F^V_RsFz<{DXZM#p;;Ia9GDQzsAAJKUKqc|^L zcIp*#-{Fp7!a<$IUS0yZmw5)f1J0@#EYk*O^Mact7=Ihe4^>!67o?o&arNAMFSL5a znwMd+M};pO2(s7Hz)ZCZkKC@%=1zMd{Ghm)QeXH0uu4Qh;2k!`ogSyzCB<>)R<%9y zr#31k3_cr+y{vdO|5n+1Ce`}>gg!56ZFhBh=6bPPxB*oW>Q>DSHWBd)T* zeU--*UQ@KcrEG39e*7jZ=OR0EZMN#iTL%SN*qis{@77#n`KdoL;%<#A%(1vCefykH zXtVjvY4}Czajm@M;E!gMo|#4DSB0&zM{R8j59%6`$gG@Xzj$kl`(5u*^DJ2qQiuWxag_pU#WgCa$l*zbaxmeeA#ed8PU*x_KiR6vw@cfNvm|0v8V6R4*MMZ z&FO>gooz}WOZa30-IV1FLqMjxxHq(9>d~?M0*%OOHO&u7&!t)*If;$!hAhoLA3rv} znh0&~2m}Ia*p}z2EF*(*uotlokVv!f9~nRMYic-m5<6@6oYbLFj<^nX^{O6q|5&mu z1>m0|h@VC89PIleB5+2UX+!SUnMbpf37}6zAn4S>?eCxi*l_RFc(L#v>VXNnIjqQF zU|%zmqFw(DrR>GUHIu!pW&V z=T#TX;Rf$g2>ZSj+7B_M;Z&ksqUV@XTNWsIMO8}Y zXJ2L#kJ7|jm3>-$A%=8RM+It_AT=j-SeuD(Q95-f;xElG`dB-aFeNqbD)nQ~fH#iS zLlD#pm%B`FOvSrCix(Ic8GKMt-88B&t4r5jq*LDdOt{&$GT-LWa7k`*UXh-zVV;=D zr|U6G^FPxHu^@}V8ci$9QBOtv+`5Lba*=4S#~GU0b}zfRySYrcfs2Z!u}i|qWRain zL25@ye7_v{lTo`n%6%dqj@`JV9=!gMrfQ*aC&BY3CPCxz$}_hqr~`(*rXZ@ui>`a& zs~>{V&h6B2w6^RheK7C#0Pnis4VDDOJMU2@&t90n3=+WJ`^JrZV?HM2{=T4jI3n?( zo++!Wqbp?Gi?O$&NH{4f@xg;t{U%OV^Y+|Z;~b&BW#S%!^lDC@QdNf1n;gK*($p7}Uaybg%?mQ|gt;vfMPTdks11=b>8C0!mIo_)C<%z#v z3S$AeN*DthO#)+rU`DOD;>qriH)W7Gg=t*WM3IE^(?_uC+r=&KWH|f8U-@)vzd-9w z_ai+-I~@ek%dkgb#!ZoTQ>Q(1>2EV@%qdZcEyy)JrWCz&cw+ukOB74>84_N;Sc9Rg zTR0OxHhN>wFnmy3v*-CR&f4*O{wsZR7au~|FaG)EWpbv)wT^*{eGA5Xh;ZNAt0UF6 zSLYi?r!CzLzB?uL&f))ot z)nGCCW4Zi7;|FmPc2V8M8*09T)H1fc%rsni;mdKaiebgRmJ`YnPN4@uF6?6{F_Ywq zkJoL>flj~)l6z(!c?KovMU)ZZ|3U+9Hi;1dtA|7Y48j?1^)~+#VG9H@_)fv_kZIVs zBH?CT#s(>q#A0em>5n@;9JpUfYUv#`ZzpUcwx>bc4IVhA#B5#p4^O*hoU^k?Y&C{0 z;q`$;KiDiOx3b1?k8`j-`#NngrFHZrKvg)@PT+Nju)Ee3Z0=c7&_{QE_F6+`1kc?u zp;~8GjYFLzCuHh9AEA!0Lxd+3la$hf6yRC-%5b#s~` zX{EQowVEE`#%`s&-2$4j_zG zH_~5#r6!9V6ul48+MCuz)(=(lK%QO+wpqzodQSZ$bPaxH=Uz!^+5YUtrE#x9=wmh7 zR)*aOzqp&L!@WFZflCIr8JZFr$pw^ur1PQ4YbPu%Y3nXI1pt2jB$WwX#(A->!IUcE zAPQ=r5OVL^4}WH!fJGh1r2%WCh+;a>S2sf7a?gTm2l_42x3FQr~_rRx7m9+&e{ zJ?g+-i%W7jzHLfXGUu92W!uMAE?U~l-Mx9@Xq6Mae8+VVJ^u27ZJFho4*GL+?u^?c zVKAfJD1xe?=Mi)55&xuOT!zgktjzV)W3)Og@JSgYkuKOw!G8N8o&4L&**~UER=;#o5q(bS9{y{qrhM?obzZ2zrXvyXg^35t{RzQeDr$fT zwQFa;h`?ltTLttljhD2Y80S||^`-u6uBa=6z5~pzTbJJ2xQ%(w-r{v;sMHY>68#W> zV8>QrE?3J$XEddGV=Nk&MLs9F`{k|2WCUeduArVdG8@wwt6ot_=?fi-$DgC2te@19 za&SRr@O?(kpFN+F*sYwN*)o+vPDqunnnp#rb}V~28TPS=Ns@W;06c+6l6K!6#W#Wn z6=9XzPvgT1EUUD%eAf)93(h z#iiGmt;AK-_40lEVQdN|Tbk!wJPkAAx=R8M64H6%vUqn^!$)2v)m5lxo;FfQ|% zFywF3GNO|freWnRjd#-caq&NIQP?X1^bJ;I%ooNQB%(n8T8fHodOxZDVF;nxjN!SZnVET zh0u>4(G`YQI_@Nz?}%naI%xrM0h{VPA~ZV1Cx<%kvNJi$HA&cWReg&Kh5h@>22e;Lb`3arTv(qxh>y0 zElh6>(1O=N(?Slh(@{%iHyC?IqWuB?L_w*#2rav$Ur=zBI~O$Th>oc0NeUE*p*XrU3E z2^Tg6o`!X3@ee7ex8}rojv06a8e|%aEk9ayu8Erda6B>pa+#$%=C_7-ft@=)E#`dq zhY-KnF}OE{>~FfdDJ2UoVX|aB8#I^}FZJsaI=g}-sELSNsJ;k!vS$2k1bP3aV$fQg zrK*yRu`pPAod0P!`1qx7KM)w-i1EQO?plZ8WTl&{QVhK0)SFYmwMLKTx7Xj#!WRe7 zOURkGEi zTVqlzneSe3{`UJo0VKY3Ok|jgo@3sHGAYKDXBN03kpUO%P#PIOi+#85&xcy%pRLE3 zJ#K%+;lgPplE!<$&xHw2i_VFDWL<_ZeAjp|X2tw2nc}_d_1UVuFPB*2n(yqxW13hp z%`nMs+{ktuB0580QpkW#LiK6bhLy{2hXu<`h=qOFmC0O3!R<>PR9D7Z?L|8Y{J;E4 zyf`*EE`sgYAbt~v)a5&qdP&3m|oI1la0@=SJg zo>(%rGqQ!r6&}nn<3*Z(ZR1VZQVVjMkIsHvoUw5~6*zkLrXzKOPFqsT_sMmCN(#C8 zm()V42fbqCKdRwj$AP>A*5qmXn1}h+GaKU-C~Jji9}o51>SvE0JeV3P{=6i1kLQ_j zKPh!gm`pRm`V`+ivVnyzRvM^2-H|>Z0#tg=rGj6k=#fQQlZ-PF9arnax>b*9#mGsu z1rm?*+PE!HI(qG_1gG|s#~AcvK)&yKeeLp+%1=3W`@hl9F60SeXLn)06IP7>QdTO6 zBm!eIBytFjQ}nQu`D@FBO0xiKysf1=2Gu(%BXJu_mbI`adzh6IDS6M??0^@u*JP1R zkbN1}ke^bE3DIsNo4JK`=%izIjNO8=N7r1nME1A_9UP)cc&v%fF8{ z#mIZKc(6}5o3t+p#HL+=7E?!{}x zX16QEm{t7f18B&29|UivEf}{=4@4ek%$}VQk~C3;Tf$!;0eT)+zJHbMSHJF@>DOMB zwfCFn)yM9>l=W&8vj09=MV^Ypmd$4(*qg&YVIo46qlbQY<#ZRdj2E{&E_$tmzP`q} zVQ&cSKZ-NkGWk`#12!7jhH{7|aO+?wtUMHdDbqYp)=eObwq$+5s(a;P-T4+VWhXzV z=+ayi;R*RHptRnT6j9I3jvZGp}qA}%)2GI)BCGVkv z4=QbWT+J^D)^>bo(4kI&;`Ha*=+EaCV7nJ}BR{zzZQg2KdDXcxk}+5^Q>Yil%XA2D0r8`0YUle5528ln-Jpd`4L&TZO}?gr#-q98<3IWwCXh#W0;LH@_2j6h?Rz`ZHkO1O6oZzT)F@2pY%GNJfVbU%@w z+T`jl)9c*aY#pX313IXWM{-K3Vx*$diIm4On%!0HXwp8 zB(Ki-+FWsiB*aMD%l#kutX$W1scuw}D!L748q|vfXFN7I*AL;mLfOErlEh7ArIk0ZF&J150(jDLMi@+`N+E0XTyd)~vofbXii)`sZj z)=EgF04wr!^%ac5CF;Z6&uv~N=O>iCcZ+WW!jkED#3kw)|Uy}=L`h(OyHluizW1j#k5;*)3c zBho17)N?&`pG7INdEU@u5-bV+$N9i^fCvlWsl`0`v}kXjKU|aLX|Gd5$9HqfD7xJD zY)Cg;@Lgpe0ikNv9F*_r4r78!ExMPKWI49mXqEW*xgYUFBT5C+SCO;zJte;*kT6E;8}ot@;B?-J;g9hX1->dVB&(FO(cIsMC~fN76tD5~21 z%|D%`*kJ4}konM)mkU24la}pI@xXQ?l^lbR{uj~!rR~m8FRyn|NEzkCDa!x(D`-lH zK*F$#UT1H(;e=#^>-=FlY;Jvq8AtM$&MEZJ+U-s3Cfor^bX;K%Nyljlox$1?wy!p? z<-rhG6G{&@z0MH9At>V)(j-Mz$iqr>8Gp9~&=wnMVq(@n3qBAILd0ztnw?bRj2q{> z>&YHlCvFiFoT;B3E?LjxK$|Zv_ZDoyK8{M77_x)HI2#y*W5PPVoa-j{YnTra?(Phv zP*b0|mE5UeraLe9tyY_SFl@$RsAI4LJkft=HUpOQ4thnD&a2e?txU}bI34~U8fvBg z{mGCGc)}buaGOM!pbNbe>b7@K4>ab(BrBF{)e~h0Mi8HkS;>t4O%0Jcg|e-C?OhJ( zQ(ezRl@ozKU4JR>QYQ27?wg*4E8`CmNQ@;d(4SM?{Do8;%}ydTFX$by&g~C_#_?k0 zN-@KPwoF2x9;u!hF7T%TAL*wg3~;nwCmRA=1lGR~?Z5ZmEU*e|s|s;SzCG)&&*S0r z)4K~MNDYc3NvCdigzgpj3j-y;Qd(GnYRhC7AGY(^ik|ZqVfivg^v(N2ARFLE4vFsh z;zY71`gG_lOa^~oJoZvvtPHfx1zXDrsfIlu2?;b=4nNZON*LoP!6)nRGJy#>l0xhj zi3*jA86mW$5duZG^#1JdKMXJ~!@g|Ji!RNnPup!ls1%wEr z^u`@gH-tkU@>3Q3I9z(S4Xy#<-xfA+b;+F3Y<0V%OVT=e@ z5l4^LF!trUMaL9Y{^0oB@Q;ld$)%aD`MzV>+cndBv;3Z}sgGp8MihT-&`35^8ZiW; z;^RaS!T!!ugFn)kg)7v0cwY8yKIi0r&A$k@vuY(}jX*qWK*Wk|6 zW>38pukm~gMwb8n|6T9!9rUZ4uuiyl3j9Ko zG$PaRV^VqSNm+5{KeR}Xvedz%r&i`7@MPs~meNA?NTd`?Qda40uI^fQ@ftSn=S5P< zUcZ$--MJrAk;}I{j5|<^S%B(es#*zbV@7F(ZuOpnixx4WiMN6|3pH@`NvNiqUeO^k zPlT}rHf!06G?9dUhJujj;faC zgJI_5YXtaG0`rEF_tbrC*uBb{1ocZu(tk0q`|v^RDWm(k%w$kE_gvJ<*tVj*?vh#j z`FNMSZ;9VG^)JPBe|V!y(+WrQO>sDrYqBnic1B9@N%)b~lq$ zR7X@T;eXBT$1VN}BCE;xtVdu=rvk^#`Ii4Gp8DA&4s{#R;#9D#wCOK&OVL~H_Jj+b z@8NRRRHgbT8b8_})nV2);^%&6NY8iwr(()UDyJip~GR7vJ?yzSR!;SsH}DcB%oR%UKuIgRpNvi~V6JN!>| z3okV(zj=TN8XnDC8Kg3^UH@N*?3a>%hd5pkJQ45U7o0mCEk; zW*W}QA45~L`dn6ixmuLwij^q*_L(Ci@Yv#SV(!Kj#%`zu(iGfX`XP)j%5IrY*_N2q zl7*b^FXSU4${N&aO>Ae31{-c(vM}*zF`@1@w`jVEXC2kx$it@G9rN6|QZxGTe!xUM zhY^=C>bjb8^PN3J>>QDKN!SZ5EuLxI^xBS8Q!n)BRUCuaU(&Rr7*A zWz3x;cT}Z=8!FhC{j(5Nma`k1yN`K7JCB3RtViu`u5sU|!%9QmNE*QkQqeoi7@>~! zLF?&ZT}uWEUB{8*a{V-+sT+xf6k$monuPKd5=X4^1TrV&0ywP|Z&!xYq&2$G>noGlb9%59vT6z@G zFIpeszkVu^;XJXi3UPb8Zji>rC!$oIFH&t~3)T|}h9XbJNgBal1D!Yjs*rLo{wLk# zpQK=k#h(RD6Dos0l(%-E&V+44j<(|_!Cz3-0{3xtm*SEa=j7R>DV60a$XBn_$1H_h zgM<))P7vdvhr9t2XK}FkN(EW$*T1C6St4+^OBQ)pMg+o|7{)Xt(6wu~MMi3%&(qrYivd9lrU{F3}!IFd5OlgAhtoZ{}> zGmG@!_Sl+M-HkP&>{MLRm#wp?7NGJ>eGyo=A)2g4 zYae7^f&Td>sKm|ZEYr9$ydc{n7RRis-}cIwKTLrvB*yJplEvGV`;W~Ffqxe+{g)*Z zR*D$W>vb5tP`@(q0oVFEq{Icsm-jDRA9%VX5a(NMY2n&cqiUYouXvnkS|ZNoXvx$0 zxyc4jtB;0tRn%Wa|IE4bf$vK)NOr8zcplMyqQT<0$i#+Cxlv~@dqsdmtmRKIvZbfr z5D0oHKdpGsDFn2>d zVxtsDwSJrgcE6xpYF14Q@X$vsy`Aot?~O|~?s-LvPue?}y>K!Mh=ETdQ~xq8((Nax zlk)~3oKK~zszsEPil!OGwJ=1mzmT&tneBR}cGN;W`AtR7t%!~5bK~b3xt{416txM0 zB-X=T;k>Z4_B<3rqSUE$K>?&82xorOFpzEJt}tKWPeM^bNocDrIBPpl2SzL$9YRrr z$Iu-`PK-AY3O0)^rg1@A^HDuNK@z+Rm^(mnLU|!46X@y9^n*2*Td(UHTZyi{*==m< zvkl?#I@XaE)3I+Hipg0AbF+s}so~Wo83nCeYZ!Iw%U>L@{AKe0bHUl8G(>EC3OYH6 z8TB|U{pYmu&%Ec7w|_q1#Yuk&uC3}i!}eR$rR2Dpu_v00($tX2g8-f=!gHUXf&b1o z_>b+h8ArT{k+`Qe;#HRq$$b{3*`LpNcTPJ@lJ(+Dc%3#{4u|t_DdPQYFIQ;bOt#!Q_uq z%v(OIeU)<4sT`laUg~YUS1HwQn_+zK4WEJx-v>Ze6{!WCHCTK7OU4p@roav`l>S0x zvSkEqYFenXQ_)7!niJ{Fo89cJti2-n_OX9=8@?GyBZLj}Fsa!!RbZ$DEw+rebM+SE z+5h->?&0z_eCurhiFygWRLHga+DfTNzwia8bzc#KHjfinh_FbG6<tJWF+>?mpFk{!iCj0@s|h%-3TR0)gHeM^IUA6E5-r&Kk#sd}gm+>MQlF3UFD_$0(Ph4#>;^`S{bi^0h=CA5c)Ii=Al3q(o1|J;Uo+%-C z7Xo<5hR|}JOS(xSN-B5jdKsImg1RqFg4SKN$=0}|d*9>WNZO0yBWN<3h>;oanc|Xs z=0Hw%X9DiFrS{u1yW}1Ua2C6mYPUj_iCAkRw`MPjVx^_RG0c3G; z&zmrt9IrAPl(B9a;(a7a;W*q!3BLd}sEp9j(cU>U?`QjF$r7F>v?%2jc)R(nl-^;c zKnKX1P||Dsk{2blB7?M=Bec!dm(H!!DNcd4?Mc6gK3y!Q||R^T(~33=;yzzrl;JNx1PB z?X0F*qmY0t!{|!xaISy5PE8=^aZ=p(nx^52@vPpL!{z0(E!-q58z{$QM{(+o$@a%h z)LV&6(Oypr*%AYyb0Vz@EUn#LdH3BbYLhFc?8x~O)_?G2PJR&4DY89@YHR7eR)8ZEdx1`AFAvMFY$Au+IEZ|JJp10yU2XqaX zHT|sV!W(wmN2KFqiO&^o(Iu~1H{%$D`~+EX-f?s6bllwWUW&3d6uxWFmG2h8DxzGO zPvviAVr(pc#}X4C7ES)hNN@&*8ZUucdW7{Xq72$7-_|8Eu4i4;>PG8ls3%g{6W;O5 z!Se5+BFM_~c{-x+^~4SR%GsK%BXJ|}O`=S8!${?Lg{NG#cwyYVnIBu9)g{)1Oh7(o zyhb}qfwAsc+ZUd*kekjT>b&j=`uuFY42mQ^5V9ww*YCY|KL)KA`|yjQ8EM$6n#us) z0`!jVpuKCoCbOo@3I$Q4--jE4@?5gQE49`uG1c*{U^u5daDd4=nFCN2doP^oQXO#+ zY&1S+h+m+wrpj~3NHw~KBPqs5y|fQU6e`V2t;so4iu zrvbP~Yzd552tOZV!1N;3=GD^(r7!!g5?3}TR?fT!>6-%Um#++#8YhFi9%OG`;CzO6 z6uBfa7Uy-OrU<=}k4W!?kVt&zV>5}JZZS;Qv{ z*Nv$SiuFp?4(G^^^TJiYM^9?`q8tG1{MGq#+=#CB{EkWh`%>&_?*@x*?L3N+k>C*V zg<*YXftGg@?F}`|wuq0hNQ7h(e3;-uNoX`hqqsW<9~!j6-qyewFH1_(IO7x+9^p2r zK-ggSge_~ZwPP-?yV=m*;}2T>rmNk*T9#B=k+mb1R7Rm4&-G>M$@M_JJ(7baUN`^N z8VGM4^14e|_``|y?XEVfO#L=zVf$+O=x1{WB=B$WzHgFsoV*hF2yv0l5JV&a8iMRB z%tplt9DlD$c`-5ZtngVi!lp2zJt=F3;Vo6?oWpSG0VsH^8%saWPALn`fn=Nv5oRRW zJ1sOWg4{BR&@OVS59c(*z0!+|CldbFo$lMcmx`k306CBURq_hpgyVagb&Zw~rO1zp zT8Sj-U*ZIx|0?sX$9Ew6#A>VwA5^jv-+V(6_Fe*-1&&?4#xJ08;LNUO3E>#c(8XhY zV778lv0o9?YcY80C>Z@ZEnxs{bF6-x4z|yz1^bB|%2k$L>;Y1aY}HBVZ(7TLVR-qt zWJW!y1jk}*8q0j@P8Oj!jnbk)7~}!+#$=%Bq%do)g%E#mL&qq`@s-5^)19))uV%q} z8H8(u11hU6*#VCP+1h6-2)FkjL>FbvxWV_uYaB zE*kiIEciM>@$})(y`A&q%$U*&rsucAUEq$d#8%da`dJws+{9Y`P*6@o{8`z3@TM0T z(hH8aNg3M}R&49ke{DndTm3lWP+)|P%=pdVq7}K;Fm;(DbwwO4n`^!z8%jWNIz^{T zyRi%z;pb_Vv5y(6tr@3_eui%*>WR~?1)rXa2pTD}5F>1OT*EB%Hs)Z7Wf7#HIg$hd+#}Y*bo99DSkM~Rxq9?X=EY=UR+{%p? zA4TSQ8X3wSAO!33ILsy&WMr`W=9Q$OmYYn+w5LzTj_4k!pHZ=J>8&HBvj+;1p zzdlY^^%z@vb&hR>^<4K$?P0XRN#rMi!5kE=V(l=RWa$#G8=X|IFFJoKbC$}g$g+t0 z7VdSL&sa5o!_#@Nx?29G2p$D=fxjyXH?d#0{RHjUK^wS`)Be~&PQ}03D3=u-=wkWkGax1EO?P6Qb8{?Iv(X)_k zS4}ceJvJToik`<&+FEgUil|)slaKVniLur^l$!PLH@sdZu+j<9P2hC)%WJ#Ql#W%_Au_2;n)dP(u`BY>je5hiY&J!4Gd$j+Fg(^mVP!dR-3jL1!65Q zG|xho|0830BUd~bglTLe`eFEYd?Jw+x0`g1go^$nb)0x8O$CHabe&5)aSzTBeUGCf zd*9*r?L!4to@lP-^OWF4#}2Du@f&{?cz=|BhxBN%^ur05L}3{(R9{MWdf&JqacYM@ zqtoKkBUzfkfy-y*yYi%Ahan!mR#uq1?09<%?=Ha?(x>sK02f+F33YMUQ2Lar>`Y+h z%yUI}^0_3)Y*UCJGSI2Ea*q#Oq1~<@EwYPZTbqevIP6n`oB$przv)T;=b_(M!(~=a zPkVxqUi>Ju|2z5ZA3{%9z&2gU{=16a#8?%;nvhBXs&s(KLbJOV3NT)JGz!#RVJI*& zz;MtSQ^pxYGg7*ukK=!WumB^w3tMB&dc9&$fHzK2jGZ@47r9iW#|$%PKeLJ>4d7^X#d=C9dC!lZ&B`sYnI?VHqY>7{x*J3uGUsa z5T82_M`o4AGEC6UrvXz7h}nLd+QhcY zQD9eEhvS_BQbm`en5ErqD*D;6G6ZHhDJ|{y|_06ly|P4HQP`Jx${rOe{p- zU^S~u+3$%{5Nk?YMOpy4UF6m2!iw~%NG|$N>}&=a4ssm(*S@6;*^KIWw>JyFoH~ZN^#OjS4?FM>$XAcFM89|rr8`P)Nw0({{#eceBaR81O z`Ux_ILkH;rs&5Ty_#fW%M^bghLvD`kS-%se$a4!3{CcG0Da!y4vZqoc{JtXMISDLU zyi7oSn4w(^UFdY2~!XTCyUdf*`(c!>a=f5&SX%(ZL~H4f}hnjVR< zMROY@O1Tx~lKJQES#>aC9>H4px`y?^|32=tQ>ST1-GF@48pFFq^L$X{_cxE|F*pk= zddE>op1ny9>q?KC@uhCvkif^dp?~Q%o$MOhLy4Y9Ifi%DE?e0R=VU&uZzM0{G}N# z1%OmST%JB@dm{*8@~WAUIz5&@v7>-Ied?ekO+WF=xZBS6*{?Ol3TXT%o>kDpOlc(~h9VIy!^oLbe7zk#Ltc}FU@o=Sgu z%e(G=l>qcj4IQ0n0 zmlkc`S4*4Xu9$YotgYt;;jf+GFrH-iD5|11lS!D8ZC`s~W_O`Ez+WA0aTWvb<6K;_Vn{gK)YZ%`MzO zlmx@a=NhWqH|g{8SwEs4bu^Kn-jy+2#Z&(THCWY@es3E)9W&IJSeL!pM9+{&Z=Y;`09sBWZd4l`?kgyMhGoGT)I)-G{I0+?^i90AIG=!`2t#4a<-_{S$Ypu+KJqR z&n;V$p55*4?!38TKCS5@)j@InnqVmvDrMOUM(#GMJkH5RB_C&$uG4+fL|r+Z+Aqd$ zOJ90-5~!YADF9-yr-02vbuj{fKKi~Y@~%B{%r5jOoKZtZ=(Vx8G-PC37=FEV$e*PV zF*#h)cloR4IW^e)musE|DezKs0H@ea1@N&_u$NXxU21_!dvb$Out_oFs}+M3B(zNe zGk*mhM}b#>y2cFb(w-m^?E_SjCnYgPjYq$tw#ZU^=p+R!QPW?mjd{lUC&*=ChpgAau{y_z2I_(omM{2fR)f)^>(wyLVOoWh@nX5B zElOY|xU8p~)HeUHvsq{C3GFVhmLHaU2Uuc-!0z2)1Z^__j@1{HP!u&3HRn;<3Jw7y zXNo6&X6;s+VuI-TQEA zUpJY`y)#YU1UNSww;@OWwJLakR0S-WcJMi&m&8xdn{$8*t6l216e61=vn&;@A)qcU zcW?8C_t{EqD)jmevNLQ-w(ShQC~hgTZHc-bWwF(7xDbVZ{tq5P$w!=7fg-Iv-g zHG#P%+sC!NGJm3DC_wvAGS~I{1?;9qVNmn3*^9KwM9bmE(j&947BFJb$8eM+5L+(c zHKZaR5_aV^7A2kf`F09B%wLIwdmZFSI};r5cv6??A26vWys9;FZ~zOI=D?Opc$6-% z41kjgn0?Bl$S@cgpv{7tX3UsZXm7h5uIm3#j-k2pnm*YKry+TCyK0k}+BiAAQUThm zb1{47pc&p~L~ZJ;w!&W&Gc(S2e5i3O`Vj@3#tgY_(BFs%ysji2USt7_DBY#XC&y;T$FzNX=lJs&`UXGAVzfs3>Tbt#BRNF3a(6W*5$+n zvIb^nhHyLyo@b_}a@KW*v+(I2hS~c4#OlAq~Iv zXkbUXRl`AJiwPhk{k9Gq55@mlePtNP!ZiEI(yDTDtzCub+fKviUBu=02JVQkZh4?M zRS{&tX{z<6i1nf$rVcmD;&Io-b|<^+NjWJ3)SB|(jR&Sa6PtsuCE+{RR4l#siT8S~ z>Rn-K9&@lg>->IuYO}Ue-={YQQ|AUpQZDuQb{6n!ik{Mrvv%zQW+KiFzG-(Xn{N?E zzcU5MpDv9sz)@zuuy___w*@y{Lq$+XBT?Ug_x5cLEF_QX@7?>uIsfV2JVD5s6p+hym9<+!L1pMBN zm+YH$5kX5SZ$+e9w_BwfG}P(>GTHd0G~c;mfFzCi+T#5va76#r1*>!Ir?3xU^`Kp8!x(X@F-@!-^gBeQ z4|vG=fM~}SGl{XZ^$)n z$WwG5x1@vRG8%ecpc*~xm+wD&F>!p;sZmkkg*6KTzK~StWrj8o3JkUX6p9GcADB7 zvZc-dVWz`_uL>&WkJiq$pw!5;n{?H2Da`=R!Puw9eO6`>%V16@+spSVwb4&*y%xtBkQ#$w&n)wHW8j=;@OGNGoSp zEiVfrr7<^-IdW>oH7M{hsT?`ctQMu2*k>!IdE{)ZdZU^TE+5VEME2;33!O|r*khJF zK?eNE^vRD_3l$=P#Yil)suPd_Y?G0Vwm9dDeH1273>cN8%;2i7y?nt#SAdU8v-U+0e;;^leiE>RtjSy0;gm!O~9md?w$n-=Oq;2qZQOoIvIHsx4eebtxk zQ|XPRhmp)#8Qc?oumroSZ7u{0Iac7*Yn(aN=RQ*jq)IrW=IBoF=TpMQj?rfax#9Ei z8-Ov)IyzHsFIGC^b!`2MoQ9mv*^LspHeO||uWL1jR})M*EU=)9;R``tRLcf|u8G6| z$`mRVYGjSWPATWju|6l2xNH^`bRi$LU-MvG_Ql|3?A3z2r_R=Cq0d>b_02}N3DWO` zkzASAKLwOUr&rt+GD*`Z6Q||WLt!s-Bq8eCLM5U@)I;c$Je7E zE58DazjwL%FMHIOXOs)8tPtQfU&vXe(oY;8fVV<+s36<%_A@UinzrK|$e6$NgB(Pk zjGmO@qkbrnm|xtO40+Qux-!aHIVZGD<=IZy5J~+lAuEE9w$ZM+`-4}ugB0uFuIN3$ ztQC<`l9s3KmZ>;ug4EOb;38BSyq=`?tz5>1&z8PEs?!9&S^C-i5?t!M(?P)XtPLXs zK!TNM-V%$Z2cxcEFw@!kU5Rv2PX=jbX3d+fjUAT~>drPtxh>CM46w?w zle7tIVwsWMldk-cLFPC14Ce-Pf+H?TEJT!in=&WXVlhR!!$aZptLRs=JPWdFi&ghS z3WkU^j<><_RuzUBL~HiV^tj{Z={PS3h95+|kP&AqnDG^97N7uZBvt-}J2*+h^JN0D zR=CJOet}-79F^%DLx3EOB1m0X`%5%P{d%-GC?=#85gBoSR>rS&>l(k#=lx!A`JOSJZO16G|!5LP;+E=LA7c0pqQ8ETlg@|PIn5U`R96; zz&BYO>)0;b;_KgSN!<<&f+09aocN`1+74w)Im=RRi1}oqT)C|Q_szGpGO^iCMUX~s*<{TX{!2!FJs z5|@0)hx^<0!Q@mrlWpv*twMo0b&5gx=5y&Yacr^P`Z_y$GwcM0+lx~Q|FU_&4*GEVrU>`W0j_k_eyJXlhQ)f>ipO6p! zn1<8tS4-}3HV>|pq9j)U%CPM~EOV%HeSNW*TGgAt`ImKsNgrESh6PMpo7DF8!jR&$ zQo{y9D5WKW(hvI$6op!D9&S~IO7{$O?n}ws-+wc52DzDjbaS@a&#O3URf;=Xyt@Rt zB=+7pR4l}0lCm=HRFwJs_O^oRA!pD<7{AVE6PfD{J5oz~IgtcZbX{14FCOR@V4bJ~ zDI&xkf!o5D3PxFFJ{gXAHNjDAY%Q5pbGUE%=^AdL%qMNp*c2QmN4o4CCp>%72pXUK8hbL#|?E12-G8y;_>8R8}aN1SEjcq87r zg?FWJe=~i|0-l%rK>zGYP7P(SIOo_wI?p)f#rV~d=3&+Js^yu^JMOuT%IG8}Q;u4O z72L3~NrOA+$I#_oTjE)iu~aQmq$G!zc{*-PmU_S2l$pC*J=3XEO2SXW8BFSyD~aR}ULE6| zQ@=jp5xS`XQ27+H$o3RT+lHsMR)sGH-Iwt8jLe6P-ny%>qw~um$T*p}4pZF(R?>zhmpLlz)3pYX z54Xur1__|=^z`9d8ge4pBktJN-`w=CbFP<}CYbu*OzNBzgO?)x8#pF$r4Xq>SxNq^ z^6#9c43FgfUS?P4_1J~hi@1axlT_V_%$=#K?=ZH$r`vLBuKhsSI4E+i1Q+kH^v5sb z9+20LH&U)^o~;TIkQ!yZ%vq(6vLSfu8F`y2a$V_JbXZB<=Yl2~I--YEXJszwd(+XVcwqc;0qVpcaQ3iajVuQ^2bx1wjXS5Ti2FPy1XTZLh17q;6S4$*c@XX8Muq9rHMk;UcRh((j>O#*6&TT#L(&B2 zy7|kSX;b#9RYt56^`2>EzW;td;t_VguzumzJS{4}(DK52j1O$JG#v=@vRx_1hwlHLa9)$drc36bSm^kJ^7IQrw=U)Vx9)8Vq4S=eb@TZ z&P3}S@e>q}(>N)E;0#2IEyW?$kAK?lqpH*~79OV3o^7Qx=r38EWO?A*z zh#T=i`<1LvY&RPMqD_`ri!uw+9qT6=9A8&%RekI0;}&2@J;qvdiME9BBgp`|FcMOq zyZzXrXa-`bIiVp22kZ?$u|<){z$g1OvE+(uDQ>%LJm^pWbTJ0Vnve!;TgT;mo)qI< z4@??InT3_@X<=l=oCFPO{O*ofA_k|fehPkOZ#G@O$-;61PDCKmK4AmWxX}iww0T2LpkZ91}0Rw2MRXE zeVL=gX>>DD_3fCa^+R5qK+)L?&XsT??j@V615YY`siViH^09qb7Q|Mh|D*Hyl*{$| z6rL-kgqEq`%8@;1z%{YmBF|u^%W+B0n{zKQys@a0Uewm!($_`-1&SMJ&ZP60s6m{y z&NCr)DS_)Krd1!ZKE3HwzjHIED)LRMb@1mrxBxk|OWw&~U=tydFFt20u`9qyK~r&5 zTc>m2QZdln`c-&=k(BCPzh*ej4UoGMz{#L=t66>ts9Rp9($@~BHzAG_b28%M;)>bF zkb2_2q^41XS`^qfkIpbsdN`#XMSEgxiHgw^{ifN|(^Zx1wt$bpORkrF6j64f>I~P! zSLi5*)BojWy1%@>|M>drvHubHzQi(Mx}!YoC6?pXtBHv9w;pNUYzv z4Sxr^U#l#1lz4oxC~Un5CEiZu9u<~evL&>jWFIdMJ0N1tK9uGZorL`#b!-kO+SsGtWojYfS{OI6(Otjv5xRQt`{ zC(m)JkfX07UnA5gHQzfY!S=jWz4>2PeV)$lOk=RC|1#q|Qt}h@S#*{Af%p`|=j+JG z-JKjDCbhE719TjTh%s1I>ScSKuugc^8I4NlySM~#Bf^xBg6-Za#Y0!pG+7k0eLBjv zjj!(IJSos1I%C^5FLIZYfQp^ZdW%63W}=(&qf_wa!g|`5YtL!fK~C&QiCv6972@O| z;ABn+ez+_r$L_Lb-PGaCEj2={T#+!z5^b2us4-zt@qv-B4C5MV2lOvop z{rXp{Hn`8?e4l}FP>BZ}I@%2li1qxX1lK*%#EKc=u-fYaR_@s^a>W(~ap^Qp>|i%B zl(04t($fLC6hZj@R*6DMP)-WJVhsc6C25YfS8+R;ZSua$+ZBP5ZQs8vRRM|y6#u)% zf4dF#O9BnHOP+g_x(V-^hDb8&K0J0akp@%wHosSoRRrs4K3k#%p(46E&DsHj6yDUT zy!$*`?-vwC5<90g`-yPX-Pf(VzV?2ydqQ^o?j6kE8r1)fmufD2!9c4}nz&5%&hn3n z2aHe0uH9TgU%Y;lj%P6A5qTv96d-^~({dhWW(>MDiMguz2_jK9|9|#w0p6a33ar}G zQP^dR4t{X$NsO&sas8U;m9&j}j*2)4OB~zpmxz#hlCPqudgOxu99g$7O@sE2n%ekY z_;hLxO^mb(hoxwWa2xp$}t?CAN{yo zjj4iQm4?XR=Qc6a z3Fqm2=1-6!>}(JCYlV^^oj*^G^#7YT8QW_#&s2Jyxrsm0a*)SZ1`3l3GQ@=Wjpmn% z{TC@Su|97f_!tTK$?B8FTzhVKr(>q^W%z!(Ng}BEFzqt@TxCt{jOwtYBm}f3oQqlU zQFB+i>O>cI!Yq`6A#_6x3Kkh#I$?0r@)@>6k;2c>Qg7+wsC_}3B37NSB{NhTCNRYq zD6jxw?{eV^GFeUn7otW@Wk34$Y#NHYY>xu$)nz*5)T*W~S${zH`PZaB{{+q2{%GO_ zYX4~~;0sFUNc5ffpP-OT3@J2BY|~;w3?XEIVX1{p?24f;pdKRNlY1mTL1LL_Pj^cn z{{+=8#L~R}39^T=AZ(`(0PiYZ@coudOP%b_d{cMo1l=C|u&@Fx665ZzFf;1OvDgzq z8$%`TuY379Rn@s2>(lCbX@n;p#m@?J>Y*}!yXT2Mx4FapMYFI;U9}T8RcnqdeOEC1 z$5T2J!hHgdpb*DO)d#Z$-udRB!RNEdx1qn^L+R#|Og)7M$|jOnS|=0(_UGUqHIJ}A z|DT4nFvC|+>F;i0do%sc>pzc7UEL$>81reh=q#)rhS%!;py%BpH%sciQ^XpL^O8rs zkcuHF$OOIRF}^7K&7tE@r~IEze3E~nPc`EFC!KqKb2JaAxpFXAWli|KdkCKG#VV{@ z`9{bux`NbI{!h?qHc%&la6vbfRJ_(VTWot*VSN~KkGKS7>4q=w4Wi#95DVaTLg#V!cN4kG~;O~)iZ^4_v* z8vs~Howhwkq@BLaf2_o^bIAv1|MEtuFHFnin!rg(D26Pkb>V`L>?i0(91N}Qn06P# z;)d6rO4K-dY;Y_5scO7gJitM9J2mtZ-Ze`~bw=$jiq zwSu6xMtOzK_c?Y~tAc$)pMkVPjmpTgw?9F{3I^tyz%5qfqGOBcucl$guQlN$`*vxU zVKAVg%;2>^4ekCxyJ(R7zR=R(@J=1Tflxq)YZt)d(f%c{ofs&+fw_;HBjHa_p+S1? zYhWd5z@96n6Bq!=dC~U^W}v&s?^$`g7!ZF>7ryoVoh;vidF(Sh*@TC5o(Rp^(m2Dj zs4`95N?JGiT8mAN%?og^+H~FgF}`)S8_d92V!*Hak^6##@s*>i;-Hkb3vGa-yuzc2 z4=Df^y;sbJmz!T%RFiMLtQ}je%k%mxs0N(=|(DJ$xg!W z?>sw7oWx57m`duDs$PTE6cJAYE7)$_GGcx1(B;W9s18sL7DV+}qk)_K)CoK~`oQXz zl-9R)&@?zC9~avx2iO>Sn^=Etd;8~qvkv~Fxv&R;``Lfq>E`!m_1`+(kS?6`{L$$q z{1VtGdR~QM8UU~Fq11dY9#mC2in%RFajfC-oeDcM3!hQC$Y(Mj&b}<9|M}#1v@VLo z8u?7Mddz4nNvDkppY<8=}) z0WE#m&8xYz7%`*f4GQ*m1rcB>m0aSI#ptV?1K}F3)?} zENA_%Up_S@PY%Hl-2gLYXp|NMqQwYGqq*?`1_e(SP_4xM)u9N7lYOA9p$Q(lHxuO} ze~b`>-C3Jm&@7tdErpt&p2#o4%#_Yqb)+vVpqn|Rm8{*Oq&|ZhK)Ql{epTUEcwcp! z$HY$q{P?w9i}4Y4vWd$M1ZH5>hGIcc)8~HFh>3Ao$k^NTaqSR{pyKXgsnvFrlw_SQ zwpq~k2+$aVt=@MA$Z$#Lloje#oaeau&`BnYRMQvK%9qG1ovRx{NwgPL7q^{3mVi*l zba40=oK$4{@6RvK?+tO7yG%KewgxI=KYXDJRmG)&&^v3xK3o<$w82i77VV#e`)vVJ zOjE8hRgZ{_GK?U!=gp+pP6PDf+GHt2ffmh!3Avm!J2gKq=fV`cLI+0Bq{w@}s+dy` zIjo3j#H^f!pb9F>>(mS@^JEu_SIFTD?niIGQ%V$D5_Wziv|&(JCkNpOTx+a3l?J5O zNf4lo2@f#lJMklE&MeD$JXCn0{!FklyXcxv4`*U;h0_QAA9tuCm96rw0FKV;+ez3? zzu2)*FUwaJ!8jUQ3;j}bf=}T2JQMGsm)gUWr5`Dmm!(P#7lFT%mactgEj`D#Ogou| z9;-P|Ofmvv_#pf>rk)cM65&hqx5)C^KYsrYwrHT>llC7O&HZMvjR3;N5;=5$bYDJBe9Y){V0t9V2N;}KA{VZ(_kfBRhZwT- z%~hHY;f?{=rb_P0swYtQ%LMsii1;eVK`W{&M~w0`k@X!d_zglm6Ot5TWd%dsY@_Ya zLbrk0c-2WLY)uXp3Jn2=icwl>k{*3%x3L=VaPKStuI>}6)tO4-tavqzTbcL+>_+eSsC}ik-pI?7{a&Xtehit^gS>H^x za)hVXbU|bfy>p$5!#>XCfttw~Z}h@FFPbK*8sse`B#;L$z%@u+C``;WN||WQbgnYs zcKatcxZ{ZLlVd<@thGaW5m>sSM2O0ROR{MwTekK9Jtg$Rehlfp+@In89+g(&ainh> z(D2N9iI%`Z=YCQzV@{IQ{VXLx9I2Pe>1Cj6cF(ZXI4}%uui9F9@buI zOC_C>MF&svu)T%y*l6>x(uM3?q-8BhsE zM*|_88JFgf6bq~S3pLamRF+3&NAM! z+I2SxBI3GyMhEq>wEeVKjeq<+4_2Qvrr76wio);boG&ln_g=oS3ApXPo8S)uym$4k z?)`E>1DbbcH0hyq3#AL(+GM?1b&&pUX_vOD);c19_lhc}KS?RVeHi^^e`fdax~MqL z5YdN{SNZRJy`?4H4E&&$#duw!JXIs?Ht479B^jfPA6!HkLUz;%D4(WPX|ug)zA4p0 zB#3MNCTsDXo7sv@S-u5^3OM_3wPm;&Lq2+^9*Su0@jvNZ6NWW?cu`Om8(v-4-T!0% zWe*%{=d)%!%5}N3(c3$H)=HG5dKfLTOkX2gAF9qz<{75IX0#4|pmD!D{ERUk7j)9^ za5332_|c=w--~$}3`QACmW67K7cE6l?K!vg;(vHwTKz-Z?_;MX8?k@Ok0IO!6^MN% zTCHgu!?J*SX#p20*XpD(t)0;3}&_ymx^Zk3~k`f+U$>^b~~9cD>M=zFz>_1xo<8Uz7&ThNR|CrKp=c z-YKlEKq`JMs)YAWHIAwDnr~5;u)l9*m|vxR?8cDlZhTDgdi*354Bm3piOcu2&DolW zs+=T?k1kSfqYSI4FT+y1la;KD8(R7vExCB5GpS#RsI1#-N?Rt-LGtM0g_>`e@0YF3 zzF>?NsKIZN=ni^U;x0@xxHuS8C4#Mhq~A{D(ZNrQsCUkjFvX9m)ykSuD+`OAmtpk9 zu+K)lcSVaJsakzFMi-lg8dNf^G+xhA$=Enuy`Wf$ev=*cs=J*GehV(x-0!4@wR8$J z%sxqx>ueG%AG3}I-&U}2;<3uArAo9~EOx?wv*uM3cDIY-NKwdS*uM>Ww-OrU5+9ij zfrXr~tC#Xd?vjnJjah$wX&79bc+%8gZ~2nEOhD5vlR44{Fj~fL6}^FU1)M(?6ZVg- zB{X0oUJ6ieXN%L&2QCw5I9sZ!>KQfNN5gZkVKUnOS}PA2ZwIlzBQ>3^CX;V?eM?%7J+}>1@p@KX|GbnJ0&>Yq9Y7`C9pl z@}4S+&+a3#zHS?d70!s%R-mB`grsVmmt9EY@z>}s)f#i1?OPAuWkz!Ig-1dtxdpfM z8v$iyY3ne5SaH>!bo<46>5b%mXVc7i@A%#7n98?LA99OV+^fnu*U@;sPW`BLZy$gH zZm*UA-5Lv^lcqrGt1_vp7dwd#QNS5iNciaj=Rqb5OGr9LzEiBC>!mIP_$or}O#VAW9BES(6 zc_XLEX$EhPrdNTo_}FNg4^L??u@or;iQSM6yx3(tWJ^+Q5R_a@I z^4xQ)+$qWHD)P^9B-NBjx*2S!7ZZh_BMw@d*hcq@oConYFZyH0cAV|4^Ry&|9p#B1 zMU9UI+NFcKl0lEKJDX@xK#5y8s71&L^KgvEJ=fca{l&`e1lXN_YF|~LZC9I4o2%`M zpG4eDxv@Cg|rOPP1o zH3BXc(2-NW)$GWofjoKiO^~*?}LYa*VwbRw>$!7YZ07aJR5vaAD8x zv0=a-D2toBJ_B-6tzm~T+~qo=8LhJpP^p~Y2%sb8gdq^fIy)V>JSaM9JyC^?Z=K6c_({6NEv5hj; zZ%wWNr2OB$|J@4NvHFxKnWQl`M=s>PG#FC{pbm^c)31GR+BM zr~+qV&|D;dsgfC>?lA-S5X2DNei?q}0HQCmLs?Htbe~qSYIMfQpRepkes5lR+i;$9k%saX63^|f6!u3e>JQW_#zpTQP&Vfe1;clf(#$$5(<+Jw9y zw8Loqob5@E<;|L536c1j%E_6Am4RAwiUhvcHzx9YN&+M!vtDof6`G=PMjBK+Gqn|~ z`RAFmGe}*IR_SqRJbuh*`3@4xhsdtpu&yyd>91Q(k}bg9j=UsDe|>OHuXE6kf&EKY zo3qYm6V_*~`bM7Na)8SgdlAj;agO=JqgOF<+z^|nvtDXVh~3NZg=k8$Hx$i=u`F0y zp0pSr4j6(-3BwZp=h0ByYR>SbDg(OAFYf@>rzQX(Rv^f3obsv9B+b}Hg(sZu^)~js zeudwWS8f?1qk#BziSOh@6iRvYQF4Fxi}_>9*e+sdv_5oEJ`Jr-_3s~#0 zNzC;g0Mu0ZU;91Ehdh!X$8T@kJr@SYfIjTSLXdmDhgP|pB2*wZw$ zgRii0TUt#{c%IKNJg7CrtPM70MQ~haU0n_Ljb%|(olXJr7_;{bSu58x6Q ziY{qHKOk_Shao=w1X){J<+?+yFF9jk*UAPnpPdhDX7#G%GTnI|T_o3U=VNWe7 zfaiu5A1p<)@-kE5w}f>0;?YPrq!T6{{RE-(L|L!meVE*Y+mQRcD`p>@L!)pC@#DAb zPA#>cJIIfGX(p)UL);m;33yKRt^iUt8bXxSiWt6|l2&~!4IPrYmo&}H)@BgKanDoi zcEPO;W>McsE@b_(Yy04Jv^at$cCi$|Ia^<+Z%;xrO7nK3nmUs{)2R8;5Xa4*gTCXz}vx_=-a9USNfz$pNmJD=l>sC&Z1m z69zh_1$$X1b?}iAb%8(fraXm+s!x%r5S@84+lL2KtaF_|-=Ihb13{b>`2P#F2TJ(b zlT-K;dEtKz_*cX6c$3DSC6vcwZFJ>fKp9jP0D{D`00!k9Njz3OpBaB>jTJr`TWa45 zEG{)2X7*ToLUiKN!(j-UY7ogZiy!X3a?Z>N7{E317wvOrW#TW|bHjR$lkuwGSkrZz zu`C*umY}mk;e|3P?N?iZ6c4|_kNVel@w4L9?|{5%@E1VPJ~!NWw!+4AkHi|*o3Aj6 z>3-J{EqAha7}!{T@sG+6Y5@HtqP_w6@B2$@Ul+bRC&PaO{8rJv9r!BN*h_ih==BJe zJBQjBi02NuBXCft>yjHMjyq2d_`=WOKf!Mp=@&n>CWYdiZgyF8-w@p2$9Z>Tm{97l z31@i^3_t{uPw@4i53;MzJ}Z2B@Q1;x%>v8BmzNRW>(?u3r`p?Fw2d>CRq6)S0J{C+ zI`NwP*3*A!?-6`8_>rJ$9v=AJ;%|tyb6-Z9rLTxI=`C!0g1|9REb?vRJcUek^%cGQ zbT*md-;Ev<*7QG&R=Vb!s$RyC+v)m>+(Y5a7?jKzCn0ij`2s(=*S!FJ)B8kxO!$-V z^5eoO@c#h7-|(2nsNeY-llgK<_Gq}l`3TvZpPjO!ZzG!aMJ1FL8%{YMmHE5-Lwr!Y z_;KMsgdQL8$H#g6X?ts_OZ~I0X*%->E+R4`FWP*&hdV$l2KFNW*JJxie$<+ujy^7U zcj2eQzlnM;gnT)3ZYI?{X9fH%5-|*R3B!Q9LXH)K7GN?c1Mey;^OwTE8@xyRHhgdJ zmV6YoX9&J&kSbWlV06`c9$mW1QOQ^5UKiP-&kJi2){7Lwa;IA0` zQ`7uoq*z)>K8>&I8mxb3y0}~wSm%;Mkl}~O9N?+PLta_%pW~m3J}CIXwLcer(OS2G zHRQd_T157;E{|~-AnfyFltmhx70btfIm>2%KUeF>zBYc)QG6-!7lZsSrRa^~pBH$d z@LSpGX>=`uL=W#Lk@h|nNBbu@K9#n=v`50ApdX3e4ksM{0L1>&{{W6x%3c}xui%do z{{X>2d`;q=W5zlh8V-k{rJj?hT1}k|$4OIbV5-Kp@-y%W$j45V(|*qX037^T@s)L>;*W)z*TYY+ zd45OsxtRT{cI@r*AdBwcXBq3-zIgqmCb;p(#?KG@K=@Dee8)u>Tqg&Jb9q{K}@$QeH$kFQh<%=|S_S;Dez^qORf)C8)0l~){ z*Q9Fy0JS}x*X;5>E%-M;lf_z8AW3_tNp>x6Eu&W3F+U@M(e*39Bamz757-yS-T?5g z?Bn9Q9}@VdLDDsSPWtH2X{%~b!8GV$Ra3RtGXu!{>Zkk@yW%H<^nZZfH1OArJXxV= zkzMLC#}%HjsY7h<6qe|&RU}|alb%O>`cMbnUIp>4m+>3H`bUX$S^m?d>UQgM1NXrn zbovl-2=xZHYvKO@_$S}SuL*cJ;TE;wpA&e~LDAPq*DhhOT~k$p2AbW1uyhW?auzLu zIO|_e{{X{8d@26`qMP9F{2$tX@yY=78mn`vTUp*(TFoz)J<(-_NH}t%Bxe{09P`%( zxR3Z~kA*+eJ#^ge1Px=S$cTHS1E&Q2fXMllYXf z{xywhN}V@2E4BSUowhnK@P%5jgx!lD&Zj#4tvZ^YT-;g!}NI%{=rfEMO zJRzuRM)qHcz7Mx6eW;fm~Ae0hI&1UNa*IqEBdILY%Q;NA6FJ+A$AwVy-N zmS0bm$y7_1M|QVKU$&RJ>(fK%N-O5&{iS>%Vj#Ky0ELg?`-Re0OF1Aq?Yn)on8+4i zzn8|?j_>xH-n#p*+AHDChv1#Cd`$4Bp{mDhv7v2#+DCba19AP~INWkiU@KZ!#ZgJ} zHD!P6@n0hv*?Xen6*SzPzps^_&&i&lXW~6OP_@0ex4Kzivv-bnRd11yWxI37ah&$4 zEOpBrN^uRe{$z&UJD|H5e(m$MxgGF$>s|$8@w>np1eaE_c<;e0Yk8!#zHEF;1;%EH z2v&TA!C=I9$x&L~4fyr&&evFp=J<)>I8bP|Q5KV1wNbry?p|N0$jI%Q!j>wu Date: Sun, 26 Nov 2023 14:52:39 +0530 Subject: [PATCH 03/70] manifest.json update --- frontend/mgramseva/lib/main.dart | 8 +-- frontend/mgramseva/pubspec.lock | 108 ++++++++++++++++++------------ frontend/mgramseva/pubspec.yaml | 22 +++--- frontend/mgramseva/web/index.html | 4 +- 4 files changed, 83 insertions(+), 59 deletions(-) diff --git a/frontend/mgramseva/lib/main.dart b/frontend/mgramseva/lib/main.dart index 169653719..713e9804d 100644 --- a/frontend/mgramseva/lib/main.dart +++ b/frontend/mgramseva/lib/main.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'dart:isolate'; import 'dart:ui'; -import 'package:dart_ping_ios/dart_ping_ios.dart'; +// import 'package:dart_ping_ios/dart_ping_ios.dart'; import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/foundation.dart'; @@ -60,9 +60,9 @@ void main() { //configureApp(); setEnvironment(Environment.dev); // Register DartPingIOS - if (Platform.isIOS) { - DartPingIOS.register(); - } + // if (Platform.isIOS) { + // DartPingIOS.register(); + // } runZonedGuarded(() async { FlutterError.onError = (FlutterErrorDetails details) { diff --git a/frontend/mgramseva/pubspec.lock b/frontend/mgramseva/pubspec.lock index 958c1b311..a72f461ba 100644 --- a/frontend/mgramseva/pubspec.lock +++ b/frontend/mgramseva/pubspec.lock @@ -133,10 +133,10 @@ packages: dependency: transitive description: name: built_value - sha256: "723b4021e903217dfc445ec4cf5b42e27975aece1fc4ebbc1ca6329c2d9fb54e" + sha256: "69acb7007eb2a31dc901512bfe0f7b767168be34cb734835d54c070bfa74c1b2" url: "https://pub.dev" source: hosted - version: "8.7.0" + version: "8.8.0" buttons_tabbar: dependency: "direct main" description: @@ -237,10 +237,10 @@ packages: dependency: transitive description: name: cross_file - sha256: "445db18de832dba8d851e287aff8ccf169bed30d2e94243cb54c7d2f1ed2142c" + sha256: "2f9d2cbccb76127ba28528cb3ae2c2326a122446a83de5a056aaa3880d3882c5" url: "https://pub.dev" source: hosted - version: "0.3.3+6" + version: "0.3.3+7" crypto: dependency: transitive description: @@ -269,18 +269,10 @@ packages: dependency: transitive description: name: dart_ping - sha256: "91ee37e5bf5316caca5bd6f7b6016e73cd861b6a4b99565a2fd89b1d65003e1a" + sha256: "2f5418d0a5c64e53486caaac78677b25725b1e13c33c5be834ce874ea18bd24f" url: "https://pub.dev" source: hosted - version: "8.0.1" - dart_ping_ios: - dependency: "direct main" - description: - name: dart_ping_ios - sha256: ade22dedb8bbe37b6ba69bbfb0cbb36b6a20f55f6a63abcb4583373f9ea8eebd - url: "https://pub.dev" - source: hosted - version: "3.0.0" + version: "9.0.1" dart_style: dependency: transitive description: @@ -357,10 +349,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: be325344c1f3070354a1d84a231a1ba75ea85d413774ec4bdf444c023342e030 + sha256: "4e42aacde3b993c5947467ab640882c56947d9d27342a5b6f2895b23956954a6" url: "https://pub.dev" source: hosted - version: "5.5.0" + version: "6.1.1" file_selector_linux: dependency: transitive description: @@ -483,14 +475,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" - flutter_icmp_ping: - dependency: transitive - description: - name: flutter_icmp_ping - sha256: de9633cf65a8c733fae29d08a35d3d4b343620cd1d13e1bfa88eccf56696d896 - url: "https://pub.dev" - source: hosted - version: "3.1.3" flutter_keyboard_visibility: dependency: transitive description: @@ -572,10 +556,50 @@ packages: dependency: "direct main" description: name: flutter_secure_storage - sha256: "9f3dd2ac3b6875b0fde5b04734789c3ef35ba3965c18e99dd564a7a2f8056df6" + sha256: ffdbb60130e4665d2af814a0267c481bcf522c41ae2e43caf69fa0146876d685 url: "https://pub.dev" source: hosted - version: "4.2.1" + version: "9.0.0" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: "3d5032e314774ee0e1a7d0a9f5e2793486f0dff2dd9ef5a23f4e3fb2a0ae6a9e" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: bd33935b4b628abd0b86c8ca20655c5b36275c3a3f5194769a7b3f37c905369c + url: "https://pub.dev" + source: hosted + version: "3.0.1" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: "0d4d3a5dd4db28c96ae414d7ba3b8422fd735a8255642774803b2532c9a61d7e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: "30f84f102df9dcdaa2241866a958c2ec976902ebdaa8883fbfe525f1f2f3cf20" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: "5809c66f9dd3b4b93b0a6e2e8561539405322ee767ac2f64d084e2ab5429d108" + url: "https://pub.dev" + source: hosted + version: "3.0.0" flutter_share_me: dependency: "direct main" description: @@ -715,10 +739,10 @@ packages: dependency: "direct main" description: name: image_picker - sha256: b6951e25b795d053a6ba03af5f710069c99349de9341af95155d52665cb4607c + sha256: "7d7f2768df2a8b0a3cefa5ef4f84636121987d403130e70b17ef7e2cf650ba84" url: "https://pub.dev" source: hosted - version: "0.8.9" + version: "1.0.4" image_picker_android: dependency: transitive description: @@ -731,10 +755,10 @@ packages: dependency: transitive description: name: image_picker_for_web - sha256: "869fe8a64771b7afbc99fc433a5f7be2fea4d1cb3d7c11a48b6b579eb9c797f0" + sha256: "50bc9ae6a77eea3a8b11af5eb6c661eeb858fdd2f734c2a4fd17086922347ef7" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "3.0.1" image_picker_ios: dependency: transitive description: @@ -800,10 +824,10 @@ packages: dependency: transitive description: name: jiffy - sha256: c3c1da3fe0c08bba3c2c455e8a3e724dfe7ea34dbe8069b992cab90ea1fe40b6 + sha256: cc1d4b75016a9156c29b5d61f0c9176c3e0fb0580cc5a0e0422b5d2cab3fbfff url: "https://pub.dev" source: hosted - version: "5.0.1" + version: "6.2.1" js: dependency: "direct main" description: @@ -880,10 +904,10 @@ packages: dependency: "direct main" description: name: nearby_connections - sha256: "95fbc4fb01a199a02e6498b32800a89ea10e4e40b1e6ccae2033fe3e31453309" + sha256: "7a7237421c4654867a60a0a3314f150962097c0383ebab8ad2d5942cedd54da6" url: "https://pub.dev" source: hosted - version: "3.3.1" + version: "4.0.1" nested: dependency: transitive description: @@ -1309,26 +1333,26 @@ packages: dependency: transitive description: name: syncfusion_flutter_core - sha256: "3979f0b1c5a97422cadae52d476c21fa3e0fb671ef51de6cae1d646d8b99fe1f" + sha256: "8a1220f978491f56431c66dacf1bb97bf2abcd1458b542fe0dfbf1a630c67260" url: "https://pub.dev" source: hosted - version: "20.4.54" + version: "23.2.4" syncfusion_flutter_xlsio: dependency: "direct main" description: name: syncfusion_flutter_xlsio - sha256: a73bb379ab01f37a764038667d1e3636a46cc55a4bfa573e98475a35659b7bff + sha256: "1587750fc3d3550a63fe89e12f60b82cd781ecea336a8c5b536354ebc7820707" url: "https://pub.dev" source: hosted - version: "20.4.54-beta" + version: "23.2.4" syncfusion_officecore: dependency: transitive description: name: syncfusion_officecore - sha256: "2ca66b01fb903bb8444d02c122078917d34edf2e5ad640cb41e3f07076c3b677" + sha256: "9dca5adca8e79b485b7217708e199366466a9b7ccbbf4a2a967d3d78771ad4b7" url: "https://pub.dev" source: hosted - version: "20.4.54-beta" + version: "23.2.4" term_glyph: dependency: transitive description: @@ -1349,10 +1373,10 @@ packages: dependency: "direct main" description: name: thermal_printer - sha256: "0434f1c18a58b03d46139917e58e7236ad9776fccc36fd9ffd2f17a75fbbc333" + sha256: "887ad5be1d3db42a2259fd0ad636fa6f873db30669fa7eaebcb57c446ff09344" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.2" timing: dependency: transitive description: diff --git a/frontend/mgramseva/pubspec.yaml b/frontend/mgramseva/pubspec.yaml index 8fe269f84..43e172321 100644 --- a/frontend/mgramseva/pubspec.yaml +++ b/frontend/mgramseva/pubspec.yaml @@ -26,14 +26,14 @@ dependencies: sdk: flutter cupertino_icons: ^1.0.2 - thermal_printer: ^1.0.1 - dart_ping_ios: ^3.0.0 + thermal_printer: ^1.0.2 +# dart_ping_ios: ^4.0.2 //uncomment iOS universal_html: ^2.0.8 - flutter_secure_storage: ^4.2.0 + flutter_secure_storage: ^9.0.0 flutter_svg: ^2.0.7 datetime_picker_formfield: ^2.0.0 horizontal_data_table: ^4.1.3 - file_picker: ^5.5.0 + file_picker: ^6.1.1 http: ^1.1.0 provider: ^6.0.0 flutter_spinkit: ^5.0.0 @@ -55,7 +55,7 @@ dependencies: flutter_countdown_timer: ^4.1.0 flutter_rating_bar: ^4.0.1 collection: ^1.15.0 - image_picker: ^0.8.4 + image_picker: ^1.0.4 flutter_focus_watcher: ^2.0.0 path: ^1.8.0 esc_pos_utils_plus: ^2.0.2 @@ -63,17 +63,17 @@ dependencies: pdf: ^3.8.1 flutter_share_me: ^1.3.0 printing: ^5.10.4 - mime: ^1.0.1 + mime: ^1.0.4 community_charts_flutter: ^1.0.1 flutter_web_plugins: sdk: flutter - firebase_analytics: ^10.7.0 - firebase_core: ^2.22.0 - package_info_plus: ^4.2.0 + firebase_analytics: ^10.7.1 + firebase_core: ^2.23.0 + package_info_plus: ^4.0.2 open_filex: ^4.3.4 - syncfusion_flutter_xlsio: ^20.3.59-beta + syncfusion_flutter_xlsio: ^23.2.4 print_bluetooth_thermal: ^1.0.5 - nearby_connections: ^3.3.0 + nearby_connections: ^4.0.1 dropdown_search: ^5.0.6 dev_dependencies: diff --git a/frontend/mgramseva/web/index.html b/frontend/mgramseva/web/index.html index c9f112ddb..0e0ece8a3 100644 --- a/frontend/mgramseva/web/index.html +++ b/frontend/mgramseva/web/index.html @@ -387,8 +387,8 @@ // Initialize Firebase - firebase.initializeApp(firebaseConfig); - firebase.analytics(); + +
From f5d97878cf3604125d0607a9bda051024483c959 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Sun, 26 Nov 2023 20:16:25 +0530 Subject: [PATCH 04/70] added PWA Support --- frontend/mgramseva/pubspec.yaml | 2 +- frontend/mgramseva/web/manifest.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/mgramseva/pubspec.yaml b/frontend/mgramseva/pubspec.yaml index 43e172321..e5564ecba 100644 --- a/frontend/mgramseva/pubspec.yaml +++ b/frontend/mgramseva/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.2.15+32 +version: 1.2.16+32 environment: sdk: ">=2.12.0 <4.0.0" diff --git a/frontend/mgramseva/web/manifest.json b/frontend/mgramseva/web/manifest.json index ad7b90830..937175bf3 100644 --- a/frontend/mgramseva/web/manifest.json +++ b/frontend/mgramseva/web/manifest.json @@ -4,7 +4,7 @@ "start_url": ".", "display": "standalone", "background_color": "#eeeeee", - "theme_color": "#f47738", + "theme_color": "#0B4B66", "description": "A mobile-based application that enables the gram panchayat water committee to collect & manage revenue and expenditure.", "orientation": "portrait-primary", "prefer_related_applications": false, From 9792d7179b7a3e8e82d6b8cfd302802bd5a0c584 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Tue, 28 Nov 2023 03:49:13 +0530 Subject: [PATCH 05/70] ios build --- .../mgramseva/ios/Runner.xcodeproj/project.pbxproj | 12 ++++++------ frontend/mgramseva/pubspec.yaml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/mgramseva/ios/Runner.xcodeproj/project.pbxproj b/frontend/mgramseva/ios/Runner.xcodeproj/project.pbxproj index 00c7b1d2f..399e9fb20 100644 --- a/frontend/mgramseva/ios/Runner.xcodeproj/project.pbxproj +++ b/frontend/mgramseva/ios/Runner.xcodeproj/project.pbxproj @@ -368,7 +368,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 12; + CURRENT_PROJECT_VERSION = 13; DEVELOPMENT_TEAM = JP48C27R32; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -377,7 +377,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.14; + MARKETING_VERSION = 1.2.16; PRODUCT_BUNDLE_IDENTIFIER = com.dwss.mgramseva; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -504,7 +504,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 12; + CURRENT_PROJECT_VERSION = 13; DEVELOPMENT_TEAM = JP48C27R32; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -513,7 +513,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.14; + MARKETING_VERSION = 1.2.16; PRODUCT_BUNDLE_IDENTIFIER = com.dwss.mgramseva; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -532,7 +532,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 12; + CURRENT_PROJECT_VERSION = 13; DEVELOPMENT_TEAM = JP48C27R32; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -541,7 +541,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.14; + MARKETING_VERSION = 1.2.16; PRODUCT_BUNDLE_IDENTIFIER = com.dwss.mgramseva; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/frontend/mgramseva/pubspec.yaml b/frontend/mgramseva/pubspec.yaml index e5564ecba..ec2ee9931 100644 --- a/frontend/mgramseva/pubspec.yaml +++ b/frontend/mgramseva/pubspec.yaml @@ -26,7 +26,7 @@ dependencies: sdk: flutter cupertino_icons: ^1.0.2 - thermal_printer: ^1.0.2 + thermal_printer: ^1.0.4 # dart_ping_ios: ^4.0.2 //uncomment iOS universal_html: ^2.0.8 flutter_secure_storage: ^9.0.0 From 0f9e64acc37b6503688980a9d5342a30c5a10b05 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Tue, 28 Nov 2023 19:39:42 +0530 Subject: [PATCH 06/70] PFM-4081 --- .../model/connection/water_connection.dart | 6 + .../model/connection/water_connection.g.dart | 6 +- .../household_register_provider.dart | 199 +++++++++++++++--- .../utils/constants/i18_key_constants.dart | 7 + 4 files changed, 185 insertions(+), 33 deletions(-) diff --git a/frontend/mgramseva/lib/model/connection/water_connection.dart b/frontend/mgramseva/lib/model/connection/water_connection.dart index 493316906..d2aec7e2d 100644 --- a/frontend/mgramseva/lib/model/connection/water_connection.dart +++ b/frontend/mgramseva/lib/model/connection/water_connection.dart @@ -267,6 +267,12 @@ class AdditionalDetails { @JsonKey(name: "collectionPendingAmount") String? collectionPendingAmount; + @JsonKey(name: "totalamount") + double? totalAmount; + + @JsonKey(name: "appCreatedDate") + int? appCreatedDate; + @JsonKey(ignore: true) var initialMeterReadingCtrl = TextEditingController(); String? action; diff --git a/frontend/mgramseva/lib/model/connection/water_connection.g.dart b/frontend/mgramseva/lib/model/connection/water_connection.g.dart index f7abbfd0b..9a521acbf 100644 --- a/frontend/mgramseva/lib/model/connection/water_connection.g.dart +++ b/frontend/mgramseva/lib/model/connection/water_connection.g.dart @@ -97,7 +97,9 @@ AdditionalDetails _$AdditionalDetailsFromJson(Map json) => ..doorNo = json['doorNo'] as String? ..collectionAmount = json['collectionAmount'] as String? ..collectionPendingAmount = json['collectionPendingAmount'] as String? - ..action = json['action'] as String?; + ..action = json['action'] as String? + ..totalAmount = json['totalamount']!=null?double.parse(json['totalamount'] as String):0.0 + ..appCreatedDate = json['appCreatedDate'] as int?; Map _$AdditionalDetailsToJson(AdditionalDetails instance) => { @@ -114,4 +116,6 @@ Map _$AdditionalDetailsToJson(AdditionalDetails instance) => 'collectionAmount': instance.collectionAmount, 'collectionPendingAmount': instance.collectionPendingAmount, 'action': instance.action, + 'totalamount': instance.totalAmount, + 'appCreatedDate': instance.appCreatedDate, }; diff --git a/frontend/mgramseva/lib/providers/household_register_provider.dart b/frontend/mgramseva/lib/providers/household_register_provider.dart index 0208c0e63..e6e850608 100644 --- a/frontend/mgramseva/lib/providers/household_register_provider.dart +++ b/frontend/mgramseva/lib/providers/household_register_provider.dart @@ -183,6 +183,35 @@ class HouseholdRegisterProvider with ChangeNotifier { } List get collectionHeaderList => [ + TableHeader(i18.common.CONNECTION_ID, isSortingRequired: true, isAscendingOrder: sortBy != null && sortBy!.key == 'connectionNumber' ? sortBy!.isAscending : null, apiKey: 'connectionNumber', callBack: onSort), + // TableHeader(i18.common.VILLAGE_CODE, isSortingRequired: false), + // TableHeader(i18.common.VILLAGE_NAME, isSortingRequired: false), + // TableHeader(i18.common.TENANT_ID, isSortingRequired: false), + TableHeader(i18.common.NAME, isSortingRequired: false), + TableHeader(i18.common.GENDER, isSortingRequired: false), + TableHeader(i18.consumer.FATHER_SPOUSE_NAME, isSortingRequired: false), + TableHeader(i18.common.MOBILE_NUMBER, isSortingRequired: false), + TableHeader(i18.consumer.OLD_CONNECTION_ID, isSortingRequired: false), + TableHeader(i18.consumer.CONSUMER_CATEGORY, isSortingRequired: false), + TableHeader(i18.consumer.CONSUMER_SUBCATEGORY, isSortingRequired: false), + TableHeader(i18.searchWaterConnection.PROPERTY_TYPE, isSortingRequired: false), + TableHeader(i18.searchWaterConnection.CONNECTION_TYPE, isSortingRequired: false), + TableHeader(i18.demandGenerate.METER_READING_DATE, isSortingRequired: false), + TableHeader(i18.searchWaterConnection.METER_NUMBER, isSortingRequired: false), + TableHeader(i18.demandGenerate.PREV_METER_READING_LABEL, isSortingRequired: false), + TableHeader(i18.consumer.ARREARS_ON_CREATION, isSortingRequired: false), + TableHeader(i18.consumer.CORE_PENALTY_ON_CREATION, isSortingRequired: false), + TableHeader(i18.consumer.CORE_ADVANCE_ON_CREATION, isSortingRequired: false), + TableHeader(i18.common.CORE_TOTAL_BILL_AMOUNT, isSortingRequired: false), + TableHeader(i18.billDetails.TOTAL_AMOUNT_COLLECTED, isSortingRequired: false), + TableHeader(i18.common.CORE_ADVANCE_AS_ON_TODAY, isSortingRequired: false), + TableHeader(i18.householdRegister.PENDING_COLLECTIONS, isSortingRequired: true, isAscendingOrder: sortBy != null && sortBy!.key == 'collectionPendingAmount' ? sortBy!.isAscending : null, apiKey: 'collectionPendingAmount', callBack: onSort), + TableHeader(i18.common.CREATED_ON_DATE, isSortingRequired: false), + TableHeader(i18.householdRegister.LAST_BILL_GEN_DATE, isSortingRequired: true, apiKey: 'lastDemandGeneratedDate', isAscendingOrder: sortBy != null && sortBy!.key == 'lastDemandGeneratedDate' ? sortBy!.isAscending : null, callBack: onSort), + TableHeader(i18.householdRegister.ACTIVE_INACTIVE, isSortingRequired: false, apiKey: 'status'), + ] + ; + List get collectionHeaderListOLd => [ TableHeader(i18.common.CONNECTION_ID, isSortingRequired: true, isAscendingOrder: @@ -263,8 +292,11 @@ class HouseholdRegisterProvider with ChangeNotifier { } TableDataRow getCollectionRow(WaterConnection connection) { + var commonProvider = Provider.of( + navigatorKey.currentContext!, + listen: false); String? name = - truncateWithEllipsis(connection.connectionHolders?.first.name); + truncateWithEllipsis(connection.connectionHolders?.first.name??'NA'); String? fatherName = truncateWithEllipsis( connection.connectionHolders?.first.fatherOrHusbandName); return TableDataRow([ @@ -272,13 +304,78 @@ class HouseholdRegisterProvider with ChangeNotifier { '${connection.connectionNo?.split('/').first ?? ''}/...${connection.connectionNo?.split('/').last ?? ''} ${connection.connectionType == 'Metered' ? '- M' : ''}', callBack: onClickOfCollectionNo, apiKey: connection.connectionNo), - TableData('${connection.oldConnectionNo ?? ''}'), - TableData('${name ?? ''}'), - TableData('${fatherName ?? ''}'), + // TableData( + // '${commonProvider.userDetails?.selectedtenant?.city?.code ?? 'NA'}', + // ), + // TableData( + // '${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(connection.tenantId ?? 'NA')}', + // ), + // TableData( + // '${connection.tenantId ?? 'NA'}', + // ), + TableData( + '${name ?? 'NA'}', + ), + TableData( + '${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(connection.connectionHolders?.first.gender ?? 'NA')}', + ), + TableData( + '${fatherName ?? 'NA'}', + ), + TableData( + '${connection.connectionHolders?.first.mobileNumber ?? 'NA'}', + ), + TableData( + '${connection.oldConnectionNo ?? 'NA'}', + ), + TableData( + '${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(connection.additionalDetails?.category ?? 'NA')}', + ), + TableData( + '${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(connection.additionalDetails?.subCategory ?? 'NA')}', + ), + TableData( + '${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(connection.additionalDetails?.propertyType ?? 'NA')}', + ), + TableData( + '${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(connection.connectionType ?? 'NA')}', + ), + TableData( + '${connection.connectionType == 'Metered' ?connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? 'NA')) :'NA' :'NA' }', + ), + TableData( + '${connection.connectionType == 'Metered' ? connection.meterId :'NA' }', + ), TableData( - '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '-' : '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-'}'), + '${connection.connectionType == 'Metered' ? connection.additionalDetails?.meterReading :'NA' }', + ), TableData( - '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-' : '-'}'), + '${connection.arrears != null ? '₹ ${connection.arrears}' : '-'}', + ), + TableData( + '${connection.penalty != null ? '₹ ${connection.penalty}' : '-'}', + ), + TableData( + '${connection.advance != null ? '₹ ${connection.advance}' : '-'}', + ), + TableData( + '${connection.additionalDetails?.totalAmount != null ? '₹ ${connection.additionalDetails?.totalAmount}' : '-'}', + ), + TableData( + '${connection.additionalDetails?.collectionAmount != null ? '₹ ${connection.additionalDetails?.collectionAmount}' : '-'}', + ), + TableData( + '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-' : '-'}', + ), + TableData( + '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '-' : '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-'}', + ), + TableData( + '${connection.additionalDetails?.appCreatedDate != null ? DateFormats.timeStampToDate(connection.additionalDetails?.appCreatedDate) : '-'}', + ), + TableData( + '${connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? '')) : '-'}', + ), TableData( '${connection.status.toString() == Constants.CONNECTION_STATUS.last ? 'Y' : 'N'}', style: TextStyle( @@ -286,8 +383,7 @@ class HouseholdRegisterProvider with ChangeNotifier { Constants.CONNECTION_STATUS.last ? ColorCodes.ACTIVE_COL : ColorCodes.INACTIVE_COL)), - TableData( - '${connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? '')) : '-'}') + ]); } @@ -397,7 +493,7 @@ class HouseholdRegisterProvider with ChangeNotifier { i18.householdRegister.ACTIVE_INACTIVE, i18.householdRegister.LAST_BILL_GEN_DATE ]; - var downloadheaderList = [ + var downloadHeaderList = [ i18.common.VILLAGE_CODE, i18.common.VILLAGE_NAME, i18.common.TENANT_ID, @@ -414,53 +510,92 @@ class HouseholdRegisterProvider with ChangeNotifier { i18.demandGenerate.METER_READING_DATE, i18.searchWaterConnection.METER_NUMBER, i18.demandGenerate.PREV_METER_READING_LABEL, + i18.consumer.ARREARS_ON_CREATION, + i18.consumer.CORE_PENALTY_ON_CREATION, + i18.consumer.CORE_ADVANCE_ON_CREATION, + i18.common.CORE_TOTAL_BILL_AMOUNT, + i18.billDetails.TOTAL_AMOUNT_COLLECTED, + i18.common.CORE_ADVANCE_AS_ON_TODAY, + i18.common.CORE_BALANCE_AS_ON_TODAY, + i18.common.CREATED_ON_DATE, i18.householdRegister.LAST_BILL_GEN_DATE, - i18.common.ARREARS, - i18.common.CORE_PENALTY, - i18.common.CORE_ADVANCE, - i18.householdRegister.PENDING_COLLECTIONS, - i18.common.CORE_ADVANCE, - i18.householdRegister.PENDING_COLLECTIONS, i18.householdRegister.ACTIVE_INACTIVE ]; var pdfTableData = waterConnectionsDetails.waterConnection ?.map>((connection) => [ - '${connection.connectionNo ?? ''} ${connection.connectionType == 'Metered' ? '- M' : ''}', - '${connection.connectionHolders?.first.name ?? ''}', - '${connection.connectionHolders?.first.fatherOrHusbandName ?? ''}', - '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '-' : '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-'}', - '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '₹ 0' : '₹ 0'}', - '${connection.status.toString() == Constants.CONNECTION_STATUS.last ? 'Y' : 'N'}', - '${connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? '')) : '-'}' + '${commonProvider.userDetails?.selectedtenant?.city?.code ?? 'NA'}', + '${ApplicationLocalizations.of(context).translate(connection.tenantId ?? 'NA')}', + '${connection.tenantId ?? 'NA'}', + '${connection.connectionHolders?.first.name ?? 'NA'}', + '${ApplicationLocalizations.of(context).translate(connection.connectionHolders?.first.gender ?? 'NA')}', + '${connection.connectionHolders?.first.fatherOrHusbandName ?? 'NA'}', + '${connection.connectionHolders?.first.mobileNumber ?? 'NA'}', + '${connection.oldConnectionNo ?? 'NA'}', + '${connection.connectionNo ?? 'NA'}', + '${ApplicationLocalizations.of(context).translate(connection.additionalDetails?.category ?? 'NA')}', + '${ApplicationLocalizations.of(context).translate(connection.additionalDetails?.subCategory ?? 'NA')}', + '${ApplicationLocalizations.of(context).translate(connection.additionalDetails?.propertyType ?? 'NA')}', + '${ApplicationLocalizations.of(context).translate(connection.connectionType ?? 'NA')}', + '${connection.connectionType == 'Metered' ?connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? 'NA')) :'NA' :'NA' }', + '${connection.connectionType == 'Metered' ? connection.meterId :'NA' }', + '${connection.connectionType == 'Metered' ? connection.additionalDetails?.meterReading :'NA' }', + '${connection.arrears != null ? '₹ ${connection.arrears}' : '-'}', + '${connection.penalty != null ? '₹ ${connection.penalty}' : '-'}', + '${connection.advance != null ? '₹ ${connection.advance}' : '-'}', + '${connection.additionalDetails?.totalAmount != null ? '₹ ${connection.additionalDetails?.totalAmount}' : '-'}', + '${connection.additionalDetails?.collectionAmount != null ? '₹ ${connection.additionalDetails?.collectionAmount}' : '-'}', + '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-' : '-'}', + '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '-' : '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-'}', + '${connection.additionalDetails?.appCreatedDate != null ? DateFormats.timeStampToDate(connection.additionalDetails?.appCreatedDate) : '-'}', + '${connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? '')) : '-'}', + '${connection.status.toString() == Constants.CONNECTION_STATUS.last ? 'Y' : 'N'}', ]) .toList() ?? []; var excelTableData = waterConnectionsDetails.waterConnection ?.map>((connection) => [ - '${connection.connectionNo ?? ''} ${connection.connectionType == 'Metered' ? '- M' : ''}', - '${connection.oldConnectionNo ?? ''}', - '${connection.connectionHolders?.first.name ?? ''}', - '${connection.connectionHolders?.first.fatherOrHusbandName ?? ''}', - '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '-' : '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-'}', - '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '₹ 0' : '₹ 0'}', - '${connection.status.toString() == Constants.CONNECTION_STATUS.last ? 'Y' : 'N'}', - '${connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? '')) : '-'}' + '${commonProvider.userDetails?.selectedtenant?.city?.code ?? 'NA'}', + '${ApplicationLocalizations.of(context).translate(connection.tenantId ?? 'NA')}', + '${connection.tenantId ?? 'NA'}', + '${connection.connectionHolders?.first.name ?? 'NA'}', + '${ApplicationLocalizations.of(context).translate(connection.connectionHolders?.first.gender ?? 'NA')}', + '${connection.connectionHolders?.first.fatherOrHusbandName ?? 'NA'}', + '${connection.connectionHolders?.first.mobileNumber ?? 'NA'}', + '${connection.oldConnectionNo ?? 'NA'}', + '${connection.connectionNo ?? 'NA'}', + '${ApplicationLocalizations.of(context).translate(connection.additionalDetails?.category ?? 'NA')}', + '${ApplicationLocalizations.of(context).translate(connection.additionalDetails?.subCategory ?? 'NA')}', + '${ApplicationLocalizations.of(context).translate(connection.additionalDetails?.propertyType ?? 'NA')}', + '${ApplicationLocalizations.of(context).translate(connection.connectionType ?? 'NA')}', + '${connection.connectionType == 'Metered' ?connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? 'NA')) :'NA' :'NA' }', + '${connection.connectionType == 'Metered' ? connection.meterId :'NA' }', + '${connection.connectionType == 'Metered' ? connection.additionalDetails?.meterReading :'NA' }', + '${connection.arrears != null ? '₹ ${connection.arrears}' : '-'}', + '${connection.penalty != null ? '₹ ${connection.penalty}' : '-'}', + '${connection.advance != null ? '₹ ${connection.advance}' : '-'}', + '${connection.additionalDetails?.totalAmount != null ? '₹ ${connection.additionalDetails?.totalAmount}' : '-'}', + '${connection.additionalDetails?.collectionAmount != null ? '₹ ${connection.additionalDetails?.collectionAmount}' : '-'}', + '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-' : '-'}', + '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '-' : '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-'}', + '${connection.additionalDetails?.appCreatedDate != null ? DateFormats.timeStampToDate(connection.additionalDetails?.appCreatedDate) : '-'}', + '${connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? '')) : '-'}', + '${connection.status.toString() == Constants.CONNECTION_STATUS.last ? 'Y' : 'N'}', ]) .toList() ?? []; isExcelDownload ? generateExcel( - headerList + downloadHeaderList .map((e) => '${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(e)}') .toList(), excelTableData) : await HouseholdPdfCreator( context, - headerList.where((e) => e!=i18.consumer.OLD_CONNECTION_ID) + downloadHeaderList.where((e) => e!=i18.consumer.OLD_CONNECTION_ID) .map((e) => '${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(e)}') .toList(), diff --git a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart index 006b43721..cb186d523 100644 --- a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart +++ b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart @@ -198,6 +198,9 @@ class Common { String get SHARE_BILL_PDF => 'SHARE_BILL_PDF'; String get CORE_PENALTY => 'CORE_PENALTY'; String get CORE_ADVANCE => 'ADVANCE'; + String get CORE_ADVANCE_AS_ON_TODAY => 'CORE_ADVANCE_AS_ON_TODAY'; + String get CORE_BALANCE_AS_ON_TODAY => 'CORE_BALANCE_AS_ON_TODAY'; + String get CREATED_ON_DATE => 'CREATED_ON_DATE'; String get CORE_ADVANCE_ADJUSTED => 'CORE_ADVANCE_ADJUSTED'; String get CORE_NET_DUE_AMOUNT => 'CORE_NET_DUE_AMOUNT'; String get CORE_TOTAL_BILL_AMOUNT => 'CORE_TOTAL_BILL_AMOUNT'; @@ -374,6 +377,9 @@ class CreateConsumer { String get CONSUMER_AADHAR_NUMBER => 'CONSUMER_AADHAR_NUMBER'; String get CONSUMER_CATEGORY => 'CONSUMER_CATEGORY'; String get CONSUMER_SUBCATEGORY => 'CONSUMER_SUBCATEGORY'; + String get ARREARS_ON_CREATION => 'ARREARS_ON_CREATION'; + String get CORE_PENALTY_ON_CREATION => 'CORE_PENALTY_ON_CREATION'; + String get CORE_ADVANCE_ON_CREATION => 'CORE_ADVANCE_ON_CREATION'; String get ARREARS => 'CONSUMER_ARREARS'; String get CONSUMER_CONNECTION_ID => 'CONSUMER_CONNECTION_ID'; String get SERVICE_TYPE => 'CONSUMER_SERVICE_TYPE'; @@ -497,6 +503,7 @@ class BillDetails { String get CURRENT_BILL => 'CURRENT_BILL'; String get ARRERS_DUES => 'ARRERS_DUES'; String get TOTAL_AMOUNT => 'TOTAL_AMOUNT'; + String get TOTAL_AMOUNT_COLLECTED => 'TOTAL_AMOUNT_COLLECTED'; String get COLLECT_PAYMENT => 'COLLECT_PAYMENT'; String get CORE_PAID_AFTER => 'CORE_PAID_AFTER'; String get CORE_PENALTY => 'CORE_PENALTY'; From 92509501b9973ec869deff1dbe3eeac93dc42553 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Tue, 28 Nov 2023 19:51:06 +0530 Subject: [PATCH 07/70] PFM-4081 (#670) --- .../household_register_provider.dart | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/frontend/mgramseva/lib/providers/household_register_provider.dart b/frontend/mgramseva/lib/providers/household_register_provider.dart index e6e850608..6f675d596 100644 --- a/frontend/mgramseva/lib/providers/household_register_provider.dart +++ b/frontend/mgramseva/lib/providers/household_register_provider.dart @@ -493,6 +493,32 @@ class HouseholdRegisterProvider with ChangeNotifier { i18.householdRegister.ACTIVE_INACTIVE, i18.householdRegister.LAST_BILL_GEN_DATE ]; + var pdfHeaderList = [ + i18.common.CONNECTION_ID, + i18.common.NAME, + i18.common.GENDER, + i18.consumer.FATHER_SPOUSE_NAME, + i18.common.MOBILE_NUMBER, + i18.consumer.OLD_CONNECTION_ID, + i18.consumer.CONSUMER_CATEGORY, + i18.consumer.CONSUMER_SUBCATEGORY, + i18.searchWaterConnection.PROPERTY_TYPE, + i18.searchWaterConnection.CONNECTION_TYPE, + i18.demandGenerate.METER_READING_DATE, + i18.searchWaterConnection.METER_NUMBER, + i18.demandGenerate.PREV_METER_READING_LABEL, + i18.consumer.ARREARS_ON_CREATION, + i18.consumer.CORE_PENALTY_ON_CREATION, + i18.consumer.CORE_ADVANCE_ON_CREATION, + i18.common.CORE_TOTAL_BILL_AMOUNT, + i18.billDetails.TOTAL_AMOUNT_COLLECTED, + i18.common.CORE_ADVANCE_AS_ON_TODAY, + i18.common.CORE_BALANCE_AS_ON_TODAY, + i18.common.CREATED_ON_DATE, + i18.householdRegister.LAST_BILL_GEN_DATE, + i18.householdRegister.ACTIVE_INACTIVE + + ]; var downloadHeaderList = [ i18.common.VILLAGE_CODE, i18.common.VILLAGE_NAME, @@ -525,15 +551,11 @@ class HouseholdRegisterProvider with ChangeNotifier { var pdfTableData = waterConnectionsDetails.waterConnection ?.map>((connection) => [ - '${commonProvider.userDetails?.selectedtenant?.city?.code ?? 'NA'}', - '${ApplicationLocalizations.of(context).translate(connection.tenantId ?? 'NA')}', - '${connection.tenantId ?? 'NA'}', + '${connection.connectionNo ?? 'NA'}', '${connection.connectionHolders?.first.name ?? 'NA'}', '${ApplicationLocalizations.of(context).translate(connection.connectionHolders?.first.gender ?? 'NA')}', '${connection.connectionHolders?.first.fatherOrHusbandName ?? 'NA'}', '${connection.connectionHolders?.first.mobileNumber ?? 'NA'}', - '${connection.oldConnectionNo ?? 'NA'}', - '${connection.connectionNo ?? 'NA'}', '${ApplicationLocalizations.of(context).translate(connection.additionalDetails?.category ?? 'NA')}', '${ApplicationLocalizations.of(context).translate(connection.additionalDetails?.subCategory ?? 'NA')}', '${ApplicationLocalizations.of(context).translate(connection.additionalDetails?.propertyType ?? 'NA')}', @@ -595,7 +617,7 @@ class HouseholdRegisterProvider with ChangeNotifier { excelTableData) : await HouseholdPdfCreator( context, - downloadHeaderList.where((e) => e!=i18.consumer.OLD_CONNECTION_ID) + pdfHeaderList.where((e) => e!=i18.consumer.OLD_CONNECTION_ID) .map((e) => '${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(e)}') .toList(), From 1626b90c50c10627c1cacc0bccf4c11e509f2da7 Mon Sep 17 00:00:00 2001 From: Saloni <103189799+Saloni-eGov@users.noreply.github.com> Date: Wed, 29 Nov 2023 15:20:18 +0530 Subject: [PATCH 08/70] PFM-4085 Vendor Report (#667) * PFM-4085 Vendor Report --- .../vendor/repository/VendorRepository.java | 40 ++++++++ .../querybuilder/VendorQueryBuilder.java | 5 + .../rowmapper/VendorReportRowMapper.java | 95 +++++++++++++++++++ .../org/egov/vendor/service/UserService.java | 8 ++ .../egov/vendor/service/VendorService.java | 25 ++++- .../web/controller/VendorController.java | 28 +++--- .../vendor/web/model/VendorReportData.java | 31 ++++++ .../web/model/VendorReportResponse.java | 17 ++++ 8 files changed, 234 insertions(+), 15 deletions(-) create mode 100644 municipal-services/vendor/src/main/java/org/egov/vendor/repository/rowmapper/VendorReportRowMapper.java create mode 100644 municipal-services/vendor/src/main/java/org/egov/vendor/web/model/VendorReportData.java create mode 100644 municipal-services/vendor/src/main/java/org/egov/vendor/web/model/VendorReportResponse.java diff --git a/municipal-services/vendor/src/main/java/org/egov/vendor/repository/VendorRepository.java b/municipal-services/vendor/src/main/java/org/egov/vendor/repository/VendorRepository.java index 9570480ad..e3bc835e8 100644 --- a/municipal-services/vendor/src/main/java/org/egov/vendor/repository/VendorRepository.java +++ b/municipal-services/vendor/src/main/java/org/egov/vendor/repository/VendorRepository.java @@ -9,8 +9,10 @@ import org.egov.vendor.config.VendorConfiguration; import org.egov.vendor.producer.Producer; import org.egov.vendor.repository.querybuilder.VendorQueryBuilder; +import org.egov.vendor.repository.rowmapper.VendorReportRowMapper; import org.egov.vendor.repository.rowmapper.VendorRowMapper; import org.egov.vendor.web.model.Vendor; +import org.egov.vendor.web.model.VendorReportData; import org.egov.vendor.web.model.VendorRequest; import org.egov.vendor.web.model.VendorSearchCriteria; import org.springframework.beans.factory.annotation.Autowired; @@ -39,6 +41,9 @@ public class VendorRepository { @Autowired private VendorRowMapper vendorrowMapper; + @Autowired + private VendorReportRowMapper vendorReportRowMapper; + public void save(VendorRequest vendorRequest) { producer.push(configuration.getSaveTopic(), vendorRequest); } @@ -111,4 +116,39 @@ public int getExistingVenodrsCount(List ownerIdList, String tenantId) { } + public List getVendorReportData(Long monthStartDateTime, String tenantId, Integer offset, Integer limit) + { + StringBuilder vendor_report_query=new StringBuilder(vendorQueryBuilder.VENDOR_REPORT_QUERY); + + List preparedStatement=new ArrayList<>(); + preparedStatement.add(tenantId); + preparedStatement.add(monthStartDateTime); +// preparedStatement.add(monthEndDateTime); + + + Integer newlimit=configuration.getDefaultLimit(); + Integer newoffset= configuration.getDefaultOffset(); + + if(limit==null && offset==null) + newlimit=configuration.getMaxSearchLimit(); + if(limit!=null && limit<=configuration.getMaxSearchLimit()) + newlimit=limit; + if(limit!=null && limit>=configuration.getMaxSearchLimit()) + newlimit=configuration.getMaxSearchLimit(); + + if(offset!=null) + newoffset=offset; + + if (newlimit>0){ + vendor_report_query.append(" offset ? limit ? ;"); + preparedStatement.add(newoffset); + preparedStatement.add(newlimit); + } + + log.info("Query of vendor report : "+vendor_report_query.toString()+" prepared statement of vendor report "+ preparedStatement); + + List vendorReportDataList=jdbcTemplate.query(vendor_report_query.toString() , preparedStatement.toArray(), vendorReportRowMapper); + + return vendorReportDataList; + } } diff --git a/municipal-services/vendor/src/main/java/org/egov/vendor/repository/querybuilder/VendorQueryBuilder.java b/municipal-services/vendor/src/main/java/org/egov/vendor/repository/querybuilder/VendorQueryBuilder.java index 7c2396ad9..c30edea4a 100644 --- a/municipal-services/vendor/src/main/java/org/egov/vendor/repository/querybuilder/VendorQueryBuilder.java +++ b/municipal-services/vendor/src/main/java/org/egov/vendor/repository/querybuilder/VendorQueryBuilder.java @@ -12,6 +12,11 @@ @Component public class VendorQueryBuilder { + public static final String VENDOR_REPORT_QUERY = "select echallan.challanno,echallan.typeofexpense as type_of_expense," + + " vendor.name,eg_user.uuid as owner_uuid from eg_echallan echallan INNER JOIN eg_vendor vendor on " + + " echallan.vendor=vendor.id INNER JOIN eg_user on eg_user.uuid=vendor.owner_id where " + + " echallan.applicationstatus!='CANCELLED' and echallan.tenantid =? " + + " and echallan.taxperiodfrom >= ? order by echallan.challanno desc "; @Autowired private VendorConfiguration config; diff --git a/municipal-services/vendor/src/main/java/org/egov/vendor/repository/rowmapper/VendorReportRowMapper.java b/municipal-services/vendor/src/main/java/org/egov/vendor/repository/rowmapper/VendorReportRowMapper.java new file mode 100644 index 000000000..ccc815944 --- /dev/null +++ b/municipal-services/vendor/src/main/java/org/egov/vendor/repository/rowmapper/VendorReportRowMapper.java @@ -0,0 +1,95 @@ +package org.egov.vendor.repository.rowmapper; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.egov.vendor.service.UserService; +import org.egov.vendor.web.model.VendorReportData; +import org.egov.vendor.web.model.user.User; +import org.egov.vendor.web.model.user.UserDetailResponse; +import org.egov.vendor.web.model.user.UserSearchRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.ResultSetExtractor; +import org.springframework.stereotype.Component; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; +import java.util.stream.Collectors; + +@Component +@Slf4j +public class VendorReportRowMapper implements ResultSetExtractor> +{ + @Autowired + private ObjectMapper mapper; + @Autowired + private UserService userService; + + @Override + public List extractData(ResultSet resultSet) throws SQLException, DataAccessException { + List vendorReportDataList=new ArrayList<>(); + + while(resultSet.next()) + { + VendorReportData vendorReportData=new VendorReportData(); + vendorReportData.setVendor_name(resultSet.getString("name")); + vendorReportData.setBill_id(resultSet.getString("challanno")); + vendorReportData.setUuid(resultSet.getString("owner_uuid")); + vendorReportData.setType_of_expense(resultSet.getString("type_of_expense")); + vendorReportDataList.add(vendorReportData); + } + if(!vendorReportDataList.isEmpty()) + { + enrichVendorHolderDetails(vendorReportDataList); + } + return vendorReportDataList; + } + + private void enrichVendorHolderDetails(List vendorReportDataList) + { + Set lastModifiedByUuid= new HashSet<>(); + + for(VendorReportData vendorReportData:vendorReportDataList) + { + lastModifiedByUuid.add(vendorReportData.getUuid()); + } + + UserSearchRequest userSearchRequest=new UserSearchRequest(); + userSearchRequest.setUuid((new ArrayList<>(lastModifiedByUuid))); + + log.info(userSearchRequest.getUuid().toString()); + + UserDetailResponse userDetailResponse = userService.getUser(userSearchRequest); + + log.info(userDetailResponse.getUser().toString()); + + enrichConnectionHolderInfo(userDetailResponse, vendorReportDataList); + + } + + private void enrichConnectionHolderInfo(UserDetailResponse userDetailResponse, List vendorReportDataList) + { + List connectionHolderInfos = userDetailResponse.getUser(); + Map userIdToConnectionHolderMap = new HashMap<>(); + if(connectionHolderInfos.isEmpty()) + { + return; + } + connectionHolderInfos.forEach(user -> userIdToConnectionHolderMap.put(user.getUuid(), user)); + + log.info(userIdToConnectionHolderMap.toString()); + +// vendorReportDataList.forEach(vendorReportData-> vendorReportData.setMobile_no(userIdToConnectionHolderMap.get(vendorReportData.getUuid()).getMobileNumber())); + + vendorReportDataList.forEach(vendorReportData -> { + User connection = userIdToConnectionHolderMap.get(vendorReportData.getUuid()); + if (connection != null) { + vendorReportData.setMobile_no(connection.getMobileNumber()); + } else { + log.warn("User not found for UUID: " + vendorReportData.getUuid()); + } + }); + + } +} diff --git a/municipal-services/vendor/src/main/java/org/egov/vendor/service/UserService.java b/municipal-services/vendor/src/main/java/org/egov/vendor/service/UserService.java index d1ec6484c..ddf5d0400 100644 --- a/municipal-services/vendor/src/main/java/org/egov/vendor/service/UserService.java +++ b/municipal-services/vendor/src/main/java/org/egov/vendor/service/UserService.java @@ -610,4 +610,12 @@ private Boolean isUserValid(User user) { return Boolean.TRUE; } + + + public UserDetailResponse getUser(UserSearchRequest userSearchRequest) { + StringBuilder uri = new StringBuilder(config.getUserHost()) + .append(config.getUserSearchEndpoint()); + UserDetailResponse userDetailResponse = userCall(userSearchRequest, uri); + return userDetailResponse; + } } diff --git a/municipal-services/vendor/src/main/java/org/egov/vendor/service/VendorService.java b/municipal-services/vendor/src/main/java/org/egov/vendor/service/VendorService.java index 5bde74895..6276a7ddf 100644 --- a/municipal-services/vendor/src/main/java/org/egov/vendor/service/VendorService.java +++ b/municipal-services/vendor/src/main/java/org/egov/vendor/service/VendorService.java @@ -1,5 +1,9 @@ package org.egov.vendor.service; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; @@ -14,6 +18,7 @@ import org.egov.vendor.repository.VendorRepository; import org.egov.vendor.validator.VendorValidator; import org.egov.vendor.web.model.Vendor; +import org.egov.vendor.web.model.VendorReportData; import org.egov.vendor.web.model.VendorRequest; import org.egov.vendor.web.model.VendorSearchCriteria; import org.egov.vendor.web.model.user.User; @@ -30,9 +35,6 @@ @Slf4j public class VendorService { - @Autowired - private VendorRepository vendorRepository; - @Autowired private VendorValidator vendorValidator; @@ -64,7 +66,7 @@ public Vendor create(VendorRequest vendorRequest) { vendorValidator.validateCreate(vendorRequest); enrichmentService.enrichCreate(vendorRequest); - vendorRepository.save(vendorRequest); + repository.save(vendorRequest); return vendorRequest.getVendor(); } @@ -159,4 +161,19 @@ private List getVendorPlainSearch(@Valid VendorSearchCriteria criteria, return vendorList; } + public List vendorReport(String monthStartDate, String tenantId, Integer offset, Integer limit, RequestInfo requestInfo) + { + + DateTimeFormatter formatter=DateTimeFormatter.ofPattern("dd/MM/yyyy"); + LocalDate startDate= LocalDate.parse(monthStartDate,formatter); +// LocalDate endDate=LocalDate.parse(monthEndDate,formatter); + + Long monthStartDateTime= LocalDateTime.of(startDate.getYear(),startDate.getMonth(),startDate.getDayOfMonth(), + 0,0,0).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); +// Long monthEndDateTime=LocalDateTime.of(endDate, LocalTime.MAX).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + + List vendorReportData=repository.getVendorReportData(monthStartDateTime,tenantId,offset,limit); + return vendorReportData; + + } } diff --git a/municipal-services/vendor/src/main/java/org/egov/vendor/web/controller/VendorController.java b/municipal-services/vendor/src/main/java/org/egov/vendor/web/controller/VendorController.java index 66971ebf7..2be2fa9f4 100644 --- a/municipal-services/vendor/src/main/java/org/egov/vendor/web/controller/VendorController.java +++ b/municipal-services/vendor/src/main/java/org/egov/vendor/web/controller/VendorController.java @@ -9,20 +9,11 @@ import org.egov.vendor.service.VendorService; import org.egov.vendor.util.ResponseInfoFactory; import org.egov.vendor.util.VendorUtil; -import org.egov.vendor.web.model.RequestInfoWrapper; -import org.egov.vendor.web.model.Vendor; -import org.egov.vendor.web.model.VendorRequest; -import org.egov.vendor.web.model.VendorResponse; -import org.egov.vendor.web.model.VendorSearchCriteria; +import org.egov.vendor.web.model.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @@ -75,4 +66,19 @@ public ResponseEntity plainsearch(@Valid @RequestBody RequestInf .build(); return new ResponseEntity<>(response, HttpStatus.OK); } + + @RequestMapping(value="/_vendorReport" ,method = RequestMethod.POST) + public ResponseEntity vendorReport(@Valid @RequestBody RequestInfoWrapper requestInfoWrapper, + @RequestParam(value="monthStartDate" , required = true) String monthStartDate, + @RequestParam ("tenantId") String tenantId, + @RequestParam ("offset") Integer offset, + @RequestParam ("limit") Integer limit) + { + + List vendorReportData=vendorService.vendorReport(monthStartDate,tenantId,offset,limit,requestInfoWrapper.getRequestInfo()); + VendorReportResponse vendorReportResponse= VendorReportResponse.builder().VendorReportData(vendorReportData).responseInfo(responseInfoFactory.createResponseInfoFromRequestInfo(requestInfoWrapper.getRequestInfo(),true)).build(); + + return new ResponseEntity<>(vendorReportResponse,HttpStatus.OK); + } + } diff --git a/municipal-services/vendor/src/main/java/org/egov/vendor/web/model/VendorReportData.java b/municipal-services/vendor/src/main/java/org/egov/vendor/web/model/VendorReportData.java new file mode 100644 index 000000000..8126fb4f0 --- /dev/null +++ b/municipal-services/vendor/src/main/java/org/egov/vendor/web/model/VendorReportData.java @@ -0,0 +1,31 @@ +package org.egov.vendor.web.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class VendorReportData { + + @JsonProperty("tenantId") + private String tenantId; + + @JsonProperty("vendor_name") + private String vendor_name; + + @JsonProperty("mobile_no") + private String mobile_no; + + @JsonProperty("type_of_expense") + private String type_of_expense; + + @JsonProperty("bill_id") + private String bill_id; + + @JsonProperty("owner_uuid") + private String uuid; + +} diff --git a/municipal-services/vendor/src/main/java/org/egov/vendor/web/model/VendorReportResponse.java b/municipal-services/vendor/src/main/java/org/egov/vendor/web/model/VendorReportResponse.java new file mode 100644 index 000000000..021606a1a --- /dev/null +++ b/municipal-services/vendor/src/main/java/org/egov/vendor/web/model/VendorReportResponse.java @@ -0,0 +1,17 @@ +package org.egov.vendor.web.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; +import org.egov.common.contract.response.ResponseInfo; + +import java.util.List; + +@Builder +public class VendorReportResponse { + + @JsonProperty("VendorReportData") + private List VendorReportData; + + @JsonProperty("requestInfo") + private ResponseInfo responseInfo = null; +} From 2497d79f0cc3ec90dd0481f736442a91c77f4a91 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Thu, 30 Nov 2023 02:24:03 +0530 Subject: [PATCH 09/70] Pfm 4081 (#672) --- .../consumer_bill_payment.dart | 319 ++++++++--------- .../model/connection/water_connection.dart | 4 +- .../model/connection/water_connection.g.dart | 4 +- .../providers/collect_payment_provider.dart | 325 +++++++++--------- .../household_register_provider.dart | 6 +- .../lib/utils/printer/image_utils.dart | 3 +- .../lib/widgets/bluetooth_printer.dart | 4 +- 7 files changed, 343 insertions(+), 322 deletions(-) diff --git a/frontend/mgramseva/lib/components/house_connection_and_bill/consumer_bill_payment.dart b/frontend/mgramseva/lib/components/house_connection_and_bill/consumer_bill_payment.dart index a6b235d27..c8b14b349 100644 --- a/frontend/mgramseva/lib/components/house_connection_and_bill/consumer_bill_payment.dart +++ b/frontend/mgramseva/lib/components/house_connection_and_bill/consumer_bill_payment.dart @@ -47,17 +47,20 @@ class ConsumerBillPaymentsState extends State { Container( margin: EdgeInsets.zero, padding: EdgeInsets.zero, - width: kIsWeb ? 150 : 65, + width: kIsWeb ? 150 : 80, child: Text(ApplicationLocalizations.of(context).translate(key), maxLines: 3, textScaleFactor: kIsWeb ? 2.5 : 1, textAlign: TextAlign.start, style: TextStyle( - color: Colors.red, - fontSize: kIsWeb ? 5 : 6, - fontWeight: FontWeight.w900))), + color: Colors.black, + fontSize: kIsWeb ? 5 : 9, + fontWeight: FontWeight.w500))), + SizedBox( + width: 5, + ), Container( - width: kIsWeb ? 215 : 85, + width: kIsWeb ? 215 : 110, child: Text( ApplicationLocalizations.of(navigatorKey.currentContext!) .translate(value), @@ -65,9 +68,9 @@ class ConsumerBillPaymentsState extends State { textAlign: TextAlign.start, textScaleFactor: kIsWeb ? 2.5 : 1, style: TextStyle( - color: Colors.red, - fontSize: kIsWeb ? 5 : 6, - fontWeight: FontWeight.w900), + color: Colors.black, + fontSize: kIsWeb ? 5 : 9, + fontWeight: FontWeight.w500), )), ], ); @@ -86,167 +89,173 @@ class ConsumerBillPaymentsState extends State { listen: false); screenshotController - .captureFromWidget( + .captureFromLongWidget( Container( - width: kIsWeb ? 375 : 150, + width: kIsWeb ? 375 : 195, margin: EdgeInsets.zero, padding: EdgeInsets.zero, - child: Column( - mainAxisSize: MainAxisSize.min, + child: Row( children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, + Column( + mainAxisSize: MainAxisSize.min, children: [ - kIsWeb - ? SizedBox( - width: 70, - height: 70, - ) - : Image( - width: 40, - height: 40, - image: NetworkImage(stateProvider - .stateInfo!.stateLogoURL - .toString())), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + kIsWeb + ? SizedBox( + width: 70, + height: 70, + ) + : Image( + width: 40, + height: 40, + color: Colors.black, + image: NetworkImage(stateProvider + .stateInfo!.stateLogoURL + .toString())), + Container( + width: kIsWeb ? 290 : 90, + margin: EdgeInsets.all(5), + child: Text( + ApplicationLocalizations.of( + navigatorKey.currentContext!) + .translate(i18.consumerReciepts + .GRAM_PANCHAYAT_WATER_SUPPLY_AND_SANITATION), + textScaler: TextScaler.linear(kIsWeb ? 3 : 1), + maxLines: 3, + style: TextStyle( + color: Colors.black, + fontSize: 10, + height: 1, + fontWeight: FontWeight.bold, + fontStyle: FontStyle.italic), + textAlign: TextAlign.left, + ), + ) + ], + ), + SizedBox( + height: 8, + ), Container( - width: kIsWeb ? 290 : 90, - margin: EdgeInsets.all(5), - child: Text( - ApplicationLocalizations.of( - navigatorKey.currentContext!) - .translate(i18.consumerReciepts - .GRAM_PANCHAYAT_WATER_SUPPLY_AND_SANITATION), - textScaler: TextScaler.linear(kIsWeb ? 3 : 1), - maxLines: 3, - style: TextStyle( - color: Colors.black, - fontSize: 10, - height: 1, - fontWeight: FontWeight.bold, - fontStyle: FontStyle.italic), - textAlign: TextAlign.left, - ), - ) - ], - ), - SizedBox( - height: 8, - ), - Container( - width: kIsWeb ? 375 : 90, - margin: EdgeInsets.all(5), - child: Text( - ApplicationLocalizations.of( - navigatorKey.currentContext!) - .translate(i18.consumerReciepts.WATER_RECEIPT), - textScaler: TextScaler.linear(kIsWeb ? 3 : 1), - style: TextStyle( - color: Colors.black, - fontSize: 10, - height: 1, - fontWeight: FontWeight.bold, - ))), - SizedBox( - height: 8, - ), - getPrinterLabel( - i18.consumerReciepts.RECEIPT_GPWSC_NAME, - ApplicationLocalizations.of(navigatorKey.currentContext!) - .translate(commonProvider - .userDetails!.selectedtenant!.code!)), - getPrinterLabel(i18.consumerReciepts.RECEIPT_CONSUMER_NO, - widget.waterConnection!.connectionNo), - getPrinterLabel( - i18.consumerReciepts.RECEIPT_CONSUMER_NAME, - widget.waterConnection!.connectionHolders!.first.name, - ), - getPrinterLabel( - i18.consumerReciepts.RECEIPT_CONSUMER_MOBILE_NO, - item.mobileNumber), - getPrinterLabel( - i18.consumerReciepts.RECEIPT_CONSUMER_ADDRESS, - ApplicationLocalizations.of(navigatorKey.currentContext!) - .translate(widget.waterConnection!.additionalDetails! - .doorNo - .toString()) + - " " + - ApplicationLocalizations.of(navigatorKey.currentContext!) - .translate(widget.waterConnection!.additionalDetails! - .street - .toString()) + - " " + - ApplicationLocalizations.of(navigatorKey.currentContext!) - .translate(widget - .waterConnection!.additionalDetails!.locality - .toString()) + - " " + + width: kIsWeb ? 375 : 90, + margin: EdgeInsets.all(5), + child: Text( + ApplicationLocalizations.of( + navigatorKey.currentContext!) + .translate(i18.consumerReciepts.WATER_RECEIPT), + textScaler: TextScaler.linear(kIsWeb ? 3 : 1), + style: TextStyle( + color: Colors.black, + fontSize: 10, + height: 1, + fontWeight: FontWeight.bold, + ))), + SizedBox( + height: 8, + ), + getPrinterLabel( + i18.consumerReciepts.RECEIPT_GPWSC_NAME, ApplicationLocalizations.of(navigatorKey.currentContext!) .translate(commonProvider .userDetails!.selectedtenant!.code!)), - SizedBox( - height: 10, - ), - getPrinterLabel(i18.consumer.SERVICE_TYPE, - widget.waterConnection?.connectionType), - getPrinterLabel(i18.consumerReciepts.CONSUMER_RECEIPT_NO, - item.paymentDetails!.first.receiptNumber), - getPrinterLabel( - i18.consumerReciepts.RECEIPT_ISSUE_DATE, - DateFormats.timeStampToDate(item.transactionDate, - format: "dd/MM/yyyy") - .toString()), - getPrinterLabel( - i18.consumerReciepts.RECEIPT_BILL_PERIOD, - DateFormats.timeStampToDate( - item.paymentDetails?.last.bill!.billDetails!.first - .fromPeriod, - format: "dd/MM/yyyy") + - '-' + - DateFormats.timeStampToDate( - item.paymentDetails?.last.bill?.billDetails! - .first.toPeriod, + getPrinterLabel(i18.consumerReciepts.RECEIPT_CONSUMER_NO, + widget.waterConnection!.connectionNo), + getPrinterLabel( + i18.consumerReciepts.RECEIPT_CONSUMER_NAME, + widget.waterConnection!.connectionHolders!.first.name, + ), + getPrinterLabel( + i18.consumerReciepts.RECEIPT_CONSUMER_MOBILE_NO, + item.mobileNumber), + getPrinterLabel( + i18.consumerReciepts.RECEIPT_CONSUMER_ADDRESS, + ApplicationLocalizations.of(navigatorKey.currentContext!) + .translate(widget.waterConnection!.additionalDetails! + .doorNo + .toString()) + + " " + + ApplicationLocalizations.of(navigatorKey.currentContext!) + .translate(widget.waterConnection!.additionalDetails! + .street + .toString()) + + " " + + ApplicationLocalizations.of(navigatorKey.currentContext!) + .translate(widget + .waterConnection!.additionalDetails!.locality + .toString()) + + " " + + ApplicationLocalizations.of(navigatorKey.currentContext!) + .translate(commonProvider + .userDetails!.selectedtenant!.code!)), + SizedBox( + height: 10, + ), + getPrinterLabel(i18.consumer.SERVICE_TYPE, + widget.waterConnection?.connectionType), + getPrinterLabel(i18.consumerReciepts.CONSUMER_RECEIPT_NO, + item.paymentDetails!.first.receiptNumber), + getPrinterLabel( + i18.consumerReciepts.RECEIPT_ISSUE_DATE, + DateFormats.timeStampToDate(item.transactionDate, format: "dd/MM/yyyy") .toString()), - SizedBox( - height: 8, - ), - getPrinterLabel( - i18.consumerReciepts.CONSUMER_ACTUAL_DUE_AMOUNT, - ('₹' + (item.totalDue).toString())), - getPrinterLabel(i18.consumerReciepts.RECEIPT_AMOUNT_PAID, - ('₹' + (item.totalAmountPaid).toString())), - getPrinterLabel( - i18.consumerReciepts.RECEIPT_AMOUNT_IN_WORDS, - ('Rupees ' + - (NumberToWord() - .convert('en-in', item.totalAmountPaid!.toInt()) - .toString()) + - ' only')), - getPrinterLabel( - i18.consumerReciepts.CONSUMER_PENDING_AMOUNT, - ('₹' + - ((item.totalDue ?? 0) - (item.totalAmountPaid ?? 0)) - .toString())), - SizedBox( - height: 8, + getPrinterLabel( + i18.consumerReciepts.RECEIPT_BILL_PERIOD, + DateFormats.timeStampToDate( + item.paymentDetails?.last.bill!.billDetails!.first + .fromPeriod, + format: "dd/MM/yyyy") + + '-' + + DateFormats.timeStampToDate( + item.paymentDetails?.last.bill?.billDetails! + .first.toPeriod, + format: "dd/MM/yyyy") + .toString()), + SizedBox( + height: 8, + ), + getPrinterLabel( + i18.consumerReciepts.CONSUMER_ACTUAL_DUE_AMOUNT, + ('₹' + (item.totalDue).toString())), + getPrinterLabel(i18.consumerReciepts.RECEIPT_AMOUNT_PAID, + ('₹' + (item.totalAmountPaid).toString())), + getPrinterLabel( + i18.consumerReciepts.RECEIPT_AMOUNT_IN_WORDS, + ('Rupees ' + + (NumberToWord() + .convert('en-in', item.totalAmountPaid!.toInt()) + .toString()) + + ' only')), + getPrinterLabel( + i18.consumerReciepts.CONSUMER_PENDING_AMOUNT, + ('₹' + + ((item.totalDue ?? 0) - (item.totalAmountPaid ?? 0)) + .toString())), + SizedBox( + height: 8, + ), + Text('- - *** - -', + textScaler: TextScaler.linear(kIsWeb ? 3 : 1), + textAlign: TextAlign.start, + style: TextStyle( + color: Colors.black, + fontSize: kIsWeb ? 5 : 6, + fontWeight: FontWeight.bold)), + Text( + "${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(i18.common.RECEIPT_FOOTER)}", + textScaler: TextScaler.linear(kIsWeb ? 3 : 1), + textAlign: TextAlign.start, + style: TextStyle( + color: Colors.black, + fontSize: kIsWeb ? 5 : 6, + fontWeight: FontWeight.bold)), + ], ), - Text('- - *** - -', - textScaler: TextScaler.linear(kIsWeb ? 3 : 1), - textAlign: TextAlign.start, - style: TextStyle( - color: Colors.red, - fontSize: kIsWeb ? 5 : 6, - fontWeight: FontWeight.bold)), - Text( - "${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(i18.common.RECEIPT_FOOTER)}", - textScaler: TextScaler.linear(kIsWeb ? 3 : 1), - textAlign: TextAlign.start, - style: TextStyle( - color: Colors.red, - fontSize: kIsWeb ? 5 : 6, - fontWeight: FontWeight.bold)), ], )), + pixelRatio: 16/9 ) .then((value) => { kIsWeb diff --git a/frontend/mgramseva/lib/model/connection/water_connection.dart b/frontend/mgramseva/lib/model/connection/water_connection.dart index d2aec7e2d..37e2937b8 100644 --- a/frontend/mgramseva/lib/model/connection/water_connection.dart +++ b/frontend/mgramseva/lib/model/connection/water_connection.dart @@ -268,10 +268,10 @@ class AdditionalDetails { String? collectionPendingAmount; @JsonKey(name: "totalamount") - double? totalAmount; + String? totalAmount; @JsonKey(name: "appCreatedDate") - int? appCreatedDate; + num? appCreatedDate; @JsonKey(ignore: true) var initialMeterReadingCtrl = TextEditingController(); diff --git a/frontend/mgramseva/lib/model/connection/water_connection.g.dart b/frontend/mgramseva/lib/model/connection/water_connection.g.dart index 9a521acbf..1ff036767 100644 --- a/frontend/mgramseva/lib/model/connection/water_connection.g.dart +++ b/frontend/mgramseva/lib/model/connection/water_connection.g.dart @@ -98,8 +98,8 @@ AdditionalDetails _$AdditionalDetailsFromJson(Map json) => ..collectionAmount = json['collectionAmount'] as String? ..collectionPendingAmount = json['collectionPendingAmount'] as String? ..action = json['action'] as String? - ..totalAmount = json['totalamount']!=null?double.parse(json['totalamount'] as String):0.0 - ..appCreatedDate = json['appCreatedDate'] as int?; + ..totalAmount = json['totalamount'] as String? + ..appCreatedDate = json['appCreatedDate'] as num?; Map _$AdditionalDetailsToJson(AdditionalDetails instance) => { diff --git a/frontend/mgramseva/lib/providers/collect_payment_provider.dart b/frontend/mgramseva/lib/providers/collect_payment_provider.dart index c9fb773e5..6c1781a08 100644 --- a/frontend/mgramseva/lib/providers/collect_payment_provider.dart +++ b/frontend/mgramseva/lib/providers/collect_payment_provider.dart @@ -207,7 +207,7 @@ class CollectPaymentProvider with ChangeNotifier { Container( margin: EdgeInsets.zero, padding: EdgeInsets.zero, - width: kIsWeb ? 150 : 65, + width: kIsWeb ? 150 : 80, child: Text( ApplicationLocalizations.of(navigatorKey.currentContext!) .translate(key), @@ -215,11 +215,14 @@ class CollectPaymentProvider with ChangeNotifier { textScaleFactor: kIsWeb ? 2.5 : 1, textAlign: TextAlign.start, style: TextStyle( - color: Colors.red, - fontSize: kIsWeb ? 5 : 6, - fontWeight: FontWeight.w900))), + color: Colors.black, + fontSize: kIsWeb ? 5 : 9, + fontWeight: FontWeight.w500))), + SizedBox( + width: 5, + ), Container( - width: kIsWeb ? 215 : 85, + width: kIsWeb ? 215 : 110, child: Text( ApplicationLocalizations.of(navigatorKey.currentContext!) .translate(value), @@ -228,9 +231,9 @@ class CollectPaymentProvider with ChangeNotifier { textAlign: TextAlign.start, textScaleFactor: kIsWeb ? 2.5 : 1, style: TextStyle( - color: Colors.red, - fontSize: kIsWeb ? 5 : 6, - fontWeight: FontWeight.w900), + color: Colors.black, + fontSize: kIsWeb ? 5 : 9, + fontWeight: FontWeight.w500), )), ], ); @@ -255,172 +258,180 @@ class CollectPaymentProvider with ChangeNotifier { screenshotController .captureFromWidget( Container( - width: kIsWeb ? 375 : 150, + width: kIsWeb ? 375 : 195, margin: EdgeInsets.zero, padding: EdgeInsets.zero, - child: Column( - mainAxisSize: MainAxisSize.min, + child: Row( children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, + Column( + mainAxisSize: MainAxisSize.min, children: [ - kIsWeb - ? SizedBox( - width: 70, - height: 70, - ) - : Image( - width: 40, - height: 40, - image: NetworkImage(stateProvider - .stateInfo!.stateLogoURL - .toString())), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + kIsWeb + ? SizedBox( + width: 70, + height: 70, + ) + : Image( + width: 40, + height: 40, + image: NetworkImage(stateProvider + .stateInfo!.stateLogoURL + .toString())), + Container( + width: kIsWeb ? 290 : 90, + margin: EdgeInsets.all(5), + child: Text( + ApplicationLocalizations.of( + navigatorKey.currentContext!) + .translate(i18.consumerReciepts + .GRAM_PANCHAYAT_WATER_SUPPLY_AND_SANITATION), + textScaleFactor: kIsWeb ? 3 : 1, + maxLines: 3, + style: TextStyle( + color: Colors.black, + fontSize: 10, + height: 1, + fontWeight: FontWeight.bold, + fontStyle: FontStyle.italic), + textAlign: TextAlign.left, + ), + ) + ], + ), + SizedBox( + height: 8, + ), Container( - width: kIsWeb ? 290 : 90, - margin: EdgeInsets.all(5), - child: Text( - ApplicationLocalizations.of( - navigatorKey.currentContext!) - .translate(i18.consumerReciepts - .GRAM_PANCHAYAT_WATER_SUPPLY_AND_SANITATION), - textScaleFactor: kIsWeb ? 3 : 1, - maxLines: 3, - style: TextStyle( - color: Colors.blue, - fontSize: 10, - height: 1, - fontWeight: FontWeight.bold, - fontStyle: FontStyle.italic), - textAlign: TextAlign.left, - ), - ) - ], - ), - SizedBox( - height: 8, - ), - Container( - width: kIsWeb ? 375 : 90, - margin: EdgeInsets.all(5), - child: Text( - ApplicationLocalizations.of( - navigatorKey.currentContext!) - .translate(i18.consumerReciepts.WATER_RECEIPT), - textScaleFactor: kIsWeb ? 3 : 1, - style: TextStyle( - color: Colors.blue, - fontSize: 10, - height: 1, - fontWeight: FontWeight.bold, - ))), - SizedBox( - height: 8, - ), - getPrinterLabel( - i18.consumerReciepts.RECEIPT_GPWSC_NAME, - ApplicationLocalizations.of(navigatorKey.currentContext!) - .translate(commonProvider - .userDetails!.selectedtenant!.code!)), - getPrinterLabel(i18.consumerReciepts.RECEIPT_CONSUMER_NO, - '${fetchBill.consumerCode}'), - getPrinterLabel( - i18.consumerReciepts.RECEIPT_CONSUMER_NAME, - '${item.paidBy}', - ), - getPrinterLabel( - i18.consumerReciepts.RECEIPT_CONSUMER_MOBILE_NO, - item.mobileNumber), - getPrinterLabel( - i18.consumerReciepts.RECEIPT_CONSUMER_ADDRESS, - ApplicationLocalizations.of(navigatorKey.currentContext!) - .translate(houseHoldProvider - .waterConnection!.additionalDetails!.doorNo - .toString()) + - " " + - ApplicationLocalizations.of( - navigatorKey.currentContext!) - .translate( - '${houseHoldProvider.waterConnection?.additionalDetails?.street.toString()}') + - " " + - ApplicationLocalizations.of( - navigatorKey.currentContext!) - .translate( - '${houseHoldProvider.waterConnection?.additionalDetails?.locality.toString()}') + - " " + - ApplicationLocalizations.of( - navigatorKey.currentContext!) + width: kIsWeb ? 375 : 90, + margin: EdgeInsets.all(5), + child: Text( + ApplicationLocalizations.of( + navigatorKey.currentContext!) + .translate(i18.consumerReciepts.WATER_RECEIPT), + textScaleFactor: kIsWeb ? 3 : 1, + style: TextStyle( + color: Colors.black, + fontSize: 10, + height: 1, + fontWeight: FontWeight.bold, + ))), + SizedBox( + height: 8, + ), + getPrinterLabel( + i18.consumerReciepts.RECEIPT_GPWSC_NAME, + ApplicationLocalizations.of(navigatorKey.currentContext!) .translate(commonProvider .userDetails!.selectedtenant!.code!)), - SizedBox( - height: 10, - ), - getPrinterLabel(i18.consumer.SERVICE_TYPE, - '${houseHoldProvider.waterConnection!.connectionType.toString()}'), - getPrinterLabel(i18.consumerReciepts.CONSUMER_RECEIPT_NO, - item.paymentDetails!.first.receiptNumber), - getPrinterLabel( - i18.consumerReciepts.RECEIPT_ISSUE_DATE, - DateFormats.timeStampToDate(item.transactionDate, - format: "dd/MM/yyyy") - .toString()), - getPrinterLabel( - i18.consumerReciepts.RECEIPT_BILL_PERIOD, - DateFormats.timeStampToDate( - item.paymentDetails?.last.bill!.billDetails!.first - .fromPeriod, - format: "dd/MM/yyyy") + - '-' + - DateFormats.timeStampToDate( - item.paymentDetails?.last.bill?.billDetails! - .first.toPeriod, + getPrinterLabel(i18.consumerReciepts.RECEIPT_CONSUMER_NO, + '${fetchBill.consumerCode}'), + getPrinterLabel( + i18.consumerReciepts.RECEIPT_CONSUMER_NAME, + '${item.paidBy}', + ), + getPrinterLabel( + i18.consumerReciepts.RECEIPT_CONSUMER_MOBILE_NO, + item.mobileNumber), + getPrinterLabel( + i18.consumerReciepts.RECEIPT_CONSUMER_ADDRESS, + ApplicationLocalizations.of(navigatorKey.currentContext!) + .translate(houseHoldProvider + .waterConnection!.additionalDetails!.doorNo + .toString()) + + " " + + ApplicationLocalizations.of( + navigatorKey.currentContext!) + .translate( + '${houseHoldProvider.waterConnection?.additionalDetails?.street.toString()}') + + " " + + ApplicationLocalizations.of( + navigatorKey.currentContext!) + .translate( + '${houseHoldProvider.waterConnection?.additionalDetails?.locality.toString()}') + + " " + + ApplicationLocalizations.of( + navigatorKey.currentContext!) + .translate(commonProvider + .userDetails!.selectedtenant!.code!)), + SizedBox( + height: 10, + ), + getPrinterLabel(i18.consumer.SERVICE_TYPE, + '${houseHoldProvider.waterConnection!.connectionType.toString()}'), + getPrinterLabel(i18.consumerReciepts.CONSUMER_RECEIPT_NO, + item.paymentDetails!.first.receiptNumber), + getPrinterLabel( + i18.consumerReciepts.RECEIPT_ISSUE_DATE, + DateFormats.timeStampToDate(item.transactionDate, format: "dd/MM/yyyy") .toString()), - SizedBox( - height: 8, - ), - getPrinterLabel( - i18.consumerReciepts.CONSUMER_ACTUAL_DUE_AMOUNT, - ('₹' + (item.totalDue).toString())), - getPrinterLabel(i18.consumerReciepts.RECEIPT_AMOUNT_PAID, - ('₹' + (item.totalAmountPaid).toString())), - getPrinterLabel( - i18.consumerReciepts.RECEIPT_AMOUNT_IN_WORDS, - ('Rupees ' + - (NumberToWord() - .convert('en-in', item.totalAmountPaid!.toInt()) - .toString()) + - ' only')), - getPrinterLabel( - i18.consumerReciepts.CONSUMER_PENDING_AMOUNT, - ('₹' + - ((item.totalDue ?? 0) - (item.totalAmountPaid ?? 0)) - .toString())), - SizedBox( - height: 8, + getPrinterLabel( + i18.consumerReciepts.RECEIPT_BILL_PERIOD, + DateFormats.timeStampToDate( + item.paymentDetails?.last.bill!.billDetails!.first + .fromPeriod, + format: "dd/MM/yyyy") + + '-' + + DateFormats.timeStampToDate( + item.paymentDetails?.last.bill?.billDetails! + .first.toPeriod, + format: "dd/MM/yyyy") + .toString()), + SizedBox( + height: 8, + ), + getPrinterLabel( + i18.consumerReciepts.CONSUMER_ACTUAL_DUE_AMOUNT, + ('₹' + (item.totalDue).toString())), + getPrinterLabel(i18.consumerReciepts.RECEIPT_AMOUNT_PAID, + ('₹' + (item.totalAmountPaid).toString())), + getPrinterLabel( + i18.consumerReciepts.RECEIPT_AMOUNT_IN_WORDS, + ('Rupees ' + + (NumberToWord() + .convert('en-in', item.totalAmountPaid!.toInt()) + .toString()) + + ' only')), + getPrinterLabel( + i18.consumerReciepts.CONSUMER_PENDING_AMOUNT, + ('₹' + + ((item.totalDue ?? 0) - (item.totalAmountPaid ?? 0)) + .toString())), + SizedBox( + height: 8, + ), + Text('- - *** - -', + textScaler: TextScaler.linear(kIsWeb ? 3 : 1), + textAlign: TextAlign.start, + style: TextStyle( + color: Colors.black, + fontSize: kIsWeb ? 5 : 6, + fontWeight: FontWeight.bold)), + Text( + "${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(i18.common.RECEIPT_FOOTER)}", + textScaler: TextScaler.linear(kIsWeb ? 3 : 1), + textAlign: TextAlign.start, + style: TextStyle( + color: Colors.black, + fontSize: kIsWeb ? 5 : 6, + fontWeight: FontWeight.bold)), + ], ), - Text('- - *** - -', - textScaler: TextScaler.linear(kIsWeb ? 3 : 1), - textAlign: TextAlign.start, - style: TextStyle( - color: Colors.red, - fontSize: kIsWeb ? 5 : 6, - fontWeight: FontWeight.bold)), - Text( - "${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(i18.common.RECEIPT_FOOTER)}", - textScaler: TextScaler.linear(kIsWeb ? 3 : 1), - textAlign: TextAlign.start, - style: TextStyle( - color: Colors.red, - fontSize: kIsWeb ? 5 : 6, - fontWeight: FontWeight.bold)), ], )), + pixelRatio: 16/9 ) .then((value) => { kIsWeb ? js.onButtonClick( value, stateProvider.stateInfo!.stateLogoURL.toString()) - :Navigator.push(navigatorKey.currentContext!, new MaterialPageRoute(builder: (context)=>BluetoothPrinterScreen(imageData: value))) + :showDialog( + context: navigatorKey.currentContext!, + builder: (_) => BluetoothPrinterScreen(imageData: value) + ) }); return null; } diff --git a/frontend/mgramseva/lib/providers/household_register_provider.dart b/frontend/mgramseva/lib/providers/household_register_provider.dart index 6f675d596..5ad6b715e 100644 --- a/frontend/mgramseva/lib/providers/household_register_provider.dart +++ b/frontend/mgramseva/lib/providers/household_register_provider.dart @@ -371,7 +371,7 @@ class HouseholdRegisterProvider with ChangeNotifier { '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '-' : '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-'}', ), TableData( - '${connection.additionalDetails?.appCreatedDate != null ? DateFormats.timeStampToDate(connection.additionalDetails?.appCreatedDate) : '-'}', + '${connection.additionalDetails?.appCreatedDate != null ? DateFormats.timeStampToDate(connection.additionalDetails?.appCreatedDate?.toInt()) : '-'}', ), TableData( '${connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? '')) : '-'}', @@ -570,7 +570,7 @@ class HouseholdRegisterProvider with ChangeNotifier { '${connection.additionalDetails?.collectionAmount != null ? '₹ ${connection.additionalDetails?.collectionAmount}' : '-'}', '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-' : '-'}', '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '-' : '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-'}', - '${connection.additionalDetails?.appCreatedDate != null ? DateFormats.timeStampToDate(connection.additionalDetails?.appCreatedDate) : '-'}', + '${connection.additionalDetails?.appCreatedDate != null ? DateFormats.timeStampToDate(connection.additionalDetails?.appCreatedDate?.toInt()) : '-'}', '${connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? '')) : '-'}', '${connection.status.toString() == Constants.CONNECTION_STATUS.last ? 'Y' : 'N'}', ]) @@ -601,7 +601,7 @@ class HouseholdRegisterProvider with ChangeNotifier { '${connection.additionalDetails?.collectionAmount != null ? '₹ ${connection.additionalDetails?.collectionAmount}' : '-'}', '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-' : '-'}', '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '-' : '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-'}', - '${connection.additionalDetails?.appCreatedDate != null ? DateFormats.timeStampToDate(connection.additionalDetails?.appCreatedDate) : '-'}', + '${connection.additionalDetails?.appCreatedDate != null ? DateFormats.timeStampToDate(connection.additionalDetails?.appCreatedDate?.toInt()) : '-'}', '${connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? '')) : '-'}', '${connection.status.toString() == Constants.CONNECTION_STATUS.last ? 'Y' : 'N'}', ]) diff --git a/frontend/mgramseva/lib/utils/printer/image_utils.dart b/frontend/mgramseva/lib/utils/printer/image_utils.dart index 922981f0c..57649019f 100644 --- a/frontend/mgramseva/lib/utils/printer/image_utils.dart +++ b/frontend/mgramseva/lib/utils/printer/image_utils.dart @@ -20,7 +20,7 @@ img.Image drawImage(img.Image dst, img.Image src, srcY ??= 0; srcW ??= src.width; srcH ??= src.height; - dstW ??= (dst.width < src.width) ? dstW = dst.width : src.width; + dstW ??= (dst.width < src.width) ? dst.width : src.width; dstH ??= (dst.height < src.height) ? dst.height : src.height; if (blend) { @@ -45,3 +45,4 @@ img.Image drawImage(img.Image dst, img.Image src, return dst; } + diff --git a/frontend/mgramseva/lib/widgets/bluetooth_printer.dart b/frontend/mgramseva/lib/widgets/bluetooth_printer.dart index 37a76932a..729dd840a 100644 --- a/frontend/mgramseva/lib/widgets/bluetooth_printer.dart +++ b/frontend/mgramseva/lib/widgets/bluetooth_printer.dart @@ -180,9 +180,9 @@ class _BluetoothPrinterScreenState extends State { final decodedImage = img.decodeImage(imageBytes)!; // Create a black bottom layer // Resize the image to a 130x? thumbnail (maintaining the aspect ratio). - img.Image thumbnail = img.copyResize(decodedImage, height: decodedImage.height); + img.Image thumbnail = img.copyResize(decodedImage,width: PaperSize.mm58.width,maintainAspect: false,); // creates a copy of the original image with set dimensions - img.Image originalImg = img.copyResize(decodedImage, width: PaperSize.mm58.width, height: decodedImage.height); + img.Image originalImg = img.copyResize(decodedImage, width: PaperSize.mm58.width,maintainAspect: false, ); // fills the original image with a white background img.fill(originalImg, color: img.ColorRgb8(255, 255, 255)); // var padding = (originalImg.width - thumbnail.width) / 2; From 7fa6bc51396ad1ea4857e0f0255aabfb890e37ea Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:09:10 +0530 Subject: [PATCH 10/70] PFM-5074 --- .../util/migration/DemandMigration.java | 30 +++++++++++++++---- .../web/controller/DemandController.java | 2 +- .../egov/echallan/util/NotificationUtil.java | 2 +- .../config/WSCalculationConfiguration.java | 3 ++ .../consumer/DemandGenerationConsumer.java | 2 +- .../wscalculation/util/NotificationUtil.java | 2 +- .../src/main/resources/application.properties | 1 + .../service/OnBoardService.java | 2 +- .../util/NotificationUtil.java | 2 +- 9 files changed, 35 insertions(+), 11 deletions(-) diff --git a/business-services/billing-service/src/main/java/org/egov/demand/util/migration/DemandMigration.java b/business-services/billing-service/src/main/java/org/egov/demand/util/migration/DemandMigration.java index d6b1deb7b..cf8e611e5 100644 --- a/business-services/billing-service/src/main/java/org/egov/demand/util/migration/DemandMigration.java +++ b/business-services/billing-service/src/main/java/org/egov/demand/util/migration/DemandMigration.java @@ -96,12 +96,32 @@ public int compare(DemandDetail dD1, DemandDetail dD2) { } }; } - - public Map migrateToV1(Integer startBatch, Integer batchSizeInput) { + + public static String getCountQuery(String stateLevelTenantId){ + return new String("select count(*) from egbs_demand where businessservice IN ('TL','PT') AND tenantid ilike '"+stateLevelTenantId+"%';"); + } + public static String getSelectQuery(String stateLevelTenantId){ + return new String("select d.id as did,dl.id as dlid,dl.demandid as dldemandid," + + "d.consumercode as dconsumercode,d.consumertype as dconsumertype,d.taxperiodfrom as dtaxperiodfrom," + + "d.taxperiodto as dtaxperiodto,U.uuid as payer,null as dbillexpirytime," + + " d.businessservice as dbusinessservice,d.status as status,d.minimumamountpayable as dminimumamountpayable, " + + " (CASE WHEN taxheadcode='PT_DECIMAL_CEILING_CREDIT' OR taxheadcode='PT_DECIMAL_CEILING_DEBIT' THEN 'PT_ROUNDOFF' else taxheadcode END)" + + " as dltaxheadcode, (CASE WHEN taxheadcode IN ('PT_TIME_REBATE', 'PT_ADVANCE_CARRYFORWARD', 'PT_OWNER_EXEMPTION','PT_UNIT_USAGE_EXEMPTION'" + + ", 'PT_ADHOC_REBATE', 'PT_DECIMAL_CEILING_DEBIT','TL_ADHOC_REBATE') then taxamount*-1 else taxamount END) as dltaxamount," + + " dl.collectionamount as dlcollectionamount, dl.createdby as dlcreatedby,dl.createdtime as dlcreatedtime,dl.lastmodifiedby as dllastmodifiedby," + + " dl.lastmodifiedtime as dllastmodifiedtime,dl.tenantid as dltenantid, d.createdby as dcreatedby,d.createdtime as dcreatedtime," + + " d.lastmodifiedby as dlastmodifiedby,d.lastmodifiedtime as dlastmodifiedtime,d.tenantid as dtenantid " + + " from egbs_demand d inner join egbs_demanddetail dl ON d.id=dl.demandid AND d.tenantid=dl.tenantid " + + " LEFT OUTER JOIN eg_user U ON U.id::CHARACTER VARYING=d.owner" + + " WHERE d.businessservice IN ('TL','PT') AND d.tenantid ilike '"+stateLevelTenantId+"%' " + + " AND d.id IN (select id from egbs_demand order by id offset ? limit ?);"); + } + + public Map migrateToV1(Integer startBatch, Integer batchSizeInput,String stateLevelTenantId) { Map responseMap = new HashMap<>(); - int count = jdbcTemplate.queryForObject(COUNT_QUERY, Integer.class); + int count = jdbcTemplate.queryForObject(getCountQuery(stateLevelTenantId), Integer.class); int i = 0; if (null != startBatch && startBatch > 0) i = startBatch; @@ -111,7 +131,7 @@ public Map migrateToV1(Integer startBatch, Integer batchSizeInpu for( ; i demands = jdbcTemplate.query(SELECT_QUERY, new Object[] { i, batchSize }, demandRowMapper); + List demands = jdbcTemplate.query(getSelectQuery(stateLevelTenantId), new Object[] { i, batchSize }, demandRowMapper); try { apportionDemands(demands); @@ -128,7 +148,7 @@ public Map migrateToV1(Integer startBatch, Integer batchSizeInpu return responseMap; } - + private void addResponseToMap(List demands, Map responseMap, String message) { demands.forEach(demand -> { diff --git a/business-services/billing-service/src/main/java/org/egov/demand/web/controller/DemandController.java b/business-services/billing-service/src/main/java/org/egov/demand/web/controller/DemandController.java index 944b1854d..6d3331a67 100644 --- a/business-services/billing-service/src/main/java/org/egov/demand/web/controller/DemandController.java +++ b/business-services/billing-service/src/main/java/org/egov/demand/web/controller/DemandController.java @@ -146,7 +146,7 @@ public ResponseEntity search(@RequestBody RequestInfoWrapper requestInfoWrapp public ResponseEntity migrate(@RequestBody @Valid RequestInfoWrapper wrapper, @RequestParam(required=false) Integer batchStart, @RequestParam(required=true) Integer batchSizeInput) { - Map resultMap = migrationService.migrateToV1(batchStart, batchSizeInput); + Map resultMap = migrationService.migrateToV1(batchStart, batchSizeInput, wrapper.getRequestInfo().getUserInfo().getTenantId().substring(0,2)); return new ResponseEntity<>(resultMap, HttpStatus.OK); } diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/util/NotificationUtil.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/util/NotificationUtil.java index 5b8d9ffdd..53424952e 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/util/NotificationUtil.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/util/NotificationUtil.java @@ -286,7 +286,7 @@ public HashMap getLocalizationMessage(RequestInfo requestInfo, S StringBuilder uri = new StringBuilder(); uri.append(config.getLocalizationHost()).append(config.getLocalizationContextPath()) .append(config.getLocalizationSearchEndpoint()).append("?").append("locale=").append(locale) - .append("&tenantId=").append("pb").append("&module=").append("mgramseva-common") + .append("&tenantId=").append(tenantId, 0, 2).append("&module=").append("mgramseva-common") .append("&codes=").append(code); Map request = new HashMap<>(); diff --git a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/config/WSCalculationConfiguration.java b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/config/WSCalculationConfiguration.java index d3956c667..005fa4286 100644 --- a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/config/WSCalculationConfiguration.java +++ b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/config/WSCalculationConfiguration.java @@ -246,5 +246,8 @@ public class WSCalculationConfiguration { @Value("${sms.bill.download.enabled}") private boolean isSmsForBillDownloadEnabled; + + @Value("${sms.exclude.tenant}") + private String smsExcludeTenant; } diff --git a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/consumer/DemandGenerationConsumer.java b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/consumer/DemandGenerationConsumer.java index 393cfe5e3..77c05f2de 100644 --- a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/consumer/DemandGenerationConsumer.java +++ b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/consumer/DemandGenerationConsumer.java @@ -331,7 +331,7 @@ private void generateDemandAndSendnotification(RequestInfo requestInfo, String t * + connectionNo ); continue; } */ try { - if(tenantId != "pb.testing") { + if(tenantId.equals(config.getSmsExcludeTenant())) { generateDemandInBatch(calculationReq, masterMap, billingCycle, isSendMessage); } diff --git a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/util/NotificationUtil.java b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/util/NotificationUtil.java index c0c9cdbfd..35a2ec9be 100644 --- a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/util/NotificationUtil.java +++ b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/util/NotificationUtil.java @@ -208,7 +208,7 @@ public HashMap getLocalizationMessage(RequestInfo requestInfo, S StringBuilder uri = new StringBuilder(); uri.append(config.getLocalizationHost()).append(config.getLocalizationContextPath()) .append(config.getLocalizationSearchEndpoint()).append("?").append("locale=").append(locale) - .append("&tenantId=").append("pb").append("&module=").append("mgramseva-common") + .append("&tenantId=").append(tenantId,0,2).append("&module=").append("mgramseva-common") .append("&codes=").append(code); Map request = new HashMap<>(); diff --git a/municipal-services/ws-calculator/src/main/resources/application.properties b/municipal-services/ws-calculator/src/main/resources/application.properties index a7e8b3938..c1860ade8 100644 --- a/municipal-services/ws-calculator/src/main/resources/application.properties +++ b/municipal-services/ws-calculator/src/main/resources/application.properties @@ -144,3 +144,4 @@ egov.pspcl.vendor.number=9569761362 sms.demand.enabled: true sms.payment.link.enabled: true sms.bill.download.enabled: true +sms.exclude.tenant="pb.testing" diff --git a/municipal-services/ws-services/src/main/java/org/egov/waterconnection/service/OnBoardService.java b/municipal-services/ws-services/src/main/java/org/egov/waterconnection/service/OnBoardService.java index eec01dcf0..40d529509 100644 --- a/municipal-services/ws-services/src/main/java/org/egov/waterconnection/service/OnBoardService.java +++ b/municipal-services/ws-services/src/main/java/org/egov/waterconnection/service/OnBoardService.java @@ -110,7 +110,7 @@ public HashMap process(MultipartFile file, RequestInfoWrapper req if (!StringUtils.isEmpty(tenantId)) { tenantId = tenantId.split("\\.")[0]; } else { - tenantId = "pb"; + throw new CustomException("ONBOARD_NOT_FOUND", "Invalid tenantid"); } user.setTenantId(tenantId); } else if (2 == address.getColumn()) { diff --git a/municipal-services/ws-services/src/main/java/org/egov/waterconnection/util/NotificationUtil.java b/municipal-services/ws-services/src/main/java/org/egov/waterconnection/util/NotificationUtil.java index 8357408bc..f41b72049 100644 --- a/municipal-services/ws-services/src/main/java/org/egov/waterconnection/util/NotificationUtil.java +++ b/municipal-services/ws-services/src/main/java/org/egov/waterconnection/util/NotificationUtil.java @@ -191,7 +191,7 @@ public HashMap getLocalizationMessage(RequestInfo requestInfo, S StringBuilder uri = new StringBuilder(); uri.append(config.getLocalizationHost()).append(config.getLocalizationContextPath()) .append(config.getLocalizationSearchEndpoint()).append("?").append("locale=").append(locale) - .append("&tenantId=").append("pb").append("&module=").append("mgramseva-common") + .append("&tenantId=").append(tenantId,0,2).append("&module=").append("mgramseva-common") .append("&codes=").append(code); Map request = new HashMap<>(); From 08ced58763a94eed7b43a51ea5cb1d42b78539c1 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Fri, 1 Dec 2023 15:17:08 +0530 Subject: [PATCH 11/70] app version bump --- frontend/mgramseva/package.json | 2 +- frontend/mgramseva/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/mgramseva/package.json b/frontend/mgramseva/package.json index 58f1f6376..d2284639b 100644 --- a/frontend/mgramseva/package.json +++ b/frontend/mgramseva/package.json @@ -1,5 +1,5 @@ { "name": "mgramseva", - "version": "1.2.16", + "version": "1.2.17", "license": "egov" } diff --git a/frontend/mgramseva/pubspec.yaml b/frontend/mgramseva/pubspec.yaml index ec2ee9931..6d61da7b7 100644 --- a/frontend/mgramseva/pubspec.yaml +++ b/frontend/mgramseva/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.2.16+32 +version: 1.2.17+33 environment: sdk: ">=2.12.0 <4.0.0" From 9086f0a28584821204762f0b8fb4b1e42bd61566 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Mon, 4 Dec 2023 15:48:15 +0530 Subject: [PATCH 12/70] PFM-5044 --- .../main/java/org/egov/wscalculation/service/DemandService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/service/DemandService.java b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/service/DemandService.java index 6292bcfc4..da2a0a6e0 100644 --- a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/service/DemandService.java +++ b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/service/DemandService.java @@ -491,7 +491,7 @@ private String getShortenedUrl(String url) { private void sendSMSNotification(RequestInfo requestInfo, List smsRequests, String billCycle, String consumerCode, List demandDetails) { UserDetailResponse userDetailResponse = userService.getUserByRoleCodes(requestInfo, Arrays.asList("GP_ADMIN"), - "pb"); + requestInfo.getUserInfo().getTenantId().substring(0,2)); for (OwnerInfo ownerInfo : userDetailResponse.getUser()) { String localizationMessage = util.getLocalizationMessages(ownerInfo.getTenantId(), requestInfo); String messageString = util.getMessageTemplate(WSCalculationConstant.mGram_Consumer_NewBill, From 2292d54821f58c4d34765709560bc9da47617931 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Tue, 5 Dec 2023 11:14:49 +0530 Subject: [PATCH 13/70] stateleveltenantidconfig --- frontend/mgramseva/assets/.env | 1 + frontend/mgramseva/lib/main.dart | 2 ++ frontend/mgramseva/lib/providers/common_provider.dart | 3 ++- frontend/mgramseva/lib/providers/language.dart | 3 ++- frontend/mgramseva/pubspec.yaml | 3 +++ 5 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 frontend/mgramseva/assets/.env diff --git a/frontend/mgramseva/assets/.env b/frontend/mgramseva/assets/.env new file mode 100644 index 000000000..dffe0d8ba --- /dev/null +++ b/frontend/mgramseva/assets/.env @@ -0,0 +1 @@ +STATE_LEVEL_TENANT_ID=pb \ No newline at end of file diff --git a/frontend/mgramseva/lib/main.dart b/frontend/mgramseva/lib/main.dart index 713e9804d..2172616bb 100644 --- a/frontend/mgramseva/lib/main.dart +++ b/frontend/mgramseva/lib/main.dart @@ -53,6 +53,7 @@ import 'package:url_strategy/url_strategy.dart'; import 'providers/collect_payment_provider.dart'; import 'providers/dashboard_provider.dart'; import 'providers/revenue_dashboard_provider.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; void main() { HttpOverrides.global = new MyHttpOverrides(); @@ -72,6 +73,7 @@ void main() { }; WidgetsFlutterBinding.ensureInitialized(); + await dotenv.load(); if(kIsWeb){ await Firebase.initializeApp(options: FirebaseConfigurations.firebaseOptions); }else{ diff --git a/frontend/mgramseva/lib/providers/common_provider.dart b/frontend/mgramseva/lib/providers/common_provider.dart index 15a23f3c5..22a16977b 100644 --- a/frontend/mgramseva/lib/providers/common_provider.dart +++ b/frontend/mgramseva/lib/providers/common_provider.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_share_me/flutter_share_me.dart'; import 'package:mgramseva/model/bill/bill_payments.dart'; import 'package:mgramseva/model/demand/demand_list.dart'; @@ -262,7 +263,7 @@ class CommonProvider with ChangeNotifier { Future getAppVersionDetails() async { try { var localizationList = - await CoreRepository().getMdms(initRequestBody({"tenantId": "pb"})); + await CoreRepository().getMdms(initRequestBody({"tenantId": dotenv.get('STATE_LEVEL_TENANT_ID')})); appVersion = localizationList.mdmsRes!.commonMasters!.appVersion!.first; } catch (e) { print(e.toString()); diff --git a/frontend/mgramseva/lib/providers/language.dart b/frontend/mgramseva/lib/providers/language.dart index 263a26fe3..3cfff2860 100644 --- a/frontend/mgramseva/lib/providers/language.dart +++ b/frontend/mgramseva/lib/providers/language.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:mgramseva/model/localization/language.dart'; import 'package:mgramseva/repository/core_repo.dart'; import 'package:mgramseva/services/local_storage.dart'; @@ -36,7 +37,7 @@ class LanguageProvider with ChangeNotifier { streamController.add(stateInfos); } else { var localizationList = - await CoreRepository().getMdms(initRequestBody({"tenantId": "pb"})); + await CoreRepository().getMdms(initRequestBody({"tenantId": dotenv.get('STATE_LEVEL_TENANT_ID')})); stateInfo = localizationList.mdmsRes?.commonMasters?.stateInfo?.first; if (stateInfo != null) { stateInfo?.languages?.first.isSelected = true; diff --git a/frontend/mgramseva/pubspec.yaml b/frontend/mgramseva/pubspec.yaml index 6d61da7b7..fed019f24 100644 --- a/frontend/mgramseva/pubspec.yaml +++ b/frontend/mgramseva/pubspec.yaml @@ -27,6 +27,7 @@ dependencies: cupertino_icons: ^1.0.2 thermal_printer: ^1.0.4 + flutter_dotenv: ^5.1.0 # dart_ping_ios: ^4.0.2 //uncomment iOS universal_html: ^2.0.8 flutter_secure_storage: ^9.0.0 @@ -110,6 +111,8 @@ flutter: assets: - assets/png/ - assets/icons/ + - assets/svg/ + - assets/ # To add assets to your application, add an assets section, like this: # - images/a_dot_ham.jpeg From 3114a0ffdc00b7d066c6a610555d39f726d99713 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Tue, 5 Dec 2023 12:41:43 +0530 Subject: [PATCH 14/70] stateleveltenantidconfig --- frontend/mgramseva/lib/main.dart | 6 +++++- frontend/mgramseva/pubspec.yaml | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/mgramseva/lib/main.dart b/frontend/mgramseva/lib/main.dart index 2172616bb..eb56c9265 100644 --- a/frontend/mgramseva/lib/main.dart +++ b/frontend/mgramseva/lib/main.dart @@ -73,7 +73,11 @@ void main() { }; WidgetsFlutterBinding.ensureInitialized(); - await dotenv.load(); + if(kIsWeb){ + await dotenv.load(); + }else{ + await dotenv.load(fileName: 'assets/.env'); + } if(kIsWeb){ await Firebase.initializeApp(options: FirebaseConfigurations.firebaseOptions); }else{ diff --git a/frontend/mgramseva/pubspec.yaml b/frontend/mgramseva/pubspec.yaml index fed019f24..78762ed08 100644 --- a/frontend/mgramseva/pubspec.yaml +++ b/frontend/mgramseva/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.2.17+33 +version: 1.2.18+34 environment: sdk: ">=2.12.0 <4.0.0" @@ -112,7 +112,7 @@ flutter: - assets/png/ - assets/icons/ - assets/svg/ - - assets/ + - assets/.env # To add assets to your application, add an assets section, like this: # - images/a_dot_ham.jpeg From d10671a848f88d9d8e58bb5bdd7aad0d058f8568 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Tue, 5 Dec 2023 18:20:31 +0530 Subject: [PATCH 15/70] stateleveltenantidconfig --- frontend/mgramseva/lib/main.dart | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/frontend/mgramseva/lib/main.dart b/frontend/mgramseva/lib/main.dart index eb56c9265..ef1617523 100644 --- a/frontend/mgramseva/lib/main.dart +++ b/frontend/mgramseva/lib/main.dart @@ -73,11 +73,7 @@ void main() { }; WidgetsFlutterBinding.ensureInitialized(); - if(kIsWeb){ - await dotenv.load(); - }else{ - await dotenv.load(fileName: 'assets/.env'); - } + await dotenv.load(fileName: 'assets/.env'); if(kIsWeb){ await Firebase.initializeApp(options: FirebaseConfigurations.firebaseOptions); }else{ From 8a882ddd6a0b88fac529360bc3b77f1bde237469 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Wed, 6 Dec 2023 00:37:08 +0530 Subject: [PATCH 16/70] thermal printer fixes --- .../consumer_bill_payment.dart | 13 +- .../providers/collect_payment_provider.dart | 14 +- .../mgramseva/lib/utils/print_bluetooth.dart | 130 ++++++++++++++++++ frontend/mgramseva/pubspec.yaml | 3 +- 4 files changed, 144 insertions(+), 16 deletions(-) create mode 100644 frontend/mgramseva/lib/utils/print_bluetooth.dart diff --git a/frontend/mgramseva/lib/components/house_connection_and_bill/consumer_bill_payment.dart b/frontend/mgramseva/lib/components/house_connection_and_bill/consumer_bill_payment.dart index c8b14b349..5a4334602 100644 --- a/frontend/mgramseva/lib/components/house_connection_and_bill/consumer_bill_payment.dart +++ b/frontend/mgramseva/lib/components/house_connection_and_bill/consumer_bill_payment.dart @@ -1,5 +1,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:image/image.dart' as img; import 'package:mgramseva/model/bill/bill_payments.dart'; import 'package:mgramseva/model/connection/water_connection.dart'; import 'package:mgramseva/providers/bill_payments_provider.dart'; @@ -11,7 +12,7 @@ import 'package:mgramseva/utils/common_styles.dart'; import 'package:mgramseva/utils/date_formats.dart'; import 'package:mgramseva/utils/global_variables.dart'; import 'package:mgramseva/utils/loaders.dart'; -import 'package:mgramseva/widgets/bluetooth_printer.dart'; +import 'package:mgramseva/utils/print_bluetooth.dart'; import 'package:mgramseva/widgets/list_label_text.dart'; import 'package:number_to_words/number_to_words.dart'; import 'package:provider/provider.dart'; @@ -55,7 +56,7 @@ class ConsumerBillPaymentsState extends State { style: TextStyle( color: Colors.black, fontSize: kIsWeb ? 5 : 9, - fontWeight: FontWeight.w500))), + fontWeight: FontWeight.w400))), SizedBox( width: 5, ), @@ -70,7 +71,7 @@ class ConsumerBillPaymentsState extends State { style: TextStyle( color: Colors.black, fontSize: kIsWeb ? 5 : 9, - fontWeight: FontWeight.w500), + fontWeight: FontWeight.w400), )), ], ); @@ -261,10 +262,8 @@ class ConsumerBillPaymentsState extends State { kIsWeb ? js.onButtonClick( value, stateProvider.stateInfo!.stateLogoURL.toString()) - :showDialog( - context: context, - builder: (_) => BluetoothPrinterScreen(imageData: value) - ) + : PrintBluetooth.printTicket( + value, navigatorKey.currentContext!) }); return null; } diff --git a/frontend/mgramseva/lib/providers/collect_payment_provider.dart b/frontend/mgramseva/lib/providers/collect_payment_provider.dart index 6c1781a08..1661c785c 100644 --- a/frontend/mgramseva/lib/providers/collect_payment_provider.dart +++ b/frontend/mgramseva/lib/providers/collect_payment_provider.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:image/image.dart' as img; import 'package:mgramseva/model/bill/bill_payments.dart'; import 'package:mgramseva/model/bill/billing.dart'; import 'package:mgramseva/model/common/fetch_bill.dart'; @@ -25,6 +26,7 @@ import 'package:mgramseva/utils/global_variables.dart'; import 'package:mgramseva/utils/loaders.dart'; import 'package:mgramseva/utils/models.dart'; import 'package:mgramseva/utils/notifiers.dart'; +import 'package:mgramseva/utils/print_bluetooth.dart'; import 'package:mgramseva/widgets/common_success_page.dart'; import 'package:number_to_words/number_to_words.dart'; import 'package:provider/provider.dart'; @@ -34,7 +36,6 @@ import '../components/house_connection_and_bill/js_connnector.dart' as js; import '../env/app_config.dart'; import '../model/localization/language.dart'; import '../repository/core_repo.dart'; -import '../widgets/bluetooth_printer.dart'; import 'common_provider.dart'; class CollectPaymentProvider with ChangeNotifier { @@ -217,7 +218,7 @@ class CollectPaymentProvider with ChangeNotifier { style: TextStyle( color: Colors.black, fontSize: kIsWeb ? 5 : 9, - fontWeight: FontWeight.w500))), + fontWeight: FontWeight.w400))), SizedBox( width: 5, ), @@ -233,7 +234,7 @@ class CollectPaymentProvider with ChangeNotifier { style: TextStyle( color: Colors.black, fontSize: kIsWeb ? 5 : 9, - fontWeight: FontWeight.w500), + fontWeight: FontWeight.w400), )), ], ); @@ -277,6 +278,7 @@ class CollectPaymentProvider with ChangeNotifier { : Image( width: 40, height: 40, + color: Colors.black, image: NetworkImage(stateProvider .stateInfo!.stateLogoURL .toString())), @@ -428,10 +430,8 @@ class CollectPaymentProvider with ChangeNotifier { kIsWeb ? js.onButtonClick( value, stateProvider.stateInfo!.stateLogoURL.toString()) - :showDialog( - context: navigatorKey.currentContext!, - builder: (_) => BluetoothPrinterScreen(imageData: value) - ) + : PrintBluetooth.printTicket( + value, navigatorKey.currentContext!) }); return null; } diff --git a/frontend/mgramseva/lib/utils/print_bluetooth.dart b/frontend/mgramseva/lib/utils/print_bluetooth.dart new file mode 100644 index 000000000..a04ea1661 --- /dev/null +++ b/frontend/mgramseva/lib/utils/print_bluetooth.dart @@ -0,0 +1,130 @@ +import 'dart:typed_data'; + +import 'package:mgramseva/utils/printer/image_utils.dart'; + +import 'package:flutter/material.dart'; +import 'package:mgramseva/utils/constants/i18_key_constants.dart'; +import 'package:nearby_connections/nearby_connections.dart'; +import 'package:image/image.dart' as img; +import 'package:permission_handler/permission_handler.dart'; +import 'package:print_bluetooth_thermal/print_bluetooth_thermal.dart'; +import 'package:thermal_printer/esc_pos_utils_platform/esc_pos_utils_platform.dart'; + +import 'localization/application_localizations.dart'; + +class PrintBluetooth { + static bool connected = false; + + static setConnect(String mac, value, context) async { + if (connected) { + PrintBluetooth.printTicket(value, context); + Navigator.of(context).pop(); + } else { + final result = + await PrintBluetoothThermal.connect(macPrinterAddress: mac); + + if (result) { + connected = true; + PrintBluetooth.printTicket(value, context); + Navigator.of(context).pop(); + } + } + } + + static Future showMyDialog(context, value) async { + connected = false; + Widget setupAlertDialogContainer( + List availableBluetoothDevices, context) { + return Container( + height: 300.0, // Change as per your requirement + width: 300.0, + child: ListView.builder( + shrinkWrap: true, + itemCount: availableBluetoothDevices.length > 0 + ? availableBluetoothDevices.length + : 0, + itemBuilder: (context, index) { + return ListTile( + onTap: () { + String select = availableBluetoothDevices[index].macAdress; + setConnect(select, value, context); + }, + title: Text('${availableBluetoothDevices[index].name}'), + subtitle: Text(ApplicationLocalizations.of(context) + .translate(i18.consumerReciepts.CLICK_TO_CONNECT)), + ); + }, + ), + ); + } + + final List availableBluetoothDevices = + await PrintBluetoothThermal.pairedBluetooths; + return showDialog( + context: context, + barrierDismissible: false, // user must tap button! + builder: (BuildContext context) { + return AlertDialog( + title: Text(ApplicationLocalizations.of(context) + .translate(i18.consumerReciepts.CONNECT_TO_DEVICE)), + content: + setupAlertDialogContainer(availableBluetoothDevices, context), + actions: [ + TextButton( + child: Text(ApplicationLocalizations.of(context) + .translate(i18.consumerReciepts.CLOSE)), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } + + static Future printTicket(value, context) async { + bool? isPermissionGranted = + await PrintBluetoothThermal.isPermissionBluetoothGranted; + print(isPermissionGranted); + if (!isPermissionGranted) { + await Permission.bluetooth.request(); + await Permission.bluetoothScan.request(); + await Permission.location.request(); + await Permission.bluetoothConnect.request(); + } + bool? isConnected = await PrintBluetoothThermal.connectionStatus; + if (isConnected) { + List bytes = await getTicket(value); + final result = await PrintBluetoothThermal.writeBytes(bytes); + } else { + PrintBluetooth.showMyDialog(context, value); + print(ApplicationLocalizations.of(context) + .translate(i18.consumerReciepts.CONNECTION_NOT_ESTABLISHED)); + } + } + + static Future> getTicket(value) async { + + List bytes = []; + CapabilityProfile profile = await CapabilityProfile.load(); + final generator = Generator(PaperSize.mm58, profile); + final Uint8List imageBytes = value; + final decodedImage = img.decodeImage(imageBytes)!; + img.Image thumbnail = img.copyResize(decodedImage,width: PaperSize.mm58.width,maintainAspect: false,); + // creates a copy of the original image with set dimensions + img.Image originalImg = img.copyResize(decodedImage, width: PaperSize.mm58.width,maintainAspect: false, ); + // fills the original image with a white background + img.fill(originalImg, color: img.ColorRgb8(255, 255, 255)); + // var padding = (originalImg.width - thumbnail.width) / 2; + // + // //insert the image inside the frame and center it + drawImage(originalImg, thumbnail, dstX: 0); + // ticket.feed(2); + bytes += generator.feed(1); + bytes += generator.imageRaster(originalImg, align: PosAlign.center); + bytes += generator.feed(1); + bytes += generator.cut(); + return bytes; + } +} diff --git a/frontend/mgramseva/pubspec.yaml b/frontend/mgramseva/pubspec.yaml index 78762ed08..9a1a67d36 100644 --- a/frontend/mgramseva/pubspec.yaml +++ b/frontend/mgramseva/pubspec.yaml @@ -59,7 +59,6 @@ dependencies: image_picker: ^1.0.4 flutter_focus_watcher: ^2.0.0 path: ^1.8.0 - esc_pos_utils_plus: ^2.0.2 new_version_plus: ^0.0.11 pdf: ^3.8.1 flutter_share_me: ^1.3.0 @@ -73,7 +72,7 @@ dependencies: package_info_plus: ^4.0.2 open_filex: ^4.3.4 syncfusion_flutter_xlsio: ^23.2.4 - print_bluetooth_thermal: ^1.0.5 + print_bluetooth_thermal: ^1.0.9 nearby_connections: ^4.0.1 dropdown_search: ^5.0.6 From 2280b3bb6f6a9f4234e41406f3e2862cbf29ce01 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Thu, 7 Dec 2023 08:50:58 +0530 Subject: [PATCH 17/70] PFM-4081 --- .../bill_generation_details_provider.dart | 8 +++- .../household_register_provider.dart | 43 +++++++++---------- .../lib/providers/reports_provider.dart | 3 +- .../screeens/generate_bill/generate_bill.dart | 10 ++++- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/frontend/mgramseva/lib/providers/bill_generation_details_provider.dart b/frontend/mgramseva/lib/providers/bill_generation_details_provider.dart index dc322ad4d..17c2d887e 100644 --- a/frontend/mgramseva/lib/providers/bill_generation_details_provider.dart +++ b/frontend/mgramseva/lib/providers/bill_generation_details_provider.dart @@ -176,7 +176,13 @@ class BillGenerationProvider with ChangeNotifier { billGenerateDetails.billYear = selectedBillYear; notifyListeners(); } - + void clearBillYear() { + selectedBillYear = null; + billGenerateDetails.billYear = null; + selectedBillCycle = null; + billGenerateDetails.billCycle = null; + notifyListeners(); + } void onChangeOfBillCycle(cycle) { var val = cycle['code']; DateTime result = DateTime.parse(val.toString()); diff --git a/frontend/mgramseva/lib/providers/household_register_provider.dart b/frontend/mgramseva/lib/providers/household_register_provider.dart index 5ad6b715e..abdc982d1 100644 --- a/frontend/mgramseva/lib/providers/household_register_provider.dart +++ b/frontend/mgramseva/lib/providers/household_register_provider.dart @@ -323,7 +323,7 @@ class HouseholdRegisterProvider with ChangeNotifier { '${fatherName ?? 'NA'}', ), TableData( - '${connection.connectionHolders?.first.mobileNumber ?? 'NA'}', + maskMobileNumber('${connection.connectionHolders?.first.mobileNumber ?? 'NA'}'), ), TableData( '${connection.oldConnectionNo ?? 'NA'}', @@ -430,6 +430,18 @@ class HouseholdRegisterProvider with ChangeNotifier { fetchHouseholdDetails( context, localLimit ?? limit, localOffSet ?? 1, isSearch); } + String maskMobileNumber(String mobileNumber) { + if (mobileNumber.length != 10) { + // Check if the mobile number has the expected length + return mobileNumber; + } + + // Mask the mobile number + String maskedNumber = + mobileNumber.substring(0, 2) + 'xxxx' + mobileNumber.substring(6); + + return maskedNumber; + } void createExcelOrPdfForAllConnections(BuildContext context, bool isDownload, {bool isExcelDownload = false}) async { @@ -551,28 +563,13 @@ class HouseholdRegisterProvider with ChangeNotifier { var pdfTableData = waterConnectionsDetails.waterConnection ?.map>((connection) => [ - '${connection.connectionNo ?? 'NA'}', - '${connection.connectionHolders?.first.name ?? 'NA'}', - '${ApplicationLocalizations.of(context).translate(connection.connectionHolders?.first.gender ?? 'NA')}', - '${connection.connectionHolders?.first.fatherOrHusbandName ?? 'NA'}', - '${connection.connectionHolders?.first.mobileNumber ?? 'NA'}', - '${ApplicationLocalizations.of(context).translate(connection.additionalDetails?.category ?? 'NA')}', - '${ApplicationLocalizations.of(context).translate(connection.additionalDetails?.subCategory ?? 'NA')}', - '${ApplicationLocalizations.of(context).translate(connection.additionalDetails?.propertyType ?? 'NA')}', - '${ApplicationLocalizations.of(context).translate(connection.connectionType ?? 'NA')}', - '${connection.connectionType == 'Metered' ?connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? 'NA')) :'NA' :'NA' }', - '${connection.connectionType == 'Metered' ? connection.meterId :'NA' }', - '${connection.connectionType == 'Metered' ? connection.additionalDetails?.meterReading :'NA' }', - '${connection.arrears != null ? '₹ ${connection.arrears}' : '-'}', - '${connection.penalty != null ? '₹ ${connection.penalty}' : '-'}', - '${connection.advance != null ? '₹ ${connection.advance}' : '-'}', - '${connection.additionalDetails?.totalAmount != null ? '₹ ${connection.additionalDetails?.totalAmount}' : '-'}', - '${connection.additionalDetails?.collectionAmount != null ? '₹ ${connection.additionalDetails?.collectionAmount}' : '-'}', - '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-' : '-'}', + '${connection.connectionNo ?? ''} ${connection.connectionType == 'Metered' ? '- M' : ''}', + '${connection.connectionHolders?.first.name ?? ''}', + '${connection.connectionHolders?.first.fatherOrHusbandName ?? ''}', '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '-' : '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '-'}', - '${connection.additionalDetails?.appCreatedDate != null ? DateFormats.timeStampToDate(connection.additionalDetails?.appCreatedDate?.toInt()) : '-'}', - '${connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? '')) : '-'}', + '${connection.additionalDetails?.collectionPendingAmount != null ? double.parse(connection.additionalDetails?.collectionPendingAmount ?? '') < 0.0 ? '₹ ${double.parse(connection.additionalDetails?.collectionPendingAmount ?? '0').abs()}' : '₹ 0' : '₹ 0'}', '${connection.status.toString() == Constants.CONNECTION_STATUS.last ? 'Y' : 'N'}', + '${connection.additionalDetails?.lastDemandGeneratedDate != null && connection.additionalDetails?.lastDemandGeneratedDate != '' ? DateFormats.timeStampToDate(int.parse(connection.additionalDetails?.lastDemandGeneratedDate ?? '')) : '-'}' ]) .toList() ?? []; @@ -584,7 +581,7 @@ class HouseholdRegisterProvider with ChangeNotifier { '${connection.connectionHolders?.first.name ?? 'NA'}', '${ApplicationLocalizations.of(context).translate(connection.connectionHolders?.first.gender ?? 'NA')}', '${connection.connectionHolders?.first.fatherOrHusbandName ?? 'NA'}', - '${connection.connectionHolders?.first.mobileNumber ?? 'NA'}', + maskMobileNumber('${connection.connectionHolders?.first.mobileNumber ?? 'NA'}'), '${connection.oldConnectionNo ?? 'NA'}', '${connection.connectionNo ?? 'NA'}', '${ApplicationLocalizations.of(context).translate(connection.additionalDetails?.category ?? 'NA')}', @@ -617,7 +614,7 @@ class HouseholdRegisterProvider with ChangeNotifier { excelTableData) : await HouseholdPdfCreator( context, - pdfHeaderList.where((e) => e!=i18.consumer.OLD_CONNECTION_ID) + headerList.where((e) => e!=i18.consumer.OLD_CONNECTION_ID) .map((e) => '${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(e)}') .toList(), diff --git a/frontend/mgramseva/lib/providers/reports_provider.dart b/frontend/mgramseva/lib/providers/reports_provider.dart index 12bfb02c2..dfa75bfd3 100644 --- a/frontend/mgramseva/lib/providers/reports_provider.dart +++ b/frontend/mgramseva/lib/providers/reports_provider.dart @@ -17,7 +17,8 @@ import '../utils/constants.dart'; import 'package:mgramseva/utils/constants/i18_key_constants.dart'; import '../utils/date_formats.dart'; import '../utils/error_logging.dart'; -import 'package:mgramseva/utils/excel_download/save_file_mobile.dart'; +import 'package:mgramseva/utils/excel_download/save_file_mobile.dart' + if (dart.library.html) 'package:mgramseva/utils/excel_download/save_file_web.dart'; import '../utils/global_variables.dart'; import '../utils/localization/application_localizations.dart'; import '../utils/models.dart'; diff --git a/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart b/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart index 89e13efb6..1bbadd70e 100644 --- a/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart +++ b/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart @@ -40,6 +40,11 @@ class _GenerateBillState extends State { WidgetsBinding.instance.addPostFrameCallback((_) => afterViewBuild()); super.initState(); } + @override + void dispose() { + Provider.of(context, listen: false).clearBillYear(); + super.dispose(); + } afterViewBuild() { Provider.of(context, listen: false) @@ -64,7 +69,10 @@ class _GenerateBillState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - HomeBack(), + HomeBack(callback: (){ + Provider.of(context, listen: false).clearBillYear(); + Navigator.pop(context); + },), Container( width: MediaQuery.of(context).size.width, child: Card( From b3beaf48813d6faab5f44a179cb7e45ce8eba3b3 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Thu, 7 Dec 2023 08:51:38 +0530 Subject: [PATCH 18/70] bumped app version --- frontend/mgramseva/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/mgramseva/package.json b/frontend/mgramseva/package.json index d2284639b..7734c7a85 100644 --- a/frontend/mgramseva/package.json +++ b/frontend/mgramseva/package.json @@ -1,5 +1,5 @@ { "name": "mgramseva", - "version": "1.2.17", + "version": "1.2.18", "license": "egov" } From 5e1e0f162dd02a12a61ce632ef421de5ffd3ce28 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Thu, 7 Dec 2023 14:49:00 +0530 Subject: [PATCH 19/70] ios changes for force app update --- frontend/mgramseva/ios/Podfile.lock | 34 +++++---- .../ios/Runner.xcodeproj/project.pbxproj | 12 ++-- frontend/mgramseva/lib/main.dart | 2 +- .../lib/model/localization/language.dart | 13 +++- .../mgramseva/lib/utils/common_methods.dart | 71 +++++++++++-------- frontend/mgramseva/pubspec.lock | 20 +++--- 6 files changed, 90 insertions(+), 62 deletions(-) diff --git a/frontend/mgramseva/ios/Podfile.lock b/frontend/mgramseva/ios/Podfile.lock index 42efbb45a..fdae7fc54 100644 --- a/frontend/mgramseva/ios/Podfile.lock +++ b/frontend/mgramseva/ios/Podfile.lock @@ -1,6 +1,4 @@ PODS: - - bluetooth_thermal_printer (0.0.1): - - Flutter - charset_converter (0.0.1): - Flutter - DKImagePickerController/Core (4.3.4): @@ -95,7 +93,7 @@ PODS: - Flutter - flutter_keyboard_visibility (0.0.1): - Flutter - - flutter_secure_storage (3.3.1): + - flutter_secure_storage (6.0.0): - Flutter - flutter_share_me (0.0.1): - FBSDKCoreKit (~> 14.0.0) @@ -150,6 +148,8 @@ PODS: - nanopb/encode (= 2.30909.1) - nanopb/decode (2.30909.1) - nanopb/encode (2.30909.1) + - network_info_plus (0.0.1): + - Flutter - open_filex (0.0.2): - Flutter - package_info_plus (0.4.5): @@ -157,7 +157,7 @@ PODS: - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - - "permission_handler (5.1.0+2)": + - permission_handler_apple (9.1.1): - Flutter - print_bluetooth_thermal (0.0.1): - Flutter @@ -168,11 +168,12 @@ PODS: - SDWebImage/Core (= 5.18.5) - SDWebImage/Core (5.18.5) - SwiftyGif (5.4.4) + - thermal_printer (1.0.0): + - Flutter - url_launcher_ios (0.0.1): - Flutter DEPENDENCIES: - - bluetooth_thermal_printer (from `.symlinks/plugins/bluetooth_thermal_printer/ios`) - charset_converter (from `.symlinks/plugins/charset_converter/ios`) - file_picker (from `.symlinks/plugins/file_picker/ios`) - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) @@ -184,12 +185,14 @@ DEPENDENCIES: - flutter_share_me (from `.symlinks/plugins/flutter_share_me/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - integration_test (from `.symlinks/plugins/integration_test/ios`) + - network_info_plus (from `.symlinks/plugins/network_info_plus/ios`) - open_filex (from `.symlinks/plugins/open_filex/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - - permission_handler (from `.symlinks/plugins/permission_handler/ios`) + - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - print_bluetooth_thermal (from `.symlinks/plugins/print_bluetooth_thermal/ios`) - printing (from `.symlinks/plugins/printing/ios`) + - thermal_printer (from `.symlinks/plugins/thermal_printer/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) SPEC REPOS: @@ -214,8 +217,6 @@ SPEC REPOS: - SwiftyGif EXTERNAL SOURCES: - bluetooth_thermal_printer: - :path: ".symlinks/plugins/bluetooth_thermal_printer/ios" charset_converter: :path: ".symlinks/plugins/charset_converter/ios" file_picker: @@ -238,23 +239,26 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/image_picker_ios/ios" integration_test: :path: ".symlinks/plugins/integration_test/ios" + network_info_plus: + :path: ".symlinks/plugins/network_info_plus/ios" open_filex: :path: ".symlinks/plugins/open_filex/ios" package_info_plus: :path: ".symlinks/plugins/package_info_plus/ios" path_provider_foundation: :path: ".symlinks/plugins/path_provider_foundation/darwin" - permission_handler: - :path: ".symlinks/plugins/permission_handler/ios" + permission_handler_apple: + :path: ".symlinks/plugins/permission_handler_apple/ios" print_bluetooth_thermal: :path: ".symlinks/plugins/print_bluetooth_thermal/ios" printing: :path: ".symlinks/plugins/printing/ios" + thermal_printer: + :path: ".symlinks/plugins/thermal_printer/ios" url_launcher_ios: :path: ".symlinks/plugins/url_launcher_ios/ios" SPEC CHECKSUMS: - bluetooth_thermal_printer: 65b8304b3a1d8c67d466642a28cc2b4984409346 charset_converter: 215c7b04932ec2b9ba43be96a9bc34afed3e5322 DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 @@ -263,7 +267,7 @@ SPEC CHECKSUMS: FBSDKCoreKit_Basics: 1ff46a12e80f0b66e6c00e1ef32d6a5b5b9008a5 FBSDKLoginKit: dbe86ef42ab142f3bd0f1c904a21bb33f31c5569 FBSDKShareKit: 2f6a6a1445cc1b8ea0f733e60d02d2f7c4ebf8be - file_picker: ce3938a0df3cc1ef404671531facef740d03f920 + file_picker: 15fd9539e4eb735dc54bae8c0534a7a9511a03de Firebase: 414ad272f8d02dfbf12662a9d43f4bba9bec2a06 firebase_analytics: 3e5dba777bb51d1e0358b5a37adefa69746a94bd firebase_core: 29d66baf806970cda37c93621b27cd369b27db1b @@ -274,22 +278,24 @@ SPEC CHECKSUMS: Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 flutter_downloader: b7301ae057deadd4b1650dc7c05375f10ff12c39 flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069 - flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec + flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be flutter_share_me: 1fb559741e0dff56a9d2bdeaf4d966b0b47449ae GoogleAppMeasurement: 70ce9aa438cff1cfb31ea3e660bcc67734cb716e GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5 integration_test: 13825b8a9334a850581300559b8839134b124670 nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 + network_info_plus: 6d0c3eb8367b8164fa3fb0c19875e3f59d49697f open_filex: 6e26e659846ec990262224a12ef1c528bb4edbe4 package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 - permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0 + permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6 print_bluetooth_thermal: 54a9ba9436479dd633d18f393669ee793ee498fa printing: 233e1b73bd1f4a05615548e9b5a324c98588640b PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 SDWebImage: 7ac2b7ddc5e8484c79aa90fc4e30b149d6a2c88f SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f + thermal_printer: 1885c43c3f17b912ca2c29e7f44822dddc2c24b9 url_launcher_ios: bf5ce03e0e2088bad9cc378ea97fa0ed5b49673b PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 diff --git a/frontend/mgramseva/ios/Runner.xcodeproj/project.pbxproj b/frontend/mgramseva/ios/Runner.xcodeproj/project.pbxproj index 399e9fb20..3ca8421fc 100644 --- a/frontend/mgramseva/ios/Runner.xcodeproj/project.pbxproj +++ b/frontend/mgramseva/ios/Runner.xcodeproj/project.pbxproj @@ -368,7 +368,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 35; DEVELOPMENT_TEAM = JP48C27R32; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -377,7 +377,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.16; + MARKETING_VERSION = 1.2.18; PRODUCT_BUNDLE_IDENTIFIER = com.dwss.mgramseva; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -504,7 +504,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 35; DEVELOPMENT_TEAM = JP48C27R32; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -513,7 +513,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.16; + MARKETING_VERSION = 1.2.18; PRODUCT_BUNDLE_IDENTIFIER = com.dwss.mgramseva; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -532,7 +532,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 35; DEVELOPMENT_TEAM = JP48C27R32; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -541,7 +541,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.16; + MARKETING_VERSION = 1.2.18; PRODUCT_BUNDLE_IDENTIFIER = com.dwss.mgramseva; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/frontend/mgramseva/lib/main.dart b/frontend/mgramseva/lib/main.dart index ef1617523..1221a7410 100644 --- a/frontend/mgramseva/lib/main.dart +++ b/frontend/mgramseva/lib/main.dart @@ -287,7 +287,7 @@ class _LandingPageState extends State { await commonProvider.getAppVersionDetails(); if (!kIsWeb) CommonMethods() - .checkVersion(context, commonProvider.appVersion!.latestAppVersion); + .checkVersion(context, commonProvider.appVersion!); } @override diff --git a/frontend/mgramseva/lib/model/localization/language.dart b/frontend/mgramseva/lib/model/localization/language.dart index 6884e5804..588dd9765 100644 --- a/frontend/mgramseva/lib/model/localization/language.dart +++ b/frontend/mgramseva/lib/model/localization/language.dart @@ -29,7 +29,8 @@ class LanguageList { return data; } } -class PSPCLIntegration{ + +class PSPCLIntegration { List? accountNumberGpMapping; PSPCLIntegration({this.accountNumberGpMapping}); @@ -52,6 +53,7 @@ class PSPCLIntegration{ return data; } } + class AccountNumberGpMapping { String? accountNumber; String? departmentEntityName; @@ -59,8 +61,8 @@ class AccountNumberGpMapping { AccountNumberGpMapping( {this.accountNumber, - this.departmentEntityName, - this.departmentEntityCode}); + this.departmentEntityName, + this.departmentEntityCode}); AccountNumberGpMapping.fromJson(Map json) { accountNumber = json['accountNumber']; @@ -76,6 +78,7 @@ class AccountNumberGpMapping { return data; } } + class MdmsRes { CommonMasters? commonMasters; BillingService? billingService; @@ -166,19 +169,23 @@ class CommonMasters { class AppVersion { String? latestAppVersion; + String? latestAppVersionIos; // List? localizationModules; AppVersion({ this.latestAppVersion, + this.latestAppVersionIos }); AppVersion.fromJson(Map json) { latestAppVersion = json['latestAppVersion']; + latestAppVersionIos = json['latestAppVersionIos']; } Map toJson() { final Map data = new Map(); data['latestAppVersion'] = this.latestAppVersion; + data['latestAppVersionIos'] = this.latestAppVersionIos; return data; } diff --git a/frontend/mgramseva/lib/utils/common_methods.dart b/frontend/mgramseva/lib/utils/common_methods.dart index 95c94184d..44aea98ff 100644 --- a/frontend/mgramseva/lib/utils/common_methods.dart +++ b/frontend/mgramseva/lib/utils/common_methods.dart @@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:http_parser/http_parser.dart'; +import 'package:mgramseva/model/localization/language.dart'; import 'package:mgramseva/model/mdms/tax_period.dart'; import 'package:mgramseva/providers/common_provider.dart'; import 'package:mgramseva/utils/error_logging.dart'; @@ -57,56 +58,63 @@ class CommonMethods { * * */ - static List getPastMonthUntilFinancialYTD(DatePeriod ytd,{bool showCurrentMonth = false}) { + static List getPastMonthUntilFinancialYTD(DatePeriod ytd, + {bool showCurrentMonth = false}) { var monthList = []; final currentTime = DateTime.now(); - if(currentTime.year < ytd.startDate.year){ + if (currentTime.year < ytd.startDate.year) { return []; } if (currentTime.year == ytd.startDate.year) { //when current year is same as start year of financial year - for (int i = ytd.startDate.month; i <= (showCurrentMonth?currentTime.month:currentTime.month-1); i++) { + for (int i = ytd.startDate.month; + i <= (showCurrentMonth ? currentTime.month : currentTime.month - 1); + i++) { monthList.add(DateTime(currentTime.year, i)); } - } else if(currentTime.year == ytd.endDate.year){ + } else if (currentTime.year == ytd.endDate.year) { //when current year is same as end year of financial year for (int i = ytd.startDate.month; i <= 12; i++) { monthList.add(DateTime(ytd.startDate.year, i)); } for (int i = 1; - i <= (currentTime.month <= ytd.endDate.month ? showCurrentMonth?currentTime.month:currentTime.month-1: ytd.endDate.month); - /* + i <= + (currentTime.month <= ytd.endDate.month + ? showCurrentMonth + ? currentTime.month + : currentTime.month - 1 + : ytd.endDate.month); + /* * if current month is less than or equal to end month of financial year * we are using months less than current month and if it is more than * end month of financial year we are using till end month of financial * year */ - i++) { + i++) { monthList.add(DateTime(ytd.endDate.year, i)); } - }else{ + } else { for (int i = ytd.startDate.month; i <= 12; i++) { monthList.add(DateTime(ytd.startDate.year, i)); } - for (int i = 1; - i <= ytd.endDate.month; - i++) { - monthList.add(DateTime(ytd.endDate.year , i)); + for (int i = 1; i <= ytd.endDate.month; i++) { + monthList.add(DateTime(ytd.endDate.year, i)); } } var list = monthList .map((e) => DatePeriod(DateTime(e.year, e.month, 1), - DateTime(e.year, e.month + 1, 0, 23, 59, 59, 999), DateType.MONTH)) + DateTime(e.year, e.month + 1, 0, 23, 59, 59, 999), DateType.MONTH)) .toList() .reversed .toList(); return list; } - static List getPastMonthIncludingCurrentMonthUntilFinancialYTD(DatePeriod ytd) { + static List getPastMonthIncludingCurrentMonthUntilFinancialYTD( + DatePeriod ytd) { var monthList = []; final currentTime = DateTime.now(); - if(currentTime.year < ytd.startDate.year){ + if (currentTime.year < ytd.startDate.year) { return []; } if (currentTime.year == ytd.startDate.year) { @@ -114,35 +122,36 @@ class CommonMethods { for (int i = ytd.startDate.month; i <= currentTime.month; i++) { monthList.add(DateTime(currentTime.year, i)); } - } else if(currentTime.year == ytd.endDate.year){ + } else if (currentTime.year == ytd.endDate.year) { //when current year is same as end year of financial year for (int i = ytd.startDate.month; i <= 12; i++) { monthList.add(DateTime(ytd.startDate.year, i)); } for (int i = 1; - i <= (currentTime.month <= ytd.endDate.month ? currentTime.month: ytd.endDate.month); - /* + i <= + (currentTime.month <= ytd.endDate.month + ? currentTime.month + : ytd.endDate.month); + /* * if current month is less than or equal to end month of financial year * we are using months less than current month and if it is more than * end month of financial year we are using till end month of financial * year */ - i++) { + i++) { monthList.add(DateTime(ytd.endDate.year, i)); } - }else{ + } else { for (int i = ytd.startDate.month; i <= 12; i++) { monthList.add(DateTime(ytd.startDate.year, i)); } - for (int i = 1; - i <= ytd.endDate.month; - i++) { - monthList.add(DateTime(ytd.endDate.year , i)); + for (int i = 1; i <= ytd.endDate.month; i++) { + monthList.add(DateTime(ytd.endDate.year, i)); } } var list = monthList .map((e) => DatePeriod(DateTime(e.year, e.month, 1), - DateTime(e.year, e.month + 1, 0, 23, 59, 59, 999), DateType.MONTH)) + DateTime(e.year, e.month + 1, 0, 23, 59, 59, 999), DateType.MONTH)) .toList() .reversed .toList(); @@ -178,7 +187,9 @@ class CommonMethods { } return yearWithMonths; } - static List getFinancialYearListWithCurrentMonthForCurrentYear([int count = 5]) { + + static List + getFinancialYearListWithCurrentMonthForCurrentYear([int count = 5]) { var yearWithMonths = []; if (DateTime.now().month >= 4) { @@ -283,10 +294,14 @@ class CommonMethods { } } - void checkVersion(BuildContext context, String? latestAppVersion) async { + void checkVersion(BuildContext context, AppVersion appVersion) async { try { + String? latestAppVersion = Platform.isIOS + ? appVersion.latestAppVersionIos + : appVersion.latestAppVersion; + print("app" + latestAppVersion!); if (latestAppVersion != null && !kIsWeb) { - if (int.parse(packageInfo!.version.split('.').join("").toString()) < + if (int.parse(packageInfo!.version.split('.').join("").toString()) > int.parse(latestAppVersion.split('.').join("").toString())) { late Uri uri; diff --git a/frontend/mgramseva/pubspec.lock b/frontend/mgramseva/pubspec.lock index a72f461ba..e744e5644 100644 --- a/frontend/mgramseva/pubspec.lock +++ b/frontend/mgramseva/pubspec.lock @@ -313,14 +313,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.1" - esc_pos_utils_plus: - dependency: "direct main" - description: - name: esc_pos_utils_plus - sha256: dca660e2bf5622c3b9bc54ce098128606a8942ff07f1e2d2f4c88e483df3fe74 - url: "https://pub.dev" - source: hosted - version: "2.0.2" fake_async: dependency: transitive description: @@ -454,6 +446,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.0" + flutter_dotenv: + dependency: "direct main" + description: + name: flutter_dotenv + sha256: "9357883bdd153ab78cbf9ffa07656e336b8bbb2b5a3ca596b0b27e119f7c7d77" + url: "https://pub.dev" + source: hosted + version: "5.1.0" flutter_downloader: dependency: "direct main" description: @@ -1373,10 +1373,10 @@ packages: dependency: "direct main" description: name: thermal_printer - sha256: "887ad5be1d3db42a2259fd0ad636fa6f873db30669fa7eaebcb57c446ff09344" + sha256: d04fd0ade194df0143bcef57af18cad59fa053be6e7102c5d341f378325c7508 url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.0.4" timing: dependency: transitive description: From 2a77665ac8fbe2f4ddd6d6cfca32204eff94797e Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Thu, 7 Dec 2023 14:49:32 +0530 Subject: [PATCH 20/70] ios --- frontend/mgramseva/lib/utils/common_methods.dart | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/frontend/mgramseva/lib/utils/common_methods.dart b/frontend/mgramseva/lib/utils/common_methods.dart index 44aea98ff..633b4d38f 100644 --- a/frontend/mgramseva/lib/utils/common_methods.dart +++ b/frontend/mgramseva/lib/utils/common_methods.dart @@ -296,12 +296,11 @@ class CommonMethods { void checkVersion(BuildContext context, AppVersion appVersion) async { try { - String? latestAppVersion = Platform.isIOS - ? appVersion.latestAppVersionIos - : appVersion.latestAppVersion; - print("app" + latestAppVersion!); + String? latestAppVersion = Platform.isAndroid + ? appVersion.latestAppVersion + : appVersion.latestAppVersionIos; if (latestAppVersion != null && !kIsWeb) { - if (int.parse(packageInfo!.version.split('.').join("").toString()) > + if (int.parse(packageInfo!.version.split('.').join("").toString()) < int.parse(latestAppVersion.split('.').join("").toString())) { late Uri uri; From fcf8f9516bc1857c7a89114d032b522a40b3fba1 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Wed, 13 Dec 2023 13:48:29 +0530 Subject: [PATCH 21/70] Removed Extra Navigator --- frontend/mgramseva/lib/providers/user_edit_profile_provider.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/mgramseva/lib/providers/user_edit_profile_provider.dart b/frontend/mgramseva/lib/providers/user_edit_profile_provider.dart index 723768a37..91a205bfd 100644 --- a/frontend/mgramseva/lib/providers/user_edit_profile_provider.dart +++ b/frontend/mgramseva/lib/providers/user_edit_profile_provider.dart @@ -35,7 +35,6 @@ class UserEditProfileProvider with ChangeNotifier { .emailId ..loginCredentials = Provider.of(context, listen: false).userDetails; } - Navigator.pop(context); Navigator.pop(context); } catch (e, s) { Navigator.pop(context); From 1861c1f7facd3e37fa0bd4c73dffbf8e5aaa7631 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Thu, 14 Dec 2023 13:08:59 +0530 Subject: [PATCH 22/70] horizontal padding in privacy --- .../mgramseva/lib/screeens/login/login.dart | 73 ++++++++++--------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/frontend/mgramseva/lib/screeens/login/login.dart b/frontend/mgramseva/lib/screeens/login/login.dart index 6c6be1b92..31e166449 100644 --- a/frontend/mgramseva/lib/screeens/login/login.dart +++ b/frontend/mgramseva/lib/screeens/login/login.dart @@ -130,45 +130,48 @@ class _LoginState extends State { color: Theme.of(context).primaryColor), ))), ), - RichText( - maxLines: 3, - text: TextSpan( - children: [ - TextSpan( - text: 'By continuing you accept our ', - style: TextStyle( - color: Colors.black - ) - ), - TextSpan( - text: 'Privacy Policy', - style: TextStyle( - color: Theme.of(context).primaryColor, // set link color - decoration: TextDecoration.underline, - ), - recognizer: TapGestureRecognizer() - ..onTap = () { - Navigator.pushNamed(context, Routes.PRIVACY_POLICY,arguments:true); - }, - ), - TextSpan( - text: ' and ', + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0 ), + child: RichText( + maxLines: 3, + text: TextSpan( + children: [ + TextSpan( + text: 'By continuing you accept our ', style: TextStyle( color: Colors.black ) - ), - TextSpan( - text: 'Terms of use', - style: TextStyle( - color: Theme.of(context).primaryColor, // set link color - decoration: TextDecoration.underline, ), - recognizer: TapGestureRecognizer() - ..onTap = () { - Navigator.pushNamed(context, Routes.TERMS_OF_USE,arguments:true); - }, - ), - ], + TextSpan( + text: 'Privacy Policy', + style: TextStyle( + color: Theme.of(context).primaryColor, // set link color + decoration: TextDecoration.underline, + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + Navigator.pushNamed(context, Routes.PRIVACY_POLICY,arguments:true); + }, + ), + TextSpan( + text: ' and ', + style: TextStyle( + color: Colors.black + ) + ), + TextSpan( + text: 'Terms of use', + style: TextStyle( + color: Theme.of(context).primaryColor, // set link color + decoration: TextDecoration.underline, + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + Navigator.pushNamed(context, Routes.TERMS_OF_USE,arguments:true); + }, + ), + ], + ), ), ), Padding( From e1d365d9723a3fb5967c3436952f7463d8e29fc3 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Thu, 14 Dec 2023 13:09:32 +0530 Subject: [PATCH 23/70] gen fix --- .../printer/esc_pos_utils_platform/src/generator.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/mgramseva/lib/utils/printer/esc_pos_utils_platform/src/generator.dart b/frontend/mgramseva/lib/utils/printer/esc_pos_utils_platform/src/generator.dart index 82662fb40..0f1b16fcc 100644 --- a/frontend/mgramseva/lib/utils/printer/esc_pos_utils_platform/src/generator.dart +++ b/frontend/mgramseva/lib/utils/printer/esc_pos_utils_platform/src/generator.dart @@ -137,7 +137,7 @@ class Generator { // Create a black bottom layer final biggerImage = img.copyResize(image, width: widthPx, height: heightPx); - img.fill(biggerImage, img.getColor(255,255, 255)); + img.fill(biggerImage, color:img.ColorRgb8(255,255, 255)); // Insert source image into bigger one drawImage(biggerImage, image, dstX: 0, dstY: 0); @@ -145,7 +145,7 @@ class Generator { final List> blobs = []; while (left < widthPx) { - final img.Image slice = img.copyCrop(biggerImage, left, 0, lineHeight, heightPx); + final img.Image slice = img.copyCrop(biggerImage, x:left, y:0, width:lineHeight, height: heightPx,); final Uint8List bytes = slice.getBytes(); // slice.getBytes(format: luminance) blobs.add(bytes); left += lineHeight; @@ -681,8 +681,8 @@ class Generator { const bool highDensityVertical = true; img.invert(image); - img.flip(image, img.Flip.horizontal); - final img.Image imageRotated = img.copyRotate(image, 270); + img.flip(image, direction: img.FlipDirection.horizontal); + final img.Image imageRotated = img.copyRotate(image, angle: 270); // ignore: dead_code const int lineHeight = highDensityVertical ? 3 : 1; From 5f3f114c196d4809900b9e2663c8e1e50a3f6f89 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Thu, 14 Dec 2023 15:31:35 +0530 Subject: [PATCH 24/70] cosmetic changes in ui PFM-5044 --- .../lib/screeens/home/home_card.dart | 3 +- .../lib/screeens/reports/bill_report.dart | 41 ++++-- .../screeens/reports/collection_report.dart | 41 ++++-- .../reports/inactive_consumer_report.dart | 134 +++++++++--------- frontend/mgramseva/lib/theme.dart | 2 +- .../utils/constants/i18_key_constants.dart | 1 + .../lib/widgets/confirmation_pop_up.dart | 2 +- 7 files changed, 127 insertions(+), 97 deletions(-) diff --git a/frontend/mgramseva/lib/screeens/home/home_card.dart b/frontend/mgramseva/lib/screeens/home/home_card.dart index 3b8c9e17e..78bc8a9ec 100644 --- a/frontend/mgramseva/lib/screeens/home/home_card.dart +++ b/frontend/mgramseva/lib/screeens/home/home_card.dart @@ -40,13 +40,14 @@ class _HomeCard extends State { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Icon(item.iconData, size: 35), + Icon(item.iconData, size: 30), Container( margin: EdgeInsets.all(10), child: Center( child: new Text( ApplicationLocalizations.of(context) .translate(item.label), + textScaleFactor: MediaQuery.of(context).size.width<400 ? 0.90 : 1, style: TextStyle( fontSize: 14, fontWeight: FontWeight.w400), textAlign: TextAlign.center, diff --git a/frontend/mgramseva/lib/screeens/reports/bill_report.dart b/frontend/mgramseva/lib/screeens/reports/bill_report.dart index f3f202f49..5359d4159 100644 --- a/frontend/mgramseva/lib/screeens/reports/bill_report.dart +++ b/frontend/mgramseva/lib/screeens/reports/bill_report.dart @@ -26,11 +26,13 @@ class _BillReport extends State @override Widget build(BuildContext context) { return LayoutBuilder(builder: (context, constraints) { + final isWideScreen = constraints.maxWidth > 700; + final containerMargin = isWideScreen + ? const EdgeInsets.only(top: 5.0, bottom: 5, right: 20, left: 10) + : const EdgeInsets.symmetric(vertical: 5.0, horizontal: 8); return Consumer(builder: (_, reportProvider, child) { return Container( - margin: constraints.maxWidth > 700 - ? const EdgeInsets.only(top: 5.0, bottom: 5, right: 20, left: 10) - : const EdgeInsets.only(top: 5.0, bottom: 5, right: 8, left: 8), + margin: containerMargin, child: Column( mainAxisAlignment: MainAxisAlignment.start, children: [ @@ -40,24 +42,33 @@ class _BillReport extends State Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row( - children: [ - Text("1. ", - style: TextStyle( - fontSize: 16, fontWeight: FontWeight.w700)), - Text( - ApplicationLocalizations.of(context) - .translate(i18.dashboard.BILL_REPORT), - style: TextStyle( - fontSize: 16, fontWeight: FontWeight.w700)), - ], + Container( + width: constraints.maxWidth > 344?constraints.maxWidth / 2.5:constraints.maxWidth / 3, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "1. ", + style: TextStyle(fontSize: 14, fontWeight: FontWeight.w700), + ), + Expanded( + child: Text( + ApplicationLocalizations.of(context) + .translate(i18.dashboard.BILL_REPORT), + maxLines: 3, + style: TextStyle(fontSize: 14, fontWeight: FontWeight.w700), + ), + ), + ], + ), ), Row( children: [ Container( width: 50, child: Button( - "View", + ApplicationLocalizations.of(context) + .translate(i18.common.VIEW), () { if (reportProvider.selectedBillPeriod == null) { Notifiers.getToastMessage( diff --git a/frontend/mgramseva/lib/screeens/reports/collection_report.dart b/frontend/mgramseva/lib/screeens/reports/collection_report.dart index dbae58d3c..066fcebff 100644 --- a/frontend/mgramseva/lib/screeens/reports/collection_report.dart +++ b/frontend/mgramseva/lib/screeens/reports/collection_report.dart @@ -26,11 +26,13 @@ class _CollectionReport extends State @override Widget build(BuildContext context) { return LayoutBuilder(builder: (context, constraints) { + final isWideScreen = constraints.maxWidth > 700; + final containerMargin = isWideScreen + ? const EdgeInsets.only(top: 5.0, bottom: 5, right: 20, left: 10) + : const EdgeInsets.symmetric(vertical: 5.0, horizontal: 8); return Consumer(builder: (_, reportProvider, child) { return Container( - margin: constraints.maxWidth > 700 - ? const EdgeInsets.only(top: 5.0, bottom: 5, right: 20, left: 10) - : const EdgeInsets.only(top: 5.0, bottom: 5, right: 8, left: 8), + margin: containerMargin, child: Column( mainAxisAlignment: MainAxisAlignment.start, children: [ @@ -40,24 +42,33 @@ class _CollectionReport extends State Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row( - children: [ - Text("2. ", - style: TextStyle( - fontSize: 16, fontWeight: FontWeight.w700)), - Text( - ApplicationLocalizations.of(context) - .translate(i18.dashboard.COLLECTION_REPORT), - style: TextStyle( - fontSize: 16, fontWeight: FontWeight.w700)), - ], + Container( + width: constraints.maxWidth > 344?constraints.maxWidth / 2.5:constraints.maxWidth / 3, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "2. ", + style: TextStyle(fontSize: 14, fontWeight: FontWeight.w700), + ), + Expanded( + child: Text( + ApplicationLocalizations.of(context) + .translate(i18.dashboard.COLLECTION_REPORT), + maxLines: 3, + style: TextStyle(fontSize: 14, fontWeight: FontWeight.w700), + ), + ), + ], + ), ), Row( children: [ Container( width: 50, child: Button( - "View", + ApplicationLocalizations.of(context) + .translate(i18.common.VIEW), () { if (reportProvider.selectedBillPeriod == null) { Notifiers.getToastMessage( diff --git a/frontend/mgramseva/lib/screeens/reports/inactive_consumer_report.dart b/frontend/mgramseva/lib/screeens/reports/inactive_consumer_report.dart index bce975982..72a59f1d8 100644 --- a/frontend/mgramseva/lib/screeens/reports/inactive_consumer_report.dart +++ b/frontend/mgramseva/lib/screeens/reports/inactive_consumer_report.dart @@ -3,9 +3,7 @@ import 'package:provider/provider.dart'; import '../../providers/reports_provider.dart'; import '../../utils/localization/application_localizations.dart'; - import 'package:mgramseva/utils/constants/i18_key_constants.dart'; - import '../../utils/notifiers.dart'; import '../../utils/testing_keys/testing_keys.dart'; import '../../widgets/button.dart'; @@ -25,77 +23,85 @@ class _CollectionReport extends State with SingleTickerProviderStateMixin { @override Widget build(BuildContext context) { + final reportProvider = Provider.of(context); + return LayoutBuilder(builder: (context, constraints) { - return Consumer(builder: (_, reportProvider, child) { - return Container( - margin: constraints.maxWidth > 700 - ? const EdgeInsets.only(top: 5.0, bottom: 5, right: 20, left: 10) - : const EdgeInsets.only(top: 5.0, bottom: 5, right: 8, left: 8), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox( - height: 30, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( + final isWideScreen = constraints.maxWidth > 700; + final containerMargin = isWideScreen + ? const EdgeInsets.only(top: 5.0, bottom: 5, right: 20, left: 10) + : const EdgeInsets.symmetric(vertical: 5.0, horizontal: 8); + + return Container( + margin: containerMargin, + width: constraints.maxWidth, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox(height: 30), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: constraints.maxWidth > 344?constraints.maxWidth / 2.5:constraints.maxWidth / 3, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("3. ", - style: TextStyle( - fontSize: 16, fontWeight: FontWeight.w700)), Text( + "3. ", + style: TextStyle(fontSize: 14, fontWeight: FontWeight.w700), + ), + Expanded( + child: Text( ApplicationLocalizations.of(context) .translate(i18.dashboard.INACTIVE_CONSUMER_REPORT), - style: TextStyle( - fontSize: 16, fontWeight: FontWeight.w700)), - ], - ), - Row( - children: [ - Container( - width: 50, - child: Button( - "View", - () { - if (reportProvider.selectedBillPeriod == null) { - Notifiers.getToastMessage( - context, 'Select Billing Cycle', 'ERROR'); - } else { - reportProvider.clearTableData(); - reportProvider.getInactiveConsumerReport(); - widget.onViewClick( - true, i18.dashboard.INACTIVE_CONSUMER_REPORT); - } - }, - key: Keys.billReport.INACTIVE_CONSUMER_REPORT_VIEW_BUTTON, + maxLines: 3, + style: TextStyle(fontSize: 14, fontWeight: FontWeight.w700), ), ), - SizedBox( - width: 10, - ), - TextButton.icon( - onPressed: () { - if (reportProvider.selectedBillPeriod == null) { - Notifiers.getToastMessage( - context, 'Select Billing Cycle', 'ERROR'); - } else { - reportProvider.getInactiveConsumerReport( - download: true); - } - }, - icon: Icon(Icons.download_sharp), - label: Text(ApplicationLocalizations.of(context) - .translate(i18.common.CORE_DOWNLOAD))), ], ), - ], - ), - ], - ), - ); - }); + ), + + Row( + children: [ + Container( + width: 50, + child: Button( + ApplicationLocalizations.of(context) + .translate(i18.common.VIEW), + () { + if (reportProvider.selectedBillPeriod == null) { + Notifiers.getToastMessage(context, 'Select Billing Cycle', 'ERROR'); + } else { + reportProvider.clearTableData(); + reportProvider.getInactiveConsumerReport(); + widget.onViewClick( + true, i18.dashboard.INACTIVE_CONSUMER_REPORT); + } + }, + key: Keys.billReport.INACTIVE_CONSUMER_REPORT_VIEW_BUTTON, + ), + ), + SizedBox(width: 10), + TextButton.icon( + onPressed: () { + if (reportProvider.selectedBillPeriod == null) { + Notifiers.getToastMessage(context, 'Select Billing Cycle', 'ERROR'); + } else { + reportProvider.getInactiveConsumerReport(download: true); + } + }, + icon: Icon(Icons.download_sharp), + label: Text(ApplicationLocalizations.of(context) + .translate(i18.common.CORE_DOWNLOAD)), + ), + ], + ), + ], + ), + ], + ), + ); }); } } diff --git a/frontend/mgramseva/lib/theme.dart b/frontend/mgramseva/lib/theme.dart index eb312864f..b03d3ffe5 100644 --- a/frontend/mgramseva/lib/theme.dart +++ b/frontend/mgramseva/lib/theme.dart @@ -8,7 +8,7 @@ ThemeData get theme => ThemeData( primaryColorLight: Color.fromRGBO(80, 90, 95, 1), primaryColor: Color.fromRGBO(244, 119, 56, 1), disabledColor: Colors.grey, - cardTheme: CardTheme(surfaceTintColor: Colors.white), + cardTheme: CardTheme(surfaceTintColor: Colors.white,shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(3))), datePickerTheme: DatePickerThemeData( surfaceTintColor: Colors.white ), diff --git a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart index cb186d523..ec4a240b3 100644 --- a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart +++ b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart @@ -68,6 +68,7 @@ class Common { String get BACK => 'BACK'; String get DEAR => 'DEAR'; String get VIEW_ALL => 'VIEW_ALL'; + String get VIEW => 'VIEW'; String get ALL_NOTIFICATIONS => 'ALL_NOTIFICATIONS'; String get CORE_FATHER_NAME => 'CORE_FATHER_NAME'; diff --git a/frontend/mgramseva/lib/widgets/confirmation_pop_up.dart b/frontend/mgramseva/lib/widgets/confirmation_pop_up.dart index 923bd22eb..18ab5a56c 100644 --- a/frontend/mgramseva/lib/widgets/confirmation_pop_up.dart +++ b/frontend/mgramseva/lib/widgets/confirmation_pop_up.dart @@ -39,7 +39,7 @@ class _ConfirmationPopUpState extends State { alignment: Alignment.center, constraints: BoxConstraints( minHeight: 160, - maxHeight: 180 + maxHeight: 190 ), width: MediaQuery.of(context).size.width > 720 ? MediaQuery.of(context).size.width / 3.5 : MediaQuery.of(context).size.width , padding: EdgeInsets.only(right: 8.0, left: 8.0), From f150978e1ae7ecd1dbe828f6ab177f6d5e0d4313 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Thu, 14 Dec 2023 18:51:30 +0530 Subject: [PATCH 25/70] clear Selected Data upon reopen of generateBill Screen --- frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart b/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart index 1bbadd70e..f5dedf8c4 100644 --- a/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart +++ b/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart @@ -52,6 +52,7 @@ class _GenerateBillState extends State { ..readingExist ..getServiceTypePropertyTypeandConnectionType() ..autoValidation = false + ..clearBillYear() ..formKey = GlobalKey(); } From a748aeb294751cf146db5c22f11730d02034e951 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Thu, 21 Dec 2023 13:55:12 +0530 Subject: [PATCH 26/70] PFM-4114 --- .../src/main/java/org/egov/echallan/service/ChallanService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java index 21571c941..7f35bff47 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java @@ -160,11 +160,11 @@ public Challan update(ChallanRequest request, Map finalData) { userService.setAccountUser(request); enrichmentService.enrichUpdateRequest(request, searchResult.get(0)); calculationService.addCalculation(request); + repository.update(request); if (request.getChallan().getApplicationStatus() == StatusEnum.PAID && searchResult.get(0).getApplicationStatus() == StatusEnum.ACTIVE) paymentService.createPayment(request); if (searchResult.get(0).getApplicationStatus() == StatusEnum.PAID) paymentService.updatePayment(request); - repository.update(request); return request.getChallan(); } From 739e291efe637e6342a99c27d5b8825bcd353052 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Tue, 26 Dec 2023 15:29:00 +0530 Subject: [PATCH 27/70] removed dependency on thermal_printer --- .../mgramseva/lib/utils/print_bluetooth.dart | 3 +- .../lib/widgets/bluetooth_printer.dart | 432 ------------------ frontend/mgramseva/pubspec.yaml | 6 +- 3 files changed, 5 insertions(+), 436 deletions(-) delete mode 100644 frontend/mgramseva/lib/widgets/bluetooth_printer.dart diff --git a/frontend/mgramseva/lib/utils/print_bluetooth.dart b/frontend/mgramseva/lib/utils/print_bluetooth.dart index a04ea1661..f51f4d016 100644 --- a/frontend/mgramseva/lib/utils/print_bluetooth.dart +++ b/frontend/mgramseva/lib/utils/print_bluetooth.dart @@ -4,11 +4,10 @@ import 'package:mgramseva/utils/printer/image_utils.dart'; import 'package:flutter/material.dart'; import 'package:mgramseva/utils/constants/i18_key_constants.dart'; -import 'package:nearby_connections/nearby_connections.dart'; import 'package:image/image.dart' as img; import 'package:permission_handler/permission_handler.dart'; import 'package:print_bluetooth_thermal/print_bluetooth_thermal.dart'; -import 'package:thermal_printer/esc_pos_utils_platform/esc_pos_utils_platform.dart'; +import 'package:mgramseva/utils/printer/esc_pos_utils_platform/esc_pos_utils_platform.dart'; import 'localization/application_localizations.dart'; diff --git a/frontend/mgramseva/lib/widgets/bluetooth_printer.dart b/frontend/mgramseva/lib/widgets/bluetooth_printer.dart deleted file mode 100644 index 729dd840a..000000000 --- a/frontend/mgramseva/lib/widgets/bluetooth_printer.dart +++ /dev/null @@ -1,432 +0,0 @@ -import 'dart:async'; -import 'dart:developer'; -import 'dart:io'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:thermal_printer/esc_pos_utils_platform/esc_pos_utils_platform.dart'; -import 'package:thermal_printer/thermal_printer.dart'; -import 'package:image/image.dart' as img; -import '../utils/printer/image_utils.dart'; - - -class BluetoothPrinterScreen extends StatefulWidget { - final Uint8List imageData; - const BluetoothPrinterScreen({Key? key, required this.imageData}) : super(key: key); - - @override - State createState() => _BluetoothPrinterScreenState(); -} - -class _BluetoothPrinterScreenState extends State { - // Printer Type [bluetooth, usb, network] - var defaultPrinterType = PrinterType.bluetooth; - var _isBle = false; - var _reconnect = false; - var _isConnected = false; - var printerManager = PrinterManager.instance; - var devices = []; - StreamSubscription? _subscription; - StreamSubscription? _subscriptionBtStatus; - StreamSubscription? _subscriptionUsbStatus; - StreamSubscription? _subscriptionTCPStatus; - BTStatus _currentStatus = BTStatus.none; - // ignore: unused_field - TCPStatus _currentTCPStatus = TCPStatus.none; - // _currentUsbStatus is only supports on Android - // ignore: unused_field - USBStatus _currentUsbStatus = USBStatus.none; - List? pendingTask; - String _ipAddress = ''; - String _port = '9100'; - final _ipController = TextEditingController(); - final _portController = TextEditingController(); - BluetoothPrinter? selectedPrinter; - - @override - void initState() { - if (Platform.isWindows) defaultPrinterType = PrinterType.usb; - super.initState(); - _portController.text = _port; - _scan(); - - // subscription to listen change status of bluetooth connection - _subscriptionBtStatus = PrinterManager.instance.stateBluetooth.listen((status) { - log(' ----------------- status bt $status ------------------ '); - _currentStatus = status; - if (status == BTStatus.connected) { - setState(() { - _isConnected = true; - }); - } - if (status == BTStatus.none) { - setState(() { - _isConnected = false; - }); - } - if (status == BTStatus.connected && pendingTask != null) { - if (Platform.isAndroid) { - Future.delayed(const Duration(milliseconds: 1000), () { - PrinterManager.instance.send(type: PrinterType.bluetooth, bytes: pendingTask!); - pendingTask = null; - }); - } else if (Platform.isIOS) { - PrinterManager.instance.send(type: PrinterType.bluetooth, bytes: pendingTask!); - pendingTask = null; - } - } - }); - // PrinterManager.instance.stateUSB is only supports on Android - _subscriptionUsbStatus = PrinterManager.instance.stateUSB.listen((status) { - log(' ----------------- status usb $status ------------------ '); - _currentUsbStatus = status; - if (Platform.isAndroid) { - if (status == USBStatus.connected && pendingTask != null) { - Future.delayed(const Duration(milliseconds: 1000), () { - PrinterManager.instance.send(type: PrinterType.usb, bytes: pendingTask!); - pendingTask = null; - }); - } - } - }); - - // PrinterManager.instance.stateUSB is only supports on Android - _subscriptionTCPStatus = PrinterManager.instance.stateTCP.listen((status) { - log(' ----------------- status tcp $status ------------------ '); - _currentTCPStatus = status; - }); - } - - @override - void dispose() { - _subscription?.cancel(); - _subscriptionBtStatus?.cancel(); - _subscriptionUsbStatus?.cancel(); - _subscriptionTCPStatus?.cancel(); - _portController.dispose(); - _ipController.dispose(); - super.dispose(); - } - - // method to scan devices according PrinterType - void _scan() { - devices.clear(); - _subscription = printerManager.discovery(type: defaultPrinterType, isBle: _isBle).listen((device) { - devices.add(BluetoothPrinter( - deviceName: device.name, - address: device.address, - isBle: _isBle, - vendorId: device.vendorId, - productId: device.productId, - typePrinter: defaultPrinterType, - )); - setState(() {}); - }); - } - - void setPort(String value) { - if (value.isEmpty) value = '9100'; - _port = value; - var device = BluetoothPrinter( - deviceName: value, - address: _ipAddress, - port: _port, - typePrinter: PrinterType.network, - state: false, - ); - selectDevice(device); - } - - void setIpAddress(String value) { - _ipAddress = value; - var device = BluetoothPrinter( - deviceName: value, - address: _ipAddress, - port: _port, - typePrinter: PrinterType.network, - state: false, - ); - selectDevice(device); - } - - Future selectDevice(BluetoothPrinter device) async { - try{ - if (selectedPrinter != null) { - if ((device.address != selectedPrinter!.address) || (device.typePrinter == PrinterType.usb && selectedPrinter!.vendorId != device.vendorId)) { - await PrinterManager.instance.disconnect(type: selectedPrinter!.typePrinter); - } - } - - selectedPrinter = device; - setState(() {}); - return true; - }catch(e){ - return false; - } - } - - Future _printReceiveTest() async { - List bytes = []; - - // Xprinter XP-N160I - final profile = await CapabilityProfile.load(name: 'XP-N160I'); - - // PaperSize.mm80 or PaperSize.mm58 - final generator = Generator(PaperSize.mm58, profile); - bytes += generator.setGlobalCodeTable('CP1252'); - - - final Uint8List imageBytes = widget.imageData; - // decode the bytes into an image - final decodedImage = img.decodeImage(imageBytes)!; - // Create a black bottom layer - // Resize the image to a 130x? thumbnail (maintaining the aspect ratio). - img.Image thumbnail = img.copyResize(decodedImage,width: PaperSize.mm58.width,maintainAspect: false,); - // creates a copy of the original image with set dimensions - img.Image originalImg = img.copyResize(decodedImage, width: PaperSize.mm58.width,maintainAspect: false, ); - // fills the original image with a white background - img.fill(originalImg, color: img.ColorRgb8(255, 255, 255)); - // var padding = (originalImg.width - thumbnail.width) / 2; - // - // //insert the image inside the frame and center it - drawImage(originalImg, thumbnail, dstX: 0); - // - // // convert image to grayscale - // var grayscaleImage = img.grayscale(originalImg); - - bytes += generator.feed(1); - // bytes += generator.imageRaster(img.decodeImage(imageBytes)!, align: PosAlign.center); - bytes += generator.imageRaster(originalImg, align: PosAlign.center); - bytes += generator.feed(1); - - _printEscPos(bytes, generator); - } - - /// print ticket - void _printEscPos(List bytes, Generator generator) async { - var connectedTCP = false; - if (selectedPrinter == null) return; - var bluetoothPrinter = selectedPrinter!; - - switch (bluetoothPrinter.typePrinter) { - case PrinterType.usb: - bytes += generator.feed(2); - bytes += generator.cut(); - await printerManager.connect( - type: bluetoothPrinter.typePrinter, - model: UsbPrinterInput(name: bluetoothPrinter.deviceName, productId: bluetoothPrinter.productId, vendorId: bluetoothPrinter.vendorId)); - pendingTask = null; - break; - case PrinterType.bluetooth: - bytes += generator.cut(); - await printerManager.connect( - type: bluetoothPrinter.typePrinter, - model: BluetoothPrinterInput( - name: bluetoothPrinter.deviceName, - address: bluetoothPrinter.address!, - isBle: bluetoothPrinter.isBle ?? false, - autoConnect: _reconnect)); - pendingTask = null; - if (Platform.isAndroid) pendingTask = bytes; - break; - case PrinterType.network: - bytes += generator.feed(2); - bytes += generator.cut(); - connectedTCP = await printerManager.connect(type: bluetoothPrinter.typePrinter, model: TcpPrinterInput(ipAddress: bluetoothPrinter.address!)); - if (!connectedTCP) print(' --- please review your connection ---'); - break; - default: - } - if (bluetoothPrinter.typePrinter == PrinterType.bluetooth && Platform.isAndroid) { - if (_currentStatus == BTStatus.connected) { - printerManager.send(type: bluetoothPrinter.typePrinter, bytes: bytes); - pendingTask = null; - } - } else { - printerManager.send(type: bluetoothPrinter.typePrinter, bytes: bytes); - } - } - - // conectar dispositivo - _connectDevice() async { - _isConnected = false; - if (selectedPrinter == null) return; - switch (selectedPrinter!.typePrinter) { - case PrinterType.usb: - await printerManager.connect( - type: selectedPrinter!.typePrinter, - model: UsbPrinterInput(name: selectedPrinter!.deviceName, productId: selectedPrinter!.productId, vendorId: selectedPrinter!.vendorId)); - _isConnected = true; - break; - case PrinterType.bluetooth: - await printerManager.connect( - type: selectedPrinter!.typePrinter, - model: BluetoothPrinterInput( - name: selectedPrinter!.deviceName, - address: selectedPrinter!.address!, - isBle: selectedPrinter!.isBle ?? false, - autoConnect: _reconnect)); - break; - case PrinterType.network: - await printerManager.connect(type: selectedPrinter!.typePrinter, model: TcpPrinterInput(ipAddress: selectedPrinter!.address!)); - _isConnected = true; - break; - default: - } - - setState(() {}); - } - - @override - Widget build(BuildContext context) { - return AlertDialog( - surfaceTintColor: Colors.white, - content: Container( - height: MediaQuery.of(context).size.height*0.5, - constraints: const BoxConstraints(maxWidth: 400), - child: SingleChildScrollView( - padding: EdgeInsets.zero, - child: Column( - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - children: [ - Expanded( - child: ElevatedButton( - onPressed: selectedPrinter == null || _isConnected - ? null - : () { - _connectDevice(); - }, - child: const Text("Connect", textAlign: TextAlign.center), - ), - ), - const SizedBox(width: 8), - Expanded( - child: ElevatedButton( - onPressed: selectedPrinter == null || !_isConnected - ? null - : () { - if (selectedPrinter != null) printerManager.disconnect(type: selectedPrinter!.typePrinter); - setState(() { - _isConnected = false; - }); - }, - child: const Text("Disconnect", textAlign: TextAlign.center), - ), - ), - ], - ), - ), - Column( - children: devices - .map( - (device) => ListTile( - selected: selectedPrinter != null && - ((device.typePrinter == PrinterType.usb && Platform.isWindows - ? device.deviceName == selectedPrinter!.deviceName - : device.vendorId != null && selectedPrinter!.vendorId == device.vendorId) || - (device.address != null && selectedPrinter!.address == device.address)), - selectedColor: Theme.of(context).primaryColor, - title: Text('${device.deviceName}'), - subtitle: Platform.isAndroid && defaultPrinterType == PrinterType.usb - ? null - : Visibility(visible: !Platform.isWindows, child: Text("${device.address}")), - onTap: () { - // do something - selectDevice(device).then((value) async => { - if(value==true){ - await _printReceiveTest() - } - }); - }, - leading: selectedPrinter != null && - ((device.typePrinter == PrinterType.usb && Platform.isWindows - ? device.deviceName == selectedPrinter!.deviceName - : device.vendorId != null && selectedPrinter!.vendorId == device.vendorId) || - (device.address != null && selectedPrinter!.address == device.address)) - ? const Icon( - Icons.check, - color: Colors.green, - ) - : null, - - ), - ) - .toList()), - Visibility( - visible: defaultPrinterType == PrinterType.network && Platform.isWindows, - child: Padding( - padding: const EdgeInsets.only(top: 10.0), - child: TextFormField( - controller: _ipController, - keyboardType: const TextInputType.numberWithOptions(signed: true), - decoration: const InputDecoration( - label: Text("Ip Address"), - prefixIcon: Icon(Icons.wifi, size: 24), - ), - onChanged: setIpAddress, - ), - ), - ), - Visibility( - visible: defaultPrinterType == PrinterType.network && Platform.isWindows, - child: Padding( - padding: const EdgeInsets.only(top: 10.0), - child: TextFormField( - controller: _portController, - keyboardType: const TextInputType.numberWithOptions(signed: true), - decoration: const InputDecoration( - label: Text("Port"), - prefixIcon: Icon(Icons.numbers_outlined, size: 24), - ), - onChanged: setPort, - ), - ), - ), - Visibility( - visible: defaultPrinterType == PrinterType.network && Platform.isWindows, - child: Padding( - padding: const EdgeInsets.only(top: 10.0), - child: OutlinedButton( - onPressed: () async { - if (_ipController.text.isNotEmpty) setIpAddress(_ipController.text); - _printReceiveTest(); - }, - child: const Padding( - padding: EdgeInsets.symmetric(vertical: 4, horizontal: 50), - child: Text("Print", textAlign: TextAlign.center), - ), - ), - ), - ) - ], - ), - ), - ), - ); - } -} - -class BluetoothPrinter { - int? id; - String? deviceName; - String? address; - String? port; - String? vendorId; - String? productId; - bool? isBle; - - PrinterType typePrinter; - bool? state; - - BluetoothPrinter( - {this.deviceName, - this.address, - this.port, - this.state, - this.vendorId, - this.productId, - this.typePrinter = PrinterType.bluetooth, - this.isBle = false}); -} diff --git a/frontend/mgramseva/pubspec.yaml b/frontend/mgramseva/pubspec.yaml index d00e786bf..8a45a54a2 100644 --- a/frontend/mgramseva/pubspec.yaml +++ b/frontend/mgramseva/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.2.18+34 +version: 1.2.20+36 environment: sdk: ">=2.12.0 <4.0.0" @@ -26,7 +26,8 @@ dependencies: sdk: flutter cupertino_icons: ^1.0.2 - thermal_printer: ^1.0.4 + gbk_codec: ^0.4.0 + hex: ^0.2.0 flutter_dotenv: ^5.1.0 # dart_ping_ios: ^4.0.2 //uncomment iOS universal_html: ^2.0.8 @@ -111,6 +112,7 @@ flutter: - assets/icons/ - assets/svg/ - assets/.env + - assets/json/ # To add assets to your application, add an assets section, like this: From 93d20d48cde45c43003f0abe265e97cdf8f4dc97 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Tue, 26 Dec 2023 16:23:28 +0530 Subject: [PATCH 28/70] fixed common_success_page.dart text scaling --- .../new_consumer_bill.dart | 2 +- .../mgramseva/lib/widgets/button_group.dart | 31 ++++++++++--------- .../lib/widgets/common_success_page.dart | 4 +++ .../lib/widgets/no_login_success_page.dart | 3 ++ 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/frontend/mgramseva/lib/components/house_connection_and_bill/new_consumer_bill.dart b/frontend/mgramseva/lib/components/house_connection_and_bill/new_consumer_bill.dart index e78dcd00d..a57411937 100644 --- a/frontend/mgramseva/lib/components/house_connection_and_bill/new_consumer_bill.dart +++ b/frontend/mgramseva/lib/components/house_connection_and_bill/new_consumer_bill.dart @@ -320,7 +320,7 @@ class NewConsumerBillState extends State { : MediaQuery.of(context) .size .width / - 1.12, + 2.2, child: OutlinedButton.icon( onPressed: () => commonProvider .getFileFromPDFBillService( diff --git a/frontend/mgramseva/lib/widgets/button_group.dart b/frontend/mgramseva/lib/widgets/button_group.dart index 09cfc952f..a562d8d1e 100644 --- a/frontend/mgramseva/lib/widgets/button_group.dart +++ b/frontend/mgramseva/lib/widgets/button_group.dart @@ -32,20 +32,23 @@ class ButtonGroup extends StatelessWidget { child: Row( children: [ Expanded( - child: OutlinedButton.icon( - onPressed: callBackIcon, - style: ElevatedButton.styleFrom(padding:EdgeInsets.symmetric(vertical: 8),alignment: Alignment.center,side:BorderSide( - width: 1, - color: Theme.of(context).disabledColor), - ), - icon: (Image.asset('assets/png/whats_app.png', fit: BoxFit.fitHeight,)), - label: Padding( - padding: const EdgeInsets.symmetric(vertical: 12), - child: Text( - ApplicationLocalizations.of(context) - .translate(i18.common.SHARE_BILL_PDF), - style: Theme.of(context).textTheme.titleSmall)), - )), + child: Container( + height: 48, + child: OutlinedButton.icon( + onPressed: callBackIcon, + style: ElevatedButton.styleFrom(padding:EdgeInsets.symmetric(vertical: 5),alignment: Alignment.center,side:BorderSide( + width: 1, + color: Theme.of(context).disabledColor), + ), + icon: (Image.asset('assets/png/whats_app.png', fit: BoxFit.fitHeight,)), + label: Padding( + padding: const EdgeInsets.symmetric(vertical: 0), + child: Text( + ApplicationLocalizations.of(context) + .translate(i18.common.SHARE_BILL_PDF), + style: Theme.of(context).textTheme.titleSmall)), + )), + ), Expanded(child: ShortButton(label, callBack)) ], ), diff --git a/frontend/mgramseva/lib/widgets/common_success_page.dart b/frontend/mgramseva/lib/widgets/common_success_page.dart index 0f9882a49..d39ca7abb 100644 --- a/frontend/mgramseva/lib/widgets/common_success_page.dart +++ b/frontend/mgramseva/lib/widgets/common_success_page.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:mgramseva/model/success_handler.dart'; import 'package:mgramseva/utils/constants/i18_key_constants.dart'; @@ -112,6 +113,7 @@ class CommonSuccess extends StatelessWidget { null ? successHandler.downloadLinkLabel! : ''), + textScaleFactor: MediaQuery.of(context).size.width>340?0.9:0.68, style: TextStyle( fontSize: 16, color: Theme.of(context).primaryColor)), @@ -132,6 +134,7 @@ class CommonSuccess extends StatelessWidget { successHandler.printLabel != null ? successHandler.printLabel! : ''), + textScaleFactor: MediaQuery.of(context).size.width>340?0.9:0.68, style: TextStyle( fontSize: 16, color: Theme.of(context).primaryColor)), @@ -146,6 +149,7 @@ class CommonSuccess extends StatelessWidget { label: Text( ApplicationLocalizations.of(context) .translate(i18.common.SHARE_BILL), + textScaleFactor: MediaQuery.of(context).size.width>340?0.9:0.68, style: TextStyle( fontSize: 16, color: Theme.of(context).primaryColor), diff --git a/frontend/mgramseva/lib/widgets/no_login_success_page.dart b/frontend/mgramseva/lib/widgets/no_login_success_page.dart index 6a8bfc932..abb39d992 100644 --- a/frontend/mgramseva/lib/widgets/no_login_success_page.dart +++ b/frontend/mgramseva/lib/widgets/no_login_success_page.dart @@ -89,6 +89,7 @@ class NoLoginSuccess extends StatelessWidget { successHandler.downloadLinkLabel != null ? successHandler.downloadLinkLabel! : ''), + textScaleFactor: MediaQuery.of(context).size.width>340?0.9:0.68, style: TextStyle( fontSize: 16, color: Theme.of(context).primaryColor)), @@ -108,6 +109,7 @@ class NoLoginSuccess extends StatelessWidget { successHandler.printLabel != null ? successHandler.printLabel! : ''), + textScaleFactor: MediaQuery.of(context).size.width>340?0.9:0.68, style: TextStyle( fontSize: 16, color: Theme.of(context).primaryColor)), @@ -122,6 +124,7 @@ class NoLoginSuccess extends StatelessWidget { label: Text( ApplicationLocalizations.of(context) .translate(i18.common.SHARE_BILL), + textScaleFactor: MediaQuery.of(context).size.width>340?0.9:0.68, style: TextStyle( fontSize: 16, color: Theme.of(context).primaryColor), From 5b2ce17244230ac0cc12dd39e19c54871a12d86d Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Tue, 26 Dec 2023 16:30:56 +0530 Subject: [PATCH 29/70] fixed common_success_page.dart text scaling --- frontend/mgramseva/lib/widgets/common_success_page.dart | 6 +++--- frontend/mgramseva/lib/widgets/no_login_success_page.dart | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/mgramseva/lib/widgets/common_success_page.dart b/frontend/mgramseva/lib/widgets/common_success_page.dart index d39ca7abb..9520c18f1 100644 --- a/frontend/mgramseva/lib/widgets/common_success_page.dart +++ b/frontend/mgramseva/lib/widgets/common_success_page.dart @@ -113,7 +113,7 @@ class CommonSuccess extends StatelessWidget { null ? successHandler.downloadLinkLabel! : ''), - textScaleFactor: MediaQuery.of(context).size.width>340?0.9:0.68, + textScaleFactor: MediaQuery.of(context).size.width>360?0.9:0.68, style: TextStyle( fontSize: 16, color: Theme.of(context).primaryColor)), @@ -134,7 +134,7 @@ class CommonSuccess extends StatelessWidget { successHandler.printLabel != null ? successHandler.printLabel! : ''), - textScaleFactor: MediaQuery.of(context).size.width>340?0.9:0.68, + textScaleFactor: MediaQuery.of(context).size.width>360?0.9:0.68, style: TextStyle( fontSize: 16, color: Theme.of(context).primaryColor)), @@ -149,7 +149,7 @@ class CommonSuccess extends StatelessWidget { label: Text( ApplicationLocalizations.of(context) .translate(i18.common.SHARE_BILL), - textScaleFactor: MediaQuery.of(context).size.width>340?0.9:0.68, + textScaleFactor: MediaQuery.of(context).size.width>360?0.9:0.68, style: TextStyle( fontSize: 16, color: Theme.of(context).primaryColor), diff --git a/frontend/mgramseva/lib/widgets/no_login_success_page.dart b/frontend/mgramseva/lib/widgets/no_login_success_page.dart index abb39d992..f906f2c2e 100644 --- a/frontend/mgramseva/lib/widgets/no_login_success_page.dart +++ b/frontend/mgramseva/lib/widgets/no_login_success_page.dart @@ -89,7 +89,7 @@ class NoLoginSuccess extends StatelessWidget { successHandler.downloadLinkLabel != null ? successHandler.downloadLinkLabel! : ''), - textScaleFactor: MediaQuery.of(context).size.width>340?0.9:0.68, + textScaleFactor: MediaQuery.of(context).size.width>360?0.9:0.68, style: TextStyle( fontSize: 16, color: Theme.of(context).primaryColor)), @@ -109,7 +109,7 @@ class NoLoginSuccess extends StatelessWidget { successHandler.printLabel != null ? successHandler.printLabel! : ''), - textScaleFactor: MediaQuery.of(context).size.width>340?0.9:0.68, + textScaleFactor: MediaQuery.of(context).size.width>360?0.9:0.68, style: TextStyle( fontSize: 16, color: Theme.of(context).primaryColor)), @@ -124,7 +124,7 @@ class NoLoginSuccess extends StatelessWidget { label: Text( ApplicationLocalizations.of(context) .translate(i18.common.SHARE_BILL), - textScaleFactor: MediaQuery.of(context).size.width>340?0.9:0.68, + textScaleFactor: MediaQuery.of(context).size.width>360?0.9:0.68, style: TextStyle( fontSize: 16, color: Theme.of(context).primaryColor), From 740b06f7228ed117587d2a65f7b313173e074912 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Thu, 4 Jan 2024 13:40:13 +0530 Subject: [PATCH 30/70] PFM-4082 Echallan report --- .../repository/ChallanRepository.java | 40 ++++++++- .../builder/ChallanQueryBuilder.java | 10 ++- .../rowmapper/ExpenseBillReportRowMapper.java | 90 +++++++++++++++++++ .../egov/echallan/service/ChallanService.java | 16 +++- .../egov/echallan/service/UserService.java | 8 +- .../web/controllers/ChallanController.java | 27 +++--- .../web/models/ExpenseBillReportData.java | 56 ++++++++++++ .../web/models/ExpenseBillReportResponse.java | 20 +++++ 8 files changed, 252 insertions(+), 15 deletions(-) create mode 100644 municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java create mode 100644 municipal-services/echallan-services/src/main/java/org/egov/echallan/web/models/ExpenseBillReportData.java create mode 100644 municipal-services/echallan-services/src/main/java/org/egov/echallan/web/models/ExpenseBillReportResponse.java diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java index 1ab58fecd..c1e417ca9 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java @@ -24,8 +24,10 @@ import org.egov.echallan.producer.Producer; import org.egov.echallan.repository.builder.ChallanQueryBuilder; import org.egov.echallan.repository.rowmapper.ChallanRowMapper; +import org.egov.echallan.repository.rowmapper.ExpenseBillReportRowMapper; import org.egov.echallan.service.ChallanService; import org.egov.echallan.util.CommonUtils; +import org.egov.echallan.web.models.ExpenseBillReportData; import org.egov.echallan.web.models.collection.Bill; import org.egov.echallan.web.models.collection.PaymentDetail; import org.egov.echallan.web.models.collection.PaymentRequest; @@ -63,7 +65,9 @@ public class ChallanRepository { private ChallanQueryBuilder queryBuilder; private ChallanRowMapper rowMapper; - + + private ExpenseBillReportRowMapper expenseBillReportRowMapper; + private RestTemplate restTemplate; @Autowired @@ -484,4 +488,38 @@ public List fetchESIds(SearchCriteria criteria) { new SingleColumnRowMapper<>(String.class)); return ids; } + + public List getExpenseBillReport(Long monthStartDateTime, String tenantId, Integer offset, Integer limit) + { + StringBuilder expenseBillQuery =new StringBuilder(queryBuilder.EXPENSEBILLQUERY); + + List preparedStatement=new ArrayList<>(); + preparedStatement.add(tenantId); + preparedStatement.add(monthStartDateTime); + + Integer newLimit=config.getDefaultLimit(); + Integer newOffset=config.getDefaultOffset(); + + if(limit==null && offset==null) + newLimit=config.getMaxSearchLimit(); + if(limit!=null && limit<=config.getMaxSearchLimit()) + newLimit=limit; + if(limit!=null && limit>=config.getMaxSearchLimit()) + newLimit=config.getMaxSearchLimit(); + + if(offset!=null) + newOffset=offset; + + if(newLimit>0) + { + expenseBillQuery.append("offset ? limit ? ;"); + preparedStatement.add(newOffset); + preparedStatement.add(newLimit); + } + + log.info("Query of expense bill report " +expenseBillQuery.toString()+" prepared statement "+preparedStatement); + + List expenseBillReportDataList=jdbcTemplate.query(expenseBillQuery.toString(), preparedStatement.toArray(),expenseBillReportRowMapper); + return expenseBillReportDataList; + } } diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java index 465e12455..a33e77d83 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java @@ -85,8 +85,14 @@ public ChallanQueryBuilder(ChallanConfiguration config) { public static final String PENDINGEXPCOLLTILLDATE = "SELECT coalesce(SUM(DMDL.TAXAMOUNT - DMDL.COLLECTIONAMOUNT),0) FROM EGBS_DEMAND_V1 DMD INNER JOIN EGBS_DEMANDDETAIL_V1 DMDL ON DMD.ID=DMDL.DEMANDID AND DMD.TENANTID=DMDL.TENANTID INNER JOIN EG_ECHALLAN CH ON CH.referenceId=DMD.CONSUMERCODE AND DMD.TENANTID=CH.TENANTID WHERE DMD.BUSINESSSERVICE LIKE '%EXPENSE%' and DMD.status='ACTIVE' "; - - public String getChallanSearchQuery(SearchCriteria criteria, List preparedStmtList) { + public static final String EXPENSEBILLQUERY="SELECT challan.typeofexpense,vendor.name,challan.billdate," + + " challan.taxperiodfrom,challan.taxperiodto,challan.applicationstatus,challan.paiddate," + + " challan.filestoreid,challan.lastmodifiedtime,challan.lastmodifiedby from " + + " eg_echallan challan LEFT JOIN eg_vendor vendor on challan.vendor=vendor.id " + + " where challan.tenantid=? and vendor.status='ACTIVE' and " + + " challan.taxperiodfrom >=? order by challan.taxperiodfrom desc "; + + public String getChallanSearchQuery(SearchCriteria criteria, List preparedStmtList) { StringBuilder builder = new StringBuilder(QUERY); diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java new file mode 100644 index 000000000..a4a96cce1 --- /dev/null +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java @@ -0,0 +1,90 @@ +package org.egov.echallan.repository.rowmapper; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.egov.echallan.service.UserService; +import org.egov.echallan.web.models.ExpenseBillReportData; +import org.egov.echallan.web.models.ExpenseBillReportResponse; +import org.egov.echallan.web.models.user.User; +import org.egov.echallan.web.models.user.UserDetailResponse; +import org.egov.echallan.web.models.user.UserSearchRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.ResultSetExtractor; +import org.springframework.stereotype.Component; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; + +@Component +@Slf4j +public class ExpenseBillReportRowMapper implements ResultSetExtractor> +{ + @Autowired + private ObjectMapper mapper; + + @Autowired + private UserService userService; + + @Override + public List extractData(ResultSet resultSet) throws SQLException, DataAccessException { + + List expenseBillReportDataList=new ArrayList<>(); + + while(resultSet.next()) + { + ExpenseBillReportData expenseBillReportData=new ExpenseBillReportData(); + expenseBillReportData.setTypeOfExpense(resultSet.getString("typeofexpense")); + expenseBillReportData.setVendorName(resultSet.getString("name")); +// expenseBillReportData.setAmount(resultSet.getString("")); + expenseBillReportData.setBillDate(resultSet.getLong("billdate")); + expenseBillReportData.setTaxPeriodFrom(resultSet.getLong("taxperiodfrom")); + expenseBillReportData.setTaxPeriodTo(resultSet.getLong("taxperiodto")); + expenseBillReportData.setApplicationStatus(resultSet.getString("applicationstatus")); + expenseBillReportData.setPaidDate(resultSet.getLong("paiddate")); + if(resultSet.getString("filestoreid")!=null) + expenseBillReportData.setFilestoreid("Yes"); + else + expenseBillReportData.setFilestoreid("No"); + if(Objects.equals(resultSet.getString("applicationstatus"), "CANCELLED")) { + expenseBillReportData.setLastModifiedTime(resultSet.getLong("lastmodifiedtime")); + expenseBillReportData.setLastModifiedBy(resultSet.getString("lastmodifiedbyUuid")); + enrichExpenseHolderDetails(expenseBillReportData); + } + expenseBillReportDataList.add(expenseBillReportData); + } + +// if() +// { +// enrichExpenseHolderDetails(expenseBillReportDataList); +// } + return expenseBillReportDataList; + } + + private void enrichExpenseHolderDetails(ExpenseBillReportData expenseBillReportData) + { +// Set lastModifiedByUuid =new HashSet<>(); +// +// for(ExpenseBillReportData expenseBillReportData:expenseBillReportData) +// { +// lastModifiedByUuid.add(expenseBillReportData.getLastModifiedBy()); +// } + + UserSearchRequest userSearchRequest=new UserSearchRequest(); + userSearchRequest.setUuid(Collections.singletonList(expenseBillReportData.getLastModifiedByUuid())); + log.info(userSearchRequest.getUuid().toString()); + + UserDetailResponse userDetailResponse=userService.getUsers(userSearchRequest); + log.info(userDetailResponse.getUser().toString()); + + enrichConnectionHolderInfo(userDetailResponse,expenseBillReportData); + } + + private void enrichConnectionHolderInfo(UserDetailResponse userDetailResponse, ExpenseBillReportData expenseBillReportData) + { + User connectionHolderInfos= (User) userDetailResponse.getUser(); + log.info(connectionHolderInfos.toString()); + expenseBillReportData.setLastModifiedBy(connectionHolderInfos.getName()); + } +} diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java index 21571c941..f6f1fb20f 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java @@ -7,6 +7,7 @@ import java.time.Month; import java.time.YearMonth; import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import java.util.*; @@ -27,6 +28,7 @@ import org.egov.echallan.util.CommonUtils; import org.egov.echallan.validator.ChallanValidator; import org.egov.echallan.web.models.ChallanCollectionData; +import org.egov.echallan.web.models.ExpenseBillReportData; import org.egov.echallan.web.models.ExpenseDashboard; import org.egov.echallan.web.models.user.UserDetailResponse; import org.springframework.beans.factory.annotation.Autowired; @@ -377,5 +379,17 @@ public List getChallansWithOwnerInfoForPlaneSearch(SearchCriteria crite challans = enrichmentService.enrichChallanSearch(challans,criteria,requestInfo); return challans; } - + + public List expenseBillReport(RequestInfo requestInfo, String monthstartDate, String tenantId, Integer offset, Integer limit) + { + DateTimeFormatter dtf=DateTimeFormatter.ofPattern("dd/MM/yyyy"); + LocalDate startDate=LocalDate.parse(monthstartDate,dtf); + + Long monthStartDateTime=LocalDateTime.of(startDate.getYear(),startDate.getMonth(),startDate.getDayOfMonth(), + 0,0,0).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + + List expenseBillReport=repository.getExpenseBillReport(monthStartDateTime,tenantId,offset,limit); + return expenseBillReport; + + } } diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/UserService.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/UserService.java index 74531e838..9950f3710 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/UserService.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/UserService.java @@ -253,5 +253,11 @@ public UserDetailResponse getUserById(RequestInfo requestInfo, String tenantId, StringBuilder uri = new StringBuilder(userHost).append(userSearchEndpoint); return userCall(userSearchRequest, uri); } - + + public UserDetailResponse getUsers(UserSearchRequest userSearchRequest) + { + StringBuilder uri = new StringBuilder(userHost).append(userSearchEndpoint); + UserDetailResponse userDetailResponse = userCall(userSearchRequest, uri); + return userDetailResponse; + } } diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/controllers/ChallanController.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/controllers/ChallanController.java index d18fb102f..c9a6f28cc 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/controllers/ChallanController.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/controllers/ChallanController.java @@ -20,19 +20,11 @@ import org.egov.echallan.service.ChallanService; import org.egov.echallan.service.SchedulerService; import org.egov.echallan.util.ResponseInfoFactory; -import org.egov.echallan.web.models.ChallanCollectionData; -import org.egov.echallan.web.models.ChallanCollectionDataResponse; -import org.egov.echallan.web.models.ExpenseDashboard; -import org.egov.echallan.web.models.ExpenseDashboardResponse; +import org.egov.echallan.web.models.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @@ -171,5 +163,20 @@ public ResponseEntity updateCreateoPayment(@Valid @RequestBody return new ResponseEntity<>(response, HttpStatus.OK); } + @PostMapping("/_expenseBillReport") + public ResponseEntity expenseBillReport(@Valid @RequestBody RequestInfoWrapper requestInfoWrapper, + @RequestParam("monthstartDate") String monthstartDate, + @RequestParam("tenantId") String tenantId, + @RequestParam("offset") Integer offset, + @RequestParam("limit") Integer limit) + { + List expenseBillReport=challanService.expenseBillReport(requestInfoWrapper.getRequestInfo(),monthstartDate,tenantId,offset,limit); + ExpenseBillReportResponse expenseBillReportResponse= + ExpenseBillReportResponse.builder().ExpenseBillReportData(expenseBillReport) + .responseInfo(responseInfoFactory.createResponseInfoFromRequestInfo(requestInfoWrapper.getRequestInfo(), + true)) + .build(); + return new ResponseEntity<>(expenseBillReportResponse,HttpStatus.OK); + } } diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/models/ExpenseBillReportData.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/models/ExpenseBillReportData.java new file mode 100644 index 000000000..28777db1e --- /dev/null +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/models/ExpenseBillReportData.java @@ -0,0 +1,56 @@ +package org.egov.echallan.web.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; +import org.egov.echallan.model.Amount; +import org.hibernate.validator.constraints.SafeHtml; + +import java.util.List; + +@Builder +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class ExpenseBillReportData +{ + @JsonProperty("typeOfExpense") + private String typeOfExpense; + + @JsonProperty("vendorName") + private String vendorName; + + @JsonProperty("amount") + private List amount; + + @JsonProperty("billDate") + private Long billDate; + + @JsonProperty("taxPeriodFrom") + private Long taxPeriodFrom; + + @JsonProperty("taxPeriodTo") + private Long taxPeriodTo; + + @JsonProperty("applicationStatus") + private String applicationStatus; + + @JsonProperty("paidDate") + private Long paidDate; + + @JsonProperty("filestoreid") + @SafeHtml + private String filestoreid; + + @JsonProperty("lastModifiedTime") + private Long lastModifiedTime; + + @JsonProperty("lastModifiedByUuid") + private String lastModifiedByUuid; + + @JsonProperty("lastModifiedBy") + private String lastModifiedBy; + + @JsonProperty("tenantId") + private String tenantId; +} diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/models/ExpenseBillReportResponse.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/models/ExpenseBillReportResponse.java new file mode 100644 index 000000000..0d1a90711 --- /dev/null +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/models/ExpenseBillReportResponse.java @@ -0,0 +1,20 @@ +package org.egov.echallan.web.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; +import org.apache.coyote.RequestInfo; +import org.egov.common.contract.response.ResponseInfo; + +import java.util.List; + + +@Builder +public class ExpenseBillReportResponse { + + @JsonProperty("ExpenseBillReportData") + private List ExpenseBillReportData; + + @JsonProperty("responseInfo") + private ResponseInfo responseInfo = null; + +} From 7a84f718f742d18316ec1f03a036cfee829b9fe3 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 5 Jan 2024 11:49:40 +0530 Subject: [PATCH 31/70] PFM-4082 Echallan report --- .../repository/rowmapper/ExpenseBillReportRowMapper.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java index a4a96cce1..943e343de 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java @@ -42,7 +42,10 @@ public List extractData(ResultSet resultSet) throws SQLEx expenseBillReportData.setTaxPeriodFrom(resultSet.getLong("taxperiodfrom")); expenseBillReportData.setTaxPeriodTo(resultSet.getLong("taxperiodto")); expenseBillReportData.setApplicationStatus(resultSet.getString("applicationstatus")); + if(resultSet.getString("paiddate")!=null) expenseBillReportData.setPaidDate(resultSet.getLong("paiddate")); + else + expenseBillReportData.setPaidDate(0L); if(resultSet.getString("filestoreid")!=null) expenseBillReportData.setFilestoreid("Yes"); else From af3b4be0f76f10e1df6195be7bc1030e293d7448 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 5 Jan 2024 12:29:45 +0530 Subject: [PATCH 32/70] PFM-4082 Echallan report --- .../repository/rowmapper/ExpenseBillReportRowMapper.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java index 943e343de..90dd67deb 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java @@ -55,6 +55,11 @@ public List extractData(ResultSet resultSet) throws SQLEx expenseBillReportData.setLastModifiedBy(resultSet.getString("lastmodifiedbyUuid")); enrichExpenseHolderDetails(expenseBillReportData); } + else + { + expenseBillReportData.setLastModifiedTime(0L); + expenseBillReportData.setLastModifiedBy(null); + } expenseBillReportDataList.add(expenseBillReportData); } From 85314ac53fa24a5ee5015b22c106b85e75d6dd5d Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 5 Jan 2024 12:44:16 +0530 Subject: [PATCH 33/70] PFM-4082 Echallan report --- .../repository/rowmapper/ExpenseBillReportRowMapper.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java index 90dd67deb..bd61fec66 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java @@ -42,8 +42,11 @@ public List extractData(ResultSet resultSet) throws SQLEx expenseBillReportData.setTaxPeriodFrom(resultSet.getLong("taxperiodfrom")); expenseBillReportData.setTaxPeriodTo(resultSet.getLong("taxperiodto")); expenseBillReportData.setApplicationStatus(resultSet.getString("applicationstatus")); + + log.info("Before if condition"); + if(resultSet.getString("paiddate")!=null) - expenseBillReportData.setPaidDate(resultSet.getLong("paiddate")); + expenseBillReportData.setPaidDate(resultSet.getLong("paiddate")); else expenseBillReportData.setPaidDate(0L); if(resultSet.getString("filestoreid")!=null) @@ -60,6 +63,7 @@ public List extractData(ResultSet resultSet) throws SQLEx expenseBillReportData.setLastModifiedTime(0L); expenseBillReportData.setLastModifiedBy(null); } + log.info("after if condition"); expenseBillReportDataList.add(expenseBillReportData); } @@ -67,6 +71,7 @@ public List extractData(ResultSet resultSet) throws SQLEx // { // enrichExpenseHolderDetails(expenseBillReportDataList); // } + log.info("Before return"); return expenseBillReportDataList; } From 00d4159bcac4b6fa84ec550323816eb5168bd931 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 5 Jan 2024 13:00:12 +0530 Subject: [PATCH 34/70] PFM-4082 Echallan report --- .../java/org/egov/echallan/repository/ChallanRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java index c1e417ca9..77e718ea3 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java @@ -518,7 +518,7 @@ public List getExpenseBillReport(Long monthStartDateTime, } log.info("Query of expense bill report " +expenseBillQuery.toString()+" prepared statement "+preparedStatement); - + List expenseBillReportData=new ArrayList<>(); List expenseBillReportDataList=jdbcTemplate.query(expenseBillQuery.toString(), preparedStatement.toArray(),expenseBillReportRowMapper); return expenseBillReportDataList; } From 5cb49d50b289d9bdc388bafc07c9c2ca25779152 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 5 Jan 2024 14:48:48 +0530 Subject: [PATCH 35/70] PFM-4082 Echallan report --- .../java/org/egov/echallan/repository/ChallanRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java index 77e718ea3..9e93fbed4 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java @@ -518,8 +518,8 @@ public List getExpenseBillReport(Long monthStartDateTime, } log.info("Query of expense bill report " +expenseBillQuery.toString()+" prepared statement "+preparedStatement); - List expenseBillReportData=new ArrayList<>(); - List expenseBillReportDataList=jdbcTemplate.query(expenseBillQuery.toString(), preparedStatement.toArray(),expenseBillReportRowMapper); + List expenseBillReportDataList=new ArrayList<>(); + expenseBillReportDataList=jdbcTemplate.query(expenseBillQuery.toString(), preparedStatement.toArray(),expenseBillReportRowMapper); return expenseBillReportDataList; } } From 248ea2c3002300fa23ed69515e8fb5bc25b1266c Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 5 Jan 2024 15:04:40 +0530 Subject: [PATCH 36/70] PFM-4082 --- .../java/org/egov/echallan/repository/ChallanRepository.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java index 9e93fbed4..f6910e666 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java @@ -83,13 +83,14 @@ public class ChallanRepository { private ObjectMapper mapper; @Autowired public ChallanRepository(Producer producer, ChallanConfiguration config,ChallanQueryBuilder queryBuilder, - JdbcTemplate jdbcTemplate,ChallanRowMapper rowMapper,RestTemplate restTemplate) { + JdbcTemplate jdbcTemplate,ChallanRowMapper rowMapper,RestTemplate restTemplate, ExpenseBillReportRowMapper expenseBillReportRowMapper) { this.producer = producer; this.config = config; this.jdbcTemplate = jdbcTemplate; this.queryBuilder = queryBuilder ; this.rowMapper = rowMapper; this.restTemplate = restTemplate; + this.expenseBillReportRowMapper = expenseBillReportRowMapper; } From 0953ac72e60966658b3275ba8e42fe3aa9a44444 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 5 Jan 2024 15:25:58 +0530 Subject: [PATCH 37/70] PFM-4082 Echallan report --- .../egov/echallan/repository/builder/ChallanQueryBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java index a33e77d83..cfb850382 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java @@ -87,7 +87,7 @@ public ChallanQueryBuilder(ChallanConfiguration config) { public static final String EXPENSEBILLQUERY="SELECT challan.typeofexpense,vendor.name,challan.billdate," + " challan.taxperiodfrom,challan.taxperiodto,challan.applicationstatus,challan.paiddate," + - " challan.filestoreid,challan.lastmodifiedtime,challan.lastmodifiedby from " + + " challan.filestoreid,challan.lastmodifiedtime,challan.lastmodifiedby as lastmodifiedbyUuid from " + " eg_echallan challan LEFT JOIN eg_vendor vendor on challan.vendor=vendor.id " + " where challan.tenantid=? and vendor.status='ACTIVE' and " + " challan.taxperiodfrom >=? order by challan.taxperiodfrom desc "; From f046be913f23bc557f6d81835f194772d636f86d Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 5 Jan 2024 16:25:45 +0530 Subject: [PATCH 38/70] PFM-4082 echallan report --- .../repository/rowmapper/ExpenseBillReportRowMapper.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java index bd61fec66..3ac18c7b9 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; +import org.egov.echallan.model.UserInfo; import org.egov.echallan.service.UserService; import org.egov.echallan.web.models.ExpenseBillReportData; import org.egov.echallan.web.models.ExpenseBillReportResponse; @@ -96,8 +97,9 @@ private void enrichExpenseHolderDetails(ExpenseBillReportData expenseBillReportD private void enrichConnectionHolderInfo(UserDetailResponse userDetailResponse, ExpenseBillReportData expenseBillReportData) { - User connectionHolderInfos= (User) userDetailResponse.getUser(); + List connectionHolderInfos= userDetailResponse.getUser(); +// Map log.info(connectionHolderInfos.toString()); - expenseBillReportData.setLastModifiedBy(connectionHolderInfos.getName()); + expenseBillReportData.setLastModifiedBy(connectionHolderInfos.get(0).getUserName()); } } From fa100e437122f05fd5400cebea8bba2f1b20ecd8 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 5 Jan 2024 17:54:37 +0530 Subject: [PATCH 39/70] PFM-4082 echallan report --- .../rowmapper/ExpenseBillReportRowMapper.java | 23 ++++++------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java index 3ac18c7b9..7f5d779fa 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java @@ -56,7 +56,7 @@ public List extractData(ResultSet resultSet) throws SQLEx expenseBillReportData.setFilestoreid("No"); if(Objects.equals(resultSet.getString("applicationstatus"), "CANCELLED")) { expenseBillReportData.setLastModifiedTime(resultSet.getLong("lastmodifiedtime")); - expenseBillReportData.setLastModifiedBy(resultSet.getString("lastmodifiedbyUuid")); + expenseBillReportData.setLastModifiedByUuid(resultSet.getString("lastmodifiedbyUuid")); enrichExpenseHolderDetails(expenseBillReportData); } else @@ -68,29 +68,18 @@ public List extractData(ResultSet resultSet) throws SQLEx expenseBillReportDataList.add(expenseBillReportData); } -// if() -// { -// enrichExpenseHolderDetails(expenseBillReportDataList); -// } log.info("Before return"); return expenseBillReportDataList; } private void enrichExpenseHolderDetails(ExpenseBillReportData expenseBillReportData) { -// Set lastModifiedByUuid =new HashSet<>(); -// -// for(ExpenseBillReportData expenseBillReportData:expenseBillReportData) -// { -// lastModifiedByUuid.add(expenseBillReportData.getLastModifiedBy()); -// } - UserSearchRequest userSearchRequest=new UserSearchRequest(); userSearchRequest.setUuid(Collections.singletonList(expenseBillReportData.getLastModifiedByUuid())); - log.info(userSearchRequest.getUuid().toString()); + log.info("Uuid's for searching users"+userSearchRequest.getUuid().toString()); UserDetailResponse userDetailResponse=userService.getUsers(userSearchRequest); - log.info(userDetailResponse.getUser().toString()); + log.info("User after searching"+userDetailResponse.getUser().toString()); enrichConnectionHolderInfo(userDetailResponse,expenseBillReportData); } @@ -98,8 +87,10 @@ private void enrichExpenseHolderDetails(ExpenseBillReportData expenseBillReportD private void enrichConnectionHolderInfo(UserDetailResponse userDetailResponse, ExpenseBillReportData expenseBillReportData) { List connectionHolderInfos= userDetailResponse.getUser(); -// Map - log.info(connectionHolderInfos.toString()); + if (connectionHolderInfos.isEmpty()) { + return; + } + log.info("Users in enrichConnectionHolderInfo method"+connectionHolderInfos.toString()); expenseBillReportData.setLastModifiedBy(connectionHolderInfos.get(0).getUserName()); } } From 6f5cb5808bcfd7a4a59928937b7517ec7d84cbae Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Mon, 8 Jan 2024 22:39:14 +0530 Subject: [PATCH 40/70] PFM-4082 echallan report --- .../builder/ChallanQueryBuilder.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java index cfb850382..22978582a 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java @@ -85,12 +85,18 @@ public ChallanQueryBuilder(ChallanConfiguration config) { public static final String PENDINGEXPCOLLTILLDATE = "SELECT coalesce(SUM(DMDL.TAXAMOUNT - DMDL.COLLECTIONAMOUNT),0) FROM EGBS_DEMAND_V1 DMD INNER JOIN EGBS_DEMANDDETAIL_V1 DMDL ON DMD.ID=DMDL.DEMANDID AND DMD.TENANTID=DMDL.TENANTID INNER JOIN EG_ECHALLAN CH ON CH.referenceId=DMD.CONSUMERCODE AND DMD.TENANTID=CH.TENANTID WHERE DMD.BUSINESSSERVICE LIKE '%EXPENSE%' and DMD.status='ACTIVE' "; - public static final String EXPENSEBILLQUERY="SELECT challan.typeofexpense,vendor.name,challan.billdate," + - " challan.taxperiodfrom,challan.taxperiodto,challan.applicationstatus,challan.paiddate," + - " challan.filestoreid,challan.lastmodifiedtime,challan.lastmodifiedby as lastmodifiedbyUuid from " + - " eg_echallan challan LEFT JOIN eg_vendor vendor on challan.vendor=vendor.id " + - " where challan.tenantid=? and vendor.status='ACTIVE' and " + - " challan.taxperiodfrom >=? order by challan.taxperiodfrom desc "; + public static final String EXPENSEBILLQUERY="SELECT challan.typeofexpense,vendor.name,challan.billdate, " + + " challan.taxperiodfrom,challan.taxperiodto,challan.applicationstatus, " + + " challan.paiddate,challan.filestoreid,challan.lastmodifiedtime, " + + " challan.lastmodifiedby as lastmodifiedbyUuid,SUM(dd.taxamount) as total_taxamount " + + " FROM eg_echallan challan LEFT JOIN eg_vendor vendor ON challan.vendor = vendor.id " + + " LEFT JOIN egbs_demand_v1 d ON challan.challanno = d.consumercode " + + " LEFT JOIN egbs_demanddetail_v1 dd ON d.id = dd.demandid WHERE " + + " challan.tenantid = ? AND dd.tenantid = 'pb.aulakh' " + + " AND vendor.status = 'ACTIVE' AND challan.taxperiodfrom >= ? " + + " GROUP BY challan.typeofexpense,vendor.name,challan.billdate,challan.taxperiodfrom, " + + " challan.taxperiodto,challan.applicationstatus,challan.paiddate,challan.filestoreid, " + + " challan.lastmodifiedtime,challan.lastmodifiedby ORDER BY challan.taxperiodfrom DESC; "; public String getChallanSearchQuery(SearchCriteria criteria, List preparedStmtList) { From d5da256adbae1081d5bfb8a7b9482b5766275148 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Tue, 9 Jan 2024 13:41:36 +0530 Subject: [PATCH 41/70] PFM-4082 echallan report --- .../repository/rowmapper/ExpenseBillReportRowMapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java index 7f5d779fa..588a0b305 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java @@ -91,6 +91,6 @@ private void enrichConnectionHolderInfo(UserDetailResponse userDetailResponse, E return; } log.info("Users in enrichConnectionHolderInfo method"+connectionHolderInfos.toString()); - expenseBillReportData.setLastModifiedBy(connectionHolderInfos.get(0).getUserName()); + expenseBillReportData.setLastModifiedBy(connectionHolderInfos.get(0).getName()); } } From 3c8e40bcee5458ad2482275f87588ea38341c3c0 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Tue, 9 Jan 2024 13:43:15 +0530 Subject: [PATCH 42/70] PFM-4082 echallan report --- .../egov/echallan/repository/builder/ChallanQueryBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java index 22978582a..6f47d406e 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java @@ -92,7 +92,7 @@ public ChallanQueryBuilder(ChallanConfiguration config) { " FROM eg_echallan challan LEFT JOIN eg_vendor vendor ON challan.vendor = vendor.id " + " LEFT JOIN egbs_demand_v1 d ON challan.challanno = d.consumercode " + " LEFT JOIN egbs_demanddetail_v1 dd ON d.id = dd.demandid WHERE " + - " challan.tenantid = ? AND dd.tenantid = 'pb.aulakh' " + + " challan.tenantid = ? AND dd.tenantid = ? " + " AND vendor.status = 'ACTIVE' AND challan.taxperiodfrom >= ? " + " GROUP BY challan.typeofexpense,vendor.name,challan.billdate,challan.taxperiodfrom, " + " challan.taxperiodto,challan.applicationstatus,challan.paiddate,challan.filestoreid, " + From ed227aedc3dddb60fd649b6c1facc451eb952d3f Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Tue, 9 Jan 2024 13:44:20 +0530 Subject: [PATCH 43/70] PFM-4082 echallan report --- .../java/org/egov/echallan/repository/ChallanRepository.java | 1 + 1 file changed, 1 insertion(+) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java index f6910e666..e1896111f 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java @@ -496,6 +496,7 @@ public List getExpenseBillReport(Long monthStartDateTime, List preparedStatement=new ArrayList<>(); preparedStatement.add(tenantId); + preparedStatement.add(tenantId); preparedStatement.add(monthStartDateTime); Integer newLimit=config.getDefaultLimit(); From 6a058a7980b1c81911dc9a209a779a769d421f3c Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Tue, 9 Jan 2024 14:25:32 +0530 Subject: [PATCH 44/70] PFM-4082 echallan report --- .../egov/echallan/repository/builder/ChallanQueryBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java index 6f47d406e..2c107080c 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java @@ -96,7 +96,7 @@ public ChallanQueryBuilder(ChallanConfiguration config) { " AND vendor.status = 'ACTIVE' AND challan.taxperiodfrom >= ? " + " GROUP BY challan.typeofexpense,vendor.name,challan.billdate,challan.taxperiodfrom, " + " challan.taxperiodto,challan.applicationstatus,challan.paiddate,challan.filestoreid, " + - " challan.lastmodifiedtime,challan.lastmodifiedby ORDER BY challan.taxperiodfrom DESC; "; + " challan.lastmodifiedtime,challan.lastmodifiedby ORDER BY challan.taxperiodfrom DESC "; public String getChallanSearchQuery(SearchCriteria criteria, List preparedStmtList) { From c220fd3f992cef35ad2efe76b21861448631b363 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Tue, 9 Jan 2024 14:46:07 +0530 Subject: [PATCH 45/70] PFM-4082 echallan report --- .../org/egov/echallan/web/models/ExpenseBillReportData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/models/ExpenseBillReportData.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/models/ExpenseBillReportData.java index 28777db1e..321a451a9 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/models/ExpenseBillReportData.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/models/ExpenseBillReportData.java @@ -21,7 +21,7 @@ public class ExpenseBillReportData private String vendorName; @JsonProperty("amount") - private List amount; + private Long amount; @JsonProperty("billDate") private Long billDate; From 8237b2e1198b8a0ff3c9adeebb65798a1307d694 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Tue, 9 Jan 2024 14:47:07 +0530 Subject: [PATCH 46/70] PFM-4082 echallan report --- .../repository/rowmapper/ExpenseBillReportRowMapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java index 588a0b305..c66833b30 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java @@ -38,7 +38,7 @@ public List extractData(ResultSet resultSet) throws SQLEx ExpenseBillReportData expenseBillReportData=new ExpenseBillReportData(); expenseBillReportData.setTypeOfExpense(resultSet.getString("typeofexpense")); expenseBillReportData.setVendorName(resultSet.getString("name")); -// expenseBillReportData.setAmount(resultSet.getString("")); + expenseBillReportData.setAmount(resultSet.getLong("total_taxamount")); expenseBillReportData.setBillDate(resultSet.getLong("billdate")); expenseBillReportData.setTaxPeriodFrom(resultSet.getLong("taxperiodfrom")); expenseBillReportData.setTaxPeriodTo(resultSet.getLong("taxperiodto")); From d2425bb6fce46fc86d3a3a279d3c5b4e215330e8 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Tue, 9 Jan 2024 17:22:05 +0530 Subject: [PATCH 47/70] PFM-4082 echallan report --- .../repository/rowmapper/ExpenseBillReportRowMapper.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java index c66833b30..127dbad55 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/rowmapper/ExpenseBillReportRowMapper.java @@ -44,8 +44,6 @@ public List extractData(ResultSet resultSet) throws SQLEx expenseBillReportData.setTaxPeriodTo(resultSet.getLong("taxperiodto")); expenseBillReportData.setApplicationStatus(resultSet.getString("applicationstatus")); - log.info("Before if condition"); - if(resultSet.getString("paiddate")!=null) expenseBillReportData.setPaidDate(resultSet.getLong("paiddate")); else @@ -64,11 +62,8 @@ public List extractData(ResultSet resultSet) throws SQLEx expenseBillReportData.setLastModifiedTime(0L); expenseBillReportData.setLastModifiedBy(null); } - log.info("after if condition"); expenseBillReportDataList.add(expenseBillReportData); } - - log.info("Before return"); return expenseBillReportDataList; } From 36fd139be53a834895c95270fd31378327f4b721 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Wed, 10 Jan 2024 12:08:47 +0530 Subject: [PATCH 48/70] PFM-4082 echallan report --- .../egov/echallan/repository/ChallanRepository.java | 3 ++- .../repository/builder/ChallanQueryBuilder.java | 2 +- .../org/egov/echallan/service/ChallanService.java | 12 +++++------- .../echallan/web/controllers/ChallanController.java | 3 ++- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java index e1896111f..049eb49d6 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java @@ -490,7 +490,7 @@ public List fetchESIds(SearchCriteria criteria) { return ids; } - public List getExpenseBillReport(Long monthStartDateTime, String tenantId, Integer offset, Integer limit) + public List getExpenseBillReport(Long monthStartDateTime, Long monthEndDateTime, String tenantId, Integer offset, Integer limit) { StringBuilder expenseBillQuery =new StringBuilder(queryBuilder.EXPENSEBILLQUERY); @@ -498,6 +498,7 @@ public List getExpenseBillReport(Long monthStartDateTime, preparedStatement.add(tenantId); preparedStatement.add(tenantId); preparedStatement.add(monthStartDateTime); + preparedStatement.add(monthEndDateTime); Integer newLimit=config.getDefaultLimit(); Integer newOffset=config.getDefaultOffset(); diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java index 2c107080c..b2b809253 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java @@ -93,7 +93,7 @@ public ChallanQueryBuilder(ChallanConfiguration config) { " LEFT JOIN egbs_demand_v1 d ON challan.challanno = d.consumercode " + " LEFT JOIN egbs_demanddetail_v1 dd ON d.id = dd.demandid WHERE " + " challan.tenantid = ? AND dd.tenantid = ? " + - " AND vendor.status = 'ACTIVE' AND challan.taxperiodfrom >= ? " + + " AND challan.createdtime >= ? AND challan.createdtime <= ?" + " GROUP BY challan.typeofexpense,vendor.name,challan.billdate,challan.taxperiodfrom, " + " challan.taxperiodto,challan.applicationstatus,challan.paiddate,challan.filestoreid, " + " challan.lastmodifiedtime,challan.lastmodifiedby ORDER BY challan.taxperiodfrom DESC "; diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java index f6f1fb20f..a40c8f662 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java @@ -2,11 +2,7 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.Month; -import java.time.YearMonth; -import java.time.ZoneId; +import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import java.util.*; @@ -380,15 +376,17 @@ public List getChallansWithOwnerInfoForPlaneSearch(SearchCriteria crite return challans; } - public List expenseBillReport(RequestInfo requestInfo, String monthstartDate, String tenantId, Integer offset, Integer limit) + public List expenseBillReport(RequestInfo requestInfo, String monthstartDate,String monthendDate, String tenantId, Integer offset, Integer limit) { DateTimeFormatter dtf=DateTimeFormatter.ofPattern("dd/MM/yyyy"); LocalDate startDate=LocalDate.parse(monthstartDate,dtf); + LocalDate endDate=LocalDate.parse(monthendDate,dtf); Long monthStartDateTime=LocalDateTime.of(startDate.getYear(),startDate.getMonth(),startDate.getDayOfMonth(), 0,0,0).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + Long monthEndDateTime=LocalDateTime.of(endDate, LocalTime.MAX).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); - List expenseBillReport=repository.getExpenseBillReport(monthStartDateTime,tenantId,offset,limit); + List expenseBillReport=repository.getExpenseBillReport(monthStartDateTime,monthEndDateTime,tenantId,offset,limit); return expenseBillReport; } diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/controllers/ChallanController.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/controllers/ChallanController.java index c9a6f28cc..33471c13a 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/controllers/ChallanController.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/web/controllers/ChallanController.java @@ -166,11 +166,12 @@ public ResponseEntity updateCreateoPayment(@Valid @RequestBody @PostMapping("/_expenseBillReport") public ResponseEntity expenseBillReport(@Valid @RequestBody RequestInfoWrapper requestInfoWrapper, @RequestParam("monthstartDate") String monthstartDate, + @RequestParam("monthendDate") String monthendDate, @RequestParam("tenantId") String tenantId, @RequestParam("offset") Integer offset, @RequestParam("limit") Integer limit) { - List expenseBillReport=challanService.expenseBillReport(requestInfoWrapper.getRequestInfo(),monthstartDate,tenantId,offset,limit); + List expenseBillReport=challanService.expenseBillReport(requestInfoWrapper.getRequestInfo(),monthstartDate,monthendDate,tenantId,offset,limit); ExpenseBillReportResponse expenseBillReportResponse= ExpenseBillReportResponse.builder().ExpenseBillReportData(expenseBillReport) .responseInfo(responseInfoFactory.createResponseInfoFromRequestInfo(requestInfoWrapper.getRequestInfo(), From 0feeffb1532b12059f1a265aab18b729a470ed33 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Wed, 10 Jan 2024 12:59:02 +0530 Subject: [PATCH 49/70] PFM-4082 echallan report --- .../egov/echallan/repository/builder/ChallanQueryBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java index b2b809253..5b7e2ddc1 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java @@ -96,7 +96,7 @@ public ChallanQueryBuilder(ChallanConfiguration config) { " AND challan.createdtime >= ? AND challan.createdtime <= ?" + " GROUP BY challan.typeofexpense,vendor.name,challan.billdate,challan.taxperiodfrom, " + " challan.taxperiodto,challan.applicationstatus,challan.paiddate,challan.filestoreid, " + - " challan.lastmodifiedtime,challan.lastmodifiedby ORDER BY challan.taxperiodfrom DESC "; + " challan.lastmodifiedtime,challan.lastmodifiedby ORDER BY challan.createdtime DESC "; public String getChallanSearchQuery(SearchCriteria criteria, List preparedStmtList) { From 0009d4e84ecb1d75094053d0f20d6830d47b0746 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Wed, 10 Jan 2024 15:06:00 +0530 Subject: [PATCH 50/70] PFM-4082 --- .../reports/expense_bill_report_data.dart | 64 ++++++++++ .../lib/providers/reports_provider.dart | 110 +++++++++++++++++- .../lib/repository/reports_repo.dart | 37 ++++++ .../screeens/reports/expense_bill_report.dart | 107 +++++++++++++++++ .../lib/screeens/reports/reports.dart | 4 +- frontend/mgramseva/lib/services/urls.dart | 2 + .../utils/constants/i18_key_constants.dart | 6 + .../lib/utils/testing_keys/testing_keys.dart | 1 + 8 files changed, 329 insertions(+), 2 deletions(-) create mode 100644 frontend/mgramseva/lib/model/reports/expense_bill_report_data.dart create mode 100644 frontend/mgramseva/lib/screeens/reports/expense_bill_report.dart diff --git a/frontend/mgramseva/lib/model/reports/expense_bill_report_data.dart b/frontend/mgramseva/lib/model/reports/expense_bill_report_data.dart new file mode 100644 index 000000000..109d24491 --- /dev/null +++ b/frontend/mgramseva/lib/model/reports/expense_bill_report_data.dart @@ -0,0 +1,64 @@ +class ExpenseBillReportData { + String? typeOfExpense; + String? vendorName; + int? amount; + int? billDate; + int? taxPeriodFrom; + int? taxPeriodTo; + String? applicationStatus; + int? paidDate; + String? filestoreid; + int? lastModifiedTime; + dynamic? lastModifiedByUuid; + dynamic? lastModifiedBy; + String? tenantId; + + ExpenseBillReportData( + {this.typeOfExpense, + this.vendorName, + this.amount, + this.billDate, + this.taxPeriodFrom, + this.taxPeriodTo, + this.applicationStatus, + this.paidDate, + this.filestoreid, + this.lastModifiedTime, + this.lastModifiedByUuid, + this.lastModifiedBy, + this.tenantId}); + + ExpenseBillReportData.fromJson(Map json) { + typeOfExpense = json['typeOfExpense']; + vendorName = json['vendorName']; + amount = json['amount']; + billDate = json['billDate']; + taxPeriodFrom = json['taxPeriodFrom']; + taxPeriodTo = json['taxPeriodTo']; + applicationStatus = json['applicationStatus']; + paidDate = json['paidDate']; + filestoreid = json['filestoreid']; + lastModifiedTime = json['lastModifiedTime']; + lastModifiedByUuid = json['lastModifiedByUuid']; + lastModifiedBy = json['lastModifiedBy']; + tenantId = json['tenantId']; + } + + Map toJson() { + final Map data = new Map(); + data['typeOfExpense'] = this.typeOfExpense; + data['vendorName'] = this.vendorName; + data['amount'] = this.amount; + data['billDate'] = this.billDate; + data['taxPeriodFrom'] = this.taxPeriodFrom; + data['taxPeriodTo'] = this.taxPeriodTo; + data['applicationStatus'] = this.applicationStatus; + data['paidDate'] = this.paidDate; + data['filestoreid'] = this.filestoreid; + data['lastModifiedTime'] = this.lastModifiedTime; + data['lastModifiedByUuid'] = this.lastModifiedByUuid; + data['lastModifiedBy'] = this.lastModifiedBy; + data['tenantId'] = this.tenantId; + return data; + } +} \ No newline at end of file diff --git a/frontend/mgramseva/lib/providers/reports_provider.dart b/frontend/mgramseva/lib/providers/reports_provider.dart index dfa75bfd3..3dade3de0 100644 --- a/frontend/mgramseva/lib/providers/reports_provider.dart +++ b/frontend/mgramseva/lib/providers/reports_provider.dart @@ -10,6 +10,7 @@ import '../model/localization/language.dart'; import '../model/mdms/tax_period.dart'; import '../model/reports/bill_report_data.dart'; import '../model/reports/collection_report_data.dart'; +import '../model/reports/expense_bill_report_data.dart'; import '../repository/core_repo.dart'; import '../repository/reports_repo.dart'; import '../utils/common_methods.dart'; @@ -36,6 +37,7 @@ class ReportsProvider with ChangeNotifier { List? demandreports; List? collectionreports; List? inactiveconsumers; + List? expenseBillReportData; BillsTableData genericTableData = BillsTableData([], []); int limit = 10; int offset = 1; @@ -88,7 +90,20 @@ class ReportsProvider with ChangeNotifier { TableHeader(i18.common.INACTIVATED_DATE), TableHeader(i18.common.INACTIVATED_BY_NAME), ]; + List get expenseBillReportHeaderList => [ + TableHeader(i18.expense.EXPENSE_TYPE), + TableHeader(i18.expense.VENDOR_NAME), + TableHeader(i18.expense.AMOUNT), + TableHeader(i18.expense.BILL_DATE), + TableHeader(i18.expense.EXPENSE_START_DATE), + TableHeader(i18.expense.EXPENSE_END_DATE), + TableHeader(i18.expense.APPLICATION_STATUS), + TableHeader(i18.expense.PAID_DATE), + TableHeader(i18.expense.FILE_LINK), + TableHeader(i18.expense.LAST_MODIFIED_TIME), + TableHeader(i18.expense.LAST_MODIFIED_BY), + ]; void onChangeOfPageLimit( PaginationResponse response, String type, BuildContext context) { if (type == i18.dashboard.BILL_REPORT) { @@ -172,6 +187,36 @@ class ReportsProvider with ChangeNotifier { TableData('${inactivatedBy ?? '-'}'), ]); } + List getExpenseBillReportData(List list, + {bool isExcel = false}) { + return list.map((e) => getExpenseBillReportDataRow(e, isExcel: isExcel)).toList(); + } + TableDataRow getExpenseBillReportDataRow(ExpenseBillReportData data, + {bool isExcel = false}) { + String? vendorName = CommonMethods.truncateWithEllipsis(20, data.vendorName!); + String? typeOfExpense = CommonMethods.truncateWithEllipsis(20, data.typeOfExpense!); + String? applicationStatus = CommonMethods.truncateWithEllipsis(20, data.applicationStatus!); + String? lastModifiedBy = CommonMethods.truncateWithEllipsis(20, data.lastModifiedBy!); + String? fileLink = CommonMethods.truncateWithEllipsis(20, data.filestoreid!); + var billDate = DateFormats.timeStampToDate(data.billDate?.toInt(),format: "dd/MM/yyyy"); + var taxPeriodFrom = DateFormats.timeStampToDate(data.taxPeriodFrom?.toInt(),format: "dd/MM/yyyy"); + var taxPeriodTo = DateFormats.timeStampToDate(data.taxPeriodTo?.toInt(),format: "dd/MM/yyyy"); + var paidDate = DateFormats.timeStampToDate(data.paidDate?.toInt(),format: "dd/MM/yyyy"); + var lastModifiedTime = DateFormats.timeStampToDate(data.lastModifiedTime?.toInt(),format: "dd/MM/yyyy"); + return TableDataRow([ + TableData('${typeOfExpense ?? '-'}'), + TableData('${vendorName ?? '-'}'), + TableData('${data.amount ?? '-'}'), + TableData('${billDate ?? '-'}'), + TableData('${taxPeriodFrom ?? '-'}'), + TableData('${taxPeriodTo ?? '-'}'), + TableData('${applicationStatus ?? '-'}'), + TableData('${paidDate ?? '-'}'), + TableData('${fileLink ?? '-'}'), + TableData('${lastModifiedTime ?? '-'}'), + TableData('${lastModifiedBy ?? '-'}'), + ]); + } void callNotifier() { notifyListeners(); } @@ -524,7 +569,70 @@ class ReportsProvider with ChangeNotifier { callNotifier(); } } - + Future getExpenseBillReport( + {bool download = false, + int offset = 1, + int limit = 10, + String sortOrder = "ASC"}) async { + try { + var commonProvider = Provider.of( + navigatorKey.currentContext!, + listen: false); + if (selectedBillPeriod == null) { + throw Exception('Select Billing Cycle'); + } + Map params = { + 'tenantId': commonProvider.userDetails!.selectedtenant!.code, + 'monthstartDate': selectedBillPeriod?.split('-')[0], + 'monthendDate': selectedBillPeriod?.split('-')[1], + 'offset': '${offset - 1}', + 'limit': '${download ? -1 : limit}', + 'sortOrder': '$sortOrder' + }; + var response = await ReportsRepo().fetchExpenseBillReport(params); + if (response != null) { + expenseBillReportData = response; + if (download) { + generateExcel( + expenseBillReportHeaderList + .map((e) => + '${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(e.label)}') + .toList(), + getExpenseBillReportData(expenseBillReportData!, isExcel: true) + .map>( + (e) => e.tableRow.map((e) => e.label).toList()) + .toList() ?? + [], + title: + 'ExpenseBillReport_${commonProvider.userDetails?.selectedtenant?.code?.substring(3)}_${selectedBillPeriod.toString().replaceAll('/', '_')}', + optionalData: [ + 'Expense Bill Report', + '$selectedBillPeriod', + '${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(commonProvider.userDetails!.selectedtenant!.code!)}', + '${commonProvider.userDetails?.selectedtenant?.code?.substring(3)}', + 'Downloaded On ${DateFormats.timeStampToDate(DateTime.now().millisecondsSinceEpoch, format: 'dd/MMM/yyyy')}' + ]); + } else { + if (expenseBillReportData != null && expenseBillReportData!.isNotEmpty) { + this.limit = limit; + this.offset = offset; + this.genericTableData = BillsTableData( + expenseBillReportHeaderList, getExpenseBillReportData(expenseBillReportData!)); + } + } + streamController.add(response); + callNotifier(); + } else { + streamController.add('error'); + throw Exception('API Error'); + } + } + catch (e, s) { + ErrorHandler().allExceptionsHandler(navigatorKey.currentContext!, e, s); + streamController.addError('error'); + callNotifier(); + } + } void clearBuildTableData() { genericTableData = BillsTableData([], []); callNotifier(); diff --git a/frontend/mgramseva/lib/repository/reports_repo.dart b/frontend/mgramseva/lib/repository/reports_repo.dart index 575853ebc..0f88a4cb7 100644 --- a/frontend/mgramseva/lib/repository/reports_repo.dart +++ b/frontend/mgramseva/lib/repository/reports_repo.dart @@ -1,3 +1,4 @@ +import 'package:mgramseva/model/reports/expense_bill_report_data.dart'; import 'package:mgramseva/services/urls.dart'; import 'package:mgramseva/services/base_service.dart'; import 'package:provider/provider.dart'; @@ -121,4 +122,40 @@ class ReportsRepo extends BaseService{ } return inactiveConsumers; } + Future?> fetchExpenseBillReport(Map params, + [String? token]) async { + var commonProvider = Provider.of( + navigatorKey.currentContext!, + listen: false); + List? expenseBillReports; + final requestInfo = RequestInfo( + APIConstants.API_MODULE_NAME, + APIConstants.API_VERSION, + APIConstants.API_TS, + '_get', + APIConstants.API_DID, + APIConstants.API_KEY, + APIConstants.API_MESSAGE_ID, + commonProvider.userDetails?.accessToken, + commonProvider.userDetails?.userRequest?.toJson()); + + var res = await makeRequest( + url: Url.EXPENSE_BILL_REPORT, + queryParameters: params, + requestInfo: requestInfo, + body: {}, + method: RequestType.POST); + if (res != null && res['ExpenseBillReportData'] != null) { + try { + expenseBillReports = []; + res['ExpenseBillReportData'].forEach((val){ + expenseBillReports?.add(ExpenseBillReportData.fromJson(val)); + }); + } catch (e) { + print(e); + expenseBillReports = null; + } + } + return expenseBillReports; + } } \ No newline at end of file diff --git a/frontend/mgramseva/lib/screeens/reports/expense_bill_report.dart b/frontend/mgramseva/lib/screeens/reports/expense_bill_report.dart new file mode 100644 index 000000000..01deb2519 --- /dev/null +++ b/frontend/mgramseva/lib/screeens/reports/expense_bill_report.dart @@ -0,0 +1,107 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../providers/reports_provider.dart'; +import '../../utils/localization/application_localizations.dart'; +import 'package:mgramseva/utils/constants/i18_key_constants.dart'; +import '../../utils/notifiers.dart'; +import '../../utils/testing_keys/testing_keys.dart'; +import '../../widgets/button.dart'; + +class ExpenseBillReport extends StatefulWidget { + final Function onViewClick; + + ExpenseBillReport({Key? key, required this.onViewClick}) : super(key: key); + + @override + State createState() => _ExpenseBillReportState(); +} + +class _ExpenseBillReportState extends State + with SingleTickerProviderStateMixin { + @override + Widget build(BuildContext context) { + return LayoutBuilder(builder: (context, constraints) { + final isWideScreen = constraints.maxWidth > 700; + final containerMargin = isWideScreen + ? const EdgeInsets.only(top: 5.0, bottom: 5, right: 20, left: 10) + : const EdgeInsets.symmetric(vertical: 5.0, horizontal: 8); + return Consumer(builder: (_, reportProvider, child) { + return Container( + margin: containerMargin, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 30, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: constraints.maxWidth > 344?constraints.maxWidth / 2.5:constraints.maxWidth / 3, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "4. ", + style: TextStyle(fontSize: 14, fontWeight: FontWeight.w700), + ), + Expanded( + child: Text( + ApplicationLocalizations.of(context) + .translate(i18.dashboard.EXPENSE_BILL_REPORT), + maxLines: 3, + style: TextStyle(fontSize: 14, fontWeight: FontWeight.w700), + ), + ), + ], + ), + ), + Row( + children: [ + Container( + width: 50, + child: Button( + ApplicationLocalizations.of(context) + .translate(i18.common.VIEW), + () { + if (reportProvider.selectedBillPeriod == null) { + Notifiers.getToastMessage( + context, 'Select Billing Cycle', 'ERROR'); + } else { + reportProvider.clearTableData(); + reportProvider.getExpenseBillReport(); + widget.onViewClick( + true, i18.dashboard.EXPENSE_BILL_REPORT); + } + }, + key: Keys.billReport.EXPENSE_BILL_REPORT_VIEW_BUTTON, + ), + ), + SizedBox( + width: 10, + ), + TextButton.icon( + onPressed: () { + if (reportProvider.selectedBillPeriod == null) { + Notifiers.getToastMessage( + context, 'Select Billing Cycle', 'ERROR'); + } else { + reportProvider.getExpenseBillReport(download: true); + } + }, + icon: Icon(Icons.download_sharp), + label: Text(ApplicationLocalizations.of(context) + .translate(i18.common.CORE_DOWNLOAD))), + ], + ), + ], + ), + ], + ), + ); + }); + }); + } +} diff --git a/frontend/mgramseva/lib/screeens/reports/reports.dart b/frontend/mgramseva/lib/screeens/reports/reports.dart index 95fe976a2..72ae25668 100644 --- a/frontend/mgramseva/lib/screeens/reports/reports.dart +++ b/frontend/mgramseva/lib/screeens/reports/reports.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:mgramseva/screeens/reports/expense_bill_report.dart'; import 'package:mgramseva/screeens/reports/inactive_consumer_report.dart'; import 'package:mgramseva/screeens/reports/view_table.dart'; import 'package:provider/provider.dart'; @@ -214,7 +215,8 @@ class _Reports extends State with SingleTickerProviderStateMixin { children: [ BillReport(onViewClick: showTable), CollectionReport(onViewClick: showTable), - InactiveConsumerReport(onViewClick: showTable,) + InactiveConsumerReport(onViewClick: showTable,), + ExpenseBillReport(onViewClick: showTable,) ], ), ), diff --git a/frontend/mgramseva/lib/services/urls.dart b/frontend/mgramseva/lib/services/urls.dart index 9972db9f3..634f402e8 100644 --- a/frontend/mgramseva/lib/services/urls.dart +++ b/frontend/mgramseva/lib/services/urls.dart @@ -93,6 +93,8 @@ class Url { 'ws-services/wc/_collectionReport'; static const String INACTIVE_CONSUMER_REPORT= 'ws-services/wc/_inactiveConsumerReport'; + static const String EXPENSE_BILL_REPORT= + 'echallan-services/eChallan/v1/_expenseBillReport'; } diff --git a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart index ec4a240b3..4aff616a7 100644 --- a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart +++ b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart @@ -357,6 +357,11 @@ class Expense { String get HAS_THIS_BILL_PAID => 'HAS_THIS_BILL_PAID'; String get CANCELLED => 'CANCELLED'; String get ADD_NEW_EXPENSE => 'ADD_NEW_EXPENSE'; + String get APPLICATION_STATUS => 'APPLICATION_STATUS'; + String get PAID_DATE => 'PAID_DATE'; + String get FILE_LINK => 'FILE_LINK'; + String get LAST_MODIFIED_TIME => 'LAST_MODIFIED_TIME'; + String get LAST_MODIFIED_BY => 'LAST_MODIFIED_BY'; } class CreateConsumer { @@ -656,6 +661,7 @@ class _DashBoard { String get PENDING_EXPENDITURE => 'PENDING_EXPENDITURE'; String get ACTUAL_PAYMENT => 'ACTUAL_PAYMENT'; String get SUMMARY_REPORT => 'SUMMARY_REPORT'; + String get EXPENSE_BILL_REPORT => 'EXPENSE_BILL_REPORT'; String get USER_GAVE_FEEDBACK => 'USER_GAVE_FEEDBACK'; String get ANNUAL_SHARE_MSG_WEB => 'ANNUAL_SHARE_MSG_WEB'; diff --git a/frontend/mgramseva/lib/utils/testing_keys/testing_keys.dart b/frontend/mgramseva/lib/utils/testing_keys/testing_keys.dart index abae97452..b87a79b37 100644 --- a/frontend/mgramseva/lib/utils/testing_keys/testing_keys.dart +++ b/frontend/mgramseva/lib/utils/testing_keys/testing_keys.dart @@ -138,4 +138,5 @@ class BillReportKeys { Key get COLLECTION_REPORT_DOWNLOAD_BUTTON => Key("collection_report_download_button"); Key get BILL_REPORT_BILLING_YEAR => Key("bill_report_billing_year"); Key get BILL_REPORT_BILLING_CYCLE => Key("bill_report_billing_cycle"); + Key get EXPENSE_BILL_REPORT_VIEW_BUTTON => Key("expense_bill_report_view_button"); } \ No newline at end of file From c4ddc9da6b76d1d965a2987429a2d6be110ee9d5 Mon Sep 17 00:00:00 2001 From: Saloni <103189799+saloni041@users.noreply.github.com> Date: Wed, 10 Jan 2024 15:12:33 +0530 Subject: [PATCH 51/70] PFM-4082 echallan report (#694) --- .../egov/echallan/repository/builder/ChallanQueryBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java index 5b7e2ddc1..36f19a550 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java @@ -96,7 +96,7 @@ public ChallanQueryBuilder(ChallanConfiguration config) { " AND challan.createdtime >= ? AND challan.createdtime <= ?" + " GROUP BY challan.typeofexpense,vendor.name,challan.billdate,challan.taxperiodfrom, " + " challan.taxperiodto,challan.applicationstatus,challan.paiddate,challan.filestoreid, " + - " challan.lastmodifiedtime,challan.lastmodifiedby ORDER BY challan.createdtime DESC "; + " challan.lastmodifiedtime,challan.lastmodifiedby,challan.createdtime ORDER BY challan.createdtime DESC "; public String getChallanSearchQuery(SearchCriteria criteria, List preparedStmtList) { From aead5ad4f1abf942b838b9e8a9c0e5fb67238cf3 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Wed, 10 Jan 2024 16:13:39 +0530 Subject: [PATCH 52/70] PFM-4082 --- .../lib/model/reports/expense_bill_report_data.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/mgramseva/lib/model/reports/expense_bill_report_data.dart b/frontend/mgramseva/lib/model/reports/expense_bill_report_data.dart index 109d24491..d8800e602 100644 --- a/frontend/mgramseva/lib/model/reports/expense_bill_report_data.dart +++ b/frontend/mgramseva/lib/model/reports/expense_bill_report_data.dart @@ -9,8 +9,8 @@ class ExpenseBillReportData { int? paidDate; String? filestoreid; int? lastModifiedTime; - dynamic? lastModifiedByUuid; - dynamic? lastModifiedBy; + String? lastModifiedByUuid; + String? lastModifiedBy; String? tenantId; ExpenseBillReportData( @@ -40,7 +40,7 @@ class ExpenseBillReportData { filestoreid = json['filestoreid']; lastModifiedTime = json['lastModifiedTime']; lastModifiedByUuid = json['lastModifiedByUuid']; - lastModifiedBy = json['lastModifiedBy']; + lastModifiedBy = json['lastModifiedBy']??'-'; tenantId = json['tenantId']; } From 4af6423b763eaa9e2fd101a823aa9fa6fcc3b275 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Wed, 10 Jan 2024 16:29:05 +0530 Subject: [PATCH 53/70] PFM-4082 added pagination --- .../lib/model/reports/expense_bill_report_data.dart | 4 ++-- .../mgramseva/lib/providers/reports_provider.dart | 11 +++++++---- .../lib/utils/constants/i18_key_constants.dart | 4 ++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/frontend/mgramseva/lib/model/reports/expense_bill_report_data.dart b/frontend/mgramseva/lib/model/reports/expense_bill_report_data.dart index d8800e602..f017e5f5f 100644 --- a/frontend/mgramseva/lib/model/reports/expense_bill_report_data.dart +++ b/frontend/mgramseva/lib/model/reports/expense_bill_report_data.dart @@ -36,9 +36,9 @@ class ExpenseBillReportData { taxPeriodFrom = json['taxPeriodFrom']; taxPeriodTo = json['taxPeriodTo']; applicationStatus = json['applicationStatus']; - paidDate = json['paidDate']; + paidDate = json['paidDate']??0; filestoreid = json['filestoreid']; - lastModifiedTime = json['lastModifiedTime']; + lastModifiedTime = json['lastModifiedTime']??0; lastModifiedByUuid = json['lastModifiedByUuid']; lastModifiedBy = json['lastModifiedBy']??'-'; tenantId = json['tenantId']; diff --git a/frontend/mgramseva/lib/providers/reports_provider.dart b/frontend/mgramseva/lib/providers/reports_provider.dart index 3dade3de0..02c0cb7fa 100644 --- a/frontend/mgramseva/lib/providers/reports_provider.dart +++ b/frontend/mgramseva/lib/providers/reports_provider.dart @@ -100,8 +100,8 @@ class ReportsProvider with ChangeNotifier { TableHeader(i18.expense.APPLICATION_STATUS), TableHeader(i18.expense.PAID_DATE), TableHeader(i18.expense.FILE_LINK), - TableHeader(i18.expense.LAST_MODIFIED_TIME), - TableHeader(i18.expense.LAST_MODIFIED_BY), + TableHeader(i18.expense.CANCELLED_TIME), + TableHeader(i18.expense.CANCELLED_BY), ]; void onChangeOfPageLimit( @@ -115,6 +115,9 @@ class ReportsProvider with ChangeNotifier { if (type == i18.dashboard.INACTIVE_CONSUMER_REPORT) { getInactiveConsumerReport(limit: response.limit, offset: response.offset); } + if (type == i18.dashboard.EXPENSE_BILL_REPORT) { + getExpenseBillReport(limit: response.limit, offset: response.offset); + } } List getDemandsData(List list, @@ -201,8 +204,8 @@ class ReportsProvider with ChangeNotifier { var billDate = DateFormats.timeStampToDate(data.billDate?.toInt(),format: "dd/MM/yyyy"); var taxPeriodFrom = DateFormats.timeStampToDate(data.taxPeriodFrom?.toInt(),format: "dd/MM/yyyy"); var taxPeriodTo = DateFormats.timeStampToDate(data.taxPeriodTo?.toInt(),format: "dd/MM/yyyy"); - var paidDate = DateFormats.timeStampToDate(data.paidDate?.toInt(),format: "dd/MM/yyyy"); - var lastModifiedTime = DateFormats.timeStampToDate(data.lastModifiedTime?.toInt(),format: "dd/MM/yyyy"); + var paidDate = data.paidDate==0?'-':DateFormats.timeStampToDate(data.paidDate?.toInt(),format: "dd/MM/yyyy"); + var lastModifiedTime = data.lastModifiedTime==0?'-':DateFormats.timeStampToDate(data.lastModifiedTime?.toInt(),format: "dd/MM/yyyy"); return TableDataRow([ TableData('${typeOfExpense ?? '-'}'), TableData('${vendorName ?? '-'}'), diff --git a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart index 4aff616a7..174a3da94 100644 --- a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart +++ b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart @@ -360,8 +360,8 @@ class Expense { String get APPLICATION_STATUS => 'APPLICATION_STATUS'; String get PAID_DATE => 'PAID_DATE'; String get FILE_LINK => 'FILE_LINK'; - String get LAST_MODIFIED_TIME => 'LAST_MODIFIED_TIME'; - String get LAST_MODIFIED_BY => 'LAST_MODIFIED_BY'; + String get CANCELLED_TIME => 'CANCELLED_TIME'; + String get CANCELLED_BY => 'CANCELLED_BY'; } class CreateConsumer { From 960bcff112f12486dd0ebf83c4e3ba854d1ff87d Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Wed, 10 Jan 2024 16:36:58 +0530 Subject: [PATCH 54/70] PFM-4082 --- frontend/mgramseva/lib/providers/reports_provider.dart | 4 ++-- frontend/mgramseva/lib/utils/constants/i18_key_constants.dart | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/mgramseva/lib/providers/reports_provider.dart b/frontend/mgramseva/lib/providers/reports_provider.dart index 02c0cb7fa..f73c8a4b2 100644 --- a/frontend/mgramseva/lib/providers/reports_provider.dart +++ b/frontend/mgramseva/lib/providers/reports_provider.dart @@ -99,7 +99,7 @@ class ReportsProvider with ChangeNotifier { TableHeader(i18.expense.EXPENSE_END_DATE), TableHeader(i18.expense.APPLICATION_STATUS), TableHeader(i18.expense.PAID_DATE), - TableHeader(i18.expense.FILE_LINK), + TableHeader(i18.expense.HAS_ATTACHMENT), TableHeader(i18.expense.CANCELLED_TIME), TableHeader(i18.expense.CANCELLED_BY), @@ -207,7 +207,7 @@ class ReportsProvider with ChangeNotifier { var paidDate = data.paidDate==0?'-':DateFormats.timeStampToDate(data.paidDate?.toInt(),format: "dd/MM/yyyy"); var lastModifiedTime = data.lastModifiedTime==0?'-':DateFormats.timeStampToDate(data.lastModifiedTime?.toInt(),format: "dd/MM/yyyy"); return TableDataRow([ - TableData('${typeOfExpense ?? '-'}'), + TableData('${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(typeOfExpense ?? '-')}'), TableData('${vendorName ?? '-'}'), TableData('${data.amount ?? '-'}'), TableData('${billDate ?? '-'}'), diff --git a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart index 174a3da94..9355c91b0 100644 --- a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart +++ b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart @@ -359,7 +359,7 @@ class Expense { String get ADD_NEW_EXPENSE => 'ADD_NEW_EXPENSE'; String get APPLICATION_STATUS => 'APPLICATION_STATUS'; String get PAID_DATE => 'PAID_DATE'; - String get FILE_LINK => 'FILE_LINK'; + String get HAS_ATTACHMENT => 'HAS_ATTACHMENT'; String get CANCELLED_TIME => 'CANCELLED_TIME'; String get CANCELLED_BY => 'CANCELLED_BY'; } From a7676c9a16e1aa97cd83bb17175159416947a747 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Fri, 12 Jan 2024 13:06:00 +0530 Subject: [PATCH 55/70] PFM-4085 --- .../lib/model/reports/vendor_report_data.dart | 36 ++++++ .../lib/providers/reports_provider.dart | 96 +++++++++++++++ .../lib/repository/reports_repo.dart | 36 ++++++ .../lib/screeens/reports/reports.dart | 4 +- .../lib/screeens/reports/vendor_report.dart | 112 ++++++++++++++++++ frontend/mgramseva/lib/services/urls.dart | 1 + .../utils/constants/i18_key_constants.dart | 1 + .../lib/utils/testing_keys/testing_keys.dart | 1 + 8 files changed, 286 insertions(+), 1 deletion(-) create mode 100644 frontend/mgramseva/lib/model/reports/vendor_report_data.dart create mode 100644 frontend/mgramseva/lib/screeens/reports/vendor_report.dart diff --git a/frontend/mgramseva/lib/model/reports/vendor_report_data.dart b/frontend/mgramseva/lib/model/reports/vendor_report_data.dart new file mode 100644 index 000000000..5b8e6815a --- /dev/null +++ b/frontend/mgramseva/lib/model/reports/vendor_report_data.dart @@ -0,0 +1,36 @@ +class VendorReportData { + String? tenantId; + String? vendorName; + String? mobileNo; + String? typeOfExpense; + String? billId; + String? ownerUuid; + + VendorReportData( + {this.tenantId, + this.vendorName, + this.mobileNo, + this.typeOfExpense, + this.billId, + this.ownerUuid}); + + VendorReportData.fromJson(Map json) { + tenantId = json['tenantId']; + vendorName = json['vendor_name']; + mobileNo = json['mobile_no']; + typeOfExpense = json['type_of_expense']; + billId = json['bill_id']; + ownerUuid = json['owner_uuid']; + } + + Map toJson() { + final Map data = new Map(); + data['tenantId'] = this.tenantId; + data['vendor_name'] = this.vendorName; + data['mobile_no'] = this.mobileNo; + data['type_of_expense'] = this.typeOfExpense; + data['bill_id'] = this.billId; + data['owner_uuid'] = this.ownerUuid; + return data; + } +} \ No newline at end of file diff --git a/frontend/mgramseva/lib/providers/reports_provider.dart b/frontend/mgramseva/lib/providers/reports_provider.dart index f73c8a4b2..959178400 100644 --- a/frontend/mgramseva/lib/providers/reports_provider.dart +++ b/frontend/mgramseva/lib/providers/reports_provider.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:mgramseva/model/reports/InactiveConsumerReportData.dart'; +import 'package:mgramseva/model/reports/vendor_report_data.dart'; import 'package:provider/provider.dart'; import 'package:syncfusion_flutter_xlsio/xlsio.dart'; @@ -38,6 +39,7 @@ class ReportsProvider with ChangeNotifier { List? collectionreports; List? inactiveconsumers; List? expenseBillReportData; + List? vendorReportData; BillsTableData genericTableData = BillsTableData([], []); int limit = 10; int offset = 1; @@ -104,6 +106,14 @@ class ReportsProvider with ChangeNotifier { TableHeader(i18.expense.CANCELLED_BY), ]; + + List get vendorReportHeaderList => [ + TableHeader(i18.expense.VENDOR_NAME), + TableHeader(i18.common.MOBILE_NUMBER), + TableHeader(i18.expense.EXPENSE_TYPE), + TableHeader(i18.common.BILL_ID), + ]; + void onChangeOfPageLimit( PaginationResponse response, String type, BuildContext context) { if (type == i18.dashboard.BILL_REPORT) { @@ -118,6 +128,9 @@ class ReportsProvider with ChangeNotifier { if (type == i18.dashboard.EXPENSE_BILL_REPORT) { getExpenseBillReport(limit: response.limit, offset: response.offset); } + if (type == i18.dashboard.VENDOR_REPORT) { + getVendorReport(limit: response.limit, offset: response.offset); + } } List getDemandsData(List list, @@ -220,6 +233,23 @@ class ReportsProvider with ChangeNotifier { TableData('${lastModifiedBy ?? '-'}'), ]); } + List getVendorReportData(List list, + {bool isExcel = false}) { + return list.map((e) => getVendorReportDataRow(e, isExcel: isExcel)).toList(); + } + TableDataRow getVendorReportDataRow(VendorReportData data, + {bool isExcel = false}) { + String? vendorName = CommonMethods.truncateWithEllipsis(20, data.vendorName!); + String? typeOfExpense = CommonMethods.truncateWithEllipsis(20, data.typeOfExpense!); + String? billId = CommonMethods.truncateWithEllipsis(20, data.billId!); + return TableDataRow([ + TableData('${vendorName ?? '-'}'), + TableData('${data.mobileNo ?? '-'}'), + TableData('${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(typeOfExpense ?? '-')}'), + TableData('${billId ?? '-'}'), + ]); + } + void callNotifier() { notifyListeners(); } @@ -636,6 +666,72 @@ class ReportsProvider with ChangeNotifier { callNotifier(); } } + + Future getVendorReport( + {bool download = false, + int offset = 1, + int limit = 10, + String sortOrder = "ASC"}) async { + try { + var commonProvider = Provider.of( + navigatorKey.currentContext!, + listen: false); + if (selectedBillPeriod == null) { + throw Exception('Select Billing Cycle'); + } + Map params = { + 'tenantId': commonProvider.userDetails!.selectedtenant!.code, + 'monthStartDate': selectedBillPeriod?.split('-')[0], + 'monthEndDate': selectedBillPeriod?.split('-')[1], + 'offset': '${offset - 1}', + 'limit': '${download ? -1 : limit}', + 'sortOrder': '$sortOrder' + }; + var response = await ReportsRepo().fetchVendorReport(params); + if (response != null) { + vendorReportData = response; + if (download) { + generateExcel( + vendorReportHeaderList + .map((e) => + '${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(e.label)}') + .toList(), + getVendorReportData(vendorReportData!, isExcel: true) + .map>( + (e) => e.tableRow.map((e) => e.label).toList()) + .toList() ?? + [], + title: + 'VendorReport_${commonProvider.userDetails?.selectedtenant?.code?.substring(3)}_${selectedBillPeriod.toString().replaceAll('/', '_')}', + optionalData: [ + 'Vendor Report', + '$selectedBillPeriod', + '${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(commonProvider.userDetails!.selectedtenant!.code!)}', + '${commonProvider.userDetails?.selectedtenant?.code?.substring(3)}', + 'Downloaded On ${DateFormats.timeStampToDate(DateTime.now().millisecondsSinceEpoch, format: 'dd/MMM/yyyy')}' + ]); + } else { + if (vendorReportData != null && vendorReportData!.isNotEmpty) { + this.limit = limit; + this.offset = offset; + this.genericTableData = BillsTableData( + vendorReportHeaderList, getVendorReportData(vendorReportData!)); + } + } + streamController.add(response); + callNotifier(); + } else { + streamController.add('error'); + throw Exception('API Error'); + } + } + catch (e, s) { + ErrorHandler().allExceptionsHandler(navigatorKey.currentContext!, e, s); + streamController.addError('error'); + callNotifier(); + } + } + void clearBuildTableData() { genericTableData = BillsTableData([], []); callNotifier(); diff --git a/frontend/mgramseva/lib/repository/reports_repo.dart b/frontend/mgramseva/lib/repository/reports_repo.dart index 0f88a4cb7..4dc71a920 100644 --- a/frontend/mgramseva/lib/repository/reports_repo.dart +++ b/frontend/mgramseva/lib/repository/reports_repo.dart @@ -1,4 +1,5 @@ import 'package:mgramseva/model/reports/expense_bill_report_data.dart'; +import 'package:mgramseva/model/reports/vendor_report_data.dart'; import 'package:mgramseva/services/urls.dart'; import 'package:mgramseva/services/base_service.dart'; import 'package:provider/provider.dart'; @@ -158,4 +159,39 @@ class ReportsRepo extends BaseService{ } return expenseBillReports; } + Future?> fetchVendorReport(Map params, + [String? token]) async { + var commonProvider = Provider.of( + navigatorKey.currentContext!, + listen: false); + List? vendorReports; + final requestInfo = RequestInfo( + APIConstants.API_MODULE_NAME, + APIConstants.API_VERSION, + APIConstants.API_TS, + '_get', + APIConstants.API_DID, + APIConstants.API_KEY, + APIConstants.API_MESSAGE_ID, + commonProvider.userDetails?.accessToken, + commonProvider.userDetails?.userRequest?.toJson()); + var res = await makeRequest( + url: Url.VENDOR_REPORT, + queryParameters: params, + requestInfo: requestInfo, + body: {}, + method: RequestType.POST); + if (res != null && res['VendorReportData'] != null) { + try { + vendorReports = []; + res['VendorReportData'].forEach((val){ + vendorReports?.add(VendorReportData.fromJson(val)); + }); + } catch (e) { + print(e); + vendorReports = null; + } + } + return vendorReports; + } } \ No newline at end of file diff --git a/frontend/mgramseva/lib/screeens/reports/reports.dart b/frontend/mgramseva/lib/screeens/reports/reports.dart index 72ae25668..53305da4a 100644 --- a/frontend/mgramseva/lib/screeens/reports/reports.dart +++ b/frontend/mgramseva/lib/screeens/reports/reports.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mgramseva/screeens/reports/expense_bill_report.dart'; import 'package:mgramseva/screeens/reports/inactive_consumer_report.dart'; +import 'package:mgramseva/screeens/reports/vendor_report.dart'; import 'package:mgramseva/screeens/reports/view_table.dart'; import 'package:provider/provider.dart'; @@ -216,7 +217,8 @@ class _Reports extends State with SingleTickerProviderStateMixin { BillReport(onViewClick: showTable), CollectionReport(onViewClick: showTable), InactiveConsumerReport(onViewClick: showTable,), - ExpenseBillReport(onViewClick: showTable,) + ExpenseBillReport(onViewClick: showTable,), + VendorReport(onViewClick: showTable,) ], ), ), diff --git a/frontend/mgramseva/lib/screeens/reports/vendor_report.dart b/frontend/mgramseva/lib/screeens/reports/vendor_report.dart new file mode 100644 index 000000000..f0dd41ec3 --- /dev/null +++ b/frontend/mgramseva/lib/screeens/reports/vendor_report.dart @@ -0,0 +1,112 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../providers/reports_provider.dart'; +import '../../utils/localization/application_localizations.dart'; +import 'package:mgramseva/utils/constants/i18_key_constants.dart'; +import '../../utils/notifiers.dart'; +import '../../utils/testing_keys/testing_keys.dart'; +import '../../widgets/button.dart'; + +class VendorReport extends StatefulWidget { + final Function onViewClick; + + VendorReport({Key? key, required this.onViewClick}) : super(key: key); + + @override + State createState() => _VendorReportState(); +} + +class _VendorReportState extends State + with SingleTickerProviderStateMixin { + @override + Widget build(BuildContext context) { + return LayoutBuilder(builder: (context, constraints) + { + final isWideScreen = constraints.maxWidth > 700; + final containerMargin = isWideScreen + ? const EdgeInsets.only(top: 5.0, bottom: 5, right: 20, left: 10) + : const EdgeInsets.symmetric(vertical: 5.0, horizontal: 8); + return Consumer(builder: (_, reportProvider, child) { + return Container( + margin: containerMargin, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 30, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: constraints.maxWidth > 344 ? constraints.maxWidth / + 2.5 : constraints.maxWidth / 3, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "5. ", + style: TextStyle( + fontSize: 14, fontWeight: FontWeight.w700), + ), + Expanded( + child: Text( + ApplicationLocalizations.of(context) + .translate(i18.dashboard.VENDOR_REPORT), + maxLines: 3, + style: TextStyle( + fontSize: 14, fontWeight: FontWeight.w700), + ), + ), + ], + ), + ), + Row( + children: [ + Container( + width: 50, + child: Button( + ApplicationLocalizations.of(context) + .translate(i18.common.VIEW), + () { + if (reportProvider.selectedBillPeriod == null) { + Notifiers.getToastMessage( + context, 'Select Billing Cycle', 'ERROR'); + } else { + reportProvider.clearTableData(); + reportProvider.getVendorReport(); + widget.onViewClick( + true, i18.dashboard.VENDOR_REPORT); + } + }, + key: Keys.billReport.VENDOR_REPORT_VIEW_BUTTON, + ), + ), + SizedBox( + width: 10, + ), + TextButton.icon( + onPressed: () { + if (reportProvider.selectedBillPeriod == null) { + Notifiers.getToastMessage( + context, 'Select Billing Cycle', 'ERROR'); + } else { + reportProvider.getVendorReport( + download: true); + } + }, + icon: Icon(Icons.download_sharp), + label: Text(ApplicationLocalizations.of(context) + .translate(i18.common.CORE_DOWNLOAD))), + ], + ), + ], + ), + ], + ), + ); + }); + }); + } +} \ No newline at end of file diff --git a/frontend/mgramseva/lib/services/urls.dart b/frontend/mgramseva/lib/services/urls.dart index 634f402e8..d99b7ae45 100644 --- a/frontend/mgramseva/lib/services/urls.dart +++ b/frontend/mgramseva/lib/services/urls.dart @@ -50,6 +50,7 @@ class Url { static const String FETCH_WC_CONNECTION = 'ws-services/wc/_search'; static const String VENDOR_SEARCH = 'vendor/v1/_search'; static const String CREATE_VENDOR = 'vendor/v1/_create'; + static const String VENDOR_REPORT = 'vendor/v1/_vendorReport'; static const String EGOV_LOCATIONS = 'egov-location/location/v11/boundarys/_search'; diff --git a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart index 9355c91b0..809194c7c 100644 --- a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart +++ b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart @@ -689,6 +689,7 @@ class _DashBoard { String get CORE_REPORTS => 'CORE_REPORTS'; String get BILL_REPORT => 'BILL_REPORT'; String get COLLECTION_REPORT => 'COLLECTION_REPORT'; + String get VENDOR_REPORT => 'VENDOR_REPORT'; String get INACTIVE_CONSUMER_REPORT => 'INACTIVE_CONSUMER_REPORT'; String get GPWSC_RATE_INFO => 'GPWSC_RATE_INFO'; } diff --git a/frontend/mgramseva/lib/utils/testing_keys/testing_keys.dart b/frontend/mgramseva/lib/utils/testing_keys/testing_keys.dart index b87a79b37..4da92c398 100644 --- a/frontend/mgramseva/lib/utils/testing_keys/testing_keys.dart +++ b/frontend/mgramseva/lib/utils/testing_keys/testing_keys.dart @@ -139,4 +139,5 @@ class BillReportKeys { Key get BILL_REPORT_BILLING_YEAR => Key("bill_report_billing_year"); Key get BILL_REPORT_BILLING_CYCLE => Key("bill_report_billing_cycle"); Key get EXPENSE_BILL_REPORT_VIEW_BUTTON => Key("expense_bill_report_view_button"); + Key get VENDOR_REPORT_VIEW_BUTTON => Key("vendor_report_view_button"); } \ No newline at end of file From 52e784b7efe155da16ea98b0be451265dc716f94 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Thu, 18 Jan 2024 14:11:14 +0530 Subject: [PATCH 56/70] PFM-4114 added log lines --- .../org/egov/echallan/config/ChallanConfiguration.java | 3 +++ .../egov/echallan/repository/ChallanRepository.java | 10 +++++----- .../src/main/resources/application.properties | 1 + 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/config/ChallanConfiguration.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/config/ChallanConfiguration.java index 32c8509e4..bdd99ed69 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/config/ChallanConfiguration.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/config/ChallanConfiguration.java @@ -80,6 +80,9 @@ public MappingJackson2HttpMessageConverter jacksonConverter(ObjectMapper objectM @Value("${persister.update.challan.topic}") private String updateChallanTopic; + + @Value("${persister.update.challan.topic}") + private String updateNewChallanTopic; @Value("${persister.update.status.challan.topic}") private String updateStatusChallanTopic; diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java index 049eb49d6..04bb76cd1 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java @@ -111,11 +111,11 @@ public void save(ChallanRequest challanRequest) { */ public void update(ChallanRequest challanRequest) { - if(challanRequest.getChallan().getPaidDate()!=null) - { - challanRequest.getChallan().setPaidDate(Long.valueOf(challanRequest.getChallan().getPaidDate())); - } - log.info("CHALLAN ISBILLPAID:"+challanRequest.getChallan().getIsBillPaid() +" | PAID DATE: "+challanRequest.getChallan().getPaidDate()); +// if(challanRequest.getChallan().getPaidDate()!=null) +// { +// challanRequest.getChallan().setPaidDate(Long.valueOf(challanRequest.getChallan().getPaidDate())); +// } + log.info("CHALLAN ISBILLPAID:"+challanRequest.getChallan().getIsBillPaid() +" | PAID DATE: "+challanRequest.getChallan().getPaidDate()+" | STATUS: "+challanRequest.getChallan().getApplicationStatus()); producer.push(config.getUpdateChallanTopic(), challanRequest); } diff --git a/municipal-services/echallan-services/src/main/resources/application.properties b/municipal-services/echallan-services/src/main/resources/application.properties index 3f21f5ec6..22f798592 100644 --- a/municipal-services/echallan-services/src/main/resources/application.properties +++ b/municipal-services/echallan-services/src/main/resources/application.properties @@ -49,6 +49,7 @@ spring.kafka.producer.buffer_memory_config=33554432 #persister configs persister.save.challan.topic=save-challan persister.update.challan.topic=update-challan +persister.update.new.challan.topic=update-new-challan persister.update.status.challan.topic=update-status-challan kafka.topics.filestore=PDF_GEN_CREATE kafka.topics.receipt.cancel.name=egov.collection.payment-cancel From e41049974507d7a93764e2e1655855f3333004f1 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 19 Jan 2024 10:29:01 +0530 Subject: [PATCH 57/70] PFM-4114 added log lines --- .../java/org/egov/echallan/config/ChallanConfiguration.java | 2 +- .../java/org/egov/echallan/expense/service/PaymentService.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/config/ChallanConfiguration.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/config/ChallanConfiguration.java index bdd99ed69..704693ad0 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/config/ChallanConfiguration.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/config/ChallanConfiguration.java @@ -81,7 +81,7 @@ public MappingJackson2HttpMessageConverter jacksonConverter(ObjectMapper objectM @Value("${persister.update.challan.topic}") private String updateChallanTopic; - @Value("${persister.update.challan.topic}") + @Value("${persister.update.new.challan.topic}") private String updateNewChallanTopic; @Value("${persister.update.status.challan.topic}") diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/expense/service/PaymentService.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/expense/service/PaymentService.java index 376a3108c..7464f2b2d 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/expense/service/PaymentService.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/expense/service/PaymentService.java @@ -120,11 +120,12 @@ public PaymentResponse updatePayment(ChallanRequest request) { StringBuilder uri = new StringBuilder(config.getPaymentContextPath()) .append(config.getPaymentUpdateEndpoint()); - System.out.println("URL to check the payment search::" + uri); + log.info("URL to check the payment search::" + uri +" and paymentworkflow is " + paymentWorkflow); Object result = serviceRequestRepository.fetchResult(uri, PaymentWorkflowRequest.builder() .paymentWorkflows(Arrays.asList(paymentWorkflow)).requestInfo(request.getRequestInfo()).build()); try { response = mapper.convertValue(result, PaymentResponse.class); + log.info(response.toString()); } catch (IllegalArgumentException e) { log.error("Error parsing update payment response Challan id : " + challan.getId()); throw new CustomException("EXP_PAYMENT_PARSING_ERROR", "Unable to parse payment response"); From c03b493eb15092ea62841a20a5c9da5591301785 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 19 Jan 2024 11:27:50 +0530 Subject: [PATCH 58/70] PFM-4114 --- .../src/main/java/org/egov/echallan/service/ChallanService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java index 016658101..41da17b5c 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java @@ -158,11 +158,11 @@ public Challan update(ChallanRequest request, Map finalData) { userService.setAccountUser(request); enrichmentService.enrichUpdateRequest(request, searchResult.get(0)); calculationService.addCalculation(request); - repository.update(request); if (request.getChallan().getApplicationStatus() == StatusEnum.PAID && searchResult.get(0).getApplicationStatus() == StatusEnum.ACTIVE) paymentService.createPayment(request); if (searchResult.get(0).getApplicationStatus() == StatusEnum.PAID) paymentService.updatePayment(request); + repository.update(request); return request.getChallan(); } From d6fb7a709229819382e383f7f12ac27364fe6d13 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Fri, 19 Jan 2024 11:53:11 +0530 Subject: [PATCH 59/70] PFM-5262 --- .../bill_generation_details_provider.dart | 124 +++++++++++++----- .../screeens/generate_bill/generate_bill.dart | 4 + .../utils/constants/i18_key_constants.dart | 4 + 3 files changed, 102 insertions(+), 30 deletions(-) diff --git a/frontend/mgramseva/lib/providers/bill_generation_details_provider.dart b/frontend/mgramseva/lib/providers/bill_generation_details_provider.dart index 17c2d887e..c9d5e3216 100644 --- a/frontend/mgramseva/lib/providers/bill_generation_details_provider.dart +++ b/frontend/mgramseva/lib/providers/bill_generation_details_provider.dart @@ -31,6 +31,7 @@ import 'package:mgramseva/widgets/error_page.dart'; import 'package:provider/provider.dart'; import 'common_provider.dart'; +import 'ifix_hierarchy_provider.dart'; class BillGenerationProvider with ChangeNotifier { var streamController = StreamController.broadcast(); @@ -355,37 +356,100 @@ class BillGenerationProvider with ChangeNotifier { } } else if (formKey.currentState!.validate() && billGenerateDetails.serviceType == "Non_Metered") { - try { - Loaders.showLoadingDialog(context); - var commonProvider = Provider.of( - navigatorKey.currentContext!, - listen: false); - var res2 = { - "tenantId": commonProvider.userDetails!.selectedtenant!.code, - "billingPeriod": selectedBillPeriod - }; - var billResponse2 = await BillGenerateRepository().bulkDemand(res2); - Navigator.pop(context); - String localizationText = getSubtitleText(context); - Navigator.of(context).pushReplacement( - new MaterialPageRoute(builder: (BuildContext context) { - return CommonSuccess(SuccessHandler( - ApplicationLocalizations.of(context) - .translate(i18.demandGenerate.GENERATE_DEMAND_SUCCESS), - localizationText, - i18.common.BACK_HOME, - Routes.BILL_GENERATE, - subHeader: - '${ApplicationLocalizations.of(context).translate(i18.demandGenerate.BILLING_CYCLE_LABEL)}', - subTextFun: () => getLocalizedText(context), - subtitleFun: () => getSubtitleText(context))); - })); + var rateProvider = Provider.of( + navigatorKey.currentContext!, + listen: false); + var rate = rateProvider.wcBillingSlabs!.wCBillingSlabs!.where((element) => element.connectionType=='Non_Metered').toList(); + showDialog(context: context, builder: (context)=>AlertDialog( + surfaceTintColor: Colors.white, + title: Text('${ApplicationLocalizations.of(context).translate(i18.common.CORE_CONFIRM)}'), + content: Container( + height: 370, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('${ApplicationLocalizations.of(context).translate(i18.demandGenerate.ARE_YOU_SURE_TO_GENERATE_DEMAND_FOR)} "${ApplicationLocalizations.of(context).translate(billGenerateDetails.serviceType!)}" ${ApplicationLocalizations.of(context).translate(i18.demandGenerate.WITH_MINIMUM_CHARGE_OF)} : '), + SizedBox(height: 10,), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: DataTable( + border: TableBorder.all( + width: 0.5, borderRadius: BorderRadius.all(Radius.circular(5))), columns: [ + DataColumn( + label: Text( + "${ApplicationLocalizations.of(context).translate(i18.searchWaterConnection.CONNECTION_TYPE)}", + style: + TextStyle(color: Colors.black, fontWeight: FontWeight.bold), + )), + DataColumn( + label: Text( + "${ApplicationLocalizations.of(context).translate(i18.common.RATE_PERCENTAGE)}", + style: + TextStyle(color: Colors.black, fontWeight: FontWeight.bold), + )),], rows: [ + ...rate.map((e) => DataRow(cells: [ + DataCell(Text( + "${ApplicationLocalizations.of(context).translate("${e.buildingType}")}")), + DataCell(Text("${e.minimumCharge}")) + ])).toList() + ],), + ), + SizedBox(height: 10,), + Text('${ApplicationLocalizations.of(context).translate(i18.demandGenerate.NO_DEMAND_GEN_WITH_RATE_0)}'), //* Note : No Demand will be generated for the Service Type with rate set to 0. + ], + ), + ), + actions: + (rateProvider.wcBillingSlabs!.wCBillingSlabs!.where((element) => element.connectionType=='Non_Metered').length- rateProvider.wcBillingSlabs!.wCBillingSlabs!.where((element) => element.connectionType=='Non_Metered' && element.minimumCharge==0).length == 0 ) + ? + [TextButton(onPressed: (){ + Navigator.pop(context); + }, child: Text('${ApplicationLocalizations.of(context).translate(i18.consumerReciepts.CLOSE)}'))] + : + [TextButton(onPressed: () async{ + if(rateProvider.wcBillingSlabs!.wCBillingSlabs!.where((element) => element.connectionType=='Non_Metered').length- rateProvider.wcBillingSlabs!.wCBillingSlabs!.where((element) => element.connectionType=='Non_Metered' && element.minimumCharge==0).length == 0 ){ + Navigator.pop(context); + Notifiers.getToastMessage(context, '${ApplicationLocalizations.of(context).translate(i18.demandGenerate.NO_SERVICE_PRESENT_WITH_RATE_MORE_THAN_0)}', 'ERROR'); //No Service type present with rate more than 0. + return; + } + try { + Loaders.showLoadingDialog(context); + var commonProvider = Provider.of( + navigatorKey.currentContext!, + listen: false); + var res2 = { + "tenantId": commonProvider.userDetails!.selectedtenant!.code, + "billingPeriod": selectedBillPeriod + }; + var billResponse2 = await BillGenerateRepository().bulkDemand(res2); + Navigator.pop(context); + String localizationText = getSubtitleText(context); + Navigator.of(context).pushReplacement( + new MaterialPageRoute(builder: (BuildContext context) { + return CommonSuccess(SuccessHandler( + ApplicationLocalizations.of(context) + .translate(i18.demandGenerate.GENERATE_DEMAND_SUCCESS), + localizationText, + i18.common.BACK_HOME, + Routes.BILL_GENERATE, + subHeader: + '${ApplicationLocalizations.of(context).translate(i18.demandGenerate.BILLING_CYCLE_LABEL)}', + subTextFun: () => getLocalizedText(context), + subtitleFun: () => getSubtitleText(context))); + })); } catch (e) { - Navigator.of(context).pushReplacement( - new MaterialPageRoute(builder: (BuildContext context) { - return ErrorPage(e.toString()); - })); - } + Navigator.of(context).pushReplacement( + new MaterialPageRoute(builder: (BuildContext context) { + return ErrorPage(e.toString()); + })); + } + }, child: Text('${ApplicationLocalizations.of(context).translate(i18.common.YES)}')), + TextButton(onPressed: (){ + Navigator.pop(context); + }, child: Text('${ApplicationLocalizations.of(context).translate(i18.common.NO)}')),] + , + )); } else { autoValidation = true; notifyListeners(); diff --git a/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart b/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart index f5dedf8c4..b8260fa2a 100644 --- a/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart +++ b/frontend/mgramseva/lib/screeens/generate_bill/generate_bill.dart @@ -22,6 +22,7 @@ import 'package:mgramseva/widgets/text_field_builder.dart'; import 'package:mgramseva/widgets/footer.dart'; import 'package:provider/provider.dart'; +import '../../providers/ifix_hierarchy_provider.dart'; import '../../utils/localization/application_localizations.dart'; class GenerateBill extends StatefulWidget { @@ -54,6 +55,9 @@ class _GenerateBillState extends State { ..autoValidation = false ..clearBillYear() ..formKey = GlobalKey(); + + Provider.of(context,listen: false) + ..getBillingSlabs(); } var metVal = ""; diff --git a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart index 809194c7c..e9e7b11c6 100644 --- a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart +++ b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart @@ -476,6 +476,10 @@ class DemandGenerate { String get METER_NUMBER_LABEL => 'GENERATE_DEMAND_METER_NUMBER_LABEL'; String get BILLING_YEAR_LABEL => 'GENERATE_DEMAND_BILLING_YEAR_LABEL'; String get BILLING_CYCLE_LABEL => 'GENERATE_DEMAND_BILLING_CYCLE_LABEL'; + String get NO_DEMAND_GEN_WITH_RATE_0 => 'NO_DEMAND_GEN_WITH_RATE_0'; + String get NO_SERVICE_PRESENT_WITH_RATE_MORE_THAN_0 => 'NO_SERVICE_PRESENT_WITH_RATE_MORE_THAN_0'; + String get ARE_YOU_SURE_TO_GENERATE_DEMAND_FOR => 'ARE_YOU_SURE_TO_GENERATE_DEMAND_FOR'; + String get WITH_MINIMUM_CHARGE_OF => 'WITH_MINIMUM_CHARGE_OF'; String get PREV_METER_READING_LABEL => 'GENERATE_DEMAND_PREV_METER_READING_LABEL'; String get NEW_METER_READING_LABEL => From 7302ba319d4425542082a82915b62fe401973416 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 19 Jan 2024 12:11:50 +0530 Subject: [PATCH 60/70] PFM-4114 --- .../main/java/org/egov/echallan/service/ChallanService.java | 2 +- .../java/org/egov/echallan/service/PaymentUpdateService.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java index 41da17b5c..a40c8f662 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java @@ -162,7 +162,7 @@ public Challan update(ChallanRequest request, Map finalData) { paymentService.createPayment(request); if (searchResult.get(0).getApplicationStatus() == StatusEnum.PAID) paymentService.updatePayment(request); - repository.update(request); + repository.update(request); return request.getChallan(); } diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java index cd2a3b721..007f490fe 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java @@ -90,6 +90,10 @@ public void process(HashMap record) { challan.setIsBillPaid(true); challan.setAuditDetails(auditDetails); ChallanRequest request = ChallanRequest.builder().requestInfo(requestInfo).challan(challan).build(); + log.info("Inside receipt topic -> Challan request "+request); + log.info("Paid Date"+request.getChallan().getPaidDate()); + log.info("Is Bill Paid"+request.getChallan().getIsBillPaid()); + log.info("Application status"+request.getChallan().getApplicationStatus()); producer.push(config.getUpdateChallanTopic(), request); }); } From af87802bd41bcfed00a5c126ce533bb38b9f61fc Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 19 Jan 2024 12:48:21 +0530 Subject: [PATCH 61/70] PFM-4114 --- .../egov/echallan/service/PaymentUpdateService.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java index 007f490fe..e78965228 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java @@ -90,11 +90,11 @@ public void process(HashMap record) { challan.setIsBillPaid(true); challan.setAuditDetails(auditDetails); ChallanRequest request = ChallanRequest.builder().requestInfo(requestInfo).challan(challan).build(); - log.info("Inside receipt topic -> Challan request "+request); - log.info("Paid Date"+request.getChallan().getPaidDate()); - log.info("Is Bill Paid"+request.getChallan().getIsBillPaid()); - log.info("Application status"+request.getChallan().getApplicationStatus()); - producer.push(config.getUpdateChallanTopic(), request); +// log.info("Inside receipt topic -> Challan request "+request); + log.info("Paid Date "+request.getChallan().getPaidDate()); + log.info("Is Bill Paid "+request.getChallan().getIsBillPaid()); + log.info("Application status "+request.getChallan().getApplicationStatus()); + producer.push(config.getUpdateNewChallanTopic(), request); }); } } From c77c53d89e351393f0e057e02855da9a7118f10b Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 19 Jan 2024 14:21:43 +0530 Subject: [PATCH 62/70] PFM-4114 --- .../egov/echallan/repository/builder/ChallanQueryBuilder.java | 2 +- .../src/main/java/org/egov/echallan/service/ChallanService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java index 36f19a550..d3735c0f7 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/builder/ChallanQueryBuilder.java @@ -45,7 +45,7 @@ public ChallanQueryBuilder(ChallanConfiguration config) { public static final String FILESTOREID_UPDATE_SQL = "UPDATE eg_echallan SET filestoreid=? WHERE id=?"; - public static final String CANCEL_RECEIPT_UPDATE_SQL = "UPDATE eg_echallan SET applicationStatus='ACTIVE' WHERE referenceId=? and businessService=?"; + public static final String CANCEL_RECEIPT_UPDATE_SQL = "UPDATE eg_echallan SET applicationStatus='CANCELLED' WHERE referenceId=? and businessService=?"; private static final String TENANTIDS = "SELECT distinct(tenantid) FROM eg_echallan challan"; diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java index a40c8f662..016658101 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/ChallanService.java @@ -158,11 +158,11 @@ public Challan update(ChallanRequest request, Map finalData) { userService.setAccountUser(request); enrichmentService.enrichUpdateRequest(request, searchResult.get(0)); calculationService.addCalculation(request); + repository.update(request); if (request.getChallan().getApplicationStatus() == StatusEnum.PAID && searchResult.get(0).getApplicationStatus() == StatusEnum.ACTIVE) paymentService.createPayment(request); if (searchResult.get(0).getApplicationStatus() == StatusEnum.PAID) paymentService.updatePayment(request); - repository.update(request); return request.getChallan(); } From 60ed268bf3604d896069a54d947f190a87a8def8 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 19 Jan 2024 14:25:59 +0530 Subject: [PATCH 63/70] PFM-4114 --- .../java/org/egov/echallan/service/PaymentUpdateService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java index e78965228..adb17fbed 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java @@ -94,7 +94,7 @@ public void process(HashMap record) { log.info("Paid Date "+request.getChallan().getPaidDate()); log.info("Is Bill Paid "+request.getChallan().getIsBillPaid()); log.info("Application status "+request.getChallan().getApplicationStatus()); - producer.push(config.getUpdateNewChallanTopic(), request); + producer.push(config.getUpdateChallanTopic(), request); }); } } From db23858ce0b8e10885f0e450306f152d999093df Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 19 Jan 2024 14:41:21 +0530 Subject: [PATCH 64/70] PFM-4114 --- .../java/org/egov/echallan/config/ChallanConfiguration.java | 3 --- .../src/main/resources/application.properties | 1 - 2 files changed, 4 deletions(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/config/ChallanConfiguration.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/config/ChallanConfiguration.java index 704693ad0..32c8509e4 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/config/ChallanConfiguration.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/config/ChallanConfiguration.java @@ -80,9 +80,6 @@ public MappingJackson2HttpMessageConverter jacksonConverter(ObjectMapper objectM @Value("${persister.update.challan.topic}") private String updateChallanTopic; - - @Value("${persister.update.new.challan.topic}") - private String updateNewChallanTopic; @Value("${persister.update.status.challan.topic}") private String updateStatusChallanTopic; diff --git a/municipal-services/echallan-services/src/main/resources/application.properties b/municipal-services/echallan-services/src/main/resources/application.properties index 22f798592..3f21f5ec6 100644 --- a/municipal-services/echallan-services/src/main/resources/application.properties +++ b/municipal-services/echallan-services/src/main/resources/application.properties @@ -49,7 +49,6 @@ spring.kafka.producer.buffer_memory_config=33554432 #persister configs persister.save.challan.topic=save-challan persister.update.challan.topic=update-challan -persister.update.new.challan.topic=update-new-challan persister.update.status.challan.topic=update-status-challan kafka.topics.filestore=PDF_GEN_CREATE kafka.topics.receipt.cancel.name=egov.collection.payment-cancel From b8e3834a9650995bf490bb73d897fd330a07c32f Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 19 Jan 2024 15:24:44 +0530 Subject: [PATCH 65/70] PFM-4114 --- .../org/egov/echallan/expense/service/PaymentService.java | 2 -- .../java/org/egov/echallan/repository/ChallanRepository.java | 5 ----- .../java/org/egov/echallan/service/PaymentUpdateService.java | 4 ---- 3 files changed, 11 deletions(-) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/expense/service/PaymentService.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/expense/service/PaymentService.java index 7464f2b2d..655f452e5 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/expense/service/PaymentService.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/expense/service/PaymentService.java @@ -120,12 +120,10 @@ public PaymentResponse updatePayment(ChallanRequest request) { StringBuilder uri = new StringBuilder(config.getPaymentContextPath()) .append(config.getPaymentUpdateEndpoint()); - log.info("URL to check the payment search::" + uri +" and paymentworkflow is " + paymentWorkflow); Object result = serviceRequestRepository.fetchResult(uri, PaymentWorkflowRequest.builder() .paymentWorkflows(Arrays.asList(paymentWorkflow)).requestInfo(request.getRequestInfo()).build()); try { response = mapper.convertValue(result, PaymentResponse.class); - log.info(response.toString()); } catch (IllegalArgumentException e) { log.error("Error parsing update payment response Challan id : " + challan.getId()); throw new CustomException("EXP_PAYMENT_PARSING_ERROR", "Unable to parse payment response"); diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java index 04bb76cd1..420be7d3b 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/repository/ChallanRepository.java @@ -110,11 +110,6 @@ public void save(ChallanRequest challanRequest) { * @param ChallanRequest The challan create request */ public void update(ChallanRequest challanRequest) { - -// if(challanRequest.getChallan().getPaidDate()!=null) -// { -// challanRequest.getChallan().setPaidDate(Long.valueOf(challanRequest.getChallan().getPaidDate())); -// } log.info("CHALLAN ISBILLPAID:"+challanRequest.getChallan().getIsBillPaid() +" | PAID DATE: "+challanRequest.getChallan().getPaidDate()+" | STATUS: "+challanRequest.getChallan().getApplicationStatus()); producer.push(config.getUpdateChallanTopic(), challanRequest); } diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java index adb17fbed..cd2a3b721 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/service/PaymentUpdateService.java @@ -90,10 +90,6 @@ public void process(HashMap record) { challan.setIsBillPaid(true); challan.setAuditDetails(auditDetails); ChallanRequest request = ChallanRequest.builder().requestInfo(requestInfo).challan(challan).build(); -// log.info("Inside receipt topic -> Challan request "+request); - log.info("Paid Date "+request.getChallan().getPaidDate()); - log.info("Is Bill Paid "+request.getChallan().getIsBillPaid()); - log.info("Application status "+request.getChallan().getApplicationStatus()); producer.push(config.getUpdateChallanTopic(), request); }); } From b0b720214b2697f7c4b49f384822d64563503e76 Mon Sep 17 00:00:00 2001 From: Saloni-eGov Date: Fri, 19 Jan 2024 15:26:15 +0530 Subject: [PATCH 66/70] PFM-4114 --- .../java/org/egov/echallan/expense/service/PaymentService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/municipal-services/echallan-services/src/main/java/org/egov/echallan/expense/service/PaymentService.java b/municipal-services/echallan-services/src/main/java/org/egov/echallan/expense/service/PaymentService.java index 655f452e5..376a3108c 100644 --- a/municipal-services/echallan-services/src/main/java/org/egov/echallan/expense/service/PaymentService.java +++ b/municipal-services/echallan-services/src/main/java/org/egov/echallan/expense/service/PaymentService.java @@ -120,6 +120,7 @@ public PaymentResponse updatePayment(ChallanRequest request) { StringBuilder uri = new StringBuilder(config.getPaymentContextPath()) .append(config.getPaymentUpdateEndpoint()); + System.out.println("URL to check the payment search::" + uri); Object result = serviceRequestRepository.fetchResult(uri, PaymentWorkflowRequest.builder() .paymentWorkflows(Arrays.asList(paymentWorkflow)).requestInfo(request.getRequestInfo()).build()); try { From 13079d40a83b43aac886d87292ea25d268f8bf2b Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Mon, 22 Jan 2024 11:30:51 +0530 Subject: [PATCH 67/70] PR Review Suggestions --- .../mgramseva/lib/model/localization/language.dart | 2 +- frontend/mgramseva/lib/providers/reports_provider.dart | 10 +++++----- frontend/mgramseva/lib/screeens/login/login.dart | 8 ++++---- .../mgramseva/lib/screeens/reports/bill_report.dart | 4 ++-- .../lib/screeens/reports/collection_report.dart | 4 ++-- .../lib/screeens/reports/expense_bill_report.dart | 4 ++-- .../lib/screeens/reports/inactive_consumer_report.dart | 4 ++-- .../mgramseva/lib/screeens/reports/vendor_report.dart | 4 ++-- .../lib/utils/constants/i18_key_constants.dart | 5 +++++ 9 files changed, 25 insertions(+), 20 deletions(-) diff --git a/frontend/mgramseva/lib/model/localization/language.dart b/frontend/mgramseva/lib/model/localization/language.dart index 588dd9765..4b508f973 100644 --- a/frontend/mgramseva/lib/model/localization/language.dart +++ b/frontend/mgramseva/lib/model/localization/language.dart @@ -9,7 +9,7 @@ import 'package:mgramseva/model/mdms/tax_period.dart'; import '../../repository/water_services_calculation.dart'; class LanguageList { - dynamic responseInfo; + dynamic? responseInfo; MdmsRes? mdmsRes; LanguageList({this.responseInfo, this.mdmsRes}); diff --git a/frontend/mgramseva/lib/providers/reports_provider.dart b/frontend/mgramseva/lib/providers/reports_provider.dart index 959178400..4cae6bcd1 100644 --- a/frontend/mgramseva/lib/providers/reports_provider.dart +++ b/frontend/mgramseva/lib/providers/reports_provider.dart @@ -415,7 +415,7 @@ class ReportsProvider with ChangeNotifier { navigatorKey.currentContext!, listen: false); if (selectedBillPeriod == null) { - throw Exception('Select Billing Cycle'); + throw Exception('${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}'); } Map params = { 'tenantId': commonProvider.userDetails!.selectedtenant!.code, @@ -481,7 +481,7 @@ class ReportsProvider with ChangeNotifier { navigatorKey.currentContext!, listen: false); if (selectedBillPeriod == null) { - throw Exception('Select Billing Cycle'); + throw Exception('${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}'); } Map params = { 'tenantId': commonProvider.userDetails!.selectedtenant!.code, @@ -547,7 +547,7 @@ class ReportsProvider with ChangeNotifier { navigatorKey.currentContext!, listen: false); if (selectedBillPeriod == null) { - throw Exception('Select Billing Cycle'); + throw Exception('${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}'); } Map params = { 'tenantId': commonProvider.userDetails!.selectedtenant!.code, @@ -612,7 +612,7 @@ class ReportsProvider with ChangeNotifier { navigatorKey.currentContext!, listen: false); if (selectedBillPeriod == null) { - throw Exception('Select Billing Cycle'); + throw Exception('${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}'); } Map params = { 'tenantId': commonProvider.userDetails!.selectedtenant!.code, @@ -677,7 +677,7 @@ class ReportsProvider with ChangeNotifier { navigatorKey.currentContext!, listen: false); if (selectedBillPeriod == null) { - throw Exception('Select Billing Cycle'); + throw Exception('${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}'); } Map params = { 'tenantId': commonProvider.userDetails!.selectedtenant!.code, diff --git a/frontend/mgramseva/lib/screeens/login/login.dart b/frontend/mgramseva/lib/screeens/login/login.dart index 31e166449..642e1ebf6 100644 --- a/frontend/mgramseva/lib/screeens/login/login.dart +++ b/frontend/mgramseva/lib/screeens/login/login.dart @@ -137,13 +137,13 @@ class _LoginState extends State { text: TextSpan( children: [ TextSpan( - text: 'By continuing you accept our ', + text: '${ApplicationLocalizations.of(context).translate(i18.common.BY_CONTINUING_YOU_ACCEPT_OUR)} ', style: TextStyle( color: Colors.black ) ), TextSpan( - text: 'Privacy Policy', + text: '${ApplicationLocalizations.of(context).translate(i18.common.PRIVACY_POLICY)}', style: TextStyle( color: Theme.of(context).primaryColor, // set link color decoration: TextDecoration.underline, @@ -154,13 +154,13 @@ class _LoginState extends State { }, ), TextSpan( - text: ' and ', + text: ' ${ApplicationLocalizations.of(context).translate(i18.common.AND)} ', style: TextStyle( color: Colors.black ) ), TextSpan( - text: 'Terms of use', + text: '${ApplicationLocalizations.of(context).translate(i18.common.TERMS_OF_USE)}', style: TextStyle( color: Theme.of(context).primaryColor, // set link color decoration: TextDecoration.underline, diff --git a/frontend/mgramseva/lib/screeens/reports/bill_report.dart b/frontend/mgramseva/lib/screeens/reports/bill_report.dart index 5359d4159..b8544abd6 100644 --- a/frontend/mgramseva/lib/screeens/reports/bill_report.dart +++ b/frontend/mgramseva/lib/screeens/reports/bill_report.dart @@ -72,7 +72,7 @@ class _BillReport extends State () { if (reportProvider.selectedBillPeriod == null) { Notifiers.getToastMessage( - context, 'Select Billing Cycle', 'ERROR'); + context, '${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}', 'ERROR'); } else { reportProvider.clearTableData(); reportProvider.getDemandReport(); @@ -90,7 +90,7 @@ class _BillReport extends State onPressed: () { if (reportProvider.selectedBillPeriod == null) { Notifiers.getToastMessage( - context, 'Select Billing Cycle', 'ERROR'); + context, '${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}', 'ERROR'); } else { reportProvider.getDemandReport(download: true); } diff --git a/frontend/mgramseva/lib/screeens/reports/collection_report.dart b/frontend/mgramseva/lib/screeens/reports/collection_report.dart index 066fcebff..bd31bfec9 100644 --- a/frontend/mgramseva/lib/screeens/reports/collection_report.dart +++ b/frontend/mgramseva/lib/screeens/reports/collection_report.dart @@ -72,7 +72,7 @@ class _CollectionReport extends State () { if (reportProvider.selectedBillPeriod == null) { Notifiers.getToastMessage( - context, 'Select Billing Cycle', 'ERROR'); + context, '${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}', 'ERROR'); } else { reportProvider.clearTableData(); reportProvider.getCollectionReport(); @@ -90,7 +90,7 @@ class _CollectionReport extends State onPressed: () { if (reportProvider.selectedBillPeriod == null) { Notifiers.getToastMessage( - context, 'Select Billing Cycle', 'ERROR'); + context, '${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}', 'ERROR'); } else { reportProvider.getCollectionReport( download: true); diff --git a/frontend/mgramseva/lib/screeens/reports/expense_bill_report.dart b/frontend/mgramseva/lib/screeens/reports/expense_bill_report.dart index 01deb2519..4c3c0f1b1 100644 --- a/frontend/mgramseva/lib/screeens/reports/expense_bill_report.dart +++ b/frontend/mgramseva/lib/screeens/reports/expense_bill_report.dart @@ -68,7 +68,7 @@ class _ExpenseBillReportState extends State () { if (reportProvider.selectedBillPeriod == null) { Notifiers.getToastMessage( - context, 'Select Billing Cycle', 'ERROR'); + context, '${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}', 'ERROR'); } else { reportProvider.clearTableData(); reportProvider.getExpenseBillReport(); @@ -86,7 +86,7 @@ class _ExpenseBillReportState extends State onPressed: () { if (reportProvider.selectedBillPeriod == null) { Notifiers.getToastMessage( - context, 'Select Billing Cycle', 'ERROR'); + context, '${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}', 'ERROR'); } else { reportProvider.getExpenseBillReport(download: true); } diff --git a/frontend/mgramseva/lib/screeens/reports/inactive_consumer_report.dart b/frontend/mgramseva/lib/screeens/reports/inactive_consumer_report.dart index 72a59f1d8..b585fc88a 100644 --- a/frontend/mgramseva/lib/screeens/reports/inactive_consumer_report.dart +++ b/frontend/mgramseva/lib/screeens/reports/inactive_consumer_report.dart @@ -71,7 +71,7 @@ class _CollectionReport extends State .translate(i18.common.VIEW), () { if (reportProvider.selectedBillPeriod == null) { - Notifiers.getToastMessage(context, 'Select Billing Cycle', 'ERROR'); + Notifiers.getToastMessage(context, '${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}', 'ERROR'); } else { reportProvider.clearTableData(); reportProvider.getInactiveConsumerReport(); @@ -86,7 +86,7 @@ class _CollectionReport extends State TextButton.icon( onPressed: () { if (reportProvider.selectedBillPeriod == null) { - Notifiers.getToastMessage(context, 'Select Billing Cycle', 'ERROR'); + Notifiers.getToastMessage(context, '${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}', 'ERROR'); } else { reportProvider.getInactiveConsumerReport(download: true); } diff --git a/frontend/mgramseva/lib/screeens/reports/vendor_report.dart b/frontend/mgramseva/lib/screeens/reports/vendor_report.dart index f0dd41ec3..63a34285c 100644 --- a/frontend/mgramseva/lib/screeens/reports/vendor_report.dart +++ b/frontend/mgramseva/lib/screeens/reports/vendor_report.dart @@ -72,7 +72,7 @@ class _VendorReportState extends State () { if (reportProvider.selectedBillPeriod == null) { Notifiers.getToastMessage( - context, 'Select Billing Cycle', 'ERROR'); + context, '${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}', 'ERROR'); } else { reportProvider.clearTableData(); reportProvider.getVendorReport(); @@ -90,7 +90,7 @@ class _VendorReportState extends State onPressed: () { if (reportProvider.selectedBillPeriod == null) { Notifiers.getToastMessage( - context, 'Select Billing Cycle', 'ERROR'); + context, '${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}', 'ERROR'); } else { reportProvider.getVendorReport( download: true); diff --git a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart index e9e7b11c6..1b1573ec4 100644 --- a/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart +++ b/frontend/mgramseva/lib/utils/constants/i18_key_constants.dart @@ -129,7 +129,12 @@ class Common { String get WATER_CHARGES => 'WS_CHARGE'; //Please enter Mobile number String get ARREARS => 'ARREARS'; //Please enter Mobile number String get COLLECT_PAYMENT => 'COLLECT_PAYMENT'; + String get BY_CONTINUING_YOU_ACCEPT_OUR => 'BY_CONTINUING_YOU_ACCEPT_OUR'; String get ONLINE => 'ONLINE'; + String get AND => 'AND'; + String get PRIVACY_POLICY => 'PRIVACY_POLICY'; + String get TERMS_OF_USE => 'TERMS_OF_USE'; + String get SELECT_BILLING_CYCLE => 'SELECT_BILLING_CYCLE'; String get CHEQUE => 'CHEQUE'; String get CASH => 'CASH'; String get DD => 'DD'; From aaddaeb6084dc4825995adcada41b719c07a9adc Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Mon, 22 Jan 2024 11:34:43 +0530 Subject: [PATCH 68/70] PR Review Suggestions --- frontend/mgramseva/lib/main.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/mgramseva/lib/main.dart b/frontend/mgramseva/lib/main.dart index 1221a7410..eb9e13865 100644 --- a/frontend/mgramseva/lib/main.dart +++ b/frontend/mgramseva/lib/main.dart @@ -64,7 +64,7 @@ void main() { // if (Platform.isIOS) { // DartPingIOS.register(); // } - + // Uncomment when compiling on iOS runZonedGuarded(() async { FlutterError.onError = (FlutterErrorDetails details) { FlutterError.dumpErrorToConsole(details); @@ -152,8 +152,8 @@ class _MyAppState extends State { _port.listen((dynamic data) { String id = data[0]; DownloadTaskStatus status = data[1]; - int progress = data[2]; - print("Download progress: "+progress.toString()); + // int progress = data[2]; + // print("Download progress: "+progress.toString()); if (status == DownloadTaskStatus.complete) { if (CommonProvider.downloadUrl.containsKey(id)) { if (CommonProvider.downloadUrl[id] != null) OpenFilex.open(CommonProvider.downloadUrl[id] ?? ''); @@ -166,7 +166,7 @@ class _MyAppState extends State { } } setState(() { - print("Download progress: "+progress.toString()); + // print("Download progress: "+progress.toString()); }); }); FlutterDownloader.registerCallback(downloadCallback); From e334235d18f25bf5712dfda11927eb54f3617bc4 Mon Sep 17 00:00:00 2001 From: Rahul Dev Garg <34365102+rahuldevgarg@users.noreply.github.com> Date: Mon, 22 Jan 2024 12:28:36 +0530 Subject: [PATCH 69/70] context fix --- frontend/mgramseva/lib/providers/reports_provider.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/mgramseva/lib/providers/reports_provider.dart b/frontend/mgramseva/lib/providers/reports_provider.dart index 4cae6bcd1..bbc0480b1 100644 --- a/frontend/mgramseva/lib/providers/reports_provider.dart +++ b/frontend/mgramseva/lib/providers/reports_provider.dart @@ -415,7 +415,7 @@ class ReportsProvider with ChangeNotifier { navigatorKey.currentContext!, listen: false); if (selectedBillPeriod == null) { - throw Exception('${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}'); + throw Exception('${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(i18.common.SELECT_BILLING_CYCLE)}'); } Map params = { 'tenantId': commonProvider.userDetails!.selectedtenant!.code, @@ -481,7 +481,7 @@ class ReportsProvider with ChangeNotifier { navigatorKey.currentContext!, listen: false); if (selectedBillPeriod == null) { - throw Exception('${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}'); + throw Exception('${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(i18.common.SELECT_BILLING_CYCLE)}'); } Map params = { 'tenantId': commonProvider.userDetails!.selectedtenant!.code, @@ -547,7 +547,7 @@ class ReportsProvider with ChangeNotifier { navigatorKey.currentContext!, listen: false); if (selectedBillPeriod == null) { - throw Exception('${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}'); + throw Exception('${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(i18.common.SELECT_BILLING_CYCLE)}'); } Map params = { 'tenantId': commonProvider.userDetails!.selectedtenant!.code, @@ -612,7 +612,7 @@ class ReportsProvider with ChangeNotifier { navigatorKey.currentContext!, listen: false); if (selectedBillPeriod == null) { - throw Exception('${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}'); + throw Exception('${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(i18.common.SELECT_BILLING_CYCLE)}'); } Map params = { 'tenantId': commonProvider.userDetails!.selectedtenant!.code, @@ -677,7 +677,7 @@ class ReportsProvider with ChangeNotifier { navigatorKey.currentContext!, listen: false); if (selectedBillPeriod == null) { - throw Exception('${ApplicationLocalizations.of(context).translate(i18.common.SELECT_BILLING_CYCLE)}'); + throw Exception('${ApplicationLocalizations.of(navigatorKey.currentContext!).translate(i18.common.SELECT_BILLING_CYCLE)}'); } Map params = { 'tenantId': commonProvider.userDetails!.selectedtenant!.code, From 3f58aa73d6cbe636cff8064e7d8c980a50b26656 Mon Sep 17 00:00:00 2001 From: Debasish Chakraborty <117706910+debasishchakraborty-egovt@users.noreply.github.com> Date: Mon, 22 Jan 2024 15:03:59 +0530 Subject: [PATCH 70/70] Update DemandGenerationConsumer.java --- .../egov/wscalculation/consumer/DemandGenerationConsumer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/consumer/DemandGenerationConsumer.java b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/consumer/DemandGenerationConsumer.java index 77c05f2de..0aba61a11 100644 --- a/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/consumer/DemandGenerationConsumer.java +++ b/municipal-services/ws-calculator/src/main/java/org/egov/wscalculation/consumer/DemandGenerationConsumer.java @@ -331,7 +331,7 @@ private void generateDemandAndSendnotification(RequestInfo requestInfo, String t * + connectionNo ); continue; } */ try { - if(tenantId.equals(config.getSmsExcludeTenant())) { + if(!tenantId.equals(config.getSmsExcludeTenant())) { generateDemandInBatch(calculationReq, masterMap, billingCycle, isSendMessage); } @@ -547,4 +547,4 @@ public void generateBulkDemandForULB(HashMap messageData) { } -} \ No newline at end of file +}