Bilgin,

Not sure if this will help, but I had to hack an SQL function to unissue an item (haven't got the bandwidth to implement in OFBiz right now). This "backdoor" approach is obviously not the right thing, but maybe the query will short-circuit some of the analysis needed to work out which entities need to be modified.

I hope it can help.

Cheers, Iain

Bilgin Ibryam wrote:
Hi all,

I'd like to add a service for canceling item issuance.
I found in the list that this feature is asked before some time
http://www.nabble.com/Cancel-shipment-to11953006.html#a11953006 and also
it is needed for OFBIZ-1766 - canceling shipments.

I'm not familiar with all the inventory and accounting code and I would
appreciate comments/advices/help.

Do you think that this is a right approach for implementing it:

Add a new cancelQuantity field to ItemIssuance entity for storing the
canceled quantity.
Create a CancelItemIssuance service which works the following way:

1. Add the cancelQuantity quantity to ItemIssuance.cancelQuantity field.
2. Create a InventoryItemDetail entry with quantityOnHandDiff and
availableToPromiseDiff equal to cancelQuantity.
3. Call or create a seca for balanceInventoryItems service to update
inventory reservations.
4. Create a seca for adjusting the accounting transaction.

Thanks,
Bilgin
------------------------------------------------------------------------


No virus found in this incoming message.
Checked by AVG. Version: 8.0.100 / Virus Database: 269.23.16/1431 - Release Date: 5/13/2008 7:55 PM

CREATE OR REPLACE FUNCTION unissue_item(varchar, varchar) RETURNS varchar AS $$
DECLARE
  ship_id ALIAS FOR $1;
  ship_item_seq_id ALIAS FOR $2;
  my_item_issuance_id VARCHAR;
  my_order_id VARCHAR;
  my_order_item_seq_id VARCHAR;
  my_ship_group_seq_id VARCHAR;
  my_order_type_id VARCHAR;
  my_inventory_item_id VARCHAR;
  my_receipt_id VARCHAR;
  my_quantity_accepted REAL;
  my_quantity REAL;
  my_acctg_trans_id VARCHAR;
  _now TIMESTAMP;
BEGIN
  SELECT item_issuance_id, order_id, order_item_seq_id, ship_group_seq_id, 
inventory_item_id, quantity
  INTO my_item_issuance_id, my_order_id, my_order_item_seq_id, 
my_ship_group_seq_id, my_inventory_item_id, my_quantity
  FROM item_issuance
  WHERE shipment_id = ship_id
    AND shipment_item_seq_id = ship_item_seq_id;

  IF my_item_issuance_id IS NULL THEN
    RETURN NULL;
  END IF;

  RAISE NOTICE 'item_issuance_id = %, inventory_item_id = %, quantity = %',
    my_item_issuance_id, my_inventory_item_id, my_quantity;

  SELECT order_type_id INTO my_order_type_id
  FROM order_header
  WHERE order_id = my_order_id;

  RAISE NOTICE 'order_id = %, order_item_seq_id = %, order_type_id = %', 
my_order_id, my_order_item_seq_id, my_order_type_id;

  --SELECT quantity INTO my_quantity
  --FROM shipment_item
  --WHERE shipment_id = ship_id
  --  AND shipment_item_seq_id = ship_item_seq_id;
 
  --SELECT receipt_id, inventory_item_id, quantity_accepted
  --INTO my_receipt_id, my_inventory_item_id, my_quantity_accepted
  SELECT receipt_id,  quantity_accepted
  INTO my_receipt_id, my_quantity_accepted
  FROM shipment_receipt
  WHERE shipment_id = ship_id
    AND order_id = my_order_id
    AND order_item_seq_id = my_order_item_seq_id;

  IF my_receipt_id IS NOT NULL THEN
    SELECT acctg_trans_id INTO my_acctg_trans_id
    FROM acctg_trans
    WHERE receipt_id = my_receipt_id;

    DELETE FROM inventory_item_detail
    WHERE receipt_id = my_receipt_id;

    UPDATE inventory_item
    SET quantity_on_hand_total = quantity_on_hand_total - my_quantity_accepted,
        available_to_promise_total = available_to_promise_total - 
my_quantity_accepted
    WHERE inventory_item_id = my_inventory_item_id;

    DELETE FROM acctg_trans_entry
    WHERE acctg_trans_id = my_acctg_trans_id;

    DELETE FROM acctg_trans
    WHERE acctg_trans_id = my_acctg_trans_id;

    DELETE FROM shipment_receipt
    WHERE receipt_id = my_receipt_id;
  END IF;

  _now := now();

  IF my_order_type_id = 'SALES_ORDER' THEN
    INSERT INTO order_item_ship_grp_inv_res(
      order_id, ship_group_seq_id, order_item_seq_id,
      inventory_item_id, reserve_order_enum_id,
      quantity, quantity_not_available,
      reserved_datetime, created_datetime, promised_datetime,
      last_updated_stamp, last_updated_tx_stamp, created_stamp, created_tx_stamp
    )
    VALUES (
      my_order_id, my_ship_group_seq_id, my_order_item_seq_id,
      my_inventory_item_id, 'INVRO_FIFO_REC',
      my_quantity, 0,
      _now, _now, _now,
      _now, _now, _now, _now
    );
  END IF;

  DELETE FROM inventory_item_detail
  WHERE item_issuance_id = my_item_issuance_id;

  DELETE FROM item_issuance_role
  WHERE item_issuance_id = my_item_issuance_id;

  DELETE FROM item_issuance
  WHERE item_issuance_id = my_item_issuance_id;

  DELETE FROM shipment_package_content
  WHERE shipment_id = ship_id
    AND shipment_item_seq_id = ship_item_seq_id;

  DELETE FROM shipment_item
  WHERE shipment_id = ship_id
    AND shipment_item_seq_id = ship_item_seq_id;

  RETURN my_item_issuance_id;
END;
$$ LANGUAGE plpgsql;

SELECT unissue_item('13787', '00001');

Reply via email to