dienianindya hace 1 año
padre
commit
d94c6c0f49
Se han modificado 60 ficheros con 916 adiciones y 510 borrados
  1. 6
    5
      android/app/build.gradle
  2. 29
    0
      android/app/google-services.json
  3. 1
    1
      android/app/src/debug/AndroidManifest.xml
  4. 3
    6
      android/app/src/main/AndroidManifest.xml
  5. 2
    2
      android/app/src/main/java/com/icp/canvassing/MainActivity.java
  6. BIN
      android/app/src/main/res/appstore.png
  7. BIN
      android/app/src/main/res/ic_launcher-web.png
  8. BIN
      android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  9. BIN
      android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  10. BIN
      android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  11. BIN
      android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  12. BIN
      android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  13. BIN
      android/app/src/main/res/playstore-icon.png
  14. BIN
      android/app/src/main/res/playstore.png
  15. 1
    1
      android/app/src/profile/AndroidManifest.xml
  16. 5
    0
      android/gradle.properties
  17. BIN
      assets/icons/menu/ic_about_10.png
  18. BIN
      assets/icons/menu/ic_about_4.png
  19. BIN
      assets/icons/menu/ic_about_5.png
  20. BIN
      assets/icons/menu/ic_about_6.png
  21. BIN
      assets/icons/menu/ic_about_7.png
  22. BIN
      assets/icons/menu/ic_about_8.png
  23. BIN
      assets/icons/menu/ic_about_9.png
  24. BIN
      assets/icons/menu/ic_absensi_2.png
  25. BIN
      assets/icons/menu/ic_absensi_3.png
  26. BIN
      assets/icons/menu/ic_cuti_3.png
  27. BIN
      assets/icons/menu/ic_cuti_4.png
  28. BIN
      assets/icons/menu/ic_eventcalendar.png
  29. BIN
      assets/icons/menu/ic_eventcalendar_2.png
  30. BIN
      assets/icons/menu/ic_idp_1.png
  31. BIN
      assets/icons/menu/ic_idp_2.png
  32. BIN
      assets/icons/menu/ic_idp_3.png
  33. BIN
      assets/icons/menu/ic_idp_4.png
  34. BIN
      assets/icons/menu/ic_ipp.png
  35. BIN
      assets/icons/menu/ic_ipp_2.png
  36. BIN
      assets/icons/menu/ic_reimburse_2.png
  37. BIN
      assets/icons/menu/ic_reimburse_3.png
  38. BIN
      assets/icons/menu/ic_reimburse_4.png
  39. BIN
      assets/icons/menu/ic_slipgaji_3.png
  40. BIN
      assets/icons/menu/ic_slipgaji_4.png
  41. BIN
      assets/icons/menu/ic_surattugas_3.png
  42. 3
    3
      ios/Runner.xcodeproj/project.pbxproj
  43. 2
    2
      ios/Runner/Info.plist
  44. 3
    3
      ios/firebase_app_id_file.json
  45. 51
    207
      lib/Screens/Home/home_screen.dart
  46. 16
    77
      lib/Screens/Login/login_screen.dart
  47. 178
    0
      lib/Screens/Splash/background.dart
  48. 40
    0
      lib/Screens/Splash/loginstatus_post.dart
  49. 338
    0
      lib/Screens/Splash/splash_screen.dart
  50. 2
    1
      lib/constants.dart
  51. 81
    0
      lib/firebase_options.dart
  52. 4
    140
      lib/main.dart
  53. 3
    3
      macos/Runner.xcodeproj/project.pbxproj
  54. 4
    4
      macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  55. 2
    2
      macos/Runner/Configs/AppInfo.xcconfig
  56. 34
    0
      macos/Runner/GoogleService-Info.plist
  57. 7
    0
      macos/firebase_app_id_file.json
  58. 76
    52
      pubspec.lock
  59. 2
    1
      pubspec.yaml
  60. 23
    0
      upload_certificate.pem

+ 6
- 5
android/app/build.gradle Ver fichero

@@ -1,14 +1,15 @@
1 1
 def localProperties = new Properties()
2 2
 def localPropertiesFile = rootProject.file('local.properties')
