src-db/database/model/functions/M_INOUT_POST.xml
author Harikrishnan Raja <harikrishnan.raja@openbravo.com>
Wed, 21 Jul 2010 15:51:48 +0530
changeset 7945 edda5328f260
parent 7702 e6a6e9dcefab
child 8015 44967d45c991
permissions -rw-r--r--
Fixes Issue 13912: The process 'Create Lines from' of the Goods Shipment window shows incorrect data.
juanpablo@3490
     1
<?xml version="1.0"?>
juanpablo@3490
     2
  <database name="FUNCTION M_INOUT_POST">
juanpablo@3490
     3
    <function name="M_INOUT_POST" type="NULL">
juanpablo@3490
     4
      <parameter name="p_pinstance_id" type="VARCHAR" mode="in">
juanpablo@3490
     5
        <default/>
juanpablo@3490
     6
      </parameter>
juanpablo@3490
     7
      <parameter name="p_inout_id" type="VARCHAR" mode="in">
juanpablo@3490
     8
        <default/>
juanpablo@3490
     9
      </parameter>
gorkaion@239
    10
      <body><![CDATA[/*************************************************************************
juanpablo@771
    11
  * The contents of this file are subject to the Compiere Public
juanpablo@771
    12
  * License 1.1 ("License"); You may not use this file except in
juanpablo@771
    13
  * compliance with the License. You may obtain a copy of the License in
juanpablo@771
    14
  * the legal folder of your Openbravo installation.
carlos@0
    15
  * Software distributed under the License is distributed on an
carlos@0
    16
  * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
carlos@0
    17
  * implied. See the License for the specific language governing rights
carlos@0
    18
  * and limitations under the License.
juanpablo@778
    19
  * The Original Code is  Compiere  ERP &  Business Solution
juanpablo@771
    20
  * The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
carlos@0
    21
  * Portions created by Jorg Janke are Copyright (C) 1999-2001 Jorg Janke,
carlos@0
    22
  * parts created by ComPiere are Copyright (C) ComPiere, Inc.;
carlos@0
    23
  * All Rights Reserved.
ggi@6702
    24
  * Contributor(s): Openbravo SLU
ggi@6702
    25
  * Contributions are Copyright (C) 2001-2010 Openbravo, S.L.U.
juanpablo@771
    26
  *
juanpablo@771
    27
  * Specifically, this derivative work is based upon the following Compiere
juanpablo@771
    28
  * file and version.
carlos@0
    29
  *************************************************************************
carlos@0
    30
  * $Id: M_InOut_Post.sql,v 1.8 2003/09/05 04:58:06 jjanke Exp $
carlos@0
    31
  ***
carlos@0
    32
  * Title: Post M_InOut_ID
carlos@0
    33
  * Description:
carlos@0
    34
  *  Action: COmplete
carlos@0
    35
  *  - Create Transaction
carlos@0
    36
  *    (only stocked products)
carlos@0
    37
  *  - Update Inventory (QtyReserved, QtyOnHand)
carlos@0
    38
  *    (only stocked products)
carlos@0
    39
  *  - Update OrderLine (QtyDelivered)
carlos@0
    40
  *
carlos@0
    41
  *  Action: Reverse Correction
carlos@0
    42
  *  - Create Header and lines with negative Quantities (and header amounts)
carlos@0
    43
  *  - Post it
carlos@0
    44
  ************************************************************************/
carlos@0
    45
  -- Logistice
carlos@0
    46
  v_ResultStr VARCHAR2(2000):='';
carlos@0
    47
  v_Message VARCHAR2(2000):='';
juanpablo@1605
    48
  v_Record_ID VARCHAR2(32);
juanpablo@1605
    49
  v_User VARCHAR2(32);
harikrishnan@7227
    50
  v_PUser VARCHAR2(32);
asier@1929
    51
  v_is_included NUMBER:=0;
asier@1929
    52
  v_DocType_ID VARCHAR2(32);
asier@1929
    53
  v_available_period NUMBER:=0;
asier@1929
    54
  v_is_ready AD_Org.IsReady%TYPE;
asier@1929
    55
  v_is_tr_allow AD_OrgType.IsTransactionsAllowed%TYPE;
asier@1929
    56
  v_DateAcct DATE;
victor@3065
    57
  v_isacctle AD_OrgType.IsAcctLegalEntity%TYPE;
victor@3065
    58
  v_org_bule_id AD_Org.AD_Org_ID%TYPE;
carlos@0
    59
  -- Parameter
carlos@0
    60
  TYPE RECORD IS REF CURSOR;
carlos@0
    61
    Cur_Parameter RECORD;
carlos@0
    62
    --
carlos@0
    63
    Cur_InOut RECORD;
carlos@0
    64
    Cur_InOutLine RECORD;
gorkaion@3170
    65
    Cur_Order RECORD;
carlos@0
    66
    --
carlos@0
    67
    v_Result NUMBER:=1;
juanpablo@1605
    68
    v_AD_Org_ID VARCHAR2(32);
juanpablo@1605
    69
    v_AD_Client_ID VARCHAR2(32);
juanpablo@1605
    70
    v_NextNo VARCHAR2(32);
carlos@0
    71
    v_Qty NUMBER;
carlos@0
    72
    v_QtyPO NUMBER;
carlos@0
    73
    v_QtySO NUMBER;
carlos@0
    74
    v_QuantityOrder NUMBER;
carlos@0
    75
    v_QuantityOrderPO NUMBER;
carlos@0
    76
    v_QuantityOrderSO NUMBER;
carlos@0
    77
    v_RDocumentNo VARCHAR2(40) ;
juanpablo@1605
    78
    v_RInOut_ID VARCHAR2(32);
carlos@0
    79
    v_IsStocked NUMBER;
juanpablo@1605
    80
    v_DoctypeReversed_ID VARCHAR2(32);
carlos@0
    81
    --MODIFIED BY F.IRIAZABAL
carlos@0
    82
    v_QtyOrder NUMBER;
carlos@0
    83
    v_ProductUOM NUMBER;
asier@2586
    84
    v_BreakDown VARCHAR2(60) ;
carlos@0
    85
    v_ActualQty NUMBER;
carlos@0
    86
    v_QtyAux NUMBER;
carlos@0
    87
    v_Count NUMBER:=0;
carlos@0
    88
    v_Line VARCHAR2(10) ;
gorkaion@3170
    89
    v_OrderID_old VARCHAR2(32);
harikrishnan@7945
    90
    Cur_MILines RECORD;
carlos@0
    91
    FINISH_PROCESS BOOLEAN:=false;
harikrishnan@5580
    92
    v_Aux NUMBER;
carlos@0
    93
  BEGIN
carlos@0
    94
    IF(p_PInstance_ID IS NOT NULL) THEN
carlos@0
    95
      --  Update AD_PInstance
carlos@0
    96
      DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID) ;
carlos@0
    97
      v_ResultStr:='PInstanceNotFound';
carlos@0
    98
      AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'Y', NULL, NULL) ;
carlos@0
    99
      -- Get Parameters
carlos@0
   100
      v_ResultStr:='ReadingParameters';
carlos@0
   101
      FOR Cur_Parameter IN
