src-db/database/model/functions/M_INOUT_POST.xml
author Asier Lostalé <asier.lostale@openbravo.com>
Wed, 12 Nov 2008 13:14:11 +0000
changeset 1929 ad0353d93b0f
parent 1605 8a0fe0193bef
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 M_INOUT_POST">
adrian@94
     3
    <function name="M_INOUT_POST" type="NULL">
juanpablo@1605
     4
      <parameter name="p_pinstance_id" type="VARCHAR" mode="in">
antonio@735
     5
        <default/>
antonio@735
     6
      </parameter>
juanpablo@1605
     7
      <parameter name="p_inout_id" type="VARCHAR" mode="in">
antonio@735
     8
        <default/>
antonio@735
     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.
carlos@0
    24
  * Contributor(s): Openbravo SL
juanpablo@785
    25
  * Contributions are Copyright (C) 2001-2008 Openbravo, S.L.
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);
asier@1929
    50
  v_is_included NUMBER:=0;
asier@1929
    51
  v_DocType_ID VARCHAR2(32);
asier@1929
    52
  v_available_period NUMBER:=0;
asier@1929
    53
  v_is_ready AD_Org.IsReady%TYPE;
asier@1929
    54
  v_is_tr_allow AD_OrgType.IsTransactionsAllowed%TYPE;
asier@1929
    55
  v_DateAcct DATE;
carlos@0
    56
  -- Parameter
carlos@0
    57
  TYPE RECORD IS REF CURSOR;
carlos@0
    58
    Cur_Parameter RECORD;
carlos@0
    59
    --
carlos@0
    60
    Cur_InOut RECORD;
carlos@0
    61
    Cur_InOutLine RECORD;
carlos@0
    62
    --
carlos@0
    63
    v_Result NUMBER:=1;
juanpablo@1605
    64
    v_AD_Org_ID VARCHAR2(32);
juanpablo@1605
    65
    v_AD_Client_ID VARCHAR2(32);
juanpablo@1605
    66
    v_NextNo VARCHAR2(32);
carlos@0
    67
    v_Qty NUMBER;
carlos@0
    68
    v_QtyPO NUMBER;
carlos@0
    69
    v_QtySO NUMBER;
carlos@0
    70
    v_QuantityOrder NUMBER;
carlos@0
    71
    v_QuantityOrderPO NUMBER;
carlos@0
    72
    v_QuantityOrderSO NUMBER;
carlos@0
    73
    v_RDocumentNo VARCHAR2(40) ;
juanpablo@1605
    74
    v_RInOut_ID VARCHAR2(32);
carlos@0
    75
    v_IsStocked NUMBER;
juanpablo@1605
    76
    v_DoctypeReversed_ID VARCHAR2(32);
carlos@0
    77
    --MODIFIED BY F.IRIAZABAL
carlos@0
    78
    v_QtyOrder NUMBER;
carlos@0
    79
    v_ProductUOM NUMBER;
carlos@0
    80
    v_BreakDown CHAR(1) ;
carlos@0
    81
    v_ActualQty NUMBER;
carlos@0
    82
    v_QtyAux NUMBER;
carlos@0
    83
    v_Count NUMBER:=0;
carlos@0
    84
    v_Line VARCHAR2(10) ;
carlos@0
    85
    FINISH_PROCESS BOOLEAN:=false;
carlos@0
    86
  BEGIN
carlos@0
    87
    IF(p_PInstance_ID IS NOT NULL) THEN
carlos@0
    88
      --  Update AD_PInstance
carlos@0
    89
      DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID) ;
carlos@0
    90
      v_ResultStr:='PInstanceNotFound';
carlos@0
    91
      AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'Y', NULL, NULL) ;
carlos@0
    92
      -- Get Parameters
carlos@0
    93
      v_ResultStr:='ReadingParameters';
carlos@0
    94
      FOR Cur_Parameter IN
carlos@0
    95
        (SELECT i.Record_ID,
carlos@0
    96
          i.AD_User_ID,
carlos@0
    97
          p.ParameterName,
carlos@0
    98
          p.P_String,
carlos@0
    99
          p.P_Number,
carlos@0
   100
          p.P_Date
carlos@0
   101
        FROM AD_PInstance i
carlos@0
   102
        LEFT JOIN AD_PInstance_Para p
carlos@0
   103
          ON i.AD_PInstance_ID=p.AD_PInstance_ID
carlos@0
   104
        WHERE i.AD_PInstance_ID=p_PInstance_ID
carlos@0
   105
        ORDER BY p.SeqNo
carlos@0
   106
        )
carlos@0
   107
      LOOP
carlos@0
   108
        v_Record_ID:=Cur_Parameter.Record_ID;
carlos@0
   109
        v_User:=Cur_Parameter.AD_User_ID;
carlos@0
   110
      END LOOP; -- Get Parameter
carlos@0
   111
      DBMS_OUTPUT.PUT_LINE('  Record_ID=' || v_Record_ID) ;
