add price policy
This commit is contained in:
166
lib/features/price_policy/domain/entities/price_document.dart
Normal file
166
lib/features/price_policy/domain/entities/price_document.dart
Normal file
@@ -0,0 +1,166 @@
|
||||
/// Domain Entity: Price Document
|
||||
///
|
||||
/// Pure business entity representing a price policy or price list document.
|
||||
/// This entity is framework-independent and contains only business logic.
|
||||
library;
|
||||
|
||||
/// Price policy document entity
|
||||
class PriceDocument {
|
||||
/// Unique document ID
|
||||
final String id;
|
||||
|
||||
/// Document title
|
||||
final String title;
|
||||
|
||||
/// Document description
|
||||
final String description;
|
||||
|
||||
/// Date the document was published
|
||||
final DateTime publishedDate;
|
||||
|
||||
/// Type of document (PDF or Excel)
|
||||
final DocumentType documentType;
|
||||
|
||||
/// Category (policy or price list)
|
||||
final DocumentCategory category;
|
||||
|
||||
/// URL to download the document
|
||||
final String downloadUrl;
|
||||
|
||||
/// Optional file size display string
|
||||
final String? fileSize;
|
||||
|
||||
/// Constructor
|
||||
const PriceDocument({
|
||||
required this.id,
|
||||
required this.title,
|
||||
required this.description,
|
||||
required this.publishedDate,
|
||||
required this.documentType,
|
||||
required this.category,
|
||||
required this.downloadUrl,
|
||||
this.fileSize,
|
||||
});
|
||||
|
||||
/// Check if document is a PDF
|
||||
bool get isPdf => documentType == DocumentType.pdf;
|
||||
|
||||
/// Check if document is an Excel file
|
||||
bool get isExcel => documentType == DocumentType.excel;
|
||||
|
||||
/// Check if document is a policy document
|
||||
bool get isPolicy => category == DocumentCategory.policy;
|
||||
|
||||
/// Check if document is a price list
|
||||
bool get isPriceList => category == DocumentCategory.priceList;
|
||||
|
||||
/// Get formatted published date (dd/MM/yyyy)
|
||||
String get formattedDate {
|
||||
return '${publishedDate.day.toString().padLeft(2, '0')}/'
|
||||
'${publishedDate.month.toString().padLeft(2, '0')}/'
|
||||
'${publishedDate.year}';
|
||||
}
|
||||
|
||||
/// Get formatted date with prefix based on category
|
||||
String get formattedDateWithPrefix {
|
||||
final prefix = isPolicy ? 'Công bố' : 'Cập nhật';
|
||||
return '$prefix: $formattedDate';
|
||||
}
|
||||
|
||||
/// Get icon name based on document type
|
||||
String get iconName => documentType == DocumentType.pdf ? 'PDF' : 'Excel';
|
||||
|
||||
/// Copy with method for immutability
|
||||
PriceDocument copyWith({
|
||||
String? id,
|
||||
String? title,
|
||||
String? description,
|
||||
DateTime? publishedDate,
|
||||
DocumentType? documentType,
|
||||
DocumentCategory? category,
|
||||
String? downloadUrl,
|
||||
String? fileSize,
|
||||
}) {
|
||||
return PriceDocument(
|
||||
id: id ?? this.id,
|
||||
title: title ?? this.title,
|
||||
description: description ?? this.description,
|
||||
publishedDate: publishedDate ?? this.publishedDate,
|
||||
documentType: documentType ?? this.documentType,
|
||||
category: category ?? this.category,
|
||||
downloadUrl: downloadUrl ?? this.downloadUrl,
|
||||
fileSize: fileSize ?? this.fileSize,
|
||||
);
|
||||
}
|
||||
|
||||
/// Equality operator
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
if (identical(this, other)) return true;
|
||||
|
||||
return other is PriceDocument &&
|
||||
other.id == id &&
|
||||
other.title == title &&
|
||||
other.description == description &&
|
||||
other.publishedDate == publishedDate &&
|
||||
other.documentType == documentType &&
|
||||
other.category == category &&
|
||||
other.downloadUrl == downloadUrl &&
|
||||
other.fileSize == fileSize;
|
||||
}
|
||||
|
||||
/// Hash code
|
||||
@override
|
||||
int get hashCode {
|
||||
return Object.hash(
|
||||
id,
|
||||
title,
|
||||
description,
|
||||
publishedDate,
|
||||
documentType,
|
||||
category,
|
||||
downloadUrl,
|
||||
fileSize,
|
||||
);
|
||||
}
|
||||
|
||||
/// String representation
|
||||
@override
|
||||
String toString() {
|
||||
return 'PriceDocument(id: $id, title: $title, description: $description, '
|
||||
'publishedDate: $publishedDate, documentType: $documentType, '
|
||||
'category: $category, downloadUrl: $downloadUrl, fileSize: $fileSize)';
|
||||
}
|
||||
}
|
||||
|
||||
/// Document type enum
|
||||
enum DocumentType { pdf, excel }
|
||||
|
||||
/// Document category enum
|
||||
enum DocumentCategory {
|
||||
policy, // Chính sách giá
|
||||
priceList, // Bảng giá
|
||||
}
|
||||
|
||||
// Extension for display
|
||||
extension DocumentTypeX on DocumentType {
|
||||
String get displayName {
|
||||
switch (this) {
|
||||
case DocumentType.pdf:
|
||||
return 'PDF';
|
||||
case DocumentType.excel:
|
||||
return 'Excel';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension DocumentCategoryX on DocumentCategory {
|
||||
String get displayName {
|
||||
switch (this) {
|
||||
case DocumentCategory.policy:
|
||||
return 'Chính sách giá';
|
||||
case DocumentCategory.priceList:
|
||||
return 'Bảng giá';
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user