updateDeliveryQuantity method

Future<void> updateDeliveryQuantity({
  1. required Delivery delivery,
  2. required double newQuantity,
  3. required String huManagementCSRFToken,
  4. required String material,
  5. required String? batch,
  6. Json? updatePickUpQuantityExtra,
  7. Json? updateDeliveryQuantityExtra,
  8. Options? getDeliveriesOptions,
})

Implementation

Future<void> updateDeliveryQuantity({
  required Delivery delivery,
  required double newQuantity,
  required String huManagementCSRFToken,
  required String material,
  required String? batch,
  Json? updatePickUpQuantityExtra,
  Json? updateDeliveryQuantityExtra,
  Options? getDeliveriesOptions,
}) async {
  ToItem? item = delivery.toItemList.firstWhereOrNull((item) {
    return item.materialAndBatchOk(material: material, batch: batch);
  });

  if (item == null) {
    throw Exception('Item not found');
  }

  double itemPickupQuantity =
      double.tryParse(item.toPickQuantity?.pickQuantity ?? '0') ?? 0;

  double epsilon = 1e-10;
  double newPickupQuantity =
      ((newQuantity - itemPickupQuantity) //To prevent very close to zero problems
                  .clamp(0, double.infinity))
              .abs() <
          epsilon
      ? 0
      : (newQuantity - itemPickupQuantity).clamp(0, double.infinity);

  // We decrease a big pickup qty, because 0 resets it
  if (itemPickupQuantity > newQuantity) {
    await _deliveryApiProvider.pickUpQuantityUpdate(
      deliveryNumber: delivery.deliveryNumber,
      csrfToken: huManagementCSRFToken,
      data: item.toPickupQuantityUpdateJson(quantity: 0),
      updatePickUpQuantityExtra: updatePickUpQuantityExtra,
    );

    Delivery? updatedDelivery = await getDelivery(
      deliveryNumber: delivery.deliveryNumber,
      getDeliveriesOptions: getDeliveriesOptions,
    );
    ToItem? updatedItem = updatedDelivery?.toItemList.firstWhereOrNull((
      item,
    ) {
      return item.materialAndBatchOk(material: material, batch: batch);
    });

    double itemPickupQuantity =
        double.tryParse(updatedItem?.toPickQuantity?.pickQuantity ?? '0') ??
        0;
    double newPickupQuantity = (newQuantity - itemPickupQuantity).clamp(
      0,
      double.infinity,
    );

    if (newPickupQuantity > 0) {
      // We update pickup to a proper quantity (same as delivery qty)
      await _deliveryApiProvider.pickUpQuantityUpdate(
        deliveryNumber: delivery.deliveryNumber,
        csrfToken: huManagementCSRFToken,
        data: item.toPickupQuantityUpdateJson(quantity: newPickupQuantity),
        updatePickUpQuantityExtra: updatePickUpQuantityExtra,
      );
    }
  } else if (newPickupQuantity > 0) {
    // We update pickup qty if needed without resetting
    await _deliveryApiProvider.pickUpQuantityUpdate(
      deliveryNumber: delivery.deliveryNumber,
      csrfToken: huManagementCSRFToken,
      data: item.toPickupQuantityUpdateJson(quantity: newPickupQuantity),
      updatePickUpQuantityExtra: updatePickUpQuantityExtra,
    );
  }

  // We update delivery qty
  await _deliveryApiProvider.deliveryQuantityUpdate(
    deliveryNumber: delivery.deliveryNumber,
    csrfToken: huManagementCSRFToken,
    data: item.toDeliveryQuantityUpdateJson(quantity: newQuantity),
    updateDeliveryQuantityExtra: updateDeliveryQuantityExtra,
  );
}