carlos@0
   112
    ELSE
gorkaion@239
   113
      DBMS_OUTPUT.PUT_LINE('--<<M_InOut_Post>>') ;
carlos@0
   114
      v_Record_ID:=p_InOut_ID;
carlos@0
   115
    END IF;
carlos@0
   116
  BEGIN --BODY
asier@1929
   117
  	SELECT AD_Client_ID, AD_Org_ID, CreatedBy, C_DocType_ID, DateAcct
asier@1929
   118
      INTO v_AD_Client_ID, v_AD_Org_ID, v_User, v_DocType_ID, v_DateAcct
carlos@0
   119
      FROM M_InOut
carlos@0
   120
      WHERE M_InOut_ID=v_Record_ID;
carlos@0
   121
    SELECT count(*)
carlos@0
   122
    INTO v_Count
carlos@0
   123
    FROM AD_CLIENTINFO
carlos@0
   124
    WHERE AD_CLIENT_ID=v_AD_Client_ID
carlos@0
   125
      AND CHECKINOUTORG='Y';
gorkaion@239
   126
    IF v_Count>0 THEN
carlos@0
   127
      v_ResultStr:='CheckingRestrictions - M_INOUT ORG IS IN C_BPARTNER ORG TREE';
carlos@0
   128
      SELECT count(*)
carlos@0
   129
      INTO v_Count
carlos@0
   130
      FROM M_InOut m,
carlos@0
   131
        C_BPartner bp
carlos@0
   132
      WHERE m.M_InOut_ID=v_Record_ID
carlos@0
   133
        AND m.C_BPARTNER_ID=bp.C_BPARTNER_ID
carlos@0
   134
        AND AD_IsOrgIncluded(m.AD_ORG_ID, bp.AD_ORG_ID, bp.AD_CLIENT_ID)=-1;
gorkaion@239
   135
      IF v_Count>0 THEN
carlos@0
   136
        RAISE_APPLICATION_ERROR(-20000, '@NotCorrectOrgBpartnerInout@') ;
carlos@0
   137
      END IF;
carlos@0
   138
    END IF;
carlos@0
   139
    IF(NOT FINISH_PROCESS) THEN
carlos@0
   140
      v_ResultStr:='CheckingRestrictions';
carlos@0
   141
      SELECT COUNT(*)
carlos@0
   142
   INTO v_Count
carlos@0
   143
   FROM C_DocType,
carlos@0
   144
        M_InOut M
carlos@0
   145
   WHERE M_Inout_ID = v_Record_ID
carlos@0
   146
     AND C_DocType.DocBaseType IN ('MMR', 'MMS')
carlos@0
   147
    AND C_DocType.IsSOTrx=M.IsSOTrx
gorkaion@239
   148
    AND AD_ISORGINCLUDED(m.AD_Org_ID,C_DocType.AD_Org_ID, m.AD_Client_ID) <> -1
carlos@0
   149
     AND M.C_DOCTYPE_ID=C_DocType.C_DOCTYPE_ID;
carlos@0
   150
      IF v_Count=0 THEN
carlos@0
   151
        RAISE_APPLICATION_ERROR(-20000, '@NotCorrectOrgDoctypeShipment@') ;
carlos@0
   152
      END IF;
carlos@0
   153
      SELECT COUNT(*), MAX(M.line)
carlos@0
   154
      INTO v_Count, v_line
carlos@0
   155
      FROM M_InOutLine M,
carlos@0
   156
        M_Product P
carlos@0
   157
      WHERE M.M_PRODUCT_ID=P.M_PRODUCT_ID
carlos@0
   158
        AND P.M_ATTRIBUTESET_ID IS NOT NULL
juanpablo@1605
   159
        AND COALESCE(M.M_ATTRIBUTESETINSTANCE_ID, '0') = '0'
carlos@0
   160
        AND M.M_INOUT_ID=v_Record_ID;
gorkaion@239
   161
      IF v_Count<>0 THEN
gorkaion@1261
   162
        RAISE_APPLICATION_ERROR(-20000, '@Inline@ '||v_line||' '||'@productWithoutAttributeSet@') ;
carlos@0
   163
      END IF;
carlos@0
   164
      SELECT COUNT(*), MAX(M.line)
carlos@0
   165
      INTO v_Count, v_Line
carlos@0
   166
      FROM M_InOut I,
carlos@0
   167
        M_InOutLine M,
carlos@0
   168
        M_AttributeSetInstance P
carlos@0
   169
      WHERE I.M_InOut_ID=M.M_InOut_ID
carlos@0
   170
        AND M.M_AttributeSetInstance_ID=P.M_AttributeSetInstance_ID
carlos@0
   171
        AND P.ISLOCKED='Y'
carlos@0
   172
        AND I.ISSOTRX='Y'
carlos@0
   173
        AND I.M_INOUT_ID=v_Record_ID;
gorkaion@239
   174
      IF v_Count<>0 THEN