carlos@0
   102
        (SELECT i.Record_ID,
carlos@0
   103
          i.AD_User_ID,
carlos@0
   104
          p.ParameterName,
carlos@0
   105
          p.P_String,
carlos@0
   106
          p.P_Number,
carlos@0
   107
          p.P_Date
carlos@0
   108
        FROM AD_PInstance i
carlos@0
   109
        LEFT JOIN AD_PInstance_Para p
carlos@0
   110
          ON i.AD_PInstance_ID=p.AD_PInstance_ID
carlos@0
   111
        WHERE i.AD_PInstance_ID=p_PInstance_ID
carlos@0
   112
        ORDER BY p.SeqNo
carlos@0
   113
        )
carlos@0
   114
      LOOP
carlos@0
   115
        v_Record_ID:=Cur_Parameter.Record_ID;
carlos@0
   116
        v_User:=Cur_Parameter.AD_User_ID;
carlos@0
   117
      END LOOP; -- Get Parameter
carlos@0
   118
      DBMS_OUTPUT.PUT_LINE('  Record_ID=' || v_Record_ID) ;
carlos@0
   119
    ELSE
gorkaion@239
   120
      DBMS_OUTPUT.PUT_LINE('--<<M_InOut_Post>>') ;
carlos@0
   121
      v_Record_ID:=p_InOut_ID;
harikrishnan@7227
   122
      SELECT count(*),updatedby
harikrishnan@7227
   123
        INTO v_Count,v_User
rafael@5825
   124
        FROM M_InOut
harikrishnan@7227
   125
        WHERE M_InOut_ID=v_Record_ID
harikrishnan@7227
   126
        GROUP BY updatedby;
rafael@5825
   127
      IF v_Count=0 THEN
rafael@5825
   128
        FINISH_PROCESS:=true;
rafael@5825
   129
      END IF;
carlos@0
   130
    END IF;
carlos@0
   131
  BEGIN --BODY
rafael@5825
   132
  	IF(NOT FINISH_PROCESS) THEN
harikrishnan@7227
   133
  	  v_PUser:=v_User;
rafael@5825
   134
      SELECT AD_Client_ID, AD_Org_ID, CreatedBy, C_DocType_ID, DateAcct
rafael@5825
   135
        INTO v_AD_Client_ID, v_AD_Org_ID, v_User, v_DocType_ID, v_DateAcct
rafael@5825
   136
        FROM M_InOut
rafael@5825
   137
        WHERE M_InOut_ID=v_Record_ID;
harikrishnan@7227
   138
        IF(v_PUser IS NOT NULL) THEN
harikrishnan@7227
   139
        	v_User:=v_PUser;
harikrishnan@7227
   140
        END IF;
carlos@0
   141
      SELECT count(*)
carlos@0
   142
      INTO v_Count
rafael@5825
   143
      FROM AD_CLIENTINFO
rafael@5825
   144
      WHERE AD_CLIENT_ID=v_AD_Client_ID
rafael@5825
   145
        AND CHECKINOUTORG='Y';
gorkaion@239
   146
      IF v_Count>0 THEN
rafael@5825
   147
        v_ResultStr:='CheckingRestrictions - M_INOUT ORG IS IN C_BPARTNER ORG TREE';
rafael@5825
   148
        SELECT count(*)
rafael@5825
   149
        INTO v_Count
rafael@5825
   150
        FROM M_InOut m,
rafael@5825
   151
          C_BPartner bp
rafael@5825
   152
        WHERE m.M_InOut_ID=v_Record_ID
rafael@5825
   153
          AND m.C_BPARTNER_ID=bp.C_BPARTNER_ID
rafael@5825
   154
          AND AD_IsOrgIncluded(m.AD_ORG_ID, bp.AD_ORG_ID, bp.AD_CLIENT_ID)=-1;
rafael@5825
   155
        IF v_Count>0 THEN
rafael@5825
   156
          RAISE_APPLICATION_ERROR(-20000, '@NotCorrectOrgBpartnerInout@') ;
rafael@5825
   157
        END IF;
carlos@0
   158
      END IF;
rafael@5825
   159
      
rafael@5825
   160
     v_ResultStr:='CheckingRestrictions';
rafael@5825
   161
     SELECT COUNT(*)
rafael@5825
   162
     INTO v_Count
rafael@5825
   163
     FROM C_DocType,
rafael@5825
   164
          M_InOut M
rafael@5825
   165
     WHERE M_Inout_ID = v_Record_ID
rafael@5825
   166
       AND C_DocType.DocBaseType IN ('MMR', 'MMS')
rafael@5825
   167
      AND C_DocType.IsSOTrx=M.IsSOTrx
rafael@5825
   168
      AND AD_ISORGINCLUDED(m.AD_Org_ID,C_DocType.AD_Org_ID, m.AD_Client_ID) <> -1
rafael@5825
   169
       AND M.C_DOCTYPE_ID=C_DocType.C_DOCTYPE_ID;
rafael@5825
   170
        IF v_Count=0 THEN
rafael@5825
   171
          RAISE_APPLICATION_ERROR(-20000, '@NotCorrectOrgDoctypeShipment@') ;
rafael@5825
   172
        END IF;
rafael@5825
   173
        SELECT COUNT(*), MAX(M.line)
rafael@5825
   174
        INTO v_Count, v_line
rafael@5825
   175
        FROM M_InOutLine M,
rafael@5825
   176
          M_Product P
rafael@5825
   177
        WHERE M.M_PRODUCT_ID=P.M_PRODUCT_ID
rafael@5825
   178
          AND P.M_ATTRIBUTESET_ID IS NOT NULL
rafael@6091
   179
          AND (P.ATTRSETVALUETYPE IS NULL OR P.ATTRSETVALUETYPE <> 'F')
rafael@6104
   180
          AND (SELECT ISONEATTRSETVALREQUIRED FROM M_ATTRIBUTESET WHERE M_ATTRIBUTESET_ID = P.M_ATTRIBUTESET_ID) = 'Y'
rafael@5825
   181
          AND COALESCE(M.M_ATTRIBUTESETINSTANCE_ID, '0') = '0'
rafael@5825
   182
          AND M.M_INOUT_ID=v_Record_ID;
rafael@5825
   183
        IF v_Count<>0 THEN
rafael@6091
   184
          RAISE_APPLICATION_ERROR(-20000, '@Inline@'||' '||v_line||' '||'@productWithoutAttributeSet@') ;
rafael@5825
   185
        END IF;
rafael@5825
   186
        SELECT COUNT(*), MAX(M.line)
rafael@5825
   187
        INTO v_Count, v_Line
rafael@5825
   188
        FROM M_InOut I,
rafael@5825
   189
          M_InOutLine M,
rafael@5825
   190
          M_AttributeSetInstance P
rafael@5825
   191
        WHERE I.M_InOut_ID=M.M_InOut_ID
rafael@5825
   192
          AND M.M_AttributeSetInstance_ID=P.M_AttributeSetInstance_ID
rafael@5825
   193
          AND P.ISLOCKED='Y'
rafael@5825
   194
          AND I.ISSOTRX='Y'
rafael@5825
   195
          AND I.M_INOUT_ID=v_Record_ID;
rafael@5825
   196
        IF v_Count<>0 THEN
rafael@5825
   197
          RAISE_APPLICATION_ERROR(-20000, '@Inline@'||v_line||' '||'@lockedProduct@') ;
rafael@5825
   198
        END IF;
rafael@5825
   199
      -- check inout line instance location
