DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKC_REP_STATUS_UPDATE_PVT

Source


1 PACKAGE BODY OKC_REP_STATUS_UPDATE_PVT AS
2 /* $Header: OKCVREPSTATCHB.pls 120.1 2006/03/31 11:34:00 vamuru noship $ */
3 
4   ---------------------------------------------------------------------------
5   -- GLOBAL CONSTANTS
6   ---------------------------------------------------------------------------
7   G_PARTY_TYPE_INTERNAL     CONSTANT VARCHAR2(12) := 'INTERNAL_ORG';
8   G_PKG_NAME                CONSTANT VARCHAR2(200) := 'OKC_REP_CONTRACT_SEARCH_PVT';
9   G_APP_NAME                CONSTANT VARCHAR2(3)   := 'OKC';
10   G_MODULE                  CONSTANT VARCHAR2(250) := 'okc.plsql.'||G_PKG_NAME||'.';
11 
12   G_UNEXPECTED_ERROR        CONSTANT VARCHAR2(200) := 'OKC_UNEXPECTED_ERROR';
13   G_SQLERRM_TOKEN           CONSTANT VARCHAR2(200) := 'ERROR_MESSAGE';
14   G_SQLCODE_TOKEN           CONSTANT VARCHAR2(200) := 'ERROR_CODE';
15 
16   G_RETURN_CODE_SUCCESS     CONSTANT VARCHAR2(1) :='0';
17   G_RETURN_CODE_WARNING     CONSTANT VARCHAR2(1) := '1';
18   G_RETURN_CODE_ERROR       CONSTANT VARCHAR2(1) := '2';
19 
20   -- Contract status codes
21   G_REP_CON_STATUS_SIGNED CONSTANT VARCHAR2(200) := 'SIGNED';
22   G_REP_CON_STATUS_TERMINATED CONSTANT VARCHAR2(200) := 'TERMINATED';
23 
24   ---------------------------------------------------------------------------
25   -- START: Procedures and Functions
26   ---------------------------------------------------------------------------
27 
28 -- Start of comments
29 --API name      : contract_status_updater
30 --Type          : Private.
31 --Function      : Updates status for contracts
32 --                reaching their termination date
33 --Pre-reqs      : None.
34 --Parameters    :
35 --IN            : p_api_version         IN NUMBER       Required
36 --              : p_init_msg_list       IN VARCHAR2     Required
37 --              : p_status              IN VARCHAR2     Required
38 --OUT           : x_return_status       OUT  VARCHAR2(1)
39 --              : x_msg_count           OUT  NUMBER
40 --              : x_msg_data            OUT  VARCHAR2(2000)
41 --Note          :
42 -- End of comments
43 PROCEDURE contract_status_updater(
44   p_api_version   IN          NUMBER,
45   p_init_msg_list IN          VARCHAR2,
46   p_status        IN          VARCHAR2,
47   x_msg_data      OUT NOCOPY  VARCHAR2,
48   x_msg_count     OUT NOCOPY  NUMBER,
49   x_return_status OUT NOCOPY  VARCHAR2)
50 
51   IS
52 
53     l_api_version NUMBER;
54     l_api_name    VARCHAR2(32);
55 
56     CURSOR contracts_cur IS
57     SELECT
58       contract_id, contract_version_num,
59       contract_number,
60       contract_name
61     FROM  okc_rep_contracts_all
62     WHERE termination_date is not null
63     AND   contract_status_code = G_REP_CON_STATUS_SIGNED
64     AND   trunc(termination_date) <= TRUNC(SYSDATE);
65 
66     CURSOR contract_vers_cur IS
67     SELECT
68       contract_id, contract_version_num,
69       contract_number,
70       contract_name
71     FROM  okc_rep_contract_vers v
72     WHERE termination_date IS NOT NULL
73     AND   contract_status_code = G_REP_CON_STATUS_SIGNED
74     AND   trunc(termination_date) <= trunc(SYSDATE);
75 
76     TYPE selected_contracts_tbl IS TABLE OF contracts_cur%ROWTYPE;
77     TYPE selected_vers_contracts_tbl IS TABLE OF contract_vers_cur%ROWTYPE;
78     TYPE NumList IS TABLE OF okc_rep_contracts_all.contract_id%TYPE NOT NULL
79           INDEX BY PLS_INTEGER;
80     TYPE VersionNumList IS TABLE OF okc_rep_contracts_all.contract_version_num%TYPE NOT NULL
81           INDEX BY PLS_INTEGER;
82 
83     selected_contracts selected_contracts_tbl;
84     selected_vers_contracts selected_vers_contracts_tbl;
85     selected_contract_ids NumList;
86     selected_vers_contract_ids NumList;
87     selected_vers_contract_ver VersionNumList;
88 
89     l_batch_size number(4) := 1000;
90     l_first_iteration VARCHAR2(1);
91     l_count number;
92 
93 
94   BEGIN
95     FND_FILE.PUT_LINE(FND_FILE.LOG, '***** BEGIN contract_status_updater *****');
96 
97     FND_FILE.PUT_LINE(FND_FILE.LOG, 'p_status = ' || p_status);
98 
99     l_api_name    := 'contract_status_updater';
100     l_api_version := 1.0;
101     l_first_iteration := 'Y';
102     l_count := 0;
103 
104     -- Standard call to check for call compatibility.
105     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
106       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
107     END IF;
108 
109     -- Initialize message list if p_init_msg_list is set to TRUE.
110     IF FND_API.to_Boolean( p_init_msg_list ) THEN
111       FND_MSG_PUB.initialize;
112     END IF;
113 
114     -- Update the status of the terminated contracts in the active contracts table
115     OPEN contracts_cur;
116     LOOP -- the following statement fetches 1000 rows or less in each iteration
117 
118       FETCH contracts_cur BULK COLLECT INTO selected_contracts
119       LIMIT l_batch_size;
120 
121       EXIT WHEN selected_contracts.COUNT = 0;
122 
123       -- Show the text Contract Details only once
124       IF (l_first_iteration = 'Y') THEN
125 
126         l_first_iteration := 'N';
127 
128         FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '');
129         FND_FILE.PUT_LINE(FND_FILE.LOG, '');
130         FND_FILE.PUT_LINE(FND_FILE.OUTPUT, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_SW_CONTRACT_DETAILS'));
131         FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '================');
132         FND_FILE.PUT_LINE(FND_FILE.LOG, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_SW_CONTRACT_DETAILS'));
133         FND_FILE.PUT_LINE(FND_FILE.LOG, '================');
134 
135       END IF;
136 
137 
138       FOR i IN 1..NVL(selected_contracts.LAST, -1) LOOP
139         l_count := l_count + 1;
140 
141         -- Populate the current contract details into concurrent output and log files
142 
143         -- Add Contract Name
144         FND_FILE.PUT_LINE(FND_FILE.OUTPUT, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_ATTR_CON_NAME') || '               : '|| selected_contracts(i).contract_name);
145         FND_FILE.PUT_LINE(FND_FILE.LOG, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_ATTR_CON_NAME') || '               : '|| selected_contracts(i).contract_name);
146 
147         -- Add Contract Number
148         FND_FILE.PUT_LINE(FND_FILE.OUTPUT, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_SW_ATTR_CON_NUMBER') || '             : '|| selected_contracts(i).contract_number);
149         FND_FILE.PUT_LINE(FND_FILE.LOG, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_SW_ATTR_CON_NUMBER') || '             : '|| selected_contracts(i).contract_number);
150 
151         -- Add Contract Version Number
152 	FND_FILE.PUT_LINE(FND_FILE.OUTPUT, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_SW_ATTR_CON_VER_NUM') || '            : '|| selected_contracts(i).contract_version_num);
153         FND_FILE.PUT_LINE(FND_FILE.LOG, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_SW_ATTR_CON_VER_NUM') || '            : '|| selected_contracts(i).contract_version_num);
154 
155         FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '');
156         FND_FILE.PUT_LINE(FND_FILE.LOG, '');
157 
158         -- Prepare a number array of contract ids, this is required by the UPDATE
159         -- statement under FORALL as it will not take selected_contracts(i).contract_id in the WHERE clause
160         -- Getting the following compilation error
161         -- PLS-00436: implementation restriction: cannot reference fields of BULK In-BIND table of records
162         selected_contract_ids(i) := selected_contracts(i).contract_id;
163 
164       END LOOP;
165 
166       FORALL j IN NVL(selected_contract_ids.FIRST,0)..NVL(selected_contract_ids.LAST,-1)
167         UPDATE okc_rep_contracts_all
168         SET    contract_status_code = p_status,
169                last_update_date = sysdate,
170                last_updated_by = Fnd_Global.User_Id,
171                last_update_login = Fnd_Global.Login_Id
172         WHERE  contract_id = selected_contract_ids(j);
173 
174     END LOOP;
175 
176     IF contracts_cur%ISOPEN THEN
177       CLOSE contracts_cur ;
178     END IF;
179 
180     -- Update the status of the terminated contracts in the archived contracts table
181     OPEN contract_vers_cur;
182     LOOP -- the following statement fetches 1000 rows or less in each iteration
183 
184       FETCH contract_vers_cur BULK COLLECT INTO selected_vers_contracts
185       LIMIT l_batch_size;
186 
187       EXIT WHEN selected_vers_contracts.COUNT = 0;
188 
189       -- Show the text Contract Details only once
190       IF (l_first_iteration = 'Y') THEN
191 
192         l_first_iteration := 'N';
193 
194         FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '');
195         FND_FILE.PUT_LINE(FND_FILE.LOG, '');
196         FND_FILE.PUT_LINE(FND_FILE.OUTPUT, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_SW_CONTRACT_DETAILS'));
197         FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '================');
198         FND_FILE.PUT_LINE(FND_FILE.LOG, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_SW_CONTRACT_DETAILS'));
199         FND_FILE.PUT_LINE(FND_FILE.LOG, '================');
200 
201       END IF;
202 
203       FOR i IN 1..NVL(selected_vers_contracts.LAST, -1) LOOP
204 
205         l_count := l_count + 1;
206 
207         -- Populate the current contract details into concurrent output and log files
208 
209         -- Add Contract Name
210         FND_FILE.PUT_LINE(FND_FILE.OUTPUT, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_ATTR_CON_NAME') || '               : '|| selected_vers_contracts(i).contract_name);
211         FND_FILE.PUT_LINE(FND_FILE.LOG, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_ATTR_CON_NAME') || '               : '|| selected_vers_contracts(i).contract_name);
212 
213         -- Add Contract Number
214         FND_FILE.PUT_LINE(FND_FILE.OUTPUT, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_SW_ATTR_CON_NUMBER') || '             : '|| selected_vers_contracts(i).contract_number);
215         FND_FILE.PUT_LINE(FND_FILE.LOG, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_SW_ATTR_CON_NUMBER') || '             : '|| selected_vers_contracts(i).contract_number);
216 
217         -- Add Contract Version Number
218 	FND_FILE.PUT_LINE(FND_FILE.OUTPUT, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_SW_ATTR_CON_VER_NUM') || '            : '|| selected_vers_contracts(i).contract_version_num);
219         FND_FILE.PUT_LINE(FND_FILE.LOG, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_SW_ATTR_CON_VER_NUM') || '            : '|| selected_vers_contracts(i).contract_version_num);
220 
221         FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '');
222         FND_FILE.PUT_LINE(FND_FILE.LOG, '');
223 
224         -- Prepare a number array of contract ids and version numbers, this is required by the UPDATE
225         -- statement under FORALL as it will not take selected_vers_contracts(i).contract_id in the WHERE clause
226         -- Getting the following compilation error
227         -- PLS-00436: implementation restriction: cannot reference fields of BULK In-BIND table of records
228         selected_vers_contract_ids(i) := selected_vers_contracts(i).contract_id;
229         selected_vers_contract_ver(i) := selected_vers_contracts(i).contract_version_num;
230 
231       END LOOP;
232 
233       FORALL j IN NVL(selected_vers_contract_ids.FIRST,0)..NVL(selected_vers_contract_ids.LAST,-1)
234         UPDATE okc_rep_contract_vers
235         SET    contract_status_code = p_status,
236                last_update_date = sysdate,
237                last_updated_by = Fnd_Global.User_Id,
238                last_update_login = Fnd_Global.Login_Id
239         WHERE  contract_id = selected_vers_contract_ids(j)
240         AND    contract_version_num = selected_vers_contract_ver(j);
241 
242     END LOOP;
243 
244     IF contract_vers_cur%ISOPEN THEN
245       CLOSE contract_vers_cur ;
246     END IF;
247 
248     FND_FILE.PUT_LINE(FND_FILE.OUTPUT, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_UPD_STS_SUMMARY') || ' : ' || l_count);
249     FND_FILE.PUT_LINE(FND_FILE.LOG, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_UPD_STS_SUMMARY') || ' : ' || l_count);
250 
251     COMMIT;
252 
253   EXCEPTION
254     WHEN OTHERS THEN
255 
256       FND_FILE.PUT_LINE(FND_FILE.OUTPUT, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_UPD_STS_ERROR'));
257       FND_FILE.PUT_LINE(FND_FILE.LOG, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_UPD_STS_ERROR'));
258 
259       FND_FILE.PUT_LINE(FND_FILE.OUTPUT, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_UPD_STS_SYS_ERR') || ' ' || sqlerrm);
260       FND_FILE.PUT_LINE(FND_FILE.LOG, OKC_TERMS_UTIL_PVT.get_message(G_APP_NAME, 'OKC_REP_UPD_STS_SYS_ERR') || ' ' || sqlerrm);
261 
262       ROLLBACK;
263 
264       --close cursors
265       IF contracts_cur%ISOPEN THEN
266         CLOSE contracts_cur ;
267       END IF;
268       IF contract_vers_cur%ISOPEN THEN
269         CLOSE contract_vers_cur ;
270       END IF;
271 
272       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
273 
274       x_msg_count := 1;
275       x_msg_data := substr(SQLERRM, 1, 200);
276 
277       Okc_Api.Set_Message(
278         p_app_name     => G_APP_NAME,
279         p_msg_name     => G_UNEXPECTED_ERROR,
280         p_token1       => G_SQLCODE_TOKEN,
281         p_token1_value => SQLCODE,
282         p_token2       => G_SQLERRM_TOKEN,
283         p_token2_value => SQLERRM);
284 
285       FND_MSG_PUB.Count_And_Get(
286         p_count =>  x_msg_count,
287         p_data  =>  x_msg_data
288       );
289 
290   END contract_status_updater;
291 
292 -- Start of comments
293 --API name      : contract_status_update_manager
294 --Type          : Private.
295 --Function      : Called from Concurrent Manager to update
296 --                status for contract reaching their
297 --                termination date
298 --Pre-reqs      : None.
299 --Parameters    :
300 --IN            : p_status IN VARCHAR2 Required
301 --OUT           : errbuf  OUT NOCOPY VARCHAR2
302 --              : retcode OUT NOCOPY VARCHAR2
303 --Note          :
304 -- End of comments
305 
306   PROCEDURE contract_status_update_manager(
307     p_status IN VARCHAR2,
308     errbuf  OUT NOCOPY VARCHAR2,
309     retcode OUT NOCOPY VARCHAR2)
310   IS
311     l_api_version   NUMBER;
312     l_api_name      VARCHAR2(32);
313     l_init_msg_list VARCHAR2(2000);
314     l_msg_data      VARCHAR2(2000);
315     l_msg_count     NUMBER;
316     l_return_status VARCHAR2(2000);
317     l_status        VARCHAR2(32);
318 
319   BEGIN
320 
321     FND_FILE.PUT_LINE(FND_FILE.LOG, '***** BEGIN contract_status_update_manager *****');
322 
323     l_api_name    := 'contract_status_update_manager';
324     l_api_version   := 1.0;
325     l_init_msg_list := FND_API.G_FALSE;
326     l_status := 'NONE';
327 
328     FND_FILE.PUT_LINE(FND_FILE.LOG, 'p_status = (' || p_status || ')');
329     FND_FILE.PUT_LINE(FND_FILE.LOG, 'l_status = (' || l_status || ')');
330 
331     IF p_status IS NULL OR LENGTH(TRIM(p_status)) = 0 THEN
332       l_status := G_REP_CON_STATUS_TERMINATED;
333     END IF;
334 
335     FND_FILE.PUT_LINE(FND_FILE.LOG, 'l_status = (' || l_status || ')');
336 
337     contract_status_updater(
338       p_api_version   => l_api_version,
339       p_init_msg_list => l_init_msg_list,
340       p_status        => l_status,
341       x_msg_data      => l_msg_data,
342       x_msg_count     => l_msg_count,
343       x_return_status => l_return_status
344     );
345 
346     IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
347       retcode := G_RETURN_CODE_ERROR;
348       errbuf := substr(FND_MSG_PUB.Get(), 1, 200);
349     END IF;
350 
351     FND_FILE.PUT_LINE(FND_FILE.LOG, '***** END contract_status_update_manager() *****');
352 
353   EXCEPTION
354     WHEN OTHERS THEN
355       FND_FILE.PUT_LINE(FND_FILE.LOG, '***** EXCEPTION OTHERS*****');
356       FND_FILE.PUT_LINE(FND_FILE.LOG, SQLERRM);
357 
358       retcode := G_RETURN_CODE_ERROR;
359       errbuf := substr(SQLERRM, 1, 200);
360 
361   END contract_status_update_manager;
362 
363 END OKC_REP_STATUS_UPDATE_PVT;