carlos@0
   175
        RAISE_APPLICATION_ERROR(-20000, '@Inline@'||v_line||' '||'@lockedProduct@') ;
carlos@0
   176
      END IF;
carlos@0
   177
      -- Process Shipments
carlos@0
   178
carlos@511
   179
   -- Set org lines like the header
carlos@511
   180
     UPDATE M_INOUTLINE
carlos@0
   181
      SET AD_ORG_ID = (SELECT AD_ORG_ID FROM M_INOUT WHERE M_INOUT_ID = v_Record_ID)
carlos@0
   182
    WHERE M_INOUT_ID = v_Record_ID;
asier@1929
   183
    
asier@1929
   184
    -- Check the header belongs to a organization where transactions are posible and ready to use
asier@1929
   185
    SELECT AD_Org.IsReady, Ad_OrgType.IsTransactionsAllowed
asier@1929
   186
    INTO v_is_ready, v_is_tr_allow
asier@1929
   187
    FROM M_INOUT, AD_Org, AD_OrgType
asier@1929
   188
    WHERE AD_Org.AD_Org_ID=M_INOUT.AD_Org_ID
asier@1929
   189
    AND AD_Org.AD_OrgType_ID=AD_OrgType.AD_OrgType_ID
asier@1929
   190
    AND M_INOUT.M_INOUT_ID=v_Record_ID;
asier@1929
   191
    IF (v_is_ready='N') THEN
asier@1929
   192
      RAISE_APPLICATION_ERROR(-20000, '@OrgHeaderNotReady@');
asier@1929
   193
    END IF;
asier@1929
   194
    IF (v_is_tr_allow='N') THEN
asier@1929
   195
      RAISE_APPLICATION_ERROR(-20000, '@OrgHeaderNotTransAllowed@');
asier@1929
   196
    END IF;
asier@1929
   197
      
asier@1929
   198
    SELECT AD_ORG_CHK_DOCUMENTS('M_INOUT', 'M_INOUTLINE', v_Record_ID, 'M_INOUT_ID', 'M_INOUT_ID') INTO v_is_included FROM dual;
asier@1929
   199
    IF (v_is_included=-1) THEN
asier@1929
   200
      RAISE_APPLICATION_ERROR(-20000, '@LinesAndHeaderDifferentLEorBU@');
asier@1929
   201
    END IF;
asier@1929
   202
    
asier@1929
   203
    -- Check the period control is opened    
asier@1929
   204
    SELECT COUNT(C_Period_ID)
asier@1929
   205
    INTO v_available_period
asier@1929
   206
    FROM C_Period
asier@1929
   207
    WHERE v_DateAcct BETWEEN STARTDATE AND ENDDATE
asier@1929
   208
    AND EXISTS (SELECT 1
asier@1929
   209
                FROM C_PeriodControl
asier@1929
   210
                WHERE C_PeriodControl.C_Period_ID=C_Period.C_Period_ID 
asier@1929
   211
                AND DocBaseType=(SELECT DocBaseType FROM C_DocType WHERE C_DocType_ID=v_DocType_ID)
asier@1929
   212
                AND AD_Org_ID=v_AD_Org_ID
asier@1929
   213
                AND PeriodStatus='O'
asier@1929
   214
                );
asier@1929
   215
    
asier@1929
   216
    IF (v_available_period<>1) THEN
asier@1929
   217
      RAISE_APPLICATION_ERROR(-20000, '@PeriodNotAvailable@');
asier@1929
   218
    END IF;
carlos@0
   219
carlos@0
   220
      FOR Cur_InOut IN
carlos@0
   221
        (SELECT *
carlos@0
   222
        FROM M_INOUT
carlos@0
   223
        WHERE(M_InOut_ID=v_Record_ID
carlos@0
   224
          OR(v_Record_ID IS NULL
carlos@0
   225
          AND DocAction='CO'))
carlos@0
   226
          AND IsActive='Y'  FOR UPDATE
carlos@0
   227
        )
carlos@0
   228
      LOOP
carlos@0
   229
        DBMS_OUTPUT.PUT_LINE('Shipment_ID=' || Cur_InOut.M_InOut_ID || ', Doc=' || Cur_InOut.DocumentNo || ', Status=' || Cur_InOut.DocStatus || ', Action=' || Cur_InOut.DocAction) ;
carlos@0
   230
        v_ResultStr:='HeaderLoop';
carlos@0
   231
        /**
carlos@0
   232
        * Shipment not processed
carlos@0
   233
        */
carlos@0
   234
        IF(Cur_InOut.Processed='N' AND Cur_InOut.DocStatus='DR' AND Cur_InOut.DocAction='CO') THEN
carlos@0
   235
          -- For all active shipment lines
carlos@0
   236
          v_ResultStr:='HeaderLoop-1';
carlos@0
   237
          FOR Cur_InOutLine IN
