src-db/database/model/functions/MA_WORKEFFORT_VALIDATE.xml
author Asier Lostalé <asier.lostale@openbravo.com>
Wed, 12 Nov 2008 13:14:11 +0000
changeset 1929 ad0353d93b0f
parent 1787 84217f37d788
child 1986 7b8b569544b3
permissions -rw-r--r--
Merge back modularity branch to trunk.

Due to svn problems it has been merged using patch after updating modularity
with trunk rev 9900. This means that the svn log info for the files modified
in modularity branch will not be available.
carlos@0
     1
<?xml version="1.0"?>
adrian@94
     2
  <database name="FUNCTION MA_WORKEFFORT_VALIDATE">
adrian@94
     3
    <function name="MA_WORKEFFORT_VALIDATE" type="NULL">
juanpablo@1605
     4
      <parameter name="p_pinstance_id" type="VARCHAR" mode="in">
antonio@735
     5
        <default/>
antonio@735
     6
      </parameter>
gorkaion@239
     7
      <body><![CDATA[/*************************************************************************
carlos@0
     8
* The contents of this file are subject to the Openbravo  Public  License
carlos@0
     9
* Version  1.0  (the  "License"),  being   the  Mozilla   Public  License
carlos@0
    10
* Version 1.1  with a permitted attribution clause; you may not  use this
carlos@0
    11
* file except in compliance with the License. You  may  obtain  a copy of
carlos@0
    12
* the License at http://www.openbravo.com/legal/license.html
carlos@0
    13
* Software distributed under the License  is  distributed  on  an "AS IS"
carlos@0
    14
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
carlos@0
    15
* License for the specific  language  governing  rights  and  limitations
carlos@0
    16
* under the License.
carlos@0
    17
* The Original Code is Openbravo ERP.
carlos@0
    18
* The Initial Developer of the Original Code is Openbravo SL
asier@1929
    19
* All portions are Copyright (C) 2001-2008 Openbravo SL
carlos@0
    20
* All Rights Reserved.
carlos@0
    21
* Contributor(s):  ______________________________________.
carlos@0
    22
************************************************************************/
carlos@0
    23
  -- Logistice
carlos@0
    24
  v_ResultStr VARCHAR2(2000):='';
carlos@0
    25
  v_Message VARCHAR2(2000):='';
carlos@0
    26
  -- Parameter
carlos@0
    27
  TYPE RECORD IS REF CURSOR;
carlos@0
    28
    Cur_Parameter RECORD;
carlos@0
    29
    Cur_Toolset RECORD;
carlos@0
    30
    --
juanpablo@1605
    31
    v_Record_ID VARCHAR2(32):=NULL;
juanpablo@1605
    32
    v_User_ID VARCHAR2(32);
juanpablo@1605
    33
    v_Org_ID VARCHAR2(32);
juanpablo@1605
    34
    v_Client_ID VARCHAR2(32);
carlos@0
    35
    v_count NUMBER;
carlos@0
    36
--    v_count2 NUMBER;
juanpablo@1605
    37
--    v_Production_ID VARCHAR2(32);
carlos@0
    38
    v_ProductionDate DATE;
carlos@0
    39
--    v_Name NVARCHAR2(60) ;
carlos@0
    40
    -- p_ppline            NUMBER;
carlos@0
    41
    -- p_plline          NUMBER;
juanpablo@1605
    42
--    v_ProductionPlan_ID VARCHAR2(32);
juanpablo@1605
    43
--    v_ProductionLine_ID VARCHAR2(32);
carlos@0
    44
--    v_Quantity NUMBER;
juanpablo@1605
    45
--    v_UOM_ID VARCHAR2(32);
carlos@0
    46
--    v_PInstance NUMBER;
carlos@0
    47
--    v_doneQty NUMBER;
carlos@0
    48
--    v_needQty NUMBER;
carlos@0
    49
    v_QtyOnHand NUMBER;
carlos@0
    50
    p_Processed CHAR;
carlos@0
    51
    v_ProductQty NUMBER;
juanpablo@1605
    52
    v_NextNo VARCHAR2(32);
carlos@0
    53
    Quantity NUMBER:=99999; -- unlimited
carlos@0
    54
    v_Result NUMBER:=1;
carlos@0
    55
carlos@0
    56
    CUR_PL_Post RECORD;
carlos@0
    57
    Cur_ProductionPlan RECORD;
carlos@0
    58
carlos@0
    59
    FINISH_PROCESS BOOLEAN:=FALSE;
asier@1929
    60
    v_is_included NUMBER:=0;
asier@1929
    61
    v_available_period NUMBER:=0;
asier@1929
    62
    v_is_ready AD_Org.IsReady%TYPE;
asier@1929
    63
    v_is_tr_allow AD_OrgType.IsTransactionsAllowed%TYPE;
asier@1929
    64
    v_AD_Org_ID VARCHAR2(32);
carlos@0
    65
  BEGIN
carlos@0
    66
    -- Process Parameters
carlos@0
    67
    IF(p_PInstance_ID IS NOT NULL) THEN
carlos@0
    68
      --  Update AD_PInstance
carlos@0
    69
      DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID) ;
carlos@0
    70
      v_ResultStr:='PInstanceNotFound';
antonio@735
    71
      AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'Y', NULL, NULL) ;
