Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
a_kovalnogov 21.08.2007 19:14
интересный подход в парсере -"ЗАЧЕМ ЭТО НУЖНО ИЛИ КОНКРЕТНЕЕ ЗАДАЧУ".-- Курсор возвращает БЛ по месяцам procedure cur_hp_for_months_serv (p_hp_id in hospital_pages.id%type ,p_view in number default 2 -- ПРОсмотр - 1 расчет ,p_hp_for_months in out t_hp_for_months) is -- Количество дней больничного за счет предприятия v_count_day_ill_on_firm number := constants.value_cond_constant_for_date('count_day_ill_on_firm',constants.sal_current_period); v_month number(2); v_year number(4); v_count_day_ill number(4); v_account_no_firm accounts.account_no%type; v_account_no_fsi accounts.account_no%type; v_payment_item_on_firm number; v_payment_item_on_fsi number; v_hp_id_initial number; -- id родительского больничного (самого первого) v_initial_hp_date_first date; -- Дата первичного больничного (самого первого) v_start_month number; -- месяц начала выборки ЗП для средней v_start_year number; -- год начала выборки ЗП для средней v_average_sal_day number; -- среднедневная v_average_sal_hour number; -- среднечасовая v_average_sal_day_percent number; -- среднедневная с учетом % v_average_sal_hour_percent number; -- среднедчасоваы с учетом % p_time_work_less_6_month number; -- Если человек отработал на фабрике меньше чем пол года = 1 p_minimum_salary number; -- минимальная зп на дату наступления страхового случая v_cur general.t_cur; cursor cr_hp is select hp.employee_tab_num as emp_num ,hp.date_first ,hp.date_last ,hp.type_hospital_page ,hp.parent ,hp.method_calc ,hp.percent_pay ,hp.postone_id ,i.illness_type_code ,i.source_pay from hospital_pages hp ,illnesses i where hp.illnesse_num = i.num and hp.id = p_hp_id; rec_hp cr_hp%rowtype; v_emp_num employees.tab_num%type; v_date_hp_first hospital_pages.date_first%type; v_date_hp_last hospital_pages.date_last%type; v_type_hospital_page hospital_pages.type_hospital_page%type; v_parent hospital_pages.parent%type; v_method_calc hospital_pages.method_calc%type; v_percent_pay hospital_pages.percent_pay%type; v_illness_type illnesses.illness_type_code%type; v_source_pay illnesses.source_pay%type; v_postone_id hospital_pages.postone_id%type; v_key_hp varchar2(300); -- все параметры больничного v_division_num number; cursor cr_division is select po.division_num from employee_postones ep ,postonefound_orders po where ep.postone_id = po.order_num and ep.employee_tab_num = v_emp_num and ep.date_period = trunc(last_day(constants.sal_current_period)); ----- -- курсор возвращает БЛ с разбивкой по месяцам и источникам оплаты (из средств предприятия и ФСС) procedure cur_hp_firm (p_count_day_ill_on_firm in number ,p_hp_firm out t_hp_for_months) is begin open p_hp_firm for select it1.month as month ,it1.year as year ,it1.date_first as date_first ,it1.date_last as date_last ,it1.count_festive as count_festive ,it1.count_day_ill as count_day ,it1.count_hours_ill as count_hours_ill ,get_sum_hp(it1.key ,it1.count_day_ill ,it1.count_hours_ill ,v_key_hp) as payment_sum ,it1.payment_code as payment_code ,it1.account as account ,it1.account_no as account_no ,it1.type_hospital_page as type_hospital_page ,it1.parent as parent ,0 as return_code ,it1.key as key ,v_key_hp as key_hp from (select ur.month ,ur.year ,min(ur.date_absent) date_first ,max(ur.date_absent) date_last ,nvl(sum(ur.festive),0) count_festive ,nvl(sum(ur.ill),0) count_day_ill ,nvl(sum(ur.count_hours),0) count_hours_ill ,ur.payment_code ,ac.account_no account ,ac.account_no_alt||' '||ac.account_name account_no ,ur.type_hospital_page ,ur.parent ,0 return_code ,ur.month||'^'||ur.year||'^'||ur.payment_code||'^'||ac.account_no key from accounts ac ,(select distinct to_number(to_char(a.date_absent,'mm')) month ,to_number(to_char(a.date_absent,'yyyy'))year ,a.date_absent ,decode(a.timeboard_symbol_code,'х',0,1) festive ,decode(a.timeboard_symbol_code,'х',1,0) ill ,a.count_hours ,v_payment_item_on_firm payment_code ,v_account_no_firm account_no ,hp.type_hospital_page ,hp.parent ,hp.id ,hp.method_calc ,hp.percent_pay from hospital_pages hp ,v_symbol_hospital_pages a where hp.id = a.hp_id and a.date_absent >= hp.date_first and a.date_absent <= decode(sign(p_count_day_ill_on_firm - (hp.date_last - hp.date_first + 1)) ,-1,hp.date_first + p_count_day_ill_on_firm - 1 ,hp.date_last) and hp.id = p_hp_id union all -- + fsi select distinct to_number(to_char(a.date_absent,'mm')) month ,to_number(to_char(a.date_absent,'yyyy'))year ,a.date_absent ,decode(a.timeboard_symbol_code,'х',0,1) festive ,decode(a.timeboard_symbol_code,'х',1,0) ill ,a.count_hours ,v_payment_item_on_fsi payment_code ,v_account_no_fsi account_no ,hp.type_hospital_page ,hp.parent ,hp.id ,hp.method_calc ,hp.percent_pay from hospital_pages hp ,v_symbol_hospital_pages a where hp.id = a.hp_id and a.date_absent >= hp.date_first + p_count_day_ill_on_firm and a.date_absent <= hp.date_last and hp.id = p_hp_id) ur where ac.account_no = ur.account_no group by ur.month ,ur.year ,ur.payment_code ,ac.account_no ,ac.account_no_alt ,ac.account_name ,ur.type_hospital_page ,ur.parent ,ur.method_calc ,ur.percent_pay ) it1 order by date_first; end cur_hp_firm; ----- -- курсор возвращает БЛ с разбивкой по месяцам (источник оплаты - только из средств ФСС) procedure cur_hp_fsi(p_hp_fsi out t_hp_for_months) is begin open p_hp_fsi for select it1.month as month ,it1.year as year ,it1.date_first as date_first ,it1.date_last as date_last ,it1.count_festive as count_festive ,it1.count_day_ill as count_day ,it1.count_hours_ill as count_hours_ill ,get_sum_hp(it1.key ,it1.count_day_ill ,it1.count_hours_ill ,v_key_hp) as payment_sum ,it1.payment_code as payment_code ,it1.account as account ,it1.account_no as account_no ,it1.type_hospital_page as type_hospital_page ,it1.parent as parent ,0 as return_code ,it1.key as key ,v_key_hp as key_hp from (select ur.month month ,ur.year year ,min(ur.date_absent) date_first ,max(ur.date_absent) date_last ,nvl(sum(ur.festive),0) count_festive ,nvl(sum(ur.ill),0) count_day_ill ,nvl(sum(ur.count_hours),0) count_hours_ill ,ur.payment_code payment_code ,ac.account_no account ,ac.account_no_alt||' '||ac.account_name account_no -- имя счета и название - для отображения ,ur.type_hospital_page type_hospital_page ,ur.parent parent ,0 return_code ,ur.month||'^'||ur.year||'^'||ur.payment_code||'^'||ac.account_no key from accounts ac ,(select distinct to_number(to_char(a.date_absent,'mm')) month ,to_number(to_char(a.date_absent,'yyyy'))year ,a.date_absent ,decode(a.timeboard_symbol_code,'х',0,1) festive ,decode(a.timeboard_symbol_code,'х',1,0) ill ,a.count_hours ,v_payment_item_on_fsi payment_code ,v_account_no_fsi account_no ,a.type_hospital_page ,a.parent ,a.method_calc ,a.percent_pay from v_symbol_hospital_pages a where a.hp_id = p_hp_id) ur where ac.account_no = ur.account_no group by ur.month ,ur.year ,ur.payment_code ,ac.account_no ,ac.account_no_alt ,ac.account_name ,ur.type_hospital_page ,ur.parent ,ur.method_calc ,ur.percent_pay) it1 order by date_first; end cur_hp_fsi; ----- begin v_month := to_number(to_char(constants.sal_current_period,'mm')); v_year := to_number(to_char(constants.sal_current_period,'yyyy')); -- определяем последний месяц и год выборки средней з-ты для расчета БЛ start_period_for_calc_hp(p_hp_id ,v_hp_id_initial -- out САМЫЙ первичный больничный ,v_initial_hp_date_first -- out дата САМОГО первичного больничного(дата наступления страхового случая) ,v_start_month -- out начальный месяц первичного больничного ,v_start_year ); -- out начальный год первичного больничного -- определяем среднуюю з-ту БЛ sal_hospital_page.payment_illness (p_hp_id ,v_start_month ,v_start_year ,p_view ,v_average_sal_day -- out среднедневная ,v_average_sal_hour -- out среднечаосвая ,v_average_sal_day_percent -- out среднедневная за вычетм % ,v_average_sal_hour_percent -- out среднечаосвая за вычетм % ,v_cur); ----- Определяем параметры больничного open cr_hp; fetch cr_hp into rec_hp; close cr_hp; v_emp_num := rec_hp.emp_num; v_date_hp_first := rec_hp.date_first; v_date_hp_last := rec_hp.date_last; v_type_hospital_page := rec_hp.type_hospital_page; v_parent := rec_hp.parent; v_method_calc := rec_hp.method_calc; v_percent_pay := rec_hp.percent_pay; v_illness_type := rec_hp.illness_type_code; v_source_pay := rec_hp.source_pay; v_postone_id := rec_hp.postone_id; -- определяем подразделение по коду ШЕ и Таб номеру на посдеднюю дату текущего периода open cr_division; fetch cr_division into v_division_num; close cr_division; -------------- определяем есть ли ограничение на 6 месяцев стажа get_param_start_hp(v_emp_num ,v_initial_hp_date_first -- in дата первоначального больничного ,p_time_work_less_6_month -- out p_time_work_less_6_month := 1 если человек отработал на фабрике меньше чем пол года ,p_minimum_salary); -- out минимальная ЗП на момент наступления ситрахового случая (самый первый родительский больничный) --- Определяем счета и код начисления для фонда соцстраха v_payment_item_on_fsi := sal_calculation.payment_item_for_document('БЛ',null,null,null,v_illness_type,null,null,null); v_account_no_fsi := sal_calculation.get_cost_item(v_month,v_year,'БЛ',null,null,null,v_illness_type,null,null,null,null,null); --- Определяем счета и код начисления для предприятия v_payment_item_on_firm := constants.value_cond_constant_for_date('payment_item_illnesspay_on_firm',constants.sal_current_period); v_account_no_firm := sal_calculation.get_cost_item(v_month,v_year,v_payment_item_on_firm); -- Формируем Ключ со всеми параметрами больничного (чтоб не плодить кучу полей и передаем в курсор) v_key_hp := v_emp_num ||'^'|| --1 v_date_hp_first ||'^'|| --2 Дата начала болезни v_date_hp_last ||'^'|| --3 Дата конца болезни v_type_hospital_page ||'^'|| --4 Тип больничного 0-первый, 1-продолжение предыдущего БЛ v_parent ||'^'|| --5 id Родительский больничный v_method_calc ||'^'|| --6 Метод расчета = 0-расчет ведется по дням, 1- по часам v_percent_pay ||'^'|| --7 % оплаты (зависти от количества лет стажа) v_illness_type ||'^'|| --8 тип заболевания (для видов начисления з-ты) (хвороба,догляд,декрет,виробнича травма,травма) v_source_pay ||'^'|| --9 источник оплаты больничного 1- из средств предприятия и ФСС, 0-только из ФСС --------------- v_division_num ||'^'|| --10 подразделение по коду ШЕ и Таб номеру на посдеднюю дату текущего периода v_payment_item_on_fsi ||'^'|| --11 код начисления для фонда соцстраха v_account_no_fsi ||'^'|| --12 счет для фонда соцстраза v_payment_item_on_firm||'^'|| --13 код начисления для предприятия v_account_no_firm ||'^'|| --14 счет для предприятия --------------- v_average_sal_day ||'^'|| --15 среднедневная v_average_sal_hour ||'^'|| --16 среднечасовая --------------- p_time_work_less_6_month ||'^'|| --17 1 если человек отработал на фабрике меньше чем пол года p_minimum_salary ||'^'|| --18 минимальная ЗП на дату наступления страхового случая v_postone_id ||'^'|| --19 Код штатной единицы из больничного (нельзя использовать функции из за уволенных рабочих с больничными) --------------- v_average_sal_day_percent ||'^'||--20 среднедневная за вычетм % v_average_sal_hour_percent||'^'||--21 среднечаосвая за вычетм % v_initial_hp_date_first ; -- 22 дата наступления страхового случая -- Форомируем курсор if v_source_pay = 1 then --источник оплаты больничного 1-из средств предприятия и ФСС if v_type_hospital_page = 1 then -- 1-продолжение предыдущего БЛ -- оперделяем кол-во дней болезни (по предыдущим БЛ) v_count_day_ill := count_day_previous_hp(v_parent); -- если кол-во дней предыдущих БЛ более или равно 5 значит уже оплачено из средств предприятия -- т.е. оплата только из средств ФСС if v_count_day_ill >= v_count_day_ill_on_firm then cur_hp_fsi(p_hp_for_months); else -- определяем кол-во дней которые нужно оплатить из средств предприятия v_count_day_ill_on_firm := v_count_day_ill_on_firm - v_count_day_ill; cur_hp_firm(v_count_day_ill_on_firm,p_hp_for_months); end if; else -- первичный БЛ cur_hp_firm(v_count_day_ill_on_firm,p_hp_for_months); end if; else --0-только из ФСС cur_hp_fsi(p_hp_for_months); end if; end cur_hp_for_months_serv;