DBA Data[Home] [Help]

PACKAGE BODY: APPS.FUN_CUSTOMERMERGE_PKG

Source


1 PACKAGE BODY FUN_CustomerMerge_PKG AS
2 /* $Header: funntcmb.pls 120.2 2006/01/25 14:11:13 asrivats noship $ */
3 
4 PROCEDURE Merge_Customer (
5         req_id                       NUMBER,
6         set_num                      NUMBER,
7         process_mode                 VARCHAR2) IS
8 
9   TYPE MERGE_HEADER_ID_LIST_TYPE IS TABLE OF
10        RA_CUSTOMER_MERGE_HEADERS.CUSTOMER_MERGE_HEADER_ID%TYPE
11        INDEX BY BINARY_INTEGER;
12   MERGE_HEADER_ID_LIST MERGE_HEADER_ID_LIST_TYPE;
13 
14   TYPE NETTING_CUSTOMER_ID_LIST_TYPE IS TABLE OF
15          FUN_NET_CUSTOMERS_ALL.NETTING_CUSTOMER_ID%TYPE
16         INDEX BY BINARY_INTEGER;
17   PRIMARY_KEY_ID_LIST NETTING_CUSTOMER_ID_LIST_TYPE;
18 
19   TYPE CUST_ACCOUNT_ID_LIST_TYPE IS TABLE OF
20          FUN_NET_CUSTOMERS_ALL.CUST_ACCOUNT_ID%TYPE
21         INDEX BY BINARY_INTEGER;
22   NUM_COL1_ORIG_LIST CUST_ACCOUNT_ID_LIST_TYPE;
23   NUM_COL1_NEW_LIST CUST_ACCOUNT_ID_LIST_TYPE;
24 
25   TYPE CUST_SITE_USE_ID_LIST_TYPE IS TABLE OF
26          FUN_NET_CUSTOMERS_ALL.CUST_SITE_USE_ID%TYPE
27         INDEX BY BINARY_INTEGER;
28   NUM_COL2_ORIG_LIST CUST_SITE_USE_ID_LIST_TYPE;
29   NUM_COL2_NEW_LIST CUST_SITE_USE_ID_LIST_TYPE;
30 
31   TYPE CUSTOMER_PRIORITY_LIST_TYPE IS TABLE OF
32          FUN_NET_CUSTOMERS_ALL.CUST_PRIORITY%TYPE
33         INDEX BY BINARY_INTEGER;
34   NUM_COL3_ORIG_LIST CUSTOMER_PRIORITY_LIST_TYPE;
35   NUM_COL3_NEW_LIST CUSTOMER_PRIORITY_LIST_TYPE;
36 
37   l_profile_val VARCHAR2(30);
38   CURSOR merged_records IS
39         SELECT distinct CUSTOMER_MERGE_HEADER_ID
40               ,NETTING_CUSTOMER_ID
41               ,CUST_ACCOUNT_ID
42               ,CUST_SITE_USE_ID
43               ,CUST_PRIORITY
44          FROM FUN_NET_CUSTOMERS_ALL yt, ra_customer_merges m
45          WHERE (
46             yt.CUST_ACCOUNT_ID = m.DUPLICATE_ID
47             OR yt.CUST_SITE_USE_ID = m.DUPLICATE_SITE_ID
48          )
49 	 AND    m.process_flag = 'N'
50          AND    m.request_id = req_id
51          AND    m.set_number = set_num;
52 
53   l_last_fetch BOOLEAN := FALSE;
54   l_count NUMBER := 0;
55 
56 BEGIN
57   IF process_mode='LOCK' THEN
58     NULL;
59   ELSE
60     ARP_MESSAGE.SET_NAME('AR','AR_UPDATING_TABLE');
61     ARP_MESSAGE.SET_TOKEN('TABLE_NAME','FUN_NET_CUSTOMERS_ALL',FALSE);
62     HZ_ACCT_MERGE_UTIL.load_set(set_num, req_id);
63 
64     l_profile_val :=  FND_PROFILE.VALUE('HZ_AUDIT_ACCT_MERGE');
65 
66     OPEN merged_records;
67     LOOP
68       FETCH merged_records BULK COLLECT INTO
69          MERGE_HEADER_ID_LIST
70           , PRIMARY_KEY_ID_LIST
71           , NUM_COL1_ORIG_LIST
72           , NUM_COL2_ORIG_LIST
73           , NUM_COL3_ORIG_LIST
74           ;
75       IF merged_records%NOTFOUND THEN
76          l_last_fetch := TRUE;
77       END IF;
78       IF MERGE_HEADER_ID_LIST.COUNT = 0 and l_last_fetch then
79         exit;
80       END IF;
81       FOR I in 1..MERGE_HEADER_ID_LIST.COUNT LOOP
82          NUM_COL1_NEW_LIST(I) := HZ_ACCT_MERGE_UTIL.GETDUP_ACCOUNT(NUM_COL1_ORIG_LIST(I));
83          NUM_COL2_NEW_LIST(I) := HZ_ACCT_MERGE_UTIL.GETDUP_SITE_USE(NUM_COL2_ORIG_LIST(I));
84          NUM_COL3_NEW_LIST(I) := NUM_COL3_ORIG_LIST(I);
85       END LOOP;
86       IF l_profile_val IS NOT NULL AND l_profile_val = 'Y' THEN
87         FORALL I in 1..MERGE_HEADER_ID_LIST.COUNT
88          INSERT INTO HZ_CUSTOMER_MERGE_LOG (
89            MERGE_LOG_ID,
90            TABLE_NAME,
91            MERGE_HEADER_ID,
92            PRIMARY_KEY_ID,
93            NUM_COL1_ORIG,
94            NUM_COL1_NEW,
95            NUM_COL2_ORIG,
96            NUM_COL2_NEW,
97            NUM_COL3_ORIG,
98            NUM_COL3_NEW,
99            ACTION_FLAG,
100            REQUEST_ID,
101            CREATED_BY,
102            CREATION_DATE,
103            LAST_UPDATE_LOGIN,
104            LAST_UPDATE_DATE,
105            LAST_UPDATED_BY
106       ) VALUES (
107           HZ_CUSTOMER_MERGE_LOG_s.nextval,
108          'FUN_NET_CUSTOMERS_ALL',
109          MERGE_HEADER_ID_LIST(I),
110          PRIMARY_KEY_ID_LIST(I),
111          NUM_COL1_ORIG_LIST(I),
112          NUM_COL1_NEW_LIST(I),
113          NUM_COL2_ORIG_LIST(I),
114          NUM_COL2_NEW_LIST(I),
115          NUM_COL3_ORIG_LIST(I),
116          NUM_COL3_NEW_LIST(I),
117          'U',
118          req_id,
119          hz_utility_pub.CREATED_BY,
120          hz_utility_pub.CREATION_DATE,
121          hz_utility_pub.LAST_UPDATE_LOGIN,
122          hz_utility_pub.LAST_UPDATE_DATE,
123          hz_utility_pub.LAST_UPDATED_BY
124       );
125     END IF;
126    FORALL I in 1..MERGE_HEADER_ID_LIST.COUNT
127 
128       UPDATE FUN_NET_CUSTOMERS_ALL yt SET
129            CUST_ACCOUNT_ID=NUM_COL1_NEW_LIST(I)
130           ,CUST_SITE_USE_ID=NUM_COL2_NEW_LIST(I)
131           , LAST_UPDATE_DATE=SYSDATE
132           , last_updated_by=arp_standard.profile.user_id
133           , last_update_login=arp_standard.profile.last_update_login
134       WHERE NETTING_CUSTOMER_ID=PRIMARY_KEY_ID_LIST(I);
135 
136       l_count := l_count + SQL%ROWCOUNT;
137       IF l_last_fetch THEN
138          EXIT;
139       END IF;
140     END LOOP;
141 
142     arp_message.set_name('AR','AR_ROWS_UPDATED');
143     arp_message.set_token('NUM_ROWS',to_char(l_count));
144 
145 /* If there is more than one record that has the same agreement_id,cust_account_id and cust_site_use_id then update the customer priority of the records to the highest priority amongst them */
146 BEGIN
147 	UPDATE FUN_NET_CUSTOMERS_ALL yt SET
148         CUST_PRIORITY= (SELECT MIN(CUST_PRIORITY)
149                                 FROM FUN_NET_CUSTOMERS_ALL
150                                 WHERE AGREEMENT_ID = yt.AGREEMENT_ID
151                                 AND  CUST_ACCOUNT_ID = yt.CUST_ACCOUNT_ID
152                                 AND nvl(CUST_SITE_USE_ID,0) = DECODE(
153                                 yt.CUST_SITE_USE_ID,NULL,0,yt.CUST_SITE_USE_ID)
154                                 )
155     	WHERE  EXISTS (SELECT 1
156 		  FROM FUN_NET_CUSTOMERS_ALL
157                   WHERE  yt.agreement_id = agreement_id
158                   AND 	 yt.cust_account_id = cust_account_id
159                   AND    nvl(CUST_SITE_USE_ID,0) = DECODE(
160                                 yt.CUST_SITE_USE_ID,NULL
161 				,0,yt.CUST_SITE_USE_ID)
162                  GROUP BY agreement_id,cust_account_id,cust_site_use_id
163                  HAVING count(agreement_id) > 1);
164 EXCEPTION
165 	WHEN NO_DATA_FOUND THEN
166 		null;
167 END;
168 
169  /* If there is more than one row that has the same agreement_id , customer_priority,cust_account_id and cust_site_use_id , delete the record that has the minimum of the netting customer id */
170 
171 	BEGIN
172 	        DELETE FROM FUN_NET_CUSTOMERS_ALL yt
173         	WHERE NETTING_CUSTOMER_ID  = (
174 			SELECT MIN(NETTING_CUSTOMER_ID)
175                         FROM FUN_NET_CUSTOMERS_ALL
176                         WHERE
177                          yt.AGREEMENT_ID = AGREEMENT_ID
178                         AND yt.CUST_ACCOUNT_ID = CUST_ACCOUNT_ID
179                         AND nvl(yt.CUST_SITE_USE_ID,0) = nvl(CUST_SITE_USE_ID,0)
180                         AND yt.CUST_PRIORITY = CUST_PRIORITY
181                         GROUP BY AGREEMENT_ID,
182                               CUST_ACCOUNT_ID,
183                              CUST_SITE_USE_ID,
184                                 CUST_PRIORITY
185                         HAVING COUNT(NETTING_CUSTOMER_ID) > 1);
186 
187 	EXCEPTION
188         	WHEN NO_DATA_FOUND THEN
189                 	null;
190 	END;
191   END IF;
192 EXCEPTION
193   WHEN OTHERS THEN
194     arp_message.set_line( 'Merge_Customer');
195     RAISE;
196 END Merge_Customer;
197 END FUN_CustomerMerge_PKG;