carlos@0
    72
      -- Get Parameters
carlos@0
    73
      v_ResultStr:='ReadingParameters';
carlos@0
    74
      FOR Cur_Parameter IN
carlos@0
    75
        (SELECT i.Record_ID, i.AD_User_ID, i.AD_Org_ID, i.AD_Client_ID, p.ParameterName,
carlos@0
    76
          p.P_String, p.P_Number, p.P_Date
carlos@0
    77
        FROM AD_PINSTANCE i
carlos@0
    78
        LEFT JOIN AD_PINSTANCE_PARA p
carlos@0
    79
          ON i.AD_PInstance_ID=p.AD_PInstance_ID
carlos@0
    80
        WHERE i.AD_PInstance_ID=p_PInstance_ID
carlos@0
    81
        ORDER BY p.SeqNo) LOOP
carlos@0
    82
        v_Record_ID:=Cur_Parameter.Record_ID;
carlos@0
    83
        v_User_ID:=Cur_Parameter.AD_User_ID;
carlos@0
    84
        v_Org_ID:=Cur_Parameter.AD_Org_ID;
carlos@0
    85
        v_Client_ID:=Cur_Parameter.AD_Client_ID;
carlos@0
    86
      END LOOP; -- Get Parameter
carlos@0
    87
    ELSE
gorkaion@239
    88
      DBMS_OUTPUT.PUT_LINE('--<<MA_WorkEffort_Validate>>') ;
carlos@0
    89
    END IF;
carlos@0
    90
  BEGIN --BODY
asier@1929
    91
    SELECT Processed, MOVEMENTDATE, AD_ORG_ID
asier@1929
    92
    INTO p_Processed, v_ProductionDate, v_AD_Org_ID
carlos@0
    93
    FROM M_PRODUCTION
carlos@0
    94
    WHERE M_Production_ID=v_Record_ID;
carlos@0
    95
    --Check if is has been already processed
carlos@0
    96
    IF(p_Processed='Y') THEN
carlos@0
    97
      v_ResultStr:='Work Effort is already validated';
carlos@0
    98
      v_Message:='@WorkEffortValidated@';
carlos@0
    99
      RAISE_APPLICATION_ERROR(-20000, v_Message);
carlos@0
   100
    END IF;
carlos@0
   101
    IF(NOT FINISH_PROCESS) THEN
carlos@0
   102
      -- Check that there are some parts of the job and that theay are processed
asier@1929
   103
      
asier@1929
   104
      -- Check the header belongs to a organization where transactions are posible and ready to use
asier@1929
   105
      SELECT AD_Org.IsReady, Ad_OrgType.IsTransactionsAllowed
asier@1929
   106
      INTO v_is_ready, v_is_tr_allow
asier@1929
   107
      FROM M_PRODUCTION, AD_Org, AD_OrgType
