OTMovilGasfiter/lib/models/work_order.dart
2026-08-02 15:50:25 -04:00

155 lines
3.6 KiB
Dart

enum WorkOrderStatus {
open,
completed;
String get databaseValue => name;
static WorkOrderStatus fromDatabase(String value) {
return WorkOrderStatus.values.firstWhere(
(status) => status.name == value,
orElse: () => WorkOrderStatus.open,
);
}
}
enum PhotoKind {
before,
after;
String get databaseValue => name;
static PhotoKind fromDatabase(String value) {
return value == PhotoKind.after.name ? PhotoKind.after : PhotoKind.before;
}
}
class TaskPhoto {
const TaskPhoto({required this.id, required this.path, required this.kind});
final String id;
final String path;
final PhotoKind kind;
}
class TaskPart {
const TaskPart({required this.id, required this.name, required this.price});
final String id;
final String name;
final int price;
}
class WorkTask {
const WorkTask({
required this.id,
required this.title,
required this.observation,
required this.position,
this.photos = const [],
this.parts = const [],
});
final String id;
final String title;
final String observation;
final int position;
final List<TaskPhoto> photos;
final List<TaskPart> parts;
List<TaskPhoto> get beforePhotos =>
photos.where((photo) => photo.kind == PhotoKind.before).toList();
List<TaskPhoto> get afterPhotos =>
photos.where((photo) => photo.kind == PhotoKind.after).toList();
int get partsTotal => parts.fold(0, (total, part) => total + part.price);
}
class WorkOrderDetails {
const WorkOrderDetails({
this.client = '',
this.phone = '',
this.address = '',
});
final String client;
final String phone;
final String address;
bool get isComplete =>
client.trim().isNotEmpty &&
phone.trim().isNotEmpty &&
address.trim().isNotEmpty;
WorkOrderDetails copyWith({String? client, String? phone, String? address}) {
return WorkOrderDetails(
client: client ?? this.client,
phone: phone ?? this.phone,
address: address ?? this.address,
);
}
}
class WorkOrder {
const WorkOrder({
required this.id,
required this.title,
required this.createdAt,
required this.updatedAt,
required this.status,
this.details = const WorkOrderDetails(),
this.laborCost = 0,
this.completedAt,
this.recipientEmail,
this.pdfPath,
this.tasks = const [],
});
final String id;
final String title;
final DateTime createdAt;
final DateTime updatedAt;
final DateTime? completedAt;
final WorkOrderStatus status;
final WorkOrderDetails details;
final int laborCost;
final String? recipientEmail;
final String? pdfPath;
final List<WorkTask> tasks;
bool get isCompleted => status == WorkOrderStatus.completed;
int get totalPhotos =>
tasks.fold(0, (total, task) => total + task.photos.length);
int get totalPartsCost =>
tasks.fold(0, (total, task) => total + task.partsTotal);
int get totalCost => laborCost + totalPartsCost;
WorkOrder copyWith({
String? title,
DateTime? updatedAt,
DateTime? completedAt,
WorkOrderStatus? status,
WorkOrderDetails? details,
int? laborCost,
String? recipientEmail,
String? pdfPath,
List<WorkTask>? tasks,
}) {
return WorkOrder(
id: id,
title: title ?? this.title,
createdAt: createdAt,
updatedAt: updatedAt ?? this.updatedAt,
completedAt: completedAt ?? this.completedAt,
status: status ?? this.status,
details: details ?? this.details,
laborCost: laborCost ?? this.laborCost,
recipientEmail: recipientEmail ?? this.recipientEmail,
pdfPath: pdfPath ?? this.pdfPath,
tasks: tasks ?? this.tasks,
);
}
}