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