asier@1929
   108
      WHERE AD_Org.AD_Org_ID=M_PRODUCTION.AD_Org_ID
asier@1929
   109
      AND AD_Org.AD_OrgType_ID=AD_OrgType.AD_OrgType_ID
asier@1929
   110
      AND M_PRODUCTION.M_PRODUCTION_ID=v_Record_ID;
asier@1929
   111
      IF (v_is_ready='N') THEN
asier@1929
   112
        RAISE_APPLICATION_ERROR(-20000, '@OrgHeaderNotReady@');
asier@1929
   113
      END IF;
asier@1929
   114
      IF (v_is_tr_allow='N') THEN
asier@1929
   115
        RAISE_APPLICATION_ERROR(-20000, '@OrgHeaderNotTransAllowed@');
asier@1929
   116
      END IF;
asier@1929
   117
      
asier@1929
   118
      SELECT AD_ORG_CHK_DOCUMENTS('M_PRODUCTION', 'M_PRODUCTIONLINE', v_Record_ID, 'M_PRODUCTION_ID', 'M_PRODUCTION_ID') INTO v_is_included FROM dual;
asier@1929
   119
      IF (v_is_included=-1) THEN
asier@1929
   120
        RAISE_APPLICATION_ERROR(-20000, '@LinesAndHeaderDifferentLEorBU@');
asier@1929
   121
      END IF;
asier@1929
   122
      
asier@1929
   123
       -- Check the period control is opened    
asier@1929
   124
      SELECT COUNT(C_Period_ID)
asier@1929
   125
      INTO v_available_period
asier@1929
   126
      FROM C_Period
asier@1929
   127
      WHERE v_ProductionDate BETWEEN STARTDATE AND ENDDATE
asier@1929
   128
      AND EXISTS (SELECT 1
asier@1929
   129
                  FROM C_PeriodControl
asier@1929
   130
                  WHERE C_PeriodControl.C_Period_ID=C_Period.C_Period_ID 
asier@1929
   131
                  AND DocBaseType='MMP'
asier@1929
   132
                  AND AD_Org_ID=v_AD_Org_ID
asier@1929
   133
                  AND PeriodStatus='O'
asier@1929
   134
                  );
asier@1929
   135
      
asier@1929
   136
      IF (v_available_period<>1) THEN
asier@1929
   137
        RAISE_APPLICATION_ERROR(-20000, '@PeriodNotAvailable@');
asier@1929
   138
      END IF;
asier@1929
   139
      
carlos@0
   140
      v_ResultStr:='Checking ProductionRun';
carlos@0
   141
      SELECT COUNT(*)
carlos@0
   142
      INTO v_count
carlos@0
   143
      FROM M_PRODUCTIONPLAN
carlos@0
   144
      WHERE M_Production_ID=v_Record_ID;
carlos@0
   145
      IF(v_count=0) THEN
carlos@0
   146
        v_ResultStr := 'There are not Production Runs to validate';
carlos@0
   147
        v_Message:='@NoProductionRun@';
carlos@0
   148
        RAISE_APPLICATION_ERROR(-20000, v_Message);
carlos@0
   149
      END IF;
carlos@0
   150
    END IF; --FINISH_PROCESS
carlos@0
   151
    IF(NOT FINISH_PROCESS) THEN
carlos@0
   152
      SELECT COUNT(*)
carlos@0
   153
      INTO v_count
carlos@0
   154
      FROM M_PRODUCTIONPLAN pp
carlos@0
   155
      WHERE M_Production_ID=v_Record_ID
carlos@0
   156
        AND PROCESSED='N';
gorkaion@239
   157
      IF(v_count<>0) THEN
carlos@0
   158
        v_Message:='@ProducionRunNoProcessed@';
carlos@0
   159
        RAISE_APPLICATION_ERROR(-20000, v_Message);
carlos@0
   160
        FINISH_PROCESS:=TRUE;
carlos@0
   161
      END IF;
carlos@0
   162
    END IF; --FINISH_PROCESS
