DBA Data[Home] [Help]

PACKAGE BODY: APPS.CN_GET_SRP_DATA_PVT

Source


1 PACKAGE BODY CN_GET_SRP_DATA_PVT AS
2   /*$Header: cnvsfgtb.pls 115.18.115100.3 2004/05/11 01:33:08 sbadami ship $*/
3 
4 PROCEDURE Get_Srp_List
5   (x_srp_data                   OUT NOCOPY    srp_data_tbl_type) IS
6 
7    CURSOR get_data IS
8    select srp_id, name, emp_num from cn_srp_hr_data order by name;
9 
10    rownum      NUMBER := 0;
11 
12 BEGIN
13    for c in get_data loop
14       rownum := rownum + 1;
15       x_srp_data(rownum).srp_id  := c.srp_id;
16       x_srp_data(rownum).name    := c.name;
17       x_srp_data(rownum).emp_num := c.emp_num;
18    end loop;
19 END Get_Srp_List;
20 
21 PROCEDURE Search_Srp_Data
22   (p_range_low                  IN     NUMBER,
23    p_range_high                 IN     NUMBER,
24    p_date                       IN     DATE,
25    p_search_name                IN     VARCHAR2 := '%',
26    p_search_job                 IN     VARCHAR2 := '%',
27    p_search_emp_num             IN     VARCHAR2 := '%',
28    p_search_group               IN     VARCHAR2 := '%',
29    p_order_by                   IN     NUMBER   := 1,
30    p_order_dir                  IN     VARCHAR2 := 'ASC',
31    x_total_rows                 OUT NOCOPY    NUMBER,
32    x_srp_data                   OUT NOCOPY    srp_data_tbl_type) IS
33 
34    TYPE rc IS ref cursor;
35 
36    query   VARCHAR2(4000) := '
37    select distinct
38           s.srp_id             srp_id,
39           s.name               name,
40           s.emp_num            emp_num,
41           s.start_date         start_date,
42           s.end_date           end_date,
43           s.cost_center        cost_center,
44           sg.group_id          comp_group_id,
45           c.group_name         comp_group_name,
46           j.job_id             job_code,
47           j.name               job_title,
48           srd.job_discretion   disc_job_title,
49           -- sr.role_id          role_id,
50           -- null                role_name
51           1                    role_id,
52           ''A''                role_name
53      from cn_srp_hr_data       s,
54           cn_srp_role_dtls     srd,
55           cn_srp_roles         sr,
56           per_jobs             j,
57           jtf_rs_group_members sg,
58           jtf_rs_groups_tl     c,
59           jtf_rs_group_usages  u,
60           jtf_rs_role_relations rr2
61     where s.srp_id           = sr.salesrep_id
62       and sr.srp_role_id     = srd.srp_role_id
63       and srd.job_title_id   = j.job_id (+)
64       and s.resource_id      = sg.resource_id
65       and sg.group_id        = c.group_id
66       and c.language = userenv(''LANG'')
67       and u.group_id = c.group_id
68       and rr2.role_resource_id = sg.group_member_id
69       and rr2.role_resource_type = ''RS_GROUP_MEMBER''
70       and rr2.role_id = sr.role_id
71       and rr2.delete_flag = ''N''
72       and sg.delete_flag = ''N''
73       and u.usage = ''SF_PLANNING''';
74 
75    cursor get_job_code (l_job_title_id in number) is
76    select job_code
77      from cn_job_titles
78     where job_title_id = l_job_title_id;
79 
80    rec            srp_data_rec_type;
81    l_index        NUMBER := 0;
82    query_cur      rc;
83    l_name         VARCHAR2(241) := upper(p_search_name)    || '%';
84    l_emp_num      VARCHAR2(31)  := upper(p_search_emp_num) || '%';
85 
86 BEGIN
87    x_total_rows   := 0;
88 
89    if (p_search_name <> '%') then
90       query := query || ' and upper(s.name) like :1';
91     else
92       query := query || ' and :1 is not null'; -- dummy to get past :1
93    end if;
94 
95    if (p_search_emp_num <> '%') then
96       query := query || ' and upper(s.emp_num) like :2';
97     else
98       query := query || ' and :2 is not null';
99    end if;
100 
101    if (p_search_job <> '%') then
102       query := query || ' and j.job_id = :3';
103     else
104       query := query || ' and :3 is not null';
105    end if;
106 
107    if (p_search_group <> '%') then
108       query := query || ' and c.group_id = :4';
109     else
110       query := query || ' and :4 is not null';
111    end if;
112 
113    query := query || ' and :5 between rr2.start_date_active and' ||
114                                 ' nvl(rr2.end_date_active, :6)' || 'and (:7 between sr.start_date and nvl(sr.end_date,:8))';
115 
116    -- order by clause
117    query := query || ' order by ' || p_order_by || ' ' || p_order_dir;
118 
119    open query_cur for query using l_name, l_emp_num, p_search_job,
120                                   p_search_group, p_date, p_date,p_date,p_date;
121    loop
122       fetch query_cur into rec;
123       exit when query_cur%notfound;
124 
125       x_total_rows := x_total_rows + 1;
126       if x_total_rows between p_range_low and p_range_high then
127 	 l_index := l_index + 1;
128 	 x_srp_data(l_index).srp_id         := rec.srp_id;
129 	 x_srp_data(l_index).name           := rec.name;
130 	 x_srp_data(l_index).emp_num        := rec.emp_num;
131 	 x_srp_data(l_index).job_title      := rec.job_title;
132 	 x_srp_data(l_index).disc_job_title := rec.disc_job_title;
133 	 x_srp_data(l_index).comp_group_id  := rec.comp_group_id;
134 	 x_srp_data(l_index).comp_group_name:= rec.comp_group_name;
135 
136 	 -- get job_code
137 	 open  get_job_code(rec.job_code);
138 	 fetch get_job_code into x_srp_data(l_index).job_code;
139 	 close get_job_code;
140 
141       end if;
142    end loop;
143    close query_cur;
144 
145 END Search_Srp_Data;
146 
147 PROCEDURE Get_Srp_Data
148   (p_srp_id                     IN     NUMBER,
149    x_srp_data                   OUT NOCOPY    srp_data_tbl_type) IS
150 
151    CURSOR c is
152    select s.srp_id,
153 	  s.name,
154 	  s.emp_num,
155 	  s.start_date,
156 	  s.end_date,
157 	  s.cost_center,
158           null comp_group_name, null comp_group_id,
159           null job_code, null job_title, null disc_job_title,
160           null role_id,  null role_name  --recycle rec type
161      from cn_srp_hr_data    s
162     where s.srp_id = p_srp_id;
163 BEGIN
164    open  c;
165    fetch c into x_srp_data(1);
166    close c;
167 END;
168 
169 PROCEDURE Get_Managers
170   (p_srp_id                     IN     NUMBER,
171    p_date                       IN     DATE,
172    p_comp_group_id              IN     NUMBER,
173    x_srp_data                   OUT NOCOPY    srp_data_tbl_type) IS
174 
175    g_end_of_time                DATE := to_date('12/31/9999', 'MM/DD/YYYY');
176 
177    -- working variables
178    l_fy_start_date              DATE;
179    l_cg_start_date              DATE;
180    l_cg_end_date                DATE;
181    l_mgr_assign_start           DATE;
182    l_mgr_assign_end             DATE;
183    l_manager_flag               VARCHAR2(1);
184    l_rownum                     NUMBER := 0;
185 
186    cursor get_fy_start_date is
187    select min(p2.start_date)
188      from cn_period_statuses p1,
189           cn_period_statuses p2
190     where p_date between p1.start_date and p1.end_date
191       and p1.period_year = p2.period_year;
192 
193    cursor get_srp_group_info is
194    select manager_flag, start_date_active,
195 	  nvl(end_date_active, g_end_of_time) end_date_active
196      from cn_qm_mgr_srp_groups
197     where srp_id = p_srp_id and comp_group_id = p_comp_group_id;
198 
199    cursor get_group_members (l_comp_group_id in number) is
200    select sg.role_id, sg.role_name, sg.start_date_active, sg.group_name,
201           nvl(sg.end_date_active, g_end_of_time) end_date_active,
202           sg.srp_id, sd.name srp_name, sd.emp_num, sg.manager_flag,
203           decode(sg.manager_flag, 'Y', sd.name || ' *', sd.name) ast_name
204      from cn_qm_mgr_srp_groups sg, cn_srp_hr_data sd
205     where sg.comp_group_id = l_comp_group_id and sg.srp_id = sd.srp_id;
206 
207    cursor get_parent_groups is
208    select parent_comp_group_id, start_date_active,
209           nvl(end_date_active, g_end_of_time) end_date_active
210      from cn_qm_group_hier
211     where comp_group_id = p_comp_group_id;
212 
213 BEGIN
214    -- get information of current srp comp_group assignment
215    open  get_srp_group_info;
216    fetch get_srp_group_info into l_manager_flag, l_cg_start_date,l_cg_end_date;
217    close get_srp_group_info;
218 
219    -- get date range we are interested in for this query
220    -- (beginning of current FY until p_date)
221    open  get_fy_start_date;
222    fetch get_fy_start_date into l_fy_start_date;
223    close get_fy_start_date;
224 
225    -- if the current srp_id is a salesrep in its group, add its own
226    -- group's manager to mgr list if it exists.  if it exists, indicate
227    -- with (*) and don't fetch higher managers
228    if l_manager_flag = 'N' then
229       for pgm in get_group_members(p_comp_group_id) loop
230 	 -- make sure this group_member is a manager
231 	 if pgm.manager_flag = 'Y' then
232 	    -- check date range intersections
233 	    -- we want (current group assign dates) int
234 	    -- (parent member assign dates)
235 	    l_mgr_assign_start := greatest(l_cg_start_date,
236 					   pgm.start_date_active);
237 	    l_mgr_assign_end   :=    least(l_cg_end_date,
238 					   pgm.end_date_active);
239 	    -- if date range exists (start <= end) and it intersects current
240 	    -- date interval then insert into result tbl
241 	    if (l_mgr_assign_start <= l_mgr_assign_end AND
242 		greatest(l_mgr_assign_start, l_fy_start_date) <=
243 		least   (l_mgr_assign_end,   p_date)) then
244 	       -- realize that g_end_of_time is really null
245 	       if l_mgr_assign_end = g_end_of_time then
246 		  l_mgr_assign_end := null;
247 	       end if;
248 	       l_rownum := l_rownum + 1;
249 	       x_srp_data(l_rownum).srp_id          := pgm.srp_id;
250 	       x_srp_data(l_rownum).name            := pgm.ast_name;
251 	       x_srp_data(l_rownum).emp_num         := pgm.emp_num;
252 	       x_srp_data(l_rownum).start_date      := l_mgr_assign_start;
253 	       x_srp_data(l_rownum).end_date        := l_mgr_assign_end;
254 	       x_srp_data(l_rownum).comp_group_id   := p_comp_group_id;
255 	       x_srp_data(l_rownum).comp_group_name := pgm.group_name;
256 	       x_srp_data(l_rownum).role_id         := pgm.role_id;
257 	       x_srp_data(l_rownum).role_name       := pgm.role_name;
258 	    end if;
259 	 end if;
260       end loop;
261    end if;
262 
263    -- get info about members of parent groups and add it to result table
264    -- if salesrep doesn't already have a manger
265    if l_rownum = 0 then
266    for pg in get_parent_groups loop
267       -- for each parent group, get its members
268       for pgm in get_group_members(pg.parent_comp_group_id) loop
269 	 -- check date range intersections
270 	 -- we want (current group assign dates) int
271 	 -- (dates on hierarchy edge) int (parent group assign dates)
272 	 l_mgr_assign_start := greatest(l_cg_start_date,
273 					pg.start_date_active,
274 					pgm.start_date_active);
275 	 l_mgr_assign_end   :=    least(l_cg_end_date,
276 					pg.end_date_active,
277 					pgm.end_date_active);
278 	 -- if date range exists (start <= end) and it intersects current
279 	 -- date interval then insert into result tbl
280 	 if (l_mgr_assign_start <= l_mgr_assign_end AND
281 	     greatest(l_mgr_assign_start, l_fy_start_date) <=
282   	     least   (l_mgr_assign_end,   p_date)) then
283 	    -- realize that g_end_of_time is really null
284 	    if l_mgr_assign_end = g_end_of_time then
285 	       l_mgr_assign_end := null;
286 	    end if;
287 	    l_rownum := l_rownum + 1;
288 	    x_srp_data(l_rownum).srp_id          := pgm.srp_id;
289 	    x_srp_data(l_rownum).name            := pgm.ast_name;
290 	    x_srp_data(l_rownum).emp_num         := pgm.emp_num;
291 	    x_srp_data(l_rownum).start_date      := l_mgr_assign_start;
292 	    x_srp_data(l_rownum).end_date        := l_mgr_assign_end;
293 	    x_srp_data(l_rownum).comp_group_id   := pg.parent_comp_group_id;
294 	    x_srp_data(l_rownum).comp_group_name := pgm.group_name;
295 	    x_srp_data(l_rownum).role_id         := pgm.role_id;
296 	    x_srp_data(l_rownum).role_name       := pgm.role_name;
297 	 end if;
298       end loop;
299    end loop;
300    end if;
301 
302 END Get_Managers;
303 
304 END CN_GET_SRP_DATA_PVT;
305