From 73fafdeec50d7189b9fa8275789ec77c1ab3b078 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Fri, 20 Aug 2021 10:19:28 -0600 Subject: [PATCH 01/20] cambios android --- lib/src/pantallas/finanzas.dart | 6 +----- lib/src/pantallas/mainMenu.dart | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/src/pantallas/finanzas.dart b/lib/src/pantallas/finanzas.dart index 66c782c..8b533e4 100644 --- a/lib/src/pantallas/finanzas.dart +++ b/lib/src/pantallas/finanzas.dart @@ -98,11 +98,7 @@ class _FinanzasState extends State { super.initState(); _showPersBottomSheetCallBack = _showPersBottomSheetCallBack; data(); - StripePayment.setOptions(StripeOptions( - publishableKey: - "pk_test_51JAjdHAoDnRH9C3fzuzLNpJaSlrcUVBJhDzN6ACKV8jocJSLvDCoBa1d1oBTX46CfOpC8wCLQ76H0aDOTZCo3xtO00a3pBNqw1", - merchantId: "Test", - androidPayMode: 'test')); + Future.delayed(Duration(seconds: 1), () => {refresh()}); } diff --git a/lib/src/pantallas/mainMenu.dart b/lib/src/pantallas/mainMenu.dart index 837aad8..73f9741 100644 --- a/lib/src/pantallas/mainMenu.dart +++ b/lib/src/pantallas/mainMenu.dart @@ -169,7 +169,7 @@ class _MainMenuState extends State { //no mover SizedBox( height: size.height >= 640 - ? size.height / 7 + ? size.height / 6 : size.height / 10, ), ], @@ -178,7 +178,7 @@ class _MainMenuState extends State { //no mover SizedBox( - height: size.width <= 640 ? 0 : size.height / 13, + height: size.width <= 640 ? 5 : size.height / 13, ), GridDashboard( From 56fb5438804d2e965049bb568c015e7c9e5ad66a Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Fri, 20 Aug 2021 11:34:51 -0600 Subject: [PATCH 02/20] pdf --- lib/src/extra/opciones_edoCuenta.dart | 161 ++++++++++++++++++++++---- lib/src/pantallas/finanzas.dart | 11 +- pubspec.lock | 13 ++- pubspec.yaml | 4 +- 4 files changed, 157 insertions(+), 32 deletions(-) diff --git a/lib/src/extra/opciones_edoCuenta.dart b/lib/src/extra/opciones_edoCuenta.dart index 5a3cfdc..7ceda36 100644 --- a/lib/src/extra/opciones_edoCuenta.dart +++ b/lib/src/extra/opciones_edoCuenta.dart @@ -2,7 +2,8 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:pdf/pdf.dart'; import 'package:pdf/widgets.dart' as pw; -import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:printing/printing.dart'; class OpcionesEdoCuenta extends StatefulWidget { OpcionesEdoCuenta({Key? key}) : super(key: key); @@ -11,8 +12,20 @@ class OpcionesEdoCuenta extends StatefulWidget { _OpcionesEdoCuentaState createState() => _OpcionesEdoCuentaState(); } +SharedPreferences? prefs; + class _OpcionesEdoCuentaState extends State { late ImageProvider image; + String? user; + int? idComu; + String? comunidad; + String? nombreFrac; + String? domicilio; + String? numInt; + String? tipoLote; + String? cp; + String? ref; + DateTime? timenow = DateTime.now().toUtc(); @override Widget build(BuildContext context) { return Scaffold( @@ -54,7 +67,11 @@ class _OpcionesEdoCuentaState extends State { children: [ Text(item, style: TextStyle(fontSize: 16.0)), InkWell( - + onTap: () async { + Printing.layoutPdf(onLayout: (PdfPageFormat format) { + return buildPdf(format); + }); + }, child: Icon( Icons.picture_as_pdf_rounded, size: 30, @@ -83,36 +100,136 @@ class _OpcionesEdoCuentaState extends State { pageFormat: format, build: (context) => [ _buildCustomHeadline(), + _buildDataUser(), + _buildDataUser() ])); return await doc.save(); } _buildCustomHeadline() { return pw.Header( - child: pw.Text('Adcom', - style: pw.TextStyle( - fontSize: 24, - fontWeight: pw.FontWeight.bold, - color: PdfColors.black)), - padding: pw.EdgeInsets.all(4), - ); + child: pw.Row( + mainAxisAlignment: pw.MainAxisAlignment.spaceBetween, + children: [ + pw.Text('AdCom', + style: pw.TextStyle( + fontSize: 24, + fontWeight: pw.FontWeight.bold, + color: PdfColors.white)), + pw.Text('$nombreFrac', + style: pw.TextStyle( + fontSize: 15, + fontWeight: pw.FontWeight.bold, + color: PdfColors.white)), + pw.Text('Estado de cuenta', + style: pw.TextStyle( + fontSize: 24, + fontWeight: pw.FontWeight.bold, + color: PdfColors.white)), + ]), + padding: pw.EdgeInsets.all(9.0), + decoration: pw.BoxDecoration(color: PdfColors.red)); + } + + _buildTable() { + final headers = ['Concepto', 'Referencia', 'Monto', 'Pagado Tardio']; + final users = [ + Users(name: 'Enero', referencia: 190991, monto: 700, pagado: 'No'), + Users(name: 'Febrero', referencia: 20123, monto: 750, pagado: 'Si'), + Users(name: 'Marzo', referencia: 251231, monto: 700, pagado: 'No') + ]; + + final data = users + .map((users) => + [users.name, users.referencia, users.monto, users.pagado]) + .toList(); + return pw.Padding( + padding: pw.EdgeInsets.all(10.0), + child: pw.Table.fromTextArray( + headers: headers, + data: data, + headerStyle: pw.TextStyle(fontWeight: pw.FontWeight.bold))); + } + + _buildDataUser() { + return pw.Container( + padding: const pw.EdgeInsets.all(11.0), + child: + pw.Row(crossAxisAlignment: pw.CrossAxisAlignment.start, children: [ + pw.Column(children: [ + pw.Paragraph( + textAlign: pw.TextAlign.justify, + text: 'Residente: $user', + style: + pw.TextStyle(fontSize: 12, fontWeight: pw.FontWeight.bold)), + pw.Paragraph( + textAlign: pw.TextAlign.justify, + text: 'Domicilio: $domicilio', + style: + pw.TextStyle(fontSize: 12, fontWeight: pw.FontWeight.bold)), + pw.Paragraph( + textAlign: pw.TextAlign.justify, + text: + 'Estado de cuenta del día: ${timenow!.day}/${timenow!.month}/${timenow!.year} ', + style: + pw.TextStyle(fontSize: 12, fontWeight: pw.FontWeight.bold)), + ]), + pw.Column(children: [ + pw.Paragraph( + text: 'Tipo Lote: $tipoLote', + style: + pw.TextStyle(fontSize: 12, fontWeight: pw.FontWeight.bold)), + pw.Paragraph( + text: 'C.P: $cp ', + style: + pw.TextStyle(fontSize: 12, fontWeight: pw.FontWeight.bold)), + pw.Paragraph( + text: 'Saldo del día: ', + style: + pw.TextStyle(fontSize: 12, fontWeight: pw.FontWeight.bold)) + ]), + pw.Column(children: [ + pw.Paragraph( + text: 'Referencia: $ref ', + style: + pw.TextStyle(fontSize: 12, fontWeight: pw.FontWeight.bold)), + pw.Paragraph( + text: 'Saldo para liquidar el año: ', + style: + pw.TextStyle(fontSize: 12, fontWeight: pw.FontWeight.bold)) + ]), + ])); + } + + saveData() async { + prefs = await SharedPreferences.getInstance(); + setState(() { + user = prefs!.getString('user'); + nombreFrac = prefs!.getString('nombreFracc'); + domicilio = prefs!.getString('domicilio'); + numInt = prefs!.getString('numInt'); + tipoLote = prefs!.getString('tipoLote'); + cp = prefs!.getString('cp'); + ref = prefs!.getString('reference'); + }); } } -class PdfVista extends StatefulWidget { - PdfVista({Key? key}) : super(key: key); +class Users { + final String? name; + final int? referencia; + final int? monto; + final String? pagado; - @override - _PdfVistaState createState() => _PdfVistaState(); + const Users({this.name, this.referencia, this.monto, this.pagado}); } -class _PdfVistaState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - body: Container( - child: SfPdfViewer.network(''), - ), - ); - } +class Comunidad { + final String? nombreFracc; + final String? domicilio; + final String? numInt; + final String? tipoLote; + final String? cp; + const Comunidad( + {this.nombreFracc, this.cp, this.domicilio, this.numInt, this.tipoLote}); } diff --git a/lib/src/pantallas/finanzas.dart b/lib/src/pantallas/finanzas.dart index 8b533e4..fbaafcf 100644 --- a/lib/src/pantallas/finanzas.dart +++ b/lib/src/pantallas/finanzas.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:adcom/json/jsonFinanzas.dart'; import 'package:adcom/main.dart'; +import 'package:adcom/src/extra/opciones_edoCuenta.dart'; import 'package:adcom/src/extra/referencia_view.dart'; import 'package:adcom/src/extra/vista_tarjeta.dart'; import 'package:adcom/src/models/event_provider.dart'; @@ -287,11 +288,11 @@ class _FinanzasState extends State { height: 15, ), InkWell( - /* onTap: () { - HapticFeedback.mediumImpact(); - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => OpcionesEdoCuenta())); - }, */ + onTap: () { + HapticFeedback.mediumImpact(); + Navigator.of(context) + .push(MaterialPageRoute(builder: (_) => OpcionesEdoCuenta())); + }, child: EstadoCuenta()), ], ); diff --git a/pubspec.lock b/pubspec.lock index 88a3604..f156c69 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,7 +21,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.6.1" + version: "2.5.0" barcode: dependency: transitive description: @@ -471,6 +471,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.1" + printing: + dependency: "direct main" + description: + name: printing + url: "https://pub.dartlang.org" + source: hosted + version: "5.5.0" process: dependency: transitive description: @@ -566,7 +573,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.0" stack_trace: dependency: transitive description: @@ -671,7 +678,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.3.0" + version: "0.2.19" timezone: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index bd8fa74..307bd91 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.0.92+11 +version: 2.0.93+12 environment: sdk: ">=2.12.0 <3.0.0" @@ -58,7 +58,7 @@ dependencies: im_stepper: ^0.1.3 pull_to_refresh: ^2.0.0 rename: ^1.3.1 - + printing: ^5.4.3 dio: ^4.0.0 lint: ^1.0.0 From 52663913758e22a8889ecab57205e6f48d407a44 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Wed, 25 Aug 2021 08:36:36 -0600 Subject: [PATCH 03/20] =?UTF-8?q?Nuevos=20a=C3=B1adidos=20y=20cambios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/images/zzz.png | Bin 0 -> 79831 bytes lib/main.dart | 7 +- lib/src/app.dart | 1 + lib/src/extra/add_reporte.dart | 2 +- lib/src/extra/detalles_pago.dart | 190 ++++++++ lib/src/extra/eventos.dart | 2 +- lib/src/extra/opciones_edoCuenta.dart | 14 +- lib/src/extra/reporte.dart | 2 +- lib/src/extra/vista_tarjeta.dart | 394 ++++++--------- lib/src/methods/emailDashboard.dart | 6 +- lib/src/methods/eventDashboard.dart | 115 +++-- lib/src/methods/event_editing_page.dart | 2 +- lib/src/methods/gridDashboard.dart | 22 +- lib/src/models/event_provider.dart | 86 ++-- lib/src/pantallas/amenidades.dart | 253 +++++----- lib/src/pantallas/avisos.dart | 158 +++--- lib/src/pantallas/finanzas.dart | 612 +++++++++++------------- lib/src/pantallas/loginPage.dart | 2 +- lib/src/pantallas/mainMenu.dart | 6 +- 19 files changed, 993 insertions(+), 881 deletions(-) create mode 100644 assets/images/zzz.png create mode 100644 lib/src/extra/detalles_pago.dart diff --git a/assets/images/zzz.png b/assets/images/zzz.png new file mode 100644 index 0000000000000000000000000000000000000000..efdc5c84a8a5d8654a04f6098990caeed70c11f2 GIT binary patch literal 79831 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 literal 0 HcmV?d00001 diff --git a/lib/main.dart b/lib/main.dart index a306c71..c4cd55d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,14 +2,17 @@ import 'package:adcom/src/app.dart'; import 'package:flutter/material.dart'; import 'package:onesignal_flutter/onesignal_flutter.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +SharedPreferences? prefs; void main() async { WidgetsFlutterBinding.ensureInitialized(); OneSignal.shared.setAppId("ea109547-8715-4fc2-aa63-f9afe45349b0"); + await SharedPreferences.getInstance(); - OneSignal.shared + /* OneSignal.shared .getDeviceState() - .then((value) => {print('${value!.userId}')}); + .then((value) => {print('${value!.userId}')}); */ // The promptForPushNotificationsWithUserResponse function will show the iOS push notification prompt. We recommend removing the following code and instead using an In-App Message to prompt for notification permission /* OneSignal.shared.promptUserForPushNotificationPermission().then((accepted) { diff --git a/lib/src/app.dart b/lib/src/app.dart index e6667d4..d1bfadf 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -19,6 +19,7 @@ import 'package:adcom/src/pantallas/visitantes.dart'; import 'package:adcom/src/pantallas/votaciones.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class MyApp extends StatefulWidget { final user; diff --git a/lib/src/extra/add_reporte.dart b/lib/src/extra/add_reporte.dart index fa68f42..ddb7d84 100644 --- a/lib/src/extra/add_reporte.dart +++ b/lib/src/extra/add_reporte.dart @@ -355,7 +355,7 @@ class _AddReorteState extends State { }); Response response = await dio.post( - 'http://187.189.53.8:8080/AdcomBackend/backend/web/index.php?r=adcom/reportes', + 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/reportes', data: formdata2, onSendProgress: (received, total) { if (total != 1) { print((received / total * 100).toStringAsFixed(0) + '%'); diff --git a/lib/src/extra/detalles_pago.dart b/lib/src/extra/detalles_pago.dart new file mode 100644 index 0000000..ad8cb0d --- /dev/null +++ b/lib/src/extra/detalles_pago.dart @@ -0,0 +1,190 @@ +import 'package:adcom/src/pantallas/finanzas.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class DetallesPago extends StatefulWidget { + late List? list = []; + DetallesPago({Key? key, this.list}) : super(key: key); + + @override + _DetallesPagoState createState() => _DetallesPagoState(); +} + +class _DetallesPagoState extends State { + List mesFormat = []; + List debt = []; + + @override + void initState() { + super.initState(); + sacarMesDeAtrazo(); + totalApagars(); + } + + @override + Widget build(BuildContext context) { + var size = MediaQuery.of(context).size; + return Scaffold( + appBar: AppBar( + title: Text('Detalles de pago'), + backgroundColor: Colors.lightGreen[700], + ), + body: Container( + padding: const EdgeInsets.all(12.0), + child: Column( + children: [ + Row( + children: [ + Container( + padding: EdgeInsets.only(left: 20, top: 10), + child: Text( + 'Cuotas pendietes', + style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold), + ), + ) + ], + ), + SizedBox( + height: size.width / 19, + ), + mesesView(), + Row( + children: [ + Container( + padding: EdgeInsets.only(left: 180, top: 10), + child: Row( + children: [ + Text( + 'Total', + style: TextStyle( + fontSize: 25, fontWeight: FontWeight.bold), + ), + SizedBox( + width: size.width / 25, + ), + Text( + '\$ ${saldoDeudor()}MXN', + style: TextStyle(fontSize: 19), + ) + ], + ), + ) + ], + ) + ], + ), + ), + ); + } + + ListView mesesView() { + return ListView.separated( + shrinkWrap: true, + separatorBuilder: (context, index) { + return Divider( + thickness: 3, + color: Colors.grey[350], + ); + }, + itemCount: mesFormat.length & debt.length, + itemBuilder: (context, int index) { + return Container( + decoration: BoxDecoration(color: Color(0xFFF7F7F9)), + padding: EdgeInsets.only( + top: 10.0, bottom: 20.0, left: 20.0, right: 20.0), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Mantenimiento del mes', + style: TextStyle( + fontSize: 17.0, fontWeight: FontWeight.bold)), + Text('Monto', + style: TextStyle( + fontSize: 17.0, fontWeight: FontWeight.bold)) + ], + ), + SizedBox( + height: 10.0, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(mesFormat[index], + style: + TextStyle(color: Colors.grey[800], fontSize: 14.0)), + Text('${debt[index]}', + style: + TextStyle(color: Colors.grey[800], fontSize: 14.0)) + ], + ), + ], + ), + ); + }); + } + + sacarMesDeAtrazo() { + DateTime? mesesAtrazo; + + for (int i = 0; i < widget.list!.length; i++) { + if (widget.list![i].pago == 1) { + } else { + setState(() { + mesesAtrazo = widget.list![i].fechaGenerada; + }); + mesFormat + .add((DateFormat('MMM').format(DateTime(0, mesesAtrazo!.month)))); + //print(DateFormat('MMM').format(DateTime(0, mesesAtrazo!.month))); + } + } + } + + totalApagars() { + late double total; + double deuda; + + for (int i = 0; i < widget.list!.length; i++) { + total = double.parse(widget.list![i].montoCuota!); + deuda = double.parse(widget.list![i].montoTardio!); + + if (widget.list![i].pago == 1 && widget.list![i].pagoTardio == 0) { + } else { + //si sigue en fecha + if (DateTime.now().day <= widget.list![i].fechaLimite!.day && + DateTime.now().month <= widget.list![i].fechaLimite!.month && + DateTime.now().year <= widget.list![i].fechaLimite!.year) { + //solo monto cuota + debt.add(total); + } else { + //si no esta en fecha añadir deuda extra + total = total + deuda; + debt.add(total); + } + } + } + } + + saldoDeudor() { + double contador = 0.0; + double deuda; + double tardio; + for (int i = 0; i < widget.list!.length; i++) { + deuda = double.parse(widget.list![i].montoCuota!); + tardio = double.parse(widget.list![i].montoTardio!); + if (widget.list![i].pago == 1 && widget.list![i].pagoTardio == 0) { + } else { + if (DateTime.now().day <= widget.list![i].fechaLimite!.day && + DateTime.now().month <= widget.list![i].fechaLimite!.month && + DateTime.now().year <= widget.list![i].fechaLimite!.year) { + } else { + setState(() { + contador += deuda + tardio; + }); + } + } + } + return contador; + } +} diff --git a/lib/src/extra/eventos.dart b/lib/src/extra/eventos.dart index 5343987..2e45184 100644 --- a/lib/src/extra/eventos.dart +++ b/lib/src/extra/eventos.dart @@ -63,7 +63,7 @@ class _CalendarioState extends State { prefs = await SharedPreferences.getInstance(); Uri uri = Uri.parse( - 'http://187.189.53.8:8080/AdcomBackend/backend/web/index.php?r=adcom/get-amenidad-reserva'); + 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/get-amenidad-reserva'); final response = await http.post(uri, body: {"idAmenidad": "${widget.idA}"}); diff --git a/lib/src/extra/opciones_edoCuenta.dart b/lib/src/extra/opciones_edoCuenta.dart index 7ceda36..9ce145a 100644 --- a/lib/src/extra/opciones_edoCuenta.dart +++ b/lib/src/extra/opciones_edoCuenta.dart @@ -65,18 +65,8 @@ class _OpcionesEdoCuentaState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(item, style: TextStyle(fontSize: 16.0)), - InkWell( - onTap: () async { - Printing.layoutPdf(onLayout: (PdfPageFormat format) { - return buildPdf(format); - }); - }, - child: Icon( - Icons.picture_as_pdf_rounded, - size: 30, - ), - ) + Text('Cuota', style: TextStyle(fontSize: 16.0)), + Text('') ], ), SizedBox( diff --git a/lib/src/extra/reporte.dart b/lib/src/extra/reporte.dart index d4a473f..25bc676 100644 --- a/lib/src/extra/reporte.dart +++ b/lib/src/extra/reporte.dart @@ -29,7 +29,7 @@ Future getReportes() async { prefs = await SharedPreferences.getInstance(); var id = prefs!.getInt('id'); Uri url = Uri.parse( - 'http://187.189.53.8:8080/AdcomBackend/backend/web/index.php?r=adcom/get-reportes'); + 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/get-reportes'); final response = await http.post(url, body: {"idResidente": id.toString()}); diff --git a/lib/src/extra/vista_tarjeta.dart b/lib/src/extra/vista_tarjeta.dart index 3495ae4..6dfc746 100644 --- a/lib/src/extra/vista_tarjeta.dart +++ b/lib/src/extra/vista_tarjeta.dart @@ -1,10 +1,13 @@ import 'package:adcom/json/jsonFinanzas.dart'; +import 'package:adcom/src/extra/detalles_pago.dart'; import 'package:adcom/src/extra/more_view_cuota.dart'; +import 'package:adcom/src/extra/referencia_view.dart'; import 'package:adcom/src/models/event_provider.dart'; import 'package:adcom/src/pantallas/finanzas.dart'; import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -19,11 +22,14 @@ class _VistaTarjetaState extends State { VoidCallback? _showPersBottomSheetCallBack; Accounts? cuentas; List mylist = []; + List mesFormat = []; + @override void initState() { super.initState(); _showPersBottomSheetCallBack = _showPersBottomSheetCallBack; data(); + Future.delayed(Duration(seconds: 1), () { setState(() { ultimaDeuda(); @@ -41,247 +47,125 @@ class _VistaTarjetaState extends State { Widget build(BuildContext context) { var size = MediaQuery.of(context).size; var size2 = MediaQuery.of(context).size.width; + return mylist.isEmpty ? SizedBox() - : size.width >= 880 - ? Container( - width: MediaQuery.of(context).size.width, - height: 225, - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.grey, - blurRadius: 6, - offset: Offset(0, 1)) - ], - color: estadodepagoColor(), - borderRadius: BorderRadius.circular(10)), - child: Padding( - padding: const EdgeInsets.only( - left: 20, right: 20, top: 20, bottom: 30), - child: Column( + : Container( + width: MediaQuery.of(context).size.width, + height: 220, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.grey, blurRadius: 6, offset: Offset(0, 1)) + ], + color: estadodepagoColor(), + borderRadius: BorderRadius.circular(10)), + child: Padding( + padding: const EdgeInsets.only( + left: 13, right: 13, top: 13, bottom: 20), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Monto de cuota', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 17), - ), - SizedBox( - height: 5.0, - ), - Text( - '${estadodepago()}', - style: TextStyle( - color: Colors.black, - fontSize: 15, - ), - ) - ], - ), - Container( - height: 40, - child: OutlinedButton( - onPressed: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => MoreViewCuota())); - }, - child: Icon(Icons.add, - size: 25, color: Colors.white), - style: OutlinedButton.styleFrom( - side: BorderSide( - width: 1.0, color: Colors.transparent)), - ), - ) - ], - ), Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '\$ ${ultimaDeuda()}', + 'Monto de cuota', style: TextStyle( color: Colors.white, fontWeight: FontWeight.bold, - fontSize: 28), + fontSize: 15), ), SizedBox( - height: 10, + height: 2.0, ), Text( - mylist.isEmpty - ? 'Pagar antes del día: ' - : 'Pagar antes del día: ${fechadepago()}', + '${estadodepago()}', style: TextStyle( - color: Colors.black, - fontWeight: FontWeight.w400, - fontSize: 14), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - OutlinedButton( - onPressed: () { - _showModalSheet(); - }, - child: Text( - 'Pagar Ahora', - textAlign: TextAlign.center, - style: - TextStyle(color: Colors.white, fontSize: 15), + color: Colors.black, + fontSize: 14, ), - style: OutlinedButton.styleFrom( - side: BorderSide( - width: 1.0, color: Colors.white)), - ), - //Text('|', style: TextStyle(color: Colors.white, fontSize: 15)), - - OutlinedButton( - onPressed: () { - _showAlertDialog(); - }, - child: Text('Detalles', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white, fontSize: 15)), - style: OutlinedButton.styleFrom( - side: BorderSide( - width: 1.0, color: Colors.white)), ) ], + ), + Container( + height: 30, + child: OutlinedButton( + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (_) => RefView())); + }, + child: Icon(Icons.add, size: 25, color: Colors.white), + style: OutlinedButton.styleFrom( + side: BorderSide( + width: 1.0, color: Colors.transparent)), + ), ) ], ), - ), - ) - : Container( - width: MediaQuery.of(context).size.width, - height: 190, - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.grey, - blurRadius: 6, - offset: Offset(0, 1)) - ], - color: estadodepagoColor(), - borderRadius: BorderRadius.circular(10)), - child: Padding( - padding: const EdgeInsets.only( - left: 10, right: 10, top: 10, bottom: 20), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + Column( children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Monto de cuota', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 15), - ), - SizedBox( - height: 2.0, - ), - Text( - '${estadodepago()}', - style: TextStyle( - color: Colors.black, - fontSize: 14, - ), - ) - ], - ), - Container( - height: 30, - child: OutlinedButton( - onPressed: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => MoreViewCuota())); - }, - child: Icon(Icons.add, - size: 25, color: Colors.white), - style: OutlinedButton.styleFrom( - side: BorderSide( - width: 1.0, color: Colors.transparent)), - ), - ) - ], + Text( + '\$ ${saldoDeudor()}', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 28), ), - Column( - children: [ - Text( - '\$ ${ultimaDeuda()}', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 28), - ), - SizedBox( - height: 10, - ), - Text( - mylist.isEmpty - ? 'Pagar antes del día: ' - : 'Pagar antes del día: ${fechadepago()}', - style: TextStyle( - color: Colors.black, - fontWeight: FontWeight.w400, - fontSize: 14), - ), - ], + SizedBox( + height: 10, + ), + Text( + mylist.isEmpty + ? 'Pagar antes del día: ' + : 'Pagar antes del día: ${fechadepago()}', + style: TextStyle( + color: Colors.black, + fontWeight: FontWeight.w400, + fontSize: 14), ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - OutlinedButton( - onPressed: () { - _showModalSheet(); - }, - child: Text( - 'Pagar Ahora', - textAlign: TextAlign.center, - style: - TextStyle(color: Colors.white, fontSize: 14), - ), - style: OutlinedButton.styleFrom( - side: BorderSide( - width: 1.0, color: Colors.white)), - ), - //Text('|', style: TextStyle(color: Colors.white, fontSize: 15)), - - OutlinedButton( - onPressed: () { - _showAlertDialog(size: size2); - }, - child: Text('Detalles', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white, fontSize: 15)), - style: OutlinedButton.styleFrom( - side: BorderSide( - width: 1.0, color: Colors.white)), - ) - ], - ) ], ), - ), - ); + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + OutlinedButton( + onPressed: () { + _showModalSheet(); + }, + child: Text( + 'Pagar Ahora', + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white, fontSize: 14), + ), + style: OutlinedButton.styleFrom( + side: BorderSide(width: 1.0, color: Colors.white)), + ), + //Text('|', style: TextStyle(color: Colors.white, fontSize: 15)), + + OutlinedButton( + onPressed: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => DetallesPago( + list: mylist, + ))); + }, + child: Text('Detalles', + textAlign: TextAlign.center, + style: + TextStyle(color: Colors.white, fontSize: 15)), + style: OutlinedButton.styleFrom( + side: BorderSide(width: 1.0, color: Colors.white)), + ) + ], + ) + ], + ), + ), + ); } void _showModalSheet() { @@ -385,55 +269,37 @@ class _VistaTarjetaState extends State { content: Container( width: size / 20, height: 150, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + Column( children: [ - Text('Mantenimiento', + Text('Cuota', style: TextStyle( fontSize: size / 20, fontWeight: FontWeight.w400, textBaseline: TextBaseline.alphabetic, )), - Text('\$${ultimaDeuda2()}', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - textBaseline: TextBaseline.alphabetic, - )) ], ), SizedBox( height: 12, ), - Row( + /* Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - 'Atraso', - style: TextStyle( - fontSize: 19, - fontWeight: FontWeight.w400, - textBaseline: TextBaseline.alphabetic), - ), - Text('\$${atraso()}', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - textBaseline: TextBaseline.alphabetic, - )) + Column( + children: [Text('${mesesDeAtraso()}')], + ) ], - ), + ), */ SizedBox( height: 15, child: Divider( color: Colors.black, ), ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + Column( children: [ Text( 'Total', @@ -442,7 +308,7 @@ class _VistaTarjetaState extends State { fontWeight: FontWeight.w400, textBaseline: TextBaseline.alphabetic), ), - totalApagars() == null + saldoDeudor() == null ? Text('\$0.0', style: TextStyle( fontSize: 20, @@ -483,6 +349,24 @@ class _VistaTarjetaState extends State { } } + mesesDeAtraso() { + DateTime? mesesAtrazo; + + for (int i = 0; i < mylist.length; i++) { + if (mylist[i].pago == 1) { + } else { + setState(() { + mesesAtrazo = mylist[i].fechaGenerada; + mesFormat + .add((DateFormat('MMM').format(DateTime(0, mesesAtrazo!.month)))); + }); + + print(DateFormat('MMM').format(DateTime(0, mesesAtrazo!.month))); + } + } + return DateFormat('MMM').format(DateTime(0, mesesAtrazo!.month)); + } + ultimaDeuda() { double debe = 0.0; double? monto; @@ -552,6 +436,28 @@ class _VistaTarjetaState extends State { return dia == null ? '' : '$dia/$mes/$year'; } + saldoDeudor() { + double contador = 0.0; + double deuda; + double tardio; + for (int i = 0; i < mylist.length; i++) { + deuda = double.parse(mylist[i].montoCuota!); + tardio = double.parse(mylist[i].montoTardio!); + if (mylist[i].pago == 1 && mylist[i].pagoTardio == 0) { + } else { + if (DateTime.now().day <= mylist[i].fechaLimite!.day && + DateTime.now().month <= mylist[i].fechaLimite!.month && + DateTime.now().year <= mylist[i].fechaLimite!.year) { + } else { + setState(() { + contador += deuda + tardio; + }); + } + } + } + return contador; + } + estadodepago() { String? estado; for (int i = 0; i < mylist.length; i++) { diff --git a/lib/src/methods/emailDashboard.dart b/lib/src/methods/emailDashboard.dart index 30cf9f6..1395948 100644 --- a/lib/src/methods/emailDashboard.dart +++ b/lib/src/methods/emailDashboard.dart @@ -34,10 +34,12 @@ Future getData() async { prefs = await SharedPreferences.getInstance(); var id = prefs!.getInt('id'); + print(id.toString()); + Uri uri = Uri.parse( - 'http://187.189.53.8:8080/AdcomBackend/backend/web/index.php?r=adcom/get-directorio'); + 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/get-directorio'); final response = await http.post(uri, body: { - "params": json.encode({'usuarioId': id}) + "params": json.encode({"usuarioId": id}) }); if (response.statusCode == 200) { diff --git a/lib/src/methods/eventDashboard.dart b/lib/src/methods/eventDashboard.dart index 37bc2c3..6853318 100644 --- a/lib/src/methods/eventDashboard.dart +++ b/lib/src/methods/eventDashboard.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:adcom/json/jsonAmenidades.dart'; import 'package:adcom/src/extra/eventos.dart'; import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_preferences.dart'; @@ -28,11 +29,11 @@ dataOff2(id2, perfil) async { Future amenidades() async { prefs = await SharedPreferences.getInstance(); - var id = prefs!.getInt('idCom'); + var id = prefs!.getInt('idPrimario'); print('?$id'); final Uri url = Uri.parse( - 'http://187.189.53.8:8080/AdcomBackend/backend/web/index.php?r=adcom/get-amenidades'); + 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/get-amenidades'); final response = await http.post(url, body: { "params": json.encode({"usuarioId": id}) }); @@ -72,43 +73,47 @@ class _EventDashboardState extends State { places = (await amenidades())!; var userType = prefs!.getInt('UserType'); - switch (userType) { - case 1: - myList.add( - item2, - ); - break; - case 2: - myList.add( - item1, - ); - break; - default: - } + if (places.data!.isNotEmpty) { + switch (userType) { + case 1: + myList.add( + item2, + ); + break; + case 2: + myList.add( + item1, + ); + break; + default: + } - for (int i = 0; i < places.data!.length; i++) { - myList.add(new Amenidad( - //route: '/screen12', - id: places.data![i].id, - idComu: places.data![i].idCom, - title: places.data![i].amenidadDesc, - route: '/screen12', - subtitle: 'Only residentes', - icon: Icon( - Icons.pool, - size: 30, - color: Colors.deepPurple, - ))); + for (int i = 0; i < places.data!.length; i++) { + myList.add(new Amenidad( + //route: '/screen12', + id: places.data![i].id, + idComu: places.data![i].idCom, + title: places.data![i].amenidadDesc, + route: '/screen12', + subtitle: 'Only residentes', + icon: Icon( + Icons.pool, + size: 30, + color: Colors.deepPurple, + ))); + } + } else { + setState(() { + if (mounted) { + itsTrue = false; + } + }); } } catch (e) { - myList.add(new Amenidad( - error: 'No tiene amenidades', - icon: Icon( - Icons.sms_failed, - color: Colors.red, - ))); setState(() { - itsTrue = false; + if (mounted) { + itsTrue = false; + } }); } } @@ -117,14 +122,19 @@ class _EventDashboardState extends State { void initState() { super.initState(); gtData(); - Future.delayed(Duration(milliseconds: 988), () => {refresh()}); + if (itsTrue == false) { + } else { + Future.delayed(Duration(seconds: 2), () => {refresh()}); + } } refresh() { setState(() { - var size = MediaQuery.of(context).size.width; - var size2 = MediaQuery.of(context).size.height; - viewAmenidades(width: size, heigth: size2); + if (mounted) { + var size = MediaQuery.of(context).size.width; + var size2 = MediaQuery.of(context).size.height; + viewAmenidades(width: size, heigth: size2); + } }); } @@ -134,9 +144,30 @@ class _EventDashboardState extends State { var size2 = MediaQuery.of(context).size.height; return myList.isEmpty ? Center( - child: CircularProgressIndicator( - backgroundColor: Colors.white, - ), + child: itsTrue == false + ? Container( + padding: const EdgeInsets.only(top: 120), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + 'assets/images/zzz.png', + width: 280, + height: 200, + ), + Text( + 'Lo sentimos por el momento no dispone amenidades', + style: TextStyle( + fontSize: 20, + color: Colors.deepPurple, + ), + textAlign: TextAlign.justify, + ) + ], + )) + : CircularProgressIndicator( + backgroundColor: Colors.white, + ), ) : viewAmenidades(width: size, heigth: size2); } diff --git a/lib/src/methods/event_editing_page.dart b/lib/src/methods/event_editing_page.dart index ec94a99..8bae4e6 100644 --- a/lib/src/methods/event_editing_page.dart +++ b/lib/src/methods/event_editing_page.dart @@ -230,7 +230,7 @@ class _EventEditingPageState extends State { }); Response response = await dio.post( - 'http://187.189.53.8:8080/AdcomBackend/backend/web/index.php?r=adcom/reserva-amenidad', + 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/reserva-amenidad', data: formData, onSendProgress: (received, total) { if (total != -1) { print((received / total * 100).toStringAsFixed(0) + '%'); diff --git a/lib/src/methods/gridDashboard.dart b/lib/src/methods/gridDashboard.dart index ac3c0b1..fa9a845 100644 --- a/lib/src/methods/gridDashboard.dart +++ b/lib/src/methods/gridDashboard.dart @@ -1,6 +1,11 @@ +import 'package:adcom/json/jsonAmenidades.dart'; +import 'package:adcom/src/methods/eventDashboard.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +SharedPreferences? prefs; class GridDashboard extends StatefulWidget { final userId; @@ -25,12 +30,13 @@ class _GridDashboardState extends State { )); Items item2 = new Items( - title: 'Proximamente', - //route: '/screen4', - icon: Icon(Icons.announcement_rounded, size: 50, color: Colors.grey)); + title: 'Avisos', + route: '/screen4', + icon: Icon(Icons.announcement_rounded, + size: 50, color: Colors.blueGrey[700])); Items item3 = new Items( - title: 'Proximamente', + title: 'Votaciones', //route: '/screen6', icon: Icon( Icons.book_rounded, @@ -92,17 +98,11 @@ class _GridDashboardState extends State { Widget build(BuildContext context) { switch (widget.userId) { case 1: - myList = [ - item1, - item5, - item4, - - ]; + myList = [item1, item5, item4, item2]; break; case 2: myList = [ - item1, item9, item4, item5, diff --git a/lib/src/models/event_provider.dart b/lib/src/models/event_provider.dart index bb0d8d9..4700efb 100644 --- a/lib/src/models/event_provider.dart +++ b/lib/src/models/event_provider.dart @@ -62,45 +62,63 @@ class EventProvider extends ChangeNotifier { var userd; void login(user, pass, ctx) async { - _loading = false; notifyListeners(); - _loading = true; - await loginAcces(user, pass).then((value) { - var userId; - var post = value; - if (post!.value == 1) { - userId = post.idResidente; - var comId = post.idCom; - userd = post.nombreResidente; - var userType = post.idPerfil; - somData(userd, userType); - obtainId(userType); - accesData(comId, userId); - dataOff2(comId, userType); - dataOff4(comId); - someData(comId, userId); - //Adeudos - dataOff3(userId); - //amenidades - - dataOff5(userId); - - Navigator.pushReplacementNamed(ctx, '/'); + try { + _loading = true; + await loginAcces(user, pass).then((value) { + var userId; + var post = value; + if (post!.value == 1) { + var idPrimario = post.id; + userId = post.idResidente; + var comId = post.idCom; + userd = post.nombreResidente; + var userType = post.idPerfil; + somData(userd, userType); + obtainId(userType); + accesData(comId, userId); + dataOff2(idPrimario, userType); + dataOff4(idPrimario); + someData(comId, userId); + //Adeudos + dataOff3(userId); + //amenidades + + dataOff5(userId); + + Navigator.pushReplacementNamed(ctx, '/'); + } + }); + + _loading = true; + if (userd != null) { + _islogged = true; + pref.setBool('isLoggedIn', true); + notifyListeners(); + } else { + _islogged = false; + notifyListeners(); + } + } catch (e) { + { + HapticFeedback.lightImpact(); + Widget okButton = TextButton( + onPressed: () { + Navigator.of(ctx)..pop(); + }, + child: Text('OK')); + + AlertDialog alert = AlertDialog( + title: Text('Atencion!'), + content: Text('Sus datos son incorrectos, vuelva a introducirlos'), + actions: [okButton], + ); + + showDialog(context: ctx, builder: (_) => alert); } - }); - - _loading = true; - if (userd != null) { - _islogged = true; - pref.setBool('isLoggedIn', true); - notifyListeners(); - } else { - _islogged = false; - notifyListeners(); } - } void loginState() async { diff --git a/lib/src/pantallas/amenidades.dart b/lib/src/pantallas/amenidades.dart index 0d883e9..c8a13c8 100644 --- a/lib/src/pantallas/amenidades.dart +++ b/lib/src/pantallas/amenidades.dart @@ -13,7 +13,7 @@ SharedPreferences? prefs; class Amenidades extends StatefulWidget { final id; - + Amenidades({Key? key, this.id}) : super(key: key); static init() async { prefs = await SharedPreferences.getInstance(); @@ -25,15 +25,15 @@ class Amenidades extends StatefulWidget { dataOff4(id) async { await Amenidades.init(); - prefs!.setInt('id', id); + prefs!.setInt('idPrimario', id); } Future idso() async { prefs = await SharedPreferences.getInstance(); - var id = prefs!.getInt('idCom'); + var id = prefs!.getInt('idPrimario'); final Uri url = Uri.parse( - 'http://187.189.53.8:8080/AdcomBackend/backend/web/index.php?r=adcom/get-amenidades'); + 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/get-amenidades'); final response = await http.post(url, body: { "params": json.encode({"usuarioId": id}) }); @@ -49,17 +49,17 @@ Future idso() async { class _AmenidadesState extends State { gtData() async { + try { + var places = (await idso())!; - try{ - var places = (await idso())!; - - final provider = Provider.of(context, listen: false); - for (int i = 0; i < places.data!.length; i++) { - provider.addAmenidad(new Amenidad(id: places.data![i].id)); - } - }catch(e){ final provider = Provider.of(context, listen: false); - provider.addAmenidad(new Amenidad(error: 'Su comunidad no tiene este servicio')); + for (int i = 0; i < places.data!.length; i++) { + provider.addAmenidad(new Amenidad(id: places.data![i].id)); + } + } catch (e) { + final provider = Provider.of(context, listen: false); + provider.addAmenidad( + new Amenidad(error: 'Su comunidad no tiene este servicio')); } } @@ -72,7 +72,7 @@ class _AmenidadesState extends State { @override Widget build(BuildContext context) { var size = MediaQuery.of(context).size; - + return ChangeNotifierProvider( create: (_) => EventProvider(), child: Scaffold( @@ -81,127 +81,132 @@ class _AmenidadesState extends State { elevation: 6, backgroundColor: Colors.deepPurpleAccent, ), - body: size.width >= 880 ? Stack( - children: [ - Container( - height: size.height * .40, - decoration: BoxDecoration(color: Colors.deepPurpleAccent), - ), - Container( - padding: EdgeInsets.only(top: 95), - alignment: Alignment.topRight, - child: Icon( - Icons.event, - color: Colors.white, - size: 170, - ), - ), - SafeArea( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + body: size.width >= 880 + ? Stack( children: [ - SizedBox( - height: 10, + Container( + height: size.height * .40, + decoration: BoxDecoration(color: Colors.deepPurpleAccent), ), - Text( - "Amenidades", - style: TextStyle( - color: Colors.white, - fontSize: 40, - fontFamily: 'Roboto', - fontWeight: FontWeight.w700), - ), - SizedBox( - height: 25, - ), - Text( - 'Disfruta las ventajas de tu comunidad', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.white, - fontSize: 15), - ), - SizedBox( - height: 35, - ), - SizedBox( - width: size.width * .5, - child: Text( - 'Enterate de la disponibilidad de tus areas recreativas o aparta con tiempo para tus eventos', - style: TextStyle(color: Colors.white, fontSize: size.width >=880?19:17), + Container( + padding: EdgeInsets.only(top: 95), + alignment: Alignment.topRight, + child: Icon( + Icons.event, + color: Colors.white, + size: 170, ), ), - SizedBox( - height:20, - ), - EventDashboard() + SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Text( + "Amenidades", + style: TextStyle( + color: Colors.white, + fontSize: 40, + fontFamily: 'Roboto', + fontWeight: FontWeight.w700), + ), + SizedBox( + height: 25, + ), + Text( + 'Disfruta las ventajas de tu comunidad', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + fontSize: 15), + ), + SizedBox( + height: 35, + ), + SizedBox( + width: size.width * .5, + child: Text( + 'Enterate de la disponibilidad de tus areas recreativas o aparta con tiempo para tus eventos', + style: TextStyle( + color: Colors.white, + fontSize: size.width >= 880 ? 19 : 17), + ), + ), + SizedBox( + height: 20, + ), + EventDashboard() + ], + ), + )) ], - ), - )) - ], - ): Stack( - children: [ - Container( - height: size.height * .40, - decoration: BoxDecoration(color: Colors.deepPurpleAccent), - ), - Container( - padding: EdgeInsets.only(top: 95), - alignment: Alignment.topRight, - child: Icon( - Icons.event, - color: Colors.white, - size: size.width /3, - ), - ), - SafeArea( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + ) + : Stack( children: [ - SizedBox( - height: 5, - ), - Text( - "Amenidades", - style: TextStyle( - color: Colors.white, - fontSize: 40, - fontFamily: 'Roboto', - fontWeight: FontWeight.w700), - ), - SizedBox( - height: 15, + Container( + height: size.height * .40, + decoration: BoxDecoration(color: Colors.deepPurpleAccent), ), - Text( - 'Disfruta las ventajas de tu comunidad', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.white, - fontSize: 15), - ), - SizedBox( - height: 18, - ), - SizedBox( - width: size.width * .5, - child: Text( - 'Enterate de la disponibilidad de tus areas recreativas o aparta con tiempo para tus eventos', - style: TextStyle(color: Colors.white, fontSize: size.width / 20), + Container( + padding: EdgeInsets.only(top: 95), + alignment: Alignment.topRight, + child: Icon( + Icons.event, + color: Colors.white, + size: size.width / 3, ), ), - SizedBox( - height:20, - ), - EventDashboard() + SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 5, + ), + Text( + "Amenidades", + style: TextStyle( + color: Colors.white, + fontSize: 40, + fontFamily: 'Roboto', + fontWeight: FontWeight.w700), + ), + SizedBox( + height: 15, + ), + Text( + 'Disfruta las ventajas de tu comunidad', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + fontSize: 15), + ), + SizedBox( + height: 18, + ), + SizedBox( + width: size.width * .5, + child: Text( + 'Enterate de la disponibilidad de tus areas recreativas o aparta con tiempo para tus eventos', + style: TextStyle( + color: Colors.white, fontSize: size.width / 20), + ), + ), + SizedBox( + height: 20, + ), + EventDashboard() + ], + ), + )) ], ), - )) - ], - ), ), ); } diff --git a/lib/src/pantallas/avisos.dart b/lib/src/pantallas/avisos.dart index 64204b6..537e542 100644 --- a/lib/src/pantallas/avisos.dart +++ b/lib/src/pantallas/avisos.dart @@ -12,12 +12,23 @@ class Avisos extends StatefulWidget { class _AvisosState extends State { bool _requierConsent = true; - + int _selectedIndex = 0; @override void initState() { super.initState(); } + static const List _widgetOptions = [ + Text('Avisos'), + Text('Archivos'), + ]; + + void _onItemTapped(int index) { + setState(() { + _selectedIndex = index; + }); + } + Future? initStatePlatform() async { if (!mounted) return; @@ -47,67 +58,94 @@ class _AvisosState extends State { Widget build(BuildContext context) { var size = MediaQuery.of(context).size; return Scaffold( - appBar: AppBar( - elevation: 0.0, - backgroundColor: Colors.blueGrey[700], - ), - resizeToAvoidBottomInset: false, - body: Stack( - children: [ - Container( - height: size.height * .40, - decoration: BoxDecoration(color: Colors.blueGrey[700]), - ), - Container( - padding: EdgeInsets.only(top: 75), - alignment: Alignment.topRight, - child: Icon( - Icons.announcement_rounded, - color: Colors.white, - size: 180, + appBar: AppBar( + elevation: 3.0, + backgroundColor: Colors.blueGrey[700], + ), + resizeToAvoidBottomInset: false, + body: Stack( + children: [ + Container( + height: size.height * .20, + decoration: BoxDecoration(color: Colors.blueGrey[700]), ), - ), - SafeArea( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Avisos", - style: TextStyle( - color: Colors.white, - fontSize: 40, - fontFamily: 'Roboto', - fontWeight: FontWeight.w700), - ), - SizedBox( - height: 10, - ), - Text( - 'Comunicados de la comunidad', - style: TextStyle( - fontWeight: FontWeight.bold, color: Colors.white), - ), - SizedBox( - height: 10, - ), - SizedBox( - width: size.width * .6, - child: Text( - 'Enterate de lo que sucede en tu comunidad! Desde recordatorios, alertas, novedades y más.', - style: TextStyle(color: Colors.white), + Container( + padding: EdgeInsets.only(top: 30, right: 30), + alignment: Alignment.topRight, + child: Icon( + Icons.announcement_rounded, + color: Colors.white, + size: size.width / 4, + ), + ), + SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: size.width / 50, ), - ), - SizedBox( - width: size.width * .5, - child: SearchBar(), - ), - ], + Text( + "Avisos", + style: TextStyle( + color: Colors.white, + fontSize: 40, + fontFamily: 'Roboto', + fontWeight: FontWeight.w700), + ), + SizedBox( + height: 10, + ), + Text( + 'Comunicados de la comunidad', + style: TextStyle( + fontWeight: FontWeight.bold, color: Colors.white), + ), + SizedBox( + height: 10, + ), + SizedBox( + width: size.width * .6, + child: Text( + 'Enterate de lo que sucede en tu comunidad! Desde recordatorios, alertas, novedades y más.', + style: TextStyle(color: Colors.white), + ), + ), + ], + ), + )) + ], + ), + bottomNavigationBar: BottomNavigationBar( + items: [ + BottomNavigationBarItem( + icon: Icon(Icons.announcement_rounded), + label: 'Avisos', + backgroundColor: Colors.red, + ), + BottomNavigationBarItem( + icon: Icon(Icons.file_present), + label: 'Archivos', + backgroundColor: Colors.green, ), - )) - ], - ), - ); + ], + elevation: 5, + currentIndex: _selectedIndex, + selectedItemColor: Colors.blueGrey[700], + onTap: _onItemTapped, + ), + floatingActionButton: FloatingActionButton( + elevation: 5, + backgroundColor: Colors.blueGrey[700], + onPressed: () {}, + tooltip: 'add post', + child: const Icon( + Icons.add, + ), + ), + floatingActionButtonLocation: + FloatingActionButtonLocation.centerDocked); } } diff --git a/lib/src/pantallas/finanzas.dart b/lib/src/pantallas/finanzas.dart index fbaafcf..9a83e22 100644 --- a/lib/src/pantallas/finanzas.dart +++ b/lib/src/pantallas/finanzas.dart @@ -38,7 +38,7 @@ Future getAdeudos() async { var id = prefs!.getInt('idUser'); final Uri url = Uri.parse( - 'http://187.189.53.8:8080/AdcomBackend/backend/web/index.php?r=adcom/get-adeudos'); + 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/get-adeudos'); final response = await http.post(url, body: { "params": json.encode({"usuarioId": id}) }); @@ -59,27 +59,30 @@ class _FinanzasState extends State { int? idComu; var montoCuota; Timer? timer; - List estado = []; VoidCallback? _showPersBottomSheetCallBack; RefreshController _refreshController = RefreshController(initialRefresh: false); data() async { - cuentas = - await getAdeudos().onError((error, stackTrace) => errorLoSiento()); - + cuentas = await getAdeudos(); + final provider = Provider.of(context, listen: false); if (cuentas!.value == 1) { for (int i = 0; i < cuentas!.data!.length; i++) { + provider.addDeudas(DatosCuenta( + referencia: cuentas!.data![i].referencia, + )); + localList.add(new DatosCuenta( idComu: cuentas!.data![i].idComu, montoCuota: cuentas!.data![i].montoCuota, fechaGenerada: cuentas!.data![i].fechaGeneracion!, fechaLimite: cuentas!.data![i].fechaLimite!, fechaPago: cuentas!.data![i].fechaPago, + referencia: cuentas!.data![i].referencia, pago: cuentas!.data![i].pago)); } - estado.add(EstadoCuenta()); - estado.add(VistaTarjeta()); + } else { + errorLoSiento(); } } @@ -118,73 +121,134 @@ class _FinanzasState extends State { backgroundColor: Colors.lightGreen[700], ), resizeToAvoidBottomInset: false, - body: SmartRefresher( - controller: _refreshController, - enablePullDown: true, - header: WaterDropHeader(), - onRefresh: _onRefresh, - onLoading: _onLoading, - footer: ClassicFooter( - loadStyle: LoadStyle.ShowWhenLoading, - completeDuration: Duration(milliseconds: 500), - ), - child: size.width >= 880 - ? Stack( - children: [ - Container( - height: size.height * .35, - decoration: BoxDecoration(color: Colors.lightGreen[700]), + body: size.width >= 880 + ? Stack( + children: [ + Container( + height: size.height * .35, + decoration: BoxDecoration(color: Colors.lightGreen[700]), + ), + Container( + padding: EdgeInsets.only(top: 80), + alignment: Alignment.topRight, + child: Icon( + Icons.show_chart_rounded, + size: 190, + color: Colors.white, ), - Container( - padding: EdgeInsets.only(top: 80), - alignment: Alignment.topRight, - child: Icon( - Icons.show_chart_rounded, - size: 190, - color: Colors.white, + ), + SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 12, + ), + Text( + 'Mis Pagos', + style: TextStyle( + color: Colors.white, + fontSize: 40, + fontFamily: 'Roboto', + fontWeight: FontWeight.w700), + ), + SizedBox( + height: size.width >= 880 ? 25 : 20, + ), + Text( + 'Toma el control de tus gastos', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + fontSize: 16), + ), + SizedBox( + height: size.width >= 880 ? 35 : 23, + ), + SizedBox( + width: size.width * .6, + child: Text( + 'Mantente actualizado revisando tus estados de cuenta y adeudos pendientes.', + style: + TextStyle(color: Colors.white, fontSize: 19), + ), + ), + Container( + padding: EdgeInsets.only( + top: size.width >= 880 ? 45 : 25, + left: size.width >= 880 ? 5 : 0, + right: size.width >= 880 ? 5 : 0), + child: localList.isEmpty + ? Center( + child: CircularProgressIndicator(), + ) + : mainView()) + ], ), ), - SafeArea( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: Column( + ), + ], + ) + : Stack( + children: [ + Container( + height: size.height * .35, + decoration: BoxDecoration(color: Colors.lightGreen[700]), + ), + Container( + padding: EdgeInsets.only(top: size.height / 12), + alignment: Alignment.topRight, + child: Icon( + Icons.show_chart_rounded, + size: size.width / 2, + color: Colors.white, + ), + ), + SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: ListView(shrinkWrap: true, children: [ + Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - height: 12, + height: size.width / 20, ), Text( 'Mis Pagos', style: TextStyle( color: Colors.white, - fontSize: 40, + fontSize: 30, fontFamily: 'Roboto', fontWeight: FontWeight.w700), ), SizedBox( - height: size.width >= 880 ? 25 : 20, + height: size.width / 19, ), Text( 'Toma el control de tus gastos', style: TextStyle( fontWeight: FontWeight.bold, color: Colors.white, - fontSize: 16), + fontSize: 17), ), SizedBox( - height: size.width >= 880 ? 35 : 23, + height: size.width / 20, ), SizedBox( width: size.width * .6, child: Text( 'Mantente actualizado revisando tus estados de cuenta y adeudos pendientes.', style: TextStyle( - color: Colors.white, fontSize: 19), + color: Colors.white, + fontSize: size.width / 21), ), ), Container( padding: EdgeInsets.only( - top: size.width >= 880 ? 45 : 25, + top: size.width / 10, left: size.width >= 880 ? 5 : 0, right: size.width >= 880 ? 5 : 0), child: localList.isEmpty @@ -194,83 +258,11 @@ class _FinanzasState extends State { : mainView()) ], ), - ), + ]), ), - ], - ) - : Stack( - children: [ - Container( - height: size.height * .35, - decoration: BoxDecoration(color: Colors.lightGreen[700]), - ), - Container( - padding: EdgeInsets.only(top: size.height / 12), - alignment: Alignment.topRight, - child: Icon( - Icons.show_chart_rounded, - size: size.width / 2, - color: Colors.white, - ), - ), - SafeArea( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: ListView(shrinkWrap: true, children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: size.width / 20, - ), - Text( - 'Mis Pagos', - style: TextStyle( - color: Colors.white, - fontSize: 30, - fontFamily: 'Roboto', - fontWeight: FontWeight.w700), - ), - SizedBox( - height: size.width / 19, - ), - Text( - 'Toma el control de tus gastos', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.white, - fontSize: 17), - ), - SizedBox( - height: size.width / 20, - ), - SizedBox( - width: size.width * .6, - child: Text( - 'Mantente actualizado revisando tus estados de cuenta y adeudos pendientes.', - style: TextStyle( - color: Colors.white, - fontSize: size.width / 21), - ), - ), - Container( - padding: EdgeInsets.only( - top: size.width / 10, - left: size.width >= 880 ? 5 : 0, - right: size.width >= 880 ? 5 : 0), - child: localList.isEmpty - ? Center( - child: CircularProgressIndicator(), - ) - : mainView()) - ], - ), - ]), - ), - ), - ], - ), - )); + ), + ], + )); } mainView() { @@ -280,42 +272,12 @@ class _FinanzasState extends State { InkWell( onTap: () { HapticFeedback.mediumImpact(); - Navigator.of(context) - .push(MaterialPageRoute(builder: (_) => RefView())); }, child: VistaTarjeta()), - SizedBox( - height: 15, - ), - InkWell( - onTap: () { - HapticFeedback.mediumImpact(); - Navigator.of(context) - .push(MaterialPageRoute(builder: (_) => OpcionesEdoCuenta())); - }, - child: EstadoCuenta()), ], ); } - void _onRefresh() async { - // monitor network fetch - await Future.delayed(Duration(milliseconds: 1000), () {}); - // if failed,use refreshFailed() - //getAdeudos(); - _refreshController.refreshCompleted(); - } - - void _onLoading() async { - // monitor network fetch - await Future.delayed(Duration(milliseconds: 1000), () => {}); - // if failed,use loadFailed(),if no data return,use LoadNodata() - Finanzas(); - if (mounted) setState(() {}); - - _refreshController.loadComplete(); - } - referenciaApagar() { final deudas = Provider.of(context, listen: false).deudas; @@ -360,6 +322,7 @@ class _EstadoCuentaState extends State { fechaGenerada: cuentas!.data![i].fechaGeneracion!, fechaLimite: cuentas!.data![i].fechaLimite!, fechaPago: cuentas!.data![i].fechaPago, + referencia: cuentas!.data![i].referencia, pago: cuentas!.data![i].pago!)); } } @@ -370,8 +333,7 @@ class _EstadoCuentaState extends State { data(); Future.delayed(Duration(seconds: 1), () { setState(() { - saldoDeudor(); - cuantoDebe(); + ultimaDeuda(); }); }); } @@ -379,206 +341,148 @@ class _EstadoCuentaState extends State { @override Widget build(BuildContext context) { var size = MediaQuery.of(context).size; - return size.width >= 880 - ? Container( - width: MediaQuery.of(context).size.width, - height: 180, - decoration: BoxDecoration(boxShadow: [ - BoxShadow(color: Colors.grey, blurRadius: 6, offset: Offset(0, 1)) - ], color: Colors.white, borderRadius: BorderRadius.circular(10)), - child: Padding( - padding: const EdgeInsets.only( - left: 20, right: 20, top: 20, bottom: 30), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Estado de cuenta', - style: TextStyle( - color: Colors.black, - fontWeight: FontWeight.bold, - fontSize: 16), - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Text('Información Actualizada:'), - SizedBox( - width: size.width >= 880 ? 100 : 50, - ), - Text( - '${DateTime.now().day}/${DateTime.now().month}/${DateTime.now().year}', - style: TextStyle(fontWeight: FontWeight.bold), - ) - ], - ) - ], - ), - ], - ), - Row( - children: [ - Expanded( - child: InkWell( - child: Text( - '¿Cuánto debo?', - textAlign: TextAlign.center, - style: TextStyle(color: Colors.black), - ), - )), - Text('|', style: TextStyle(color: Colors.black)), - Expanded( - child: InkWell( - onTap: () { - HapticFeedback.mediumImpact(); - }, - child: Text('Cuotas de atraso', - textAlign: TextAlign.center, - style: TextStyle(color: Colors.black)), - )) - ], - ), - Row( - children: [ - Expanded( - child: Center( - child: Text( - '\$ ${saldoDeudor()} MXN', - style: TextStyle( - color: Colors.black, - fontWeight: FontWeight.bold, - fontSize: 20), - ), - ), - ), - SizedBox( - width: 30, - ), - Expanded( - child: Center( - child: Text( - '${cuantoDebe()}', + return Container( + width: MediaQuery.of(context).size.width, + height: 175, + decoration: BoxDecoration(boxShadow: [ + BoxShadow(color: Colors.grey, blurRadius: 6, offset: Offset(0, 1)) + ], color: Colors.white, borderRadius: BorderRadius.circular(10)), + child: Padding( + padding: + const EdgeInsets.only(left: 13, right: 13, top: 10, bottom: 20), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Estado de cuenta', + style: TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: 13), + ), + SizedBox( + height: 5, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Text( + 'Información Actualizada:', style: TextStyle( - fontSize: 20, fontWeight: FontWeight.bold), + fontSize: size.width / 28, + fontWeight: FontWeight.bold), ), - )) - ], - ), - ], - ), + SizedBox( + width: size.width * .19, + ), + Text( + '${DateTime.now().day}/${DateTime.now().month}/${DateTime.now().year}', + style: TextStyle(fontWeight: FontWeight.bold), + ) + ], + ) + ], + ), + ], ), - ) - : Container( - width: MediaQuery.of(context).size.width, - height: 170, - decoration: BoxDecoration(boxShadow: [ - BoxShadow(color: Colors.grey, blurRadius: 6, offset: Offset(0, 1)) - ], color: Colors.white, borderRadius: BorderRadius.circular(10)), - child: Padding( - padding: const EdgeInsets.only( - left: 11, right: 11, top: 10, bottom: 20), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Estado de cuenta', - style: TextStyle( - color: Colors.black, - fontWeight: FontWeight.bold, - fontSize: 13), - ), - SizedBox( - height: 5, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Text( - 'Información Actualizada:', - style: TextStyle( - fontSize: size.width / 28, - fontWeight: FontWeight.bold), - ), - SizedBox( - width: size.width * .13, - ), - Text( - '${DateTime.now().day}/${DateTime.now().month}/${DateTime.now().year}', - style: TextStyle(fontWeight: FontWeight.bold), - ) - ], - ) - ], - ), - ], + Row( + children: [ + Expanded( + child: InkWell( + child: Text( + 'Ultimo mes', + textAlign: TextAlign.center, + style: TextStyle(color: Colors.black), ), - Row( - children: [ - Expanded( - child: InkWell( - child: Text( - '¿Cuánto debo?', - textAlign: TextAlign.center, - style: TextStyle(color: Colors.black), - ), - )), - Text('|', style: TextStyle(color: Colors.black)), - Expanded( - child: InkWell( - onTap: () { - HapticFeedback.mediumImpact(); - }, - child: Text('Cuotas de atraso', - textAlign: TextAlign.center, - style: TextStyle(color: Colors.black)), - )) - ], + )), + Text('|', style: TextStyle(color: Colors.black)), + Expanded( + child: InkWell( + onTap: () { + HapticFeedback.mediumImpact(); + }, + child: Text('Fecha limite de pago', + textAlign: TextAlign.center, + style: TextStyle(color: Colors.black)), + )) + ], + ), + Row( + children: [ + Expanded( + child: Center( + child: Text( + '\$${ultimaDeuda()}MXN', + style: TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: size.width / 17), + ), ), - Row( - children: [ - Expanded( - child: Center( - child: Text( - '\$${saldoDeudor()}MXN', - style: TextStyle( - color: Colors.black, - fontWeight: FontWeight.bold, - fontSize: size.width / 17), - ), - ), - ), - SizedBox( - width: 20, - ), - Expanded( - child: Center( - child: Text( - '${cuantoDebe()}', - style: TextStyle( - fontSize: 20, fontWeight: FontWeight.bold), - ), - )) - ], + ), + SizedBox( + width: 20, + ), + Expanded( + child: Center( + child: Text( + '${fechadepago()}', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), - ], - ), + )) + ], ), - ); + ], + ), + ), + ); + } + + ultimaDeuda() { + double debe = 0.0; + double? monto; + int? total; + for (int i = 0; i < mylist.length; i++) { + monto = double.parse(mylist[i].montoCuota!); + if (mylist[i].pago == 1 && mylist[i].pagoTardio == 0) { + } else { + if (DateTime.now().day <= mylist[i].fechaLimite!.day && + DateTime.now().month <= mylist[i].fechaLimite!.month && + DateTime.now().year <= mylist[i].fechaLimite!.year) { + return debe = monto; + } else { + if (mylist[i].pagoTardio == 0 || mylist[i].pagoTardio == null) { + return debe = monto; + } else { + total = int.parse(mylist[i].montoTardio!); + print('${total}'); + return debe = monto + total; + } + } + } + } + return debe == 0.0 ? '0.0' : debe; + } + + referenciaApagar() { + String? ref; + for (int i = 0; i < mylist.length; i++) { + if (mylist[i].pago == 1 && mylist[i].pagoTardio == 0) { + print('no debe'); + } else { + setState(() { + ref = mylist[i].referencia!; + }); + return ref == null ? " " : ref; + } + } + return ref == null ? " " : ref; } //te dice cuanto dinero debe @@ -602,8 +506,28 @@ class _EstadoCuentaState extends State { return contador; } + fechadepago() { + int? dia; + int? mes; + int? year; + for (int i = 0; i < mylist.length; i++) { + if (mylist[i].pago == 1) { + print('no debe'); + } else { + setState(() { + dia = mylist[i].fechaLimite!.day; + mes = mylist[i].fechaLimite!.month; + year = mylist[i].fechaLimite!.year; + }); + return dia == null ? '' : '$dia/$mes/$year'; + } + } + + return dia == null ? '' : '$dia/$mes/$year'; + } + //te dice cuantos meses debe - cuantoDebe() { + /* cuantoDebe() { int contador = 0; for (int i = 0; i < mylist.length; i++) { if (mylist[i].pago == 1) { @@ -619,7 +543,7 @@ class _EstadoCuentaState extends State { } } return contador.toString(); - } + } */ } // ignore: must_be_immutable diff --git a/lib/src/pantallas/loginPage.dart b/lib/src/pantallas/loginPage.dart index 64cdabf..2c261ef 100644 --- a/lib/src/pantallas/loginPage.dart +++ b/lib/src/pantallas/loginPage.dart @@ -25,7 +25,7 @@ class LoginPage extends StatefulWidget { Future loginAcces(String user, String pass) async { final Uri uri = Uri.parse( - 'http://187.189.53.8:8080/AdcomBackend/backend/web/index.php?r=adcom/login'); + 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/login'); final response = await http.post(uri, body: { "params": jsonEncode({'username': user, 'password': pass}), }); diff --git a/lib/src/pantallas/mainMenu.dart b/lib/src/pantallas/mainMenu.dart index 73f9741..d70e0f1 100644 --- a/lib/src/pantallas/mainMenu.dart +++ b/lib/src/pantallas/mainMenu.dart @@ -1,3 +1,5 @@ +import 'package:adcom/json/jsonAmenidades.dart'; +import 'package:adcom/src/methods/eventDashboard.dart'; import 'package:adcom/src/methods/gridDashboard.dart'; import 'package:adcom/src/models/event_provider.dart'; import 'package:flutter/material.dart'; @@ -29,6 +31,8 @@ somData(user, userType) async { class _MainMenuState extends State { var user; int? userType; + bool entrada = true; + Places? acceso; userName() async { prefs = await SharedPreferences.getInstance(); @@ -169,7 +173,7 @@ class _MainMenuState extends State { //no mover SizedBox( height: size.height >= 640 - ? size.height / 6 + ? size.height / 6.5 : size.height / 10, ), ], From d3b6a370534c0acdc2547dd5ec4154a6b0edcd6e Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Wed, 25 Aug 2021 08:41:51 -0600 Subject: [PATCH 04/20] subida de version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 307bd91..efbc069 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.0.93+12 +version: 2.1.0+13 environment: sdk: ">=2.12.0 <3.0.0" From df69d221bbd59f172777f0f7b17c611c8e979fa2 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Sat, 28 Aug 2021 14:02:04 -0600 Subject: [PATCH 05/20] cambios --- .../main/res/xml/network_security_config.xml | 2 +- assets/images/magic.png | Bin 0 -> 95161 bytes lib/json/jsonReporte.dart | 82 +++++- lib/src/extra/add_reporte.dart | 2 +- lib/src/extra/dashboard_Avisos.dart | 119 ++++++++ lib/src/extra/detalles_pago.dart | 37 ++- lib/src/extra/eventos.dart | 2 +- lib/src/extra/nuevo_post.dart | 147 ++++++++++ lib/src/extra/referencia_view.dart | 13 +- lib/src/extra/report_edit_page.dart | 40 ++- lib/src/extra/reporte.dart | 51 +++- lib/src/extra/vista_tarjeta.dart | 27 +- lib/src/methods/emailDashboard.dart | 2 +- lib/src/methods/eventDashboard.dart | 7 +- lib/src/methods/event_editing_page.dart | 2 +- lib/src/methods/gridDashboard.dart | 4 +- lib/src/models/event_provider.dart | 3 +- lib/src/pantallas/amenidades.dart | 174 ++++------- lib/src/pantallas/avisos.dart | 33 +-- lib/src/pantallas/finanzas.dart | 270 +++++++----------- lib/src/pantallas/loginPage.dart | 7 +- lib/src/pantallas/mainMenu.dart | 198 ++++--------- pubspec.lock | 7 + pubspec.yaml | 5 +- 24 files changed, 713 insertions(+), 521 deletions(-) create mode 100644 assets/images/magic.png create mode 100644 lib/src/extra/dashboard_Avisos.dart create mode 100644 lib/src/extra/nuevo_post.dart diff --git a/android/app/src/main/res/xml/network_security_config.xml b/android/app/src/main/res/xml/network_security_config.xml index ef2087c..ce7a1bc 100644 --- a/android/app/src/main/res/xml/network_security_config.xml +++ b/android/app/src/main/res/xml/network_security_config.xml @@ -1,7 +1,7 @@ - http://187.189.53.8:8080 + http://187.189.53.8:8081 http://192.168.1.178/AdcomBackend/backend/web/index.php?r=adcom/get-directorio http://187.197.53.8/AdcomBackend/backend/web/index.php?r=adcom/get-directorio diff --git a/assets/images/magic.png b/assets/images/magic.png new file mode 100644 index 0000000000000000000000000000000000000000..7c68070269af8576a6750796ce8ffb0c3ce01bf1 GIT binary patch literal 95161 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

iW5)UPQQhPM*r-rpAtmf$~@H^~+ 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 aeN>RY)Y8yXFHpVv;(q}MeXf`Q literal 0 HcmV?d00001 diff --git a/lib/json/jsonReporte.dart b/lib/json/jsonReporte.dart index 8dd824f..183d0ee 100644 --- a/lib/json/jsonReporte.dart +++ b/lib/json/jsonReporte.dart @@ -21,15 +21,19 @@ class GetReportes { List? data; factory GetReportes.fromJson(Map json) => GetReportes( - value: json["value"], - message: json["message"], - data: List.from(json["data"].map((x) => Datum.fromJson(x))), + value: json["value"] == null ? null : json["value"], + message: json["message"] == null ? null : json["message"], + data: json["data"] == null + ? null + : List.from(json["data"].map((x) => Datum.fromJson(x))), ); Map toJson() => { - "value": value, - "message": message, - "data": List.from(data!.map((x) => x.toJson())), + "value": value == null ? null : value, + "message": message == null ? null : message, + "data": data == null + ? null + : List.from(data!.map((x) => x.toJson())), }; } @@ -39,24 +43,74 @@ class Datum { this.descDesperfecto, this.fechaRep, this.evidencia, + this.progreso, + this.idReporte, }); String? descCorta; String? descDesperfecto; DateTime? fechaRep; List? evidencia; + List? progreso; + int? idReporte; factory Datum.fromJson(Map json) => Datum( - descCorta: json["DESC_CORTA"], - descDesperfecto: json["DESC_DESPERFECTO"], - fechaRep: DateTime.parse(json["FECHA_REP"]), - evidencia: List.from(json["EVIDENCIA"].map((x) => x)), + descCorta: json["DESC_CORTA"] == null ? null : json["DESC_CORTA"], + descDesperfecto: + json["DESC_DESPERFECTO"] == null ? null : json["DESC_DESPERFECTO"], + fechaRep: json["FECHA_REP"] == null + ? null + : DateTime.parse(json["FECHA_REP"]), + evidencia: json["EVIDENCIA"] == null + ? null + : List.from(json["EVIDENCIA"].map((x) => x)), + progreso: json["PROGRESO"] == null + ? null + : List.from( + json["PROGRESO"].map((x) => Progreso.fromJson(x))), + idReporte: json["ID_REPORTE"] == null ? null : json["ID_REPORTE"], ); Map toJson() => { - "DESC_CORTA": descCorta, - "DESC_DESPERFECTO": descDesperfecto, - "FECHA_REP": fechaRep!.toIso8601String(), - "EVIDENCIA": List.from(evidencia!.map((x) => x)), + "DESC_CORTA": descCorta == null ? null : descCorta, + "DESC_DESPERFECTO": descDesperfecto == null ? null : descDesperfecto, + "FECHA_REP": fechaRep == null ? null : fechaRep!.toIso8601String(), + "EVIDENCIA": evidencia == null + ? null + : List.from(evidencia!.map((x) => x)), + "PROGRESO": progreso == null + ? null + : List.from(progreso!.map((x) => x.toJson())), + "ID_REPORTE": idReporte == null ? null : idReporte, + }; +} + +class Progreso { + Progreso({ + this.fechaSeg, + this.comentario, + this.progreso, + this.idProgreso, + }); + + DateTime? fechaSeg; + String? comentario; + String? progreso; + int? idProgreso; + + factory Progreso.fromJson(Map json) => Progreso( + fechaSeg: json["FECHA_SEG"] == null + ? null + : DateTime.parse(json["FECHA_SEG"]), + comentario: json["COMENTARIO"] == null ? null : json["COMENTARIO"], + progreso: json["PROGRESO"] == null ? null : json["PROGRESO"], + idProgreso: json["ID_PROGRESO"] == null ? null : json["ID_PROGRESO"], + ); + + Map toJson() => { + "FECHA_SEG": fechaSeg == null ? null : fechaSeg!.toIso8601String(), + "COMENTARIO": comentario == null ? null : comentario, + "PROGRESO": progreso == null ? null : progreso, + "ID_PROGRESO": idProgreso == null ? null : idProgreso, }; } diff --git a/lib/src/extra/add_reporte.dart b/lib/src/extra/add_reporte.dart index ddb7d84..d4b7989 100644 --- a/lib/src/extra/add_reporte.dart +++ b/lib/src/extra/add_reporte.dart @@ -355,7 +355,7 @@ class _AddReorteState extends State { }); Response response = await dio.post( - 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/reportes', + 'http://187.189.53.8:8081/backend/web/index.php?r=adcom/reportes', data: formdata2, onSendProgress: (received, total) { if (total != 1) { print((received / total * 100).toStringAsFixed(0) + '%'); diff --git a/lib/src/extra/dashboard_Avisos.dart b/lib/src/extra/dashboard_Avisos.dart new file mode 100644 index 0000000..b8b0ae6 --- /dev/null +++ b/lib/src/extra/dashboard_Avisos.dart @@ -0,0 +1,119 @@ +import 'package:flutter/material.dart'; + +import 'package:glyphicon/glyphicon.dart'; + +class AvisosDashboard extends StatefulWidget { + AvisosDashboard({Key? key}) : super(key: key); + + @override + _AvisosDashboardState createState() => _AvisosDashboardState(); +} + +class _AvisosDashboardState extends State { + List list = []; + + @override + Widget build(BuildContext context) { + var size = MediaQuery.of(context).size; + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + border: Border.all(color: Color(0xFF455A64).withOpacity(0.3))), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.only(top: 10, left: 10), + child: Row( + children: [ + Container( + height: 51, + width: size.width / 9, + decoration: BoxDecoration( + color: Colors.grey[300], shape: BoxShape.circle), + child: Image.asset('assets/images/logo.png'), + ), + SizedBox( + width: size.width / 45, + ), + Text( + 'Administrador', + style: (TextStyle(fontSize: 16, fontWeight: FontWeight.w500)), + ) + ], + ), + ), + Divider( + color: Color(0xFF455A64).withOpacity(0.3), + ), + Container( + padding: EdgeInsets.only(left: 10, right: 10), + child: Column( + children: [ + Text( + 'Comunicado! aviso a los residentes que esta semana se cobrara la reparacion del acueducto que se vera reflejadon en sus aplicaciones si tienen dudas pedir detalles a los administradores muchas gracias!', + style: TextStyle(fontSize: 20), + ), + SizedBox( + height: 15, + ), + Row( + children: [ + Container( + padding: const EdgeInsets.only(left: 15), + child: Text( + 'Archivo.txt', + style: TextStyle(fontSize: 20), + ), + ), + SizedBox( + width: 15, + ), + Icon(Glyphicon.download) + ], + ) + ], + ), + ), + Divider( + color: Color(0xFF455A64).withOpacity(0.3), + ), + Container( + padding: EdgeInsets.only(left: 18), + child: Row( + children: [ + Icon(Glyphicon.heart), + SizedBox( + width: 5, + ), + Container( + padding: EdgeInsets.only(bottom: 3), + child: Text('Likes 20')) + ], + )), + SizedBox( + height: 5, + ) + ], + ), + ); + } + + viewAvisos() { + return Flexible( + child: GridView.builder( + padding: EdgeInsets.only(), + itemCount: list.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 1, + childAspectRatio: 3.9, + crossAxisSpacing: 15, + mainAxisSpacing: 15, + ), + itemBuilder: (_, int data) { + return Container(); + })); + } +} + +class Avisos {} diff --git a/lib/src/extra/detalles_pago.dart b/lib/src/extra/detalles_pago.dart index ad8cb0d..3c558d8 100644 --- a/lib/src/extra/detalles_pago.dart +++ b/lib/src/extra/detalles_pago.dart @@ -149,16 +149,21 @@ class _DetallesPagoState extends State { total = double.parse(widget.list![i].montoCuota!); deuda = double.parse(widget.list![i].montoTardio!); - if (widget.list![i].pago == 1 && widget.list![i].pagoTardio == 0) { + if (widget.list![i].pago == 1) { } else { //si sigue en fecha - if (DateTime.now().day <= widget.list![i].fechaLimite!.day && - DateTime.now().month <= widget.list![i].fechaLimite!.month && - DateTime.now().year <= widget.list![i].fechaLimite!.year) { - //solo monto cuota - debt.add(total); + if (widget.list![i].pagoTardio == 0) { + if (DateTime.now().day <= widget.list![i].fechaLimite!.day && + DateTime.now().month <= widget.list![i].fechaLimite!.month && + DateTime.now().year <= widget.list![i].fechaLimite!.year) { + //solo monto cuota + debt.add(total); + } else { + //si no esta en fecha añadir deuda extra + total = total + deuda; + debt.add(total); + } } else { - //si no esta en fecha añadir deuda extra total = total + deuda; debt.add(total); } @@ -173,11 +178,21 @@ class _DetallesPagoState extends State { for (int i = 0; i < widget.list!.length; i++) { deuda = double.parse(widget.list![i].montoCuota!); tardio = double.parse(widget.list![i].montoTardio!); - if (widget.list![i].pago == 1 && widget.list![i].pagoTardio == 0) { + if (widget.list![i].pago == 1) { + contador; } else { - if (DateTime.now().day <= widget.list![i].fechaLimite!.day && - DateTime.now().month <= widget.list![i].fechaLimite!.month && - DateTime.now().year <= widget.list![i].fechaLimite!.year) { + if (widget.list![i].pagoTardio == 0) { + if (DateTime.now().day <= widget.list![i].fechaLimite!.day && + DateTime.now().month <= widget.list![i].fechaLimite!.month && + DateTime.now().year <= widget.list![i].fechaLimite!.year) { + setState(() { + contador += deuda; + }); + } else { + setState(() { + contador += deuda + tardio; + }); + } } else { setState(() { contador += deuda + tardio; diff --git a/lib/src/extra/eventos.dart b/lib/src/extra/eventos.dart index 2e45184..2760e27 100644 --- a/lib/src/extra/eventos.dart +++ b/lib/src/extra/eventos.dart @@ -63,7 +63,7 @@ class _CalendarioState extends State { prefs = await SharedPreferences.getInstance(); Uri uri = Uri.parse( - 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/get-amenidad-reserva'); + 'http://187.189.53.8:8081/backend/web/index.php?r=adcom/get-amenidad-reserva'); final response = await http.post(uri, body: {"idAmenidad": "${widget.idA}"}); diff --git a/lib/src/extra/nuevo_post.dart b/lib/src/extra/nuevo_post.dart new file mode 100644 index 0000000..2b832eb --- /dev/null +++ b/lib/src/extra/nuevo_post.dart @@ -0,0 +1,147 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:glyphicon/glyphicon.dart'; + +class MakeNewPost extends StatefulWidget { + MakeNewPost({Key? key}) : super(key: key); + + @override + _MakeNewPostState createState() => _MakeNewPostState(); +} + +class _MakeNewPostState extends State { + @override + Widget build(BuildContext context) { + var size = MediaQuery.of(context).size; + return Scaffold( + appBar: AppBar( + title: Text('Nuevo Post'), + elevation: 4.0, + backgroundColor: Colors.blueGrey[700], + ), + body: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Padding( + padding: const EdgeInsets.only(left: 25, top: 15), + child: Container( + height: 51, + width: size.width / 9, + decoration: BoxDecoration( + color: Colors.grey[300], shape: BoxShape.circle), + child: Image.asset( + 'assets/images/logo.png', + ), + ), + ), + SizedBox( + width: size.width / 55, + ), + Padding( + padding: EdgeInsets.only(top: size.width / 39), + child: Text('Administrador', + style: (TextStyle( + fontSize: 16, fontWeight: FontWeight.w500))), + ) + ], + ), + Container( + padding: EdgeInsets.only(top: 20, left: 20, right: 20), + child: TextFormField( + autofocus: true, + decoration: InputDecoration( + labelText: "¿Algo para decir?", + labelStyle: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.w500), + fillColor: Colors.white, + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(25.0), + borderSide: BorderSide(color: Color(0xFF455A64))), + ), + inputFormatters: [LengthLimitingTextInputFormatter(200)])), + SizedBox( + height: size.width / 20, + ), + Divider( + color: Color(0xFF455A64).withOpacity(0.3), + thickness: 1.1, + ), + Padding( + padding: EdgeInsets.only(left: 20, top: 10, right: 20), + child: Column( + children: [ + Row( + children: [ + Icon( + Glyphicon.image, + color: Colors.green, + size: 25, + ), + SizedBox( + width: size.width / 20, + ), + Text( + 'Selecciona una image', + style: TextStyle( + fontSize: 16, fontWeight: FontWeight.w300), + ) + ], + ), + SizedBox( + height: size.width / 20, + child: Divider( + color: Color(0xFF455A64).withOpacity(0.3), + thickness: 1.1, + ), + ), + Row( + children: [ + Icon( + Glyphicon.paperclip, + color: Colors.pink, + size: 25, + ), + SizedBox( + width: size.width / 20, + ), + Text('Selecciona un archivo', + style: TextStyle( + fontSize: 16, fontWeight: FontWeight.w300)) + ], + ), + SizedBox( + height: size.width / 20, + child: Divider( + color: Color(0xFF455A64).withOpacity(0.3), + thickness: 1.1, + ), + ), + Row( + children: [ + Icon( + Glyphicon.file_earmark_pdf, + color: Colors.purpleAccent, + size: 25, + ), + SizedBox( + width: size.width / 20, + ), + Text('Selecciona un PDF', + style: TextStyle( + fontSize: 16, fontWeight: FontWeight.w300)) + ], + ) + ], + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/src/extra/referencia_view.dart b/lib/src/extra/referencia_view.dart index 63edda6..6cf1e44 100644 --- a/lib/src/extra/referencia_view.dart +++ b/lib/src/extra/referencia_view.dart @@ -1,11 +1,12 @@ import 'package:adcom/src/models/event_provider.dart'; +import 'package:adcom/src/pantallas/finanzas.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; class RefView extends StatefulWidget { - RefView({Key? key}) : super(key: key); - + late List? list = []; + RefView({Key? key, this.list}) : super(key: key); @override _RefViewState createState() => _RefViewState(); } @@ -95,15 +96,13 @@ class _RefViewState extends State { } referenciaApagar() { - final deudas = Provider.of(context, listen: false).deudas; - String? ref; - for (int i = 0; i < deudas.length; i++) { - if (deudas[i].pago == 1 && deudas[i].pagoTardio == 0) { + for (int i = 0; i < widget.list!.length; i++) { + if (widget.list![i].pago == 1 && widget.list![i].pagoTardio == 0) { print('no debe'); } else { setState(() { - ref = deudas[i].referencia!; + ref = widget.list![i].referencia!; }); return ref == null ? " " : ref; } diff --git a/lib/src/extra/report_edit_page.dart b/lib/src/extra/report_edit_page.dart index 476bd16..511ce75 100644 --- a/lib/src/extra/report_edit_page.dart +++ b/lib/src/extra/report_edit_page.dart @@ -4,17 +4,24 @@ import 'package:adcom/src/extra/reporte.dart'; import 'package:flutter/material.dart'; import 'package:im_stepper/stepper.dart'; +// ignore: must_be_immutable class ReportEditPage extends StatefulWidget { final DataReporte report; + final List progreso; - const ReportEditPage({Key? key, required this.report}) : super(key: key); + ReportEditPage({Key? key, required this.report, required this.progreso}) + : super(key: key); @override _ReportEditPageState createState() => _ReportEditPageState(); } class _ReportEditPageState extends State { - int _activeStep = 0; + var activestep = 0; + @override + void initState() { + super.initState(); + } @override Widget build(BuildContext context) { @@ -35,10 +42,12 @@ class _ReportEditPageState extends State { Icon(Icons.access_alarm), Icon(Icons.check) ], - activeStep: _activeStep, + activeStep: widget.progreso.last.id!, onStepReached: (index) { setState(() { - _activeStep = index; + for (int i = 0; i < widget.progreso.length; i++) { + widget.progreso[i].id = index; + } }); }, ), @@ -59,7 +68,7 @@ class _ReportEditPageState extends State { Widget header() { return Container( decoration: BoxDecoration( - color: stepColor()!, borderRadius: BorderRadius.circular(5)), + color: Colors.grey, borderRadius: BorderRadius.circular(5)), child: Row( children: [ Padding( @@ -76,7 +85,7 @@ class _ReportEditPageState extends State { } Widget plainText() { - switch (_activeStep) { + switch (widget.progreso.last.id!) { case 1: return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -156,26 +165,13 @@ class _ReportEditPageState extends State { } } - Color? stepColor() { - switch (_activeStep) { - case 1: - return Colors.lightGreen[200]; - case 2: - return Colors.lightGreen[300]; - case 3: - return Colors.lightGreen; - default: - return Colors.yellow; - } - } - String? headerText() { - switch (_activeStep) { + switch (widget.progreso.last.id!) { case 1: - return 'Revisión'; + return 'Revision'; case 2: return 'Respuesta'; - case 3: + case 4: return 'Finalizado'; default: diff --git a/lib/src/extra/reporte.dart b/lib/src/extra/reporte.dart index 25bc676..7dacbef 100644 --- a/lib/src/extra/reporte.dart +++ b/lib/src/extra/reporte.dart @@ -29,7 +29,7 @@ Future getReportes() async { prefs = await SharedPreferences.getInstance(); var id = prefs!.getInt('id'); Uri url = Uri.parse( - 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/get-reportes'); + 'http://187.189.53.8:8081/backend/web/index.php?r=adcom/get-reportes'); final response = await http.post(url, body: {"idResidente": id.toString()}); @@ -45,16 +45,35 @@ Future getReportes() async { class _LevantarReporteState extends State { List myList = []; - + List listProgreso = []; + var contador; GetReportes? cuentas; + data() async { cuentas = await getReportes(); for (int i = 0; i < cuentas!.data!.length; i++) { myList.add(new DataReporte( + id: cuentas!.data![i].idReporte, descripCorta: cuentas!.data![i].descCorta, desperfecto: cuentas!.data![i].descDesperfecto, fechaRep: cuentas!.data![i].fechaRep, uri: cuentas!.data![i].evidencia!.toList())); + + for (int j = 0; j < cuentas!.data![i].progreso!.length; j++) { + /* print("conta $contador"); + print("len: ${cuentas!.data![i].progreso!.length}"); */ + /* if (contador == cuentas!.data![i].progreso!.length) { + print('here'); + break; + } else { */ + listProgreso.add(new Progreso( + id: cuentas!.data![i].progreso![j].idProgreso, + time: cuentas!.data![i].progreso![j].fechaSeg, + comentario: cuentas!.data![i].progreso![j].comentario, + progreso: cuentas!.data![i].progreso![j].progreso)); + } + //} + } } @@ -122,7 +141,8 @@ class _LevantarReporteState extends State { child: ListTile( onTap: () { Navigator.of(context).push(MaterialPageRoute( - builder: (_) => ReportEditPage(report: myList[index]))); + builder: (_) => ReportEditPage( + report: myList[index], progreso: listProgreso))); }, title: Text( '${myList[index].descripCorta}', @@ -154,11 +174,32 @@ class _LevantarReporteState extends State { } } +class Progreso { + int? id; + DateTime? time; + String? comentario; + String? progreso; + + Progreso({this.time, this.comentario, this.progreso, this.id}); + /* @override + String toString() { + return "($id, $time, $comentario, $progreso)"; + } */ +} + class DataReporte { + int? id; String? descripCorta; String? desperfecto; DateTime? fechaRep; List? uri = []; - - DataReporte({this.descripCorta, this.desperfecto, this.fechaRep, this.uri}); + List? progreso = []; + + DataReporte( + {this.id, + this.descripCorta, + this.desperfecto, + this.fechaRep, + this.uri, + this.progreso}); } diff --git a/lib/src/extra/vista_tarjeta.dart b/lib/src/extra/vista_tarjeta.dart index 6dfc746..ec02680 100644 --- a/lib/src/extra/vista_tarjeta.dart +++ b/lib/src/extra/vista_tarjeta.dart @@ -95,8 +95,10 @@ class _VistaTarjetaState extends State { height: 30, child: OutlinedButton( onPressed: () { - Navigator.of(context).push( - MaterialPageRoute(builder: (_) => RefView())); + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => RefView( + list: mylist, + ))); }, child: Icon(Icons.add, size: 25, color: Colors.white), style: OutlinedButton.styleFrom( @@ -185,7 +187,7 @@ class _VistaTarjetaState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ Text( - 'Seleccione su método de pago', + 'Seleccioné su método de pago', style: TextStyle(fontSize: 21), ), SizedBox( @@ -344,6 +346,7 @@ class _VistaTarjetaState extends State { fechaPago: cuentas!.data![i].fechaPago, pago: cuentas!.data![i].pago!, totalApagar: cuentas!.data![i].totalApagar, + referencia: cuentas!.data![i].referencia, pagoTardio: cuentas!.data![i].pagoTardio, montoTardio: cuentas!.data![i].montoPagoTardio)); } @@ -443,11 +446,21 @@ class _VistaTarjetaState extends State { for (int i = 0; i < mylist.length; i++) { deuda = double.parse(mylist[i].montoCuota!); tardio = double.parse(mylist[i].montoTardio!); - if (mylist[i].pago == 1 && mylist[i].pagoTardio == 0) { + if (mylist[i].pago == 1) { + contador; } else { - if (DateTime.now().day <= mylist[i].fechaLimite!.day && - DateTime.now().month <= mylist[i].fechaLimite!.month && - DateTime.now().year <= mylist[i].fechaLimite!.year) { + if (mylist[i].pagoTardio == 0) { + if (DateTime.now().day <= mylist[i].fechaLimite!.day && + DateTime.now().month <= mylist[i].fechaLimite!.month && + DateTime.now().year <= mylist[i].fechaLimite!.year) { + setState(() { + contador += deuda; + }); + } else { + setState(() { + contador += deuda + tardio; + }); + } } else { setState(() { contador += deuda + tardio; diff --git a/lib/src/methods/emailDashboard.dart b/lib/src/methods/emailDashboard.dart index 1395948..79d4fc8 100644 --- a/lib/src/methods/emailDashboard.dart +++ b/lib/src/methods/emailDashboard.dart @@ -37,7 +37,7 @@ Future getData() async { print(id.toString()); Uri uri = Uri.parse( - 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/get-directorio'); + 'http://187.189.53.8:8081/backend/web/index.php?r=adcom/get-directorio'); final response = await http.post(uri, body: { "params": json.encode({"usuarioId": id}) }); diff --git a/lib/src/methods/eventDashboard.dart b/lib/src/methods/eventDashboard.dart index 6853318..0f90a0d 100644 --- a/lib/src/methods/eventDashboard.dart +++ b/lib/src/methods/eventDashboard.dart @@ -33,7 +33,7 @@ Future amenidades() async { print('?$id'); final Uri url = Uri.parse( - 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/get-amenidades'); + 'http://187.189.53.8:8081/backend/web/index.php?r=adcom/get-amenidades'); final response = await http.post(url, body: { "params": json.encode({"usuarioId": id}) }); @@ -152,13 +152,13 @@ class _EventDashboardState extends State { children: [ Image.asset( 'assets/images/zzz.png', - width: 280, + width: size / 1, height: 200, ), Text( 'Lo sentimos por el momento no dispone amenidades', style: TextStyle( - fontSize: 20, + fontSize: size / 20, color: Colors.deepPurple, ), textAlign: TextAlign.justify, @@ -254,7 +254,6 @@ class _EventDashboardState extends State { SizedBox( height: width / 40, ), - itsTrue == false ? Text('Lo sentimos :(') : Text(''), ], ), ], diff --git a/lib/src/methods/event_editing_page.dart b/lib/src/methods/event_editing_page.dart index 8bae4e6..0ed849c 100644 --- a/lib/src/methods/event_editing_page.dart +++ b/lib/src/methods/event_editing_page.dart @@ -230,7 +230,7 @@ class _EventEditingPageState extends State { }); Response response = await dio.post( - 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/reserva-amenidad', + 'http://187.189.53.8:8081/backend/web/index.php?r=adcom/reserva-amenidad', data: formData, onSendProgress: (received, total) { if (total != -1) { print((received / total * 100).toStringAsFixed(0) + '%'); diff --git a/lib/src/methods/gridDashboard.dart b/lib/src/methods/gridDashboard.dart index fa9a845..60169ac 100644 --- a/lib/src/methods/gridDashboard.dart +++ b/lib/src/methods/gridDashboard.dart @@ -31,7 +31,7 @@ class _GridDashboardState extends State { Items item2 = new Items( title: 'Avisos', - route: '/screen4', + /* route: '/screen4' */ icon: Icon(Icons.announcement_rounded, size: 50, color: Colors.blueGrey[700])); @@ -98,7 +98,7 @@ class _GridDashboardState extends State { Widget build(BuildContext context) { switch (widget.userId) { case 1: - myList = [item1, item5, item4, item2]; + myList = [item1, item5, item4]; break; case 2: diff --git a/lib/src/models/event_provider.dart b/lib/src/models/event_provider.dart index 4700efb..babb6d7 100644 --- a/lib/src/models/event_provider.dart +++ b/lib/src/models/event_provider.dart @@ -106,7 +106,8 @@ class EventProvider extends ChangeNotifier { HapticFeedback.lightImpact(); Widget okButton = TextButton( onPressed: () { - Navigator.of(ctx)..pop(); + Navigator.of(ctx).popAndPushNamed('/'); + ; }, child: Text('OK')); diff --git a/lib/src/pantallas/amenidades.dart b/lib/src/pantallas/amenidades.dart index c8a13c8..0163b6a 100644 --- a/lib/src/pantallas/amenidades.dart +++ b/lib/src/pantallas/amenidades.dart @@ -33,7 +33,7 @@ Future idso() async { var id = prefs!.getInt('idPrimario'); final Uri url = Uri.parse( - 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/get-amenidades'); + 'http://187.189.53.8:8081/backend/web/index.php?r=adcom/get-amenidades'); final response = await http.post(url, body: { "params": json.encode({"usuarioId": id}) }); @@ -81,132 +81,68 @@ class _AmenidadesState extends State { elevation: 6, backgroundColor: Colors.deepPurpleAccent, ), - body: size.width >= 880 - ? Stack( + body: Stack( + children: [ + Container( + height: size.height * .35, + decoration: BoxDecoration(color: Colors.deepPurpleAccent), + ), + Container( + padding: EdgeInsets.only(top: 95), + alignment: Alignment.topRight, + child: Icon( + Icons.event, + color: Colors.white, + size: size.width / 3, + ), + ), + SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - height: size.height * .40, - decoration: BoxDecoration(color: Colors.deepPurpleAccent), + SizedBox( + height: 5, ), - Container( - padding: EdgeInsets.only(top: 95), - alignment: Alignment.topRight, - child: Icon( - Icons.event, - color: Colors.white, - size: 170, - ), + Text( + "Amenidades", + style: TextStyle( + color: Colors.white, + fontSize: 40, + fontFamily: 'Roboto', + fontWeight: FontWeight.w700), ), - SafeArea( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 10, - ), - Text( - "Amenidades", - style: TextStyle( - color: Colors.white, - fontSize: 40, - fontFamily: 'Roboto', - fontWeight: FontWeight.w700), - ), - SizedBox( - height: 25, - ), - Text( - 'Disfruta las ventajas de tu comunidad', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.white, - fontSize: 15), - ), - SizedBox( - height: 35, - ), - SizedBox( - width: size.width * .5, - child: Text( - 'Enterate de la disponibilidad de tus areas recreativas o aparta con tiempo para tus eventos', - style: TextStyle( - color: Colors.white, - fontSize: size.width >= 880 ? 19 : 17), - ), - ), - SizedBox( - height: 20, - ), - EventDashboard() - ], - ), - )) - ], - ) - : Stack( - children: [ - Container( - height: size.height * .40, - decoration: BoxDecoration(color: Colors.deepPurpleAccent), + SizedBox( + height: 15, ), - Container( - padding: EdgeInsets.only(top: 95), - alignment: Alignment.topRight, - child: Icon( - Icons.event, - color: Colors.white, - size: size.width / 3, - ), + Text( + 'Disfruta las ventajas de tu comunidad', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + fontSize: 15), + ), + SizedBox( + height: 18, ), - SafeArea( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 5, - ), - Text( - "Amenidades", - style: TextStyle( - color: Colors.white, - fontSize: 40, - fontFamily: 'Roboto', - fontWeight: FontWeight.w700), - ), - SizedBox( - height: 15, - ), - Text( - 'Disfruta las ventajas de tu comunidad', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.white, - fontSize: 15), - ), - SizedBox( - height: 18, - ), - SizedBox( - width: size.width * .5, - child: Text( - 'Enterate de la disponibilidad de tus areas recreativas o aparta con tiempo para tus eventos', - style: TextStyle( - color: Colors.white, fontSize: size.width / 20), - ), - ), - SizedBox( - height: 20, - ), - EventDashboard() - ], + SizedBox( + width: size.width * .5, + child: Text( + 'Enterate de la disponibilidad de tus areas recreativas o aparta con tiempo para tus eventos', + style: TextStyle( + color: Colors.white, fontSize: size.width / 20), ), - )) + ), + SizedBox( + height: 20, + ), + EventDashboard() ], ), + )) + ], + ), ), ); } diff --git a/lib/src/pantallas/avisos.dart b/lib/src/pantallas/avisos.dart index 537e542..a6ad663 100644 --- a/lib/src/pantallas/avisos.dart +++ b/lib/src/pantallas/avisos.dart @@ -1,3 +1,5 @@ +import 'package:adcom/src/extra/dashboard_Avisos.dart'; +import 'package:adcom/src/extra/nuevo_post.dart'; import 'package:adcom/src/methods/searchBar.dart'; import 'package:flutter/material.dart'; import 'package:onesignal_flutter/onesignal_flutter.dart'; @@ -59,7 +61,7 @@ class _AvisosState extends State { var size = MediaQuery.of(context).size; return Scaffold( appBar: AppBar( - elevation: 3.0, + elevation: 4.0, backgroundColor: Colors.blueGrey[700], ), resizeToAvoidBottomInset: false, @@ -113,33 +115,26 @@ class _AvisosState extends State { style: TextStyle(color: Colors.white), ), ), + SizedBox( + height: size.width / 8, + ), + AvisosDashboard() ], ), )) ], ), - bottomNavigationBar: BottomNavigationBar( - items: [ - BottomNavigationBarItem( - icon: Icon(Icons.announcement_rounded), - label: 'Avisos', - backgroundColor: Colors.red, - ), - BottomNavigationBarItem( - icon: Icon(Icons.file_present), - label: 'Archivos', - backgroundColor: Colors.green, - ), - ], - elevation: 5, - currentIndex: _selectedIndex, - selectedItemColor: Colors.blueGrey[700], - onTap: _onItemTapped, + bottomNavigationBar: BottomAppBar( + shape: const CircularNotchedRectangle(), + child: Container(height: 50.0), ), floatingActionButton: FloatingActionButton( elevation: 5, backgroundColor: Colors.blueGrey[700], - onPressed: () {}, + onPressed: () { + Navigator.of(context) + .push(MaterialPageRoute(builder: (_) => MakeNewPost())); + }, tooltip: 'add post', child: const Icon( Icons.add, diff --git a/lib/src/pantallas/finanzas.dart b/lib/src/pantallas/finanzas.dart index 9a83e22..f34bf31 100644 --- a/lib/src/pantallas/finanzas.dart +++ b/lib/src/pantallas/finanzas.dart @@ -38,7 +38,7 @@ Future getAdeudos() async { var id = prefs!.getInt('idUser'); final Uri url = Uri.parse( - 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/get-adeudos'); + 'http://187.189.53.8:8081/backend/web/index.php?r=adcom/get-adeudos'); final response = await http.post(url, body: { "params": json.encode({"usuarioId": id}) }); @@ -60,18 +60,13 @@ class _FinanzasState extends State { var montoCuota; Timer? timer; VoidCallback? _showPersBottomSheetCallBack; - RefreshController _refreshController = - RefreshController(initialRefresh: false); + bool itsTrue = true; data() async { cuentas = await getAdeudos(); - final provider = Provider.of(context, listen: false); - if (cuentas!.value == 1) { - for (int i = 0; i < cuentas!.data!.length; i++) { - provider.addDeudas(DatosCuenta( - referencia: cuentas!.data![i].referencia, - )); + if (cuentas!.data!.isNotEmpty) { + for (int i = 0; i < cuentas!.data!.length; i++) { localList.add(new DatosCuenta( idComu: cuentas!.data![i].idComu, montoCuota: cuentas!.data![i].montoCuota, @@ -82,33 +77,30 @@ class _FinanzasState extends State { pago: cuentas!.data![i].pago)); } } else { - errorLoSiento(); + setState(() { + if (mounted) { + itsTrue = false; + } + }); } } - errorLoSiento() { - Container( - padding: EdgeInsets.only(top: 0), - child: Center( - child: Image.asset( - 'assets/images/error.png', - width: 192, - ), - )); - } - @override void initState() { super.initState(); _showPersBottomSheetCallBack = _showPersBottomSheetCallBack; data(); - - Future.delayed(Duration(seconds: 1), () => {refresh()}); + if (itsTrue == false) { + } else { + Future.delayed(Duration(seconds: 1), () => {refresh()}); + } } refresh() { setState(() { - mainView(); + if (mounted) { + mainView(); + } }); } @@ -121,148 +113,100 @@ class _FinanzasState extends State { backgroundColor: Colors.lightGreen[700], ), resizeToAvoidBottomInset: false, - body: size.width >= 880 - ? Stack( - children: [ - Container( - height: size.height * .35, - decoration: BoxDecoration(color: Colors.lightGreen[700]), - ), - Container( - padding: EdgeInsets.only(top: 80), - alignment: Alignment.topRight, - child: Icon( - Icons.show_chart_rounded, - size: 190, - color: Colors.white, - ), - ), - SafeArea( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 12, - ), - Text( - 'Mis Pagos', - style: TextStyle( - color: Colors.white, - fontSize: 40, - fontFamily: 'Roboto', - fontWeight: FontWeight.w700), - ), - SizedBox( - height: size.width >= 880 ? 25 : 20, - ), - Text( - 'Toma el control de tus gastos', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.white, - fontSize: 16), - ), - SizedBox( - height: size.width >= 880 ? 35 : 23, - ), - SizedBox( - width: size.width * .6, - child: Text( - 'Mantente actualizado revisando tus estados de cuenta y adeudos pendientes.', - style: - TextStyle(color: Colors.white, fontSize: 19), - ), - ), - Container( - padding: EdgeInsets.only( - top: size.width >= 880 ? 45 : 25, - left: size.width >= 880 ? 5 : 0, - right: size.width >= 880 ? 5 : 0), - child: localList.isEmpty - ? Center( - child: CircularProgressIndicator(), - ) - : mainView()) - ], + body: Stack( + children: [ + Container( + height: size.height * .30, + decoration: BoxDecoration(color: Colors.lightGreen[700]), + ), + Container( + padding: EdgeInsets.only(top: size.height / 12), + alignment: Alignment.topRight, + child: Icon( + Icons.show_chart_rounded, + size: size.width / 2, + color: Colors.white, + ), + ), + SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: ListView(shrinkWrap: true, children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: size.width / 20, ), - ), - ), - ], - ) - : Stack( - children: [ - Container( - height: size.height * .35, - decoration: BoxDecoration(color: Colors.lightGreen[700]), - ), - Container( - padding: EdgeInsets.only(top: size.height / 12), - alignment: Alignment.topRight, - child: Icon( - Icons.show_chart_rounded, - size: size.width / 2, - color: Colors.white, - ), - ), - SafeArea( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: ListView(shrinkWrap: true, children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: size.width / 20, - ), - Text( - 'Mis Pagos', - style: TextStyle( - color: Colors.white, - fontSize: 30, - fontFamily: 'Roboto', - fontWeight: FontWeight.w700), - ), - SizedBox( - height: size.width / 19, - ), - Text( - 'Toma el control de tus gastos', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.white, - fontSize: 17), - ), - SizedBox( - height: size.width / 20, - ), - SizedBox( - width: size.width * .6, - child: Text( - 'Mantente actualizado revisando tus estados de cuenta y adeudos pendientes.', - style: TextStyle( - color: Colors.white, - fontSize: size.width / 21), - ), - ), - Container( - padding: EdgeInsets.only( - top: size.width / 10, - left: size.width >= 880 ? 5 : 0, - right: size.width >= 880 ? 5 : 0), - child: localList.isEmpty - ? Center( - child: CircularProgressIndicator(), - ) - : mainView()) - ], + Text( + 'Mis Pagos', + style: TextStyle( + color: Colors.white, + fontSize: 30, + fontFamily: 'Roboto', + fontWeight: FontWeight.w700), + ), + SizedBox( + height: size.width / 19, + ), + Text( + 'Toma el control de tus gastos', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + fontSize: 17), + ), + SizedBox( + height: size.width / 20, + ), + SizedBox( + width: size.width * .6, + child: Text( + 'Mantente actualizado revisando tus estados de cuenta y adeudos pendientes.', + style: TextStyle( + color: Colors.white, fontSize: size.width / 21), ), - ]), - ), + ), + Container( + padding: EdgeInsets.only( + top: size.width / 7, + left: size.width >= 880 ? 5 : 0, + right: size.width >= 880 ? 5 : 0), + child: localList.isEmpty + ? Center( + child: itsTrue == false + ? Container( + padding: + const EdgeInsets.only(top: 90), + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + Image.asset( + 'assets/images/magic.png', + width: size.width / 1, + height: 200, + ), + Text( + 'Lo sentimos nuestra magia no funciona en este lugar', + style: TextStyle( + fontSize: size.width / 20, + color: Colors.lightGreen[700], + ), + textAlign: TextAlign.justify, + ) + ], + )) + : CircularProgressIndicator(), + ) + : mainView()) + ], ), - ], - )); + ]), + ), + ), + ], + )); } mainView() { diff --git a/lib/src/pantallas/loginPage.dart b/lib/src/pantallas/loginPage.dart index 2c261ef..0444425 100644 --- a/lib/src/pantallas/loginPage.dart +++ b/lib/src/pantallas/loginPage.dart @@ -24,8 +24,8 @@ class LoginPage extends StatefulWidget { } Future loginAcces(String user, String pass) async { - final Uri uri = Uri.parse( - 'http://192.168.1.178:8080/AdcomBackend/backend/web/index.php?r=adcom/login'); + final Uri uri = + Uri.parse('http://187.189.53.8:8081/backend/web/index.php?r=adcom/login'); final response = await http.post(uri, body: { "params": jsonEncode({'username': user, 'password': pass}), }); @@ -204,7 +204,6 @@ class _LoginPageState extends State { } catch (e) { HapticFeedback.heavyImpact(); showAlertDialog(); - Navigator.popAndPushNamed(context, '/'); } } else { HapticFeedback.heavyImpact(); @@ -280,7 +279,7 @@ class _LoginPageState extends State { showAlertDialog() { Widget okButton = TextButton( onPressed: () { - Navigator.of(context)..pop(); + Navigator.of(context).popAndPushNamed('/'); }, child: Text('OK')); diff --git a/lib/src/pantallas/mainMenu.dart b/lib/src/pantallas/mainMenu.dart index d70e0f1..acb3f0e 100644 --- a/lib/src/pantallas/mainMenu.dart +++ b/lib/src/pantallas/mainMenu.dart @@ -53,147 +53,73 @@ class _MainMenuState extends State { //final args = ModalRoute.of(context)!.settings.arguments as LoginPage; var size = MediaQuery.of(context).size; return Scaffold( - body: size.width >= 880 - ? Stack( - children: [ - Container( - height: size.height * .40, - decoration: BoxDecoration(color: Colors.red), + body: Stack( + children: [ + Container( + height: size.height * .34, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(20), + bottomRight: Radius.circular(20)), + boxShadow: [ + BoxShadow( + color: Colors.grey, blurRadius: 10, offset: Offset(1, 0)) + ], + ), + ), + Container( + padding: EdgeInsets.only( + top: size.height * .18, right: size.width * .10), + alignment: Alignment.topRight, + child: Image.asset( + 'assets/images/AdCom3.png', + width: size.width * .38, + )), + SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 12, ), - Container( - padding: EdgeInsets.only( - top: size.width >= 880 ? 150 : 190, right: 21), - alignment: Alignment.topRight, - child: Image.asset( - 'assets/images/AdCom.png', - width: 192, - )), - SafeArea( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: size.width >= 880 ? 34 : 24, - ), - Padding( - padding: const EdgeInsets.only( - left: 12, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: size.width / 10, - ), - Text( - '¡${greeting()}! \n${user == null ? '' : user}', - style: TextStyle( - color: Colors.white, - fontFamily: 'Roboto', - fontSize: 35, - fontWeight: FontWeight.w700), - ), - SizedBox( - height: 10, - ), - Container( - alignment: Alignment.centerLeft, - height: 50, - width: 150, - margin: size.width >= 880 - ? EdgeInsets.all(25) - : EdgeInsets.only(left: 10, top: 46), - child: SizedBox()) - ], - ), - ), - SizedBox( - height: size.width >= 880 ? 35 : 10, - ), - GridDashboard( - userId: userType, - ) - ], + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: size.width / 19, ), - ), - ) - ], - ) - : Stack( - children: [ - Container( - height: size.height * .34, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(20), - bottomRight: Radius.circular(20)), - boxShadow: [ - BoxShadow( - color: Colors.grey, - blurRadius: 10, - offset: Offset(1, 0)) - ], - ), + Text( + '¡${greeting()}! \n${user == null ? '' : user}', + style: TextStyle( + color: Colors.black, + fontFamily: 'Roboto', + fontSize: size.width / 11, + fontWeight: FontWeight.w700), + ), + //no mover + SizedBox(height: size.height / 5.5), + ], ), - Container( - padding: EdgeInsets.only( - top: size.height * .18, right: size.width * .10), - alignment: Alignment.topRight, - child: Image.asset( - 'assets/images/AdCom3.png', - width: size.width * .38, - )), - SafeArea( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only( - left: 12, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: size.width / 19, - ), - Text( - '¡${greeting()}! \n${user == null ? '' : user}', - style: TextStyle( - color: Colors.black, - fontFamily: 'Roboto', - fontSize: size.width / 11, - fontWeight: FontWeight.w700), - ), - //no mover - SizedBox( - height: size.height >= 640 - ? size.height / 6.5 - : size.height / 10, - ), - ], - ), - ), + ), - //no mover - SizedBox( - height: size.width <= 640 ? 5 : size.height / 13, - ), + //no mover + SizedBox( + height: size.width <= 640 ? 5 : size.height / 13, + ), - GridDashboard( - userId: userType, - ) - ], - ), - ), - ) - ], - )); + GridDashboard( + userId: userType, + ) + ], + ), + ), + ) + ], + )); } String greeting() { diff --git a/pubspec.lock b/pubspec.lock index f156c69..e4d9647 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -22,6 +22,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.5.0" + badges: + dependency: "direct main" + description: + name: badges + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" barcode: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index efbc069..005d76a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.1.0+13 +version: 2.1.1+14 environment: sdk: ">=2.12.0 <3.0.0" @@ -61,7 +61,8 @@ dependencies: printing: ^5.4.3 dio: ^4.0.0 lint: ^1.0.0 - + badges: ^2.0.1 + dev_dependencies: flutter_test: From 9098384668d247fe8467f3198a585a86b00e6a76 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Fri, 3 Sep 2021 08:42:53 -0600 Subject: [PATCH 06/20] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d7bca36..423381d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ # adcom iosV - Version ios + Esta version es version android, cuidado con juntar las ramas, ios tiene librerias diferentes a las de android y pueden chocar From 9b178d6475327d694c0850a55b6ebf5cfc37fb00 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Fri, 3 Sep 2021 18:20:36 -0600 Subject: [PATCH 07/20] cambios para android --- android/app/src/main/AndroidManifest.xml | 1 + lib/json/json-getComunidades.dart | 94 +++++ lib/json/jsonFinanzas.dart | 144 ++++--- lib/json/obtenerAvisos.dart | 78 ++++ lib/json/tipoAvisot.dart | 57 +++ lib/src/app.dart | 18 +- lib/src/extra/OnBoarding_Reporte.dart | 18 +- lib/src/extra/add_reporte.dart | 31 +- lib/src/extra/dashboard_Avisos.dart | 365 ++++++++++++---- lib/src/extra/nuevo_post.dart | 517 ++++++++++++++++++----- lib/src/extra/report_edit_page.dart | 168 +++++++- lib/src/extra/reporte.dart | 69 ++- lib/src/methods/event_editing_page.dart | 8 +- lib/src/methods/gridDashboard.dart | 8 +- lib/src/models/event_provider.dart | 10 +- lib/src/pantallas/avisos.dart | 266 +++++++++--- lib/src/pantallas/finanzas.dart | 6 +- lib/src/pantallas/loginPage.dart | 2 - lib/src/pantallas/mainMenu.dart | 6 +- pubspec.lock | 28 ++ pubspec.yaml | 6 +- 21 files changed, 1531 insertions(+), 369 deletions(-) create mode 100644 lib/json/json-getComunidades.dart create mode 100644 lib/json/obtenerAvisos.dart create mode 100644 lib/json/tipoAvisot.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 1b9bbf4..0e9fb2a 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ + diff --git a/lib/json/json-getComunidades.dart b/lib/json/json-getComunidades.dart new file mode 100644 index 0000000..0be607b --- /dev/null +++ b/lib/json/json-getComunidades.dart @@ -0,0 +1,94 @@ +// To parse this JSON data, do +// +// final progres = progresFromJson(jsonString); + +// To parse this JSON data, do +// +// final comunities = comunitiesFromJson(jsonString); + +import 'dart:convert'; + +Comunities comunitiesFromJson(String str) => + Comunities.fromJson(json.decode(str)); + +String comunitiesToJson(Comunities data) => json.encode(data.toJson()); + +class Comunities { + Comunities({ + this.value, + this.message, + this.data, + }); + + int? value; + String? message; + List? data; + + factory Comunities.fromJson(Map json) => Comunities( + value: json["value"], + message: json["message"], + data: List.from(json["data"].map((x) => Datum.fromJson(x))), + ); + + Map toJson() => { + "value": value, + "message": message, + "data": List.from(data!.map((x) => x.toJson())), + }; +} + +class Datum { + Datum({ + this.idCom, + this.nombreComu, + this.ubicacion, + this.cp, + this.idAdministrador, + this.idComite, + this.idTipoComu, + this.banco, + this.cuentaBanco, + this.cuentaClabe, + this.rfc, + }); + + int? idCom; + String? nombreComu; + String? ubicacion; + int? cp; + dynamic? idAdministrador; + dynamic? idComite; + String? idTipoComu; + String? banco; + String? cuentaBanco; + String? cuentaClabe; + String? rfc; + + factory Datum.fromJson(Map json) => Datum( + idCom: json["ID_COM"], + nombreComu: json["NOMBRE_COMU"], + ubicacion: json["UBICACION"] == null ? null : json["UBICACION"], + cp: json["CP"] == null ? null : json["CP"], + idAdministrador: json["ID_ADMINISTRADOR"], + idComite: json["ID_COMITE"], + idTipoComu: json["ID_TIPO_COMU"] == null ? null : json["ID_TIPO_COMU"], + banco: json["BANCO"] == null ? null : json["BANCO"], + cuentaBanco: json["CUENTA_BANCO"] == null ? null : json["CUENTA_BANCO"], + cuentaClabe: json["CUENTA_CLABE"] == null ? null : json["CUENTA_CLABE"], + rfc: json["RFC"] == null ? null : json["RFC"], + ); + + Map toJson() => { + "ID_COM": idCom, + "NOMBRE_COMU": nombreComu, + "UBICACION": ubicacion == null ? null : ubicacion, + "CP": cp == null ? null : cp, + "ID_ADMINISTRADOR": idAdministrador, + "ID_COMITE": idComite, + "ID_TIPO_COMU": idTipoComu == null ? null : idTipoComu, + "BANCO": banco == null ? null : banco, + "CUENTA_BANCO": cuentaBanco == null ? null : cuentaBanco, + "CUENTA_CLABE": cuentaClabe == null ? null : cuentaClabe, + "RFC": rfc == null ? null : rfc, + }; +} diff --git a/lib/json/jsonFinanzas.dart b/lib/json/jsonFinanzas.dart index ce414b4..bb14917 100644 --- a/lib/json/jsonFinanzas.dart +++ b/lib/json/jsonFinanzas.dart @@ -1,7 +1,3 @@ -// To parse this JSON data, do -// -// final places = placesFromJson(jsonString); - // To parse this JSON data, do // // final accounts = accountsFromJson(jsonString); @@ -24,36 +20,44 @@ class Accounts { List? data; factory Accounts.fromJson(Map json) => Accounts( - value: json["value"], - message: json["message"], - data: List.from(json["data"].map((x) => Datum.fromJson(x))), + value: json["value"] == null ? null : json["value"], + message: json["message"] == null ? null : json["message"], + data: json["data"] == null + ? null + : List.from(json["data"].map((x) => Datum.fromJson(x))), ); Map toJson() => { - "value": value, - "message": message, - "data": List.from(data!.map((x) => x.toJson())), + "value": value == null ? null : value, + "message": message == null ? null : message, + "data": data == null + ? null + : List.from(data!.map((x) => x.toJson())), }; } class Datum { - Datum( - {this.idAdeudo, - this.idComu, - this.idResidente, - this.montoCuota, - this.idConcepto, - this.fechaGeneracion, - this.fechaLimite, - this.fechaPago, - this.montoPago, - this.idFormaPago, - this.idTipoCuota, - this.referencia, - this.pagoTardio, - this.montoPagoTardio, - this.pago, - this.totalApagar}); + Datum({ + this.idAdeudo, + this.idComu, + this.idResidente, + this.montoCuota, + this.idConcepto, + this.fechaGeneracion, + this.fechaLimite, + this.fechaPago, + this.montoPago, + this.idFormaPago, + this.idTipoCuota, + this.referencia, + this.pagoTardio, + this.montoPagoTardio, + this.impAplicado, + this.impMonto, + this.inpcPorcentaje, + this.pago, + this.totalApagar, + }); int? idAdeudo; int? idComu; @@ -64,50 +68,68 @@ class Datum { DateTime? fechaLimite; DateTime? fechaPago; String? montoPago; - int? idFormaPago; + dynamic? idFormaPago; dynamic? idTipoCuota; String? referencia; - dynamic? pagoTardio; + int? pagoTardio; String? montoPagoTardio; + dynamic? impAplicado; + dynamic? impMonto; + dynamic? inpcPorcentaje; int? pago; int? totalApagar; factory Datum.fromJson(Map json) => Datum( - idAdeudo: json["ID_ADEUDO"], - idComu: json["ID_COMU"], - idResidente: json["ID_RESIDENTE"], - montoCuota: json["MONTO_CUOTA"], - idConcepto: json["ID_CONCEPTO"], - fechaGeneracion: DateTime.parse(json["FECHA_GENERACION"]), - fechaLimite: DateTime.parse(json["FECHA_LIMITE"]), - fechaPago: json["FECHA_PAGO"] == null - ? null - : DateTime.parse(json["FECHA_PAGO"]), - montoPago: json["MONTO_PAGO"], - idFormaPago: json["ID_FORMA_PAGO"] == null ? null : json["ID_FORMA_PAGO"], - idTipoCuota: json["ID_TIPO_CUOTA"], - referencia: json["REFERENCIA"], - pagoTardio: json["PAGO_TARDIO"], - montoPagoTardio: json["MONTO_PAGO_TARDIO"], - pago: json["PAGO"], - totalApagar: json["TOTAL_APAGAR"]); + idAdeudo: json["ID_ADEUDO"] == null ? null : json["ID_ADEUDO"], + idComu: json["ID_COMU"] == null ? null : json["ID_COMU"], + idResidente: json["ID_RESIDENTE"] == null ? null : json["ID_RESIDENTE"], + montoCuota: json["MONTO_CUOTA"] == null ? null : json["MONTO_CUOTA"], + idConcepto: json["ID_CONCEPTO"] == null ? null : json["ID_CONCEPTO"], + fechaGeneracion: json["FECHA_GENERACION"] == null + ? null + : DateTime.parse(json["FECHA_GENERACION"]), + fechaLimite: json["FECHA_LIMITE"] == null + ? null + : DateTime.parse(json["FECHA_LIMITE"]), + fechaPago: json["FECHA_PAGO"] == null + ? null + : DateTime.parse(json["FECHA_PAGO"]), + montoPago: json["MONTO_PAGO"] == null ? null : json["MONTO_PAGO"], + idFormaPago: json["ID_FORMA_PAGO"], + idTipoCuota: json["ID_TIPO_CUOTA"], + referencia: json["REFERENCIA"] == null ? null : json["REFERENCIA"], + pagoTardio: json["PAGO_TARDIO"] == null ? null : json["PAGO_TARDIO"], + montoPagoTardio: json["MONTO_PAGO_TARDIO"] == null + ? null + : json["MONTO_PAGO_TARDIO"], + impAplicado: json["IMP_APLICADO"], + impMonto: json["IMP_MONTO"], + inpcPorcentaje: json["INPC_PORCENTAJE"], + pago: json["PAGO"] == null ? null : json["PAGO"], + totalApagar: json["TOTAL_APAGAR"] == null ? null : json["TOTAL_APAGAR"], + ); Map toJson() => { - "ID_ADEUDO": idAdeudo, - "ID_COMU": idComu, - "ID_RESIDENTE": idResidente, - "MONTO_CUOTA": montoCuota, - "ID_CONCEPTO": idConcepto, - "FECHA_GENERACION": fechaGeneracion!.toIso8601String(), - "FECHA_LIMITE": fechaLimite!.toIso8601String(), + "ID_ADEUDO": idAdeudo == null ? null : idAdeudo, + "ID_COMU": idComu == null ? null : idComu, + "ID_RESIDENTE": idResidente == null ? null : idResidente, + "MONTO_CUOTA": montoCuota == null ? null : montoCuota, + "ID_CONCEPTO": idConcepto == null ? null : idConcepto, + "FECHA_GENERACION": + fechaGeneracion == null ? null : fechaGeneracion!.toIso8601String(), + "FECHA_LIMITE": + fechaLimite == null ? null : fechaLimite!.toIso8601String(), "FECHA_PAGO": fechaPago == null ? null : fechaPago!.toIso8601String(), - "MONTO_PAGO": montoPago, - "ID_FORMA_PAGO": idFormaPago == null ? null : idFormaPago, + "MONTO_PAGO": montoPago == null ? null : montoPago, + "ID_FORMA_PAGO": idFormaPago, "ID_TIPO_CUOTA": idTipoCuota, - "REFERENCIA": referencia, - "PAGO_TARDIO": pagoTardio, - "MONTO_PAGO_TARDIO": montoPagoTardio, - "PAGO": pago, - "TOTAL_APAGAR": totalApagar + "REFERENCIA": referencia == null ? null : referencia, + "PAGO_TARDIO": pagoTardio == null ? null : pagoTardio, + "MONTO_PAGO_TARDIO": montoPagoTardio == null ? null : montoPagoTardio, + "IMP_APLICADO": impAplicado, + "IMP_MONTO": impMonto, + "INPC_PORCENTAJE": inpcPorcentaje, + "PAGO": pago == null ? null : pago, + "TOTAL_APAGAR": totalApagar == null ? null : totalApagar, }; } diff --git a/lib/json/obtenerAvisos.dart b/lib/json/obtenerAvisos.dart new file mode 100644 index 0000000..57ded56 --- /dev/null +++ b/lib/json/obtenerAvisos.dart @@ -0,0 +1,78 @@ +// To parse this JSON data, do +// +// final getAvisos = getAvisosFromJson(jsonString); + +import 'dart:convert'; + +GetAvisos getAvisosFromJson(String str) => GetAvisos.fromJson(json.decode(str)); + +String getAvisosToJson(GetAvisos data) => json.encode(data.toJson()); + +class GetAvisos { + GetAvisos({ + this.value, + this.data, + }); + + int? value; + List? data; + + factory GetAvisos.fromJson(Map json) => GetAvisos( + value: json["value"], + data: List.from(json["data"].map((x) => Datum.fromJson(x))), + ); + + Map toJson() => { + "value": value, + "data": List.from(data!.map((x) => x.toJson())), + }; +} + +class Datum { + Datum({ + this.aviso, + this.tipoAviso, + this.fechaAviso, + this.archivos, + }); + + String? aviso; + int? tipoAviso; + DateTime? fechaAviso; + List? archivos; + + factory Datum.fromJson(Map json) => Datum( + aviso: json["AVISO"], + tipoAviso: json["TIPO_AVISO"], + fechaAviso: DateTime.parse(json["FECHA_AVISO"]), + archivos: List.from( + json["ARCHIVOS"].map((x) => Archivo.fromJson(x))), + ); + + Map toJson() => { + "AVISO": aviso, + "TIPO_AVISO": tipoAviso, + "FECHA_AVISO": fechaAviso!.toIso8601String(), + "ARCHIVOS": List.from(archivos!.map((x) => x.toJson())), + }; +} + +class Archivo { + Archivo({ + this.direccionArchivo, + this.nombreArchivo, + }); + + String? direccionArchivo; + String? nombreArchivo; + + factory Archivo.fromJson(Map json) => Archivo( + direccionArchivo: json["DIRECCION_ARCHIVO"], + nombreArchivo: json["NOMBRE_ARCHIVO"], + ); + + Map toJson() => { + "DIRECCION_ARCHIVO": direccionArchivo, + "NOMBRE_ARCHIVO": nombreArchivo, + }; +} diff --git a/lib/json/tipoAvisot.dart b/lib/json/tipoAvisot.dart new file mode 100644 index 0000000..28ead4f --- /dev/null +++ b/lib/json/tipoAvisot.dart @@ -0,0 +1,57 @@ +// To parse this JSON data, do +// +// final tipoAviso = tipoAvisoFromJson(jsonString); + +import 'dart:convert'; + +TipoAviso tipoAvisoFromJson(String str) => TipoAviso.fromJson(json.decode(str)); + +String tipoAvisoToJson(TipoAviso data) => json.encode(data.toJson()); + +class TipoAviso { + TipoAviso({ + this.value, + this.message, + this.data, + }); + + int? value; + String? message; + List? data; + + factory TipoAviso.fromJson(Map json) => TipoAviso( + value: json["value"], + message: json["message"], + data: List.from(json["data"].map((x) => Datum.fromJson(x))), + ); + + Map toJson() => { + "value": value, + "message": message, + "data": List.from(data!.map((x) => x.toJson())), + }; +} + +class Datum { + Datum({ + this.idCatTipoaviso, + this.tipoAviso, + this.idCom, + }); + + int? idCatTipoaviso; + String? tipoAviso; + int? idCom; + + factory Datum.fromJson(Map json) => Datum( + idCatTipoaviso: json["ID_CAT_TIPOAVISO"], + tipoAviso: json["TIPO_AVISO"], + idCom: json["ID_COM"], + ); + + Map toJson() => { + "ID_CAT_TIPOAVISO": idCatTipoaviso, + "TIPO_AVISO": tipoAviso, + "ID_COM": idCom, + }; +} diff --git a/lib/src/app.dart b/lib/src/app.dart index d1bfadf..8b9c9d7 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -18,6 +18,7 @@ import 'package:adcom/src/pantallas/reportes.dart'; import 'package:adcom/src/pantallas/visitantes.dart'; import 'package:adcom/src/pantallas/votaciones.dart'; import 'package:flutter/material.dart'; + import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -29,15 +30,22 @@ class MyApp extends StatefulWidget { _MyAppState createState() => _MyAppState(); } +SharedPreferences? prefs; + class _MyAppState extends State { final heroController = HeroController(); GlobalKey navigatorKey = GlobalKey(); var id = 'icono'; bool _loggedIn = false; + init() async { + prefs = await SharedPreferences.getInstance(); + } + @override void initState() { super.initState(); + init(); } @override @@ -53,6 +61,7 @@ class _MyAppState extends State { brightness: Brightness.light), title: 'adcom', //initialRoute: '/', + routes: { '/': (BuildContext context) { var state = Provider.of(context); @@ -77,7 +86,14 @@ class _MyAppState extends State { '/screen14': (BuildContext context) => LevantarReporte(), '/screen15': (BuildContext context) => ChatPage(), '/screen16': (BuildContext context) => Seguimiento(), - '/screen17': (BuildContext context) => OnBoardReportes(), + '/screen17': (BuildContext context) { + var tru = prefs!.containsKey('UnaVez'); + if (tru == true) { + return AddReorte(); + } else { + return OnBoardReportes(); + } + }, '/screen18': (BuildContext context) => AddReorte() }, ), diff --git a/lib/src/extra/OnBoarding_Reporte.dart b/lib/src/extra/OnBoarding_Reporte.dart index a2aff9a..4c15961 100644 --- a/lib/src/extra/OnBoarding_Reporte.dart +++ b/lib/src/extra/OnBoarding_Reporte.dart @@ -2,6 +2,7 @@ import 'package:adcom/src/methods/slide.dart'; import 'package:flutter/material.dart'; import 'package:flutter_onboard/flutter_onboard.dart'; import 'package:gradient_widgets/gradient_widgets.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class OnBoardReportes extends StatefulWidget { OnBoardReportes({Key? key}) : super(key: key); @@ -10,16 +11,22 @@ class OnBoardReportes extends StatefulWidget { _OnBoardReportesState createState() => _OnBoardReportesState(); } +SharedPreferences? prefs; + class _OnBoardReportesState extends State { int? pages = 0; List? _slides = []; PageController? _pageController = PageController(); + getPref() async { + prefs = await SharedPreferences.getInstance(); + } + @override void initState() { super.initState(); pages = 0; - + getPref(); _pageController = PageController(initialPage: pages!); } @@ -94,10 +101,15 @@ class _OnBoardReportesState extends State { onBoardData: onBoardData, pageController: _pageController!, onSkip: () { - Navigator.of(context).popAndPushNamed('/screen18'); + prefs!.setBool('UnaVez', true); + Navigator.of(context) + .popAndPushNamed('/screen18') + .then((value) => prefs!.setBool('UnaVez', true)); }, onDone: () { - Navigator.of(context).popAndPushNamed('/screen18'); + Navigator.of(context) + .popAndPushNamed('/screen18') + .then((value) => {prefs!.setBool('UnaVez', true)}); }, titleStyles: TextStyle( color: Colors.black, diff --git a/lib/src/extra/add_reporte.dart b/lib/src/extra/add_reporte.dart index d4b7989..ccabb25 100644 --- a/lib/src/extra/add_reporte.dart +++ b/lib/src/extra/add_reporte.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:camera/camera.dart'; import 'package:dio/dio.dart'; import 'dart:io'; import 'package:adcom/src/methods/slide.dart'; @@ -10,20 +11,21 @@ import 'package:provider/provider.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:http_parser/http_parser.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:permission_handler/permission_handler.dart'; SharedPreferences? prefs; +var cameras; +var firstCamera; class AddReorte extends StatefulWidget { final Report? report; static init() async { - prefs = await SharedPreferences.getInstance(); + cameras = await availableCameras(); + firstCamera = cameras.first; } - AddReorte({ - Key? key, - this.report, - }) : super(key: key); + AddReorte({Key? key, this.report}) : super(key: key); @override _AddReorteState createState() => _AddReorteState(); @@ -49,12 +51,21 @@ class _AddReorteState extends State { int _currentStep = 0; int? idCom; int? idUser; + late CameraController _controller; + late Future _initializeControllerFuture; + + getCameras() async { + await Permission.camera.request(); + await Permission.storage.request(); + await Permission.manageExternalStorage.request(); + await Permission.mediaLibrary.request(); + } addata() async { prefs = await SharedPreferences.getInstance(); setState(() { idCom = prefs!.getInt('idCom'); - idUser = prefs!.getInt('idUser'); + idUser = prefs!.getInt('userId'); }); } @@ -62,6 +73,7 @@ class _AddReorteState extends State { void initState() { super.initState(); addata(); + getCameras(); } @override @@ -242,7 +254,8 @@ class _AddReorteState extends State { //funcion que abre la camara y muestra void openCamera() async { - var image = await _picker.pickImage(source: ImageSource.camera); + var image = + await _picker.pickImage(source: ImageSource.camera, imageQuality: 85); setState(() { if (image != null) { @@ -338,6 +351,7 @@ class _AddReorteState extends State { for (var item in file) { filesArr.add(item.path.split('/').last); + print(filesArr[0]); } var formdata2 = FormData.fromMap({ @@ -350,7 +364,7 @@ class _AddReorteState extends State { 'img[]': [ for (int i = 0; i < file.length; i++) MultipartFile.fromFileSync(file[i].path, - filename: filesArr[i], contentType: MediaType('image', '*')) + filename: filesArr[i], contentType: MediaType('*', '*')) ] }); @@ -442,6 +456,7 @@ class _AddReorteState extends State { style: TextStyle(fontSize: 19), ))); }); + return response; } } diff --git a/lib/src/extra/dashboard_Avisos.dart b/lib/src/extra/dashboard_Avisos.dart index b8b0ae6..cfe4629 100644 --- a/lib/src/extra/dashboard_Avisos.dart +++ b/lib/src/extra/dashboard_Avisos.dart @@ -1,9 +1,25 @@ +import 'dart:io'; + +import 'package:adcom/src/pantallas/avisos.dart'; +import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; +import 'package:external_path/external_path.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:glyphicon/glyphicon.dart'; +import 'package:path_provider/path_provider.dart'; +// ignore: must_be_immutable class AvisosDashboard extends StatefulWidget { - AvisosDashboard({Key? key}) : super(key: key); + List? avisos = []; + List? links; + List? name; + AvisosDashboard({ + Key? key, + this.links, + this.name, + this.avisos, + }) : super(key: key); @override _AvisosDashboardState createState() => _AvisosDashboardState(); @@ -11,109 +27,298 @@ class AvisosDashboard extends StatefulWidget { class _AvisosDashboardState extends State { List list = []; + List names = []; + List links = []; + VoidCallback? _showPersBottomSheetCallBack; + bool downloading = false; + String progress = '0'; + bool isDownloaded = false; + + @override + void initState() { + _showPersBottomSheetCallBack = _showPersBottomSheetCallBack; + super.initState(); + } @override Widget build(BuildContext context) { - var size = MediaQuery.of(context).size; + var size = MediaQuery.of(context).size.width; + return widget.avisos!.isEmpty ? Container() : viewAvisos(size: size); + } + + viewAvisos({size}) { + return Flexible( + child: GridView.builder( + padding: EdgeInsets.only(), + itemCount: widget.avisos!.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 1, + childAspectRatio: 1.65, + crossAxisSpacing: 25, + mainAxisSpacing: 20, + ), + itemBuilder: (_, int data) { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + border: + Border.all(color: Color(0xFF455A64).withOpacity(0.3))), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + whoPublish(size), + Divider( + color: Color(0xFF455A64).withOpacity(0.3), + ), + postMessage(data, size), + SizedBox( + height: 10, + ), + Divider( + color: Color(0xFF455A64).withOpacity(0.3), + ), + ], + ), + ); + })); + } + + Container postMessage(int data, size) { return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - border: Border.all(color: Color(0xFF455A64).withOpacity(0.3))), + padding: EdgeInsets.only(left: 10, right: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - padding: EdgeInsets.only(top: 10, left: 10), - child: Row( - children: [ - Container( - height: 51, - width: size.width / 9, - decoration: BoxDecoration( - color: Colors.grey[300], shape: BoxShape.circle), - child: Image.asset('assets/images/logo.png'), - ), - SizedBox( - width: size.width / 45, - ), - Text( - 'Administrador', - style: (TextStyle(fontSize: 16, fontWeight: FontWeight.w500)), - ) - ], + Padding( + padding: EdgeInsets.only(left: size / 50), + child: Text( + 'Comunicado! ${widget.avisos![data].avisos}', + style: TextStyle(fontSize: 20), ), ), - Divider( - color: Color(0xFF455A64).withOpacity(0.3), + SizedBox( + height: 15, ), - Container( - padding: EdgeInsets.only(left: 10, right: 10), - child: Column( + InkWell( + onTap: () { + _showModalSheet(data); + }, + child: Row( children: [ - Text( - 'Comunicado! aviso a los residentes que esta semana se cobrara la reparacion del acueducto que se vera reflejadon en sus aplicaciones si tienen dudas pedir detalles a los administradores muchas gracias!', - style: TextStyle(fontSize: 20), + SizedBox( + width: 15, ), + Icon(Glyphicon.download), SizedBox( - height: 15, + width: size / 24, ), - Row( - children: [ - Container( - padding: const EdgeInsets.only(left: 15), - child: Text( - 'Archivo.txt', - style: TextStyle(fontSize: 20), - ), - ), - SizedBox( - width: 15, - ), - Icon(Glyphicon.download) - ], + Text( + 'Archivo adjunto...', + style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold), ) ], ), - ), - Divider( - color: Color(0xFF455A64).withOpacity(0.3), - ), + ) + ], + ), + ); + } + + void _showModalSheet(int data) { + if (names.length == widget.name![data].length) { + } else { + for (int i = 0; i < widget.name![data].length; i++) { + names.add(widget.name![data][i]); + } + } + + if (links.length == widget.links![data].length) { + print('here${links.length}'); + print(' ya no cabe'); + } else { + for (int i = 0; i < widget.links![data].length; i++) { + links.add(widget.links![data][i]); + + print(links[i]); + } + } + + showModalBottomSheet( + elevation: 5, + isDismissible: true, + clipBehavior: Clip.antiAliasWithSaveLayer, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(20))), + context: context, + builder: (context) => Container( + height: 300, + alignment: Alignment.center, + child: DraggableScrollableSheet( + maxChildSize: 0.9, + initialChildSize: 0.9, + expand: true, + builder: (_, controller) => Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Descarga Archivos', + style: TextStyle( + fontSize: 20, fontWeight: FontWeight.bold), + ), + SizedBox( + height: 40, + ), + Flexible( + child: ListView.separated( + separatorBuilder: (context, index) { + return Divider( + color: Colors.black, + ); + }, + itemCount: names.length, + itemBuilder: (_, int index) { + return TextButton( + onPressed: () async { + download2(links[index], names[index]) + .then((value) { + Fluttertoast.showToast( + msg: "Archivo en Descargas", + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.CENTER, + timeInSecForIosWeb: 1, + backgroundColor: Colors.white, + textColor: Colors.black, + fontSize: 17.0); + }); + /* downloadLink( + links[index], names[index]); */ + }, + child: Text('${names[index]}'), + ); + })) + ], + )), + )).then((value) => {names.clear()}); + } + + Future? downloadLink(link, names) async { + setState(() { + downloading = true; + }); + Dio dio = Dio(); + String savePath = await getPath(names); + + print('${savePath}'); + print('aquui'); + String urlPath = link; + dio.download( + urlPath, + savePath, + onReceiveProgress: (rcv, total) { + print( + 'received: ${rcv.toStringAsFixed(0)} out of total: ${total.toStringAsFixed(0)}'); + + setState(() { + progress = ((rcv / total) * 100).toStringAsFixed(0); + }); + + if (progress == '100') { + setState(() { + isDownloaded = true; + }); + } else if (double.parse(progress) < 100) { + print('aqui'); + } + }, + deleteOnError: true, + ).then((_) { + setState(() { + if (progress == '100') { + isDownloaded = true; + } + + downloading = false; + }); + }).onError((error, stackTrace) { + print('$error'); + }); + } + + Future download2(String url, String names) async { + Dio dio = Dio(); + + String savePath = await getPath(names); + try { + Response response = await dio.get( + url, + onReceiveProgress: showDownloadProgress, + //Received data with List + options: Options( + responseType: ResponseType.bytes, + followRedirects: false, + validateStatus: (status) { + return status! < 500; + }), + ); + print(response.headers); + File file = File(savePath); + var raf = file.openSync(mode: FileMode.write); + // response.data is List type + raf.writeFromSync(response.data); + await raf.close(); + } catch (e) { + print(e); + } + } + + void showDownloadProgress(received, total) { + if (total != -1) { + print((received / total * 100).toStringAsFixed(0) + "%"); + } + } + + Future getPath(names) async { + String path = await ExternalPath.getExternalStoragePublicDirectory( + ExternalPath.DIRECTORY_DOWNLOADS); + + print(path); + var filePath = path + '/$names'; + + return filePath; + } + + Container whoPublish(size) { + return Container( + padding: EdgeInsets.only(top: 10, left: 10), + child: Row( + children: [ Container( - padding: EdgeInsets.only(left: 18), - child: Row( - children: [ - Icon(Glyphicon.heart), - SizedBox( - width: 5, - ), - Container( - padding: EdgeInsets.only(bottom: 3), - child: Text('Likes 20')) - ], - )), + height: 51, + width: size / 9, + decoration: + BoxDecoration(color: Colors.grey[300], shape: BoxShape.circle), + child: Image.asset('assets/images/logo.png'), + ), SizedBox( - height: 5, + width: size / 45, + ), + Text( + 'Administrador', + style: (TextStyle(fontSize: 16, fontWeight: FontWeight.w500)), ) ], ), ); } +} - viewAvisos() { - return Flexible( - child: GridView.builder( - padding: EdgeInsets.only(), - itemCount: list.length, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 1, - childAspectRatio: 3.9, - crossAxisSpacing: 15, - mainAxisSpacing: 15, - ), - itemBuilder: (_, int data) { - return Container(); - })); - } +class Links { + var links; + + Links({this.links}); } -class Avisos {} +class NameLinks { + var names; + NameLinks({this.names}); +} diff --git a/lib/src/extra/nuevo_post.dart b/lib/src/extra/nuevo_post.dart index 2b832eb..4542f41 100644 --- a/lib/src/extra/nuevo_post.dart +++ b/lib/src/extra/nuevo_post.dart @@ -1,147 +1,442 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:dio/dio.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:http/http.dart' as http; +import 'package:adcom/json/tipoAvisot.dart'; +import 'package:adcom/src/pantallas/avisos.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:glyphicon/glyphicon.dart'; +import 'package:gradient_widgets/gradient_widgets.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:http_parser/src/media_type.dart'; -class MakeNewPost extends StatefulWidget { - MakeNewPost({Key? key}) : super(key: key); +SharedPreferences? prefs; +// ignore: must_be_immutable +class MakeNewPost extends StatefulWidget { + MakeNewPost({Key? key, this.idComu, this.comunities}) : super(key: key); + List? idComu; + List? comunities = []; @override _MakeNewPostState createState() => _MakeNewPostState(); } class _MakeNewPostState extends State { + final GlobalKey _formKey = GlobalKey(); + final titleController = TextEditingController(); + String? chosenValue; + String? chosenValue2; + int? idCom; + List file = []; + int? idA; + List avisos = []; + List? nameFile = []; + List type = []; + @override + void initState() { + super.initState(); + } + @override Widget build(BuildContext context) { var size = MediaQuery.of(context).size; return Scaffold( + floatingActionButton: FloatingActionButton( + backgroundColor: Colors.blueGrey[700], + onPressed: onSave, + child: Icon( + Glyphicon.pencil, + color: Colors.white, + ), + ), appBar: AppBar( title: Text('Nuevo Post'), + automaticallyImplyLeading: false, elevation: 4.0, backgroundColor: Colors.blueGrey[700], + leading: CloseButton(), ), body: SafeArea( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Padding( - padding: const EdgeInsets.only(left: 25, top: 15), - child: Container( - height: 51, - width: size.width / 9, - decoration: BoxDecoration( - color: Colors.grey[300], shape: BoxShape.circle), - child: Image.asset( - 'assets/images/logo.png', - ), - ), - ), - SizedBox( - width: size.width / 55, - ), - Padding( - padding: EdgeInsets.only(top: size.width / 39), - child: Text('Administrador', - style: (TextStyle( - fontSize: 16, fontWeight: FontWeight.w500))), - ) - ], - ), - Container( - padding: EdgeInsets.only(top: 20, left: 20, right: 20), - child: TextFormField( - autofocus: true, - decoration: InputDecoration( - labelText: "¿Algo para decir?", - labelStyle: TextStyle( - color: Colors.black, - fontSize: 16, - fontWeight: FontWeight.w500), - fillColor: Colors.white, - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(25.0), - borderSide: BorderSide(color: Color(0xFF455A64))), - ), - inputFormatters: [LengthLimitingTextInputFormatter(200)])), - SizedBox( - height: size.width / 20, - ), - Divider( - color: Color(0xFF455A64).withOpacity(0.3), - thickness: 1.1, - ), - Padding( - padding: EdgeInsets.only(left: 20, top: 10, right: 20), - child: Column( + child: ListView(children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( children: [ - Row( - children: [ - Icon( - Glyphicon.image, - color: Colors.green, - size: 25, + Padding( + padding: const EdgeInsets.only(left: 25, top: 15), + child: Container( + height: 51, + width: size.width / 9, + decoration: BoxDecoration( + color: Colors.grey[300], shape: BoxShape.circle), + child: Image.asset( + 'assets/images/logo.png', ), - SizedBox( - width: size.width / 20, - ), - Text( - 'Selecciona una image', - style: TextStyle( - fontSize: 16, fontWeight: FontWeight.w300), - ) - ], + ), ), SizedBox( - height: size.width / 20, - child: Divider( - color: Color(0xFF455A64).withOpacity(0.3), - thickness: 1.1, - ), + width: size.width / 55, ), - Row( - children: [ - Icon( - Glyphicon.paperclip, - color: Colors.pink, - size: 25, - ), - SizedBox( - width: size.width / 20, - ), - Text('Selecciona un archivo', - style: TextStyle( - fontSize: 16, fontWeight: FontWeight.w300)) - ], + Padding( + padding: EdgeInsets.only(top: size.width / 39), + child: Text('Administrador', + style: (TextStyle( + fontSize: 16, fontWeight: FontWeight.w500))), ), SizedBox( - height: size.width / 20, - child: Divider( - color: Color(0xFF455A64).withOpacity(0.3), - thickness: 1.1, - ), + width: size.width / 6, ), - Row( + drop() + ], + ), + Container( + padding: EdgeInsets.only(top: 20, left: 20, right: 20), + child: Form( + key: _formKey, + child: TextFormField( + controller: titleController, + onFieldSubmitted: (_) => onSave(), + validator: (title) => title != null && title.isEmpty + ? 'Este campo no puede estar vacio' + : null, + autofocus: true, + maxLines: 4, + keyboardType: TextInputType.multiline, + decoration: InputDecoration( + labelText: "¿Algo para decir?", + labelStyle: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.w500), + fillColor: Colors.white, + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(25.0), + borderSide: BorderSide(color: Color(0xFF455A64))), + ), + inputFormatters: [ + LengthLimitingTextInputFormatter(200) + ]), + )), + SizedBox( + height: size.width / 20, + ), + Divider( + color: Color(0xFF455A64).withOpacity(0.3), + thickness: 1.1, + ), + Padding( + padding: EdgeInsets.only(left: 20, top: 10, right: 20), + child: InkWell( + onTap: () async { + Fluttertoast.showToast( + msg: "Mantenga Presionado el archivo", + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.CENTER, + timeInSecForIosWeb: 1, + backgroundColor: Colors.white, + textColor: Colors.black, + fontSize: 17.0); + await filePick().then((value) => { + if (value != null) + { + for (var item in value) + { + //print('here ${item!.path.split('/').last}'), + nameFile! + .add(Text(item!.path.split('/').last)) + } + } + else + {print('no existe')} + }); + setState(() { + newFiles(); + }); + }, + child: Column( children: [ - Icon( - Glyphicon.file_earmark_pdf, - color: Colors.purpleAccent, - size: 25, + Row( + children: [ + Icon( + Glyphicon.paperclip, + color: Colors.pink, + size: 25, + ), + SizedBox( + width: size.width / 20, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Selecciona varios archivos', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold)), + SizedBox( + height: size.width / 20, + ), + nameFile!.isEmpty ? Container() : newFiles() + ], + ), + ], ), - SizedBox( - width: size.width / 20, - ), - Text('Selecciona un PDF', - style: TextStyle( - fontSize: 16, fontWeight: FontWeight.w300)) ], - ) - ], + ), + ), ), - ) - ], - ), + SizedBox( + height: size.width / 15, + child: Divider( + color: Color(0xFF455A64).withOpacity(0.3), + thickness: 1.1, + ), + ), + Center( + child: Padding( + padding: const EdgeInsets.only(left: 20, top: 10), + child: DropdownButton( + elevation: 6, + value: chosenValue, + style: TextStyle(color: Colors.black), + items: widget.idComu! + .map>((String value) { + return DropdownMenuItem( + value: value, child: Text(value)); + }).toList(), + onChanged: (val) { + print(val); + print(chosenValue); + if (chosenValue == null) { + setState(() { + chosenValue = val; + }); + sendId(); + } else { + if (val != chosenValue) { + print('aqui2'); + } else { + if (val == chosenValue) { + } else { + sendId().then((value) => avisos.clear()); + } + } + } + }, + hint: Text("Elige una comunidad", + style: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.w600)), + ), + ), + ), + ], + ) + ]), ), ); } + + drop() { + return chosenValue == null + ? Container() + : Container( + padding: EdgeInsets.only(top: 10), + child: DropdownButton( + focusColor: Colors.white, + value: chosenValue2, + //elevation: 5, + style: TextStyle(color: Colors.white), + iconEnabledColor: Colors.black, + items: type.map>((String value) { + return DropdownMenuItem( + value: value, + child: Text( + value, + style: TextStyle(color: Colors.black), + ), + ); + }).toList(), + hint: Text( + "Tipo aviso", + style: TextStyle( + color: Colors.black, + fontSize: 14, + fontWeight: FontWeight.w500), + ), + onChanged: (value) { + setState(() { + chosenValue2 = value; + }); + + getIdAviso(); + }, + ), + ); + } + + Column newFiles() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: nameFile!, + ); + } + + getIdAviso() { + for (int i = 0; i < avisos.length; i++) { + if (chosenValue2 == avisos[i].tipoAviso) { + setState(() { + idA = avisos[i].idCatTipoAviso!; + }); + } + } + } + + Future sendId() async { + for (int i = 0; i < widget.comunities!.length; i++) { + if (chosenValue == widget.comunities![i].nombreComu) { + setState(() { + idCom = widget.comunities![i].id; + }); + } + } + + await getTipoAviso().then((value) => { + for (int i = 0; i < value!.data!.length; i++) + { + type.add(value.data![i].tipoAviso!), + avisos.add(new TipoAvisoS( + tipoAviso: value.data![i].tipoAviso, + idCatTipoAviso: value.data![i].idCatTipoaviso, + idCom: value.data![i].idCom)) + } + }); + } + + Future?> filePick() async { + FilePickerResult? result = + await FilePicker.platform.pickFiles(allowMultiple: true); + + if (result != null) { + file = result.paths.map((path) => File(path!)).toList(); + + return file; + } else { + Fluttertoast.showToast( + msg: "No selecciono archivos", + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.CENTER, + timeInSecForIosWeb: 1, + backgroundColor: Colors.white, + textColor: Colors.black, + fontSize: 17.0); + } + } + + Future onSave() async { + final isValid = _formKey.currentState!.validate(); + prefs = await SharedPreferences.getInstance(); + var id = prefs!.getInt('idPrimario'); + if (isValid) { + if (chosenValue != null && chosenValue2 != null) { + await sendingData(idCom!, titleController.text, nameFile!, id!, idA!) + .then((value) => { + Navigator.of(context).pop(), + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text( + 'Su reporte se ha realizado con exito!', + style: TextStyle(fontSize: 19), + ))) + }); + } else { + Fluttertoast.showToast( + msg: "Seleccione comunidad", + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.CENTER, + timeInSecForIosWeb: 1, + backgroundColor: Colors.white, + textColor: Colors.black, + fontSize: 17.0); + } + } else { + Fluttertoast.showToast( + msg: "Sus datos son incorrectos", + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.CENTER, + timeInSecForIosWeb: 1, + backgroundColor: Colors.white, + textColor: Colors.black, + fontSize: 17.0); + } + } + + Future sendingData( + int idCom, + String aviso, + List nameFile, + int id, + int idA, + ) async { + try { + List filesArr = []; + Dio dio = Dio(); + + for (var item in file) { + print(file.length); + filesArr.add(item.path.split('/').last); + } + + var formdata2 = FormData.fromMap({ + 'params': json.encode( + {'userId': id, 'comId': idCom, 'tipoAvisoId': idA, 'aviso': aviso}), + 'archivos[]': [ + for (int i = 0; i < file.length; i++) + MultipartFile.fromFileSync(file[i].path, + filename: filesArr[i], contentType: MediaType('*', '*')) + ] + }); + Response response = await dio.post( + 'http://187.189.53.8:8081/backend/web/index.php?r=adcom/crear-aviso', + data: formdata2, onSendProgress: (received, total) { + if (total != 1) { + print((received / total * 100).toStringAsFixed(0) + '%'); + } + }); + + if (response.statusCode == 200) { + print('aqui $response'); + } + } on DioError catch (e) { + if (e.response!.data == true) { + print('aqui1:${e.response!.data.toString()}'); + return; + } else { + print('aqui2:${e.response!.data.toString()}'); + } + } + } + + Future getTipoAviso() async { + final Uri url = Uri.parse( + 'http://187.189.53.8:8081/backend/web/index.php?r=adcom/get-tipo-aviso'); + final response = await http.post(url, body: {"idCom": idCom.toString()}); + + if (response.statusCode == 200) { + var data = response.body; + print(data); + return tipoAvisoFromJson(data); + } + } +} + +class TipoAvisoS { + int? idCatTipoAviso; + String? tipoAviso; + int? idCom; + + TipoAvisoS({this.idCatTipoAviso, this.idCom, this.tipoAviso}); } diff --git a/lib/src/extra/report_edit_page.dart b/lib/src/extra/report_edit_page.dart index 511ce75..f99097a 100644 --- a/lib/src/extra/report_edit_page.dart +++ b/lib/src/extra/report_edit_page.dart @@ -3,13 +3,25 @@ import 'package:adcom/src/extra/add_reporte.dart'; import 'package:adcom/src/extra/reporte.dart'; import 'package:flutter/material.dart'; import 'package:im_stepper/stepper.dart'; +import 'dart:convert'; // ignore: must_be_immutable class ReportEditPage extends StatefulWidget { + final int? id; final DataReporte report; - final List progreso; + final List data; - ReportEditPage({Key? key, required this.report, required this.progreso}) + Map? progreso; + Map? datos; + Map? superMap = {}; + + ReportEditPage( + {Key? key, + required this.report, + required this.data, + this.datos, + this.progreso, + this.id}) : super(key: key); @override @@ -18,13 +30,64 @@ class ReportEditPage extends StatefulWidget { class _ReportEditPageState extends State { var activestep = 0; + List progreso = []; + var data; + List progres = []; + List datosp = []; + + List progresFromJson(String str) => + List.from(json.decode(str).map((x) => x)); + + String progresToJson(List data) => + json.encode(List.from(data.map((x) => x))); + estatus() { + widget.progreso!.forEach((key, value) { + if (widget.id == key) { + value.forEach((key, value) { + if (key == 'Progreso') { + setState(() { + for (int i = 0; i < value.length; i++) { + progres.add(new ProgressIndicator(id: value[i])); + } + }); + } + }); + } else { + return; + } + }); + } + + datos() { + widget.datos!.forEach((key, value) { + if (widget.id == key) { + value.forEach((key, value) { + if (key == 'Datos') { + setState(() { + for (int i = 0; i < value.length; i++) { + datosp.add(new DatosProgreso(coment: value[i])); + } + }); + } + }); + } else { + return; + } + }); + } + @override void initState() { + estatus(); + datos(); + super.initState(); } @override Widget build(BuildContext context) { + var size = MediaQuery.of(context).size.width; + var size2 = MediaQuery.of(context).size.width; return Scaffold( appBar: AppBar( title: Text('Seguimiento de reporte'), @@ -38,15 +101,18 @@ class _ReportEditPageState extends State { IconStepper( icons: [ Icon(Icons.supervised_user_circle), + Icon(Icons.check), Icon(Icons.flag), Icon(Icons.access_alarm), Icon(Icons.check) ], - activeStep: widget.progreso.last.id!, + activeStep: progres.isEmpty ? 0 : progres.last.id, onStepReached: (index) { setState(() { - for (int i = 0; i < widget.progreso.length; i++) { - widget.progreso[i].id = index; + if (progres.isEmpty) { + activestep = index; + } else { + progres.last.id = index; } }); }, @@ -59,7 +125,7 @@ class _ReportEditPageState extends State { SizedBox( height: 20, ), - plainText() + plainText(size) ], ), )); @@ -68,7 +134,7 @@ class _ReportEditPageState extends State { Widget header() { return Container( decoration: BoxDecoration( - color: Colors.grey, borderRadius: BorderRadius.circular(5)), + color: stepColor(), borderRadius: BorderRadius.circular(5)), child: Row( children: [ Padding( @@ -84,9 +150,33 @@ class _ReportEditPageState extends State { ); } - Widget plainText() { - switch (widget.progreso.last.id!) { + Widget plainText(size) { + switch (progres.isEmpty ? 0 : progres.last.id) { case 1: + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Atencion:', + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18), + ), + SizedBox( + height: 10, + ), + Text( + 'Se ha enviado su reporte', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.w300), + ), + SizedBox( + height: 10, + ), + Text( + 'Se le notificara el cambio de estado del reporte', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.w300), + ) + ], + ); + case 2: return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -110,7 +200,7 @@ class _ReportEditPageState extends State { ) ], ); - case 2: + case 3: return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -129,9 +219,22 @@ class _ReportEditPageState extends State { SizedBox( height: 10, ), - Text( - 'Comentarios:', - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18), + Row( + children: [ + Text( + 'Comentarios:', + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18), + ), + SizedBox( + width: size / 20, + ), + SizedBox( + width: size / 2, + child: Text('${datosp[2].coment}', + style: + TextStyle(fontWeight: FontWeight.w400, fontSize: 18)), + ) + ], ), SizedBox( height: 10, @@ -142,7 +245,7 @@ class _ReportEditPageState extends State { ) ], ); - case 3: + case 4: return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -165,17 +268,34 @@ class _ReportEditPageState extends State { } } + Color? stepColor() { + switch (progres.isEmpty ? 0 : progres.last.id) { + case 1: + return Colors.yellow; + case 2: + return Colors.lightGreen[200]; + case 3: + return Colors.lightGreen[300]; + case 4: + return Colors.lightGreen; + + default: + return Colors.grey; + } + } + String? headerText() { - switch (widget.progreso.last.id!) { + switch (progres.isEmpty ? 0 : progres.last.id) { case 1: - return 'Revision'; + return 'En proceso'; case 2: + return 'Revision'; + case 3: return 'Respuesta'; case 4: return 'Finalizado'; - default: - return 'En proceso'; + return 'Enviado'; } } @@ -229,3 +349,15 @@ class _ReportEditPageState extends State { ); } } + +class ProgressIndicator { + var id; + + ProgressIndicator({this.id}); +} + +class DatosProgreso { + var coment; + + DatosProgreso({this.coment}); +} diff --git a/lib/src/extra/reporte.dart b/lib/src/extra/reporte.dart index 7dacbef..8550109 100644 --- a/lib/src/extra/reporte.dart +++ b/lib/src/extra/reporte.dart @@ -27,7 +27,7 @@ dataOff5(id) async { Future getReportes() async { prefs = await SharedPreferences.getInstance(); - var id = prefs!.getInt('id'); + var id = prefs!.getInt('userId'); //CAMBIAR POR id Uri url = Uri.parse( 'http://187.189.53.8:8081/backend/web/index.php?r=adcom/get-reportes'); @@ -35,7 +35,6 @@ Future getReportes() async { if (response.statusCode == 200) { var data = response.body; - print(data); return getReportesFromJson(data); } else { @@ -46,9 +45,24 @@ Future getReportes() async { class _LevantarReporteState extends State { List myList = []; List listProgreso = []; - var contador; + List idProgress = []; + // progreso data + var maps = {}; + var progreso = {}; + List> superMap = []; + + // datos del progreso + //mapeado dinamico que espera otro mapeado + var maps2 = {}; + // mapeado dinamico que espera dinamico + //dinamico es tu tipo de variable que toma cualquier valor + var datos = {}; + //lista mapeada dinamica que espera otro mapeado + List> superMap2 = []; + GetReportes? cuentas; + //obtiene los datos del service data() async { cuentas = await getReportes(); for (int i = 0; i < cuentas!.data!.length; i++) { @@ -60,20 +74,41 @@ class _LevantarReporteState extends State { uri: cuentas!.data![i].evidencia!.toList())); for (int j = 0; j < cuentas!.data![i].progreso!.length; j++) { - /* print("conta $contador"); - print("len: ${cuentas!.data![i].progreso!.length}"); */ - /* if (contador == cuentas!.data![i].progreso!.length) { - print('here'); - break; - } else { */ - listProgreso.add(new Progreso( - id: cuentas!.data![i].progreso![j].idProgreso, + //mapeado del estatus asgigando id + var progress = []; + //añade los estatus a la lista progress + cuentas!.data![i].progreso!.forEach((element) { + setState(() { + progress.add(element.idProgreso); + }); + }); + //se mapea la lista progress + + progreso = {"Progreso": progress}; + + //mapeado + maps.addAll({cuentas!.data![i].idReporte: progreso}); + + var datosProgres = []; + cuentas!.data![i].progreso!.forEach((element) { + setState(() { + datosProgres.add(element.comentario); + }); + }); + datos = {"Datos": datosProgres}; + maps2.addAll({cuentas!.data![i].idReporte: datos}); + + /* listProgreso.add(new Progreso( time: cuentas!.data![i].progreso![j].fechaSeg, comentario: cuentas!.data![i].progreso![j].comentario, - progreso: cuentas!.data![i].progreso![j].progreso)); + progreso: cuentas!.data![i].progreso![j].progreso)); */ } - //} + superMap2.add(maps2); + superMap.add(maps); + print(superMap[0]); + print(superMap2[0]); + superMap = superMap; } } @@ -81,6 +116,7 @@ class _LevantarReporteState extends State { void initState() { data(); super.initState(); + Future.delayed(Duration(milliseconds: 988), () => {refresh()}); } @@ -142,7 +178,12 @@ class _LevantarReporteState extends State { onTap: () { Navigator.of(context).push(MaterialPageRoute( builder: (_) => ReportEditPage( - report: myList[index], progreso: listProgreso))); + report: myList[index], + data: listProgreso, + progreso: superMap[index], + datos: superMap2[index], + id: myList[index].id, + ))); }, title: Text( '${myList[index].descripCorta}', diff --git a/lib/src/methods/event_editing_page.dart b/lib/src/methods/event_editing_page.dart index 0ed849c..deb3634 100644 --- a/lib/src/methods/event_editing_page.dart +++ b/lib/src/methods/event_editing_page.dart @@ -24,12 +24,6 @@ class EventEditingPage extends StatefulWidget { _EventEditingPageState createState() => _EventEditingPageState(); } -accesData(comId, userId) async { - await EventEditingPage.init(); - prefs!.setInt('idCom', comId); - prefs!.setInt('idUser', userId); -} - //intentar llamar id Amenidad de otra manera class _EventEditingPageState extends State { @@ -45,7 +39,7 @@ class _EventEditingPageState extends State { prefs = await SharedPreferences.getInstance(); setState(() { idCom = prefs!.getInt('idCom'); - idUser = prefs!.getInt('idUser'); + idUser = prefs!.getInt('userId'); }); } diff --git a/lib/src/methods/gridDashboard.dart b/lib/src/methods/gridDashboard.dart index 60169ac..3f99e74 100644 --- a/lib/src/methods/gridDashboard.dart +++ b/lib/src/methods/gridDashboard.dart @@ -31,7 +31,7 @@ class _GridDashboardState extends State { Items item2 = new Items( title: 'Avisos', - /* route: '/screen4' */ + route: '/screen4', icon: Icon(Icons.announcement_rounded, size: 50, color: Colors.blueGrey[700])); @@ -98,7 +98,7 @@ class _GridDashboardState extends State { Widget build(BuildContext context) { switch (widget.userId) { case 1: - myList = [item1, item5, item4]; + myList = [item1, item5, item4, item2]; break; case 2: @@ -107,10 +107,6 @@ class _GridDashboardState extends State { item4, item5, item2, - item3, - item6, - item7, - item8, ]; break; diff --git a/lib/src/models/event_provider.dart b/lib/src/models/event_provider.dart index babb6d7..da29422 100644 --- a/lib/src/models/event_provider.dart +++ b/lib/src/models/event_provider.dart @@ -76,17 +76,17 @@ class EventProvider extends ChangeNotifier { var comId = post.idCom; userd = post.nombreResidente; var userType = post.idPerfil; - somData(userd, userType); - obtainId(userType); - accesData(comId, userId); - dataOff2(idPrimario, userType); + somData(userd, userType, comId, idPrimario, userId); + //obtainId(userType); + + /* dataOff2(idPrimario, userType); dataOff4(idPrimario); someData(comId, userId); //Adeudos dataOff3(userId); //amenidades - dataOff5(userId); + dataOff5(userId); */ Navigator.pushReplacementNamed(ctx, '/'); } diff --git a/lib/src/pantallas/avisos.dart b/lib/src/pantallas/avisos.dart index a6ad663..53b7bd7 100644 --- a/lib/src/pantallas/avisos.dart +++ b/lib/src/pantallas/avisos.dart @@ -1,8 +1,16 @@ +import 'dart:convert'; + +import 'package:adcom/json/json-getComunidades.dart'; +import 'package:adcom/json/obtenerAvisos.dart'; import 'package:adcom/src/extra/dashboard_Avisos.dart'; import 'package:adcom/src/extra/nuevo_post.dart'; import 'package:adcom/src/methods/searchBar.dart'; import 'package:flutter/material.dart'; import 'package:onesignal_flutter/onesignal_flutter.dart'; +import 'package:http/http.dart' as http; +import 'package:shared_preferences/shared_preferences.dart'; + +SharedPreferences? prefs; class Avisos extends StatefulWidget { final id; @@ -15,44 +23,99 @@ class Avisos extends StatefulWidget { class _AvisosState extends State { bool _requierConsent = true; int _selectedIndex = 0; - @override - void initState() { - super.initState(); - } + List comunities = []; + List idComName = []; - static const List _widgetOptions = [ - Text('Avisos'), - Text('Archivos'), - ]; + List avisos = []; + List? links; + List? name; - void _onItemTapped(int index) { + List hLinks = []; + var nombres = {}; + var Link = {}; + List> superMap2 = []; + var typeUser; + var idComu; + //funcion que checa el usuario y llama a las funciones si es el usuario maestro + Future userCheck() async { + prefs = await SharedPreferences.getInstance(); setState(() { - _selectedIndex = index; + typeUser = prefs!.getInt('userType'); + idComu = prefs!.getInt('idCom'); }); - } - Future? initStatePlatform() async { - if (!mounted) return; + print('$typeUser'); + print('here $idComu'); - OneSignal.shared.setLogLevel(OSLogLevel.verbose, OSLogLevel.none); + if (typeUser == 2) { + AvisosCall().getComunidades().then((value) => { + for (int i = 0; i < value!.data!.length; i++) + { + idComName.add(value.data![i].nombreComu!), + comunities.add(AvisosCall( + id: value.data![i].idCom, + nombreComu: value.data![i].nombreComu, + ubicacion: value.data![i].ubicacion, + cp: value.data![i].cp, + idAdmin: value.data![i].idAdministrador == null + ? 0 + : value.data![i].idAdministrador, + idComite: value.data![i].idComite == null + ? 0 + : value.data![i].idComite, + idTipoComu: value.data![i].idTipoComu, + banco: value.data![i].banco, + cuentaBanco: value.data![i].cuentaBanco, + cuentaClabe: value.data![i].cuentaClabe, + RFC: value.data![i].rfc)), + } + }); + } else { + print('usario no aceptado'); + } - OneSignal.shared.setRequiresUserPrivacyConsent(_requierConsent); - - OneSignal.shared.setNotificationOpenedHandler((result) { - print('Notification ha sido abierta $result'); - this.setState(() {}); - }); - - OneSignal.shared.setInAppMessageClickedHandler((action) { - this.setState(() {}); - }); + AvisosUsuario() + .getAvisos(idComu) + .then((value) => { + for (int i = 0; i < value!.data!.length; i++) + { + avisos.add(new AvisosUsuario( + avisos: value.data![i].aviso, + tipoAviso: value.data![i].tipoAviso, + fecha: value.data![i].fechaAviso, + )), + }, + links = List.generate( + value.data!.length, + (index2) => List.generate( + value.data![index2].archivos!.length, + (index) => value + .data![index2].archivos![index].direccionArchivo), + growable: true), + name = List.generate( + value.data!.length, + (index2) => List.generate( + value.data![index2].archivos!.length, + (index) => + value.data![index2].archivos![index].nombreArchivo), + growable: true), + }) + .whenComplete(() => refresh()); + } - OneSignal.shared.setSubscriptionObserver((changes) { - print('La subscripcion ha cambiado ${changes.jsonRepresentation()}'); - }); + @override + void initState() { + userCheck(); + super.initState(); + } - OneSignal.shared.setPermissionObserver((changes) { - print('El permiso ha cambiado ${changes.jsonRepresentation()}'); + refresh() { + setState(() { + if (mounted) { + AvisosDashboard( + avisos: avisos, + ); + } }); } @@ -116,31 +179,138 @@ class _AvisosState extends State { ), ), SizedBox( - height: size.width / 8, + height: size.width / 12, ), - AvisosDashboard() + avisos.isEmpty + ? Center( + child: Container( + padding: EdgeInsets.only(top: 25), + child: CircularProgressIndicator())) + : AvisosDashboard( + links: links, + name: name, + avisos: avisos, + ) ], ), )) ], ), - bottomNavigationBar: BottomAppBar( - shape: const CircularNotchedRectangle(), - child: Container(height: 50.0), - ), - floatingActionButton: FloatingActionButton( - elevation: 5, - backgroundColor: Colors.blueGrey[700], - onPressed: () { - Navigator.of(context) - .push(MaterialPageRoute(builder: (_) => MakeNewPost())); - }, - tooltip: 'add post', - child: const Icon( - Icons.add, - ), - ), + bottomNavigationBar: typeUser == 2 + ? BottomAppBar( + shape: const CircularNotchedRectangle(), + child: Container(height: 50.0), + ) + : null, + floatingActionButton: typeUser == 2 + ? FloatingActionButton( + elevation: 5, + backgroundColor: Colors.blueGrey[700], + onPressed: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => MakeNewPost( + idComu: idComName, + comunities: comunities, + ))); + }, + tooltip: 'add post', + child: const Icon( + Icons.add, + ), + ) + : null, floatingActionButtonLocation: - FloatingActionButtonLocation.centerDocked); + typeUser == 2 ? FloatingActionButtonLocation.centerDocked : null); + } + + Future? initStatePlatform() async { + if (!mounted) return; + + OneSignal.shared.setLogLevel(OSLogLevel.verbose, OSLogLevel.none); + + OneSignal.shared.setRequiresUserPrivacyConsent(_requierConsent); + + OneSignal.shared.setNotificationOpenedHandler((result) { + print('Notification ha sido abierta $result'); + this.setState(() {}); + }); + + OneSignal.shared.setInAppMessageClickedHandler((action) { + this.setState(() {}); + }); + + OneSignal.shared.setSubscriptionObserver((changes) { + print('La subscripcion ha cambiado ${changes.jsonRepresentation()}'); + }); + + OneSignal.shared.setPermissionObserver((changes) { + print('El permiso ha cambiado ${changes.jsonRepresentation()}'); + }); + } +} + +class AvisosCall { + int? id; + String? nombreComu; + String? ubicacion; + int? cp; + int? idAdmin; + int? idComite; + String? idTipoComu; + String? banco; + String? cuentaBanco; + String? cuentaClabe; + String? RFC; + + AvisosCall( + {this.id, + this.nombreComu, + this.RFC, + this.banco, + this.cp, + this.idTipoComu, + this.cuentaBanco, + this.cuentaClabe, + this.idAdmin, + this.idComite, + this.ubicacion}); + + Future getComunidades() async { + Uri url = Uri.parse( + "http://187.189.53.8:8081/backend/web/index.php?r=adcom/get-comunities"); + + final response = await http.get(url); + + if (response.statusCode == 200) { + var data = response.body; + + return comunitiesFromJson(data); + } + } +} + +class AvisosUsuario { + int? id; + String? avisos; + int? tipoAviso; + DateTime? fecha; + + AvisosUsuario({ + this.avisos, + this.fecha, + this.tipoAviso, + this.id, + }); + + Future getAvisos(int id) async { + Uri url = Uri.parse( + "http://187.189.53.8:8081/backend/web/index.php?r=adcom/get-avisos-by-residente"); + final response = await http.post(url, body: {'idCom': id.toString()}); + + if (response.statusCode == 200) { + var data = response.body; + + return getAvisosFromJson(data); + } } } diff --git a/lib/src/pantallas/finanzas.dart b/lib/src/pantallas/finanzas.dart index f34bf31..978858c 100644 --- a/lib/src/pantallas/finanzas.dart +++ b/lib/src/pantallas/finanzas.dart @@ -35,12 +35,12 @@ dataOff3(id) async { Future getAdeudos() async { prefs = await SharedPreferences.getInstance(); - var id = prefs!.getInt('idUser'); - + var id = prefs!.getInt('userId'); + print(id); final Uri url = Uri.parse( 'http://187.189.53.8:8081/backend/web/index.php?r=adcom/get-adeudos'); final response = await http.post(url, body: { - "params": json.encode({"usuarioId": id}) + "params": json.encode({"usuarioId": id.toString()}) }); if (response.statusCode == 200) { diff --git a/lib/src/pantallas/loginPage.dart b/lib/src/pantallas/loginPage.dart index 0444425..61e7be1 100644 --- a/lib/src/pantallas/loginPage.dart +++ b/lib/src/pantallas/loginPage.dart @@ -33,8 +33,6 @@ Future loginAcces(String user, String pass) async { var data = response.body; return postingFromJson(data); - } else { - return null; } } diff --git a/lib/src/pantallas/mainMenu.dart b/lib/src/pantallas/mainMenu.dart index acb3f0e..f408717 100644 --- a/lib/src/pantallas/mainMenu.dart +++ b/lib/src/pantallas/mainMenu.dart @@ -21,16 +21,20 @@ class MainMenu extends StatefulWidget { _MainMenuState createState() => _MainMenuState(); } -somData(user, userType) async { +somData(user, userType, idCom, idPrimario, userId) async { await MainMenu.init(); prefs!.setString('user', user); prefs!.setInt('userType', userType); + prefs!.setInt('idCom', idCom); + prefs!.setInt('idPrimario', idPrimario); + prefs!.setInt('userId', userId); } class _MainMenuState extends State { var user; int? userType; + int? idCom; bool entrada = true; Places? acceso; diff --git a/pubspec.lock b/pubspec.lock index e4d9647..8a1ce25 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -127,6 +127,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.0" + external_path: + dependency: "direct main" + description: + name: external_path + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" fake_async: dependency: transitive description: @@ -148,6 +155,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.2" + file_picker: + dependency: "direct main" + description: + name: file_picker + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.1" filter_list: dependency: "direct main" description: @@ -457,6 +471,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.11.1" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + url: "https://pub.dartlang.org" + source: hosted + version: "8.1.4+2" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "3.6.1" petitparser: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 005d76a..5e6ce62 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.1.1+14 +version: 2.1.4+21 environment: sdk: ">=2.12.0 <3.0.0" @@ -62,6 +62,10 @@ dependencies: dio: ^4.0.0 lint: ^1.0.0 badges: ^2.0.1 + file_picker: ^4.0.1 + external_path: ^1.0.1 + permission_handler: ^8.1.4+2 + dev_dependencies: From 930e80d9fd889874d6f3e41706ce6cf1c7e75ce4 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Mon, 13 Sep 2021 11:43:45 -0600 Subject: [PATCH 08/20] estable --- lib/src/app.dart | 4 +- lib/src/extra/add_reporte.dart | 127 ++++++---- lib/src/extra/dashboard_Avisos.dart | 55 +++-- lib/src/extra/nuevo_post.dart | 9 +- lib/src/extra/report_edit_page.dart | 346 ++++++++++++++++++---------- lib/src/extra/reporte.dart | 114 +++++---- lib/src/methods/avisoDashboard.dart | 164 ++++--------- lib/src/methods/emailDashboard.dart | 70 ++---- lib/src/methods/eventDashboard.dart | 10 +- lib/src/methods/gridDashboard.dart | 105 +++++---- lib/src/pantallas/amenidades.dart | 26 +-- lib/src/pantallas/avisos.dart | 139 ++++++----- lib/src/pantallas/contactos.dart | 129 +++++------ lib/src/pantallas/finanzas.dart | 45 ++-- lib/src/pantallas/mainMenu.dart | 64 +++-- lib/src/pantallas/reportes.dart | 92 ++------ pubspec.lock | 21 ++ pubspec.yaml | 3 +- 18 files changed, 810 insertions(+), 713 deletions(-) diff --git a/lib/src/app.dart b/lib/src/app.dart index 8b9c9d7..95aed69 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -89,12 +89,12 @@ class _MyAppState extends State { '/screen17': (BuildContext context) { var tru = prefs!.containsKey('UnaVez'); if (tru == true) { - return AddReorte(); + return AddReporte(); } else { return OnBoardReportes(); } }, - '/screen18': (BuildContext context) => AddReorte() + '/screen18': (BuildContext context) => AddReporte() }, ), ); diff --git a/lib/src/extra/add_reporte.dart b/lib/src/extra/add_reporte.dart index ccabb25..31d558c 100644 --- a/lib/src/extra/add_reporte.dart +++ b/lib/src/extra/add_reporte.dart @@ -17,7 +17,7 @@ SharedPreferences? prefs; var cameras; var firstCamera; -class AddReorte extends StatefulWidget { +class AddReporte extends StatefulWidget { final Report? report; static init() async { @@ -25,20 +25,20 @@ class AddReorte extends StatefulWidget { firstCamera = cameras.first; } - AddReorte({Key? key, this.report}) : super(key: key); + AddReporte({Key? key, this.report}) : super(key: key); @override - _AddReorteState createState() => _AddReorteState(); + _AddReporteState createState() => _AddReporteState(); } someData(comId, userId) async { - await AddReorte.init(); + await AddReporte.init(); prefs!.setInt('idCom', comId); prefs!.setInt('idUser', userId); } -class _AddReorteState extends State { +class _AddReporteState extends State { final GlobalKey _formKey = GlobalKey(); final GlobalKey _formKey2 = GlobalKey(); final titleController = TextEditingController(); @@ -72,7 +72,7 @@ class _AddReorteState extends State { @override void initState() { super.initState(); - addata(); + getCameras(); } @@ -98,45 +98,7 @@ class _AddReorteState extends State { ), resizeToAvoidBottomInset: true, //stepper, propiedades y acciones - body: Stepper( - steps: _stepper()!, - physics: ClampingScrollPhysics(), - currentStep: this._currentStep, - onStepTapped: (step) { - setState(() { - this._currentStep = step; - }); - }, - onStepContinue: () { - setState(() { - if (this._currentStep < this._stepper()!.length - 1) { - this._currentStep = this._currentStep + 1; - } else { - if (images.isEmpty) { - Fluttertoast.showToast( - msg: "Seccion de fotos vacia", - toastLength: Toast.LENGTH_SHORT, - gravity: ToastGravity.CENTER, - timeInSecForIosWeb: 1, - backgroundColor: Colors.white, - textColor: Colors.black, - fontSize: 17.0); - } else { - alerta(); - } - } - }); - }, - onStepCancel: () { - setState(() { - if (this._currentStep > 0) { - this._currentStep = this._currentStep - 1; - } else { - this._currentStep = 0; - } - }); - }, - ), + body: stepper(), // // Boton que abre la camara @@ -151,6 +113,48 @@ class _AddReorteState extends State { ); } + Stepper stepper() { + return Stepper( + steps: _stepper()!, + physics: ClampingScrollPhysics(), + currentStep: this._currentStep, + onStepTapped: (step) { + setState(() { + this._currentStep = step; + }); + }, + onStepContinue: () { + setState(() { + if (this._currentStep < this._stepper()!.length - 1) { + this._currentStep = this._currentStep + 1; + } else { + if (images.isEmpty) { + Fluttertoast.showToast( + msg: "Seccion de fotos vacia", + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.CENTER, + timeInSecForIosWeb: 1, + backgroundColor: Colors.white, + textColor: Colors.black, + fontSize: 17.0); + } else { + alerta(); + } + } + }); + }, + onStepCancel: () { + setState(() { + if (this._currentStep > 0) { + this._currentStep = this._currentStep - 1; + } else { + this._currentStep = 0; + } + }); + }, + ); + } + //caracteristica de cada step List? _stepper() { List _steps = [ @@ -255,7 +259,7 @@ class _AddReorteState extends State { //funcion que abre la camara y muestra void openCamera() async { var image = - await _picker.pickImage(source: ImageSource.camera, imageQuality: 85); + await _picker.pickImage(source: ImageSource.camera, imageQuality: 50); setState(() { if (image != null) { @@ -273,6 +277,24 @@ class _AddReorteState extends State { }); } + void openCamera2() async { + var image = + await _picker.pickImage(source: ImageSource.camera, imageQuality: 50); + + if (image != null) { + if (images.length == 3) { + // muestra el mensaje de archivo excedido + mensaje(); + Navigator.of(context).pop(); + } else { + images.add(File(image.path)); + print(images[0].path); + } + } else { + print('No se ha seleccionado una imagen'); + } + } + mensaje() => Fluttertoast.showToast( msg: "Maximo excedido", toastLength: Toast.LENGTH_SHORT, @@ -283,7 +305,8 @@ class _AddReorteState extends State { fontSize: 17.0); // funcion que abre la galeria para las fotos void openGallery() async { - var image = await _picker.pickImage(source: ImageSource.gallery); + var image = + await _picker.pickImage(source: ImageSource.gallery, imageQuality: 50); setState(() { if (image != null) { images.add(File(image.path)); @@ -298,6 +321,7 @@ class _AddReorteState extends State { alerta() { Widget okButton = TextButton( onPressed: () { + Navigator.of(context).pop(); saveForm(); }, child: Text( @@ -345,10 +369,14 @@ class _AddReorteState extends State { // envia las fotos al serv mas toda su informacion que reqiere como los params sendingData(String titulo, String descrip, List file) async { + await addata(); try { List filesArr = []; Dio dio = Dio(); + print(idCom.toString()); + print(idUser.toString()); + for (var item in file) { filesArr.add(item.path.split('/').last); print(filesArr[0]); @@ -364,7 +392,7 @@ class _AddReorteState extends State { 'img[]': [ for (int i = 0; i < file.length; i++) MultipartFile.fromFileSync(file[i].path, - filename: filesArr[i], contentType: MediaType('*', '*')) + filename: filesArr[i], contentType: MediaType('media', '*')) ] }); @@ -449,7 +477,8 @@ class _AddReorteState extends State { titleController.text, descriptionController.text, images) .then((value) { provider.addReport(report); - Navigator.of(context).popAndPushNamed('/screen14'); + Navigator.of(context).pop(); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text( 'Su reporte se ha realizado con exito!', diff --git a/lib/src/extra/dashboard_Avisos.dart b/lib/src/extra/dashboard_Avisos.dart index cfe4629..2444d81 100644 --- a/lib/src/extra/dashboard_Avisos.dart +++ b/lib/src/extra/dashboard_Avisos.dart @@ -33,10 +33,20 @@ class _AvisosDashboardState extends State { bool downloading = false; String progress = '0'; bool isDownloaded = false; + List? avisosRevers = []; + List namesRev = []; + List linksrev = []; + + reversedList() { + avisosRevers = widget.avisos!.reversed.toList(); + namesRev = widget.name!.reversed.toList(); + linksrev = widget.links!.reversed.toList(); + } @override void initState() { _showPersBottomSheetCallBack = _showPersBottomSheetCallBack; + reversedList(); super.initState(); } @@ -49,24 +59,29 @@ class _AvisosDashboardState extends State { viewAvisos({size}) { return Flexible( child: GridView.builder( - padding: EdgeInsets.only(), - itemCount: widget.avisos!.length, + padding: EdgeInsets.only(left: 10, right: 10, top: 20), + itemCount: avisosRevers!.length, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 1, childAspectRatio: 1.65, - crossAxisSpacing: 25, + crossAxisSpacing: 29, mainAxisSpacing: 20, ), itemBuilder: (_, int data) { return Container( decoration: BoxDecoration( + color: Colors.white, borderRadius: BorderRadius.circular(20), - border: - Border.all(color: Color(0xFF455A64).withOpacity(0.3))), + boxShadow: [ + BoxShadow( + color: Colors.grey, + blurRadius: 7, + offset: Offset(0, 5)) + ]), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - whoPublish(size), + whoPublish(data, size), Divider( color: Color(0xFF455A64).withOpacity(0.3), ), @@ -74,9 +89,6 @@ class _AvisosDashboardState extends State { SizedBox( height: 10, ), - Divider( - color: Color(0xFF455A64).withOpacity(0.3), - ), ], ), ); @@ -92,8 +104,8 @@ class _AvisosDashboardState extends State { Padding( padding: EdgeInsets.only(left: size / 50), child: Text( - 'Comunicado! ${widget.avisos![data].avisos}', - style: TextStyle(fontSize: 20), + '${avisosRevers![data].avisos}', + style: TextStyle(fontSize: size / 20), ), ), SizedBox( @@ -125,19 +137,19 @@ class _AvisosDashboardState extends State { } void _showModalSheet(int data) { - if (names.length == widget.name![data].length) { + if (names.length == namesRev[data].length) { } else { - for (int i = 0; i < widget.name![data].length; i++) { - names.add(widget.name![data][i]); + for (int i = 0; i < namesRev[data].length; i++) { + names.add(namesRev[data][i]); } } - if (links.length == widget.links![data].length) { + if (links.length == linksrev[data].length) { print('here${links.length}'); print(' ya no cabe'); } else { - for (int i = 0; i < widget.links![data].length; i++) { - links.add(widget.links![data][i]); + for (int i = 0; i < linksrev[data].length; i++) { + links.add(linksrev[data][i]); print(links[i]); } @@ -287,7 +299,7 @@ class _AvisosDashboardState extends State { return filePath; } - Container whoPublish(size) { + Container whoPublish(data, size) { return Container( padding: EdgeInsets.only(top: 10, left: 10), child: Row( @@ -305,7 +317,12 @@ class _AvisosDashboardState extends State { Text( 'Administrador', style: (TextStyle(fontSize: 16, fontWeight: FontWeight.w500)), - ) + ), + SizedBox( + width: size / 35, + ), + Text( + '${avisosRevers![data].fecha!.day}/${avisosRevers![data].fecha!.month}/${avisosRevers![data].fecha!.year}') ], ), ); diff --git a/lib/src/extra/nuevo_post.dart b/lib/src/extra/nuevo_post.dart index 4542f41..9245430 100644 --- a/lib/src/extra/nuevo_post.dart +++ b/lib/src/extra/nuevo_post.dart @@ -217,11 +217,16 @@ class _MakeNewPostState extends State { sendId(); } else { if (val != chosenValue) { - print('aqui2'); + type.clear(); + setState(() { + chosenValue = val; + }); + sendId(); } else { if (val == chosenValue) { } else { - sendId().then((value) => avisos.clear()); + type.clear(); + sendId(); } } } diff --git a/lib/src/extra/report_edit_page.dart b/lib/src/extra/report_edit_page.dart index f99097a..37551e4 100644 --- a/lib/src/extra/report_edit_page.dart +++ b/lib/src/extra/report_edit_page.dart @@ -11,8 +11,15 @@ class ReportEditPage extends StatefulWidget { final DataReporte report; final List data; + /// variable que indiga el progreso actual del estatus. Map? progreso; + + /// variable que muestra los comentarios por progreso. Map? datos; + + /// variables que muestra las fechas de los comentarios. + Map? fechas; + Map? superMap = {}; ReportEditPage( @@ -21,6 +28,7 @@ class ReportEditPage extends StatefulWidget { required this.data, this.datos, this.progreso, + this.fechas, this.id}) : super(key: key); @@ -34,12 +42,9 @@ class _ReportEditPageState extends State { var data; List progres = []; List datosp = []; + bool finalizado = false; + List f = []; - List progresFromJson(String str) => - List.from(json.decode(str).map((x) => x)); - - String progresToJson(List data) => - json.encode(List.from(data.map((x) => x))); estatus() { widget.progreso!.forEach((key, value) { if (widget.id == key) { @@ -47,6 +52,7 @@ class _ReportEditPageState extends State { if (key == 'Progreso') { setState(() { for (int i = 0; i < value.length; i++) { + value.sort(); progres.add(new ProgressIndicator(id: value[i])); } }); @@ -76,18 +82,44 @@ class _ReportEditPageState extends State { }); } + fechasR() { + widget.fechas!.forEach((key, value) { + if (widget.id == key) { + value.forEach((key, value) { + if (key == 'Fechas') { + setState(() { + for (int i = 0; i < value.length; i++) { + f.add(new FechaReporte(f: value[i])); + } + }); + } + }); + } + }); + } + @override void initState() { estatus(); datos(); + fechasR(); super.initState(); } + isFinalizado() { + if (progres.last.id == 4) { + setState(() { + finalizado = true; + }); + } + return finalizado; + } + @override Widget build(BuildContext context) { var size = MediaQuery.of(context).size.width; - var size2 = MediaQuery.of(context).size.width; + //var size2 = MediaQuery.of(context).size.width; return Scaffold( appBar: AppBar( title: Text('Seguimiento de reporte'), @@ -99,6 +131,7 @@ class _ReportEditPageState extends State { child: Column( children: [ IconStepper( + enableStepTapping: isFinalizado(), icons: [ Icon(Icons.supervised_user_circle), Icon(Icons.check), @@ -153,121 +186,183 @@ class _ReportEditPageState extends State { Widget plainText(size) { switch (progres.isEmpty ? 0 : progres.last.id) { case 1: - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Atencion:', - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18), - ), - SizedBox( - height: 10, - ), - Text( - 'Se ha enviado su reporte', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.w300), - ), - SizedBox( - height: 10, - ), - Text( - 'Se le notificara el cambio de estado del reporte', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.w300), - ) - ], - ); - case 2: - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Asesor:', - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18), - ), - SizedBox( - height: 10, - ), - Text( - 'Su estado se encuentra en revisión', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.w300), - ), - SizedBox( - height: 10, - ), - Text( - 'Se le notificara el cambio de estado del reporte', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.w300), - ) - ], - ); - case 3: - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Asesor:', - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18), - ), - SizedBox( - height: 10, - ), - Text('Tu estado se ha revisado y se esta atendiendo', - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w300, - )), - SizedBox( - height: 10, - ), - Row( - children: [ - Text( - 'Comentarios:', - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18), + return datosp.isEmpty + ? Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Asesor:', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + )), + SizedBox( + height: 10, + ), + Text( + 'Tu reporte se encuentra en revision', + style: + TextStyle(fontWeight: FontWeight.w300, fontSize: 18), + ) + ], ), - SizedBox( - width: size / 20, + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: size / 25, + ), + Padding( + padding: const EdgeInsets.only(left: 50), + child: Text('Comentarios:', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + )), + ), + respuestaView(size), + ], + ); + case 2: + return datosp.isEmpty + ? Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Asesor:', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + )), + SizedBox( + height: 10, + ), + Text( + 'Tu reporte esta siendo procesado', + style: + TextStyle(fontWeight: FontWeight.w300, fontSize: 18), + ) + ], ), - SizedBox( - width: size / 2, - child: Text('${datosp[2].coment}', + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.only(left: 50), + child: Text('Comentarios:', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + )), + ), + respuestaView(size), + ], + ); + case 3: + return datosp.isEmpty + ? Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Asesor:', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + )), + SizedBox( + height: 10, + ), + Text( + 'No hay comentarios', style: - TextStyle(fontWeight: FontWeight.w400, fontSize: 18)), - ) - ], - ), - SizedBox( - height: 10, - ), - Text( - '', - style: TextStyle(fontWeight: FontWeight.w300, fontSize: 18), - ) - ], - ); + TextStyle(fontWeight: FontWeight.w300, fontSize: 18), + ) + ], + ), + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Respuesta de Asesor:', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + )), + respuestaView(size), + ], + ); case 4: - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('Asesor:', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 18, - )), - SizedBox( - height: 10, - ), - Text( - 'Tu reporte se ha atendido y ha finalizado con éxito', - style: TextStyle(fontWeight: FontWeight.w300, fontSize: 18), - ) - ], - ); + return datosp.isEmpty + ? Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Asesor:', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + )), + SizedBox( + height: 10, + ), + Text( + 'Tu reporte se ha atendido y ha finalizado con éxito', + style: + TextStyle(fontWeight: FontWeight.w300, fontSize: 18), + ) + ], + ), + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.only(left: 30), + child: Text('Respuestas:', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 19, + )), + ), + respuestaView(size), + ], + ); default: return Container(); } } + ListView respuestaView(size) { + return ListView.builder( + padding: EdgeInsets.only(left: size / 4.3, top: 10), + shrinkWrap: true, + itemCount: datosp.length, + itemBuilder: (_, int index) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 5, + ), + Text( + '${f[index].f!.day}/${f[index].f!.month}/${f[index].f!.year}', + style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold)), + SizedBox( + height: 5, + ), + SizedBox( + width: size / 2, + child: Text(datosp[index].coment, + style: + TextStyle(fontSize: 15, fontWeight: FontWeight.w400)), + ), + ], + ); + }); + } + Color? stepColor() { switch (progres.isEmpty ? 0 : progres.last.id) { case 1: @@ -287,9 +382,9 @@ class _ReportEditPageState extends State { String? headerText() { switch (progres.isEmpty ? 0 : progres.last.id) { case 1: - return 'En proceso'; + return 'Revisión'; case 2: - return 'Revision'; + return 'En proceso'; case 3: return 'Respuesta'; case 4: @@ -321,12 +416,17 @@ class _ReportEditPageState extends State { child: Column( //crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - alignment: Alignment.topLeft, - child: Text( - widget.report.descripCorta!, - style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold), - ), + Row( + children: [ + Container( + alignment: Alignment.topLeft, + child: Text( + widget.report.descripCorta!, + style: + TextStyle(fontSize: 25, fontWeight: FontWeight.bold), + ), + ), + ], ), SizedBox( height: 15, @@ -356,6 +456,12 @@ class ProgressIndicator { ProgressIndicator({this.id}); } +class FechaReporte { + DateTime? f; + + FechaReporte({this.f}); +} + class DatosProgreso { var coment; diff --git a/lib/src/extra/reporte.dart b/lib/src/extra/reporte.dart index 8550109..655f914 100644 --- a/lib/src/extra/reporte.dart +++ b/lib/src/extra/reporte.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:adcom/json/jsonReporte.dart'; +import 'package:adcom/src/extra/add_reporte.dart'; import 'package:adcom/src/extra/report_edit_page.dart'; import 'package:adcom/src/models/event_provider.dart'; import 'package:flutter/material.dart'; @@ -12,22 +13,14 @@ SharedPreferences? prefs; class LevantarReporte extends StatefulWidget { const LevantarReporte({Key? key}) : super(key: key); - static init() async { - prefs = await SharedPreferences.getInstance(); - } @override _LevantarReporteState createState() => _LevantarReporteState(); } -dataOff5(id) async { - await LevantarReporte.init(); - prefs!.setInt('id', id); -} - Future getReportes() async { prefs = await SharedPreferences.getInstance(); - var id = prefs!.getInt('userId'); //CAMBIAR POR id + var id = prefs!.getInt('userId'); Uri url = Uri.parse( 'http://187.189.53.8:8081/backend/web/index.php?r=adcom/get-reportes'); @@ -46,25 +39,57 @@ class _LevantarReporteState extends State { List myList = []; List listProgreso = []; List idProgress = []; - // progreso data + List myListReversed = []; + var progress = []; + + /// progreso data var maps = {}; var progreso = {}; List> superMap = []; - // datos del progreso - //mapeado dinamico que espera otro mapeado + /// datos del progreso + /// mapeado dinamico que espera otro mapeado var maps2 = {}; - // mapeado dinamico que espera dinamico - //dinamico es tu tipo de variable que toma cualquier valor + + /// mapeado dinamico que espera dinamico + /// dinamico es tu tipo de variable que toma cualquier valor var datos = {}; - //lista mapeada dinamica que espera otro mapeado + + /// lista mapeada dinamica que espera otro mapeado List> superMap2 = []; + var fechasMap = {}; + var fDatos = {}; + List> fechasSuperMap = []; + + /// Declaraciones de futuras listas en reversa + /// checar la asignacion en la funcion data, antes de cualquier alteracion + /// + List reversedList = []; + List> reversedList2 = []; + List> reversedList3 = []; + List> reversedList4 = []; + GetReportes? cuentas; - //obtiene los datos del service + var idCom; + var idUser; + + /// Activa el guardado en memoria + addata() async { + prefs = await SharedPreferences.getInstance(); + setState(() { + /// obtiene el id comunidad y la del usuario + idCom = prefs!.getInt('idCom'); + idUser = prefs!.getInt('userId'); + }); + } + + /// Llama al service y asigna los datos obtenido a una clase data() async { cuentas = await getReportes(); + await addata(); + for (int i = 0; i < cuentas!.data!.length; i++) { myList.add(new DataReporte( id: cuentas!.data![i].idReporte, @@ -98,18 +123,24 @@ class _LevantarReporteState extends State { datos = {"Datos": datosProgres}; maps2.addAll({cuentas!.data![i].idReporte: datos}); - /* listProgreso.add(new Progreso( - time: cuentas!.data![i].progreso![j].fechaSeg, - comentario: cuentas!.data![i].progreso![j].comentario, - progreso: cuentas!.data![i].progreso![j].progreso)); */ + var fechasList = []; + cuentas!.data![i].progreso!.forEach((element) { + setState(() { + fechasList.add(element.fechaSeg); + }); + }); + + fDatos = {"Fechas": fechasList}; + fechasMap.addAll({cuentas!.data![i].idReporte: fDatos}); } + fechasSuperMap.add(fechasMap); superMap2.add(maps2); superMap.add(maps); - print(superMap[0]); - print(superMap2[0]); - - superMap = superMap; } + reversedList2 = fechasSuperMap.reversed.toList(); + reversedList3 = superMap2.reversed.toList(); + reversedList4 = superMap.reversed.toList(); + reversedList = myList.reversed.toList(); } @override @@ -121,9 +152,11 @@ class _LevantarReporteState extends State { } refresh() { - setState(() { - listview(); - }); + if (mounted) { + setState(() { + listview(); + }); + } } @override @@ -134,7 +167,7 @@ class _LevantarReporteState extends State { backgroundColor: Colors.blue, title: Text('Reportes'), ), - body: myList.length == 0 + body: reversedList.length == 0 ? SafeArea( child: Center( child: Column( @@ -151,7 +184,8 @@ class _LevantarReporteState extends State { : listview(), floatingActionButton: FloatingActionButton( elevation: 7, - onPressed: () => Navigator.of(context).popAndPushNamed('/screen18'), + onPressed: () => Navigator.of(context) + .push(MaterialPageRoute(builder: (_) => AddReporte())), backgroundColor: Colors.blue, child: Icon( Icons.add, @@ -161,7 +195,7 @@ class _LevantarReporteState extends State { ); } - Container listview() { + listview() { return Container( child: ListView.separated( separatorBuilder: (context, index) { @@ -170,7 +204,7 @@ class _LevantarReporteState extends State { color: Colors.grey[350], ); }, - itemCount: myList.length, + itemCount: reversedList.length, itemBuilder: (context, int index) { return Container( padding: EdgeInsets.all(8), @@ -178,15 +212,15 @@ class _LevantarReporteState extends State { onTap: () { Navigator.of(context).push(MaterialPageRoute( builder: (_) => ReportEditPage( - report: myList[index], - data: listProgreso, - progreso: superMap[index], - datos: superMap2[index], - id: myList[index].id, - ))); + report: reversedList[index], + data: listProgreso, + progreso: reversedList4[index], + datos: reversedList3[index], + id: reversedList[index].id, + fechas: reversedList2[index]))); }, title: Text( - '${myList[index].descripCorta}', + '${reversedList[index].descripCorta}', style: TextStyle( fontSize: 20, ), @@ -197,12 +231,12 @@ class _LevantarReporteState extends State { SizedBox( width: 160, child: Text( - '${myList[index].desperfecto}', + '${reversedList[index].desperfecto}', style: TextStyle(fontSize: 18), ), ), Text( - '${myList[index].fechaRep!.day}/${myList[index].fechaRep!.month}/${myList[index].fechaRep!.year}', + '${reversedList[index].fechaRep!.day}/${reversedList[index].fechaRep!.month}/${reversedList[index].fechaRep!.year}', style: TextStyle(fontSize: 18), ) ], diff --git a/lib/src/methods/avisoDashboard.dart b/lib/src/methods/avisoDashboard.dart index a12c485..87a3020 100644 --- a/lib/src/methods/avisoDashboard.dart +++ b/lib/src/methods/avisoDashboard.dart @@ -39,127 +39,65 @@ class _AvisosDashboardState extends State { item1, item2, ]; - return size.width >= 880 - ? Flexible( - child: GridView.count( - padding: EdgeInsets.only(left: 17, right: 17, top: 17), - crossAxisCount: 1, - childAspectRatio: 3.7, - crossAxisSpacing: 15, - mainAxisSpacing: 15, - children: myList.map((data) { - return InkWell( - onTap: () { - Navigator.pushNamed(context, data.route!); - }, - child: Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(20), - boxShadow: [ - BoxShadow( - color: Colors.grey, - blurRadius: 10, - offset: Offset(0, 5)) - ]), - child: Container( - //margin: EdgeInsets.symmetric(vertical: 20), - padding: const EdgeInsets.all(18), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - height: 50, - width: 50, - decoration: BoxDecoration( - color: Colors.grey[300], - shape: BoxShape.circle), - child: data.icon, - ), - SizedBox( - width: 14, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox( - height: 18, - ), - Text( - data.title!, - style: TextStyle( - color: Colors.black, - fontSize: 16, - fontWeight: FontWeight.w600), - ), - ], - ), - ], + return Flexible( + child: GridView.count( + padding: EdgeInsets.only(left: 10, right: 10, top: 10), + crossAxisCount: 1, + childAspectRatio: 3.5, + crossAxisSpacing: 15, + mainAxisSpacing: 15, + children: myList.map((data) { + return InkWell( + onTap: () { + Navigator.pushNamed(context, data.route!); + }, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.grey, + blurRadius: 10, + offset: Offset(0, 5)) + ]), + child: Container( + //margin: EdgeInsets.symmetric(vertical: 20), + padding: const EdgeInsets.all(18), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: 50, + width: 50, + decoration: BoxDecoration( + color: Colors.grey[300], shape: BoxShape.circle), + child: data.icon, ), - ), - ), - ); - }).toList())) - : Flexible( - child: GridView.count( - padding: EdgeInsets.only(left: 10, right: 10, top: 10), - crossAxisCount: 1, - childAspectRatio: 3.7, - crossAxisSpacing: 15, - mainAxisSpacing: 15, - children: myList.map((data) { - return InkWell( - onTap: () { - Navigator.pushNamed(context, data.route!); - }, - child: Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(20), - boxShadow: [ - BoxShadow( - color: Colors.grey, - blurRadius: 10, - offset: Offset(0, 5)) - ]), - child: Container( - //margin: EdgeInsets.symmetric(vertical: 20), - padding: const EdgeInsets.all(18), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + SizedBox( + width: 14, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Container( - height: 50, - width: 50, - decoration: BoxDecoration( - color: Colors.grey[300], - shape: BoxShape.circle), - child: data.icon, - ), SizedBox( - width: 14, + height: 15, ), - Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox( - height: 15, - ), - Text( - data.title!, - style: TextStyle( - color: Colors.black, - fontSize: size.width / 25, - fontWeight: FontWeight.w600), - ), - ], + Text( + data.title!, + style: TextStyle( + color: Colors.black, + fontSize: size.width / 25, + fontWeight: FontWeight.w600), ), ], ), - ), + ], ), - ); - }).toList())); + ), + ), + ); + }).toList())); } } diff --git a/lib/src/methods/emailDashboard.dart b/lib/src/methods/emailDashboard.dart index 79d4fc8..64907cd 100644 --- a/lib/src/methods/emailDashboard.dart +++ b/lib/src/methods/emailDashboard.dart @@ -108,27 +108,29 @@ class _ContactDashboardState extends State { refresh() { setState(() { - vistaContactos(); + var size = MediaQuery.of(context).size.width; + vistaContactos(size); }); } @override Widget build(BuildContext context) { + var size = MediaQuery.of(context).size.width; return myList.isEmpty ? Center( child: CircularProgressIndicator(), ) - : vistaContactos(); + : vistaContactos(size); } - vistaContactos() => Flexible( + vistaContactos(size) => Flexible( child: GridView.builder( shrinkWrap: false, - padding: EdgeInsets.only(left: 4, right: 4, top: 17), + padding: EdgeInsets.only(left: 5, right: 5, top: 17), itemCount: myList.length, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 1, - childAspectRatio: 3.15, + childAspectRatio: 2.5, crossAxisSpacing: 16, mainAxisSpacing: 16, ), @@ -171,61 +173,39 @@ class _ContactDashboardState extends State { children: [ myList[index].title == null ? Container() - : Text( - myList[index].title!.toUpperCase(), - style: TextStyle( - color: Colors.black, - fontSize: 14.5, - fontWeight: FontWeight.w600), + : SizedBox( + width: size / 2.1, + child: Text( + myList[index].title!.toUpperCase(), + style: TextStyle( + color: Colors.black, + fontSize: size / 29, + fontWeight: FontWeight.bold), + ), ), SizedBox( - height: 10, + height: size / 20, ), Row( children: [ - Text( - 'Comu:', - style: TextStyle( - color: Colors.black, - fontSize: 15, - fontWeight: FontWeight.bold), - ), SizedBox( width: 3, ), myList[index].comNombre == null ? Container() - : Text("${myList[index].comNombre}", - style: TextStyle( - color: Colors.black, - fontSize: 15, - )), + : SizedBox( + width: size / 2, + child: Text("${myList[index].comNombre}", + style: TextStyle( + color: Colors.black, + fontSize: size / 31, + )), + ), ], ), SizedBox( height: 10, ), - Row( - children: [ - Text( - 'Celular:', - style: TextStyle( - color: Colors.black, - fontSize: 15, - fontWeight: FontWeight.bold), - ), - SizedBox( - width: 3, - ), - myList[index].telCel == null - ? Container() - : Text(myList[index].telCel!, - style: TextStyle( - color: Colors.black, - fontSize: 15, - )), - ], - ), ], ), ], diff --git a/lib/src/methods/eventDashboard.dart b/lib/src/methods/eventDashboard.dart index 0f90a0d..20b34fe 100644 --- a/lib/src/methods/eventDashboard.dart +++ b/lib/src/methods/eventDashboard.dart @@ -129,13 +129,13 @@ class _EventDashboardState extends State { } refresh() { - setState(() { - if (mounted) { + if (mounted) { + setState(() { var size = MediaQuery.of(context).size.width; var size2 = MediaQuery.of(context).size.height; viewAmenidades(width: size, heigth: size2); - } - }); + }); + } } @override @@ -146,7 +146,7 @@ class _EventDashboardState extends State { ? Center( child: itsTrue == false ? Container( - padding: const EdgeInsets.only(top: 120), + padding: EdgeInsets.only(top: size / 6), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ diff --git a/lib/src/methods/gridDashboard.dart b/lib/src/methods/gridDashboard.dart index 3f99e74..9e6a844 100644 --- a/lib/src/methods/gridDashboard.dart +++ b/lib/src/methods/gridDashboard.dart @@ -96,6 +96,7 @@ class _GridDashboardState extends State { List myList = []; @override Widget build(BuildContext context) { + var size = MediaQuery.of(context).size; switch (widget.userId) { case 1: myList = [item1, item5, item4, item2]; @@ -114,61 +115,63 @@ class _GridDashboardState extends State { myList = [item8, item9]; break; } - return Flexible( - child: AnimationLimiter( - child: GridView.count( - padding: EdgeInsets.only(left: 16, right: 16, top: 10), - crossAxisCount: 2, - childAspectRatio: 1.1, - crossAxisSpacing: 15, - mainAxisSpacing: 15, - children: myList.map((data) { - return AnimationConfiguration.staggeredGrid( - columnCount: myList.length, - duration: Duration(milliseconds: 375), - position: 2, - child: ScaleAnimation( - scale: 0.5, - child: FadeInAnimation( - child: InkWell( - onTap: () { - HapticFeedback.mediumImpact(); - Navigator.pushNamed(context, data.route!, - arguments: GridDashboard()); - }, - child: Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(20), - boxShadow: [ - BoxShadow( - color: Colors.grey, - blurRadius: 10, - offset: Offset(0, 5)) - ]), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - data.icon!, - SizedBox( - height: 14, - ), - Text( - data.title!, - style: TextStyle( - color: Colors.black, - fontSize: 16, - fontWeight: FontWeight.w600), - ), - ], + return AnimationLimiter( + child: Container( + child: GridView.count( + padding: + EdgeInsets.only(left: 16, right: 16, top: size.height / 2.5), + crossAxisCount: 2, + childAspectRatio: 1.1, + crossAxisSpacing: 15, + mainAxisSpacing: 12, + children: myList.map((data) { + return AnimationConfiguration.staggeredGrid( + columnCount: myList.length, + duration: Duration(milliseconds: 375), + position: 2, + child: ScaleAnimation( + scale: 0.5, + child: FadeInAnimation( + child: InkWell( + onTap: () { + HapticFeedback.mediumImpact(); + Navigator.pushNamed(context, data.route!, + arguments: GridDashboard()); + }, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.grey, + blurRadius: 10, + offset: Offset(0, 5)) + ]), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + data.icon!, + SizedBox( + height: 14, + ), + Text( + data.title!, + style: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.w600), + ), + ], + ), ), ), ), ), - ), - ); - }).toList()), - )); + ); + }).toList()), + ), + ); } } diff --git a/lib/src/pantallas/amenidades.dart b/lib/src/pantallas/amenidades.dart index 0163b6a..0174bbc 100644 --- a/lib/src/pantallas/amenidades.dart +++ b/lib/src/pantallas/amenidades.dart @@ -78,17 +78,26 @@ class _AmenidadesState extends State { child: Scaffold( resizeToAvoidBottomInset: false, appBar: AppBar( + title: Text( + "Amenidades", + style: TextStyle( + color: Colors.white, + fontSize: 30, + fontFamily: 'Roboto', + fontWeight: FontWeight.w700), + ), elevation: 6, backgroundColor: Colors.deepPurpleAccent, ), body: Stack( children: [ Container( - height: size.height * .35, + height: size.height * .31, decoration: BoxDecoration(color: Colors.deepPurpleAccent), ), Container( - padding: EdgeInsets.only(top: 95), + padding: + EdgeInsets.only(top: size.width / 7, right: size.width / 20), alignment: Alignment.topRight, child: Icon( Icons.event, @@ -103,18 +112,7 @@ class _AmenidadesState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - height: 5, - ), - Text( - "Amenidades", - style: TextStyle( - color: Colors.white, - fontSize: 40, - fontFamily: 'Roboto', - fontWeight: FontWeight.w700), - ), - SizedBox( - height: 15, + height: 20, ), Text( 'Disfruta las ventajas de tu comunidad', diff --git a/lib/src/pantallas/avisos.dart b/lib/src/pantallas/avisos.dart index 53b7bd7..68418fa 100644 --- a/lib/src/pantallas/avisos.dart +++ b/lib/src/pantallas/avisos.dart @@ -36,6 +36,7 @@ class _AvisosState extends State { List> superMap2 = []; var typeUser; var idComu; + bool itsTrue = true; //funcion que checa el usuario y llama a las funciones si es el usuario maestro Future userCheck() async { prefs = await SharedPreferences.getInstance(); @@ -77,30 +78,47 @@ class _AvisosState extends State { AvisosUsuario() .getAvisos(idComu) .then((value) => { - for (int i = 0; i < value!.data!.length; i++) + if (value!.data!.isNotEmpty) { - avisos.add(new AvisosUsuario( - avisos: value.data![i].aviso, - tipoAviso: value.data![i].tipoAviso, - fecha: value.data![i].fechaAviso, - )), - }, - links = List.generate( - value.data!.length, - (index2) => List.generate( - value.data![index2].archivos!.length, - (index) => value - .data![index2].archivos![index].direccionArchivo), - growable: true), - name = List.generate( - value.data!.length, - (index2) => List.generate( - value.data![index2].archivos!.length, - (index) => - value.data![index2].archivos![index].nombreArchivo), - growable: true), + for (int i = 0; i < value.data!.length; i++) + { + avisos.add(new AvisosUsuario( + avisos: value.data![i].aviso, + tipoAviso: value.data![i].tipoAviso, + fecha: value.data![i].fechaAviso, + )), + }, + links = List.generate( + value.data!.length, + (index2) => List.generate( + value.data![index2].archivos!.length, + (index) => value + .data![index2].archivos![index].direccionArchivo), + growable: true), + name = List.generate( + value.data!.length, + (index2) => List.generate( + value.data![index2].archivos!.length, + (index) => value + .data![index2].archivos![index].nombreArchivo), + growable: true), + } + else + {esFalso()} }) - .whenComplete(() => refresh()); + .whenComplete(() => mounted == true + ? setState(() { + AvisosDashboard( + avisos: avisos, + ); + }) + : null); + } + + esFalso() { + setState(() { + itsTrue = false; + }); } @override @@ -109,21 +127,19 @@ class _AvisosState extends State { super.initState(); } - refresh() { - setState(() { - if (mounted) { - AvisosDashboard( - avisos: avisos, - ); - } - }); - } + refresh() {} @override Widget build(BuildContext context) { var size = MediaQuery.of(context).size; return Scaffold( appBar: AppBar( + title: Text('Avisos', + style: TextStyle( + color: Colors.white, + fontSize: 25, + fontFamily: 'Roboto', + fontWeight: FontWeight.w700)), elevation: 4.0, backgroundColor: Colors.blueGrey[700], ), @@ -131,16 +147,17 @@ class _AvisosState extends State { body: Stack( children: [ Container( - height: size.height * .20, + height: size.width / 2.0, decoration: BoxDecoration(color: Colors.blueGrey[700]), ), Container( - padding: EdgeInsets.only(top: 30, right: 30), + padding: EdgeInsets.only( + top: size.height / 30, right: size.width / 20), alignment: Alignment.topRight, child: Icon( Icons.announcement_rounded, color: Colors.white, - size: size.width / 4, + size: size.width / 4.5, ), ), SafeArea( @@ -152,40 +169,50 @@ class _AvisosState extends State { SizedBox( height: size.width / 50, ), - Text( - "Avisos", - style: TextStyle( - color: Colors.white, - fontSize: 40, - fontFamily: 'Roboto', - fontWeight: FontWeight.w700), - ), - SizedBox( - height: 10, - ), Text( 'Comunicados de la comunidad', style: TextStyle( - fontWeight: FontWeight.bold, color: Colors.white), + fontWeight: FontWeight.bold, + color: Colors.white, + fontSize: 15), ), SizedBox( - height: 10, + height: 20, ), SizedBox( - width: size.width * .6, + width: size.width / 1.5, child: Text( 'Enterate de lo que sucede en tu comunidad! Desde recordatorios, alertas, novedades y más.', - style: TextStyle(color: Colors.white), + style: TextStyle( + color: Colors.white, fontSize: size.width / 19), ), ), - SizedBox( - height: size.width / 12, - ), avisos.isEmpty ? Center( - child: Container( - padding: EdgeInsets.only(top: 25), - child: CircularProgressIndicator())) + child: itsTrue == false + ? Container( + padding: const EdgeInsets.only(top: 90), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + 'assets/images/magic.png', + width: size.width / 1, + height: 200, + ), + Text( + 'Lo sentimos, por el momento no hay avisos', + style: TextStyle( + fontSize: size.width / 20, + color: Colors.blueGrey[700], + ), + textAlign: TextAlign.justify, + ) + ], + )) + : Container( + padding: EdgeInsets.only(top: size.width / 5), + child: CircularProgressIndicator())) : AvisosDashboard( links: links, name: name, @@ -309,7 +336,7 @@ class AvisosUsuario { if (response.statusCode == 200) { var data = response.body; - + print(data); return getAvisosFromJson(data); } } diff --git a/lib/src/pantallas/contactos.dart b/lib/src/pantallas/contactos.dart index 0545d69..654db73 100644 --- a/lib/src/pantallas/contactos.dart +++ b/lib/src/pantallas/contactos.dart @@ -1,3 +1,5 @@ +import 'package:adcom/json/json.dart'; +import 'package:adcom/src/extra/filter_section.dart'; import 'package:adcom/src/methods/emailDashboard.dart'; import 'package:adcom/src/models/event_provider.dart'; import 'package:filter_list/filter_list.dart'; @@ -15,7 +17,8 @@ class _ContactosState extends State { List? itemSeleccion = []; List? newArr = []; TextEditingController? _controller = TextEditingController(); - + late Welcome? dt; + List myList = []; @override void initState() { super.initState(); @@ -30,18 +33,27 @@ class _ContactosState extends State { @override Widget build(BuildContext context) { var size = MediaQuery.of(context).size; + var size2 = MediaQuery.of(context).size.width; final residentes = Provider.of(context).items; return Scaffold( resizeToAvoidBottomInset: false, - floatingActionButton: FloatingActionButton( + /* floatingActionButton: FloatingActionButton( backgroundColor: Colors.greenAccent[700], - onPressed: () => _openFilterDialog(residentes), + onPressed: () => _openFilterDialog(myList), child: Icon( Icons.filter_list, ), - ), + ), */ appBar: AppBar( + title: Text( + "Directorio", + style: TextStyle( + color: Colors.white, + fontSize: 30, + fontFamily: 'Roboto', + fontWeight: FontWeight.w700), + ), leading: BackButton( onPressed: () { itemSeleccion!.clear(); @@ -57,7 +69,7 @@ class _ContactosState extends State { body: Stack( children: [ Container( - height: size.height * .31, + height: size.height * .30, decoration: BoxDecoration( borderRadius: BorderRadius.only( bottomRight: Radius.circular(5), @@ -69,12 +81,12 @@ class _ContactosState extends State { color: Colors.greenAccent[700]), ), Container( - padding: EdgeInsets.only(top: 56), + padding: EdgeInsets.only(top: 56, right: size.width / 28), alignment: Alignment.topRight, child: Icon( Icons.contacts, color: Colors.white, - size: 165, + size: size.width / 3, ), ), SafeArea( @@ -84,41 +96,36 @@ class _ContactosState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - height: 10, - ), - Text( - "Directorio", - style: TextStyle( - color: Colors.white, - fontSize: 40, - fontFamily: 'Roboto', - fontWeight: FontWeight.w700), + height: 8, ), SizedBox( - height: 10, - ), - Text( - 'Contacta a tus personas de confianza', - style: TextStyle( - fontWeight: FontWeight.bold, color: Colors.white), + width: size.width / 2, + child: Text( + 'Contacta a tus personas de confianza', + style: TextStyle( + fontSize: 15, + fontWeight: FontWeight.bold, + color: Colors.white), + ), ), SizedBox( height: 10, ), SizedBox( - width: size.width * .5, + width: size.width / 2, + height: size.height / 8, child: Text( 'Mantente conectado con tu comunidad o asesores de tu comunidad', - style: TextStyle(color: Colors.white), + style: TextStyle(color: Colors.white, fontSize: 20), ), ), SizedBox( - width: size.width * .55, + width: size.width / 2, child: searchBar(residentes), ), itemSeleccion == null || itemSeleccion!.length == 0 ? ContactDashboard() - : filterView(), + : filterView(size2), ], ), )), @@ -129,8 +136,8 @@ class _ContactosState extends State { searchBar(List residentes) { return Container( - margin: EdgeInsets.symmetric(vertical: 30), - padding: EdgeInsets.symmetric(horizontal: 30, vertical: 5), + margin: EdgeInsets.symmetric(vertical: 10), + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 5), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(29.5)), child: TextField( @@ -162,14 +169,14 @@ class _ContactosState extends State { } } - filterView() => Flexible( + filterView(size2) => Flexible( child: GridView.builder( shrinkWrap: false, itemCount: itemSeleccion!.length, padding: EdgeInsets.only(left: 4, right: 4, top: 17), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 1, - childAspectRatio: 3.1, + childAspectRatio: 2.5, crossAxisSpacing: 15, mainAxisSpacing: 15, ), @@ -210,55 +217,35 @@ class _ContactosState extends State { children: [ itemSeleccion![index].title == null ? Container() - : Text(itemSeleccion![index].title!.toUpperCase(), - style: TextStyle( - color: Colors.black, - fontSize: 14, - fontWeight: FontWeight.w600)), + : SizedBox( + width: size2 / 2.1, + child: Text( + itemSeleccion![index] + .title! + .toUpperCase(), + style: TextStyle( + color: Colors.black, + fontSize: size2 / 33, + fontWeight: FontWeight.bold)), + ), SizedBox( - height: 10, + height: size2 / 20, ), Row( children: [ - Text('Comunidad', - style: TextStyle( - color: Colors.black, - fontSize: 16, - fontWeight: FontWeight.bold)), - SizedBox( - width: 3, - ), itemSeleccion![index].comNombre == null ? Container() - : Text(itemSeleccion![index].comNombre!, - style: TextStyle( - color: Colors.black, - fontSize: 15, - )) + : SizedBox( + width: size2 / 2, + child: + Text(itemSeleccion![index].comNombre!, + style: TextStyle( + color: Colors.black, + fontSize: 16, + )), + ) ], ), - SizedBox( - height: 10, - ), - Row( - children: [ - Text('Numero', - style: TextStyle( - color: Colors.black, - fontSize: 16, - fontWeight: FontWeight.bold)), - SizedBox( - width: 3, - ), - itemSeleccion![index].telCel == null - ? Container() - : Text(itemSeleccion![index].telCel!, - style: TextStyle( - color: Colors.black, - fontSize: 15, - )) - ], - ) ], ) ], diff --git a/lib/src/pantallas/finanzas.dart b/lib/src/pantallas/finanzas.dart index 978858c..4aaa7d0 100644 --- a/lib/src/pantallas/finanzas.dart +++ b/lib/src/pantallas/finanzas.dart @@ -109,6 +109,14 @@ class _FinanzasState extends State { var size = MediaQuery.of(context).size; return Scaffold( appBar: AppBar( + title: Text( + 'Mis Pagos', + style: TextStyle( + color: Colors.white, + fontSize: 30, + fontFamily: 'Roboto', + fontWeight: FontWeight.w700), + ), elevation: 7, backgroundColor: Colors.lightGreen[700], ), @@ -116,11 +124,11 @@ class _FinanzasState extends State { body: Stack( children: [ Container( - height: size.height * .30, + height: size.height * .25, decoration: BoxDecoration(color: Colors.lightGreen[700]), ), Container( - padding: EdgeInsets.only(top: size.height / 12), + padding: EdgeInsets.only(top: size.height / 20), alignment: Alignment.topRight, child: Icon( Icons.show_chart_rounded, @@ -138,17 +146,6 @@ class _FinanzasState extends State { SizedBox( height: size.width / 20, ), - Text( - 'Mis Pagos', - style: TextStyle( - color: Colors.white, - fontSize: 30, - fontFamily: 'Roboto', - fontWeight: FontWeight.w700), - ), - SizedBox( - height: size.width / 19, - ), Text( 'Toma el control de tus gastos', style: TextStyle( @@ -169,9 +166,8 @@ class _FinanzasState extends State { ), Container( padding: EdgeInsets.only( - top: size.width / 7, - left: size.width >= 880 ? 5 : 0, - right: size.width >= 880 ? 5 : 0), + top: size.width / 5, + ), child: localList.isEmpty ? Center( child: itsTrue == false @@ -188,7 +184,7 @@ class _FinanzasState extends State { height: 200, ), Text( - 'Lo sentimos nuestra magia no funciona en este lugar', + 'Lo sentimos, por el momento no cuenta con adeudos', style: TextStyle( fontSize: size.width / 20, color: Colors.lightGreen[700], @@ -210,16 +206,11 @@ class _FinanzasState extends State { } mainView() { - return ListView( - shrinkWrap: true, - children: [ - InkWell( - onTap: () { - HapticFeedback.mediumImpact(); - }, - child: VistaTarjeta()), - ], - ); + return InkWell( + onTap: () { + HapticFeedback.mediumImpact(); + }, + child: VistaTarjeta()); } referenciaApagar() { diff --git a/lib/src/pantallas/mainMenu.dart b/lib/src/pantallas/mainMenu.dart index f408717..4b8b584 100644 --- a/lib/src/pantallas/mainMenu.dart +++ b/lib/src/pantallas/mainMenu.dart @@ -60,7 +60,7 @@ class _MainMenuState extends State { body: Stack( children: [ Container( - height: size.height * .34, + height: size.height * .35, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only( @@ -73,8 +73,8 @@ class _MainMenuState extends State { ), ), Container( - padding: EdgeInsets.only( - top: size.height * .18, right: size.width * .10), + padding: + EdgeInsets.only(top: size.height * .18, right: size.width / 15), alignment: Alignment.topRight, child: Image.asset( 'assets/images/AdCom3.png', @@ -87,40 +87,54 @@ class _MainMenuState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: const EdgeInsets.only( - left: 12, - ), + padding: const EdgeInsets.only(left: 12, top: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox( - height: size.width / 19, + Column( + children: [ + SizedBox( + width: size.height / 3.5, + height: size.width / 2.0, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text( + '¡${greeting()}!', + style: TextStyle( + color: Colors.black, + fontFamily: 'Roboto', + fontSize: 17, + fontWeight: FontWeight.w700), + ), + Text( + '${user == null ? ' ' : user}', + style: TextStyle( + color: Colors.black, + fontFamily: 'Roboto', + fontSize: size.width / 10, + fontWeight: FontWeight.w700), + ), + ], + ), + ), + ], ), - Text( - '¡${greeting()}! \n${user == null ? '' : user}', - style: TextStyle( - color: Colors.black, - fontFamily: 'Roboto', - fontSize: size.width / 11, - fontWeight: FontWeight.w700), - ), - //no mover - SizedBox(height: size.height / 5.5), + SizedBox( + width: size.width / 70, + ), //no mover ], ), ), //no mover - SizedBox( - height: size.width <= 640 ? 5 : size.height / 13, - ), - - GridDashboard( - userId: userType, - ) ], ), ), + ), + GridDashboard( + userId: userType, ) ], )); diff --git a/lib/src/pantallas/reportes.dart b/lib/src/pantallas/reportes.dart index cd0d5ea..97eec8c 100644 --- a/lib/src/pantallas/reportes.dart +++ b/lib/src/pantallas/reportes.dart @@ -32,79 +32,31 @@ class _ReportesState extends State { return Scaffold( resizeToAvoidBottomInset: false, appBar: AppBar( + title: Text( + "Reportes", + style: TextStyle( + color: Colors.white, + fontSize: 30, + fontFamily: 'Roboto', + fontWeight: FontWeight.w700), + ), elevation: 5, backgroundColor: Colors.blue, ), - body: size.width >= 880 ? Stack( + body: Stack( children: [ Container( height: size.height * .40, decoration: BoxDecoration(color: Colors.blue), ), Container( - padding: size.width >= 880 ?EdgeInsets.only(top: 75) : EdgeInsets.only(top: 130), + padding: + EdgeInsets.only(top: size.width / 12, right: size.width / 40), alignment: Alignment.topRight, child: Icon( Icons.report, color: Colors.white, - size: 170, - ), - ), - SafeArea( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 15, - ), - Text( - "Reportes", - style: TextStyle( - color: Colors.white, - fontSize: 40, - fontFamily: 'Roboto', - fontWeight: FontWeight.w700), - ), - SizedBox( - height: 25), - Text( - 'Si vez algo inusual !Reportalo!', - style: TextStyle( - fontWeight: FontWeight.bold, color: Colors.white, fontSize: 16), - ), - SizedBox( - height: 35, - ), - SizedBox( - width: size.width * .6, - child: Text( - 'Reporta incidencias en tu comunidad para que todos estén al tanto de comportamientos inusuales o faltas a la comunidad.', - style: TextStyle(color: Colors.white, fontSize: size.width >= 880 ? 19 : 18), - ), - ), - SizedBox( - height: 20, - ), - AvisosDashboard() - ], - ), - )) - ], - ): Stack( - children: [ - Container( - height: size.height * .40, - decoration: BoxDecoration(color: Colors.blue), - ), - Container( - padding: EdgeInsets.only(top: size.height * .12, left: size.width * .12 ), - alignment: Alignment.topRight, - child: Icon( - Icons.report, - color: Colors.white, - size: size.height*.20 , + size: size.height * .18, ), ), SafeArea( @@ -116,20 +68,13 @@ class _ReportesState extends State { SizedBox( height: 2, ), - Text( - "Reportes", - style: TextStyle( - color: Colors.white, - fontSize: 40, - fontFamily: 'Roboto', - fontWeight: FontWeight.w700), - ), - SizedBox( - height: 15), + SizedBox(height: 15), Text( 'Si vez algo inusual !Reportalo!', style: TextStyle( - fontWeight: FontWeight.bold, color: Colors.white, fontSize: 16), + fontWeight: FontWeight.bold, + color: Colors.white, + fontSize: 16), ), SizedBox( height: 18, @@ -138,11 +83,12 @@ class _ReportesState extends State { width: size.width * .6, child: Text( 'Reporta incidencias en tu comunidad para que todos estén al tanto de comportamientos inusuales o faltas a la comunidad.', - style: TextStyle(color: Colors.white, fontSize: size.width /20), + style: TextStyle( + color: Colors.white, fontSize: size.width / 21), ), ), SizedBox( - height: 20, + height: size.width / 8, ), AvisosDashboard() ], diff --git a/pubspec.lock b/pubspec.lock index 8a1ce25..6b1c4c8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -50,6 +50,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.8.1+7" + camera_camera: + dependency: "direct main" + description: + name: camera_camera + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" camera_platform_interface: dependency: transitive description: @@ -268,6 +275,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.0.7" + font_awesome_flutter: + dependency: transitive + description: + name: font_awesome_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "9.1.0" freezed_annotation: dependency: transitive description: @@ -555,6 +569,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" + rxdart: + dependency: transitive + description: + name: rxdart + url: "https://pub.dartlang.org" + source: hosted + version: "0.26.0" shared_preferences: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 5e6ce62..718628d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.1.4+21 +version: 2.1.7+28 environment: sdk: ">=2.12.0 <3.0.0" @@ -65,6 +65,7 @@ dependencies: file_picker: ^4.0.1 external_path: ^1.0.1 permission_handler: ^8.1.4+2 + camera_camera: ^2.0.2 From 49b72c0082b37490827bee0dc41adc947440fb32 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Wed, 15 Sep 2021 09:19:23 -0600 Subject: [PATCH 09/20] actualizaciones --- lib/src/extra/report_edit_page.dart | 36 +- lib/src/extra/reporte.dart | 4 +- lib/src/extra/vista_tarjeta.dart | 85 +++-- ...soDashboard.dart => reporteDashboard.dart} | 8 +- lib/src/models/event_data_source.dart | 6 + lib/src/pantallas/finanzas.dart | 334 +++--------------- lib/src/pantallas/mainMenu.dart | 25 +- lib/src/pantallas/reportes.dart | 8 +- pubspec.yaml | 2 +- 9 files changed, 151 insertions(+), 357 deletions(-) rename lib/src/methods/{avisoDashboard.dart => reporteDashboard.dart} (93%) diff --git a/lib/src/extra/report_edit_page.dart b/lib/src/extra/report_edit_page.dart index 37551e4..2e5c5e1 100644 --- a/lib/src/extra/report_edit_page.dart +++ b/lib/src/extra/report_edit_page.dart @@ -45,9 +45,13 @@ class _ReportEditPageState extends State { bool finalizado = false; List f = []; + /// funcion que retorna el estatus y lo asigna en arreglo + /// recorre el mapeado de dos niveles estatus() { + /// recorre el mapeado widget.progreso!.forEach((key, value) { if (widget.id == key) { + /// recorre el segundo mapeado value.forEach((key, value) { if (key == 'Progreso') { setState(() { @@ -64,6 +68,8 @@ class _ReportEditPageState extends State { }); } + ///mismo metodo que el mapeato del estatus + /// chechar [estatus] datos() { widget.datos!.forEach((key, value) { if (widget.id == key) { @@ -82,6 +88,8 @@ class _ReportEditPageState extends State { }); } + ///Funcion para mapeado de fecha + /// checar estatus fechasR() { widget.fechas!.forEach((key, value) { if (widget.id == key) { @@ -100,6 +108,8 @@ class _ReportEditPageState extends State { @override void initState() { + /// carga los datos para poder procesarlos + /// en lo que abre la pantalla estatus(); datos(); fechasR(); @@ -107,11 +117,17 @@ class _ReportEditPageState extends State { super.initState(); } + /// validacion que indica el exito de un proceso isFinalizado() { - if (progres.last.id == 4) { - setState(() { - finalizado = true; - }); + if (progres.isNotEmpty) { + if (progres.last.id == 4) { + setState(() { + /// enciende estados como el click en el stepper + finalizado = true; + }); + } else { + finalizado = false; + } } return finalizado; } @@ -164,6 +180,8 @@ class _ReportEditPageState extends State { )); } + /// funcion que muesta el encabezado del proceso + /// [setpColor] sirve para cambiar el color segun el proceso Widget header() { return Container( decoration: BoxDecoration( @@ -183,6 +201,8 @@ class _ReportEditPageState extends State { ); } + /// Switch case que muestra el estatus del reporte + /// cada case es un caso del proceso del 1 al 4 Widget plainText(size) { switch (progres.isEmpty ? 0 : progres.last.id) { case 1: @@ -334,10 +354,13 @@ class _ReportEditPageState extends State { } } + /// es la vista de la respuesta ListView respuestaView(size) { return ListView.builder( padding: EdgeInsets.only(left: size / 4.3, top: 10), shrinkWrap: true, + + /// recorre el largo de los datos procesados itemCount: datosp.length, itemBuilder: (_, int index) { return Column( @@ -363,6 +386,7 @@ class _ReportEditPageState extends State { }); } + /// funcion que cambia de color segun en el estatus Color? stepColor() { switch (progres.isEmpty ? 0 : progres.last.id) { case 1: @@ -379,6 +403,7 @@ class _ReportEditPageState extends State { } } + ///muesta el nombre segun el estatus String? headerText() { switch (progres.isEmpty ? 0 : progres.last.id) { case 1: @@ -394,6 +419,7 @@ class _ReportEditPageState extends State { } } + /// funcion que constuye la imagen o la cantidad de imagenes buildImage() => GridView.builder( shrinkWrap: true, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( @@ -408,6 +434,8 @@ class _ReportEditPageState extends State { }, ); + ///muestra el titulo del reporte y las imagenes del reporte + /// chechar buildImage para cualquier detalle de imagenes help() { return Column( children: [ diff --git a/lib/src/extra/reporte.dart b/lib/src/extra/reporte.dart index 655f914..97dda7f 100644 --- a/lib/src/extra/reporte.dart +++ b/lib/src/extra/reporte.dart @@ -141,14 +141,14 @@ class _LevantarReporteState extends State { reversedList3 = superMap2.reversed.toList(); reversedList4 = superMap.reversed.toList(); reversedList = myList.reversed.toList(); + + refresh(); } @override void initState() { data(); super.initState(); - - Future.delayed(Duration(milliseconds: 988), () => {refresh()}); } refresh() { diff --git a/lib/src/extra/vista_tarjeta.dart b/lib/src/extra/vista_tarjeta.dart index ec02680..865d78b 100644 --- a/lib/src/extra/vista_tarjeta.dart +++ b/lib/src/extra/vista_tarjeta.dart @@ -12,7 +12,8 @@ import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; class VistaTarjeta extends StatefulWidget { - VistaTarjeta({Key? key}) : super(key: key); + List? newList = []; + VistaTarjeta({Key? key, this.newList}) : super(key: key); @override _VistaTarjetaState createState() => _VistaTarjetaState(); @@ -31,10 +32,12 @@ class _VistaTarjetaState extends State { data(); Future.delayed(Duration(seconds: 1), () { - setState(() { - ultimaDeuda(); - estadodepago(); - }); + if (mounted) { + setState(() { + ultimaDeuda(); + estadodepago(); + }); + } }); } @@ -443,16 +446,16 @@ class _VistaTarjetaState extends State { double contador = 0.0; double deuda; double tardio; - for (int i = 0; i < mylist.length; i++) { - deuda = double.parse(mylist[i].montoCuota!); - tardio = double.parse(mylist[i].montoTardio!); - if (mylist[i].pago == 1) { + for (int i = 0; i < widget.newList!.length; i++) { + deuda = double.parse(widget.newList![i].montoCuota!); + tardio = double.parse(widget.newList![i].montoTardio!); + if (widget.newList![i].pago == 1) { contador; } else { - if (mylist[i].pagoTardio == 0) { - if (DateTime.now().day <= mylist[i].fechaLimite!.day && - DateTime.now().month <= mylist[i].fechaLimite!.month && - DateTime.now().year <= mylist[i].fechaLimite!.year) { + if (widget.newList![i].pagoTardio == 0) { + if (DateTime.now().day <= widget.newList![i].fechaLimite!.day && + DateTime.now().month <= widget.newList![i].fechaLimite!.month && + DateTime.now().year <= widget.newList![i].fechaLimite!.year) { setState(() { contador += deuda; }); @@ -473,14 +476,14 @@ class _VistaTarjetaState extends State { estadodepago() { String? estado; - for (int i = 0; i < mylist.length; i++) { - if (mylist[i].pago == 1) { + for (int i = 0; i < widget.newList!.length; i++) { + if (widget.newList![i].pago == 1) { estado = 'No deudas'; } else { - if (DateTime.now().day <= mylist[i].fechaLimite!.day && - DateTime.now().month <= mylist[i].fechaLimite!.month && - DateTime.now().year <= mylist[i].fechaLimite!.year || - mylist[i].fechaLimite!.isAfter(DateTime.now())) { + if (DateTime.now().day <= widget.newList![i].fechaLimite!.day && + DateTime.now().month <= widget.newList![i].fechaLimite!.month && + DateTime.now().year <= widget.newList![i].fechaLimite!.year || + widget.newList![i].fechaLimite!.isAfter(DateTime.now())) { setState(() { estado = 'Pendiente'; }); @@ -498,13 +501,13 @@ class _VistaTarjetaState extends State { cuotaExtra() { bool? estado; - for (int i = 0; i < mylist.length; i++) { - if (mylist[i].pago == 1) { + for (int i = 0; i < widget.newList!.length; i++) { + if (widget.newList![i].pago == 1) { estado = true; } else { - if (DateTime.now().day <= mylist[i].fechaLimite!.day && - DateTime.now().month <= mylist[i].fechaLimite!.month && - DateTime.now().year <= mylist[i].fechaLimite!.year) { + if (DateTime.now().day <= widget.newList![i].fechaLimite!.day && + DateTime.now().month <= widget.newList![i].fechaLimite!.month && + DateTime.now().year <= widget.newList![i].fechaLimite!.year) { return estado = true; } else { return estado = false; @@ -514,16 +517,17 @@ class _VistaTarjetaState extends State { return estado; } + ///ok estadodepagoColor() { Color? estado; - for (int i = 0; i < mylist.length; i++) { - if (mylist[i].pago == 1) { + for (int i = 0; i < widget.newList!.length; i++) { + if (widget.newList![i].pago == 1) { estado = Colors.lightGreen[700]; } else { - if (DateTime.now().day <= mylist[i].fechaLimite!.day && - DateTime.now().month <= mylist[i].fechaLimite!.month && - DateTime.now().year <= mylist[i].fechaLimite!.year || - mylist[i].fechaLimite!.isAfter(DateTime.now())) { + if (DateTime.now().day <= widget.newList![i].fechaLimite!.day && + DateTime.now().month <= widget.newList![i].fechaLimite!.month && + DateTime.now().year <= widget.newList![i].fechaLimite!.year || + widget.newList![i].fechaLimite!.isAfter(DateTime.now())) { return estado = Colors.amber[400]; } else { return estado = Colors.red[700]; @@ -533,25 +537,27 @@ class _VistaTarjetaState extends State { return estado == null ? estado = Colors.lightGreen[700] : estado; } + ///ok atraso() { int? atraso = 0; - for (int i = 0; i < mylist.length; i++) { - if (mylist[i].pago == 1 && mylist[i].pagoTardio == 0) { + for (int i = 0; i < widget.newList!.length; i++) { + if (widget.newList![i].pago == 1 && widget.newList![i].pagoTardio == 0) { return atraso = 0; } else { - return atraso = int.parse(mylist[i].montoTardio!); + return atraso = int.parse(widget.newList![i].montoTardio!); } } return atraso; } + ///ok totalApagars() { late int total; - for (int i = 0; i < mylist.length; i++) { - total = mylist[i].totalApagar!; - if (mylist[i].pagoTardio == 1) { + for (int i = 0; i < widget.newList!.length; i++) { + total = widget.newList![i].totalApagar!; + if (widget.newList![i].pagoTardio == 1) { return total; } else { total = 0; @@ -559,13 +565,14 @@ class _VistaTarjetaState extends State { } } + ///ok referenciaApagar() { String? ref; - for (int i = 0; i < mylist.length; i++) { - if (mylist[i].pago == 1 && mylist[i].pagoTardio == 0) { + for (int i = 0; i < widget.newList!.length; i++) { + if (widget.newList![i].pago == 1 && widget.newList![i].pagoTardio == 0) { } else { setState(() { - ref = mylist[i].referencia!; + ref = widget.newList![i].referencia!; }); return ref; diff --git a/lib/src/methods/avisoDashboard.dart b/lib/src/methods/reporteDashboard.dart similarity index 93% rename from lib/src/methods/avisoDashboard.dart rename to lib/src/methods/reporteDashboard.dart index 87a3020..1a77a67 100644 --- a/lib/src/methods/avisoDashboard.dart +++ b/lib/src/methods/reporteDashboard.dart @@ -5,14 +5,14 @@ import 'package:shared_preferences/shared_preferences.dart'; SharedPreferences? prefs; int? initScreen; -class AvisosDashboard extends StatefulWidget { - const AvisosDashboard({Key? key}) : super(key: key); +class ReportesDashboard extends StatefulWidget { + const ReportesDashboard({Key? key}) : super(key: key); @override - _AvisosDashboardState createState() => _AvisosDashboardState(); + _ReportesDashboardState createState() => _ReportesDashboardState(); } -class _AvisosDashboardState extends State { +class _ReportesDashboardState extends State { @override void initState() { super.initState(); diff --git a/lib/src/models/event_data_source.dart b/lib/src/models/event_data_source.dart index 672ad91..81b216b 100644 --- a/lib/src/models/event_data_source.dart +++ b/lib/src/models/event_data_source.dart @@ -3,6 +3,10 @@ import 'dart:ui'; import 'package:adcom/src/models/event.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; +/// gets que obtienen caracteristicas del apartado de amenidades +/// datos como el tiempo, el titulo del apartado del evento, +/// el color del guardado del evento, etc + class EventDataSource extends CalendarDataSource { EventDataSource(List appointments) { this.appointments = appointments; @@ -19,9 +23,11 @@ class EventDataSource extends CalendarDataSource { @override String getSubject(int index) => getEvent(index).title; + /// apartar todo el dia @override bool isAllDay(int index) => getEvent(index).isAllDay; + /// cambiar de colores por evento... se puede implementar @override Color getColor(int index) => getEvent(index).color; } diff --git a/lib/src/pantallas/finanzas.dart b/lib/src/pantallas/finanzas.dart index 4aaa7d0..0e48f99 100644 --- a/lib/src/pantallas/finanzas.dart +++ b/lib/src/pantallas/finanzas.dart @@ -55,55 +55,31 @@ class _FinanzasState extends State { Accounts? cuentas; List mylist = []; List? mylist2 = []; - List localList = []; + List localList = []; int? idComu; var montoCuota; Timer? timer; VoidCallback? _showPersBottomSheetCallBack; bool itsTrue = true; - data() async { - cuentas = await getAdeudos(); - - if (cuentas!.data!.isNotEmpty) { - for (int i = 0; i < cuentas!.data!.length; i++) { - localList.add(new DatosCuenta( - idComu: cuentas!.data![i].idComu, - montoCuota: cuentas!.data![i].montoCuota, - fechaGenerada: cuentas!.data![i].fechaGeneracion!, - fechaLimite: cuentas!.data![i].fechaLimite!, - fechaPago: cuentas!.data![i].fechaPago, - referencia: cuentas!.data![i].referencia, - pago: cuentas!.data![i].pago)); - } - } else { - setState(() { - if (mounted) { - itsTrue = false; - } - }); - } - } - + /// El init state inicializa funciones cuando abre el boton mis pagos @override void initState() { super.initState(); + + /// no tocar, muestra la vista para pagar con tarjeta _showPersBottomSheetCallBack = _showPersBottomSheetCallBack; + + /// funcion que obtiene datos del service data(); + + ///refresqueo cuando hay datos if (itsTrue == false) { } else { Future.delayed(Duration(seconds: 1), () => {refresh()}); } } - refresh() { - setState(() { - if (mounted) { - mainView(); - } - }); - } - @override Widget build(BuildContext context) { var size = MediaQuery.of(context).size; @@ -205,282 +181,52 @@ class _FinanzasState extends State { )); } - mainView() { - return InkWell( - onTap: () { - HapticFeedback.mediumImpact(); - }, - child: VistaTarjeta()); - } - - referenciaApagar() { - final deudas = Provider.of(context, listen: false).deudas; - - String? ref; - for (int i = 0; i < deudas.length; i++) { - if (deudas[i].pago == 1) { - //no debe - } else { - //si debe - setState(() { - ref = deudas[i].referencia!; - }); + refresh() { + setState(() { + if (mounted) { + mainView(); } - } - return ref; + }); } -} - -// ignore: must_be_immutable -class EstadoCuenta extends StatefulWidget { - late dynamic? d; - late int? m; - late int? yy; - - EstadoCuenta({Key? key, this.d, this.m, this.yy}) : super(key: key); - - @override - _EstadoCuentaState createState() => _EstadoCuentaState(); -} -class _EstadoCuentaState extends State { - Accounts? cuentas; - - List mylist = []; data() async { cuentas = await getAdeudos(); - for (int i = 0; i < cuentas!.data!.length; i++) { - mylist.add(new DatosCuenta( - idComu: cuentas!.data![i].idComu, - montoCuota: cuentas!.data![i].montoCuota, - fechaGenerada: cuentas!.data![i].fechaGeneracion!, - fechaLimite: cuentas!.data![i].fechaLimite!, - fechaPago: cuentas!.data![i].fechaPago, - referencia: cuentas!.data![i].referencia, - pago: cuentas!.data![i].pago!)); - } - } - - @override - void initState() { - super.initState(); - data(); - Future.delayed(Duration(seconds: 1), () { - setState(() { - ultimaDeuda(); - }); - }); - } - - @override - Widget build(BuildContext context) { - var size = MediaQuery.of(context).size; - return Container( - width: MediaQuery.of(context).size.width, - height: 175, - decoration: BoxDecoration(boxShadow: [ - BoxShadow(color: Colors.grey, blurRadius: 6, offset: Offset(0, 1)) - ], color: Colors.white, borderRadius: BorderRadius.circular(10)), - child: Padding( - padding: - const EdgeInsets.only(left: 13, right: 13, top: 10, bottom: 20), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Estado de cuenta', - style: TextStyle( - color: Colors.black, - fontWeight: FontWeight.bold, - fontSize: 13), - ), - SizedBox( - height: 5, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Text( - 'Información Actualizada:', - style: TextStyle( - fontSize: size.width / 28, - fontWeight: FontWeight.bold), - ), - SizedBox( - width: size.width * .19, - ), - Text( - '${DateTime.now().day}/${DateTime.now().month}/${DateTime.now().year}', - style: TextStyle(fontWeight: FontWeight.bold), - ) - ], - ) - ], - ), - ], - ), - Row( - children: [ - Expanded( - child: InkWell( - child: Text( - 'Ultimo mes', - textAlign: TextAlign.center, - style: TextStyle(color: Colors.black), - ), - )), - Text('|', style: TextStyle(color: Colors.black)), - Expanded( - child: InkWell( - onTap: () { - HapticFeedback.mediumImpact(); - }, - child: Text('Fecha limite de pago', - textAlign: TextAlign.center, - style: TextStyle(color: Colors.black)), - )) - ], - ), - Row( - children: [ - Expanded( - child: Center( - child: Text( - '\$${ultimaDeuda()}MXN', - style: TextStyle( - color: Colors.black, - fontWeight: FontWeight.bold, - fontSize: size.width / 17), - ), - ), - ), - SizedBox( - width: 20, - ), - Expanded( - child: Center( - child: Text( - '${fechadepago()}', - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - ), - )) - ], - ), - ], - ), - ), - ); - } - - ultimaDeuda() { - double debe = 0.0; - double? monto; - int? total; - for (int i = 0; i < mylist.length; i++) { - monto = double.parse(mylist[i].montoCuota!); - if (mylist[i].pago == 1 && mylist[i].pagoTardio == 0) { - } else { - if (DateTime.now().day <= mylist[i].fechaLimite!.day && - DateTime.now().month <= mylist[i].fechaLimite!.month && - DateTime.now().year <= mylist[i].fechaLimite!.year) { - return debe = monto; - } else { - if (mylist[i].pagoTardio == 0 || mylist[i].pagoTardio == null) { - return debe = monto; - } else { - total = int.parse(mylist[i].montoTardio!); - print('${total}'); - return debe = monto + total; - } - } - } - } - return debe == 0.0 ? '0.0' : debe; - } - - referenciaApagar() { - String? ref; - for (int i = 0; i < mylist.length; i++) { - if (mylist[i].pago == 1 && mylist[i].pagoTardio == 0) { - print('no debe'); - } else { - setState(() { - ref = mylist[i].referencia!; - }); - return ref == null ? " " : ref; + if (cuentas!.data!.isNotEmpty) { + for (int i = 0; i < cuentas!.data!.length; i++) { + localList.add(new DatosCuenta( + idComu: cuentas!.data![i].idComu, + montoCuota: cuentas!.data![i].montoCuota, + fechaGenerada: cuentas!.data![i].fechaGeneracion!, + fechaLimite: cuentas!.data![i].fechaLimite!, + fechaPago: cuentas!.data![i].fechaPago, + pago: cuentas!.data![i].pago!, + totalApagar: cuentas!.data![i].totalApagar, + referencia: cuentas!.data![i].referencia, + pagoTardio: cuentas!.data![i].pagoTardio, + montoTardio: cuentas!.data![i].montoPagoTardio)); } - } - return ref == null ? " " : ref; - } - - //te dice cuanto dinero debe - saldoDeudor() { - double contador = 0.0; - double deuda; - for (int i = 0; i < mylist.length; i++) { - deuda = double.parse(mylist[i].montoCuota!); - if (mylist[i].pago == 1) { - } else { - if (DateTime.now().day <= mylist[i].fechaLimite!.day && - DateTime.now().month <= mylist[i].fechaLimite!.month && - DateTime.now().year <= mylist[i].fechaLimite!.year) { - } else { - setState(() { - contador += deuda; - }); + } else { + setState(() { + if (mounted) { + itsTrue = false; } - } + }); } - return contador; } - fechadepago() { - int? dia; - int? mes; - int? year; - for (int i = 0; i < mylist.length; i++) { - if (mylist[i].pago == 1) { - print('no debe'); - } else { - setState(() { - dia = mylist[i].fechaLimite!.day; - mes = mylist[i].fechaLimite!.month; - year = mylist[i].fechaLimite!.year; - }); - return dia == null ? '' : '$dia/$mes/$year'; - } - } + mainView() { + return InkWell( + onTap: () { + HapticFeedback.mediumImpact(); + }, - return dia == null ? '' : '$dia/$mes/$year'; + /// vista para la tarjeta + child: VistaTarjeta( + newList: localList, + )); } - - //te dice cuantos meses debe - /* cuantoDebe() { - int contador = 0; - for (int i = 0; i < mylist.length; i++) { - if (mylist[i].pago == 1) { - } else { - if (DateTime.now().day <= mylist[i].fechaLimite!.day && - DateTime.now().month <= mylist[i].fechaLimite!.month && - DateTime.now().year <= mylist[i].fechaLimite!.year) { - } else { - setState(() { - contador++; - }); - } - } - } - return contador.toString(); - } */ } -// ignore: must_be_immutable class DatosCuenta { int? idComu; diff --git a/lib/src/pantallas/mainMenu.dart b/lib/src/pantallas/mainMenu.dart index 4b8b584..ab9d1fe 100644 --- a/lib/src/pantallas/mainMenu.dart +++ b/lib/src/pantallas/mainMenu.dart @@ -100,16 +100,23 @@ class _MainMenuState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ + user == null || user == '' + ? Text('¡${greeting()}!', + style: TextStyle( + color: Colors.black, + fontFamily: 'Roboto', + fontSize: 35, + fontWeight: FontWeight.w700)) + : Text( + '¡${greeting()}!', + style: TextStyle( + color: Colors.black, + fontFamily: 'Roboto', + fontSize: 17, + fontWeight: FontWeight.w700), + ), Text( - '¡${greeting()}!', - style: TextStyle( - color: Colors.black, - fontFamily: 'Roboto', - fontSize: 17, - fontWeight: FontWeight.w700), - ), - Text( - '${user == null ? ' ' : user}', + '${user == null || user == '' ? '' : user}', style: TextStyle( color: Colors.black, fontFamily: 'Roboto', diff --git a/lib/src/pantallas/reportes.dart b/lib/src/pantallas/reportes.dart index 97eec8c..df88536 100644 --- a/lib/src/pantallas/reportes.dart +++ b/lib/src/pantallas/reportes.dart @@ -1,6 +1,6 @@ import 'package:adcom/json/jsonReporte.dart'; import 'package:adcom/json/jsonRespuesta.dart'; -import 'package:adcom/src/methods/avisoDashboard.dart'; +import 'package:adcom/src/methods/reporteDashboard.dart'; import 'package:adcom/src/methods/searchBar.dart'; import 'package:flutter/material.dart'; @@ -46,7 +46,7 @@ class _ReportesState extends State { body: Stack( children: [ Container( - height: size.height * .40, + height: size.height * .35, decoration: BoxDecoration(color: Colors.blue), ), Container( @@ -84,13 +84,13 @@ class _ReportesState extends State { child: Text( 'Reporta incidencias en tu comunidad para que todos estén al tanto de comportamientos inusuales o faltas a la comunidad.', style: TextStyle( - color: Colors.white, fontSize: size.width / 21), + color: Colors.white, fontSize: size.width / 20), ), ), SizedBox( height: size.width / 8, ), - AvisosDashboard() + ReportesDashboard() ], ), )) diff --git a/pubspec.yaml b/pubspec.yaml index 718628d..a9906af 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.1.7+28 +version: 2.1.82+30 environment: sdk: ">=2.12.0 <3.0.0" From ecc63a1264954e8b6357ea4518b68753b2b46aa3 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Wed, 15 Sep 2021 12:57:01 -0600 Subject: [PATCH 10/20] abrir archivos automatico --- android/app/src/main/AndroidManifest.xml | 38 +++++++++++++ lib/main.dart | 5 +- lib/src/extra/dashboard_Avisos.dart | 68 +++++++++++++++++++----- pubspec.lock | 28 +++------- pubspec.yaml | 4 +- 5 files changed, 106 insertions(+), 37 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 0e9fb2a..8da1824 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ + @@ -19,6 +20,43 @@ android:usesCleartextTraffic="true" android:icon="@mipmap/ic_launcher"> + + + + + + + + + + + + + + + { List? avisosRevers = []; List namesRev = []; List linksrev = []; - + var filePath; + ReceivePort _receivePort = ReceivePort(); reversedList() { avisosRevers = widget.avisos!.reversed.toList(); namesRev = widget.name!.reversed.toList(); @@ -46,6 +51,15 @@ class _AvisosDashboardState extends State { @override void initState() { _showPersBottomSheetCallBack = _showPersBottomSheetCallBack; + IsolateNameServer.registerPortWithName( + _receivePort.sendPort, "Descargando"); + + _receivePort.listen((message) { + setState(() { + progress = message[2]; + }); + }); + FlutterDownloader.registerCallback(downloadCallback); reversedList(); super.initState(); } @@ -191,17 +205,21 @@ class _AvisosDashboardState extends State { itemBuilder: (_, int index) { return TextButton( onPressed: () async { - download2(links[index], names[index]) - .then((value) { - Fluttertoast.showToast( - msg: "Archivo en Descargas", - toastLength: Toast.LENGTH_SHORT, - gravity: ToastGravity.CENTER, - timeInSecForIosWeb: 1, - backgroundColor: Colors.white, - textColor: Colors.black, - fontSize: 17.0); - }); + try { + download2(links[index], names[index]) + .then((value) { + Fluttertoast.showToast( + msg: "Descargando", + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.CENTER, + timeInSecForIosWeb: 1, + backgroundColor: Colors.white, + textColor: Colors.black, + fontSize: 17.0); + }); + } catch (e) { + print(e); + } /* downloadLink( links[index], names[index]); */ }, @@ -281,6 +299,27 @@ class _AvisosDashboardState extends State { } catch (e) { print(e); } + await OpenFile.open(filePath); + } + + download3(String url, String names) async { + final externalDir = await getExternalStorageDirectory(); + final taskId = await FlutterDownloader.enqueue( + url: url, + savedDir: externalDir!.path, + showNotification: + true, // show download progress in status bar (for Android) + openFileFromNotification: + true, // click on notification to open downloaded file (for Android) + ); + + return taskId; + } + + static downloadCallback(id, status, progress) { + SendPort? sendPort = IsolateNameServer.lookupPortByName("Descargando"); + + sendPort!.send([id, status, progress]); } void showDownloadProgress(received, total) { @@ -294,7 +333,10 @@ class _AvisosDashboardState extends State { ExternalPath.DIRECTORY_DOWNLOADS); print(path); - var filePath = path + '/$names'; + + setState(() { + filePath = path + '/$names'; + }); return filePath; } diff --git a/pubspec.lock b/pubspec.lock index 6b1c4c8..39927ae 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -50,13 +50,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.8.1+7" - camera_camera: - dependency: "direct main" - description: - name: camera_camera - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" camera_platform_interface: dependency: transitive description: @@ -230,6 +223,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_downloader: + dependency: "direct main" + description: + name: flutter_downloader + url: "https://pub.dartlang.org" + source: hosted + version: "1.7.0" flutter_launcher_icons: dependency: "direct dev" description: @@ -275,13 +275,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.0.7" - font_awesome_flutter: - dependency: transitive - description: - name: font_awesome_flutter - url: "https://pub.dartlang.org" - source: hosted - version: "9.1.0" freezed_annotation: dependency: transitive description: @@ -569,13 +562,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.26.0" shared_preferences: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index a9906af..c4b3960 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.1.82+30 +version: 2.1.83+31 environment: sdk: ">=2.12.0 <3.0.0" @@ -65,7 +65,7 @@ dependencies: file_picker: ^4.0.1 external_path: ^1.0.1 permission_handler: ^8.1.4+2 - camera_camera: ^2.0.2 + flutter_downloader: ^1.7.0 From 4a00258c7ea4d72e51c959aa7966f67fb79073c6 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Fri, 17 Sep 2021 12:35:24 -0600 Subject: [PATCH 11/20] fix --- lib/src/extra/dashboard_Avisos.dart | 64 ++--------------------------- pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 62 deletions(-) diff --git a/lib/src/extra/dashboard_Avisos.dart b/lib/src/extra/dashboard_Avisos.dart index a2e521d..868684b 100644 --- a/lib/src/extra/dashboard_Avisos.dart +++ b/lib/src/extra/dashboard_Avisos.dart @@ -231,49 +231,6 @@ class _AvisosDashboardState extends State { )).then((value) => {names.clear()}); } - Future? downloadLink(link, names) async { - setState(() { - downloading = true; - }); - Dio dio = Dio(); - String savePath = await getPath(names); - - print('${savePath}'); - print('aquui'); - String urlPath = link; - dio.download( - urlPath, - savePath, - onReceiveProgress: (rcv, total) { - print( - 'received: ${rcv.toStringAsFixed(0)} out of total: ${total.toStringAsFixed(0)}'); - - setState(() { - progress = ((rcv / total) * 100).toStringAsFixed(0); - }); - - if (progress == '100') { - setState(() { - isDownloaded = true; - }); - } else if (double.parse(progress) < 100) { - print('aqui'); - } - }, - deleteOnError: true, - ).then((_) { - setState(() { - if (progress == '100') { - isDownloaded = true; - } - - downloading = false; - }); - }).onError((error, stackTrace) { - print('$error'); - }); - } - Future download2(String url, String names) async { Dio dio = Dio(); @@ -302,20 +259,6 @@ class _AvisosDashboardState extends State { await OpenFile.open(filePath); } - download3(String url, String names) async { - final externalDir = await getExternalStorageDirectory(); - final taskId = await FlutterDownloader.enqueue( - url: url, - savedDir: externalDir!.path, - showNotification: - true, // show download progress in status bar (for Android) - openFileFromNotification: - true, // click on notification to open downloaded file (for Android) - ); - - return taskId; - } - static downloadCallback(id, status, progress) { SendPort? sendPort = IsolateNameServer.lookupPortByName("Descargando"); @@ -329,13 +272,12 @@ class _AvisosDashboardState extends State { } Future getPath(names) async { - String path = await ExternalPath.getExternalStoragePublicDirectory( - ExternalPath.DIRECTORY_DOWNLOADS); + Directory path = await getApplicationDocumentsDirectory(); - print(path); + print(path.path); setState(() { - filePath = path + '/$names'; + filePath = path.path + '/$names'; }); return filePath; diff --git a/pubspec.yaml b/pubspec.yaml index c4b3960..389ebe8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.1.83+31 +version: 2.1.84+32 environment: sdk: ">=2.12.0 <3.0.0" From 72e9d7f8e3821b4c8cf1c75806cae41819dbe007 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Sat, 18 Sep 2021 10:52:42 -0600 Subject: [PATCH 12/20] hola --- README.md | 2 +- lib/src/extra/add_reporte.dart | 26 +++++++++++++++++++++----- pubspec.yaml | 2 +- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 423381d..3787421 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# adcom iosV +# Adcom iosV Esta version es version android, cuidado con juntar las ramas, ios tiene librerias diferentes a las de android y pueden chocar diff --git a/lib/src/extra/add_reporte.dart b/lib/src/extra/add_reporte.dart index 31d558c..d61821e 100644 --- a/lib/src/extra/add_reporte.dart +++ b/lib/src/extra/add_reporte.dart @@ -47,7 +47,7 @@ class _AddReporteState extends State { List images = []; int? pages = 0; List? _slides = []; - + bool isLoading = false; int _currentStep = 0; int? idCom; int? idUser; @@ -94,7 +94,6 @@ class _AddReporteState extends State { Navigator.of(context).pop(); }, ), - actions: buildEditingActions(), ), resizeToAvoidBottomInset: true, //stepper, propiedades y acciones @@ -105,7 +104,11 @@ class _AddReporteState extends State { floatingActionButton: FloatingActionButton( backgroundColor: Colors.blue, - child: Icon(Icons.camera), + child: isLoading == true + ? CircularProgressIndicator( + backgroundColor: Colors.white, + ) + : Icon(Icons.camera), onPressed: () => { HapticFeedback.lightImpact(), images.length == 3 ? mensaje() : _optionsCamera(), @@ -370,6 +373,11 @@ class _AddReporteState extends State { // envia las fotos al serv mas toda su informacion que reqiere como los params sendingData(String titulo, String descrip, List file) async { await addata(); + + setState(() { + isLoading = true; + }); + try { List filesArr = []; Dio dio = Dio(); @@ -462,6 +470,12 @@ class _AddReporteState extends State { }, ); + cargando() { + return isLoading == true + ? Center(child: CircularProgressIndicator()) + : null; + } + Future saveForm() async { final isValid = _formKey.currentState!.validate(); final isValid2 = _formKey2.currentState!.validate(); @@ -472,11 +486,13 @@ class _AddReporteState extends State { description: descriptionController.text, image: images, time: DateTime.now()); - final provider = Provider.of(context, listen: false); + final Response? response = await sendingData( titleController.text, descriptionController.text, images) .then((value) { - provider.addReport(report); + setState(() { + isLoading = false; + }); Navigator.of(context).pop(); ScaffoldMessenger.of(context).showSnackBar(SnackBar( diff --git a/pubspec.yaml b/pubspec.yaml index 389ebe8..314ea07 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.1.84+32 +version: 2.1.85+33 environment: sdk: ">=2.12.0 <3.0.0" From 6fee22090720c050e6235b29af1c9782d4eba9ba Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Thu, 30 Sep 2021 09:55:37 -0600 Subject: [PATCH 13/20] cambios login --- lib/src/models/event_provider.dart | 53 ++++++++++++++++++++++-------- lib/src/pantallas/loginPage.dart | 5 ++- pubspec.yaml | 2 +- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/lib/src/models/event_provider.dart b/lib/src/models/event_provider.dart index da29422..203e9ce 100644 --- a/lib/src/models/event_provider.dart +++ b/lib/src/models/event_provider.dart @@ -61,13 +61,20 @@ class EventProvider extends ChangeNotifier { } var userd; - void login(user, pass, ctx) async { + + /// funcion de login + void login(user, pass, ctx, TextEditingController tk, + TextEditingController tk2) async { _loading = false; notifyListeners(); + /// primer intento try { - _loading = true; await loginAcces(user, pass).then((value) { + /// el estado de carga se vuelve true + _loading = true; + + /// carga todos los datos necesarios para el login var userId; var post = value; if (post!.value == 1) { @@ -77,37 +84,54 @@ class EventProvider extends ChangeNotifier { userd = post.nombreResidente; var userType = post.idPerfil; somData(userd, userType, comId, idPrimario, userId); - //obtainId(userType); - - /* dataOff2(idPrimario, userType); - dataOff4(idPrimario); - someData(comId, userId); - //Adeudos - dataOff3(userId); - //amenidades - - dataOff5(userId); */ + /// despues de hacer la carga y que todo este bien hace el push a otra pagina Navigator.pushReplacementNamed(ctx, '/'); } + /* else { + { + /// caso comentado, en caso de no estar bien los datos pasa aqui + /// se cambio por el try catch + HapticFeedback.lightImpact(); + Widget okButton = TextButton( + onPressed: () { + Navigator.pop(ctx); + }, + child: Text('OK')); + + AlertDialog alert = AlertDialog( + title: Text('Atencion!'), + content: Text('Usuario o Contraseña incorrectos'), + actions: [okButton], + ); + + showDialog(context: ctx, builder: (_) => alert); + } + } */ }); + /// informa al estate provider, que todo esta en orden y que permanezca logeado siempre _loading = true; if (userd != null) { _islogged = true; pref.setBool('isLoggedIn', true); notifyListeners(); } else { + _loading = false; _islogged = false; notifyListeners(); } } catch (e) { { + _loading = false; + HapticFeedback.lightImpact(); Widget okButton = TextButton( onPressed: () { - Navigator.of(ctx).popAndPushNamed('/'); - ; + Navigator.of(ctx).pushNamedAndRemoveUntil('/', (route) => false); + tk.clear(); + + tk2.clear(); }, child: Text('OK')); @@ -122,6 +146,7 @@ class EventProvider extends ChangeNotifier { } } + ///este estado chequea si esta logeado o no void loginState() async { pref = await SharedPreferences.getInstance(); var id = pref.getString('user'); diff --git a/lib/src/pantallas/loginPage.dart b/lib/src/pantallas/loginPage.dart index 61e7be1..c600a03 100644 --- a/lib/src/pantallas/loginPage.dart +++ b/lib/src/pantallas/loginPage.dart @@ -122,7 +122,7 @@ class _LoginPageState extends State { } return null; }, - autofocus: false, + autofocus: true, decoration: InputDecoration( enabledBorder: UnderlineInputBorder( borderSide: @@ -156,7 +156,6 @@ class _LoginPageState extends State { return null; }, obscureText: true, - autofocus: false, decoration: InputDecoration( enabledBorder: UnderlineInputBorder( borderSide: @@ -198,7 +197,7 @@ class _LoginPageState extends State { _formKey2.currentState!.validate()) { try { Provider.of(context, listen: false) - .login(user, pass, context); + .login(user, pass, context, tk, tk2); } catch (e) { HapticFeedback.heavyImpact(); showAlertDialog(); diff --git a/pubspec.yaml b/pubspec.yaml index 314ea07..64df248 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.1.85+33 +version: 2.1.86+34 environment: sdk: ">=2.12.0 <3.0.0" From 6f3a5ae19993a3e035f9e5168937e7039e711048 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Thu, 30 Sep 2021 16:20:18 -0600 Subject: [PATCH 14/20] cambios --- lib/src/extra/detalles_pago.dart | 13 +- lib/src/extra/vista_tarjeta.dart | 294 +++++++++++++++---------------- lib/src/pantallas/finanzas.dart | 34 ++-- 3 files changed, 178 insertions(+), 163 deletions(-) diff --git a/lib/src/extra/detalles_pago.dart b/lib/src/extra/detalles_pago.dart index 3c558d8..8ffb5b7 100644 --- a/lib/src/extra/detalles_pago.dart +++ b/lib/src/extra/detalles_pago.dart @@ -146,7 +146,11 @@ class _DetallesPagoState extends State { double deuda; for (int i = 0; i < widget.list!.length; i++) { - total = double.parse(widget.list![i].montoCuota!); + if (widget.list![i].montoCuota == null) { + total = 0.0; + } else { + total = double.parse(widget.list![i].montoCuota!); + } deuda = double.parse(widget.list![i].montoTardio!); if (widget.list![i].pago == 1) { @@ -176,7 +180,12 @@ class _DetallesPagoState extends State { double deuda; double tardio; for (int i = 0; i < widget.list!.length; i++) { - deuda = double.parse(widget.list![i].montoCuota!); + if (widget.list![i].montoCuota == null) { + deuda = 0.0; + } else { + deuda = double.parse(widget.list![i].montoCuota!); + } + tardio = double.parse(widget.list![i].montoTardio!); if (widget.list![i].pago == 1) { contador; diff --git a/lib/src/extra/vista_tarjeta.dart b/lib/src/extra/vista_tarjeta.dart index 865d78b..04ce324 100644 --- a/lib/src/extra/vista_tarjeta.dart +++ b/lib/src/extra/vista_tarjeta.dart @@ -13,7 +13,8 @@ import 'package:provider/provider.dart'; class VistaTarjeta extends StatefulWidget { List? newList = []; - VistaTarjeta({Key? key, this.newList}) : super(key: key); + List? refP = []; + VistaTarjeta({Key? key, this.newList, this.refP}) : super(key: key); @override _VistaTarjetaState createState() => _VistaTarjetaState(); @@ -29,15 +30,11 @@ class _VistaTarjetaState extends State { void initState() { super.initState(); _showPersBottomSheetCallBack = _showPersBottomSheetCallBack; - data(); + //data(); - Future.delayed(Duration(seconds: 1), () { - if (mounted) { - setState(() { - ultimaDeuda(); - estadodepago(); - }); - } + setState(() { + ultimaDeuda(); + estadodepago(); }); } @@ -51,126 +48,117 @@ class _VistaTarjetaState extends State { var size = MediaQuery.of(context).size; var size2 = MediaQuery.of(context).size.width; - return mylist.isEmpty - ? SizedBox() - : Container( - width: MediaQuery.of(context).size.width, - height: 220, - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.grey, blurRadius: 6, offset: Offset(0, 1)) - ], - color: estadodepagoColor(), - borderRadius: BorderRadius.circular(10)), - child: Padding( - padding: const EdgeInsets.only( - left: 13, right: 13, top: 13, bottom: 20), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Monto de cuota', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 15), - ), - SizedBox( - height: 2.0, - ), - Text( - '${estadodepago()}', - style: TextStyle( - color: Colors.black, - fontSize: 14, - ), - ) - ], - ), - Container( - height: 30, - child: OutlinedButton( - onPressed: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => RefView( - list: mylist, - ))); - }, - child: Icon(Icons.add, size: 25, color: Colors.white), - style: OutlinedButton.styleFrom( - side: BorderSide( - width: 1.0, color: Colors.transparent)), - ), - ) - ], - ), - Column( - children: [ - Text( - '\$ ${saldoDeudor()}', - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 28), - ), - SizedBox( - height: 10, - ), - Text( - mylist.isEmpty - ? 'Pagar antes del día: ' - : 'Pagar antes del día: ${fechadepago()}', - style: TextStyle( - color: Colors.black, - fontWeight: FontWeight.w400, - fontSize: 14), + return Container( + width: MediaQuery.of(context).size.width, + height: 220, + decoration: BoxDecoration(boxShadow: [ + BoxShadow(color: Colors.grey, blurRadius: 6, offset: Offset(0, 1)) + ], color: estadodepagoColor(), borderRadius: BorderRadius.circular(10)), + child: Padding( + padding: + const EdgeInsets.only(left: 13, right: 13, top: 13, bottom: 20), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Monto de cuota', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 15), + ), + SizedBox( + height: 2.0, + ), + Text( + '${estadodepago()}', + style: TextStyle( + color: Colors.black, + fontSize: 14, ), - ], + ) + ], + ), + Container( + height: 30, + child: OutlinedButton( + onPressed: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => RefView( + list: widget.newList, + ))); + }, + child: Icon(Icons.add, size: 25, color: Colors.white), + style: OutlinedButton.styleFrom( + side: + BorderSide(width: 1.0, color: Colors.transparent)), ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - OutlinedButton( - onPressed: () { - _showModalSheet(); - }, - child: Text( - 'Pagar Ahora', - textAlign: TextAlign.center, - style: TextStyle(color: Colors.white, fontSize: 14), - ), - style: OutlinedButton.styleFrom( - side: BorderSide(width: 1.0, color: Colors.white)), - ), - //Text('|', style: TextStyle(color: Colors.white, fontSize: 15)), - - OutlinedButton( - onPressed: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => DetallesPago( - list: mylist, - ))); - }, - child: Text('Detalles', - textAlign: TextAlign.center, - style: - TextStyle(color: Colors.white, fontSize: 15)), - style: OutlinedButton.styleFrom( - side: BorderSide(width: 1.0, color: Colors.white)), - ) - ], - ) - ], - ), + ) + ], ), - ); + Column( + children: [ + Text( + '\$ ${saldoDeudor()}', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 28), + ), + SizedBox( + height: 10, + ), + Text( + 'Pagar antes del día: ${fechadepago()}', + style: TextStyle( + color: Colors.black, + fontWeight: FontWeight.w400, + fontSize: 14), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + OutlinedButton( + onPressed: () { + _showModalSheet(); + }, + child: Text( + 'Pagar Ahora', + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white, fontSize: 14), + ), + style: OutlinedButton.styleFrom( + side: BorderSide(width: 1.0, color: Colors.white)), + ), + //Text('|', style: TextStyle(color: Colors.white, fontSize: 15)), + + OutlinedButton( + onPressed: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => DetallesPago( + list: widget.newList!, + ))); + }, + child: Text('Detalles', + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white, fontSize: 15)), + style: OutlinedButton.styleFrom( + side: BorderSide(width: 1.0, color: Colors.white)), + ) + ], + ) + ], + ), + ), + ); } void _showModalSheet() { @@ -358,11 +346,11 @@ class _VistaTarjetaState extends State { mesesDeAtraso() { DateTime? mesesAtrazo; - for (int i = 0; i < mylist.length; i++) { - if (mylist[i].pago == 1) { + for (int i = 0; i < widget.newList!.length; i++) { + if (widget.newList![i].pago == 1) { } else { setState(() { - mesesAtrazo = mylist[i].fechaGenerada; + mesesAtrazo = widget.newList![i].fechaGenerada; mesFormat .add((DateFormat('MMM').format(DateTime(0, mesesAtrazo!.month)))); }); @@ -377,19 +365,20 @@ class _VistaTarjetaState extends State { double debe = 0.0; double? monto; int? total; - for (int i = 0; i < mylist.length; i++) { - monto = double.parse(mylist[i].montoCuota!); - if (mylist[i].pago == 1 && mylist[i].pagoTardio == 0) { + for (int i = 0; i < widget.newList!.length; i++) { + monto = double.parse(widget.newList![i].montoCuota!); + if (widget.newList![i].pago == 1 && widget.newList![i].pagoTardio == 0) { } else { - if (DateTime.now().day <= mylist[i].fechaLimite!.day && - DateTime.now().month <= mylist[i].fechaLimite!.month && - DateTime.now().year <= mylist[i].fechaLimite!.year) { + if (DateTime.now().day <= widget.newList![i].fechaLimite!.day && + DateTime.now().month <= widget.newList![i].fechaLimite!.month && + DateTime.now().year <= widget.newList![i].fechaLimite!.year) { return debe = monto; } else { - if (mylist[i].pagoTardio == 0 || mylist[i].pagoTardio == null) { + if (widget.newList![i].pagoTardio == 0 || + widget.newList![i].pagoTardio == null) { return debe = monto; } else { - total = int.parse(mylist[i].montoTardio!); + total = int.parse(widget.newList![i].montoTardio!); return debe = monto + total; } } @@ -402,16 +391,16 @@ class _VistaTarjetaState extends State { double debe = 0.0; double? monto; - for (int i = 0; i < mylist.length; i++) { - monto = double.parse(mylist[i].montoCuota!); - if (mylist[i].pago == 1 && mylist[i].pagoTardio == 0) { + for (int i = 0; i < widget.newList!.length; i++) { + monto = double.parse(widget.newList![i].montoCuota!); + if (widget.newList![i].pago == 1 && widget.newList![i].pagoTardio == 0) { } else { - if (DateTime.now().day <= mylist[i].fechaLimite!.day && - DateTime.now().month <= mylist[i].fechaLimite!.month && - DateTime.now().year <= mylist[i].fechaLimite!.year) { + if (DateTime.now().day <= widget.newList![i].fechaLimite!.day && + DateTime.now().month <= widget.newList![i].fechaLimite!.month && + DateTime.now().year <= widget.newList![i].fechaLimite!.year) { return debe = monto; } else { - if (mylist[i].pagoTardio == 0) { + if (widget.newList![i].pagoTardio == 0) { return debe = monto; } else { return debe = monto; @@ -426,14 +415,14 @@ class _VistaTarjetaState extends State { int? dia; int? mes; int? year; - for (int i = 0; i < mylist.length; i++) { - if (mylist[i].pago == 1) { + for (int i = 0; i < widget.newList!.length; i++) { + if (widget.newList![i].pago == 1) { print('no debe'); } else { setState(() { - dia = mylist[i].fechaLimite!.day; - mes = mylist[i].fechaLimite!.month; - year = mylist[i].fechaLimite!.year; + dia = widget.newList![i].fechaLimite!.day; + mes = widget.newList![i].fechaLimite!.month; + year = widget.newList![i].fechaLimite!.year; }); return dia == null ? '' : '$dia/$mes/$year'; } @@ -447,7 +436,12 @@ class _VistaTarjetaState extends State { double deuda; double tardio; for (int i = 0; i < widget.newList!.length; i++) { - deuda = double.parse(widget.newList![i].montoCuota!); + if (widget.newList![i].montoCuota == null) { + deuda = 0.0; + } else { + deuda = double.parse(widget.newList![i].montoCuota!); + } + tardio = double.parse(widget.newList![i].montoTardio!); if (widget.newList![i].pago == 1) { contador; diff --git a/lib/src/pantallas/finanzas.dart b/lib/src/pantallas/finanzas.dart index 0e48f99..25d33ee 100644 --- a/lib/src/pantallas/finanzas.dart +++ b/lib/src/pantallas/finanzas.dart @@ -192,19 +192,31 @@ class _FinanzasState extends State { data() async { cuentas = await getAdeudos(); + prefs = await SharedPreferences.getInstance(); if (cuentas!.data!.isNotEmpty) { for (int i = 0; i < cuentas!.data!.length; i++) { - localList.add(new DatosCuenta( - idComu: cuentas!.data![i].idComu, - montoCuota: cuentas!.data![i].montoCuota, - fechaGenerada: cuentas!.data![i].fechaGeneracion!, - fechaLimite: cuentas!.data![i].fechaLimite!, - fechaPago: cuentas!.data![i].fechaPago, - pago: cuentas!.data![i].pago!, - totalApagar: cuentas!.data![i].totalApagar, - referencia: cuentas!.data![i].referencia, - pagoTardio: cuentas!.data![i].pagoTardio, - montoTardio: cuentas!.data![i].montoPagoTardio)); + if (cuentas!.data![i].idConcepto == "PA ") { + } else { + if (cuentas!.data![i].idConcepto == "ACCTEL ") { + } else { + localList.add(new DatosCuenta( + idComu: cuentas!.data![i].idComu, + montoCuota: cuentas!.data![i].montoCuota, + idConcepto: cuentas!.data![i].idConcepto, + fechaGenerada: cuentas!.data![i].fechaGeneracion!, + fechaLimite: cuentas!.data![i].fechaLimite == null + ? DateTime.now() + : cuentas!.data![i].fechaLimite, + fechaPago: cuentas!.data![i].fechaPago, + pago: cuentas!.data![i].pago!, + montoPago: cuentas!.data![i].montoPago, + totalApagar: cuentas!.data![i].totalApagar, + referencia: cuentas!.data![i].referencia, + pagoTardio: cuentas!.data![i].pagoTardio, + montoTardio: cuentas!.data![i].montoPagoTardio, + )); + } + } } } else { setState(() { From 04999ee276184502d097d525ce5b96ff2ddcf5e3 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Thu, 30 Sep 2021 16:34:55 -0600 Subject: [PATCH 15/20] guardar version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 64df248..73158aa 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.1.86+34 +version: 2.1.87+35 environment: sdk: ">=2.12.0 <3.0.0" From 52d3620c0d067a5f7638daafb27a35630ce3acb3 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Thu, 30 Sep 2021 16:45:10 -0600 Subject: [PATCH 16/20] cambios --- lib/main.dart | 2 +- lib/src/app.dart | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 81e44c4..162570e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,7 +8,7 @@ SharedPreferences? prefs; void main() async { WidgetsFlutterBinding.ensureInitialized(); OneSignal.shared.setAppId("ea109547-8715-4fc2-aa63-f9afe45349b0"); - await SharedPreferences.getInstance(); + await FlutterDownloader.initialize( // optional: set false to disable printing logs to console ); diff --git a/lib/src/app.dart b/lib/src/app.dart index 95aed69..ba312f8 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -38,14 +38,9 @@ class _MyAppState extends State { var id = 'icono'; bool _loggedIn = false; - init() async { - prefs = await SharedPreferences.getInstance(); - } - @override void initState() { super.initState(); - init(); } @override From a18d51f8c15bef96bf2ed12821daff632218a895 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Fri, 1 Oct 2021 13:15:38 -0600 Subject: [PATCH 17/20] cambios --- lib/src/app.dart | 4 ++++ lib/src/extra/add_reporte.dart | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/src/app.dart b/lib/src/app.dart index ba312f8..6ec947e 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -31,6 +31,9 @@ class MyApp extends StatefulWidget { } SharedPreferences? prefs; +init() async { + prefs = await SharedPreferences.getInstance(); +} class _MyAppState extends State { final heroController = HeroController(); @@ -41,6 +44,7 @@ class _MyAppState extends State { @override void initState() { super.initState(); + init(); } @override diff --git a/lib/src/extra/add_reporte.dart b/lib/src/extra/add_reporte.dart index d61821e..e15804e 100644 --- a/lib/src/extra/add_reporte.dart +++ b/lib/src/extra/add_reporte.dart @@ -259,10 +259,10 @@ class _AddReporteState extends State { inputFormatters: [new LengthLimitingTextInputFormatter(50)], ); - //funcion que abre la camara y muestra + ///funcion que abre la camara y muestra void openCamera() async { var image = - await _picker.pickImage(source: ImageSource.camera, imageQuality: 50); + await _picker.pickImage(source: ImageSource.camera, imageQuality: 30); setState(() { if (image != null) { From 1bc1e42282780328a2b9dd795701e63275741ae9 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Fri, 1 Oct 2021 16:37:37 -0600 Subject: [PATCH 18/20] actualizacion de version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 73158aa..6400679 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.1.87+35 +version: 2.1.88+39 environment: sdk: ">=2.12.0 <3.0.0" From 9d4d0f8b3b4f89c46c2d3a025b6ce7243087c65a Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Sat, 2 Oct 2021 09:31:52 -0600 Subject: [PATCH 19/20] cambios --- lib/json/jsonReporte.dart | 40 ++++++++++++++--------- lib/src/extra/reporte.dart | 66 ++++++++++++++++++++++++++++++++------ pubspec.yaml | 2 +- 3 files changed, 82 insertions(+), 26 deletions(-) diff --git a/lib/json/jsonReporte.dart b/lib/json/jsonReporte.dart index 183d0ee..50de85d 100644 --- a/lib/json/jsonReporte.dart +++ b/lib/json/jsonReporte.dart @@ -45,6 +45,9 @@ class Datum { this.evidencia, this.progreso, this.idReporte, + this.comunidad, + this.interior, + this.numero, }); String? descCorta; @@ -53,23 +56,27 @@ class Datum { List? evidencia; List? progreso; int? idReporte; + String? comunidad; + String? numero; + String? interior; factory Datum.fromJson(Map json) => Datum( - descCorta: json["DESC_CORTA"] == null ? null : json["DESC_CORTA"], - descDesperfecto: - json["DESC_DESPERFECTO"] == null ? null : json["DESC_DESPERFECTO"], - fechaRep: json["FECHA_REP"] == null - ? null - : DateTime.parse(json["FECHA_REP"]), - evidencia: json["EVIDENCIA"] == null - ? null - : List.from(json["EVIDENCIA"].map((x) => x)), - progreso: json["PROGRESO"] == null - ? null - : List.from( - json["PROGRESO"].map((x) => Progreso.fromJson(x))), - idReporte: json["ID_REPORTE"] == null ? null : json["ID_REPORTE"], - ); + descCorta: json["DESC_CORTA"] == null ? null : json["DESC_CORTA"], + descDesperfecto: + json["DESC_DESPERFECTO"] == null ? null : json["DESC_DESPERFECTO"], + fechaRep: + json["FECHA_REP"] == null ? null : DateTime.parse(json["FECHA_REP"]), + evidencia: json["EVIDENCIA"] == null + ? null + : List.from(json["EVIDENCIA"].map((x) => x)), + progreso: json["PROGRESO"] == null + ? null + : List.from( + json["PROGRESO"].map((x) => Progreso.fromJson(x))), + idReporte: json["ID_REPORTE"] == null ? null : json["ID_REPORTE"], + comunidad: json["COMUNIDAD"] == null ? null : json["COMUNIDAD"], + numero: json["NUMERO"] == null ? null : json["NUMERO"], + interior: json["INTERIOR"] == null ? null : json["INTERIOR"]); Map toJson() => { "DESC_CORTA": descCorta == null ? null : descCorta, @@ -82,6 +89,9 @@ class Datum { ? null : List.from(progreso!.map((x) => x.toJson())), "ID_REPORTE": idReporte == null ? null : idReporte, + "COMUNIDAD": comunidad == null ? null : comunidad, + "NUMERO": numero == null ? null : numero, + "INTERIOR": interior == null ? null : interior, }; } diff --git a/lib/src/extra/reporte.dart b/lib/src/extra/reporte.dart index 97dda7f..076e877 100644 --- a/lib/src/extra/reporte.dart +++ b/lib/src/extra/reporte.dart @@ -46,6 +46,9 @@ class _LevantarReporteState extends State { var maps = {}; var progreso = {}; List> superMap = []; + String? comunidad; + String? numero; + String? interior; /// datos del progreso /// mapeado dinamico que espera otro mapeado @@ -74,6 +77,7 @@ class _LevantarReporteState extends State { var idCom; var idUser; + var userType; /// Activa el guardado en memoria addata() async { @@ -82,6 +86,7 @@ class _LevantarReporteState extends State { /// obtiene el id comunidad y la del usuario idCom = prefs!.getInt('idCom'); idUser = prefs!.getInt('userId'); + userType = prefs!.getInt('userType'); }); } @@ -91,12 +96,25 @@ class _LevantarReporteState extends State { await addata(); for (int i = 0; i < cuentas!.data!.length; i++) { - myList.add(new DataReporte( - id: cuentas!.data![i].idReporte, - descripCorta: cuentas!.data![i].descCorta, - desperfecto: cuentas!.data![i].descDesperfecto, - fechaRep: cuentas!.data![i].fechaRep, - uri: cuentas!.data![i].evidencia!.toList())); + if (userType == 2) { + print('aqui?'); + myList.add(new DataReporte( + id: cuentas!.data![i].idReporte, + descripCorta: cuentas!.data![i].descCorta, + desperfecto: cuentas!.data![i].descDesperfecto, + fechaRep: cuentas!.data![i].fechaRep, + uri: cuentas!.data![i].evidencia!.toList(), + comunidad: cuentas!.data![i].comunidad!.trimRight(), + numero: cuentas!.data![i].numero!.trimRight(), + interior: cuentas!.data![i].interior!.trimRight())); + } else { + myList.add(new DataReporte( + id: cuentas!.data![i].idReporte, + descripCorta: cuentas!.data![i].descCorta, + desperfecto: cuentas!.data![i].descDesperfecto, + fechaRep: cuentas!.data![i].fechaRep, + uri: cuentas!.data![i].evidencia!.toList())); + } for (int j = 0; j < cuentas!.data![i].progreso!.length; j++) { //mapeado del estatus asgigando id @@ -182,6 +200,7 @@ class _LevantarReporteState extends State { ), ) : listview(), + floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, floatingActionButton: FloatingActionButton( elevation: 7, onPressed: () => Navigator.of(context) @@ -235,9 +254,30 @@ class _LevantarReporteState extends State { style: TextStyle(fontSize: 18), ), ), - Text( - '${reversedList[index].fechaRep!.day}/${reversedList[index].fechaRep!.month}/${reversedList[index].fechaRep!.year}', - style: TextStyle(fontSize: 18), + Column( + children: [ + Text( + '${reversedList[index].fechaRep!.day}/${reversedList[index].fechaRep!.month}/${reversedList[index].fechaRep!.year}', + style: TextStyle(fontSize: 18), + ), + SizedBox( + height: 5, + ), + reversedList[index].comunidad == null + ? Text('') + : SizedBox( + width: 100, + child: Text(reversedList[index].comunidad!)), + reversedList[index].numero == null + ? Text('') + : Row( + children: [ + Text(reversedList[index].numero!), + Text('-'), + Text(reversedList[index].interior!) + ], + ), + ], ) ], ), @@ -269,6 +309,9 @@ class DataReporte { DateTime? fechaRep; List? uri = []; List? progreso = []; + String? comunidad; + String? numero; + String? interior; DataReporte( {this.id, @@ -276,5 +319,8 @@ class DataReporte { this.desperfecto, this.fechaRep, this.uri, - this.progreso}); + this.progreso, + this.comunidad, + this.interior, + this.numero}); } diff --git a/pubspec.yaml b/pubspec.yaml index 6400679..5b2f0e7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.1.88+39 +version: 2.1.89+40 environment: sdk: ">=2.12.0 <3.0.0" From f22a098e494dae0fb931d8726c1162e69ea913c0 Mon Sep 17 00:00:00 2001 From: Hugolifes Date: Mon, 4 Oct 2021 08:22:59 -0600 Subject: [PATCH 20/20] cambios --- lib/src/app.dart | 1 - lib/src/extra/add_reporte.dart | 2 -- lib/src/extra/reporte.dart | 18 ++++++++---------- lib/src/pantallas/contactos.dart | 2 +- lib/src/pantallas/finanzas.dart | 7 ------- lib/src/pantallas/mainMenu.dart | 3 --- 6 files changed, 9 insertions(+), 24 deletions(-) diff --git a/lib/src/app.dart b/lib/src/app.dart index 6ec947e..fd86148 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -39,7 +39,6 @@ class _MyAppState extends State { final heroController = HeroController(); GlobalKey navigatorKey = GlobalKey(); var id = 'icono'; - bool _loggedIn = false; @override void initState() { diff --git a/lib/src/extra/add_reporte.dart b/lib/src/extra/add_reporte.dart index e15804e..20ec39b 100644 --- a/lib/src/extra/add_reporte.dart +++ b/lib/src/extra/add_reporte.dart @@ -3,11 +3,9 @@ import 'package:camera/camera.dart'; import 'package:dio/dio.dart'; import 'dart:io'; import 'package:adcom/src/methods/slide.dart'; -import 'package:adcom/src/models/event_provider.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:image_picker/image_picker.dart'; -import 'package:provider/provider.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:http_parser/http_parser.dart'; import 'package:shared_preferences/shared_preferences.dart'; diff --git a/lib/src/extra/reporte.dart b/lib/src/extra/reporte.dart index 076e877..e822bba 100644 --- a/lib/src/extra/reporte.dart +++ b/lib/src/extra/reporte.dart @@ -1,11 +1,7 @@ -import 'dart:convert'; - import 'package:adcom/json/jsonReporte.dart'; import 'package:adcom/src/extra/add_reporte.dart'; import 'package:adcom/src/extra/report_edit_page.dart'; -import 'package:adcom/src/models/event_provider.dart'; import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:http/http.dart' as http; @@ -82,12 +78,14 @@ class _LevantarReporteState extends State { /// Activa el guardado en memoria addata() async { prefs = await SharedPreferences.getInstance(); - setState(() { - /// obtiene el id comunidad y la del usuario - idCom = prefs!.getInt('idCom'); - idUser = prefs!.getInt('userId'); - userType = prefs!.getInt('userType'); - }); + if (mounted) { + setState(() { + /// obtiene el id comunidad y la del usuario + idCom = prefs!.getInt('idCom'); + idUser = prefs!.getInt('userId'); + userType = prefs!.getInt('userType'); + }); + } } /// Llama al service y asigna los datos obtenido a una clase diff --git a/lib/src/pantallas/contactos.dart b/lib/src/pantallas/contactos.dart index 654db73..573e85b 100644 --- a/lib/src/pantallas/contactos.dart +++ b/lib/src/pantallas/contactos.dart @@ -1,5 +1,4 @@ import 'package:adcom/json/json.dart'; -import 'package:adcom/src/extra/filter_section.dart'; import 'package:adcom/src/methods/emailDashboard.dart'; import 'package:adcom/src/models/event_provider.dart'; import 'package:filter_list/filter_list.dart'; @@ -255,6 +254,7 @@ class _ContactosState extends State { ); })); + // ignore: unused_element void _openFilterDialog(res) async { await FilterListDialog.display(context, listData: res, diff --git a/lib/src/pantallas/finanzas.dart b/lib/src/pantallas/finanzas.dart index 25d33ee..d3a97d4 100644 --- a/lib/src/pantallas/finanzas.dart +++ b/lib/src/pantallas/finanzas.dart @@ -1,18 +1,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:adcom/json/jsonFinanzas.dart'; -import 'package:adcom/main.dart'; -import 'package:adcom/src/extra/opciones_edoCuenta.dart'; -import 'package:adcom/src/extra/referencia_view.dart'; import 'package:adcom/src/extra/vista_tarjeta.dart'; -import 'package:adcom/src/models/event_provider.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:http/http.dart' as http; -import 'package:provider/provider.dart'; -import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:stripe_payment/stripe_payment.dart'; SharedPreferences? prefs; diff --git a/lib/src/pantallas/mainMenu.dart b/lib/src/pantallas/mainMenu.dart index ab9d1fe..0b09496 100644 --- a/lib/src/pantallas/mainMenu.dart +++ b/lib/src/pantallas/mainMenu.dart @@ -1,9 +1,6 @@ import 'package:adcom/json/jsonAmenidades.dart'; -import 'package:adcom/src/methods/eventDashboard.dart'; import 'package:adcom/src/methods/gridDashboard.dart'; -import 'package:adcom/src/models/event_provider.dart'; import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; SharedPreferences? prefs;