DBA Data[Home] [Help]

TRIGGER: APPS.MTL_SUPPLY_T

Source

Description
MTL_SUPPLY_T

/* $Header: invtsupl.sql 120.1.12000000.2 2007/03/15 13:34:41 mokhan ship $ */

BEFORE INSERT OR UPDATE OR DELETE ON MTL_SUPPLY
REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW

Type
BEFORE EACH ROW
Event
INSERT OR UPDATE OR DELETE
Column
When
Referencing
REFERENCING NEW AS NEW OLD AS OLD
Body
DECLARE

 MFG_DATE DATE;
 OLD_QTY  NUMBER;
 NEW_QTY  NUMBER;
 PROJECT_ID NUMBER;
 TASK_ID  NUMBER;
 L_COST_GROUP_ID NUMBER;

 CURSOR DIST_CURSOR IS
    select nvl(:new.to_org_primary_quantity, 0) * pd.req_line_quantity /
                pl.quantity,
           nvl(:old.to_org_primary_quantity, 0) * pd.req_line_quantity /
                pl.quantity, pd.project_id, pd.task_id

    from po_req_distributions_all pd,
         po_requisition_lines_all pl
    where
         :new.req_line_id = pl.requisition_line_id and
         pl.requisition_line_id = pd.requisition_line_id and
         pl.quantity > 0 and
         ((:new.supply_type_code = 'RECEIVING'and
           :new.po_distribution_id is null) or
          :new.supply_type_code = 'REQ'or
          :new.supply_type_code = 'SHIPMENT'
         ) and
         pl.requisition_line_id IS NOT NULL


    UNION ALL

    select nvl(:new.to_org_primary_quantity, 0),
           nvl(:old.to_org_primary_quantity, 0),
           pd.project_id, pd.task_id
    from po_distributions_all pd
    where
         :new.po_distribution_id = pd.po_distribution_id and
         ((:new.supply_type_code = 'RECEIVING' and
           :new.po_distribution_id is not null) or
          :new.supply_type_code = 'PO' or
          /* To fix bug 609103. Supply_type_code changed
             from 'ASN' to 'SHIPMENT' */
          :new.supply_type_code = 'SHIPMENT')

    UNION ALL

    select :new.to_org_primary_quantity,
           :old.to_org_primary_quantity,
           to_number(null), to_number(null)

    from dual
    where
         :new.req_line_id IS NULL and
         :new.po_distribution_id is NULL and
         :new.supply_type_code IN ('SHIPMENT', 'RECEIVING');

 CURSOR OLD_DIST_CURSOR IS
    select 0,
           nvl(:old.to_org_primary_quantity, 0) * pd.req_line_quantity /
                pl.quantity, pd.project_id, pd.task_id

    from po_req_distributions_all pd,
         po_requisition_lines_all pl
    where
         :old.req_line_id = pl.requisition_line_id and
         pl.requisition_line_id = pd.requisition_line_id and
         pl.quantity > 0 and
         ((:old.supply_type_code = 'RECEIVING'and
           :old.po_distribution_id is null) or
          :old.supply_type_code = 'REQ'or
          :old.supply_type_code = 'SHIPMENT'
         ) and
         pl.requisition_line_id IS NOT NULL


    UNION ALL

    select 0,
           nvl(:old.to_org_primary_quantity, 0),
           pd.project_id, pd.task_id
    from po_distributions_all pd
    where
         :old.po_distribution_id = pd.po_distribution_id and
         ((:old.supply_type_code = 'RECEIVING' and
           :old.po_distribution_id is not null) or
          :old.supply_type_code = 'PO' or
          :old.supply_type_code = 'SHIPMENT')

    UNION ALL

    select 0,
           :old.to_org_primary_quantity,
           to_number(null), to_number(null)

    from dual
    where
         :old.req_line_id IS NULL and
         :old.po_distribution_id is NULL and
         :old.supply_type_code IN ('SHIPMENT', 'RECEIVING');

 CURSOR COST_GROUP_CURSOR IS
    SELECT ppp.costing_group_id
    FROM   po_req_distributions_all prd
    ,      pjm_project_parameters ppp
    WHERE  prd.requisition_line_id = :new.req_line_id
    AND    ppp.organization_id = :new.intransit_owning_org_id
    AND    ppp.project_id = prd.project_id;

