src-db/database/model/functions/C_INVOICE_POST.xml
author RM packaging bot <staff.rm@openbravo.com>
Fri, 16 Jan 2015 10:29:45 +0000
changeset 25799 c28206c4abc9
parent 25647 69229796406f
parent 25787 1e8206167887
child 25877 64fd34510c40
permissions -rw-r--r--
Merge temporary head for 3.0PR14Q3.5
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
victor@21909
    25
  * Contributions are Copyright (C) 2001-2014 Openbravo, S.L.U.
juanpablo@771
    26
  *
juanpablo@771
    27
  * Specifically, this derivative work is based upon the following Compiere
juanpablo@771
    28
  * file and version.
carlos@0
    29
  *************************************************************************
carlos@0
    30
  * $Id: 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;
sandra@16240
    62
  Cur_TaxMAct RECORD;
asier@18342
    63
  Cur_Offer RECORD;
carlos@0
    64
gorkaion@7647
    65
  -- Record Info
gorkaion@7647
    66
  v_Client_ID VARCHAR2(32);
gorkaion@7647
    67
  v_User_ID VARCHAR2(32);
gorkaion@7647
    68
  v_Org_ID VARCHAR2(32);
gorkaion@7647
    69
  v_UpdatedBy C_INVOICE.UpdatedBy%TYPE;
gorkaion@7647
    70
  v_Processing C_INVOICE.Processing%TYPE;
gorkaion@7647
    71
  v_Processed C_INVOICE.Processed%TYPE;
gorkaion@7647
    72
  v_DocAction C_INVOICE.DocAction%TYPE;
gorkaion@7647
    73
  v_DocStatus C_INVOICE.DocStatus%TYPE;
gorkaion@7647
    74
  v_DoctypeReversed_ID VARCHAR2(32);
gorkaion@7647
    75
  v_DocType_ID VARCHAR2(32);
gorkaion@7647
    76
  v_DocTypeTarget_ID VARCHAR2(32);
gorkaion@14547
    77
  v_isreturndoctype CHAR(1);
gorkaion@7647
    78
  v_PaymentRule C_INVOICE.PaymentRule%TYPE;
gorkaion@7647
    79
  v_PaymentTerm C_INVOICE.C_PaymentTerm_ID%TYPE;
gorkaion@7647
    80
  v_Order_ID VARCHAR2(32);
gorkaion@7647
    81
  v_DateAcct DATE;
gorkaion@7647
    82
  v_DateInvoiced DATE;
gorkaion@7647
    83
  v_DocumentNo C_INVOICE.DocumentNo%TYPE;
gorkaion@7647
    84
  v_BPartner_ID VARCHAR2(32);
fernando@25006
    85
  v_bp_isactive c_bpartner.isactive%TYPE;
gorkaion@7647
    86
  v_BPartner_User_ID VARCHAR2(32);
gorkaion@7647
    87
  v_IsSOTrx C_INVOICE.IsSOTrx%TYPE;
gorkaion@7647
    88
  v_Posted C_INVOICE.Posted%TYPE;
gorkaion@17350
    89
  v_istaxincluded CHAR(1);
carlos@0
    90
  --Added by P.SAROBE
carlos@0
    91
  v_documentno_Settlement VARCHAR2(40);
carlos@0
    92
  v_dateSettlement DATE;
carlos@0
    93
  v_Cancel_Processed CHAR(1);
carlos@0
    94
  v_nameBankstatement VARCHAR2 (60);
carlos@0
    95
  v_dateBankstatement DATE;
carlos@0
    96
  v_nameCash VARCHAR2 (60);
carlos@0
    97
  v_dateCash DATE;
juanpablo@1605
    98
  v_Bankstatementline_ID VARCHAR2(32);
juanpablo@1605
    99
  v_Debtpayment_ID VARCHAR2(32);
juanpablo@1605
   100
  v_CashLine_ID VARCHAR2(32);
carlos@0
   101
  v_ispaid CHAR(1);
juanpablo@1605
   102
  v_Settlement_Cancel_ID VARCHAR2(32);
carlos@0
   103
  --Finish added by P.Sarobe
gorkaion@7647
   104
  --
gorkaion@7647
   105
  v_GrandTotal NUMBER:=0;
gorkaion@7647
   106
  v_TotalLines NUMBER:=0;
gorkaion@7647
   107
  v_Currency_ID VARCHAR2(32);
gorkaion@7647
   108
  v_Multiplier NUMBER:=1;
gorkaion@7647
   109
  v_paymentcheck NUMBER;
gorkaion@7647
   110
  --
gorkaion@7647
   111
  v_RInvoice_ID VARCHAR2(32);
gorkaion@7647
   112
  v_RDocumentNo C_INVOICE.DocumentNo%TYPE;
gorkaion@7647
   113
  v_NextNo VARCHAR2(32);
gorkaion@7647
   114
  v_count NUMBER;
gorkaion@7647
   115
  v_POReference NVARCHAR2(40) ;
gorkaion@7647
   116
  --
gorkaion@7647
   117
  v_SettlementDocType_ID VARCHAR2(32) ;
gorkaion@7647
   118
  v_SDocumentNo C_SETTLEMENT.DocumentNo%TYPE;
gorkaion@7647
   119
  v_settlementID varchar2(32):=NULL;
gorkaion@7647
   120
  --
gorkaion@7647
   121
  v_FirstSales C_BPARTNER.FirstSale%TYPE;
gorkaion@7647
   122
  v_REInOutStatus M_INOUT.DocStatus%TYPE;
gorkaion@7647
   123
  v_REDateInvoiced DATE;
gorkaion@7647
   124
  v_REtotalQtyInvoiced NUMBER:=0;
gorkaion@7647
   125
  v_REdeliveredQty NUMBER:=0;
gorkaion@7647
   126
  --
gorkaion@7647
   127
  v_CumDiscount NUMBER;
gorkaion@7647
   128
  v_OldCumDiscount NUMBER;
gorkaion@7647
   129
  v_InvoiceLineSeqNo NUMBER;
gorkaion@7647
   130
  v_InvoiceLine VARCHAR2(32);
gorkaion@7647
   131
  v_Discount NUMBER;
gorkaion@7647
   132
  v_Line NUMBER;
gorkaion@7647
   133
  v_InvoiceDiscount NUMBER;
gorkaion@7647
   134
  v_C_Project_ID VARCHAR2(32);
gorkaion@7647
   135
  v_acctAmount NUMBER;
gorkaion@7647
   136
  v_partialAmount NUMBER;
gorkaion@7647
   137
  FINISH_PROCESS BOOLEAN:=FALSE;
gorkaion@7647
   138
  END_PROCESSING BOOLEAN:=FALSE;
gorkaion@7647
   139
  v_TargetDocBaseType C_DOCTYPE.DocBaseType%TYPE;
mikel@11116
   140
  v_isReversal C_DOCTYPE.IsReversal%TYPE;
gorkaion@7647
   141
  v_MultiplierARC NUMBER:=1;
gorkaion@7647
   142
  v_is_included NUMBER:=0;
gorkaion@7647
   143
  v_available_period NUMBER:=0;
gorkaion@7647
   144
  v_is_ready AD_Org.IsReady%TYPE;
gorkaion@7647
   145
  v_is_tr_allow AD_OrgType.IsTransactionsAllowed%TYPE;
gorkaion@7647
   146
  v_isacctle AD_OrgType.IsAcctLegalEntity%TYPE;
gorkaion@7647
   147
  v_org_bule_id AD_Org.AD_Org_ID%TYPE;
gorkaion@7647
   148
  
gorkaion@7647
   149
  v_PeriodStartDate DATE;
gorkaion@7647
   150
  v_PeriodEndDate DATE;
gorkaion@7647
   151
  v_DocNo_Org_ID AD_Sequence.AD_Org_ID%TYPE;
gorkaion@7647
   152
  withholdamount NUMBER(10,2);
gorkaion@7647
   153
  cWithHoldId varchar2(32);
harikrishnan@7808
   154
  Cur_InvoiceNetLine RECORD;
ioritz@16017
   155
ioritz@16017
   156
  v_LineMax NUMBER:=0;
mikel@17452
   157
  v_precision NUMBER;
mikel@17452
   158
  v_gross_unit_price NUMBER;
mikel@17452
   159
  v_line_gross_amount NUMBER;
rafael@16135
   160
  v_Isquantityvariable CHAR(1);
eduardo@18445
   161
  
eduardo@18445
   162
  v_isdeferred_inv C_InvoiceLine.IsDeferred%TYPE;
eduardo@18445
   163
  v_defplantype_inv C_InvoiceLine.DefPlanType%TYPE;
eduardo@18445
   164
  v_periodnumber_inv C_InvoiceLine.periodnumber%TYPE;
eduardo@18445
   165
  v_period_inv C_InvoiceLine.c_period_id%TYPE;
eduardo@18445
   166
mikel@19131
   167
  v_voiddate_inv C_Invoice.DateInvoiced%TYPE;
mikel@19131
   168
  v_voiddate_acct C_Invoice.DateAcct%TYPE;
mikel@19131
   169
david@19193
   170
  v_bpartner_blocked VARCHAR2(1):='N';
david@19193
   171
  v_invoiceBlocking VARCHAR2(1):='N';
sandra@20001
   172
  v_bpartner_name c_bpartner.name%TYPE;
gorkaion@20940
   173
  v_productname m_product.name%TYPE;
victor@21513
   174
victor@21513
   175
  v_iscashvat C_Invoice.IsCashVat%TYPE;
gaurav@21626
   176
  v_invoiceline_qtysum NUMBER;
sandra@25787
   177
  v_PriceList_ID varchar2(32);
sandra@25543
   178
  v_prepaymentamt 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,
pandeeswari@20841
   639
            now(), NULL, 'N', NULL,
rakhee@4301
   640
            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,
carlos@0
   643
            TotalLines * -1, GrandTotal * -1, M_PriceList_ID, C_Campaign_ID,
carlos@0
   644
            C_Project_ID, C_Activity_ID, AD_OrgTrx_ID, User1_ID,
eduardo@18854
   645
            User2_ID, fin_paymentmethod_id, C_CostCenter_ID,
eduardo@18854
   646
            A_Asset_ID
carlos@0
   647
          FROM C_INVOICE
carlos@0
   648
          WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
   649
        -- Create Reversed invoice relation
gorkaion@7647
   650
        INSERT INTO C_Invoice_Reverse
gorkaion@7647
   651
          (
gorkaion@7647
   652
           C_Invoice_Reverse_ID,AD_Client_ID, AD_Org_ID,
gorkaion@7647
   653
           IsActive, Created, CreatedBy, Updated,
gorkaion@7647
   654
           UpdatedBy, C_Invoice_ID, Reversed_C_Invoice_ID
gorkaion@7647
   655
          )
victor@4940
   656
          SELECT get_uuid(), AD_Client_ID, AD_Org_ID,
harikrishnan@7209
   657
              'Y', now(), v_UpdatedBy, now(),
harikrishnan@7209
   658
              v_UpdatedBy, v_RInvoice_ID, C_Invoice_ID
victor@4940
   659
          FROM C_INVOICE
victor@4940
   660
          WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
   661
asier@18342
   662
        
gorkaion@7647
   663
        --  Delete C_Invoice_Discounts inserted by the trigger
gorkaion@7647
   664
        DELETE FROM C_INVOICE_DISCOUNT WHERE C_Invoice_ID=v_RInvoice_ID;
gorkaion@7647
   665
        --  Insert discounts as in the reversed invoice
gorkaion@7647
   666
        FOR Cur_Discount IN
gorkaion@7647
   667
          (SELECT *
gorkaion@7647
   668
           FROM C_INVOICE_DISCOUNT
gorkaion@7647
   669
           WHERE C_Invoice_ID=v_Record_ID
gorkaion@7647
   670
           ORDER BY LINE
gorkaion@7647
   671
          )
gorkaion@7647
   672
        LOOP
gorkaion@7647
   673
          INSERT INTO C_INVOICE_DISCOUNT
gorkaion@7647
   674
            (
gorkaion@7647
   675
              C_INVOICE_DISCOUNT_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
gorkaion@7647
   676
              CREATED, CREATEDBY, UPDATED, UPDATEDBY,
gorkaion@7647
   677
              C_INVOICE_ID, C_DISCOUNT_ID, LINE, CASCADE
carlos@0
   678
            )
gorkaion@7647
   679
            VALUES
gorkaion@7647
   680
            (
gorkaion@7647
   681
              get_uuid(), Cur_Discount.AD_Client_ID, Cur_Discount.AD_Org_ID, 'Y',
gorkaion@7647
   682
              now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7647
   683
              v_RInvoice_ID, Cur_Discount.C_Discount_ID, Cur_Discount.Line, Cur_Discount.CASCADE
gorkaion@7647
   684
            );
gorkaion@7647
   685
        END LOOP;
gorkaion@7647
   686
        -- Create Reversal Invoice Lines
gorkaion@7647
   687
        FOR Cur_InvoiceLine IN
gorkaion@7647
   688
          (SELECT *
gorkaion@7647
   689
           FROM C_INVOICELINE
gorkaion@7647
   690
           WHERE C_Invoice_ID=v_Record_ID
gorkaion@7647
   691
             AND C_INVOICE_DISCOUNT_ID IS NULL
gorkaion@7647
   692
           ORDER BY Line
gorkaion@7647
   693
          )
gorkaion@7647
   694
        LOOP
gorkaion@7647
   695
          v_NextNo := get_uuid();
gorkaion@7647
   696
          INSERT INTO C_INVOICELINE
gorkaion@7647
   697
            (
gorkaion@7647
   698
              C_InvoiceLine_ID, AD_Client_ID, AD_Org_ID, IsActive,
gorkaion@7647
   699
              Created, CreatedBy, Updated, UpdatedBy,
gorkaion@7647
   700
              C_Invoice_ID, C_OrderLine_ID, M_InOutLine_ID, Line,
gorkaion@7647
   701
              Description, M_Product_ID, QtyInvoiced, PriceList,
gorkaion@7647
   702
              PriceActual, LineNetAmt, C_Charge_ID, ChargeAmt,
victor@15865
   703
              C_UOM_ID, C_Tax_ID, PriceStd, 
mikel@17453
   704
              Financial_Invoice_Line, Account_ID,Taxbaseamt,
eduardo@18445
   705
              gross_unit_price, line_gross_amount,
eduardo@18854
   706
              isdeferred, defplantype, periodnumber, c_period_id,
eduardo@18854
   707
              c_bpartner_id, c_project_id, c_projectline_id, a_asset_id,
atul@23871
   708
              user1_id, user2_id, c_costcenter_id)
gorkaion@7647
   709
            VALUES
gorkaion@7647
   710
            (
gorkaion@7647
   711
              v_NextNo, Cur_InvoiceLine.AD_Client_ID, Cur_InvoiceLine.AD_Org_ID, 'Y',
gorkaion@7647
   712
              now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7647
   713
              v_RInvoice_ID, Cur_InvoiceLine.C_OrderLine_ID, Cur_InvoiceLine.M_InoutLine_ID, Cur_InvoiceLine.Line,
gorkaion@7647
   714
               '*R*: ' || Cur_InvoiceLine.Description, Cur_InvoiceLine.M_Product_ID, Cur_InvoiceLine.QtyInvoiced * -1, Cur_InvoiceLine.PriceList,
gorkaion@7647
   715
              Cur_InvoiceLine.PriceActual, Cur_InvoiceLine.LineNetAmt * -1, Cur_InvoiceLine.C_Charge_ID, Cur_InvoiceLine.ChargeAmt * -1,
victor@15865
   716
              Cur_InvoiceLine.C_UOM_ID, Cur_InvoiceLine.C_Tax_ID, Cur_InvoiceLine.PriceStd, 
mikel@17453
   717
              Cur_InvoiceLine.Financial_Invoice_Line, Cur_InvoiceLine.Account_ID,Cur_InvoiceLine.Taxbaseamt * -1,
eduardo@18445
   718
              Cur_InvoiceLine.gross_unit_price, Cur_InvoiceLine.line_gross_amount * -1,
eduardo@18854
   719
              Cur_InvoiceLine.isdeferred, Cur_InvoiceLine.defplantype, Cur_InvoiceLine.periodnumber, Cur_InvoiceLine.c_period_id,
eduardo@18854
   720
              Cur_InvoiceLine.c_bpartner_id, Cur_InvoiceLine.c_project_id, Cur_InvoiceLine.c_projectline_id, Cur_InvoiceLine.a_asset_id,
atul@23871
   721
              Cur_InvoiceLine.user1_id, Cur_InvoiceLine.user2_id, Cur_InvoiceLine.C_CostCenter_ID
gorkaion@7647
   722
            );