carlos@0
   238
            (SELECT *
carlos@0
   239
            FROM M_INOUTLINE
carlos@0
   240
            WHERE M_InOut_ID=Cur_InOut.M_InOut_ID
carlos@0
   241
              AND IsActive='Y'  FOR UPDATE
carlos@0
   242
            )
carlos@0
   243
          LOOP
adrian@170
   244
            -- Incomming or Outgoing :1:2
carlos@0
   245
            v_Qty:=Cur_InOutLine.MovementQty;
carlos@0
   246
            v_QuantityOrder:=Cur_InOutLine.QuantityOrder;
carlos@0
   247
            IF(SUBSTR(Cur_InOut.MovementType, 2)='-') THEN
carlos@0
   248
              v_Qty:=- Cur_InOutLine.MovementQty;
carlos@0
   249
              v_QuantityOrder:=-Cur_InOutLine.QuantityOrder;
carlos@0
   250
            END IF;
carlos@0
   251
            IF(Cur_InOut.IsSOTrx='N') THEN
carlos@0
   252
              v_QtySO:=0;
carlos@0
   253
              v_QtyPO:=Cur_InOutLine.MovementQty;
carlos@0
   254
              v_QuantityOrderSO:=0;
carlos@0
   255
              v_QuantityOrderPO:=Cur_InOutLine.QuantityOrder;
carlos@0
   256
            ELSE
carlos@0
   257
              v_QtySO:=Cur_InOutLine.MovementQty;
carlos@0
   258
              v_QtyPO:=0;
carlos@0
   259
              v_QuantityOrderSO:=Cur_InOutLine.QuantityOrder;
carlos@0
   260
              v_QuantityOrderPO:=0;
carlos@0
   261
            END IF;
carlos@0
   262
            -- UOM Conversion
adrian@170
   263
            -- Is it a standard stocked product:3
carlos@0
   264
            SELECT COUNT(*)
carlos@0
   265
            INTO v_IsStocked
carlos@0
   266
            FROM M_PRODUCT
carlos@0
   267
            WHERE M_Product_ID=Cur_InOutLine.M_Product_ID
carlos@0
   268
              AND IsStocked='Y'
carlos@0
   269
              AND ProductType='I';
carlos@0
   270
            -- Create Transaction for stocked product
carlos@0
   271
            IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND v_IsStocked=1) THEN
carlos@0
   272
              v_ResultStr:='CreateTransaction';
carlos@0
   273
              Ad_Sequence_Next('M_Transaction', Cur_InOutLine.AD_Org_ID, v_NextNo) ;
carlos@0
   274
              INSERT
carlos@0
   275
              INTO M_TRANSACTION
carlos@0
   276
                (
carlos@0
   277
                  M_Transaction_ID, M_InOutLine_ID, AD_Client_ID, AD_Org_ID,
carlos@0
   278
                  IsActive, Created, CreatedBy, Updated,
carlos@0
   279
                  UpdatedBy, MovementType, M_Locator_ID, M_Product_ID,
carlos@0
   280
                  M_AttributeSetInstance_ID, MovementDate, MovementQty, M_Product_UOM_ID,
carlos@0
   281
                  QuantityOrder, C_UOM_ID
carlos@0
   282
                )
carlos@0
   283
                VALUES
carlos@0
   284
                (
carlos@0
   285
                  v_NextNo, Cur_InOutLine.M_InOutLine_ID, Cur_InOutLine.AD_Client_ID, Cur_InOutLine.AD_Org_ID,
carlos@0
   286
                   'Y', now(), Cur_InOutLine.UpdatedBy, now(),
carlos@0
   287
                  Cur_InOutLine.UpdatedBy, Cur_InOut.MovementType, Cur_InOutLine.M_Locator_ID, Cur_InOutLine.M_Product_ID,
juanpablo@1605
   288
                  COALESCE(Cur_InOutLine.M_AttributeSetInstance_ID, '0'), Cur_InOut.MovementDate, v_Qty, Cur_InOutLine.M_Product_UOM_ID,
carlos@0
   289
                  v_QuantityOrder, Cur_InOutLine.C_UOM_ID
carlos@0
   290
                )
carlos@0
   291
                ;
carlos@0
   292
            END IF;
carlos@0
   293
            -- Create Asset
carlos@0
   294
            IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND Cur_InOut.IsSOTrx='Y') THEN
antonio@735
   295
              A_ASSET_CREATE(NULL, Cur_InOutLine.M_InOutLine_ID) ;
carlos@0
   296
            END IF;
carlos@0
   297
            v_ResultStr:='UpdateOrderLine';
carlos@0
   298
            IF(Cur_InOutLine.C_OrderLine_ID IS NOT NULL) THEN
carlos@0
   299
              -- stocked product
carlos@0
   300
              IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND v_IsStocked=1) THEN
carlos@0
   301
                -- Update OrderLine (if C-, Qty is negative)
carlos@0
   302
                UPDATE C_ORDERLINE
carlos@0
   303
                  SET QtyReserved=QtyReserved - v_QtyPO - v_QtySO,
