src-db/database/model/functions/C_INVOICE_POST.xml
author Mark <markmm82@gmail.com>
Tue, 28 Feb 2017 14:56:32 -0500
changeset 31570 68702618a590
parent 30970 3d4b4857dc35
child 31600 86dcf5d294d9
permissions -rw-r--r--
Related to issue 34993: Logic moved to the complete action

To avoid inconsistents scenarios in this issue, the processing logic included inside
the c_invoiceline_trg2 trigger was removed and included inside the c_invoice_post function.

This way the prepayment amount is always updated when the invoice is completed and
not when it lines are created, updated or deleted.

All other possible scenarios will be covered when the related design defect
https://issues.openbravo.com/view.php?id=35339 be fixed.
carlos@0
     1
<?xml version="1.0"?>
adrian@94
     2
  <database name="FUNCTION C_INVOICE_POST">
adrian@94
     3
    <function name="C_INVOICE_POST" type="NULL">
juanpablo@1605
     4
      <parameter name="p_pinstance_id" type="VARCHAR" mode="in">
antonio@735
     5
        <default/>
antonio@735
     6
      </parameter>
juanpablo@1605
     7
      <parameter name="p_invoice_id" type="VARCHAR" mode="in">
antonio@735
     8
        <default/>
antonio@735
     9
      </parameter>
gorkaion@239
    10
      <body><![CDATA[/*************************************************************************
juanpablo@771
    11
  * The contents of this file are subject to the Compiere Public
juanpablo@771
    12
  * License 1.1 ("License"); You may not use this file except in
juanpablo@771
    13
  * compliance with the License. You may obtain a copy of the License in
juanpablo@771
    14
  * the legal folder of your Openbravo installation.
carlos@0
    15
  * Software distributed under the License is distributed on an
carlos@0
    16
  * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
carlos@0
    17
  * implied. See the License for the specific language governing rights
carlos@0
    18
  * and limitations under the License.
juanpablo@778
    19
  * The Original Code is  Compiere  ERP &  Business Solution
juanpablo@771
    20
  * The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
carlos@0
    21
  * Portions created by Jorg Janke are Copyright (C) 1999-2001 Jorg Janke,
carlos@0
    22
  * parts created by ComPiere are Copyright (C) ComPiere, Inc.;
carlos@0
    23
  * All Rights Reserved.
ggi@6701
    24
  * Contributor(s): Openbravo SLU
markmm82@31570
    25
  * Contributions are Copyright (C) 2001-2017 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: C_Invoice_Post.sql,v 1.32 2003/07/22 05:41:27 jjanke Exp $
carlos@0
    31
  ***
carlos@0
    32
  * Title:  Post single Invoice
carlos@0
    33
  * Description:
carlos@0
    34
  *  Actions: COmplete, APprove, Reverse Correction, Void
carlos@0
    35
  *
carlos@0
    36
  * OpenItem Amount:
carlos@0
    37
  *  - C_BPartner.SO_CreditUsed is increased
gorkaion@7647
    38
  *  - if C_CashLine entry is created
carlos@0
    39
  *  - C_Cash_Post creates C_Allocation
gorkaion@7647
    40
  *  - C_Allocation_Trg decreases C_BPartner.SO_CreditUsed
carlos@0
    41
  *
carlos@0
    42
  ************************************************************************/
carlos@0
    43
  -- Logistice
carlos@0
    44
  v_ResultStr VARCHAR2(2000):='';
carlos@0
    45
  v_Message VARCHAR2(2000):='';
juanpablo@1605
    46
  v_Record_ID VARCHAR2(32);
carlos@0
    47
  v_Result NUMBER:=1; -- Success
harikrishnan@7678
    48
  v_totalqty NUMBER:=0; 
carlos@0
    49
  -- Parameter
carlos@0
    50
  TYPE RECORD IS REF CURSOR;
gorkaion@7647
    51
  Cur_Parameter RECORD;
gorkaion@7647
    52
  Cur_line RECORD;
gorkaion@7647
    53
  Cur_InvoiceLine RECORD;
adrianromero@12247
    54
  Cur_InvoiceLineAcctDim RECORD;
gorkaion@7647
    55
  Cur_Discount RECORD;
gorkaion@7647
    56
  Cur_CInvoiceDiscount RECORD;
gorkaion@7647
    57
  Cur_TaxDiscount RECORD;
gorkaion@7647
    58
  Cur_ReactivateInvoiceLine RECORD;
gorkaion@7647
    59
  Cur_LastContact RECORD;
harikrishnan@7678
    60
  Cur_lineqty RECORD;
ioritz@16017
    61
  Cur_InvoiceTax RECORD;
asier@18342
    62
  Cur_Offer RECORD;
carlos@0
    63
gorkaion@7647
    64
  -- Record Info
gorkaion@7647
    65
  v_Client_ID VARCHAR2(32);
gorkaion@7647
    66
  v_User_ID VARCHAR2(32);
gorkaion@7647
    67
  v_Org_ID VARCHAR2(32);
gorkaion@7647
    68
  v_UpdatedBy C_INVOICE.UpdatedBy%TYPE;
gorkaion@7647
    69
  v_Processing C_INVOICE.Processing%TYPE;
gorkaion@7647
    70
  v_Processed C_INVOICE.Processed%TYPE;
gorkaion@7647
    71
  v_DocAction C_INVOICE.DocAction%TYPE;
gorkaion@7647
    72
  v_DocStatus C_INVOICE.DocStatus%TYPE;
gorkaion@7647
    73
  v_DoctypeReversed_ID VARCHAR2(32);
gorkaion@7647
    74
  v_DocType_ID VARCHAR2(32);
gorkaion@7647
    75
  v_DocTypeTarget_ID VARCHAR2(32);
gorkaion@14547
    76
  v_isreturndoctype CHAR(1);
gorkaion@7647
    77
  v_PaymentRule C_INVOICE.PaymentRule%TYPE;
gorkaion@7647
    78
  v_PaymentTerm C_INVOICE.C_PaymentTerm_ID%TYPE;
gorkaion@7647
    79
  v_Order_ID VARCHAR2(32);
gorkaion@7647
    80
  v_DateAcct DATE;
gorkaion@7647
    81
  v_DateInvoiced DATE;
gorkaion@7647
    82
  v_DocumentNo C_INVOICE.DocumentNo%TYPE;
gorkaion@7647
    83
  v_BPartner_ID VARCHAR2(32);
fernando@25006
    84
  v_bp_isactive c_bpartner.isactive%TYPE;
gorkaion@7647
    85
  v_BPartner_User_ID VARCHAR2(32);
gorkaion@7647
    86
  v_IsSOTrx C_INVOICE.IsSOTrx%TYPE;
gorkaion@7647
    87
  v_Posted C_INVOICE.Posted%TYPE;
gorkaion@17350
    88
  v_istaxincluded CHAR(1);
carlos@0
    89
  --Added by P.SAROBE
carlos@0
    90
  v_documentno_Settlement VARCHAR2(40);
carlos@0
    91
  v_dateSettlement DATE;
carlos@0
    92
  v_Cancel_Processed CHAR(1);
carlos@0
    93
  v_nameBankstatement VARCHAR2 (60);
carlos@0
    94
  v_dateBankstatement DATE;
carlos@0
    95
  v_nameCash VARCHAR2 (60);
carlos@0
    96
  v_dateCash DATE;
juanpablo@1605
    97
  v_Bankstatementline_ID VARCHAR2(32);
juanpablo@1605
    98
  v_Debtpayment_ID VARCHAR2(32);
juanpablo@1605
    99
  v_CashLine_ID VARCHAR2(32);
carlos@0
   100
  v_ispaid CHAR(1);
juanpablo@1605
   101
  v_Settlement_Cancel_ID VARCHAR2(32);
carlos@0
   102
  --Finish added by P.Sarobe
gorkaion@7647
   103
  --
gorkaion@7647
   104
  v_GrandTotal NUMBER:=0;
gorkaion@7647
   105
  v_TotalLines NUMBER:=0;
gorkaion@7647
   106
  v_Currency_ID VARCHAR2(32);
gorkaion@7647
   107
  v_Multiplier NUMBER:=1;
gorkaion@7647
   108
  v_paymentcheck NUMBER;
gorkaion@7647
   109
  --
gorkaion@7647
   110
  v_RInvoice_ID VARCHAR2(32);
gorkaion@7647
   111
  v_RDocumentNo C_INVOICE.DocumentNo%TYPE;
gorkaion@7647
   112
  v_NextNo VARCHAR2(32);
gorkaion@7647
   113
  v_count NUMBER;
gorkaion@7647
   114
  v_POReference NVARCHAR2(40) ;
gorkaion@7647
   115
  --
gorkaion@7647
   116
  v_SettlementDocType_ID VARCHAR2(32) ;
gorkaion@7647
   117
  v_SDocumentNo C_SETTLEMENT.DocumentNo%TYPE;
gorkaion@7647
   118
  v_settlementID varchar2(32):=NULL;
gorkaion@7647
   119
  --
gorkaion@7647
   120
  v_FirstSales C_BPARTNER.FirstSale%TYPE;
gorkaion@7647
   121
  v_REInOutStatus M_INOUT.DocStatus%TYPE;
gorkaion@7647
   122
  v_REDateInvoiced DATE;
gorkaion@7647
   123
  v_REtotalQtyInvoiced NUMBER:=0;
gorkaion@7647
   124
  v_REdeliveredQty NUMBER:=0;
gorkaion@7647
   125
  --
gorkaion@7647
   126
  v_CumDiscount NUMBER;
gorkaion@7647
   127
  v_OldCumDiscount NUMBER;
gorkaion@7647
   128
  v_InvoiceLineSeqNo NUMBER;
gorkaion@7647
   129
  v_InvoiceLine VARCHAR2(32);
gorkaion@7647
   130
  v_Discount NUMBER;
gorkaion@7647
   131
  v_Line NUMBER;
gorkaion@7647
   132
  v_C_Project_ID VARCHAR2(32);
gorkaion@7647
   133
  v_acctAmount NUMBER;
gorkaion@7647
   134
  v_partialAmount NUMBER;
gorkaion@7647
   135
  FINISH_PROCESS BOOLEAN:=FALSE;
gorkaion@7647
   136
  END_PROCESSING BOOLEAN:=FALSE;
gorkaion@7647
   137
  v_TargetDocBaseType C_DOCTYPE.DocBaseType%TYPE;
mikel@11116
   138
  v_isReversal C_DOCTYPE.IsReversal%TYPE;
gorkaion@7647
   139
  v_MultiplierARC NUMBER:=1;
gorkaion@7647
   140
  v_is_included NUMBER:=0;
gorkaion@7647
   141
  v_available_period NUMBER:=0;
gorkaion@7647
   142
  v_is_ready AD_Org.IsReady%TYPE;
gorkaion@7647
   143
  v_is_tr_allow AD_OrgType.IsTransactionsAllowed%TYPE;
gorkaion@7647
   144
  v_isacctle AD_OrgType.IsAcctLegalEntity%TYPE;
gorkaion@7647
   145
  v_org_bule_id AD_Org.AD_Org_ID%TYPE;
gorkaion@7647
   146
  
gorkaion@7647
   147
  v_PeriodStartDate DATE;
gorkaion@7647
   148
  v_PeriodEndDate DATE;
gorkaion@7647
   149
  v_DocNo_Org_ID AD_Sequence.AD_Org_ID%TYPE;
gorkaion@7647
   150
  withholdamount NUMBER(10,2);
gorkaion@7647
   151
  cWithHoldId varchar2(32);
harikrishnan@7808
   152
  Cur_InvoiceNetLine RECORD;
ioritz@16017
   153
ioritz@16017
   154
  v_LineMax NUMBER:=0;
mikel@17452
   155
  v_precision NUMBER;
mikel@17452
   156
  v_gross_unit_price NUMBER;
mikel@17452
   157
  v_line_gross_amount NUMBER;
rafael@16135
   158
  v_Isquantityvariable CHAR(1);
eduardo@18445
   159
  
eduardo@18445
   160
  v_isdeferred_inv C_InvoiceLine.IsDeferred%TYPE;
eduardo@18445
   161
  v_defplantype_inv C_InvoiceLine.DefPlanType%TYPE;
eduardo@18445
   162
  v_periodnumber_inv C_InvoiceLine.periodnumber%TYPE;
eduardo@18445
   163
  v_period_inv C_InvoiceLine.c_period_id%TYPE;
eduardo@18445
   164
mikel@19131
   165
  v_voiddate_inv C_Invoice.DateInvoiced%TYPE;
mikel@19131
   166
  v_voiddate_acct C_Invoice.DateAcct%TYPE;
mikel@19131
   167
david@19193
   168
  v_bpartner_blocked VARCHAR2(1):='N';
david@19193
   169
  v_invoiceBlocking VARCHAR2(1):='N';
sandra@20001
   170
  v_bpartner_name c_bpartner.name%TYPE;
gorkaion@20940
   171
  v_productname m_product.name%TYPE;
victor@21513
   172
victor@21513
   173
  v_iscashvat C_Invoice.IsCashVat%TYPE;
gaurav@21626
   174
  v_invoiceline_qtysum NUMBER;
sandra@25787
   175
  v_PriceList_ID varchar2(32);
sandra@25543
   176
  v_prepaymentamt NUMBER;
markmm82@31570
   177
  v_prepayment_inorders NUMBER;
eduardo@26615
   178
  v_hasTaxes NUMBER;
sandra@25787
   179
   
gorkaion@7647
   180
BEGIN
gorkaion@7647
   181
  IF (p_PInstance_ID IS NOT NULL) THEN
gorkaion@7647
   182
    --  Update AD_PInstance
gorkaion@7647
   183
    DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID) ;
gorkaion@7647
   184
    v_ResultStr:='PInstanceNotFound';
gorkaion@7647
   185
    AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'Y', NULL, NULL) ;
gorkaion@7647
   186
    -- Get Parameters
gorkaion@7647
   187
    v_ResultStr:='ReadingParameters';
gorkaion@7647
   188
    FOR Cur_Parameter IN
gorkaion@7647
   189
      (SELECT i.Record_ID,
gorkaion@7647
   190
        i.AD_User_ID,
gorkaion@7647
   191
        p.ParameterName,
gorkaion@7647
   192
        p.P_String,
gorkaion@7647
   193
        p.P_Number,
gorkaion@7647
   194
        p.P_Date
gorkaion@7647
   195
      FROM AD_PINSTANCE i
gorkaion@7647
   196
      LEFT JOIN AD_PINSTANCE_PARA p
gorkaion@7647
   197
        ON i.AD_PInstance_ID=p.AD_PInstance_ID
gorkaion@7647
   198
      WHERE i.AD_PInstance_ID=p_PInstance_ID
gorkaion@7647
   199
      ORDER BY p.SeqNo
gorkaion@7647
   200
      )
gorkaion@7647
   201
    LOOP
gorkaion@7647
   202
      v_Record_ID:=Cur_Parameter.Record_ID;
gorkaion@7647
   203
      v_User_ID:=Cur_Parameter.AD_User_ID;
mikel@19131
   204
      IF (Cur_Parameter.parametername = 'voidedDocumentDate') THEN
mikel@19131
   205
        v_voiddate_inv := TO_DATE(Cur_Parameter.p_string, 'YYYY-MM-DD');
mikel@19131
   206
      ELSIF (Cur_Parameter.parametername = 'voidedDocumentAcctDate') THEN
mikel@19131
   207
        v_voiddate_acct := TO_DATE(Cur_Parameter.p_string, 'YYYY-MM-DD');
mikel@19131
   208
      END IF;
gorkaion@7647
   209
    END LOOP; -- Get Parameter
gorkaion@7647
   210
    DBMS_OUTPUT.PUT_LINE('  v_Record_ID=' || v_Record_ID) ;
gorkaion@7647
   211
  ELSE
gorkaion@7647
   212
    DBMS_OUTPUT.PUT_LINE('--<<C_Invoive_Post>>') ;
gorkaion@7647
   213
    v_Record_ID:=p_Invoice_ID;
gorkaion@7647
   214
  END IF;
gorkaion@7647
   215
BEGIN --BODY
carlos@0
   216
gorkaion@7647
   217
  /*Invoiceline acct dimension*/
david@19193
   218
  SELECT C_INVOICE.ISSOTRX , C_INVOICE.c_bpartner_id
david@19193
   219
  INTO v_IsSOTrx, v_BPartner_ID
gorkaion@7647
   220
  FROM C_INVOICE
gorkaion@7647
   221
  WHERE C_INVOICE_ID = v_Record_ID;
david@19193
   222
david@19193
   223
  SELECT CASE WHEN (m.ISSOTRX='Y') THEN customer_blocking  ELSE vendor_blocking END ,  
david@19193
   224
  CASE WHEN (m.ISSOTRX='Y') THEN so_invoice_blocking ELSE po_invoice_blocking  END, name, DocAction
david@19193
   225
  INTO v_bpartner_blocked, v_invoiceBlocking, v_bpartner_name, v_DocAction
david@19193
   226
  FROM C_INVOICE m, C_BPartner bp
david@19193
   227
  WHERE m.c_bpartner_id=bp.c_bpartner_id
david@19193
   228
  AND m.C_INVOICE_ID=v_Record_ID
david@19193
   229
  AND m.C_BPARTNER_ID=v_BPartner_ID;
david@19193
   230
  IF (v_DocAction = 'CO' AND v_bpartner_blocked = 'Y' AND v_invoiceBlocking = 'Y') THEN
david@19193
   231
    RAISE_APPLICATION_ERROR(-20000,'@ThebusinessPartner@'||' '|| v_bpartner_name ||' '||'@BusinessPartnerBlocked@');
david@19193
   232
  END IF;
david@19193
   233
gorkaion@7647
   234
  IF (v_IsSOTrx = 'N') THEN
gorkaion@7647
   235
    FOR Cur_line IN
gorkaion@7647
   236
      (SELECT C_INVOICELINE.C_InvoiceLine_ID,
gorkaion@7647
   237
       C_INVOICELINE.LinenetAmt
gorkaion@7647
   238
       FROM C_INVOICELINE
gorkaion@7647
   239
       WHERE C_Invoice_ID = v_Record_ID
gorkaion@7647
   240
      )
gorkaion@7647
   241
    LOOP
gorkaion@7647
   242
      SELECT SUM(Amt) INTO v_acctAmount
gorkaion@7647
   243
      FROM C_INVOICELINE_ACCTDIMENSION
gorkaion@7647
   244
      WHERE C_InvoiceLine_ID = Cur_line.C_InvoiceLine_ID;
gorkaion@7647
   245
      IF (v_acctAmount <> Cur_line.LinenetAmt) THEN
gorkaion@7647
   246
        v_Message:='@QuantitiesNotMatch@';
gorkaion@7647
   247
        RAISE_APPLICATION_ERROR(-20000, '@QuantitiesNotMatch@') ;
gorkaion@7647
   248
      END IF;
gorkaion@7647
   249
    END LOOP;
carlos@0
   250
  END IF;
gorkaion@7647
   251
  /**
gorkaion@7647
   252
   * Read Invoice
gorkaion@7647
   253
   */
gorkaion@7647
   254
  v_ResultStr:='ReadingInvoice';
sandra@25787
   255
   SELECT i.Processing, i.Processed, i.DocAction, i.DocStatus,
gorkaion@14547
   256
      i.C_DocType_ID, i.C_DocTypeTarget_ID,
gorkaion@14547
   257
      i.PaymentRule, i.C_PaymentTerm_ID, i.DateAcct, i.DateInvoiced,
gorkaion@14547
   258
      i.AD_Client_ID, i.AD_Org_ID, i.UpdatedBy, i.DocumentNo,
gorkaion@14547
   259
      i.C_Order_ID, i.IsSOTrx, i.C_BPartner_ID, i.AD_User_ID,
gorkaion@14547
   260
      i.C_Currency_ID, i.POReference, i.Posted,
sandra@25543
   261
      i.c_Project_Id, i.C_WithHolding_ID, i.IsCashVat, i.M_PriceList_ID, i.prepaymentamt