gorkaion@7647
   723
          INSERT INTO M_MATCHINV
gorkaion@7647
   724
            (M_MATCHINV_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY,
gorkaion@7647
   725
            M_INOUTLINE_ID, C_INVOICELINE_ID, M_PRODUCT_ID, DATETRX, QTY, PROCESSING, PROCESSED, POSTED)
david@7191
   726
            SELECT
gorkaion@7647
   727
              get_uuid(), AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, now(), v_UpdatedBy, now(), v_UpdatedBy,
david@7195
   728
              M_INOUTLINE_ID, v_NextNo, M_PRODUCT_ID, DATETRX, -QTY, 'N', 'Y', 'N'
david@7191
   729
            FROM M_MATCHINV
david@7197
   730
            WHERE C_INVOICELINE_ID = Cur_InvoiceLine.C_InvoiceLine_ID;
gorkaion@7647
   731
          /* OrderLine.qtyInvoiced is updated in c_invoicePost
gorkaion@7647
   732
          UPDATE C_OrderLine
gorkaion@7647
   733
          SET QtyInvoiced = QtyInvoiced - Cur_InvoiceLine.QtyInvoiced,
gorkaion@7647
   734
              Updated = now(),
gorkaion@7647
   735
              UpdatedBy=v_UpdatedBy
gorkaion@7647
   736
          WHERE C_OrderLine_ID=Cur_InvoiceLine.C_OrderLine_ID; */
adrianromero@12247
   737
adrianromero@12247
   738
          -- Create Reversal Accounting Dimensions
adrianromero@12247
   739
          FOR Cur_InvoiceLineAcctDim IN
adrianromero@12247
   740
          (SELECT *
adrianromero@12247
   741
           FROM C_INVOICELINE_ACCTDIMENSION
adrianromero@12247
   742
           WHERE C_InvoiceLine_ID=Cur_InvoiceLine.C_InvoiceLine_ID)
adrianromero@12247
   743
            LOOP
adrianromero@12247
   744
                    