carlos@0
   304
                  QtyDelivered=QtyDelivered + v_QtySO,
carlos@0
   305
                  Updated=now()
carlos@0
   306
                WHERE C_OrderLine_ID=Cur_InOutLine.C_OrderLine_ID;
carlos@0
   307
                -- Products not stocked
carlos@0
   308
              ELSE
carlos@0
   309
                -- Update OrderLine (if C-, Qty is negative)
carlos@0
   310
                UPDATE C_ORDERLINE
carlos@0
   311
                  SET QtyDelivered=QtyDelivered + v_QtySO,
carlos@0
   312
                  Updated=now()
carlos@0
   313
                WHERE C_OrderLine_ID=Cur_InOutLine.C_OrderLine_ID;
carlos@0
   314
              END IF;
carlos@0
   315
            END IF;
carlos@0
   316
            IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND v_IsStocked=1) THEN
carlos@0
   317
              M_Check_Stock(Cur_InOutLine.M_Product_ID, v_AD_Client_ID, v_AD_Org_ID, v_Result, v_Message) ;
carlos@0
   318
              IF v_Result=0 THEN
carlos@0
   319
			    RAISE_APPLICATION_ERROR(-20000, v_Message||' '||'@line@'||' '||Cur_InOutLine.line) ;
carlos@0
   320
              END IF;
carlos@0
   321
            END IF;
carlos@0
   322
          END LOOP; -- For all InOut Lines
carlos@0
   323
          /*******************
carlos@0
   324
          * PO Matching
carlos@0
   325
          ******************/
carlos@0
   326
          IF(Cur_InOut.IsSOTrx='N') THEN
carlos@0
   327
            DECLARE
carlos@0
   328
              Cur_SLines RECORD;
carlos@0
   329
              Cur_ILines RECORD;
carlos@0
   330
              v_Qty NUMBER;
juanpablo@1605
   331
              v_MatchPO_ID VARCHAR2(32) ;
juanpablo@1605
   332
              v_MatchInv_ID VARCHAR2(32) ;
carlos@0
   333
            BEGIN
carlos@0
   334
              v_ResultStr:='MatchPO';
carlos@0
   335
              FOR Cur_SLines IN
carlos@0
   336
                (SELECT sl.AD_Client_ID,
carlos@0
   337
                  sl.AD_Org_ID,
carlos@0
   338
                  ol.C_OrderLine_ID,
carlos@0
   339
                  sl.M_InOutLine_ID,
carlos@0
   340
                  sl.M_Product_ID,
carlos@0
   341
                  sl.M_AttributeSetInstance_ID,
carlos@0
   342
                  sl.MovementQty,
carlos@0
   343
                  ol.QtyOrdered
carlos@0
   344
                FROM M_INOUTLINE sl,
carlos@0
   345
                  C_ORDERLINE ol
carlos@0
   346
                WHERE sl.C_OrderLine_ID=ol.C_OrderLine_ID
carlos@0
   347
                  AND sl.M_Product_ID=ol.M_Product_ID  --    AND   sl.M_AttributeSetInstance_ID=ol.M_AttributeSetInstance_ID
carlos@0
   348
                  AND sl.M_InOut_ID=Cur_InOut.M_InOut_ID
carlos@0
   349
                )
carlos@0
   350
              LOOP
carlos@0
   351
                Ad_Sequence_Next('M_MatchPO', Cur_SLines.AD_Org_ID, v_MatchPO_ID) ;
carlos@0
   352
                -- The min qty. Modified by Ismael Ciordia
carlos@0
   353
                v_Qty:=Cur_SLines.MovementQty;
gorkaion@239
   354
                --IF (ABS(Cur_SLines.MovementQty) > ABS(Cur_SLines.QtyOrdered)) THEN
carlos@0
   355
                -- v_Qty := Cur_SLines.QtyOrdered;
carlos@0
   356
                --END IF;
carlos@0
   357
                v_ResultStr:='InsertMatchPO ' || v_MatchPO_ID;
carlos@0
   358
                INSERT
carlos@0
   359
                INTO M_MATCHPO
carlos@0
   360
                  (
carlos@0
   361
                    M_MatchPO_ID, AD_Client_ID, AD_Org_ID, IsActive,
carlos@0
   362
                    Created, CreatedBy, Updated, UpdatedBy,
carlos@0
   363
                    M_InOutLine_ID, C_OrderLine_ID, M_Product_ID, DateTrx,
carlos@0
   364
                    Qty, Processing, Processed, Posted
carlos@0
   365
                  )
carlos@0
   366
                  VALUES
carlos@0
   367
                  (
carlos@0
   368
                    v_MatchPO_ID, Cur_SLines.AD_Client_ID, Cur_SLines.AD_Org_ID, 'Y',
juanpablo@1605
   369
                    now(), '0', now(), '0',
carlos@0
   370
                    Cur_SLines.M_InOutLine_ID, Cur_SLines.C_OrderLine_ID, Cur_SLines.M_Product_ID, now(),
carlos@0
   371
                    v_Qty, 'N', 'Y', 'N'
carlos@0
   372
                  )
