src-db/database/model/functions/C_INVOICE_POST.xml
author Víctor Martínez Romanos <victor.martinez@openbravo.com>
Mon, 03 Feb 2014 12:11:07 +0100
changeset 21909 5b7d0ffec363
parent 21626 f64403aac66c
child 22357 74df619a7316
permissions -rw-r--r--
Fixed bug 25638: [cashvat] Withholding and tax exempt (rate=0%) support

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