src-db/database/model/functions/M_INOUT_POST.xml
author Alvaro Ferraz <alvaro.ferraz@openbravo.com>
Mon, 01 Feb 2016 18:49:06 +0100
changeset 28246 fb23aa4df32e
parent 28229 ef895ced13c2
child 28265 52f41dec669a
child 28677 35618c095a22
permissions -rw-r--r--
Fixes issue 31915 & Fixes issue 31907 & Fixes issue 31957: Cannot void shipment

Cannot void shipment related to reservation.
New reservation to replace the closed related one when voiding a shipment will be done after update m_storage_detail, in order to have voided shipment quantity available.
Reservation stock lines will be created with related shipment line movement quantity in case this quantity is less than pending order quantity.
Reservation will be created with the least quantity between ordered quantity and movement quantity.
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
alvaro@28229
    25
  * Contributions are Copyright (C) 2001-2016 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):='';
gorkaion@18652
    48
  v_Message_aux VARCHAR2(2000):='';
juanpablo@1605
    49
  v_Record_ID VARCHAR2(32);
juanpablo@1605
    50
  v_User VARCHAR2(32);
harikrishnan@7227
    51
  v_PUser VARCHAR2(32);
javier@21256
    52
  v_DocStatus VARCHAR2(60);
asier@1929
    53
  v_is_included NUMBER:=0;
asier@1929
    54
  v_DocType_ID VARCHAR2(32);
gorkaion@14547
    55
  v_isreturndoctype CHAR(1);
asier@1929
    56
  v_available_period NUMBER:=0;
asier@1929
    57
  v_is_ready AD_Org.IsReady%TYPE;
asier@1929
    58
  v_is_tr_allow AD_OrgType.IsTransactionsAllowed%TYPE;
asier@1929
    59
  v_DateAcct DATE;
atul@21884
    60
  v_DateDelivered C_OrderLine.DateDelivered%TYPE;
victor@3065
    61
  v_isacctle AD_OrgType.IsAcctLegalEntity%TYPE;
victor@3065
    62
  v_org_bule_id AD_Org.AD_Org_ID%TYPE;
carlos@0
    63
  -- Parameter
carlos@0
    64
  TYPE RECORD IS REF CURSOR;
carlos@0
    65
    Cur_Parameter RECORD;
carlos@0
    66
    --
carlos@0
    67
    Cur_InOut RECORD;
carlos@0
    68
    Cur_InOutLine RECORD;
gorkaion@3170
    69
    Cur_Order RECORD;
pandeeswari@21778
    70
    Cur_OrderLine RECORD;
gaurav@22036
    71
    Cur_Lines RECORD;
alvaro@27102
    72
    Cur_Reservation RECORD;
carlos@0
    73
    --
carlos@0
    74
    v_Result NUMBER:=1;
juanpablo@1605
    75
    v_AD_Org_ID VARCHAR2(32);
alvaro@27384
    76
    v_Locator_Org_ID VARCHAR2(32);
pandeeswari@21373
    77
    v_Warehouse_Org VARCHAR2(32);
juanpablo@1605
    78
    v_AD_Client_ID VARCHAR2(32);
juanpablo@1605
    79
    v_NextNo VARCHAR2(32);
carlos@0
    80
    v_Qty NUMBER;
carlos@0
    81
    v_QtyPO NUMBER;
carlos@0
    82
    v_QtySO NUMBER;
carlos@0
    83
    v_QuantityOrder NUMBER;
carlos@0
    84
    v_QuantityOrderPO NUMBER;
carlos@0
    85
    v_QuantityOrderSO NUMBER;
carlos@0
    86
    v_RDocumentNo VARCHAR2(40) ;
juanpablo@1605
    87
    v_RInOut_ID VARCHAR2(32);
carlos@0
    88
    v_IsStocked NUMBER;
juanpablo@1605
    89
    v_DoctypeReversed_ID VARCHAR2(32);
carlos@0
    90
    --MODIFIED BY F.IRIAZABAL
carlos@0
    91
    v_QtyOrder NUMBER;
carlos@0
    92
    v_ProductUOM NUMBER;
asier@2586
    93
    v_BreakDown VARCHAR2(60) ;
carlos@0
    94
    v_ActualQty NUMBER;
carlos@0
    95
    v_QtyAux NUMBER;
carlos@0
    96
    v_Count NUMBER:=0;
carlos@0
    97
    v_Line VARCHAR2(10) ;
gorkaion@3170
    98
    v_OrderID_old VARCHAR2(32);
harikrishnan@7945
    99
    Cur_MILines RECORD;
carlos@0
   100
    FINISH_PROCESS BOOLEAN:=false;
harikrishnan@5580
   101
    v_Aux NUMBER;
pandeeswari@21340
   102
    v_isSoTrx CHAR(1);
ioritz@17861
   103
    v_ProductName M_Product.name%TYPE;
gorkaion@18652
   104
    v_reservation_id    VARCHAR2(32);
alvaro@28246
   105
    v_reservationstock_id    VARCHAR2(32);
pandeeswari@21353
   106
    v_M_Warehouse_ID    VARCHAR2(32);
mikel@19131
   107
    v_voidmovementdate M_Inout.MovementDate%TYPE;
mikel@19131
   108
    v_voiddate_acct M_Inout.DateAcct%TYPE;
david@19194
   109
    v_bpartner_blocked VARCHAR2(1):='N';
david@19194
   110
    v_goods_blocked VARCHAR2(1):='N';
sandra@20002
   111
    v_bpartner_name c_bpartner.name%TYPE;
david@19194
   112
    v_DocAction VARCHAR2(60);
gaurav@21852
   113
    v_voiddoccount NUMBER:=0;
mikel@19131
   114
david@22931
   115
    v_penqty NUMBER;
david@22931
   116
    v_qtysumorders NUMBER;
david@22931
   117
    v_released  NUMBER;
fernando@25185
   118
    
fernando@25185
   119
    v_bp_isactive c_bpartner.isactive%Type;
atul@25018
   120
    v_IsQtyVariable M_Product.IsQuantityVariable%TYPE;
atul@25116
   121
    v_IsReversedDoc CHAR(1);
atul@25018
   122
alvaro@28246
   123
    v_countRS NUMBER:=0;
alvaro@28246
   124
    v_R_Quantity NUMBER;
alvaro@28246
   125
    v_R_Reservedqty NUMBER;
alvaro@28246
   126
    v_RS_Quantity NUMBER;
alvaro@28246
   127
    v_RS_Releasedqty NUMBER;
alvaro@27102
   128
carlos@0
   129
  BEGIN
david@22931
   130
  
carlos@0
   131
    IF(p_PInstance_ID IS NOT NULL) THEN
carlos@0
   132
      --  Update AD_PInstance
carlos@0
   133
      DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID) ;
carlos@0
   134
      v_ResultStr:='PInstanceNotFound';
carlos@0
   135
      AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'Y', NULL, NULL) ;
carlos@0
   136
      -- Get Parameters
carlos@0
   137
      v_ResultStr:='ReadingParameters';
carlos@0
   138
      FOR Cur_Parameter IN
carlos@0
   139
        (SELECT i.Record_ID,
carlos@0
   140
          i.AD_User_ID,
carlos@0
   141
          p.ParameterName,
carlos@0
   142
          p.P_String,
carlos@0
   143
          p.P_Number,
carlos@0
   144
          p.P_Date
carlos@0
   145
        FROM AD_PInstance i
carlos@0
   146
        LEFT JOIN AD_PInstance_Para p
carlos@0
   147
          ON i.AD_PInstance_ID=p.AD_PInstance_ID
carlos@0
   148
        WHERE i.AD_PInstance_ID=p_PInstance_ID
carlos@0
   149
        ORDER BY p.SeqNo
carlos@0
   150
        )
carlos@0
   151
      LOOP
carlos@0
   152
        v_Record_ID:=Cur_Parameter.Record_ID;
carlos@0
   153
        v_User:=Cur_Parameter.AD_User_ID;
mikel@19131
   154
        IF (Cur_Parameter.parametername = 'voidedDocumentDate') THEN
mikel@19131
   155
          v_voidmovementdate := TO_DATE(Cur_Parameter.p_string, 'YYYY-MM-DD');
mikel@19131
   156
        ELSIF (Cur_Parameter.parametername = 'voidedDocumentAcctDate') THEN
mikel@19131
   157
          v_voiddate_acct := TO_DATE(Cur_Parameter.p_string, 'YYYY-MM-DD');
mikel@19131
   158
        END IF;
carlos@0
   159
      END LOOP; -- Get Parameter
carlos@0
   160
      DBMS_OUTPUT.PUT_LINE('  Record_ID=' || v_Record_ID) ;
carlos@0
   161
    ELSE
gorkaion@239
   162
      DBMS_OUTPUT.PUT_LINE('--<<M_InOut_Post>>') ;
carlos@0
   163
      v_Record_ID:=p_InOut_ID;
harikrishnan@7227
   164
      SELECT count(*),updatedby
harikrishnan@7227
   165
        INTO v_Count,v_User
rafael@5825
   166
        FROM M_InOut
harikrishnan@7227
   167
        WHERE M_InOut_ID=v_Record_ID
harikrishnan@7227
   168
        GROUP BY updatedby;
rafael@5825
   169
      IF v_Count=0 THEN
rafael@5825
   170
        FINISH_PROCESS:=true;
rafael@5825
   171
      END IF;
carlos@0
   172
    END IF;
fernando@25185
   173
    
carlos@0
   174
  BEGIN --BODY
rafael@5825
   175
  	IF(NOT FINISH_PROCESS) THEN
harikrishnan@7227
   176
  	  v_PUser:=v_User;
gaurav@21852
   177
      SELECT io.AD_Client_ID, io.AD_Org_ID, io.CreatedBy, io.C_DocType_ID, io.DateAcct, dt.isreturn, io.m_warehouse_id, io.issotrx,docaction
gaurav@21852
   178
        INTO v_AD_Client_ID, v_AD_Org_ID, v_User, v_DocType_ID, v_DateAcct, v_isreturndoctype, v_M_Warehouse_ID, v_isSoTrx,v_DocAction
gorkaion@14547
   179
        FROM M_InOut io JOIN c_doctype dt ON io.c_doctype_id = dt.c_doctype_id
gorkaion@14547
   180
        WHERE io.M_InOut_ID=v_Record_ID;
harikrishnan@7227
   181
        IF(v_PUser IS NOT NULL) THEN
harikrishnan@7227
   182
        	v_User:=v_PUser;
harikrishnan@7227
   183
        END IF;
carlos@0
   184
      SELECT count(*)
carlos@0
   185
      INTO v_Count
rafael@5825
   186
      FROM AD_CLIENTINFO
rafael@5825
   187
      WHERE AD_CLIENT_ID=v_AD_Client_ID
rafael@5825
   188
        AND CHECKINOUTORG='Y';
naiara@19828
   189
      IF (v_Count>0) THEN
rafael@5825
   190
        v_ResultStr:='CheckingRestrictions - M_INOUT ORG IS IN C_BPARTNER ORG TREE';
rafael@5825
   191
        SELECT count(*)
rafael@5825
   192
        INTO v_Count
rafael@5825
   193
        FROM M_InOut m,
rafael@5825
   194
          C_BPartner bp
rafael@5825
   195
        WHERE m.M_InOut_ID=v_Record_ID
rafael@5825
   196
          AND m.C_BPARTNER_ID=bp.C_BPARTNER_ID
rafael@5825
   197
          AND AD_IsOrgIncluded(m.AD_ORG_ID, bp.AD_ORG_ID, bp.AD_CLIENT_ID)=-1;
rafael@5825
   198
        IF v_Count>0 THEN
rafael@5825
   199
          RAISE_APPLICATION_ERROR(-20000, '@NotCorrectOrgBpartnerInout@') ;
rafael@5825
   200
        END IF;
carlos@0
   201
      END IF;
gaurav@22036
   202
       Declare
gaurav@22036
   203
       v_Message_product VARCHAR(2000) :='';
gaurav@22036
   204
       Begin
gaurav@22036
   205
          FOR Cur_Lines IN (
gaurav@22036
   206
                             SELECT M.line
gaurav@22036
   207
                             FROM M_InOut I,
gaurav@22036
   208
                                  M_InOutLine M
gaurav@22036
   209
                             WHERE I.M_InOut_ID=M.M_InOut_ID
gaurav@22036
   210
                               AND I.M_INOUT_ID=v_Record_ID
gaurav@22036
   211
                               AND (M.M_PRODUCT_ID IS NULL AND M.MOVEMENTQTY <> 0)
gaurav@22036
   212
                               ORDER BY M.line
gaurav@22036
   213
                            ) LOOP
gaurav@22036
   214
               v_Message_product:=v_Message_product||Cur_Lines.line||', ';
gaurav@22036
   215
          END LOOP;
gaurav@22036
   216
          if v_Message_product != '' then
gaurav@22036
   217
             RAISE_APPLICATION_ERROR(-20000, '@Inline@ '||v_Message_product||' '||'@ProductNullAndMovementQtyGreaterZero@') ;
gaurav@22036
   218
          end if ;
gaurav@22036
   219
	     End ;
atul@23544
   220
	     Declare
atul@23544
   221
       v_Message_Qty VARCHAR(2000) :='';
atul@23544
   222
	     BEGIN
