Update: 2026-06-25 02:28:33
This commit is contained in:
124
siro_rider/lib/models/click_payment_schema.dart
Normal file
124
siro_rider/lib/models/click_payment_schema.dart
Normal file
@@ -0,0 +1,124 @@
|
||||
/// Database schema for click_payment table.
|
||||
///
|
||||
/// Stores Cliq wallet payment transactions for manual verification.
|
||||
///
|
||||
/// SQL (MySQL):
|
||||
/// ```sql
|
||||
/// CREATE TABLE click_payment (
|
||||
/// id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
/// user_id VARCHAR(64) NOT NULL COMMENT 'Passenger ID from passengers table',
|
||||
/// user_type VARCHAR(20) NOT NULL DEFAULT 'passenger',
|
||||
/// amount DECIMAL(10,2) NOT NULL,
|
||||
/// currency VARCHAR(6) NOT NULL DEFAULT 'JOD',
|
||||
/// click_phone VARCHAR(20) NOT NULL COMMENT 'Phone number used for Cliq invoice',
|
||||
/// invoice_number VARCHAR(64) NOT NULL UNIQUE COMMENT 'Unique invoice reference',
|
||||
/// cliq_alias VARCHAR(64) NOT NULL COMMENT 'Cliq wallet alias for payment',
|
||||
/// invoice_status ENUM('pending','completed','failed','expired') NOT NULL DEFAULT 'pending',
|
||||
/// proof_text TEXT DEFAULT NULL COMMENT 'Bank SMS proof pasted by user',
|
||||
/// proof_image VARCHAR(256) DEFAULT NULL COMMENT 'Screenshot path (optional)',
|
||||
/// verified_by VARCHAR(64) DEFAULT NULL COMMENT 'Admin who verified manually',
|
||||
/// verified_at DATETIME DEFAULT NULL,
|
||||
/// created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
/// updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
/// INDEX idx_user (user_id),
|
||||
/// INDEX idx_status (invoice_status),
|
||||
/// INDEX idx_invoice (invoice_number)
|
||||
/// );
|
||||
/// ```
|
||||
class ClickPaymentSchema {
|
||||
static const String tableName = 'click_payment';
|
||||
|
||||
static const String createTable = '''
|
||||
CREATE TABLE click_payment (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
user_id VARCHAR(64) NOT NULL,
|
||||
user_type VARCHAR(20) NOT NULL DEFAULT 'passenger',
|
||||
amount DECIMAL(10,2) NOT NULL,
|
||||
currency VARCHAR(6) NOT NULL DEFAULT 'JOD',
|
||||
click_phone VARCHAR(20) NOT NULL,
|
||||
invoice_number VARCHAR(64) NOT NULL UNIQUE,
|
||||
cliq_alias VARCHAR(64) NOT NULL,
|
||||
invoice_status ENUM('pending','completed','failed','expired') NOT NULL DEFAULT 'pending',
|
||||
proof_text TEXT DEFAULT NULL,
|
||||
proof_image VARCHAR(256) DEFAULT NULL,
|
||||
verified_by VARCHAR(64) DEFAULT NULL,
|
||||
verified_at DATETIME DEFAULT NULL,
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX idx_user (user_id),
|
||||
INDEX idx_status (invoice_status),
|
||||
INDEX idx_invoice (invoice_number)
|
||||
)
|
||||
''';
|
||||
|
||||
/// Map a JSON response from the API to a typed object.
|
||||
final int? id;
|
||||
final String userId;
|
||||
final String userType;
|
||||
final double amount;
|
||||
final String currency;
|
||||
final String clickPhone;
|
||||
final String invoiceNumber;
|
||||
final String cliqAlias;
|
||||
final String invoiceStatus;
|
||||
final String? proofText;
|
||||
final String? proofImage;
|
||||
final String? verifiedBy;
|
||||
final DateTime? verifiedAt;
|
||||
final DateTime? createdAt;
|
||||
final DateTime? updatedAt;
|
||||
|
||||
const ClickPaymentSchema({
|
||||
this.id,
|
||||
required this.userId,
|
||||
this.userType = 'passenger',
|
||||
required this.amount,
|
||||
this.currency = 'JOD',
|
||||
required this.clickPhone,
|
||||
required this.invoiceNumber,
|
||||
required this.cliqAlias,
|
||||
this.invoiceStatus = 'pending',
|
||||
this.proofText,
|
||||
this.proofImage,
|
||||
this.verifiedBy,
|
||||
this.verifiedAt,
|
||||
this.createdAt,
|
||||
this.updatedAt,
|
||||
});
|
||||
|
||||
factory ClickPaymentSchema.fromJson(Map<String, dynamic> json) {
|
||||
return ClickPaymentSchema(
|
||||
id: json['id'] is int ? json['id'] : int.tryParse(json['id']?.toString() ?? ''),
|
||||
userId: json['user_id']?.toString() ?? '',
|
||||
userType: json['user_type']?.toString() ?? 'passenger',
|
||||
amount: (json['amount'] is num) ? (json['amount'] as num).toDouble() : double.tryParse(json['amount']?.toString() ?? '0') ?? 0,
|
||||
currency: json['currency']?.toString() ?? 'JOD',
|
||||
clickPhone: json['click_phone']?.toString() ?? '',
|
||||
invoiceNumber: json['invoice_number']?.toString() ?? '',
|
||||
cliqAlias: json['cliq_alias']?.toString() ?? '',
|
||||
invoiceStatus: json['invoice_status']?.toString() ?? 'pending',
|
||||
proofText: json['proof_text']?.toString(),
|
||||
proofImage: json['proof_image']?.toString(),
|
||||
verifiedBy: json['verified_by']?.toString(),
|
||||
verifiedAt: json['verified_at'] != null ? DateTime.tryParse(json['verified_at'].toString()) : null,
|
||||
createdAt: json['created_at'] != null ? DateTime.tryParse(json['created_at'].toString()) : null,
|
||||
updatedAt: json['updated_at'] != null ? DateTime.tryParse(json['updated_at'].toString()) : null,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
if (id != null) 'id': id,
|
||||
'user_id': userId,
|
||||
'user_type': userType,
|
||||
'amount': amount,
|
||||
'currency': currency,
|
||||
'click_phone': clickPhone,
|
||||
'invoice_number': invoiceNumber,
|
||||
'cliq_alias': cliqAlias,
|
||||
'invoice_status': invoiceStatus,
|
||||
if (proofText != null) 'proof_text': proofText,
|
||||
if (proofImage != null) 'proof_image': proofImage,
|
||||
if (verifiedBy != null) 'verified_by': verifiedBy,
|
||||
if (verifiedAt != null) 'verified_at': verifiedAt!.toIso8601String(),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user