carlos@0
   163
    IF(NOT FINISH_PROCESS) THEN
carlos@0
   164
      --Check if there's any global use production phase.
carlos@0
   165
      SELECT COUNT(*)
carlos@0
   166
      INTO v_count
carlos@0
   167
      FROM M_PRODUCTIONPLAN pp,
carlos@0
   168
        MA_WRPHASE wp
carlos@0
   169
      WHERE pp.MA_WRPHASE_ID=wp.MA_WRPHASE_ID
carlos@0
   170
        AND pp.M_PRODUCTION_ID=v_Record_ID
carlos@0
   171
        AND wp.GROUPUSE='Y';
gorkaion@239
   172
      IF(v_count<>0) THEN
carlos@0
   173
        v_ResultStr:='Distributing product of global use';
antonio@735
   174
        MA_GLOBALUSE_DISTRIBUTE(v_Client_ID, v_Org_ID, v_User_ID, v_Record_ID) ;
carlos@0
   175
      END IF;
carlos@0
   176
    END IF; --FINISH_PROCESS
carlos@0
   177
    IF(NOT FINISH_PROCESS) THEN
carlos@0
   178
      --Check if all the ProductionLine have a warehouse
carlos@0
   179
      v_ResultStr:='Checking Locators';
carlos@0
   180
      SELECT COUNT(*)
carlos@0
   181
      INTO v_count
carlos@0
   182
      FROM M_PRODUCTIONLINE l,
carlos@0
   183
        M_PRODUCTIONPLAN p
carlos@0
   184
      WHERE l.M_ProductionPlan_ID=p.M_ProductionPlan_ID
carlos@0
   185
        AND p.M_Production_ID=v_Record_ID
carlos@0
   186
        AND l.M_Locator_ID IS NULL;
gorkaion@239
   187
      IF(v_count<>0) THEN
carlos@0
   188
        v_ResultStr := 'There are produts without Locator';
carlos@0
   189
        v_Message:='@NeedLocator@';
carlos@0
   190
        RAISE_APPLICATION_ERROR(-20000, v_Message);
carlos@0
   191
        FINISH_PROCESS:=TRUE;
carlos@0
   192
      END IF;
carlos@0
   193
    END IF; --FINISH_PROCESS
carlos@0
   194
    --Check if exist any product in a productionplan with the same locator and productiontype P+ and P-
carlos@0
   195
    IF(NOT FINISH_PROCESS) THEN
carlos@0
   196
      SELECT COUNT(*)
carlos@0
   197
      INTO v_count
carlos@0
   198
      FROM M_PRODUCTIONLINE pl, M_PRODUCTIONPLAN pp
carlos@0
   199
      WHERE pl.PRODUCTIONTYPE='+'
carlos@0
   200
        AND pl.M_PRODUCTIONPLAN_ID = pp.M_PRODUCTIONPLAN_ID
carlos@0
   201
        AND pp.M_PRODUCTION_ID = v_Record_ID
carlos@0
   202
        AND EXISTS
carlos@0
   203
        (SELECT 1
carlos@0
   204
        FROM M_PRODUCTIONLINE
carlos@0
   205
        WHERE M_PRODUCTIONPLAN_ID=pl.M_PRODUCTIONPLAN_ID
carlos@0
   206
          AND M_PRODUCT_ID=pl.M_PRODUCT_ID
carlos@0
   207
          AND PRODUCTIONTYPE='-'
carlos@0
   208
        )
carlos@0
   209
        ;
gorkaion@239
   210
      IF(v_count<>0) THEN
carlos@0
   211
        ROLLBACK;
carlos@0
   212
        v_ResultStr := 'Same product in a production plan as P+ and P-';
carlos@0
   213
        v_Message:='@P+AndP-InSamePlan@';
carlos@0
   214
        RAISE_APPLICATION_ERROR(-20000, v_Message);
carlos@0
   215
        FINISH_PROCESS:=TRUE;
carlos@0
   216
      END IF;
carlos@0
   217
    END IF; --FINISH_PROCESS
carlos@0
   218
    IF (NOT FINISH_PROCESS) THEN