atul@23544
   223
					FOR Cur_Lines IN (
atul@23544
   224
                             SELECT M.line
atul@23544
   225
                             FROM M_InOut I,
atul@23544
   226
                                  M_InOutLine M
atul@23544
   227
                             WHERE I.M_InOut_ID=M.M_InOut_ID
atul@23544
   228
                               AND I.M_INOUT_ID=v_Record_ID
atul@23544
   229
                               AND (M.M_PRODUCT_ID IS NOT NULL AND M.MOVEMENTQTY = 0)
atul@23544
   230
                               ORDER BY M.line
atul@23544
   231
                            ) LOOP
atul@23544
   232
          v_Message_Qty:=v_Message_Qty||Cur_Lines.line||', ';
atul@23544
   233
          END LOOP;
atul@23544
   234
          IF v_Message_Qty != '' THEN
atul@23544
   235
             RAISE_APPLICATION_ERROR(-20000, '@Inline@ '||v_Message_Qty||' '||'@ProductNotNullAndMovementQtyZero@') ;
atul@23544
   236
          END IF;
atul@23544
   237
	     End ;
atul@27706
   238
      DECLARE
atul@27706
   239
      v_Message_Inactive_Products VARCHAR(2000) :='';
atul@27706
   240
      BEGIN
atul@27706
   241
        FOR Cur_Lines IN (
atul@27706
   242
          SELECT IOL.line
atul@27706
   243
          FROM M_InOutLine IOL, M_PRODUCT P
atul@27706
   244
          WHERE IOL.M_INOUT_ID=v_Record_ID
atul@27706
   245
          AND P.M_PRODUCT_ID = IOL.M_PRODUCT_ID
atul@27706
   246
          AND IOL.M_PRODUCT_ID IS NOT NULL AND P.ISACTIVE='N'
atul@27706
   247
          ORDER BY IOL.line
atul@27706
   248
          )
atul@27706
   249
        LOOP
atul@27706
   250
          v_Message_Inactive_Products:=v_Message_Inactive_Products||Cur_Lines.line||', ';
atul@27706
   251
        END LOOP;
atul@27706
   252
        IF v_Message_Inactive_Products != '' THEN
atul@27706
   253
          RAISE_APPLICATION_ERROR(-20000, '@Inline@ '||v_Message_Inactive_Products||' '||'@InActiveProducts@') ;
atul@27706
   254
        END IF;
atul@27706
   255
      END;
atul@25116
   256
      SELECT CASE WHEN COALESCE(instr(M_INOUT.Description,'*R*:'),0) = 0 THEN 'N' ELSE 'Y' END
atul@25116
   257
            INTO v_IsReversedDoc
atul@25116
   258
            FROM M_INOUT
atul@25116
   259
            WHERE M_INOUT.M_INOUT_id = v_Record_ID;
atul@25116
   260
      -- Skip MovementQtyCheck when it is reversed document
atul@25116
   261
      if(v_isreturndoctype = 'N' AND v_isSoTrx = 'Y' and v_DocAction<>'RC' AND v_IsReversedDoc='N') then
pandeeswari@21778
   262
        v_message := null;
pandeeswari@21778
   263
        for Cur_OrderLine in (
atul@25018
   264
          select c_orderline_id, line, m_product_id
pandeeswari@21778
   265
          from m_inoutline
pandeeswari@21778
   266
          where m_inout_id = v_Record_ID
gaurav@22036
   267
          and c_orderline_id is not null
pandeeswari@21778
   268
          order by line
pandeeswari@21778
   269
        ) loop
atul@25116
   270
          select COALESCE(sum(ABS(movementqty)), 0)
pandeeswari@21778
   271
          into v_qty
pandeeswari@21778
   272
          from m_inoutline
pandeeswari@21778
   273
          where m_inout_id = v_Record_ID
pandeeswari@21778
   274
          and c_orderline_id = Cur_OrderLine.c_orderline_id;
pandeeswari@21778
   275
atul@25116
   276
          select ABS(qtyordered), (coalesce(ABS(qtydelivered), 0) + v_qty)
pandeeswari@21778
   277
          into v_QuantityOrder, v_qty
pandeeswari@21778
   278
          from c_orderline
pandeeswari@21778
   279
          where c_orderline_id = Cur_OrderLine.c_orderline_id;
pandeeswari@21778
   280
atul@25018
   281
          SELECT IsQuantityVariable INTO v_IsQtyVariable
atul@25018
   282
          FROM M_Product
atul@25018
   283
          WHERE M_Product_ID = Cur_OrderLine.M_Product_ID;
atul@25018
   284
atul@25018
   285
          IF(v_IsQtyVariable='N') THEN
atul@25018
   286
            if(v_QuantityOrder < v_qty) then
atul@25018
   287
              if v_message is null THEN
atul@25018
   288
                v_message := Cur_OrderLine.line;
atul@25018
   289
              ELSE
atul@25018
   290
                v_message := v_message || ', ' || Cur_OrderLine.line;
atul@25018
   291
              END IF;
atul@25018
   292
            end if;
atul@25018
   293
          END IF;
pandeeswari@21778
   294
        end loop;
pandeeswari@21778
   295
        if v_message is not null then
pandeeswari@21778
   296
          RAISE_APPLICATION_ERROR(-20000, '@MovementQtyCheck@'||' '||'@Inlines@'||' '||v_message);
pandeeswari@21778
   297
        end if;
pandeeswari@21778
   298
      end if;
fernando@25185
   299
    
fernando@25185
   300
    
fernando@25185
   301
    /* Check active business partner*/
fernando@25185
   302
      select bp.isactive into v_bp_isactive
fernando@25185
   303
      from m_inout io 
fernando@25185
   304
      left join c_bpartner bp on io.C_BPARTNER_ID = bp.C_BPARTNER_ID
fernando@25185
   305
      where io.M_INOUT_ID = v_Record_ID;
fernando@25185
   306
fernando@25185
   307
      IF(v_bp_isactive = 'N') THEN
fernando@25185
   308
        RAISE_APPLICATION_ERROR(-20000, '@InActiveBusinessPartner@');
fernando@25185
   309
      END IF;
pandeeswari@21778
   310
pandeeswari@21353
   311
      --Check whether warehouse belongs to the organization.
pandeeswari@21353
   312
      SELECT count(AD_ORG_ID)
pandeeswari@21353
   313
      INTO v_count
pandeeswari@21353
   314
      FROM AD_Org_Warehouse
pandeeswari@21353
   315
      WHERE M_Warehouse_ID=v_M_Warehouse_ID
pandeeswari@21353
   316
      AND AD_Org_ID = v_AD_Org_ID;
pandeeswari@21353
   317
pandeeswari@21340
   318
      IF v_count = 0 AND v_isSoTrx = 'Y' THEN
pandeeswari@21353
   319
        RAISE_APPLICATION_ERROR(-20000,'@WrongWarehouse@');
pandeeswari@21353
   320
      END IF;
pandeeswari@21353
   321
pandeeswari@21373
   322
      SELECT AD_Org_ID
pandeeswari@21373
   323
      INTO v_Warehouse_Org
pandeeswari@21373
   324
      FROM M_Warehouse
pandeeswari@21373
   325
      WHERE M_Warehouse_ID = v_M_Warehouse_ID;
pandeeswari@21373
   326
pandeeswari@21373
   327
      IF(ad_org_isinnaturaltree(v_Warehouse_Org, v_AD_Org_ID, v_AD_Client_ID) = 'N' AND v_isSoTrx = 'N') THEN
pandeeswari@21373
   328
        RAISE_APPLICATION_ERROR(-20000,'@WrongWarehouse@');
pandeeswari@21373
   329
      END IF;
pandeeswari@21373
   330
david@19194
   331
      SELECT CASE WHEN (m.ISSOTRX='Y') THEN customer_blocking ELSE vendor_blocking END, CASE WHEN (m.ISSOTRX='Y') 
david@19194
   332
      THEN so_goods_blocking ELSE po_goods_blocking END, name, DocAction
david@19194
   333
      INTO v_bpartner_blocked, v_goods_blocked, v_bpartner_name, v_DocAction
david@19194
   334
      FROM M_InOut m, C_BPartner bp
david@19194
   335
      WHERE m.c_bpartner_id = bp.c_bpartner_id
david@19194
   336
      AND m.M_InOut_ID=v_Record_ID
david@19194
   337
      AND m.C_BPARTNER_ID=bp.C_BPARTNER_ID;
david@19194
   338
      
david@19194
   339
      IF (v_DocAction = 'CO' AND v_bpartner_blocked = 'Y' AND v_goods_blocked = 'Y' AND v_isreturndoctype='N') THEN
david@19194
   340
        RAISE_APPLICATION_ERROR(-20000, '@ThebusinessPartner@'||' '|| v_bpartner_name ||' '||'@BusinessPartnerBlocked@');
david@19194
   341
      END IF;
david@19194
   342
      
rafael@5825
   343
     v_ResultStr:='CheckingRestrictions';
rafael@5825
   344
     SELECT COUNT(*)
rafael@5825
   345
     INTO v_Count
rafael@5825
   346
     FROM C_DocType,
rafael@5825
   347
          M_InOut M
rafael@5825
   348
     WHERE M_Inout_ID = v_Record_ID
rafael@5825
   349
       AND C_DocType.DocBaseType IN ('MMR', 'MMS')
rafael@5825
   350
      AND C_DocType.IsSOTrx=M.IsSOTrx
rafael@5825
   351
      AND AD_ISORGINCLUDED(m.AD_Org_ID,C_DocType.AD_Org_ID, m.AD_Client_ID) <> -1
rafael@5825
   352
       AND M.C_DOCTYPE_ID=C_DocType.C_DOCTYPE_ID;
naiara@19828
   353
        IF (v_Count=0) THEN
rafael@5825
   354
          RAISE_APPLICATION_ERROR(-20000, '@NotCorrectOrgDoctypeShipment@') ;
rafael@5825
   355
        END IF;
rafael@5825
   356
        SELECT COUNT(*), MAX(M.line)
rafael@5825
   357
        INTO v_Count, v_line
rafael@5825
   358
        FROM M_InOutLine M,
rafael@5825
   359
          M_Product P
rafael@5825
   360
        WHERE M.M_PRODUCT_ID=P.M_PRODUCT_ID
rafael@5825
   361
          AND P.M_ATTRIBUTESET_ID IS NOT NULL
rafael@6091
   362
          AND (P.ATTRSETVALUETYPE IS NULL OR P.ATTRSETVALUETYPE <> 'F')
rafael@6104
   363
          AND (SELECT ISONEATTRSETVALREQUIRED FROM M_ATTRIBUTESET WHERE M_ATTRIBUTESET_ID = P.M_ATTRIBUTESET_ID) = 'Y'
rafael@5825
   364
          AND COALESCE(M.M_ATTRIBUTESETINSTANCE_ID, '0') = '0'
rafael@5825
   365
          AND M.M_INOUT_ID=v_Record_ID;
rafael@5825
   366
        IF v_Count<>0 THEN
rafael@6091
   367
          RAISE_APPLICATION_ERROR(-20000, '@Inline@'||' '||v_line||' '||'@productWithoutAttributeSet@') ;
rafael@5825
   368
        END IF;
rafael@5825
   369
        SELECT COUNT(*), MAX(M.line)
rafael@5825
   370
        INTO v_Count, v_Line
rafael@5825
   371
        FROM M_InOut I,
rafael@5825
   372
          M_InOutLine M,
rafael@5825
   373
          M_AttributeSetInstance P
rafael@5825
   374
        WHERE I.M_InOut_ID=M.M_InOut_ID
rafael@5825
   375
          AND M.M_AttributeSetInstance_ID=P.M_AttributeSetInstance_ID
rafael@5825
   376
          AND P.ISLOCKED='Y'
rafael@5825
   377
          AND I.ISSOTRX='Y'
rafael@5825
   378
          AND I.M_INOUT_ID=v_Record_ID;
naiara@19828
   379
        IF (v_Count<>0) THEN
rafael@5825
   380
          RAISE_APPLICATION_ERROR(-20000, '@Inline@'||v_line||' '||'@lockedProduct@') ;
rafael@5825
   381
        END IF;
rafael@5825
   382
      -- check inout line instance location
rafael@5825
   383
        SELECT COUNT(*), MAX(M.line)
rafael@5825
   384
        INTO v_Count, v_Line
rafael@5825
   385
        FROM M_InOutLine M,
rafael@5825
   386
          M_Product P
rafael@5825
   387
        WHERE M.M_InOut_ID=v_Record_ID
rafael@5825
   388
          AND M.M_Locator_ID IS NULL
rafael@5825
   389
          AND p.m_product_id = m.m_product_id
rafael@5825
   390
          AND p.isstocked = 'Y'
rafael@5825
   391
          AND p.producttype = 'I';
naiara@19828
   392
        IF (v_Count <> 0) THEN
rafael@5825
   393
          RAISE_APPLICATION_ERROR(-20000, '@Inline@'||v_line||' '||'@InoutLineWithoutLocator@') ;
rafael@5825
   394
        END IF;	  
naiara@19828
   395
      --check if bom non-stockable is exploded
naiara@19828
   396
        SELECT COUNT(*), MAX(M.line)
naiara@19828
   397
        INTO v_Count, v_Line
