179 lines
5.5 KiB
Dart
179 lines
5.5 KiB
Dart
import 'package:freezed_annotation/freezed_annotation.dart';
|
|
|
|
part 'vendor_model.freezed.dart';
|
|
part 'vendor_model.g.dart';
|
|
|
|
String _idFromJson(Object? value) => value?.toString() ?? '';
|
|
|
|
int? _intFromJsonNullable(Object? value) {
|
|
if (value == null) return null;
|
|
if (value is int) return value;
|
|
if (value is num) return value.toInt();
|
|
return int.tryParse(value.toString());
|
|
}
|
|
|
|
DateTime? _dateFromJsonNullable(Object? value) {
|
|
if (value == null) return null;
|
|
if (value is DateTime) return value;
|
|
return DateTime.tryParse(value.toString());
|
|
}
|
|
|
|
Object? _readPaymentTermName(Map<dynamic, dynamic> json, String key) {
|
|
final flat = json['payment_term_name'];
|
|
if (flat is String && flat.isNotEmpty) return flat;
|
|
final nested = json['payment_term'];
|
|
if (nested is Map) return nested['name'];
|
|
return null;
|
|
}
|
|
|
|
Object? _readPaymentTermId(Map<dynamic, dynamic> json, String key) {
|
|
final flat = json['payment_term_id'];
|
|
if (flat != null) return flat;
|
|
final nested = json['payment_term'];
|
|
if (nested is Map) return nested['id'];
|
|
return null;
|
|
}
|
|
|
|
@freezed
|
|
class VendorModel with _$VendorModel {
|
|
const factory VendorModel({
|
|
@JsonKey(fromJson: _idFromJson) required String id,
|
|
@JsonKey(name: 'vendor_code') String? vendorCode,
|
|
@JsonKey(name: 'vendor_name') required String vendorName,
|
|
@JsonKey(name: 'vendor_type') String? vendorType,
|
|
String? gstin,
|
|
String? pan,
|
|
@JsonKey(name: 'payment_term_id', fromJson: _intFromJsonNullable)
|
|
int? paymentTermId,
|
|
@JsonKey(name: 'payment_term_name', readValue: _readPaymentTermName)
|
|
String? paymentTermName,
|
|
@JsonKey(name: 'credit_period_days', fromJson: _intFromJsonNullable)
|
|
int? creditPeriodDays,
|
|
String? remarks,
|
|
String? status,
|
|
@JsonKey(name: 'is_active') @Default(true) bool isActive,
|
|
@JsonKey(name: 'created_at', fromJson: _dateFromJsonNullable)
|
|
DateTime? createdAt,
|
|
@JsonKey(name: 'updated_at', fromJson: _dateFromJsonNullable)
|
|
DateTime? updatedAt,
|
|
@Default([]) List<VendorAddressModel> addresses,
|
|
@Default([]) List<VendorContactModel> contacts,
|
|
@JsonKey(name: 'bank_details') @Default([]) List<VendorBankDetailModel> bankDetails,
|
|
}) = _VendorModel;
|
|
|
|
factory VendorModel.fromJson(Map<String, dynamic> json) =>
|
|
_$VendorModelFromJson(json);
|
|
}
|
|
|
|
@freezed
|
|
class VendorAddressModel with _$VendorAddressModel {
|
|
const factory VendorAddressModel({
|
|
@JsonKey(fromJson: _idFromJson) required String id,
|
|
@JsonKey(name: 'vendor_id', fromJson: _idFromJson) String? vendorId,
|
|
@JsonKey(name: 'address_type') String? addressType,
|
|
@JsonKey(name: 'address_line1') String? addressLine1,
|
|
@JsonKey(name: 'address_line2') String? addressLine2,
|
|
String? city,
|
|
String? state,
|
|
String? pincode,
|
|
String? country,
|
|
String? gstin,
|
|
@JsonKey(name: 'is_active') @Default(true) bool isActive,
|
|
}) = _VendorAddressModel;
|
|
|
|
factory VendorAddressModel.fromJson(Map<String, dynamic> json) =>
|
|
_$VendorAddressModelFromJson(json);
|
|
}
|
|
|
|
@freezed
|
|
class VendorContactModel with _$VendorContactModel {
|
|
const factory VendorContactModel({
|
|
@JsonKey(fromJson: _idFromJson) required String id,
|
|
@JsonKey(name: 'vendor_id', fromJson: _idFromJson) String? vendorId,
|
|
@JsonKey(name: 'contact_name') required String contactName,
|
|
String? designation,
|
|
String? phone,
|
|
String? email,
|
|
@JsonKey(name: 'is_primary') @Default(false) bool isPrimary,
|
|
@JsonKey(name: 'is_active') @Default(true) bool isActive,
|
|
}) = _VendorContactModel;
|
|
|
|
factory VendorContactModel.fromJson(Map<String, dynamic> json) =>
|
|
_$VendorContactModelFromJson(json);
|
|
}
|
|
|
|
@freezed
|
|
class VendorBankDetailModel with _$VendorBankDetailModel {
|
|
const factory VendorBankDetailModel({
|
|
@JsonKey(fromJson: _idFromJson) required String id,
|
|
@JsonKey(name: 'vendor_id', fromJson: _idFromJson) String? vendorId,
|
|
@JsonKey(name: 'bank_name') String? bankName,
|
|
String? branch,
|
|
@JsonKey(name: 'account_number') String? accountNumber,
|
|
String? ifsc,
|
|
@JsonKey(name: 'account_holder_name') String? accountHolderName,
|
|
@JsonKey(name: 'account_type') String? accountType,
|
|
@JsonKey(name: 'is_primary') @Default(false) bool isPrimary,
|
|
@JsonKey(name: 'is_active') @Default(true) bool isActive,
|
|
}) = _VendorBankDetailModel;
|
|
|
|
factory VendorBankDetailModel.fromJson(Map<String, dynamic> json) =>
|
|
_$VendorBankDetailModelFromJson(json);
|
|
}
|
|
|
|
@freezed
|
|
class VendorListQuery with _$VendorListQuery {
|
|
const factory VendorListQuery({
|
|
@Default(1) int page,
|
|
@Default(20) int limit,
|
|
String? search,
|
|
String? status,
|
|
String? vendorType,
|
|
bool? isActive,
|
|
}) = _VendorListQuery;
|
|
}
|
|
|
|
const vendorTypeOptions = [
|
|
('RAW_MATERIAL', 'Raw Material'),
|
|
('PACKING_MATERIAL', 'Packing Material'),
|
|
('ASSET_CAPITAL', 'Asset / Capital'),
|
|
('SERVICE', 'Service'),
|
|
('GENERAL', 'General'),
|
|
];
|
|
|
|
const vendorStatusOptions = [
|
|
('active', 'Active'),
|
|
('inactive', 'Inactive'),
|
|
('blacklisted', 'Blacklisted'),
|
|
];
|
|
|
|
const addressTypeOptions = [
|
|
('REGISTERED', 'Registered'),
|
|
('BILLING', 'Billing'),
|
|
('DISPATCH', 'Dispatch'),
|
|
];
|
|
|
|
const accountTypeOptions = [
|
|
('CURRENT', 'Current'),
|
|
('SAVINGS', 'Savings'),
|
|
('OVERDRAFT', 'Overdraft'),
|
|
];
|
|
|
|
String vendorTypeLabel(String? value) {
|
|
if (value == null) return '—';
|
|
return vendorTypeOptions
|
|
.where((e) => e.$1 == value)
|
|
.map((e) => e.$2)
|
|
.firstOrNull ??
|
|
value;
|
|
}
|
|
|
|
String vendorStatusLabel(String? value) {
|
|
if (value == null) return '—';
|
|
return vendorStatusOptions
|
|
.where((e) => e.$1 == value)
|
|
.map((e) => e.$2)
|
|
.firstOrNull ??
|
|
value;
|
|
}
|