rafael@5825
   200
        SELECT COUNT(*), MAX(M.line)
rafael@5825
   201
        INTO v_Count, v_Line
rafael@5825
   202
        FROM M_InOutLine M,
rafael@5825
   203
          M_Product P
rafael@5825
   204
        WHERE M.M_InOut_ID=v_Record_ID
rafael@5825
   205
          AND M.M_Locator_ID IS NULL
rafael@5825
   206
          AND p.m_product_id = m.m_product_id
rafael@5825
   207
          AND p.isstocked = 'Y'
rafael@5825
   208
          AND p.producttype = 'I';
rafael@5825
   209
        IF v_Count <> 0 THEN
rafael@5825
   210
          RAISE_APPLICATION_ERROR(-20000, '@Inline@'||v_line||' '||'@InoutLineWithoutLocator@') ;
rafael@5825
   211
        END IF;	  
rafael@5825
   212
      
rafael@5825
   213
        -- Process Shipments
rafael@5825
   214
  
rafael@5825
   215
     -- Set org lines like the header
rafael@5825
   216
       UPDATE M_INOUTLINE
harikrishnan@7227
   217
        SET AD_ORG_ID = (SELECT AD_ORG_ID FROM M_INOUT WHERE M_INOUT_ID = v_Record_ID),
harikrishnan@7227
   218
        Updated=now(),
harikrishnan@7227
   219
        UpdatedBy=v_User
rafael@5825
   220
      WHERE M_INOUT_ID = v_Record_ID;
rafael@5825
   221
      
rafael@5825
   222
      -- Check the header belongs to a organization where transactions are posible and ready to use
rafael@5825
   223
      SELECT AD_Org.IsReady, Ad_OrgType.IsTransactionsAllowed
rafael@5825
   224
      INTO v_is_ready, v_is_tr_allow
rafael@5825
   225
      FROM M_INOUT, AD_Org, AD_OrgType
rafael@5825
   226
      WHERE AD_Org.AD_Org_ID=M_INOUT.AD_Org_ID
rafael@5825
   227
      AND AD_Org.AD_OrgType_ID=AD_OrgType.AD_OrgType_ID
rafael@5825
   228
      AND M_INOUT.M_INOUT_ID=v_Record_ID;
rafael@5825
   229
      IF (v_is_ready='N') THEN
rafael@5825
   230
        RAISE_APPLICATION_ERROR(-20000, '@OrgHeaderNotReady@');
carlos@0
   231
      END IF;
rafael@5825
   232
      IF (v_is_tr_allow='N') THEN
rafael@5825
   233
        RAISE_APPLICATION_ERROR(-20000, '@OrgHeaderNotTransAllowed@');
carlos@0
   234
      END IF;
rafael@5825
   235
        
rafael@5825
   236
      SELECT AD_ORG_CHK_DOCUMENTS('M_INOUT', 'M_INOUTLINE', v_Record_ID, 'M_INOUT_ID', 'M_INOUT_ID') INTO v_is_included FROM dual;
rafael@5825
   237
      IF (v_is_included=-1) THEN
rafael@5825
   238
        RAISE_APPLICATION_ERROR(-20000, '@LinesAndHeaderDifferentLEorBU@');
carlos@0
   239
      END IF;
asier@1929
   240
      
rafael@5825
   241
      -- Check the period control is opened (only if it is legal entity with accounting)
rafael@5825
   242
      -- Gets the BU or LE of the document
rafael@5825
   243
      SELECT AD_GET_DOC_LE_BU('M_INOUT', v_Record_ID, 'M_INOUT_ID', 'LE')
rafael@5825
   244
      INTO v_org_bule_id
victor@3065
   245
      FROM DUAL;
victor@3065
   246
      
rafael@5825
   247
      SELECT AD_OrgType.IsAcctLegalEntity
rafael@5825
   248
      INTO v_isacctle
rafael@5825
   249
      FROM AD_OrgType, AD_Org
rafael@5825
   250
      WHERE AD_Org.AD_OrgType_ID = AD_OrgType.AD_OrgType_ID
rafael@5825
   251
      AND AD_Org.AD_Org_ID=v_org_bule_id;
rafael@5825
   252
      
rafael@5825
   253
      IF (v_isacctle='Y') THEN    
rafael@5825
   254
        SELECT C_CHK_OPEN_PERIOD(v_AD_Org_ID, v_DateAcct, NULL, v_DocType_ID) 
rafael@5825
   255
        INTO v_available_period
rafael@5825
   256
        FROM DUAL;
rafael@5825
   257
        
rafael@5825
   258
        IF (v_available_period<>1) THEN
rafael@5825
   259
          RAISE_APPLICATION_ERROR(-20000, '@PeriodNotAvailable@');
rafael@5825
   260
        END IF;
rafael@5825
   261
      END IF;  
rafael@5825
   262
  
rafael@5825
   263
        FOR Cur_InOut IN
rafael@5825
   264
          (SELECT *
rafael@5825
   265
          FROM M_INOUT
rafael@5825
   266
          WHERE(M_InOut_ID=v_Record_ID
rafael@5825
   267
            OR(v_Record_ID IS NULL
rafael@5825
   268
            AND DocAction='CO'))
rafael@5825
   269
            AND IsActive='Y'  FOR UPDATE
rafael@5825
   270
          )
rafael@5825
   271
        LOOP
rafael@5825
   272
          DBMS_OUTPUT.PUT_LINE('Shipment_ID=' || Cur_InOut.M_InOut_ID || ', Doc=' || Cur_InOut.DocumentNo || ', Status=' || Cur_InOut.DocStatus || ', Action=' || Cur_InOut.DocAction) ;
rafael@5825
   273
          v_ResultStr:='HeaderLoop';
rafael@5825
   274
          /**
rafael@5825
   275
          * Shipment not processed
rafael@5825
   276
          */
rafael@5825
   277
          IF(Cur_InOut.Processed='N' AND Cur_InOut.DocStatus='DR' AND Cur_InOut.DocAction='CO') THEN
rafael@5825
   278
            -- For all active shipment lines
rafael@5825
   279
            v_ResultStr:='HeaderLoop-1';
rafael@5825
   280
            SELECT COUNT(*) INTO v_Aux
rafael@5825
   281
        FROM M_InOutLine
rafael@5825
   282
        WHERE M_InOut_ID = v_Record_ID;
rafael@5825
   283
        IF v_Aux=0 THEN
rafael@5825
   284
        RAISE_APPLICATION_ERROR(-20000, '@ReceiptWithoutLines@');
rafael@5825
   285
        END IF;
carlos@0
   286
          FOR Cur_InOutLine IN
carlos@0
   287
            (SELECT *
carlos@0
   288
            FROM M_INOUTLINE
carlos@0
   289
            WHERE M_InOut_ID=Cur_InOut.M_InOut_ID
carlos@0
   290
              AND IsActive='Y'  FOR UPDATE
carlos@0
   291
            )
carlos@0
   292
          LOOP
adrian@170
   293
            -- Incomming or Outgoing :1:2
carlos@0
   294
            v_Qty:=Cur_InOutLine.MovementQty;
carlos@0
   295
            v_QuantityOrder:=Cur_InOutLine.QuantityOrder;
carlos@0
   296
            IF(SUBSTR(Cur_InOut.MovementType, 2)='-') THEN
carlos@0
   297
              v_Qty:=- Cur_InOutLine.MovementQty;
