DBA Data[Home] [Help]

PACKAGE BODY: APPS.HZ_EXTRACT_BO_UTIL_PVT

Source


1 PACKAGE BODY HZ_EXTRACT_BO_UTIL_PVT  AS
2 /*$Header: ARHEUTVB.pls 120.11.12010000.2 2009/06/25 06:04:58 vsegu ship $ */
3 /*
4  * @rep:scope public
5  * @rep:product HZ
6  * @rep:displayname Contact Point
7  * @rep:category BUSINESS_ENTITY
8  * @rep:lifecycle active
9  * @rep:doccd 115hztig.pdf Oracle Trading Community Architecture Technical Implementation Guide
10  */
11 
12 procedure validate_event_id(p_event_id in number,
13 			    p_party_id in number,
14   			    p_event_type in varchar2,
15 			    p_bo_code in varchar2,
16 			    x_return_status  out nocopy varchar2) is
17 
18 	cursor c1 is
19 	 SELECT 'Y'
20 	 FROM HZ_BUS_OBJ_TRACKING
21 	 WHERE parent_bo_code is null
22 	 and event_id = p_event_id
23 	 and  child_entity_name = 'HZ_PARTIES'
24 	 and child_id  = nvl(p_party_id, child_id)
25 	 and child_bo_code = p_bo_code
26 	 and nvl(parent_event_flag, p_event_type) = p_event_type
27 	 and rownum = 1;
28 
29 l_valid_flag varchar2(1);
30 begin
31 	-- initialize API return status to success.
32     	x_return_status := FND_API.G_RET_STS_SUCCESS;
33 
34 	open c1;
35 	fetch c1 into l_valid_flag;
36 	close c1;
37 
38 	if NVL(l_valid_flag, 'N') <> 'Y'
39 	then
40 		if p_party_id is null
41 	    	then
42 			FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_EVENT_ID');
43 			FND_MSG_PUB.ADD;
44 			x_return_status := FND_API.G_RET_STS_ERROR;
45 			RAISE FND_API.G_EXC_ERROR;
46       		else
47 	    		FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_EVENT_OBJ_ID');
48 			FND_MSG_PUB.ADD;
49 			x_return_status := FND_API.G_RET_STS_ERROR;
50 			RAISE FND_API.G_EXC_ERROR;
51 		end if;
52 	end if;
53 
54 
55 end;
56 
57 FUNCTION get_parent_object_type(
58     p_parent_table_name           IN     VARCHAR2,
59     p_parent_id             IN     NUMBER
60  ) RETURN VARCHAR2 IS
61 
62   l_party_type varchar2(30) := null;
63 
64     cursor c1 is
65 	select party_type
66 	from hz_parties
67 	where party_id = p_parent_id;
68 
69      cursor c2 is
70 	select party_type
71 	from hz_parties p, hz_cust_accounts ca
72 	where p.party_id = ca.party_id
73         and ca.cust_account_id = p_parent_id;
74 
75     cursor c_cp is
76         select contact_point_type
77         from HZ_CONTACT_POINTS
78         where contact_point_id = p_parent_id;
79 
80   BEGIN
81 	if p_parent_table_name = 'HZ_PARTIES'
82 	then
83 		open c1;
84 		fetch c1 into l_party_type;
85 		close c1;
86         elsif p_parent_table_name = 'HZ_CONTACT_POINTS'
87         then
88                 open c_cp;
89                 fetch c_cp into l_party_type;
90                 close c_cp;
91 	elsif p_parent_table_name = 'HZ_CUST_ACCOUNTS'
92 	then
93 		open c2;
94 		fetch c2 into l_party_type;
95 		close c2;
96 	end if;
97 
98     -- Base on owner_table_name to return HZ_BUSINESS_OBJECTS lookup code
99     IF(p_parent_table_name = 'HZ_PARTY_SITES') THEN
100       RETURN 'PARTY_SITE';
101     ELSIF(p_parent_table_name = 'HZ_PARTIES') THEN
102       IF(l_party_type = 'ORGANIZATION') THEN
103         RETURN 'ORG';
104       ELSIF(l_party_type = 'PERSON') THEN
105         RETURN 'PERSON';
106       ELSIF(l_party_type = 'PARTY_RELATIONSHIP') THEN
107         RETURN 'ORG_CONTACT';
108       END IF;
109     ELSIF(p_parent_table_name = 'HZ_CONTACT_POINTS') THEN
110       RETURN l_party_type;
111     ELSIF(p_parent_table_name = 'HZ_CUST_ACCOUNTS') THEN
112       IF(l_party_type = 'ORGANIZATION') THEN
113         RETURN 'ORG_CUST';
114       ELSIF(l_party_type = 'PERSON') THEN
115         RETURN 'PERSON_CUST';
116       ELSIF(l_party_type IS NULL) THEN
117         RETURN 'CUST_ACCT';
118       END IF;
119     ELSIF(p_parent_table_name = 'HZ_CUST_ACCOUNT_ROLES') THEN
120       RETURN 'CUST_ACCT_CONTACT';
121     ELSIF(p_parent_table_name = 'HZ_CUST_ACCT_SITES_ALL') THEN
122       RETURN 'CUST_ACCT_SITE';
123     END IF;
124     RETURN NULL;
125 END get_parent_object_type;
126 
127 FUNCTION get_user_name(p_user_id in number) return varchar2 is
128 	cursor get_user_name_csr is
129 		select user_name
130 		from fnd_user
131 		where user_id = p_user_id;
132 
133 l_name varchar2(100);
134 begin
135       IF G_RETURN_USER_NAME = 'Y' THEN
136 	open  get_user_name_csr;
137 	fetch  get_user_name_csr into l_name;
138 	close  get_user_name_csr;
139 	return l_name;
140       ELSE
141 	return p_user_id;
142       END IF;
143 end;
144 
145 
146 -- Central procedure for getting root event id.
147 
148 procedure get_bo_root_ids(
149     p_init_msg_list       IN            VARCHAR2 := fnd_api.g_false,
150     p_event_id            IN           	NUMBER,
151     x_obj_root_ids        OUT NOCOPY    BO_ID_TBL,
152     x_return_status       OUT NOCOPY    VARCHAR2,
153     x_msg_count           OUT NOCOPY    NUMBER,
154     x_msg_data            OUT NOCOPY    VARCHAR2
155   ) is
156 l_debug_prefix              VARCHAR2(30) := '';
157 
158 cursor c1 is
159 	 SELECT child_id
160 	 FROM HZ_BUS_OBJ_TRACKING
161 	 WHERE parent_bo_code is null
162 	 and event_id = p_event_id
163 	 and  child_entity_name = 'HZ_PARTIES';
164 
165 begin
166 	-- initialize API return status to success.
167     	x_return_status := FND_API.G_RET_STS_SUCCESS;
168 
169     	-- Initialize message list if p_init_msg_list is set to TRUE
170     	IF FND_API.to_Boolean(p_init_msg_list) THEN
171       		FND_MSG_PUB.initialize;
172     	END IF;
173 
174 
175 	-- Debug info.
176         IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
177         	hz_utility_v2pub.debug(p_message=>'get_bo_root_ids(+)',
178                                p_prefix=>l_debug_prefix,
179                                p_msg_level=>fnd_log.level_procedure);
180     	END IF;
181 
182 
183 	open c1;
184 	fetch c1 bulk collect into x_obj_root_ids;
185 	close c1;
186 
187 	-- Debug info.
188     	IF fnd_log.level_exception>=fnd_log.g_current_runtime_level THEN
189          	hz_utility_v2pub.debug_return_messages(p_msg_count=>x_msg_count,
190                                p_msg_data=>x_msg_data,
191                                p_msg_type=>'WARNING',
192                                p_msg_level=>fnd_log.level_exception);
193     	END IF;
194 
195     	-- Debug info.
196         IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
197         	hz_utility_v2pub.debug(p_message=>'get_bo_root_ids (-)',
198                                p_prefix=>l_debug_prefix,
199                                p_msg_level=>fnd_log.level_procedure);
200     	END IF;
201 
202 
203  EXCEPTION
204 
205   WHEN fnd_api.g_exc_error THEN
206       x_return_status := fnd_api.g_ret_sts_error;
207 
208       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
209                                 p_count => x_msg_count,
210                                 p_data  => x_msg_data);
211 
212       -- Debug info.
213       IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
214         hz_utility_v2pub.debug_return_messages(p_msg_count=>x_msg_count,
215                                p_msg_data=>x_msg_data,
216                                p_msg_type=>'ERROR',
217                                p_msg_level=>fnd_log.level_error);
218       END IF;
219       IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
220         hz_utility_v2pub.debug(p_message=>'get_bo_root_ids(-)',
221                                p_prefix=>l_debug_prefix,
222                                p_msg_level=>fnd_log.level_procedure);
223       END IF;
224     WHEN fnd_api.g_exc_unexpected_error THEN
225       x_return_status := fnd_api.g_ret_sts_unexp_error;
226 
227       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
228                                 p_count => x_msg_count,
229                                 p_data  => x_msg_data);
230 
231       -- Debug info.
232       IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
233         hz_utility_v2pub.debug_return_messages(p_msg_count=>x_msg_count,
234                                p_msg_data=>x_msg_data,
235                                p_msg_type=>'UNEXPECTED ERROR',
236                                p_msg_level=>fnd_log.level_error);
237       END IF;
238       IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
239         hz_utility_v2pub.debug(p_message=>'get_bo_root_ids(-)',
240                                p_prefix=>l_debug_prefix,
241                                p_msg_level=>fnd_log.level_procedure);
242       END IF;
243     WHEN OTHERS THEN
244       x_return_status := fnd_api.g_ret_sts_unexp_error;
245 
246       fnd_message.set_name('AR', 'HZ_API_OTHERS_EXCEP');
247       fnd_message.set_token('ERROR' ,SQLERRM);
248       fnd_msg_pub.add;
249 
250       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
251                                 p_count => x_msg_count,
252                                 p_data  => x_msg_data);
253 
254       -- Debug info.
255       IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
256         hz_utility_v2pub.debug_return_messages(p_msg_count=>x_msg_count,
257                                p_msg_data=>x_msg_data,
258                                p_msg_type=>'SQL ERROR',
259                                p_msg_level=>fnd_log.level_error);
260       END IF;
261       IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
262         hz_utility_v2pub.debug(p_message=>'get_bo_root_ids(-)',
263                                p_prefix=>l_debug_prefix,
264                                p_msg_level=>fnd_log.level_procedure);
265       END IF;
266 
267 end;
268 
269  FUNCTION is_ss_provided(
270     p_os                  IN     VARCHAR2,
271     p_osr                 IN     VARCHAR2
272   ) RETURN VARCHAR2 IS
273   BEGIN
274     IF((p_os is null or p_os = fnd_api.g_miss_char)
275       and (p_osr is null or p_osr = fnd_api.g_miss_char))THEN
276       RETURN 'N';
277     ELSE
278       RETURN 'Y';
279     END IF;
280   END is_ss_provided;
281 
282 PROCEDURE validate_ssm_id(
283     px_id                        IN OUT NOCOPY NUMBER,
284     px_os                        IN OUT NOCOPY VARCHAR2,
285     px_osr                       IN OUT NOCOPY VARCHAR2,
286     p_org_id                     IN            NUMBER := NULL,
287     p_obj_type                   IN            VARCHAR2,
288     x_return_status              OUT NOCOPY    VARCHAR2,
289     x_msg_count                  OUT NOCOPY    NUMBER,
290     x_msg_data                   OUT NOCOPY    VARCHAR2
291   ) IS
292     CURSOR is_cp_valid(l_cp_id NUMBER, l_cp_type VARCHAR2) IS
293     SELECT 'X'
294     FROM HZ_CONTACT_POINTS
295     WHERE contact_point_id = l_cp_id
296     AND contact_point_type = l_cp_type;
297 
298     CURSOR is_oc_valid(l_oc_id NUMBER) IS
299     SELECT 'X'
300     FROM HZ_ORG_CONTACTS
301     WHERE org_contact_id = l_oc_id;
302 
303     CURSOR is_pty_valid(l_pty_id NUMBER, l_pty_type VARCHAR2) IS
304     SELECT 'X'
305     FROM HZ_PARTIES
306     WHERE party_id = l_pty_id
307     AND party_type = l_pty_type
308     AND status in ('A', 'I');
309 
310     CURSOR is_ps_valid(l_ps_id NUMBER) IS
311     SELECT 'X'
312     FROM HZ_PARTY_SITES
313     WHERE party_site_id = l_ps_id;
314 
315     CURSOR is_loc_valid(l_loc_id NUMBER) IS
316     SELECT 'X'
317     FROM HZ_LOCATIONS
318     WHERE location_id = l_loc_id;
319 
320     CURSOR is_cr_valid(l_cr_id NUMBER) IS
321     SELECT 'X'
322     FROM HZ_CUST_ACCOUNT_ROLES
323     WHERE cust_account_role_id = l_cr_id;
324 
325     CURSOR is_ca_valid(l_ca_id NUMBER) IS
326     SELECT 'X'
327     FROM HZ_CUST_ACCOUNTS
328     WHERE cust_account_id = l_ca_id;
329 
330     CURSOR is_cas_valid(l_cas_id NUMBER, l_org_id NUMBER) IS
331     SELECT 'X'
332     FROM HZ_CUST_ACCT_SITES
333     WHERE cust_acct_site_id = l_cas_id;
334 
335     CURSOR is_casu_valid(l_casu_id NUMBER, l_org_id NUMBER) IS
336     SELECT 'X'
337     FROM HZ_CUST_SITE_USES
338     WHERE site_use_id = l_casu_id;
339 
340     l_owner_table_id            NUMBER;
341     l_ss_flag                   VARCHAR2(1);
342     l_debug_prefix              VARCHAR2(30);
343     l_valid_id                  VARCHAR2(1);
344     l_count                     NUMBER;
345     l_org_id                    NUMBER;
346     l_dummy                     VARCHAR2(1);
347     l_obj_type                  VARCHAR2(30);
348   BEGIN
349     -- Debug info.
350     IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
351         hz_utility_v2pub.debug(p_message=>'validate_ssm_id(+)',
352                                p_prefix=>l_debug_prefix,
353                                p_msg_level=>fnd_log.level_procedure);
354     END IF;
355 
356     x_return_status := FND_API.G_RET_STS_SUCCESS;
357 
358     l_ss_flag := is_ss_provided(p_os  => px_os,
359                                 p_osr => px_osr);
360 
361     -- if px_id pass in, check if px_id is valid or not
362     IF(px_id IS NOT NULL) THEN
363 
364       IF(p_obj_type in ('PHONE','TLX','EMAIL','WEB','EFT','EDI','SMS')) THEN
365         OPEN is_cp_valid(px_id, p_obj_type);
366         FETCH is_cp_valid INTO l_valid_id;
367         CLOSE is_cp_valid;
368       ELSIF(p_obj_type = 'HZ_ORG_CONTACTS') THEN
369         OPEN is_oc_valid(px_id);
370         FETCH is_oc_valid INTO l_valid_id;
371         CLOSE is_oc_valid;
372       ELSIF(p_obj_type in ('PERSON','ORGANIZATION','PARTY_RELATIONSHIP')) THEN
373         OPEN is_pty_valid(px_id, p_obj_type);
374         FETCH is_pty_valid INTO l_valid_id;
375         CLOSE is_pty_valid;
376       ELSIF(p_obj_type = 'HZ_CUST_ACCOUNT_ROLES') THEN
377         OPEN is_cr_valid(px_id);
378         FETCH is_cr_valid INTO l_valid_id;
379         CLOSE is_cr_valid;
380       ELSIF(p_obj_type = 'HZ_LOCATIONS') THEN
381         OPEN is_loc_valid(px_id);
382         FETCH is_loc_valid INTO l_valid_id;
383         CLOSE is_loc_valid;
384       ELSIF(p_obj_type = 'HZ_PARTY_SITES') THEN
385         OPEN is_ps_valid(px_id);
386         FETCH is_ps_valid INTO l_valid_id;
387         CLOSE is_ps_valid;
388       ELSIF(p_obj_type = 'HZ_CUST_ACCOUNTS') THEN
389         OPEN is_ca_valid(px_id);
390         FETCH is_ca_valid INTO l_valid_id;
391         CLOSE is_ca_valid;
392       ELSIF(p_obj_type = 'HZ_CUST_ACCT_SITES_ALL') THEN
393         OPEN is_cas_valid(px_id, p_org_id);
394         FETCH is_cas_valid INTO l_valid_id;
395         CLOSE is_cas_valid;
399         CLOSE is_casu_valid;
396       ELSIF(p_obj_type = 'HZ_CUST_SITE_USES_ALL') THEN
397         OPEN is_casu_valid(px_id, p_org_id);
398         FETCH is_casu_valid INTO l_valid_id;
400       END IF;
401     END IF;
402 
403 
404     -- if px_os/px_osr pass in, get owner_table_id and set l_ss_flag to 'Y'
405     IF(l_ss_flag = 'Y')THEN
406       IF(p_obj_type in ('PHONE','TLX','EMAIL','WEB','EFT','EDI','SMS')) THEN
407         l_obj_type := 'HZ_CONTACT_POINTS';
408       ELSIF(p_obj_type in ('PERSON','ORGANIZATION','PARTY_RELATIONSHIP')) THEN
409         l_obj_type := 'HZ_PARTIES';
410       ELSE
411         l_obj_type := p_obj_type;
412       END IF;
413 
414 
415       -- Get how many rows return
416       l_count := HZ_MOSR_VALIDATE_PKG.get_orig_system_ref_count(
417                    p_orig_system           => px_os,
418                    p_orig_system_reference => px_osr,
419                    p_owner_table_name      => l_obj_type);
420 
421       IF(l_count = 1) THEN
422         -- Get owner_table_id
423         HZ_ORIG_SYSTEM_REF_PUB.get_owner_table_id(
424           p_orig_system           => px_os,
425           p_orig_system_reference => px_osr,
426           p_owner_table_name      => l_obj_type,
427           x_owner_table_id        => l_owner_table_id,
428           x_return_status         => x_return_status);
429 
430         -- For contact point, check if the id and type is the same
431         IF(p_obj_type in ('PHONE','TLX','EMAIL','WEB','EFT','EDI','SMS')) THEN
432           OPEN is_cp_valid(l_owner_table_id, p_obj_type);
433           FETCH is_cp_valid INTO l_dummy;
434           CLOSE is_cp_valid;
435           IF(l_dummy IS NULL) THEN
436             FND_MESSAGE.SET_NAME('AR', 'HZ_API_INVALID_TCA_ID');
437             FND_MSG_PUB.ADD;
438             RAISE fnd_api.g_exc_error;
439           END IF;
440         END IF;
441       END IF;
442     END IF;
443 
444       -- if px_id pass in
445       IF(px_id IS NOT NULL) THEN
446         -- if px_id is invalid, raise error
447         IF(l_valid_id IS NULL) THEN
448           FND_MESSAGE.SET_NAME('AR','HZ_API_INVALID_TCA_ID');
449           FND_MSG_PUB.ADD();
450           RAISE fnd_api.g_exc_error;
451         -- if px_id is valid
452         ELSE
453           -- check if px_os/px_osr is passed
454           IF(l_ss_flag = 'Y') THEN
455             IF(l_count = 0) THEN
456               FND_MESSAGE.SET_NAME('AR','HZ_API_INVALID_SSM_ID');
457               FND_MSG_PUB.ADD();
458               RAISE fnd_api.g_exc_error;
459             -- if px_os/px_osr is valid
460             ELSE
461               -- if px_os/px_osr is valid, but not same as px_id
462               IF(l_owner_table_id <> px_id) OR (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
463                 FND_MESSAGE.SET_NAME('AR','HZ_API_INVALID_TCA_SSM_ID');
464                 FND_MSG_PUB.ADD();
465                 RAISE fnd_api.g_exc_error;
466               END IF;
467             END IF;
468             -- if px_os/px_osr is valid and return value is same as px_id
469             -- do nothing
470           END IF;
471         END IF;
472       -- if px_id not pass in
473       ELSE
474         -- check if px_os/px_osr can find TCA identifier, owner_table_id
475         -- if not found, raise error
476         -- else, get owner_table_id and assign it to px_id
477         IF(l_ss_flag = 'Y') AND (l_count = 1) AND (x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
478           px_id := l_owner_table_id;
479         ELSE
480           FND_MESSAGE.SET_NAME('AR','HZ_API_INVALID_SSM_ID');
481           FND_MSG_PUB.ADD();
482           RAISE fnd_api.g_exc_error;
483         END IF;
484       END IF;
485 
486   EXCEPTION
487     WHEN fnd_api.g_exc_error THEN
488       x_return_status := fnd_api.g_ret_sts_error;
489 
490       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
491                                 p_count => x_msg_count,
492                                 p_data  => x_msg_data);
493 
494       -- Debug info.
495       IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
496         hz_utility_v2pub.debug_return_messages(p_msg_count=>x_msg_count,
497                                p_msg_data=>x_msg_data,
498                                p_msg_type=>'ERROR',
499                                p_msg_level=>fnd_log.level_error);
500       END IF;
501       IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
502         hz_utility_v2pub.debug(p_message=>'validate_ssm_id(-)',
503                                p_prefix=>l_debug_prefix,
504                                p_msg_level=>fnd_log.level_procedure);
505       END IF;
506     WHEN fnd_api.g_exc_unexpected_error THEN
507       x_return_status := fnd_api.g_ret_sts_unexp_error;
508 
509       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
510                                 p_count => x_msg_count,
511                                 p_data  => x_msg_data);
512 
513       -- Debug info.
514       IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
515         hz_utility_v2pub.debug_return_messages(p_msg_count=>x_msg_count,
516                                p_msg_data=>x_msg_data,
517                                p_msg_type=>'UNEXPECTED ERROR',
518                                p_msg_level=>fnd_log.level_error);
519       END IF;
520       IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
521         hz_utility_v2pub.debug(p_message=>'validate_ssm_id(-)',
522                                p_prefix=>l_debug_prefix,
523                                p_msg_level=>fnd_log.level_procedure);
524       END IF;
525     WHEN OTHERS THEN
526       x_return_status := fnd_api.g_ret_sts_unexp_error;
527 
531 
528       fnd_message.set_name('AR', 'HZ_API_OTHERS_EXCEP');
529       fnd_message.set_token('ERROR' ,SQLERRM);
530       fnd_msg_pub.add;
532       fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
533                                 p_count => x_msg_count,
534                                 p_data  => x_msg_data);
535 
536       -- Debug info.
537       IF fnd_log.level_error>=fnd_log.g_current_runtime_level THEN
538         hz_utility_v2pub.debug_return_messages(p_msg_count=>x_msg_count,
539                                p_msg_data=>x_msg_data,
540                                p_msg_type=>'SQL ERROR',
541                                p_msg_level=>fnd_log.level_error);
542       END IF;
543       IF fnd_log.level_procedure>=fnd_log.g_current_runtime_level THEN
544         hz_utility_v2pub.debug(p_message=>'validate_ssm_id(-)',
545                                p_prefix=>l_debug_prefix,
546                                p_msg_level=>fnd_log.level_procedure);
547       END IF;
548   END validate_ssm_id;
549 
550 
551 END HZ_EXTRACT_BO_UTIL_PVT;