feat: report transaction

This commit is contained in:
efrilm
2025-08-14 21:19:34 +07:00
parent 0c375de6e4
commit f37814fec8
16 changed files with 2239 additions and 14 deletions
@@ -5,6 +5,7 @@ import 'package:dio/dio.dart';
import 'package:enaklo_pos/core/constants/variables.dart';
import 'package:enaklo_pos/core/network/dio_client.dart';
import 'package:enaklo_pos/data/datasources/auth_local_datasource.dart';
import 'package:enaklo_pos/data/models/response/category_analytic_response_model.dart';
import 'package:enaklo_pos/data/models/response/dashboard_analytic_response_model.dart';
import 'package:enaklo_pos/data/models/response/payment_method_analytic_response_model.dart';
import 'package:enaklo_pos/data/models/response/product_analytic_response_model.dart';
@@ -184,4 +185,38 @@ class AnalyticRemoteDatasource {
return left('Unexpected error occurred');
}
}
Future<Either<String, CategoryAnalyticResponseModel>> getCategory({
required DateTime dateFrom,
required DateTime dateTo,
}) async {
final authData = await AuthLocalDataSource().getAuthData();
final headers = {
'Authorization': 'Bearer ${authData.token}',
'Accept': 'application/json',
};
try {
final response = await dio.get(
'${Variables.baseUrl}/api/v1/analytics/categories',
queryParameters: {
'date_from': DateFormat('dd-MM-yyyy').format(dateFrom),
'date_to': DateFormat('dd-MM-yyyy').format(dateTo),
},
options: Options(headers: headers),
);
if (response.statusCode == 200) {
return right(CategoryAnalyticResponseModel.fromMap(response.data));
} else {
return left('Terjadi Kesalahan, Coba lagi nanti.');
}
} on DioException catch (e) {
log('Dio error: ${e.message}');
return left(e.response?.data.toString() ?? e.message ?? 'Unknown error');
} catch (e) {
log('Unexpected error: $e');
return left('Unexpected error occurred');
}
}
}
@@ -0,0 +1,129 @@
class CategoryAnalyticResponseModel {
final bool success;
final CategoryAnalyticData? data;
final dynamic errors;
CategoryAnalyticResponseModel({
required this.success,
required this.data,
this.errors,
});
// Dari JSON String ke Model
factory CategoryAnalyticResponseModel.fromJson(Map<String, dynamic> json) {
return CategoryAnalyticResponseModel(
success: json['success'],
data: json['data'] == null
? null
: CategoryAnalyticData.fromMap(json['data']),
errors: json['errors'],
);
}
// Dari Model ke JSON String
Map<String, dynamic> toJson() {
return {
'success': success,
'data': data?.toMap(),
'errors': errors,
};
}
// Dari Map ke Model
factory CategoryAnalyticResponseModel.fromMap(Map<String, dynamic> map) {
return CategoryAnalyticResponseModel(
success: map['success'],
data: CategoryAnalyticData.fromMap(map['data']),
errors: map['errors'],
);
}
// Dari Model ke Map
Map<String, dynamic> toMap() {
return {
'success': success,
'data': data?.toMap(),
'errors': errors,
};
}
}
class CategoryAnalyticData {
final String organizationId;
final String outletId;
final DateTime dateFrom;
final DateTime dateTo;
final List<CategoryAnalyticItem> data;
CategoryAnalyticData({
required this.organizationId,
required this.outletId,
required this.dateFrom,
required this.dateTo,
required this.data,
});
factory CategoryAnalyticData.fromMap(Map<String, dynamic> map) {
return CategoryAnalyticData(
organizationId: map['organization_id'],
outletId: map['outlet_id'],
dateFrom: DateTime.parse(map['date_from']),
dateTo: DateTime.parse(map['date_to']),
data: map['data'] == null
? []
: List<CategoryAnalyticItem>.from(
map['data']?.map((x) => CategoryAnalyticItem.fromMap(x)) ?? [],
),
);
}
Map<String, dynamic> toMap() {
return {
'organization_id': organizationId,
'outlet_id': outletId,
'date_from': dateFrom.toIso8601String(),
'date_to': dateTo.toIso8601String(),
'data': data.map((x) => x.toMap()).toList(),
};
}
}
class CategoryAnalyticItem {
final String categoryId;
final String categoryName;
final int totalRevenue;
final int totalQuantity;
final int productCount;
final int orderCount;
CategoryAnalyticItem({
required this.categoryId,
required this.categoryName,
required this.totalRevenue,
required this.totalQuantity,
required this.productCount,
required this.orderCount,
});
factory CategoryAnalyticItem.fromMap(Map<String, dynamic> map) {
return CategoryAnalyticItem(
categoryId: map['category_id'],
categoryName: map['category_name'],
totalRevenue: map['total_revenue'] ?? 0,
totalQuantity: map['total_quantity'] ?? 0,
productCount: map['product_count'] ?? 0,
orderCount: map['order_count'] ?? 0,
);
}
Map<String, dynamic> toMap() {
return {
'category_id': categoryId,
'category_name': categoryName,
'total_revenue': totalRevenue,
'total_quantity': totalQuantity,
'product_count': productCount,
'order_count': orderCount,
};
}
}
@@ -1,6 +1,6 @@
class PaymentMethodAnalyticResponseModel {
final bool success;
final PaymentMethodAnalyticData data;
final PaymentMethodAnalyticData? data;
final dynamic errors;
PaymentMethodAnalyticResponseModel({
@@ -18,7 +18,9 @@ class PaymentMethodAnalyticResponseModel {
factory PaymentMethodAnalyticResponseModel.fromMap(Map<String, dynamic> map) {
return PaymentMethodAnalyticResponseModel(
success: map['success'],
data: PaymentMethodAnalyticData.fromMap(map['data']),
data: map['data'] == null
? null
: PaymentMethodAnalyticData.fromMap(map['data']),
errors: map['errors'],
);
}
@@ -26,7 +28,7 @@ class PaymentMethodAnalyticResponseModel {
Map<String, dynamic> toMap() {
return {
'success': success,
'data': data.toMap(),
'data': data?.toMap(),
'errors': errors,
};
}
@@ -1,6 +1,6 @@
class ProductAnalyticResponseModel {
final bool success;
final ProductAnalyticData data;
final ProductAnalyticData? data;
final dynamic errors;
ProductAnalyticResponseModel({
@@ -17,7 +17,8 @@ class ProductAnalyticResponseModel {
factory ProductAnalyticResponseModel.fromMap(Map<String, dynamic> map) {
return ProductAnalyticResponseModel(
success: map['success'] ?? false,
data: ProductAnalyticData.fromMap(map['data']),
data:
map['data'] == null ? null : ProductAnalyticData.fromMap(map['data']),
errors: map['errors'],
);
}
@@ -25,7 +26,7 @@ class ProductAnalyticResponseModel {
Map<String, dynamic> toMap() {
return {
'success': success,
'data': data.toMap(),
'data': data?.toMap(),
'errors': errors,
};
}
@@ -1,6 +1,6 @@
class ProfitLossResponseModel {
final bool success;
final ProfitLossData data;
final ProfitLossData? data;
final dynamic errors;
ProfitLossResponseModel({
@@ -13,7 +13,7 @@ class ProfitLossResponseModel {
factory ProfitLossResponseModel.fromJson(Map<String, dynamic> json) {
return ProfitLossResponseModel(
success: json['success'],
data: ProfitLossData.fromMap(json['data']),
data: json['data'] == null ? null : ProfitLossData.fromMap(json['data']),
errors: json['errors'],
);
}
@@ -22,7 +22,7 @@ class ProfitLossResponseModel {
Map<String, dynamic> toJson() {
return {
'success': success,
'data': data.toMap(),
'data': data?.toMap(),
'errors': errors,
};
}
@@ -40,7 +40,7 @@ class ProfitLossResponseModel {
Map<String, dynamic> toMap() {
return {
'success': success,
'data': data.toMap(),
'data': data?.toMap(),
'errors': errors,
};
}