carlos@0
   298
              v_QuantityOrder:=-Cur_InOutLine.QuantityOrder;
carlos@0
   299
            END IF;
carlos@0
   300
            IF(Cur_InOut.IsSOTrx='N') THEN
carlos@0
   301
              v_QtySO:=0;
carlos@0
   302
              v_QtyPO:=Cur_InOutLine.MovementQty;
carlos@0
   303
              v_QuantityOrderSO:=0;
carlos@0
   304
              v_QuantityOrderPO:=Cur_InOutLine.QuantityOrder;
carlos@0
   305
            ELSE
carlos@0
   306
              v_QtySO:=Cur_InOutLine.MovementQty;
carlos@0
   307
              v_QtyPO:=0;
carlos@0
   308
              v_QuantityOrderSO:=Cur_InOutLine.QuantityOrder;
carlos@0
   309
              v_QuantityOrderPO:=0;
carlos@0
   310
            END IF;
carlos@0
   311
            -- UOM Conversion
adrian@170
   312
            -- Is it a standard stocked product:3
carlos@0
   313
            SELECT COUNT(*)
carlos@0
   314
            INTO v_IsStocked
carlos@0
   315
            FROM M_PRODUCT
carlos@0
   316
            WHERE M_Product_ID=Cur_InOutLine.M_Product_ID
carlos@0
   317
              AND IsStocked='Y'
carlos@0
   318
              AND ProductType='I';
carlos@0
   319
            -- Create Transaction for stocked product
carlos@0
   320
            IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND v_IsStocked=1) THEN
carlos@0
   321
              v_ResultStr:='CreateTransaction';
carlos@0
   322
              Ad_Sequence_Next('M_Transaction', Cur_InOutLine.AD_Org_ID, v_NextNo) ;
carlos@0
   323
              INSERT
carlos@0
   324
              INTO M_TRANSACTION
carlos@0
   325
                (
carlos@0
   326
                  M_Transaction_ID, M_InOutLine_ID, AD_Client_ID, AD_Org_ID,
carlos@0
   327
                  IsActive, Created, CreatedBy, Updated,
carlos@0
   328
                  UpdatedBy, MovementType, M_Locator_ID, M_Product_ID,
carlos@0
   329
                  M_AttributeSetInstance_ID, MovementDate, MovementQty, M_Product_UOM_ID,
carlos@0
   330
                  QuantityOrder, C_UOM_ID
carlos@0
   331
                )
carlos@0
   332
                VALUES
carlos@0
   333
                (
carlos@0
   334
                  v_NextNo, Cur_InOutLine.M_InOutLine_ID, Cur_InOutLine.AD_Client_ID, Cur_InOutLine.AD_Org_ID,
harikrishnan@7227
   335
                   'Y', now(), v_User, now(),
harikrishnan@7227
   336
                  v_User, Cur_InOut.MovementType, Cur_InOutLine.M_Locator_ID, Cur_InOutLine.M_Product_ID,
juanpablo@1605
   337
                  COALESCE(Cur_InOutLine.M_AttributeSetInstance_ID, '0'), Cur_InOut.MovementDate, v_Qty, Cur_InOutLine.M_Product_UOM_ID,
carlos@0
   338
                  v_QuantityOrder, Cur_InOutLine.C_UOM_ID
carlos@0
   339
                )
carlos@0
   340
                ;
carlos@0
   341
            END IF;
carlos@0
   342
            -- Create Asset
carlos@0
   343
            IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND Cur_InOut.IsSOTrx='Y') THEN
antonio@735
   344
              A_ASSET_CREATE(NULL, Cur_InOutLine.M_InOutLine_ID) ;
carlos@0
   345
            END IF;
carlos@0
   346
            v_ResultStr:='UpdateOrderLine';
carlos@0
   347
            IF(Cur_InOutLine.C_OrderLine_ID IS NOT NULL) THEN
carlos@0
   348
              -- stocked product
carlos@0
   349
              IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND v_IsStocked=1) THEN
carlos@0
   350
                -- Update OrderLine (if C-, Qty is negative)
carlos@0
   351
                UPDATE C_ORDERLINE
carlos@0
   352
                  SET QtyReserved=QtyReserved - v_QtyPO - v_QtySO,
carlos@0
   353
                  QtyDelivered=QtyDelivered + v_QtySO,
harikrishnan@7227
   354
                  Updated=now(),
harikrishnan@7227
   355
                  UpdatedBy=v_User
carlos@0
   356
                WHERE C_OrderLine_ID=Cur_InOutLine.C_OrderLine_ID;
carlos@0
   357
                -- Products not stocked
carlos@0
   358
              ELSE
carlos@0
   359
                -- Update OrderLine (if C-, Qty is negative)
carlos@0
   360
                UPDATE C_ORDERLINE
carlos@0
   361
                  SET QtyDelivered=QtyDelivered + v_QtySO,
harikrishnan@7227
   362
                  Updated=now(),
harikrishnan@7227
   363
                  UpdatedBy=v_User
carlos@0
   364
                WHERE C_OrderLine_ID=Cur_InOutLine.C_OrderLine_ID;
carlos@0
   365
              END IF;
carlos@0
   366
            END IF;
carlos@0
   367
            IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND v_IsStocked=1) THEN
carlos@0
   368
              M_Check_Stock(Cur_InOutLine.M_Product_ID, v_AD_Client_ID, v_AD_Org_ID, v_Result, v_Message) ;
carlos@0
   369
              IF v_Result=0 THEN
carlos@0
   370
			    RAISE_APPLICATION_ERROR(-20000, v_Message||' '||'@line@'||' '||Cur_InOutLine.line) ;
carlos@0
   371
              END IF;
carlos@0
   372
            END IF;
carlos@0
   373
          END LOOP; -- For all InOut Lines
carlos@0
   374
          /*******************
carlos@0
   375
          * PO Matching
carlos@0
   376
          ******************/
carlos@0
   377
          IF(Cur_InOut.IsSOTrx='N') THEN
carlos@0
   378
            DECLARE
carlos@0
   379
              Cur_SLines RECORD;
carlos@0
   380
              Cur_ILines RECORD;
carlos@0
   381
              v_Qty NUMBER;
juanpablo@1605
   382
              v_MatchPO_ID VARCHAR2(32) ;
juanpablo@1605
   383
              v_MatchInv_ID VARCHAR2(32) ;
carlos@0
   384
            BEGIN
carlos@0
   385
              v_ResultStr:='MatchPO';
carlos@0
   386
              FOR Cur_SLines IN
carlos@0
   387
                (SELECT sl.AD_Client_ID,
carlos@0
   388
                  sl.AD_Org_ID,
carlos@0
   389
                  ol.C_OrderLine_ID,
carlos@0
   390
                  sl.M_InOutLine_ID,
carlos@0
   391
                  sl.M_Product_ID,
carlos@0
   392
                  sl.M_AttributeSetInstance_ID,
carlos@0
   393
                  sl.MovementQty,
carlos@0
   394
                  ol.QtyOrdered
carlos@0
   395
                FROM M_INOUTLINE sl,
carlos@0
   396
                  C_ORDERLINE ol
carlos@0
   397
                WHERE sl.C_OrderLine_ID=ol.C_OrderLine_ID
carlos@0
   398
                  AND sl.M_Product_ID=ol.M_Product_ID  --    AND   sl.M_AttributeSetInstance_ID=ol.M_AttributeSetInstance_ID
carlos@0
   399
                  AND sl.M_InOut_ID=Cur_InOut.M_InOut_ID
carlos@0
   400
                )
