Files

108 lines
2.6 KiB
Dart
Raw Permalink Normal View History

2025-10-24 22:03:35 +07:00
part of '../product.dart';
@freezed
class ListProduct with _$ListProduct {
const factory ListProduct({
required List<Product> products,
required int totalCount,
required int page,
required int limit,
required int totalPages,
}) = _ListProduct;
factory ListProduct.empty() => const ListProduct(
products: [],
totalCount: 0,
page: 0,
limit: 0,
totalPages: 0,
);
}
@freezed
class Product with _$Product {
2026-09-06 23:03:31 +07:00
const Product._();
2025-10-24 22:03:35 +07:00
const factory Product({
required String id,
required String organizationId,
required String categoryId,
required String sku,
required String name,
required String description,
required double price,
required double cost,
required String businessType,
required String imageUrl,
required String printerType,
2026-05-28 18:11:02 +07:00
required bool printToChecker,
2025-10-24 22:03:35 +07:00
required Map<String, dynamic> metadata,
required bool isActive,
required String createdAt,
required String updatedAt,
required List<ProductVariant> variants,
2026-09-06 23:03:31 +07:00
/// `unit` (default) atau `weight`. Lihat [SellBy].
@Default(SellBy.unit) String sellBy,
@Default('') String unitId,
@Default('') String unitName,
@Default('') String unitAbbreviation,
2025-10-24 22:03:35 +07:00
}) = _Product;
factory Product.empty() => const Product(
id: '',
organizationId: '',
categoryId: '',
sku: '',
name: '',
description: '',
price: 0.0,
cost: 0.0,
businessType: '',
imageUrl: '',
printerType: '',
2026-05-28 18:11:02 +07:00
printToChecker: false,
2025-10-24 22:03:35 +07:00
metadata: {},
isActive: false,
createdAt: '',
updatedAt: '',
variants: [],
);
2026-09-06 23:03:31 +07:00
/// Produk yang dijual per timbangan: `quantity` selalu 1, `weight` wajib.
bool get isSoldByWeight => SellBy.isWeight(sellBy);
/// Singkatan satuan untuk ditampilkan — `ons`. Jatuh ke nama panjang bila
/// backend hanya mengirim itu.
String get unitLabel =>
unitAbbreviation.isNotEmpty ? unitAbbreviation : unitName;
/// Label harga mengikuti satuan: "Harga per ons".
String get priceUnitLabel =>
isSoldByWeight && unitLabel.isNotEmpty ? 'per $unitLabel' : '';
2025-10-24 22:03:35 +07:00
}
@freezed
class ProductVariant with _$ProductVariant {
const factory ProductVariant({
required String id,
required String productId,
required String name,
required double priceModifier,
required double cost,
required Map<String, dynamic> metadata,
required String createdAt,
required String updatedAt,
}) = _ProductVariant;
factory ProductVariant.empty() => const ProductVariant(
id: '',
productId: '',
name: '',
priceModifier: 0.0,
cost: 0.0,
metadata: {},
createdAt: '',
updatedAt: '',
);
}