3 3
 if (localPropertiesFile.exists()) {
4
-    localPropertiesFile.withReader('UTF-8') { reader ->
5
-        localProperties.load(reader)
4
+    localPropertiesFile.withReader('UTF-8') {
5
+        reader -> localProperties.load(reader)
6 6
     }
7 7
 }
8 8
 
9 9
 def flutterRoot = localProperties.getProperty('flutter.sdk')
10 10
 if (flutterRoot == null) {
11
-    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
11
+    //throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12
+    throw FileNotFoundException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 13
 }
13 14
 
14 15
 def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
@@ -39,7 +40,7 @@ android {
39 40
 
40 41
     defaultConfig {
41 42
         // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
42
-        applicationId "com.urp.hris"
43
+        applicationId "com.icp.canvassing"
43 44
         // You can update the following values to match your application needs.
44 45
         // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
45 46
         //minSdkVersion flutter.minSdkVersion
@@ -53,7 +54,7 @@ android {
53 54
 
54 55
     signingConfigs {
55 56
         release {
56
-            storeFile file('D:/Android Studio Projects/ess/ess_keystore.jks')
57
+            //storeFile file('D:/Android Studio Projects/ess/ess_keystore.jks')
57 58
             storePassword '123123'
58 59
             keyAlias 'ess_keystore'
59 60
             keyPassword '123123'

+ 29
- 0
android/app/google-services.json Ver fichero

@@ -0,0 +1,29 @@
1
+{
2
+  "project_info": {
3
+    "project_number": "11716618948",
4
+    "project_id": "canvas-56baa",
5
+    "storage_bucket": "canvas-56baa.appspot.com"
6
+  },
7
+  "client": [
8
+    {
9
+      "client_info": {
10
+        "mobilesdk_app_id": "1:11716618948:android:e8a6512d2d905094937791",
11
+        "android_client_info": {
12
+          "package_name": "com.icp.canvassing"
13
+        }
14
+      },
15
+      "oauth_client": [],
16
+      "api_key": [
17
+        {
18
+          "current_key": "AIzaSyAsylxl5a2treqN-GI1lqcx6Ode6-hl8hk"
19
+        }
20
+      ],
21
+      "services": {
22
+        "appinvite_service": {
23
+          "other_platform_oauth_client": []
24
+        }
25
+      }
26
+    }
27
+  ],
28
+  "configuration_version": "1"
29
+}

+ 1
- 1
android/app/src/debug/AndroidManifest.xml Ver fichero

@@ -1,5 +1,5 @@
1 1
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
-    package="com.example.hris_selfservice_mobile">
2
+    package="com.icp.canvassing">
3 3
     <!-- The INTERNET permission is required for development. Specifically,
4 4
          the Flutter tool needs it to communicate with the running application
5 5
          to allow setting breakpoints, to provide hot reload, etc.

+ 3
- 6
android/app/src/main/AndroidManifest.xml Ver fichero

@@ -1,16 +1,15 @@
1 1
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2 2
     xmlns:tools="http://schemas.android.com/tools"
3
-    package="com.example.hris_selfservice_mobile">
3
+    package="com.icp.canvassing">
4 4
 
5 5
     <uses-permission android:name="android.permission.INTERNET" />
6 6
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
7 7
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
8
-   <!-- <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />-->
9 8
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
10 9
 
11 10
     <application
12 11
         android:icon="@mipmap/ic_launcher"
13
-        android:label="Employee Self Service"
12
+        android:label="Canvasing App"
14 13
         android:usesCleartextTraffic="true"
15 14
         tools:targetApi="m">
16 15
 
@@ -55,6 +54,4 @@
55 54
             android:name="com.google.firebase.messaging.default_notification_channel_id"
56 55
             android:value="high_importance_channel" />
57 56
     </application>
58
-</manifest>
59
-
60
-
57
+</manifest>

android/app/src/main/java/com/example/hris_selfservice_mobile/MainActivity.java → android/app/src/main/java/com/icp/canvassing/MainActivity.java Ver fichero

@@ -1,6 +1,6 @@
1
-package com.example.hris_selfservice_mobile;
1
+package com.icp.canvassing;
2 2
 
3 3
 import io.flutter.embedding.android.FlutterActivity;
4 4
 
5 5
 public class MainActivity extends FlutterActivity {
6
-}
6
+}

BIN
android/app/src/main/res/appstore.png Ver fichero


BIN
android/app/src/main/res/ic_launcher-web.png Ver fichero


BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher.png Ver fichero


BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher.png Ver fichero


BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher.png Ver fichero


BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png Ver fichero


BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png Ver fichero


BIN
android/app/src/main/res/playstore-icon.png Ver fichero


BIN
android/app/src/main/res/playstore.png Ver fichero


+ 1
- 1
android/app/src/profile/AndroidManifest.xml Ver fichero

@@ -1,5 +1,5 @@
1 1
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
-    package="com.example.hris_selfservice_mobile">
2
+    package="com.urp.hris">
3 3
     <!-- The INTERNET permission is required for development. Specifically,
4 4
          the Flutter tool needs it to communicate with the running application
5 5
          to allow setting breakpoints, to provide hot reload, etc.

+ 5
- 0
android/gradle.properties Ver fichero

@@ -2,3 +2,8 @@ org.gradle.jvmargs=-Xmx1536M
2 2
 
3 3
 android.useAndroidX=true
4 4
 android.enableJetifier=true
5
+
6
+#MYAPP_RELEASE_STORE_FILE=D:\\Android Studio Projects\\ess\\ess_keystore.jks
7
+#MYAPP_RELEASE_KEY_ALIAS=ess_keystore
8
+#MYAPP_RELEASE_STORE_PASSWORD=123123
9
+#MYAPP_RELEASE_KEY_PASSWORD=123123

BIN
assets/icons/menu/ic_about_10.png Ver fichero


BIN
assets/icons/menu/ic_about_4.png Ver fichero


BIN
assets/icons/menu/ic_about_5.png Ver fichero


BIN
assets/icons/menu/ic_about_6.png Ver fichero


BIN
assets/icons/menu/ic_about_7.png Ver fichero


BIN
assets/icons/menu/ic_about_8.png Ver fichero


BIN
assets/icons/menu/ic_about_9.png Ver fichero


BIN
assets/icons/menu/ic_absensi_2.png Ver fichero


BIN
assets/icons/menu/ic_absensi_3.png Ver fichero


BIN
assets/icons/menu/ic_cuti_3.png Ver fichero


BIN
assets/icons/menu/ic_cuti_4.png Ver fichero


BIN
assets/icons/menu/ic_eventcalendar.png Ver fichero


BIN
assets/icons/menu/ic_eventcalendar_2.png Ver fichero


BIN
assets/icons/menu/ic_idp_1.png Ver fichero


BIN
assets/icons/menu/ic_idp_2.png Ver fichero


BIN
assets/icons/menu/ic_idp_3.png Ver fichero


BIN
assets/icons/menu/ic_idp_4.png Ver fichero


BIN
assets/icons/menu/ic_ipp.png Ver fichero


BIN
assets/icons/menu/ic_ipp_2.png Ver fichero


BIN
assets/icons/menu/ic_reimburse_2.png Ver fichero


BIN
assets/icons/menu/ic_reimburse_3.png Ver fichero


BIN
assets/icons/menu/ic_reimburse_4.png Ver fichero


BIN
assets/icons/menu/ic_slipgaji_3.png Ver fichero


BIN
assets/icons/menu/ic_slipgaji_4.png Ver fichero


BIN
assets/icons/menu/ic_surattugas_3.png Ver fichero


+ 3
- 3
ios/Runner.xcodeproj/project.pbxproj Ver fichero

@@ -294,7 +294,7 @@
294 294
 					"$(inherited)",
295 295
 					"@executable_path/Frameworks",
296 296
 				);
297
-				PRODUCT_BUNDLE_IDENTIFIER = com.example.hrisSelfserviceMobile;
297
+				PRODUCT_BUNDLE_IDENTIFIER = com.urp.hris;
298 298
 				PRODUCT_NAME = "$(TARGET_NAME)";
299 299
 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
300 300
 				SWIFT_VERSION = 5.0;
@@ -422,7 +422,7 @@
422 422
 					"$(inherited)",
423 423
 					"@executable_path/Frameworks",
424 424
 				);
425
-				PRODUCT_BUNDLE_IDENTIFIER = com.example.hrisSelfserviceMobile;
425
+				PRODUCT_BUNDLE_IDENTIFIER = com.urp.hris;
426 426
 				PRODUCT_NAME = "$(TARGET_NAME)";
427 427
 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
428 428
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -444,7 +444,7 @@
444 444
 					"$(inherited)",
445 445
 					"@executable_path/Frameworks",
446 446
 				);
447
-				PRODUCT_BUNDLE_IDENTIFIER = com.example.hrisSelfserviceMobile;
447
+				PRODUCT_BUNDLE_IDENTIFIER = com.urp.hris;
448 448
 				PRODUCT_NAME = "$(TARGET_NAME)";
449 449
 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
450 450
 				SWIFT_VERSION = 5.0;

+ 2
- 2
ios/Runner/Info.plist Ver fichero

@@ -5,7 +5,7 @@
5 5
 	<key>CFBundleDevelopmentRegion</key>
6 6
 	<string>$(DEVELOPMENT_LANGUAGE)</string>
7 7
 	<key>CFBundleDisplayName</key>
8
-	<string>hris_selfservice_mobile</string>
8
+	<string>employee self service</string>
9 9
 	<key>CFBundleExecutable</key>
10 10
 	<string>$(EXECUTABLE_NAME)</string>
11 11
 	<key>CFBundleIdentifier</key>
@@ -13,7 +13,7 @@
13 13
 	<key>CFBundleInfoDictionaryVersion</key>
14 14
 	<string>6.0</string>
15 15
 	<key>CFBundleName</key>
16
-	<string>HRIS Self Service</string>
16
+	<string>Employee Self Service</string>
17 17
 	<key>CFBundlePackageType</key>
18 18
 	<string>APPL</string>
19 19
 	<key>CFBundleShortVersionString</key>

+ 3
- 3
ios/firebase_app_id_file.json Ver fichero

@@ -1,7 +1,7 @@
1 1
 {
2 2
   "file_generated_by": "FlutterFire CLI",
3 3
   "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory",
4
-  "GOOGLE_APP_ID": "1:372840384875:ios:729b20a1d7ac16b0fd642e",
5
-  "FIREBASE_PROJECT_ID": "gsi---employee-self-service",
6
-  "GCM_SENDER_ID": "372840384875"
4
+  "GOOGLE_APP_ID": "1:11716618948:ios:2cfdbccbd58e6267937791",
5
+  "FIREBASE_PROJECT_ID": "canvas-56baa",
6
+  "GCM_SENDER_ID": "11716618948"
7 7
 }

+ 51
- 207
lib/Screens/Home/home_screen.dart Ver fichero

@@ -4,7 +4,6 @@ import 'dart:typed_data';
4 4
 
5 5
 import 'package:connectivity_plus/connectivity_plus.dart';
6 6
 import 'package:double_back_to_close/double_back_to_close.dart';
7
-import 'package:employee_selfservice_mobile/Screens/NotificationCenter/NotificationCenter.dart';
8 7
 import 'package:flutter/cupertino.dart';
9 8
 import 'package:flutter/material.dart';
10 9
 import 'package:fluttertoast/fluttertoast.dart';
@@ -14,8 +13,6 @@ import 'package:employee_selfservice_mobile/Screens/Menu/About/about_screen.dart
14 13
 import 'package:employee_selfservice_mobile/Screens/Menu/Absensi/absensi_screen.dart';
15 14
 import 'package:employee_selfservice_mobile/Screens/Menu/AjukanCuti/ajukancuti_screen.dart';
16 15
 import 'package:employee_selfservice_mobile/Screens/Menu/Reimburse/reimburse_screen.dart';
17
-import 'package:employee_selfservice_mobile/Screens/Menu/SlipGaji/slipgaji_screen.dart';
18
-import 'package:employee_selfservice_mobile/Screens/Menu/SuratTugas/surattugas_screen.dart';
19 16
 import 'package:employee_selfservice_mobile/Screens/Settings/settings_screen.dart';
20 17
 import 'package:lottie/lottie.dart';
21 18
 import 'package:progress_dialog_null_safe/progress_dialog_null_safe.dart';
@@ -51,10 +48,11 @@ class _HomeView extends State<HomeView> {
51 48
   @override
52 49
   initState() {
53 50
     getConnectivity();
54
-    getDetail();
55
-    _imageToShow = AssetImage('assets/images/ic_administrator.png');
51
+    /*getDetail();*/
52
+    _imageToShow = AssetImage('assets/images/ic_pp_2.png');
56 53
     WidgetsBinding.instance.addPostFrameCallback((_) {
57
-      getProfileImage();
54
+      //getProfileImage();
55
+      _imageToShow = AssetImage('assets/icons/ic_pp_2.png');
58 56
     });
59 57
     super.initState();
60 58
   }
@@ -77,7 +75,7 @@ class _HomeView extends State<HomeView> {
77 75
   }
78 76
 
79 77
   //Get Profile image
80
-  getProfileImage() async {
78
+  /*getProfileImage() async {
81 79
     final SharedPreferences prefs = await SharedPreferences.getInstance();
82 80
     final session = prefs.getString('session');
83 81
 
@@ -144,7 +142,7 @@ class _HomeView extends State<HomeView> {
144 142
       await loading.hide();
145 143
     });
146 144
     return _imageToShow;
147
-  }
145
+  }*/
148 146
 
149 147
   //GetDetail
150 148
   getDetail() async {
@@ -275,7 +273,6 @@ class BottomNavBar extends StatefulWidget {
275 273
 class _BottomNavBarState extends State<BottomNavBar> {
276 274
   List<Widget> _widgetOptions = <Widget>[
277 275
     HomeScreen(),
278
-    NotificationCenter_Screen(),
279 276
     SettingsScreen(),
280 277
   ];
281 278
 
@@ -320,7 +317,7 @@ class HomeScreen extends StatefulWidget {
320 317
 
321 318
 class _HomeScreenState extends State<HomeScreen> {
322 319
   //Get Profile image
323
-  getProfileImage() async {
320
+  /*getProfileImage() async {
324 321
     final SharedPreferences prefs = await SharedPreferences.getInstance();
325 322
     final session = prefs.getString('session');
326 323
 
@@ -363,7 +360,7 @@ class _HomeScreenState extends State<HomeScreen> {
363 360
       }
364 361
     });
365 362
     return _imageToShow;
366
-  }
363
+  }*/
367 364
 
368 365
   @override
369 366
   Widget build(BuildContext context) {
@@ -382,7 +379,7 @@ class _HomeScreenState extends State<HomeScreen> {
382 379
         getProfileImage();
383 380
       },*/
384 381
       onFocusGained: () {
385
-        getProfileImage();
382
+        _imageToShow = AssetImage('assets/icons/ic_pp_2.png');
386 383
       },
387 384
 /*      onForegroundLost: (){
388 385
         getProfileImage();
@@ -411,30 +408,13 @@ class _HomeScreenState extends State<HomeScreen> {
411 408
                     padding: EdgeInsets.all(20),
412 409
                     child: Column(
413 410
                       children: <Widget>[
414
-                        /* Align(
415
-                          alignment: Alignment.topRight,
416
-                          child: InkWell(
417
-                            child: Container(
418
-                                alignment: Alignment.center,
419
-                                height: 40,
420
-                                width: 40,
421
-                                child: Image.asset('assets/images/ic_settings.png')),
422
-                            onTap: () {
423
-                              Navigator.push(
424
-                                  context,
425
-                                  MaterialPageRoute(
426
-                                      builder: (context) => SettingsScreen()));
427
-                            },
428
-                          ),
429
-                        ),*/
430 411
                         Container(
431 412
                           child: Stack(
432 413
                             alignment: Alignment.topLeft,
433 414
                             children: [
434 415
                               Container(
435 416
                                 margin: EdgeInsets.only(
436
-                                    top: (((size.width - 20) * 0.33) * 0.5) +
437
-                                        40),
417
+                                    top: (((size.width - 20) * 0.33) * 0.5) + 40),
438 418
                                 child: Card(
439 419
                                   elevation: 15,
440 420
                                   child: Container(
@@ -446,13 +426,10 @@ class _HomeScreenState extends State<HomeScreen> {
446 426
                                           borderRadius:
447 427
                                           BorderRadius.all(
448 428
                                               Radius.circular(10))),
449
-                                      child: Column(
450
-                                        mainAxisAlignment: MainAxisAlignment
451
-                                            .end,
452
-                                        crossAxisAlignment: CrossAxisAlignment
453
-                                            .center,
429
+                                      child: Column(mainAxisAlignment: MainAxisAlignment.end,
430
+                                        crossAxisAlignment: CrossAxisAlignment.center,
454 431
                                         children: <Widget>[
455
-                                          Text(name,
432
+                                          Text("Ginro",
456 433
                                             maxLines: 2,
457 434
                                             overflow: TextOverflow.ellipsis,
458 435
                                             textAlign: TextAlign.center,
@@ -461,7 +438,7 @@ class _HomeScreenState extends State<HomeScreen> {
461 438
                                                 color: Colors.black,
462 439
                                                 fontWeight: FontWeight.bold),
463 440
                                           ),
464
-                                          Text(position,
441
+                                          Text("General Manager",
465 442
                                             textAlign: TextAlign.center,
466 443
                                             style: GoogleFonts.inter(
467 444
                                                 fontSize: size.width * 0.035,
@@ -515,16 +492,19 @@ class _HomeScreenState extends State<HomeScreen> {
515 492
                                           Container(
516 493
                                             width: size.width * 0.18,
517 494
                                             child: Image.asset(
518
-                                                "assets/icons/menu/ic_absensi.png",
495
+                                                "assets/icons/menu/ic_absensi_3.png",
519 496
                                                 fit: BoxFit.contain)
520 497
                                           ),
521
-                                          Text(
522
-                                            'Attendance',
523
-                                            textAlign: TextAlign.center,
524
-                                            style: GoogleFonts.acme(
525
-                                                fontSize: size.width * 0.045,
526
-                                                color: Colors.black),
527
-                                          ),
498
+                                          Container(
499
+                                            margin: EdgeInsets.only(top: 5),
500
+                                            child: Text(
501
+                                              'Canvasing',
502
+                                              textAlign: TextAlign.center,
503
+                                              style: GoogleFonts.acme(
504
+                                                  fontSize: size.width * 0.045,
505
+                                                  color: Colors.black),
506
+                                            ),
507
+                                          )
528 508
                                         ],
529 509
                                       ),
530 510
                                     )
@@ -550,51 +530,19 @@ class _HomeScreenState extends State<HomeScreen> {
550 530
                                     Container(
551 531
                                       width: size.width * 0.18,
552 532
                                       child: Image.asset(
553
-                                        "assets/icons/menu/ic_slipgaji_2.png",
533
+                                        "assets/icons/menu/ic_cuti_4.png",
554 534
                                         fit: BoxFit.contain),
555 535
                                     ),
556
-                                    Text(
557
-                                      'Pay Slip',
558
-                                      textAlign: TextAlign.center,
559
-                                      style: GoogleFonts.acme(
560
-                                          fontSize: size.width * 0.045,
561
-                                          color: Colors.black),
562
-                                    ),
563
-                                  ],
564
-                                ),
565
-                              ),
566
-                              onTap: () {
567
-                                Navigator.push(
568
-                                    context,
569
-                                    MaterialPageRoute(
570
-                                        builder: (context) =>
571
-                                            SlipGajiScreen()));
572
-                              },
573
-                            ),
574
-                            InkWell(
575
-                              child: Container(
576
-                                width: size.width,
577
-                                height: size.height,
578
-                                decoration: BoxDecoration(
579
-                                    color: Color(0xFFD0D0D0),
580
-                                    borderRadius: BorderRadius.circular(5)),
581
-                                child: Column(
582
-                                  crossAxisAlignment: CrossAxisAlignment.center,
583
-                                  mainAxisAlignment: MainAxisAlignment.center,
584
-                                  children: <Widget>[
585 536
                                     Container(
586
-                                      width: size.width * 0.18,
587
-                                      child: Image.asset(
588
-                                        "assets/icons/menu/ic_cuti_2.png",
589
-                                        fit: BoxFit.contain),
590
-                                    ),
591
-                                    Text(
592
-                                      'Leaves',
593
-                                      textAlign: TextAlign.center,
594
-                                      style: GoogleFonts.acme(
595
-                                          fontSize: size.width * 0.045,
596
-                                          color: Colors.black),
597
-                                    ),
537
+                                      margin: EdgeInsets.only(top: 5),
538
+                                      child: Text(
539
+                                        'Leaves',
540
+                                        textAlign: TextAlign.center,
541
+                                        style: GoogleFonts.acme(
542
+                                            fontSize: size.width * 0.045,
543
+                                            color: Colors.black),
544
+                                      ),
545
+                                    )
598 546
                                   ],
599 547
                                 ),
600 548
                               ),
@@ -606,7 +554,7 @@ class _HomeScreenState extends State<HomeScreen> {
606 554
                                             AjukanCutiScreen()));
607 555
                               },
608 556
                             ),
609
-                            /*InkWell(
557
+                            InkWell(
610 558
                               child: Container(
611 559
                                 width: size.width,
612 560
                                 height: size.height,
@@ -620,53 +568,20 @@ class _HomeScreenState extends State<HomeScreen> {
620 568
                                     Container(
621 569
                                       width: size.width * 0.18,
622 570
                                       child: Image.asset(
623
-                                        "assets/icons/menu/ic_surattugas_2.png",
571
+                                        "assets/icons/menu/ic_reimburse_4.png",
624 572
                                         fit: BoxFit.contain,
625 573
                                       ),
626 574
                                     ),
627
-                                    Text(
628
-                                      'Assignment Letter',
629
-                                      textAlign: TextAlign.center,
630
-                                      style: GoogleFonts.acme(
631
-                                          fontSize: size.width * 0.045,
632
-                                          color: Colors.black),
633
-                                    ),
634
-                                  ],
635
-                                ),
636
-                              ),
637
-                              onTap: () {
638
-                                Navigator.push(
639
-                                    context,
640
-                                    MaterialPageRoute(
641
-                                        builder: (context) =>
642
-                                            SuratTugas_Screen()));
643
-                              },
644
-                            ),*/
645
-                            InkWell(
646
-                              child: Container(
647
-                                width: size.width,
648
-                                height: size.height,
649
-                                decoration: BoxDecoration(
650
-                                    color: Color(0xFFD0D0D0),
651
-                                    borderRadius: BorderRadius.circular(5)),
652
-                                child: Column(
653
-                                  crossAxisAlignment: CrossAxisAlignment.center,
654
-                                  mainAxisAlignment: MainAxisAlignment.center,
655
-                                  children: <Widget>[
656 575
                                     Container(
657
-                                      width: size.width * 0.18,
658
-                                      child: Image.asset(
659
-                                        "assets/icons/menu/ic_reimburse.png",
660
-                                        fit: BoxFit.contain,
576
+                                      margin: EdgeInsets.only(top: 5),
577
+                                      child: Text(
578
+                                        'Reimburse',
579
+                                        textAlign: TextAlign.center,
580
+                                        style: GoogleFonts.acme(
581
+                                            fontSize: size.width * 0.045,
582
+                                            color: Colors.black),
661 583
                                       ),
662
-                                    ),
663
-                                    Text(
664
-                                      'Reimburse',
665
-                                      textAlign: TextAlign.center,
666
-                                      style: GoogleFonts.acme(
667
-                                          fontSize: size.width * 0.045,
668
-                                          color: Colors.black),
669
-                                    ),
584
+                                    )
670 585
                                   ],
671 586
                                 ),
672 587
                               ),
@@ -692,91 +607,20 @@ class _HomeScreenState extends State<HomeScreen> {
692 607
                                     Container(
693 608
                                       width: size.width * 0.18,
694 609
                                       child: Image.asset(
695
-                                        "assets/icons/menu/ic_about_3.png",
610
+                                        "assets/icons/menu/ic_about_9.png",
696 611
                                         fit: BoxFit.contain,
697 612
                                       ),
698 613
                                     ),
699
-                                    Text(
700
-                                      'About',
701
-                                      textAlign: TextAlign.center,
702
-                                      style: GoogleFonts.acme(
703
-                                          fontSize: size.width * 0.045,
704
-                                          color: Colors.black),
705
-                                    ),
706
-                                  ],
707
-                                ),
708
-                              ),
709
-                              onTap: () {
710
-                                Navigator.push(
711
-                                    context,
712
-                                    MaterialPageRoute(
713
-                                        builder: (context) => AboutScreen()));
714
-                              },
715
-                            ),
716
-                            /*InkWell(
717
-                              child: Container(
718
-                                decoration: BoxDecoration(
719
-                                    color: Color(0xFFD0D0D0),
720
-                                    borderRadius: BorderRadius.circular(5)),
721
-                                child: Column(
722
-                                  crossAxisAlignment: CrossAxisAlignment.center,
723
-                                  mainAxisAlignment: MainAxisAlignment.center,
724
-                                  children: <Widget>[
725
-                                    Container(
726
-                                      width: 70,
727
-                                      height: 70,
728
-                                      child: Image.asset(
729
-                                          "assets/icons/menu/ic_reimburse.png",
730
-                                          fit: BoxFit.fill,
731
-                                          alignment: Alignment.center),
732
-                                    ),
733
-                                    Container(
734
-                                      margin: EdgeInsets.only(top: 10),
735
-                                      padding: EdgeInsets.all(5),
736
-                                      child: Text(
737
-                                        'Reimburse',
738
-                                        textAlign: TextAlign.center,
739
-                                        style: GoogleFonts.acme(
740
-                                            fontSize: 18, color: Colors.black),
741
-                                      ),
742
-                                    ),
743
-                                  ],
744
-                                ),
745
-                              ),
746
-                              onTap: () {
747
-                                Navigator.push(
748
-                                    context,
749
-                                    MaterialPageRoute(
750
-                                        builder: (context) => ReimburseScreen()));
751
-                              },
752
-                            ),
753
-                            InkWell(
754
-                              child: Container(
755
-                                decoration: BoxDecoration(
756
-                                    color: Color(0xFFD0D0D0),
757
-                                    borderRadius: BorderRadius.circular(5)),
758
-                                child: Column(
759
-                                  crossAxisAlignment: CrossAxisAlignment.center,
760
-                                  mainAxisAlignment: MainAxisAlignment.center,
761
-                                  children: <Widget>[
762
-                                    Container(
763
-                                      width: 70,
764
-                                      height: 70,
765
-                                      child: Image.asset(
766
-                                          "assets/icons/menu/ic_about_3.png",
767
-                                          fit: BoxFit.fill,
768
-                                          alignment: Alignment.center),
769
-                                    ),
770 614
                                     Container(
771
-                                      margin: EdgeInsets.only(top: 10),
772
-                                      padding: EdgeInsets.all(5),
615
+                                      margin: EdgeInsets.only(top: 5),
773 616
                                       child: Text(
774 617
                                         'About',
775 618
                                         textAlign: TextAlign.center,
776 619
                                         style: GoogleFonts.acme(
777
-                                            fontSize: 18, color: Colors.black),
620
+                                            fontSize: size.width * 0.045,
621
+                                            color: Colors.black),
778 622
                                       ),
779
-                                    ),
623
+                                    )
780 624
                                   ],
781 625
                                 ),
782 626
                               ),
@@ -786,7 +630,7 @@ class _HomeScreenState extends State<HomeScreen> {
786 630
                                     MaterialPageRoute(
787 631
                                         builder: (context) => AboutScreen()));
788 632
                               },
789
-                            ),*/
633
+                            ),
790 634
                           ],
791 635
                         )
792 636
                       ],

+ 16
- 77
lib/Screens/Login/login_screen.dart Ver fichero

@@ -3,19 +3,18 @@ import 'dart:convert';
3 3
 import 'package:firebase_messaging/firebase_messaging.dart';
4 4
 import 'package:flutter/material.dart';
5 5
 import 'package:flutter/services.dart';
6
-import 'package:flutter_udid/flutter_udid.dart';
7 6
 import 'package:fluttertoast/fluttertoast.dart';
8 7
 import 'package:google_fonts/google_fonts.dart';
9 8
 import 'package:employee_selfservice_mobile/Screens/ForgotPassword/forgotPassword_screen.dart';
10 9
 import 'package:employee_selfservice_mobile/Screens/Login/background.dart';
11
-import 'package:employee_selfservice_mobile/Screens/Login/login_post.dart';
12
-import 'package:employee_selfservice_mobile/Screens/Splash/splash_screen.dart';
13 10
 import 'package:progress_dialog_null_safe/progress_dialog_null_safe.dart';
14 11
 import 'package:shared_preferences/shared_preferences.dart';
15 12
 import '../Home/home_screen.dart';
16 13
 import 'inputWidget.dart';
17 14
 import 'dart:developer' as logDev;
18
-//import 'package:plain_notification_token/plain_notification_token.dart';
15
+
16
+import 'login_post.dart';
17
+
19 18
 
20 19
 class LoginView extends StatefulWidget {
21 20
   @override
@@ -44,7 +43,7 @@ class LoginScreen extends StatefulWidget {
44 43
 }
45 44
 
46 45
 class _LoginScreenState extends State<LoginScreen> {
47
-  late LoginPostResult loginPostResult;
46
+  //late LoginPostResult loginPostResult;
48 47
   String version = "1.0.0";
49 48
   String notif_token = "";
50 49
 
@@ -77,12 +76,12 @@ class _LoginScreenState extends State<LoginScreen> {
77 76
 
78 77
     return SingleChildScrollView(
79 78
       reverse: true,
80
-        padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
81
-        child: Column(
79
+      padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
80
+      child: Column(
82 81
         children: <Widget>[
83 82
           Padding(
84 83
             padding:
85
-                EdgeInsets.only(top: MediaQuery.of(context).size.height / 2.45),
84
+            EdgeInsets.only(top: MediaQuery.of(context).size.height / 2.45),
86 85
           ),
87 86
           Column(
88 87
             children: <Widget>[
@@ -113,8 +112,7 @@ class _LoginScreenState extends State<LoginScreen> {
113 112
                     alignment: Alignment.bottomRight,
114 113
                     children: <Widget>[
115 114
                       InputWidgetEmail(20.0, 20.0),
116
-                      Padding(
117
-                        padding: EdgeInsets.only(right: 50),
115
+                      Padding(padding: EdgeInsets.only(right: 50),
118 116
                       ),
119 117
                     ],
120 118
                   ),
@@ -140,8 +138,8 @@ class _LoginScreenState extends State<LoginScreen> {
140 138
                           children: <Widget>[
141 139
                             Expanded(
142 140
                                 child: Padding(
143
-                              padding: EdgeInsets.only(top: 0),
144
-                            )),
141
+                                  padding: EdgeInsets.only(top: 0),
142
+                                )),
145 143
                             InkWell(
146 144
                               child: Container(
147 145
                                 padding: EdgeInsets.all(10),
@@ -159,77 +157,19 @@ class _LoginScreenState extends State<LoginScreen> {
159 157
                                 ),
160 158
                               ),
161 159
                               onTap: () async {
162
-                                /*String imei;
163
-                                try {
164
-                                  imei = await FlutterUdid.udid;
165
-                                } on PlatformException {
166
-                                  imei = 'Failed to get UDID.';
167
-                                }
168
-                                logDev.log(imei, name: "IMEI");*/
169 160
                                 if (!validateForm(context)) {
170 161
                                   return;
171 162
                                 } else {
172
-                                  await loading.show();
173
-
174
-                                  final notif_token = await FirebaseMessaging.instance.getToken();
175
-                                  logDev.log(notif_token.toString(), name: "NOTIFICATION TOKEN");
176
-
177
-                                  LoginPostResult.connectToAPI(
178
-                                          emailController.text.toString(),
179
-                                          passwordController.text.toString(),
180
-                                          notif_token!,
181
-                                          version,
182
-                                          platform(),)
183
-                                      .then((valueResult) async {
184
-                                    Map<String, dynamic> object = json.decode(valueResult);
185
-                                    if (object.containsKey("result").toString() == "true") {
186
-                                      String status = object['result']['status'].toString();
187
-                                      if (status == "success") {
188
-                                        Fluttertoast.showToast(
189
-                                            msg: "Login Success",
190
-                                            toastLength: Toast.LENGTH_SHORT,
191
-                                            gravity: ToastGravity.CENTER,
192
-                                            timeInSecForIosWeb: 1,
193
-                                            textColor: Colors.white,
194
-                                            fontSize: 16.0);
195
-
196
-                                        var prefs = await SharedPreferences.getInstance();
197
-                                        await prefs.setString('version', version);
198
-                                        await prefs.setString('device', object['result']['device'].toString());
199
-                                        await prefs.setString('session', object['result']['hash'].toString());
200
-                                        await prefs.setString('name', object['result']['name'].toString());
201
-                                        await prefs.setString('notif_token', notif_token);
202
-
203
-                                        emailController.clear();
204
-                                        passwordController.clear();
205
-
206
-                                        await loading.hide();
207
-                                        Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => HomeView()));
208
-                                      } else if (status == "failed") {
209
-                                        String message = object['result']['message'].toString();
210
-                                        Fluttertoast.showToast(
211
-                                            msg: message,
212
-                                            toastLength: Toast.LENGTH_SHORT,
213
-                                            gravity: ToastGravity.CENTER,
214
-                                            timeInSecForIosWeb: 1,
215
-                                            textColor: Colors.white,
216
-                                            fontSize: 16.0);
217
-                                        await loading.hide();
218
-                                      }
219
-                                    } else {
220
-                                      await loading.hide();
221
-                                      alertDialogFailedResponse(context);
222
-                                    }
223
-                                  });
163
+                                  Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => HomeView()));
224 164
                                 }
225 165
                               },
226 166
                             )
227 167
                           ],
228 168
                         ),
229 169
                       ),
230
-                      /*Padding(
170
+                      Padding(
231 171
                           padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom)
232
-                      )*/
172
+                      )
233 173
                     ],
234 174
                   ),
235 175
                 ],
@@ -239,7 +179,7 @@ class _LoginScreenState extends State<LoginScreen> {
239 179
               ),
240 180
               InkWell(
241 181
                   child:
242
-                      roundedRectButton("Forgot Password?", Gradients1, false),
182
+                  roundedRectButton("Forgot Password?", Gradients1, false),
243 183
                   onTap: () {
244 184
                     Navigator.push(
245 185
                         context,
@@ -254,8 +194,7 @@ class _LoginScreenState extends State<LoginScreen> {
254 194
   }
255 195
 }
256 196
 
257
-Widget roundedRectButton(
258
-    String title, List<Color> gradient, bool isEndIconVisible) {
197
+Widget roundedRectButton(String title, List<Color> gradient, bool isEndIconVisible) {
259 198
   return Builder(builder: (BuildContext mContext) {
260 199
     return Align(
261 200
       alignment: Alignment.centerLeft,
@@ -352,7 +291,7 @@ alertDialogFailedResponse(BuildContext context){
352 291
     onPressed: () {
353 292
       Navigator.of(context, rootNavigator: true).pop();
354 293
       Navigator.pushReplacement(context, MaterialPageRoute(
355
-          builder: (context) => SplashScreen()));
294
+          builder: (context) => LoginScreen()));
356 295
     },
357 296
   );
358 297
 

+ 178
- 0
lib/Screens/Splash/background.dart Ver fichero

@@ -0,0 +1,178 @@
1
+import 'package:flutter/material.dart';
2
+
3
+class Background extends StatelessWidget {
4
+  const Background({Key? key}) : super(key: key);
5
+
6
+  @override
7
+  Widget build(BuildContext context) {
8
+    return Scaffold(
9
+      resizeToAvoidBottomInset: false,
10
+      backgroundColor: Colors.white,
11
+      body: Column(
12
+        children: <Widget>[
13
+          new Stack(
14
+            alignment: Alignment.bottomCenter,
15
+            children: <Widget>[
16
+              WavyHeader()
17
+            ],
18
+          ),
19
+          Expanded(
20
+            child: Container(),
21
+          ),
22
+          Stack(
23
+            alignment: Alignment.bottomLeft,
24
+            children: <Widget>[
25
+              WavyFooter(),
26
+              CirclePink(),
27
+              CircleYellow(),
28
+            ],
29
+          )
30
+        ],
31
+      ),
32
+    );
33
+  }
34
+}
35
+
36
+const List<Color> orangeGradients = [
37
+  /*Color(0xFFFF9844),
38
+  Color(0xFFFE8853),
39
+  Color(0xFFFD7267),*/
40
+  Color(0xFFD21404),
41
+  Color(0xFFFD7267)
42
+];
43
+
44
+const List<Color> aquaGradients = [
45
+  Color(0xFF8EF7DA),
46
+  Color(0xFF5AEAF1),
47
+  Colors.blueAccent,
48
+];
49
+
50
+class WavyHeader extends StatelessWidget {
51
+  @override
52
+  Widget build(BuildContext context) {
53
+    return ClipPath(
54
+      clipper: TopWaveClipper(),
55
+      child: Container(
56
+        decoration: BoxDecoration(
57
+          gradient: LinearGradient(
58
+              colors: orangeGradients,
59
+              begin: Alignment.topLeft,
60
+              end: Alignment.center),
61
+        ),
62
+        height: MediaQuery.of(context).size.height / 2.5,
63
+      ),
64
+    );
65
+  }
66
+}
67
+
68
+class WavyFooter extends StatelessWidget {
69
+  @override
70
+  Widget build(BuildContext context) {
71
+    return ClipPath(
72
+      clipper: FooterWaveClipper(),
73
+      child: Container(
74
+        decoration: BoxDecoration(
75
+          gradient: LinearGradient(
76
+              colors: aquaGradients,
77
+              begin: Alignment.center,
78
+              end: Alignment.bottomRight),
79
+        ),
80
+        height: MediaQuery.of(context).size.height / 3,
81
+      ),
82
+    );
83
+  }
84
+}
85
+
86
+class CirclePink extends StatelessWidget {
87
+  @override
88
+  Widget build(BuildContext context) {
89
+    return Transform.translate(
90
+      offset: Offset(-70.0, 90.0),
91
+      child: Material(
92
+        color: Color(0xFFFF9844),
93
+        child: Padding(padding: EdgeInsets.all(120)),
94
+        shape: CircleBorder(side: BorderSide(color: Colors.white, width: 15.0)),
95
+      ),
96
+    );
97
+  }
98
+}
99
+
100
+class CircleYellow extends StatelessWidget {
101
+  @override
102
+  Widget build(BuildContext context) {
103
+    return Transform.translate(
104
+      offset: Offset(0.0, 210.0),
105
+      child: Material(
106
+        color: Colors.yellow,
107
+        child: Padding(padding: EdgeInsets.all(140)),
108
+        shape: CircleBorder(side: BorderSide(color: Colors.white, width: 15.0)),
109
+      ),
110
+    );
111
+  }
112
+}
113
+
114
+class TopWaveClipper extends CustomClipper<Path> {
115
+  @override
116
+  Path getClip(Size size) {
117
+    // This is where we decide what part of our image is going to be visible.
118
+    var path = Path();
119
+    path.lineTo(0.0, size.height);
120
+
121
+    var firstControlPoint = new Offset(size.width / 7, size.height - 30);
122
+    var firstEndPoint = new Offset(size.width / 6, size.height / 1.5);
123
+
124
+    path.quadraticBezierTo(firstControlPoint.dx, firstControlPoint.dy,
125
+        firstEndPoint.dx, firstEndPoint.dy);
126
+
127
+    var secondControlPoint = Offset(size.width / 5, size.height / 4);
128
+    var secondEndPoint = Offset(size.width / 1.5, size.height / 5);
129
+    path.quadraticBezierTo(secondControlPoint.dx, secondControlPoint.dy,
130
+        secondEndPoint.dx, secondEndPoint.dy);
131
+
132
+    var thirdControlPoint =
133
+        Offset(size.width - (size.width / 9), size.height / 6);
134
+    var thirdEndPoint = Offset(size.width, 0.0);
135
+    path.quadraticBezierTo(thirdControlPoint.dx, thirdControlPoint.dy,
136
+        thirdEndPoint.dx, thirdEndPoint.dy);
137
+
138
+    ///move from bottom right to top
139
+    path.lineTo(size.width, 0.0);
140
+
141
+    ///finally close the path by reaching start point from top right corner
142
+    path.close();
143
+    return path;
144
+  }
145
+
146
+  @override
147
+  bool shouldReclip(CustomClipper<Path> oldClipper) => false;
148
+}
149
+
150
+class FooterWaveClipper extends CustomClipper<Path> {
151
+  @override
152
+  Path getClip(Size size) {
153
+    var path = Path();
154
+    path.moveTo(size.width, 0.0);
155
+    path.lineTo(size.width, size.height);
156
+    path.lineTo(0.0, size.height);
157
+    path.lineTo(0.0, size.height - 60);
158
+    var secondControlPoint = Offset(size.width - (size.width / 6), size.height);
159
+    var secondEndPoint = Offset(size.width, 0.0);
160
+    path.quadraticBezierTo(secondControlPoint.dx, secondControlPoint.dy,
161
+        secondEndPoint.dx, secondEndPoint.dy);
162
+
163
+    return path;
164
+  }
165
+
166
+  @override
167
+  bool shouldReclip(CustomClipper<Path> oldClipper) => false;
168
+}
169
+
170
+class YellowCircleClipper extends CustomClipper<Rect> {
171
+  @override
172
+  Rect getClip(Size size) {
173
+    throw UnimplementedError();
174
+  }
175
+
176
+  @override
177
+  bool shouldReclip(CustomClipper<Rect> oldClipper) => false;
178
+}

+ 40
- 0
lib/Screens/Splash/loginstatus_post.dart Ver fichero

@@ -0,0 +1,40 @@
1
+import 'dart:convert';
2
+import 'dart:core';
3
+import 'package:http/http.dart' as http;
4
+import 'package:employee_selfservice_mobile/constants.dart';
5
+import 'dart:developer' as logDev;
6
+
7
+class LoginStatus_Post {
8
+  late String version;
9
+  late String device;
10
+  late String session;
11
+  late String notif_token;
12
+
13
+  LoginStatus_Post({
14
+    required this.version,
15
+    required this.device,
16
+    required this.session,
17
+    required this.notif_token});
18
+
19
+  static Future<String> connectToAPI(String version, String device, String session, String notif_token) async {
20
+    String URL = baseURL + "/api/v1/login_status";
21
+    print(URL);
22
+
23
+    var sendData = await http.post(Uri.parse(URL),
24
+        body: jsonEncode({
25
+          "data": [
26
+            {
27
+              "version": version,
28
+              "device": device,
29
+              "session": session,
30
+              "notif_token": notif_token
31
+            }
32
+          ]
33
+        }),
34
+        headers: {"Content-Type": "application/json", "Api-key": apiKey});
35
+
36
+
37
+    logDev.log(sendData.body, name: "Login Status");
38
+    return sendData.body;
39
+  }
40
+}

+ 338
- 0
lib/Screens/Splash/splash_screen.dart Ver fichero

@@ -0,0 +1,338 @@
1
+import 'dart:async';
2
+import 'dart:convert';
3
+import 'dart:io';
4
+import 'package:connectivity_plus/connectivity_plus.dart';
5
+import 'package:flutter/cupertino.dart';
6
+import 'package:flutter/material.dart';
7
+import 'package:flutter/services.dart';
8
+import 'package:fluttertoast/fluttertoast.dart';
9
+import 'package:google_fonts/google_fonts.dart';
10
+import 'package:employee_selfservice_mobile/Screens/Login/login_screen.dart';
11
+import 'package:employee_selfservice_mobile/Screens/Splash/loginstatus_post.dart';
12
+import 'package:employee_selfservice_mobile/constants.dart';
13
+import 'package:internet_connection_checker/internet_connection_checker.dart';
14
+import 'package:lottie/lottie.dart';
15
+import 'package:shared_preferences/shared_preferences.dart';
16
+import '../Home/home_screen.dart';
17
+import '../Splash/background.dart';
18
+import 'package:url_launcher/url_launcher.dart';
19
+import 'dart:developer' as logDev;
20
+
21
+class Splash extends StatefulWidget {
22
+  const Splash({Key? key}) : super(key: key);
23
+
24
+  @override
25
+  _SplashState createState() => _SplashState();
26
+}
27
+
28
+class _SplashState extends State<Splash> {
29
+  late StreamSubscription subscription;
30
+  bool isDeviceConnected = false;
31
+  bool isAlertSet = false;
32
+
33
+  @override
34
+  void initState() {
35
+    //getConnectivity();
36
+    //Timer(Duration(seconds: 10), () => loginStatus(context));
37
+    Timer(Duration(seconds: 10), () => Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => LoginView())));
38
+    super.initState();
39
+  }
40
+
41
+  /*getConnectivity() =>
42
+      subscription = Connectivity().onConnectivityChanged.listen(
43
+            (ConnectivityResult result) async {
44
+          isDeviceConnected = await InternetConnectionChecker().hasConnection;
45
+          if (!isDeviceConnected && isAlertSet == false) {
46
+            showConnectivityDialogBox();
47
+            setState(() => isAlertSet = true);
48
+          }
49
+        },
50
+      );*/
51
+
52
+  @override
53
+  Widget build(BuildContext context) {
54
+    return Scaffold(
55
+        resizeToAvoidBottomInset: false,
56
+        body: Stack(
57
+          children: <Widget>[
58
+            Background(),
59
+            SplashScreen(),
60
+          ],
61
+        ));
62
+  }
63
+
64
+/*showConnectivityDialogBox() =>
65
+      showCupertinoDialog<String>(
66
+        context: context,
67
+        builder: (BuildContext context) =>
68
+            CupertinoAlertDialog(
69
+              title: const Text('No Connection'),
70
+              content: const Text('Please check your internet connectivity'),
71
+              actions: <Widget>[
72
+                Column(
73
+                  children: [
74
+                    SizedBox(
75
+                      width: 250,
76
+                      height: 250,
77
+                      child: LottieBuilder.asset(
78
+                        //'assets/animation/animation_no_internet.json',
79
+                          'assets/animation/animation_no_internet_3.json',
80
+                          repeat: true),
81
+                    ),
82
+                  ],
83
+                ),
84
+                TextButton(
85
+                  onPressed: () async {
86
+                    Navigator.pop(context, 'Cancel');
87
+                    setState(() => isAlertSet = false);
88
+                    isDeviceConnected =
89
+                    await InternetConnectionChecker().hasConnection;
90
+                    if (!isDeviceConnected && isAlertSet == false) {
91
+                      showConnectivityDialogBox();
92
+                      setState(() => isAlertSet = true);
93
+                    }
94
+                  },
95
+                  child: const Text('Retry'),
96
+                ),
97
+              ],
98
+            ),
99
+      );*/
100
+}
101
+
102
+class SplashScreen extends StatelessWidget {
103
+  const SplashScreen({Key? key}) : super(key: key);
104
+
105
+  @override
106
+  Widget build(BuildContext context) {
107
+    var size = MediaQuery.of(context).size;
108
+
109
+    return Scaffold(
110
+        body: Container(
111
+          width: double.infinity,
112
+          height: double.infinity,
113
+          decoration: BoxDecoration(
114
+              gradient: LinearGradient(
115
+                  begin: Alignment.topRight,
116
+                  end: Alignment.bottomRight,
117
+                  colors: [
118
+                    Color(0xFF4858A7),
119
+                    Color(0xFF4858A7),
120
+                    Color(0xFF6474C6),
121
+                    //Color(0xFF8C99DD),
122
+                    //Color(0xFFFFFFFF)
123
+                  ])),
124
+          child: Center(
125
+            child: Column(
126
+              mainAxisAlignment: MainAxisAlignment.center,
127
+              crossAxisAlignment: CrossAxisAlignment.center,
128
+              children: [
129
+                Container(
130
+                  /*decoration: BoxDecoration(
131
+                shape: BoxShape.circle,
132
+                color: Colors.white
133
+              ),*/
134
+                  child: SizedBox(
135
+                      width: size.width * 0.55,
136
+                      //height: 250,
137
+                      child: Image.asset('assets/animation/iconapp2.gif')
138
+                    /*LottieBuilder.asset('assets/animation/animation_4.json',
139
+                    repeat: true, ),*/
140
+                  ),
141
+                ),
142
+                /* Text(appName,
143
+                style: GoogleFonts.carterOne(fontSize: 25, color: Colors.white))*/
144
+              ],
145
+            ),
146
+          ),
147
+        ));
148
+  }
149
+}
150
+
151
+Future<void> loginStatus(BuildContext context) async {
152
+  final SharedPreferences prefs = await SharedPreferences.getInstance();
153
+  String? version = prefs.getString('version');
154
+  String? device = prefs.getString('device');
155
+  String? session = prefs.getString('session');
156
+  String? notif_token = prefs.getString('notif_token');
157
+
158
+  if (session == null) {
159
+    version = "1.0.0";
160
+    session = "";
161
+    notif_token = "";
162
+
163
+    if (Platform.isAndroid){
164
+      device = "android";
165
+    } else if (Platform.isIOS){
166
+      device = "ios";
167
+    }
168
+
169
+  }
170
+
171
+  //logDev.log(session, name: "SESSIONNYA");
172
+
173
+  LoginStatus_Post.connectToAPI(version!, device!, session, notif_token!).then((valueResult) async {
174
+    Map<String, dynamic> object = json.decode(valueResult);
175
+    if (object.containsKey("result").toString() == "true") {
176
+      String status = object['result']['status'].toString();
177
+      if (status == "success") {
178
+        Fluttertoast.showToast(
179
+            msg: "You are already logged in",
180
+            toastLength: Toast.LENGTH_SHORT,
181
+            gravity: ToastGravity.CENTER,
182
+            timeInSecForIosWeb: 1,
183
+            textColor: Colors.white,
184
+            fontSize: 16.0);
185
+        Navigator.pushReplacement(
186
+            context, MaterialPageRoute(builder: (context) => HomeView()));
187
+      } else if (status == "failed") {
188
+        String message = object['result']['message'].toString();
189
+        if (message == "Not Logged In") {
190
+          Fluttertoast.showToast(
191
+              msg: message,
192
+              toastLength: Toast.LENGTH_SHORT,
193
+              gravity: ToastGravity.CENTER,
194
+              timeInSecForIosWeb: 1,
195
+              textColor: Colors.white,
196
+              fontSize: 16.0);
197
+          Navigator.pushReplacement(
198
+              context, MaterialPageRoute(builder: (context) => LoginView()));
199
+        } else {
200
+          String title = object['result']['title'].toString();
201
+          String action = object['result']['action'].toString();
202
+          String block = object['result']['block'].toString();
203
+          if (block == "false") {
204
+            Widget okButton = TextButton(
205
+              child: Text(action),
206
+              onPressed: () async {
207
+                Uri url = Uri.parse(Uri.encodeFull("https://play.google.com/store/apps"));
208
+                //final Uri uri = Uri(scheme: "https", host: "play.google.com");
209
+                if(!await launchUrl(url, mode: LaunchMode.externalApplication)) {
210
+                  throw "Can not launch url";
211
+                }
212
+              },
213
+            );
214
+
215
+            Widget noButton = TextButton(
216
+              child: Text("Later"),
217
+              onPressed: () {
218
+                if (session == ""){
219
+                  Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => LoginView()));
220
+                } else {
221
+                  Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => HomeView()));
222
+                }
223
+              },
224
+            );
225
+
226
+            // set up the AlertDialog
227
+            AlertDialog alert = AlertDialog(
228
+              title: Text(appName),
229
+              content: Text(title + "\n" + message),
230
+              actions: [noButton, okButton],
231
+
232
+            );
233
+
234
+            // show the dialog
235
+            showDialog(
236
+              context: context,
237
+              barrierDismissible: false,
238
+              builder: (BuildContext context) {
239
+                return alert;
240
+              },
241
+            );
242
+          } else if (block == "true") {
243
+            Widget okButton = TextButton(
244
+              child: Text(action),
245
+              onPressed: () async {
246
+                if (action == "update") {
247
+                  _launchURL(Uri.parse("https://play.google.com/store/apps"));
248
+                  SystemChannels.platform.invokeMethod('SystemNavigator.pop');
249
+                  Uri url = Uri.parse(Uri.encodeFull("https://play.google.com/store/apps"));
250
+                  //final Uri uri = Uri(scheme: "https",  host: "play.google.com");
251
+                  if(!await launchUrl(url, mode: LaunchMode.externalApplication)) {
252
+                    throw "Can not launch url";
253
+                  }
254
+                } else if (action == "close") {
255
+                  SystemChannels.platform.invokeMethod('SystemNavigator.pop');
256
+                }
257
+              },
258
+            );
259
+
260
+            // set up the AlertDialog
261
+            AlertDialog alert = AlertDialog(
262
+              title: Text(appName),
263
+              content: Text(title + "\n" + message),
264
+              actions: [okButton],
265
+            );
266
+
267
+            // show the dialog
268
+            showDialog(
269
+              context: context,
270
+              barrierDismissible: false,
271
+              builder: (BuildContext context) {
272
+                return alert;
273
+              },
274
+            );
275
+          }
276
+        }
277
+      }
278
+    } else {
279
+      alertDialogFailedResponse(context);
280
+      Fluttertoast.showToast(
281
+          msg: "Server Response Error",
282
+          toastLength: Toast.LENGTH_SHORT,
283
+          gravity: ToastGravity.CENTER,
284
+          timeInSecForIosWeb: 1,
285
+          textColor: Colors.white,
286
+          fontSize: 16.0);
287
+    }
288
+  });
289
+}
290
+
291
+_launchURL(Uri url) async {
292
+  if (await canLaunchUrl(url)) {
293
+    await launchUrl(url);
294
+  } else {
295
+    throw 'Could not launch $url';
296
+  }
297
+}
298
+
299
+alertDialogFailedResponse(BuildContext context){
300
+  Widget okButton = TextButton(
301
+    child: Text("Refresh"),
302
+    onPressed: () {
303
+      Navigator.of(context, rootNavigator: true).pop();
304
+      Navigator.pushReplacement(context, MaterialPageRoute(
305
+          builder: (context) => SplashScreen()));
306
+    },
307
+  );
308
+
309
+  Widget noButton = TextButton(
310
+    child: Text("Back"),
311
+    onPressed: () {
312
+      Navigator.of(context, rootNavigator: true).pop();
313
+      Navigator.pop(context);
314
+
315
+    },
316
+  );
317
+
318
+  // set up the AlertDialog
319
+  AlertDialog alert = AlertDialog(
320
+    title: Text(appName),
321
+    content: Text("Server Response Error"),
322
+    actions: [
323
+      noButton,
324
+      okButton,
325
+    ],
326
+  );
327
+
328
+  // show the dialog
329
+  showDialog(
330
+    context: context,
331
+    barrierDismissible: false,
332
+    builder: (BuildContext context) {
333
+      return alert;
334
+    },
335
+  );
336
+}
337
+
338
+

+ 2
- 1
lib/constants.dart Ver fichero

@@ -8,7 +8,8 @@ const double defaultPadding = 16.0;
8 8
 String appName = "Employee Self Service";
9 9
 //String baseURL = "http://10.209.8.49:8090";
10 10
 //String baseURL = "https://bisops.globalservice.co.id";
11
-String baseURL = "https://urp.myapps.id";
11
+//String baseURL = "https://urp.myapps.id";
12
+String baseURL = "http://209.97.161.28:8069";
12 13
 //String apiKey = "admin";
13 14
 //String apiKey = "G514p1k3y";
14 15
 String apiKey = "4pik3y";

+ 81
- 0
lib/firebase_options.dart Ver fichero

@@ -0,0 +1,81 @@
1
+// File generated by FlutterFire CLI.
2
+// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members
3
+import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
4
+import 'package:flutter/foundation.dart'
5
+    show defaultTargetPlatform, kIsWeb, TargetPlatform;
6
+
7
+/// Default [FirebaseOptions] for use with your Firebase apps.
8
+///
9
+/// Example:
10
+/// ```dart
11
+/// import 'firebase_options.dart';
12
+/// // ...
13
+/// await Firebase.initializeApp(
14
+///   options: DefaultFirebaseOptions.currentPlatform,
15
+/// );
16
+/// ```
17
+class DefaultFirebaseOptions {
18
+  static FirebaseOptions get currentPlatform {
19
+    if (kIsWeb) {
20
+      return web;
21
+    }
22
+    switch (defaultTargetPlatform) {
23
+      case TargetPlatform.android:
24
+        return android;
25
+      case TargetPlatform.iOS:
26
+        return ios;
27
+      case TargetPlatform.macOS:
28
+        return macos;
29
+      case TargetPlatform.windows:
30
+        throw UnsupportedError(
31
+          'DefaultFirebaseOptions have not been configured for windows - '
32
+          'you can reconfigure this by running the FlutterFire CLI again.',
33
+        );
34
+      case TargetPlatform.linux:
35
+        throw UnsupportedError(
36
+          'DefaultFirebaseOptions have not been configured for linux - '
37
+          'you can reconfigure this by running the FlutterFire CLI again.',
38
+        );
39
+      default:
40
+        throw UnsupportedError(
41
+          'DefaultFirebaseOptions are not supported for this platform.',
42
+        );
43
+    }
44
+  }
45
+
46
+  static const FirebaseOptions web = FirebaseOptions(
47
+    apiKey: 'AIzaSyBNRdnOpCYHm70Qc0Jo4sEH8lEpqhfVm2I',
48
+    appId: '1:11716618948:web:19cebf44e0d875f0937791',
49
+    messagingSenderId: '11716618948',
50
+    projectId: 'canvas-56baa',
51
+    authDomain: 'canvas-56baa.firebaseapp.com',
52
+    storageBucket: 'canvas-56baa.appspot.com',
53
+    measurementId: 'G-F5J2T5S5VC',
54
+  );
55
+
56
+  static const FirebaseOptions android = FirebaseOptions(
57
+    apiKey: 'AIzaSyAsylxl5a2treqN-GI1lqcx6Ode6-hl8hk',
58
+    appId: '1:11716618948:android:e8a6512d2d905094937791',
59
+    messagingSenderId: '11716618948',
60
+    projectId: 'canvas-56baa',
61
+    storageBucket: 'canvas-56baa.appspot.com',
62
+  );
63
+
64
+  static const FirebaseOptions ios = FirebaseOptions(
65
+    apiKey: 'AIzaSyBqWHTEHPlp6FFcTGQXkwuMsOcEopWG3F8',
66
+    appId: '1:11716618948:ios:2cfdbccbd58e6267937791',
67
+    messagingSenderId: '11716618948',
68
+    projectId: 'canvas-56baa',
69
+    storageBucket: 'canvas-56baa.appspot.com',
70
+    iosBundleId: 'com.urp.hris',
71
+  );
72
+
73
+  static const FirebaseOptions macos = FirebaseOptions(
74
+    apiKey: 'AIzaSyBqWHTEHPlp6FFcTGQXkwuMsOcEopWG3F8',
75
+    appId: '1:11716618948:ios:2cfdbccbd58e6267937791',
76
+    messagingSenderId: '11716618948',
77
+    projectId: 'canvas-56baa',
78
+    storageBucket: 'canvas-56baa.appspot.com',
79
+    iosBundleId: 'com.urp.hris',
80
+  );
81
+}

+ 4
- 140
lib/main.dart Ver fichero

@@ -1,79 +1,19 @@
1 1
 import 'dart:ui';
2
+import 'package:employee_selfservice_mobile/Screens/Login/login_screen.dart';
2 3
 import 'package:firebase_core/firebase_core.dart';
3 4
 import 'package:firebase_messaging/firebase_messaging.dart';
4 5
 import 'package:flutter/material.dart';
5 6
 import 'package:flutter_local_notifications/flutter_local_notifications.dart';
6
-import 'package:employee_selfservice_mobile/NotificationService/local_notification_service.dart';
7
-import 'package:employee_selfservice_mobile/Screens/Splash/splash_screen.dart';
8 7
 import 'Screens/Settings/settings_screen.dart';
8
+import 'Screens/Splash/splash_screen.dart';
9 9
 import 'constants.dart';
10 10
 import 'dart:developer' as logDev;
11 11
 import 'package:firebase_crashlytics/firebase_crashlytics.dart';
12 12
 
13 13
 import 'firebase_options.dart';
14 14
 
15
-const AndroidNotificationChannel channel = AndroidNotificationChannel(
16
-    'high_importance_channel', // id
17
-    'High Importance Notifications', // title
18
-    description: 'This channel is used for important notifications.', // description
19
-    importance: Importance.high,
20
-    playSound: true);
21
-
22
-final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
23
-
24 15
 void main() async{
25 16
   WidgetsFlutterBinding.ensureInitialized();
26
-  // if (Firebase.apps.length){
27
-    await Firebase.initializeApp(
28
-      name: "employee-self-service-8280b", options: DefaultFirebaseOptions.currentPlatform
29
-    );
30
-  // }
31
-
32
-  //You can automatically catch all errors that are thrown within the Flutter framework by overriding
33
-  FlutterError.onError = (errorDetails) {
34
-    FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
35
-  };
36
-
37
-  // Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics
38
-  PlatformDispatcher.instance.onError = (error, stack) {
39
-    FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
40
-    return true;
41
-  };
42
-
43
-  //Force Crash - Crashlytics
44
-  //FirebaseCrashlytics.instance.crash();
45
-
46
-  //LocalNotificationService.initialize();
47
-  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
48
-
49
-  await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()?.createNotificationChannel(channel);
50
-
51
-  LocalNotificationService.initialize();
52
-
53
-  FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
54
-    LocalNotificationService.initialize();
55
-    Map<String, dynamic> data = message.data;
56
-    logDev.log(data.toString(), name: "NOTIF Messaging");
57
-
58
-    String body = data['body'].toString();
59
-    logDev.log(body, name: "NOTIF Body");
60
-
61
-    print('Got a message whilst in the foreground!');
62
-    print('Message data: ${message.data}');
63
-
64
-    if (message.notification != null) {
65
-      print('Message also contained a notification: ${message.notification}');
66
-    }
67
-
68
-    logDev.log(message.data.toString(), name: "on message listen - DATANYA APA?");
69
-    logDev.log(message.notification!.title.toString(), name: "on message listen - ISI NOTIFNYA APA?");
70
-  });
71
-
72
-  await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
73
-    alert: true,
74
-    badge: true,
75
-    sound: true,
76
-  );
77 17
 
78 18
   runApp(MyApp());
79 19
 }
@@ -86,78 +26,9 @@ class MyApp extends StatefulWidget {
86 26
 }
87 27
 
88 28
 class _MyAppState extends State<MyApp> {
89
-  void initState(){
29
+  /*void initState(){
90 30
     super.initState();
91
-
92
-    // 1. This method call when app in terminated state and you get a notification
93
-    // when you click on notification app open from terminated state and you can get notification data in this method
94
-    FirebaseMessaging.instance.getInitialMessage().then((message) {
95
-        print("FirebaseMessaging.instance.getInitialMessage");
96
-        if (message != null) {
97
-          logDev.log("New Notification", name: "NEW NOTIF");
98
-          // if (message.data['_id'] != null) {
99
-          //   Navigator.of(context).push(
100
-          //     MaterialPageRoute(
101
-          //       builder: (context) => DemoScreen(
102
-          //         id: message.data['_id'],
103
-          //       ),
104
-          //     ),
105
-          //   );
106
-          // }
107
-        }
108
-      },
109
-    );
110
-
111
-    // 2. This method only call when App in forground it mean app must be opened
112
-    FirebaseMessaging.onMessage.listen((RemoteMessage message) {
113
-      RemoteNotification? notification = message.notification!;
114
-      //AndroidNotification? android = message.notification?.android;
115
-      if (notification != null) {
116
-        flutterLocalNotificationsPlugin.show(
117
-            notification.hashCode,
118
-            notification.title,
119
-            notification.body,
120
-            NotificationDetails(
121
-              android: AndroidNotificationDetails(
122
-                channel.id,
123
-                channel.name,
124
-                channelDescription: channel.description,
125
-                color: Colors.blue,
126
-                playSound: true,
127
-                icon: '@mipmap/ic_launcher',
128
-              ),
129
-            ));
130
-      }
131
-      logDev.log(message.data.toString(), name: "onMessage listen - DATANYA APA?");
132
-      logDev.log(message.notification!.title.toString(), name: "onMessage listen - ISI NOTIFNYA APA?");
133
-    });
134
-
135
-    // 3. This method only call when App in background and not terminated(not closed)
136
-    FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message)  {
137
-      print('A new onMessageOpenedApp event was published!');
138
-      RemoteNotification? notification = message.notification;
139
-      //AndroidNotification? android = message.notification?.android;
140
-      if (notification != null) {
141
-        showDialog(
142
-            context: context,
143
-            builder: (_) {
144
-              return Scaffold(
145
-                body: Builder(builder: (context) => Center(
146
-                  child: ElevatedButton(
147
-                    onPressed: () {
148
-                      Navigator.push(context, MaterialPageRoute(
149
-                          builder: (context) => SettingsScreen()));
150
-                    },
151
-                    child: Text("Click"),
152
-                  ),
153
-                )),
154
-              );
155
-            });
156
-      }
157
-      logDev.log(message.data.toString(), name: "Opened APP - DATANYA APA?");
158
-      logDev.log(message.notification!.title.toString(), name: "Opened APP - ISI NOTIFNYA APA?");
159
-    });
160
-  }
31
+  }*/
161 32
 
162 33
   @override
163 34
   Widget build(BuildContext context) {
@@ -173,10 +44,3 @@ class _MyAppState extends State<MyApp> {
173 44
   }
174 45
 }
175 46
 
176
-Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
177
-  logDev.log(message.data.toString(), name: "BACKGROUND HANDLER - DATANYA APA?");
178
-  logDev.log(message.notification!.title.toString(), name: "BACKGROUND HANDLER - ISI NOTIFNYA APA?");
179
-}
180
-/*void sendLogMessage(String message) {
181
-  FirebaseCrashlytics.instance.log(message);
182
-}*/

+ 3
- 3
macos/Runner.xcodeproj/project.pbxproj Ver fichero

@@ -54,7 +54,7 @@
54 54
 /* Begin PBXFileReference section */
55 55
 		333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
56 56
 		335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
57
-		33CC10ED2044A3C60003C045 /* hris_selfservice_mobile.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "hris_selfservice_mobile.app"; sourceTree = BUILT_PRODUCTS_DIR; };
57
+		33CC10ED2044A3C60003C045 /* employee_self_service.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "employee_self_service.app"; sourceTree = BUILT_PRODUCTS_DIR; };
58 58
 		33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
59 59
 		33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
60 60
 		33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
@@ -105,7 +105,7 @@
105 105
 		33CC10EE2044A3C60003C045 /* Products */ = {
106 106
 			isa = PBXGroup;
107 107
 			children = (
108
-				33CC10ED2044A3C60003C045 /* hris_selfservice_mobile.app */,
108
+				33CC10ED2044A3C60003C045 /* employee_self_service.app */,
109 109
 			);
110 110
 			name = Products;
111 111
 			sourceTree = "<group>";
@@ -172,7 +172,7 @@
172 172
 			);
173 173
 			name = Runner;
174 174
 			productName = Runner;
175
-			productReference = 33CC10ED2044A3C60003C045 /* hris_selfservice_mobile.app */;
175
+			productReference = 33CC10ED2044A3C60003C045 /* employee_self_service.app */;
176 176
 			productType = "com.apple.product-type.application";
177 177
 		};
178 178
 /* End PBXNativeTarget section */

+ 4
- 4
macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme Ver fichero

@@ -15,7 +15,7 @@
15 15
             <BuildableReference
16 16
                BuildableIdentifier = "primary"
17 17
                BlueprintIdentifier = "33CC10EC2044A3C60003C045"
18
-               BuildableName = "hris_selfservice_mobile.app"
18
+               BuildableName = "employee_self_service.app"
19 19
                BlueprintName = "Runner"
20 20
                ReferencedContainer = "container:Runner.xcodeproj">
21 21
             </BuildableReference>
@@ -31,7 +31,7 @@
31 31
          <BuildableReference
32 32
             BuildableIdentifier = "primary"
33 33
             BlueprintIdentifier = "33CC10EC2044A3C60003C045"
34
-            BuildableName = "hris_selfservice_mobile.app"
34
+            BuildableName = "employee_self_service.app"
35 35
             BlueprintName = "Runner"
36 36
             ReferencedContainer = "container:Runner.xcodeproj">
37 37
          </BuildableReference>
@@ -54,7 +54,7 @@
54 54
          <BuildableReference
55 55
             BuildableIdentifier = "primary"
56 56
             BlueprintIdentifier = "33CC10EC2044A3C60003C045"
57
-            BuildableName = "hris_selfservice_mobile.app"
57
+            BuildableName = "employee_self_service_mobile.app"
58 58
             BlueprintName = "Runner"
59 59
             ReferencedContainer = "container:Runner.xcodeproj">
60 60
          </BuildableReference>
@@ -71,7 +71,7 @@
71 71
          <BuildableReference
72 72
             BuildableIdentifier = "primary"
73 73
             BlueprintIdentifier = "33CC10EC2044A3C60003C045"
74
-            BuildableName = "hris_selfservice_mobile.app"
74
+            BuildableName = "employee_self_service.app"
75 75
             BlueprintName = "Runner"
76 76
             ReferencedContainer = "container:Runner.xcodeproj">
77 77
          </BuildableReference>

+ 2
- 2
macos/Runner/Configs/AppInfo.xcconfig Ver fichero

@@ -5,10 +5,10 @@
5 5
 // 'flutter create' template.
6 6
 
7 7
 // The application's name. By default this is also the title of the Flutter window.
8
-PRODUCT_NAME = hris_selfservice_mobile
8
+PRODUCT_NAME = employee_self_service
9 9
 
10 10
 // The application's bundle identifier
11
-PRODUCT_BUNDLE_IDENTIFIER = com.example.hrisSelfserviceMobile
11
+PRODUCT_BUNDLE_IDENTIFIER = com.urp.hris
12 12
 
13 13
 // The copyright displayed in application information
14 14
 PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved.

+ 34
- 0
macos/Runner/GoogleService-Info.plist Ver fichero

@@ -0,0 +1,34 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CLIENT_ID</key>
6
+	<string>476641837995-stu3jdmp8vk9ovgps0l5fuhamj8v0kms.apps.googleusercontent.com</string>
7
+	<key>REVERSED_CLIENT_ID</key>
8
+	<string>com.googleusercontent.apps.476641837995-stu3jdmp8vk9ovgps0l5fuhamj8v0kms</string>
9
+	<key>API_KEY</key>
10
+	<string>AIzaSyDtzT93pKa1UvHhlNlkmt_Kpvfjq_QVO5g</string>
11
+	<key>GCM_SENDER_ID</key>
12
+	<string>476641837995</string>
13
+	<key>PLIST_VERSION</key>
14
+	<string>1</string>
15
+	<key>BUNDLE_ID</key>
16
+	<string>com.urp.ess</string>
17
+	<key>PROJECT_ID</key>
18
+	<string>employee-self-service-8280b</string>
19
+	<key>STORAGE_BUCKET</key>
20
+	<string>employee-self-service-8280b.appspot.com</string>
21
+	<key>IS_ADS_ENABLED</key>
22
+	<false></false>
23
+	<key>IS_ANALYTICS_ENABLED</key>
24
+	<false></false>
25
+	<key>IS_APPINVITE_ENABLED</key>
26
+	<true></true>
27
+	<key>IS_GCM_ENABLED</key>
28
+	<true></true>
29
+	<key>IS_SIGNIN_ENABLED</key>
30
+	<true></true>
31
+	<key>GOOGLE_APP_ID</key>
32
+	<string>1:476641837995:ios:6f6cfeb3604f74d10e08ee</string>
33
+</dict>
34
+</plist>

+ 7
- 0
macos/firebase_app_id_file.json Ver fichero

@@ -0,0 +1,7 @@
1
+{
2
+  "file_generated_by": "FlutterFire CLI",
3
+  "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory",
4
+  "GOOGLE_APP_ID": "1:11716618948:ios:2cfdbccbd58e6267937791",
5
+  "FIREBASE_PROJECT_ID": "canvas-56baa",
6
+  "GCM_SENDER_ID": "11716618948"
7
+}

+ 76
- 52
pubspec.lock Ver fichero

@@ -5,10 +5,10 @@ packages:
5 5
     dependency: transitive
6 6
     description:
7 7
       name: _flutterfire_internals
8
-      sha256: "1a5e13736d59235ce0139621b4bbe29bc89839e202409081bc667eb3cd20674c"
8
+      sha256: d84d98f1992976775f83083523a34c5d22fea191eec3abb2bd09537fb623c2e0
9 9
       url: "https://pub.dev"
10 10
     source: hosted
11
-    version: "1.3.5"
11
+    version: "1.3.7"
12 12
   animated_splash_screen:
13 13
     dependency: "direct main"
14 14
     description:
@@ -37,18 +37,18 @@ packages:
37 37
     dependency: "direct main"
38 38
     description:
39 39
       name: app_settings
40
-      sha256: "67ca58aba6ec311d89597c2716d2e37da54b8c7cef28b7749e6551c57f88c1f4"
40
+      sha256: "09bc7fe0313a507087bec1a3baf555f0576e816a760cbb31813a88890a09d9e5"
41 41
       url: "https://pub.dev"
42 42
     source: hosted
43
-    version: "5.0.0"
43
+    version: "5.1.1"
44 44
   archive:
45 45
     dependency: transitive
46 46
     description:
47 47
       name: archive
48
-      sha256: e0902a06f0e00414e4e3438a084580161279f137aeb862274710f29ec10cf01e
48
+      sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03"
49 49
       url: "https://pub.dev"
50 50
     source: hosted
51
-    version: "3.3.9"
51
+    version: "3.4.6"
52 52
   args:
53 53
     dependency: transitive
54 54
     description:
@@ -197,10 +197,10 @@ packages:
197 197
     dependency: "direct main"
198 198
     description:
199 199
       name: dio
200
-      sha256: ce75a1b40947fea0a0e16ce73337122a86762e38b982e1ccb909daa3b9bc4197
200
+      sha256: "417e2a6f9d83ab396ec38ff4ea5da6c254da71e4db765ad737a42af6930140b7"
201 201
       url: "https://pub.dev"
202 202
     source: hosted
203
-    version: "5.3.2"
203
+    version: "5.3.3"
204 204
   double_back_to_close:
205 205
     dependency: "direct main"
206 206
     description:
@@ -253,10 +253,10 @@ packages:
253 253
     dependency: transitive
254 254
     description:
255 255
       name: file_selector_macos
256
-      sha256: "182c3f8350cee659f7b115e956047ee3dc672a96665883a545e81581b9a82c72"
256
+      sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6
257 257
       url: "https://pub.dev"
258 258
     source: hosted
259
-    version: "0.9.3+2"
259
+    version: "0.9.3+3"
260 260
   file_selector_platform_interface:
261 261
     dependency: transitive
262 262
     description:
@@ -277,10 +277,10 @@ packages:
277 277
     dependency: "direct main"
278 278
     description:
279 279
       name: firebase_core
280
-      sha256: c78132175edda4bc532a71e01a32964e4b4fcf53de7853a422d96dac3725f389
280
+      sha256: "95580fa07c8ca3072a2bb1fecd792616a33f8683477d25b7d29d3a6a399e6ece"
281 281
       url: "https://pub.dev"
282 282
     source: hosted
283
-    version: "2.15.1"
283
+    version: "2.17.0"
284 284
   firebase_core_platform_interface:
285 285
     dependency: transitive
286 286
     description:
@@ -293,50 +293,50 @@ packages:
293 293
     dependency: transitive
294 294
     description:
295 295
       name: firebase_core_web
296
-      sha256: "4cf4d2161530332ddc3c562f19823fb897ff37a9a774090d28df99f47370e973"
296
+      sha256: e8c408923cd3a25bd342c576a114f2126769cd1a57106a4edeaa67ea4a84e962
297 297
       url: "https://pub.dev"
298 298
     source: hosted
299
-    version: "2.7.0"
299
+    version: "2.8.0"
300 300
   firebase_crashlytics:
301 301
     dependency: "direct main"
302 302
     description:
303 303
       name: firebase_crashlytics
304
-      sha256: fd9e1a1cb7cce3f9dd2358d8363d235f25f056981e23a333db1e57eca693913f
304
+      sha256: "833cf891d10e5e819a2034048ff7e8882bcc0b51055c0e17f5fe3f3c3c177a9d"
305 305
       url: "https://pub.dev"
306 306
     source: hosted
307
-    version: "3.3.5"
307
+    version: "3.3.7"
308 308
   firebase_crashlytics_platform_interface:
309 309
     dependency: transitive
310 310
     description:
311 311
       name: firebase_crashlytics_platform_interface
312
-      sha256: "0d19ef23cf7a917a357d2eb1807338ec536ec3232e729ebd769f5bb2aba9e085"
312
+      sha256: dfdf1172f35fc0b0132bc5ec815aed52c07643ee56732e6807ca7dc12f7fce86
313 313
       url: "https://pub.dev"
314 314
     source: hosted
315
-    version: "3.6.5"
315
+    version: "3.6.7"
316 316
   firebase_messaging:
317 317
     dependency: "direct main"
318 318
     description:
319 319
       name: firebase_messaging
320
-      sha256: "6c1a2a047d6f165b7c5f947467ac5138731a2af82c7af1c12d691dbb834f6b73"
320
+      sha256: "67f9d7c87457e71ad78ee81e332f232b8a24f7d5e338f8c958fa7d6e9e0e3636"
321 321
       url: "https://pub.dev"
322 322
     source: hosted
323
-    version: "14.6.7"
323
+    version: "14.6.9"
324 324
   firebase_messaging_platform_interface:
325 325
     dependency: transitive
326 326
     description:
327 327
       name: firebase_messaging_platform_interface
328
-      sha256: bcba58d28f8cda607a323240c6d314c2c62b62ebfbb0f2d704ebefef07b52b5f
328
+      sha256: "8c7ced3201886ad7ba37f344c1468ccfc08abb3023922e0e5a016eaf38abb96c"
329 329
       url: "https://pub.dev"
330 330
     source: hosted
331
-    version: "4.5.6"
331
+    version: "4.5.8"
332 332
   firebase_messaging_web:
333 333
     dependency: transitive
334 334
     description:
335 335
       name: firebase_messaging_web
336
-      sha256: "962d09ec9dfa486cbbc218258ad41e8ec7997a2eba46919049496e1cafd960c5"
336
+      sha256: b601322bdb44e2fefe4cc7b85ef0dbb7a2479d4a7653a51340821cf8d60696b5
337 337
       url: "https://pub.dev"
338 338
     source: hosted
339
-    version: "3.5.6"
339
+    version: "3.5.8"
340 340
   flutter:
341 341
     dependency: "direct main"
342 342
     description: flutter
@@ -378,10 +378,10 @@ packages:
378 378
     dependency: "direct main"
379 379
     description:
380 380
       name: flutter_local_notifications
381
-      sha256: "3002092e5b8ce2f86c3361422e52e6db6776c23ee21e0b2f71b892bf4259ef04"
381
+      sha256: "501ed9d54f1c8c0535b7991bade36f9e7e3b45a2346401f03775c1ec7a3c06ae"
382 382
       url: "https://pub.dev"
383 383
     source: hosted
384
-    version: "15.1.1"
384
+    version: "15.1.2"
385 385
   flutter_local_notifications_linux:
386 386
     dependency: transitive
387 387
     description:
@@ -500,10 +500,10 @@ packages:
500 500
     dependency: "direct main"
501 501
     description:
502 502
       name: geocoding
503
-      sha256: b34c0501bbbaf3190b85bef3078b27cf66c28a8915c6d3af50d67f356aa7da31
503
+      sha256: e1dc0ac56666d9ed1d5a9ae5543ce9eb5986db6209cc7600103487d09192059c
504 504
       url: "https://pub.dev"
505 505
     source: hosted
506
-    version: "2.1.0"
506
+    version: "2.1.1"
507 507
   geocoding_android:
508 508
     dependency: transitive
509 509
     description:
@@ -532,50 +532,50 @@ packages:
532 532
     dependency: "direct main"
533 533
     description:
534 534
       name: geolocator
535
-      sha256: "9f1c9a70dd25fc9d9574ff17ba714cf3bc7894258efd7d1ce0debfafe2f8e1d8"
535
+      sha256: e946395fc608842bb2f6c914807e9183f86f3cb787f6b8f832753e5251036f02
536 536
       url: "https://pub.dev"
537 537
     source: hosted
538
-    version: "10.0.1"
538
+    version: "10.1.0"
539 539
   geolocator_android:
540 540
     dependency: transitive
541 541
     description:
542 542
       name: geolocator_android
543
-      sha256: "55c4a81ea15b664a2fdbfd39ba37f2e9c31e1b57237bbeb8deeeaea9979bc97c"
543
+      sha256: "93906636752ea4d4e778afa981fdfe7409f545b3147046300df194330044d349"
544 544
       url: "https://pub.dev"
545 545
     source: hosted
546
-    version: "4.2.3"
546
+    version: "4.3.1"
547 547
   geolocator_apple:
548 548
     dependency: transitive
549 549
     description:
550 550
       name: geolocator_apple
551
-      sha256: "36527c555f4c425f7d8fa8c7c07d67b78e3ff7590d40448051959e1860c1cfb4"
551
+      sha256: ab90ae811c42ec2f6021e01eca71df00dee6ff1e69d2c2dafd4daeb0b793f73d
552 552
       url: "https://pub.dev"
553 553
     source: hosted
554
-    version: "2.2.7"
554
+    version: "2.3.2"
555 555
   geolocator_platform_interface:
556 556
     dependency: transitive
557 557
     description:
558 558
       name: geolocator_platform_interface
559
-      sha256: b2a0c09d2cfe8ad6a8cc44fada5c1092c49286e8c30922914dfe2b23799a682f
559
+      sha256: b7aca62aa05d7e610c396a53a1936ff87fce2f735d76e93fde9269c341c46a25
560 560
       url: "https://pub.dev"
561 561
     source: hosted
562
-    version: "4.0.8"
562
+    version: "4.1.1"
563 563
   geolocator_web:
564 564
     dependency: transitive
565 565
     description:
566 566
       name: geolocator_web
567
-      sha256: f68a122da48fcfff68bbc9846bb0b74ef651afe84a1b1f6ec20939de4d6860e1
567
+      sha256: "59083f7e0871b78299918d92bf930a14377f711d2d1156c558cd5ebae6c20d58"
568 568
       url: "https://pub.dev"
569 569
     source: hosted
570
-    version: "2.1.6"
570
+    version: "2.2.0"
571 571
   geolocator_windows:
572 572
     dependency: transitive
573 573
     description:
574 574
       name: geolocator_windows
575
-      sha256: "463045515b08bd83f73e014359c4ad063b902eb3899952cfb784497ae6c6583b"
575
+      sha256: "8725beaa00db2b52f53d9811584cb4488240b250b04a09763e80945017f65c9c"
576 576
       url: "https://pub.dev"
577 577
     source: hosted
578
-    version: "0.2.0"
578
+    version: "0.2.1"
579 579
   get_it:
580 580
     dependency: "direct main"
581 581
     description:
@@ -612,10 +612,10 @@ packages:
612 612
     dependency: transitive
613 613
     description:
614 614
       name: image
615
-      sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf
615
+      sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271"
616 616
       url: "https://pub.dev"
617 617
     source: hosted
618
-    version: "4.0.17"
618
+    version: "4.1.3"
619 619
   image_cropper:
620 620
     dependency: "direct main"
621 621
     description:
@@ -652,10 +652,10 @@ packages:
652 652
     dependency: transitive
653 653
     description:
654 654
       name: image_picker_android
655
-      sha256: "47da2161c2e9f8f8a9cbbd89d466d174333fbdd769aeed848912e0b16d9cb369"
655
+      sha256: "0c7b83bbe2980c8a8e36e974f055e11e51675784e13a4762889feed0f3937ff2"
656 656
       url: "https://pub.dev"
657 657
     source: hosted
658
-    version: "0.8.8"
658
+    version: "0.8.8+1"
659 659
   image_picker_for_web:
660 660
     dependency: transitive
661 661
     description:
@@ -924,10 +924,10 @@ packages:
924 924
     dependency: transitive
925 925
     description:
926 926
       name: platform
927
-      sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102
927
+      sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59"
928 928
       url: "https://pub.dev"
929 929
     source: hosted
930
-    version: "3.1.2"
930
+    version: "3.1.3"
931 931
   plugin_platform_interface:
932 932
     dependency: transitive
933 933
     description:
@@ -980,10 +980,10 @@ packages:
980 980
     dependency: "direct main"
981 981
     description:
982 982
       name: shared_preferences
983
-      sha256: b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac
983
+      sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02"
984 984
       url: "https://pub.dev"
985 985
     source: hosted
986
-    version: "2.2.1"
986
+    version: "2.2.2"
987 987
   shared_preferences_android:
988 988
     dependency: transitive
989 989
     description:
@@ -1077,6 +1077,30 @@ packages:
1077 1077
       url: "https://pub.dev"
1078 1078
     source: hosted
1079 1079
     version: "1.2.0"
1080
+  syncfusion_flutter_calendar:
1081
+    dependency: "direct main"
1082
+    description:
1083
+      name: syncfusion_flutter_calendar
1084
+      sha256: "0ef40e5dd10b94b9bb2808c217a10d24061b87e9106b9b35ecd8d489bb4f4b23"
1085
+      url: "https://pub.dev"
1086
+    source: hosted
1087
+    version: "23.1.41"
1088
+  syncfusion_flutter_core:
1089
+    dependency: transitive
1090
+    description:
1091
+      name: syncfusion_flutter_core
1092
+      sha256: a8e3d3ea369566bb45f454331c5863939632b6068d15b558fa384811f1f5aa51
1093
+      url: "https://pub.dev"
1094
+    source: hosted
1095
+    version: "23.1.41"
1096
+  syncfusion_flutter_datepicker:
1097
+    dependency: transitive
1098
+    description:
1099
+      name: syncfusion_flutter_datepicker
1100
+      sha256: "0faff9098c24299429743e895e6365aed4849884c19b7ce110aaee21db7afacf"
1101
+      url: "https://pub.dev"
1102
+    source: hosted
1103
+    version: "23.1.41"
1080 1104
   term_glyph:
1081 1105
     dependency: transitive
1082 1106
     description:
@@ -1257,18 +1281,18 @@ packages:
1257 1281
     dependency: transitive
1258 1282
     description:
1259 1283
       name: win32
1260
-      sha256: "9e82a402b7f3d518fb9c02d0e9ae45952df31b9bf34d77baf19da2de03fc2aaa"
1284
+      sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3"
1261 1285
       url: "https://pub.dev"
1262 1286
     source: hosted
1263
-    version: "5.0.7"
1287
+    version: "5.0.9"
1264 1288
   win32_registry:
1265 1289
     dependency: transitive
1266 1290
     description:
1267 1291
       name: win32_registry
1268
-      sha256: e4506d60b7244251bc59df15656a3093501c37fb5af02105a944d73eb95be4c9
1292
+      sha256: "41fd8a189940d8696b1b810efb9abcf60827b6cbfab90b0c43e8439e3a39d85a"
1269 1293
       url: "https://pub.dev"
1270 1294
     source: hosted
1271
-    version: "1.1.1"
1295
+    version: "1.1.2"
1272 1296
   wkt_parser:
1273 1297
     dependency: transitive
1274 1298
     description:

+ 2
- 1
pubspec.yaml Ver fichero

@@ -92,8 +92,9 @@ dependencies:
92 92
   flutter_animate: ^4.2.0+1
93 93
   animations: ^2.0.8
94 94
   firebase_crashlytics: ^3.3.5
95
-  app_settings: ^5.0.0
95
+  app_settings: ^5.1.1
96 96
   flutter_gif: ^0.0.4
97
+  syncfusion_flutter_calendar: ^23.1.41
97 98
 
98 99
 dev_dependencies:
99 100
   flutter_test:

+ 23
- 0
upload_certificate.pem Ver fichero

@@ -0,0 +1,23 @@
1
+-----BEGIN CERTIFICATE-----
2
+MIIDxzCCAq+gAwIBAgIIY/18pRsCdGswDQYJKoZIhvcNAQELBQAwgZAxCzAJBgNV
3
+BAYTAklEMRQwEgYDVQQIEwtES0kgSmFrYXJ0YTEQMA4GA1UEBxMHSmFrYXJ0YTEi
4
+MCAGA1UEChMZSW5jdWJ1cyBDeWJlcmluZG8gUGVyc2FkYTEWMBQGA1UECxMNSVQg
5
+RGVwYXJ0bWVudDEdMBsGA1UEAxMURGllbmkgQW5pbmR5YXNhcmF0aGkwIBcNMjMx
6
+MDA0MDYyMzA5WhgPMjA1MTAyMTkwNjIzMDlaMIGQMQswCQYDVQQGEwJJRDEUMBIG
7
+A1UECBMLREtJIEpha2FydGExEDAOBgNVBAcTB0pha2FydGExIjAgBgNVBAoTGUlu
8
+Y3VidXMgQ3liZXJpbmRvIFBlcnNhZGExFjAUBgNVBAsTDUlUIERlcGFydG1lbnQx
9
+HTAbBgNVBAMTFERpZW5pIEFuaW5keWFzYXJhdGhpMIIBIjANBgkqhkiG9w0BAQEF
10
+AAOCAQ8AMIIBCgKCAQEApqBnnHa1rWaU/QZtTWEu5JocuY8H4ERSfgeXlqSaFoDV
11
+N+EoHaTakKWE7nqswVT3cTJdPDoEVZxGP6DVqOrWfd+EbUH9uNKqtRVVq/Yc7d3F
12
+4Ix3C4t/YdACb7QrP/oDape5rQf9KguRyzxGcbgY0P0A771Uq3jgaPbSXSazokyk
13
+nbPgykF+iEwsdfSiqKK5jdIenXD92OjCIqdJR16yJbyV6nzXKSQf/+mVzqhg+fbJ
14
+8QJik84+PL2rx6UvN5TxoFMDLtPNEjlQxS0aIXePgpUbM0KpADvmro7u69h2Mbry
15
+qObqRcyL2JiCiHzZ+tbt5FpN3hPyBTtLdh9dBW1bXQIDAQABoyEwHzAdBgNVHQ4E
16
+FgQU9qrCju0iqTjjMvjc3MlfvYpKOi4wDQYJKoZIhvcNAQELBQADggEBABdt3Sqa
17
+zbsuUNFr3k4ikNyBRVhXymLW4vy0zwd40TBQUpn8G8SRlwsIIl1p2HEVQogFBGfG
18
+L7oDXNsSsnuKn5Y2XknnZeFatMTsOm12wW2dejlcVPKIQCPkxVz/+cu6qi9eZr+g
19
+FGV4bT/sfUKHyqLzrvFvwP/7+cYxMdlup0NgYZpBqdB3XektRBNNSLOmlE9FpyNq
20
+kuiKQcidN+jYbeOhN96kh9BvE0xRcDz/cLh8uSA/aIE7bT1XwjJ1nqtjmtBMGd/v
21
+INdFQTaLGp7m9KScMNA/WUkRxdeU/RZcVnDgUjRzeiOWbPLnkUdVc2wWXPb/7QW7
22
+u7fvIlJXknLqCn0=
23
+-----END CERTIFICATE-----

Loading…
Cancelar
Guardar