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