Untitled
unknown
dart
5 months ago
5.1 kB
2
Indexable
/// Método interno utilizado por getClients. /// Trae los clientes. En caso de que haya una busqueda, hace una consulta where Future<List<Cliente>> _peticionClients(String? busqueda, {bool limitar = true, bool verBajas = false, bool esProvee = false, DateTime? comprobarFechaSinc}) async { try { String? token = await storage.read(key: 'token'); if (token == null) { throw ("Error de token"); } Map<String, String> headers = { "Accept": "application/json", "xc-auth": token, }; String tabla = !esProvee ? Constants.tablaClient : Constants.tablaProveedores; // Parámetros String where = ""; busqueda ??= ""; //en caso de que llegue null //Busqueda where = Utilidades.generarWhereLike(Utilidades.camposLikeClientes, busqueda); if (comprobarFechaSinc != null) { // Modificado posterior a fechasinc where = "$where~and(Modificado,gte,${comprobarFechaSinc.toIso8601String()})"; } if (!verBajas && comprobarFechaSinc == null) { where = "($where)~and(Baja,neq,1)"; } String limitNumber; if (limitar) { limitNumber = "${Constants.limitClientes}"; } else { limitNumber = "${Constants.loadLimit}"; } // Realizar la primera solicitud para obtener pageInfo // Si limitar es true, retornará la lista después de la primera solicitud int offset = 0; Map<String, String> params = { 'where': where, 'limit': limitNumber, "offset": "$offset", "sort": "Nombre" }; final firstResp = await http.get( Uri.https(Constants.apiUrl, '${Constants.apiPath}/$tabla', params), headers: headers); if (firstResp.statusCode != 200) { throw ("${firstResp.statusCode}: ${firstResp.body}"); } dynamic jsonFirstResponse = json.decode(firstResp.body); List<dynamic> firstList = jsonFirstResponse['list']; // Añadir respuesta a listado List<Cliente> lista = firstList.map((element) => Cliente.fromJson(element)).toList(); if (!limitar) { // PAGINACIÓN // Otener información de páginas int totalRows = jsonFirstResponse['pageInfo']['totalRows']; int pageSize = jsonFirstResponse['pageInfo']['pageSize']; // Calcular el número total de páginas int totalPages = (totalRows / pageSize).ceil(); // Loop de paginación List<Future<http.Response>> requests = []; for (int page = 2; page <= totalPages; page++) { int currentOffset = (page - 1) * pageSize; params['offset'] = '$currentOffset'; // actualizar parámetro offset exponencialmente // Generar las solicitudes requests.add(http.get( Uri.https(Constants.apiUrl, '${Constants.apiPath}/$tabla', params), headers: headers, )); } // Esperar a que todas las solicitudes se completen final responses = await Future.wait(requests); for (final resp in responses) { // Añadir respuestas a listado if (resp.statusCode == 200) { dynamic jsonRowList = json.decode(resp.body); List<dynamic> list = jsonRowList['list']; for (var element in list) { Cliente cliente = Cliente.fromJson(element); lista.add(cliente); } } else { throw ("${resp.statusCode}: ${resp.body}"); } } } return lista; } catch (e) { throw ("Error al traer clientes: ${Utilidades.mensajeError(e)}"); } } /// Método utilizado por saveClient Future<void> subirClienteOrProveedor(Cliente cliente, bool esProvee) async { try { dynamic clientJson; try { clientJson = json.encode(cliente.toJson()); } catch (e) { throw ("Error al convertir a json: $e"); } String? token = await storage.read(key: 'token'); if (token == null) { throw ("Error de token"); } Map<String, String> headers = { "Content-type": "application/json", "Accept": "application/json", "xc-auth": token, }; String tabla = !esProvee ? Constants.tablaClient : Constants.tablaProveedores; final resp = await http.post( Uri.https(Constants.apiUrl, '${Constants.apiPath}/$tabla'), headers: headers, body: clientJson); if (resp.statusCode != 200) { if (resp.body.toString().contains("Duplicate")) { throw ("Clave repetida. Cliente ya existe"); } throw ("Error de conexión: ${resp.body}"); } else { //Exitoso } } catch (e) { return Future.error("Error al crear: ${Utilidades.mensajeError(e)}"); } }
Editor is loading...
Leave a Comment