gorkaion@7647
   262
  INTO v_Processing, v_Processed, v_DocAction, v_DocStatus,
asier@799
   263
      v_DocType_ID, v_DocTypeTarget_ID,
carlos@0
   264
      v_PaymentRule, v_PaymentTerm, v_DateAcct, v_DateInvoiced,
carlos@0
   265
      v_Client_ID, v_Org_ID, v_UpdatedBy, v_DocumentNo,
carlos@0
   266
      v_Order_ID, v_IsSOTrx, v_BPartner_ID, v_BPartner_User_ID,
gorkaion@7647
   267
      v_Currency_ID, v_POReference, v_Posted,
sandra@25543
   268
      v_C_Project_Id, cWithHoldID, v_iscashvat, v_PriceList_ID, v_prepaymentamt
gorkaion@17350
   269
  FROM C_INVOICE i
gorkaion@14547
   270
  WHERE i.C_Invoice_ID=v_Record_ID FOR UPDATE;
sandra@25787
   271
sandra@25787
   272
  SELECT dt.isreturn  
sandra@25787
   273
  INTO  v_isreturndoctype    
sandra@25787
   274
  FROM  c_doctype dt  
sandra@25787
   275
  WHERE dt.c_doctype_id= v_DocTypeTarget_ID;
sandra@25787
   276
sandra@25787
   277
  SELECT pl.istaxincluded
sandra@25787
   278
  INTO   v_istaxincluded
sandra@25787
   279
  FROM   m_pricelist pl 
sandra@25787
   280
  WHERE pl.m_pricelist_id= v_PriceList_ID;
sandra@25787
   281
  
gorkaion@7647
   282
  DBMS_OUTPUT.PUT_LINE('Invoice_ID=' || v_Record_ID ||', DocAction=' || v_DocAction || ', DocStatus=' || v_DocStatus || ', DocType_ID=' || v_DocType_ID || ', DocTypeTarget_ID=' || v_DocTypeTarget_ID) ;
gorkaion@7647
   283
  /**
gorkaion@7647
   284
   * Invoice Voided, Closed, or Reversed - No Action
gorkaion@7647
   285
   */
gorkaion@7647
   286
  IF (v_User_ID IS NOT NULL) THEN
gorkaion@7647
   287
    v_UpdatedBy:=v_User_ID;
gorkaion@7647
   288
  END IF;
gorkaion@7647
   289
  IF (v_DocStatus IN('VO', 'CL', 'RE')) THEN
gorkaion@7647
   290
    RAISE_APPLICATION_ERROR(-20000, '@AlreadyPosted@');
gorkaion@7647
   291
  END IF;
gorkaion@7647
   292
  --Allow to complete an invoice only in these cases:
gorkaion@7647
   293
  --* There are invoice lines
gorkaion@7647
   294
  --* There are tax lines
gorkaion@7647
   295
  --* There are both invoice and tax lines 
gorkaion@7647
   296
  IF (v_DocStatus='DR' AND v_DocAction='CO') THEN
gorkaion@7647
   297
    SELECT COUNT(*) INTO v_count
carlos@0
   298
    FROM C_INVOICE
gorkaion@7647
   299
    WHERE C_INVOICE_ID=v_Record_ID 
gorkaion@7647
   300
      AND (EXISTS (SELECT 1
gorkaion@7647
   301
                   FROM C_INVOICELINE
gorkaion@7647
   302
                   WHERE C_INVOICE_ID=v_Record_ID)
gorkaion@7647
   303
           OR EXISTS (SELECT 1
gorkaion@7647
   304
                      FROM C_INVOICETAX
gorkaion@7647
   305
                      WHERE C_INVOICE_ID=v_Record_ID));
gorkaion@7647
   306
gorkaion@7647
   307
    IF (v_count=0) THEN
gorkaion@7647
   308
      RAISE_APPLICATION_ERROR(-20000, '@InvoicesNeedLines@');
gorkaion@7647
   309
    END IF;
gorkaion@20972
   310
    SELECT count(*) INTO v_count
gorkaion@20972
   311
    FROM dual
gorkaion@20972
   312
    WHERE EXISTS (
gorkaion@20972
   313
        SELECT 1
gorkaion@20972
   314
        FROM c_invoiceline il JOIN m_product p ON il.m_product_id = p.m_product_id
gorkaion@20972
   315
        WHERE p.isgeneric = 'Y'
gorkaion@20972
   316
          AND il.c_invoice_id = v_record_id);
gorkaion@20940
   317
    IF (v_count > 0) THEN
gorkaion@20972
   318
      SELECT max(p.name) INTO v_productname
gorkaion@20972
   319
      FROM c_invoiceline il JOIN m_product p ON il.m_product_id = p.m_product_id
gorkaion@20972
   320
      WHERE p.isgeneric = 'Y'
gorkaion@20972
   321
        AND il.c_invoice_id = v_record_id;
gorkaion@20940
   322
      RAISE_APPLICATION_ERROR(-20000, '@CannotUseGenericProduct@ ' || v_productName);
gorkaion@20940
   323
    END IF;
gorkaion@20940
   324
victor@21513
   325
    -- Check the cash vat flag for all the taxes matches the invoice one
victor@21513
   326
    select count(1)
victor@21513
   327
    into v_count
victor@21513
   328
    from c_invoicetax it inner join c_tax t on (it.c_tax_id = t.c_tax_id)
victor@21513
   329
    where it.c_invoice_id = v_Record_ID
victor@21909
   330
    and t.iswithholdingtax = 'N'
victor@21909
   331
    and t.rate <> 0
victor@21513
   332
    and t.IsCashVat <> v_iscashvat;
victor@21513
   333
victor@21513
   334
    IF (v_count > 0) THEN
victor@21513
   335
      RAISE_APPLICATION_ERROR(-20000, '@CashVATNotMatch@');
victor@21513
   336
    END IF;
fernando@25006
   337
  
fernando@25006
   338
    /* Check active business partner*/
fernando@25006
   339
    SELECT isactive INTO v_bp_isactive
fernando@25006
   340
    FROM C_Bpartner
fernando@25006
   341
    WHERE C_Bpartner_ID = v_BPartner_ID;
fernando@25006
   342
fernando@25006
   343
    IF(v_bp_isactive = 'N') THEN
fernando@25006
   344
      RAISE_APPLICATION_ERROR(-20000, '@InActiveBusinessPartner@');
fernando@25006
   345
    END IF;
victor@21513
   346
gorkaion@7647
   347
    /*
gorkaion@7647
   348
     * Avoids repeating the same documentno for the same organization tree within the same fiscal year
gorkaion@7647
   349
     */
gorkaion@7647
   350
    SELECT COUNT(*) INTO v_count
gorkaion@7647
   351
    FROM (SELECT Y.C_CALENDAR_ID, Y.C_YEAR_ID,
gorkaion@7647
   352
              MIN(P.STARTDATE) AS PERIODSTARTDATE, MAX(P.ENDDATE) AS PERIODENDDATE
gorkaion@7647
   353
          FROM C_YEAR Y, C_PERIOD P
gorkaion@7647
   354
          WHERE Y.C_YEAR_ID = P.C_YEAR_ID
gorkaion@7647
   355
            AND Y.ISACTIVE = 'Y'
gorkaion@7647
   356
            AND P.ISACTIVE = 'Y'
gorkaion@7647
   357
            AND Y.C_CALENDAR_ID = (SELECT O.C_CALENDAR_ID 
gorkaion@7647
   358
                                   FROM AD_ORG O
gorkaion@7647
   359
                                   WHERE AD_ORG_ID = AD_ORG_GETCALENDAROWNER(v_Org_ID))
gorkaion@7647
   360
          GROUP BY Y.C_CALENDAR_ID, Y.C_YEAR_ID) A
gorkaion@7647
   361
    WHERE PERIODSTARTDATE <= v_DateInvoiced
gorkaion@7647
   362
      AND PERIODENDDATE+1 > v_DateInvoiced ;
gorkaion@7647
   363
    IF (v_count<>0) THEN
gorkaion@7647
   364
      SELECT PERIODSTARTDATE, PERIODENDDATE
gorkaion@7647
   365
        INTO v_PeriodStartDate, v_PeriodEndDate
gorkaion@7647
   366
      FROM (SELECT Y.C_CALENDAR_ID, Y.C_YEAR_ID,
gorkaion@7647
   367
                MIN(P.STARTDATE) AS PERIODSTARTDATE, MAX(P.ENDDATE) AS PERIODENDDATE
gorkaion@7647
   368
            FROM C_YEAR Y, C_PERIOD P
gorkaion@7647
   369
            WHERE Y.C_YEAR_ID = P.C_YEAR_ID
gorkaion@7647
   370
              AND Y.ISACTIVE = 'Y'
gorkaion@7647
   371
              AND P.ISACTIVE = 'Y'
gorkaion@7647
   372
              AND Y.C_CALENDAR_ID = (SELECT O.C_CALENDAR_ID 
gorkaion@7647
   373
                                     FROM AD_ORG O
gorkaion@7647
   374
                                     WHERE AD_ORG_ID = AD_ORG_GETCALENDAROWNER(v_Org_ID))
gorkaion@7647
   375
            GROUP BY Y.C_CALENDAR_ID, Y.C_YEAR_ID) A
gorkaion@7647
   376
      WHERE PERIODSTARTDATE <= v_DateInvoiced
gorkaion@7647
   377
        AND PERIODENDDATE+1 > v_DateInvoiced ;
gorkaion@7647
   378
      IF (v_PeriodStartDate IS NOT NULL AND v_PeriodEndDate IS NOT NULL) THEN
gorkaion@7647
   379
        SELECT D.AD_ORG_ID INTO v_DocNo_Org_ID
gorkaion@7647
   380
        FROM C_DOCTYPE D
gorkaion@7647
   381
        WHERE D.C_DOCTYPE_ID = v_DocTypeTarget_ID ;
gorkaion@7647
   382
        SELECT COUNT(*) INTO v_count
gorkaion@7647
   383
        FROM C_INVOICE I
gorkaion@7647
   384
        WHERE I.DOCUMENTNO = v_DocumentNo
gorkaion@7647
   385
          AND I.C_DOCTYPETARGET_ID = v_DocTypeTarget_ID
gorkaion@7647
   386
          AND I.DATEINVOICED >= v_PeriodStartDate
gorkaion@7647
   387
          AND I.DATEINVOICED < v_PeriodEndDate+1 
gorkaion@7647
   388
          AND I.C_INVOICE_ID <> v_Record_ID 
gorkaion@7647
   389
          AND AD_ISORGINCLUDED(I.AD_ORG_ID, v_DocNo_Org_ID, I.AD_CLIENT_ID) <> -1
gorkaion@7647
   390
          AND I.AD_CLIENT_ID = v_Client_ID ;
gorkaion@7647
   391
        IF (v_count<>0) THEN
gorkaion@7647
   392
          RAISE_APPLICATION_ERROR(-20000, '@DifferentDocumentNo@');
gorkaion@7647
   393
        END IF;
gorkaion@7647
   394
      END IF;
gorkaion@7647
   395
    END IF;
gorkaion@14547
   396
    -- Check that quantities are negative for return invoices
gorkaion@14547
   397
    IF (v_isreturndoctype = 'Y') THEN
gorkaion@14547
   398
      SELECT count(*) INTO v_count
gorkaion@14547
   399
      FROM c_invoiceline
gorkaion@14547
   400
      WHERE c_invoice_discount_id IS NULL
gorkaion@14656
   401
        AND qtyinvoiced > 0
javier@15881
   402
        AND c_invoice_id = v_Record_ID
javier@15881
   403
        AND NOT EXISTS (SELECT 1 FROM c_invoiceline L
javier@15881
   404
			LEFT JOIN M_PRODUCT P ON L.M_PRODUCT_ID = P.M_PRODUCT_ID
javier@17292
   405
			JOIN C_DISCOUNT CD ON CD.M_PRODUCT_ID=P.M_PRODUCT_ID
javier@15881
   406
			WHERE P.M_PRODUCT_ID=C_INVOICELINE.M_PRODUCT_ID);
javier@15881
   407
gorkaion@14547
   408
      IF (v_count <> 0) THEN
gorkaion@14547
   409
        RAISE_APPLICATION_ERROR(-20000, '@ReturnInvoiceNegativeQty@');
gorkaion@14547
   410
      END IF;
gorkaion@14547
   411
    END IF;
gorkaion@7647
   412
  END IF;
gorkaion@7647
   413
  IF (NOT FINISH_PROCESS) THEN
carlos@0
   414
    /**
gorkaion@7647
   415
     * Unlock
gorkaion@7647
   416
     */
gorkaion@7647
   417
    IF (v_DocAction='XL') THEN
gorkaion@7647
   418
      UPDATE C_INVOICE
gorkaion@7647
   419
      SET Processing='N',
carlos@0
   420
          DocAction='--',
harikrishnan@7209
   421
          Updated=now(),
harikrishnan@7209
   422
          UpdatedBy=v_UpdatedBy
gorkaion@7647
   423
      WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
   424
      FINISH_PROCESS:=TRUE;
gorkaion@7647
   425
    END IF;
gorkaion@7647
   426
  END IF;--FINISH_PROCESS
gorkaion@7647
   427
  IF (NOT FINISH_PROCESS) THEN
gorkaion@7647
   428
    IF (v_Processing='Y') THEN
gorkaion@7647
   429
      RAISE_APPLICATION_ERROR(-20000, '@OtherProcessActive@');
gorkaion@7647
   430
    END IF;
gorkaion@7647
   431
  END IF;--FINISH_PROCESS
gorkaion@7647
   432
  IF (NOT FINISH_PROCESS) THEN
gorkaion@7647
   433
    /**
gorkaion@7647
   434
     * Everything done
gorkaion@7647
   435
     */
gorkaion@7647
   436
    IF (v_Processed='Y' AND v_DocAction NOT IN('RC', 'RE')) THEN
gorkaion@7647
   437
      RAISE_APPLICATION_ERROR(-20000, '@AlreadyPosted@');
gorkaion@7647
   438
    END IF;
gorkaion@7647
   439
  END IF;--FINISH_PROCESS
asier@20714
   440
asier@20714
   441
IF (NOT FINISH_PROCESS) THEN
asier@20714
   442
   --C_Invoice_Post - Valistaion Process Extension Point
asier@20714
   443
    SELECT count(*) INTO v_count
asier@20714
   444
    FROM DUAL
asier@20714
   445
    where exists (select 1 from ad_ep_procedures where ad_extension_points_id = 'C3A4ABF2DF544F4694142DA9E79495F7');
asier@20714
   446
    IF (v_count=1) THEN
asier@20714
   447
      DECLARE
asier@20714
   448
        v_ep_instance VARCHAR2(32);
asier@20714
   449
        v_extension_point_id VARCHAR2(32) := 'C3A4ABF2DF544F4694142DA9E79495F7';
asier@20714
   450
      BEGIN
asier@20714
   451
        v_ep_instance := get_uuid();
asier@20714
   452
        AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'Record_ID',
asier@20714
   453
          v_record_id, NULL, NULL, NULL, NULL, NULL, NULL);
asier@20714
   454
        AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'DocAction',
asier@20714
   455
          v_DocAction, NULL, NULL, NULL, NULL, NULL, NULL);
asier@20714
   456
        AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'User',
asier@20714
   457
          v_User_ID, NULL, NULL, NULL, NULL, NULL, NULL);
asier@20714
   458
        AD_EXTENSION_POINT_HANDLER(v_ep_instance, v_extension_point_id);
asier@20714
   459
asier@20714
   460
        DELETE FROM ad_ep_instance_para
asier@20714
   461
        WHERE ad_ep_instance_id = v_ep_instance;
asier@20714
   462
      END;
asier@20714
   463
    END IF;
asier@20714
   464
 END IF;
asier@20714
   465
    
asier@20714
   466
gorkaion@7647
   467
  --cbt taxpayment
gorkaion@7647
   468
  IF (NOT FINISH_PROCESS) THEN
gorkaion@7647
   469
    IF (v_docaction IN ('VO', 'RE', 'RC')
gorkaion@7647
   470
       AND v_docstatus IN('CO', 'CL')) THEN
gorkaion@7647
   471
      SELECT COUNT(*) INTO v_count
gorkaion@7647
   472
      FROM c_taxregisterline trl
gorkaion@7647
   473
           INNER JOIN c_invoicetax it ON trl.c_invoicetax_id = it.c_invoicetax_id
gorkaion@7647
   474
           INNER JOIN c_taxregister tr ON tr.c_taxregister_id= trl.c_taxregister_id
gorkaion@7647
   475
           INNER JOIN c_taxpayment tp ON tr.c_taxpayment_id=tp.c_taxpayment_id
gorkaion@7647
   476
      WHERE it.c_invoice_id = v_record_id
gorkaion@7647
   477
        AND tp.processed='Y';
gorkaion@7647
   478
      IF (v_count > 0) THEN
naiara@16390
   479
        RAISE_APPLICATION_ERROR(-20000, '@20615@');
gorkaion@7647
   480
      ELSE
gorkaion@7647
   481
        DELETE FROM c_taxregisterline 
gorkaion@7647
   482
        WHERE c_taxregisterline.c_invoicetax_id IN
gorkaion@7647
   483
              (SELECT trl.c_invoicetax_id
gorkaion@7647
   484
               FROM c_taxregisterline trl
gorkaion@7647
   485
                    INNER JOIN c_invoicetax it ON trl.c_invoicetax_id = it.c_invoicetax_id
gorkaion@7647
   486
                    INNER JOIN c_taxregister tr ON tr.c_taxregister_id= trl.c_taxregister_id
gorkaion@7647
   487
                    INNER JOIN c_taxpayment tp ON tr.c_taxpayment_id=tp.c_taxpayment_id
gorkaion@7647
   488
               WHERE it.c_invoice_id = v_record_id
gorkaion@7647
   489
                 AND tp.processed='N');
carlos@0
   490
      END IF;
gorkaion@7647
   491
    END IF;
gorkaion@7647
   492
  END IF;
antonio@737
   493
gorkaion@7647
   494
  --end cbt taxpaymant
gorkaion@7647
   495
  IF (NOT FINISH_PROCESS) THEN
harikrishnan@7808
   496
  /**
harikrishnan@7808
   497
    *Update Invoice Net Unit Price to Product purchasing Plan Table
harikrishnan@7808
   498
    */
harikrishnan@7808
   499
    IF(v_isSoTrx ='N') THEN
harikrishnan@7808
   500
      FOR Cur_InvoiceNetLine IN (SELECT * FROM C_INVOICELINE WHERE C_Invoice_Id =  v_Record_ID)
harikrishnan@7808
   501
      LOOP
harikrishnan@7808
   502
          UPDATE M_PRODUCT_PO SET PriceLastInv=Cur_InvoiceNetLine.PriceActual 
harikrishnan@7808
   503
          Where C_BPARTNER_ID = v_BPartner_ID AND M_PRODUCT_ID = Cur_InvoiceNetLine.M_PRODUCT_ID
harikrishnan@7808
   504
          AND Ad_Isorgincluded(Cur_InvoiceNetLine.AD_ORG_ID,AD_ORG_ID, Cur_InvoiceNetLine.AD_Client_ID) <> -1;
harikrishnan@7808
   505
      END LOOP;
harikrishnan@7808
   506
    END IF;
gorkaion@7647
   507
    /**
gorkaion@7647
   508
     * Void if Document not processed
gorkaion@7647
   509
     */
gorkaion@7647
   510
    IF (v_DocAction='VO' AND v_DocStatus NOT IN('CO', 'RE')) THEN
adrianromero@12202
   511
adrianromero@12202
   512
        SELECT COUNT(*) INTO v_count
adrianromero@12202
   513
        FROM C_INVOICE
adrianromero@12202
   514
        WHERE C_INVOICE_ID=v_Record_ID
adrianromero@12202
   515
        AND (EXISTS (SELECT 1
adrianromero@12202
   516
            FROM C_INVOICELINE
adrianromero@12202
   517
            WHERE C_INVOICE_ID=v_Record_ID)
adrianromero@12202
   518
	    OR EXISTS (SELECT 1
adrianromero@12202
   519
            FROM C_INVOICETAX
adrianromero@12202
   520
            WHERE C_INVOICE_ID=v_Record_ID));