adrianromero@12247
   745
            INSERT INTO C_INVOICELINE_ACCTDIMENSION(
adrianromero@12247
   746
            c_invoiceline_acctdimension_id, ad_client_id, ad_org_id, isactive, created, createdby, updated, updatedby, c_invoiceline_id, 
eduardo@18972
   747
            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
   748
            values(
adrianromero@12247
   749
            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
   750
            Cur_InvoiceLineAcctDim.amt * -1, Cur_InvoiceLineAcctDim.c_project_id, Cur_InvoiceLineAcctDim.c_campaign_id, Cur_InvoiceLineAcctDim.user1_id, Cur_InvoiceLineAcctDim.user2_id, 
eduardo@18972
   751
            Cur_InvoiceLineAcctDim.c_costcenter_id, Cur_InvoiceLineAcctDim.c_activity_id, Cur_InvoiceLineAcctDim.c_bpartner_id, Cur_InvoiceLineAcctDim.m_product_id);
adrianromero@12247
   752
adrianromero@12247
   753
            END LOOP; -- Create Reversal Accounting Dimensions
adrianromero@12247
   754
asier@18354
   755
					-- Add promotions
asier@18354
   756
					FOR Cur_Offer IN 
asier@18354
   757
						(SELECT *
asier@18354
   758
						 FROM C_INVOICELINE_OFFER
asier@18354
   759
						 WHERE c_InvoiceLine_ID = Cur_InvoiceLine.c_InvoiceLine_ID
asier@18354
   760
						) LOOP
asier@18354
   761
						INSERT INTO C_INVOICELINE_OFFER
asier@18354
   762
						(c_invoiceline_offer_id, ad_client_id, ad_org_id,                         
asier@18354
   763
						 isactive, createdby, updatedby,           
asier@18354
   764
						 c_invoiceline_id, line, m_offer_id,          
asier@18354
   765
						 priceoffer, priceoffergross, amtoffer, 
asier@18354
   766
						 totalamt, displayedtotalamt)
asier@18354
   767
						 values
asier@18354
   768
						(get_uuid(), Cur_Offer.AD_Client_ID, Cur_Offer.AD_Org_ID,
asier@18354
   769
						 'Y', v_UpdatedBy, v_UpdatedBy,
asier@18354
   770
						 v_NextNo, Cur_Offer.line, Cur_Offer.m_offer_id,
asier@18354
   771
						 Cur_Offer.priceoffer, Cur_Offer.priceoffergross, Cur_Offer.amtoffer,
asier@18354
   772
						 Cur_Offer.totalamt, Cur_Offer.displayedtotalamt);
asier@18354
   773
					END LOOP;
gorkaion@7647
   774
        END LOOP; -- Create Reversal Invoice Lines
ioritz@16017
   775
ioritz@16017
   776
        -- Check if there is any manually added tax
ioritz@16017
   777
        FOR Cur_InvoiceTax IN
ioritz@16017
   778
          (SELECT c_tax_id, ad_client_id, ad_org_id, isactive,
ioritz@16017
   779
            taxbaseamt, taxamt, recalculate
ioritz@16017
   780
          FROM c_invoicetax
ioritz@16017
   781
          WHERE c_invoice_id = v_Record_ID
ioritz@16017
   782
          MINUS
ioritz@16017
   783
          SELECT c_tax_id, ad_client_id, ad_org_id, isactive,
ioritz@16017
   784
            -taxbaseamt, -taxamt, recalculate
ioritz@16017
   785
          FROM c_invoicetax
ioritz@16017
   786
          WHERE c_invoice_id = v_RInvoice_ID)
ioritz@16017
   787
        LOOP
ioritz@16017
   788
          SELECT MAX(line) + 10 INTO v_LineMax FROM c_invoicetax WHERE c_invoice_id = v_RInvoice_ID;
ioritz@16017
   789
          INSERT INTO c_invoicetax(c_tax_id, c_invoice_id, ad_client_id, ad_org_id, isactive, created, createdby, updated, updatedby,
ioritz@16017
   790
            taxbaseamt, taxamt, line, c_invoicetax_id, recalculate)
ioritz@16017
   791
          VALUES(Cur_InvoiceTax.c_tax_id, v_RInvoice_ID, Cur_InvoiceTax.ad_client_id, Cur_InvoiceTax.ad_org_id, Cur_InvoiceTax.isactive,
ioritz@16017
   792
            now(), v_UpdatedBy, now(), v_UpdatedBy, -Cur_InvoiceTax.taxbaseamt, -Cur_InvoiceTax.taxamt, v_LineMax,
ioritz@16017
   793
            get_uuid(), Cur_InvoiceTax.recalculate);
ioritz@16017
   794
        END LOOP;
ioritz@16017
   795
        
gorkaion@7647
   796
        -- Close Invoice
gorkaion@7647
   797
        UPDATE C_INVOICE
gorkaion@7647
   798
        SET DocStatus='VO', -- it IS reversed
gorkaion@239
   799
            Description=COALESCE(TO_CHAR(Description), '') || ' (*R* -> ' || v_RDocumentNo || ')',
carlos@0
   800
            DocAction='--',
carlos@0
   801
            Processed='Y',
antonio@735
   802
            Updated=now()
gorkaion@7647
   803
        WHERE C_Invoice_ID=v_Record_ID;
mikel@19131
   804
        -- Update reversal invoice dates
mikel@19131
   805
        IF (v_voiddate_inv IS NOT NULL) THEN
mikel@19131
   806
          UPDATE C_INVOICE SET DateInvoiced = v_voiddate_inv WHERE C_Invoice_ID=v_RInvoice_ID;
mikel@19131
   807
        END IF;
mikel@19131
   808
        IF (v_voiddate_acct IS NOT NULL) THEN
mikel@19131
   809
          UPDATE C_INVOICE SET DateAcct = v_voiddate_acct WHERE C_Invoice_ID=v_RInvoice_ID;
mikel@19131
   810
        END IF;
sandra@25543
   811
        IF (v_prepaymentamt !=0) THEN
sandra@25543
   812
          UPDATE C_INVOICE SET prepaymentamt = v_prepaymentamt WHERE C_Invoice_ID=v_RInvoice_ID;
sandra@25543
   813
        END IF;
gorkaion@7647
   814
        -- Post Reversal
gorkaion@7647
   815
        C_INVOICE_POST(NULL, v_RInvoice_ID) ;
gorkaion@7647
   816
        -- Reversal Transaction is closed
gorkaion@7647
   817
        UPDATE C_INVOICE
david@15389
   818
        SET DocStatus='VO', -- the reversal transaction (issue 18633) (rolledback in issue 19541)
carlos@0
   819
            DocAction='--',
carlos@0
   820
            Processed='Y'
gorkaion@7647
   821
        WHERE C_Invoice_ID=v_RInvoice_ID;
gorkaion@7647
   822
        -- If Payments from both invoices are pending, create a new settlement and cancel them
gorkaion@7647
   823
        SELECT COUNT(*) INTO v_count
gorkaion@7647
   824
        FROM C_DEBT_PAYMENT dp
gorkaion@7647
   825
        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
   826
          AND(dp.C_Invoice_ID=v_Record_ID
gorkaion@7647
   827
          OR dp.C_Invoice_ID=v_RInvoice_ID) ;
gorkaion@7647
   828
        -- To cancel, the sum of amounts should be 0
gorkaion@7647
   829
        IF (v_count=0) THEN
gorkaion@7647
   830
          SELECT SUM(AMOUNT) INTO v_count
carlos@0
   831
          FROM C_DEBT_PAYMENT dp
gorkaion@7647
   832
          WHERE dp.C_Invoice_ID=v_Record_ID
gorkaion@7647
   833
            OR dp.C_Invoice_ID=v_RInvoice_ID;
gorkaion@7647
   834
          IF (v_count=0) THEN
gorkaion@7647
   835
            v_SettlementDocType_ID:=Ad_Get_Doctype(v_Client_ID, v_Org_ID, TO_CHAR('STT')) ;
gorkaion@7647
   836
            v_settlementID := get_uuid();
gorkaion@7647
   837
            Ad_Sequence_Doctype(v_SettlementDocType_ID, v_Record_ID, 'Y', v_SDocumentNo) ;
gorkaion@7647
   838
            IF (v_SDocumentNo IS NULL) THEN
gorkaion@7647
   839
              Ad_Sequence_Doc('DocumentNo_C_Settlement', v_Client_ID, 'Y', v_SDocumentNo) ;
gorkaion@7647
   840
            END IF;
gorkaion@7647
   841
            INSERT
gorkaion@7647
   842
            INTO C_SETTLEMENT
gorkaion@7647
   843
              (
gorkaion@7647
   844
                C_SETTLEMENT_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
gorkaion@7647
   845
                CREATED, CREATEDBY, UPDATED, UPDATEDBY,
gorkaion@7647
   846
                DOCUMENTNO, DATETRX, DATEACCT, SETTLEMENTTYPE,
gorkaion@7647
   847
                C_DOCTYPE_ID, PROCESSING, PROCESSED, POSTED,
gorkaion@7647
   848
                C_CURRENCY_ID, C_PROJECT_ID, C_CAMPAIGN_ID, C_ACTIVITY_ID,
gorkaion@7647
   849
                USER1_ID, USER2_ID, CREATEFROM, ISGENERATED
gorkaion@7647
   850
              )
carlos@0
   851
              SELECT v_settlementID, AD_Client_ID, AD_Org_ID, 'Y',
harikrishnan@7209
   852
                now(), v_UpdatedBy, now(), v_UpdatedBy,
antonio@735
   853
                '*RE*'||v_SDocumentNo, TRUNC(now()), TRUNC(now()), 'C',
carlos@0
   854
                v_SettlementDocType_ID, 'N', 'N', 'N',
carlos@0
   855
                C_Currency_ID, C_PROJECT_ID, C_CAMPAIGN_ID, C_ACTIVITY_ID,
carlos@0
   856
                USER1_ID, USER2_ID, 'N', 'Y'
carlos@0
   857
              FROM C_INVOICE
carlos@0
   858
              WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
   859
            UPDATE C_DEBT_PAYMENT
gorkaion@7647
   860
            SET C_Settlement_Cancel_id=v_settlementID,
antonio@735
   861
                UPDATED=now(),
carlos@0
   862
                UPDATEDBY=v_UpdatedBy
gorkaion@7647
   863
            WHERE C_DEBT_PAYMENT.C_Invoice_ID=v_Record_ID
gorkaion@7647
   864
              OR C_DEBT_PAYMENT.C_Invoice_ID=v_RInvoice_ID;
gorkaion@7647
   865
            C_SETTLEMENT_POST(NULL, v_settlementID) ;
gorkaion@7647
   866
          END IF;
gorkaion@7647
   867
        END IF;
gorkaion@7647
   868
        END_PROCESSING:=TRUE;
gorkaion@7647
   869
      END IF;
gorkaion@7647
   870
    END; -- FOR COMMIT
gorkaion@7647
   871
  END IF;--FINISH_PROCESS
gorkaion@7647
   872
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
   873
    /**************************************************************************
gorkaion@7647
   874
     * Credit Multiplier
gorkaion@7647
   875
     *************************************************************************/
gorkaion@7647
   876
    DECLARE
gorkaion@7647
   877
      v_DocBaseType C_DOCTYPE.DocBaseType%TYPE;
mikel@11116
   878
      v_DocTypeIsSOtrx C_DOCTYPE.IsSOtrx%TYPE;
gorkaion@7647
   879
    BEGIN
gorkaion@7647
   880
      -- Is it a Credit Memo?
mikel@11116
   881
      SELECT DocBaseType, IsReversal, issotrx INTO v_DocBaseType, v_isReversal, v_DocTypeIsSOtrx
gorkaion@7647
   882
      FROM C_DOCTYPE
gorkaion@7647
   883
      WHERE C_DocType_ID=v_DocType_ID;
mikel@11116
   884
      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
   885
        v_Multiplier:=-1;
gorkaion@7647
   886
      END IF;
gorkaion@7647
   887
    END;
gorkaion@7647
   888
  END IF;--FINISH_PROCESS
gorkaion@7647
   889
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
   890
    /************************************************************************
gorkaion@7647
   891
     * Actions allowed: Reactivate
gorkaion@7647
   892
     * Modified by Jon Alegria
gorkaion@7647
   893
     */
gorkaion@7647
   894
    IF (v_DocAction='RE') THEN
gorkaion@7647
   895
      IF (v_DocStatus<>'CO') THEN
gorkaion@7647
   896
        RAISE_APPLICATION_ERROR(-20000, '@NotCompletedInvoice@');
gorkaion@7647
   897
      END IF;
gorkaion@7647
   898
      IF (v_Posted='Y') THEN
gorkaion@7647
   899
        RAISE_APPLICATION_ERROR(-20000, '@InvoiceDocumentPosted@');
gorkaion@7647
   900
      END IF;
gorkaion@7647
   901
      SELECT COUNT(*), MAX(C_DEBT_PAYMENT_ID)
gorkaion@7647
   902
        INTO v_Count, v_Debtpayment_ID
gorkaion@7647
   903
      FROM C_DEBT_PAYMENT
gorkaion@7647
   904
      WHERE C_DEBT_PAYMENT.C_Invoice_ID=v_Record_ID
gorkaion@7647
   905
        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
   906
        AND C_ORDER_ID IS NULL;
gorkaion@7647
   907
      IF (v_Count<>0) THEN
gorkaion@7647
   908
        --Added by P.Sarobe. New messages
gorkaion@7647
   909
        SELECT c_Bankstatementline_Id, c_cashline_id, c_settlement_cancel_id, ispaid, cancel_processed
gorkaion@7647
   910
          INTO v_Bankstatementline_ID, v_CashLine_ID, v_Settlement_Cancel_ID, v_ispaid, v_Cancel_Processed
gorkaion@7647
   911
        FROM C_DEBT_PAYMENT
gorkaion@7647
   912
        WHERE C_Debt_Payment_ID = v_Debtpayment_ID;
gorkaion@7647
   913
        IF (v_Bankstatementline_ID IS NOT NULL) THEN
gorkaion@7647
   914
          SELECT C_BANKSTATEMENT.NAME, C_BANKSTATEMENT.STATEMENTDATE
gorkaion@7647
   915
            INTO v_nameBankstatement, v_dateBankstatement
gorkaion@7647
   916
          FROM C_BANKSTATEMENT, C_BANKSTATEMENTLINE
gorkaion@7647
   917
          WHERE C_BANKSTATEMENT.C_BANKSTATEMENT_ID = C_BANKSTATEMENTLINE.C_BANKSTATEMENT_ID
gorkaion@7647
   918
            AND C_BANKSTATEMENTLINE.C_BANKSTATEMENTLINE_ID = v_Bankstatementline_ID;
gorkaion@7647
   919
          RAISE_APPLICATION_ERROR(-20000, '@ManagedDebtPaymentInvoiceBank@'||v_nameBankstatement||' '||'@Bydate@'||v_dateBankstatement) ;
gorkaion@7647
   920
        END IF;
gorkaion@7647
   921
        IF (v_CashLine_ID IS NOT NULL) THEN
gorkaion@7647
   922
          SELECT C_CASH.NAME, C_CASH.STATEMENTDATE
gorkaion@7647
   923
            INTO v_nameCash, v_dateCash
gorkaion@7647
   924
          FROM C_CASH, C_CASHLINE
gorkaion@7647
   925
          WHERE C_CASH.C_CASH_ID = C_CASHLINE.C_CASH_ID
gorkaion@7647
   926
            AND C_CASHLINE.C_CASHLINE_ID = v_CashLine_ID;
gorkaion@7647
   927
          RAISE_APPLICATION_ERROR(-20000, '@ManagedDebtPaymentInvoiceCash@'||v_nameCash||' '||'@Bydate@'||v_dateCash) ;
gorkaion@7647
   928
        END IF;
gorkaion@7647
   929
        IF (v_Cancel_Processed='Y' AND v_ispaid='N') THEN
gorkaion@7647
   930
          SELECT documentno, datetrx
gorkaion@7647
   931
            INTO v_documentno_Settlement, v_dateSettlement
gorkaion@7647
   932
          FROM C_SETTLEMENT
gorkaion@7647
   933
          WHERE C_SETTLEMENT_ID = v_Settlement_Cancel_ID;
gorkaion@7647
   934
          RAISE_APPLICATION_ERROR(-20000, '@ManagedDebtPaymentOrderCancel@'||v_documentno_Settlement||' '||'@Bydate@'||v_dateSettlement) ;
gorkaion@7647
   935
        END IF;
gorkaion@7647
   936
      END IF;
gorkaion@7647
   937
      SELECT COUNT(*) INTO v_Count
gorkaion@7647
   938
      FROM C_DP_MANAGEMENTLINE ml,
gorkaion@7647
   939
           C_DP_MANAGEMENT m,
gorkaion@7647
   940
           C_DEBT_PAYMENT dp
gorkaion@7647
   941
      WHERE ml.C_DP_Management_ID=m.C_DP_Management_ID
gorkaion@7647
   942
        AND ml.C_Debt_Payment_ID=dp.C_Debt_Payment_ID
gorkaion@7647
   943
        AND dp.C_Invoice_ID=v_Record_ID
gorkaion@7647
   944
        AND m.processed='Y';
gorkaion@7647
   945
      IF (v_Count!=0) THEN
gorkaion@7647
   946
        RAISE_APPLICATION_ERROR(-20000, '@DPInvoiceManaged@');
gorkaion@7647
   947
      END IF;
gorkaion@7647
   948
      -- Pending undo not Stocked BOM's
gorkaion@7647
   949
      -- Undo BP Statictis
gorkaion@7647
   950
      --Undo first sale
gorkaion@7647
   951
      SELECT MIN(DateAcct) INTO v_FirstSales
gorkaion@7647
   952
      FROM C_INVOICE
gorkaion@7647
   953
      WHERE C_Invoice_ID<>v_Record_ID
gorkaion@7647
   954
        AND C_BPartner_ID=v_BPartner_ID;
gorkaion@7647
   955
      UPDATE C_BPARTNER  SET FirstSale=v_FirstSales  WHERE C_BPartner_ID=v_BPartner_ID;
gorkaion@7647
   956
      -- Undo Last contact
gorkaion@7647
   957
      FOR Cur_LastContact IN
gorkaion@7647
   958
        (SELECT Updated, DocumentNo, Ad_User_ID
gorkaion@7647
   959
         FROM C_INVOICE
gorkaion@7647
   960
         WHERE C_Invoice_ID<>v_Record_ID
gorkaion@7647
   961
           AND Ad_User_ID=v_BPartner_User_ID
gorkaion@7647
   962
         ORDER BY Updated DESC
gorkaion@7647
   963
        )
gorkaion@7647
   964
      LOOP
gorkaion@7647
   965
        UPDATE AD_USER
gorkaion@7647
   966
        SET LastContact=Cur_LastContact.Updated,
gorkaion@7647
   967
            LastResult=Cur_LastContact.DocumentNo
gorkaion@7647
   968
        WHERE AD_User_ID=Cur_LastContact.Ad_User_ID;
gorkaion@7647
   969
        EXIT;
gorkaion@7647
   970
      END LOOP;
gorkaion@7647
   971
      IF (v_IsSOTrx='Y') THEN
gorkaion@7647
   972
        -- Undo revenue and credit limit
javier@14949
   973
        --The next lines (3) have been commented due to the issue 19198
javier@14949
   974
        --UPDATE C_BPARTNER
javier@14949
   975
        --SET ActualLifeTimeValue=ActualLifeTimeValue -(v_Multiplier *  C_Base_Convert(v_GrandTotal, v_Currency_ID, v_Client_ID, v_DateAcct, v_Org_ID))
javier@14949
   976
        --WHERE C_BPartner_ID=v_BPartner_ID;
gorkaion@7647
   977
        FOR Cur_ReactivateInvoiceLine IN
gorkaion@7647
   978
          (SELECT C_InvoiceLine_ID, C_Orderline_ID, M_InoutLine_ID, QtyInvoiced
gorkaion@7647
   979
           FROM C_INVOICELINE
gorkaion@7647
   980
           WHERE C_Invoice_ID=v_Record_ID
gorkaion@7647
   981
          )
gorkaion@7647
   982
        LOOP
gorkaion@7647
   983
          IF (Cur_ReactivateInvoiceLine.C_OrderLine_ID IS NOT NULL) THEN
gaurav@21626
   984
            SELECT MAX(C_INVOICE.DateInvoiced), COALESCE(sum(QtyInvoiced),0) 
gaurav@21626
   985
	    INTO v_REDateInvoiced, v_invoiceline_qtysum
gaurav@21626
   986
	    FROM C_INVOICE, C_INVOICELINE
gaurav@21626
   987
	    WHERE C_INVOICE.C_Invoice_ID=C_INVOICELINE.C_INVOICE_ID
gaurav@21626
   988
	    AND C_INVOICELINE.C_ORDERLINE_ID=Cur_ReactivateInvoiceLine.C_ORDERLINE_ID
gaurav@21626
   989
	    and C_INVOICE.docstatus='CO'
gaurav@21626
   990
	    AND C_INVOICE.C_INVOICE_ID <> v_Record_ID;
gaurav@21626
   991
	    
gaurav@21626
   992
	    UPDATE C_ORDERLINE
gaurav@21626
   993
	    SET QtyInvoiced=v_invoiceline_qtysum, 
gaurav@21626
   994
		DateInvoiced=v_REDateInvoiced,
gaurav@21626
   995
		Updated=now(),
gaurav@21626
   996
		UpdatedBy=v_UpdatedBy
gaurav@21626
   997
	    WHERE C_ORDERLINE.C_OrderLine_ID=Cur_ReactivateInvoiceLine.C_OrderLine_ID;
gorkaion@7647
   998
          END IF;
gorkaion@7647
   999
          IF (Cur_ReactivateInvoiceLine.M_InOutLine_ID IS NOT NULL) THEN
gorkaion@7647
  1000
            SELECT m.DOCSTATUS INTO v_REInOutStatus
gorkaion@7647
  1001
            FROM M_INOUT m, M_INOUTLINE ml
gorkaion@7647
  1002
            WHERE M.M_InOut_ID=ml.M_InOut_ID
gorkaion@7647
  1003
              AND ml.M_InOutLine_ID=Cur_ReactivateInvoiceLine.M_InOutLine_ID;
gorkaion@7647
  1004
            IF (v_REInOutStatus<>'RE') THEN
gorkaion@7647
  1005
              SELECT COALESCE(SUM(C_INVOICELINE.QTYINVOICED), 0) INTO v_REtotalQtyInvoiced
gorkaion@7647
  1006
              FROM C_INVOICELINE, C_INVOICE
gorkaion@7647
  1007
              WHERE C_INVOICE.C_Invoice_ID=C_INVOICELINE.C_Invoice_ID
gorkaion@7647
  1008
                AND C_INVOICE.Processed='Y'
gorkaion@7647
  1009
                AND C_INVOICELINE.M_InOutLine_ID=Cur_ReactivateInvoiceLine.M_InOutLine_ID;
gorkaion@7647
  1010
              v_REtotalQtyInvoiced:=v_REtotalQtyInvoiced - Cur_ReactivateInvoiceLine.QtyInvoiced;
gorkaion@7647
  1011
              SELECT MovementQty INTO v_REdeliveredQty
gorkaion@7647
  1012
              FROM M_INOUTLINE
gorkaion@7647
  1013
              WHERE M_InOutLine_ID=Cur_ReactivateInvoiceLine.M_InOutLine_ID;
gorkaion@7647
  1014
              UPDATE M_INOUTLINE
gorkaion@7647
  1015
              SET IsInvoiced=(
gorkaion@7647
  1016
                     CASE v_REtotalQtyInvoiced
gorkaion@7647
  1017
                        WHEN 0 THEN 'N'
gorkaion@7647
  1018
                        ELSE 'Y'
gorkaion@7647
  1019
                     END)
gorkaion@7647
  1020
              WHERE M_InOutLine_ID=Cur_ReactivateInvoiceLine.M_InOutLine_ID;
carlos@0
  1021
            END IF;
carlos@0
  1022
          END IF;
gorkaion@7647
  1023
        END LOOP;
gorkaion@7647
  1024
      ELSE
gorkaion@7647
  1025
        -- When re-activating an invoice, match invoice lines are removed (if not posted)
gorkaion@7647
  1026
        SELECT COUNT(1) INTO v_count
gorkaion@7647
  1027
        FROM FACT_ACCT
gorkaion@7647
  1028
        WHERE AD_TABLE_ID = (SELECT AD_TABLE_ID 
gorkaion@7647
  1029
                             FROM AD_TABLE
gorkaion@7647
  1030
                             WHERE UPPER(TABLENAME) LIKE 'M_MATCHPO')
gorkaion@7647
  1031
                                AND RECORD_ID IN (SELECT M_MATCHPO_ID
gorkaion@7647
  1032
                                                  FROM M_MATCHPO MP, C_INVOICE I, C_INVOICELINE IL
gorkaion@7647
  1033
                                                  WHERE I.C_INVOICE_ID=IL.C_INVOICE_ID
gorkaion@7647
  1034
                                                    AND MP.C_INVOICELINE_ID=IL.C_INVOICELINE_ID
gorkaion@7647
  1035
                                                    AND I.C_INVOICE_ID=v_Record_ID);
gorkaion@7647
  1036
        IF (v_count>0) THEN
gorkaion@7647
  1037
          RAISE_APPLICATION_ERROR(-20000, '@PostedMatchPO@');
carlos@0
  1038
        END IF;
gorkaion@7647
  1039
        DELETE FROM M_MATCHPO
gorkaion@7647
  1040
        WHERE C_InvoiceLine_ID IN (SELECT C_InvoiceLine_ID FROM C_INVOICELINE WHERE C_Invoice_ID=v_Record_ID);
gorkaion@7647
  1041
      END IF;
gorkaion@7647
  1042
      UPDATE C_INVOICE
gorkaion@7647
  1043
      SET Processed='N',
gorkaion@7647
  1044
          DocStatus='DR',
gorkaion@7647
  1045
          DocAction='CO',Updated=now(),
gorkaion@7647
  1046
          UpdatedBy=v_UpdatedBy
gorkaion@7647
  1047
      WHERE C_Invoice_Id=v_Record_ID;
gorkaion@7647
  1048
      --Delete automatically created records ...
gorkaion@7647
  1049
      DELETE FROM C_CASHLINE
gorkaion@7647
  1050
      WHERE ISGENERATED='Y'
gorkaion@7647
  1051
        AND C_DEBT_PAYMENT_ID IN
gorkaion@7647
  1052
          (SELECT C_DEBT_PAYMENT_ID
gorkaion@7647
  1053
           FROM C_DEBT_PAYMENT
gorkaion@7647
  1054
           WHERE C_INVOICE_ID=v_Record_ID)
gorkaion@7647
  1055
             AND C_CASH_ID IN (SELECT C_CASH_ID FROM C_CASH WHERE PROCESSED='N');
gorkaion@7647
  1056
      -- Updates the debt-payments of the cash, to make them not to point to the invoice
gorkaion@7647
  1057
      UPDATE C_DEBT_PAYMENT
gorkaion@7647
  1058
      SET C_INVOICE_ID=NULL
gorkaion@7647
  1059
      WHERE C_Invoice_ID=v_Record_ID
gorkaion@7647
  1060
        AND C_Order_ID IS NOT NULL;
gorkaion@7647
  1061
      DELETE FROM C_DEBT_PAYMENT
gorkaion@7647
  1062
      WHERE C_Invoice_ID=v_Record_ID
gorkaion@7647
  1063
        AND COALESCE(IsAutomaticGenerated, 'Y')='Y'
gorkaion@7647
  1064
        AND C_ORDER_ID IS NULL;
gorkaion@7647
  1065
      UPDATE C_DEBT_PAYMENT
gorkaion@7647
  1066
      SET IsValid='N',Updated=now(),
gorkaion@7647
  1067
          UpdatedBy=v_UpdatedBy
gorkaion@7647
  1068
      WHERE C_Invoice_ID=v_Record_ID
gorkaion@7647
  1069
        AND COALESCE(IsAutomaticGenerated, 'Y')='N'
gorkaion@7647
  1070
        AND C_ORDER_ID IS NULL;
gorkaion@7647
  1071
      IF (v_IsSOTrx='Y') THEN
gorkaion@7647
  1072
        C_BP_SOCREDITUSED_REFRESH(v_BPartner_ID) ;
gorkaion@7647
  1073
      END IF;
gorkaion@7647
  1074
      DELETE FROM C_INVOICELINE
gorkaion@7647
  1075
      WHERE C_INVOICE_DISCOUNT_ID IS NOT NULL
gorkaion@7647
  1076
        AND C_INVOICE_ID=v_Record_ID;
gorkaion@7647
  1077
      END_PROCESSING:=TRUE;
gorkaion@7647
  1078
    END IF;
gorkaion@7647
  1079
  END IF;--END_PROCESSING
david@20274
  1080
  -- Issue 20553. Problem with the order of the execution of the triggers.
david@20274
  1081
  -- By updating the Invoice Line again, we can assure that the Invoice Line Tax
david@20274
  1082
  -- Trigger had been executed before.
david@20274
  1083
  UPDATE C_INVOICELINE
david@20274
  1084
  SET UPDATED = now()
david@20274
  1085
  WHERE C_INVOICE_ID = v_Record_ID;
gorkaion@7647
  1086
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
  1087
    /**************************************************************************
gorkaion@7647
  1088
     * Actions allowed: COmplete, APprove
gorkaion@7647
  1089
     */
gorkaion@7647
  1090
    IF (v_DocAction='AP' OR v_DocAction='CO') THEN
gorkaion@7647
  1091
      -- Check the header belongs to a organization where transactions are posible and ready to use
gorkaion@7647
  1092
      SELECT AD_Org.IsReady, Ad_OrgType.IsTransactionsAllowed
gorkaion@7647
  1093
        INTO v_is_ready, v_is_tr_allow
gorkaion@7647
  1094
      FROM C_INVOICE, AD_Org, AD_OrgType
gorkaion@7647
  1095
      WHERE AD_Org.AD_Org_ID=C_INVOICE.AD_Org_ID
gorkaion@7647
  1096
        AND AD_Org.AD_OrgType_ID=AD_OrgType.AD_OrgType_ID
gorkaion@7647
  1097
        AND C_INVOICE.C_INVOICE_ID=v_Record_ID;
gorkaion@7647
  1098
      IF (v_is_ready='N') THEN
gorkaion@7647
  1099
        RAISE_APPLICATION_ERROR(-20000, '@OrgHeaderNotReady@');
gorkaion@7647
  1100
      END IF;
gorkaion@7647
  1101
      IF (v_is_tr_allow='N') THEN
gorkaion@7647
  1102
        RAISE_APPLICATION_ERROR(-20000, '@OrgHeaderNotTransAllowed@');
gorkaion@7647
  1103
      END IF;
gorkaion@7647
  1104
gorkaion@7647
  1105
      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
  1106
      IF (v_is_included=-1) THEN
gorkaion@7647
  1107
        RAISE_APPLICATION_ERROR(-20000, '@LinesAndHeaderDifferentLEorBU@');
gorkaion@7647
  1108
      END IF;
gorkaion@7647
  1109
gorkaion@7647
  1110
      -- Check the period control is opened (only if it is legal entity with accounting)
gorkaion@7647
  1111
      -- Gets the BU or LE of the document
gorkaion@7647
  1112
      SELECT AD_GET_DOC_LE_BU('C_INVOICE', v_Record_ID, 'C_INVOICE_ID', 'LE') INTO v_org_bule_id FROM DUAL;
gorkaion@7647
  1113
      SELECT AD_OrgType.IsAcctLegalEntity INTO v_isacctle
gorkaion@7647
  1114
      FROM AD_OrgType, AD_Org
gorkaion@7647
  1115
      WHERE AD_Org.AD_OrgType_ID = AD_OrgType.AD_OrgType_ID
gorkaion@7647
  1116
        AND AD_Org.AD_Org_ID=v_org_bule_id;
gorkaion@7647
  1117
gorkaion@7647
  1118
      IF (v_isacctle='Y') THEN
gorkaion@7647
  1119
        SELECT C_CHK_OPEN_PERIOD(v_Org_ID, v_DateAcct, NULL, v_DocTypeTarget_ID) INTO v_available_period FROM DUAL;
gorkaion@7647
  1120
        IF (v_available_period<>1) THEN
gorkaion@7647
  1121
          RAISE_APPLICATION_ERROR(-20000, '@PeriodNotAvailable@');
gorkaion@7647
  1122
        END IF;
gorkaion@7647
  1123
      END IF;
gorkaion@7647
  1124
gorkaion@7647
  1125
      SELECT COUNT(*) INTO v_count
gorkaion@7647
  1126
      FROM C_INVOICE c, C_BPARTNER bp
gorkaion@7647
  1127
      WHERE c.C_BPARTNER_ID=bp.C_BPARTNER_ID
gorkaion@7647
  1128
        AND Ad_Isorgincluded(c.AD_ORG_ID, bp.AD_ORG_ID, bp.AD_CLIENT_ID)=-1
gorkaion@7647
  1129
        AND c.C_Invoice_ID=v_Record_ID;
gorkaion@7647
  1130
      IF (v_count>0) THEN
gorkaion@7647
  1131
        RAISE_APPLICATION_ERROR(-20000, '@NotCorrectOrgBpartnerInvoice@') ;
gorkaion@7647
  1132
      END IF;
gorkaion@7647
  1133
      WHILE(v_DocType_ID<>v_DocTypeTarget_ID)
gorkaion@7647
  1134
      LOOP
carlos@0
  1135
        BEGIN
gorkaion@7647
  1136
          v_ResultStr:='UpdateDocType';
gorkaion@7647
  1137
          UPDATE C_INVOICE
gorkaion@7647
  1138
          SET C_DocType_ID=C_DocTypeTarget_ID,
gorkaion@7647
  1139
              Updated=now(),
gorkaion@7647
  1140
              UpdatedBy=v_UpdatedBy
gorkaion@7647
  1141
          WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
  1142
          v_DocType_ID:=v_DocTypeTarget_ID;
gorkaion@7647
  1143
        EXCEPTION
gorkaion@7647
  1144
          WHEN OTHERS THEN
gorkaion@7647
  1145
            v_ResultStr:='UpdateDocumentNo';
gorkaion@7647
  1146
            UPDATE C_INVOICE
gorkaion@7647
  1147
              SET DocumentNo=DocumentNo || '.'
gorkaion@7647
  1148
            WHERE C_Invoice_ID=v_Record_ID;
carlos@0
  1149
        END;
gorkaion@7647
  1150
      END LOOP;
gorkaion@7647
  1151
    ELSE
gorkaion@7647
  1152
      v_Message:='@ActionNotAllowedHere@ (I-' || v_DocAction || ')';
carlos@0
  1153
      RAISE_APPLICATION_ERROR(-20000, v_Message) ;
gorkaion@7647
  1154
      END_PROCESSING:=TRUE;
gorkaion@7647
  1155
    END IF;
gorkaion@7647
  1156
  END IF;--FINISH_PROCESS
gorkaion@7647
  1157
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
  1158
    /**************************************************************************
gorkaion@7647
  1159
     * Resolve not-stocked BOMs
gorkaion@7647
  1160
     *************************************************************************/
naiara@19828
  1161
   DECLARE
gorkaion@7647
  1162
      -- Invoice Lines with non-stocked BOMs
gorkaion@7647
  1163
      CUR_BOM_Line RECORD;
gorkaion@7647
  1164
      --
gorkaion@7647
  1165
    BEGIN
gorkaion@7647
  1166
      v_ResultStr:='ResolveBOM';
naiara@19828
  1167
      FOR CUR_BOM_Line IN
naiara@19828
  1168
        (SELECT *
naiara@19828
  1169
         FROM C_INVOICELINE l
naiara@19828
  1170
         WHERE l.C_Invoice_ID=v_Record_ID
naiara@19828
  1171
           AND l.IsActive='Y'
naiara@19828
  1172
           AND l.explode='N'
naiara@19828
  1173
           AND EXISTS
gorkaion@7647
  1174
              (SELECT *
gorkaion@7647
  1175
               FROM M_PRODUCT p
gorkaion@7647
  1176
               WHERE l.M_Product_ID=p.M_Product_ID
gorkaion@7647
  1177
                 AND p.IsBOM='Y'
gorkaion@7647
  1178
                 AND p.IsStocked='N'
gorkaion@7647
  1179
                 AND p.productType='I'
naiara@19828
  1180
               )
naiara@19828
  1181
         ORDER BY l.Line  FOR UPDATE
naiara@19828
  1182
        )
naiara@19828
  1183
      LOOP
naiara@19828
  1184
        M_INVEXPLODEBOMNOTSTOCK(null, CUR_BOM_Line.c_invoiceline_ID);
gorkaion@7647
  1185
      END LOOP; -- BOM Loop
gorkaion@7647
  1186
    END;
gorkaion@7647
  1187
  END IF;--FINISH_PROCESS
gorkaion@7647
  1188
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
asier@18341
  1189
     /**************************************************************************
asier@18341
  1190
      * Calculate promotions                                                   
asier@18341
  1191
      *************************************************************************/
asier@18341
  1192
      IF (v_DocAction = 'CO') THEN
asier@18343
  1193
         M_PROMOTION_CALCULATE('I', v_Record_ID, v_UpdatedBy);
asier@18341
  1194
      END IF;
asier@18341
  1195
gorkaion@7647
  1196
    /**************************************************************************
gorkaion@7647
  1197
     * Calculate Discounts
gorkaion@7647
  1198
     *************************************************************************/
gorkaion@7647
  1199
    v_CumDiscount:=0;
gorkaion@7647
  1200
    v_OldCumDiscount:=0;
gorkaion@7647
  1201
    v_Line:=10;
ainhoa@11807
  1202
    SELECT MAX(LINE) INTO v_InvoiceLineSeqNo
gorkaion@7647
  1203
    FROM C_INVOICELINE
gorkaion@7647
  1204
    WHERE C_INVOICE_ID=v_Record_ID;
mikel@17452
  1205
    SELECT PricePrecision INTO v_precision
mikel@17452
  1206
    FROM C_INVOICE i, C_CURRENCY c
mikel@17452
  1207
    WHERE i.C_INVOICE_ID = v_Record_ID AND i.C_CURRENCY_ID = c.C_CURRENCY_ID;
gorkaion@7647
  1208
    FOR Cur_CInvoiceDiscount IN
gorkaion@7647
  1209
      (SELECT C_INVOICE_DISCOUNT.C_INVOICE_DISCOUNT_ID, C_DISCOUNT.DISCOUNT, C_DISCOUNT.M_PRODUCT_ID, C_DISCOUNT.NAME,
eduardo@18445
  1210
           C_INVOICE_DISCOUNT.CASCADE, C_DISCOUNT.C_DISCOUNT_ID, M_PRODUCT.C_UOM_ID,
eduardo@18445
  1211
           REVPLANTYPE, ISDEFERREDREVENUE, PERIODNUMBER, DEFAULTPERIOD,
eduardo@18445
  1212
					EXPPLANTYPE, ISDEFERREDEXPENSE, PERIODNUMBER_EXP, DEFAULTPERIOD_EXP
gorkaion@7647
  1213
       FROM C_INVOICE_DISCOUNT, C_DISCOUNT, M_PRODUCT
gorkaion@7647
  1214
       WHERE C_INVOICE_DISCOUNT.C_DISCOUNT_ID=C_DISCOUNT.C_DISCOUNT_ID
gorkaion@7647
  1215
         AND C_DISCOUNT.M_PRODUCT_ID=M_PRODUCT.M_PRODUCT_ID
gorkaion@7647
  1216
         AND C_INVOICE_DISCOUNT.C_INVOICE_ID=v_Record_ID
gorkaion@7647
  1217
         AND C_INVOICE_DISCOUNT.ISACTIVE='Y'
gorkaion@7647
  1218
       ORDER BY C_INVOICE_DISCOUNT.LINE
gorkaion@7647
  1219
      )
gorkaion@7647
  1220
    LOOP
gorkaion@7647
  1221
      v_CumDiscount:=(1-v_OldCumDiscount) * Cur_CInvoiceDiscount.Discount/100;
gorkaion@7647
  1222
      v_OldCumDiscount:=v_OldCumDiscount + v_CumDiscount;
gorkaion@7647
  1223
      FOR Cur_TaxDiscount IN
mikel@17452
  1224
        (SELECT C_INVOICELINE.C_TAX_ID, SUM(C_INVOICELINE.LINENETAMT) AS LINENETAMT,
mikel@17452
  1225
                SUM(C_INVOICELINE.LINE_GROSS_AMOUNT) AS LINEGROSSAMT
gorkaion@7647
  1226
         FROM C_INVOICELINE
gorkaion@7647
  1227
         WHERE C_INVOICE_ID=v_Record_ID
gorkaion@7647
  1228
           AND C_INVOICELINE.LINENETAMT<>0
gorkaion@7647
  1229
           AND C_INVOICE_DISCOUNT_ID IS NULL
gorkaion@7647
  1230
         GROUP BY C_TAX_ID
gorkaion@7647
  1231
        )
gorkaion@7647
  1232
      LOOP
mikel@17452
  1233
        IF (v_istaxincluded = 'Y') THEN
mikel@17452
  1234
          IF (Cur_CInvoiceDiscount.CASCADE='Y') THEN
mikel@17452
  1235
            v_line_gross_amount:=(-1) * Cur_TaxDiscount.LINEGROSSAMT * v_CumDiscount;
mikel@17452
  1236
          ELSE
mikel@17452
  1237
            v_line_gross_amount:=(-1) * Cur_TaxDiscount.LINEGROSSAMT * Cur_CInvoiceDiscount.Discount/100;
mikel@17452
  1238
          END IF;
mikel@17452
  1239
          v_Discount:= C_GET_NET_PRICE_FROM_GROSS(Cur_TaxDiscount.C_TAX_ID, v_line_gross_amount, 0, v_precision, 1);
mikel@17452
  1240
          v_gross_unit_price:= v_line_gross_amount;
gorkaion@7647
  1241
        ELSE
mikel@17452
  1242
          IF (Cur_CInvoiceDiscount.CASCADE='Y') THEN
mikel@17452
  1243
            v_Discount:=(-1) * Cur_TaxDiscount.LINENETAMT * v_CumDiscount;
mikel@17452
  1244
          ELSE
mikel@17452
  1245
            v_Discount:=(-1) * Cur_TaxDiscount.LINENETAMT * Cur_CInvoiceDiscount.Discount/100;
mikel@17452
  1246
          END IF;
mikel@17452
  1247
          v_gross_unit_price:= 0;
mikel@17452
  1248
          v_line_gross_amount:= 0;
gorkaion@7647
  1249
        END IF;
eduardo@18445
  1250
        IF(Cur_CInvoiceDiscount.M_PRODUCT_ID IS NOT NULL) THEN
eduardo@18445
  1251
					IF(v_IsSOTrx = 'Y') THEN
eduardo@18445
  1252
						v_period_inv:= c_get_default_period(v_Record_ID, Cur_CInvoiceDiscount.defaultperiod);
eduardo@18445
  1253
						IF(v_period_inv IS NOT NULL AND Cur_CInvoiceDiscount.isdeferredrevenue = 'Y') THEN
eduardo@18445
  1254
							v_isdeferred_inv := Cur_CInvoiceDiscount.isdeferredrevenue;
eduardo@18445
  1255
							v_defplantype_inv := Cur_CInvoiceDiscount.revplantype;
eduardo@18445
  1256
							v_periodnumber_inv := Cur_CInvoiceDiscount.periodnumber;
eduardo@18445
  1257
					  ELSE
eduardo@18445
  1258
					  	v_period_inv := NULL;
eduardo@18445
  1259
							v_isdeferred_inv := 'N';
eduardo@18445
  1260
							v_defplantype_inv := NULL;
eduardo@18445
  1261
							v_periodnumber_inv := NULL;
eduardo@18445
  1262
						END IF;
eduardo@18445
  1263
					ELSE
eduardo@18445
  1264
						v_period_inv:= c_get_default_period(v_Record_ID, Cur_CInvoiceDiscount.defaultperiod_exp);
eduardo@18445
  1265
						IF(v_period_inv IS NOT NULL AND Cur_CInvoiceDiscount.isdeferredexpense = 'Y') THEN
eduardo@18445
  1266
							v_isdeferred_inv := Cur_CInvoiceDiscount.isdeferredexpense;
eduardo@18445
  1267
							v_defplantype_inv := Cur_CInvoiceDiscount.expplantype;
eduardo@18445
  1268
							v_periodnumber_inv := Cur_CInvoiceDiscount.periodnumber_exp;
eduardo@18445
  1269
					  ELSE
eduardo@18445
  1270
					  	v_period_inv := NULL;
eduardo@18445
  1271
							v_isdeferred_inv := 'N';
eduardo@18445
  1272
							v_defplantype_inv := NULL;
eduardo@18445
  1273
							v_periodnumber_inv := NULL;
eduardo@18445
  1274
						END IF;
eduardo@18445
  1275
					END IF;
eduardo@18445
  1276
        END IF;        
gorkaion@7647
  1277
        v_InvoiceLineSeqNo:=10 + v_InvoiceLineSeqNo;
gorkaion@7647
  1278
        v_InvoiceLine:=get_uuid();
gorkaion@7647
  1279
        INSERT INTO C_INVOICELINE
gorkaion@7647
  1280
          (
gorkaion@7647
  1281
           C_INVOICELINE_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
gorkaion@7647
  1282
           CREATED, CREATEDBY, UPDATED, UPDATEDBY,
gorkaion@7647
  1283
           C_INVOICE_ID, C_ORDERLINE_ID, M_INOUTLINE_ID, LINE,
gorkaion@7647
  1284
           DESCRIPTION, M_PRODUCT_ID, QTYINVOICED, PRICELIST,
gorkaion@7647
  1285
           PRICEACTUAL, PRICELIMIT, LINENETAMT, C_CHARGE_ID,
gorkaion@7647
  1286
           CHARGEAMT, C_UOM_ID, C_TAX_ID, S_RESOURCEASSIGNMENT_ID,
gorkaion@7647
  1287
           TAXAMT, M_ATTRIBUTESETINSTANCE_ID, ISDESCRIPTION,
mikel@17452
  1288
           QUANTITYORDER, M_PRODUCT_UOM_ID, PRICESTD,
javier@19487
  1289
           GROSS_UNIT_PRICE, TAXBASEAMT, LINE_GROSS_AMOUNT,
eduardo@18445
  1290
           ISDEFERRED, DEFPLANTYPE, PERIODNUMBER, C_PERIOD_ID
gorkaion@7647
  1291
          )
gorkaion@7647
  1292
          VALUES
gorkaion@7647
  1293
          (
gorkaion@7647
  1294
           v_InvoiceLine, v_Client_ID, v_Org_ID, 'Y',
gorkaion@7647
  1295
           now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7647
  1296
           v_Record_ID, NULL, NULL, v_InvoiceLineSeqNo,
gorkaion@7647
  1297
           Cur_CInvoiceDiscount.NAME, Cur_CInvoiceDiscount.M_PRODUCT_ID, 1, v_Discount,
gorkaion@7647
  1298
           v_Discount, v_Discount, v_Discount, NULL,
gorkaion@7647
  1299
           0, Cur_CInvoiceDiscount.C_UOM_ID, Cur_TaxDiscount.C_TAX_ID, NULL,
gorkaion@7647
  1300
           NULL, NULL, 'N' ,
mikel@17452
  1301
           NULL, NULL, v_Discount,
javier@19487
  1302
           ROUND(v_gross_unit_price, v_precision), v_Discount  ,ROUND(v_line_gross_amount, v_precision),
eduardo@18445
  1303
           v_isdeferred_inv, v_defplantype_inv, v_periodnumber_inv, v_period_inv
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
    /**************************************************************************
gorkaion@7647
  1315
     * Calculate Invoice Taxes and Totals
gorkaion@7647
  1316
     *************************************************************************/
gorkaion@7647
  1317
    DECLARE
gorkaion@7647
  1318
      Cur_Tax RECORD;
gorkaion@7647
  1319
      Cur_MultiTax RECORD;
gorkaion@7647
  1320
      xTaxBaseAmt NUMBER:=0;
gorkaion@7647
  1321
      xTaxAmt NUMBER:=0;
gorkaion@17353
  1322
      v_taxnorecalculable NUMBER:=0;
gorkaion@7647
  1323
      v_PreviousTaxAmt NUMBER:=0;
gorkaion@7647
  1324
      HeaderNotAdded BOOLEAN:=TRUE;
gorkaion@7647
  1325
      v_LineNo NUMBER:=0;
gorkaion@7647
  1326
      v_ActualBaseAmt NUMBER;
gorkaion@7647
  1327
      v_FirstLine BOOLEAN;
gorkaion@7647
  1328
      v_C_InvoiceTax_ID VARCHAR2(32);
sandra@16240
  1329
      
gorkaion@7647
  1330
    BEGIN
gorkaion@7647
  1331
      v_ResultStr:='DeleteOldTaxes';
gorkaion@7647
  1332
      DELETE FROM C_INVOICELINETAX
gorkaion@7647
  1333
      WHERE C_InvoiceLine_ID IN (SELECT C_InvoiceLine_ID from C_InvoiceLine WHERE C_Invoice_ID = v_Record_ID);
gorkaion@7647
  1334
      DELETE FROM C_INVOICETAX
gorkaion@7647
  1335
      WHERE C_Invoice_ID=v_Record_ID
gorkaion@7647
  1336
        AND Recalculate = 'Y';
sandra@16240
  1337
      -- Update line if recalculate='N'
sandra@16240
  1338
      FOR Cur_TaxMAct IN
sandra@16240
  1339
        ( SELECT C_INVOICETAX_ID FROM C_INVOICETAX
sandra@16240
  1340
          WHERE C_Invoice_ID=v_Record_ID
sandra@16240
  1341
          AND Recalculate = 'N'
sandra@16240
  1342
        )
sandra@16240
  1343
      LOOP
mikel@16241
  1344
        v_LineNo:=v_LineNo+10;
mikel@16241
  1345
        UPDATE C_INVOICETAX SET line=v_LineNo WHERE C_INVOICETAX_ID=Cur_TaxMAct.C_INVOICETAX_ID;   
mikel@16241
  1346
      END LOOP;
gorkaion@7647
  1347
      -- For all Tax Rates
gorkaion@7647
  1348
      v_ResultStr:='InsertNewTaxes';
gorkaion@7647
  1349
      FOR Cur_Tax IN
gorkaion@7647
  1350
        (SELECT l.C_InvoiceLine_ID, l.C_Tax_ID, i.IsTaxIncluded,
eduardo@6017
  1351
              COALESCE(SUM(l.LineNetAmt),0) + COALESCE(SUM(l.ChargeAmt), 0) AS LineNetAmt,
eduardo@6017
  1352
              COALESCE(SUM(l.TaxBaseAmt), 0) + COALESCE(SUM(l.ChargeAmt), 0) AS TaxBaseAmt,
carlos@0
  1353
              COALESCE(SUM(i.ChargeAmt), 0) AS HeaderNet,
gorkaion@17350
  1354
              t.Rate, t.IsSummary, c.StdPrecision, t.Cascade, t.BaseAmount,
gorkaion@17350
  1355
              l.line_gross_amount
gorkaion@7647
  1356
         FROM C_INVOICE i, C_INVOICELINE l, C_TAX t, C_CURRENCY c
gorkaion@7647
  1357
         WHERE i.C_Invoice_ID=l.C_Invoice_ID
gorkaion@7647
  1358
           AND i.C_Invoice_ID=v_Record_ID -- Parameter
gorkaion@7647
  1359
           AND l.C_Tax_ID=t.C_Tax_ID
gorkaion@7647
  1360
           AND i.C_Currency_ID=c.C_Currency_ID
gorkaion@7647
  1361
         GROUP BY l.C_InvoiceLine_ID, l.C_Tax_ID,i.IsTaxIncluded, t.Rate, t.IsSummary,
gorkaion@17350
  1362
              c.StdPrecision, t.Cascade, t.BaseAmount, l.line_gross_amount
gorkaion@7647
  1363
         ORDER BY 4 DESC
gorkaion@7647
  1364
        )
gorkaion@7647
  1365
      LOOP
gorkaion@7647
  1366
        xTaxBaseAmt:=Cur_Tax.LineNetAmt;
gorkaion@7647
  1367
        v_TotalLines:=v_TotalLines + xTaxBaseAmt; -- w/o Header Freight/Charge
gorkaion@7647
  1368
        IF (HeaderNotAdded) THEN -- add header to first
gorkaion@7647
  1369
          HeaderNotAdded:=FALSE;
gorkaion@7647
  1370
          xTaxBaseAmt:=xTaxBaseAmt + Cur_Tax.HeaderNet;
gorkaion@7647
  1371
        END IF;
gorkaion@7647
  1372
        C_INVOICELINETAX_INSERT(v_Org_ID, v_Record_ID, Cur_Tax.C_InvoiceLine_ID, v_UpdatedBy, Cur_Tax.C_Tax_ID, Cur_Tax.C_Tax_ID, Cur_Tax.LineNetAmt, Cur_Tax.TaxBaseAmt, Cur_Tax.StdPrecision);
gorkaion@17350
  1373
        IF (v_istaxincluded = 'Y') THEN
gorkaion@17350
  1374
          C_INVOICELINETAX_ROUNDING(cur_tax.c_invoiceline_id, cur_tax.line_gross_amount, cur_tax.linenetamt);
gorkaion@17350
  1375
        END IF;
gorkaion@17350
  1376
gorkaion@7647
  1377
      END LOOP; -- Insert New Taxes
gorkaion@7647
  1378
      -- Update Header
sivaraman@7819
  1379
      IF (v_IsSOTrx = 'N') THEN
sivaraman@7819
  1380
        SELECT c_getwithholding(v_record_id) INTO withholdamount FROM dual;
sivaraman@7819
  1381
      ELSE
sivaraman@7819
  1382
        withholdamount:=0;
sivaraman@7819
  1383
      END IF;
staff@15394
  1384
gorkaion@17350
  1385
      IF (v_istaxincluded = 'Y') THEN
gorkaion@17353
  1386
        SELECT COALESCE(SUM(TaxAmt),0) INTO v_TaxNoRecalculable
gorkaion@17353
  1387
        FROM C_INVOICETAX
gorkaion@17353
  1388
        WHERE C_Invoice_ID = v_Record_ID
gorkaion@17353
  1389
          AND Recalculate = 'N';
gorkaion@17350
  1390
        SELECT COALESCE(SUM(line_gross_amount), 0) INTO v_grandtotal
gorkaion@17350
  1391
        FROM c_invoiceline
gorkaion@17350
  1392
        WHERE c_invoice_id = v_record_id;
gorkaion@17351
  1393
        v_grandtotal := v_grandtotal + v_taxnorecalculable;
gorkaion@17350
  1394
      ELSE
gorkaion@17350
  1395
        SELECT COALESCE(SUM(TAXAMT), 0) INTO v_GrandTotal
gorkaion@17350
  1396
        FROM C_INVOICETAX
gorkaion@17350
  1397
        WHERE C_INVOICE_ID = v_Record_ID;
gorkaion@17350
  1398
        v_GrandTotal:=v_GrandTotal+ v_TotalLines;
gorkaion@17350
  1399
      END IF;
gorkaion@7647
  1400
      UPDATE C_INVOICE
gorkaion@7647
  1401
      SET TotalLines=v_TotalLines,
gorkaion@7647
  1402
          GrandTotal=v_GrandTotal,
gorkaion@7647
  1403
          withholdingamount = withholdamount
gorkaion@7647
  1404
      WHERE C_Invoice_ID=v_Record_ID;
priya@17917
  1405
      IF (v_istaxincluded = 'Y') THEN
priya@17917
  1406
        C_INVOICETAX_ROUNDING(v_Record_ID, v_GrandTotal - v_taxnorecalculable, v_TotalLines);
priya@17917
  1407
      END IF;
gorkaion@7647
  1408
      DBMS_OUTPUT.PUT_LINE('withholdingamount=' || withholdamount);
gorkaion@7647
  1409
      DBMS_OUTPUT.PUT_LINE('GrandTotal=' || v_GrandTotal) ;
gorkaion@7647
  1410
    END; -- Calculate Tax and Totals
gorkaion@7647
  1411
    -- Synchronize Client/Org Ownership
gorkaion@7647
  1412
    v_ResultStr:='SyncOwnershipClient';
gorkaion@7647
  1413
    UPDATE C_INVOICELINE
gorkaion@7647
  1414
    SET AD_Client_ID=v_Client_ID
gorkaion@7647
  1415
    WHERE C_Invoice_ID=v_Record_ID
gorkaion@7647
  1416
      AND AD_Client_ID<>v_Client_ID;
pandeeswari@18807
  1417
gorkaion@7647
  1418
  END IF;--FINISH_PROCESS
gorkaion@7647
  1419
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
  1420
    /**************************************************************************
gorkaion@7647
  1421
     * Update BP Statistics
gorkaion@7647
  1422
     *************************************************************************/
gorkaion@7647
  1423
    v_ResultStr:='Updating BPartners';
gorkaion@7647
  1424
    -- First Sale
gorkaion@7647
  1425
    UPDATE C_BPARTNER
gorkaion@7647
  1426
    SET FirstSale=v_DateAcct
gorkaion@7647
  1427
    WHERE C_BPartner_ID=v_BPartner_ID
gorkaion@7647
  1428
      AND FirstSale IS NULL;
gorkaion@7647
  1429
    -- Last Contact, Result
gorkaion@7647
  1430
    UPDATE AD_USER
gorkaion@7647
  1431
    SET LastContact=now(),
gorkaion@7647
  1432
        LastResult=v_DocumentNo
gorkaion@7647
  1433
    WHERE AD_User_ID=v_BPartner_User_ID;
gorkaion@7647
  1434
    -- Update total revenue and credit limit
gorkaion@7647
  1435
    -- It is reversed in C_Allocation_Trg
javier@14949
  1436
    --The next lines (5) have been commented due to the issue 19198
javier@14949
  1437
    --IF (v_IsSOTrx='Y') THEN
javier@14949
  1438
      --UPDATE C_BPARTNER
javier@14949
  1439
      --SET ActualLifeTimeValue=ActualLifeTimeValue +(v_Multiplier *  C_Base_Convert(v_GrandTotal, v_Currency_ID, v_Client_ID, v_DateAcct, v_Org_ID))
javier@14949
  1440
      --WHERE C_BPartner_ID=v_BPartner_ID;
javier@14949
  1441
    --END IF;
gorkaion@7647
  1442
  END IF;--FINISH_PROCESS
gorkaion@7647
  1443
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
  1444
    /**************************************************************************
gorkaion@7647
  1445
     * Matching
gorkaion@7647
  1446
     *************************************************************************/
gorkaion@7647
  1447
    v_ResultStr:='Matching';
gorkaion@7647
  1448
    IF (v_IsSOTrx='N') THEN
gorkaion@7647
  1449
      DECLARE
gorkaion@7647
  1450
        -- Invoice-Receipt Match
gorkaion@7647
  1451
        Cur_ILines_Receipt RECORD;
gorkaion@7647
  1452
        -- Invoice-PO Match
gorkaion@7647
  1453
        Cur_ILines_PO RECORD;
gorkaion@7647
  1454
        v_Qty NUMBER;
gorkaion@7647
  1455
        v_MatchInv_ID VARCHAR2(32) ;
gorkaion@7647
  1456
        v_MatchPO_ID VARCHAR2(32) ;
gorkaion@7647
  1457
      BEGIN
gorkaion@7647
  1458
        v_ResultStr:='MatchInv-Receipt';
gorkaion@7647
  1459
        FOR Cur_ILines_Receipt IN
gorkaion@7647
  1460
          (SELECT il.AD_Client_ID, il.AD_Org_ID, il.C_InvoiceLine_ID, ml.M_InOutLine_ID,
gorkaion@7647
  1461
               ml.M_Product_ID, ml.MovementQty, il.QtyInvoiced, i.DateAcct
gorkaion@7647
  1462
           FROM C_INVOICELINE il
gorkaion@7647
  1463
                INNER JOIN M_INOUTLINE ml ON (il.M_InOutLine_ID=ml.M_InOutLine_ID)
eduardo@24946
  1464
                INNER JOIN M_INOUT m ON (ml.M_InOut_ID=m.M_InOut_ID)
gorkaion@7647
  1465
                INNER JOIN C_INVOICE i ON(il.C_Invoice_ID=i.C_Invoice_ID)
gorkaion@7647
  1466
           WHERE il.M_Product_ID=ml.M_Product_ID
eduardo@24946
  1467
             AND M.Processed = 'Y'
gorkaion@7647
  1468
             AND il.C_Invoice_ID=v_Record_ID
gorkaion@7647
  1469
           )
gorkaion@7647
  1470
        LOOP
gorkaion@7647
  1471
          IF (Cur_ILines_Receipt.M_INOUTLINE_ID IS NOT NULL) THEN
gorkaion@7647
  1472
            SELECT COUNT(1) INTO v_Count
gorkaion@7647
  1473
            FROM M_MATCHINV
gorkaion@7647
  1474
            WHERE C_INVOICELINE_ID=Cur_ILines_Receipt.C_InvoiceLine_ID
gorkaion@7647
  1475
              AND M_INOUTLINE_ID=Cur_ILines_Receipt.M_INOUTLINE_ID;
gorkaion@7647
  1476
            IF (v_Count=0) THEN
gorkaion@7647
  1477
              v_Qty:=Cur_ILines_Receipt.QtyInvoiced;
gorkaion@7647
  1478
              v_MatchInv_ID := get_uuid();
gorkaion@7647
  1479
              v_ResultStr:='InsertMatchInv ' || v_MatchInv_ID;
gorkaion@7647
  1480
              DBMS_OUTPUT.PUT_LINE('  M_MatchInv_ID=' || v_MatchInv_ID || ' - ' || v_Qty) ;
gorkaion@7647
  1481
              INSERT INTO M_MATCHINV
carlos@0
  1482
                (
gorkaion@7647
  1483
                 M_MatchInv_ID, AD_Client_ID, AD_Org_ID, IsActive,
gorkaion@7647
  1484
                 Created, CreatedBy, Updated, UpdatedBy,
gorkaion@7647
  1485
                 M_InOutLine_ID, C_InvoiceLine_ID, M_Product_ID, DateTrx,
gorkaion@7647
  1486
                 Qty, Processing, Processed, Posted
carlos@0
  1487
                )
carlos@0
  1488
                VALUES
carlos@0
  1489
                (
gorkaion@7647
  1490
                 v_MatchInv_ID, Cur_ILines_Receipt.AD_Client_ID, Cur_ILines_Receipt.AD_Org_ID, 'Y',
gorkaion@7647
  1491
                 now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7647
  1492
                 Cur_ILines_Receipt.M_InOutLine_ID, Cur_ILines_Receipt.C_InvoiceLine_ID, Cur_ILines_Receipt.M_Product_ID, Cur_ILines_Receipt.DateAcct,
gorkaion@7647
  1493
                 v_Qty, 'N', 'Y', 'N'
gorkaion@7647
  1494
                );
gorkaion@7647
  1495
            END IF;
gorkaion@7647
  1496
          END IF;
gorkaion@7647
  1497
        END LOOP;
miguel@24752
  1498
miguel@24752
  1499
        UPDATE m_transaction
miguel@24752
  1500
        SET checkpricedifference = 'Y'
miguel@24752
  1501
        WHERE m_transaction_id in (
miguel@24851
  1502
        SELECT TRX.M_TRANSACTION_ID 
miguel@24851
  1503
        FROM C_INVOICELINE IL 
miguel@24851
  1504
          JOIN M_MATCHINV MI ON IL.C_INVOICELINE_ID = MI.C_INVOICELINE_ID
miguel@24851
  1505
          JOIN M_TRANSACTION TRX ON MI.M_INOUTLINE_ID = TRX.M_INOUTLINE_ID
miguel@24851
  1506
        WHERE TRX.ISCOSTCALCULATED = 'Y' 
miguel@24851
  1507
        AND IL.C_INVOICE_ID = v_record_id);
miguel@24752
  1508
gorkaion@7647
  1509
        v_ResultStr:='MatchInv-PO';
gorkaion@7647
  1510
        FOR Cur_ILines_PO IN
gorkaion@7647
  1511
          (SELECT il.AD_Client_ID, il.AD_Org_ID, il.C_InvoiceLine_ID, ol.C_OrderLine_ID,
gorkaion@7647
  1512
               ol.M_Product_ID, ol.C_Charge_ID, ol.QtyOrdered, il.QtyInvoiced,
gorkaion@7647
  1513
                i.DateAcct
gorkaion@7647
  1514
           FROM C_INVOICELINE il
gorkaion@7647
  1515
                INNER JOIN C_ORDERLINE ol ON (il.C_OrderLine_ID=ol.C_OrderLine_ID)
gorkaion@7647
  1516
                INNER JOIN C_INVOICE i ON (il.C_Invoice_ID=i.C_Invoice_ID)
gorkaion@7647
  1517
           WHERE (il.M_Product_ID=ol.M_Product_ID
gorkaion@7647
  1518
                  OR il.C_Charge_ID=ol.C_Charge_ID)
gorkaion@7647
  1519
             AND il.C_Invoice_ID=v_Record_ID
gorkaion@7647
  1520
          )
gorkaion@7647
  1521
        LOOP
gorkaion@7647
  1522
          -- The min qty. Modified by Ismael Ciordia
gorkaion@7647
  1523
          --v_Qty := Cur_ILines_PO.QtyOrdered;
gorkaion@7647
  1524
          --IF (ABS(Cur_ILines_PO.QtyOrdered) > ABS(Cur_ILines_PO.QtyInvoiced)) THEN
gorkaion@7647
  1525
          v_Qty:=Cur_ILines_PO.QtyInvoiced;
gorkaion@7647
  1526
          --END IF;
gorkaion@7647
  1527
          v_MatchPO_ID := get_uuid();
gorkaion@7647
  1528
          v_ResultStr:='InsertMatchPO ' || v_MatchPO_ID;
gorkaion@7647
  1529
          DBMS_OUTPUT.PUT_LINE('  M_MatchPO_ID=' || v_MatchPO_ID || ' - ' || v_Qty) ;
gorkaion@7647
  1530
          INSERT INTO M_MATCHPO
gorkaion@7647
  1531
            (
gorkaion@7647
  1532
             M_MatchPO_ID, AD_Client_ID, AD_Org_ID, IsActive,
gorkaion@7647
  1533
             Created, CreatedBy, Updated, UpdatedBy,
gorkaion@7647
  1534
             C_OrderLine_ID, M_InOutLine_ID, C_InvoiceLine_ID, M_Product_ID,
gorkaion@7647
  1535
             DateTrx, Qty, Processing, Processed,
gorkaion@7647
  1536
             Posted
gorkaion@7647
  1537
            )
gorkaion@7647
  1538
            VALUES
gorkaion@7647
  1539
            (
gorkaion@7647
  1540
             v_MatchPO_ID, Cur_ILines_PO.AD_Client_ID, Cur_ILines_PO.AD_Org_ID, 'Y',
gorkaion@7647
  1541
             now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7647
  1542
             Cur_ILines_PO.C_OrderLine_ID, NULL, Cur_ILines_PO.C_InvoiceLine_ID, Cur_ILines_PO.M_Product_ID,
gorkaion@7647
  1543
             Cur_ILines_PO.DateAcct, v_Qty, 'N', 'Y',
gorkaion@7647
  1544
             'N'
gorkaion@7647
  1545
            );
gorkaion@7647
  1546
        END LOOP;
gorkaion@7647
  1547
      END;
gorkaion@7647
  1548
    ELSE -- Actualiza las cantidades facturadas de los pedidos de venta, y las lineas de albaryn facturadas
gorkaion@7647
  1549
      DECLARE
gorkaion@7647
  1550
        CurLines RECORD;
gorkaion@7647
  1551
        p_DateInvoiced DATE;
gorkaion@7647
  1552
        v_totalQtyInvoiced NUMBER;
gorkaion@7647
  1553
        v_ODocumentNo C_ORDER.DocumentNo%TYPE;
reinaldo@25170
  1554
        v_invoiceRule C_ORDER.InvoiceRule%TYPE;
reinaldo@25170
  1555
        v_NewPendingToDeliver C_ORDERLINE.QtyDelivered%TYPE;
gorkaion@7647
  1556
        v_NewPendingToInvoice NUMBER;
gorkaion@7647
  1557
        v_deliveredQty NUMBER;
gorkaion@7647
  1558
        v_inOutStatus varchar2(60) ;
gorkaion@7647
  1559
      BEGIN
gorkaion@7647
  1560
        SELECT DateInvoiced
gorkaion@7647
  1561
        INTO p_DateInvoiced
gorkaion@7647
  1562
        FROM C_INVOICE
gorkaion@7647
  1563
        WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
  1564
        FOR CurLines IN
gorkaion@7647
  1565
          (SELECT * FROM C_INVOICELINE  WHERE C_INVOICE_ID=v_Record_ID  ORDER BY line)
gorkaion@7647
  1566
        LOOP
gorkaion@7647
  1567
          IF (CurLines.C_OrderLine_ID IS NOT NULL) THEN
gorkaion@7647
  1568
            --Check that qty pending to invoice is higher or equal to the qty being invoiced
reinaldo@25170
  1569
            SELECT o.documentno, o.invoicerule, ABS(ol.qtydelivered) - ABS(ol.qtyinvoiced + CurLines.QtyInvoiced) , ABS(ol.qtyordered) - ABS(ol.qtyinvoiced + CurLines.QtyInvoiced), p.isquantityvariable
reinaldo@25170
  1570
              INTO v_ODocumentNo, v_invoiceRule, v_NewPendingToDeliver, v_NewPendingToInvoice, v_Isquantityvariable
gorkaion@7647
  1571
            FROM c_order o, c_orderline ol
rafael@16135
  1572
            LEFT JOIN m_product p ON p.m_product_id = ol.m_product_id
gorkaion@7647
  1573
            WHERE o.c_order_id = ol.c_order_id
gorkaion@7647
  1574
              AND ol.c_orderline_id = CurLines.c_orderline_id;
reinaldo@25170
  1575
            IF (v_Isquantityvariable <> 'Y' AND v_invoiceRule = 'D' AND v_NewPendingToDeliver < 0) THEN
reinaldo@25170
  1576
              v_Message := '@NotPossibleCompleteInvoice@' || ' ' || v_DocumentNo;
reinaldo@25170
  1577
              v_Message := v_Message || ' ' || '@line@' || ' ' || CurLines.line || '. ';
reinaldo@25170
  1578
              v_Message := v_Message || '@OrderDocumentno@' || ' ' || v_ODocumentNo;
reinaldo@25170
  1579
              v_Message := v_Message || ': ' || '@QtyInvoicedHigherDelivered@' || '.';
reinaldo@25170
  1580
              RAISE_APPLICATION_ERROR(-20000, v_Message);
reinaldo@25170
  1581
            END IF;
rafael@16135
  1582
            IF (v_Isquantityvariable <> 'Y' AND v_NewPendingToInvoice <0) THEN
gorkaion@7647
  1583
              v_Message := '@NotPossibleCompleteInvoice@' || ' ' || v_DocumentNo;
gorkaion@7647
  1584
              v_Message := v_Message || ' ' || '@line@' || ' ' || CurLines.line || '. ';
gorkaion@7647
  1585
              v_Message := v_Message || '@OrderDocumentno@' || ' ' || v_ODocumentNo;
gorkaion@7647
  1586
              v_Message := v_Message || ': ' || '@QtyInvoicedHigherOrdered@' || '.';
gorkaion@7647
  1587
              RAISE_APPLICATION_ERROR(-20000, v_Message);
gorkaion@7647
  1588
            END IF;
gorkaion@7647
  1589
            UPDATE C_ORDERLINE
gorkaion@7647
  1590
            SET QtyInvoiced=QtyInvoiced + CurLines.QtyInvoiced,
gorkaion@7647
  1591
                DateInvoiced=p_DateInvoiced,
gorkaion@7647
  1592
                Updated=now(),
gorkaion@7647
  1593
                UpdatedBy=v_UpdatedBy
gorkaion@7647
  1594
            WHERE C_OrderLine_ID=CurLines.C_OrderLine_ID;
gorkaion@7647
  1595
          END IF;
gorkaion@7647
  1596
          IF (CurLines.M_InOutLine_ID IS NOT NULL) THEN
gorkaion@7647
  1597
            SELECT m.DOCSTATUS INTO v_inOutStatus
gorkaion@7647
  1598
            FROM M_INOUT m, M_INOUTLINE ml
gorkaion@7647
  1599
            WHERE M.M_InOut_ID=ml.M_InOut_ID
gorkaion@7647
  1600
              AND ml.M_InOutLine_ID=CurLines.M_InOutLine_ID;
gorkaion@7647
  1601
            IF (v_inOutStatus<>'RE') THEN
gorkaion@7647
  1602
              SELECT COALESCE(SUM(C_INVOICELINE.QTYINVOICED), 0) INTO v_totalQtyInvoiced
gorkaion@7647
  1603
              FROM C_INVOICELINE, C_INVOICE
gorkaion@7647
  1604
              WHERE C_INVOICE.C_Invoice_ID=C_INVOICELINE.C_Invoice_ID
gorkaion@7647
  1605
                AND C_INVOICE.Processed='Y'
gorkaion@7647
  1606
                AND C_INVOICELINE.M_InOutLine_ID=CurLines.M_InOutLine_ID;
gorkaion@7647
  1607
              v_totalQtyInvoiced:=v_totalQtyInvoiced + CurLines.QtyInvoiced;
gorkaion@7647
  1608
              SELECT MovementQty INTO v_deliveredQty
gorkaion@7647
  1609
              FROM M_INOUTLINE
gorkaion@7647
  1610
              WHERE M_InOutLine_ID=CurLines.M_InOutLine_ID;
gorkaion@7647
  1611
              UPDATE M_INOUTLINE
gorkaion@7647
  1612
              SET IsInvoiced=(
carlos@0
  1613
                    CASE v_totalQtyInvoiced
gorkaion@7647
  1614
                      WHEN 0 THEN 'N'
carlos@0
  1615
                      ELSE 'Y'
gorkaion@7647
  1616
                    END)
gorkaion@7647
  1617
              WHERE M_InOutLine_ID=CurLines.M_InOutLine_ID;
gorkaion@7647
  1618
            END IF;
antonio@737
  1619
          END IF;
gorkaion@7647
  1620
        END LOOP;
gorkaion@4437
  1621
      END;
gorkaion@4437
  1622
    END IF;
gorkaion@7647
  1623
  END IF;--FINISH_PROCESS
gorkaion@7647
  1624
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
  1625
    -- Modified by Ismael Ciordia
gorkaion@7647
  1626
    -- Generate C_Debt_Payment linked to this invoice
gorkaion@7647
  1627
    DECLARE
gorkaion@7647
  1628
      v_totalCash NUMBER:=0;
gorkaion@7647
  1629
      v_processed CHAR(1):='N';
gorkaion@7647
  1630
      v_debtPaymentID varchar2(32) ;
gorkaion@7647
  1631
      v_amount NUMBER;
gorkaion@7647
  1632
      v_cashBook VARCHAR2(32) ;
gorkaion@7647
  1633
      v_bankAccount VARCHAR2(32) ;
gorkaion@7647
  1634
      v_cash VARCHAR2(32) ;
gorkaion@7647
  1635
      v_IsoCode C_CURRENCY.ISO_CODE%TYPE;
gorkaion@7647
  1636
      v_CashLine VARCHAR2(32) ;
gorkaion@7647
  1637
      v_line NUMBER ;
gorkaion@7647
  1638
      v_BPartnerName C_BPARTNER.NAME%TYPE;
gorkaion@7647
  1639
      v_GenDP_Org VARCHAR2(32);
gorkaion@7648
  1640
      v_dummy VARCHAR2(2000);
gorkaion@7647
  1641
    BEGIN
gorkaion@7648
  1642
      SELECT COUNT(1) INTO v_count
gorkaion@7648
  1643
      FROM ad_preference
gorkaion@7648
  1644
      WHERE property = 'FinancialManagement'
gorkaion@7648
  1645
        AND ad_module_id <> '0';
gorkaion@7648
  1646
      IF (v_count > 1) THEN
gorkaion@7648
  1647
        v_dummy := AD_GET_PREFERENCE_VALUE('FinancialManagement', 'Y', v_client_id, v_org_id, NULL, NULL, NULL);
gorkaion@7648
  1648
      ELSIF (v_count = 0) THEN
gorkaion@7648
  1649
        v_ResultStr:='Generating C_Debt_Payment';
gorkaion@7648
  1650
        UPDATE C_DEBT_PAYMENT
gorkaion@7648
  1651
          SET C_INVOICE_ID=v_Record_ID
gorkaion@7648
  1652
        WHERE EXISTS
gorkaion@7648
  1653
              (SELECT 1
gorkaion@7648
  1654
               FROM C_ORDERLINE ol, C_INVOICELINE il
gorkaion@7648
  1655
               WHERE ol.C_ORDERLINE_ID=il.C_ORDERLINE_ID
gorkaion@7648
  1656
                 AND il.C_INVOICE_ID=v_Record_ID
gorkaion@7648
  1657
                 AND ol.C_ORDER_ID=C_DEBT_PAYMENT.C_ORDER_ID
gorkaion@7648
  1658
              )
gorkaion@7648
  1659
          AND C_INVOICE_ID IS NULL;
gorkaion@7648
  1660
        UPDATE C_DEBT_PAYMENT
gorkaion@7648
  1661
          SET IsValid='Y'
gorkaion@7648
  1662
        WHERE C_INVOICE_ID=v_Record_ID
gorkaion@7648
  1663
          AND IsValid!='Y';
gorkaion@4437
  1664
gorkaion@7648
  1665
        -- Is it a Credit Memo:4
mikel@11116
  1666
        SELECT DocBaseType, isreversal INTO v_TargetDocBaseType, v_isReversal
gorkaion@7648
  1667
        FROM C_DOCTYPE
gorkaion@7648
  1668
        WHERE C_DocType_ID=v_DocTypeTarget_ID;
mikel@11116
  1669
        IF (v_TargetDocBaseType in ('ARC','APC') or v_isReversal='Y') THEN
gorkaion@7648
  1670
          v_MultiplierARC:=-1;
gorkaion@7648
  1671
        END IF;
gorkaion@7648
  1672
gorkaion@7648
  1673
        --Sums debt payments from the order and the ones that have been inserted manually, added by ALO
gorkaion@7648
  1674
        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
  1675
        FROM C_DEBT_PAYMENT_V dp
gorkaion@7648
  1676
        WHERE C_INVOICE_ID=v_Record_ID;
gorkaion@7648
  1677
        --Insert C_Debt_Payment if GrandTotal - v_totalCash <> 0;
gorkaion@7648
  1678
        IF (v_GrandTotal<>v_totalCash) THEN
gorkaion@7648
  1679
          DECLARE
gorkaion@7648
  1680
            CUR_PAYMENTS RECORD;
gorkaion@7648
  1681
            v_plannedDate DATE;
gorkaion@7648
  1682
            v_pendingAmount NUMBER;
gorkaion@7648
  1683
            v_paymentAmount NUMBER;
gorkaion@7648
  1684
            v_GenDebt_PaymentID varchar2(32);
gorkaion@7648
  1685
            v_SettlementDocTypeID varchar2(32) ;
gorkaion@7648
  1686
            v_settlement_ID VARCHAR2(32) ;
gorkaion@7648
  1687
            v_CB_Curr VARCHAR2(32) ;
gorkaion@7648
  1688
            v_SDocument_No C_SETTLEMENT.DocumentNo%TYPE;
gorkaion@7648
  1689
          BEGIN
gorkaion@7648
  1690
            IF (v_IsSOTrx ='Y') THEN
gorkaion@7648
  1691
              v_pendingAmount:=v_GrandTotal - v_totalCash;
gorkaion@7648
  1692
            ELSE
gorkaion@7648
  1693
              v_pendingAmount:=v_GrandTotal + v_totalCash;
gorkaion@7648
  1694
            END IF;
gorkaion@7648
  1695
            FOR CUR_PAYMENTS IN
gorkaion@7648
  1696
              (SELECT LINE, PERCENTAGE, ONREMAINDER, EXCLUDETAX,
gorkaion@7648
  1697
                   COALESCE(PAYMENTRULE, v_PaymentRule) AS PAYMENTRULE, FIXMONTHDAY, FIXMONTHDAY2, FIXMONTHDAY3,
gorkaion@7648
  1698
                   NETDAYS, FIXMONTHOFFSET, NETDAY, ISNEXTBUSINESSDAY
gorkaion@7648
  1699
               FROM C_PAYMENTTERMLINE
gorkaion@7648
  1700
               WHERE C_PAYMENTTERM_ID=v_PaymentTerm
gorkaion@7648
  1701
               UNION
gorkaion@7648
  1702
               -- Header of paymentTerm is processed at last
gorkaion@7648
  1703
               SELECT 9999 AS LINE, 100 AS PERCENTAGE, 'Y' AS ONREMAINDER, 'N' AS EXCLUDETAX,
gorkaion@7648
  1704
                   v_PaymentRule AS PAYMENTRULE, FIXMONTHDAY, FIXMONTHDAY2, FIXMONTHDAY3,
gorkaion@7648
  1705
                   NETDAYS, FIXMONTHOFFSET, NETDAY, ISNEXTBUSINESSDAY
gorkaion@7648
  1706
               FROM C_PAYMENTTERM
gorkaion@7648
  1707
               WHERE C_PAYMENTTERM_ID=v_PaymentTerm
gorkaion@7648
  1708
               ORDER BY LINE
gorkaion@7648
  1709
              )
gorkaion@7648
  1710
            LOOP
gorkaion@7648
  1711
              IF (CUR_PAYMENTS.PaymentRule IN('B', 'C')) THEN
gorkaion@7648
  1712
                SELECT MAX(C_CashBook_ID) INTO v_cashBook
gorkaion@7648
  1713
                FROM C_CASHBOOK
gorkaion@7648
  1714
                WHERE AD_Client_ID=v_Client_ID
gorkaion@7648
  1715
                  AND isActive='Y'
gorkaion@7648
  1716
                  AND isDefault='Y'
gorkaion@7648
  1717
                  AND AD_IsOrgIncluded(v_org_id,AD_ORG_ID, AD_Client_ID)<>-1;
gorkaion@7648
  1718
                IF (v_cashBook IS NULL) THEN
gorkaion@7648
  1719
                  RAISE_APPLICATION_ERROR(-20000, '@NoDefaultCashBook@');
gorkaion@7648
  1720
                END IF;
gorkaion@7648
  1721
                v_bankAccount:=NULL;
gorkaion@7648
  1722
              ELSE
gorkaion@7648
  1723
                SELECT COALESCE((
gorkaion@7648
  1724
                         CASE v_IsSOTrx
gorkaion@7648
  1725
                           WHEN 'Y' THEN SO_BankAccount_ID
gorkaion@7648
  1726
                           ELSE PO_BankAccount_ID
gorkaion@7648
  1727
                         END
gorkaion@7648
  1728
                         ),
gorkaion@7648
  1729
                         (SELECT MAX(C_BankAccount_ID)
gorkaion@7648
  1730
                          FROM C_BANKACCOUNT
gorkaion@7648
  1731
                          WHERE AD_Client_ID=v_Client_ID
gorkaion@7648
  1732
                            AND isDefault='Y'
gorkaion@7648
  1733
                         )
gorkaion@7648
  1734
                       ) INTO v_bankAccount
gorkaion@7648
  1735
                FROM C_BPARTNER
gorkaion@7648
  1736
                WHERE c_BPartner_ID=v_BPartner_ID;
gorkaion@7648
  1737
                v_cashBook:=NULL;
gorkaion@7648
  1738
              END IF;
gorkaion@7648
  1739
              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
  1740
              SELECT COALESCE(SUM(C_DEBT_PAYMENT_V.AMOUNT),0) INTO v_partialAmount
gorkaion@7648
  1741
              FROM C_DEBT_PAYMENT_V, C_DEBT_PAYMENT
gorkaion@7648
  1742
              WHERE C_DEBT_PAYMENT_V.C_INVOICE_ID = V_RECORD_ID
gorkaion@7648
  1743
                AND C_DEBT_PAYMENT_V.C_DEBT_PAYMENT_ID = C_DEBT_PAYMENT.C_DEBT_PAYMENT_ID
gorkaion@7648
  1744
                AND ISAUTOMATICGENERATED='N';
gorkaion@7648
  1745
              IF (CUR_PAYMENTS.EXCLUDETAX='Y') THEN
gorkaion@7648
  1746
                -- if excludeTax = 'Y', percentage is aplied on the TotalLines
gorkaion@7648
  1747
                v_paymentAmount:=C_Currency_Round((v_TotalLines-v_partialAmount) *CUR_PAYMENTS.PERCENTAGE/100, v_Currency_ID, NULL) ;
gorkaion@7648
  1748
              ELSIF (CUR_PAYMENTS.ONREMAINDER='N') THEN
gorkaion@7648
  1749
                -- if onRemainder = 'N', percentage is aplied on the GrandTotal
gorkaion@7648
  1750
                v_paymentAmount:=C_Currency_Round((v_GrandTotal-v_partialAmount) *CUR_PAYMENTS.PERCENTAGE/100, v_Currency_ID, NULL) ;
gorkaion@7648
  1751
              ELSE
gorkaion@7648
  1752
                v_paymentAmount:=C_Currency_Round((v_pendingAmount) *CUR_PAYMENTS.PERCENTAGE/100, v_Currency_ID, NULL) ;
gorkaion@7648
  1753
              END IF;
gorkaion@7648
  1754
              v_pendingAmount:=v_pendingAmount - v_paymentAmount;
gorkaion@7648
  1755
              v_debtPaymentID :=get_uuid() ;
gorkaion@7648
  1756
              v_paymentcheck:=C_Currency_Round((v_paymentamount *v_multiplierarc) -withholdamount *(v_paymentamount *v_multiplierarc / v_grandtotal), v_Currency_ID, NULL);
gorkaion@7648
  1757
              IF (v_paymentcheck <> 0) THEN
gorkaion@7648
  1758
                INSERT INTO C_DEBT_PAYMENT
gorkaion@7648
  1759
                  (
gorkaion@7648
  1760
                   C_DEBT_PAYMENT_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
gorkaion@7648
  1761
                   CREATED, CREATEDBY, UPDATED, UPDATEDBY,
gorkaion@7648
  1762
                   ISRECEIPT, C_SETTLEMENT_CANCEL_ID, C_SETTLEMENT_GENERATE_ID, DESCRIPTION,
gorkaion@7648
  1763
                   C_INVOICE_ID, C_BPARTNER_ID, C_CURRENCY_ID, C_CASHLINE_ID,
gorkaion@7648
  1764
                   C_BANKACCOUNT_ID, C_CASHBOOK_ID, PAYMENTRULE, ISPAID,
gorkaion@7648
  1765
                   AMOUNT, WRITEOFFAMT, DATEPLANNED, ISMANUAL,
gorkaion@7648
  1766
                   ISVALID, C_BANKSTATEMENTLINE_ID, CHANGESETTLEMENTCANCEL, CANCEL_PROCESSED,
gorkaion@7648
  1767
                   GENERATE_PROCESSED, c_project_id, status, status_initial,   withholdingamount,C_WITHHOLDING_ID
gorkaion@7648
  1768
                  )
gorkaion@7648
  1769
                  VALUES
gorkaion@7648
  1770
                  (
gorkaion@7648
  1771
                   v_debtPaymentID, v_Client_ID, v_Org_ID, 'Y',
gorkaion@7648
  1772
                   now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7648
  1773
                   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
  1774
                   v_Record_ID, v_BPartner_ID, v_Currency_ID, NULL,
gorkaion@7648
  1775
                   v_bankAccount, v_cashBook, CUR_PAYMENTS.PaymentRule, 'N',
gorkaion@7648
  1776
                   C_Currency_Round((v_paymentamount *v_multiplierarc) -withholdamount *(v_paymentamount *v_multiplierarc / v_grandtotal), v_Currency_ID, NULL), 0, v_plannedDate, 'N',
gorkaion@7648
  1777
                   'Y', NULL, 'N', 'N',
gorkaion@7648
  1778
                   'N', v_C_Project_Id, 'DE', 'DE', C_Currency_Round(withholdamount *(v_paymentamount *v_multiplierarc / v_grandtotal), v_Currency_ID, NULL),cWithHoldId
gorkaion@7648
  1779
                  );
gorkaion@7648
  1780
              END IF;
gorkaion@7648
  1781
              --AL
gorkaion@7648
  1782
              --Looking for autogenerated debt-payments
gorkaion@7648
  1783
              SELECT MAX(c_Debt_Payment_Id), MAX(ad_Org_ID)
gorkaion@7648
  1784
                INTO v_GenDebt_PaymentID, v_GenDP_Org
gorkaion@7648
  1785
              FROM C_DEBT_PAYMENT DP
gorkaion@7648
  1786
              WHERE C_BPartner_ID=v_BPartner_ID
gorkaion@7648
  1787
                AND C_Debt_Payment_Status(C_Settlement_Cancel_ID, Cancel_Processed, Generate_Processed, IsPaid, IsValid, C_Cashline_ID, C_BankstatementLine_ID)='P'
david@8533
  1788
                AND ISRECEIPT=v_IsSOTrx
gorkaion@7648
  1789
                AND (-1) *Amount=v_paymentAmount
gorkaion@7648
  1790
                AND c_currency_ID=v_Currency_ID
gorkaion@7648
  1791
                AND C_SETTLEMENT_GENERATE_ID IS NOT NULL
gorkaion@7648
  1792
                AND Ad_Isorgincluded(v_Org_id, dp.ad_org_id,v_Client_ID) != -1
gorkaion@7648
  1793
                AND ad_client_id = v_Client_ID
gorkaion@7648
  1794
                AND EXISTS (SELECT 1
gorkaion@7648
  1795
                            FROM C_SETTLEMENT S
gorkaion@7648
  1796
                            WHERE DP.C_SETTLEMENT_GENERATE_ID = S.C_Settlement_ID
gorkaion@7648
  1797
                              AND IsGenerated = 'Y')
gorkaion@7648
  1798
                AND NOT EXISTS (SELECT 1
gorkaion@7648
  1799
                                FROM C_REMITTANCELINE rl
gorkaion@7648
  1800
                                WHERE rl.C_DEBT_PAYMENT_CANCELLED = DP.C_DEBT_PAYMENT_ID);
gorkaion@7648
  1801
  
gorkaion@7648
  1802
              IF (v_GenDebt_PaymentID IS NOT NULL) THEN
gorkaion@7648
  1803
                v_SettlementDocTypeID:=Ad_Get_Doctype(v_Client_ID, v_GenDP_Org, TO_CHAR('STT')) ;
gorkaion@7648
  1804
                v_settlement_ID := get_uuid();
gorkaion@7648
  1805
                Ad_Sequence_Doctype(v_SettlementDocTypeID, v_Record_ID, 'Y', v_SDocument_No) ;
gorkaion@7648
  1806
                IF (v_SDocument_No IS NULL) THEN
gorkaion@7648
  1807
                  Ad_Sequence_Doc('DocumentNo_C_Settlement', v_Client_ID, 'Y', v_SDocument_No) ;
gorkaion@7648
  1808
                END IF;
gorkaion@7648
  1809
                INSERT INTO C_SETTLEMENT
gorkaion@7648
  1810
                  (
gorkaion@7648
  1811
                   C_SETTLEMENT_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
gorkaion@7648
  1812
                   CREATED, CREATEDBY, UPDATED, UPDATEDBY,
gorkaion@7648
  1813
                   DOCUMENTNO, DATETRX, DATEACCT, SETTLEMENTTYPE,
gorkaion@7648
  1814
                   C_DOCTYPE_ID, PROCESSING, PROCESSED, POSTED,
gorkaion@7648
  1815
                   C_CURRENCY_ID, ISGENERATED
gorkaion@7648
  1816
                  )
gorkaion@7648
  1817
                   /*, C_PROJECT_ID, C_CAMPAIGN_ID,
gorkaion@7648
  1818
                   C_ACTIVITY_ID, USER1_ID, USER2_ID, CREATEFROM)*/
gorkaion@7648
  1819
                  VALUES
gorkaion@7648
  1820
                  (
gorkaion@7648
  1821
                   v_Settlement_ID, v_Client_ID, v_GenDP_Org, 'Y',
gorkaion@7648
  1822
                   now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7648
  1823
                   '*C*'||v_SDocument_No, TRUNC(now()), TRUNC(now()), 'C',
gorkaion@7648
  1824
                   v_SettlementDocTypeID, 'N', 'N', 'N',
gorkaion@7648
  1825
                   v_Currency_ID, 'Y'
gorkaion@7648
  1826
                  );
gorkaion@7648
  1827
                UPDATE C_DEBT_PAYMENT
gorkaion@7648
  1828
                SET C_Settlement_Cancel_Id=v_Settlement_ID,
gorkaion@7648
  1829
                    Updated=now(),
gorkaion@7648
  1830
                    UpdatedBy=v_UpdatedBy
gorkaion@7648
  1831
                WHERE c_Debt_Payment_ID IN(v_genDebt_PaymentID, v_debtPaymentID) ;
gorkaion@7648
  1832
                C_SETTLEMENT_POST(NULL, v_Settlement_ID) ;
gorkaion@7648
  1833
              END IF;
gorkaion@7648
  1834
              --If Invoice.paymentRule = 'B', insert de cashline de tipo efecto apuntando al efecto
gorkaion@7648
  1835
              IF (v_cashBook IS NOT NULL AND CUR_PAYMENTS.PaymentRule='B') THEN
gorkaion@7648
  1836
                SELECT MAX(C.C_CASH_ID) INTO v_Cash
gorkaion@7648
  1837
                FROM C_CASH C
gorkaion@7648
  1838
                WHERE C.C_CASHBOOK_ID=v_cashBook
gorkaion@7648
  1839
                  AND TRUNC(C.DATEACCT)=TRUNC(v_DateAcct)
gorkaion@7648
  1840
                  AND C.PROCESSED='N';
gorkaion@7648
  1841
  
gorkaion@7648
  1842
                SELECT C_CURRENCY_ID INTO v_CB_Curr
gorkaion@7648
  1843
                FROM C_CASHBOOK
gorkaion@7648
  1844
                WHERE C_CASHBOOK_ID = v_cashBook;
gorkaion@7648
  1845
  
gorkaion@7648
  1846
                IF (v_Cash IS NULL) THEN
gorkaion@7648
  1847
                  v_ResultStr:='Creating C_Cash';
gorkaion@7648
  1848
                  SELECT ISO_CODE INTO v_IsoCode
gorkaion@7648
  1849
                  FROM C_CURRENCY
gorkaion@7648
  1850
                  WHERE C_Currency_ID=v_CB_Curr;
gorkaion@7648
  1851
                  v_Cash :=get_uuid();
gorkaion@7648
  1852
                  INSERT INTO C_CASH (
gorkaion@7648
  1853
                      C_Cash_ID, AD_Client_ID, AD_Org_ID, IsActive,
gorkaion@7648
  1854
                      Created, CreatedBy, Updated, UpdatedBy,
gorkaion@7648
  1855
                      C_CashBook_ID, NAME, StatementDate, DateAcct,
gorkaion@7648
  1856
                      BeginningBalance, EndingBalance, StatementDifference, Processing,
gorkaion@7648
  1857
                      Processed, Posted )
gorkaion@7648
  1858
                    VALUES (
gorkaion@7648
  1859
                      v_Cash, v_Client_ID, v_Org_ID, 'Y',
gorkaion@7648
  1860
                      now(), v_UpdatedBy, now(), v_UpdatedBy,
gorkaion@7648
  1861
                      v_cashBook, (TO_CHAR(v_DateAcct, 'YYYY-MM-DD') || ' ' || v_IsoCode), v_DateAcct, v_DateAcct,
gorkaion@7648
  1862
                      0, 0, 0, 'N',
gorkaion@7648
  1863
                      'N', 'N');
gorkaion@7648
  1864
                END IF; -- v_Cash IS NULL
gorkaion@7648
  1865
                v_ResultStr:='Creating C_CashLine';
gorkaion@7648
  1866
                v_CashLine := get_uuid();
gorkaion@7648
  1867
                SELECT COALESCE(MAX(LINE), 0) + 10 INTO v_line
gorkaion@7648
  1868
                FROM C_CASHLINE
gorkaion@7648
  1869
                WHERE C_CASH_ID=v_Cash;
gorkaion@7648
  1870
  
gorkaion@7648
  1871
                SELECT SUM(AMOUNT) INTO v_Amount
gorkaion@7648
  1872
                FROM C_DEBT_PAYMENT_V
gorkaion@7648
  1873
                WHERE C_INVOICE_ID = v_Record_ID;
gorkaion@7648
  1874
  
gorkaion@7648
  1875
                INSERT INTO C_CASHLINE
gorkaion@7648
  1876
                  (
gorkaion@7648
  1877
                    C_CashLine_ID, AD_Client_ID, AD_Org_ID, IsActive,
gorkaion@7648
  1878
                    Created, CreatedBy, Updated, UpdatedBy,
gorkaion@7648
  1879
                    C_Cash_ID, C_Debt_Payment_ID, Line, Description,
gorkaion@7648
  1880
                    Amount, CashType, C_Currency_ID, DiscountAmt,
gorkaion@7648
  1881
                    WriteOffAmt, IsGenerated
gorkaion@7648
  1882
                  )
gorkaion@7648
  1883
                  VALUES
gorkaion@7648
  1884
                  (
gorkaion@7648
  1885
                    v_CashLine, v_Client_ID, v_Org_ID, 'Y',
gorkaion@7648
  1886
                    TO_DATE(now()), v_UpdatedBy, TO_DATE(now()), v_UpdatedBy,
gorkaion@7648
  1887
                    v_Cash, v_debtPaymentID, v_line, v_BPartnerName,
gorkaion@7648
  1888
                    v_Amount, 'P', v_Currency_ID, 0,
gorkaion@7648
  1889
                    0, 'Y'
gorkaion@7648
  1890
                  );
gorkaion@7648
  1891
  
gorkaion@7648
  1892
              END IF; -- v_cashBook IS NOT NULL
gorkaion@7648
  1893
            END LOOP;
gorkaion@7648
  1894
          END;
gorkaion@7648
  1895
        END IF; -- v_GrandTotal <> v_totalCash
gorkaion@7647
  1896
      END IF;
gorkaion@7647
  1897
    END;
gorkaion@7647
  1898
    IF (NOT FINISH_PROCESS AND v_IsSOTrx='Y') THEN
gorkaion@7647
  1899
      C_BP_SOCREDITUSED_REFRESH(v_BPartner_ID) ;
carlos@0
  1900
    END IF;
gorkaion@7647
  1901
  END IF;--FINISH_PROCESS
gorkaion@7647
  1902
  IF (NOT FINISH_PROCESS AND NOT END_PROCESSING) THEN
gorkaion@7647
  1903
    -- Finish up -------------------------------------------------------------
gorkaion@7647
  1904
    UPDATE C_INVOICE
gorkaion@7647
  1905
    SET DocStatus='CO',
gorkaion@7647
  1906
        Processed='Y',
gorkaion@7647
  1907
        DocAction='RE',
gorkaion@7647
  1908
        Updated=now(),
gorkaion@7647
  1909
        UpdatedBy=v_UpdatedBy
gorkaion@7647
  1910
    WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
  1911
  END IF;--FINISH_PROCESS
gorkaion@7647
  1912
  IF (NOT FINISH_PROCESS) THEN
gorkaion@7647
  1913
    -- End Processing --------------------------------------------------------
gorkaion@7647
  1914
    --<<END_PROCESSING>>
gorkaion@7647
  1915
    v_ResultStr:='UnLockingInvoice';
gorkaion@7647
  1916
    UPDATE C_INVOICE
gorkaion@7647
  1917
    SET Processing='N',
gorkaion@7647
  1918
        Updated=now(),
gorkaion@7647
  1919
        UpdatedBy=v_UpdatedBy
gorkaion@7647
  1920
    WHERE C_Invoice_ID=v_Record_ID;
gorkaion@7647
  1921
    -- Commented by cromero 19102006 IF (p_PInstance_ID IS NOT NULL) THEN
gorkaion@7647
  1922
    -- Commented by cromero 19102006   COMMIT;
gorkaion@7647
  1923
    -- Commented by cromero 19102006 END IF;
gorkaion@7647
  1924
  END IF;--FINISH_PROCESS
gorkaion@7647
  1925
gorkaion@7647
  1926
  --C_Invoice_Post - Finish_Process Extension Point
gorkaion@7647
  1927
  SELECT count(*) INTO v_count FROM DUAL
gorkaion@7647
  1928
  WHERE EXISTS (SELECT 1 FROM ad_ep_procedures WHERE ad_extension_points_id = 'CBE7DD2E561E4D3D8257ECEA5F19687F');
gorkaion@7647
  1929
  IF (v_count=1) THEN
gorkaion@7647
  1930
    DECLARE
gorkaion@7647
  1931
      v_ep_instance VARCHAR2(32);
gorkaion@7647
  1932
      v_extension_point_id VARCHAR2(32) := 'CBE7DD2E561E4D3D8257ECEA5F19687F';
gorkaion@7647
  1933
    BEGIN
gorkaion@7647
  1934
      v_ep_instance := get_uuid();
gorkaion@7647
  1935
      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
  1936
      AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'DocAction', v_DocAction, NULL, NULL, NULL, NULL, NULL, NULL);
gorkaion@7647
  1937
      AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'User', v_UpdatedBy, NULL, NULL, NULL, NULL, NULL, NULL);