naiara@19828
   398
        FROM M_InOutLine M,    
naiara@19828
   399
          M_Product P
naiara@19828
   400
        WHERE M.M_InOut_ID=v_Record_ID
naiara@19828
   401
          AND P.isBOM='Y' 
naiara@19828
   402
          AND P.isstocked='N'
naiara@19828
   403
          AND M.explode='N'
naiara@19828
   404
          AND p.m_product_id = m.m_product_id;
naiara@19828
   405
        IF (v_Count <> 0) THEN
naiara@19828
   406
          RAISE_APPLICATION_ERROR(-20000, '@Inline@'||v_line||' '||'@InoutLineNotExploded@') ;
naiara@19828
   407
        END IF;
gorkaion@14547
   408
    --Check negative quantities on return inouts
gorkaion@14547
   409
    IF (v_isreturndoctype = 'Y') THEN
gorkaion@14547
   410
      SELECT count(*) INTO v_count
gorkaion@14547
   411
      FROM m_inoutline iol JOIN c_orderline ol ON iol.c_orderline_id = ol.c_orderline_id
gorkaion@14547
   412
      WHERE iol.m_inout_id = v_record_id
gorkaion@14547
   413
        AND iol.movementqty > 0
ioritz@15868
   414
        AND canceled_inoutline_id IS NULL
gorkaion@14547
   415
        AND ol.c_order_discount_id IS NULL;
gorkaion@14547
   416
      IF (v_Count <> 0) THEN
gorkaion@14547
   417
        RAISE_APPLICATION_ERROR(-20000, '@ReturnInOutNegativeQty@');
gorkaion@14547
   418
      END IF;
gorkaion@14547
   419
    END IF;
gorkaion@20976
   420
      SELECT count(*) INTO v_count
gorkaion@20976
   421
      FROM dual
gorkaion@20976
   422
      WHERE EXISTS (
gorkaion@20976
   423
          SELECT 1
gorkaion@20976
   424
          FROM m_inoutline il JOIN m_product p ON il.m_product_id = p.m_product_id
gorkaion@20976
   425
          WHERE il.m_inout_id = v_record_id
gorkaion@20976
   426
            AND p.isgeneric = 'Y');
gorkaion@20944
   427
      IF (v_count > 0) THEN
gorkaion@20976
   428
        SELECT max(p.name) INTO v_productname
gorkaion@20976
   429
        FROM m_inoutline il JOIN m_product p ON il.m_product_id = p.m_product_id
gorkaion@20976
   430
        WHERE il.m_inout_id = v_record_id
gorkaion@20976
   431
          AND p.isgeneric = 'Y';
gorkaion@20944
   432
        RAISE_APPLICATION_ERROR(-20000, '@CannotUseGenericProduct@ ' || v_productName);
gorkaion@20944
   433
      END IF;
gorkaion@20944
   434
      
rafael@5825
   435
        -- Process Shipments
pandeeswari@19202
   436
      SELECT COUNT(*) INTO v_Aux
pandeeswari@19202
   437
      FROM M_InOutLine
pandeeswari@19202
   438
      WHERE M_InOut_ID = v_Record_ID;
pandeeswari@19202
   439
pandeeswari@19202
   440
      IF v_Aux > 0 THEN  
pandeeswari@19202
   441
        SELECT COUNT(*)
sandra@19203
   442
        INTO v_Count
pandeeswari@19202
   443
        FROM M_INOUT IO, M_INOUTLINE IOL
pandeeswari@19202
   444
        WHERE IO.M_INOUT_ID = IOL.M_INOUT_ID
eduardo@19387
   445
        AND AD_ISORGINCLUDED(IOL.AD_Org_ID, IO.AD_Org_ID, IO.AD_Client_ID) = -1
sandra@19203
   446
        AND IO.M_INOUT_ID = v_Record_ID;
eduardo@19387
   447
        IF (v_Count>0) THEN
sandra@19203
   448
          RAISE_APPLICATION_ERROR(-20000, '@NotCorrectOrgLines@') ;
pandeeswari@19202
   449
        END IF;
pandeeswari@18808
   450
      END IF;
rafael@5825
   451
      
rafael@5825
   452
      -- Check the header belongs to a organization where transactions are posible and ready to use
rafael@5825
   453
      SELECT AD_Org.IsReady, Ad_OrgType.IsTransactionsAllowed
rafael@5825
   454
      INTO v_is_ready, v_is_tr_allow
rafael@5825
   455
      FROM M_INOUT, AD_Org, AD_OrgType
rafael@5825
   456
      WHERE AD_Org.AD_Org_ID=M_INOUT.AD_Org_ID
rafael@5825
   457
      AND AD_Org.AD_OrgType_ID=AD_OrgType.AD_OrgType_ID
rafael@5825
   458
      AND M_INOUT.M_INOUT_ID=v_Record_ID;
rafael@5825
   459
      IF (v_is_ready='N') THEN
rafael@5825
   460
        RAISE_APPLICATION_ERROR(-20000, '@OrgHeaderNotReady@');
carlos@0
   461
      END IF;
rafael@5825
   462
      IF (v_is_tr_allow='N') THEN
rafael@5825
   463
        RAISE_APPLICATION_ERROR(-20000, '@OrgHeaderNotTransAllowed@');
carlos@0
   464
      END IF;
rafael@5825
   465
        
rafael@5825
   466
      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
   467
      IF (v_is_included=-1) THEN
rafael@5825
   468
        RAISE_APPLICATION_ERROR(-20000, '@LinesAndHeaderDifferentLEorBU@');
carlos@0
   469
      END IF;
asier@1929
   470
      
rafael@5825
   471
      -- Check the period control is opened (only if it is legal entity with accounting)
rafael@5825
   472
      -- Gets the BU or LE of the document
rafael@5825
   473
      SELECT AD_GET_DOC_LE_BU('M_INOUT', v_Record_ID, 'M_INOUT_ID', 'LE')
rafael@5825
   474
      INTO v_org_bule_id
victor@3065
   475
      FROM DUAL;
victor@3065
   476
      
rafael@5825
   477
      SELECT AD_OrgType.IsAcctLegalEntity
rafael@5825
   478
      INTO v_isacctle
rafael@5825
   479
      FROM AD_OrgType, AD_Org
rafael@5825
   480
      WHERE AD_Org.AD_OrgType_ID = AD_OrgType.AD_OrgType_ID
rafael@5825
   481
      AND AD_Org.AD_Org_ID=v_org_bule_id;
rafael@5825
   482
      
rafael@5825
   483
      IF (v_isacctle='Y') THEN    
rafael@5825
   484
        SELECT C_CHK_OPEN_PERIOD(v_AD_Org_ID, v_DateAcct, NULL, v_DocType_ID) 
rafael@5825
   485
        INTO v_available_period
rafael@5825
   486
        FROM DUAL;
javier@20594
   487
rafael@5825
   488
        IF (v_available_period<>1) THEN
javier@20594
   489
          IF (v_docAction <> 'RC') THEN
javier@20594
   490
             RAISE_APPLICATION_ERROR(-20000, '@PeriodNotAvailable@');
javier@20594
   491
          END IF;
rafael@5825
   492
        END IF;
rafael@5825
   493
      END IF;  
rafael@5825
   494
  
rafael@5825
   495
        FOR Cur_InOut IN
rafael@5825
   496
          (SELECT *
rafael@5825
   497
          FROM M_INOUT
rafael@5825
   498
          WHERE(M_InOut_ID=v_Record_ID
rafael@5825
   499
            OR(v_Record_ID IS NULL
rafael@5825
   500
            AND DocAction='CO'))
rafael@5825
   501
            AND IsActive='Y'  FOR UPDATE
rafael@5825
   502
          )
rafael@5825
   503
        LOOP
rafael@5825
   504
          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
   505
          v_ResultStr:='HeaderLoop';
rafael@5825
   506
          /**
rafael@5825
   507
          * Shipment not processed
rafael@5825
   508
          */
rafael@5825
   509
          IF(Cur_InOut.Processed='N' AND Cur_InOut.DocStatus='DR' AND Cur_InOut.DocAction='CO') THEN
rafael@5825
   510
            -- For all active shipment lines
rafael@5825
   511
            v_ResultStr:='HeaderLoop-1';
pandeeswari@19202
   512
            
rafael@5825
   513
        IF v_Aux=0 THEN
rafael@5825
   514
        RAISE_APPLICATION_ERROR(-20000, '@ReceiptWithoutLines@');
rafael@5825
   515
        END IF;
carlos@0
   516
          FOR Cur_InOutLine IN
carlos@0
   517
            (SELECT *
carlos@0
   518
            FROM M_INOUTLINE
carlos@0
   519
            WHERE M_InOut_ID=Cur_InOut.M_InOut_ID
carlos@0
   520
              AND IsActive='Y'  FOR UPDATE
carlos@0
   521
            )
carlos@0
   522
          LOOP
adrian@170
   523
            -- Incomming or Outgoing :1:2
carlos@0
   524
            v_Qty:=Cur_InOutLine.MovementQty;
carlos@0
   525
            v_QuantityOrder:=Cur_InOutLine.QuantityOrder;
carlos@0
   526
            IF(SUBSTR(Cur_InOut.MovementType, 2)='-') THEN
carlos@0
   527
              v_Qty:=- Cur_InOutLine.MovementQty;
carlos@0
   528
              v_QuantityOrder:=-Cur_InOutLine.QuantityOrder;
carlos@0
   529
            END IF;
carlos@0
   530
            IF(Cur_InOut.IsSOTrx='N') THEN
carlos@0
   531
              v_QtySO:=0;
carlos@0
   532
              v_QtyPO:=Cur_InOutLine.MovementQty;
carlos@0
   533
              v_QuantityOrderSO:=0;
carlos@0
   534
              v_QuantityOrderPO:=Cur_InOutLine.QuantityOrder;
carlos@0
   535
            ELSE
carlos@0
   536
              v_QtySO:=Cur_InOutLine.MovementQty;
carlos@0
   537
              v_QtyPO:=0;
carlos@0
   538
              v_QuantityOrderSO:=Cur_InOutLine.QuantityOrder;
carlos@0
   539
              v_QuantityOrderPO:=0;
carlos@0
   540
            END IF;
carlos@0
   541
            -- UOM Conversion
adrian@170
   542
            -- Is it a standard stocked product:3
carlos@0
   543
            SELECT COUNT(*)
carlos@0
   544
            INTO v_IsStocked
carlos@0
   545
            FROM M_PRODUCT
carlos@0
   546
            WHERE M_Product_ID=Cur_InOutLine.M_Product_ID
carlos@0
   547
              AND IsStocked='Y'
carlos@0
   548
              AND ProductType='I';
carlos@0
   549
            -- Create Transaction for stocked product
harikrishnan@8015
   550
            IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND v_IsStocked=1 AND Cur_InOutLine.IsDescription <> 'Y') THEN
gorkaion@18652
   551
              IF (cur_inout.issotrx = 'Y' AND cur_inoutline.c_orderline_id IS NOT NULL AND v_qty < 0 AND cur_inoutline.canceled_inoutline_id IS NULL) THEN
gorkaion@18652
   552
                -- Manage reservations.
gorkaion@18652
   553
                SELECT count(*), max(m_reservation_id)
gorkaion@18652
   554
                  INTO v_aux, v_reservation_id
gorkaion@18652
   555
                FROM m_reservation
david@22931
   556
                WHERE c_orderline_id = cur_inoutline.c_orderline_id
david@22931
   557
                AND res_status NOT IN ('DR', 'CL');
gorkaion@18652
   558
                IF (v_aux > 1) THEN
gorkaion@18652
   559
                  RAISE_APPLICATION_ERROR(-20000, '@SOLineWithMoreThanOneOpenReservation@');
gorkaion@18652
   560
                ELSIF (v_aux = 1) THEN
gorkaion@18652
   561
                  M_RESERVATION_CONSUMPTION(v_reservation_id, cur_inoutline.m_locator_id, cur_inoutline.m_attributesetinstance_id, cur_inoutline.movementqty, v_user, v_result, v_message);
gorkaion@18652
   562
                END IF;
gorkaion@18706
   563
              ELSIF (cur_inout.issotrx = 'Y' AND cur_inoutline.c_orderline_id IS NOT NULL AND v_qty > 0 AND cur_inoutline.canceled_inoutline_id IS NOT NULL) THEN
alvaro@28246
   564
                -- Undo reservation is done when voiding shipment
alvaro@28246
   565
                SELECT count(*), max(m_reservation_id)
alvaro@28246
   566
                INTO v_aux, v_reservation_id
alvaro@28246
   567
                FROM m_reservation
alvaro@28246
   568
                WHERE c_orderline_id = cur_inoutline.c_orderline_id
alvaro@28246
   569
                AND res_status NOT IN ('DR', 'CL');
alvaro@28246
   570
                IF (v_aux > 1) THEN
alvaro@28246
   571
                  RAISE_APPLICATION_ERROR(-20000, '@SOLineWithMoreThanOneOpenReservation@');
alvaro@28246
   572
                END IF;
gorkaion@19377
   573
              ELSIF (cur_inout.issotrx = 'N' AND cur_inoutline.canceled_inoutline_id IS NULL) THEN
gorkaion@18681
   574
                -- Manage pre-reserves
gorkaion@18681
   575
                DECLARE