adrianromero@12202
   521
	IF (v_count=0) THEN
adrianromero@12202
   522
            RAISE_APPLICATION_ERROR(-20000, '@InvoicesNeedLines@');
adrianromero@12202
   523
        END IF;
adrianromero@12202
   524
gorkaion@7647
   525
      SELECT COUNT(*) INTO v_count
gorkaion@7647
   526
      FROM C_DEBT_PAYMENT
gorkaion@7647
   527
      WHERE C_Invoice_ID = v_Record_ID;
gorkaion@7647
   528
      IF (v_count>0) THEN
gorkaion@7647
   529
        RAISE_APPLICATION_ERROR(-20000, '@InvoiceWithManualDP@');
antonio@737
   530
      ELSE
gorkaion@7647
   531
        -- Reset Lines to 0
gorkaion@7647
   532
        UPDATE C_INVOICELINE
gorkaion@7647
   533
        SET QtyInvoiced=0,
harikrishnan@7209
   534
            LineNetAmt=0,
pandeeswari@22357
   535
            line_gross_amount=0,
harikrishnan@7209
   536
            Updated=now(),
gorkaion@7647
   537
            UpdatedBy=v_UpdatedBy
gorkaion@7647
   538
        WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
   539
gorkaion@7647
   540
        UPDATE C_INVOICE
gorkaion@7647
   541
        SET DocStatus='VO',
carlos@0
   542
            DocAction='--',
carlos@0
   543
            Processed='Y',
harikrishnan@7209
   544
            Updated=now(),
harikrishnan@7209
   545
            UpdatedBy=v_UpdatedBy
gorkaion@7647
   546
        WHERE C_Invoice_ID=v_Record_ID;
carlos@0
   547
      END IF;
gorkaion@7647
   548
      FINISH_PROCESS:=TRUE;
gorkaion@7647
   549
    END IF;
gorkaion@7647
   550
  END IF;--FINISH_PROCESS
gorkaion@7647
   551
  IF (NOT FINISH_PROCESS) THEN
gorkaion@7647
   552
    /**************************************************************************
gorkaion@7647
   553
     * Start Processing ------------------------------------------------------
gorkaion@7647
   554
     *************************************************************************/
gorkaion@7647
   555
    v_ResultStr:='LockingInvoice';
gorkaion@7647
   556
    BEGIN -- FOR COMMIT
gorkaion@7647
   557
      UPDATE C_INVOICE
gorkaion@7647
   558
      SET Processing='Y',
gorkaion@7647
   559
          Updated=now(),
gorkaion@7647
   560
          UpdatedBy=v_UpdatedBy
gorkaion@7647
   561
      WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
   562
      -- Now, needs to go to END_PROCESSING to unlock
gorkaion@7647
   563
      -- This Commit must remanin due differences between PL execution in Oracle and Postgres
gorkaion@7647
   564
      IF (p_PInstance_ID IS NOT NULL) THEN
gorkaion@7647
   565
        COMMIT;
gorkaion@7647
   566
      END IF;
carlos@0
   567
      EXCEPTION WHEN OTHERS THEN RAISE NO_DATA_FOUND;
gorkaion@7647
   568
    END;--FOR  COMMIT
gorkaion@7647
   569
    BEGIN -- FOR COMMIT
carlos@0
   570
pandeeswari@18807
   571
      SELECT COUNT(*)
pandeeswari@18807
   572
        INTO v_Count
pandeeswari@18807
   573
      FROM C_INVOICE I, C_INVOICELINE IL
pandeeswari@18807
   574
      WHERE I.C_INVOICE_ID = IL.C_INVOICE_ID
eduardo@19389
   575
        AND AD_ISORGINCLUDED(IL.AD_Org_ID, I.AD_Org_ID, I.AD_Client_ID) = -1
pandeeswari@18807
   576
        AND I.C_INVOICE_ID = v_Record_ID;
eduardo@19389
   577
      IF (v_Count>0) THEN
pandeeswari@18807
   578
        RAISE_APPLICATION_ERROR(-20000, '@NotCorrectOrgLines@') ;
pandeeswari@18807
   579
      END IF;
pandeeswari@18807
   580
carlos@0
   581
gorkaion@7647
   582
      SELECT COUNT(*) INTO v_Count
gorkaion@7647
   583
      FROM C_INVOICE C,
gorkaion@7647
   584
           C_DOCTYPE
david@8564
   585
      WHERE C_DOCTYPE.DocBaseType IN (
david@8564
   586
                                      select docbasetype
david@8564
   587
                                      from c_doctype
david@8564
   588
                                      where ad_table_id='318'
david@8564
   589
                                        and isactive='Y'
david@8564
   590
                                        and ad_client_id=C.AD_Client_ID)
gorkaion@7647
   591
        AND C_DOCTYPE.IsSOTrx=C.ISSOTRX
gorkaion@7647
   592
        AND Ad_Isorgincluded(C.AD_Org_ID,C_DOCTYPE.AD_Org_ID, C.AD_Client_ID) <> -1
gorkaion@7647
   593
        AND C.C_DOCTYPETARGET_ID = C_DOCTYPE.C_DOCTYPE_ID
gorkaion@7647
   594
        AND C.C_INVOICE_ID = V_RECORD_ID;
gorkaion@7647
   595
      IF (v_Count=0) THEN
carlos@0
   596
        RAISE_APPLICATION_ERROR(-20000, '@NotCorrectOrgDoctypeInvoice@');
carlos@0
   597
      END IF;
carlos@0
   598
gorkaion@7647
   599
      /**
gorkaion@7647
   600
       * Reverse Correction requires completes invoice ========================
gorkaion@7647
   601
       */
gorkaion@7647
   602
      IF (v_DocAction='RC' AND v_DocStatus='CO') THEN
gorkaion@7647
   603
        v_ResultStr:='ReverseCorrection';
gorkaion@7647
   604
        -- Copy Invoice with reverese Quantities (or Amounts)
gorkaion@7647
   605
        v_RInvoice_ID:= get_uuid();
gorkaion@7647
   606
        SELECT COALESCE(C_DOCTYPE_REVERSED_ID, C_DOCTYPE_ID) INTO v_DoctypeReversed_ID
gorkaion@7647
   607
        FROM C_DOCTYPE
gorkaion@7647
   608
        WHERE C_DOCTYPE_ID=v_DocType_ID;
gorkaion@7647
   609
        Ad_Sequence_Doctype(v_DoctypeReversed_ID, v_Record_ID, 'Y', v_RDocumentNo) ;
gorkaion@7647
   610
        IF (v_RDocumentNo IS NULL) THEN
gorkaion@7647
   611
          Ad_Sequence_Doc('DocumentNo_C_Invoice', v_Client_ID, 'Y', v_RDocumentNo) ;
gorkaion@7647
   612
        END IF;
gorkaion@7647
   613
        v_Message:='@ReversedBy@: ' || v_RDocumentNo;
gorkaion@7647
   614
        --
gorkaion@7647
   615
        DBMS_OUTPUT.PUT_LINE('Reversal Invoice_ID=' || v_RInvoice_ID || ' DocumentNo=' || v_RDocumentNo) ;
gorkaion@7647
   616
        v_ResultStr:='InsertInvoice ID=' || v_RInvoice_ID;
gorkaion@7647
   617
        -- Don't copy C_Payment_ID or C_CashLine_ID
gorkaion@7647
   618
        INSERT INTO C_INVOICE
carlos@0
   619
            (
carlos@0
   620
              C_Invoice_ID, C_Order_ID, AD_Client_ID, AD_Org_ID,
carlos@0
   621
              IsActive, Created, CreatedBy, Updated,
carlos@0
   622
              UpdatedBy, IsSOTrx, DocumentNo, DocStatus,
carlos@0
   623
              DocAction, Processing, Processed, C_DocType_ID,
eduardo@2382
   624
              C_DocTypeTarget_ID, Description, SalesRep_ID,
carlos@1259
   625
              DateInvoiced, DatePrinted, IsPrinted, TaxDate,
carlos@0
   626
              DateAcct, C_PaymentTerm_ID, C_BPartner_ID, C_BPartner_Location_ID,
carlos@0
   627
              AD_User_ID, POReference, DateOrdered, IsDiscountPrinted,
carlos@0
   628
              C_Currency_ID, PaymentRule, C_Charge_ID, ChargeAmt,
carlos@0
   629
              TotalLines, GrandTotal, M_PriceList_ID, C_Campaign_ID,
carlos@0
   630
              C_Project_ID, C_Activity_ID, AD_OrgTrx_ID, User1_ID,
eduardo@18854
   631
              User2_ID, fin_paymentmethod_id, C_CostCenter_ID,
eduardo@18854
   632
              A_Asset_ID
carlos@0
   633
            )
carlos@0
   634
          SELECT v_RInvoice_ID, C_Order_ID, AD_Client_ID, AD_Org_ID,
harikrishnan@7209
   635
            IsActive, now(), v_UpdatedBy, now(),
harikrishnan@7209
   636
            v_UpdatedBy, IsSOTrx, v_RDocumentNo, 'DR',
carlos@0
   637
             'CO', 'N', 'N', v_DoctypeReversed_ID,
jon@22855
   638
            v_DoctypeReversed_ID, '(*R*: ' || DocumentNo || ') ' || COALESCE(TO_CHAR(Description), ''), SalesRep_ID,
alekosmp86@30633
   639
            TRUNC(now()), NULL, 'N', NULL,
alekosmp86@30633
   640
            TRUNC(now()), C_PaymentTerm_ID, C_BPartner_ID, C_BPartner_Location_ID,
carlos@0
   641
            AD_User_ID, POReference, DateOrdered, IsDiscountPrinted,
carlos@0
   642
            C_Currency_ID, PaymentRule, C_Charge_ID, ChargeAmt * -1,
adrianromero@27136
   643
            0, 0, --Totals are recalculed adding invoice lines
adrianromero@27136
   644
            M_PriceList_ID, C_Campaign_ID,
carlos@0
   645
            C_Project_ID, C_Activity_ID, AD_OrgTrx_ID, User1_ID,
eduardo@18854
   646
            User2_ID, fin_paymentmethod_id, C_CostCenter_ID,
eduardo@18854
   647
            A_Asset_ID
carlos@0
   648
          FROM C_INVOICE
carlos@0
   649
          WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
   650
        -- Create Reversed invoice relation
gorkaion@7647
   651
        INSERT INTO C_Invoice_Reverse
gorkaion@7647
   652
          (
gorkaion@7647
   653
           C_Invoice_Reverse_ID,AD_Client_ID, AD_Org_ID,
gorkaion@7647
   654
           IsActive, Created, CreatedBy, Updated,
gorkaion@7647
   655
           UpdatedBy, C_Invoice_ID, Reversed_C_Invoice_ID
gorkaion@7647
   656
          )
victor@4940
   657
          SELECT get_uuid(), AD_Client_ID, AD_Org_ID,
harikrishnan@7209
   658
              'Y', now(), v_UpdatedBy, now(),
harikrishnan@7209
   659
              v_UpdatedBy, v_RInvoice_ID, C_Invoice_ID
victor@4940
   660
          FROM C_INVOICE
victor@4940
   661
          WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
   662
asier@18342
   663
        
gorkaion@7647
   664
        --  Delete C_Invoice_Discounts inserted by the trigger
gorkaion@7647
   665
        DELETE FROM C_INVOICE_DISCOUNT WHERE C_Invoice_ID=v_RInvoice_ID;
gorkaion@7647
   666
        --  Insert discounts as in the reversed invoice
gorkaion@7647
   667
        FOR Cur_Discount IN
gorkaion@7647
   668
          (SELECT *
gorkaion@7647
   669
           FROM C_INVOICE_DISCOUNT
gorkaion@7647
   670
           WHERE C_Invoice_ID=v_Record_ID
gorkaion@7647
   671
           ORDER BY LINE
gorkaion@7647
   672
          )
gorkaion@7647
   673
        LOOP
gorkaion@7647
   674
          INSERT INTO C_INVOICE_DISCOUNT
gorkaion@7647
   675
            (
gorkaion@7647
   676
              C_INVOICE_DISCOUNT_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
gorkaion@7647
   677
              CREATED, CREATEDBY, UPDATED, UPDATEDBY,
gorkaion@7647
   678
              C_INVOICE_ID, C_DISCOUNT_ID, LINE, CASCADE
carlos@0
   679
            )
gorkaion@7647
   680
            VALUES
gorkaion@7647
   681
            (
gorkaion@7647
   682
              get_uuid(), Cur_Discount.AD_Client_ID, Cur_Discount.AD_Org_ID, 'Y',
gorkaion@7647
   683
              now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7647
   684
              v_RInvoice_ID, Cur_Discount.C_Discount_ID, Cur_Discount.Line, Cur_Discount.CASCADE
gorkaion@7647
   685
            );
gorkaion@7647
   686
        END LOOP;
gorkaion@7647
   687
        -- Create Reversal Invoice Lines
gorkaion@7647
   688
        FOR Cur_InvoiceLine IN
gorkaion@7647
   689
          (SELECT *
gorkaion@7647
   690
           FROM C_INVOICELINE
gorkaion@7647
   691
           WHERE C_Invoice_ID=v_Record_ID
gorkaion@7647
   692
             AND C_INVOICE_DISCOUNT_ID IS NULL
gorkaion@7647
   693
           ORDER BY Line
gorkaion@7647
   694
          )
gorkaion@7647
   695
        LOOP
gorkaion@7647
   696
          v_NextNo := get_uuid();
gorkaion@7647
   697
          INSERT INTO C_INVOICELINE
gorkaion@7647
   698
            (
gorkaion@7647
   699
              C_InvoiceLine_ID, AD_Client_ID, AD_Org_ID, IsActive,
gorkaion@7647
   700
              Created, CreatedBy, Updated, UpdatedBy,
gorkaion@7647
   701
              C_Invoice_ID, C_OrderLine_ID, M_InOutLine_ID, Line,
gorkaion@7647
   702
              Description, M_Product_ID, QtyInvoiced, PriceList,
gorkaion@7647
   703
              PriceActual, LineNetAmt, C_Charge_ID, ChargeAmt,
victor@15865
   704
              C_UOM_ID, C_Tax_ID, PriceStd, 
mikel@17453
   705
              Financial_Invoice_Line, Account_ID,Taxbaseamt,
eduardo@18445
   706
              gross_unit_price, line_gross_amount,
eduardo@18854
   707
              isdeferred, defplantype, periodnumber, c_period_id,
eduardo@18854
   708
              c_bpartner_id, c_project_id, c_projectline_id, a_asset_id,
david@30722
   709
              user1_id, user2_id, c_costcenter_id,
david@30722
   710
              C_AUM, AUMQTY)
gorkaion@7647
   711
            VALUES
gorkaion@7647
   712
            (
gorkaion@7647
   713
              v_NextNo, Cur_InvoiceLine.AD_Client_ID, Cur_InvoiceLine.AD_Org_ID, 'Y',
gorkaion@7647
   714
              now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7647
   715
              v_RInvoice_ID, Cur_InvoiceLine.C_OrderLine_ID, Cur_InvoiceLine.M_InoutLine_ID, Cur_InvoiceLine.Line,
gorkaion@7647
   716
               '*R*: ' || Cur_InvoiceLine.Description, Cur_InvoiceLine.M_Product_ID, Cur_InvoiceLine.QtyInvoiced * -1, Cur_InvoiceLine.PriceList,
gorkaion@7647
   717
              Cur_InvoiceLine.PriceActual, Cur_InvoiceLine.LineNetAmt * -1, Cur_InvoiceLine.C_Charge_ID, Cur_InvoiceLine.ChargeAmt * -1,
victor@15865
   718
              Cur_InvoiceLine.C_UOM_ID, Cur_InvoiceLine.C_Tax_ID, Cur_InvoiceLine.PriceStd, 
mikel@17453
   719
              Cur_InvoiceLine.Financial_Invoice_Line, Cur_InvoiceLine.Account_ID,Cur_InvoiceLine.Taxbaseamt * -1,
eduardo@18445
   720
              Cur_InvoiceLine.gross_unit_price, Cur_InvoiceLine.line_gross_amount * -1,
eduardo@18854
   721
              Cur_InvoiceLine.isdeferred, Cur_InvoiceLine.defplantype, Cur_InvoiceLine.periodnumber, Cur_InvoiceLine.c_period_id,
eduardo@18854
   722
              Cur_InvoiceLine.c_bpartner_id, Cur_InvoiceLine.c_project_id, Cur_InvoiceLine.c_projectline_id, Cur_InvoiceLine.a_asset_id,
david@30722
   723
              Cur_InvoiceLine.user1_id, Cur_InvoiceLine.user2_id, Cur_InvoiceLine.C_CostCenter_ID,
david@30722
   724
              Cur_InvoiceLine.C_AUM, Cur_InvoiceLine.AUMQTY
gorkaion@7647
   725
            );
gorkaion@7647
   726
          INSERT INTO M_MATCHINV
gorkaion@7647
   727
            (M_MATCHINV_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY,
gorkaion@7647
   728
            M_INOUTLINE_ID, C_INVOICELINE_ID, M_PRODUCT_ID, DATETRX, QTY, PROCESSING, PROCESSED, POSTED)
david@7191
   729
            SELECT
gorkaion@7647
   730
              get_uuid(), AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, now(), v_UpdatedBy, now(), v_UpdatedBy,
david@7195
   731
              M_INOUTLINE_ID, v_NextNo, M_PRODUCT_ID, DATETRX, -QTY, 'N', 'Y', 'N'
david@7191
   732
            FROM M_MATCHINV
david@7197
   733
            WHERE C_INVOICELINE_ID = Cur_InvoiceLine.C_InvoiceLine_ID;
gorkaion@7647
   734
          /* OrderLine.qtyInvoiced is updated in c_invoicePost
gorkaion@7647
   735
          UPDATE C_OrderLine
gorkaion@7647
   736
          SET QtyInvoiced = QtyInvoiced - Cur_InvoiceLine.QtyInvoiced,
gorkaion@7647
   737
              Updated = now(),
gorkaion@7647
   738
              UpdatedBy=v_UpdatedBy
gorkaion@7647
   739
          WHERE C_OrderLine_ID=Cur_InvoiceLine.C_OrderLine_ID; */
adrianromero@12247
   740
adrianromero@12247
   741
          -- Create Reversal Accounting Dimensions
adrianromero@12247
   742
          FOR Cur_InvoiceLineAcctDim IN
adrianromero@12247
   743
          (SELECT *
adrianromero@12247
   744
           FROM C_INVOICELINE_ACCTDIMENSION
adrianromero@12247
   745
           WHERE C_InvoiceLine_ID=Cur_InvoiceLine.C_InvoiceLine_ID)
adrianromero@12247
   746
            LOOP
adrianromero@12247
   747
                    
adrianromero@12247
   748
            INSERT INTO C_INVOICELINE_ACCTDIMENSION(
adrianromero@12247
   749
            c_invoiceline_acctdimension_id, ad_client_id, ad_org_id, isactive, created, createdby, updated, updatedby, c_invoiceline_id, 
eduardo@18972
   750
            amt, c_project_id, c_campaign_id, user1_id, user2_id, c_costcenter_id, c_activity_id, c_bpartner_id, m_product_id) 
adrianromero@12247
   751
            values(
adrianromero@12247
   752
            get_uuid(), Cur_InvoiceLineAcctDim.ad_client_id, Cur_InvoiceLineAcctDim.ad_org_id, Cur_InvoiceLineAcctDim.isactive, now(), v_UpdatedBy, now(), v_UpdatedBy, v_NextNo,
eduardo@18854
   753
            Cur_InvoiceLineAcctDim.amt * -1, Cur_InvoiceLineAcctDim.c_project_id, Cur_InvoiceLineAcctDim.c_campaign_id, Cur_InvoiceLineAcctDim.user1_id, Cur_InvoiceLineAcctDim.user2_id, 
eduardo@18972
   754
            Cur_InvoiceLineAcctDim.c_costcenter_id, Cur_InvoiceLineAcctDim.c_activity_id, Cur_InvoiceLineAcctDim.c_bpartner_id, Cur_InvoiceLineAcctDim.m_product_id);