carlos@0
   401
              LOOP
carlos@0
   402
                Ad_Sequence_Next('M_MatchPO', Cur_SLines.AD_Org_ID, v_MatchPO_ID) ;
carlos@0
   403
                -- The min qty. Modified by Ismael Ciordia
carlos@0
   404
                v_Qty:=Cur_SLines.MovementQty;
gorkaion@239
   405
                --IF (ABS(Cur_SLines.MovementQty) > ABS(Cur_SLines.QtyOrdered)) THEN
carlos@0
   406
                -- v_Qty := Cur_SLines.QtyOrdered;
carlos@0
   407
                --END IF;
carlos@0
   408
                v_ResultStr:='InsertMatchPO ' || v_MatchPO_ID;
carlos@0
   409
                INSERT
carlos@0
   410
                INTO M_MATCHPO
carlos@0
   411
                  (
carlos@0
   412
                    M_MatchPO_ID, AD_Client_ID, AD_Org_ID, IsActive,
carlos@0
   413
                    Created, CreatedBy, Updated, UpdatedBy,
carlos@0
   414
                    M_InOutLine_ID, C_OrderLine_ID, M_Product_ID, DateTrx,
carlos@0
   415
                    Qty, Processing, Processed, Posted
carlos@0
   416
                  )
carlos@0
   417
                  VALUES
carlos@0
   418
                  (
carlos@0
   419
                    v_MatchPO_ID, Cur_SLines.AD_Client_ID, Cur_SLines.AD_Org_ID, 'Y',
harikrishnan@7227
   420
                    now(), v_User, now(), v_User,
carlos@0
   421
                    Cur_SLines.M_InOutLine_ID, Cur_SLines.C_OrderLine_ID, Cur_SLines.M_Product_ID, now(),
carlos@0
   422
                    v_Qty, 'N', 'Y', 'N'
carlos@0
   423
                  )
carlos@0
   424
                  ;
carlos@0
   425
              END LOOP;
carlos@0
   426
              v_ResultStr:='MatchInv';
carlos@0
   427
              FOR Cur_ILines IN
carlos@0
   428
                (SELECT sl.AD_Client_ID,
carlos@0
   429
                  sl.AD_Org_ID,
carlos@0
   430
                  il.C_InvoiceLine_ID,
carlos@0
   431
                  sl.M_InOutLine_ID,
carlos@0
   432
                  sl.M_Product_ID,
carlos@0
   433
                  sl.M_AttributeSetInstance_ID,
carlos@0
   434
                  sl.MovementQty,
david@7233
   435
                  il.QTYINVOICED,
david@7233
   436
                  i.DateAcct
carlos@0
   437
                FROM M_INOUTLINE sl,
david@7233
   438
                  C_INVOICE i,
carlos@0
   439
                  C_INVOICELINE il
carlos@0
   440
                WHERE sl.M_InOutLine_ID=il.M_InOutLine_ID
carlos@0
   441
                  AND sl.M_InOut_ID=Cur_InOut.M_InOut_ID
david@7233
   442
                  AND i.C_INVOICE_ID = il.C_INVOICE_ID
carlos@0
   443
                )
carlos@0
   444
              LOOP
carlos@0
   445
                Ad_Sequence_Next('M_MatchInv', Cur_ILines.AD_Org_ID, v_MatchInv_ID) ;
carlos@0
   446
                -- The min qty. Modified by Ismael Ciordia
carlos@0
   447
                v_Qty:=Cur_ILines.MovementQty;
gorkaion@239
   448
                --IF (ABS(Cur_ILines.MovementQty) > ABS(Cur_ILines.QtyInvoiced)) THEN
carlos@0
   449
                -- v_Qty := Cur_ILines.QtyInvoiced;
carlos@0
   450
                --END IF;
carlos@0
   451
                v_ResultStr:='InsertMatchPO ' || v_MatchPO_ID;
carlos@0
   452
                INSERT
carlos@0
   453
                INTO M_MATCHINV
carlos@0
   454
                  (
carlos@0
   455
                    M_MATCHINV_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
carlos@0
   456
                    CREATED, CREATEDBY, UPDATED, UPDATEDBY,
carlos@0
   457
                    M_INOUTLINE_ID, C_INVOICELINE_ID, M_PRODUCT_ID, DATETRX,
carlos@0
   458
                    QTY, PROCESSING, PROCESSED, POSTED
carlos@0
   459
                  )
carlos@0
   460
                  VALUES
carlos@0
   461
                  (
carlos@0
   462
                    v_MatchInv_ID, Cur_ILines.AD_Client_ID, Cur_ILines.AD_Org_ID, 'Y',
harikrishnan@7227
   463
                    now(), v_User, now(), v_User,
david@7233
   464
                    Cur_ILines.M_InOutLine_ID, Cur_ILines.C_InvoiceLine_ID, Cur_ILines.M_Product_ID, Cur_ILines.DateAcct,
carlos@0
   465
                    v_Qty, 'N', 'Y', 'N'
carlos@0
   466
                  )
carlos@0
   467
                  ;
carlos@0
   468
              END LOOP;
carlos@0
   469
            END;
gorkaion@3170
   470
          ELSE
gorkaion@3170
   471
            v_ResultStr:='Check delivery rule for sales orders';
gorkaion@3170
   472
            v_Message:='';
gorkaion@3170
   473
            v_orderid_old:='0';
gorkaion@3170
   474
            FOR Cur_Order IN 
gorkaion@3170
   475
              (SELECT c_order.deliveryrule, m_inoutline.line, c_order.c_order_id,
gorkaion@3170
   476
                      c_order.documentno, c_orderline.line as orderline
gorkaion@3170
   477
               FROM M_InOutLine, C_Orderline, C_Order
gorkaion@3170
   478
               WHERE M_Inoutline.c_orderline_id = c_orderline.c_orderline_id
gorkaion@3170
   479
                 AND c_orderline.c_order_id = c_order.c_order_id
gorkaion@3170
   480
                 AND m_inoutline.m_inout_id = cur_inout.m_inout_id
gorkaion@3170
   481
                 AND ((c_order.deliveryrule = 'O'
gorkaion@3170
   482
                      AND EXISTS (SELECT 1 FROM C_OrderLine ol
gorkaion@3170
   483
                                  WHERE ol.C_Order_ID = C_order.c_order_id
gorkaion@3170
   484
                                    and ol.qtyordered > ol.qtydelivered ))
gorkaion@3170
   485
                      OR (c_order.deliveryrule = 'L' 
gorkaion@3170
   486
                          AND c_orderline.qtyordered > c_orderline.qtydelivered))
gorkaion@3170
   487
               ORDER BY c_order.c_order_id, c_orderline.line) LOOP
gorkaion@3170
   488
              --Order lines not completely delivered with delivery rule O or L
gorkaion@3170
   489
              IF (v_orderid_old <> cur_order.c_order_id OR cur_order.deliveryrule <> 'O' ) THEN
gorkaion@3170
   490
                v_Message := COALESCE(v_Message,'') || '@Shipment@' || ' ' || cur_inout.documentno;
