apskel-pos-flutter/lib/data/datasources/printer/printer_local_datasource.dart
2025-09-20 03:56:07 +07:00

318 lines
7.4 KiB
Dart

import 'dart:developer';
import 'package:enaklo_pos/core/database/database_handler.dart';
import 'package:enaklo_pos/data/models/response/print_model.dart';
import 'package:sqflite/sqflite.dart';
class PrinterLocalDatasource {
static PrinterLocalDatasource? _instance;
PrinterLocalDatasource._internal();
static PrinterLocalDatasource get instance {
_instance ??= PrinterLocalDatasource._internal();
return _instance!;
}
Future<Database> get _db async => await DatabaseHelper.instance.database;
// Create new printer
Future<int> createPrinter(PrintModel printer) async {
final db = await _db;
try {
log('Creating printer: ${printer.toString()}');
final id = await db.insert(
'printers',
printer.toMapForInsert(),
conflictAlgorithm:
ConflictAlgorithm.abort, // Fail if code already exists
);
log('Successfully created printer with ID: $id');
return id;
} catch (e) {
log('Error creating printer: $e');
rethrow;
}
}
// Update existing printer
Future<void> updatePrinter(PrintModel printer, int id) async {
final db = await _db;
try {
log('Updating printer ID $id: ${printer.toString()}');
final updatedRows = await db.update(
'printers',
printer.toMapForUpdate(),
where: 'id = ?',
whereArgs: [id],
);
if (updatedRows == 0) {
throw Exception('Printer with ID $id not found');
}
log('Successfully updated printer ID: $id');
} catch (e) {
log('Error updating printer: $e');
rethrow;
}
}
// Delete printer by ID
Future<void> deletePrinter(int id) async {
final db = await _db;
try {
log('Deleting printer ID: $id');
final deletedRows = await db.delete(
'printers',
where: 'id = ?',
whereArgs: [id],
);
if (deletedRows == 0) {
throw Exception('Printer with ID $id not found');
}
log('Successfully deleted printer ID: $id');
} catch (e) {
log('Error deleting printer: $e');
rethrow;
}
}
// Get printer by code
Future<PrintModel?> getPrinterByCode(String code) async {
final db = await _db;
try {
log('Getting printer by code: $code');
final result = await db.query(
'printers',
where: 'code = ?',
whereArgs: [code],
);
if (result.isEmpty) {
log('Printer with code $code not found');
return null;
}
final printer = PrintModel.fromMap(result.first);
log('Found printer: ${printer.toString()}');
return printer;
} catch (e) {
log('Error getting printer by code: $e');
return null;
}
}
// Get printer by ID
Future<PrintModel?> getPrinterById(int id) async {
final db = await _db;
try {
log('Getting printer by ID: $id');
final result = await db.query(
'printers',
where: 'id = ?',
whereArgs: [id],
);
if (result.isEmpty) {
log('Printer with ID $id not found');
return null;
}
final printer = PrintModel.fromMap(result.first);
log('Found printer: ${printer.toString()}');
return printer;
} catch (e) {
log('Error getting printer by ID: $e');
return null;
}
}
// Get all printers
Future<List<PrintModel>> getAllPrinters() async {
final db = await _db;
try {
log('Getting all printers');
final result = await db.query(
'printers',
orderBy: 'name ASC',
);
final printers = result.map((map) => PrintModel.fromMap(map)).toList();
log('Found ${printers.length} printers');
return printers;
} catch (e) {
log('Error getting all printers: $e');
return [];
}
}
// Get printers by type
Future<List<PrintModel>> getPrintersByType(String type) async {
final db = await _db;
try {
log('Getting printers by type: $type');
final result = await db.query(
'printers',
where: 'type = ?',
whereArgs: [type],
orderBy: 'name ASC',
);
final printers = result.map((map) => PrintModel.fromMap(map)).toList();
log('Found ${printers.length} printers with type $type');
return printers;
} catch (e) {
log('Error getting printers by type: $e');
return [];
}
}
// Search printers by name
Future<List<PrintModel>> searchPrintersByName(String query) async {
final db = await _db;
try {
log('Searching printers by name: $query');
final result = await db.query(
'printers',
where: 'name LIKE ?',
whereArgs: ['%$query%'],
orderBy: 'name ASC',
);
final printers = result.map((map) => PrintModel.fromMap(map)).toList();
log('Found ${printers.length} printers matching "$query"');
return printers;
} catch (e) {
log('Error searching printers: $e');
return [];
}
}
// Check if printer code exists
Future<bool> isPrinterCodeExists(String code, {int? excludeId}) async {
final db = await _db;
try {
String whereClause = 'code = ?';
List<dynamic> whereArgs = [code];
if (excludeId != null) {
whereClause += ' AND id != ?';
whereArgs.add(excludeId);
}
final result = await db.query(
'printers',
where: whereClause,
whereArgs: whereArgs,
);
final exists = result.isNotEmpty;
log('Printer code "$code" exists: $exists');
return exists;
} catch (e) {
log('Error checking printer code existence: $e');
return false;
}
}
// Get printer statistics
Future<Map<String, dynamic>> getPrinterStats() async {
final db = await _db;
try {
// Total count
final totalResult =
await db.rawQuery('SELECT COUNT(*) as total FROM printers');
final totalCount = totalResult.first['total'] as int;
// Count by type
final typeResult = await db.rawQuery('''
SELECT type, COUNT(*) as count
FROM printers
WHERE type IS NOT NULL
GROUP BY type
''');
final typeStats = <String, int>{};
for (final row in typeResult) {
typeStats[row['type'] as String] = row['count'] as int;
}
final stats = {
'total_printers': totalCount,
'by_type': typeStats,
};
log('Printer stats: $stats');
return stats;
} catch (e) {
log('Error getting printer stats: $e');
return {
'total_printers': 0,
'by_type': <String, int>{},
};
}
}
// Clear all printers (for testing/reset purposes)
Future<void> clearAllPrinters() async {
final db = await _db;
try {
log('Clearing all printers');
await db.delete('printers');
log('All printers cleared');
} catch (e) {
log('Error clearing printers: $e');
rethrow;
}
}
// Batch insert printers
Future<void> insertPrinters(List<PrintModel> printers) async {
final db = await _db;
try {
log('Batch inserting ${printers.length} printers');
await db.transaction((txn) async {
for (final printer in printers) {
await txn.insert(
'printers',
printer.toMapForInsert(),
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
});
log('Successfully batch inserted ${printers.length} printers');
} catch (e) {
log('Error batch inserting printers: $e');
rethrow;
}
}
}