adrianromero@12247
   755
adrianromero@12247
   756
            END LOOP; -- Create Reversal Accounting Dimensions
adrianromero@12247
   757
asier@18354
   758
					-- Add promotions
asier@18354
   759
					FOR Cur_Offer IN 
asier@18354
   760
						(SELECT *
asier@18354
   761
						 FROM C_INVOICELINE_OFFER
asier@18354
   762
						 WHERE c_InvoiceLine_ID = Cur_InvoiceLine.c_InvoiceLine_ID
asier@18354
   763
						) LOOP
asier@18354
   764
						INSERT INTO C_INVOICELINE_OFFER
asier@18354
   765
						(c_invoiceline_offer_id, ad_client_id, ad_org_id,                         
asier@18354
   766
						 isactive, createdby, updatedby,           
asier@18354
   767
						 c_invoiceline_id, line, m_offer_id,          
asier@18354
   768
						 priceoffer, priceoffergross, amtoffer, 
asier@18354
   769
						 totalamt, displayedtotalamt)
asier@18354
   770
						 values
asier@18354
   771
						(get_uuid(), Cur_Offer.AD_Client_ID, Cur_Offer.AD_Org_ID,
asier@18354
   772
						 'Y', v_UpdatedBy, v_UpdatedBy,
asier@18354
   773
						 v_NextNo, Cur_Offer.line, Cur_Offer.m_offer_id,
asier@18354
   774
						 Cur_Offer.priceoffer, Cur_Offer.priceoffergross, Cur_Offer.amtoffer,
asier@18354
   775
						 Cur_Offer.totalamt, Cur_Offer.displayedtotalamt);
asier@18354
   776
					END LOOP;
gorkaion@7647
   777
        END LOOP; -- Create Reversal Invoice Lines
ioritz@16017
   778
ioritz@16017
   779
        -- Check if there is any manually added tax
ioritz@16017
   780
        FOR Cur_InvoiceTax IN
markmm82@30634
   781
          (SELECT c_tax_id, ad_client_id, ad_org_id, isactive, taxbaseamt, taxamt, recalculate
ioritz@16017
   782
          FROM c_invoicetax
ioritz@16017
   783
          WHERE c_invoice_id = v_Record_ID
markmm82@30634
   784
          AND RECALCULATE = 'N')
ioritz@16017
   785
        LOOP
ioritz@16017
   786
          SELECT MAX(line) + 10 INTO v_LineMax FROM c_invoicetax WHERE c_invoice_id = v_RInvoice_ID;
ioritz@16017
   787
          INSERT INTO c_invoicetax(c_tax_id, c_invoice_id, ad_client_id, ad_org_id, isactive, created, createdby, updated, updatedby,
ioritz@16017
   788
            taxbaseamt, taxamt, line, c_invoicetax_id, recalculate)
ioritz@16017
   789
          VALUES(Cur_InvoiceTax.c_tax_id, v_RInvoice_ID, Cur_InvoiceTax.ad_client_id, Cur_InvoiceTax.ad_org_id, Cur_InvoiceTax.isactive,
ioritz@16017
   790
            now(), v_UpdatedBy, now(), v_UpdatedBy, -Cur_InvoiceTax.taxbaseamt, -Cur_InvoiceTax.taxamt, v_LineMax,
ioritz@16017
   791
            get_uuid(), Cur_InvoiceTax.recalculate);
ioritz@16017
   792
        END LOOP;
ioritz@16017
   793
        
gorkaion@7647
   794
        -- Close Invoice
gorkaion@7647
   795
        UPDATE C_INVOICE
gorkaion@7647
   796
        SET DocStatus='VO', -- it IS reversed
gorkaion@239
   797
            Description=COALESCE(TO_CHAR(Description), '') || ' (*R* -> ' || v_RDocumentNo || ')',
carlos@0
   798
            DocAction='--',
carlos@0
   799
            Processed='Y',
antonio@735
   800
            Updated=now()
gorkaion@7647
   801
        WHERE C_Invoice_ID=v_Record_ID;
mikel@19131
   802
        -- Update reversal invoice dates
mikel@19131
   803
        IF (v_voiddate_inv IS NOT NULL) THEN
mikel@19131
   804
          UPDATE C_INVOICE SET DateInvoiced = v_voiddate_inv WHERE C_Invoice_ID=v_RInvoice_ID;
mikel@19131
   805
        END IF;
mikel@19131
   806
        IF (v_voiddate_acct IS NOT NULL) THEN
mikel@19131
   807
          UPDATE C_INVOICE SET DateAcct = v_voiddate_acct WHERE C_Invoice_ID=v_RInvoice_ID;
mikel@19131
   808
        END IF;
sandra@25543
   809
        IF (v_prepaymentamt !=0) THEN
sandra@25543
   810
          UPDATE C_INVOICE SET prepaymentamt = v_prepaymentamt WHERE C_Invoice_ID=v_RInvoice_ID;
sandra@25543
   811
        END IF;
gorkaion@7647
   812
        -- Post Reversal
gorkaion@7647
   813
        C_INVOICE_POST(NULL, v_RInvoice_ID) ;
gorkaion@7647
   814
        -- Reversal Transaction is closed
gorkaion@7647
   815
        UPDATE C_INVOICE
david@15389
   816
        SET DocStatus='VO', -- the reversal transaction (issue 18633) (rolledback in issue 19541)
carlos@0
   817
            DocAction='--',
carlos@0
   818
            Processed='Y'
gorkaion@7647
   819
        WHERE C_Invoice_ID=v_RInvoice_ID;
gorkaion@7647
   820
        -- If Payments from both invoices are pending, create a new settlement and cancel them
gorkaion@7647
   821
        SELECT COUNT(*) INTO v_count
gorkaion@7647
   822
        FROM C_DEBT_PAYMENT dp
gorkaion@7647
   823
        WHERE C_Debt_Payment_Status(dp.C_Settlement_Cancel_ID, dp.Cancel_Processed, dp.Generate_Processed, dp.IsPaid, dp.IsValid, dp.C_CashLine_ID, dp.C_BankStatementLine_ID)<>'P'
gorkaion@7647
   824
          AND(dp.C_Invoice_ID=v_Record_ID
gorkaion@7647
   825
          OR dp.C_Invoice_ID=v_RInvoice_ID) ;
gorkaion@7647
   826
        -- To cancel, the sum of amounts should be 0
gorkaion@7647
   827
        IF (v_count=0) THEN
gorkaion@7647
   828
          SELECT SUM(AMOUNT) INTO v_count
carlos@0
   829
          FROM C_DEBT_PAYMENT dp
gorkaion@7647
   830
          WHERE dp.C_Invoice_ID=v_Record_ID
gorkaion@7647
   831
            OR dp.C_Invoice_ID=v_RInvoice_ID;
gorkaion@7647
   832
          IF (v_count=0) THEN
gorkaion@7647
   833
            v_SettlementDocType_ID:=Ad_Get_Doctype(v_Client_ID, v_Org_ID, TO_CHAR('STT')) ;
gorkaion@7647
   834
            v_settlementID := get_uuid();
gorkaion@7647
   835
            Ad_Sequence_Doctype(v_SettlementDocType_ID, v_Record_ID, 'Y', v_SDocumentNo) ;
gorkaion@7647
   836
            IF (v_SDocumentNo IS NULL) THEN
gorkaion@7647
   837
              Ad_Sequence_Doc('DocumentNo_C_Settlement', v_Client_ID, 'Y', v_SDocumentNo) ;
gorkaion@7647
   838
            END IF;
gorkaion@7647
   839
            INSERT
gorkaion@7647
   840
            INTO C_SETTLEMENT
gorkaion@7647
   841
              (
gorkaion@7647
   842
                C_SETTLEMENT_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
gorkaion@7647
   843
                CREATED, CREATEDBY, UPDATED, UPDATEDBY,
gorkaion@7647
   844
                DOCUMENTNO, DATETRX, DATEACCT, SETTLEMENTTYPE,
gorkaion@7647
   845
                C_DOCTYPE_ID, PROCESSING, PROCESSED, POSTED,
gorkaion@7647
   846
                C_CURRENCY_ID, C_PROJECT_ID, C_CAMPAIGN_ID, C_ACTIVITY_ID,
gorkaion@7647
   847
                USER1_ID, USER2_ID, CREATEFROM, ISGENERATED
gorkaion@7647
   848
              )
carlos@0
   849
              SELECT v_settlementID, AD_Client_ID, AD_Org_ID, 'Y',
harikrishnan@7209
   850
                now(), v_UpdatedBy, now(), v_UpdatedBy,
antonio@735
   851
                '*RE*'||v_SDocumentNo, TRUNC(now()), TRUNC(now()), 'C',
carlos@0
   852
                v_SettlementDocType_ID, 'N', 'N', 'N',
carlos@0
   853
                C_Currency_ID, C_PROJECT_ID, C_CAMPAIGN_ID, C_ACTIVITY_ID,
carlos@0
   854
                USER1_ID, USER2_ID, 'N', 'Y'
carlos@0
   855
              FROM C_INVOICE
carlos@0
   856
              WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
   857
            UPDATE C_DEBT_PAYMENT
gorkaion@7647
   858
            SET C_Settlement_Cancel_id=v_settlementID,
antonio@735
   859
                UPDATED=now(),
carlos@0
   860
                UPDATEDBY=v_UpdatedBy
gorkaion@7647
   861
            WHERE C_DEBT_PAYMENT.C_Invoice_ID=v_Record_ID
gorkaion@7647
   862
              OR C_DEBT_PAYMENT.C_Invoice_ID=v_RInvoice_ID;
gorkaion@7647
   863
            C_SETTLEMENT_POST(NULL, v_settlementID) ;
gorkaion@7647
   864
          END IF;
gorkaion@7647
   865
        END IF;
gorkaion@7647
   866
        END_PROCESSING:=TRUE;
gorkaion@7647
   867
      END IF;
gorkaion@7647
   868
    END; -- FOR COMMIT
gorkaion@7647
   869
  END IF;--FINISH_PROCESS
gorkaion@7647
   870
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
   871
    /**************************************************************************
gorkaion@7647
   872
     * Credit Multiplier
gorkaion@7647
   873
     *************************************************************************/
gorkaion@7647
   874
    DECLARE
gorkaion@7647
   875
      v_DocBaseType C_DOCTYPE.DocBaseType%TYPE;
mikel@11116
   876
      v_DocTypeIsSOtrx C_DOCTYPE.IsSOtrx%TYPE;
gorkaion@7647
   877
    BEGIN
gorkaion@7647
   878
      -- Is it a Credit Memo?
mikel@11116
   879
      SELECT DocBaseType, IsReversal, issotrx INTO v_DocBaseType, v_isReversal, v_DocTypeIsSOtrx
gorkaion@7647
   880
      FROM C_DOCTYPE
gorkaion@7647
   881
      WHERE C_DocType_ID=v_DocType_ID;
mikel@11116
   882
      IF (v_DocBaseType IN('ARC', 'API') or (v_isReversal='Y' and v_DocTypeIsSOtrx='Y') or (v_isReversal='N' and v_DocTypeIsSOtrx='N')) THEN
gorkaion@7647
   883
        v_Multiplier:=-1;
gorkaion@7647
   884
      END IF;
gorkaion@7647
   885
    END;
gorkaion@7647
   886
  END IF;--FINISH_PROCESS
gorkaion@7647
   887
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
   888
    /************************************************************************
gorkaion@7647
   889
     * Actions allowed: Reactivate
gorkaion@7647
   890
     * Modified by Jon Alegria
gorkaion@7647
   891
     */
gorkaion@7647
   892
    IF (v_DocAction='RE') THEN
gorkaion@7647
   893
      IF (v_DocStatus<>'CO') THEN
gorkaion@7647
   894
        RAISE_APPLICATION_ERROR(-20000, '@NotCompletedInvoice@');
gorkaion@7647
   895
      END IF;
gorkaion@7647
   896
      IF (v_Posted='Y') THEN
gorkaion@7647
   897
        RAISE_APPLICATION_ERROR(-20000, '@InvoiceDocumentPosted@');
gorkaion@7647
   898
      END IF;
gorkaion@7647
   899
      SELECT COUNT(*), MAX(C_DEBT_PAYMENT_ID)
gorkaion@7647
   900
        INTO v_Count, v_Debtpayment_ID
gorkaion@7647
   901
      FROM C_DEBT_PAYMENT
gorkaion@7647
   902
      WHERE C_DEBT_PAYMENT.C_Invoice_ID=v_Record_ID
gorkaion@7647
   903
        AND C_Debt_Payment_Status(C_Settlement_Cancel_ID, Cancel_Processed, C_DEBT_PAYMENT.Generate_Processed, IsPaid, IsValid, C_Cashline_ID, C_BankstatementLine_ID)<>'P'
gorkaion@7647
   904
        AND C_ORDER_ID IS NULL;
gorkaion@7647
   905
      IF (v_Count<>0) THEN
gorkaion@7647
   906
        --Added by P.Sarobe. New messages
gorkaion@7647
   907
        SELECT c_Bankstatementline_Id, c_cashline_id, c_settlement_cancel_id, ispaid, cancel_processed
gorkaion@7647
   908
          INTO v_Bankstatementline_ID, v_CashLine_ID, v_Settlement_Cancel_ID, v_ispaid, v_Cancel_Processed
gorkaion@7647
   909
        FROM C_DEBT_PAYMENT
gorkaion@7647
   910
        WHERE C_Debt_Payment_ID = v_Debtpayment_ID;
gorkaion@7647
   911
        IF (v_Bankstatementline_ID IS NOT NULL) THEN
gorkaion@7647
   912
          SELECT C_BANKSTATEMENT.NAME, C_BANKSTATEMENT.STATEMENTDATE
gorkaion@7647
   913
            INTO v_nameBankstatement, v_dateBankstatement
gorkaion@7647
   914
          FROM C_BANKSTATEMENT, C_BANKSTATEMENTLINE
gorkaion@7647
   915
          WHERE C_BANKSTATEMENT.C_BANKSTATEMENT_ID = C_BANKSTATEMENTLINE.C_BANKSTATEMENT_ID
gorkaion@7647
   916
            AND C_BANKSTATEMENTLINE.C_BANKSTATEMENTLINE_ID = v_Bankstatementline_ID;
gorkaion@7647
   917
          RAISE_APPLICATION_ERROR(-20000, '@ManagedDebtPaymentInvoiceBank@'||v_nameBankstatement||' '||'@Bydate@'||v_dateBankstatement) ;
gorkaion@7647
   918
        END IF;
gorkaion@7647
   919
        IF (v_CashLine_ID IS NOT NULL) THEN
gorkaion@7647
   920
          SELECT C_CASH.NAME, C_CASH.STATEMENTDATE
gorkaion@7647
   921
            INTO v_nameCash, v_dateCash
gorkaion@7647
   922
          FROM C_CASH, C_CASHLINE
gorkaion@7647
   923
          WHERE C_CASH.C_CASH_ID = C_CASHLINE.C_CASH_ID
gorkaion@7647
   924
            AND C_CASHLINE.C_CASHLINE_ID = v_CashLine_ID;
gorkaion@7647
   925
          RAISE_APPLICATION_ERROR(-20000, '@ManagedDebtPaymentInvoiceCash@'||v_nameCash||' '||'@Bydate@'||v_dateCash) ;
gorkaion@7647
   926
        END IF;
gorkaion@7647
   927
        IF (v_Cancel_Processed='Y' AND v_ispaid='N') THEN
gorkaion@7647
   928
          SELECT documentno, datetrx
gorkaion@7647
   929
            INTO v_documentno_Settlement, v_dateSettlement
gorkaion@7647
   930
          FROM C_SETTLEMENT
gorkaion@7647
   931
          WHERE C_SETTLEMENT_ID = v_Settlement_Cancel_ID;
gorkaion@7647
   932
          RAISE_APPLICATION_ERROR(-20000, '@ManagedDebtPaymentOrderCancel@'||v_documentno_Settlement||' '||'@Bydate@'||v_dateSettlement) ;
gorkaion@7647
   933
        END IF;
gorkaion@7647
   934
      END IF;
gorkaion@7647
   935
      SELECT COUNT(*) INTO v_Count
gorkaion@7647
   936
      FROM C_DP_MANAGEMENTLINE ml,
gorkaion@7647
   937
           C_DP_MANAGEMENT m,
gorkaion@7647
   938
           C_DEBT_PAYMENT dp
gorkaion@7647
   939
      WHERE ml.C_DP_Management_ID=m.C_DP_Management_ID
gorkaion@7647
   940
        AND ml.C_Debt_Payment_ID=dp.C_Debt_Payment_ID
gorkaion@7647
   941
        AND dp.C_Invoice_ID=v_Record_ID
gorkaion@7647
   942
        AND m.processed='Y';
gorkaion@7647
   943
      IF (v_Count!=0) THEN
gorkaion@7647
   944
        RAISE_APPLICATION_ERROR(-20000, '@DPInvoiceManaged@');
gorkaion@7647
   945
      END IF;
gorkaion@7647
   946
      -- Pending undo not Stocked BOM's
gorkaion@7647
   947
      -- Undo BP Statictis
gorkaion@7647
   948
      --Undo first sale
gorkaion@7647
   949
      SELECT MIN(DateAcct) INTO v_FirstSales
gorkaion@7647
   950
      FROM C_INVOICE
gorkaion@7647
   951
      WHERE C_Invoice_ID<>v_Record_ID
gorkaion@7647
   952
        AND C_BPartner_ID=v_BPartner_ID;
gorkaion@7647
   953
      UPDATE C_BPARTNER  SET FirstSale=v_FirstSales  WHERE C_BPartner_ID=v_BPartner_ID;
gorkaion@7647
   954
      -- Undo Last contact
gorkaion@7647
   955
      FOR Cur_LastContact IN
gorkaion@7647
   956
        (SELECT Updated, DocumentNo, Ad_User_ID
gorkaion@7647
   957
         FROM C_INVOICE
gorkaion@7647
   958
         WHERE C_Invoice_ID<>v_Record_ID
gorkaion@7647
   959
           AND Ad_User_ID=v_BPartner_User_ID
gorkaion@7647
   960
         ORDER BY Updated DESC
gorkaion@7647
   961
        )
gorkaion@7647
   962
      LOOP
gorkaion@7647
   963
        UPDATE AD_USER
gorkaion@7647
   964
        SET LastContact=Cur_LastContact.Updated,
gorkaion@7647
   965
            LastResult=Cur_LastContact.DocumentNo
gorkaion@7647
   966
        WHERE AD_User_ID=Cur_LastContact.Ad_User_ID;
gorkaion@7647
   967
        EXIT;
gorkaion@7647
   968
      END LOOP;
gorkaion@7647
   969
      IF (v_IsSOTrx='Y') THEN
gorkaion@7647
   970
        -- Undo revenue and credit limit
javier@14949
   971
        --The next lines (3) have been commented due to the issue 19198
javier@14949
   972
        --UPDATE C_BPARTNER
javier@14949
   973
        --SET ActualLifeTimeValue=ActualLifeTimeValue -(v_Multiplier *  C_Base_Convert(v_GrandTotal, v_Currency_ID, v_Client_ID, v_DateAcct, v_Org_ID))
javier@14949
   974
        --WHERE C_BPartner_ID=v_BPartner_ID;
gorkaion@7647
   975
        FOR Cur_ReactivateInvoiceLine IN
gorkaion@7647
   976
          (SELECT C_InvoiceLine_ID, C_Orderline_ID, M_InoutLine_ID, QtyInvoiced
gorkaion@7647
   977
           FROM C_INVOICELINE
gorkaion@7647
   978
           WHERE C_Invoice_ID=v_Record_ID
gorkaion@7647
   979
          )
gorkaion@7647
   980
        LOOP
gorkaion@7647
   981
          IF (Cur_ReactivateInvoiceLine.C_OrderLine_ID IS NOT NULL) THEN
