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