src-db/database/model/functions/M_INOUT_POST.xml
author Atul Gaware <atul.gaware@openbravo.com>
Tue, 14 Oct 2014 15:12:25 +0530
changeset 25018 9f64a8da1daa
parent 24390 660562a7b825
child 25030 453b81b77af8
child 25116 7ba7947fde99
permissions -rw-r--r--
Fixes Issue 27752:Cannot ship more than the ordered quantity when Is Quantity
Variable checkbox is selected for the product

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