bharat_erp/lib/shared/models/vendor_model.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;
}