BEGIN
/*--------------------------------------------------------------------------+
 |  Calculate the expected delivery date (on insert or update)              |
 +--------------------------------------------------------------------------*/
    IF (:NEW.RECEIPT_DATE IS NOT NULL AND
        :NEW.ITEM_ID IS NOT NULL AND
        :NEW.TO_ORGANIZATION_ID IS NOT NULL AND
        :NEW.DESTINATION_TYPE_CODE IN ('INVENTORY', 'SHOP FLOOR'))
    THEN
      begin
        /* Bug# 3336484 - Added NVL to msi.postprocessing_lead_time */
	/*
	   BUG# 5756466 - Added TRUNC to new.receipt_date as calendar has
	   no timestamps but RECEIPT DATE can and hence comparision fails.
	*/
        select bc2.calendar_date into MFG_DATE
        from   bom_calendar_dates bc2,
               bom_calendar_dates bc1,
               mtl_system_items_B msi,
               mtl_parameters mp
        where  mp.organization_id = :new.to_organization_id
          and  msi.organization_id = mp.organization_id
          and  msi.inventory_item_id = :new.item_id
          and  mp.calendar_code = bc1.calendar_code
          and  mp.calendar_code = bc2.calendar_code
          and  mp.calendar_exception_set_id = bc1.exception_set_id
          and  mp.calendar_exception_set_id = bc2.exception_set_id
          and  bc1.calendar_date = trunc(:new.receipt_date)
          and  bc2.seq_num =
                nvl(bc1.seq_num, bc1.next_seq_num)+nvl(msi.postprocessing_lead_time,0);

      exception when NO_DATA_FOUND or TOO_MANY_ROWS then
        MFG_DATE := null;
      end;
      :new.expected_delivery_date := NVL(MFG_DATE,:new.expected_delivery_date);
    END IF;