gorkaion@7647
  1938
      AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'Message', NULL, NULL, NULL, NULL, NULL, NULL, v_Message);
gorkaion@7647
  1939
      AD_EP_INSTANCE_PARA_INSERT(v_ep_instance, v_extension_point_id, 'Result', NULL, NULL, v_result, NULL, NULL, NULL, NULL);
gorkaion@7647
  1940
      AD_EXTENSION_POINT_HANDLER(v_ep_instance, v_extension_point_id);
gorkaion@7647
  1941
      SELECT p_number INTO v_Result
gorkaion@7647
  1942
      FROM ad_ep_instance_para
gorkaion@7647
  1943
      WHERE ad_ep_instance_id = v_ep_instance
gorkaion@7647
  1944
        AND parametername LIKE 'Result';
gorkaion@7647
  1945
      SELECT p_text INTO v_Message
gorkaion@7647
  1946
      FROM ad_ep_instance_para
gorkaion@7647
  1947
      WHERE ad_ep_instance_id = v_ep_instance
gorkaion@7647
  1948
        AND parametername LIKE 'Message';
gorkaion@7647
  1949
gorkaion@7647
  1950
      DELETE FROM ad_ep_instance_para
gorkaion@7647
  1951
      WHERE ad_ep_instance_id = v_ep_instance;
