356 lines
12 KiB
Dart
356 lines
12 KiB
Dart
class InvoiceItem {
|
|
final int? id;
|
|
final int? invoiceId;
|
|
final int? productId;
|
|
final int? inventoryItemId;
|
|
final String? productName;
|
|
final String? categoryName;
|
|
final String? commodityCode;
|
|
final String? sku;
|
|
final String? huid;
|
|
final String? hsnCode;
|
|
final String? description;
|
|
final double quantity;
|
|
final double? weight;
|
|
final double unitPrice; // metal rate
|
|
final double makingCharge;
|
|
final String makingChargesType; // PER_GRAM, PER_PIECE, PERCENTAGE
|
|
final double taxRate;
|
|
final double cgst;
|
|
final double sgst;
|
|
final double igst;
|
|
final double discount;
|
|
final double otherCharges;
|
|
final String? photoUrl;
|
|
final String? localPhotoPath;
|
|
final double total;
|
|
|
|
InvoiceItem({
|
|
this.id,
|
|
this.invoiceId,
|
|
this.productId,
|
|
this.inventoryItemId,
|
|
this.productName,
|
|
this.categoryName,
|
|
this.commodityCode,
|
|
this.hsnCode,
|
|
this.sku,
|
|
this.huid,
|
|
this.description,
|
|
required this.quantity,
|
|
this.weight,
|
|
required this.unitPrice,
|
|
this.makingCharge = 0.0,
|
|
this.makingChargesType = 'PER_GRAM',
|
|
this.taxRate = 0.0,
|
|
this.cgst = 0.0,
|
|
this.sgst = 0.0,
|
|
this.igst = 0.0,
|
|
this.discount = 0.0,
|
|
this.otherCharges = 0.0,
|
|
this.photoUrl,
|
|
this.localPhotoPath,
|
|
required this.total,
|
|
});
|
|
|
|
InvoiceItem copyWith({
|
|
int? id,
|
|
int? invoiceId,
|
|
int? productId,
|
|
int? inventoryItemId,
|
|
String? productName,
|
|
String? categoryName,
|
|
String? commodityCode,
|
|
String? hsnCode,
|
|
String? sku,
|
|
String? huid,
|
|
String? description,
|
|
double? quantity,
|
|
double? weight,
|
|
double? unitPrice,
|
|
double? makingCharge,
|
|
String? makingChargesType,
|
|
double? taxRate,
|
|
double? cgst,
|
|
double? sgst,
|
|
double? igst,
|
|
double? discount,
|
|
double? otherCharges,
|
|
String? photoUrl,
|
|
String? localPhotoPath,
|
|
double? total,
|
|
}) {
|
|
return InvoiceItem(
|
|
id: id ?? this.id,
|
|
invoiceId: invoiceId ?? this.invoiceId,
|
|
productId: productId ?? this.productId,
|
|
inventoryItemId: inventoryItemId ?? this.inventoryItemId,
|
|
productName: productName ?? this.productName,
|
|
categoryName: categoryName ?? this.categoryName,
|
|
commodityCode: commodityCode ?? this.commodityCode,
|
|
hsnCode: hsnCode ?? this.hsnCode,
|
|
sku: sku ?? this.sku,
|
|
huid: huid ?? this.huid,
|
|
description: description ?? this.description,
|
|
quantity: quantity ?? this.quantity,
|
|
weight: weight ?? this.weight,
|
|
unitPrice: unitPrice ?? this.unitPrice,
|
|
makingCharge: makingCharge ?? this.makingCharge,
|
|
makingChargesType: makingChargesType ?? this.makingChargesType,
|
|
taxRate: taxRate ?? this.taxRate,
|
|
cgst: cgst ?? this.cgst,
|
|
sgst: sgst ?? this.sgst,
|
|
igst: igst ?? this.igst,
|
|
discount: discount ?? this.discount,
|
|
otherCharges: otherCharges ?? this.otherCharges,
|
|
photoUrl: photoUrl ?? this.photoUrl,
|
|
localPhotoPath: localPhotoPath ?? this.localPhotoPath,
|
|
total: total ?? this.total,
|
|
);
|
|
}
|
|
|
|
factory InvoiceItem.fromJson(Map<String, dynamic> json) {
|
|
return InvoiceItem(
|
|
id: json['id'],
|
|
invoiceId: json['invoiceId'] ?? json['invoice_id'],
|
|
productId: json['productId'] ?? json['product_id'],
|
|
inventoryItemId: json['inventoryItemId'] ?? json['inventory_item_id'],
|
|
productName: json['productName'] ?? json['product_name'],
|
|
categoryName: json['categoryName'] ?? json['category_name'],
|
|
commodityCode: json['commodityCode'] ?? json['commodity_code'],
|
|
hsnCode: json['hsnCode'] ?? json['hsn_code'],
|
|
sku: json['sku'],
|
|
huid: json['huid'],
|
|
description: json['description'],
|
|
quantity: (json['quantity'] as num?)?.toDouble() ?? 1.0,
|
|
weight: (json['weight'] as num?)?.toDouble(),
|
|
unitPrice: (json['unitPrice'] ?? json['unit_price'] as num?)?.toDouble() ?? 0.0,
|
|
makingCharge: (json['makingCharge'] ?? json['making_charge'] as num?)?.toDouble() ?? 0.0,
|
|
makingChargesType: json['makingChargesType'] ?? json['making_charges_type'] ?? 'PER_GRAM',
|
|
taxRate: (json['taxRate'] ?? json['tax_rate'] as num?)?.toDouble() ?? 0.0,
|
|
cgst: (json['cgst'] as num?)?.toDouble() ?? 0.0,
|
|
sgst: (json['sgst'] as num?)?.toDouble() ?? 0.0,
|
|
igst: (json['igst'] as num?)?.toDouble() ?? 0.0,
|
|
discount: (json['discount'] as num?)?.toDouble() ?? 0.0,
|
|
otherCharges: (json['otherCharges'] ?? json['other_charges'] as num?)?.toDouble() ?? 0.0,
|
|
photoUrl: json['photoUrl'] ?? json['photo_url'],
|
|
total: (json['total'] as num?)?.toDouble() ?? 0.0,
|
|
);
|
|
}
|
|
|
|
Map<String, dynamic> toJson() {
|
|
final Map<String, dynamic> data = {};
|
|
if (id != null) data['id'] = id;
|
|
if (invoiceId != null) data['invoiceId'] = invoiceId;
|
|
if (productId != null) data['productId'] = productId;
|
|
if (inventoryItemId != null) data['inventoryItemId'] = inventoryItemId;
|
|
if (productName != null) data['productName'] = productName;
|
|
if (categoryName != null) data['categoryName'] = categoryName;
|
|
if (commodityCode != null) data['commodityCode'] = commodityCode;
|
|
if (hsnCode != null) data['hsnCode'] = hsnCode;
|
|
if (sku != null) data['sku'] = sku;
|
|
if (huid != null) data['huid'] = huid;
|
|
if (description != null) data['description'] = description;
|
|
data['quantity'] = quantity;
|
|
if (weight != null) data['weight'] = weight;
|
|
data['unitPrice'] = unitPrice;
|
|
data['makingCharge'] = makingCharge;
|
|
data['makingChargesType'] = makingChargesType;
|
|
data['taxRate'] = taxRate;
|
|
data['cgst'] = cgst;
|
|
data['sgst'] = sgst;
|
|
data['igst'] = igst;
|
|
data['discount'] = discount;
|
|
data['otherCharges'] = otherCharges;
|
|
if (photoUrl != null) data['photoUrl'] = photoUrl;
|
|
data['total'] = total;
|
|
return data;
|
|
}
|
|
}
|
|
|
|
class Invoice {
|
|
final int? id;
|
|
final int? customerId;
|
|
final String invoiceNumber;
|
|
final DateTime issueDate;
|
|
final DateTime? dueDate;
|
|
final double subtotal;
|
|
final double taxTotal;
|
|
final double cgstTotal;
|
|
final double sgstTotal;
|
|
final double igstTotal;
|
|
final double discountTotal;
|
|
final double totalAmount;
|
|
final double amountPaid;
|
|
final DateTime? nextPaymentDate;
|
|
final String? paymentMethod;
|
|
final int? paymentWalletId;
|
|
final String status;
|
|
final String? notes;
|
|
final String? invoiceUrl;
|
|
final bool isEmi;
|
|
final double? emiAmount;
|
|
final String? emiCycle;
|
|
final DateTime? emiStartDate;
|
|
final List<InvoiceItem> items;
|
|
final List<InvoicePayment>? payments;
|
|
|
|
Invoice({
|
|
this.id,
|
|
this.customerId,
|
|
required this.invoiceNumber,
|
|
required this.issueDate,
|
|
this.dueDate,
|
|
required this.subtotal,
|
|
this.taxTotal = 0.0,
|
|
this.cgstTotal = 0.0,
|
|
this.sgstTotal = 0.0,
|
|
this.igstTotal = 0.0,
|
|
this.discountTotal = 0.0,
|
|
required this.totalAmount,
|
|
this.amountPaid = 0.0,
|
|
this.nextPaymentDate,
|
|
this.paymentMethod,
|
|
this.paymentWalletId,
|
|
this.status = 'DRAFT',
|
|
this.notes,
|
|
this.invoiceUrl,
|
|
this.isEmi = false,
|
|
this.emiAmount,
|
|
this.emiCycle,
|
|
this.emiStartDate,
|
|
this.items = const [],
|
|
this.payments,
|
|
});
|
|
|
|
factory Invoice.fromJson(Map<String, dynamic> json) {
|
|
return Invoice(
|
|
id: json['id'],
|
|
customerId: json['customerId'] ?? json['customer_id'],
|
|
invoiceNumber: json['invoiceNumber'] ?? json['invoice_number'] ?? '',
|
|
issueDate: json['issueDate'] != null
|
|
? DateTime.parse(json['issueDate'])
|
|
: (json['issue_date'] != null ? DateTime.parse(json['issue_date']) : DateTime.now()),
|
|
dueDate: json['dueDate'] != null ? DateTime.parse(json['dueDate']) : (json['due_date'] != null ? DateTime.parse(json['due_date']) : null),
|
|
subtotal: (json['subtotal'] as num?)?.toDouble() ?? 0.0,
|
|
taxTotal: (json['taxTotal'] ?? json['tax_total'] as num?)?.toDouble() ?? 0.0,
|
|
cgstTotal: (json['cgstTotal'] ?? json['cgst_total'] as num?)?.toDouble() ?? 0.0,
|
|
sgstTotal: (json['sgstTotal'] ?? json['sgst_total'] as num?)?.toDouble() ?? 0.0,
|
|
igstTotal: (json['igstTotal'] ?? json['igst_total'] as num?)?.toDouble() ?? 0.0,
|
|
discountTotal: (json['discountTotal'] ?? json['discount_total'] as num?)?.toDouble() ?? 0.0,
|
|
totalAmount: (json['totalAmount'] ?? json['total_amount'] as num?)?.toDouble() ?? 0.0,
|
|
amountPaid: (json['amountPaid'] ?? json['amount_paid'] as num?)?.toDouble() ?? 0.0,
|
|
nextPaymentDate: json['nextPaymentDate'] != null
|
|
? DateTime.parse(json['nextPaymentDate'])
|
|
: (json['next_payment_date'] != null ? DateTime.parse(json['next_payment_date']) : null),
|
|
paymentMethod: json['paymentMethod'] ?? json['payment_method'],
|
|
paymentWalletId: json['paymentWalletId'] ?? json['payment_wallet_id'],
|
|
status: json['status'] ?? 'DRAFT',
|
|
notes: json['notes'],
|
|
invoiceUrl: json['invoiceUrl'] ?? json['invoice_url'],
|
|
isEmi: json['isEmi'] ?? json['is_emi'] ?? false,
|
|
emiAmount: (json['emiAmount'] ?? json['emi_amount'] as num?)?.toDouble(),
|
|
emiCycle: json['emiCycle'] ?? json['emi_cycle'],
|
|
emiStartDate: json['emiStartDate'] != null
|
|
? DateTime.parse(json['emiStartDate'])
|
|
: (json['emi_start_date'] != null ? DateTime.parse(json['emi_start_date']) : null),
|
|
items: json['items'] != null
|
|
? (json['items'] as List).map((i) => InvoiceItem.fromJson(i)).toList()
|
|
: [],
|
|
payments: json['payments'] != null
|
|
? (json['payments'] as List)
|
|
.map((i) => InvoicePayment.fromJson(i))
|
|
.toList()
|
|
: null,
|
|
);
|
|
}
|
|
|
|
Map<String, dynamic> toJson() {
|
|
final Map<String, dynamic> data = {};
|
|
if (id != null) data['id'] = id;
|
|
if (customerId != null) data['customerId'] = customerId;
|
|
data['invoiceNumber'] = invoiceNumber;
|
|
data['issueDate'] = issueDate.toIso8601String().split('T')[0];
|
|
if (dueDate != null) {
|
|
data['dueDate'] = dueDate!.toIso8601String().split('T')[0];
|
|
}
|
|
data['subtotal'] = subtotal;
|
|
data['taxTotal'] = taxTotal;
|
|
data['cgstTotal'] = cgstTotal;
|
|
data['sgstTotal'] = sgstTotal;
|
|
data['igstTotal'] = igstTotal;
|
|
data['discountTotal'] = discountTotal;
|
|
data['totalAmount'] = totalAmount;
|
|
if (amountPaid > 0) data['amountPaid'] = amountPaid;
|
|
if (nextPaymentDate != null) {
|
|
data['nextPaymentDate'] = nextPaymentDate!.toIso8601String().split('T')[0];
|
|
}
|
|
if (paymentMethod != null) data['paymentMethod'] = paymentMethod;
|
|
if (paymentWalletId != null) data['paymentWalletId'] = paymentWalletId;
|
|
data['status'] = status;
|
|
if (notes != null) data['notes'] = notes;
|
|
if (invoiceUrl != null) data['invoiceUrl'] = invoiceUrl;
|
|
data['isEmi'] = isEmi;
|
|
if (emiAmount != null) data['emiAmount'] = emiAmount;
|
|
if (emiCycle != null) data['emiCycle'] = emiCycle;
|
|
if (emiStartDate != null) {
|
|
data['emiStartDate'] = emiStartDate!.toIso8601String().split('T')[0];
|
|
}
|
|
data['items'] = items.map((i) => i.toJson()).toList();
|
|
if (payments != null) {
|
|
data['payments'] = payments!.map((i) => i.toJson()).toList();
|
|
}
|
|
return data;
|
|
}
|
|
}
|
|
|
|
class InvoicePayment {
|
|
final int? id;
|
|
final int? invoiceId;
|
|
final double amount;
|
|
final DateTime? paymentDate;
|
|
final String paymentMethod;
|
|
final int? emiInstallmentNumber;
|
|
final int? walletId;
|
|
|
|
InvoicePayment({
|
|
this.id,
|
|
this.invoiceId,
|
|
required this.amount,
|
|
this.paymentDate,
|
|
required this.paymentMethod,
|
|
this.emiInstallmentNumber,
|
|
this.walletId,
|
|
});
|
|
|
|
factory InvoicePayment.fromJson(Map<String, dynamic> json) {
|
|
return InvoicePayment(
|
|
id: json['id'],
|
|
invoiceId: json['invoiceId'] ?? json['invoice_id'],
|
|
amount: (json['amount'] as num?)?.toDouble() ?? 0.0,
|
|
paymentDate: json['paymentDate'] != null
|
|
? DateTime.parse(json['paymentDate'])
|
|
: (json['payment_date'] != null ? DateTime.parse(json['payment_date']) : null),
|
|
paymentMethod: json['paymentMethod'] ?? json['payment_method'] ?? 'Cash',
|
|
emiInstallmentNumber: json['emiInstallmentNumber'] ?? json['emi_installment_number'],
|
|
walletId: json['walletId'] ?? json['wallet_id'],
|
|
);
|
|
}
|
|
|
|
Map<String, dynamic> toJson() {
|
|
final Map<String, dynamic> data = {};
|
|
if (id != null) data['id'] = id;
|
|
if (invoiceId != null) data['invoiceId'] = invoiceId;
|
|
data['amount'] = amount;
|
|
if (paymentDate != null) {
|
|
data['paymentDate'] = paymentDate!.toIso8601String().split('T')[0];
|
|
}
|
|
data['paymentMethod'] = paymentMethod;
|
|
if (emiInstallmentNumber != null) {
|
|
data['emiInstallmentNumber'] = emiInstallmentNumber;
|
|
}
|
|
if (walletId != null) data['walletId'] = walletId;
|
|
return data;
|
|
}
|
|
}
|