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