gorkaion@7647
  1952
    END;
gorkaion@7647
  1953
  END IF;
gorkaion@7647
  1954
harikrishnan@7678
  1955
	FOR Cur_lineqty IN
harikrishnan@7678
  1956
      (SELECT C_INVOICELINE.qtyInvoiced
harikrishnan@7678
  1957
       FROM C_INVOICELINE
harikrishnan@7678
  1958
       WHERE C_Invoice_ID = v_Record_ID
harikrishnan@7678
  1959
      )
harikrishnan@7678
  1960
    LOOP
harikrishnan@7678
  1961
    IF(Cur_lineqty.qtyInvoiced <> 0) THEN
harikrishnan@7678
  1962
      v_totalqty := v_totalqty + 1;
harikrishnan@7678
  1963
     END IF;
harikrishnan@7678
  1964
    END LOOP;
gorkaion@7647
  1965
  --<<FINISH_PROCESS>>
gorkaion@7647
  1966
  IF (p_PInstance_ID IS NOT NULL) THEN
gorkaion@7647
  1967
    --  Update AD_PInstance
gorkaion@7647
  1968
    DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished - ' || v_Message) ;
harikrishnan@7678
  1969
   
harikrishnan@7678
  1970
    IF(v_totalqty = 0 AND v_DocAction <> 'RE') THEN