gorkaion@3170
   491
                v_Message := v_Message || ' ' || '@line@' || ' ' || cur_order.line || ': ';
gorkaion@3170
   492
                v_Message := v_Message || '@SalesOrderDocumentno@' || cur_order.documentno;
gorkaion@3170
   493
                IF (cur_order.deliveryrule = 'O') THEN
gorkaion@3170
   494
                  v_Message := v_Message || ' ' || '@notCompleteDeliveryRuleOrder@' || '<br>';
gorkaion@3170
   495
                ELSE
gorkaion@3170
   496
                  v_Message := v_Message || ' ' || '@line@' || ' ' || cur_order.orderline;
gorkaion@3170
   497
                  v_Message := v_Message || ' ' || '@notCompleteDeliveryRuleLine@' || '<br>';
gorkaion@3170
   498
                END IF;
gorkaion@3170
   499
              END IF;
gorkaion@3170
   500
              v_orderid_old := cur_order.c_order_id;
gorkaion@3170
   501
            END LOOP;
rafael@3205
   502
            IF (v_Message IS NOT NULL AND v_Message <> '') THEN
gorkaion@3170
   503
              RAISE_APPLICATION_ERROR(-20000, v_message);
gorkaion@3170
   504
            END IF;
carlos@0
   505
          END IF;
carlos@0
   506
          -- Close Shipment
harikrishnan@7945
   507
          --Entry in Match Invoices
harikrishnan@7945
   508
          FOR Cur_MILines IN
harikrishnan@7945
   509
                (SELECT sl.AD_Client_ID,
harikrishnan@7945
   510
                  sl.AD_Org_ID,
harikrishnan@7945
   511
                  il.C_InvoiceLine_ID,
harikrishnan@7945
   512
                  sl.M_InOutLine_ID,
harikrishnan@7945
   513
                  sl.M_Product_ID,
harikrishnan@7945
   514
                  sl.M_AttributeSetInstance_ID,
harikrishnan@7945
   515
                  sl.MovementQty,
harikrishnan@7945
   516
                  il.QTYINVOICED,
harikrishnan@7945
   517
                  i.DateAcct
harikrishnan@7945
   518
                FROM M_INOUTLINE sl,
harikrishnan@7945
   519
                  C_INVOICE i,
harikrishnan@7945
   520
                  C_INVOICELINE il
harikrishnan@7945
   521
                WHERE sl.M_InOutLine_ID=il.M_InOutLine_ID
harikrishnan@7945
   522
                  AND sl.M_InOut_ID=Cur_InOut.M_InOut_ID
harikrishnan@7945
   523
                  AND i.C_INVOICE_ID = il.C_INVOICE_ID
harikrishnan@7945
   524
                )
harikrishnan@7945
   525
              LOOP
harikrishnan@7945
   526
                --Ad_Sequence_Next('M_MatchInv', Cur_MILines.AD_Org_ID, v_MatchInv_ID) ;
harikrishnan@7945
   527
                -- The min qty. Modified by Ismael Ciordia
harikrishnan@7945
   528
                v_Qty:=Cur_MILines.MovementQty;
harikrishnan@7945
   529
              --  v_ResultStr:='InsertMatchPO ' || v_MatchPO_ID;
harikrishnan@7945
   530
                INSERT
harikrishnan@7945
   531
                INTO M_MATCHINV
harikrishnan@7945
   532
                  (
harikrishnan@7945
   533
                    M_MATCHINV_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
harikrishnan@7945
   534
                    CREATED, CREATEDBY, UPDATED, UPDATEDBY,
harikrishnan@7945
   535
                    M_INOUTLINE_ID, C_INVOICELINE_ID, M_PRODUCT_ID, DATETRX,
harikrishnan@7945
   536
                    QTY, PROCESSING, PROCESSED, POSTED
harikrishnan@7945
   537
                  )
harikrishnan@7945
   538
                  VALUES
harikrishnan@7945
   539
                  (
harikrishnan@7945
   540
                    GET_UUID(), Cur_MILines.AD_Client_ID, Cur_MILines.AD_Org_ID, 'Y',
harikrishnan@7945
   541
                    now(), v_User, now(), v_User,
harikrishnan@7945
   542
                    Cur_MILines.M_InOutLine_ID, Cur_MILines.C_InvoiceLine_ID, Cur_MILines.M_Product_ID, Cur_MILines.DateAcct,
harikrishnan@7945
   543
                    v_Qty, 'N', 'Y', 'N'
harikrishnan@7945
   544
                  )
harikrishnan@7945
   545
                  ;
harikrishnan@7945
   546
              END LOOP;
carlos@0
   547
          v_ResultStr:='CloseShipment';
carlos@0
   548
          UPDATE M_INOUT
carlos@0
   549
            SET Processed='Y',
carlos@0
   550
            DocStatus='CO',
carlos@0
   551
            DocAction='--',
harikrishnan@7227
   552
            Updated=now(),
harikrishnan@7227
   553
            UpdatedBy=v_User
carlos@0
   554
          WHERE M_INOUT.M_INOUT_ID=Cur_InOut.M_INOUT_ID;
carlos@0
   555
          --
asier@1027
   556
          
asier@1027
   557
         
carlos@0
   558
          -- Not Processed + Complete --
carlos@0
   559
          /**
carlos@0
   560
          * Reverse Correction
carlos@0
   561
          */
carlos@0
   562
        ELSIF(Cur_InOut.DocStatus='CO' AND Cur_InOut.DocAction='RC') THEN
gorkaion@5377
   563
          --Check that there isn't any line with an invoice if the order's 
gorkaion@5377
   564
          --invoice rule is after delivery
gorkaion@5377
   565
          select count(*), max(line) into v_count, v_line
gorkaion@5377
   566
          from (
gorkaion@5377
   567
          SELECT m_inoutline.m_inoutline_id, m_inoutline.line
gorkaion@5377
   568
          from m_inoutline, c_order, c_orderline, c_invoiceline, m_inout, c_invoice
gorkaion@5377
   569
          where m_inoutline.c_orderline_id = c_orderline.c_orderline_id
gorkaion@5377
   570
            and c_orderline.c_order_id = c_order.c_order_id
gorkaion@5377
   571
            and c_orderline.c_orderline_id = c_invoiceline.c_orderline_id
gorkaion@5377
   572
            and m_inoutline.m_inout_id = m_inout.m_inout_id
gorkaion@5377
   573
            and c_invoiceline.c_invoice_id = c_invoice.c_invoice_id
gorkaion@5377
   574
            and m_inout.m_inout_id = Cur_InOut.m_inout_id
gorkaion@5377
   575
            and m_inout.issotrx = 'Y'
gorkaion@5377
   576
            and c_order.invoicerule in ('D', 'O', 'S')
gorkaion@5377
   577
            and c_invoice.processed='Y'
gorkaion@5377
   578
          group by m_inoutline.m_inoutline_id, m_inoutline.line
rafael@5506
   579
          having sum(c_invoiceline.qtyinvoiced) <> 0
gorkaion@5377
   580
          ) a;
gorkaion@5377
   581
          IF (v_count > 0 ) THEN
gorkaion@5377
   582
            v_Message := '@InoutDocumentno@' || ': ' || Cur_InOut.DocumentNo || ' ' || '@line@' || ': ' || v_line || '. ';
gorkaion@5377
   583
            v_Message := v_Message || '@VoidShipmentInvoiced@';