/*--------------------------------------------------------------------------+
 |  If inserting a new row which is visible to MRP as supply or updating    |
 |  an existing row by changing it's supply_type_code or                    |
 |  destination_type_code then insert a row into mrp_relief_interface with  |
 |  the old quantity as 0 and old date null                                 |
 +--------------------------------------------------------------------------*/
    IF  ((INSERTING
            AND :NEW.DESTINATION_TYPE_CODE = 'INVENTORY'
            AND NVL(:NEW.CHANGE_TYPE, 'ABC') <> 'DELIVER')
        OR
        (UPDATING
            AND (:OLD.DESTINATION_TYPE_CODE
                <> :NEW.DESTINATION_TYPE_CODE
            AND :NEW.DESTINATION_TYPE_CODE = 'INVENTORY'
            AND NVL(:NEW.CHANGE_TYPE, 'ABC')  <> 'DELIVER')))
    THEN
    /*  Insert only if these required columns have values */
        IF (:NEW.EXPECTED_DELIVERY_DATE IS NOT NULL AND
            :NEW.ITEM_ID IS NOT NULL AND
            :NEW.TO_ORGANIZATION_ID IS NOT NULL AND
            :NEW.TO_ORG_PRIMARY_QUANTITY IS NOT NULL)
        THEN
            /* change: add a select for new quantity break into project and task by dist */
            OPEN dist_cursor;
            LOOP

                FETCH dist_cursor INTO new_qty, old_qty, project_id, task_id;
                exit when dist_cursor%notfound;

                INSERT  INTO    MRP_RELIEF_INTERFACE
                            (TRANSACTION_ID,
                            INVENTORY_ITEM_ID,
                            ORGANIZATION_ID,
                            LAST_UPDATE_DATE,
                            LAST_UPDATED_BY,
                            CREATION_DATE,
                            CREATED_BY,
                            LAST_UPDATE_LOGIN,
                            NEW_ORDER_QUANTITY,
                            OLD_ORDER_QUANTITY,
                            PROJECT_ID,                /* change */
                            TASK_ID,                   /* change */
                            NEW_ORDER_DATE,
                            OLD_ORDER_DATE,
                            DISPOSITION_ID,
                            PLANNED_ORDER_ID,
                            RELIEF_TYPE,
                            DISPOSITION_TYPE,
                            DEMAND_CLASS,
                            OLD_DEMAND_CLASS,
                            LINE_NUM,
                            REQUEST_ID,
                            PROGRAM_APPLICATION_ID,
                            PROGRAM_ID,
                            PROGRAM_UPDATE_DATE,
                            PROCESS_STATUS,
                            SOURCE_CODE,
                            SOURCE_LINE_ID,
                            ERROR_MESSAGE)
                VALUES(
                            MRP_RELIEF_INTERFACE_S.NEXTVAL,
                            :NEW.ITEM_ID,
                            :NEW.TO_ORGANIZATION_ID,
                            SYSDATE,
                            :NEW.LAST_UPDATED_BY,
                            SYSDATE,
                            :NEW.LAST_UPDATED_BY,
                            -1,
                            NEW_QTY,                       /* change */
                            0,
                            PROJECT_ID,                /* change */
                            TASK_ID,                   /* change */
                            :NEW.EXPECTED_DELIVERY_DATE,
                            NULL,
                            DECODE(:NEW.SUPPLY_TYPE_CODE,
                                        'REQ', :NEW.REQ_HEADER_ID,
                                        'SHIPMENT', :NEW.SHIPMENT_HEADER_ID,
                                        'PO', :NEW.PO_HEADER_ID,
                                            DECODE(:NEW.PO_HEADER_ID, NULL,
                                                    :NEW.SHIPMENT_HEADER_ID,
                                                    :NEW.PO_HEADER_ID)),
                            NULL,
                            2,
                            DECODE(:NEW.SUPPLY_TYPE_CODE,
                                        'REQ', 5,
                                        'PO', 2,
                                        'SHIPMENT', 7,
                                        DECODE(:NEW.PO_HEADER_ID, NULL,
                                        8, 6)),
                            NULL,
                            NULL,
                            DECODE(:NEW.SUPPLY_TYPE_CODE,
                                        'REQ', :NEW.REQ_LINE_ID,
                                        'SHIPMENT', :NEW.SHIPMENT_LINE_ID,
                                        'PO', :NEW.PO_LINE_ID,
                                        DECODE(:NEW.PO_LINE_ID, NULL,
                                                :NEW.SHIPMENT_LINE_ID,
                                                :NEW.PO_LINE_ID)),
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            2,
                            'INV',
                            NULL,
                            NULL);
            END LOOP;
            CLOSE dist_cursor;
        END IF;
    /*-----------------------------------------------------------------------+
     |  If updating the quantity and date of an existing row then insert a   |
     |  row into mrp_relief_interface with the old date and new date and old |
     |  quantity and new quantity                                            |
     +-----------------------------------------------------------------------*/

    /* Fix for bug 2562260.
       Removed the following AND condition from the following ELSIF stmt.
       "AND NVL(:OLD.CHANGE_TYPE, 'ABC') <> 'DELIVER'"
    */
   /* Bug 4328062 fixed. while doing partial delivery, made old_qty and
      new_qty same as per recommendations from MRP
  */

    ELSIF  (UPDATING AND    (:NEW.EXPECTED_DELIVERY_DATE IS NOT NULL
                     AND    :NEW.ITEM_ID IS NOT NULL
                     AND    :NEW.TO_ORGANIZATION_ID IS NOT NULL
                     AND    :NEW.SUPPLY_TYPE_CODE = :OLD.SUPPLY_TYPE_CODE
                     AND    :NEW.DESTINATION_TYPE_CODE =
                                :OLD.DESTINATION_TYPE_CODE
                     AND    :NEW.DESTINATION_TYPE_CODE = 'INVENTORY'
                     AND    (:NEW.TO_ORG_PRIMARY_QUANTITY <>
                                NVL(:OLD.TO_ORG_PRIMARY_QUANTITY, 0)
                            OR :NEW.EXPECTED_DELIVERY_DATE <>
                                NVL(:OLD.EXPECTED_DELIVERY_DATE,
                                        TO_DATE(1, 'J')))
                     AND     NVL(:NEW.CHANGE_TYPE, 'ABC') <> 'DELIVER'))
    THEN

        OPEN dist_cursor;
        LOOP

            FETCH dist_cursor INTO new_qty, old_qty, project_id, task_id;
            exit when dist_cursor%notfound;

            INSERT  INTO    MRP_RELIEF_INTERFACE
                            (TRANSACTION_ID,
                            INVENTORY_ITEM_ID,
                            ORGANIZATION_ID,
                            LAST_UPDATE_DATE,
                            LAST_UPDATED_BY,
                            CREATION_DATE,
                            CREATED_BY,
                            LAST_UPDATE_LOGIN,
                            NEW_ORDER_QUANTITY,
                            OLD_ORDER_QUANTITY,
                            PROJECT_ID,                /* change */
                            TASK_ID,                   /* change */
                            NEW_ORDER_DATE,
                            OLD_ORDER_DATE,
                            DISPOSITION_ID,
                            PLANNED_ORDER_ID,
                            RELIEF_TYPE,
                            DISPOSITION_TYPE,
                            DEMAND_CLASS,
                            OLD_DEMAND_CLASS,
                            LINE_NUM,
                            REQUEST_ID,
                            PROGRAM_APPLICATION_ID,
                            PROGRAM_ID,
                            PROGRAM_UPDATE_DATE,
                            PROCESS_STATUS,
                            SOURCE_CODE,
                            SOURCE_LINE_ID,
                            ERROR_MESSAGE)
            VALUES(
                            MRP_RELIEF_INTERFACE_S.NEXTVAL,
                            :NEW.ITEM_ID,
                            :NEW.TO_ORGANIZATION_ID,
                            SYSDATE,
                            :NEW.LAST_UPDATED_BY,
                            SYSDATE,
                            :NEW.LAST_UPDATED_BY,
                            -1,
							decode(:OLD.CHANGE_TYPE,'DELIVER',OLD_QTY,NEW_QTY),
                            OLD_QTY,                       /* change */
                            PROJECT_ID,                /* change */
                            TASK_ID,                   /* change */
                            :NEW.EXPECTED_DELIVERY_DATE,
                            :OLD.EXPECTED_DELIVERY_DATE,
                            DECODE(:NEW.SUPPLY_TYPE_CODE,
                                        'REQ', :NEW.REQ_HEADER_ID,
                                        'SHIPMENT', :NEW.SHIPMENT_HEADER_ID,
                                        'PO', :NEW.PO_HEADER_ID,
                                        DECODE(:NEW.PO_HEADER_ID, NULL,
                                                :NEW.SHIPMENT_HEADER_ID,
                                                :NEW.PO_HEADER_ID)),
                            NULL,
                            2,
                            DECODE(:NEW.SUPPLY_TYPE_CODE,
                                        'REQ', 5,
                                        'PO', 2,
                                        'SHIPMENT', 7,
                                        DECODE(:NEW.PO_HEADER_ID, NULL, 8,
                                        6)),
                            NULL,
                            NULL,
                            DECODE(:NEW.SUPPLY_TYPE_CODE,
                                    'REQ', :NEW.REQ_LINE_ID,
                                    'SHIPMENT', :NEW.SHIPMENT_LINE_ID,
                                    'PO', :NEW.PO_LINE_ID,
                                    DECODE(:NEW.PO_LINE_ID, NULL,
                                            :NEW.SHIPMENT_LINE_ID,
                                            :NEW.PO_LINE_ID)),
                            NULL,
                            NULL,
                            NULL,
                            NULL,
                            2,
                            'INV',
                            NULL,
                            NULL);
        END LOOP;
        CLOSE dist_cursor;
    END IF;