harikrishnan@7678
  1971
	v_Message := v_Message || '@NoAccountingEntryInvoice@';
harikrishnan@7678
  1972
    END IF;
gorkaion@7647
  1973
    AD_UPDATE_PINSTANCE(p_PInstance_ID, v_UpdatedBy, 'N', v_Result, v_Message) ;
gorkaion@7647
  1974
  ELSE
gorkaion@7647
  1975
    DBMS_OUTPUT.PUT_LINE('--<<C_Invoive_Post finished>> ' || v_Message) ;
gorkaion@7647
  1976
  END IF;
gorkaion@7647
  1977
  RETURN;
gorkaion@7647
  1978
END; --BODY
carlos@0
  1979
EXCEPTION
carlos@0
  1980
WHEN OTHERS THEN
carlos@0
  1981
  DBMS_OUTPUT.PUT_LINE(v_ResultStr) ;
carlos@0
  1982
     v_ResultStr:= '@ERROR=' || SQLERRM;
carlos@0
  1983
      DBMS_OUTPUT.PUT_LINE(v_ResultStr) ;
gorkaion@7647
  1984
      IF (p_PInstance_ID IS NOT NULL) THEN
carlos@0
  1985
        ROLLBACK;
antonio@735
  1986
        AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'N', 0, v_ResultStr) ;
carlos@0
  1987
      ELSE
carlos@1273
  1988
        RAISE;
carlos@1273
  1989
      END IF;
carlos@0
  1990
  -- Commented by cromero 19102006 RETURN;
antonio@735
  1991
END C_INVOICE_POST
gorkaion@239
  1992
]]></body>
carlos@0
  1993
    </function>
adrian@94
  1994
  </database>