barcode_scanner/lib/backend/api/api_calls.dart
mandreshope 61345869e1 feat: Implements stock picking data fetching WIP1
Adds a new API call (`getAllStockPiking`) to retrieve stock picking records from the backend.

Refactors stock picking data models:
- Renames models for better clarity (e.g., `StockPickingResponse` to `StockPickingResponseModel`).
- Makes all model fields nullable to handle varying API responses gracefully.
- Introduces specific nested models (`StockPickingCompanyModel`, `StockPickingPartnerModel`, `StockPickingLocationModel`, `StockPickingTypeModel`) for related entities, enhancing type safety and data structure.

Integrates the new API call into `ReceptionPageModel` and introduces distinct loading states (`loadingUser`, `loadingReceptions`) for improved UI feedback.
2025-07-29 11:47:06 +03:00

166 lines
5.2 KiB
Dart

import 'package:barcode_scanner/backend/schema/auth/auth_model.dart';
import 'package:barcode_scanner/backend/schema/stock_picking/stock_picking_model.dart';
import 'package:barcode_scanner/provider_container.dart';
import 'package:barcode_scanner/services/dio_service.dart';
import 'package:barcode_scanner/services/token_provider.dart';
import 'package:barcode_scanner/utils/utils.dart';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:multiple_result/multiple_result.dart';
class ApiCalls {
static DioService dioService = DioService(
tokenProvider: providerContainer.read(tokenProvider),
);
static Future<Map<String, dynamic>?> fetchProduct(String barcode) async {
final Dio dio = Dio(
BaseOptions(baseUrl: 'https://world.openfoodfacts.org'),
);
try {
final response = await dio.get('/api/v0/product/$barcode.json');
if (response.statusCode == 200) {
final data = response.data;
if (data['status'] == 1) {
return data['product'];
} else {
debugPrint('Produit non trouvé');
return null;
}
} else {
debugPrint('Erreur réseau: ${response.statusCode}');
return null;
}
} catch (e) {
debugPrint('Erreur lors de la requête: $e');
return null;
}
}
static Future<Result<AuthModel, Error>> signIn({
required String email,
required String password,
}) async {
try {
final response = await dioService.post(
path: '/sign_in',
data: {
"params": {
"login": email,
"password": password,
"db": "bitnami_odoo",
},
},
);
if (response.statusCode == 200) {
final data = response.data;
if (data['result']['success'] == true) {
return Result.success(AuthModel.fromJson(data['result']['data']));
} else {
return Result.error(Error(data['result']['success']));
}
} else {
debugPrint('Erreur réseau: ${response.statusCode}');
return Result.error(Error(response.statusMessage));
}
} catch (e) {
debugPrint('Erreur lors de la requête: $e');
return Result.error(Error(e));
}
}
static Future<Result<StockPickingResponseModel, Error>>
getAllStockPiking() async {
try {
if (!(await checkInternetConnexion())) {
// return local data
}
final response = await dioService.post(
path: '/web/dataset/call_kw/stock.picking/web_search_read',
data: {
"id": 23,
"jsonrpc": "2.0",
"method": "call",
"params": {
"model": "stock.picking",
"method": "web_search_read",
"args": [],
"kwargs": {
"specification": {
"company_id": {"fields": {}},
"priority": {},
"name": {},
"partner_id": {
"fields": {"display_name": {}},
},
"location_dest_id": {
"fields": {"complete_name": {}},
},
"location_id": {
"fields": {"complete_name": {}},
},
"user_id": {
"fields": {"display_name": {}},
},
"scheduled_date": {},
"picking_type_code": {},
"products_availability_state": {},
"products_availability": {},
"date_deadline": {},
"date_done": {},
"origin": {},
"backorder_id": {
"fields": {"display_name": {}},
},
"picking_type_id": {
"fields": {"display_name": {}},
},
"state": {},
"activity_exception_decoration": {},
"activity_exception_icon": {},
"json_popover": {},
},
"offset": 0,
"order": "",
"limit": 80,
"context": {
"lang": "en_US",
"tz": "Africa/Nairobi",
"uid": 2,
"allowed_company_ids": [1],
"bin_size": true,
"active_model": "stock.picking.type",
"active_id": 2,
"active_ids": [2],
"contact_display": "partner_address",
"default_picking_type_id": 2,
"default_company_id": 1,
"current_company_id": 1,
},
"count_limit": 10001,
"domain": [
["picking_type_id", "=", 2],
],
},
},
},
);
if (response.statusCode == 200) {
final data = response.data;
if (data.containsKey('result')) {
return Result.success(StockPickingResponseModel.fromJson(data));
} else {
return Result.error(Error(data['error']));
}
} else {
debugPrint('Erreur réseau: ${response.statusCode}');
return Result.error(Error(response.statusMessage));
}
} catch (e) {
debugPrint('Erreur lors de la requête: $e');
return Result.error(Error(e));
}
}
}