Dinesh Veeran пре 3 година
комит
187e3a962c
100 измењених фајлова са 4609 додато и 0 уклоњено
  1. 3 0
      CHANGELOG.md
  2. 1 0
      LICENSE
  3. 39 0
      README.md
  4. 4 0
      analysis_options.yaml
  5. BIN
      assets/images/GSR/Airline.png
  6. BIN
      assets/images/GSR/BG-BoardingPass.png
  7. BIN
      assets/images/GSR/BG-Home.png
  8. BIN
      assets/images/GSR/BG-Thankyou.png
  9. BIN
      assets/images/GSR/Banking.png
  10. BIN
      assets/images/GSR/Banking_Enrollment.png
  11. BIN
      assets/images/GSR/Eligible_Base.png
  12. BIN
      assets/images/GSR/Eligible_Tick.png
  13. BIN
      assets/images/GSR/GSR_newlogo.png
  14. BIN
      assets/images/GSR/Home-icon_black.png
  15. BIN
      assets/images/GSR/Home-icon_white.png
  16. BIN
      assets/images/GSR/Logout-icon_black.png
  17. BIN
      assets/images/GSR/Logout-icon_white.png
  18. BIN
      assets/images/GSR/Menu_icon_black.png
  19. BIN
      assets/images/GSR/Menu_icon_white.png
  20. BIN
      assets/images/GSR/Not-Eligible_Base.png
  21. BIN
      assets/images/GSR/Not-Eligible_Cross.png
  22. BIN
      assets/images/GSR/Notification-icon_black.png
  23. BIN
      assets/images/GSR/Notification-icon_white.png
  24. BIN
      assets/images/GSR/Reports.png
  25. BIN
      assets/images/GSR/User-icon_black.png
  26. BIN
      assets/images/GSR/User-icon_white.png
  27. BIN
      assets/images/GSR/app_logo.png
  28. BIN
      assets/images/GSR/circle.png
  29. BIN
      assets/images/GSR/logo.png
  30. BIN
      assets/images/GSR/logo_01.png
  31. BIN
      assets/images/bank/canara.png
  32. BIN
      assets/images/bank/hdfc.png
  33. BIN
      assets/images/bank/icici.png
  34. BIN
      assets/images/bank/indian.png
  35. BIN
      assets/images/bank/sbi.png
  36. BIN
      assets/images/bank/union.png
  37. BIN
      assets/images/bg/gozap_large_banner.png
  38. BIN
      assets/images/bg/gozap_small_banner.png
  39. BIN
      assets/images/flight/Gofirst.png
  40. BIN
      assets/images/flight/airasia.png
  41. BIN
      assets/images/flight/airindia.png
  42. BIN
      assets/images/flight/indigo.png
  43. BIN
      assets/images/flight/spicejet.png
  44. BIN
      assets/images/flight/vistara.png
  45. BIN
      assets/images/logos/gofuel_logo.jpeg
  46. BIN
      assets/images/logos/gozap_large_white_logo.png
  47. BIN
      assets/images/logos/gozap_smaill_white_bg_logo.png
  48. BIN
      assets/images/logos/gozap_small_color_logo.png
  49. BIN
      assets/images/personal_info_profile.png
  50. 1745 0
      assets/json/countries.json
  51. 786 0
      assets/locale/data.json
  52. 105 0
      assets/locale/localization_en.json
  53. 1 0
      assets/lottie/logged_in_lottie.json
  54. 1 0
      assets/lottie/recharged_lottie.json
  55. 1 0
      assets/lottie/registered_lottie.json
  56. BIN
      fonts/Eras-BOLD-ITC.ttf
  57. BIN
      fonts/Eras-DEMI-ITC.ttf
  58. BIN
      fonts/Eras-LIGHT-ITC.ttf
  59. BIN
      fonts/Eras-MEDIUM-ITC.ttf
  60. BIN
      fonts/gozap_icons.ttf
  61. BIN
      fonts/gozap_icons2.ttf
  62. BIN
      fonts/icomoon.ttf
  63. 2 0
      fonts/www.dafontfree.net.url
  64. BIN
      fonts/zip/Eras-Bold-ITC_15884.zip
  65. BIN
      fonts/zip/eras-demi-itc.zip
  66. BIN
      fonts/zip/eras-light-itc.zip
  67. BIN
      fonts/zip/eras-medium-itc-maisfontes.25d1.zip
  68. 27 0
      lib/components/DB/db.dart
  69. 101 0
      lib/components/apiservices.dart
  70. 28 0
      lib/components/coloredcontainer.dart
  71. 43 0
      lib/components/common.dart
  72. 31 0
      lib/components/icon_button_widget.dart
  73. 43 0
      lib/components/icons/gozap_icons.dart
  74. 36 0
      lib/components/icons/gozap_icons_old.dart
  75. 36 0
      lib/components/localization/app_translations.dart
  76. 25 0
      lib/components/localization/app_translations_delegate.dart
  77. 28 0
      lib/components/localization/application.dart
  78. 259 0
      lib/components/quantity_input.dart
  79. 113 0
      lib/components/responsive.dart
  80. 19 0
      lib/components/themes/themes.dart
  81. 11 0
      lib/controllers/extentions/trycatch.dart
  82. 36 0
      lib/controllers/log_in/log_in_controller.dart
  83. 36 0
      lib/controllers/signup/signup_controller.dart
  84. 29 0
      lib/gozap_package.dart
  85. 5 0
      lib/models/DB/table.dart
  86. 22 0
      lib/models/admin/admin_model.dart
  87. 31 0
      lib/models/asset/asset_category_model.dart
  88. 66 0
      lib/models/asset/asset_model.dart
  89. 18 0
      lib/models/common.dart
  90. 98 0
      lib/models/log_in/log_in_model.dart
  91. 54 0
      lib/models/recharge/recharge_history_model.dart
  92. 65 0
      lib/models/service/service_history_model.dart
  93. 95 0
      lib/models/signup/signup_model.dart
  94. 27 0
      lib/models/swap/swap_count_model.dart
  95. 70 0
      lib/models/swap/swap_history_model.dart
  96. 21 0
      lib/models/swap/swap_model.dart
  97. 126 0
      lib/models/user/user_model.dart
  98. 284 0
      lib/views/log_in/log_in_view.dart
  99. 38 0
      lib/views/reports/asset_report.dart
  100. 0 0
      lib/views/reports/recharge_report.dart

+ 3 - 0
CHANGELOG.md

@@ -0,0 +1,3 @@
+## 0.0.1
+
+* TODO: Describe initial release.

+ 1 - 0
LICENSE

@@ -0,0 +1 @@
+TODO: Add your license here.

+ 39 - 0
README.md