carlos@0
   219
      SELECT COUNT(*)
carlos@0
   220
      INTO v_Count
carlos@0
   221
      FROM M_PRODUCTIONPLAN PP, M_PRODUCTIONLINE PL, M_PRODUCT P
carlos@0
   222
      WHERE PL.M_PRODUCT_ID=P.M_PRODUCT_ID
carlos@0
   223
        AND P.M_ATTRIBUTESET_ID IS NOT NULL
juanpablo@1605
   224
        AND COALESCE(PL.M_ATTRIBUTESETINSTANCE_ID, '0') = '0'
carlos@0
   225
        AND PL.M_ProductionPlan_ID=pp.M_ProductionPlan_ID
carlos@0
   226
        AND pp.M_Production_ID=v_Record_ID;
gorkaion@239
   227
      IF v_Count<>0 THEN
carlos@0
   228
        v_Message:='@LinesWithoutAttributeSet@';
carlos@0
   229
        RAISE_APPLICATION_ERROR(-20000, v_Message);
carlos@0
   230
        FINISH_PROCESS:=TRUE;
carlos@0
   231
      END IF;
carlos@0
   232
    END IF;
carlos@0
   233
    -- All Production Lines
carlos@0
   234
    IF(NOT FINISH_PROCESS) THEN
carlos@0
   235
      FOR CUR_PL_Post IN
carlos@0
   236
        (SELECT pl.M_ProductionLine_ID, pl.AD_Client_ID, pl.AD_Org_ID, p.MovementDate,
carlos@0
   237
          pl.M_Product_ID, pl.M_AttributeSetInstance_ID, pl.MovementQty, pl.M_Locator_ID,
carlos@0
   238
          pl.M_Product_UOM_ID, pl.QuantityOrder, pl.C_UOM_ID, pl.LINE, pl.PRODUCTIONTYPE,
carlos@0
   239
          pr.ISSTOCKED, pr.PRODUCTTYPE
carlos@0
   240
        FROM M_PRODUCTION p, M_PRODUCTIONLINE pl, M_PRODUCTIONPLAN pp, M_PRODUCT pr
carlos@0
   241
        WHERE p.M_Production_ID=pp.M_Production_ID
carlos@0
   242
          AND pp.M_ProductionPlan_ID=pl.M_ProductionPlan_ID
carlos@0
   243
          AND pp.M_Production_ID=v_Record_ID
carlos@0
   244
          AND pl.M_PRODUCT_ID=pr.M_PRODUCT_ID
carlos@0
   245
        ORDER BY pp.Line, pl.Line)
carlos@0
   246
      LOOP
carlos@0
   247
        -- M_ProductionLine_ID, AD_Client_ID, AD_Org_ID, MovementDate, M_Product_ID, MovementQty, M_Locator_ID
carlos@0
   248
        -- DBMS_OUTPUT.PUT_LINE('ProductionLine=' || CUR_PL_Post.M_ProductionLine_ID);
gorkaion@1787
   249
        -- DBMS_OUTPUT.PUT_LINE('  Qty=' || CUR_PL_Post.MovementQty || ', OnHand=' || M_BOM_Qty_OnHand(CUR_PL_Post.M_Product_ID, NULL, CUR_PL_Post.M_Locator_ID));
carlos@0
   250
        -- Check Stock levels for reductions
carlos@0
   251
        -- Check, if product exists and if it is stocked
carlos@0
   252
        -- Unlimited capacity if no item
gorkaion@239
   253
        IF(CUR_PL_Post.ProductType<>'I' OR CUR_PL_Post.IsStocked='N') THEN
carlos@0
   254
          v_QtyOnHand:=Quantity;
carlos@0
   255
          -- Stocked item
carlos@0
   256
        ELSIF(CUR_PL_Post.IsStocked='Y') THEN
carlos@0
   257
          -- Get ProductQty
carlos@0
   258
          SELECT COALESCE(SUM(QtyOnHand), 0)
carlos@0
   259
          INTO v_ProductQty
carlos@0
   260
          FROM M_STORAGE_DETAIL s