gaurav@21626
   982
            SELECT MAX(C_INVOICE.DateInvoiced), COALESCE(sum(QtyInvoiced),0) 
gaurav@21626
   983
	    INTO v_REDateInvoiced, v_invoiceline_qtysum
gaurav@21626
   984
	    FROM C_INVOICE, C_INVOICELINE
gaurav@21626
   985
	    WHERE C_INVOICE.C_Invoice_ID=C_INVOICELINE.C_INVOICE_ID
gaurav@21626
   986
	    AND C_INVOICELINE.C_ORDERLINE_ID=Cur_ReactivateInvoiceLine.C_ORDERLINE_ID
gaurav@21626
   987
	    and C_INVOICE.docstatus='CO'
gaurav@21626
   988
	    AND C_INVOICE.C_INVOICE_ID <> v_Record_ID;
gaurav@21626
   989
	    
gaurav@21626
   990
	    UPDATE C_ORDERLINE
gaurav@21626
   991
	    SET QtyInvoiced=v_invoiceline_qtysum, 
gaurav@21626
   992
		DateInvoiced=v_REDateInvoiced,
gaurav@21626
   993
		Updated=now(),
gaurav@21626
   994
		UpdatedBy=v_UpdatedBy
gaurav@21626
   995
	    WHERE C_ORDERLINE.C_OrderLine_ID=Cur_ReactivateInvoiceLine.C_OrderLine_ID;
gorkaion@7647
   996
          END IF;
gorkaion@7647
   997
          IF (Cur_ReactivateInvoiceLine.M_InOutLine_ID IS NOT NULL) THEN
gorkaion@7647
   998
            SELECT m.DOCSTATUS INTO v_REInOutStatus
gorkaion@7647
   999
            FROM M_INOUT m, M_INOUTLINE ml
gorkaion@7647
  1000
            WHERE M.M_InOut_ID=ml.M_InOut_ID
gorkaion@7647
  1001
              AND ml.M_InOutLine_ID=Cur_ReactivateInvoiceLine.M_InOutLine_ID;
gorkaion@7647
  1002
            IF (v_REInOutStatus<>'RE') THEN
gorkaion@7647
  1003
              SELECT COALESCE(SUM(C_INVOICELINE.QTYINVOICED), 0) INTO v_REtotalQtyInvoiced
gorkaion@7647
  1004
              FROM C_INVOICELINE, C_INVOICE
gorkaion@7647
  1005
              WHERE C_INVOICE.C_Invoice_ID=C_INVOICELINE.C_Invoice_ID
gorkaion@7647
  1006
                AND C_INVOICE.Processed='Y'
gorkaion@7647
  1007
                AND C_INVOICELINE.M_InOutLine_ID=Cur_ReactivateInvoiceLine.M_InOutLine_ID;
gorkaion@7647
  1008
              v_REtotalQtyInvoiced:=v_REtotalQtyInvoiced - Cur_ReactivateInvoiceLine.QtyInvoiced;
gorkaion@7647
  1009
              SELECT MovementQty INTO v_REdeliveredQty
gorkaion@7647
  1010
              FROM M_INOUTLINE
gorkaion@7647
  1011
              WHERE M_InOutLine_ID=Cur_ReactivateInvoiceLine.M_InOutLine_ID;
gorkaion@7647
  1012
              UPDATE M_INOUTLINE
gorkaion@7647
  1013
              SET IsInvoiced=(
gorkaion@7647
  1014
                     CASE v_REtotalQtyInvoiced
gorkaion@7647
  1015
                        WHEN 0 THEN 'N'
gorkaion@7647
  1016
                        ELSE 'Y'
gorkaion@7647
  1017
                     END)
gorkaion@7647
  1018
              WHERE M_InOutLine_ID=Cur_ReactivateInvoiceLine.M_InOutLine_ID;
carlos@0
  1019
            END IF;
carlos@0
  1020
          END IF;
gorkaion@7647
  1021
        END LOOP;
gorkaion@7647
  1022
      ELSE
gorkaion@7647
  1023
        -- When re-activating an invoice, match invoice lines are removed (if not posted)
gorkaion@7647
  1024
        SELECT COUNT(1) INTO v_count
gorkaion@7647
  1025
        FROM FACT_ACCT
gorkaion@7647
  1026
        WHERE AD_TABLE_ID = (SELECT AD_TABLE_ID 
gorkaion@7647
  1027
                             FROM AD_TABLE
gorkaion@7647
  1028
                             WHERE UPPER(TABLENAME) LIKE 'M_MATCHPO')
gorkaion@7647
  1029
                                AND RECORD_ID IN (SELECT M_MATCHPO_ID
gorkaion@7647
  1030
                                                  FROM M_MATCHPO MP, C_INVOICE I, C_INVOICELINE IL
gorkaion@7647
  1031
                                                  WHERE I.C_INVOICE_ID=IL.C_INVOICE_ID
gorkaion@7647
  1032
                                                    AND MP.C_INVOICELINE_ID=IL.C_INVOICELINE_ID
gorkaion@7647
  1033
                                                    AND I.C_INVOICE_ID=v_Record_ID);
gorkaion@7647
  1034
        IF (v_count>0) THEN
gorkaion@7647
  1035
          RAISE_APPLICATION_ERROR(-20000, '@PostedMatchPO@');
carlos@0
  1036
        END IF;
gorkaion@7647
  1037
        DELETE FROM M_MATCHPO
gorkaion@7647
  1038
        WHERE C_InvoiceLine_ID IN (SELECT C_InvoiceLine_ID FROM C_INVOICELINE WHERE C_Invoice_ID=v_Record_ID);
gorkaion@7647
  1039
      END IF;
gorkaion@7647
  1040
      UPDATE C_INVOICE
gorkaion@7647
  1041
      SET Processed='N',
gorkaion@7647
  1042
          DocStatus='DR',
gorkaion@7647
  1043
          DocAction='CO',Updated=now(),
gorkaion@7647
  1044
          UpdatedBy=v_UpdatedBy
gorkaion@7647
  1045
      WHERE C_Invoice_Id=v_Record_ID;
gorkaion@7647
  1046
      --Delete automatically created records ...
gorkaion@7647
  1047
      DELETE FROM C_CASHLINE
gorkaion@7647
  1048
      WHERE ISGENERATED='Y'
gorkaion@7647
  1049
        AND C_DEBT_PAYMENT_ID IN
gorkaion@7647
  1050
          (SELECT C_DEBT_PAYMENT_ID
gorkaion@7647
  1051
           FROM C_DEBT_PAYMENT
gorkaion@7647
  1052
           WHERE C_INVOICE_ID=v_Record_ID)
gorkaion@7647
  1053
             AND C_CASH_ID IN (SELECT C_CASH_ID FROM C_CASH WHERE PROCESSED='N');
gorkaion@7647
  1054
      -- Updates the debt-payments of the cash, to make them not to point to the invoice
gorkaion@7647
  1055
      UPDATE C_DEBT_PAYMENT
gorkaion@7647
  1056
      SET C_INVOICE_ID=NULL
gorkaion@7647
  1057
      WHERE C_Invoice_ID=v_Record_ID
gorkaion@7647
  1058
        AND C_Order_ID IS NOT NULL;
gorkaion@7647
  1059
      DELETE FROM C_DEBT_PAYMENT
gorkaion@7647
  1060
      WHERE C_Invoice_ID=v_Record_ID
gorkaion@7647
  1061
        AND COALESCE(IsAutomaticGenerated, 'Y')='Y'
gorkaion@7647
  1062
        AND C_ORDER_ID IS NULL;
gorkaion@7647
  1063
      UPDATE C_DEBT_PAYMENT
gorkaion@7647
  1064
      SET IsValid='N',Updated=now(),
gorkaion@7647
  1065
          UpdatedBy=v_UpdatedBy
gorkaion@7647
  1066
      WHERE C_Invoice_ID=v_Record_ID
gorkaion@7647
  1067
        AND COALESCE(IsAutomaticGenerated, 'Y')='N'
gorkaion@7647
  1068
        AND C_ORDER_ID IS NULL;
gorkaion@7647
  1069
      IF (v_IsSOTrx='Y') THEN
gorkaion@7647
  1070
        C_BP_SOCREDITUSED_REFRESH(v_BPartner_ID) ;
gorkaion@7647
  1071
      END IF;
gorkaion@7647
  1072
      DELETE FROM C_INVOICELINE
gorkaion@7647
  1073
      WHERE C_INVOICE_DISCOUNT_ID IS NOT NULL
gorkaion@7647
  1074
        AND C_INVOICE_ID=v_Record_ID;
gorkaion@7647
  1075
      END_PROCESSING:=TRUE;
gorkaion@7647
  1076
    END IF;
gorkaion@7647
  1077
  END IF;--END_PROCESSING
david@20274
  1078
  -- Issue 20553. Problem with the order of the execution of the triggers.
david@20274
  1079
  -- By updating the Invoice Line again, we can assure that the Invoice Line Tax
david@20274
  1080
  -- Trigger had been executed before.
david@20274
  1081
  UPDATE C_INVOICELINE
david@20274
  1082
  SET UPDATED = now()
david@20274
  1083
  WHERE C_INVOICE_ID = v_Record_ID;
gorkaion@7647
  1084
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
  1085
    /**************************************************************************
gorkaion@7647
  1086
     * Actions allowed: COmplete, APprove
gorkaion@7647
  1087
     */
gorkaion@7647
  1088
    IF (v_DocAction='AP' OR v_DocAction='CO') THEN
gorkaion@7647
  1089
      -- Check the header belongs to a organization where transactions are posible and ready to use
gorkaion@7647
  1090
      SELECT AD_Org.IsReady, Ad_OrgType.IsTransactionsAllowed
gorkaion@7647
  1091
        INTO v_is_ready, v_is_tr_allow
gorkaion@7647
  1092
      FROM C_INVOICE, AD_Org, AD_OrgType
gorkaion@7647
  1093
      WHERE AD_Org.AD_Org_ID=C_INVOICE.AD_Org_ID
gorkaion@7647
  1094
        AND AD_Org.AD_OrgType_ID=AD_OrgType.AD_OrgType_ID
gorkaion@7647
  1095
        AND C_INVOICE.C_INVOICE_ID=v_Record_ID;
gorkaion@7647
  1096
      IF (v_is_ready='N') THEN
gorkaion@7647
  1097
        RAISE_APPLICATION_ERROR(-20000, '@OrgHeaderNotReady@');
gorkaion@7647
  1098
      END IF;
gorkaion@7647
  1099
      IF (v_is_tr_allow='N') THEN
gorkaion@7647
  1100
        RAISE_APPLICATION_ERROR(-20000, '@OrgHeaderNotTransAllowed@');
gorkaion@7647
  1101
      END IF;
gorkaion@7647
  1102
gorkaion@7647
  1103
      SELECT AD_ORG_CHK_DOCUMENTS('C_INVOICE', 'C_INVOICELINE', v_Record_ID, 'C_INVOICE_ID', 'C_INVOICE_ID') INTO v_is_included FROM dual;
gorkaion@7647
  1104
      IF (v_is_included=-1) THEN
gorkaion@7647
  1105
        RAISE_APPLICATION_ERROR(-20000, '@LinesAndHeaderDifferentLEorBU@');
gorkaion@7647
  1106
      END IF;
gorkaion@7647
  1107
gorkaion@7647
  1108
      -- Check the period control is opened (only if it is legal entity with accounting)
gorkaion@7647
  1109
      -- Gets the BU or LE of the document
gorkaion@7647
  1110
      SELECT AD_GET_DOC_LE_BU('C_INVOICE', v_Record_ID, 'C_INVOICE_ID', 'LE') INTO v_org_bule_id FROM DUAL;
gorkaion@7647
  1111
      SELECT AD_OrgType.IsAcctLegalEntity INTO v_isacctle
gorkaion@7647
  1112
      FROM AD_OrgType, AD_Org
gorkaion@7647
  1113
      WHERE AD_Org.AD_OrgType_ID = AD_OrgType.AD_OrgType_ID
gorkaion@7647
  1114
        AND AD_Org.AD_Org_ID=v_org_bule_id;
gorkaion@7647
  1115
gorkaion@7647
  1116
      IF (v_isacctle='Y') THEN
gorkaion@7647
  1117
        SELECT C_CHK_OPEN_PERIOD(v_Org_ID, v_DateAcct, NULL, v_DocTypeTarget_ID) INTO v_available_period FROM DUAL;
gorkaion@7647
  1118
        IF (v_available_period<>1) THEN
gorkaion@7647
  1119
          RAISE_APPLICATION_ERROR(-20000, '@PeriodNotAvailable@');
gorkaion@7647
  1120
        END IF;
gorkaion@7647
  1121
      END IF;
gorkaion@7647
  1122
gorkaion@7647
  1123
      SELECT COUNT(*) INTO v_count
gorkaion@7647
  1124
      FROM C_INVOICE c, C_BPARTNER bp
gorkaion@7647
  1125
      WHERE c.C_BPARTNER_ID=bp.C_BPARTNER_ID
gorkaion@7647
  1126
        AND Ad_Isorgincluded(c.AD_ORG_ID, bp.AD_ORG_ID, bp.AD_CLIENT_ID)=-1
gorkaion@7647
  1127
        AND c.C_Invoice_ID=v_Record_ID;
gorkaion@7647
  1128
      IF (v_count>0) THEN
gorkaion@7647
  1129
        RAISE_APPLICATION_ERROR(-20000, '@NotCorrectOrgBpartnerInvoice@') ;
gorkaion@7647
  1130
      END IF;
gorkaion@7647
  1131
      WHILE(v_DocType_ID<>v_DocTypeTarget_ID)
gorkaion@7647
  1132
      LOOP
carlos@0
  1133
        BEGIN
gorkaion@7647
  1134
          v_ResultStr:='UpdateDocType';
gorkaion@7647
  1135
          UPDATE C_INVOICE
gorkaion@7647
  1136
          SET C_DocType_ID=C_DocTypeTarget_ID,
gorkaion@7647
  1137
              Updated=now(),
gorkaion@7647
  1138
              UpdatedBy=v_UpdatedBy
gorkaion@7647
  1139
          WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
  1140
          v_DocType_ID:=v_DocTypeTarget_ID;
gorkaion@7647
  1141
        EXCEPTION
gorkaion@7647
  1142
          WHEN OTHERS THEN
gorkaion@7647
  1143
            v_ResultStr:='UpdateDocumentNo';
gorkaion@7647
  1144
            UPDATE C_INVOICE
gorkaion@7647
  1145
              SET DocumentNo=DocumentNo || '.'
gorkaion@7647
  1146
            WHERE C_Invoice_ID=v_Record_ID;
carlos@0
  1147
        END;
gorkaion@7647
  1148
      END LOOP;
gorkaion@7647
  1149
    ELSE
gorkaion@7647
  1150
      v_Message:='@ActionNotAllowedHere@ (I-' || v_DocAction || ')';
carlos@0
  1151
      RAISE_APPLICATION_ERROR(-20000, v_Message) ;
gorkaion@7647
  1152
      END_PROCESSING:=TRUE;
gorkaion@7647
  1153
    END IF;
gorkaion@7647
  1154
  END IF;--FINISH_PROCESS
gorkaion@7647
  1155
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
  1156
    /**************************************************************************
gorkaion@7647
  1157
     * Resolve not-stocked BOMs
gorkaion@7647
  1158
     *************************************************************************/
naiara@19828
  1159
   DECLARE
gorkaion@7647
  1160
      -- Invoice Lines with non-stocked BOMs
gorkaion@7647
  1161
      CUR_BOM_Line RECORD;
gorkaion@7647
  1162
      --
gorkaion@7647
  1163
    BEGIN
gorkaion@7647
  1164
      v_ResultStr:='ResolveBOM';
naiara@19828
  1165
      FOR CUR_BOM_Line IN
naiara@19828
  1166
        (SELECT *
naiara@19828
  1167
         FROM C_INVOICELINE l
naiara@19828
  1168
         WHERE l.C_Invoice_ID=v_Record_ID
naiara@19828
  1169
           AND l.IsActive='Y'
naiara@19828
  1170
           AND l.explode='N'
naiara@19828
  1171
           AND EXISTS
gorkaion@7647
  1172
              (SELECT *
gorkaion@7647
  1173
               FROM M_PRODUCT p
gorkaion@7647
  1174
               WHERE l.M_Product_ID=p.M_Product_ID
gorkaion@7647
  1175
                 AND p.IsBOM='Y'
gorkaion@7647
  1176
                 AND p.IsStocked='N'
gorkaion@7647
  1177
                 AND p.productType='I'
naiara@19828
  1178
               )
naiara@19828
  1179
         ORDER BY l.Line  FOR UPDATE
naiara@19828
  1180
        )
naiara@19828
  1181
      LOOP
naiara@19828
  1182
        M_INVEXPLODEBOMNOTSTOCK(null, CUR_BOM_Line.c_invoiceline_ID);
gorkaion@7647
  1183
      END LOOP; -- BOM Loop
gorkaion@7647
  1184
    END;
gorkaion@7647
  1185
  END IF;--FINISH_PROCESS
gorkaion@7647
  1186
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
asier@18341
  1187
     /**************************************************************************
asier@18341
  1188
      * Calculate promotions                                                   
asier@18341
  1189
      *************************************************************************/
asier@18341
  1190
      IF (v_DocAction = 'CO') THEN
asier@18343
  1191
         M_PROMOTION_CALCULATE('I', v_Record_ID, v_UpdatedBy);
asier@18341
  1192
      END IF;
asier@18341
  1193
gorkaion@7647
  1194
    /**************************************************************************
gorkaion@7647
  1195
     * Calculate Discounts
gorkaion@7647
  1196
     *************************************************************************/
gorkaion@7647
  1197
    v_CumDiscount:=0;
gorkaion@7647
  1198
    v_OldCumDiscount:=0;
gorkaion@7647
  1199
    v_Line:=10;
ainhoa@11807
  1200
    SELECT MAX(LINE) INTO v_InvoiceLineSeqNo
gorkaion@7647
  1201
    FROM C_INVOICELINE
gorkaion@7647
  1202
    WHERE C_INVOICE_ID=v_Record_ID;
mikel@17452
  1203
    SELECT PricePrecision INTO v_precision
mikel@17452
  1204
    FROM C_INVOICE i, C_CURRENCY c
mikel@17452
  1205
    WHERE i.C_INVOICE_ID = v_Record_ID AND i.C_CURRENCY_ID = c.C_CURRENCY_ID;
gorkaion@7647
  1206
    FOR Cur_CInvoiceDiscount IN
gorkaion@7647
  1207
      (SELECT C_INVOICE_DISCOUNT.C_INVOICE_DISCOUNT_ID, C_DISCOUNT.DISCOUNT, C_DISCOUNT.M_PRODUCT_ID, C_DISCOUNT.NAME,
eduardo@18445
  1208
           C_INVOICE_DISCOUNT.CASCADE, C_DISCOUNT.C_DISCOUNT_ID, M_PRODUCT.C_UOM_ID,
eduardo@18445
  1209
           REVPLANTYPE, ISDEFERREDREVENUE, PERIODNUMBER, DEFAULTPERIOD,
eduardo@18445
  1210
					EXPPLANTYPE, ISDEFERREDEXPENSE, PERIODNUMBER_EXP, DEFAULTPERIOD_EXP
gorkaion@7647
  1211
       FROM C_INVOICE_DISCOUNT, C_DISCOUNT, M_PRODUCT
gorkaion@7647
  1212
       WHERE C_INVOICE_DISCOUNT.C_DISCOUNT_ID=C_DISCOUNT.C_DISCOUNT_ID
gorkaion@7647
  1213
         AND C_DISCOUNT.M_PRODUCT_ID=M_PRODUCT.M_PRODUCT_ID
gorkaion@7647
  1214
         AND C_INVOICE_DISCOUNT.C_INVOICE_ID=v_Record_ID
gorkaion@7647
  1215
         AND C_INVOICE_DISCOUNT.ISACTIVE='Y'
gorkaion@7647
  1216
       ORDER BY C_INVOICE_DISCOUNT.LINE
gorkaion@7647
  1217
      )