gorkaion@18681
   576
                  cur_reserve_stock RECORD;
gorkaion@18681
   577
                  v_pendingqty NUMBER;
gorkaion@18681
   578
                  v_qtyaux NUMBER;
gorkaion@18681
   579
                  v_res_stock_id VARCHAR2(32);
gorkaion@18681
   580
                BEGIN
gorkaion@18681
   581
                  v_pendingqty := v_qty;
gorkaion@18681
   582
                  FOR cur_reserve_stock IN (
gorkaion@18681
   583
                      SELECT rs.*
gorkaion@18681
   584
                      FROM m_reservation_stock rs JOIN m_reservation r ON rs.m_reservation_id = r.m_reservation_id
gorkaion@18681
   585
                      WHERE rs.c_orderline_id = cur_inoutline.c_orderline_id
gorkaion@18681
   586
                        AND rs.quantity <> COALESCE(rs.releasedqty, 0)
gorkaion@18681
   587
                        AND rs.m_locator_id IS NULL
gorkaion@19377
   588
                        AND r.res_status NOT IN ('DR', 'CL')
gorkaion@18681
   589
                  ) LOOP
gorkaion@18681
   590
                    v_qtyaux := LEAST(cur_reserve_stock.quantity - COALESCE(cur_reserve_stock.releasedqty, 0), v_pendingqty);
gorkaion@18681
   591
                    -- Check if exists a reserved stock for the same orderline, attributes and locator in the reservation
gorkaion@18681
   592
                    SELECT count(*), max(m_reservation_stock_id) INTO v_aux, v_res_stock_id
gorkaion@18681
   593
                    FROM m_reservation_stock
gorkaion@19377
   594
                    WHERE c_orderline_id = cur_inoutline.c_orderline_id
gorkaion@19377
   595
                      AND m_locator_id = cur_inoutline.m_locator_id
gorkaion@19377
   596
                      AND m_reservation_id = cur_reserve_stock.m_reservation_id
david@22931
   597
                      AND isallocated = cur_reserve_stock.isallocated
gorkaion@19377
   598
                      AND COALESCE(m_attributesetinstance_id, '0') = COALESCE(Cur_InOutLine.M_AttributeSetInstance_ID, '0');
gorkaion@19377
   599
                    -- Update existing prereserved stock to decrease reserved qty
gorkaion@18681
   600
                    UPDATE m_reservation_stock
gorkaion@18681
   601
                    SET quantity = quantity - v_qtyaux
gorkaion@18681
   602
                    WHERE m_reservation_stock_id = cur_reserve_stock.m_reservation_stock_id;
gorkaion@19377
   603
                    -- Insert or update reserved stock by same quantity
gorkaion@18681
   604
                    IF (v_aux > 0) THEN
gorkaion@18681
   605
                      UPDATE m_reservation_stock
gorkaion@18681
   606
                      SET quantity = quantity + v_qtyaux
gorkaion@18681
   607
                      WHERE m_reservation_stock_id = v_res_stock_id;
gorkaion@18681
   608
                    ELSE
gorkaion@18681
   609
                      INSERT INTO m_reservation_stock(
gorkaion@18681
   610
                        m_reservation_stock_id, ad_client_id, ad_org_id, isactive,
gorkaion@18681
   611
                        created, createdby, updated, updatedby,
gorkaion@18681
   612
                        m_reservation_id, m_attributesetinstance_id, m_locator_id, c_orderline_id,
gorkaion@18681
   613
                        quantity, releasedqty, isallocated
gorkaion@18681
   614
                      ) VALUES (
gorkaion@18681
   615
                        get_uuid(), cur_reserve_stock.ad_client_id, cur_reserve_stock.ad_org_id, 'Y',
gorkaion@18681
   616
                        now(), v_user, now(), v_user,
eduardo@26192
   617
                        cur_reserve_stock.m_reservation_id, coalesce(cur_inoutline.m_attributesetinstance_id,'0'), cur_inoutline.m_locator_id, cur_inoutline.c_orderline_id,
david@22931
   618
                        v_qtyaux, 0, cur_reserve_stock.isallocated
gorkaion@18681
   619
                      );
gorkaion@18681
   620
                    END IF;
gorkaion@18681
   621
                    v_pendingqty := v_pendingqty - v_qtyaux;
gorkaion@18681
   622
                    IF (v_pendingqty <= 0) THEN
gorkaion@18681
   623
                      EXIT;
gorkaion@18681
   624
                    END IF;
gorkaion@18681
   625
                  END LOOP;
gorkaion@18681
   626
                  DELETE FROM m_reservation_stock
gorkaion@18681
   627
                  WHERE c_orderline_id = cur_inoutline.c_orderline_id
gorkaion@18681
   628
                    AND quantity = 0
gorkaion@18681
   629
                    AND COALESCE(releasedqty, 0) = 0;
gorkaion@18681
   630
                END;
gorkaion@19377
   631
              ELSIF (cur_inout.issotrx = 'N' AND cur_inoutline.canceled_inoutline_id IS NOT NULL AND v_qty < 0) THEN
gorkaion@19377
   632
                -- Revert to pre-reservations
david@22931
   633
atul@24291
   634
		BEGIN
david@22931
   635
                  select  sum(iol.movementqty)
david@22931
   636
                  into v_qtysumorders
david@22931
   637
                  from m_inoutline iol
david@22931
   638
                  WHERE  iol.c_orderline_id=cur_inoutline.c_orderline_id
david@22931
   639
                  and iol.m_locator_id=cur_inoutline.m_locator_id;
david@22931
   640
david@22931
   641
                  select rs.quantity
david@22931
   642
                  into v_released
david@22931
   643
                  from m_reservation_stock rs
david@22931
   644
                  where c_orderline_id=cur_inoutline.c_orderline_id
david@22931
   645
                  and rs.m_locator_id=cur_inoutline.m_locator_id;
david@22931
   646
atul@24291
   647
                EXCEPTION
atul@24291
   648
                  WHEN NO_DATA_FOUND THEN
atul@24291
   649
                  v_qtysumorders:=0;
atul@24291
   650
                  v_released:=0;
atul@24291
   651
                END;
david@22931
   652
                  v_penqty := -v_qty - ((v_qtysumorders+(-cur_inoutline.movementqty))-v_released);
david@22931
   653
gorkaion@19377
   654
                DECLARE
gorkaion@19377
   655
                  cur_reserve_stock     RECORD;
gorkaion@19377
   656
                  v_pendingqty          NUMBER;
gorkaion@19377
   657
                  v_qtyaux              NUMBER;
gorkaion@19377
   658
                  v_res_stock_id        VARCHAR2(32);
gorkaion@19380
   659
                  v_aux_released NUMBER:= 0;
gorkaion@19377
   660
                BEGIN
david@22931
   661
                  v_pendingqty:=v_penqty;
gorkaion@19377
   662
                  FOR cur_reserve_stock IN (
gorkaion@19377
   663
                      SELECT rs.quantity, COALESCE(rs.releasedqty,0) AS releasedqty, rs.m_reservation_stock_id, rs.m_reservation_id,
david@22931
   664
                          rs.ad_org_id, rs.ad_client_id, rs.isallocated
gorkaion@19377
   665
                      FROM m_reservation_stock rs JOIN m_reservation r ON rs.m_reservation_id = r.m_reservation_id
gorkaion@19377
   666
                      WHERE rs.c_orderline_id = cur_inoutline.c_orderline_id
gorkaion@19377
   667
                        AND rs.m_locator_id = cur_inoutline.m_locator_id
gorkaion@19377
   668
                        AND r.res_status NOT IN ('DR', 'CL')
gorkaion@19377
   669
                  ) LOOP
gorkaion@19377
   670
                    v_qtyaux := LEAST((cur_reserve_stock.quantity - COALESCE(cur_reserve_stock.releasedqty, 0)), v_pendingqty);
gorkaion@19377
   671
                    v_aux_released := v_aux_released + COALESCE(cur_reserve_stock.releasedqty, 0);
gorkaion@20270
   672
                    IF (cur_reserve_stock.quantity <> COALESCE(cur_reserve_stock.releasedqty, 0)) THEN
gorkaion@20270
   673
                      -- Check if exists a prereservation for the same orderline, attributes and locator in the reservation
gorkaion@20270
   674
                      SELECT count(*), max(m_reservation_stock_id) INTO v_aux, v_res_stock_id
gorkaion@20270
   675
                      FROM m_reservation_stock
gorkaion@20270
   676
                      WHERE c_orderline_id = cur_inoutline.c_orderline_id
gorkaion@20270
   677
                        AND m_locator_id IS NULL
gorkaion@20270
   678
                        AND m_reservation_id = cur_reserve_stock.m_reservation_id;
gorkaion@20270
   679
                      -- Update existing prereserved stock to decrease reserved qty
david@22931
   680
gorkaion@19377
   681
                      UPDATE m_reservation_stock
gorkaion@20270
   682
                      SET quantity = quantity - v_qtyaux
gorkaion@20270
   683
                      WHERE m_reservation_stock_id = cur_reserve_stock.m_reservation_stock_id;
gorkaion@20270
   684
                      -- Insert or update reserved stock by same quantity
gorkaion@20270
   685
                      IF (v_aux > 0) THEN
gorkaion@20270
   686
                        UPDATE m_reservation_stock
gorkaion@20270
   687
                        SET quantity = quantity + v_qtyaux
gorkaion@20270
   688
                        WHERE m_reservation_stock_id = v_res_stock_id;
gorkaion@20270
   689
                      ELSE
gorkaion@20270
   690
                        INSERT INTO m_reservation_stock (
gorkaion@20270
   691
                          m_reservation_stock_id, ad_client_id, ad_org_id, isactive,
gorkaion@20270
   692
                          created, createdby, updated, updatedby,
gorkaion@20270
   693
                          m_reservation_id, m_attributesetinstance_id, m_locator_id, c_orderline_id,
gorkaion@20270
   694
                          quantity, releasedqty, isallocated
gorkaion@20270
   695
                        ) VALUES (
gorkaion@20270
   696
                          get_uuid(), cur_reserve_stock.ad_client_id, cur_reserve_stock.ad_org_id, 'Y',
gorkaion@20270
   697
                          now(), v_user, now(), v_user,
gorkaion@20270
   698
                          cur_reserve_stock.m_reservation_id, '0', NULL, cur_inoutline.c_orderline_id,
david@22931
   699
                          v_qtyaux, 0, cur_reserve_stock.isallocated
gorkaion@20270
   700
                        );
gorkaion@20270
   701
                      END IF;
gorkaion@20270
   702
                      v_pendingqty := v_pendingqty - v_qtyaux;
gorkaion@20270
   703
                      IF (v_pendingqty <= 0) THEN
gorkaion@20270
   704
                        EXIT;
gorkaion@20270
   705
                      END IF;
gorkaion@19377
   706
                    END IF;
gorkaion@19377
   707
                  END LOOP;
gorkaion@19377
   708
                  IF (v_pendingqty > 0 AND v_aux_released > 0) THEN
gorkaion@19377
   709
                    -- Not all quantity has been reverted to pre-reservation having released quantity.
gorkaion@19377
   710
                    RAISE_APPLICATION_ERROR(-20000, '@ReceiptVoidReleasedQtyFound@');
gorkaion@19377
   711
                  END IF;
gorkaion@19377
   712
                  DELETE FROM m_reservation_stock
gorkaion@19377
   713
                  WHERE c_orderline_id = cur_inoutline.c_orderline_id
gorkaion@19377
   714
                    AND quantity = 0
gorkaion@19377
   715
                    AND COALESCE(releasedqty, 0) = 0;
gorkaion@19377
   716
                END;
david@22931
   717
gorkaion@18652
   718
              END IF;
david@22931
   719
carlos@0
   720
              v_ResultStr:='CreateTransaction';
carlos@0
   721
              Ad_Sequence_Next('M_Transaction', Cur_InOutLine.AD_Org_ID, v_NextNo) ;
carlos@0
   722
              INSERT
carlos@0
   723
              INTO M_TRANSACTION
carlos@0
   724
                (
carlos@0
   725
                  M_Transaction_ID, M_InOutLine_ID, AD_Client_ID, AD_Org_ID,
carlos@0
   726
                  IsActive, Created, CreatedBy, Updated,
carlos@0
   727
                  UpdatedBy, MovementType, M_Locator_ID, M_Product_ID,
carlos@0
   728
                  M_AttributeSetInstance_ID, MovementDate, MovementQty, M_Product_UOM_ID,
carlos@0
   729
                  QuantityOrder, C_UOM_ID
carlos@0
   730
                )
carlos@0
   731
                VALUES
carlos@0
   732
                (
carlos@0
   733
                  v_NextNo, Cur_InOutLine.M_InOutLine_ID, Cur_InOutLine.AD_Client_ID, Cur_InOutLine.AD_Org_ID,
harikrishnan@7227
   734
                   'Y', now(), v_User, now(),
harikrishnan@7227
   735
                  v_User, Cur_InOut.MovementType, Cur_InOutLine.M_Locator_ID, Cur_InOutLine.M_Product_ID,
juanpablo@1605
   736
                  COALESCE(Cur_InOutLine.M_AttributeSetInstance_ID, '0'), Cur_InOut.MovementDate, v_Qty, Cur_InOutLine.M_Product_UOM_ID,
carlos@0
   737
                  v_QuantityOrder, Cur_InOutLine.C_UOM_ID
carlos@0
   738
                )