carlos@0
   261
          WHERE M_Product_ID=CUR_PL_Post.M_Product_ID
carlos@0
   262
            AND EXISTS
carlos@0
   263
            (SELECT * FROM M_LOCATOR l WHERE s.M_Locator_ID=l.M_Locator_ID)
carlos@0
   264
            ;
carlos@0
   265
          --DBMS_OUTPUT.PUT_LINE('Qty=' || ProductQty);
carlos@0
   266
          v_QtyOnHand:=v_ProductQty;
carlos@0
   267
        END IF;
gorkaion@239
   268
        IF(CUR_PL_Post.PRODUCTIONTYPE='-' AND CUR_PL_Post.IsStocked<>'N' AND v_QtyOnHand-CUR_PL_Post.MovementQty<0) THEN
carlos@0
   269
          SELECT '@NotEnoughStocked@: ' || NAME
carlos@0
   270
          INTO v_Message
carlos@0
   271
          FROM M_PRODUCT
carlos@0
   272
          WHERE M_Product_ID=CUR_PL_Post.M_Product_ID;
carlos@0
   273
          RAISE_APPLICATION_ERROR(-20000, v_Message);
carlos@0
   274
          FINISH_PROCESS:=TRUE;
carlos@0
   275
        END IF;
carlos@0
   276
        -- Create Transaction Entry
carlos@0
   277
        v_ResultStr:='CreateTransaction';
carlos@0
   278
        Ad_Sequence_Next('M_Transaction', v_Org_ID, v_NextNo) ;
carlos@0
   279
        INSERT
carlos@0
   280
        INTO M_TRANSACTION
carlos@0
   281
          (
carlos@0
   282
            M_Transaction_ID, M_ProductionLine_ID, AD_Client_ID, AD_Org_ID,
carlos@0
   283
            IsActive, Created, CreatedBy, Updated,
carlos@0
   284
            UpdatedBy, MovementType, M_Locator_ID, M_Product_ID,
carlos@0
   285
            M_AttributeSetInstance_ID, MovementDate, MovementQty, M_Product_UOM_ID,
carlos@0
   286
            QuantityOrder, C_UOM_ID
carlos@0
   287
          )
carlos@0
   288
          VALUES
carlos@0
   289
          (
carlos@0
   290
            v_NextNo, CUR_PL_Post.M_ProductionLine_ID, CUR_PL_Post.AD_Client_ID, CUR_PL_Post.AD_Org_ID,
antonio@735
   291
             'Y', now(), v_User_ID, now(),
carlos@0
   292
            v_User_ID, 'P+', CUR_PL_Post.M_Locator_ID, CUR_PL_Post.M_Product_ID,
juanpablo@1605
   293
            COALESCE(CUR_PL_Post.M_AttributeSetInstance_ID, '0'), -- not distinguishing between assemby/disassembly
carlos@0
   294
            CUR_PL_Post.MovementDate,(CASE CUR_PL_Post.PRODUCTIONTYPE WHEN '+' THEN CUR_PL_Post.MovementQty ELSE -CUR_PL_Post.MOVEMENTQTY END), CUR_PL_Post.M_Product_UOM_ID,(CASE CUR_PL_Post.PRODUCTIONTYPE WHEN '+' THEN CUR_PL_Post.QUANTITYORDER ELSE -CUR_PL_Post.QuantityOrder END), CUR_PL_Post.C_UOM_ID
carlos@0
   295
          )
carlos@0
   296
          ;
gorkaion@239
   297
        IF(CUR_PL_Post.IsStocked<>'N') THEN
carlos@0
   298
          M_Check_Stock(CUR_PL_Post.M_Product_ID, v_Client_ID, v_Org_ID, v_Result, v_Message) ;
carlos@0
   299
        END IF;
carlos@0
   300
        IF (v_Result=0) THEN
carlos@0
   301
          v_Message:=v_Message || ' @Inline@ ' || CUR_PL_Post.line;
carlos@0
   302
          RAISE_APPLICATION_ERROR(-20000, v_Message);
