You are on page 1of 4

create or replace TRIGGER IU_WMSDOM_GOOD_ITEMS

INSTEAD OF UPDATE ON WMSDOM_GOOD_ITEMS


FOR EACH ROW

DECLARE
v_corporation_code VARCHAR2 (10
CHAR);
v_item_identifier VARCHAR2 (50
CHAR);
v_grouping_key VARCHAR2 (35
CHAR);
v_gen_key VARCHAR2 (35
CHAR);
v_new_sequence NUMBER;
v_tempValue NUMBER;
v_checkSum NUMBER;
v_controlNr NUMBER;
v_tempLngth NUMBER;
numberOfItems NUMBER;
backorder NUMBER;

BEGIN
v_item_identifier := :new.ITEM_IDENTIFIER;

-- generate sscc barcode (only do this when we can find a # in the item
identifier, else a 'normal' value can be set which doesn't require any generation)
IF instr(v_item_identifier,'#SSCC#') > 0 THEN
BEGIN
SELECT corporation_code
INTO v_corporation_code
FROM wfm_pis
INNER JOIN gen_companies
ON gen_companies.code = wfm_pis.company_code
WHERE wfm_pis.id = :new.pi_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_corporation_code := '';
END;
-- retrieve the grouping key from the item identifier
v_grouping_key := PKG_GEN_NUMBERS.get_grouping_key(v_item_identifier);

v_item_identifier := replace(v_item_identifier,'#SSCC#','');
v_gen_key := '';
v_tempLngth := 17;
IF LENGTH(v_item_identifier) > 0 THEN
v_tempLngth := 17 - LENGTH(v_item_identifier);
END IF;

FOR i IN 1..v_tempLngth LOOP


v_gen_key := v_gen_key || '#';
END LOOP;

-- replace the placeholder with exactly 17 #. SSCC holds a fixed nr mask


v_item_identifier := v_item_identifier || v_gen_key;
-- retrieve the next sequence
v_new_sequence := PKG_GEN_NUMBERS.generate_sequence_corp(v_corporation_code,
'SSCC',v_grouping_key);
-- replace #### in the item identifier with the new sequence number
v_item_identifier :=
upper(trim(PKG_GEN_NUMBERS.set_sequence_in_number(v_item_identifier,v_new_sequence)
));

IF NOT (v_item_identifier IS NULL) THEN


FOR i IN 1..17 LOOP
v_tempValue := SUBSTR(v_item_identifier,i,1);

IF MOD(i,2) != 0 THEN -- i is not even


v_tempValue := v_tempValue * 3;
END IF;

IF (v_checkSum IS NULL) THEN


v_checkSum := v_tempValue;
ELSE
v_checkSum := (v_checkSum + v_tempValue);
END IF;
END LOOP;

v_controlNr :=
TO_NUMBER(SUBSTR(TO_CHAR(v_checkSum),LENGTH(TO_CHAR(v_checkSum)), 1));

IF (v_controlNr > 0) THEN


v_controlNr := 10 - v_controlNr;
END IF;

v_item_identifier := v_item_identifier || v_controlNr;


END IF;
END IF;

UPDATE DOM_PRODUCTS SET


PROJECT_PRODUCT_ID = :new.PROJECT_PRODUCT_ID,
PROJECT_PRODUCT_ID_VAL_01 = :new.PROJECT_PRODUCT_ID_VAL_01,
PROJECT_PRODUCT_ID_VAL_02 = :new.PROJECT_PRODUCT_ID_VAL_02,
PROJECT_PRODUCT_ID_VAL_03 = :new.PROJECT_PRODUCT_ID_VAL_03,
PROJECT_PRODUCT_ID_VAL_04 = :new.PROJECT_PRODUCT_ID_VAL_04,
PROJECT_PRODUCT_ID_VAL_05 = :new.PROJECT_PRODUCT_ID_VAL_05,
PROJECT_PRODUCT_ID_VAL_06 = :new.PROJECT_PRODUCT_ID_VAL_06,
PROJECT_PRODUCT_ID_VAL_07 = :new.PROJECT_PRODUCT_ID_VAL_07,
PROJECT_PRODUCT_ID_VAL_08 = :new.PROJECT_PRODUCT_ID_VAL_08,
PROJECT_PRODUCT_ID_VAL_09 = :new.PROJECT_PRODUCT_ID_VAL_09,
PROJECT_PRODUCT_ID_VAL_10 = :new.PROJECT_PRODUCT_ID_VAL_10,
PROJECT_PRODUCT_ID_VAL_11 = :new.PROJECT_PRODUCT_ID_VAL_11,
PROJECT_PRODUCT_ID_VAL_12 = :new.PROJECT_PRODUCT_ID_VAL_12,
PROJECT_PRODUCT_ID_VAL_13 = :new.PROJECT_PRODUCT_ID_VAL_13,
PROJECT_PRODUCT_ID_VAL_14 = :new.PROJECT_PRODUCT_ID_VAL_14,
PROJECT_PRODUCT_ID_VAL_15 = :new.PROJECT_PRODUCT_ID_VAL_15,
PROJECT_PRODUCT_ID_VAL_16 = :new.PROJECT_PRODUCT_ID_VAL_16,
PROJECT_PRODUCT_ID_VAL_17 = :new.PROJECT_PRODUCT_ID_VAL_17,
PROJECT_PRODUCT_ID_VAL_18 = :new.PROJECT_PRODUCT_ID_VAL_18,
PROJECT_PRODUCT_ID_VAL_19 = :new.PROJECT_PRODUCT_ID_VAL_19,
PROJECT_PRODUCT_ID_VAL_20 = :new.PROJECT_PRODUCT_ID_VAL_20,
PROJECT_PRODUCT_ID_VAL_21 = :new.PROJECT_PRODUCT_ID_VAL_21,
PROJECT_PRODUCT_ID_VAL_22 = :new.PROJECT_PRODUCT_ID_VAL_22,
PROJECT_PRODUCT_ID_VAL_23 = :new.PROJECT_PRODUCT_ID_VAL_23,
PROJECT_PRODUCT_ID_VAL_24 = :new.PROJECT_PRODUCT_ID_VAL_24,
PROJECT_PRODUCT_ID_VAL_25 = :new.PROJECT_PRODUCT_ID_VAL_25,
EXPIRY_DATE = :new.EXPIRY_DATE,
WAREHOUSE_ID = :new.WAREHOUSE_ID,
WHS_LOCATION_ID = :new.WHS_LOCATION_ID,
TEMPERATURE = :new.TEMPERATURE,
TEMPERATURE_UNIT = :new.TEMPERATURE_UNIT,
BACKORDER = :new.BACKORDER
WHERE ID = :new.DOM_PRODUCT_ID;

UPDATE DOM_GOOD_ITEMS SET


ITEM_IDENTIFIER = v_item_identifier,
NUMBER_OF_ITEMS = :new.NUMBER_OF_ITEMS,
GROSS_WEIGHT = :new.GROSS_WEIGHT,
GROSS_WEIGHT_UNIT = :new.GROSS_WEIGHT_UNIT,
NET_WEIGHT = :new.NET_WEIGHT,
NET_WEIGHT_UNIT = :new.NET_WEIGHT_UNIT,
VOLUME = :new.VOLUME,
VOLUME_UNIT = :new.VOLUME_UNIT,
PACKAGE_CODE = :new.PACKAGE_CODE,
LANDED = :new.LANDED,
PARENT_GOOD_ITEM_ID = :new.PARENT_GOOD_ITEM_ID,
MAIN_GOOD_ITEM = :new.MAIN_GOOD_ITEM,
PACKAGE_TYPE_ID = :new.PACKAGE_TYPE_ID,
WIDTH = :new.WIDTH,
WIDTH_UNIT = :new.WIDTH_UNIT,
LENGTH = :new.LENGTH,
LENGTH_UNIT = :new.LENGTH_UNIT,
HEIGHT = :new.HEIGHT,
HEIGHT_UNIT = :new.HEIGHT_UNIT,
DIAMETER = :new.DIAMETER,
DIAMETER_UNIT = :new.DIAMETER_UNIT,
TARE_WEIGHT = :new.TARE_WEIGHT,
TARE_WEIGHT_UNIT = :new.TARE_WEIGHT_UNIT,
REMARKS = :new.REMARKS,
SOURCE_ID = :new.SOURCE_ID,
RELATED_WARRANT_ID = :new.RELATED_WARRANT_ID,
HEAT_NUMBER = :new.HEAT_NUMBER,
EXECUTION_DATE = :new.EXECUTION_DATE,
STOCK_STATUS = :new.STOCK_STATUS,
STOCK_REFERENCE = :new.STOCK_REFERENCE,
OVERRIDE_FROM_RENT_DATE = :new.OVERRIDE_FROM_RENT_DATE,
OVERRIDE_TILL_RENT_DATE = :new.OVERRIDE_TILL_RENT_DATE,
PRODUCT_ASSOCIATION_ID = :new.PRODUCT_ASSOCIATION_ID
WHERE ID = :new.DOM_GOOD_ITEMS_ID;

IF(:old.BACKORDER != :new.BACKORDER) THEN


backorder := :new.BACKORDER;
IF(backorder = 0) THEN
SELECT COUNT(*) INTO numberOfItems FROM DOM_GOOD_ITEMS INNER JOIN
DOM_PRODUCTS ON DOM_GOOD_ITEMS.PRODUCT_ID = DOM_PRODUCTS.ID WHERE
DOM_GOOD_ITEMS.PI_ID = :new.PI_ID AND DOM_PRODUCTS.BACKORDER = 1;
IF numberOfItems > 0 THEN
backorder := 1;
END IF;
END IF;

IF backorder = 1 THEN
UPDATE WMSWFM_ORDERS SET WMSWFM_ORDERS.BACKORDER = 1 WHERE WMSWFM_ORDERS.ID =
:new.PI_ID;
ELSE
UPDATE WMSWFM_ORDERS SET WMSWFM_ORDERS.BACKORDER = 0 WHERE WMSWFM_ORDERS.ID =
:new.PI_ID;
END IF;
END IF;

IF NOT (v_item_identifier IS NULL) THEN


UPDATE dom_good_items children
SET children.item_identifier = v_item_identifier
WHERE children.parent_good_item_id = :new.DOM_GOOD_ITEMS_ID
and children.item_identifier IS NULL
and children.parent_good_item_id IS NOT NULL;
END IF;
END;

You might also like