carlos@0
   739
                ;
carlos@0
   740
            END IF;
carlos@0
   741
            -- Create Asset
carlos@0
   742
            IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND Cur_InOut.IsSOTrx='Y') THEN
antonio@735
   743
              A_ASSET_CREATE(NULL, Cur_InOutLine.M_InOutLine_ID) ;
carlos@0
   744
            END IF;
carlos@0
   745
            v_ResultStr:='UpdateOrderLine';
carlos@0
   746
            IF(Cur_InOutLine.C_OrderLine_ID IS NOT NULL) THEN
atul@21879
   747
              if(Cur_InOut.ISSOTRX='Y') THEN
atul@21879
   748
                -- Sets DateDelivered with the recent shipment date
atul@21879
   749
                -- of the shipment/s done for the orderline.
atul@21879
   750
                SELECT MAX(M.MOVEMENTDATE) INTO v_DateDelivered
atul@21879
   751
                FROM M_INOUTLINE ML, M_INOUT M
atul@21879
   752
                WHERE ML.C_OrderLine_ID = Cur_InOutLine.C_OrderLine_ID
atul@21879
   753
                AND ML.M_INOUT_ID = M.M_INOUT_ID
atul@21879
   754
                AND M.DOCSTATUS='CO';
atul@21879
   755
              ELSE
atul@21879
   756
                v_DateDelivered := null;
atul@21879
   757
              END IF;
atul@21879
   758
atul@21879
   759
              IF(v_QtySO > 0) THEN
atul@21879
   760
                IF(v_DateDelivered IS NULL OR v_DateDelivered < Cur_InOut.MovementDate ) THEN
atul@21879
   761
                  v_DateDelivered:=Cur_InOut.MovementDate;
atul@21879
   762
                END IF;
atul@21879
   763
              END IF;
atul@21879
   764
              
carlos@0
   765
              -- stocked product
carlos@0
   766
              IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND v_IsStocked=1) THEN
carlos@0
   767
                -- Update OrderLine (if C-, Qty is negative)
javier@21256
   768
                SELECT DOCSTATUS into v_DocStatus
javier@21256
   769
                FROM C_ORDER
javier@21256
   770
                WHERE C_ORDER_ID = (SELECT C_ORDER_ID
javier@21256
   771
                                    FROM C_ORDERLINE 
javier@21256
   772
                                    WHERE C_ORDERLINE_ID=Cur_InOutLine.C_OrderLine_ID);
javier@21256
   773
                IF (v_DocStatus = 'DR') THEN
javier@21256
   774
                  UPDATE C_ORDERLINE
javier@21256
   775
                    SET QtyDelivered=QtyDelivered + v_QtySO,
atul@21879
   776
                    DATEDELIVERED=(CASE WHEN (QtyDelivered + v_QtySO) > 0 THEN v_DateDelivered ELSE NULL END),
javier@21256
   777
                    Updated=now(),
javier@21256
   778
                    UpdatedBy=v_User
javier@21256
   779
                  WHERE C_OrderLine_ID=Cur_InOutLine.C_OrderLine_ID;
javier@21256
   780
                ELSE 
javier@21256
   781
                  UPDATE C_ORDERLINE
javier@21256
   782
                    SET QtyReserved=QtyReserved - v_QtyPO - v_QtySO,
atul@21879
   783
                    DATEDELIVERED=(CASE WHEN (QtyReserved - v_QtyPO - v_QtySO) > 0 THEN v_DateDelivered ELSE NULL END),
javier@21256
   784
                    QtyDelivered=QtyDelivered + v_QtySO,
javier@21256
   785
                    Updated=now(),
javier@21256
   786
                    UpdatedBy=v_User
javier@21256
   787
                   WHERE C_OrderLine_ID=Cur_InOutLine.C_OrderLine_ID;
javier@21256
   788
                END IF;
carlos@0
   789
                -- Products not stocked
carlos@0
   790
              ELSE
carlos@0
   791
                -- Update OrderLine (if C-, Qty is negative)
carlos@0
   792
                UPDATE C_ORDERLINE
carlos@0
   793
                  SET QtyDelivered=QtyDelivered + v_QtySO,
atul@21879
   794
                  DATEDELIVERED=(CASE WHEN (QtyDelivered + v_QtySO) > 0 THEN v_DateDelivered ELSE NULL END),
harikrishnan@7227
   795
                  Updated=now(),
harikrishnan@7227
   796
                  UpdatedBy=v_User
carlos@0
   797
                WHERE C_OrderLine_ID=Cur_InOutLine.C_OrderLine_ID;
carlos@0
   798
              END IF;
carlos@0
   799
            END IF;
carlos@0
   800
            IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND v_IsStocked=1) THEN
david@27385
   801
              M_Check_Stock(Cur_InOutLine.M_Product_ID, v_AD_Client_ID, Cur_InOutLine.AD_Org_ID, v_Result, v_Message) ;
carlos@0
   802
              IF v_Result=0 THEN
ioritz@16496
   803
                SELECT name INTO v_ProductName FROM M_Product WHERE M_Product_id = Cur_InOutLine.M_Product_ID;
ioritz@16496
   804
			    RAISE_APPLICATION_ERROR(-20000, v_Message||' '||'@line@'||' '||Cur_InOutLine.line||', '||'@Product@'||' '||v_ProductName) ;
carlos@0
   805
              END IF;
carlos@0
   806
            END IF;
carlos@0
   807
          END LOOP; -- For all InOut Lines
carlos@0
   808
          /*******************
carlos@0
   809
          * PO Matching
carlos@0
   810
          ******************/
carlos@0
   811
          IF(Cur_InOut.IsSOTrx='N') THEN
carlos@0
   812
            DECLARE
carlos@0
   813
              Cur_SLines RECORD;
carlos@0
   814
              Cur_ILines RECORD;
carlos@0
   815
              v_Qty NUMBER;
juanpablo@1605
   816
              v_MatchPO_ID VARCHAR2(32) ;
juanpablo@1605
   817
              v_MatchInv_ID VARCHAR2(32) ;
carlos@0
   818
            BEGIN
carlos@0
   819
              v_ResultStr:='MatchPO';
carlos@0
   820
              FOR Cur_SLines IN
carlos@0
   821
                (SELECT sl.AD_Client_ID,
carlos@0
   822
                  sl.AD_Org_ID,
carlos@0
   823
                  ol.C_OrderLine_ID,
carlos@0
   824
                  sl.M_InOutLine_ID,
carlos@0
   825
                  sl.M_Product_ID,
carlos@0
   826
                  sl.M_AttributeSetInstance_ID,
carlos@0
   827
                  sl.MovementQty,
carlos@0
   828
                  ol.QtyOrdered
carlos@0
   829
                FROM M_INOUTLINE sl,
carlos@0
   830
                  C_ORDERLINE ol
carlos@0
   831
                WHERE sl.C_OrderLine_ID=ol.C_OrderLine_ID
carlos@0
   832
                  AND sl.M_Product_ID=ol.M_Product_ID  --    AND   sl.M_AttributeSetInstance_ID=ol.M_AttributeSetInstance_ID
carlos@0
   833
                  AND sl.M_InOut_ID=Cur_InOut.M_InOut_ID
carlos@0
   834
                )
david@19206
   835
              LOOP          
david@19010
   836
mikel@19201
   837
                v_Qty:=Cur_SLines.MovementQty;
mikel@19201
   838
                --IF (ABS(Cur_SLines.MovementQty) > ABS(Cur_SLines.QtyOrdered)) THEN
mikel@19201
   839
                -- v_Qty := Cur_SLines.QtyOrdered;
mikel@19201
   840
                --END IF;
david@19010
   841
mikel@19201
   842
                  Ad_Sequence_Next('M_MatchPO', Cur_SLines.AD_Org_ID, v_MatchPO_ID) ;
mikel@19201
   843
                  -- The min qty. Modified by Ismael Ciordia
mikel@19201
   844
                  v_ResultStr:='InsertMatchPO ' || v_MatchPO_ID;
mikel@19201
   845
                  INSERT
mikel@19201
   846
                  INTO M_MATCHPO
mikel@19201
   847
                    (
mikel@19201
   848
                      M_MatchPO_ID, AD_Client_ID, AD_Org_ID, IsActive,
mikel@19201
   849
                      Created, CreatedBy, Updated, UpdatedBy,
mikel@19201
   850
                      M_InOutLine_ID, C_OrderLine_ID, M_Product_ID, DateTrx,
mikel@19201
   851
                      Qty, Processing, Processed, Posted
mikel@19201
   852
                    )
mikel@19201
   853
                    VALUES
mikel@19201
   854
                    (
mikel@19201
   855
                      v_MatchPO_ID, Cur_SLines.AD_Client_ID, Cur_SLines.AD_Org_ID, 'Y',
mikel@19201
   856
                      now(), v_User, now(), v_User,
mikel@19201
   857
                      Cur_SLines.M_InOutLine_ID, Cur_SLines.C_OrderLine_ID, Cur_SLines.M_Product_ID, now(),
mikel@19201
   858
                      v_Qty, 'N', 'Y', 'N'
mikel@19201
   859
                    )
mikel@19201
   860
                  ;
mikel@19198
   861
                  
carlos@0
   862
              END LOOP;
carlos@0
   863
              v_ResultStr:='MatchInv';
carlos@0
   864
              FOR Cur_ILines IN
carlos@0
   865
                (SELECT sl.AD_Client_ID,
carlos@0
   866
                  sl.AD_Org_ID,
carlos@0
   867
                  il.C_InvoiceLine_ID,
carlos@0
   868
                  sl.M_InOutLine_ID,
carlos@0
   869
                  sl.M_Product_ID,
carlos@0
   870
                  sl.M_AttributeSetInstance_ID,
carlos@0
   871
                  sl.MovementQty,
david@7233
   872
                  il.QTYINVOICED,
david@7233
   873
                  i.DateAcct
carlos@0
   874
                FROM M_INOUTLINE sl,
david@7233
   875
                  C_INVOICE i,
carlos@0
   876
                  C_INVOICELINE il
carlos@0
   877
                WHERE sl.M_InOutLine_ID=il.M_InOutLine_ID
carlos@0
   878
                  AND sl.M_InOut_ID=Cur_InOut.M_InOut_ID
david@7233
   879
                  AND i.C_INVOICE_ID = il.C_INVOICE_ID
carlos@0
   880
                )
carlos@0
   881
              LOOP
carlos@0
   882
                Ad_Sequence_Next('M_MatchInv', Cur_ILines.AD_Org_ID, v_MatchInv_ID) ;
carlos@0
   883
                -- The min qty. Modified by Ismael Ciordia
carlos@0
   884
                v_Qty:=Cur_ILines.MovementQty;
gorkaion@239
   885
                --IF (ABS(Cur_ILines.MovementQty) > ABS(Cur_ILines.QtyInvoiced)) THEN
carlos@0
   886
                -- v_Qty := Cur_ILines.QtyInvoiced;
carlos@0
   887
                --END IF;
carlos@0
   888
                v_ResultStr:='InsertMatchPO ' || v_MatchPO_ID;
carlos@0
   889
                INSERT
carlos@0
   890
                INTO M_MATCHINV
carlos@0
   891
                  (
carlos@0
   892
                    M_MATCHINV_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
carlos@0
   893
                    CREATED, CREATEDBY, UPDATED, UPDATEDBY,
carlos@0
   894
                    M_INOUTLINE_ID, C_INVOICELINE_ID, M_PRODUCT_ID, DATETRX,
carlos@0
   895
                    QTY, PROCESSING, PROCESSED, POSTED
carlos@0
   896
                  )
carlos@0
   897
                  VALUES
carlos@0
   898
                  (
carlos@0
   899
                    v_MatchInv_ID, Cur_ILines.AD_Client_ID, Cur_ILines.AD_Org_ID, 'Y',
harikrishnan@7227
   900
                    now(), v_User, now(), v_User,
david@7233
   901
                    Cur_ILines.M_InOutLine_ID, Cur_ILines.C_InvoiceLine_ID, Cur_ILines.M_Product_ID, Cur_ILines.DateAcct,
carlos@0
   902
                    v_Qty, 'N', 'Y', 'N'
carlos@0
   903
                  )
carlos@0
   904
                  ;
carlos@0
   905
              END LOOP;
gorkaion@24928
   906
              -- Set check price difference to true in case the receipt line has a related invoice.
gorkaion@24928
   907
              UPDATE M_TRANSACTION
gorkaion@24928
   908
              SET checkpricedifference = 'Y'
gorkaion@24928
   909
              WHERE M_INOUTLINE_ID IN (SELECT DISTINCT il.m_inoutline_id
gorkaion@24928
   910
                                       FROM m_inoutline il
gorkaion@24928
   911
                                          JOIN m_matchinv mi ON il.m_inoutline_id = mi.m_inoutline_id
gorkaion@24928
   912
                                       WHERE il.m_inout_id = Cur_InOut.M_InOut_ID);
carlos@0
   913
            END;
gorkaion@3170
   914
          ELSE
gaurav@21852
   915
            --Void document is created automatically from main document . 
gaurav@21852
   916
            --during completion of void document , we have to skip delivery rule for void document .
