Kas
28
2016

Faturanın Tersi ile Eşlenerek Kapatılması (Fatura Alacaklandırma) İşlemi

Merhaba,

Bu yazımda Alacaklar Faturasının tersini oluşturup eşleyerek kapatma işleminin public api ile yapılması aktarmaya çalışacağım.

ra_customer_trx_all tablosunda INV (Satış tipli pozitif fatura) tipli olarak oluşturulan faturanın tersi işle eşlenerek kapatılması işlemi

alacaklandirma-1

alacaklandirma-2

faturanın ne kadarlık tutarı alacaklandırılacaksa belirlenir. Bu tutarın belirlenme işleminin objesi

l_cm_lines_tbl      arw_cmreq_cover.cm_line_tbl_type_cover
cm_line_tbl_type_cover

bu obje üzerinde belirlenen tutar kadarlık bir faturanın iade faturası oluşturularak orjinal fatura kapatılacaktır.
Yapılan işlemin R11 için kullanılan apinin tarih parametresi olmamasından dolayı sysdate te yapılacaktır.
Sysdate tarihinin Alacaklar Döneminin açık olması gerekmektedir. Ayrıca bir şekilde açıkta kalan fatura tutarı kapatılacağı için açıkta kalan tutarın üzerinde bir Credit Memo oluşturulamaz.

 
DECLARE
   TYPE invoicelines_records IS TABLE OF ra_customer_trx_lines_all%ROWTYPE
      INDEX BY PLS_INTEGER;
 
   p_customer_trx_id   NUMBER                                 := 13542;
   l_cm_lines_tbl      arw_cmreq_cover.cm_line_tbl_type_cover;
   l_invlines_recs     invoicelines_records;
   v_return_status     VARCHAR2 (1);
   l_return_status     VARCHAR2 (1);
   l_message           VARCHAR2 (2400);
   v_msg_count         NUMBER;
   v_msg_data          VARCHAR2 (2400);
   v_request_id        NUMBER;
   p_count             NUMBER                                 := 0;
   l_orj_trx_date      DATE;
   l_line_tax_amount   NUMBER;
   l_cm_trx_id         NUMBER;
 
   FUNCTION calc_line_tax_amount (p_customer_trx_line_id IN NUMBER)
      RETURN NUMBER
   IS
      l_tax_amount   NUMBER;
   BEGIN
      SELECT SUM (NVL (extended_amount, 0))
        INTO l_tax_amount
        FROM ra_customer_trx_lines_all rctl
       WHERE 1 = 1
         AND line_type = 'TAX'
         AND rctl.link_to_cust_trx_line_id = p_customer_trx_line_id;
 
      RETURN l_tax_amount;
   END calc_line_tax_amount;
 
   FUNCTION get_memo_trx_id (p_req_id IN NUMBER)
      RETURN NUMBER
   IS
      l_cm_trx_id   ra_cm_requests_all.cm_customer_trx_id%TYPE;
   BEGIN
      SELECT cm_customer_trx_id
        INTO l_cm_trx_id
        FROM ra_cm_requests_all
       WHERE 1 = 1 AND cm_customer_trx_id IS NOT NULL
             AND request_id = p_req_id;
 
      RETURN l_cm_trx_id;
   EXCEPTION
      WHEN OTHERS
      THEN
         RETURN 0;
   END get_memo_trx_id;
BEGIN
   --> fnd_global.apps_initialize (0, 50289, 20003);
   --> apps init olmadan işlemler hata verecektir fmb içerisinde
   SELECT trx_date
     INTO l_orj_trx_date
     FROM ra_customer_trx_all
    WHERE 1 = 1 AND customer_trx_id = p_customer_trx_id;
 
   BEGIN
      SELECT *
      BULK COLLECT INTO l_invlines_recs
        FROM ra_customer_trx_lines_all rctl
       WHERE 1 = 1
         AND rctl.customer_trx_id = p_customer_trx_id
         AND line_type = 'LINE';
   END "Collect Orj Invoice Line Recs";
 
   IF l_invlines_recs.COUNT = 0
   THEN
      l_return_status    := fnd_api.g_ret_sts_error;
      l_message          := 'No LINE type rows found';
      DBMS_OUTPUT.put_line ('return_status : ' || l_return_status);
      DBMS_OUTPUT.put_line ('return_message : ' || l_message);
      RETURN;
   END IF;
 
   FOR i IN 1 .. l_invlines_recs.COUNT
   LOOP
--***********************************************************************************
      l_cm_lines_tbl (i).customer_trx_line_id    :=
                                     l_invlines_recs (i).customer_trx_line_id;
      l_cm_lines_tbl (i).quantity_credited       :=
                                    l_invlines_recs (i).quantity_invoiced
                                    * -1;
      l_cm_lines_tbl (i).price                   :=
                                       l_invlines_recs (i).unit_selling_price;