carlos@0
   373
                  ;
carlos@0
   374
              END LOOP;
carlos@0
   375
              v_ResultStr:='MatchInv';
carlos@0
   376
              FOR Cur_ILines IN
carlos@0
   377
                (SELECT sl.AD_Client_ID,
carlos@0
   378
                  sl.AD_Org_ID,
carlos@0
   379
                  il.C_InvoiceLine_ID,
carlos@0
   380
                  sl.M_InOutLine_ID,
carlos@0
   381
                  sl.M_Product_ID,
carlos@0
   382
                  sl.M_AttributeSetInstance_ID,
carlos@0
   383
                  sl.MovementQty,
carlos@0
   384
                  il.QTYINVOICED
carlos@0
   385
                FROM M_INOUTLINE sl,
carlos@0
   386
                  C_INVOICELINE il
carlos@0
   387
                WHERE sl.M_InOutLine_ID=il.M_InOutLine_ID
carlos@0
   388
                  AND sl.M_InOut_ID=Cur_InOut.M_InOut_ID
carlos@0
   389
                )
carlos@0
   390
              LOOP
carlos@0
   391
                Ad_Sequence_Next('M_MatchInv', Cur_ILines.AD_Org_ID, v_MatchInv_ID) ;
carlos@0
   392
                -- The min qty. Modified by Ismael Ciordia
carlos@0
   393
                v_Qty:=Cur_ILines.MovementQty;
gorkaion@239
   394
                --IF (ABS(Cur_ILines.MovementQty) > ABS(Cur_ILines.QtyInvoiced)) THEN
carlos@0
   395
                -- v_Qty := Cur_ILines.QtyInvoiced;
carlos@0
   396
                --END IF;
carlos@0
   397
                v_ResultStr:='InsertMatchPO ' || v_MatchPO_ID;
carlos@0
   398
                INSERT
carlos@0
   399
                INTO M_MATCHINV
carlos@0
   400
                  (
carlos@0
   401
                    M_MATCHINV_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
carlos@0
   402
                    CREATED, CREATEDBY, UPDATED, UPDATEDBY,
carlos@0
   403
                    M_INOUTLINE_ID, C_INVOICELINE_ID, M_PRODUCT_ID, DATETRX,
carlos@0
   404
                    QTY, PROCESSING, PROCESSED, POSTED
carlos@0
   405
                  )
carlos@0
   406
                  VALUES
carlos@0
   407
                  (
carlos@0
   408
                    v_MatchInv_ID, Cur_ILines.AD_Client_ID, Cur_ILines.AD_Org_ID, 'Y',
juanpablo@1605
   409
                    now(), '0', now(), '0',
carlos@0
   410
                    Cur_ILines.M_InOutLine_ID, Cur_ILines.C_InvoiceLine_ID, Cur_ILines.M_Product_ID, now(),
carlos@0
   411
                    v_Qty, 'N', 'Y', 'N'
carlos@0
   412
                  )
carlos@0
   413
                  ;
carlos@0
   414
              END LOOP;
carlos@0
   415
            END;
carlos@0
   416
          END IF;
carlos@0
   417
          -- Close Shipment
carlos@0
   418
          v_ResultStr:='CloseShipment';
carlos@0
   419
          UPDATE M_INOUT
carlos@0
   420
            SET Processed='Y',
carlos@0
   421
            DocStatus='CO',
carlos@0
   422
            DocAction='--',
carlos@0
   423
            Updated=now()
carlos@0
   424
          WHERE M_INOUT.M_INOUT_ID=Cur_InOut.M_INOUT_ID;
carlos@0
   425
          --
asier@1027
   426
          
asier@1027
   427
         
carlos@0
   428
          -- Not Processed + Complete --
carlos@0
   429
          /**
carlos@0
   430
          * Reverse Correction
carlos@0
   431
          */
carlos@0
   432
        ELSIF(Cur_InOut.DocStatus='CO' AND Cur_InOut.DocAction='RC') THEN
carlos@0
   433
          v_ResultStr:='CreateInOut';
carlos@0
   434
          SELECT COALESCE(C_DOCTYPE_REVERSED_ID, C_DOCTYPE_ID)
carlos@0
   435
          INTO v_DoctypeReversed_ID
carlos@0
   436
          FROM C_DOCTYPE
carlos@0
   437
          WHERE C_DOCTYPE_ID=Cur_InOut.C_DocType_ID;
carlos@0
   438
          Ad_Sequence_Next('M_InOut', Cur_InOut.M_InOut_ID, v_RInOut_ID) ; -- Get RInOut_ID
carlos@0
   439
          Ad_Sequence_Doctype(v_DoctypeReversed_ID, Cur_InOut.M_InOut_ID, 'Y', v_RDocumentNo) ; -- Get RDocumentNo