/*-------------------------------------------------------------------------+
 |  If a row is being deleted with the supply_type_code of PO or REQ or if |
 |  an existing row is being updated and the row was originally visible to |
 |  MRP and it's SUPPLY_TYPE_CODE is being changed or DESTINATION_TYPE_CODE|
 |  is being changed then insert a row for unrelief of the existing row    |
 +-------------------------------------------------------------------------*/
    /* If a row is being is deleted or it is being made not-visible to mrp
       then insert a row with a new_order_quantity as 0 to unconsume */

    /* Fix for bug 2562260.
       Removed the following AND condition from the following IF stmt.
       "AND NVL(:OLD.CHANGE_TYPE, 'ABC') <> 'DELIVER'"
    */
   /* Bug 4328062 fixed. while doing partial delivery, made old_qty and
      new_qty same as per recommendations from MRP
  */

    IF (DELETING    AND :OLD.DESTINATION_TYPE_CODE = 'INVENTORY'
                    AND :OLD.EXPECTED_DELIVERY_DATE IS NOT NULL
                    AND :OLD.ITEM_ID IS NOT NULL
                    AND :OLD.TO_ORGANIZATION_ID IS NOT NULL)
        THEN

            OPEN old_dist_cursor;
            LOOP

                FETCH old_dist_cursor INTO new_qty, old_qty, project_id, task_id;
                exit when old_dist_cursor%notfound;
                INSERT  INTO    MRP_RELIEF_INTERFACE
                                (TRANSACTION_ID,
                                INVENTORY_ITEM_ID,
                                ORGANIZATION_ID,
                                LAST_UPDATE_DATE,
                                LAST_UPDATED_BY,
                                CREATION_DATE,
                                CREATED_BY,
                                LAST_UPDATE_LOGIN,
                                NEW_ORDER_QUANTITY,
                                OLD_ORDER_QUANTITY,
                                OLD_PROJECT_ID,                /* change */
                                OLD_TASK_ID,                   /* change */
                                NEW_ORDER_DATE,
                                OLD_ORDER_DATE,
                                DISPOSITION_ID,
                                PLANNED_ORDER_ID,
                                RELIEF_TYPE,
                                DISPOSITION_TYPE,
                                DEMAND_CLASS,
                                OLD_DEMAND_CLASS,
                                LINE_NUM,
                                REQUEST_ID,
                                PROGRAM_APPLICATION_ID,
                                PROGRAM_ID,
                                PROGRAM_UPDATE_DATE,
                                PROCESS_STATUS,
                                SOURCE_CODE,
                                SOURCE_LINE_ID,
                                ERROR_MESSAGE)
                VALUES
                                (MRP_RELIEF_INTERFACE_S.NEXTVAL,
                                :OLD.item_id,
                                :OLD.TO_ORGANIZATION_ID,
                                sysdate,
                                :OLD.LAST_UPDATED_BY,
                                sysdate,
                                :OLD.LAST_UPDATED_BY,
                                -1,
                                decode(:OLD.CHANGE_TYPE,'DELIVER',OLD_QTY,0),
                                OLD_QTY,                   /* change */
                                PROJECT_ID,                /* change */
                                TASK_ID,                   /* change */
                                :OLD.EXPECTED_DELIVERY_DATE,
                                :OLD.EXPECTED_DELIVERY_DATE,
                                DECODE(:OLD.SUPPLY_TYPE_CODE,
                                    'REQ', :OLD.REQ_HEADER_ID,
                                    'PO', :OLD.PO_HEADER_ID,
                                    'SHIPMENT', :OLD.SHIPMENT_HEADER_ID,
                                    DECODE(:OLD.PO_HEADER_ID, NULL,
                                            :OLD.SHIPMENT_HEADER_ID,
                                            :OLD.PO_HEADER_ID)),
                                NULL,
                                2,
                                DECODE(:OLD.SUPPLY_TYPE_CODE,
                                                'REQ', 5,
                                                'PO', 2,
                                                'SHIPMENT', 7,
                                                DECODE(:OLD.PO_HEADER_ID, NULL,
                                                8, 6)),
                                NULL,
                                NULL, /* Check information on po in receiving */

                                DECODE(:OLD.SUPPLY_TYPE_CODE,
                                        'REQ', :OLD.REQ_LINE_ID,
                                        'PO', :OLD.PO_LINE_ID,
                                        'SHIPMENT', :OLD.SHIPMENT_LINE_ID,
                                        DECODE(:OLD.PO_LINE_ID, NULL,
                                                :OLD.SHIPMENT_LINE_ID,
                                                :OLD.PO_LINE_ID)),
                                NULL,
                                NULL,
                                NULL,
                                NULL,
                                2,
                                'INV',
                                NULL,
                                NULL);
        END LOOP;
        CLOSE old_dist_cursor;

    ELSIF
        (UPDATING   AND :OLD.DESTINATION_TYPE_CODE = 'INVENTORY'
                    AND (:NEW.SUPPLY_TYPE_CODE <> :OLD.SUPPLY_TYPE_CODE
                        OR
                        :NEW.DESTINATION_TYPE_CODE <>
                            :OLD.DESTINATION_TYPE_CODE)
                    AND :OLD.EXPECTED_DELIVERY_DATE IS NOT NULL
                    AND :OLD.ITEM_ID IS NOT NULL
                    AND :OLD.TO_ORGANIZATION_ID IS NOT NULL
                    AND NVL(:OLD.CHANGE_TYPE, 'ABC') <> 'DELIVER')
        THEN

            OPEN dist_cursor;
            LOOP

                FETCH dist_cursor INTO new_qty, old_qty, project_id, task_id;
                exit when dist_cursor%notfound;
                INSERT  INTO    MRP_RELIEF_INTERFACE
                                (TRANSACTION_ID,
                                INVENTORY_ITEM_ID,
                                ORGANIZATION_ID,
                                LAST_UPDATE_DATE,
                                LAST_UPDATED_BY,
                                CREATION_DATE,
                                CREATED_BY,
                                LAST_UPDATE_LOGIN,
                                NEW_ORDER_QUANTITY,
                                OLD_ORDER_QUANTITY,
                                PROJECT_ID,                /* change */
                                TASK_ID,                   /* change */
                                NEW_ORDER_DATE,
                                OLD_ORDER_DATE,
                                DISPOSITION_ID,
                                PLANNED_ORDER_ID,
                                RELIEF_TYPE,
                                DISPOSITION_TYPE,
                                DEMAND_CLASS,
                                OLD_DEMAND_CLASS,
                                LINE_NUM,
                                REQUEST_ID,
                                PROGRAM_APPLICATION_ID,
                                PROGRAM_ID,
                                PROGRAM_UPDATE_DATE,
                                PROCESS_STATUS,
                                SOURCE_CODE,
                                SOURCE_LINE_ID,
                                ERROR_MESSAGE)
                VALUES
                                (MRP_RELIEF_INTERFACE_S.NEXTVAL,
                                :OLD.item_id,
                                :OLD.TO_ORGANIZATION_ID,
                                sysdate,
                                :OLD.LAST_UPDATED_BY,
                                sysdate,
                                :OLD.LAST_UPDATED_BY,
                                -1,
                                0,
                                OLD_QTY,                   /* change */
                                PROJECT_ID,                /* change */
                                TASK_ID,                   /* change */
                                :OLD.EXPECTED_DELIVERY_DATE,
                                :OLD.EXPECTED_DELIVERY_DATE,
                                DECODE(:OLD.SUPPLY_TYPE_CODE,
                                    'REQ', :OLD.REQ_HEADER_ID,
                                    'PO', :OLD.PO_HEADER_ID,
                                    'SHIPMENT', :OLD.SHIPMENT_HEADER_ID,
                                    DECODE(:OLD.PO_HEADER_ID, NULL,
                                            :OLD.SHIPMENT_HEADER_ID,
                                            :OLD.PO_HEADER_ID)),
                                NULL,
                                2,
                                DECODE(:OLD.SUPPLY_TYPE_CODE,
                                                'REQ', 5,
                                                'PO', 2,
                                                'SHIPMENT', 7,
                                                DECODE(:OLD.PO_HEADER_ID, NULL,
                                                8, 6)),
                                NULL,
                                NULL, /* Check information on po in receiving */

                                DECODE(:OLD.SUPPLY_TYPE_CODE,
                                        'REQ', :OLD.REQ_LINE_ID,
                                        'PO', :OLD.PO_LINE_ID,
                                        'SHIPMENT', :OLD.SHIPMENT_LINE_ID,
                                        DECODE(:OLD.PO_LINE_ID, NULL,
                                                :OLD.SHIPMENT_LINE_ID,
                                                :OLD.PO_LINE_ID)),
                                NULL,
                                NULL,
                                NULL,
                                NULL,
                                2,
                                'INV',
                                NULL,
                                NULL);
        END LOOP;
        CLOSE dist_cursor;
    END IF;

    IF (INSERTING AND :NEW.SUPPLY_TYPE_CODE = 'SHIPMENT') THEN
      OPEN COST_GROUP_CURSOR;
      FETCH COST_GROUP_CURSOR INTO L_COST_GROUP_ID;
      CLOSE COST_GROUP_CURSOR;

      IF (L_COST_GROUP_ID IS NOT NULL) THEN
        :NEW.COST_GROUP_ID := L_COST_GROUP_ID;
      END IF;
    END IF;

 END;