--***********************************************************************************
      l_line_tax_amount                          :=
              calc_line_tax_amount (l_invlines_recs (i).customer_trx_line_id);
--***********************************************************************************
      l_cm_lines_tbl (i).extended_amount         :=
             l_invlines_recs (i).quantity_invoiced
           * l_invlines_recs (i).unit_selling_price
           * -1
         + (l_line_tax_amount * -1);
   END LOOP;
 
   fnd_msg_pub.initialize;
   ar_credit_memo_api_pub.create_request
                                      (p_api_version                     => 1.0
                                      ,p_init_msg_list                   => fnd_api.g_true
                                      ,p_commit                          => fnd_api.g_false
                                      ,p_customer_trx_id                 => p_customer_trx_id
                                      ,p_line_credit_flag                => 'Y'
                                      ,p_cm_line_tbl                     => l_cm_lines_tbl
                                      ,p_cm_reason_code                  => 'RETURN'
                                      ,p_skip_workflow_flag              => 'Y'
                                      ,p_batch_source_name               => 'MAĞAZACILIK'
                                      /*ra_batches_all.name*/
   ,                                   p_credit_method_installments      => NULL
                                      ,p_credit_method_rules             => NULL
                                      ,x_return_status                   => v_return_status
                                      ,x_msg_count                       => v_msg_count
                                      ,x_msg_data                        => v_msg_data
                                      ,x_request_id                      => v_request_id
                                      );
 
--   dbms_output.put_line ('credit memo return_status : ' || v_return_status);
--   dbms_output.put_line ('credit memo message_data : ' || v_msg_data);
--   dbms_output.put_line ('credit memo v_msg_count : ' || v_msg_count);
   IF v_return_status <> fnd_api.g_ret_sts_success
   THEN
      IF v_msg_count = 1
      THEN
         l_return_status    := fnd_api.g_ret_sts_error;
         l_message          := v_msg_data;
         DBMS_OUTPUT.put_line ('return_status : ' || l_return_status);
         DBMS_OUTPUT.put_line ('return_message : ' || l_message);
         RETURN;
      ELSIF v_msg_count > 1
      THEN
         LOOP
            p_count       := p_count + 1;
            v_msg_data    :=
                        fnd_msg_pub.get (fnd_msg_pub.g_next, fnd_api.g_false);
 
            IF v_msg_data IS NULL
            THEN
               EXIT;
            END IF;
 
            l_message     :=
                  l_message
               || 'Message'
               || p_count
               || ' ---'
               || v_msg_data
               || CHR (10);
         END LOOP;
 
         l_message    := RTRIM (l_message, CHR (10));
      END IF;
 
      l_return_status    := fnd_api.g_ret_sts_error;            /*1.5.10.0.1*/
   ELSE
      l_cm_trx_id        := get_memo_trx_id (v_request_id);
 
      IF l_cm_trx_id = 0
      THEN
         l_return_status    := fnd_api.g_ret_sts_error;
         l_message          :=
               'Request_id : '
            || v_request_id
            || ' '
            || ' , No cm_trx_id found RA_CM_REQUESTS_ALL';
         RETURN;
      END IF;
 
      l_return_status    := v_return_status;
      l_message          :=
              'New Memo Invoice created and fully applied to original invoice';
   END IF;
 
   DBMS_OUTPUT.put_line ('return_status : ' || l_return_status);
   DBMS_OUTPUT.put_line ('return_message : ' || l_message);
   DBMS_OUTPUT.put_line ('credit memo trx id : ' || l_cm_trx_id);
END;
 
SELECT * FROM ra_customer_trx_all WHERE 1=1 AND previous_customer_trx_id = :orj_cust_trx_id;

Mustafa Korkmaz

Oracle Applications Developer at Partnera
2005 yılında Dokuz Eylül Üniversitesi Endüstri Mühendisliğinden Mezun
Oldu, 2011 Yılında Ahmet Yesevi Üniversitesi Bilgisayar Mühendisliğinde
Yüksek Lisansını Tamamlandı,2012 Yılında Doğuş Üniversitesinde Bilgisayar
Mühendisliği Doktora Eğitimine Başladı.10 yılı aşkın bir zamandır Oracle
Ürünleri Uygulama Yazılım Uzmanı Olarak profesyonel kariyerine devam
etmektedir. İlgi alanları Middleware, CI/CD,
Oracle Database , PL/SQL , Java , Makine Öğrenmesi ve Veri Madenciliği alanlarındadır.
2 versiyon Oracle Database ' (10g, 11g) inde OCA(Oracle Certificate Associate) ve
PL/SQL Certificated Professional ünvanları bulunmaktadır.
Mail: mustafakorkmz@gmail.com
Mustafa Korkmaz


1 Yorum+ Yorum Ekle

  • Güzel çalışma, aynen kullandım

Yorum yapın

*