carlos@0
   440
          IF(v_RDocumentNo IS NULL) THEN
carlos@0
   441
            AD_Sequence_Doc('DocumentNo_M_InOut', Cur_InOut.AD_Client_ID, 'Y', v_RDocumentNo) ;
carlos@0
   442
          END IF;
carlos@0
   443
          -- Indicate that it is invoiced (i.e. not printed on invoices)
carlos@0
   444
          v_ResultStr:='SetInvoiced';
carlos@0
   445
          UPDATE M_INOUTLINE  SET IsInvoiced='Y'  WHERE M_InOut_ID=Cur_InOut.M_InOut_ID;
carlos@0
   446
          --
carlos@0
   447
          DBMS_OUTPUT.PUT_LINE('Reverse InOut_ID=' || v_RInOut_ID || ' DocumentNo=' || v_RDocumentNo) ;
carlos@0
   448
          v_ResultStr:='InsertInOut Reverse ' || v_RInOut_ID;
carlos@0
   449
          INSERT
carlos@0
   450
          INTO M_INOUT
carlos@0
   451
            (
carlos@0
   452
              M_InOut_ID, C_Order_ID, IsSOTrx, AD_Client_ID,
carlos@0
   453
              AD_Org_ID, IsActive, Created, CreatedBy,
carlos@0
   454
              Updated, UpdatedBy, DocumentNo, C_DocType_ID,
carlos@0
   455
              Description, IsPrinted, MovementType, MovementDate,
carlos@0
   456
              DateAcct, C_BPartner_ID, C_BPartner_Location_ID, AD_User_ID,
carlos@0
   457
              M_Warehouse_ID, POReference, DateOrdered, DeliveryRule,
carlos@0
   458
              FreightCostRule, FreightAmt, C_Project_ID, C_Activity_ID,
carlos@0
   459
              C_Campaign_ID, AD_OrgTrx_ID, User1_ID, User2_ID,
carlos@0
   460
              DeliveryViaRule, M_Shipper_ID, C_Charge_ID, ChargeAmt,
carlos@0
   461
              PriorityRule, DocStatus, DocAction, Processing,
carlos@0
   462
              Processed, ISLOGISTIC, salesrep_id
carlos@0
   463
            )
carlos@0
   464
            VALUES
carlos@0
   465
            (
carlos@0
   466
              v_RInOut_ID, Cur_InOut.C_Order_ID, Cur_InOut.IsSOTrx, Cur_InOut.AD_Client_ID,
juanpablo@1605
   467
              Cur_InOut.AD_Org_ID, 'Y', now(), '0',
juanpablo@1605
   468
              now(), '0', v_RDocumentNo, v_DoctypeReversed_ID,
carlos@0
   469
               '(*R*: ' || Cur_InOut.DocumentNo || ') ' || Cur_InOut.Description, 'N', Cur_InOut.MovementType, Cur_InOut.MovementDate,
carlos@0
   470
              Cur_InOut.DateAcct, Cur_InOut.C_BPartner_ID, Cur_InOut.C_BPartner_Location_ID, Cur_InOut.AD_User_ID,
carlos@0
   471
              Cur_InOut.M_Warehouse_ID, Cur_InOut.POReference, Cur_InOut.DateOrdered, Cur_InOut.DeliveryRule,
carlos@0
   472
              Cur_InOut.FreightCostRule, Cur_InOut.FreightAmt * -1, Cur_InOut.C_Project_ID, Cur_InOut.C_Activity_ID,
carlos@0
   473
              Cur_InOut.C_Campaign_ID, Cur_InOut.AD_OrgTrx_ID, Cur_InOut.User1_ID, Cur_InOut.User2_ID,
carlos@0
   474
              Cur_InOut.DeliveryViaRule, Cur_InOut.M_Shipper_ID, Cur_InOut.C_Charge_ID, Cur_InOut.ChargeAmt * -1,
carlos@0
   475
              Cur_InOut.PriorityRule, 'DR', 'CO', 'N',
carlos@0
   476
               'N', Cur_InOut.islogistic, Cur_InOut.salesrep_id
carlos@0
   477
            )
carlos@0
   478
            ;
carlos@0
   479
          v_ResultStr:='InsertInOutLine';
carlos@0
   480
          FOR Cur_InOutLine IN
carlos@0
   481
            (SELECT *
carlos@0
   482
            FROM M_INOUTLINE
carlos@0
   483
            WHERE M_InOut_ID=Cur_InOut.M_InOut_ID
carlos@0
   484
              AND IsActive='Y'  FOR UPDATE
carlos@0
   485
            )
carlos@0
   486
          LOOP
carlos@0
   487
            -- Create InOut Line
carlos@0
   488
            Ad_Sequence_Next('M_InOutLine', Cur_InOut.M_InOut_ID, v_NextNo) ;
carlos@0
   489
            v_ResultStr:='CreateInOutLine';
carlos@0
   490
            INSERT
carlos@0
   491
            INTO M_INOUTLINE