gorkaion@5377
   584
            RAISE_APPLICATION_ERROR(-20000, v_Message);
gorkaion@5377
   585
          END IF;
carlos@0
   586
          v_ResultStr:='CreateInOut';
carlos@0
   587
          SELECT COALESCE(C_DOCTYPE_REVERSED_ID, C_DOCTYPE_ID)
carlos@0
   588
          INTO v_DoctypeReversed_ID
carlos@0
   589
          FROM C_DOCTYPE
carlos@0
   590
          WHERE C_DOCTYPE_ID=Cur_InOut.C_DocType_ID;
carlos@0
   591
          Ad_Sequence_Next('M_InOut', Cur_InOut.M_InOut_ID, v_RInOut_ID) ; -- Get RInOut_ID
carlos@0
   592
          Ad_Sequence_Doctype(v_DoctypeReversed_ID, Cur_InOut.M_InOut_ID, 'Y', v_RDocumentNo) ; -- Get RDocumentNo
carlos@0
   593
          IF(v_RDocumentNo IS NULL) THEN
carlos@0
   594
            AD_Sequence_Doc('DocumentNo_M_InOut', Cur_InOut.AD_Client_ID, 'Y', v_RDocumentNo) ;
carlos@0
   595
          END IF;
carlos@0
   596
          -- Indicate that it is invoiced (i.e. not printed on invoices)
carlos@0
   597
          v_ResultStr:='SetInvoiced';
harikrishnan@7227
   598
          UPDATE M_INOUTLINE  SET IsInvoiced='Y',Updated=now(),UpdatedBy=v_User  WHERE M_InOut_ID=Cur_InOut.M_InOut_ID;
carlos@0
   599
          --
carlos@0
   600
          DBMS_OUTPUT.PUT_LINE('Reverse InOut_ID=' || v_RInOut_ID || ' DocumentNo=' || v_RDocumentNo) ;
carlos@0
   601
          v_ResultStr:='InsertInOut Reverse ' || v_RInOut_ID;
carlos@0
   602
          INSERT
carlos@0
   603
          INTO M_INOUT
carlos@0
   604
            (
carlos@0
   605
              M_InOut_ID, C_Order_ID, IsSOTrx, AD_Client_ID,
carlos@0
   606
              AD_Org_ID, IsActive, Created, CreatedBy,
carlos@0
   607
              Updated, UpdatedBy, DocumentNo, C_DocType_ID,
carlos@0
   608
              Description, IsPrinted, MovementType, MovementDate,
carlos@0
   609
              DateAcct, C_BPartner_ID, C_BPartner_Location_ID, AD_User_ID,
carlos@0
   610
              M_Warehouse_ID, POReference, DateOrdered, DeliveryRule,
carlos@0
   611
              FreightCostRule, FreightAmt, C_Project_ID, C_Activity_ID,
carlos@0
   612
              C_Campaign_ID, AD_OrgTrx_ID, User1_ID, User2_ID,
carlos@0
   613
              DeliveryViaRule, M_Shipper_ID, C_Charge_ID, ChargeAmt,
carlos@0
   614
              PriorityRule, DocStatus, DocAction, Processing,
carlos@0
   615
              Processed, ISLOGISTIC, salesrep_id
carlos@0
   616
            )
carlos@0
   617
            VALUES
carlos@0
   618
            (
carlos@0
   619
              v_RInOut_ID, Cur_InOut.C_Order_ID, Cur_InOut.IsSOTrx, Cur_InOut.AD_Client_ID,
harikrishnan@7227
   620
              Cur_InOut.AD_Org_ID, 'Y', now(), v_User,
harikrishnan@7227
   621
              now(), v_User, v_RDocumentNo, v_DoctypeReversed_ID,
carlos@0
   622
               '(*R*: ' || Cur_InOut.DocumentNo || ') ' || Cur_InOut.Description, 'N', Cur_InOut.MovementType, Cur_InOut.MovementDate,
carlos@0
   623
              Cur_InOut.DateAcct, Cur_InOut.C_BPartner_ID, Cur_InOut.C_BPartner_Location_ID, Cur_InOut.AD_User_ID,
carlos@0
   624
              Cur_InOut.M_Warehouse_ID, Cur_InOut.POReference, Cur_InOut.DateOrdered, Cur_InOut.DeliveryRule,
carlos@0
   625
              Cur_InOut.FreightCostRule, Cur_InOut.FreightAmt * -1, Cur_InOut.C_Project_ID, Cur_InOut.C_Activity_ID,
carlos@0
   626
              Cur_InOut.C_Campaign_ID, Cur_InOut.AD_OrgTrx_ID, Cur_InOut.User1_ID, Cur_InOut.User2_ID,
carlos@0
   627
              Cur_InOut.DeliveryViaRule, Cur_InOut.M_Shipper_ID, Cur_InOut.C_Charge_ID, Cur_InOut.ChargeAmt * -1,
carlos@0
   628
              Cur_InOut.PriorityRule, 'DR', 'CO', 'N',
carlos@0
   629
               'N', Cur_InOut.islogistic, Cur_InOut.salesrep_id
carlos@0
   630
            )
carlos@0
   631
            ;
carlos@0
   632
          v_ResultStr:='InsertInOutLine';
carlos@0
   633
          FOR Cur_InOutLine IN
carlos@0
   634
            (SELECT *
carlos@0
   635
            FROM M_INOUTLINE
carlos@0
   636
            WHERE M_InOut_ID=Cur_InOut.M_InOut_ID
carlos@0
   637
              AND IsActive='Y'  FOR UPDATE
carlos@0
   638
            )
carlos@0
   639
          LOOP
carlos@0
   640
            -- Create InOut Line
carlos@0
   641
            Ad_Sequence_Next('M_InOutLine', Cur_InOut.M_InOut_ID, v_NextNo) ;
carlos@0
   642
            v_ResultStr:='CreateInOutLine';
carlos@0
   643
            INSERT
carlos@0
   644
            INTO M_INOUTLINE
carlos@0
   645
              (
carlos@0
   646
                M_InOutLine_ID, Line, M_InOut_ID, C_OrderLine_ID,
carlos@0
   647
                AD_Client_ID, AD_Org_ID, IsActive, Created,
carlos@0
   648
                CreatedBy, Updated, UpdatedBy, M_Product_ID,
carlos@0
   649
                M_AttributeSetInstance_ID, C_UOM_ID, M_Locator_ID, MovementQty,
asier@799
   650
                Description, IsInvoiced,  --MODIFIED BY F.IRIAZABAL
carlos@0
   651
                QuantityOrder, M_Product_UOM_ID
carlos@0
   652
              )
carlos@0
   653
              VALUES
carlos@0
   654
              (
carlos@0
   655
                v_NextNo, Cur_InOutLine.Line, v_RInOut_ID, Cur_InOutLine.C_OrderLine_ID,
carlos@0
   656
                Cur_InOut.AD_Client_ID, Cur_InOut.AD_Org_ID, 'Y', now(),
harikrishnan@7227
   657
                v_User, now(), v_User, Cur_InOutLine.M_Product_ID,
carlos@0
   658
                Cur_InOutLine.M_AttributeSetInstance_ID, Cur_InOutLine.C_UOM_ID, Cur_InOutLine.M_Locator_ID, Cur_InOutLine.MovementQty * -1,
asier@799
   659
                 '*R*: ' || Cur_InOutLine.Description, Cur_InOutLine.IsInvoiced, --MODIFIED BY F.IRIAZABAL
carlos@0
   660
                Cur_InOutLine.QuantityOrder * -1, Cur_InOutLine.M_PRODUCT_UOM_ID
carlos@0
   661
              )