gaurav@21852
   917
            select COALESCE(instr(M_INOUT.Description,'*R*:'),0) 
gaurav@21852
   918
            into v_voiddoccount 
gaurav@21852
   919
            from M_INOUT
gaurav@21852
   920
            where M_INOUT.M_INOUT_id =v_Record_ID;
gaurav@21852
   921
            if v_voiddoccount = 0 then
gaurav@21852
   922
              v_ResultStr:='Check delivery rule for sales orders';
gaurav@21852
   923
              v_Message_aux:='';
gaurav@21852
   924
              v_orderid_old:='0';
gaurav@21852
   925
              FOR Cur_Order IN 
gaurav@21852
   926
                (SELECT c_order.deliveryrule, m_inoutline.line, c_order.c_order_id,
gaurav@21852
   927
                        c_order.documentno, c_orderline.line as orderline
gaurav@21852
   928
                 FROM M_InOutLine, C_Orderline, C_Order
gaurav@21852
   929
                 WHERE M_Inoutline.c_orderline_id = c_orderline.c_orderline_id
gaurav@21852
   930
                   AND c_orderline.c_order_id = c_order.c_order_id
gaurav@21852
   931
                   AND m_inoutline.m_inout_id = cur_inout.m_inout_id
gaurav@21852
   932
                   AND ((c_order.deliveryrule = 'O'
gaurav@21852
   933
                        AND EXISTS (SELECT 1 FROM C_OrderLine ol
gaurav@21852
   934
                                    WHERE ol.C_Order_ID = C_order.c_order_id
gaurav@21852
   935
                                      and ol.qtyordered > ol.qtydelivered ))
gaurav@21852
   936
                        OR (c_order.deliveryrule = 'L' 
gaurav@21852
   937
                            AND c_orderline.qtyordered > c_orderline.qtydelivered))
gaurav@21852
   938
                 ORDER BY c_order.c_order_id, c_orderline.line) LOOP
gaurav@21852
   939
                --Order lines not completely delivered with delivery rule O or L
gaurav@21852
   940
                IF (v_orderid_old <> cur_order.c_order_id OR cur_order.deliveryrule <> 'O' ) THEN
gaurav@21852
   941
                  v_Message_aux := COALESCE(v_Message_aux,'') || '@Shipment@' || ' ' || cur_inout.documentno;
gaurav@21852
   942
                  v_Message_aux := v_Message_aux || ' ' || '@line@' || ' ' || cur_order.line || ': ';
gaurav@21852
   943
                  v_Message_aux := v_Message_aux || '@SalesOrderDocumentno@' || cur_order.documentno;
gaurav@21852
   944
                  IF (cur_order.deliveryrule = 'O') THEN
gaurav@21852
   945
                    v_Message_aux := v_Message_aux || ' ' || '@notCompleteDeliveryRuleOrder@' || '<br>';
gaurav@21852
   946
                  ELSE
gaurav@21852
   947
                    v_Message_aux := v_Message_aux || ' ' || '@line@' || ' ' || cur_order.orderline;
gaurav@21852
   948
                    v_Message_aux := v_Message_aux || ' ' || '@notCompleteDeliveryRuleLine@' || '<br>';
gaurav@21852
   949
                  END IF;
gorkaion@3170
   950
                END IF;
gaurav@21852
   951
                v_orderid_old := cur_order.c_order_id;
gaurav@21852
   952
              END LOOP;
gaurav@21852
   953
              IF (v_Message_aux IS NOT NULL AND v_Message_aux <> '') THEN
gaurav@21852
   954
                RAISE_APPLICATION_ERROR(-20000, v_Message_aux);
gorkaion@3170
   955
              END IF;
gorkaion@3170
   956
            END IF;
carlos@0
   957
          END IF;
carlos@0
   958
          -- Close Shipment
carlos@0
   959
          v_ResultStr:='CloseShipment';
carlos@0
   960
          UPDATE M_INOUT
carlos@0
   961
            SET Processed='Y',
carlos@0
   962
            DocStatus='CO',
carlos@0
   963
            DocAction='--',
mikel@19150
   964
            Process_Goods_Java='--',
harikrishnan@7227
   965
            Updated=now(),
harikrishnan@7227
   966
            UpdatedBy=v_User
carlos@0
   967
          WHERE M_INOUT.M_INOUT_ID=Cur_InOut.M_INOUT_ID;
carlos@0
   968
          --
asier@1027
   969
          
asier@1027
   970
         
carlos@0
   971
          -- Not Processed + Complete --
carlos@0
   972
          /**
carlos@0
   973
          * Reverse Correction
carlos@0
   974
          */
carlos@0
   975
        ELSIF(Cur_InOut.DocStatus='CO' AND Cur_InOut.DocAction='RC') THEN
javier@17645
   976
          --Check if the m_inoutlines has an invoice lines related. In this case is not possible to void the m_inout.
javier@17645
   977
	  SELECT COUNT(*)
javier@17645
   978
          INTO v_count
javier@17645
   979
          FROM M_INOUTLINE MIOL 
javier@17645
   980
              JOIN C_INVOICELINE CIL ON MIOL.M_INOUTLINE_ID=CIL.M_INOUTLINE_ID 
javier@17645
   981
              JOIN C_INVOICE CI ON CI.C_INVOICE_ID=CIL.C_INVOICE_ID
javier@17645
   982
          WHERE M_INOUT_ID=Cur_InOut.m_inout_id
javier@17645
   983
          AND CI.DOCSTATUS <> 'VO';
javier@17645
   984
          IF (v_count <> 0) THEN
javier@17645
   985
	     RAISE_APPLICATION_ERROR(-20000,'@VoidShipmentWithRelatedInvoice@');
javier@17645
   986
          END IF;
gorkaion@5377
   987
          --Check that there isn't any line with an invoice if the order's 
gorkaion@5377
   988
          --invoice rule is after delivery
gorkaion@5377
   989
          select count(*), max(line) into v_count, v_line
gorkaion@5377
   990
          from (
gorkaion@5377
   991
          SELECT m_inoutline.m_inoutline_id, m_inoutline.line
gorkaion@5377
   992
          from m_inoutline, c_order, c_orderline, c_invoiceline, m_inout, c_invoice
gorkaion@5377
   993
          where m_inoutline.c_orderline_id = c_orderline.c_orderline_id
gorkaion@5377
   994
            and c_orderline.c_order_id = c_order.c_order_id
gorkaion@5377
   995
            and c_orderline.c_orderline_id = c_invoiceline.c_orderline_id
gorkaion@5377
   996
            and m_inoutline.m_inout_id = m_inout.m_inout_id
gorkaion@5377
   997
            and c_invoiceline.c_invoice_id = c_invoice.c_invoice_id
gorkaion@5377
   998
            and m_inout.m_inout_id = Cur_InOut.m_inout_id
gorkaion@5377
   999
            and m_inout.issotrx = 'Y'
gorkaion@5377
  1000
            and c_order.invoicerule in ('D', 'O', 'S')
gorkaion@5377
  1001
            and c_invoice.processed='Y'
gorkaion@5377
  1002
          group by m_inoutline.m_inoutline_id, m_inoutline.line
rafael@5506
  1003
          having sum(c_invoiceline.qtyinvoiced) <> 0
gorkaion@5377
  1004
          ) a;
gorkaion@5377
  1005
          IF (v_count > 0 ) THEN
gorkaion@5377
  1006
            v_Message := '@InoutDocumentno@' || ': ' || Cur_InOut.DocumentNo || ' ' || '@line@' || ': ' || v_line || '. ';
gorkaion@5377
  1007
            v_Message := v_Message || '@VoidShipmentInvoiced@';
gorkaion@5377
  1008
            RAISE_APPLICATION_ERROR(-20000, v_Message);
gorkaion@5377
  1009
          END IF;
carlos@0
  1010
          v_ResultStr:='CreateInOut';
carlos@0
  1011
          SELECT COALESCE(C_DOCTYPE_REVERSED_ID, C_DOCTYPE_ID)
carlos@0
  1012
          INTO v_DoctypeReversed_ID
carlos@0
  1013
          FROM C_DOCTYPE
carlos@0
  1014
          WHERE C_DOCTYPE_ID=Cur_InOut.C_DocType_ID;
carlos@0
  1015
          Ad_Sequence_Next('M_InOut', Cur_InOut.M_InOut_ID, v_RInOut_ID) ; -- Get RInOut_ID
carlos@0
  1016
          Ad_Sequence_Doctype(v_DoctypeReversed_ID, Cur_InOut.M_InOut_ID, 'Y', v_RDocumentNo) ; -- Get RDocumentNo
carlos@0
  1017
          IF(v_RDocumentNo IS NULL) THEN
carlos@0
  1018
            AD_Sequence_Doc('DocumentNo_M_InOut', Cur_InOut.AD_Client_ID, 'Y', v_RDocumentNo) ;
carlos@0
  1019
          END IF;
carlos@0
  1020
          -- Indicate that it is invoiced (i.e. not printed on invoices)
carlos@0
  1021
          v_ResultStr:='SetInvoiced';
harikrishnan@7227
  1022
          UPDATE M_INOUTLINE  SET IsInvoiced='Y',Updated=now(),UpdatedBy=v_User  WHERE M_InOut_ID=Cur_InOut.M_InOut_ID;
carlos@0
  1023
          --
carlos@0
  1024
          DBMS_OUTPUT.PUT_LINE('Reverse InOut_ID=' || v_RInOut_ID || ' DocumentNo=' || v_RDocumentNo) ;
carlos@0
  1025
          v_ResultStr:='InsertInOut Reverse ' || v_RInOut_ID;
carlos@0
  1026
          INSERT
carlos@0
  1027
          INTO M_INOUT
carlos@0
  1028
            (
carlos@0
  1029
              M_InOut_ID, C_Order_ID, IsSOTrx, AD_Client_ID,
carlos@0
  1030
              AD_Org_ID, IsActive, Created, CreatedBy,
carlos@0
  1031
              Updated, UpdatedBy, DocumentNo, C_DocType_ID,
carlos@0
  1032
              Description, IsPrinted, MovementType, MovementDate,
carlos@0
  1033
              DateAcct, C_BPartner_ID, C_BPartner_Location_ID, AD_User_ID,
carlos@0
  1034
              M_Warehouse_ID, POReference, DateOrdered, DeliveryRule,
carlos@0
  1035
              FreightCostRule, FreightAmt, C_Project_ID, C_Activity_ID,
carlos@0
  1036
              C_Campaign_ID, AD_OrgTrx_ID, User1_ID, User2_ID,
eduardo@18857
  1037
              C_Costcenter_ID, A_Asset_ID,
carlos@0
  1038
              DeliveryViaRule, M_Shipper_ID, C_Charge_ID, ChargeAmt,
carlos@0
  1039
              PriorityRule, DocStatus, DocAction, Processing,
pandeeswari@22934
  1040
              Processed, ISLOGISTIC, salesrep_id, Process_Goods_Java,
pandeeswari@22934
  1041
              calculate_freight, m_freightcategory_id, freight_currency_id 
carlos@0
  1042
            )
carlos@0
  1043
            VALUES
carlos@0
  1044
            (
carlos@0
  1045
              v_RInOut_ID, Cur_InOut.C_Order_ID, Cur_InOut.IsSOTrx, Cur_InOut.AD_Client_ID,
harikrishnan@7227
  1046
              Cur_InOut.AD_Org_ID, 'Y', now(), v_User,
harikrishnan@7227
  1047
              now(), v_User, v_RDocumentNo, v_DoctypeReversed_ID,
unai@15382
  1048
               '(*R*: ' || Cur_InOut.DocumentNo || ') ' || COALESCE(TO_CHAR(Cur_InOut.Description), ''), 'N', Cur_InOut.MovementType, Cur_InOut.MovementDate,
carlos@0
  1049
              Cur_InOut.DateAcct, Cur_InOut.C_BPartner_ID, Cur_InOut.C_BPartner_Location_ID, Cur_InOut.AD_User_ID,
carlos@0
  1050
              Cur_InOut.M_Warehouse_ID, Cur_InOut.POReference, Cur_InOut.DateOrdered, Cur_InOut.DeliveryRule,
carlos@0
  1051
              Cur_InOut.FreightCostRule, Cur_InOut.FreightAmt * -1, Cur_InOut.C_Project_ID, Cur_InOut.C_Activity_ID,
carlos@0
  1052
              Cur_InOut.C_Campaign_ID, Cur_InOut.AD_OrgTrx_ID, Cur_InOut.User1_ID, Cur_InOut.User2_ID,
eduardo@18857
  1053
              Cur_InOut.C_Costcenter_ID, Cur_InOut.A_Asset_ID,
carlos@0
  1054
              Cur_InOut.DeliveryViaRule, Cur_InOut.M_Shipper_ID, Cur_InOut.C_Charge_ID, Cur_InOut.ChargeAmt * -1,
carlos@0
  1055
              Cur_InOut.PriorityRule, 'DR', 'CO', 'N',
pandeeswari@22934
  1056
               'N', Cur_InOut.islogistic, Cur_InOut.salesrep_id, 'CO',
pandeeswari@22934
  1057
              Cur_InOut.calculate_freight, Cur_InOut.m_freightcategory_id, Cur_InOut.freight_currency_id 
carlos@0
  1058
            )