gorkaion@7647
  1218
    LOOP
gorkaion@7647
  1219
      v_CumDiscount:=(1-v_OldCumDiscount) * Cur_CInvoiceDiscount.Discount/100;
gorkaion@7647
  1220
      v_OldCumDiscount:=v_OldCumDiscount + v_CumDiscount;
gorkaion@7647
  1221
      FOR Cur_TaxDiscount IN
mikel@17452
  1222
        (SELECT C_INVOICELINE.C_TAX_ID, SUM(C_INVOICELINE.LINENETAMT) AS LINENETAMT,
mikel@17452
  1223
                SUM(C_INVOICELINE.LINE_GROSS_AMOUNT) AS LINEGROSSAMT
gorkaion@7647
  1224
         FROM C_INVOICELINE
gorkaion@7647
  1225
         WHERE C_INVOICE_ID=v_Record_ID
gorkaion@7647
  1226
           AND C_INVOICELINE.LINENETAMT<>0
gorkaion@7647
  1227
           AND C_INVOICE_DISCOUNT_ID IS NULL
gorkaion@7647
  1228
         GROUP BY C_TAX_ID
gorkaion@7647
  1229
        )
gorkaion@7647
  1230
      LOOP
mikel@17452
  1231
        IF (v_istaxincluded = 'Y') THEN
mikel@17452
  1232
          IF (Cur_CInvoiceDiscount.CASCADE='Y') THEN
mikel@17452
  1233
            v_line_gross_amount:=(-1) * Cur_TaxDiscount.LINEGROSSAMT * v_CumDiscount;
mikel@17452
  1234
          ELSE
mikel@17452
  1235
            v_line_gross_amount:=(-1) * Cur_TaxDiscount.LINEGROSSAMT * Cur_CInvoiceDiscount.Discount/100;
mikel@17452
  1236
          END IF;
mikel@17452
  1237
          v_Discount:= C_GET_NET_PRICE_FROM_GROSS(Cur_TaxDiscount.C_TAX_ID, v_line_gross_amount, 0, v_precision, 1);
mikel@17452
  1238
          v_gross_unit_price:= v_line_gross_amount;
gorkaion@7647
  1239
        ELSE
mikel@17452
  1240
          IF (Cur_CInvoiceDiscount.CASCADE='Y') THEN
mikel@17452
  1241
            v_Discount:=(-1) * Cur_TaxDiscount.LINENETAMT * v_CumDiscount;
mikel@17452
  1242
          ELSE
mikel@17452
  1243
            v_Discount:=(-1) * Cur_TaxDiscount.LINENETAMT * Cur_CInvoiceDiscount.Discount/100;
mikel@17452
  1244
          END IF;
mikel@17452
  1245
          v_gross_unit_price:= 0;
mikel@17452
  1246
          v_line_gross_amount:= 0;
gorkaion@7647
  1247
        END IF;
eduardo@18445
  1248
        IF(Cur_CInvoiceDiscount.M_PRODUCT_ID IS NOT NULL) THEN
eduardo@18445
  1249
					IF(v_IsSOTrx = 'Y') THEN
eduardo@18445
  1250
						v_period_inv:= c_get_default_period(v_Record_ID, Cur_CInvoiceDiscount.defaultperiod);
eduardo@18445
  1251
						IF(v_period_inv IS NOT NULL AND Cur_CInvoiceDiscount.isdeferredrevenue = 'Y') THEN
eduardo@18445
  1252
							v_isdeferred_inv := Cur_CInvoiceDiscount.isdeferredrevenue;
eduardo@18445
  1253
							v_defplantype_inv := Cur_CInvoiceDiscount.revplantype;
eduardo@18445
  1254
							v_periodnumber_inv := Cur_CInvoiceDiscount.periodnumber;
eduardo@18445
  1255
					  ELSE
eduardo@18445
  1256
					  	v_period_inv := NULL;
eduardo@18445
  1257
							v_isdeferred_inv := 'N';
eduardo@18445
  1258
							v_defplantype_inv := NULL;
eduardo@18445
  1259
							v_periodnumber_inv := NULL;
eduardo@18445
  1260
						END IF;
eduardo@18445
  1261
					ELSE
eduardo@18445
  1262
						v_period_inv:= c_get_default_period(v_Record_ID, Cur_CInvoiceDiscount.defaultperiod_exp);
eduardo@18445
  1263
						IF(v_period_inv IS NOT NULL AND Cur_CInvoiceDiscount.isdeferredexpense = 'Y') THEN
eduardo@18445
  1264
							v_isdeferred_inv := Cur_CInvoiceDiscount.isdeferredexpense;
eduardo@18445
  1265
							v_defplantype_inv := Cur_CInvoiceDiscount.expplantype;
eduardo@18445
  1266
							v_periodnumber_inv := Cur_CInvoiceDiscount.periodnumber_exp;
eduardo@18445
  1267
					  ELSE
eduardo@18445
  1268
					  	v_period_inv := NULL;
eduardo@18445
  1269
							v_isdeferred_inv := 'N';
eduardo@18445
  1270
							v_defplantype_inv := NULL;
eduardo@18445
  1271
							v_periodnumber_inv := NULL;
eduardo@18445
  1272
						END IF;
eduardo@18445
  1273
					END IF;
eduardo@18445
  1274
        END IF;        
gorkaion@7647
  1275
        v_InvoiceLineSeqNo:=10 + v_InvoiceLineSeqNo;
gorkaion@7647
  1276
        v_InvoiceLine:=get_uuid();
gorkaion@7647
  1277
        INSERT INTO C_INVOICELINE
gorkaion@7647
  1278
          (
gorkaion@7647
  1279
           C_INVOICELINE_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
gorkaion@7647
  1280
           CREATED, CREATEDBY, UPDATED, UPDATEDBY,
gorkaion@7647
  1281
           C_INVOICE_ID, C_ORDERLINE_ID, M_INOUTLINE_ID, LINE,
gorkaion@7647
  1282
           DESCRIPTION, M_PRODUCT_ID, QTYINVOICED, PRICELIST,
gorkaion@7647
  1283
           PRICEACTUAL, PRICELIMIT, LINENETAMT, C_CHARGE_ID,
gorkaion@7647
  1284
           CHARGEAMT, C_UOM_ID, C_TAX_ID, S_RESOURCEASSIGNMENT_ID,
gorkaion@7647
  1285
           TAXAMT, M_ATTRIBUTESETINSTANCE_ID, ISDESCRIPTION,
mikel@17452
  1286
           QUANTITYORDER, M_PRODUCT_UOM_ID, PRICESTD,
javier@19487
  1287
           GROSS_UNIT_PRICE, TAXBASEAMT, LINE_GROSS_AMOUNT,
david@30722
  1288
           ISDEFERRED, DEFPLANTYPE, PERIODNUMBER, C_PERIOD_ID,
david@30722
  1289
           C_AUM, AUMQTY
gorkaion@7647
  1290
          )
gorkaion@7647
  1291
          VALUES
gorkaion@7647
  1292
          (
gorkaion@7647
  1293
           v_InvoiceLine, v_Client_ID, v_Org_ID, 'Y',
gorkaion@7647
  1294
           now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7647
  1295
           v_Record_ID, NULL, NULL, v_InvoiceLineSeqNo,
gorkaion@7647
  1296
           Cur_CInvoiceDiscount.NAME, Cur_CInvoiceDiscount.M_PRODUCT_ID, 1, v_Discount,
gorkaion@7647
  1297
           v_Discount, v_Discount, v_Discount, NULL,
gorkaion@7647
  1298
           0, Cur_CInvoiceDiscount.C_UOM_ID, Cur_TaxDiscount.C_TAX_ID, NULL,
gorkaion@7647
  1299
           NULL, NULL, 'N' ,
mikel@17452
  1300
           NULL, NULL, v_Discount,
javier@19487
  1301
           ROUND(v_gross_unit_price, v_precision), v_Discount  ,ROUND(v_line_gross_amount, v_precision),
david@30722
  1302
           v_isdeferred_inv, v_defplantype_inv, v_periodnumber_inv, v_period_inv,
david@30722
  1303
           NULL, NULL
gorkaion@7647
  1304
          );
gorkaion@7647
  1305
        --v_InvoiceDiscount:=Ad_Sequence_Nextno('C_InvoiceLine');
gorkaion@7647
  1306
        UPDATE C_INVOICELINE
gorkaion@7647
  1307
        SET C_INVOICE_DISCOUNT_ID=Cur_CInvoiceDiscount.C_INVOICE_DISCOUNT_ID
gorkaion@7647
  1308
        WHERE C_INVOICELINE_ID=v_InvoiceLine;
gorkaion@7647
  1309
      END LOOP;
gorkaion@7647
  1310
      v_Line:=v_Line + 10;
gorkaion@7647
  1311
    END LOOP;
gorkaion@7647
  1312
  END IF;--FINISH_PROCESS
gorkaion@7647
  1313
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
  1314
    /**************************************************************************
adrianromero@27136
  1315
     * Calculate Invoice Withholding Tax
gorkaion@7647
  1316
     *************************************************************************/
gorkaion@7647
  1317
      -- Update Header
sivaraman@7819
  1318
      IF (v_IsSOTrx = 'N') THEN
sivaraman@7819
  1319
        SELECT c_getwithholding(v_record_id) INTO withholdamount FROM dual;
sivaraman@7819
  1320
      ELSE
sivaraman@7819
  1321
        withholdamount:=0;
sivaraman@7819
  1322
      END IF;
gorkaion@7647
  1323
      UPDATE C_INVOICE
adrianromero@27136
  1324
      SET withholdingamount = withholdamount
gorkaion@7647
  1325
      WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
  1326
  END IF;--FINISH_PROCESS
gorkaion@7647
  1327
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
  1328
    /**************************************************************************
gorkaion@7647
  1329
     * Update BP Statistics
gorkaion@7647
  1330
     *************************************************************************/
gorkaion@7647
  1331
    v_ResultStr:='Updating BPartners';
gorkaion@7647
  1332
    -- First Sale
gorkaion@7647
  1333
    UPDATE C_BPARTNER
gorkaion@7647
  1334
    SET FirstSale=v_DateAcct
gorkaion@7647
  1335
    WHERE C_BPartner_ID=v_BPartner_ID
gorkaion@7647
  1336
      AND FirstSale IS NULL;
gorkaion@7647
  1337
    -- Last Contact, Result
gorkaion@7647
  1338
    UPDATE AD_USER
gorkaion@7647
  1339
    SET LastContact=now(),
gorkaion@7647
  1340
        LastResult=v_DocumentNo
gorkaion@7647
  1341
    WHERE AD_User_ID=v_BPartner_User_ID;
gorkaion@7647
  1342
    -- Update total revenue and credit limit
gorkaion@7647
  1343
    -- It is reversed in C_Allocation_Trg
javier@14949
  1344
    --The next lines (5) have been commented due to the issue 19198
javier@14949
  1345
    --IF (v_IsSOTrx='Y') THEN
javier@14949
  1346
      --UPDATE C_BPARTNER
javier@14949
  1347
      --SET ActualLifeTimeValue=ActualLifeTimeValue +(v_Multiplier *  C_Base_Convert(v_GrandTotal, v_Currency_ID, v_Client_ID, v_DateAcct, v_Org_ID))
javier@14949
  1348
      --WHERE C_BPartner_ID=v_BPartner_ID;
javier@14949
  1349
    --END IF;
gorkaion@7647
  1350
  END IF;--FINISH_PROCESS
gorkaion@7647
  1351
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
  1352
    /**************************************************************************
gorkaion@7647
  1353
     * Matching
gorkaion@7647
  1354
     *************************************************************************/
gorkaion@7647
  1355
    v_ResultStr:='Matching';
gorkaion@7647
  1356
    IF (v_IsSOTrx='N') THEN
gorkaion@7647
  1357
      DECLARE
gorkaion@7647
  1358
        -- Invoice-Receipt Match
gorkaion@7647
  1359
        Cur_ILines_Receipt RECORD;
gorkaion@7647
  1360
        -- Invoice-PO Match
gorkaion@7647
  1361
        Cur_ILines_PO RECORD;
gorkaion@7647
  1362
        v_Qty NUMBER;
gorkaion@7647
  1363
        v_MatchInv_ID VARCHAR2(32) ;
gorkaion@7647
  1364
        v_MatchPO_ID VARCHAR2(32) ;
gorkaion@7647
  1365
      BEGIN
gorkaion@7647
  1366
        v_ResultStr:='MatchInv-Receipt';
gorkaion@7647
  1367
        FOR Cur_ILines_Receipt IN
gorkaion@7647
  1368
          (SELECT il.AD_Client_ID, il.AD_Org_ID, il.C_InvoiceLine_ID, ml.M_InOutLine_ID,
gorkaion@7647
  1369
               ml.M_Product_ID, ml.MovementQty, il.QtyInvoiced, i.DateAcct
gorkaion@7647
  1370
           FROM C_INVOICELINE il
gorkaion@7647
  1371
                INNER JOIN M_INOUTLINE ml ON (il.M_InOutLine_ID=ml.M_InOutLine_ID)
eduardo@24946
  1372
                INNER JOIN M_INOUT m ON (ml.M_InOut_ID=m.M_InOut_ID)
gorkaion@7647
  1373
                INNER JOIN C_INVOICE i ON(il.C_Invoice_ID=i.C_Invoice_ID)
gorkaion@7647
  1374
           WHERE il.M_Product_ID=ml.M_Product_ID
eduardo@24946
  1375
             AND M.Processed = 'Y'
gorkaion@7647
  1376
             AND il.C_Invoice_ID=v_Record_ID
gorkaion@7647
  1377
           )
gorkaion@7647
  1378
        LOOP
gorkaion@7647
  1379
          IF (Cur_ILines_Receipt.M_INOUTLINE_ID IS NOT NULL) THEN
gorkaion@7647
  1380
            SELECT COUNT(1) INTO v_Count
gorkaion@7647
  1381
            FROM M_MATCHINV
gorkaion@7647
  1382
            WHERE C_INVOICELINE_ID=Cur_ILines_Receipt.C_InvoiceLine_ID
gorkaion@7647
  1383
              AND M_INOUTLINE_ID=Cur_ILines_Receipt.M_INOUTLINE_ID;
gorkaion@7647
  1384
            IF (v_Count=0) THEN
gorkaion@7647
  1385
              v_Qty:=Cur_ILines_Receipt.QtyInvoiced;
gorkaion@7647
  1386
              v_MatchInv_ID := get_uuid();
gorkaion@7647
  1387
              v_ResultStr:='InsertMatchInv ' || v_MatchInv_ID;
gorkaion@7647
  1388
              DBMS_OUTPUT.PUT_LINE('  M_MatchInv_ID=' || v_MatchInv_ID || ' - ' || v_Qty) ;
gorkaion@7647
  1389
              INSERT INTO M_MATCHINV
carlos@0
  1390
                (
gorkaion@7647
  1391
                 M_MatchInv_ID, AD_Client_ID, AD_Org_ID, IsActive,
gorkaion@7647
  1392
                 Created, CreatedBy, Updated, UpdatedBy,
gorkaion@7647
  1393
                 M_InOutLine_ID, C_InvoiceLine_ID, M_Product_ID, DateTrx,
gorkaion@7647
  1394
                 Qty, Processing, Processed, Posted
carlos@0
  1395
                )
carlos@0
  1396
                VALUES
carlos@0
  1397
                (
gorkaion@7647
  1398
                 v_MatchInv_ID, Cur_ILines_Receipt.AD_Client_ID, Cur_ILines_Receipt.AD_Org_ID, 'Y',
gorkaion@7647
  1399
                 now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7647
  1400
                 Cur_ILines_Receipt.M_InOutLine_ID, Cur_ILines_Receipt.C_InvoiceLine_ID, Cur_ILines_Receipt.M_Product_ID, Cur_ILines_Receipt.DateAcct,
gorkaion@7647
  1401
                 v_Qty, 'N', 'Y', 'N'
gorkaion@7647
  1402
                );
gorkaion@7647
  1403
            END IF;
gorkaion@7647
  1404
          END IF;
gorkaion@7647
  1405
        END LOOP;
miguel@24752
  1406
miguel@24752
  1407
        UPDATE m_transaction
miguel@24752
  1408
        SET checkpricedifference = 'Y'
miguel@24752
  1409
        WHERE m_transaction_id in (
miguel@24851
  1410
        SELECT TRX.M_TRANSACTION_ID 
miguel@24851
  1411
        FROM C_INVOICELINE IL 
miguel@24851
  1412
          JOIN M_MATCHINV MI ON IL.C_INVOICELINE_ID = MI.C_INVOICELINE_ID
miguel@24851
  1413
          JOIN M_TRANSACTION TRX ON MI.M_INOUTLINE_ID = TRX.M_INOUTLINE_ID
alvaro@26700
  1414
        WHERE IL.C_INVOICE_ID = v_record_id);
miguel@24752
  1415
gorkaion@7647
  1416
        v_ResultStr:='MatchInv-PO';
gorkaion@7647
  1417
        FOR Cur_ILines_PO IN
gorkaion@7647
  1418
          (SELECT il.AD_Client_ID, il.AD_Org_ID, il.C_InvoiceLine_ID, ol.C_OrderLine_ID,
gorkaion@7647
  1419
               ol.M_Product_ID, ol.C_Charge_ID, ol.QtyOrdered, il.QtyInvoiced,
gorkaion@7647
  1420
                i.DateAcct
gorkaion@7647
  1421
           FROM C_INVOICELINE il
gorkaion@7647
  1422
                INNER JOIN C_ORDERLINE ol ON (il.C_OrderLine_ID=ol.C_OrderLine_ID)
gorkaion@7647
  1423
                INNER JOIN C_INVOICE i ON (il.C_Invoice_ID=i.C_Invoice_ID)
gorkaion@7647
  1424
           WHERE (il.M_Product_ID=ol.M_Product_ID
gorkaion@7647
  1425
                  OR il.C_Charge_ID=ol.C_Charge_ID)
gorkaion@7647
  1426
             AND il.C_Invoice_ID=v_Record_ID
gorkaion@7647
  1427
          )
gorkaion@7647
  1428
        LOOP
gorkaion@7647
  1429
          -- The min qty. Modified by Ismael Ciordia
gorkaion@7647
  1430
          --v_Qty := Cur_ILines_PO.QtyOrdered;
gorkaion@7647
  1431
          --IF (ABS(Cur_ILines_PO.QtyOrdered) > ABS(Cur_ILines_PO.QtyInvoiced)) THEN
gorkaion@7647
  1432
          v_Qty:=Cur_ILines_PO.QtyInvoiced;
gorkaion@7647
  1433
          --END IF;
gorkaion@7647
  1434
          v_MatchPO_ID := get_uuid();
gorkaion@7647
  1435
          v_ResultStr:='InsertMatchPO ' || v_MatchPO_ID;
gorkaion@7647
  1436
          DBMS_OUTPUT.PUT_LINE('  M_MatchPO_ID=' || v_MatchPO_ID || ' - ' || v_Qty) ;
gorkaion@7647
  1437
          INSERT INTO M_MATCHPO
gorkaion@7647
  1438
            (
gorkaion@7647
  1439
             M_MatchPO_ID, AD_Client_ID, AD_Org_ID, IsActive,
gorkaion@7647
  1440
             Created, CreatedBy, Updated, UpdatedBy,
gorkaion@7647
  1441
             C_OrderLine_ID, M_InOutLine_ID, C_InvoiceLine_ID, M_Product_ID,
gorkaion@7647
  1442
             DateTrx, Qty, Processing, Processed,
gorkaion@7647
  1443
             Posted
gorkaion@7647
  1444
            )
gorkaion@7647
  1445
            VALUES