carlos@0
   662
              ;
david@7235
   663
            INSERT INTO M_MATCHINV
david@7235
   664
              (M_MATCHINV_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY,
david@7235
   665
              M_INOUTLINE_ID, C_INVOICELINE_ID, M_PRODUCT_ID, DATETRX, QTY, PROCESSING, PROCESSED, POSTED)
david@7235
   666
            SELECT
david@7235
   667
              GET_UUID(), MI.AD_CLIENT_ID, MI.AD_ORG_ID, MI.ISACTIVE, now(), '0', now(), '0',
david@7240
   668
              v_NextNo, MI.C_INVOICELINE_ID, MI.M_PRODUCT_ID, MI.DATETRX, -MI.QTY, 'N', 'Y', 'N'
david@7235
   669
            FROM M_MATCHINV MI
david@7235
   670
            WHERE MI.M_INOUTLINE_ID = Cur_InOutLine.M_InOutLine_ID;
carlos@0
   671
          END LOOP;
carlos@0
   672
          -- Close Order
carlos@0
   673
          v_ResultStr:='CloseInOut';
carlos@0
   674
          UPDATE M_INOUT
carlos@0
   675
            SET Description=COALESCE(TO_CHAR(Description), '') || ' (*R*=' || v_RDocumentNo || ')',
carlos@0
   676
            Processed='Y',
ainhoa@2454
   677
            DocStatus='VO', -- it IS reversed
carlos@0
   678
            DocAction='--',
carlos@0
   679
            Updated=now(),
carlos@0
   680
            UpdatedBy=v_User
carlos@0
   681
          WHERE M_INOUT.M_INOUT_ID=Cur_InOut.M_INOUT_ID;
asier@1027
   682
         
carlos@0
   683
          -- Post Reversal
carlos@0
   684
          v_ResultStr:='PostReversal';
antonio@735
   685
          M_INOUT_POST(NULL, v_RInOut_ID) ;
carlos@0
   686
          -- Indicate as Reversal Transaction
carlos@0
   687
          v_ResultStr:='IndicateReversal';
carlos@0
   688
          UPDATE M_INOUT
carlos@0
   689
            SET Updated=now(),
carlos@0
   690
            UpdatedBy=v_User,
ainhoa@2454
   691
            DocStatus='VO' -- the reversal transaction
carlos@0
   692
          WHERE M_InOut_ID=v_RInOut_ID;
carlos@0
   693
        END IF; -- ReverseCorrection
adrianromero@7702
   694
adrianromero@7702
   695
        --M_Inout_Post - Finish_Process Extension Point
adrianromero@7702
   696
        --Extension point at the end of the M_Inout_Post. It has 5 available parameters Record_ID, DocAction, User, Message and Result
adrianromero@7702
   697
        SELECT count(*) INTO v_count
adrianromero@7702
   698
        FROM DUAL
adrianromero@7702
   699
        where exists (select 1 from ad_ep_procedures where ad_extension_points_id = '5A7C6972321E42C2A5A8E9D6D73E6A7C');
adrianromero@7702
   700
        IF (v_count=1) THEN
adrianromero@7702
   701
          DECLARE
adrianromero@7702
   702
            v_ep_instance VARCHAR2(32);
adrianromero@7702
   703
            v_extension_point_id VARCHAR2(32) := '5A7C6972321E42C2A5A8E9D6D73E6A7C';
adrianromero@7702
   704
          BEGIN
adrianromero@7702
   705
            v_ep_instance := get_uuid();
adrianromero@7702
   706
            AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'Record_ID',
adrianromero@7702
   707
              v_record_id, NULL, NULL, NULL, NULL, NULL, NULL);
adrianromero@7702
   708
            AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'DocAction',
adrianromero@7702
   709
              Cur_InOut.DocAction, NULL, NULL, NULL, NULL, NULL, NULL);
adrianromero@7702
   710
            AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'User',
adrianromero@7702
   711
              v_User, NULL, NULL, NULL, NULL, NULL, NULL);
adrianromero@7702
   712
            AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'Message',
adrianromero@7702
   713
              NULL, NULL, NULL, NULL, NULL, NULL, v_Message);
adrianromero@7702
   714
            AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'Result',
adrianromero@7702
   715
              NULL, NULL, v_Result, NULL, NULL, NULL, NULL);
adrianromero@7702
   716
            AD_EXTENSION_POINT_HANDLER(v_ep_instance, v_extension_point_id);
adrianromero@7702
   717
            SELECT p_number INTO v_Result
adrianromero@7702
   718
            FROM ad_ep_instance_para
adrianromero@7702
   719
            WHERE ad_ep_instance_id = v_ep_instance
adrianromero@7702
   720
              AND parametername LIKE 'Result';
adrianromero@7702
   721
            SELECT p_text INTO v_Message
adrianromero@7702
   722
            FROM ad_ep_instance_para
adrianromero@7702
   723
            WHERE ad_ep_instance_id = v_ep_instance
adrianromero@7702
   724
              AND parametername LIKE 'Message';
adrianromero@7702
   725
adrianromero@7702
   726
            DELETE FROM ad_ep_instance_para
adrianromero@7702
   727
            WHERE ad_ep_instance_id = v_ep_instance;
adrianromero@7702
   728
          END;
adrianromero@7702
   729
        END IF;
adrianromero@7702
   730
carlos@0
   731
      END LOOP; -- InOut Header
carlos@0
   732
      /**
carlos@0
   733
      * Transaction End
carlos@0
   734
      */
carlos@0
   735
      v_ResultStr:='Fini';
carlos@0
   736
    END IF; --FINISH_PROCESS
gorkaion@239
   737
    --<<FINISH_PROCESS>>
carlos@0
   738
    IF(p_PInstance_ID IS NOT NULL) THEN
carlos@0
   739
      --  Update AD_PInstance
carlos@0
   740
      DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message) ;
carlos@0
   741
      AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'N', v_Result, v_Message) ;
carlos@0
   742
    ELSE
gorkaion@239
   743
      DBMS_OUTPUT.PUT_LINE('--<<M_InOut_Post finished>>') ;
carlos@0
   744
    END IF;
carlos@0
   745
    RETURN;
carlos@0
   746
  END; --BODY
carlos@0
   747
EXCEPTION
carlos@0
   748
WHEN OTHERS THEN
carlos@0
   749
  v_ResultStr:= '@ERROR=' || SQLERRM;
carlos@0
   750
  DBMS_OUTPUT.PUT_LINE(v_ResultStr) ;
carlos@0
   751
  IF(p_PInstance_ID IS NOT NULL) THEN
carlos@0
   752
    ROLLBACK;
carlos@0
   753
    AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'N', 0, v_ResultStr) ;
carlos@0
   754
  ELSE
carlos@0
   755
    RAISE;
carlos@0
   756
  END IF;
carlos@0
   757
  RETURN;
antonio@735
   758
END M_INOUT_POST
juanpablo@3490
   759
]]></body>
juanpablo@3490
   760
    </function>
juanpablo@3490
   761
  </database>