@@ -0,0 +1,39 @@
+<!--
+This README describes the package. If you publish this package to pub.dev,
+this README's contents appear on the landing page for your package.
+
+For information about how to write a good package README, see the guide for
+[writing package pages](https://dart.dev/guides/libraries/writing-package-pages).
+
+For general information about developing packages, see the Dart guide for
+[creating packages](https://dart.dev/guides/libraries/create-library-packages)
+and the Flutter guide for
+[developing packages and plugins](https://flutter.dev/developing-packages).
+-->
+
+TODO: Put a short description of the package here that helps potential users
+know whether this package might be useful for them.
+
+## Features
+
+TODO: List what your package can do. Maybe include images, gifs, or videos.
+
+## Getting started
+
+TODO: List prerequisites and provide or point to information on how to
+start using the package.
+
+## Usage
+
+TODO: Include short and useful examples for package users. Add longer examples
+to `/example` folder.
+
+```dart
+const like = 'sample';
+```
+
+## Additional information
+
+TODO: Tell users more about the package: where to find more information, how to
+contribute to the package, how to file issues, what response they can expect
+from the package authors, and more.

+ 4 - 0
analysis_options.yaml

@@ -0,0 +1,4 @@
+include: package:flutter_lints/flutter.yaml
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options

BIN
assets/images/GSR/Airline.png


BIN
assets/images/GSR/BG-BoardingPass.png


BIN
assets/images/GSR/BG-Home.png


BIN
assets/images/GSR/BG-Thankyou.png


BIN
assets/images/GSR/Banking.png


BIN
assets/images/GSR/Banking_Enrollment.png


BIN
assets/images/GSR/Eligible_Base.png


BIN
assets/images/GSR/Eligible_Tick.png


BIN
assets/images/GSR/GSR_newlogo.png


BIN
assets/images/GSR/Home-icon_black.png


BIN
assets/images/GSR/Home-icon_white.png


BIN
assets/images/GSR/Logout-icon_black.png


BIN
assets/images/GSR/Logout-icon_white.png


BIN
assets/images/GSR/Menu_icon_black.png


BIN
assets/images/GSR/Menu_icon_white.png


BIN
assets/images/GSR/Not-Eligible_Base.png


BIN
assets/images/GSR/Not-Eligible_Cross.png


BIN
assets/images/GSR/Notification-icon_black.png


BIN
assets/images/GSR/Notification-icon_white.png


BIN
assets/images/GSR/Reports.png


BIN
assets/images/GSR/User-icon_black.png


BIN
assets/images/GSR/User-icon_white.png


BIN
assets/images/GSR/app_logo.png


BIN
assets/images/GSR/circle.png


BIN
assets/images/GSR/logo.png


BIN
assets/images/GSR/logo_01.png


BIN
assets/images/bank/canara.png


BIN
assets/images/bank/hdfc.png


BIN
assets/images/bank/icici.png


BIN
assets/images/bank/indian.png


BIN
assets/images/bank/sbi.png


BIN
assets/images/bank/union.png


BIN
assets/images/bg/gozap_large_banner.png


BIN
assets/images/bg/gozap_small_banner.png


BIN
assets/images/flight/Gofirst.png


BIN
assets/images/flight/airasia.png


BIN
assets/images/flight/airindia.png


BIN
assets/images/flight/indigo.png


BIN
assets/images/flight/spicejet.png


BIN
assets/images/flight/vistara.png


BIN
assets/images/logos/gofuel_logo.jpeg


BIN
assets/images/logos/gozap_large_white_logo.png


BIN
assets/images/logos/gozap_smaill_white_bg_logo.png


BIN
assets/images/logos/gozap_small_color_logo.png


BIN
assets/images/personal_info_profile.png


Разлика између датотеке није приказан због своје велике величине
+ 1745 - 0
assets/json/countries.json


+ 786 - 0
assets/locale/data.json

@@ -0,0 +1,786 @@
+{
+   "data":{
+      "id":5,
+      "name":"SOP AUDIT - SUNDARAM FILLING STATION - DECEMBER 2021",
+      "brand_id":2,
+      "dealer_id":3,
+      "retailer_id":null,
+      "start_date":"2021-12-01",
+      "end_date":"2022-01-07",
+      "zone_id":2,
+      "state_id":2,
+      "city_id":4,
+      "district_id":3,
+      "village_id":3,
+      "sop_name_id":3,
+      "completed_at":null,
+      "created_at":"2021-12-13T07:34:37.000000Z",
+      "updated_at":"2021-12-13T07:34:37.000000Z",
+      "deleted_at":null,
+      "brand":{
+         "id":2,
+         "name":"HPCL",
+         "email":"hpadmin@gmail.com",
+         "point_of_contact":"hpmanager",
+         "profile_image":null,
+         "email_verification_token":null,
+         "email_verified_at":null,
+         "created_at":"2021-12-02T10:40:31.000000Z",
+         "updated_at":"2021-12-13T03:53:55.000000Z",
+         "deleted_at":null
+      },
+      "dealer":{
+         "id":3,
+         "brand_id":2,
+         "ownership_type_id":3,
+         "operation_type_id":4,
+         "automation_type_id":4,
+         "fuel_type_id":4,
+         "location_format_id":6,
+         "name":"SUNDARAM FILLING STATION",
+         "dealer_code":"15280232",
+         "email":"muthuramanr@cygnusa.in",
+         "hierarchy_zone_id":2,
+         "hierarchy_state_id":2,
+         "hierarchy_city_id":4,
+         "hierarchy_district_id":3,
+         "hierarchy_village_id":3,
+         "regional_manager_name":"YAMINI KIRANMAYI",
+         "regional_manager_phone":null,
+         "regional_manager_email":null,
+         "alternative_contact_name":null,
+         "alternative_contact_phone":null,
+         "alternative_contact_email":null,
+         "sales_officer_name":"YAMINI KIRANMAYI",
+         "sales_officer_phone":null,
+         "sales_officer_email":null,
+         "petrol_avg_volume":210,
+         "diesel_avg_volume":140,
+         "cng_avg_volume":null,
+         "lpg_avg_volume":null,
+         "lubricants_avg_volume":null,
+         "profile_image":null,
+         "created_at":"2021-12-13T07:15:54.000000Z",
+         "updated_at":"2021-12-13T07:15:54.000000Z",
+         "deleted_at":null
+      },
+      "retailer":null,
+      "zone":{
+         "id":2,
+         "name":"SOUTH",
+         "created_at":"2021-11-29T13:50:10.000000Z",
+         "updated_at":"2021-12-13T04:08:36.000000Z",
+         "deleted_at":null
+      },
+      "state":{
+         "id":2,
+         "name":"TAMIL NADU",
+         "zone_id":2,
+         "created_at":"2021-11-29T13:50:59.000000Z",
+         "updated_at":"2021-12-13T04:09:01.000000Z",
+         "deleted_at":null
+      },
+      "city":{
+         "id":4,
+         "name":"CHENNAI",
+         "state_id":2,
+         "created_at":"2021-12-13T04:09:50.000000Z",
+         "updated_at":"2021-12-13T04:09:50.000000Z",
+         "deleted_at":null
+      },
+      "district":{
+         "id":3,
+         "name":"CHENNAI",
+         "city_id":4,
+         "created_at":"2021-12-13T06:36:08.000000Z",
+         "updated_at":"2021-12-13T06:36:08.000000Z",
+         "deleted_at":null
+      },
+      "village":{
+         "id":3,
+         "name":"CHENNAI",
+         "district_id":3,
+         "created_at":"2021-12-13T06:36:25.000000Z",
+         "updated_at":"2021-12-13T06:36:25.000000Z",
+         "deleted_at":null
+      },
+      "sop_name":{
+         "id":3,
+         "brand_id":2,
+         "name":"HPCL SOP RETAIL OUTLETS",
+         "created_at":"2021-12-05T06:22:50.000000Z",
+         "updated_at":"2021-12-13T04:44:05.000000Z",
+         "deleted_at":null
+      },
+      "sop_lines":[
+         {
+            "id":3,
+            "sop_name_id":3,
+            "name":"RETAIL OUTLET OPERATIONS",
+            "created_at":"2021-12-05T06:23:32.000000Z",
+            "updated_at":"2021-12-13T04:45:49.000000Z",
+            "deleted_at":null,
+            "pivot":{
+               "project_id":5,
+               "sop_line_id":3
+            },
+            "categories":[
+               {
+                  "id":2,
+                  "sop_line_id":3,
+                  "name":"1. INFRASTRUCTURE",
+                  "created_at":"2021-12-05T06:24:42.000000Z",
+                  "updated_at":"2021-12-13T04:48:22.000000Z",
+                  "deleted_at":null
+               },
+               {
+                  "id":3,
+                  "sop_line_id":3,
+                  "name":"CUSTOMER SERVICE",
+                  "created_at":"2021-12-13T04:50:26.000000Z",
+                  "updated_at":"2021-12-13T04:50:26.000000Z",
+                  "deleted_at":null
+               },
+               {
+                  "id":4,
+                  "sop_line_id":3,
+                  "name":"PROCESS",
+                  "created_at":"2021-12-13T04:51:03.000000Z",
+                  "updated_at":"2021-12-13T04:51:03.000000Z",
+                  "deleted_at":null
+               },
+               {
+                  "id":5,
+                  "sop_line_id":3,
+                  "name":"HOUSE KEEPING & SAFETY",
+                  "created_at":"2021-12-13T04:55:20.000000Z",
+                  "updated_at":"2021-12-13T04:55:20.000000Z",
+                  "deleted_at":null
+               },
+               {
+                  "id":6,
+                  "sop_line_id":3,
+                  "name":"PEOPLE",
+                  "created_at":"2021-12-13T04:55:36.000000Z",
+                  "updated_at":"2021-12-13T04:55:36.000000Z",
+                  "deleted_at":null
+               }
+            ]
+         }
+      ],
+      "questions":[
+         {
+            "id":"25",
+            "project_id":5,
+            "brand_id":2,
+            "sop_name_id":3,
+            "sop_line_id":3,
+            "sop_category_id":2,
+            "sop_sub_category_id":27,
+            "sop_child_category1_name":null,
+            "sop_child_category2_name":null,
+            "sop_child_category3_name":null,
+            "sop_child_category4_name":null,
+            "sop_child_category5_name":null,
+            "sop_child_category6_name":null,
+            "sop_child_category7_name":null,
+            "type":1,
+            "proof_required":0,
+            "is_required":0,
+            "question":"Does the Name board has the Local Fire Station Number?",
+            "sop_responsibility_id":3,
+            "weightage_id":null,
+            "question_weightage":1,
+            "sort":1,
+            "answer":null,
+            "created_at":"2021-12-13T07:34:37.000000Z",
+            "updated_at":"2021-12-13T07:34:37.000000Z",
+            "deleted_at":null,
+            "options":[
+               
+            ],
+            "sop_sub_category":{
+               "id":27,
+               "sop_category_id":2,
+               "name":"NAME BOARD",
+               "sort":0,
+               "child_category1_name":null,
+               "child_category2_name":null,
+               "child_category3_name":null,
+               "child_category4_name":null,
+               "child_category5_name":null,
+               "child_category6_name":null,
+               "child_category7_name":null,
+               "created_at":"2021-12-13T05:05:21.000000Z",
+               "updated_at":"2021-12-13T05:05:21.000000Z",
+               "deleted_at":null
+            }
+         },
+         {
+            "id":"26",
+            "project_id":5,
+            "brand_id":2,
+            "sop_name_id":3,
+            "sop_line_id":3,
+            "sop_category_id":2,
+            "sop_sub_category_id":27,
+            "sop_child_category1_name":null,
+            "sop_child_category2_name":null,
+            "sop_child_category3_name":null,
+            "sop_child_category4_name":null,
+            "sop_child_category5_name":null,
+            "sop_child_category6_name":null,
+            "sop_child_category7_name":null,
+            "type":1,
+            "proof_required":1,
+            "is_required":1,
+            "question":"Does the Name board has the Local Police Station Number?",
+            "sop_responsibility_id":3,
+            "weightage_id":23,
+            "question_weightage":1,
+            "sort":2,
+            "answer":null,
+            "created_at":"2021-12-13T07:34:37.000000Z",
+            "updated_at":"2021-12-13T07:34:37.000000Z",
+            "deleted_at":null,
+            "options":[
+               
+            ],
+            "sop_sub_category":{
+               "id":27,
+               "sop_category_id":2,
+               "name":"NAME BOARD",
+               "sort":0,
+               "child_category1_name":null,
+               "child_category2_name":null,
+               "child_category3_name":null,
+               "child_category4_name":null,
+               "child_category5_name":null,
+               "child_category6_name":null,
+               "child_category7_name":null,
+               "created_at":"2021-12-13T05:05:21.000000Z",
+               "updated_at":"2021-12-13T05:05:21.000000Z",
+               "deleted_at":null
+            }
+         },
+         {
+            "id":"27",
+            "project_id":5,
+            "brand_id":2,
+            "sop_name_id":3,
+            "sop_line_id":3,
+            "sop_category_id":2,
+            "sop_sub_category_id":27,
+            "sop_child_category1_name":null,
+            "sop_child_category2_name":null,
+            "sop_child_category3_name":null,
+            "sop_child_category4_name":null,
+            "sop_child_category5_name":null,
+            "sop_child_category6_name":null,
+            "sop_child_category7_name":null,
+            "type":1,
+            "proof_required":0,
+            "is_required":1,
+            "question":"Does the Name board has Ambulance Number?",
+            "sop_responsibility_id":3,
+            "weightage_id":null,
+            "question_weightage":1,
+            "sort":3,
+            "answer":null,
+            "created_at":"2021-12-13T07:34:37.000000Z",
+            "updated_at":"2021-12-13T07:34:37.000000Z",
+            "deleted_at":null,
+            "options":[
+               
+            ],
+            "sop_sub_category":{
+               "id":27,
+               "sop_category_id":2,
+               "name":"NAME BOARD",
+               "sort":0,
+               "child_category1_name":null,
+               "child_category2_name":null,
+               "child_category3_name":null,
+               "child_category4_name":null,
+               "child_category5_name":null,
+               "child_category6_name":null,
+               "child_category7_name":null,
+               "created_at":"2021-12-13T05:05:21.000000Z",
+               "updated_at":"2021-12-13T05:05:21.000000Z",
+               "deleted_at":null
+            }
+         },
+         {
+            "id":"28",
+            "project_id":5,
+            "brand_id":2,
+            "sop_name_id":3,
+            "sop_line_id":3,
+            "sop_category_id":2,
+            "sop_sub_category_id":27,
+            "sop_child_category1_name":null,
+            "sop_child_category2_name":null,
+            "sop_child_category3_name":null,
+            "sop_child_category4_name":null,
+            "sop_child_category5_name":null,
+            "sop_child_category6_name":null,
+            "sop_child_category7_name":null,
+            "type":1,
+            "proof_required":1,
+            "is_required":1,
+            "question":"Does the Name board has Nearest hospital\/trauma centre number?",
+            "sop_responsibility_id":3,
+            "weightage_id":null,
+            "question_weightage":1,
+            "sort":4,
+            "answer":null,
+            "created_at":"2021-12-13T07:34:37.000000Z",
+            "updated_at":"2021-12-13T07:34:37.000000Z",
+            "deleted_at":null,
+            "options":[
+               
+            ],
+            "sop_sub_category":{
+               "id":27,
+               "sop_category_id":2,
+               "name":"NAME BOARD",
+               "sort":0,
+               "child_category1_name":null,
+               "child_category2_name":null,
+               "child_category3_name":null,
+               "child_category4_name":null,
+               "child_category5_name":null,
+               "child_category6_name":null,
+               "child_category7_name":null,
+               "created_at":"2021-12-13T05:05:21.000000Z",
+               "updated_at":"2021-12-13T05:05:21.000000Z",
+               "deleted_at":null
+            }
+         },
+         {
+            "id":"29",
+            "project_id":5,
+            "brand_id":2,
+            "sop_name_id":3,
+            "sop_line_id":3,
+            "sop_category_id":2,
+            "sop_sub_category_id":27,
+            "sop_child_category1_name":null,
+            "sop_child_category2_name":null,
+            "sop_child_category3_name":null,
+            "sop_child_category4_name":null,
+            "sop_child_category5_name":null,
+            "sop_child_category6_name":null,
+            "sop_child_category7_name":null,
+            "type":1,
+            "proof_required":0,
+            "is_required":1,
+            "question":"Does the Name board has SO Name, office address & contact number?",
+            "sop_responsibility_id":3,
+            "weightage_id":null,
+            "question_weightage":1,
+            "sort":5,
+            "answer":null,
+            "created_at":"2021-12-13T07:34:37.000000Z",
+            "updated_at":"2021-12-13T07:34:37.000000Z",
+            "deleted_at":null,
+            "options":[
+               
+            ],
+            "sop_sub_category":{
+               "id":27,
+               "sop_category_id":2,
+               "name":"NAME BOARD",
+               "sort":0,
+               "child_category1_name":null,
+               "child_category2_name":null,
+               "child_category3_name":null,
+               "child_category4_name":null,
+               "child_category5_name":null,
+               "child_category6_name":null,
+               "child_category7_name":null,
+               "created_at":"2021-12-13T05:05:21.000000Z",
+               "updated_at":"2021-12-13T05:05:21.000000Z",
+               "deleted_at":null
+            }
+         },
+         {
+            "id":"30",
+            "project_id":5,
+            "brand_id":2,
+            "sop_name_id":3,
+            "sop_line_id":3,
+            "sop_category_id":2,
+            "sop_sub_category_id":27,
+            "sop_child_category1_name":null,
+            "sop_child_category2_name":null,
+            "sop_child_category3_name":null,
+            "sop_child_category4_name":null,
+            "sop_child_category5_name":null,
+            "sop_child_category6_name":null,
+            "sop_child_category7_name":null,
+            "type":1,
+            "proof_required":1,
+            "is_required":1,
+            "question":"Does the Name board has RO Office contact details?",
+            "sop_responsibility_id":3,
+            "weightage_id":null,
+            "question_weightage":1,
+            "sort":6,
+            "answer":null,
+            "created_at":"2021-12-13T07:34:37.000000Z",
+            "updated_at":"2021-12-13T07:34:37.000000Z",
+            "deleted_at":null,
+            "options":[
+               
+            ],
+            "sop_sub_category":{
+               "id":27,
+               "sop_category_id":2,
+               "name":"NAME BOARD",
+               "sort":0,
+               "child_category1_name":null,
+               "child_category2_name":null,
+               "child_category3_name":null,
+               "child_category4_name":null,
+               "child_category5_name":null,
+               "child_category6_name":null,
+               "child_category7_name":null,
+               "created_at":"2021-12-13T05:05:21.000000Z",
+               "updated_at":"2021-12-13T05:05:21.000000Z",
+               "deleted_at":null
+            }
+         },
+         {
+            "id":"31",
+            "project_id":5,
+            "brand_id":2,
+            "sop_name_id":3,
+            "sop_line_id":3,
+            "sop_category_id":2,
+            "sop_sub_category_id":27,
+            "sop_child_category1_name":null,
+            "sop_child_category2_name":null,
+            "sop_child_category3_name":null,
+            "sop_child_category4_name":null,
+            "sop_child_category5_name":null,
+            "sop_child_category6_name":null,
+            "sop_child_category7_name":null,
+            "type":1,
+            "proof_required":1,
+            "is_required":1,
+            "question":"Does the Name board  has Website address for online complaint management system?",
+            "sop_responsibility_id":3,
+            "weightage_id":null,
+            "question_weightage":1,
+            "sort":7,
+            "answer":null,
+            "created_at":"2021-12-13T07:34:37.000000Z",
+            "updated_at":"2021-12-13T07:34:37.000000Z",
+            "deleted_at":null,
+            "options":[
+               
+            ],
+            "sop_sub_category":{
+               "id":27,
+               "sop_category_id":2,
+               "name":"NAME BOARD",
+               "sort":0,
+               "child_category1_name":null,
+               "child_category2_name":null,
+               "child_category3_name":null,
+               "child_category4_name":null,
+               "child_category5_name":null,
+               "child_category6_name":null,
+               "child_category7_name":null,
+               "created_at":"2021-12-13T05:05:21.000000Z",
+               "updated_at":"2021-12-13T05:05:21.000000Z",
+               "deleted_at":null
+            }
+         },
+         {
+            "id":"32",
+            "project_id":5,
+            "brand_id":2,
+            "sop_name_id":3,
+            "sop_line_id":3,
+            "sop_category_id":2,
+            "sop_sub_category_id":27,
+            "sop_child_category1_name":null,
+            "sop_child_category2_name":null,
+            "sop_child_category3_name":null,
+            "sop_child_category4_name":null,
+            "sop_child_category5_name":null,
+            "sop_child_category6_name":null,
+            "sop_child_category7_name":null,
+            "type":1,
+            "proof_required":1,
+            "is_required":1,
+            "question":"Does the Name board  has Emergency\/control room number?",
+            "sop_responsibility_id":3,
+            "weightage_id":null,
+            "question_weightage":1,
+            "sort":8,
+            "answer":null,
+            "created_at":"2021-12-13T07:34:37.000000Z",
+            "updated_at":"2021-12-13T07:34:37.000000Z",
+            "deleted_at":null,
+            "options":[
+               
+            ],
+            "sop_sub_category":{
+               "id":27,
+               "sop_category_id":2,
+               "name":"NAME BOARD",
+               "sort":0,
+               "child_category1_name":null,
+               "child_category2_name":null,
+               "child_category3_name":null,
+               "child_category4_name":null,
+               "child_category5_name":null,
+               "child_category6_name":null,
+               "child_category7_name":null,
+               "created_at":"2021-12-13T05:05:21.000000Z",
+               "updated_at":"2021-12-13T05:05:21.000000Z",
+               "deleted_at":null
+            }
+         },
+         {
+            "id":"33",
+            "project_id":5,
+            "brand_id":2,
+            "sop_name_id":3,
+            "sop_line_id":3,
+            "sop_category_id":2,
+            "sop_sub_category_id":27,
+            "sop_child_category1_name":null,
+            "sop_child_category2_name":null,
+            "sop_child_category3_name":null,
+            "sop_child_category4_name":null,
+            "sop_child_category5_name":null,
+            "sop_child_category6_name":null,
+            "sop_child_category7_name":null,
+            "type":1,
+            "proof_required":1,
+            "is_required":1,
+            "question":"Does the Name board  has Dealer's name and phone number",
+            "sop_responsibility_id":3,
+            "weightage_id":null,
+            "question_weightage":1,
+            "sort":9,
+            "answer":null,
+            "created_at":"2021-12-13T07:34:37.000000Z",
+            "updated_at":"2021-12-13T07:34:37.000000Z",
+            "deleted_at":null,
+            "options":[
+               
+            ],
+            "sop_sub_category":{
+               "id":27,
+               "sop_category_id":2,
+               "name":"NAME BOARD",
+               "sort":0,
+               "child_category1_name":null,
+               "child_category2_name":null,
+               "child_category3_name":null,
+               "child_category4_name":null,
+               "child_category5_name":null,
+               "child_category6_name":null,
+               "child_category7_name":null,
+               "created_at":"2021-12-13T05:05:21.000000Z",
+               "updated_at":"2021-12-13T05:05:21.000000Z",
+               "deleted_at":null
+            }
+         },
+         {
+            "id":"34",
+            "project_id":5,
+            "brand_id":2,
+            "sop_name_id":3,
+            "sop_line_id":3,
+            "sop_category_id":2,
+            "sop_sub_category_id":27,
+            "sop_child_category1_name":null,
+            "sop_child_category2_name":null,
+            "sop_child_category3_name":null,
+            "sop_child_category4_name":null,
+            "sop_child_category5_name":null,
+            "sop_child_category6_name":null,
+            "sop_child_category7_name":null,
+            "type":1,
+            "proof_required":1,
+            "is_required":1,
+            "question":"Does the Name board  has Retail Outlet's name & address",
+            "sop_responsibility_id":3,
+            "weightage_id":null,
+            "question_weightage":1,
+            "sort":10,
+            "answer":null,
+            "created_at":"2021-12-13T07:34:37.000000Z",
+            "updated_at":"2021-12-13T07:34:37.000000Z",
+            "deleted_at":null,
+            "options":[
+               
+            ],
+            "sop_sub_category":{
+               "id":27,
+               "sop_category_id":2,
+               "name":"NAME BOARD",
+               "sort":0,
+               "child_category1_name":null,
+               "child_category2_name":null,
+               "child_category3_name":null,
+               "child_category4_name":null,
+               "child_category5_name":null,
+               "child_category6_name":null,
+               "child_category7_name":null,
+               "created_at":"2021-12-13T05:05:21.000000Z",
+               "updated_at":"2021-12-13T05:05:21.000000Z",
+               "deleted_at":null
+            }
+         },
+         {
+            "id":"35",
+            "project_id":5,
+            "brand_id":2,
+            "sop_name_id":3,
+            "sop_line_id":3,
+            "sop_category_id":2,
+            "sop_sub_category_id":27,
+            "sop_child_category1_name":null,
+            "sop_child_category2_name":null,
+            "sop_child_category3_name":null,
+            "sop_child_category4_name":null,
+            "sop_child_category5_name":null,
+            "sop_child_category6_name":null,
+            "sop_child_category7_name":null,
+            "type":1,
+            "proof_required":1,
+            "is_required":1,
+            "question":"Does the Name board has Outlet timings",
+            "sop_responsibility_id":3,
+            "weightage_id":null,
+            "question_weightage":1,
+            "sort":11,
+            "answer":null,
+            "created_at":"2021-12-13T07:34:37.000000Z",
+            "updated_at":"2021-12-13T07:34:37.000000Z",
+            "deleted_at":null,
+            "options":[
+               
+            ],
+            "sop_sub_category":{
+               "id":27,
+               "sop_category_id":2,
+               "name":"NAME BOARD",
+               "sort":0,
+               "child_category1_name":null,
+               "child_category2_name":null,
+               "child_category3_name":null,
+               "child_category4_name":null,
+               "child_category5_name":null,
+               "child_category6_name":null,
+               "child_category7_name":null,
+               "created_at":"2021-12-13T05:05:21.000000Z",
+               "updated_at":"2021-12-13T05:05:21.000000Z",
+               "deleted_at":null
+            }
+         },
+         {
+            "id":"36",
+            "project_id":5,
+            "brand_id":2,
+            "sop_name_id":3,
+            "sop_line_id":3,
+            "sop_category_id":2,
+            "sop_sub_category_id":27,
+            "sop_child_category1_name":null,
+            "sop_child_category2_name":null,
+            "sop_child_category3_name":null,
+            "sop_child_category4_name":null,
+            "sop_child_category5_name":null,
+            "sop_child_category6_name":null,
+            "sop_child_category7_name":null,
+            "type":1,
+            "proof_required":1,
+            "is_required":1,
+            "question":"Does the Name board has Toll free customer helpline 155233?",
+            "sop_responsibility_id":3,
+            "weightage_id":null,
+            "question_weightage":1,
+            "sort":12,
+            "answer":null,
+            "created_at":"2021-12-13T07:34:37.000000Z",
+            "updated_at":"2021-12-13T07:34:37.000000Z",
+            "deleted_at":null,
+            "options":[
+               
+            ],
+            "sop_sub_category":{
+               "id":27,
+               "sop_category_id":2,
+               "name":"NAME BOARD",
+               "sort":0,
+               "child_category1_name":null,
+               "child_category2_name":null,
+               "child_category3_name":null,
+               "child_category4_name":null,
+               "child_category5_name":null,
+               "child_category6_name":null,
+               "child_category7_name":null,
+               "created_at":"2021-12-13T05:05:21.000000Z",
+               "updated_at":"2021-12-13T05:05:21.000000Z",
+               "deleted_at":null
+            }
+         },
+         {
+            "id":"37",
+            "project_id":5,
+            "brand_id":2,
+            "sop_name_id":3,
+            "sop_line_id":3,
+            "sop_category_id":2,
+            "sop_sub_category_id":28,
+            "sop_child_category1_name":null,
+            "sop_child_category2_name":null,
+            "sop_child_category3_name":null,
+            "sop_child_category4_name":null,
+            "sop_child_category5_name":null,
+            "sop_child_category6_name":null,
+            "sop_child_category7_name":null,
+            "type":2,
+            "proof_required":1,
+            "is_required":1,
+            "question":"Does the Outlet have the following Mandatory Signage\/ Authorized Posters",
+            "sop_responsibility_id":3,
+            "weightage_id":null,
+            "question_weightage":1,
+            "sort":13,
+            "answer":null,
+            "created_at":"2021-12-13T07:34:37.000000Z",
+            "updated_at":"2021-12-13T07:34:37.000000Z",
+            "deleted_at":null,
+            "options":[
+               
+            ],
+            "sop_sub_category":{
+               "id":28,
+               "sop_category_id":2,
+               "name":"SIGN BOARDS",
+               "sort":0,
+               "child_category1_name":null,
+               "child_category2_name":null,
+               "child_category3_name":null,
+               "child_category4_name":null,
+               "child_category5_name":null,
+               "child_category6_name":null,
+               "child_category7_name":null,
+               "created_at":"2021-12-13T05:05:21.000000Z",
+               "updated_at":"2021-12-13T05:05:21.000000Z",
+               "deleted_at":null
+            }
+         }
+      ]
+   },
+   "message":""
+}

+ 105 - 0
assets/locale/localization_en.json

@@ -0,0 +1,105 @@
+{
+  "tab_login": "Phone",
+  "tab_mobile": "Mobile",
+  "key_app_name": "rider App",
+  "key_title": "GoZAP",
+  "key_welcomemsg": "Welcome!",
+  "key_welcome_login_msg": "Login to continue to rider section of GoZAP App.",
+  "key_welcome_signup_msg": "Sign Up to continue to rider section of GoZAP App.",
+  "key_btn_submitaction": "Submit Action Plan",
+  "key_btn_cancel": "Cancel",
+  "key_btn_close": "Close",
+  "key_btn_sendotp": "Send OTP",
+  "key_field_requird": "Please enter the value",
+  "key_field_phonenumber_requird": "Please enter the 10 digit phone number",
+  "key_field_PaymentType": "Payment Type",
+  "key_field_RiderID": "Rider ID",
+  "key_field_AssetID": "Asset ID",
+  "key_field_AssetName": "Asset Name",
+  "key_field_AssetCategoryID": "Asset Category ID",
+  "key_field_AssetCategory": "Asset Category",
+  "key_field_ServiceType": "Service Type",
+  "key_field_ReturnBatteryID": "Return Battery ID",
+  "key_field_SwapBatteryID": "Swap Battery ID",
+  "key_dashboard_text_01": "Where do you choose to enroll ?",
+  "key_login_field_UserID": "User ID",
+  "key_login_field_RiderName": "Rider Name",
+  "key_login_field_RiderID_or_PhoneNumber": "Rider ID / Phone Number",
+  "key_login_field_PhoneNumber": "Phone Number",
+  "key_login_field_DEID": "DE ID",
+  "key_login_field_Password": "Password",
+  "key_login_field_Confrim_Password": "Confrim Password",
+  "key_login_field_ReferID": "Refer ID",
+  "key_dashboard_title_01": "Banking Enrollment",
+  "key_dashboard_title_02": "Airline Enrollment",
+  "key_dashboard_title_03": "Where do you choose to enroll ?",
+  "key_dashboard_title_04": " Enrollment",
+  "key_banking_dashboard_title_01": "Banking Dashboard",
+  "key_banking_dashboard_title_02": "Hi! What would you like to do?",
+  "key_banking_dashboard_title_03": "Reports",
+  "key_banking_dashboard_title_04": "Enrollment",
+  "key_banking_dashboard_title_05": "Eligible !",
+  "key_banking_dashboard_title_06": "Not Eligible !",
+  "key_banking_dashboard_title_07": "Servicable Area !",
+  "key_banking_dashboard_title_08": "Non Servicable Area !",
+  "key_banking_dashboard_title_09": "Thankyou !",
+  "key_banking_dashboard_title_10": "Banking Enrollment",
+  "key_banking_dashboard_title_11": "Airline Dashboard",
+  "key_banking_dashboard_title_12": "Airline Enrollment",
+  "key_banking_dashboard_title_13": "Hi! Please scan your Boarding Pass",
+  "key_banking_dashboard_title_14": "Unable to scan?",
+  "key_banking_dashboard_title_15": "Hi! Please select your airline brand",
+  "key_banking_dashboard_title_16": "Banking Reports",
+  "key_banking_dashboard_title_17": "Airline Reports",
+  "key_banking_dashboard_desc_01": "View realtime reports on a mobile web browser",
+  "key_banking_dashboard_desc_02": "Enroll customers to GoFingenie Financial Services",
+  "key_banking_dashboard_form_01": "First Name",
+  "key_banking_dashboard_form_02": "Last Name",
+  "key_banking_dashboard_form_03": "Mobile Number",
+  "key_banking_dashboard_form_04": "PAN Number",
+  "key_banking_dashboard_form_05": "Mobile OTP",
+  "key_banking_dashboard_form_06": "Email OTP",
+  "key_banking_dashboard_form_07": "Servicable Pincode",
+  "key_banking_dashboard_form_08": "Customer Name",
+  "key_banking_dashboard_form_09": "Email ID",
+  "key_banking_dashboard_form_10": "Pin Code",
+  "key_banking_dashboard_form_11": "City",
+  "key_banking_dashboard_form_12": "State",
+  "key_banking_dashboard_form_13": "Country",
+  "key_banking_dashboard_form_14": "Nationality",
+  "key_banking_dashboard_form_15": "Address",
+  "key_banking_dashboard_form_16": "Are you a resident of the European Union? ",
+  "key_banking_dashboard_form_17": "Gender",
+  "key_banking_dashboard_form_18": "Date of Birth",
+  "key_banking_dashboard_form_19": "Passenger Name",
+  "key_banking_dashboard_form_20": "PNR",
+  "key_banking_dashboard_form_21": "From-To city / airport code",
+  "key_banking_dashboard_form_22": "Flight number",
+  "key_banking_dashboard_form_23": "Check-in Sequence number",
+  "key_banking_dashboard_form_24": "Electronic Ticket Indicator",
+  "key_banking_dashboard_form_25": "Age",
+  "key_airline_error_01": "Please enter mobile OTP",
+  "key_airline_error_02": "Please enter email OTP",
+  "key_airline_error_03": "Verified",
+  "key_btn_text_01": "Go Ahead",
+  "key_btn_text_02": "Upload PAN Card",
+  "key_btn_text_03": "Continue",
+  "key_btn_text_04": "Scan",
+  "key_btn_text_05": "Click here to enter manually",
+  "key_mobileno_hint": "10 digit number",
+  "key_emailid_error": "Please enter valid email id",
+  "key_panno_hint": " 10 digit unique alphanumeric number",
+  "key_btn_forgot_password": "Forgot Password?",
+  "key_btn_login": "Login",
+  "key_btn_sign_up": "Sign Up",
+  "key_btn_preview": "Preview",
+  "key_btn_submit": "Submit",
+  "key_btn_yes": "Yes",
+  "key_btn_verify": "Verify",
+  "key_btn_no": "No",
+  "key_btn_view": "View",
+  "key_btn_progress": "In progress",
+  "key_btn_upload": "Upload",
+  "key_upload_title": "Upload Documents",
+  "key_signup_field_Password_missmatech": "Your Password is mismatch"
+}

Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
assets/lottie/logged_in_lottie.json


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
assets/lottie/recharged_lottie.json


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
assets/lottie/registered_lottie.json


BIN
fonts/Eras-BOLD-ITC.ttf


BIN
fonts/Eras-DEMI-ITC.ttf


BIN
fonts/Eras-LIGHT-ITC.ttf


BIN
fonts/Eras-MEDIUM-ITC.ttf


BIN
fonts/gozap_icons.ttf


BIN
fonts/gozap_icons2.ttf


BIN
fonts/icomoon.ttf


+ 2 - 0
fonts/www.dafontfree.net.url

@@ -0,0 +1,2 @@
+[InternetShortcut]
+URL=https://www.dafontfree.net/eras-light-itc-regular/f123457.htm

BIN
fonts/zip/Eras-Bold-ITC_15884.zip


BIN
fonts/zip/eras-demi-itc.zip


BIN
fonts/zip/eras-light-itc.zip


BIN
fonts/zip/eras-medium-itc-maisfontes.25d1.zip


+ 27 - 0
lib/components/DB/db.dart

@@ -0,0 +1,27 @@
+
+import 'package:flutter/cupertino.dart';
+import 'package:encrypted_shared_preferences/encrypted_shared_preferences.dart';
+
+class LocalDB extends ChangeNotifier {
+  EncryptedSharedPreferences encryptedSharedPreferences =
+      EncryptedSharedPreferences();
+  Future<String> readData(String tableName) async {
+    final items = await encryptedSharedPreferences.getString(tableName);
+    return items;
+  }
+
+  Future<bool> writeData(String tableName, String data) async {
+    final items = await encryptedSharedPreferences.setString(tableName, data);
+    return items;
+  }
+
+  Future<bool> removeData(String tableName) async {
+    final items = encryptedSharedPreferences.remove(tableName);
+    return items;
+  }
+
+  Future<bool> removeAllData() async {
+    final isCleared = encryptedSharedPreferences.clear();
+    return isCleared;
+  }
+}

+ 101 - 0
lib/components/apiservices.dart

@@ -0,0 +1,101 @@
+// ignore_for_file: unnecessary_question_mark, non_constant_identifier_names, unused_local_variable, prefer_interpolation_to_compose_strings, use_build_context_synchronously
+
+import 'dart:io';
+import 'dart:convert';
+import 'package:gozap_package/models/common.dart';
+import 'package:provider/provider.dart';
+import 'package:toast/toast.dart';
+import 'package:flutter/material.dart';
+import 'package:http/http.dart' as http;
+import 'package:connectivity_plus/connectivity_plus.dart';
+
+class APIService {
+  BuildContext context;
+  APIService(this.context);
+  Future<bool> GetConnect() async {
+    var connectivityResult = await (Connectivity().checkConnectivity());
+    bool isInternetOn = false;
+    if (connectivityResult == ConnectivityResult.none) {
+      isInternetOn = false;
+    } else if (connectivityResult == ConnectivityResult.mobile) {
+      isInternetOn = true;
+    } else if (connectivityResult == ConnectivityResult.wifi) {
+      isInternetOn = true;
+    }
+    return isInternetOn;
+  }
+
+  Future<String?> getData(dynamic? url, bool? token,
+      {bool loader = true}) async {
+    try {
+      Future<bool> internetActive = GetConnect();
+
+      if (await internetActive) {
+        var durl = url;
+        var header = <String, String>{
+          'Content-Type': 'application/json; charset=UTF-8',
+        };
+        final response = await http.get(Uri.parse(durl), headers: header);
+        if (response.statusCode == 200 || response.statusCode == 201) {
+          dynamic res = json.decode(response.body);
+          if (res["Message"] != null) {
+            if (res["Message"].toString().isNotEmpty) {
+              Toast.show(res["Message"],
+                  duration: Toast.lengthLong, gravity: Toast.bottom);
+            }
+          }
+          return response.body;
+        } else {
+          dynamic res = json.decode(response.body);
+          if (res["Error"] != null) {
+            Toast.show(res["Error"],
+                duration: Toast.lengthLong, gravity: Toast.bottom);
+          }
+        }
+      }
+    } on SocketException catch (_) {
+      Toast.show("Please check your internet",
+          duration: Toast.lengthLong, gravity: Toast.bottom);
+    }
+    return null;
+  }
+
+  Future<dynamic?> postData(
+      String? url, Map<String, dynamic> data, bool? token,
+      {bool loader = true}) async {
+    try {
+      bool internetActive = await GetConnect();
+      if (internetActive) {
+        String mainURL= Provider.of<commonChangeNotifier>(context, listen: false).mainURL;
+        var durl = mainURL+url!;
+        print(durl);
+        var header = <String, String>{
+          'content-type': 'application/json',
+        };
+        var body = data;
+        final response = await http.post(Uri.parse(durl),
+            // headers: header,
+            body: body);
+        if (response.statusCode == 200 || response.statusCode == 201) {
+          dynamic res = json.decode(response.body);
+          if (res["Message"] != null) {
+            if (res["Message"].toString().isNotEmpty) {
+              Toast.show(res["Message"],
+                  duration: Toast.lengthLong, gravity: Toast.bottom);
+            }
+          }
+          return res;
+        } else {
+          dynamic res = json.decode(response.body);
+          if (res["Message"] != null) {
+            Toast.show(res["Message"],
+                duration: Toast.lengthLong, gravity: Toast.bottom);
+          }
+        }
+      }
+    } on SocketException catch (_) {
+      Toast.show("Please check your internet",
+          duration: Toast.lengthLong, gravity: Toast.bottom);
+    }
+  }
+}

+ 28 - 0
lib/components/coloredcontainer.dart

@@ -0,0 +1,28 @@
+import 'package:flutter/material.dart';
+
+class ColoredContainer extends StatefulWidget {
+  const ColoredContainer({Key? key, required this.child, this.containerColor})
+      : super(key: key);
+
+  final Color? containerColor;
+  final Widget child;
+
+  @override
+  State<ColoredContainer> createState() => _ColoredContainerState();
+}
+
+class _ColoredContainerState extends State<ColoredContainer> {
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      decoration: BoxDecoration(
+        borderRadius: BorderRadius.circular(5.0),
+        color: widget.containerColor ?? Colors.blue.withOpacity(0.4),
+      ),
+      child: Padding(
+        padding: const EdgeInsets.all(10.00),
+        child: widget.child,
+      ),
+    );
+  }
+}

+ 43 - 0
lib/components/common.dart

@@ -0,0 +1,43 @@
+// ignore_for_file: unused_local_variable
+
+import 'themes/themes.dart';
+import 'package:lottie/lottie.dart';
+import 'package:flutter/material.dart';
+import 'localization/app_translations.dart';
+
+class Common {
+  static welcomeTextWidget(BuildContext context) => Text(
+        AppTranslations.of(context)!.text("key_welcomemsg"),
+        style: TextStyle(fontSize: 24, color: AppTheme.primaryColor),
+      );
+  static loginPharaWidget(BuildContext context) =>
+      Text(AppTranslations.of(context)!.text("key_welcome_login_msg"));
+  static signupPharaWidget(BuildContext context) =>
+      Text(AppTranslations.of(context)!.text("key_welcome_signup_msg"));
+  static goFuelLogoWidget(BuildContext context) => const Padding(
+        padding: EdgeInsets.all(20),
+        child: Image(
+            image: AssetImage('assets/images/logos/gofuel_logo.jpeg',
+                package: 'gozap_package')),
+      );
+  static brandSmallColorLogoWidget(BuildContext context) => const Padding(
+        padding: EdgeInsets.all(20),
+        child: Image(
+            image: AssetImage('assets/images/logos/gozap_small_color_logo.png',
+                package: 'gozap_package')),
+      );
+  static brandSmallBannerWidget(BuildContext context) => const Image(
+      image: AssetImage('assets/images/bg/gozap_small_banner.png',
+          package: 'gozap_package'));
+  static brandLargeBannerWidget(BuildContext context) => const Image(
+      image: AssetImage('assets/images/bg/gozap_large_banner.png',
+          package: 'gozap_package'));
+  static lottieSignedupWidget(BuildContext context) => Lottie.asset(
+        "packages/gozap_package/assets/lottie/registered_lottie.json",
+        repeat: false,
+      );
+  static lottieLoggedInWidget(BuildContext context) => Lottie.asset(
+        "packages/gozap_package/assets/lottie/logged_in_lottie.json",
+        repeat: false,
+      );
+}

+ 31 - 0
lib/components/icon_button_widget.dart

@@ -0,0 +1,31 @@
+import 'package:flutter/material.dart';
+
+class IconButtonWidget extends StatelessWidget {
+  final IconData icon;
+  final Color? buttonColor, iconColor;
+  final Function onTap;
+  final double elevation;
+
+  const IconButtonWidget(
+      {super.key,
+      required this.icon,
+      this.buttonColor,
+      this.iconColor,
+      required this.onTap,
+      this.elevation = 5});
+
+  @override
+  Widget build(BuildContext context) {
+    return Material(
+        elevation: elevation,
+        color: buttonColor ?? Theme.of(context).primaryColor,
+        borderRadius: BorderRadius.circular(5),
+        child: InkWell(
+            borderRadius: BorderRadius.circular(5),
+            child: SizedBox(
+                width: 38,
+                height: 38,
+                child: Icon(icon, size: 25, color: iconColor ?? Colors.white)),
+            onTap: () => onTap()));
+  }
+}

+ 43 - 0
lib/components/icons/gozap_icons.dart

@@ -0,0 +1,43 @@
+/// Flutter icons GoZAPPIcon
+/// Copyright (C) 2022 by original authors @ fluttericon.com, fontello.com
+/// This font was generated by FlutterIcon.com, which is derived from Fontello.
+///
+/// To use this font, place it in your fonts/ directory and include the
+/// following in your pubspec.yaml
+///
+/// flutter:
+///   fonts:
+///    - family:  GoZAPPIcon
+///      fonts:
+///       - asset: fonts/GoZAPPIcon.ttf
+///
+/// 
+///
+// ignore_for_file: constant_identifier_names
+
+import 'package:flutter/widgets.dart';
+
+class GoZAPPIcon {
+  GoZAPPIcon._();
+
+  static const _kFontFam = 'GoZAPPIcon';
+  static const String? _kFontPkg = null;
+
+  static const IconData month_swaps = IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData recharged_swaps = IconData(0xe801, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData remaing_swaps = IconData(0xe802, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData free_swaps = IconData(0xe803, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData asset = IconData(0xe80d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData asset_category_id = IconData(0xe80e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData asset_id = IconData(0xe80f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData payment_type = IconData(0xe810, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData returning_battery_id = IconData(0xe811, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData rider_id = IconData(0xe812, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData service = IconData(0xe813, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData service_type = IconData(0xe814, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData swap_battery_id = IconData(0xe815, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData admin_free_swaps = IconData(0xe816, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData admin_paid_swaps = IconData(0xe817, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData admin_recharge_swaps = IconData(0xe818, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData admin_total_swaps = IconData(0xe819, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+}

+ 36 - 0
lib/components/icons/gozap_icons_old.dart

@@ -0,0 +1,36 @@
+/// Flutter icons GoZAPPIcon
+/// Copyright (C) 2022 by original authors @ fluttericon.com, fontello.com
+/// This font was generated by FlutterIcon.com, which is derived from Fontello.
+///
+/// To use this font, place it in your fonts/ directory and include the
+/// following in your pubspec.yaml
+///
+/// flutter:
+///   fonts:
+///    - family:  GoZAPPIcon
+///      fonts:
+///       - asset: fonts/GoZAPPIcon.ttf
+///
+///
+///
+// ignore_for_file: constant_identifier_names
+
+import 'package:flutter/widgets.dart';
+
+class GoZAPPIcon {
+  GoZAPPIcon._();
+
+  static const _kFontFam = 'GoZAPPIcon';
+  static const String? _kFontPkg = null;
+
+  static const IconData month_swaps =
+      IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData recharged_swaps =
+      IconData(0xe801, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData remaing_swaps =
+      IconData(0xe802, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData free_swaps =
+      IconData(0xe803, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+  static const IconData group =
+      IconData(0xe900, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+}

+ 36 - 0
lib/components/localization/app_translations.dart

@@ -0,0 +1,36 @@
+import 'dart:async';
+import 'dart:convert';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart' show rootBundle;
+
+class AppTranslations {
+  Locale locale;
+  static Map<dynamic, dynamic>? _localisedValues;
+
+  AppTranslations(this.locale);
+
+  static AppTranslations? of(BuildContext context) {
+    return Localizations.of<AppTranslations>(context, AppTranslations);
+  }
+
+  static Future<AppTranslations> load(Locale locale) async {
+    late AppTranslations appTranslations = AppTranslations(locale);
+    // String path = 'packages/gozap_package/assets/user_state.json';
+    // String jobsString = await rootBundle.loadString(path);
+    // List<dynamic> users = await jsonDecode(jobsString);
+    String jsonContent = await rootBundle.loadString(
+        "packages/gozap_package/assets/locale/localization_${locale.languageCode}.json");
+    _localisedValues = json.decode(jsonContent);
+    return appTranslations;
+  }
+
+  get currentLanguage => locale.languageCode;
+
+  String text(String key) {
+    if (_localisedValues != null) {
+      return _localisedValues![key] ?? "$key not found";
+    } else {
+      return "";
+    }
+  }
+}

+ 25 - 0
lib/components/localization/app_translations_delegate.dart

@@ -0,0 +1,25 @@
+import 'dart:async';
+import 'package:flutter/material.dart';
+import 'package:gozap_package/components/localization/application.dart';
+import 'package:gozap_package/components/localization/app_translations.dart';
+
+class AppTranslationsDelegate extends LocalizationsDelegate<AppTranslations> {
+  final Locale? newLocale;
+
+  const AppTranslationsDelegate({this.newLocale});
+
+  @override
+  bool isSupported(Locale locale) {
+    return application.supportedLanguagesCodes.contains(locale.languageCode);
+  }
+
+  @override
+  Future<AppTranslations> load(Locale locale) {
+    return AppTranslations.load(newLocale ?? locale);
+  }
+
+  @override
+  bool shouldReload(LocalizationsDelegate<AppTranslations> old) {
+    return true;
+  }
+}

+ 28 - 0
lib/components/localization/application.dart

@@ -0,0 +1,28 @@
+import 'dart:ui';
+
+class Application {
+  static final Application _application = Application._internal();
+  final List<String> supportedLanguages = [
+    "English",
+    "Hindi",
+  ];
+
+  final List<String> supportedLanguagesCodes = [
+    "en",
+    "hi",
+  ];
+  factory Application() {
+    return _application;
+  }
+
+  Application._internal();
+
+  //returns the list of supported Locales
+  Iterable<Locale> supportedLocales() =>
+      supportedLanguagesCodes.map<Locale>((language) => Locale(language, ""));
+  //function to be invoked when changing the language
+  late LocaleChangeCallback onLocaleChanged;
+}
+
+Application application = Application();
+typedef LocaleChangeCallback = void Function(Locale locale);

+ 259 - 0
lib/components/quantity_input.dart

@@ -0,0 +1,259 @@
+// ignore_for_file: library_private_types_in_public_api, depend_on_referenced_packages
+
+import 'package:intl/intl.dart';
+import 'icon_button_widget.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+
+/// quantity input type
+/// [int] default mask type, to format value as int
+/// [double] to format value as double
+enum QuantityInputType {
+  int,
+  double,
+}
+
+class QuantityInput extends StatefulWidget {
+  /// Has to be an int or double depending on QuantityInputType variable
+  final dynamic value;
+
+  /// Detects changes to the input and sends value through param
+  final Function(String) onChanged;
+
+  /// The value that is incremented or decremented each time the user presses a button
+  final dynamic step;
+
+  /// The number of decimal places that can be displayed for double input
+  final int decimalDigits;
+
+  /// Set min value to be displayed in input
+  final dynamic minValue;
+
+  /// Set max value to be displayed in input
+  final dynamic maxValue;
+
+  /// The width of the textfield input
+  final double inputWidth;
+
+  /// Sets color for increment and decrement buttons
+  final Color? buttonColor;
+
+  /// Sets color for icons inside increment and decrement buttons
+  final Color? iconColor;
+
+  /// Sets label for input
+  final String label;
+
+  /// Determines if the input will be readOnly
+  final bool readOnly;
+
+  /// If set to true, the input can accept the value 0
+  final bool acceptsZero;
+
+  /// If set to true, the input can accept negative values
+  final bool acceptsNegatives;
+
+  /// Determines if the input will manage values as int or double
+  final QuantityInputType? type;
+
+  /// Sets custom InputDecoration to the widget TextFormField
+  final InputDecoration? decoration;
+
+  /// Sets elevation to increment and decrement buttons
+  final double elevation;
+
+  /// Creates a widget that can be used to manage number inputs
+  ///
+  /// Widget can manage integer or double values
+  const QuantityInput(
+      {super.key,
+      required this.value,
+      required this.onChanged,
+      this.step = 1,
+      this.decimalDigits = 1,
+      this.buttonColor,
+      this.iconColor,
+      this.label = '',
+      this.readOnly = false,
+      this.acceptsNegatives = false,
+      this.acceptsZero = false,
+      this.minValue = 1,
+      this.maxValue = 100000,
+      this.type = QuantityInputType.int,
+      this.inputWidth = 80,
+      this.decoration,
+      this.elevation = 5})
+      : assert(decimalDigits > 0,
+            'Decimal digits cannot be set to zero or negative value'),
+        assert(!(acceptsZero && acceptsNegatives),
+            'acceptsZero and acceptsNegatives cannot be simultaneously true');
+
+  @override
+  _QuantityInputState createState() => _QuantityInputState();
+}
+
+class _QuantityInputState extends State<QuantityInput> {
+  final TextEditingController _controller = TextEditingController();
+
+  @override
+  void initState() {
+    super.initState();
+    _controller.text = valueFormatter(widget.value);
+  }
+
+  String valueFormatter(dynamic value) {
+    String extraZeros = '';
+
+    if (widget.decimalDigits > 0 && widget.type == QuantityInputType.double) {
+      extraZeros = '.';
+      extraZeros = extraZeros.padRight(widget.decimalDigits + 1, '0');
+    }
+
+    NumberFormat formatter = NumberFormat(
+        '#,###,###,###,###,###,###,###,###,##0$extraZeros', 'en_US');
+
+    return formatter.format(value);
+  }
+
+  String parseNewDouble(String value) {
+    String fullPartOfDouble =
+        value.substring(0, value.length - widget.decimalDigits);
+    String decimalPartOfDouble =
+        value.substring(value.length - widget.decimalDigits);
+    String newFullValue = '$fullPartOfDouble.$decimalPartOfDouble';
+
+    return newFullValue;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Padding(
+        padding: const EdgeInsets.symmetric(vertical: 5),
+        child: Column(
+            mainAxisSize: MainAxisSize.min,
+            mainAxisAlignment: MainAxisAlignment.start,
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              Visibility(
+                  visible: widget.label.isNotEmpty,
+                  child: Padding(
+                      padding: const EdgeInsets.only(bottom: 5),
+                      child: Text(widget.label,
+                          textAlign: TextAlign.start,
+                          style: TextStyle(
+                              color: Colors.grey[500],
+                              fontSize: 13,
+                              fontWeight: FontWeight.w500)))),
+              Row(
+                  mainAxisSize: MainAxisSize.min,
+                  mainAxisAlignment: MainAxisAlignment.start,
+                  crossAxisAlignment: CrossAxisAlignment.start,
+                  children: [
+                    IconButtonWidget(
+                        icon: Icons.remove,
+                        iconColor: widget.iconColor,
+                        buttonColor: widget.buttonColor,
+                        elevation: widget.elevation,
+                        onTap: () {
+                          dynamic currentValue = 0;
+
+                          if (widget.acceptsNegatives ||
+                              ((widget.value - widget.step) > 0 &&
+                                  widget.type == QuantityInputType.double) ||
+                              ((widget.value - widget.step) >= 1 &&
+                                  widget.type == QuantityInputType.int) ||
+                              (widget.acceptsZero &&
+                                  (widget.value - widget.step) == 0)) {
+                            currentValue = widget.value - widget.step;
+                          } else {
+                            currentValue = widget.value;
+                          }
+
+                          String formattedValue = valueFormatter(currentValue);
+                          _controller.value = TextEditingValue(
+                              text: formattedValue,
+                              selection: TextSelection.collapsed(
+                                  offset: formattedValue.length));
+                          widget.onChanged(formattedValue);
+                        }),
+                    SizedBox(
+                        height: 38,
+                        width: widget.inputWidth,
+                        child: Padding(
+                            padding: const EdgeInsets.symmetric(horizontal: 5),
+                            child: TextFormField(
+                                controller: _controller,
+                                textAlign: TextAlign.center,
+                                decoration: widget.decoration,
+                                readOnly: widget.readOnly,
+                                keyboardType: TextInputType.number,
+                                inputFormatters: [
+                                  TextInputFormatter.withFunction(
+                                      (oldValue, newValue) {
+                                    String simpleValue = '';
+                                    String formattedValue = '';
+                                    if (newValue.text
+                                        .contains(RegExp(r'[a-zA-Z]'))) {
+                                      return oldValue;
+                                    }
+
+                                    if (widget.type ==
+                                        QuantityInputType.double) {
+                                      simpleValue = newValue.text
+                                          .replaceAll(',', '')
+                                          .replaceAll('.', '');
+
+                                      if (simpleValue.length == 1) {
+                                        simpleValue =
+                                            simpleValue.padLeft(1, '0');
+                                      }
+
+                                      formattedValue = valueFormatter(
+                                          double.parse(
+                                              parseNewDouble(simpleValue)));
+                                    } else {
+                                      if (newValue.text.isEmpty) {
+                                        formattedValue = '0';
+                                      } else {
+                                        simpleValue =
+                                            newValue.text.replaceAll(',', '');
+
+                                        formattedValue = valueFormatter(
+                                            int.parse(simpleValue));
+                                      }
+                                    }
+
+                                    return TextEditingValue(
+                                        text: formattedValue,
+                                        selection: TextSelection.collapsed(
+                                            offset: formattedValue.length));
+                                  })
+                                ],
+                                onChanged: (value) =>
+                                    widget.onChanged(value)))),
+                    IconButtonWidget(
+                        icon: Icons.add,
+                        iconColor: widget.iconColor,
+                        buttonColor: widget.buttonColor,
+                        elevation: widget.elevation,
+                        onTap: () {
+                          dynamic currentValue = 0;
+
+                          if (widget.maxValue >= widget.value &&
+                              widget.maxValue >= widget.value + widget.step) {
+                            currentValue = widget.value + widget.step;
+                          } else {
+                            currentValue = widget.value;
+                          }
+
+                          String formattedValue = valueFormatter(currentValue);
+                          _controller.value = TextEditingValue(
+                              text: formattedValue,
+                              selection: TextSelection.collapsed(
+                                  offset: formattedValue.length));
+                          widget.onChanged(formattedValue);
+                        })
+                  ])
+            ]));
+  }
+}

+ 113 - 0
lib/components/responsive.dart

@@ -0,0 +1,113 @@
+// ignore_for_file: no_leading_underscores_for_local_identifiers
+
+import 'package:flutter/material.dart';
+
+class ResponsiveWidget extends StatelessWidget {
+  const ResponsiveWidget({
+    Key? key,
+    required this.mobileBody,
+    this.tabletBody,
+    this.desktopBody,
+  }) : super(key: key);
+
+  final Widget mobileBody;
+  final Widget? tabletBody;
+  final Widget? desktopBody;
+  
+  // This isMobile, isTablet, isDesktop helep us later
+  static bool isMobile(BuildContext context) =>
+      MediaQuery.of(context).size.width < 650;
+
+  static bool isTablet(BuildContext context) =>
+      MediaQuery.of(context).size.width < 1200 &&
+      MediaQuery.of(context).size.width >= 650;
+
+  static bool isDesktop(BuildContext context) =>
+      MediaQuery.of(context).size.width >= 1200;
+
+  static double fullWidth(BuildContext context) =>
+     MediaQuery.of(context).size.width;
+  
+
+  static double fullHeight(BuildContext context) =>
+     MediaQuery.of(context).size.height;
+
+  static const kTabletBreakpoint =
+      768.0; //breakpoint for a tablet (a tablet's width is 768 px)
+  static const kDesktopBreakPoint =
+      1024.0; //breakpoint for desktop (a desktop screen's width is 1440 px)
+
+  static const kSideMenuWidth = 300.0; // for sidemenu
+  static const kNavigationRailWidth = 72.0; // for navigation rail
+
+  static const kMaxWidth = 1180.0; // maximum width
+  @override
+  Widget build(BuildContext context) {
+    return LayoutBuilder(
+      builder: (context, dimens) {
+        // check if the device is a phone
+        if (dimens.maxWidth >= kDesktopBreakPoint) {
+          // returns mobileBody if desktopBody is null
+          return desktopBody ?? mobileBody;
+        } else if (dimens.maxWidth >= kTabletBreakpoint &&
+            dimens.maxWidth < kDesktopBreakPoint) {
+          // returns mobileBody if tabletBody is null
+          return tabletBody ?? mobileBody;
+        } else {
+          return mobileBody;
+        }
+      },
+    );
+  }
+}
+
+class ScreenType extends StatelessWidget {
+  final Widget mobile;
+  final Widget? tablet;
+  final Widget desktop;
+
+  const ScreenType({
+    required this.mobile,
+    required this.desktop,
+    Key? key,
+    this.tablet,
+  }) : super(key: key);
+
+// This size work fine on my design, maybe you need some customization depends on your design
+
+  // This isMobile, isTablet, isDesktop helep us later
+  static bool isMobile(BuildContext context) =>
+      MediaQuery.of(context).size.width < 650;
+
+  static bool isTablet(BuildContext context) =>
+      MediaQuery.of(context).size.width < 1100 &&
+      MediaQuery.of(context).size.width >= 650;
+
+  static bool isDesktop(BuildContext context) =>
+      MediaQuery.of(context).size.width >= 1100;
+
+  static double fullWidth(BuildContext context) =>
+     MediaQuery.of(context).size.width;
+  
+
+  static double fullHeight(BuildContext context) =>
+     MediaQuery.of(context).size.height;
+  
+
+  @override
+  Widget build(BuildContext context) {
+    final _size = MediaQuery.of(context).size;
+    // If our width is more than 1100 then we consider it a desktop
+    if (_size.width >= 1100) {
+      return desktop;
+    }
+    // If width it less then 1100 and more then 850 we consider it as tablet
+    else if (_size.width >= 650 && tablet != null) {
+      return tablet!;
+    }
+    // Or less then that we called it mobile
+    else {
+      return mobile;
+    }
+  }
+}

+ 19 - 0
lib/components/themes/themes.dart

@@ -0,0 +1,19 @@
+import 'package:flutter/animation.dart';
+import 'package:flutter/material.dart';
+
+class AppTheme {
+  static Color primaryColor = const Color(0xff206ca8);
+  static Color secondaryColor = const Color(0xff05dde2);
+  static Color whiteColor = const Color(0xffffffff);
+  static Color organeColor = const Color(0xffFfa500);
+  static Color pinkColor = const Color(0xffFFC0CB);
+  static Color blueColor = const Color(0xff0000ff);
+  static Color redColor = const Color(0xffFF0000);
+  static Color purpleColor = const Color(0xff800080);
+  static Color yellowColor = const Color(0xffFFFF00);
+  static Color magentaColor = const Color(0xffFF00FF);
+  static Color brownColor = const Color(0xffA52A2A);
+  static Color cyanColor = const Color(0xff00FFFF);
+  
+  // AppTheme({this.primaryColor});
+}

+ 11 - 0
lib/controllers/extentions/trycatch.dart

@@ -0,0 +1,11 @@
+import 'dart:developer';
+
+extension FunctionUtils on Function {
+  void callAndAbsorbError() {
+    try {
+      this.call();
+    } catch (e, st) {
+      log("Error in $this", error: e, stackTrace: st);
+    }
+  }
+}

+ 36 - 0
lib/controllers/log_in/log_in_controller.dart

@@ -0,0 +1,36 @@
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+// import model
+import 'package:gozap_package/models/log_in/log_in_model.dart';
+
+class LogInController {
+  LogInController();
+
+  void getter(BuildContext context) {
+    LogInModel viewModel = Provider.of<LogInModel>(context, listen: false);
+    // ignore: todo
+    //TODO Add code here for getter
+    viewModel.getter(context);
+  }
+
+  void setter(BuildContext context, Widget nextScreen) {
+    LogInModel viewModel = Provider.of<LogInModel>(context, listen: false);
+    // ignore: todo
+    //TODO Add code here for setter
+    viewModel.setter(context, nextScreen: nextScreen);
+  }
+
+  void update(BuildContext context) {
+    LogInModel viewModel = Provider.of<LogInModel>(context, listen: false);
+    // ignore: todo
+    //TODO Add code here for update
+    viewModel.update();
+  }
+
+  void remove(BuildContext context) {
+    LogInModel viewModel = Provider.of<LogInModel>(context, listen: false);
+    // ignore: todo
+    //TODO Add code here for remove
+    viewModel.remove();
+  }
+}

+ 36 - 0
lib/controllers/signup/signup_controller.dart

@@ -0,0 +1,36 @@
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+// import model
+import 'package:gozap_package/models/signup/signup_model.dart';
+
+class SignupController {
+  SignupController();
+
+  void getter(BuildContext context) {
+    SignupModel viewModel = Provider.of<SignupModel>(context, listen: false);
+    // ignore: todo
+    //TODO Add code here for getter
+    viewModel.getter();
+  }
+
+  void setter(BuildContext context, Widget nextScreen) {
+    SignupModel viewModel = Provider.of<SignupModel>(context, listen: false);
+    // ignore: todo
+    //TODO Add code here for setter
+    viewModel.setter(context, nextScreen: nextScreen);
+  }
+
+  void update(BuildContext context) {
+    SignupModel viewModel = Provider.of<SignupModel>(context, listen: false);
+    // ignore: todo
+    //TODO Add code here for update
+    viewModel.update();
+  }
+
+  void remove(BuildContext context) {
+    SignupModel viewModel = Provider.of<SignupModel>(context, listen: false);
+    // ignore: todo
+    //TODO Add code here for remove
+    viewModel.remove();
+  }
+}

+ 29 - 0
lib/gozap_package.dart

@@ -0,0 +1,29 @@
+library gozap_package;
+
+import 'package:flutter/material.dart';
+
+
+MaterialColor buildMaterialColor(Color color) {
+  List strengths = <double>[.05];
+
+  Map<int, Color> swatch = <int, Color>{};
+
+  final int r = color.red, g = color.green, b = color.blue;
+
+  for (int i = 1; i < 10; i++) {
+    strengths.add(0.1 * i);
+  }
+
+  for (var strength in strengths) {
+    final double ds = 0.5 - strength;
+
+    swatch[(strength * 1000).round()] = Color.fromRGBO(
+      r + ((ds < 0 ? r : (255 - r)) * ds).round(),
+      g + ((ds < 0 ? g : (255 - g)) * ds).round(),
+      b + ((ds < 0 ? b : (255 - b)) * ds).round(),
+      1,
+    );
+  }
+
+  return MaterialColor(color.value, swatch);
+}

+ 5 - 0
lib/models/DB/table.dart

@@ -0,0 +1,5 @@
+// ignore_for_file: non_constant_identifier_names
+
+class DBTable {
+  static String User = "User";
+}

+ 22 - 0
lib/models/admin/admin_model.dart

@@ -0,0 +1,22 @@
+// ignore_for_file: non_constant_identifier_names
+
+import 'package:gozap_package/models/user/user_model.dart';
+import 'package:gozap_package/models/asset/asset_model.dart';
+import 'package:gozap_package/models/swap/swap_history_model.dart';
+import 'package:gozap_package/models/recharge/recharge_history_model.dart';
+import 'package:gozap_package/models/service/service_history_model.dart';
+
+class AdminModule {
+  late UserModule User;
+  late SwapHistoryMetaModule SwapHistoryMeta;
+  late RechargeHistoryMetaModule RechargeHistoryMeta;
+  late ServiceHistoryMetaModule ServiceHistoryMeta;
+  late AssetMetaModule AssetMeta;
+  AdminModule(
+      {required this.User,
+      required this.SwapHistoryMeta,
+      required this.RechargeHistoryMeta,
+      required this.ServiceHistoryMeta,
+      required this.AssetMeta,
+      });
+}

+ 31 - 0
lib/models/asset/asset_category_model.dart

@@ -0,0 +1,31 @@
+// ignore_for_file: non_constant_identifier_names
+
+class AssetCategoryModule {
+  late int AssetCategoryID ;
+  late String AssetCategoryTitle;
+  late DateTime AssetCategoryCreatedAt;
+  late DateTime AssetCategoryUpdatedAt;
+  AssetCategoryModule(
+      {required this.AssetCategoryID,
+      required this.AssetCategoryTitle,
+      required this.AssetCategoryCreatedAt,
+      required this.AssetCategoryUpdatedAt});
+
+  static Map<String, dynamic> toMap(AssetCategoryModule user) {
+    var map = <String, dynamic>{};
+    map['AssetCategoryID'] = user.AssetCategoryID;
+    map['AssetCategoryTitle'] = user.AssetCategoryTitle;
+    map['AssetCategoryCreatedAt'] = user.AssetCategoryCreatedAt.toString();
+    map['AssetCategoryUpdatedAt'] = user.AssetCategoryUpdatedAt.toString();
+    return map;
+  }
+
+  factory AssetCategoryModule.fromJson(dynamic json) {
+    return AssetCategoryModule(
+      AssetCategoryID: json['AssetCategoryID'],
+      AssetCategoryTitle: json['AssetCategoryTitle'],
+      AssetCategoryCreatedAt: DateTime.parse(json['AssetCategoryCreatedAt']),
+      AssetCategoryUpdatedAt: DateTime.parse(json['AssetCategoryUpdatedAt']),
+    );
+  }
+}

+ 66 - 0
lib/models/asset/asset_model.dart

@@ -0,0 +1,66 @@
+
+// ignore_for_file: depend_on_referenced_packages, non_constant_identifier_names
+
+import 'package:intl/intl.dart';
+import 'package:gozap_package/models/asset/asset_category_model.dart';
+
+class AssetMetaModule {
+  late int TotalAssetCount;
+  late int BatteryAssetCount;
+  late int vehicleAssetCount;
+  late List<AssetModule> AssetList;
+
+  AssetMetaModule(
+      {required this.TotalAssetCount,
+      required this.BatteryAssetCount,
+      required this.vehicleAssetCount,
+      required this.AssetList});
+}
+
+class AssetModule {
+  late String AssetID;
+  late String AssetName;
+  late int AssetCategoryID;
+  late AssetCategoryModule AssetCategory;
+  late bool IsInServiceCenter;
+  late DateTime AssetCreatedAt;
+  late DateTime AssetUpdatedAt;
+  late String AssetormattedCreatedAt;
+  AssetModule({
+    required this.AssetID,
+    required this.AssetName,
+    required this.AssetCategoryID,
+    required this.AssetCategory,
+    required this.IsInServiceCenter,
+    required this.AssetCreatedAt,
+    required this.AssetUpdatedAt,
+    required this.AssetormattedCreatedAt,
+  });
+
+  static Map<String, dynamic> toMap(AssetModule user) {
+    var map = <String, dynamic>{};
+    map['AssetID'] = user.AssetID;
+    map['AssetName'] = user.AssetName;
+    map['AssetCategoryID'] = user.AssetCategoryID;
+    map['IsInServiceCenter'] = user.IsInServiceCenter ? 1 : 0;
+    map['AssetCreatedAt'] = user.AssetCreatedAt.toString();
+    map['AssetUpdatedAt'] = user.AssetUpdatedAt.toString();
+    return map;
+  }
+
+  factory AssetModule.fromJson(
+    dynamic json,
+  ) {
+    return AssetModule(
+      AssetID: json['AssetID'],
+      AssetName: json['AssetName'],
+      AssetCategoryID: json['AssetCategoryID'],
+      AssetCategory: AssetCategoryModule.fromJson(json['AssetCategory']),
+      IsInServiceCenter: json['IsInServiceCenter'] == 1 ? true : false,
+      AssetCreatedAt: DateTime.parse(json['AssetCreatedAt']),
+      AssetUpdatedAt: DateTime.parse(json['AssetUpdatedAt']),
+      AssetormattedCreatedAt: DateFormat('MMM dd, yyyy hh:mm a')
+          .format(DateTime.parse(json['AssetCreatedAt'])),
+    );
+  }
+}

+ 18 - 0
lib/models/common.dart

@@ -0,0 +1,18 @@
+import 'package:flutter/material.dart';
+
+class commonChangeNotifier extends ChangeNotifier {
+  String _mainURL="";
+
+  String get mainURL => _mainURL;
+  
+  set(BuildContext context,String url) async {
+    _mainURL = url;
+    notifyListeners();
+  }
+  get(BuildContext context) async {
+    notifyListeners();
+  }
+  remove(BuildContext context) async {
+    notifyListeners();
+  }
+}

+ 98 - 0
lib/models/log_in/log_in_model.dart

@@ -0,0 +1,98 @@
+// ignore_for_file: constant_identifier_names, use_build_context_synchronously
+
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
+import 'package:gozap_package/components/apiservices.dart';
+import 'package:gozap_package/models/user/user_model.dart';
+
+import 'package:provider/provider.dart';
+
+enum LogInModelStatus {
+  Ended,
+  Loading,
+  Error,
+}
+
+class LogInModel extends ChangeNotifier {
+  late LogInModelStatus _status;
+  late String _errorCode;
+  late String _errorMessage;
+
+  String get errorCode => _errorCode;
+  String get errorMessage => _errorMessage;
+  LogInModelStatus get status => _status;
+
+  LogInModel();
+
+  LogInModel.instance(BuildContext context, Widget nextScreen) {
+    // ignore: todo
+    //TODO Add code here
+    getter(context,nextScreen:nextScreen);
+  }
+
+  Future<void> getter(BuildContext context,{Widget? nextScreen}) async {
+    _status = LogInModelStatus.Loading;
+    notifyListeners();
+
+    await Provider.of<userChangeNotifier>(context, listen: false).get(context);
+    UserModule? user=  Provider.of<userChangeNotifier>(context, listen: false).user;
+    if (user!=null) {
+      Navigator.pushReplacement(
+            context,
+            MaterialPageRoute(
+                builder: (context) =>nextScreen!));
+    }
+
+    _status = LogInModelStatus.Ended;
+    notifyListeners();
+  }
+
+  Future<void> setter(BuildContext context,
+      {Map<String, dynamic>? data, required Widget nextScreen}) async {
+    _status = LogInModelStatus.Loading;
+    notifyListeners();
+    try {
+      var resdata = await APIService(context).postData(
+          "User/login.php",
+          {
+            "phonenumber": data!["phonenumber"],
+            "password": data["password"],
+          },
+          false);
+      if (resdata != null) {
+        UserModule userModule = UserModule.fromJson(resdata);
+        await Provider.of<userChangeNotifier>(context, listen: false)
+            .set(context, userModule, false, nextScreen);
+      }
+    } catch (e) {
+      if (kDebugMode) {
+        print(e);
+      }
+    }
+
+    _status = LogInModelStatus.Ended;
+    notifyListeners();
+  }
+
+  void update() {
+    _status = LogInModelStatus.Loading;
+    notifyListeners();
+
+    // ignore: todo
+    //TODO Add code here
+
+    _status = LogInModelStatus.Ended;
+    notifyListeners();
+  }
+
+  void remove() {
+    _status = LogInModelStatus.Loading;
+    notifyListeners();
+
+    // ignore: todo
+    //TODO Add code here
+
+    _status = LogInModelStatus.Ended;
+    notifyListeners();
+  }
+}

+ 54 - 0
lib/models/recharge/recharge_history_model.dart

@@ -0,0 +1,54 @@
+// ignore_for_file: depend_on_referenced_packages, non_constant_identifier_names
+
+import 'package:intl/intl.dart';
+
+class RechargeHistoryMetaModule {
+  late int TotalRechargeCount;
+  late List<RechargeHistoryModule> RechargeHistoryList;
+
+  RechargeHistoryMetaModule(
+      {required this.TotalRechargeCount,
+      required this.RechargeHistoryList});
+}
+
+class RechargeHistoryModule {
+  late int RechargeID;
+  late String RiderID;
+  late String TransactionID;
+  late String PaymentTypeID;
+  late DateTime RechargeCreatedAt;
+  late DateTime RechargeUpdatedAt;
+  late String RechargeFormattedCreatedAt;
+  RechargeHistoryModule(
+      {required this.RechargeID,
+      required this.RiderID,
+      required this.TransactionID,
+      required this.PaymentTypeID,
+      required this.RechargeCreatedAt,
+      required this.RechargeUpdatedAt,
+      required this.RechargeFormattedCreatedAt});
+
+  static Map<String, dynamic> toMap(RechargeHistoryModule user) {
+    var map = <String, dynamic>{};
+    map['RechargeID'] = user.RechargeID;
+    map['RiderID'] = user.RiderID;
+    map['TransactionID'] = user.TransactionID;
+    map['PaymentTypeID'] = user.PaymentTypeID;
+    map['RechargeCreatedAt'] = user.RechargeCreatedAt.toString();
+    map['RechargeUpdatedAt'] = user.RechargeUpdatedAt.toString();
+    return map;
+  }
+
+  factory RechargeHistoryModule.fromJson(dynamic json) {
+    return RechargeHistoryModule(
+      RechargeID: json['RechargeID'],
+      RiderID: json['RiderID'],
+      TransactionID: json['TransactionID'],
+      PaymentTypeID: json['PaymentTypeID'],
+      RechargeCreatedAt: DateTime.parse(json['RechargeCreatedAt']),
+      RechargeUpdatedAt: DateTime.parse(json['RechargeUpdatedAt']),
+      RechargeFormattedCreatedAt: DateFormat('MMM dd, yyyy hh:mm a')
+          .format(DateTime.parse(json['RechargeCreatedAt'])),
+    );
+  }
+}

+ 65 - 0
lib/models/service/service_history_model.dart

@@ -0,0 +1,65 @@
+// ignore_for_file: depend_on_referenced_packages, non_constant_identifier_names
+
+import 'package:intl/intl.dart';
+
+class ServiceHistoryMetaModule {
+  late int TotalCount;
+  late int ServicedCount;
+  late int InCompletedCount;
+  late List<ServiceHistoryModule> ServiceHistoryList;
+
+  ServiceHistoryMetaModule(
+      {required this.TotalCount,
+      required this.ServicedCount,
+      required this.InCompletedCount,
+      required this.ServiceHistoryList});
+}
+
+class ServiceHistoryModule {
+  late int ServiceHistoryID;
+  late String AssetID;
+  late bool isServiced;
+  late String outWard;
+  late String InWard;
+  late DateTime ServiceHistoryCreatedAt;
+  late DateTime ServiceHistoryUpdatedAt;
+  late String ServiceHistoryFormattedCreatedAt;
+  ServiceHistoryModule({
+    required this.ServiceHistoryID,
+    required this.AssetID,
+    required this.isServiced,
+    required this.outWard,
+    required this.InWard,
+    required this.ServiceHistoryCreatedAt,
+    required this.ServiceHistoryUpdatedAt,
+    required this.ServiceHistoryFormattedCreatedAt,
+  });
+
+  static Map<String, dynamic> toMap(ServiceHistoryModule user) {
+    var map = <String, dynamic>{};
+    map['ServiceHistoryID'] = user.ServiceHistoryID;
+    map['AssetID'] = user.AssetID;
+    map['isServiced'] = user.isServiced ? 1 : 0;
+    map['outWard'] = user.outWard;
+    map['InWard'] = user.InWard;
+    map['ServiceHistoryCreatedAt'] = user.ServiceHistoryCreatedAt.toString();
+    map['ServiceHistoryUpdatedAt'] = user.ServiceHistoryUpdatedAt.toString();
+    return map;
+  }
+
+  factory ServiceHistoryModule.fromJson(dynamic json) {
+    return ServiceHistoryModule(
+      ServiceHistoryID: json['ServiceHistoryID'],
+      AssetID: json['AssetID'],
+      isServiced: json['isServiced'] == 1 ? true : false,
+      outWard: DateFormat('MMM dd, yyyy hh:mm a')
+          .format(DateTime.parse(json['outWard'])),
+      InWard: json['InWard']!=null?DateFormat('MMM dd, yyyy hh:mm a')
+          .format(DateTime.parse(json['InWard'])):"",
+      ServiceHistoryCreatedAt: DateTime.parse(json['ServiceHistoryCreatedAt']),
+      ServiceHistoryUpdatedAt: DateTime.parse(json['ServiceHistoryUpdatedAt']),
+      ServiceHistoryFormattedCreatedAt: DateFormat('MMM dd, yyyy hh:mm a')
+          .format(DateTime.parse(json['ServiceHistoryCreatedAt'])),
+    );
+  }
+}

+ 95 - 0
lib/models/signup/signup_model.dart

@@ -0,0 +1,95 @@
+// ignore_for_file: constant_identifier_names
+
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:flutter/foundation.dart';
+import 'package:gozap_package/components/apiservices.dart';
+import 'package:gozap_package/models/user/user_model.dart';
+
+enum SignupModelStatus {
+  Ended,
+  Loading,
+  Error,
+}
+
+class SignupModel extends ChangeNotifier {
+  late SignupModelStatus _status;
+  late String _errorCode;
+  late String _errorMessage;
+
+  String get errorCode => _errorCode;
+  String get errorMessage => _errorMessage;
+  SignupModelStatus get status => _status;
+
+  SignupModel();
+
+  SignupModel.instance() {
+    // ignore: todo
+    //TODO Add code here
+    getter();
+  }
+
+  void getter() {
+    _status = SignupModelStatus.Loading;
+    notifyListeners();
+
+    // ignore: todo
+    //TODO Add code here
+
+    _status = SignupModelStatus.Ended;
+    notifyListeners();
+  }
+
+  Future<void> setter(BuildContext context,
+      {Map<String, dynamic>? data, required Widget nextScreen}) async {
+    _status = SignupModelStatus.Loading;
+    notifyListeners();
+    try {
+      var resdata = await APIService(context).postData(
+          "http://localhost/cygnusa/batterySwap/api/User/signup.php",
+          {
+            "name": data!["name"],
+            "phonenumber": data["phonenumber"],
+            "password": data["password"],
+            "DEID": data["DEID"],
+            
+          },
+          false);
+      if (resdata != null) {
+        UserModule userModule = UserModule.fromJson(resdata);
+        // ignore: use_build_context_synchronously
+        await Provider.of<userChangeNotifier>(context, listen: false)
+            .set(context, userModule, true, nextScreen);
+      }
+    } catch (e) {
+      if (kDebugMode) {
+        print(e);
+      }
+    }
+
+    _status = SignupModelStatus.Ended;
+    notifyListeners();
+  }
+
+  void update() {
+    _status = SignupModelStatus.Loading;
+    notifyListeners();
+
+    // ignore: todo
+    //TODO Add code here
+
+    _status = SignupModelStatus.Ended;
+    notifyListeners();
+  }
+
+  void remove() {
+    _status = SignupModelStatus.Loading;
+    notifyListeners();
+
+    // ignore: todo
+    //TODO Add code here
+
+    _status = SignupModelStatus.Ended;
+    notifyListeners();
+  }
+}

+ 27 - 0
lib/models/swap/swap_count_model.dart

@@ -0,0 +1,27 @@
+// ignore_for_file: non_constant_identifier_names
+
+class SwapCountModule {
+  late int Total;
+  late int Used;
+  late int Available;
+  SwapCountModule({
+    required this.Total,
+    required this.Used,
+    required this.Available,
+  });
+  static Map<String, dynamic> toMap(SwapCountModule freeSwap) {
+    var map = <String, dynamic>{};
+    map['Total'] = freeSwap.Total;
+    map['Used'] = freeSwap.Used;
+    map['Available'] = freeSwap.Available;
+    return map;
+  }
+
+  factory SwapCountModule.fromJson(dynamic json) {
+    return SwapCountModule(
+      Total: json['Total'],
+      Used: json['Used'],
+      Available: json['Available'],
+    );
+  }
+}

+ 70 - 0
lib/models/swap/swap_history_model.dart

@@ -0,0 +1,70 @@
+// ignore_for_file: depend_on_referenced_packages, non_constant_identifier_names
+
+import 'package:intl/intl.dart';
+
+class SwapHistoryMetaModule {
+  late int TotalCount;
+  late int FreeSwapCount;
+  late int PaidSwapCount;
+  late List<SwapHistoryModule> SwapHistoryList;
+  SwapHistoryMetaModule(
+      {required this.TotalCount,
+      required this.FreeSwapCount,
+      required this.PaidSwapCount,
+      required this.SwapHistoryList});
+}
+
+class SwapHistoryModule {
+  late int SwapID;
+  late String RiderID;
+  late String SwapReferID;
+  late String SwapRechargeID;
+  late String SwappedBatterID;
+  late String ReturnBatterID;
+  late bool IsFreeSwap;
+  late DateTime SwapCreatedAt;
+  late DateTime SwapUpdatedAt;
+  late String SwapFormattedCreatedAt;
+
+  SwapHistoryModule(
+      {required this.SwapID,
+      required this.RiderID,
+      required this.SwapReferID,
+      required this.SwapRechargeID,
+      required this.SwappedBatterID,
+      required this.ReturnBatterID,
+      required this.IsFreeSwap,
+      required this.SwapCreatedAt,
+      required this.SwapUpdatedAt,
+      required this.SwapFormattedCreatedAt});
+
+  static Map<String, dynamic> toMap(SwapHistoryModule swapHistory) {
+    var map = <String, dynamic>{};
+    map['SwapID'] = swapHistory.SwapID;
+    map['RiderID'] = swapHistory.RiderID;
+    map['SwapReferID'] = swapHistory.SwapReferID;
+    map['SwapRechargeID'] = swapHistory.SwapRechargeID;
+    map['SwappedBatterID'] = swapHistory.SwappedBatterID;
+    map['ReturnBatterID'] = swapHistory.ReturnBatterID;
+    map['IsFreeSwap'] = swapHistory.IsFreeSwap;
+    map['SwapCreatedAt'] = swapHistory.SwapCreatedAt;
+    map['SwapUpdatedAt'] = swapHistory.SwapUpdatedAt;
+    return map;
+  }
+
+  factory SwapHistoryModule.fromJson(dynamic json) {
+    return SwapHistoryModule(
+      SwapID: json['SwapID'],
+      RiderID: json['RiderID'],
+      SwapRechargeID: json['SwapRechargeID'],
+      SwapReferID: json['SwapReferID'],
+      ReturnBatterID: json['ReturnBatterID'],
+      SwappedBatterID: json['SwappedBatterID'],
+      IsFreeSwap: (json['IsFreeSwap'] == "0") ? false : true,
+      SwapCreatedAt: DateTime.parse(json['SwapCreatedAt']),
+      SwapUpdatedAt: DateTime.parse(json['SwapUpdatedAt']),
+      SwapFormattedCreatedAt: DateFormat('MMM dd, yyyy hh:mm a')
+          .format(DateTime.parse(json['SwapCreatedAt'])),
+    );
+  }
+}

+ 21 - 0
lib/models/swap/swap_model.dart

@@ -0,0 +1,21 @@
+// ignore_for_file: non_constant_identifier_names
+
+import 'package:gozap_package/models/user/user_model.dart';
+import 'package:gozap_package/models/swap/swap_count_model.dart';
+import 'package:gozap_package/models/swap/swap_history_model.dart';
+
+class SwapModule {
+  late UserModule User;
+  late SwapCountModule RemaingSwap;
+  late SwapCountModule ReferSwap;
+  late SwapCountModule RechargeSwap;
+  late SwapCountModule FreeSwap;
+  late SwapHistoryMetaModule SwapHistoryMeta;
+  SwapModule(
+      {required this.User,
+      required this.RemaingSwap,
+      required this.ReferSwap,
+      required this.RechargeSwap,
+      required this.FreeSwap,
+      required this.SwapHistoryMeta});
+}

+ 126 - 0
lib/models/user/user_model.dart

@@ -0,0 +1,126 @@
+// ignore_for_file: non_constant_identifier_names, camel_case_types, use_build_context_synchronously
+
+import 'dart:convert';
+import 'package:toast/toast.dart';
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:flutter/foundation.dart';
+import 'package:gozap_package/models/DB/table.dart';
+import 'package:gozap_package/components/DB/db.dart';
+import 'package:gozap_package/components/common.dart';
+import 'package:gozap_package/views/log_in/log_in_view.dart';
+import 'package:gozap_package/components/themes/themes.dart';
+import 'package:animated_splash_screen/animated_splash_screen.dart';
+
+class UserModule {
+  late int UserID;
+  late String UserName;
+  late String PhoneNumber;
+  late bool IsAdmin;
+  late String UserReferID;
+  late DateTime UserCreatedAt;
+  late DateTime UserUpdatedAt;
+  UserModule(
+      {required this.UserID,
+      required this.UserName,
+      required this.PhoneNumber,
+      required this.UserReferID,
+      required this.IsAdmin,
+      required this.UserCreatedAt,
+      required this.UserUpdatedAt});
+
+  static Map<String, dynamic> toMap(UserModule user) {
+    var map = <String, dynamic>{};
+    map['UserID'] = user.UserID;
+    map['UserName'] = user.UserName;
+    map['PhoneNumber'] = user.PhoneNumber;
+    map['UserReferID'] = user.UserReferID;
+    map['IsAdmin'] = user.IsAdmin?1:0;
+    map['UserCreatedAt'] = user.UserCreatedAt.toString();
+    map['UserUpdatedAt'] = user.UserUpdatedAt.toString();
+    return map;
+  }
+
+  factory UserModule.fromJson(dynamic json) {
+    return UserModule(
+      UserID: json['UserID'],
+      UserName: json['UserName'],
+      PhoneNumber: json['PhoneNumber'],
+      UserReferID:json['UserReferID']??"",
+      IsAdmin: json['IsAdmin']==1?true:false,
+      UserCreatedAt: DateTime.parse(json['UserCreatedAt']),
+      UserUpdatedAt: DateTime.parse(json['UserUpdatedAt']),
+    );
+  }
+  static String encode(UserModule save) => json.encode(UserModule.toMap(save));
+
+  static UserModule? decode(String saves) {
+    if (saves.isNotEmpty && saves != '') {
+      return UserModule.fromJson(json.decode(saves));
+    }
+    return null;
+  }
+}
+
+class userChangeNotifier extends ChangeNotifier {
+  UserModule? _user;
+
+  UserModule? get user => _user;
+  Future<void> set(BuildContext context, UserModule user, bool isSignup,
+      Widget nextScreen) async {
+    try {
+      bool isSaved = await Provider.of<LocalDB>(context, listen: false)
+          .writeData(DBTable.User, UserModule.encode(user));
+      if (isSaved) {
+        _user = user;
+        Navigator.pushReplacement(
+            context,
+            MaterialPageRoute(
+                builder: (context) => AnimatedSplashScreen(
+                      duration: 3500,
+                      splashIconSize: 300.0,
+                      // splash: "images/logos/gofuel_logo.jpeg",
+                      splash: isSignup
+                          ? Container(
+                              child: Common.lottieSignedupWidget(context),
+                            )
+                          : Container(
+                              child: Common.lottieLoggedInWidget(context),
+                            ),
+                      nextScreen: nextScreen,
+                      backgroundColor: AppTheme.whiteColor,
+                      splashTransition: SplashTransition.fadeTransition,
+                    )));
+      } else {
+        _user = null;
+        Toast.show("Somthing went wrong",
+            duration: Toast.lengthLong, gravity: Toast.bottom);
+      }
+    } catch (e) {
+      if (kDebugMode) {
+        print(e);
+      }
+    }
+
+    notifyListeners();
+  }
+
+  Future<void> get(BuildContext context) async {
+    _user = UserModule.decode(await Provider.of<LocalDB>(context, listen: false)
+        .readData(DBTable.User));
+    notifyListeners();
+  }
+
+  Future<void> remove(BuildContext context, Widget nextScreen) async {
+    bool isRemoved = await Provider.of<LocalDB>(context, listen: false)
+        .removeData(DBTable.User);
+    if (isRemoved) {
+      _user = null;
+      Navigator.pushReplacement(
+          context,
+          MaterialPageRoute(
+              builder: (context) => LogInView(nextScreen: nextScreen)));
+    }
+    notifyListeners();
+  }
+}

+ 284 - 0
lib/views/log_in/log_in_view.dart

@@ -0,0 +1,284 @@
+// ignore_for_file: unused_local_variable, must_be_immutable
+
+// import packages
+import 'package:toast/toast.dart';
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:gozap_package/components/common.dart';
+import 'package:gozap_package/components/responsive.dart';
+import 'package:gozap_package/components/themes/themes.dart';
+import 'package:gozap_package/views/signup/signup_view.dart';
+import 'package:flutter_form_builder/flutter_form_builder.dart';
+import 'package:form_field_validator/form_field_validator.dart';
+// import models
+import 'package:gozap_package/models/log_in/log_in_model.dart';
+// import controllers
+import 'package:gozap_package/controllers/log_in/log_in_controller.dart';
+// import translation
+import 'package:gozap_package/components/localization/app_translations.dart';
+
+class LogInView extends StatefulWidget {
+  LogInView({
+    super.key,
+    required this.nextScreen,
+  });
+  Widget nextScreen;
+  @override
+  State<LogInView> createState() => _LogInViewState();
+}
+
+class _LogInViewState extends State<LogInView> {
+  final _globalLogin = GlobalKey<FormBuilderState>();
+
+  bool _obscureTextLogin = true;
+
+  @override
+  Widget build(BuildContext context) {
+    LogInController viewController = LogInController();
+    return ChangeNotifierProvider<LogInModel>(
+      create: (context) => LogInModel.instance(context,widget.nextScreen),
+      child: Consumer<LogInModel>(
+        builder: (context, viewModel, child) {
+          if (viewModel.status == LogInModelStatus.Loading) {
+            return const Center(
+              child: CircularProgressIndicator(),
+            );
+          } else {
+            var loginFormWidget = Container(
+              constraints: const BoxConstraints(maxWidth: 400),
+              padding: const EdgeInsets.all(20),
+              child: Column(
+                children: [
+                  //login form
+                  FormBuilder(
+                    key: _globalLogin,
+                    onChanged: () {
+                      _globalLogin.currentState!.save();
+                    },
+                    child: Column(
+                      children: <Widget>[
+                        //rider ID / Phone Number
+                        FormBuilderTextField(
+                          name: "phonenumber",
+                          inputFormatters: const [],
+                          validator: MultiValidator([
+                            RequiredValidator(
+                                errorText: AppTranslations.of(context)!
+                                    .text("key_field_requird")),
+                          ]),
+                          keyboardType: TextInputType.number,
+                          textInputAction: TextInputAction.done,
+                          decoration: InputDecoration(
+                            border: OutlineInputBorder(
+                              borderRadius: BorderRadius.circular(20.0),
+                            ),
+                            errorBorder: OutlineInputBorder(
+                              borderRadius: BorderRadius.circular(20.0),
+                              borderSide: const BorderSide(
+                                  color: Colors.red, width: 0.0),
+                            ),
+                            fillColor: Colors.white,
+                            filled: true,
+                            prefixIcon: const Icon(
+                              CupertinoIcons.person,
+                              color: Colors.black,
+                              size: 15.0,
+                            ),
+                            hintText: AppTranslations.of(context)!
+                                .text("key_login_field_RiderID_or_PhoneNumber"),
+                          ),
+                        ),
+                        const SizedBox(
+                          height: 20,
+                        ),
+                        //Password
+                        FormBuilderTextField(
+                          name: "password",
+                          validator: MultiValidator([
+                            RequiredValidator(
+                                errorText: AppTranslations.of(context)!
+                                    .text("key_field_requird")),
+                          ]),
+                          keyboardType: TextInputType.text,
+                          textInputAction: TextInputAction.done,
+                          obscureText: _obscureTextLogin,
+                          decoration: InputDecoration(
+                            border: OutlineInputBorder(
+                              borderRadius: BorderRadius.circular(20.0),
+                            ),
+                            errorBorder: OutlineInputBorder(
+                              borderRadius: BorderRadius.circular(20.0),
+                              borderSide: const BorderSide(
+                                  color: Colors.red, width: 0.0),
+                            ),
+                            fillColor: Colors.white,
+                            filled: true,
+                            prefixIcon: const Icon(
+                              CupertinoIcons.lock_fill,
+                              color: Colors.black,
+                              size: 15.0,
+                            ),
+                            suffixIcon: GestureDetector(
+                              onTap: () {
+                                setState(() {
+                                  _obscureTextLogin = !_obscureTextLogin;
+                                });
+                              },
+                              child: Icon(
+                                _obscureTextLogin
+                                    ? CupertinoIcons.eye
+                                    : CupertinoIcons.eye_slash_fill,
+                                color: Colors.black,
+                                size: 22.0,
+                              ),
+                            ),
+                            hintText: AppTranslations.of(context)!
+                                .text("key_login_field_Password"),
+                          ),
+                        ),
+                        const SizedBox(
+                          height: 20,
+                        ),
+                        //Login Button
+                        SizedBox(
+                          width: double.infinity,
+                          child: ElevatedButton(
+                              style: ButtonStyle(
+                                shape: MaterialStateProperty.all(
+                                  RoundedRectangleBorder(
+                                    borderRadius: BorderRadius.circular(10),
+                                  ),
+                                ),
+                              ),
+                              onPressed: () {
+                                if (_globalLogin.currentState
+                                            ?.value["phonenumber"] !=
+                                        null &&
+                                    _globalLogin
+                                            .currentState?.value["password"] !=
+                                        null) {
+                                  viewModel.setter(context,
+                                      data: _globalLogin.currentState?.value,
+                                      nextScreen: widget.nextScreen);
+                                } else {
+                                  Toast.show(
+                                      AppTranslations.of(context)!
+                                          .text("key_field_requird"),
+                                      duration: Toast.lengthLong,
+                                      gravity: Toast.bottom);
+                                }
+                              },
+                              child: Padding(
+                                padding: const EdgeInsets.all(10),
+                                child: Text(
+                                  AppTranslations.of(context)!
+                                      .text("key_btn_login"),
+                                  style: const TextStyle(fontSize: 16),
+                                ),
+                              )),
+                        ),
+                      ],
+                    ),
+                  ),
+
+                  const SizedBox(
+                    height: 20,
+                  ),
+                  //Forgor Password & Sign Up
+                  Row(
+                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                    children: [
+                      //Forgor Password
+                      TextButton(
+                        onPressed: () {},
+                        child: Text(
+                          AppTranslations.of(context)!
+                              .text("key_btn_forgot_password"),
+                          style: const TextStyle(
+                            decoration: TextDecoration.underline,
+                          ),
+                        ),
+                      ),
+                      //Sign Up
+                      TextButton(
+                        onPressed: () {
+                          Navigator.pushReplacement(
+                              context,
+                              MaterialPageRoute(
+                                  builder: (context) => SignupView(
+                                      nextScreen: widget.nextScreen)));
+                        },
+                        child: Text(
+                          AppTranslations.of(context)!.text("key_btn_sign_up"),
+                          style: const TextStyle(
+                            decoration: TextDecoration.underline,
+                          ),
+                        ),
+                      ),
+                    ],
+                  ),
+                ],
+              ),
+            );
+            return Scaffold(
+              body: SafeArea(
+                child: SizedBox(
+                  width: double.infinity,
+                  child: SingleChildScrollView(
+                    scrollDirection: Axis.vertical,
+                    child: ResponsiveWidget(
+                      mobileBody: Column(
+                        children: [
+                          //GoZAP Small Banner
+                          Common.brandSmallBannerWidget(context),
+                          //GoZAP Logo
+                          Common.brandSmallColorLogoWidget(context),
+                          //GoZAP Welcome Text
+                          Common.welcomeTextWidget(context),
+                          //GoZAP login Form
+                          loginFormWidget,
+                        ],
+                      ),
+                      desktopBody: Row(
+                        mainAxisAlignment: MainAxisAlignment.center,
+                        children: [
+                          Container(
+                            width: MediaQuery.of(context).size.width * .65,
+                            height: MediaQuery.of(context).size.height,
+                            color: AppTheme.secondaryColor,
+                            child: Column(
+                              mainAxisAlignment: MainAxisAlignment.center,
+                              children: [
+                                //GoZAP Large Banner
+                                Common.brandLargeBannerWidget(context),
+                              ],
+                            ),
+                          ),
+                          Expanded(
+                            child: Column(
+                              children: [
+                                //GoZAP Small Color Logo
+                                Common.brandSmallColorLogoWidget(context),
+                                //GoZAP Welcome Text
+                                Common.welcomeTextWidget(context),
+                                //GoZAP Welcome login Phara
+                                Common.loginPharaWidget(context),
+                                //GoZAP login Form
+                                loginFormWidget,
+                              ],
+                            ),
+                          )
+                        ],
+                      ),
+                    ),
+                  ),
+                ),
+              ),
+            );
+          }
+        },
+      ),
+    );
+  }
+}

+ 38 - 0
lib/views/reports/asset_report.dart

@@ -0,0 +1,38 @@
+// ignore_for_file: must_be_immutable
+
+import 'package:flutter/material.dart';
+import 'package:easy_table/easy_table.dart';
+import 'package:gozap_package/models/asset/asset_model.dart';
+
+class AssetReportWidget extends StatefulWidget {
+  AssetReportWidget({super.key, required this.assetModuleList});
+  List<AssetModule> assetModuleList;
+  @override
+  State<AssetReportWidget> createState() => _AssetReportWidgetState();
+}
+
+class _AssetReportWidgetState extends State<AssetReportWidget> {
+  @override
+  Widget build(BuildContext context) {
+    return EasyTable<AssetModule>(
+        EasyTableModel<AssetModule>(
+            rows: widget.assetModuleList,
+            columns: [
+              EasyTableColumn(
+                  name: 'Asset ID',
+                  stringValue: (row) => row.AssetID.toString()),
+              EasyTableColumn(
+                name: 'Category',
+                stringValue: (row) => row.AssetCategory.AssetCategoryTitle,
+              ),
+              EasyTableColumn(
+                name: 'in Service Center',
+                iconValue: (row) => row.IsInServiceCenter? CellIcon(icon: Icons.done):CellIcon(icon: Icons.close)),
+              EasyTableColumn(
+                  name: 'Date & Time',
+                  stringValue: (row) => row.AssetormattedCreatedAt),
+            ]),
+        columnsFit: true,
+        visibleRowsCount: 0);
+  }
+}

+ 0 - 0
lib/views/reports/recharge_report.dart


Неке датотеке нису приказане због велике количине промена