carlos@0
  1059
            ;
carlos@0
  1060
          v_ResultStr:='InsertInOutLine';
carlos@0
  1061
          FOR Cur_InOutLine IN
carlos@0
  1062
            (SELECT *
carlos@0
  1063
            FROM M_INOUTLINE
carlos@0
  1064
            WHERE M_InOut_ID=Cur_InOut.M_InOut_ID
carlos@0
  1065
              AND IsActive='Y'  FOR UPDATE
carlos@0
  1066
            )
carlos@0
  1067
          LOOP
carlos@0
  1068
            -- Create InOut Line
carlos@0
  1069
            Ad_Sequence_Next('M_InOutLine', Cur_InOut.M_InOut_ID, v_NextNo) ;
carlos@0
  1070
            v_ResultStr:='CreateInOutLine';
carlos@0
  1071
            INSERT
carlos@0
  1072
            INTO M_INOUTLINE
carlos@0
  1073
              (
carlos@0
  1074
                M_InOutLine_ID, Line, M_InOut_ID, C_OrderLine_ID,
carlos@0
  1075
                AD_Client_ID, AD_Org_ID, IsActive, Created,
carlos@0
  1076
                CreatedBy, Updated, UpdatedBy, M_Product_ID,
carlos@0
  1077
                M_AttributeSetInstance_ID, C_UOM_ID, M_Locator_ID, MovementQty,
asier@799
  1078
                Description, IsInvoiced,  --MODIFIED BY F.IRIAZABAL
gorkaion@15487
  1079
                QuantityOrder, M_Product_UOM_ID, IsDescription,
eduardo@18857
  1080
                canceled_inoutline_id, A_Asset_ID, C_Project_ID, C_BPartner_ID,
naiara@19828
  1081
                User1_ID, User2_ID, C_CostCenter_ID, 
naiara@19828
  1082
                explode
carlos@0
  1083
              )
carlos@0
  1084
              VALUES
carlos@0
  1085
              (
carlos@0
  1086
                v_NextNo, Cur_InOutLine.Line, v_RInOut_ID, Cur_InOutLine.C_OrderLine_ID,
carlos@0
  1087
                Cur_InOut.AD_Client_ID, Cur_InOut.AD_Org_ID, 'Y', now(),
harikrishnan@7227
  1088
                v_User, now(), v_User, Cur_InOutLine.M_Product_ID,
carlos@0
  1089
                Cur_InOutLine.M_AttributeSetInstance_ID, Cur_InOutLine.C_UOM_ID, Cur_InOutLine.M_Locator_ID, Cur_InOutLine.MovementQty * -1,
unai@15382
  1090
                 '*R*: ' || COALESCE(TO_CHAR(Cur_InOutLine.Description), ''), Cur_InOutLine.IsInvoiced, --MODIFIED BY F.IRIAZABAL
gorkaion@15487
  1091
                Cur_InOutLine.QuantityOrder * -1, Cur_InOutLine.M_PRODUCT_UOM_ID, Cur_InOutLine.IsDescription,
eduardo@18857
  1092
                Cur_InOutLine.M_InOutLine_ID, Cur_InOutLine.A_Asset_ID, Cur_InOutLine.C_Project_ID, Cur_InOutLine.C_BPartner_ID,
naiara@19828
  1093
                Cur_InOutLine.User1_ID, Cur_InOutLine.User2_ID, Cur_InOutLine.C_CostCenter_ID, 
naiara@19828
  1094
                Cur_InOutLine.explode 
carlos@0
  1095
              )
carlos@0
  1096
              ;
pandeeswari@22049
  1097
pandeeswari@22049
  1098
            -- Create InOut acctounting dimension
pandeeswari@22049
  1099
            v_ResultStr:='CreateInOutLineAcctDimension';
pandeeswari@22049
  1100
            INSERT
pandeeswari@22049
  1101
            INTO M_INOUTLINE_ACCTDIMENSION
pandeeswari@22049
  1102
              (
pandeeswari@22049
  1103
                M_InOutLine_Acctdimension_ID, M_InOutLine_ID, Quantity,
pandeeswari@22049
  1104
                AD_Client_ID, AD_Org_ID, IsActive, Created,
pandeeswari@22049
  1105
                CreatedBy, Updated, UpdatedBy, M_Product_ID, C_BPartner_ID,
pandeeswari@22049
  1106
                C_Project_ID, C_Campaign_ID, C_Activity_ID, A_Asset_ID,
pandeeswari@22049
  1107
                User1_ID, User2_ID, C_CostCenter_ID
pandeeswari@22049
  1108
              )
pandeeswari@22052
  1109
              SELECT
pandeeswari@22052
  1110
                get_uuid(), v_NextNo, Quantity * -1,
pandeeswari@22052
  1111
                AD_Client_ID, AD_Org_ID, 'Y', now(),
pandeeswari@22052
  1112
                v_User, now(), v_User, M_Product_ID, C_BPartner_ID,
pandeeswari@22052
  1113
                C_Project_ID, C_Campaign_ID, C_Activity_ID , A_Asset_ID,
pandeeswari@22052
  1114
                User1_ID, User2_ID, C_CostCenter_ID
pandeeswari@22052
  1115
              FROM M_INOUTLINE_ACCTDIMENSION where M_INOUTLINE_ID=Cur_InOutLine.M_INOUTLINE_ID
pandeeswari@22052
  1116
              and IsActive = 'Y';
pandeeswari@22052
  1117
david@7235
  1118
            INSERT INTO M_MATCHINV
david@7235
  1119
              (M_MATCHINV_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY,
david@7235
  1120
              M_INOUTLINE_ID, C_INVOICELINE_ID, M_PRODUCT_ID, DATETRX, QTY, PROCESSING, PROCESSED, POSTED)
david@7235
  1121
            SELECT
david@7235
  1122
              GET_UUID(), MI.AD_CLIENT_ID, MI.AD_ORG_ID, MI.ISACTIVE, now(), '0', now(), '0',
david@7240
  1123
              v_NextNo, MI.C_INVOICELINE_ID, MI.M_PRODUCT_ID, MI.DATETRX, -MI.QTY, 'N', 'Y', 'N'
david@7235
  1124
            FROM M_MATCHINV MI
david@7235
  1125
            WHERE MI.M_INOUTLINE_ID = Cur_InOutLine.M_InOutLine_ID;
gorkaion@19377
  1126
carlos@0
  1127
          END LOOP;
carlos@0
  1128
          -- Close Order
carlos@0
  1129
          v_ResultStr:='CloseInOut';
carlos@0
  1130
          UPDATE M_INOUT
carlos@0
  1131
            SET Description=COALESCE(TO_CHAR(Description), '') || ' (*R*=' || v_RDocumentNo || ')',
carlos@0
  1132
            Processed='Y',
ainhoa@2454
  1133
            DocStatus='VO', -- it IS reversed
carlos@0
  1134
            DocAction='--',
mikel@19150
  1135
            Process_Goods_Java='--',
carlos@0
  1136
            Updated=now(),
carlos@0
  1137
            UpdatedBy=v_User
carlos@0
  1138
          WHERE M_INOUT.M_INOUT_ID=Cur_InOut.M_INOUT_ID;
unai@15382
  1139
unai@15382
  1140
	   FOR Cur_InOutLine IN
unai@15382
  1141
            (SELECT *
unai@15382
  1142
            FROM M_INOUTLINE
unai@15382
  1143
            WHERE M_InOut_ID=Cur_InOut.M_InOut_ID
unai@15382
  1144
              AND IsActive='Y'  FOR UPDATE
unai@15382
  1145
            )
unai@15382
  1146
	  LOOP
unai@15382
  1147
            UPDATE M_INOUTLINE
unai@15382
  1148
              SET Description=COALESCE(TO_CHAR(Cur_InOutLine.Description), '') || ' : *R*',
unai@15382
  1149
              Updated=now(),
unai@15382
  1150
              UpdatedBy=v_User
unai@15382
  1151
            WHERE M_INOUTLINE.M_INOUTLINE_ID=Cur_InOutLine.M_INOUTLINE_ID;
alvaro@28246
  1152
          END LOOP;
alvaro@27102
  1153
carlos@0
  1154
          -- Post Reversal
carlos@0
  1155
          v_ResultStr:='PostReversal';
mikel@19131
  1156
          -- Update reversal goods dates
mikel@19131
  1157
          IF (v_voidmovementdate IS NOT NULL) THEN
mikel@19131
  1158
            UPDATE M_INOUT SET MovementDate = v_voidmovementdate WHERE M_INOUT_ID = v_RInOut_ID;
mikel@19131
  1159
          END IF;
mikel@19131
  1160
          IF (v_voiddate_acct IS NOT NULL) THEN
mikel@19131
  1161
            UPDATE M_INOUT SET DateAcct = v_voiddate_acct WHERE M_INOUT_ID = v_RInOut_ID;
mikel@19131
  1162
          END IF;
antonio@735
  1163
          M_INOUT_POST(NULL, v_RInOut_ID) ;
alvaro@28246
  1164
alvaro@28246
  1165
          -- Undo reservation by updating completed existing one or
alvaro@28246
  1166
          -- by creating new reservation to replace closed existing one
alvaro@28246
  1167
          IF (Cur_InOut.issotrx = 'Y') THEN
alvaro@28246
  1168
            FOR Cur_Reservation IN (
alvaro@28246
  1169
              SELECT r.m_reservation_id, r.ad_client_id, r.ad_org_id,
alvaro@28246
  1170
              r.m_product_id, r.quantity, r.c_uom_id, r.c_orderline_id, r.ad_user_id,
alvaro@28246
  1171
              r.c_bpartner_id, r.m_warehouse_id, r.m_attributesetinstance_id, r.m_locator_id,
alvaro@28246
  1172
              r.reservedqty, r.res_status, r.managereservation_pe, r.reservedgoodmnt_pe,
alvaro@28246
  1173
              ol.qtyordered, sum(iol.movementqty) as movementqty
alvaro@28246
  1174
              FROM M_RESERVATION r
alvaro@28246
  1175
              JOIN C_ORDERLINE ol
alvaro@28246
  1176
              ON r.c_orderline_id = ol.c_orderline_id
alvaro@28246
  1177
              JOIN M_INOUTLINE iol
alvaro@28246
  1178
              ON ol.c_orderline_id = iol.c_orderline_id
alvaro@28246
  1179
              AND ol.m_product_id = iol.m_product_id
alvaro@28246
  1180
              WHERE iol.m_inout_id = Cur_InOut.m_inout_id
alvaro@28246
  1181
              AND r.res_status <> 'DR'
alvaro@28246
  1182
              AND iol.movementqty > 0
alvaro@28246
  1183
              AND iol.canceled_inoutline_id IS NULL
alvaro@28246
  1184
              AND r.created = (
alvaro@28246
  1185
                SELECT max(created)
alvaro@28246
  1186
                FROM M_RESERVATION
alvaro@28246
  1187
                WHERE c_orderline_id = r.c_orderline_id
alvaro@28246
  1188
                AND res_status <> 'DR'
alvaro@28246
  1189
              )
alvaro@28246
  1190
	      GROUP BY r.m_reservation_id, r.ad_client_id, r.ad_org_id,
alvaro@28246
  1191
	      r.m_product_id, r.quantity, r.c_uom_id, r.c_orderline_id, r.ad_user_id,
alvaro@28246
  1192
	      r.c_bpartner_id, r.m_warehouse_id, r.m_attributesetinstance_id, r.m_locator_id,
alvaro@28246
  1193
	      r.reservedqty, r.res_status, r.managereservation_pe, r.reservedgoodmnt_pe, ol.qtyordered
alvaro@28246
  1194
            )
alvaro@28246
  1195
	    LOOP
alvaro@28246
  1196
alvaro@28246
  1197
	      -- Get the least quantity between ordered quantity and movement quantity
alvaro@28246
  1198
	      v_R_Quantity := LEAST(Cur_Reservation.qtyordered, Cur_Reservation.movementqty);
alvaro@28246
  1199
alvaro@28246
  1200
              -- If completed reservation exists already update it,
alvaro@28246
  1201
              -- otherwise create a new one with this quantity
alvaro@28246
  1202
              IF (Cur_Reservation.res_status <> 'CL') THEN
alvaro@28246
  1203
                v_reservation_id := Cur_Reservation.m_reservation_id;
alvaro@28246
  1204
                v_R_Reservedqty := Cur_Reservation.reservedqty;
alvaro@28246
  1205
              ELSE
alvaro@28246
  1206
                v_reservation_id := get_uuid();
alvaro@28246
  1207
                v_R_Reservedqty := 0;