carlos@0
   492
              (
carlos@0
   493
                M_InOutLine_ID, Line, M_InOut_ID, C_OrderLine_ID,
carlos@0
   494
                AD_Client_ID, AD_Org_ID, IsActive, Created,
carlos@0
   495
                CreatedBy, Updated, UpdatedBy, M_Product_ID,
carlos@0
   496
                M_AttributeSetInstance_ID, C_UOM_ID, M_Locator_ID, MovementQty,
asier@799
   497
                Description, IsInvoiced,  --MODIFIED BY F.IRIAZABAL
carlos@0
   498
                QuantityOrder, M_Product_UOM_ID
carlos@0
   499
              )
carlos@0
   500
              VALUES
carlos@0
   501
              (
carlos@0
   502
                v_NextNo, Cur_InOutLine.Line, v_RInOut_ID, Cur_InOutLine.C_OrderLine_ID,
carlos@0
   503
                Cur_InOut.AD_Client_ID, Cur_InOut.AD_Org_ID, 'Y', now(),
juanpablo@1605
   504
                '0', now(), '0', Cur_InOutLine.M_Product_ID,
carlos@0
   505
                Cur_InOutLine.M_AttributeSetInstance_ID, Cur_InOutLine.C_UOM_ID, Cur_InOutLine.M_Locator_ID, Cur_InOutLine.MovementQty * -1,
asier@799
   506
                 '*R*: ' || Cur_InOutLine.Description, Cur_InOutLine.IsInvoiced, --MODIFIED BY F.IRIAZABAL
carlos@0
   507
                Cur_InOutLine.QuantityOrder * -1, Cur_InOutLine.M_PRODUCT_UOM_ID
carlos@0
   508
              )
carlos@0
   509
              ;
carlos@0
   510
          END LOOP;
carlos@0
   511
          -- Close Order
carlos@0
   512
          v_ResultStr:='CloseInOut';
carlos@0
   513
          UPDATE M_INOUT
carlos@0
   514
            SET Description=COALESCE(TO_CHAR(Description), '') || ' (*R*=' || v_RDocumentNo || ')',
carlos@0
   515
            Processed='Y',
carlos@0
   516
            DocStatus='RE', -- it IS reversed
carlos@0
   517
            DocAction='--',
carlos@0
   518
            Updated=now(),
carlos@0
   519
            UpdatedBy=v_User
carlos@0
   520
          WHERE M_INOUT.M_INOUT_ID=Cur_InOut.M_INOUT_ID;
asier@1027
   521
         
carlos@0
   522
          -- Post Reversal
carlos@0
   523
          v_ResultStr:='PostReversal';
antonio@735
   524
          M_INOUT_POST(NULL, v_RInOut_ID) ;
carlos@0
   525
          -- Indicate as Reversal Transaction
carlos@0
   526
          v_ResultStr:='IndicateReversal';
carlos@0
   527
          UPDATE M_INOUT
carlos@0
   528
            SET Updated=now(),
carlos@0
   529
            UpdatedBy=v_User,
carlos@0
   530
            DocStatus='RE' -- the reversal transaction
carlos@0
   531
          WHERE M_InOut_ID=v_RInOut_ID;
carlos@0
   532
        END IF; -- ReverseCorrection
carlos@0
   533
      END LOOP; -- InOut Header
carlos@0
   534
      /**
carlos@0
   535
      * Transaction End
carlos@0
   536
      */
carlos@0
   537
      v_ResultStr:='Fini';
carlos@0
   538
    END IF; --FINISH_PROCESS
gorkaion@239
   539
    --<<FINISH_PROCESS>>
carlos@0
   540
    IF(p_PInstance_ID IS NOT NULL) THEN
carlos@0
   541
      --  Update AD_PInstance
carlos@0
   542
      DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message) ;
carlos@0
   543
      AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'N', v_Result, v_Message) ;
carlos@0
   544
    ELSE
gorkaion@239
   545
      DBMS_OUTPUT.PUT_LINE('--<<M_InOut_Post finished>>') ;
carlos@0
   546
    END IF;
carlos@0
   547
    RETURN;
carlos@0
   548
  END; --BODY
carlos@0
   549
EXCEPTION
carlos@0
   550
WHEN OTHERS THEN
carlos@0
   551
  v_ResultStr:= '@ERROR=' || SQLERRM;
carlos@0
   552
  DBMS_OUTPUT.PUT_LINE(v_ResultStr) ;
carlos@0
   553
  IF(p_PInstance_ID IS NOT NULL) THEN
carlos@0
   554
    ROLLBACK;
carlos@0
   555
    AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'N', 0, v_ResultStr) ;
carlos@0
   556
  ELSE
carlos@0
   557
    RAISE;
carlos@0
   558
  END IF;
carlos@0
   559
  RETURN;
antonio@735
   560
END M_INOUT_POST
gorkaion@239
   561
]]></body>
adrian@94
   562
    </function>
adrian@94
   563
  </database>