Files
worker/lib/features/quotes/data/models/quote_model.dart
2025-11-07 11:52:06 +07:00

112 lines
3.3 KiB
Dart

import 'dart:convert';
import 'package:hive_ce/hive.dart';
import 'package:worker/core/constants/storage_constants.dart';
import 'package:worker/core/database/models/enums.dart';
part 'quote_model.g.dart';
@HiveType(typeId: HiveTypeIds.quoteModel)
class QuoteModel extends HiveObject {
QuoteModel({
required this.quoteId,
required this.quoteNumber,
required this.userId,
required this.status,
required this.totalAmount,
required this.discountAmount,
required this.finalAmount,
this.projectName,
this.deliveryAddress,
this.paymentTerms,
this.notes,
this.validUntil,
this.convertedOrderId,
this.erpnextQuotation,
required this.createdAt,
this.updatedAt,
});
@HiveField(0)
final String quoteId;
@HiveField(1)
final String quoteNumber;
@HiveField(2)
final String userId;
@HiveField(3)
final QuoteStatus status;
@HiveField(4)
final double totalAmount;
@HiveField(5)
final double discountAmount;
@HiveField(6)
final double finalAmount;
@HiveField(7)
final String? projectName;
@HiveField(8)
final String? deliveryAddress;
@HiveField(9)
final String? paymentTerms;
@HiveField(10)
final String? notes;
@HiveField(11)
final DateTime? validUntil;
@HiveField(12)
final String? convertedOrderId;
@HiveField(13)
final String? erpnextQuotation;
@HiveField(14)
final DateTime createdAt;
@HiveField(15)
final DateTime? updatedAt;
factory QuoteModel.fromJson(Map<String, dynamic> json) => QuoteModel(
quoteId: json['quote_id'] as String,
quoteNumber: json['quote_number'] as String,
userId: json['user_id'] as String,
status: QuoteStatus.values.firstWhere((e) => e.name == json['status']),
totalAmount: (json['total_amount'] as num).toDouble(),
discountAmount: (json['discount_amount'] as num).toDouble(),
finalAmount: (json['final_amount'] as num).toDouble(),
projectName: json['project_name'] as String?,
deliveryAddress: json['delivery_address'] != null
? jsonEncode(json['delivery_address'])
: null,
paymentTerms: json['payment_terms'] as String?,
notes: json['notes'] as String?,
validUntil: json['valid_until'] != null
? DateTime.parse(json['valid_until']?.toString() ?? '')
: null,
convertedOrderId: json['converted_order_id'] as String?,
erpnextQuotation: json['erpnext_quotation'] as String?,
createdAt: DateTime.parse(json['created_at']?.toString() ?? ''),
updatedAt: json['updated_at'] != null
? DateTime.parse(json['updated_at']?.toString() ?? '')
: null,
);
Map<String, dynamic> toJson() => {
'quote_id': quoteId,
'quote_number': quoteNumber,
'user_id': userId,
'status': status.name,
'total_amount': totalAmount,
'discount_amount': discountAmount,
'final_amount': finalAmount,
'project_name': projectName,
'delivery_address': deliveryAddress != null
? jsonDecode(deliveryAddress!)
: null,
'payment_terms': paymentTerms,
'notes': notes,
'valid_until': validUntil?.toIso8601String(),
'converted_order_id': convertedOrderId,
'erpnext_quotation': erpnextQuotation,
'created_at': createdAt.toIso8601String(),
'updated_at': updatedAt?.toIso8601String(),
};
bool get isExpired =>
validUntil != null && DateTime.now().isAfter(validUntil!);
bool get isConverted => convertedOrderId != null;
}