carlos@0
   303
          FINISH_PROCESS:=TRUE;
carlos@0
   304
        END IF;
carlos@0
   305
      END LOOP;
carlos@0
   306
    END IF; --FINISH_PROCESS
carlos@0
   307
    IF(NOT FINISH_PROCESS) THEN
carlos@0
   308
        --Calculate Production Cost
carlos@0
   309
        Ma_Production_Cost(v_Record_ID, v_User_ID, v_Message);
carlos@0
   310
    END IF; --FINISH_PROCESS
carlos@0
   311
    IF(NOT FINISH_PROCESS) THEN
carlos@0
   312
      -- Update donequantity on workrequirements
carlos@0
   313
      v_ResultStr:='Updating workrequirement';
carlos@0
   314
      FOR Cur_ProductionPlan IN
carlos@0
   315
        (SELECT *  FROM M_PRODUCTIONPLAN pp  WHERE pp.M_PRODUCTION_ID=v_Record_ID)
carlos@0
   316
      LOOP
carlos@0
   317
        UPDATE MA_WRPHASE
carlos@0
   318
          SET DONEQUANTITY=DONEQUANTITY + Cur_ProductionPlan.PRODUCTIONQTY
carlos@0
   319
        WHERE MA_WRPhase_ID=Cur_ProductionPlan.MA_WRPHASE_ID;
carlos@0
   320
      END LOOP;
carlos@0
   321
      -- Indicate that we are done
carlos@0
   322
      UPDATE M_PRODUCTION
carlos@0
   323
        SET Processed='Y',
antonio@735
   324
        updated=now(),
carlos@0
   325
        updatedby=v_User_ID
carlos@0
   326
      WHERE M_Production_ID=v_Record_ID;
carlos@0
   327
    END IF; --FINISH_PROCESS
carlos@0
   328
    IF(NOT FINISH_PROCESS) THEN
carlos@0
   329
      v_ResultStr:='Updating used toolsets';
carlos@0
   330
      FOR Cur_Toolset IN
carlos@0
   331
        (SELECT MA_TOOLSETUSED.*
antonio@737
   332
         FROM MA_TOOLSETUSED, M_PRODUCTIONPLAN
carlos@0
   333
         WHERE MA_TOOLSETUSED.M_PRODUCTIONPLAN_ID = M_PRODUCTIONPLAN.M_PRODUCTIONPLAN_ID
carlos@0
   334
           AND M_PRODUCTIONPLAN.M_PRODUCTION_ID = v_Record_ID) LOOP
carlos@0
   335
        UPDATE MA_TOOLSET
carlos@0
   336
        SET NUMBERUSES = NUMBERUSES + Cur_Toolset.USED
carlos@0
   337
        WHERE MA_TOOLSET_ID = Cur_Toolset.MA_TOOLSET_ID;
carlos@0
   338
      END LOOP;
carlos@0
   339
    END IF;
gorkaion@239
   340
    --<<FINISH_PROCESS>>
carlos@0
   341
    --v_Message := v_Message || '@Created@: ' || v_NoRecords;
carlos@0
   342
      --  Update AD_PInstance
carlos@0
   343
      DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message) ;
antonio@735
   344
      AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'N', v_Result, v_Message) ;
carlos@0
   345
    RETURN;
carlos@0
   346
  END; --BODY
carlos@0
   347
EXCEPTION
carlos@0
   348
WHEN OTHERS THEN
carlos@0
   349
  DBMS_OUTPUT.PUT_LINE(v_ResultStr) ;
carlos@0
   350
  v_ResultStr:= '@ERROR=' || SQLERRM;
carlos@0
   351
  DBMS_OUTPUT.PUT_LINE(v_ResultStr) ;
carlos@0
   352
  ROLLBACK;
antonio@735
   353
  AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'N', 0, v_ResultStr) ;
carlos@0
   354
  RETURN;
antonio@735
   355
END MA_WORKEFFORT_VALIDATE
gorkaion@239
   356
]]></body>
adrian@94
   357
    </function>
adrian@94
   358
  </database>