gorkaion@7647
  1446
            (
gorkaion@7647
  1447
             v_MatchPO_ID, Cur_ILines_PO.AD_Client_ID, Cur_ILines_PO.AD_Org_ID, 'Y',
gorkaion@7647
  1448
             now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7647
  1449
             Cur_ILines_PO.C_OrderLine_ID, NULL, Cur_ILines_PO.C_InvoiceLine_ID, Cur_ILines_PO.M_Product_ID,
gorkaion@7647
  1450
             Cur_ILines_PO.DateAcct, v_Qty, 'N', 'Y',
gorkaion@7647
  1451
             'N'
gorkaion@7647
  1452
            );
gorkaion@7647
  1453
        END LOOP;
gorkaion@7647
  1454
      END;
gorkaion@7647
  1455
    ELSE -- Actualiza las cantidades facturadas de los pedidos de venta, y las lineas de albaryn facturadas
gorkaion@7647
  1456
      DECLARE
gorkaion@7647
  1457
        CurLines RECORD;
gorkaion@7647
  1458
        p_DateInvoiced DATE;
gorkaion@7647
  1459
        v_totalQtyInvoiced NUMBER;
gorkaion@7647
  1460
        v_ODocumentNo C_ORDER.DocumentNo%TYPE;
gorkaion@7647
  1461
        v_NewPendingToInvoice NUMBER;
gorkaion@7647
  1462
        v_deliveredQty NUMBER;
gorkaion@7647
  1463
        v_inOutStatus varchar2(60) ;
gorkaion@7647
  1464
      BEGIN
gorkaion@7647
  1465
        SELECT DateInvoiced
gorkaion@7647
  1466
        INTO p_DateInvoiced
gorkaion@7647
  1467
        FROM C_INVOICE
gorkaion@7647
  1468
        WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
  1469
        FOR CurLines IN
gorkaion@7647
  1470
          (SELECT * FROM C_INVOICELINE  WHERE C_INVOICE_ID=v_Record_ID  ORDER BY line)
gorkaion@7647
  1471
        LOOP
gorkaion@7647
  1472
          IF (CurLines.C_OrderLine_ID IS NOT NULL) THEN
gorkaion@7647
  1473
            --Check that qty pending to invoice is higher or equal to the qty being invoiced
sandra@25877
  1474
            SELECT o.documentno, ABS(ol.qtyordered) - ABS(ol.qtyinvoiced + CurLines.QtyInvoiced), p.isquantityvariable
sandra@25877
  1475
              INTO v_ODocumentNo, v_NewPendingToInvoice, v_Isquantityvariable
gorkaion@7647
  1476
            FROM c_order o, c_orderline ol
rafael@16135
  1477
            LEFT JOIN m_product p ON p.m_product_id = ol.m_product_id
gorkaion@7647
  1478
            WHERE o.c_order_id = ol.c_order_id
gorkaion@7647
  1479
              AND ol.c_orderline_id = CurLines.c_orderline_id;
rafael@16135
  1480
            IF (v_Isquantityvariable <> 'Y' AND v_NewPendingToInvoice <0) THEN
gorkaion@7647
  1481
              v_Message := '@NotPossibleCompleteInvoice@' || ' ' || v_DocumentNo;
gorkaion@7647
  1482
              v_Message := v_Message || ' ' || '@line@' || ' ' || CurLines.line || '. ';
gorkaion@7647
  1483
              v_Message := v_Message || '@OrderDocumentno@' || ' ' || v_ODocumentNo;
gorkaion@7647
  1484
              v_Message := v_Message || ': ' || '@QtyInvoicedHigherOrdered@' || '.';
gorkaion@7647
  1485
              RAISE_APPLICATION_ERROR(-20000, v_Message);
gorkaion@7647
  1486
            END IF;
gorkaion@7647
  1487
            UPDATE C_ORDERLINE
gorkaion@7647
  1488
            SET QtyInvoiced=QtyInvoiced + CurLines.QtyInvoiced,
gorkaion@7647
  1489
                DateInvoiced=p_DateInvoiced,
gorkaion@7647
  1490
                Updated=now(),
gorkaion@7647
  1491
                UpdatedBy=v_UpdatedBy
gorkaion@7647
  1492
            WHERE C_OrderLine_ID=CurLines.C_OrderLine_ID;
gorkaion@7647
  1493
          END IF;
gorkaion@7647
  1494
          IF (CurLines.M_InOutLine_ID IS NOT NULL) THEN
gorkaion@7647
  1495
            SELECT m.DOCSTATUS INTO v_inOutStatus
gorkaion@7647
  1496
            FROM M_INOUT m, M_INOUTLINE ml
gorkaion@7647
  1497
            WHERE M.M_InOut_ID=ml.M_InOut_ID
gorkaion@7647
  1498
              AND ml.M_InOutLine_ID=CurLines.M_InOutLine_ID;
gorkaion@7647
  1499
            IF (v_inOutStatus<>'RE') THEN
gorkaion@7647
  1500
              SELECT COALESCE(SUM(C_INVOICELINE.QTYINVOICED), 0) INTO v_totalQtyInvoiced
gorkaion@7647
  1501
              FROM C_INVOICELINE, C_INVOICE
gorkaion@7647
  1502
              WHERE C_INVOICE.C_Invoice_ID=C_INVOICELINE.C_Invoice_ID
gorkaion@7647
  1503
                AND C_INVOICE.Processed='Y'
gorkaion@7647
  1504
                AND C_INVOICELINE.M_InOutLine_ID=CurLines.M_InOutLine_ID;
gorkaion@7647
  1505
              v_totalQtyInvoiced:=v_totalQtyInvoiced + CurLines.QtyInvoiced;
gorkaion@7647
  1506
              SELECT MovementQty INTO v_deliveredQty
gorkaion@7647
  1507
              FROM M_INOUTLINE
gorkaion@7647
  1508
              WHERE M_InOutLine_ID=CurLines.M_InOutLine_ID;
gorkaion@7647
  1509
              UPDATE M_INOUTLINE
gorkaion@7647
  1510
              SET IsInvoiced=(
carlos@0
  1511
                    CASE v_totalQtyInvoiced
gorkaion@7647
  1512
                      WHEN 0 THEN 'N'
carlos@0
  1513
                      ELSE 'Y'
gorkaion@7647
  1514
                    END)
gorkaion@7647
  1515
              WHERE M_InOutLine_ID=CurLines.M_InOutLine_ID;
gorkaion@7647
  1516
            END IF;
antonio@737
  1517
          END IF;
gorkaion@7647
  1518
        END LOOP;
gorkaion@4437
  1519
      END;
gorkaion@4437
  1520
    END IF;
gorkaion@7647
  1521
  END IF;--FINISH_PROCESS
gorkaion@7647
  1522
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
  1523
    -- Modified by Ismael Ciordia
gorkaion@7647
  1524
    -- Generate C_Debt_Payment linked to this invoice
gorkaion@7647
  1525
    DECLARE
gorkaion@7647
  1526
      v_totalCash NUMBER:=0;
gorkaion@7647
  1527
      v_debtPaymentID varchar2(32) ;
gorkaion@7647
  1528
      v_amount NUMBER;
gorkaion@7647
  1529
      v_cashBook VARCHAR2(32) ;
gorkaion@7647
  1530
      v_bankAccount VARCHAR2(32) ;
gorkaion@7647
  1531
      v_cash VARCHAR2(32) ;
gorkaion@7647
  1532
      v_IsoCode C_CURRENCY.ISO_CODE%TYPE;
gorkaion@7647
  1533
      v_CashLine VARCHAR2(32) ;
gorkaion@7647
  1534
      v_line NUMBER ;
gorkaion@7647
  1535
      v_BPartnerName C_BPARTNER.NAME%TYPE;
gorkaion@7647
  1536
      v_GenDP_Org VARCHAR2(32);
gorkaion@7648
  1537
      v_dummy VARCHAR2(2000);
gorkaion@7647
  1538
    BEGIN
gorkaion@7648
  1539
      SELECT COUNT(1) INTO v_count
gorkaion@7648
  1540
      FROM ad_preference
gorkaion@7648
  1541
      WHERE property = 'FinancialManagement'
gorkaion@7648
  1542
        AND ad_module_id <> '0';
gorkaion@7648
  1543
      IF (v_count > 1) THEN
gorkaion@7648
  1544
        v_dummy := AD_GET_PREFERENCE_VALUE('FinancialManagement', 'Y', v_client_id, v_org_id, NULL, NULL, NULL);
gorkaion@7648
  1545
      ELSIF (v_count = 0) THEN
gorkaion@7648
  1546
        v_ResultStr:='Generating C_Debt_Payment';
gorkaion@7648
  1547
        UPDATE C_DEBT_PAYMENT
gorkaion@7648
  1548
          SET C_INVOICE_ID=v_Record_ID
gorkaion@7648
  1549
        WHERE EXISTS
gorkaion@7648
  1550
              (SELECT 1
gorkaion@7648
  1551
               FROM C_ORDERLINE ol, C_INVOICELINE il
gorkaion@7648
  1552
               WHERE ol.C_ORDERLINE_ID=il.C_ORDERLINE_ID
gorkaion@7648
  1553
                 AND il.C_INVOICE_ID=v_Record_ID
gorkaion@7648
  1554
                 AND ol.C_ORDER_ID=C_DEBT_PAYMENT.C_ORDER_ID
gorkaion@7648
  1555
              )
gorkaion@7648
  1556
          AND C_INVOICE_ID IS NULL;
gorkaion@7648
  1557
        UPDATE C_DEBT_PAYMENT
gorkaion@7648
  1558
          SET IsValid='Y'
gorkaion@7648
  1559
        WHERE C_INVOICE_ID=v_Record_ID
gorkaion@7648
  1560
          AND IsValid!='Y';
gorkaion@4437
  1561
gorkaion@7648
  1562
        -- Is it a Credit Memo:4
mikel@11116
  1563
        SELECT DocBaseType, isreversal INTO v_TargetDocBaseType, v_isReversal
gorkaion@7648
  1564
        FROM C_DOCTYPE
gorkaion@7648
  1565
        WHERE C_DocType_ID=v_DocTypeTarget_ID;
mikel@11116
  1566
        IF (v_TargetDocBaseType in ('ARC','APC') or v_isReversal='Y') THEN
gorkaion@7648
  1567
          v_MultiplierARC:=-1;
gorkaion@7648
  1568
        END IF;
gorkaion@7648
  1569
gorkaion@7648
  1570
        --Sums debt payments from the order and the ones that have been inserted manually, added by ALO
gorkaion@7648
  1571
        SELECT COALESCE(SUM(C_Currency_Round(C_Currency_Convert((Amount + WriteOffAmt)*v_MultiplierARC, C_Currency_ID, v_Currency_ID, v_DateInvoiced, NULL, v_Client_ID, v_Org_ID), v_Currency_ID, NULL)), 0) INTO v_totalCash
gorkaion@7648
  1572
        FROM C_DEBT_PAYMENT_V dp
gorkaion@7648
  1573
        WHERE C_INVOICE_ID=v_Record_ID;
gorkaion@7648
  1574
        --Insert C_Debt_Payment if GrandTotal - v_totalCash <> 0;
gorkaion@7648
  1575
        IF (v_GrandTotal<>v_totalCash) THEN
gorkaion@7648
  1576
          DECLARE
gorkaion@7648
  1577
            CUR_PAYMENTS RECORD;
gorkaion@7648
  1578
            v_plannedDate DATE;
gorkaion@7648
  1579
            v_pendingAmount NUMBER;
gorkaion@7648
  1580
            v_paymentAmount NUMBER;
gorkaion@7648
  1581
            v_GenDebt_PaymentID varchar2(32);
gorkaion@7648
  1582
            v_SettlementDocTypeID varchar2(32) ;
gorkaion@7648
  1583
            v_settlement_ID VARCHAR2(32) ;
gorkaion@7648
  1584
            v_CB_Curr VARCHAR2(32) ;
gorkaion@7648
  1585
            v_SDocument_No C_SETTLEMENT.DocumentNo%TYPE;
gorkaion@7648
  1586
          BEGIN
gorkaion@7648
  1587
            IF (v_IsSOTrx ='Y') THEN
gorkaion@7648
  1588
              v_pendingAmount:=v_GrandTotal - v_totalCash;
gorkaion@7648
  1589
            ELSE
gorkaion@7648
  1590
              v_pendingAmount:=v_GrandTotal + v_totalCash;
gorkaion@7648
  1591
            END IF;
gorkaion@7648
  1592
            FOR CUR_PAYMENTS IN
gorkaion@7648
  1593
              (SELECT LINE, PERCENTAGE, ONREMAINDER, EXCLUDETAX,
gorkaion@7648
  1594
                   COALESCE(PAYMENTRULE, v_PaymentRule) AS PAYMENTRULE, FIXMONTHDAY, FIXMONTHDAY2, FIXMONTHDAY3,
gorkaion@7648
  1595
                   NETDAYS, FIXMONTHOFFSET, NETDAY, ISNEXTBUSINESSDAY
gorkaion@7648
  1596
               FROM C_PAYMENTTERMLINE
gorkaion@7648
  1597
               WHERE C_PAYMENTTERM_ID=v_PaymentTerm
gorkaion@7648
  1598
               UNION
gorkaion@7648
  1599
               -- Header of paymentTerm is processed at last
gorkaion@7648
  1600
               SELECT 9999 AS LINE, 100 AS PERCENTAGE, 'Y' AS ONREMAINDER, 'N' AS EXCLUDETAX,
gorkaion@7648
  1601
                   v_PaymentRule AS PAYMENTRULE, FIXMONTHDAY, FIXMONTHDAY2, FIXMONTHDAY3,
gorkaion@7648
  1602
                   NETDAYS, FIXMONTHOFFSET, NETDAY, ISNEXTBUSINESSDAY
gorkaion@7648
  1603
               FROM C_PAYMENTTERM
gorkaion@7648
  1604
               WHERE C_PAYMENTTERM_ID=v_PaymentTerm
gorkaion@7648
  1605
               ORDER BY LINE
gorkaion@7648
  1606
              )
gorkaion@7648
  1607
            LOOP
gorkaion@7648
  1608
              IF (CUR_PAYMENTS.PaymentRule IN('B', 'C')) THEN
gorkaion@7648
  1609
                SELECT MAX(C_CashBook_ID) INTO v_cashBook
gorkaion@7648
  1610
                FROM C_CASHBOOK
gorkaion@7648
  1611
                WHERE AD_Client_ID=v_Client_ID
gorkaion@7648
  1612
                  AND isActive='Y'
gorkaion@7648
  1613
                  AND isDefault='Y'
gorkaion@7648
  1614
                  AND AD_IsOrgIncluded(v_org_id,AD_ORG_ID, AD_Client_ID)<>-1;
gorkaion@7648
  1615
                IF (v_cashBook IS NULL) THEN
gorkaion@7648
  1616
                  RAISE_APPLICATION_ERROR(-20000, '@NoDefaultCashBook@');
gorkaion@7648
  1617
                END IF;
gorkaion@7648
  1618
                v_bankAccount:=NULL;
gorkaion@7648
  1619
              ELSE
gorkaion@7648
  1620
                SELECT COALESCE((
gorkaion@7648
  1621
                         CASE v_IsSOTrx
gorkaion@7648
  1622
                           WHEN 'Y' THEN SO_BankAccount_ID
gorkaion@7648
  1623
                           ELSE PO_BankAccount_ID
gorkaion@7648
  1624
                         END
gorkaion@7648
  1625
                         ),
gorkaion@7648
  1626
                         (SELECT MAX(C_BankAccount_ID)
gorkaion@7648
  1627
                          FROM C_BANKACCOUNT
gorkaion@7648
  1628
                          WHERE AD_Client_ID=v_Client_ID
gorkaion@7648
  1629
                            AND isDefault='Y'
gorkaion@7648
  1630
                         )
gorkaion@7648
  1631
                       ) INTO v_bankAccount
gorkaion@7648
  1632
                FROM C_BPARTNER
gorkaion@7648
  1633
                WHERE c_BPartner_ID=v_BPartner_ID;
gorkaion@7648
  1634
                v_cashBook:=NULL;
gorkaion@7648
  1635
              END IF;
gorkaion@7648
  1636
              v_plannedDate:=C_Paymentduedate(v_BPartner_ID, v_IsSOTrx, CUR_PAYMENTS.FixMonthDay, CUR_PAYMENTS.FixMonthDay2, CUR_PAYMENTS.FixMonthDay3, CUR_PAYMENTS.NetDays, CUR_PAYMENTS.FixMonthOffset, CUR_PAYMENTS.NetDay, CUR_PAYMENTS.IsNextbusinessday, v_DateInvoiced) ;
gorkaion@7648
  1637
              SELECT COALESCE(SUM(C_DEBT_PAYMENT_V.AMOUNT),0) INTO v_partialAmount
gorkaion@7648
  1638
              FROM C_DEBT_PAYMENT_V, C_DEBT_PAYMENT
gorkaion@7648
  1639
              WHERE C_DEBT_PAYMENT_V.C_INVOICE_ID = V_RECORD_ID
gorkaion@7648
  1640
                AND C_DEBT_PAYMENT_V.C_DEBT_PAYMENT_ID = C_DEBT_PAYMENT.C_DEBT_PAYMENT_ID
gorkaion@7648
  1641
                AND ISAUTOMATICGENERATED='N';
gorkaion@7648
  1642
              IF (CUR_PAYMENTS.EXCLUDETAX='Y') THEN
gorkaion@7648
  1643
                -- if excludeTax = 'Y', percentage is aplied on the TotalLines
gorkaion@7648
  1644
                v_paymentAmount:=C_Currency_Round((v_TotalLines-v_partialAmount) *CUR_PAYMENTS.PERCENTAGE/100, v_Currency_ID, NULL) ;
gorkaion@7648
  1645
              ELSIF (CUR_PAYMENTS.ONREMAINDER='N') THEN
gorkaion@7648
  1646
                -- if onRemainder = 'N', percentage is aplied on the GrandTotal
gorkaion@7648
  1647
                v_paymentAmount:=C_Currency_Round((v_GrandTotal-v_partialAmount) *CUR_PAYMENTS.PERCENTAGE/100, v_Currency_ID, NULL) ;
gorkaion@7648
  1648
              ELSE
gorkaion@7648
  1649
                v_paymentAmount:=C_Currency_Round((v_pendingAmount) *CUR_PAYMENTS.PERCENTAGE/100, v_Currency_ID, NULL) ;
gorkaion@7648
  1650
              END IF;
gorkaion@7648
  1651
              v_pendingAmount:=v_pendingAmount - v_paymentAmount;
gorkaion@7648
  1652
              v_debtPaymentID :=get_uuid() ;
gorkaion@7648
  1653
              v_paymentcheck:=C_Currency_Round((v_paymentamount *v_multiplierarc) -withholdamount *(v_paymentamount *v_multiplierarc / v_grandtotal), v_Currency_ID, NULL);
gorkaion@7648
  1654
              IF (v_paymentcheck <> 0) THEN
gorkaion@7648
  1655
                INSERT INTO C_DEBT_PAYMENT
gorkaion@7648
  1656
                  (
gorkaion@7648
  1657
                   C_DEBT_PAYMENT_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
gorkaion@7648
  1658
                   CREATED, CREATEDBY, UPDATED, UPDATEDBY,
gorkaion@7648
  1659
                   ISRECEIPT, C_SETTLEMENT_CANCEL_ID, C_SETTLEMENT_GENERATE_ID, DESCRIPTION,
gorkaion@7648
  1660
                   C_INVOICE_ID, C_BPARTNER_ID, C_CURRENCY_ID, C_CASHLINE_ID,
gorkaion@7648
  1661
                   C_BANKACCOUNT_ID, C_CASHBOOK_ID, PAYMENTRULE, ISPAID,
gorkaion@7648
  1662
                   AMOUNT, WRITEOFFAMT, DATEPLANNED, ISMANUAL,
gorkaion@7648
  1663
                   ISVALID, C_BANKSTATEMENTLINE_ID, CHANGESETTLEMENTCANCEL, CANCEL_PROCESSED,
gorkaion@7648
  1664
                   GENERATE_PROCESSED, c_project_id, status, status_initial,   withholdingamount,C_WITHHOLDING_ID
gorkaion@7648
  1665
                  )
gorkaion@7648
  1666
                  VALUES
