inventory / sebn_inventory_app / lib / domain / main / entities.dart
entities.dart
Raw
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:sebn_inventory_app/infrastructure/repository/datasources/local_datasource.dart';
import 'value_objects.dart';

part 'entities.freezed.dart';

@freezed
class Inventory with _$Inventory {
  const factory Inventory({
    required int id,
    required String name,
    required String description,
    required DateTime begin,
    required DateTime end,
  }) = _Inventory;

  const Inventory._();

  factory Inventory.empty() => Inventory(
        id: -1,
        name: '',
        description: '',
        begin: DateTime(0),
        end: DateTime(0),
      );

  bool get isValid => DateTime.now().isAfter(begin) && DateTime.now().isBefore(end);
}

@freezed
class InventoryState with _$InventoryState {
  const factory InventoryState({
    required String user,
    required int firstLabel,
    required int currentLabel,
    required int totalLabelsUsed,
    required int totalItemsInventory,
    required int inventoryId,
    required int branchId,
    required int areaId,
  }) = _InventoryState;

  const InventoryState._();

  factory InventoryState.empty() => const InventoryState(
        user: '',
        firstLabel: -1,
        currentLabel: -1,
        totalLabelsUsed: -1,
        totalItemsInventory: -1,
        inventoryId: -1,
        branchId: -1,
        areaId: -1,
      );

  factory InventoryState.fromCache(TblInventoryState tbl) => InventoryState(
        user: tbl.user,
        firstLabel: tbl.firstLabel,
        currentLabel: tbl.currentLabel,
        totalLabelsUsed: tbl.totalLabelsUsed,
        totalItemsInventory: tbl.totalItemsInventory,
        inventoryId: tbl.inventoryId,
        branchId: tbl.branchId,
        areaId: tbl.areaId,
      );
}

@freezed
class InventoryItem with _$InventoryItem {
  const factory InventoryItem({
    required int id,
    required InventoryNbr inventoryNbr,
    required SerialNbr serialNbr,
    required String description,
    required String name,
    required int label,
    required int inventoryTaking,
    required int sapId,
    required int areaId,
  }) = _InventoryItem;

  const InventoryItem._();

  Map<String, dynamic> get json {
    if (sapId.isNegative)
      return {
        "inventory_id": inventoryNbr.getOrCrash(),
        "serial_nbr": serialNbr.getOrCrash(),
        "description": description,
        "name": name,
        "label_id": label,
        "inventory_taking": inventoryTaking,
        "area": areaId,
      };
    else
      return {
        "id": sapId,
        "inventory_id": inventoryNbr.getOrCrash(),
        "serial_nbr": serialNbr.getOrCrash(),
        "description": description,
        "name": name,
        "label_id": label,
        "inventory_taking": inventoryTaking,
        "area": areaId,
      };
  }

  factory InventoryItem.fromResultJson(Map<String, dynamic> json) => InventoryItem(
        id: int.tryParse(json['id'].toString()) ?? -1,
        inventoryNbr: InventoryNbr(json['inventory_id'].toString()),
        serialNbr: SerialNbr(json['serial_nbr'].toString()),
        description: json['description'].toString(),
        name: json['name'].toString(),
        label: int.tryParse(json['label_id'].toString()) ?? -1,
        inventoryTaking: int.tryParse(json['inventory_taking'].toString()) ?? -1,
        sapId: int.tryParse(json['id'].toString()) ?? -1,
        areaId: int.tryParse(json['area'].toString()) ?? -1,
      );

  //factory InventoryItem.empty() => InventoryItem();
}

@freezed
class InventoryHistoryItem with _$InventoryHistoryItem {
  //     datetime: DateTime.now(),
  // onServer: true,
  const factory InventoryHistoryItem({
    required int id,
    required InventoryItem item,
    required bool onServer,
    required DateTime datetime,
    required bool pending,
    required String insertUser,
  }) = _InventoryHistoryItem;

  const InventoryHistoryItem._();

  factory InventoryHistoryItem.fromCache(TblInventoryHistoryItem tbl) => InventoryHistoryItem(
      id: tbl.id,
      item: InventoryItem(
        id: tbl.idOnServer,
        inventoryNbr: InventoryNbr('${tbl.inventoryNbr}'),
        serialNbr: SerialNbr(tbl.serialNbr),
        description: tbl.description,
        name: tbl.name,
        label: tbl.label,
        inventoryTaking: tbl.inventoryId,
        sapId: tbl.sapId,
        areaId: tbl.areaId,
      ),
      onServer: tbl.onServer,
      pending: false,
      datetime: tbl.datetime,
      insertUser: tbl.insertUser);
}

@freezed
class SapItem with _$SapItem {
  const factory SapItem({
    required int sapId,
    required String name,
    required String description,
    required int inventoryNbr,
    required String serialNbr,
    required String owner,
  }) = _SapItem;

  const SapItem._();

  factory SapItem.fromResultsItem(dynamic item) => SapItem(
        sapId: int.tryParse(item['sap_id'].toString()) ?? -1,
        name: item['name']?.toString() ?? '',
        description: item['description']?.toString() ?? '',
        inventoryNbr: int.tryParse(item['inventory_id'].toString()) ?? -1,
        serialNbr: item['serial_nbr']?.toString() ?? '',
        owner: item['owner']?.toString() ?? '',
      );

  factory SapItem.empty() => const SapItem(
        sapId: -1,
        name: '',
        description: '',
        inventoryNbr: -1,
        serialNbr: '',
        owner: '',
      );

  bool isValid() => !sapId.isNegative;
}