alvaro@28246
  1208
                INSERT INTO M_RESERVATION (
alvaro@28246
  1209
                  m_reservation_id, ad_client_id, ad_org_id, isactive,
alvaro@28246
  1210
                  created, createdby, updated, updatedby,
alvaro@28246
  1211
                  m_product_id, quantity, c_uom_id, c_orderline_id,
alvaro@28246
  1212
                  ad_user_id, c_bpartner_id, m_warehouse_id, m_attributesetinstance_id, m_locator_id,
alvaro@28246
  1213
                  res_status, res_process, managereservation_pe, reservedgoodmnt_pe
alvaro@28246
  1214
                ) VALUES (
alvaro@28246
  1215
                  v_reservation_id, Cur_Reservation.ad_client_id, Cur_Reservation.ad_org_id, 'Y',
alvaro@28246
  1216
                  now(), v_user, now(), v_user,
alvaro@28246
  1217
                  Cur_Reservation.m_product_id, Cur_Reservation.qtyordered, Cur_Reservation.c_uom_id, Cur_Reservation.c_orderline_id,
alvaro@28246
  1218
                  Cur_Reservation.ad_user_id, Cur_Reservation.c_bpartner_id, Cur_Reservation.m_warehouse_id,
alvaro@28246
  1219
                  Cur_Reservation.m_attributesetinstance_id, Cur_Reservation.m_locator_id,
alvaro@28246
  1220
                  'DR', 'PR', Cur_Reservation.managereservation_pe, Cur_Reservation.reservedgoodmnt_pe
alvaro@28246
  1221
                );
alvaro@28246
  1222
                -- To avoid create a reservation with all available stock,
alvaro@28246
  1223
                -- process new reservation before creating new stock reservations
alvaro@28246
  1224
                -- and delete stock reservation created by m_reserve_stock_manual
alvaro@28246
  1225
                M_RESERVATION_POST(null, v_reservation_id, 'PR', v_user);
alvaro@28246
  1226
                UPDATE M_RESERVATION_STOCK SET releasedqty = 0 WHERE m_reservation_id = v_reservation_id;
alvaro@28246
  1227
                DELETE FROM M_RESERVATION_STOCK WHERE m_reservation_id = v_reservation_id;
alvaro@28246
  1228
              END IF;
alvaro@28246
  1229
alvaro@28246
  1230
              -- Add a reservation stock fo each related inout line
alvaro@28246
  1231
              FOR Cur_InOutLine IN (
alvaro@28246
  1232
                SELECT iol.m_locator_id, COALESCE(iol.m_attributesetinstance_id, '0') as m_attributesetinstance_id,
alvaro@28246
  1233
                sum(iol.movementqty) as movementqty
alvaro@28246
  1234
                FROM M_INOUTLINE iol
alvaro@28246
  1235
                WHERE iol.m_inout_id = Cur_InOut.m_inout_id
alvaro@28246
  1236
                AND iol.c_orderline_id = Cur_Reservation.c_orderline_id
alvaro@28246
  1237
                AND iol.m_product_id = Cur_Reservation.m_product_id
alvaro@28246
  1238
                AND iol.movementqty > 0
alvaro@28246
  1239
                AND iol.canceled_inoutline_id IS NULL
alvaro@28246
  1240
                GROUP BY iol.m_locator_id, COALESCE(iol.m_attributesetinstance_id, '0')
alvaro@28246
  1241
              )
alvaro@28246
  1242
              LOOP
alvaro@28246
  1243
alvaro@28246
  1244
                -- Check if movement quantity is less or equals than ordered quantity,
alvaro@28246
  1245
                -- if so insert a new reservation stock with movement quantity,
alvaro@28246
  1246
                -- otherwise insert a new reservation stock with pending ordered quantity
alvaro@28246
  1247
                IF (Cur_InOutLine.movementqty <= v_R_Quantity) THEN
alvaro@28246
  1248
                  v_RS_Quantity := Cur_InOutLine.movementqty;
alvaro@28246
  1249
                ELSE
alvaro@28246
  1250
                  v_RS_Quantity := v_R_Quantity;
alvaro@28246
  1251
                END IF;
alvaro@28246
  1252
                v_R_Quantity := v_R_Quantity - v_RS_Quantity;
alvaro@28246
  1253
alvaro@28246
  1254
                -- If completed reservation stock exists already update it
alvaro@28246
  1255
                -- by decreasing its releasedqty or by increasing its quantity,
alvaro@28246
  1256
                -- otherwise create a new one with this quantity
alvaro@28246
  1257
                SELECT count(*), max(rs.m_reservation_stock_id), max(rs.releasedqty)
alvaro@28246
  1258
                INTO v_countRS, v_reservationstock_id, v_RS_Releasedqty
alvaro@28246
  1259
                FROM M_RESERVATION_STOCK rs
alvaro@28246
  1260
                WHERE rs.m_reservation_id = v_reservation_id
alvaro@28246
  1261
                AND rs.m_locator_id = Cur_InOutLine.m_locator_id
alvaro@28246
  1262
                AND COALESCE(rs.m_attributesetinstance_id, '0') = Cur_InOutLine.m_attributesetinstance_id;
alvaro@28246
  1263
alvaro@28246
  1264
                IF (v_countRS > 0) THEN
alvaro@28246
  1265
                  IF (v_RS_Releasedqty > 0) THEN
alvaro@28246
  1266
                    v_RS_Releasedqty := LEAST(v_RS_Releasedqty, v_RS_Quantity);
alvaro@28246
  1267
                    UPDATE M_RESERVATION_STOCK
alvaro@28246
  1268
                    SET releasedqty = releasedqty - v_RS_Releasedqty
alvaro@28246
  1269
                    WHERE m_reservation_stock_id = v_reservationstock_id;
alvaro@28246
  1270
                    v_RS_Quantity := v_RS_Quantity - v_RS_Releasedqty;
alvaro@28246
  1271
                  END IF;
alvaro@28246
  1272
                  IF (v_RS_Quantity > 0 AND Cur_Reservation.quantity >= v_R_Reservedqty + v_RS_Quantity) THEN
alvaro@28246
  1273
                    UPDATE M_RESERVATION_STOCK
alvaro@28246
  1274
                    SET quantity = quantity + v_RS_Quantity
alvaro@28246
  1275
                    WHERE m_reservation_stock_id = v_reservationstock_id;
alvaro@28246
  1276
                    v_R_Reservedqty := v_R_Reservedqty + v_RS_Quantity;
alvaro@28246
  1277
                  END IF;
alvaro@28246
  1278
                ELSE
alvaro@28246
  1279
                  INSERT INTO M_RESERVATION_STOCK (
alvaro@28246
  1280
                    m_reservation_stock_id, ad_client_id, ad_org_id, isactive,
alvaro@28246
  1281
                    created, createdby, updated, updatedby,
alvaro@28246
  1282
                    m_reservation_id, quantity, isallocated,
alvaro@28246
  1283
                    m_locator_id, m_attributesetinstance_id
alvaro@28246
  1284
                  ) VALUES (
alvaro@28246
  1285
                    get_uuid(), Cur_Reservation.ad_client_id, Cur_Reservation.ad_org_id, 'Y',
alvaro@28246
  1286
                    now(), v_user, now(), v_user,
alvaro@28246
  1287
                    v_reservation_id, v_RS_Quantity, 'N',
alvaro@28246
  1288
                    Cur_InOutLine.m_locator_id, Cur_InOutLine.m_attributesetinstance_id
alvaro@28246
  1289
                  );
alvaro@28246
  1290
                  v_R_Reservedqty := v_R_Reservedqty + v_RS_Quantity;
alvaro@28246
  1291
                END IF;
alvaro@28246
  1292
alvaro@28246
  1293
                -- Exit if we have reserved all pending ordered quantity
alvaro@28246
  1294
                IF (v_R_Quantity <= 0) THEN
alvaro@28246
  1295
                  EXIT;
alvaro@28246
  1296
                END IF;
alvaro@28246
  1297
alvaro@28246
  1298
              END LOOP;
alvaro@28246
  1299
            END LOOP;
alvaro@28246
  1300
          END IF;
alvaro@28246
  1301
carlos@0
  1302
          -- Indicate as Reversal Transaction
carlos@0
  1303
          v_ResultStr:='IndicateReversal';
carlos@0
  1304
          UPDATE M_INOUT
carlos@0
  1305
            SET Updated=now(),
carlos@0
  1306
            UpdatedBy=v_User,
ainhoa@2454
  1307
            DocStatus='VO' -- the reversal transaction
carlos@0
  1308
          WHERE M_InOut_ID=v_RInOut_ID;
miguel@24913
  1309
miguel@24913
  1310
          -- transactions related with original inout and with voided inout will be mark as is cost permanent
miguel@24913
  1311
          UPDATE M_TRANSACTION TRX
miguel@24913
  1312
          SET ISCOSTPERMANENT='Y'
miguel@24913
  1313
          WHERE TRX.M_INOUTLINE_ID IN (SELECT M_INOUTLINE_ID 
miguel@24913
  1314
                                       FROM M_INOUTLINE
miguel@24913
  1315
                                       WHERE (M_INOUT_ID = v_RInOut_ID 
miguel@24913
  1316
                                              OR M_INOUT_ID = Cur_InOut.m_inout_id));
carlos@0
  1317
        END IF; -- ReverseCorrection
adrianromero@7702
  1318
adrianromero@7702
  1319
        --M_Inout_Post - Finish_Process Extension Point
adrianromero@7702
  1320
        --Extension point at the end of the M_Inout_Post. It has 5 available parameters Record_ID, DocAction, User, Message and Result
adrianromero@7702
  1321
        SELECT count(*) INTO v_count
adrianromero@7702
  1322
        FROM DUAL
adrianromero@7702
  1323
        where exists (select 1 from ad_ep_procedures where ad_extension_points_id = '5A7C6972321E42C2A5A8E9D6D73E6A7C');
adrianromero@7702
  1324
        IF (v_count=1) THEN
adrianromero@7702
  1325
          DECLARE
adrianromero@7702
  1326
            v_ep_instance VARCHAR2(32);
adrianromero@7702
  1327
            v_extension_point_id VARCHAR2(32) := '5A7C6972321E42C2A5A8E9D6D73E6A7C';
adrianromero@7702
  1328
          BEGIN
adrianromero@7702
  1329
            v_ep_instance := get_uuid();
adrianromero@7702
  1330
            AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'Record_ID',
adrianromero@7702
  1331
              v_record_id, NULL, NULL, NULL, NULL, NULL, NULL);
adrianromero@7702
  1332
            AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'DocAction',
adrianromero@7702
  1333
              Cur_InOut.DocAction, NULL, NULL, NULL, NULL, NULL, NULL);
adrianromero@7702
  1334
            AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'User',
adrianromero@7702
  1335
              v_User, NULL, NULL, NULL, NULL, NULL, NULL);
adrianromero@7702
  1336
            AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'Message',
adrianromero@7702
  1337
              NULL, NULL, NULL, NULL, NULL, NULL, v_Message);
adrianromero@7702
  1338
            AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'Result',
adrianromero@7702
  1339
              NULL, NULL, v_Result, NULL, NULL, NULL, NULL);
adrianromero@7702
  1340
            AD_EXTENSION_POINT_HANDLER(v_ep_instance, v_extension_point_id);
adrianromero@7702
  1341
            SELECT p_number INTO v_Result
adrianromero@7702
  1342
            FROM ad_ep_instance_para
adrianromero@7702
  1343
            WHERE ad_ep_instance_id = v_ep_instance
adrianromero@7702
  1344
              AND parametername LIKE 'Result';
adrianromero@7702
  1345
            SELECT p_text INTO v_Message
adrianromero@7702
  1346
            FROM ad_ep_instance_para
adrianromero@7702
  1347
            WHERE ad_ep_instance_id = v_ep_instance
adrianromero@7702
  1348
              AND parametername LIKE 'Message';
adrianromero@7702
  1349
adrianromero@7702
  1350
            DELETE FROM ad_ep_instance_para
adrianromero@7702
  1351
            WHERE ad_ep_instance_id = v_ep_instance;
adrianromero@7702
  1352
          END;
adrianromero@7702
  1353
        END IF;
adrianromero@7702
  1354
carlos@0
  1355
      END LOOP; -- InOut Header
carlos@0
  1356
      /**
carlos@0
  1357
      * Transaction End
carlos@0
  1358
      */
carlos@0
  1359
      v_ResultStr:='Fini';
carlos@0
  1360
    END IF; --FINISH_PROCESS
gorkaion@239
  1361
    --<<FINISH_PROCESS>>
carlos@0
  1362
    IF(p_PInstance_ID IS NOT NULL) THEN
carlos@0
  1363
      --  Update AD_PInstance
carlos@0
  1364
      DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message) ;
carlos@0
  1365
      AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'N', v_Result, v_Message) ;
carlos@0
  1366
    ELSE
gorkaion@239
  1367
      DBMS_OUTPUT.PUT_LINE('--<<M_InOut_Post finished>>') ;
carlos@0
  1368
    END IF;
carlos@0
  1369
    RETURN;
carlos@0
  1370
  END; --BODY
carlos@0
  1371
EXCEPTION
carlos@0
  1372
WHEN OTHERS THEN
carlos@0
  1373
  v_ResultStr:= '@ERROR=' || SQLERRM;
carlos@0
  1374
  DBMS_OUTPUT.PUT_LINE(v_ResultStr) ;
carlos@0
  1375
  IF(p_PInstance_ID IS NOT NULL) THEN
carlos@0
  1376
    ROLLBACK;
carlos@0
  1377
    AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'N', 0, v_ResultStr) ;
carlos@0
  1378
  ELSE
carlos@0
  1379
    RAISE;
carlos@0
  1380
  END IF;
carlos@0
  1381
  RETURN;
antonio@735
  1382
END M_INOUT_POST
juanpablo@3490
  1383
]]></body>
juanpablo@3490
  1384
    </function>
juanpablo@3490
  1385
  </database>