gorkaion@7648
  1667
                  (
gorkaion@7648
  1668
                   v_debtPaymentID, v_Client_ID, v_Org_ID, 'Y',
gorkaion@7648
  1669
                   now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7648
  1670
                   v_IsSOTrx, NULL, NULL, '* ' || v_DocumentNo || ' * (' || COALESCE(TO_CHAR(v_BPartnerName) ,'') ||( CASE WHEN v_POReference IS NULL THEN '' ELSE ' .Ref:'||TO_CHAR(v_POReference) END) || ' )',
gorkaion@7648
  1671
                   v_Record_ID, v_BPartner_ID, v_Currency_ID, NULL,
gorkaion@7648
  1672
                   v_bankAccount, v_cashBook, CUR_PAYMENTS.PaymentRule, 'N',
gorkaion@7648
  1673
                   C_Currency_Round((v_paymentamount *v_multiplierarc) -withholdamount *(v_paymentamount *v_multiplierarc / v_grandtotal), v_Currency_ID, NULL), 0, v_plannedDate, 'N',
gorkaion@7648
  1674
                   'Y', NULL, 'N', 'N',
gorkaion@7648
  1675
                   'N', v_C_Project_Id, 'DE', 'DE', C_Currency_Round(withholdamount *(v_paymentamount *v_multiplierarc / v_grandtotal), v_Currency_ID, NULL),cWithHoldId
gorkaion@7648
  1676
                  );
gorkaion@7648
  1677
              END IF;
gorkaion@7648
  1678
              --AL
gorkaion@7648
  1679
              --Looking for autogenerated debt-payments
gorkaion@7648
  1680
              SELECT MAX(c_Debt_Payment_Id), MAX(ad_Org_ID)
gorkaion@7648
  1681
                INTO v_GenDebt_PaymentID, v_GenDP_Org
gorkaion@7648
  1682
              FROM C_DEBT_PAYMENT DP
gorkaion@7648
  1683
              WHERE C_BPartner_ID=v_BPartner_ID
gorkaion@7648
  1684
                AND C_Debt_Payment_Status(C_Settlement_Cancel_ID, Cancel_Processed, Generate_Processed, IsPaid, IsValid, C_Cashline_ID, C_BankstatementLine_ID)='P'
david@8533
  1685
                AND ISRECEIPT=v_IsSOTrx
gorkaion@7648
  1686
                AND (-1) *Amount=v_paymentAmount
gorkaion@7648
  1687
                AND c_currency_ID=v_Currency_ID
gorkaion@7648
  1688
                AND C_SETTLEMENT_GENERATE_ID IS NOT NULL
gorkaion@7648
  1689
                AND Ad_Isorgincluded(v_Org_id, dp.ad_org_id,v_Client_ID) != -1
gorkaion@7648
  1690
                AND ad_client_id = v_Client_ID
gorkaion@7648
  1691
                AND EXISTS (SELECT 1
gorkaion@7648
  1692
                            FROM C_SETTLEMENT S
gorkaion@7648
  1693
                            WHERE DP.C_SETTLEMENT_GENERATE_ID = S.C_Settlement_ID
gorkaion@7648
  1694
                              AND IsGenerated = 'Y')
gorkaion@7648
  1695
                AND NOT EXISTS (SELECT 1
gorkaion@7648
  1696
                                FROM C_REMITTANCELINE rl
gorkaion@7648
  1697
                                WHERE rl.C_DEBT_PAYMENT_CANCELLED = DP.C_DEBT_PAYMENT_ID);
gorkaion@7648
  1698
  
gorkaion@7648
  1699
              IF (v_GenDebt_PaymentID IS NOT NULL) THEN
gorkaion@7648
  1700
                v_SettlementDocTypeID:=Ad_Get_Doctype(v_Client_ID, v_GenDP_Org, TO_CHAR('STT')) ;
gorkaion@7648
  1701
                v_settlement_ID := get_uuid();
gorkaion@7648
  1702
                Ad_Sequence_Doctype(v_SettlementDocTypeID, v_Record_ID, 'Y', v_SDocument_No) ;
gorkaion@7648
  1703
                IF (v_SDocument_No IS NULL) THEN
gorkaion@7648
  1704
                  Ad_Sequence_Doc('DocumentNo_C_Settlement', v_Client_ID, 'Y', v_SDocument_No) ;
gorkaion@7648
  1705
                END IF;
gorkaion@7648
  1706
                INSERT INTO C_SETTLEMENT
gorkaion@7648
  1707
                  (
gorkaion@7648
  1708
                   C_SETTLEMENT_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
gorkaion@7648
  1709
                   CREATED, CREATEDBY, UPDATED, UPDATEDBY,
gorkaion@7648
  1710
                   DOCUMENTNO, DATETRX, DATEACCT, SETTLEMENTTYPE,
gorkaion@7648
  1711
                   C_DOCTYPE_ID, PROCESSING, PROCESSED, POSTED,
gorkaion@7648
  1712
                   C_CURRENCY_ID, ISGENERATED
gorkaion@7648
  1713
                  )
gorkaion@7648
  1714
                   /*, C_PROJECT_ID, C_CAMPAIGN_ID,
gorkaion@7648
  1715
                   C_ACTIVITY_ID, USER1_ID, USER2_ID, CREATEFROM)*/
gorkaion@7648
  1716
                  VALUES
gorkaion@7648
  1717
                  (
gorkaion@7648
  1718
                   v_Settlement_ID, v_Client_ID, v_GenDP_Org, 'Y',
gorkaion@7648
  1719
                   now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7648
  1720
                   '*C*'||v_SDocument_No, TRUNC(now()), TRUNC(now()), 'C',
gorkaion@7648
  1721
                   v_SettlementDocTypeID, 'N', 'N', 'N',
gorkaion@7648
  1722
                   v_Currency_ID, 'Y'
gorkaion@7648
  1723
                  );
gorkaion@7648
  1724
                UPDATE C_DEBT_PAYMENT
gorkaion@7648
  1725
                SET C_Settlement_Cancel_Id=v_Settlement_ID,
gorkaion@7648
  1726
                    Updated=now(),
gorkaion@7648
  1727
                    UpdatedBy=v_UpdatedBy
gorkaion@7648
  1728
                WHERE c_Debt_Payment_ID IN(v_genDebt_PaymentID, v_debtPaymentID) ;
gorkaion@7648
  1729
                C_SETTLEMENT_POST(NULL, v_Settlement_ID) ;
gorkaion@7648
  1730
              END IF;
gorkaion@7648
  1731
              --If Invoice.paymentRule = 'B', insert de cashline de tipo efecto apuntando al efecto
gorkaion@7648
  1732
              IF (v_cashBook IS NOT NULL AND CUR_PAYMENTS.PaymentRule='B') THEN
gorkaion@7648
  1733
                SELECT MAX(C.C_CASH_ID) INTO v_Cash
gorkaion@7648
  1734
                FROM C_CASH C
gorkaion@7648
  1735
                WHERE C.C_CASHBOOK_ID=v_cashBook
gorkaion@7648
  1736
                  AND TRUNC(C.DATEACCT)=TRUNC(v_DateAcct)
gorkaion@7648
  1737
                  AND C.PROCESSED='N';
gorkaion@7648
  1738
  
gorkaion@7648
  1739
                SELECT C_CURRENCY_ID INTO v_CB_Curr
gorkaion@7648
  1740
                FROM C_CASHBOOK
gorkaion@7648
  1741
                WHERE C_CASHBOOK_ID = v_cashBook;
gorkaion@7648
  1742
  
gorkaion@7648
  1743
                IF (v_Cash IS NULL) THEN
gorkaion@7648
  1744
                  v_ResultStr:='Creating C_Cash';
gorkaion@7648
  1745
                  SELECT ISO_CODE INTO v_IsoCode
gorkaion@7648
  1746
                  FROM C_CURRENCY
gorkaion@7648
  1747
                  WHERE C_Currency_ID=v_CB_Curr;
gorkaion@7648
  1748
                  v_Cash :=get_uuid();
gorkaion@7648
  1749
                  INSERT INTO C_CASH (
gorkaion@7648
  1750
                      C_Cash_ID, AD_Client_ID, AD_Org_ID, IsActive,
gorkaion@7648
  1751
                      Created, CreatedBy, Updated, UpdatedBy,
gorkaion@7648
  1752
                      C_CashBook_ID, NAME, StatementDate, DateAcct,
gorkaion@7648
  1753
                      BeginningBalance, EndingBalance, StatementDifference, Processing,
gorkaion@7648
  1754
                      Processed, Posted )
gorkaion@7648
  1755
                    VALUES (
gorkaion@7648
  1756
                      v_Cash, v_Client_ID, v_Org_ID, 'Y',
gorkaion@7648
  1757
                      now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7648
  1758
                      v_cashBook, (TO_CHAR(v_DateAcct, 'YYYY-MM-DD') || ' ' || v_IsoCode), v_DateAcct, v_DateAcct,
gorkaion@7648
  1759
                      0, 0, 0, 'N',
gorkaion@7648
  1760
                      'N', 'N');
gorkaion@7648
  1761
                END IF; -- v_Cash IS NULL
gorkaion@7648
  1762
                v_ResultStr:='Creating C_CashLine';
gorkaion@7648
  1763
                v_CashLine := get_uuid();
gorkaion@7648
  1764
                SELECT COALESCE(MAX(LINE), 0) + 10 INTO v_line
gorkaion@7648
  1765
                FROM C_CASHLINE
gorkaion@7648
  1766
                WHERE C_CASH_ID=v_Cash;
gorkaion@7648
  1767
  
gorkaion@7648
  1768
                SELECT SUM(AMOUNT) INTO v_Amount
gorkaion@7648
  1769
                FROM C_DEBT_PAYMENT_V
gorkaion@7648
  1770
                WHERE C_INVOICE_ID = v_Record_ID;
gorkaion@7648
  1771
  
gorkaion@7648
  1772
                INSERT INTO C_CASHLINE
gorkaion@7648
  1773
                  (
gorkaion@7648
  1774
                    C_CashLine_ID, AD_Client_ID, AD_Org_ID, IsActive,
gorkaion@7648
  1775
                    Created, CreatedBy, Updated, UpdatedBy,
gorkaion@7648
  1776
                    C_Cash_ID, C_Debt_Payment_ID, Line, Description,
gorkaion@7648
  1777
                    Amount, CashType, C_Currency_ID, DiscountAmt,
gorkaion@7648
  1778
                    WriteOffAmt, IsGenerated
gorkaion@7648
  1779
                  )
gorkaion@7648
  1780
                  VALUES
gorkaion@7648
  1781
                  (
gorkaion@7648
  1782
                    v_CashLine, v_Client_ID, v_Org_ID, 'Y',
gorkaion@7648
  1783
                    TO_DATE(now()), v_UpdatedBy, TO_DATE(now()), v_UpdatedBy,
gorkaion@7648
  1784
                    v_Cash, v_debtPaymentID, v_line, v_BPartnerName,
gorkaion@7648
  1785
                    v_Amount, 'P', v_Currency_ID, 0,
gorkaion@7648
  1786
                    0, 'Y'
gorkaion@7648
  1787
                  );
gorkaion@7648
  1788
  
gorkaion@7648
  1789
              END IF; -- v_cashBook IS NOT NULL
gorkaion@7648
  1790
            END LOOP;
gorkaion@7648
  1791
          END;
gorkaion@7648
  1792
        END IF; -- v_GrandTotal <> v_totalCash
gorkaion@7647
  1793
      END IF;
gorkaion@7647
  1794
    END;
gorkaion@7647
  1795
    IF (NOT FINISH_PROCESS AND v_IsSOTrx='Y') THEN
gorkaion@7647
  1796
      C_BP_SOCREDITUSED_REFRESH(v_BPartner_ID) ;
carlos@0
  1797
    END IF;
gorkaion@7647
  1798
  END IF;--FINISH_PROCESS
gorkaion@7647
  1799
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
markmm82@31570
  1800
    --Update the prepayment amount from orders related to the invoice lines.
markmm82@31570
  1801
    SELECT COALESCE(SUM(fps.paidamt),0)
markmm82@31570
  1802
      INTO v_prepayment_inorders
markmm82@31570
  1803
    FROM fin_payment_schedule fps
markmm82@31570
  1804
      JOIN c_order o ON o.c_order_id=fps.c_order_id
markmm82@31570
  1805
      JOIN c_orderline ol ON ol.c_order_id = o.c_order_id
markmm82@31570
  1806
      JOIN c_invoiceline il ON il.c_orderline_id = ol.c_orderline_id
markmm82@31570
  1807
    WHERE il.c_invoice_id = v_Record_ID;
markmm82@31570
  1808
gorkaion@7647
  1809
    -- Finish up -------------------------------------------------------------
gorkaion@7647
  1810
    UPDATE C_INVOICE
gorkaion@7647
  1811
    SET DocStatus='CO',
gorkaion@7647
  1812
        Processed='Y',
gorkaion@7647
  1813
        DocAction='RE',
markmm82@31570
  1814
        PrepaymentAmt=v_prepayment_inorders,
gorkaion@7647
  1815
        Updated=now(),
gorkaion@7647
  1816
        UpdatedBy=v_UpdatedBy
gorkaion@7647
  1817
    WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
  1818
  END IF;--FINISH_PROCESS
gorkaion@7647
  1819
  IF (NOT FINISH_PROCESS) THEN
gorkaion@7647
  1820
    -- End Processing --------------------------------------------------------
gorkaion@7647
  1821
    --<<END_PROCESSING>>
gorkaion@7647
  1822
    v_ResultStr:='UnLockingInvoice';
gorkaion@7647
  1823
    UPDATE C_INVOICE
gorkaion@7647
  1824
    SET Processing='N',
gorkaion@7647
  1825
        Updated=now(),
gorkaion@7647
  1826
        UpdatedBy=v_UpdatedBy
gorkaion@7647
  1827
    WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
  1828
    -- Commented by cromero 19102006 IF (p_PInstance_ID IS NOT NULL) THEN
gorkaion@7647
  1829
    -- Commented by cromero 19102006   COMMIT;
gorkaion@7647
  1830
    -- Commented by cromero 19102006 END IF;
gorkaion@7647
  1831
  END IF;--FINISH_PROCESS
gorkaion@7647
  1832
gorkaion@7647
  1833
  --C_Invoice_Post - Finish_Process Extension Point
gorkaion@7647
  1834
  SELECT count(*) INTO v_count FROM DUAL
gorkaion@7647
  1835
  WHERE EXISTS (SELECT 1 FROM ad_ep_procedures WHERE ad_extension_points_id = 'CBE7DD2E561E4D3D8257ECEA5F19687F');
gorkaion@7647
  1836
  IF (v_count=1) THEN
gorkaion@7647
  1837
    DECLARE
gorkaion@7647
  1838
      v_ep_instance VARCHAR2(32);
gorkaion@7647
  1839
      v_extension_point_id VARCHAR2(32) := 'CBE7DD2E561E4D3D8257ECEA5F19687F';
gorkaion@7647
  1840
    BEGIN
gorkaion@7647
  1841
      v_ep_instance := get_uuid();
gorkaion@7647
  1842
      AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'Record_ID', v_record_id, NULL, NULL, NULL, NULL, NULL, NULL);
gorkaion@7647
  1843
      AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'DocAction', v_DocAction, NULL, NULL, NULL, NULL, NULL, NULL);
gorkaion@7647
  1844
      AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'User', v_UpdatedBy, NULL, NULL, NULL, NULL, NULL, NULL);
gorkaion@7647
  1845
      AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'Message', NULL, NULL, NULL, NULL, NULL, NULL, v_Message);
gorkaion@7647
  1846
      AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'Result', NULL, NULL, v_result, NULL, NULL, NULL, NULL);
gorkaion@7647
  1847
      AD_EXTENSION_POINT_HANDLER(v_ep_instance, v_extension_point_id);
gorkaion@7647
  1848
      SELECT p_number INTO v_Result
gorkaion@7647
  1849
      FROM ad_ep_instance_para
gorkaion@7647
  1850
      WHERE ad_ep_instance_id = v_ep_instance
gorkaion@7647
  1851
        AND parametername LIKE 'Result';
gorkaion@7647
  1852
      SELECT p_text INTO v_Message
gorkaion@7647
  1853
      FROM ad_ep_instance_para
gorkaion@7647
  1854
      WHERE ad_ep_instance_id = v_ep_instance
gorkaion@7647
  1855
        AND parametername LIKE 'Message';
gorkaion@7647
  1856
gorkaion@7647
  1857
      DELETE FROM ad_ep_instance_para
gorkaion@7647
  1858
      WHERE ad_ep_instance_id = v_ep_instance;
gorkaion@7647
  1859
    END;
gorkaion@7647
  1860
  END IF;
gorkaion@7647
  1861
harikrishnan@7678
  1862
	FOR Cur_lineqty IN
harikrishnan@7678
  1863
      (SELECT C_INVOICELINE.qtyInvoiced
harikrishnan@7678
  1864
       FROM C_INVOICELINE
harikrishnan@7678
  1865
       WHERE C_Invoice_ID = v_Record_ID
harikrishnan@7678
  1866
      )
harikrishnan@7678
  1867
    LOOP
harikrishnan@7678
  1868
    IF(Cur_lineqty.qtyInvoiced <> 0) THEN
harikrishnan@7678
  1869
      v_totalqty := v_totalqty + 1;
harikrishnan@7678
  1870
     END IF;
harikrishnan@7678
  1871
    END LOOP;
gorkaion@7647
  1872
  --<<FINISH_PROCESS>>
gorkaion@7647
  1873
  IF (p_PInstance_ID IS NOT NULL) THEN
gorkaion@7647
  1874
    --  Update AD_PInstance
gorkaion@7647
  1875
    DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished - ' || v_Message) ;
harikrishnan@7678
  1876
   
harikrishnan@7678
  1877
    IF(v_totalqty = 0 AND v_DocAction <> 'RE') THEN
eduardo@26615
  1878
      SELECT COUNT(1)
eduardo@26615
  1879
      INTO v_hasTaxes
eduardo@26615
  1880
      FROM DUAL
eduardo@26615
  1881
      WHERE EXISTS (SELECT 1
eduardo@26615
  1882
                    FROM C_INVOICETAX
eduardo@26615
  1883
                    WHERE C_Invoice_ID = v_Record_ID);
eduardo@26615
  1884
      IF(v_hasTaxes=0) THEN
eduardo@26615
  1885
	      v_Message := v_Message || '@NoAccountingEntryInvoice@';
eduardo@26615
  1886
	    END IF;
harikrishnan@7678
  1887
    END IF;
gorkaion@7647
  1888
    AD_UPDATE_PINSTANCE(p_PInstance_ID, v_UpdatedBy, 'N', v_Result, v_Message) ;
gorkaion@7647
  1889
  ELSE
gorkaion@7647
  1890
    DBMS_OUTPUT.PUT_LINE('--<<C_Invoive_Post finished>> ' || v_Message) ;
gorkaion@7647
  1891
  END IF;
gorkaion@7647
  1892
  RETURN;
gorkaion@7647
  1893
END; --BODY
carlos@0
  1894
EXCEPTION
carlos@0
  1895
WHEN OTHERS THEN
carlos@0
  1896
  DBMS_OUTPUT.PUT_LINE(v_ResultStr) ;
carlos@0
  1897
     v_ResultStr:= '@ERROR=' || SQLERRM;
carlos@0
  1898
      DBMS_OUTPUT.PUT_LINE(v_ResultStr) ;
gorkaion@7647
  1899
      IF (p_PInstance_ID IS NOT NULL) THEN
carlos@0
  1900
        ROLLBACK;
antonio@735
  1901
        AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'N', 0, v_ResultStr) ;
carlos@0
  1902
      ELSE
carlos@1273
  1903
        RAISE;
carlos@1273
  1904
      END IF;
carlos@0
  1905
  -- Commented by cromero 19102006 RETURN;
antonio@735
  1906
END C_INVOICE_POST
gorkaion@239
  1907
]]></body>
carlos@0
  1908
    </function>
adrian@94
  1909
  </database>