Facebook
From Gamboge Coyote, 3 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 87
  1. # /packages/intranet-core/tcl/intranet-user-procs.tcl
  2. #
  3. # Copyright (C) 1998-2004 various parties
  4. # The code is based on ArsDigita ACS 3.4
  5. #
  6. # This program is free software. You can redistribute it
  7. # and/or modify it under the terms of the GNU General
  8. # Public License as published by the Free Software Foundation;
  9. # either version 2 of the License, or (at your option)
  10. # any later version. This program is distributed in the
  11. # hope that it will be useful, but WITHOUT ANY WARRANTY;
  12. # without even the implied warranty of MERCHANTABILITY or
  13. # FITNESS FOR A PARTICULAR PURPOSE.
  14. # See the GNU General Public License for more details.
  15.  
  16.  
  17.  
  18. ad_proc -public im_user_permissions { current_user_id user_id view_var read_var write_var admin_var } {
  19.     Fill the "by-reference" variables read, write and admin
  20.     with the permissions of $current_user_id on $user_id
  21. } {
  22.     upvar $view_var view
  23.     upvar $read_var read
  24.     upvar $write_var write
  25.     upvar $admin_var admin
  26.  
  27.     set view 0
  28.     set read 0
  29.     set write 0
  30.     set admin 0
  31.  
  32.     if {"" == $user_id} { return }
  33.     if {"" == $current_user_id} { return }
  34.  
  35.     # Admins and creators can do everything
  36.     set user_is_admin_p [im_is_user_site_wide_or_intranet_admin $current_user_id]
  37.     set creation_user_id [util_memoize "db_string creator {select creation_user from acs_objects where object_id = $user_id} -default 0"]
  38.         set hr_p 0
  39.         if { [im_profile::member_p -profile "HR Managers" -user_id $current_user_id] && [im_user_is_employee_p $user_id]} {
  40.                 set hr_p 1
  41.         }
  42.     if {$user_is_admin_p || $current_user_id == $creation_user_id || $hr_p} {
  43.         set view 1
  44.         set read 1
  45.         set write 1
  46.         set admin 1
  47.         return
  48.     }
  49.  
  50.     # Get the list of profiles of user_id (the one to be managed)
  51.     # together with the information if current_user_id can read/write
  52.     # it.
  53.     # m.group_id are all the groups to whom user_id belongs
  54.     set profile_perm_sql "
  55.                 select
  56.                         m.group_id,
  57.                         im_object_permission_p(m.group_id, :current_user_id, 'view') as view_p,
  58.                         im_object_permission_p(m.group_id, :current_user_id, 'read') as read_p,
  59.                         im_object_permission_p(m.group_id, :current_user_id, 'write') as write_p,
  60.                         im_object_permission_p(m.group_id, :current_user_id, 'admin') as admin_p
  61.                 from
  62.                         acs_objects o,
  63.                         group_distinct_member_map m
  64.                 where
  65.                         m.member_id = :user_id
  66.                         and m.group_id = o.object_id
  67.                         and o.object_type = 'im_profile'
  68.     "
  69.     set first_loop 1
  70.     db_foreach profile_perm_check $profile_perm_sql {
  71.         ns_log Notice "im_user_permissions: $group_id: view=$view_p read=$read_p write=$write_p admin=$admin_p"
  72.         if {$first_loop} {
  73.             # set the variables to 1 if current_user_id is member of atleast
  74.             # one group. Otherwise, an unpriviliged user could read the data
  75.             # of another unpriv user
  76.             set view 1
  77.             set read 1
  78.             set write 1
  79.             set admin 1
  80.         }
  81.  
  82.         if {[string equal f $view_p]} { set view 0 }
  83.         if {[string equal f $read_p]} { set read 0 }
  84.         if {[string equal f $write_p]} { set write 0 }
  85.         if {[string equal f $admin_p]} { set admin 0 }
  86.         set first_loop 0
  87.     }
  88.  
  89.     # Myself - I can read and write its data
  90.     if { $user_id == $current_user_id } {
  91.                 set read 1
  92.                 set write 1
  93.                 set admin 0
  94.     }
  95.  
  96.  
  97.     if {$admin} {
  98.                 set read 1
  99.                 set write 1
  100.     }
  101.     if {$read} { set view 1 }
  102.  
  103.     ns_log Notice "im_user_permissions: cur=$current_user_id, user=$user_id, view=$view, read=$read, write=$write, admin=$admin"
  104.  
  105. }
  106.  
  107.  
  108. ad_proc -public user_permissions { current_user_id user_id view_var read_var write_var admin_var } {
  109.     Helper being called when calling dynamic permissions
  110.     for objects (im_biz_objects...).<br>
  111.     This procedure is identical to im_user_permissions.
  112. } {
  113.     upvar $view_var view
  114.     upvar $read_var read
  115.     upvar $write_var write
  116.     upvar $admin_var admin
  117.  
  118.     im_user_permissions $current_user_id $user_id view read write admin
  119. }
  120.  
  121.  
  122.  
  123. ad_proc -public im_user_base_info_component {
  124.     -user_id:required
  125.     { -return_url ""}
  126. } {
  127.     Returns a formatted piece of HTML showing the user's name and email
  128. } {
  129.     if {"" == $return_url} { set return_url [im_url_with_query] }
  130.     set params [list \
  131.                     [list user_id $user_id] \
  132.                     [list return_url [im_url_with_query]] \
  133.     ]
  134.  
  135.     set result [ad_parse_template -params $params "/packages/intranet-core/www/users/base-info-component"]
  136.     return [string trim $result]
  137. }
  138.  
  139.  
  140. ad_proc -public im_sysadmin_user_default { } {
  141.     Determines the default system Administrator account
  142.     Just takes the lowest user_id from the members of
  143.     the Admin group...
  144. } {
  145.  
  146.     set user_id [util_memoize "db_string default_admin \"
  147.         select
  148.                 min(user_id) as user_id
  149.         from
  150.                 acs_rels ar,
  151.                 membership_rels mr,
  152.                 users u
  153.         where
  154.                 ar.rel_id = mr.rel_id
  155.                 and u.user_id = ar.object_id_two
  156.                 and ar.object_id_one = [im_admin_group_id]
  157.                 and mr.member_state = 'approved'
  158.     \" -default 0" 60]
  159.  
  160.     return $user_id
  161. }
  162.  
  163.  
  164.  
  165. ad_proc -public im_user_options {
  166.     {-include_empty_p 1}
  167.     {-include_empty_name ""}
  168.     {-group_id 0}
  169.     {-group_name ""}
  170.     {-biz_object_id ""}
  171. } {
  172.     Returns the options for a select box.
  173. } {
  174.     if {"" != $group_name} {
  175.         set group_id [util_memoize "db_string group \"select group_id from groups where group_name = '$group_name'\" -default 0"]
  176.     }
  177.  
  178.     set group_select_sql ""
  179.     set biz_object_select_sql ""
  180.     if {0 != $group_id && "" != $group_id} {
  181.         set group_select_sql "and user_id in (select member_id from group_distinct_member_map where group_id = :group_id)"
  182.     }
  183.     if {0 != $biz_object_id && "" != $biz_object_id} {
  184.         set biz_object_select_sql "and user_id in (select object_id_two from acs_rels where object_id_one = :biz_object_id)"
  185.     }
  186.  
  187.     set options [db_list_of_lists provider_options "
  188.                 select
  189.                         im_name_from_user_id(u.user_id) as name,
  190.                         u.user_id
  191.                 from
  192.                         cc_users u
  193.                 where
  194.                         1=1
  195.                         $group_select_sql
  196.                         $biz_object_select_sql
  197.                 order by name
  198.     "]
  199.     if {$include_empty_p} { set options [linsert $options 0 [list $include_empty_name "" ]] }
  200.     return $options
  201. }
  202.  
  203. ad_proc -public im_employee_options { {include_empty 1} } {
  204.     Cost provider options
  205. } {
  206.     set options [db_list_of_lists provider_options "
  207.         select  im_name_from_user_id(user_id) as name,
  208.                 user_id
  209.         from    im_employees_active
  210.         order by name
  211.     "]
  212.     if {$include_empty} { set options [linsert $options 0 { "" "" }] }
  213.     return $options
  214. }
  215.  
  216. ad_proc -public im_project_manager_options {
  217.     {-include_empty 1}
  218.     {-current_pm_id 0}
  219. } {
  220.     Cost provider options
  221. } {
  222.         set current_user_id [ad_get_user_id]
  223.         set is_mem [db_string is_mem "
  224.                 select count(*)
  225.                 from group_distinct_member_map
  226.                 where member_id= :current_user_id and group_id=461
  227.         "]
  228.        
  229.         if {$is_mem} { set company_id_tt [db_string company_id_tt "
  230.                 select object_id_one
  231.                 from acs_rels r
  232.                 where object_id_two = :current_user_id
  233.                 and rel_type = 'im_company_employee_rel'
  234.                 "] } \
  235.         else { set company_id_tt 8720 }
  236.        
  237.         set options [db_list_of_lists provider_options "
  238.         select * from (
  239.                 select  im_name_from_user_id(r.object_id_two) as name, r.object_id_two
  240.                 from    acs_rels r
  241.                 where   r.object_id_one = $company_id_tt
  242.         )t
  243.         order by name
  244.     "]
  245.     if {$include_empty} { set options [linsert $options 0 { "" "" }] }
  246.     return $options
  247. }
  248.  
  249. ad_proc -public im_nus_co_options {
  250.     {-include_empty 1}
  251.     {-current_pm_id 0}
  252. } {
  253.     NUS member list
  254. } {
  255.         set current_user_id [ad_get_user_id]
  256.         set is_mem [db_string is_mem "
  257.                 select count(*)
  258.                 from group_distinct_member_map
  259.                 where member_id= :current_user_id and group_id=461
  260.         "]
  261.        
  262.         if {$is_mem} { set company_id_nus [db_string company_id_nus "
  263.                 select object_id_one
  264.                 from acs_rels r
  265.                 where object_id_two = :current_user_id
  266.                 and rel_type = 'im_company_employee_rel'
  267.                 "] } \
  268.         else { set company_id_nus 36804 }
  269.        
  270.        
  271.         set limit_to_group_id_sql "
  272.         and exists (select 1
  273.                 from
  274.                         group_member_map map2,
  275.                         membership_rels mr,
  276.                         groups ug
  277.                 where
  278.                         map2.group_id = ug.group_id
  279.                         and map2.rel_id = mr.rel_id
  280.                         and mr.member_state = 'approved'
  281.                         and map2.member_id = u.user_id
  282.                         and map2.group_id = [im_customer_group_id]
  283.                 )
  284.         "
  285.        
  286.         set dont_allow_sql "
  287.         and not exists (
  288.                 select 1
  289.                 from
  290.                         group_member_map map2,
  291.                         membership_rels mr,
  292.                         groups ug
  293.                 where
  294.                         map2.group_id = ug.group_id
  295.                         and map2.rel_id = mr.rel_id
  296.                         and mr.member_state = 'approved'
  297.                         and map2.member_id = u.user_id
  298.                         and map2.group_id = [im_customer_group_id]
  299.                 )
  300.         "
  301.        
  302.         set options [db_list_of_lists provider_options "
  303.         select
  304.                 im_name_from_user_id(u.user_id),
  305.                 u.user_id as party_id,
  306.                 im_email_from_user_id(u.user_id) as email,
  307.                 im_name_from_user_id(u.user_id) as name,
  308.                 im_category_from_id(c.category_id) as member_role,
  309.                 c.category_gif as role_gif,
  310.                 c.category_description as role_description
  311.         from
  312.                 users u,
  313.                 acs_rels rels
  314.                 LEFT OUTER JOIN im_biz_object_members bo_rels ON (rels.rel_id = bo_rels.rel_id)
  315.                 LEFT OUTER JOIN im_categories c ON (c.category_id = bo_rels.object_role_id),
  316.                 group_member_map m,
  317.                 membership_rels mr
  318.         where
  319.                 rels.object_id_one = $company_id_nus
  320.                 and rels.object_id_two = u.user_id
  321.                 and mr.member_state = 'approved'
  322.                 and u.user_id = m.member_id
  323.                 and mr.member_state = 'approved'
  324.                 and m.group_id = acs__magic_object_id('registered_users'::character varying)
  325.                 and m.rel_id = mr.rel_id
  326.                 and m.container_id = m.group_id
  327.                 and m.rel_type = 'membership_rel'
  328.  
  329.                 $limit_to_group_id_sql
  330.                
  331.         order by lower(im_name_from_user_id(u.user_id))
  332.     "]
  333.     if {$include_empty} { set options [linsert $options 0 { "" "" }] }
  334.     return $options
  335. }
  336.  
  337.  
  338. ad_proc im_user_select {
  339.     {-include_empty_p 0}
  340.     {-add_html 0}
  341.     {-include_empty_name "All"}
  342.     {-group_id 0 }
  343.     select_name
  344.     { default "" }
  345. } {
  346.     Returns an html select box named $select_name and defaulted to
  347.     $default with a list of all the available project_leads in
  348.     the system
  349. } {
  350.  
  351.     if {0 == $group_id} { set group_id [im_employee_group_id] }
  352.     # Check if somebody tries to fiddle with SQL
  353.     foreach id $group_id {
  354.                 if {![string is integer $id]} {
  355.                     ad_return_complaint 1 "Please notify Frank"
  356.                     ad_script_abort
  357.                 }
  358.     }
  359.  
  360.     set user_options [im_profile::user_options -profile_ids $group_id]
  361.     if {$include_empty_p} { set user_options [linsert $user_options 0 [list $include_empty_name ""]] }
  362.     if { $add_html != 0 } {
  363.         return [im_options_to_select_box $select_name $user_options $default $add_html]
  364.         } else {
  365.                 return [im_options_to_select_box $select_name $user_options $default]
  366.         }
  367. }
  368.  
  369. ad_proc im_employee_select_multiple { select_name { defaults "" } { size "6"} {multiple ""}} {
  370.     set bind_vars [ns_set create]
  371.     set employee_group_id [im_employee_group_id]
  372.     set sql "
  373. select
  374.         u.user_id,
  375.         im_name_from_user_id(u.user_id) as employee_name
  376. from
  377.         registered_users u,
  378.         group_distinct_member_map gm
  379. where
  380.         u.user_id = gm.member_id
  381.         and gm.group_id = $employee_group_id
  382. order by lower(im_name_from_user_id(u.user_id))
  383. "
  384.     return [im_selection_to_list_box -translate_p "0" $bind_vars category_select $sql $select_name $defaults $size $multiple]
  385. }    
  386.  
  387. ad_proc im_filing_select_multiple { select_name { defaults "" } { size "6"} {multiple ""}} {
  388.     set bind_vars [ns_set create]
  389.     set filing_group_id [im_filing_group_id]
  390.     set sql "
  391. select
  392.         u.user_id,
  393.         im_name_from_user_id(u.user_id) as employee_name
  394. from
  395.         registered_users u,
  396.         group_distinct_member_map gm
  397. where
  398.         u.user_id = gm.member_id
  399.         and gm.group_id = $filing_group_id
  400. order by lower(im_name_from_user_id(u.user_id))
  401. "
  402.     return [im_selection_to_list_box -translate_p "0" $bind_vars category_select $sql $select_name $defaults $size $multiple]
  403. }    
  404.  
  405. # ------------------------------------------
  406. # Created 20-1-2015
  407. # Nihit Malhotra
  408. ad_proc im_trainee_training_complete_add_notification { } {
  409.         set trainee_list [db_list get_trainee_list "select object_id_two from acs_rels where object_id_one=241834 and rel_type='membership_rel' "]
  410.         set test ""
  411.         set i 0
  412.         set trainee_list_final [db_list get_active_list "select user_id from im_employees_active where user_id in ([join $trainee_list ","])"]
  413.         set current_date_int [clock scan [db_string get_date "select to_char(now(), 'YYYY-MM-DD')"]]
  414.         foreach trainee_id $trainee_list_final {
  415.                 set date_list [employee_join_terminate_date -user_id $trainee_id]
  416.                 set joining_date [lindex $date_list 0]
  417.                 set join_date_int [clock scan $joining_date -format "%Y-%m-%d"]
  418.                 set reminder_date_int [clock add [clock scan $joining_date -format "%Y-%m-%d"] 6 months ]
  419.                 set months_3_reminder_date_int [clock add [clock scan $joining_date -format "%Y-%m-%d"] 3 months ]
  420.                 if {$reminder_date_int >= $current_date_int } {
  421.                         set reminder_date [clock format $reminder_date_int -format "%Y-%m-%d"]
  422.                         set sent ""
  423.                         set deleted ""
  424.                         set already_listed [db_0or1row chk_data_noti "select object_id, sent, deleted, mail_id from im_notification_list where object_id=:trainee_id and type='training_complete' and date = :reminder_date"]
  425.                         if {!$already_listed } {
  426.                                 db_dml insert_notify "insert into im_notification_list(object_id, type, date) values(:trainee_id, 'training_complete' , :reminder_date)"
  427.                         }
  428.                 }
  429.                 if {$months_3_reminder_date_int >= $current_date_int || $join_date_int > [clock scan "2014-11-01" -format "%Y-%m-%d"]} {
  430.                         incr i
  431.                         set reminder_date [clock format $months_3_reminder_date_int -format "%Y-%m-%d"]
  432.                         set sent ""
  433.                         set deleted ""
  434.                         set already_listed [db_0or1row chk_data_noti "select object_id, sent, deleted, mail_id from im_notification_list where object_id=:trainee_id and type='training_complete' and date = :reminder_date"]
  435.                         if {!$already_listed } {                               
  436.                                 db_dml insert_notify "insert into im_notification_list(object_id, type, user_id, date) values(:trainee_id, 'training_complete' , 1 , :reminder_date)"
  437.                         }
  438.                         append test "$i [im_name_from_user_id $trainee_id] $reminder_date \n"
  439.                 }
  440.         }
  441.         return $test
  442. }
  443.  
  444. # ------------------------------------------
  445.  
  446.  
  447.  
  448.  
  449. ad_proc im_filing_but_not_client_select_multiple { select_name { defaults "" } { size "6"} {multiple ""}} {
  450.     set bind_vars [ns_set create]
  451.    
  452.     set sql "
  453. select A.user_id, A.employee_name from (select
  454.         u.user_id,
  455.         im_name_from_user_id(u.user_id) as employee_name
  456. from
  457.         registered_users u,
  458.         group_distinct_member_map gm
  459. where
  460.         u.user_id = gm.member_id
  461.         and gm.group_id = 155702) as A
  462. join
  463. (select u.user_id,
  464.         im_name_from_user_id(u.user_id) as employee_name
  465. from
  466.         registered_users u,
  467.         group_distinct_member_map gm
  468. where
  469.         u.user_id = gm.member_id
  470.         and gm.group_id = 463) as B
  471. on (A.user_id = B.user_id)
  472. "
  473.     return [im_selection_to_list_box -translate_p "0" $bind_vars category_select $sql $select_name $defaults $size $multiple]
  474. }    
  475.  
  476.  
  477. # --------------------------------------------------------
  478.  
  479. ad_proc im_software_profile_select_multiple { select_name { defaults "" } { size "6"} {multiple ""}} {
  480.     set bind_vars [ns_set create]
  481.    
  482.     set sql "
  483. select A.user_id, A.employee_name from (select
  484.         u.user_id,
  485.         im_name_from_user_id(u.user_id) as employee_name
  486. from
  487.         registered_users u,
  488.         group_distinct_member_map gm
  489. where
  490.         u.user_id = gm.member_id
  491.         and gm.group_id = 465) as A
  492. join
  493. (select u.user_id,
  494.         im_name_from_user_id(u.user_id) as employee_name
  495. from
  496.         registered_users u,
  497.         group_distinct_member_map gm
  498. where
  499.         u.user_id = gm.member_id
  500.         and gm.group_id = 463) as B
  501. on (A.user_id = B.user_id) order by employee_name
  502. "
  503.     return [im_selection_to_list_box -translate_p "0" $bind_vars category_select $sql $select_name $defaults $size $multiple]
  504. }
  505.  
  506.  
  507. ad_proc im_pm_select_multiple { select_name { defaults "" } { size "6"} {multiple ""}} {
  508.     set bind_vars [ns_set create]
  509.     set pm_group_id [im_pm_group_id]
  510.     set sql "
  511. select
  512.         u.user_id,
  513.         im_name_from_user_id(u.user_id) as employee_name
  514. from
  515.         registered_users u,
  516.         group_distinct_member_map gm
  517. where
  518.         u.user_id = gm.member_id
  519.         and gm.group_id = $pm_group_id
  520. order by lower(im_name_from_user_id(u.user_id))
  521. "
  522.     return [im_selection_to_list_box -translate_p "0" $bind_vars category_select $sql $select_name $defaults $size $multiple]
  523. }
  524.  
  525. ad_proc im_active_pm_select_multiple {
  526.         select_name
  527.         { defaults "" }
  528.         { size "6"} {multiple ""}
  529. } {
  530.         returns html widget with employees having the PM role (im_projects::im_project_lead_id) in currently open projects
  531. } {
  532.     set bind_vars [ns_set create]
  533.     set sql "
  534.         select distinct
  535.                 pe.person_id,
  536.                 im_name_from_user_id(pe.person_id) as employee_name
  537.         from
  538.                 persons pe,
  539.                 im_projects p,
  540.                 registered_users u
  541.         where
  542.                 p.project_lead_id = pe.person_id and
  543.                 u.user_id = pe.person_id and
  544.                 p.project_status_id not in ([im_project_status_deleted]);
  545.         "
  546.     return [im_selection_to_list_box -translate_p "0" $bind_vars category_select $sql $select_name $defaults $size $multiple]
  547. }
  548.  
  549. # ------------------------------------------------------
  550. # User Community Component
  551. # Show the most recent user registrations.
  552. # This allows to detect duplicat registrations
  553. # of users with multiple emails
  554. # ------------------------------------------------------
  555.  
  556. ad_proc -public im_user_registration_component { current_user_id { max_rows 8} } {
  557.     Shows the list of the last n registrations
  558.  
  559.     This allows to detect duplicat registrations
  560.     of users with multiple emails
  561. } {
  562.     set date_format "YYYY-MM-DD"
  563.     set bgcolor(0) " class=roweven"
  564.     set bgcolor(1) " class=rowodd"
  565.     set user_view_page "/intranet/users/view"
  566.     set return_url [ad_conn url]?[ad_conn query]
  567.    
  568.     set user_id [ad_get_user_id]
  569.    
  570.     if {![im_permission $user_id view_user_regs]} { return "" }
  571.  
  572.     set rows_html ""
  573.     set ctr 1
  574.     db_foreach registered_users "" {
  575.  
  576.         regexp {(.*)\@(.*)} $email match email_name email_url
  577.         set email_breakable "$email_name \@ $email_url"
  578.  
  579.         # Allow to approve non-approved members
  580.         set approve_link ""
  581.         if {"approved" != $member_state} { set approve_link "<a href=\"/acs-admin/users/member-state-change?member_state=approved&amp;[export_url_vars user_id return_url]\">[_ intranet-core.activate]</a>"
  582.         }
  583.  
  584.         append rows_html "
  585. <tr $bgcolor([expr $ctr % 2])>
  586.   <td>$creation_date</td>
  587.   <td><A href=\"$user_view_page?user_id=$user_id\">$name</A></td>
  588.   <td><A href=\"mailto:$email\">$email_breakable</A></td>
  589.   <td>$member_state $approve_link</td>
  590. </tr>
  591. "
  592.         incr ctr
  593.     }
  594.  
  595.     return "
  596. <table border=0 cellspacing=1 cellpadding=1>
  597. <tr class=rowtitle><td class=rowtitle align=center colspan=5>[_ intranet-core.Recent_Registrations]</td></tr>
  598. <tr class=rowtitle>
  599.   <td align=center class=rowtitle>[_ intranet-core.Date]</td>
  600.   <td align=center class=rowtitle>[_ intranet-core.Name]</td>
  601.   <td align=center class=rowtitle>[_ intranet-core.Email]</td>
  602.   <td align=center class=rowtitle>[_ intranet-core.State]</td>
  603. </tr>
  604. $rows_html
  605. <tr class=rowblank align=right>
  606.   <td colspan=5>
  607.     <a href=\"/intranet/users/index?view_name=user_community&amp;user_group_name=all&amp;order_by=Creation\">[_ intranet-core.more]</a>
  608.   </td>
  609. </tr>
  610. </table>
  611. "
  612. }
  613.  
  614.  
  615. # ------------------------------------------------------------------------
  616. # Create a new user
  617. # ------------------------------------------------------------------------
  618.  
  619. ad_proc -public im_user_create_new_user {
  620.     -username:required
  621.     -email:required
  622.     -first_names:required
  623.     -last_name:required
  624.     {-user_id "" }
  625.     {-screen_name ""}
  626.     {-password ""}
  627.     {-password_confirm ""}
  628.     {-url "" }
  629.     {-secret_question ""}
  630.     {-secret_answer "" }
  631.     {-ignore_duplicate_user_p 0}
  632.     {-current_user_id ""}
  633. } {
  634.     Create a new user from scratch
  635. } {
  636.         if {$current_user_id == "" } {
  637.         set current_user_id [ad_get_user_id]
  638.         }
  639.     set email [string trim $email]
  640.     set similar_user_id [db_string similar_user "select party_id from parties where lower(email) = lower(:email)" -default 0]
  641.    
  642.     if {0 != $similar_user_id} {
  643.         if {$ignore_duplicate_user_p} {
  644.             return [list creation_status ok]
  645.         } else {
  646.             set view_similar_user_link "<A href=/intranet/users/view?user_id=$similar_user_id>[_ intranet-core.user]</A>"
  647.             ad_return_complaint 1 "<li><b>[_ intranet-core.Duplicate_UserB]<br>[_ intranet-core.lt_There_is_already_a_vi]<br>"
  648.             ad_script_abort
  649.         }
  650.     }
  651.    
  652.     if {"" == $password} {
  653.         set password [ad_generate_random_string]
  654.         set password_confirm $password
  655.     }
  656.    
  657.     array set creation_info [auth::create_user \
  658.                                  -user_id $user_id \
  659.                                  -verify_password_confirm \
  660.                                  -username $username \
  661.                                  -email $email \
  662.                                  -first_names $first_names \
  663.                                  -last_name $last_name \
  664.                                  -screen_name $screen_name \
  665.                                  -password $password \
  666.                                  -password_confirm $password_confirm \
  667.                                  -url $url \
  668.                                  -secret_question $secret_question \
  669.                                  -secret_answer $secret_answer \
  670.     ]
  671.  
  672.     set creation_status $creation_info(creation_status)
  673.     if {"ok" == $creation_status} {
  674.  
  675.         set user_id $creation_info(user_id);
  676.  
  677.         # Update creation user to allow the creator to admin the user
  678.         db_dml update_creation_user_id "
  679.                 update acs_objects
  680.                 set creation_user = :current_user_id
  681.                 where object_id = :user_id
  682.         "
  683.  
  684.         # Call the "user_create" or "user_update" user_exit
  685.         im_user_exit_call user_create $user_id
  686.     }
  687.  
  688.     return [array get creation_info]
  689. }
  690.  
  691.  
  692.  
  693.  
  694. ad_proc -public im_user_update_existing_user {
  695.     -user_id:required
  696.     -username:required
  697.     -email:required
  698.     -first_names:required
  699.     -last_name:required
  700.     {-screen_name ""}
  701.     {-url "" }
  702.     {-also_add_to_biz_object ""}
  703.     {-profiles ""}
  704.     {-edit_profiles_p 0}
  705. } {
  706.     Update an existing user and make sure he's member of all relevant tables
  707. } {
  708.     # Profile changes its value, possibly because of strange
  709.     # ad_form sideeffects
  710.     set profile_org $profiles
  711.  
  712.     set current_user_id [ad_get_user_id]
  713.  
  714.     # Make sure the "person" exists.
  715.     # This may be not the case when creating a user from a party.
  716.     set person_exists_p [db_string person_exists "select count(*) from persons where person_id = :user_id"]
  717.     if {!$person_exists_p} {
  718.         db_dml insert_person "
  719.                     insert into persons (
  720.                         person_id, first_names, last_name
  721.                     ) values (
  722.                         :user_id, :first_names, :last_name
  723.                     )
  724.         "
  725.         # Convert the party into a person
  726.         db_dml person2party "
  727.                     update acs_objects
  728.                     set object_type = 'person'
  729.                     where object_id = :user_id
  730.         "      
  731.     }
  732.  
  733.     set user_exists_p [db_string user_exists "select count(*) from users where user_id = :user_id"]
  734.     if {!$user_exists_p} {
  735.         if {"" == $username} { set username $email}
  736.         db_dml insert_user "
  737.                     insert into users (
  738.                         user_id, username
  739.                     ) values (
  740.                         :user_id, :username
  741.                     )
  742.         "
  743.         # Convert the person into a user
  744.         db_dml party2user "
  745.                     update acs_objects
  746.                     set object_type = 'user'
  747.                     where object_id = :user_id
  748.         "
  749.     }
  750.  
  751.     ns_log Notice "/users/new: person::update -person_id=$user_id -first_names=$first_names -last_name=$last_name"
  752.     person::update \
  753.         -person_id $user_id \
  754.         -first_names $first_names \
  755.         -last_name $last_name
  756.    
  757.     ns_log Notice "/users/new: party::update -party_id=$user_id -url=$url -email=$email"
  758.     party::update \
  759.         -party_id $user_id \
  760.         -url $url \
  761.         -email $email
  762.    
  763.     ns_log Notice "/users/new: acs_user::update -user_id=$user_id -screen_name=$screen_name"
  764.     acs_user::update \
  765.         -user_id $user_id \
  766.         -screen_name $screen_name \
  767.         -username $username
  768.  
  769.  
  770.     # Add the user to some companies or projects
  771.     array set also_add_hash $also_add_to_biz_object
  772.     foreach oid [array names also_add_hash] {
  773.         set object_type [db_string otype "select object_type from acs_objects where object_id=:oid"]
  774.         set perm_cmd "${object_type}_permissions \$current_user_id \$oid object_view object_read object_write object_admin"
  775.         eval $perm_cmd
  776.         if {$object_write} {
  777.             set role_id $also_add_hash($oid)
  778.             im_biz_object_add_role $user_id $oid $role_id
  779.         }
  780.     }
  781.  
  782.     # For all users (new and existing one):
  783.     # Add a users_contact record to the user since the 3.0 PostgreSQL
  784.     # port, because we have dropped the outer join with it...
  785.     catch { db_dml add_users_contact "insert into users_contact (user_id) values (:user_id)" } errmsg
  786.  
  787.  
  788.     # Add the user to the "Registered Users" group, because
  789.     # (s)he would get strange problems otherwise
  790.     set registered_users [db_string registered_users "select object_id from acs_magic_objects where name='registered_users'"]
  791.     set reg_users_rel_exists_p [db_string member_of_reg_users "
  792.                 select  count(*)
  793.                 from    group_member_map m, membership_rels mr
  794.                 where   m.member_id = :user_id
  795.                         and m.group_id = :registered_users
  796.                         and m.rel_id = mr.rel_id
  797.                         and m.container_id = m.group_id
  798.                         and m.rel_type::text = 'membership_rel'::text
  799.     "]
  800.     if {!$reg_users_rel_exists_p} {
  801.         relation_add -member_state "approved" "membership_rel" $registered_users $user_id
  802.     }
  803.  
  804.  
  805.     # TSearch2: We need to update "persons" in order to trigger the TSearch2
  806.     # triggers
  807.     db_dml update_persons "
  808.                 update persons
  809.                 set first_names = first_names
  810.                 where person_id = :user_id
  811.     "
  812.  
  813.        
  814.     set membership_del_sql "
  815.         select
  816.                 r.rel_id
  817.         from
  818.                 acs_rels r,
  819.                 acs_objects o
  820.         where
  821.                 object_id_two = :user_id
  822.                 and object_id_one = :profile_id
  823.                 and r.object_id_one = o.object_id
  824.                 and o.object_type = 'im_profile'
  825.                 and rel_type = 'membership_rel'
  826.     "
  827.  
  828.  
  829.     # Get the list of profiles managable for current_user_id
  830.     set managable_profiles [im_profile::profile_options_managable_for_user $current_user_id]
  831.  
  832.     # Extract only the profile_ids from the managable profiles
  833.     set managable_profile_ids [list]
  834.     foreach g $managable_profiles {
  835.         lappend managable_profile_ids [lindex $g 1]
  836.     }
  837.  
  838.     foreach profile_tuple [im_profile::profile_options_all] {
  839.  
  840.         # don't enter into setting and unsetting profiles
  841.         # if the user has no right to change profiles.
  842.         # Probably this is a freelancer or company
  843.         # who is editing himself.
  844.         if {!$edit_profiles_p} { break }
  845.        
  846.         ns_log Notice "profile_tuple=$profile_tuple"
  847.         set profile_name [lindex $profile_tuple 0]
  848.         set profile_id [lindex $profile_tuple 1]
  849.  
  850.         set is_member [db_string is_member "
  851.                 select count(*)
  852.                 from group_distinct_member_map
  853.                 where member_id=:user_id and group_id=:profile_id
  854.         "]
  855.  
  856.         set should_be_member 0
  857.         if {[lsearch -exact $profile_org $profile_id] >= 0} {
  858.             set should_be_member 1
  859.         }
  860.        
  861.         if {$is_member && !$should_be_member} {
  862.             ns_log Notice "/users/new: => remove_member from $profile_name\n"
  863.            
  864.             if {[lsearch -exact $managable_profile_ids $profile_id] < 0} {
  865.                 ad_return_complaint 1 "<li>
  866.                     [_ intranet-core.lt_You_are_not_allowed_t]"
  867.                 return
  868.             }
  869.            
  870.             # db_dml delete_profile $delete_rel_sql
  871.             db_foreach membership_del $membership_del_sql {
  872.                 ns_log Notice "/users/new: Going to delete rel_id=$rel_id"
  873.                 membership_rel::delete -rel_id $rel_id
  874.             }
  875.            
  876.             # Special logic: Revoking P/O Admin privileges also removes
  877.             # Site-Wide-Admin privs
  878.             if {$profile_id == [im_profile_po_admins]} {
  879.                 ns_log Notice "users/new: Remove P/O Admins => Remove Site Wide Admins"
  880.                 permission::revoke -object_id [acs_magic_object "security_context_root"] -party_id $user_id -privilege "admin"
  881.             }
  882.            
  883.             # Remove all permission related entries in the system cache
  884.             im_permission_flush
  885.         }
  886.        
  887.        
  888.         if {!$is_member && $should_be_member} {
  889.             ns_log Notice "/users/new: => add_member to profile $profile_name\n"
  890.            
  891.             # Check if the profile_id belongs to the managable profiles of
  892.             # the current user. Normally, only the managable profiles are
  893.             # shown, which means that a user must have played around with
  894.             # the HTTP variables in oder to fool us...
  895.             if {[lsearch -exact $managable_profile_ids $profile_id] < 0} {
  896.                 ad_return_complaint 1 "<li>
  897.                     [_ intranet-core.lt_You_are_not_allowed_t_1]"
  898.                 return
  899.             }
  900.            
  901.             # Make the user a member of the group (=profile)
  902.             ns_log Notice "/users/new: => relation_add $profile_id $user_id"
  903.             set rel_id [relation_add -member_state "approved" "membership_rel" $profile_id $user_id]
  904.             db_dml update_relation "update membership_rels set member_state='approved' where rel_id=:rel_id"
  905.            
  906.            
  907.             # Special logic for employees and P/O Admins:
  908.             # PM, Sales, Accounting, SeniorMan => Employee
  909.             # P/O Admin => Site Wide Admin
  910.             if {$profile_id == [im_profile_project_managers]} {
  911.                 ns_log Notice "users/new: Project Managers => Employees"
  912.                 set rel_id [relation_add -member_state "approved" "membership_rel" [im_profile_employees] $user_id]
  913.                 db_dml update_relation "update membership_rels set member_state='approved' where rel_id=:rel_id"
  914.             }
  915.            
  916.             if {$profile_id == [im_profile_accounting]} {
  917.                 ns_log Notice "users/new: Accounting => Employees"
  918.                 set rel_id [relation_add -member_state "approved" "membership_rel" [im_profile_employees] $user_id]
  919.                 db_dml update_relation "update membership_rels set member_state='approved' where rel_id=:rel_id"
  920.             }
  921.            
  922.             if {$profile_id == [im_profile_sales]} {
  923.                 ns_log Notice "users/new: Sales => Employees"
  924.                 set rel_id [relation_add -member_state "approved" "membership_rel" [im_profile_employees] $user_id]
  925.                 db_dml update_relation "update membership_rels set member_state='approved' where rel_id=:rel_id"
  926.             }
  927.            
  928.             if {$profile_id == [im_profile_senior_managers]} {
  929.                 ns_log Notice "users/new: Senior Managers => Employees"
  930.                 set rel_id [relation_add -member_state "approved" "membership_rel" [im_profile_employees] $user_id]
  931.                 db_dml update_relation "update membership_rels set member_state='approved' where rel_id=:rel_id"
  932.             }
  933.            
  934.             if {$profile_id == [im_profile_po_admins]} {
  935.                 ns_log Notice "users/new: P/O Admins => Site Wide Admins"
  936.                 permission::grant -object_id [acs_magic_object "security_context_root"] -party_id $user_id -privilege "admin"
  937.                 im_security_alert -severity "Info" -location "users/new" -message "New P/O Admin" -value $email
  938.             }
  939.            
  940.             # Remove all permission related entries in the system cache
  941.             im_permission_flush
  942.            
  943.         }
  944.     }
  945.  
  946.  
  947.     # Add a im_employees record to the user since the 3.0 PostgreSQL
  948.     # port, because we have dropped the outer join with it...
  949.     if {[im_table_exists im_employees]} {
  950.        
  951.         # Simply add the record to all users, even it they are not employees...
  952.         set im_employees_exist [db_string im_employees_exist "select count(*) from im_employees where employee_id = :user_id"]
  953.         if {!$im_employees_exist} {
  954.             db_dml add_im_employees "insert into im_employees (employee_id) values (:user_id)"
  955.         }
  956.     }
  957.  
  958.  
  959.     # Call the "user_create" or "user_update" user_exit
  960.     im_user_exit_call user_update $user_id
  961. }
  962.  
  963.  
  964.  
  965.  
  966.  
  967.  
  968.  
  969.  
  970. # ------------------------------------------------------------------------
  971. # functions for printing the org chart
  972. # ------------------------------------------------------------------------
  973.  
  974. ad_proc im_print_employee {person rowspan} "print function for org chart" {
  975.     set user_id [fst $person]
  976.     set employee_name [snd $person]
  977.     set currently_employed_p [thd $person]
  978.  
  979. # Removed job title display
  980. #    set job_title [lindex $person 3]
  981.  
  982.     if { $currently_employed_p == "t" } {
  983.  
  984. # Removed job title display
  985. #       if { $rowspan>=2 } {
  986. #           return "<a href=\"/intranet/users/view?[export_url_vars user_id]\">$employee_name</a><br><i>$job_title</i>\n"
  987. #       } else {
  988.             return "<a href=\"/intranet/users/view?[export_url_vars user_id]\">$employee_name</a><br>\n"
  989. #       }
  990.     } else {
  991.         return "<i>[_ intranet-core.Position_Vacant]</i>"
  992.     }
  993. }
  994.  
  995. ad_proc im_prune_org_chart {tree} "deletes all leaves where currently_employed_p is set to vacant position" {
  996.     set result [list [head $tree]]
  997.     # First, recursively process the sub-trees.
  998.     foreach subtree [tail $tree] {
  999.         set new_subtree [im_prune_org_chart $subtree]
  1000.         if { ![null_p $new_subtree] } {
  1001.             lappend result $new_subtree
  1002.         }
  1003.     }
  1004.     # Now, delete vacant leaves.
  1005.     # We also delete vacant inner nodes that have only one child.
  1006.     # 1. if the tree only consists of one vacant node
  1007.     #    -> return an empty tree
  1008.     # 2. if the tree has a vacant root and only one child
  1009.     #    -> return the child
  1010.     # 3. otherwise
  1011.     #    -> return the tree
  1012.     if { [thd [head $result]] == "f" } {
  1013.         switch [llength $result] {
  1014.             1       { return [list] }
  1015.             2       { return [snd $result] }
  1016.             default { return $result }
  1017.         }
  1018.     } else {
  1019.         return $result
  1020.     }
  1021. }
  1022.  
  1023.  
  1024. # ------------------------------------------------------------------------
  1025. # Find out the user's subtypes (mapped from groups)
  1026. # ------------------------------------------------------------------------
  1027.  
  1028. ad_proc -public im_user_subtypes {
  1029.     user_id
  1030. } {
  1031.     Returns a list of categories representing the user's subtypes.
  1032.     The list is derived from mapping users' groups to categories
  1033. } {
  1034.     # Find out all the groups of the user and map these
  1035.     # groups to im_category "Intranet User Type"
  1036.     set user_subtypes [db_list user_subtypes "
  1037.         select
  1038.                 c.category_id
  1039.         from
  1040.                 im_categories c,
  1041.                 group_distinct_member_map gdmm
  1042.         where
  1043.                 member_id = :user_id and
  1044.                 c.aux_int1 = gdmm.group_id
  1045.     "]
  1046.  
  1047.     return $user_subtypes
  1048. }
  1049.  
  1050.  
  1051. # ------------------------------------------------------------------------
  1052. # Nuke a User
  1053. # ------------------------------------------------------------------------
  1054.  
  1055.  
  1056. ad_proc -public im_user_nuke {user_id} {
  1057.     Delete a user from the database -
  1058.     Extremely dangerous!
  1059. } {
  1060.     set user_is_admin_p [im_is_user_site_wide_or_intranet_admin $user_id]
  1061.     if {$user_is_admin_p} {
  1062.         return "User is an administrator - you can't nuke an administrator"
  1063.     }
  1064.  
  1065.     set result ""
  1066.     set default_user [db_string default_user "
  1067.         select  min(person_id)
  1068.         from    persons
  1069.         where   person_id > 0
  1070.     "]
  1071.  
  1072.     db_transaction {
  1073.        
  1074.         # delete data from payroll
  1075.         # code shifted from intranet-payroll-procs to here
  1076.         # Sneha (19-04-2017)
  1077.        
  1078.         set user_to_be_nuked [im_name_from_user_id $user_id]
  1079.         db_dml document_reference_name "update xl_ats_document_reference_number set nuked_user_name=:user_to_be_nuked where issued_to=:user_id"
  1080.  
  1081.         ns_write "<li> Delete Appraisal Data </li>"
  1082.         ns_write "<ul>"
  1083.        
  1084.         ns_write " <li>delete from im_appraisal_others</li>"
  1085.         db_dml dete_data "delete from im_appraisal_others where employee_id=:user_id"
  1086.        
  1087.         ns_write " <li>delete from im_appraisal_review_notes</li>"
  1088.         db_dml dete_data "delete from im_appraisal_review_notes where employee_id=:user_id"
  1089.        
  1090.         ns_write "<li>Appraisal Data deleted Successfully </li></ul>"
  1091.        
  1092.         ns_write "<li> deleting im_database_logs"
  1093.         db_dml delete_data "delete from im_database_logs where user_id=:user_id"
  1094.        
  1095.         ns_write "<li> deleting im_employees_recurring_data"
  1096.         db_dml delete_data "delete from im_employees_recurring_data where employee_id=:user_id"
  1097.        
  1098.         ns_write "<li> deleting im_expenses_petty_cash"
  1099.         db_dml delete_data "delete from im_expenses_petty_cash where employee_id=:user_id"
  1100.        
  1101.         ns_write "<li> deleting im_score"
  1102.         db_dml delete_data "delete from im_score where score_for=:user_id"
  1103.        
  1104.         ns_write "<li> deleting im_score_response"
  1105.         db_dml delete_data "delete from im_score_response where s_resource_id=:user_id"
  1106.        
  1107.         ns_write "<li> deleting im_test_marks"
  1108.         db_dml delete_data "delete from im_test_marks where employee_id=:user_id"
  1109.         # delete data from payroll
  1110.         # code shifted from intranet-payroll-procs to here
  1111.         # Sneha (19-04-2017)
  1112.        
  1113.         # tables added
  1114.         # edited 11-03-2015
  1115.         # nihit malhotra
  1116.         db_dml delete_work_data "delete from im_employees_absence_groups where employee_id=:user_id"
  1117.         db_dml delete_edu_data "delete from im_employees_education where employee_id=:user_id"
  1118.         db_dml delete_family_data "delete from im_employees_family where employee_id=:user_id"
  1119.         db_dml delete_family_data "delete from im_employees_recurring_data where employee_id=:user_id"
  1120.         db_dml delete_family_data "delete from im_employees_tasks where employee_id=:user_id"
  1121.         db_dml delete_visa_data "delete from im_employees_visa_details where employee_id=:user_id"
  1122.         db_dml delete_work_data "delete from im_employees_work_exp where employee_id=:user_id" 
  1123.         db_dml delete_work_data "delete from im_employees_multiple_data where employee_id=:user_id"    
  1124.        
  1125.         # bboard system
  1126.         ns_log Notice "users/nuke2: bboard_email_alerts"
  1127.         if {[im_table_exists bboard_email_alerts]} {
  1128.             db_dml delete_user_bboard_email_alerts "delete from bboard_email_alerts where user_id = :user_id"
  1129.             db_dml delete_user_bboard_thread_email_alerts "delete from bboard_thread_email_alerts where user_id = :user_id"
  1130.             db_dml delete_user_bboard_unified "delete from bboard_unified where user_id = :user_id"
  1131.            
  1132.             # deleting from bboard is hard because we have to delete not only a user's
  1133.             # messages but also subtrees that refer to them
  1134.             bboard_delete_messages_and_subtrees_where  -bind [list user_id $user_id] "user_id = :user_id"
  1135.         }
  1136.    
  1137.         # let's do the classifieds now
  1138.         ns_log Notice "users/nuke2: classified_auction_bids"
  1139.         if {[im_table_exists classified_auction_bids]} {
  1140.             db_dml delete_user_classified_auction_bids "delete from classified_auction_bids where user_id = :user_id"
  1141.             db_dml delete_user_classified_ads "delete from classified_ads where user_id = :user_id"
  1142.             db_dml delete_user_classified_email_alerts "delete from classified_email_alerts where user_id = :user_id"
  1143.             db_dml delete_user_neighbor_to_neighbor_comments "
  1144.         delete from general_comments
  1145.         where
  1146.                 on_which_table = 'neighbor_to_neighbor'
  1147.                 and on_what_id in (select neighbor_to_neighbor_id
  1148.         from neighbor_to_neighbor
  1149.         where poster_user_id = :user_id)"
  1150.             db_dml delete_user_neighbor_to_neighbor "delete from neighbor_to_neighbor where poster_user_id = :user_id"
  1151.         }
  1152.  
  1153.         # now the calendar
  1154.         ns_log Notice "users/nuke2: calendar"
  1155.         if {[im_table_exists calendar]} {
  1156.             db_dml delete_user_calendar "delete from calendar where creation_user = :user_id"
  1157.         }
  1158.  
  1159.         # contest tables are going to be tough
  1160.         ns_log Notice "users/nuke2: entrants_table_name"
  1161.         if {[im_table_exists entrants_table_name]} {
  1162.             set all_contest_entrants_tables [db_list unused "select entrants_table_name from contest_domains"]
  1163.             foreach entrants_table $all_contest_entrants_tables {
  1164.                 db_dml delete_user_contest_entries "delete from $entrants_table where user_id = :user_id"
  1165.             }
  1166.         }
  1167.  
  1168.         # Component Plugins
  1169.         ns_log Notice "users/nuke2: im_component_plugin_user_map"
  1170.         db_dml del_comp_map "delete from im_component_plugin_user_map where user_id = :user_id"
  1171.  
  1172.        
  1173.         # spam history
  1174.         ns_log Notice "users/nuke2: spam_history"
  1175.         if {[im_table_exists spam_history]} {
  1176.             db_dml delete_user_spam_history "delete from spam_history where creation_user = :user_id"
  1177.             db_dml delete_user_spam_history_sent "update spam_history set last_user_id_sent = NULL
  1178.                     where last_user_id_sent = :user_id"
  1179.         }
  1180.        
  1181.         # calendar
  1182.         ns_log Notice "users/nuke2: calendar_categories"
  1183.         if {[im_table_exists calendar_categories]} {
  1184.             db_dml delete_user_calendar_categories "delete from calendar_categories where user_id = :user_id"
  1185.         }
  1186.        
  1187.         # sessions
  1188.         ns_log Notice "users/nuke2: sec_sessions"
  1189.         if {[im_table_exists sec_sessions]} {
  1190.             db_dml delete_user_sec_sessions "delete from sec_sessions where user_id = :user_id"
  1191.             db_dml delete_user_sec_login_tokens "delete from sec_login_tokens where user_id = :user_id"
  1192.         }
  1193.    
  1194.         # general comments
  1195.         ns_log Notice "users/nuke2: general_comments"
  1196.         if {[im_table_exists general_comments]} {
  1197.             db_dml delete_user_general_comments "delete from general_comments where object_id = :user_id"
  1198.         }
  1199.  
  1200.         ns_log Notice "users/nuke2: comments"
  1201.         if {[im_table_exists comments]} {
  1202.             db_dml delete_user_comments "delete from comments where object_id = :user_id"
  1203.         }
  1204.  
  1205.         ns_log Notice "users/nuke2: links"
  1206.         if {[im_table_exists links]} {
  1207.             db_dml delete_user_links "delete from links where user_id = :user_id"
  1208.         }
  1209.         ns_log Notice "users/nuke2: chat_msgs"
  1210.         if {[im_table_exists chat_msgs]} {
  1211.             db_dml delete_user_chat_msgs "delete from chat_msgs where creation_user = :user_id"
  1212.         }
  1213.         ns_log Notice "users/nuke2: query_strings"
  1214.         if {[im_table_exists query_strings]} {
  1215.             db_dml delete_user_query_strings "delete from query_strings where user_id = :user_id"
  1216.         }
  1217.         ns_log Notice "users/nuke2: user_curriculum_map"
  1218.         if {[im_table_exists user_curriculum_map]} {
  1219.             db_dml delete_user_user_curriculum_map "delete from user_curriculum_map where user_id = :user_id"
  1220.         }
  1221.         ns_log Notice "users/nuke2: user_content_map"
  1222.         if {[im_table_exists user_content_map]} {
  1223.             db_dml delete_user_user_content_map "delete from user_content_map where user_id = :user_id"
  1224.         }
  1225.         ns_log Notice "users/nuke2: user_group_map"
  1226.         if {[im_table_exists user_group_map]} {
  1227.             db_dml delete_user_user_group_map "delete from user_group_map where user_id = :user_id"
  1228.         }
  1229.        
  1230.         ns_log Notice "users/nuke2: users_interests"
  1231.         if {[im_table_exists users_interests]} {
  1232.             db_dml delete_user_users_interests "delete from users_interests where user_id = :user_id"
  1233.         }
  1234.        
  1235.         ns_log Notice "users/nuke2: users_charges"
  1236.         if {[im_table_exists users_charges]} {
  1237.             db_dml delete_user_users_charges "delete from users_charges where user_id = :user_id"
  1238.         }
  1239.        
  1240.         ns_log Notice "users/nuke2: users_demographics"
  1241.         if {[im_table_exists users_demographics]} {
  1242.             db_dml set_referred_null_user_users_demographics "update users_demographics set referred_by = null where referred_by = :user_id"
  1243.             db_dml delete_user_users_demographics "delete from users_demographics where user_id = :user_id"
  1244.         }
  1245.        
  1246.         ns_log Notice "users/nuke2: users_preferences"
  1247.         if {[im_table_exists users_preferences]} {
  1248.             db_dml delete_user_users_preferences "delete from users_preferences where user_id = :user_id"
  1249.         }
  1250.        
  1251.         if {[im_table_exists user_preferences]} {
  1252.             db_dml delete_user_user_preferences "delete from user_preferences where user_id = :user_id"
  1253.         }
  1254.        
  1255.         if {[im_table_exists users_contact]} {
  1256.             db_dml delete_user_users_contact "delete from users_contact where user_id = :user_id"
  1257.         }
  1258.    
  1259.         # Permissions
  1260.         db_dml perms "delete from acs_permissions where grantee_id = :user_id"
  1261.         db_dml perms "delete from acs_permissions where object_id = :user_id"
  1262.        
  1263.  
  1264.         # Reassign objects to a default user...
  1265.         db_dml reassign_objects "update acs_objects set modifying_user = :default_user where modifying_user = :user_id"
  1266.         db_dml reassign_projects "update acs_objects set creation_user = :default_user where creation_user = :user_id"
  1267.        
  1268.         # Lang_message_audit
  1269.         db_dml lang_message_audit "update lang_messages_audit set overwrite_user = null where overwrite_user = :user_id"
  1270.         db_dml lang_message "update lang_messages set creation_user = null where creation_user = :user_id"
  1271.        
  1272.         # Deleting cost entries in acs_objects that are "dangeling", i.e. that don't have an
  1273.         # entry in im_costs. These might have been created during manual deletion of objects
  1274.         # Very dirty...
  1275.         set list [db_list get_ids "select cost_id from im_costs"]
  1276.         if {$list != "" } {
  1277.                 db_dml dangeling_costs "delete from acs_objects where object_type = 'im_cost' and object_id not in ( [join $list ","])"
  1278.         }
  1279.        
  1280.         # Costs
  1281.         db_dml invoice_references "update im_invoices set company_contact_id = null where company_contact_id = :user_id"
  1282.         db_dml delete_data "delete from im_repeating_costs where rep_cost_id in (select cost_id from im_costs where cause_object_id = :user_id)"
  1283.         db_dml cuase_objects "delete from im_costs where cause_object_id = :user_id"
  1284.         db_dml cost_providers "update im_costs set provider_id = :default_user where provider_id = :user_id"
  1285.  
  1286.         # Cost Centers
  1287.         db_dml reset_cost_center_managers "update im_cost_centers set manager_id = null where manager_id = :user_id"
  1288.  
  1289.         # Payments
  1290.         db_dml reset_payments "update im_payments set last_modifying_user = :default_user where last_modifying_user = :user_id"
  1291.        
  1292.         # Forum
  1293.         db_dml forum "delete from im_forum_topic_user_map where user_id = :user_id"
  1294.         db_dml forum "update im_forum_topics set owner_id = :default_user where owner_id = :user_id"
  1295.         db_dml forum "update im_forum_topics set asignee_id = null where asignee_id = :user_id"
  1296.         db_dml forum "update im_forum_topics set object_id = :default_user where object_id = :user_id"
  1297.  
  1298.         # Timesheet
  1299.         db_dml timesheet "delete from im_hours where user_id = :user_id"
  1300.         db_dml timesheet "delete from im_user_absences where owner_id = :user_id"
  1301.        
  1302.  
  1303.         # Remove user from business objects that we don't want to delete...
  1304.         db_dml remove_from_companies "update im_companies set manager_id = null where manager_id = :user_id"
  1305.         db_dml remove_from_companies "update im_companies set accounting_contact_id = null where accounting_contact_id = :user_id"
  1306.         db_dml remove_from_companies "update im_companies set primary_contact_id = null where primary_contact_id = :user_id"
  1307.         db_dml remove_from_projects "update im_projects set supervisor_id = null where supervisor_id = :user_id"
  1308.         db_dml remove_from_projects "update im_projects set project_lead_id = null where project_lead_id = :user_id"
  1309.        
  1310.         db_dml reassign_projects "update acs_objects set creation_user = :default_user where object_type = 'im_office' and creation_user = :user_id"
  1311.         db_dml reassign_projects "update acs_objects set creation_user = :default_user where object_type = 'im_company' and creation_user = :user_id"
  1312.         db_dml remove_from_companies "update im_offices set contact_person_id = null where contact_person_id = :user_id"
  1313.  
  1314.  
  1315.         # Freelance
  1316.         if {[im_table_exists im_freelance_skills]} {
  1317.             db_dml trans_tasks "delete from im_freelance_skills where user_id = :user_id"
  1318.             db_dml freelance "delete from im_freelancers where user_id = :user_id"
  1319.             db_dml freelance_conf "update im_freelance_skills set confirmation_user_id = null where confirmation_user_id = :user_id"
  1320.         }
  1321.  
  1322.  
  1323.         # Helpdesk + ConfDB
  1324.         if {[im_table_exists im_tickets]} {
  1325.             db_dml assignees "update im_tickets set ticket_assignee_id = :default_user where ticket_assignee_id = :user_id"
  1326.             db_dml assignees "update im_tickets set ticket_customer_contact_id = :default_user where ticket_customer_contact_id = :user_id"
  1327.         }
  1328.         if {[im_table_exists im_conf_items]} {
  1329.             db_dml assignees "update im_conf_items set conf_item_owner_id = :default_user where conf_item_owner_id = :user_id"
  1330.         }
  1331.  
  1332.         # Simple Survey
  1333.         if {[im_table_exists survsimp_responses]} {
  1334.             db_dml assignees "update survsimp_responses set related_context_id = :default_user where related_context_id = :user_id"
  1335.             db_dml assignees "update survsimp_responses set related_object_id = :default_user where related_object_id = :user_id"
  1336.         }
  1337.  
  1338.        
  1339.         # Translation
  1340.         if {[im_table_exists im_trans_tasks]} {
  1341.             db_dml remove_from_projects "update im_projects set company_contact_id = null where company_contact_id = :user_id"
  1342.             db_dml trans_tasks "update im_trans_tasks set trans_id = null where trans_id = :user_id"
  1343.             db_dml trans_tasks "update im_trans_tasks set edit_id = null where edit_id = :user_id"
  1344.             db_dml trans_tasks "update im_trans_tasks set proof_id = null where proof_id = :user_id"
  1345.             db_dml trans_tasks "update im_trans_tasks set other_id = null where other_id = :user_id"
  1346.             db_dml task_actions "delete from im_task_actions where user_id = :user_id"
  1347.         }
  1348.        
  1349.         # Translation RFQs
  1350.         if {[im_table_exists im_trans_rfq_answers]} {
  1351.             db_dml rfq_answers "update im_trans_rfq_answers set answer_user_id = :default_user where answer_user_id = :user_id"
  1352.         }
  1353.         if {[im_table_exists im_freelance_rfq_answers]} {
  1354.             db_dml rfq_answers "update im_freelance_rfq_answers set answer_user_id = :default_user where answer_user_id = :user_id"
  1355.         }
  1356.  
  1357.         if {[im_table_exists im_trans_quality_reports]} {
  1358.             db_dml trans_quality "delete from im_trans_quality_entries where report_id in (
  1359.                 select report_id from im_trans_quality_reports where reviewer_id = :user_id
  1360.             )"
  1361.             db_dml trans_quality "delete from im_trans_quality_reports where reviewer_id = :user_id"
  1362.         }
  1363.  
  1364.         # Workflow
  1365.         db_dml wf "update wf_tasks set holding_user = :default_user where holding_user = :user_id"
  1366.         db_dml wf "update wf_case_assignments set party_id = :default_user where party_id = :user_id"
  1367.         db_dml wf "update wf_context_assignments set party_id = :default_user where party_id = :user_id"
  1368.  
  1369.         #ats
  1370.         set user_to_be_nuked_cid [db_string get_c_id "select c_id from xl_ats_req_candidate_map where user_id=:user_id" -default ""]
  1371.         set ats_candidate_nuked [nuke_candidate -candidate_id $user_to_be_nuked_cid]
  1372.  
  1373.         # Filestorage
  1374.         db_dml filestorage "delete from im_fs_folder_status where user_id = :user_id"
  1375.         db_dml filestorage "delete from im_fs_actions where user_id = :user_id"
  1376.         db_dml filestorage "update im_fs_folders set object_id = null where object_id = :user_id"
  1377.  
  1378.         # Bug-Tracker
  1379.         if {[im_table_exists bt_user_prefs]} {
  1380.             db_dml bt_prefs "delete from bt_user_prefs where user_id = :user_id"
  1381.         }
  1382.         if {[im_table_exists bt_components]} {
  1383.             db_dml bt_comps "update bt_components set maintainer = null where maintainer = :user_id"
  1384.         }
  1385.         if {[im_table_exists bt_patch_actions]} {
  1386.             db_dml bt_patch_actions "update bt_patch_actions set actor = :default_user where actor = :user_id"
  1387.         }
  1388.        
  1389.         ns_write "<li>Delete enteries from im_timesheet_conf_objects</li>"
  1390.         db_dml delete_data "delete from im_timesheet_conf_objects where conf_user_id =:user_id"
  1391.        
  1392.         ns_write "<li>Delete enteries from notifications</li>"
  1393.         db_dml delete_data "delete from notifications where notif_user =:user_id"
  1394.        
  1395.        
  1396.        
  1397.         set rels [db_list rels "select rel_id from acs_rels where object_id_one = :user_id or object_id_two = :user_id"]
  1398.         foreach rel_id $rels {
  1399.             db_dml del_rels "delete from group_element_index where rel_id = :rel_id"
  1400.             db_dml del_rels "delete from im_biz_object_members where rel_id = :rel_id"
  1401.             db_dml del_rels "delete from membership_rels where rel_id = :rel_id"
  1402.             db_dml del_rels "delete from acs_rels where rel_id = :rel_id"
  1403.             db_dml del_rels "delete from acs_objects where object_id = :rel_id"
  1404.         }
  1405.        
  1406.         db_dml party_approved_member_map "delete from party_approved_member_map where party_id = :user_id"
  1407.         db_dml party_approved_member_map "delete from party_approved_member_map where member_id = :user_id"
  1408.        
  1409.         if {[im_table_exists im_employees]} {
  1410.             db_dml update_dependent_employees "update im_employees set supervisor_id = null where supervisor_id = :user_id"
  1411.             db_dml delete_employees "delete from im_employees where employee_id = :user_id"
  1412.         }
  1413.        
  1414.         ns_log Notice "users/nuke2: Main user tables"
  1415.         db_dml update_creation_users "update acs_objects set creation_user = null where creation_user = :user_id"
  1416.         db_dml delete_user "delete from users where user_id = :user_id"
  1417.         db_dml delete_user "delete from persons where person_id = :user_id"
  1418.         db_dml delete_user "delete from parties where party_id = :user_id"
  1419.         db_dml delete_user "delete from acs_objects where object_id = :user_id"
  1420.  
  1421.        
  1422.        
  1423.         # Returning empty string - everything went OK
  1424.         return ""      
  1425.  
  1426.     } on_error {
  1427.        
  1428.         set detailed_explanation ""
  1429.         if {[ regexp {integrity constraint \([^.]+\.([^)]+)\)} $errmsg match constraint_name]} {
  1430.             set sql "
  1431.                 select table_name
  1432.                 from user_constraints
  1433.                 where constraint_name=:constraint_name
  1434.             "
  1435.             db_foreach user_constraints_by_name $sql {
  1436.                 set detailed_explanation "<p>
  1437.             [_ intranet-core.lt_It_seems_the_table_we]"
  1438.             }
  1439.         }
  1440.  
  1441.         # Return the error string - indicates that there were errors    
  1442.         set result "
  1443.         [_ intranet-core.lt_The_nuking_of_user_us]
  1444.         $detailed_explanation<p>
  1445.         [_ intranet-core.lt_For_good_measure_here]
  1446.         <blockquote><pre>\n$errmsg\n</pre></blockquote>
  1447.         "
  1448.     }
  1449.  
  1450.     return $result
  1451. }
  1452.  
  1453.  
  1454.  
  1455. ad_proc im_upload_cvs_translate_varname { var_name} {
  1456.     Translate German var names to English.
  1457.     In the future we'll also support translations from other
  1458.     Office versions...
  1459. } {
  1460.     set name [string tolower [im_l10n_normalize_string $var_name]]
  1461.  
  1462.     switch $var_name {
  1463.         anrede { return "title" }
  1464.         vorname { return "first_name" }
  1465.         weitere_vornamen { return "middle_name" }
  1466.         nachname { return "last_name" }
  1467.         suffix { return "suffix" }
  1468.         emailadresse { return "e_mail_address" }
  1469.         firma { return "company" }
  1470.         abteilung { return "department" }
  1471.         position { return "job_title" }
  1472.         strase_geschaftlich { return "business_street" }
  1473.         strase_geschaftlich_2 { return "business_street_2" }
  1474.         strase_geschaftlich_3 { return "business_street_3" }
  1475.         ort_geschaftlich { return "business_city" }
  1476.         region_geschaftlich { return "business_state" }
  1477.         postleitzahl_geschaftlich { return "business_postal_code" }
  1478.         land_geschaftlich { return "business_country" }
  1479.         strase_privat { return "home_street" }
  1480.         strase_privat_2 { return "home_street_2" }
  1481.         strase_privat_3 { return "home_street_3" }
  1482.         ort_privat { return "home_city" }
  1483.         region_privat { return "home_state" }
  1484.         postleitzahl_privat { return "home_postal_code" }
  1485.         land_privat { return "home_country" }
  1486.         weitere_strase { return "other_street" }
  1487.         weitere_strase_2 { return "other_street_2" }
  1488.         weitere_strase_3 { return "other_street_3" }
  1489.         weiterer_ort { return "other_city" }
  1490.         weitere_region { return "other_state" }
  1491.         weitere_postleitzahl { return "other_postal_code" }
  1492.         weiteres_land { return "other_country" }
  1493.         telefon_assistent { return "assistants_phone" }
  1494.         fax_geschaftlich { return "business_fax" }
  1495.         telefon_geschaftlich { return "business_phone" }
  1496.         telefon_geschaftlich_2 { return "business_phone_2" }
  1497.         ruckmeldung { return "callback" }
  1498.         autotelefon { return "car_phone" }
  1499.         telefon_firma { return "company_main_phone" }
  1500.         fax_privat { return "home_fax" }
  1501.         telefon_privat { return "home_phone" }
  1502.         telefon_privat_2 { return "home_phone_2" }
  1503.         isdn { return "isdn" }
  1504.         mobiltelefon { return "mobile_phone" }
  1505.         weiteres_fax { return "other_fax" }
  1506.         weiteres_telefon { return "other_phone" }
  1507.         pager { return "pager" }
  1508.         haupttelefon { return "primary_phone" }
  1509.         mobiltelefon_2 { return "radio_phone" }
  1510.         telefon_fur_horbehinderte { return "tty_tdd_phone" }
  1511.         telex { return "telex" }
  1512.         abrechnungsinformation { return "account" }
  1513.         benutzer_1 { return "user_1" }
  1514.         benutzer_2 { return "user_2" }
  1515.         benutzer_3 { return "user_3" }
  1516.         benutzer_4 { return "user_4" }
  1517.         beruf { return "job_title" }
  1518.         buro { return "office_location" }
  1519.         e_mail_adresse { return "e_mail_address" }
  1520.         e_mail_typ { return "e_mail_type" }
  1521.         e_mail_angezeigter_name { return "e_mail_display_name" }
  1522.         e_mail_2_adresse { return "e_mail_2_address" }
  1523.         e_mail_2_typ { return "e_mail_2_type" }
  1524.         e_mail_2_angezeigter_name { return "e_mail_2_display_name" }
  1525.         e_mail_3_adresse { return "e_mail_3_address" }
  1526.         e_mail_3_typ { return "e_mail_3_type" }
  1527.         e_mail_3_angezeigter_name { return "e_mail_3_display_name" }
  1528.         empfohlen_von { return "referred_by" }
  1529.         geburtstag { return "birthday" }
  1530.         geschlecht { return "gender" }
  1531.         hobby { return "hobby" }
  1532.         initialen { return "initials" }
  1533.         internet_frei_gebucht { return "internet_free_busy" }
  1534.         jahrestag { return "anniversary" }
  1535.         kategorien { return "categories" }
  1536.         kinder { return "children" }
  1537.         konto { return "account" }
  1538.         name_assistent { return "assistant_s_name" }
  1539.         name_des_der_vorgesetzten { return "manager_s_name" }
  1540.         notizen { return "notes" }
  1541.         organisations_nr { return "organizational_id_number" }
  1542.         ort { return "location" }
  1543.         partner { return "spouse" }
  1544.         postfach_geschaftlich { return "po_box" }
  1545.         postfach_privat { return "ttt" }
  1546.         prioritat { return "priority" }
  1547.         privat { return "private" }
  1548.         regierungs_nr { return "government_id_number" }
  1549.         reisekilometer { return "mileage" }
  1550.         sprache { return "language" }
  1551.         stichworter { return "ttt" }
  1552.         vertraulichkeit { return "sensitivity" }
  1553.         verzeichnisserver { return "directory_server" }
  1554.         webseite { return "web_page" }
  1555.         weiteres_postfach  { return "po_box" }
  1556.     }
  1557.     return $var_name
  1558. }
  1559.  # -----------------------------------------
  1560.  # nihit malhotra
  1561.  # created march 2015
  1562. ad_proc im_employee_info_view_permissions {
  1563.         {-user_id:required}
  1564.         {-hr_view_p ""}
  1565. } {
  1566.         set view 0
  1567.         set current_user_id [ad_maybe_redirect_for_registration]
  1568.         if {$hr_view_p == "" } {
  1569.                 if {$user_id == $current_user_id } {
  1570.                         set view 1
  1571.                 }
  1572.                 if { [im_profile::member_p -profile "HR Managers" -user_id $current_user_id]  || [im_is_user_site_wide_or_intranet_admin $current_user_id] || [im_profile::member_p -profile "Senior Managers" -user_id $current_user_id] || [im_profile::member_p -profile "Office Admin" -user_id $current_user_id]  } {
  1573.                         set view 1
  1574.                 }
  1575.         } else {
  1576.                 if { [im_profile::member_p -profile "HR Managers" -user_id $current_user_id] || [im_profile::member_p -profile "Senior Managers" -user_id $current_user_id] || [im_is_user_site_wide_or_intranet_admin $current_user_id] || [im_profile::member_p -profile "Office Admin" -user_id $current_user_id] } {
  1577.                         set view 1
  1578.                 }
  1579.         }
  1580.         return $view
  1581. }
  1582.  
  1583. ad_proc currency_api_request {
  1584.         -date:required
  1585.         { -currency_to_check "" }
  1586. } {
  1587.         set c_date [db_string current_date "select to_char(now(),'YYYY-MM-DD')"]
  1588.         if {$c_date<$date} {
  1589.                 set date $c_date
  1590.         }
  1591.         set tcl_string [db_string get_data "select json_data from im_rate_conversions_api where date =:date limit 1" -default ""]
  1592.         if {$tcl_string != ""} {
  1593.                 set page_info [json2dict $tcl_string]
  1594.                 set page_dict [dict get $page_info "rates"]
  1595.                 if {$currency_to_check != "" } {
  1596.                         set currency_to_check [string toupper $currency_to_check]
  1597.                         if { ![dict exists $page_dict $currency_to_check ]} {
  1598.                                 set call_api_2 1
  1599.                                 db_dml delete "delete from im_rate_conversions_api where date =:date"
  1600.                         } else {
  1601.                                 return $page_info
  1602.                         }
  1603.                 } else {
  1604.                         return $page_info
  1605.                 }
  1606.         }
  1607.         set i 0
  1608.         while {$i<20} {
  1609.                 if { [catch {
  1610.                         package require http
  1611.                         break
  1612.  
  1613.                 } err_msg] } {
  1614.                         incr i
  1615.                         continue
  1616.                 }
  1617.         }
  1618.         package require tls
  1619.         set call_api_2 0
  1620.         set final_return ""
  1621.         http::register https 443 tls::socket
  1622.         if {[catch {set token [http::geturl "http://api.ratesapi.io/api/$date" ] } err_msg]} {
  1623.                 set call_api_2 1
  1624.         } else {
  1625.                 # set token [http::geturl "https://google.com/$date" ]
  1626.                 set status [http::status $token]
  1627.                 # return $status
  1628.                 set answer [http::data $token]
  1629.                 set validate_json [util::json::validate $answer]
  1630.                 set json_output_2 $answer
  1631.                 set tcl_list [json2dict $answer]
  1632.                 # http::cleanup $token
  1633.                 # http::unregister https
  1634.                 # return $tcl_list
  1635.                 # set validate_json [util::json::validate $json_output_1]
  1636.                 # set tcl_list [json2dict $json_output_1]
  1637.                 if { [dict exists $tcl_list "rates"] } {
  1638.                         set page_info [dict get $tcl_list "rates"]
  1639.                         dict append page_info "EUR" "1.0"
  1640.                         # doc_return 200 text/plain $page_info
  1641.                         set tcl_list [dict replace $tcl_list "rates" $page_info]
  1642.                         set final_return $tcl_list
  1643.                         if {$currency_to_check != "" } {
  1644.                                 set currency_to_check [string toupper $currency_to_check]
  1645.                                 if { ![dict exists $page_info $currency_to_check ]} {
  1646.                                         set call_api_2 1
  1647.                                 }
  1648.                         }
  1649.                 } else {
  1650.                         set call_api_2 1
  1651.                 }
  1652.  
  1653.                 http::cleanup $token
  1654.         }
  1655.        
  1656.         if { $call_api_2 == 1} {
  1657.                 # return 2
  1658.                 set api_key "d996204fde5ca19f579f58e3269bd3a8"
  1659.                 set json_output_2 [http::data [http::geturl "http://data.fixer.io/api/$date?access_key=$api_key"] ]
  1660.                 set validate_json [util::json::validate $json_output_2]
  1661.                 set tcl_list [json2dict $json_output_2]
  1662.                 set final_return $tcl_list
  1663.         }
  1664.         http::unregister https
  1665.         if { $final_return != "" && [dict exists $final_return "rates"] } {
  1666.                 db_dml insert "insert into im_rate_conversions_api (date,json_data) values ('$date','$json_output_2')"
  1667.         }
  1668.         return $final_return
  1669.        
  1670. }
  1671.  
  1672. # 26-03-2015
  1673. # Nihit Malhotra
  1674.  
  1675. ad_proc convert_amount_in_usd {
  1676.         -currency:required
  1677.         -date:required
  1678. } {
  1679.         # package require http
  1680.         set currency [string tolower $currency]
  1681.         set new_currency ""
  1682.         set usd ""
  1683.         # set api_key "d996204fde5ca19f579f58e3269bd3a8"
  1684.         # Improved API request
  1685.         # 2017-03-09
  1686.         # Nihit Malhotra
  1687.         set org_date $date
  1688.         if { $currency == "inr" } {
  1689.                 db_0or1row get_rate "select usd from im_invoice_rbi_rates where date=:date"
  1690.                 if {$usd == ""} {
  1691.                         for { set i 1 } { $i < 15 } { incr i } {
  1692.                                 set date_int [clock add [clock scan $date -format "%Y-%m-%d"] -1 days]
  1693.                                 set date [clock format $date_int -format "%Y-%m-%d"]
  1694.                                 db_0or1row get_rate "select usd from im_invoice_rbi_rates where date=:date"
  1695.                                 if {$usd != ""} {
  1696.                                         break
  1697.                                 }
  1698.                         }
  1699.                 }
  1700.                 if {$usd == ""} {
  1701.                         # set json_output [http::data [http::geturl "http://api.fixer.io/$org_date?base=USD"] ]
  1702.                         # set json_output [http::data [http::geturl "http://data.fixer.io/api/$org_date?access_key=$api_key"] ]
  1703.                         # set validate_json [util::json::validate $json_output]
  1704.                         # set tcl_list [json2dict $json_output]
  1705.                        
  1706.                         set tcl_list [currency_api_request -date $org_date]
  1707.                         if { [dict exists $tcl_list "rates"] } {
  1708.                                 set page_info [dict get $tcl_list "rates"]
  1709.                                 set in_inr [dict get $page_info "INR"]
  1710.                                 set in_usd [dict get $page_info "USD"]
  1711.                                 set usd [expr $in_inr / $in_usd]
  1712.                         } else {
  1713.                                 set usd 0
  1714.                                 return 0
  1715.                         }
  1716.                 }
  1717.                 return [expr 1 / $usd ]
  1718.         }
  1719.         if { [db_0or1row chk_column "SELECT column_name FROM information_schema.columns WHERE table_name='im_invoice_rbi_rates' and column_name=:currency"] } {
  1720.                 set found_p [db_0or1row get_rate "select $currency as new_currency , usd from im_invoice_rbi_rates where date=:date"]
  1721.                 if {!$found_p} {
  1722.                         for { set i 1 } { $i < 15 } { incr i } {
  1723.                                 set date_int [clock add [clock scan $date -format "%Y-%m-%d"] -1 days]
  1724.                                 set date [clock format $date_int -format "%Y-%m-%d"]
  1725.                                 set found_p [db_0or1row get_rate "select $currency  as new_currency, usd from im_invoice_rbi_rates where date=:date"]
  1726.                                 if {$found_p } {
  1727.                                         break
  1728.                                 }
  1729.                         }
  1730.                 }
  1731.         }
  1732.         if { $new_currency == ""} {
  1733.                 # set json_output [http::data [http::geturl "http://api.fixer.io/$org_date?base=$currency"] ]
  1734.                 # set json_output [http::data [http::geturl "http://data.fixer.io/api/$org_date?access_key=$api_key"] ]
  1735.                 # set validate_json [util::json::validate $json_output]
  1736.                 # set tcl_list [json2dict $json_output]
  1737.                
  1738.                 set tcl_list [currency_api_request -date $org_date -currency_to_check $currency ]
  1739.                
  1740.                 # if { [string first "Invalid base" $tcl_list] == -1 } {
  1741.                         if { [dict exists $tcl_list "rates"] } {
  1742.                                 set page_info [dict get $tcl_list "rates"]
  1743.                                 set in_inr [dict get $page_info "INR"]
  1744.                                 set in_new_curr [dict get $page_info [string toupper $currency]]
  1745.                                 set in_usd [dict get $page_info "USD"]
  1746.                                 set new_currency [expr $in_inr / $in_new_curr]
  1747.                                 set usd [expr $in_inr / $in_usd]
  1748.                                 # set new_currency [dict get $page_info "INR"]
  1749.                         } else {
  1750.                                 return 0
  1751.                         }
  1752.                 # }
  1753.                
  1754.                 # set json_output [http::data [http::geturl "http://api.fixer.io/$org_date?base=USD"] ]
  1755.                 # set json_output [http::data [http::geturl "http://data.fixer.io/api/$org_date?access_key=$api_key"] ]
  1756.                 # set validate_json [util::json::validate $json_output]
  1757.                 # set tcl_list [json2dict $json_output]
  1758.                 # set tcl_list [currency_api_request -date $org_date]
  1759.                 # if { [dict exists $tcl_list "rates"] } {
  1760.                 #       set page_info [dict get $tcl_list "rates"]
  1761.                 #       set in_inr [dict get $page_info "INR"]
  1762.                 #       set in_usd [dict get $page_info "USD"]
  1763.                 #       set usd [expr $in_inr / $in_usd]
  1764.                 # } else {
  1765.                 #       set usd 0
  1766.                 #       return 0
  1767.                 # }
  1768.         }
  1769.         if { $new_currency != "" && $usd != "" } {
  1770.                 return [expr $new_currency / $usd ]
  1771.         } else {
  1772.                 return 0
  1773.         }
  1774. }
  1775.  
  1776.  
  1777. # 14-03-2017
  1778. ad_proc convert_currency_amount {
  1779.         -convert_from:required
  1780.         -convert_to:required
  1781.         -currency_amount:required
  1782.         -date:required
  1783. } {
  1784.        
  1785.         # package require http
  1786.         set org_date $date
  1787.         set convert_from [string tolower $convert_from]
  1788.         set convert_to [string tolower $convert_to]
  1789.         set rate1 ""
  1790.         set rate2 ""
  1791.         # set api_key "d996204fde5ca19f579f58e3269bd3a8"
  1792.         set amount_to_convert_in_inr ""
  1793.         if { $convert_from != "inr" } {
  1794.                 # set test_var "select $convert_from from im_invoice_rbi_rates where date=:date"
  1795.                 # get rate1
  1796.                 set column_found_p [db_0or1row chk_data "SELECT column_name FROM information_schema.columns WHERE table_name='im_invoice_rbi_rates' and column_name=:convert_from"]
  1797.                 if {$column_found_p } {
  1798.                         set rate1 [db_string get_rate1 "select $convert_from from im_invoice_rbi_rates where date=:date" -default ""]          
  1799.                         if { $rate1 == ""} {
  1800.                                 for { set i 1 } { $i < 15 } { incr i } {
  1801.                                         set date_int [clock add [clock scan $date -format "%Y-%m-%d"] -1 days]
  1802.                                         set date [clock format $date_int -format "%Y-%m-%d"]
  1803.                                         set rate1 [db_string get_rate "select $convert_from from im_invoice_rbi_rates where date=:date" -default ""]
  1804.                                         if {$rate1 != ""} {
  1805.                                                 break
  1806.                                         }
  1807.                                 }
  1808.                         }
  1809.                 }
  1810.                 if {$rate1 == ""} {
  1811.                         # set json_output [http::data [http::geturl "http://api.fixer.io/$org_date?base=$convert_from"] ]
  1812.                         # set json_output [http::data [http::geturl "http://data.fixer.io/api/$org_date?access_key=$api_key"] ]
  1813.                         # set validate_json [util::json::validate $json_output]
  1814.                         # set tcl_list [json2dict $json_output]
  1815.                         set tcl_list [currency_api_request -date $org_date -currency_to_check $convert_from]
  1816.                         if { [lsearch $tcl_list "error"] == -1 } {
  1817.                                 if { [dict exists $tcl_list "rates"] } {
  1818.                                         set page_info [dict get $tcl_list "rates"]
  1819.                                         set temp_rate_inr [dict get $page_info "INR"]
  1820.                                         set temp_rate_from [dict get $page_info [string toupper $convert_from] ]
  1821.                                         set rate1 [expr $temp_rate_inr / $temp_rate_from]
  1822.                                 } else {
  1823.                                         return 0
  1824.                                 }
  1825.                         } else {
  1826.                                 return 0
  1827.                         }
  1828.                 }
  1829.                 set amount_to_convert_in_inr [expr $rate1 * $currency_amount]
  1830.                 if {$convert_to == "inr"} {
  1831.                         return $amount_to_convert_in_inr
  1832.                 }
  1833.                 set date $org_date
  1834.                 set column_found_p2 [db_0or1row chk_data "SELECT column_name FROM information_schema.columns WHERE table_name='im_invoice_rbi_rates' and column_name=:convert_to"]
  1835.                 if {$column_found_p2 } {
  1836.                         set rate2 [db_string get_rate1 "select $convert_to from im_invoice_rbi_rates where date=:date" -default ""]            
  1837.                         if { $rate2 == "" } {
  1838.                                 for { set i 1 } { $i < 15 } { incr i } {
  1839.                                         set date_int [clock add [clock scan $date -format "%Y-%m-%d"] -1 days]
  1840.                                         set date [clock format $date_int -format "%Y-%m-%d"]
  1841.                                         set rate2 [db_string get_rate "select $convert_to from im_invoice_rbi_rates where date=:date" -default ""]
  1842.                                         if {$rate2 != ""} {
  1843.                                                 break
  1844.                                         }
  1845.                                 }
  1846.                         }
  1847.                 }
  1848.                 # doc_return 200 "text/html" $rate2
  1849.                 if {$rate2 == ""} {
  1850.                         # set json_output [http::data [http::geturl "http://api.fixer.io/$org_date?base=$convert_to"] ]
  1851.                         # set json_output [http::data [http::geturl "http://data.fixer.io/api/$org_date?access_key=$api_key"] ]
  1852.                         # # doc_return 200 "text/html" $json_output
  1853.                         # set validate_json [util::json::validate $json_output]
  1854.                         # set tcl_list [json2dict $json_output]
  1855.                         set tcl_list [currency_api_request -date $org_date -currency_to_check $convert_to]
  1856.                         if { [lsearch $tcl_list "error"] == -1 } {
  1857.                                 if { [dict exists $tcl_list "rates"] } {
  1858.                                         set page_info [dict get $tcl_list "rates"]
  1859.                                         set temp_rate_inr [dict get $page_info "INR"]
  1860.                                         set temp_rate_from [dict get $page_info [string toupper $convert_to] ]
  1861.                                         set rate2 [expr $temp_rate_inr / $temp_rate_from]
  1862.                                 } else {
  1863.                                         return 0
  1864.                                 }
  1865.                         } else {
  1866.                                 return 0
  1867.                         }
  1868.                 }
  1869.                 # doc_return 200 "text/html" $rate2
  1870.                 return [ expr (1 / $rate2) * $amount_to_convert_in_inr ]
  1871.        
  1872.         } else {
  1873.                 set column_found_p [db_0or1row chk_data "SELECT column_name FROM information_schema.columns WHERE table_name='im_invoice_rbi_rates' and column_name=:convert_to"]
  1874.                 if {$column_found_p } {
  1875.                         set rate1 [db_string get_rate1 "select $convert_to from im_invoice_rbi_rates where date=:date" -default ""]            
  1876.                         if { $rate1 == "" } {
  1877.                                 for { set i 1 } { $i < 15 } { incr i } {
  1878.                                         set date_int [clock add [clock scan $date -format "%Y-%m-%d"] -1 days]
  1879.                                         set date [clock format $date_int -format "%Y-%m-%d"]
  1880.                                         set rate1 [db_string get_rate "select $convert_to from im_invoice_rbi_rates where date=:date" -default ""]
  1881.                                         if {$rate1 != ""} {
  1882.                                                 break
  1883.                                         }
  1884.                                 }
  1885.                         }
  1886.                 }
  1887.                 if { $rate1 == "" } {
  1888.                         # set json_output [http::data [http::geturl "http://api.fixer.io/$org_date?base=$convert_to"] ]
  1889.                         # set validate_json [util::json::validate $json_output]
  1890.                         # set tcl_list [json2dict $json_output]
  1891.                         set tcl_list [currency_api_request -date $org_date -currency_to_check $convert_to]
  1892.                         if { [lsearch $tcl_list "error"] == -1 } {
  1893.                                 if { [dict exists $tcl_list "rates"] } {
  1894.                                         set page_info [dict get $tcl_list "rates"]
  1895.                                         set temp_rate_inr [dict get $page_info "INR"]
  1896.                                         set temp_rate_from [dict get $page_info [string toupper $convert_to] ]
  1897.                                         set rate1 [expr $temp_rate_inr / $temp_rate_from]
  1898.                                 } else {
  1899.                                         return 0
  1900.                                 }
  1901.                         } else {
  1902.                                 return 0
  1903.                         }
  1904.                 }
  1905.                        
  1906.                 return [expr (1 / $rate1) * $currency_amount]
  1907.         }
  1908. }
  1909.  
  1910. ad_proc get_employee_for_petty_cash {
  1911.         -user_id:required
  1912. } {
  1913.         if {$user_id == 8892 } {
  1914.                 return "non"
  1915.         }
  1916.         set found_p [db_0or1row get_data "select firm_id from im_expenses_petty_cash where employee_id=:user_id"]
  1917.         if {$found_p } {
  1918.                 return $firm_id
  1919.         }
  1920.         set accountant_p [db_0or1row chk_group "select group_id from group_member_map where (group_id=585 or group_id=471 or group_id=459 or group_id=542432) and member_id=:user_id limit 1"]
  1921.         if {$accountant_p } {
  1922.                 return "all"
  1923.         }
  1924.         return "non"
  1925. }
  1926.  
  1927.  
  1928. ad_proc im_subordinates_list { -user_id:required { -flag_val "" } {-ignore_termination 0 } } {
  1929.         set flag 1
  1930.         set final_list [list]
  1931.         # lappend $user_id
  1932.         set j 1
  1933.         while { $flag } {
  1934.                 if {$user_id != ""} {
  1935.                         if { $flag_val == 1 } {
  1936.                                 set sub_list [db_list get_sub_list "select employee_id from im_employees where  immediate_supervisor_id=:user_id"]
  1937.                         } else {
  1938.                                 set sub_list [db_list get_sub_list "select employee_id from im_employees where supervisor_id in ($user_id) or immediate_supervisor_id in ($user_id)"]
  1939.                         }
  1940.                 } else {
  1941.                         set sub_list ""
  1942.                 }  
  1943.  
  1944.                 if { $flag_val == 1 } {
  1945.                         set return_list_another [list]
  1946.                         foreach employee_id_val $sub_list {  
  1947.                                 set date_list [employee_join_terminate_date -user_id $employee_id_val]  
  1948.                                 set term_date [lindex $date_list 1]
  1949.                                
  1950.                                 set term_date_int [clock scan $term_date -format "%Y-%m-%d"]
  1951.                                 set current_date_int [db_string get_date "select to_char(now(),'YYYY-MM-DD')"]
  1952.                                
  1953.                                 if { $current_date_int < $term_date_int } {
  1954.                                         lappend return_list_another $employee_id_val
  1955.                                 }
  1956.                         }  
  1957.                         return $return_list_another
  1958.                 }
  1959.                
  1960.                 set user_id ""
  1961.                 set i 1
  1962.                 foreach next_ids $sub_list {
  1963.                         incr i
  1964.                         lappend final_list $next_ids
  1965.                         if {$user_id != ""} {
  1966.                                 append user_id ","
  1967.                         }
  1968.                         append user_id "$next_ids"
  1969.                 }
  1970.                 if {$i == 1} {
  1971.                         set flag 0
  1972.                 }
  1973.                 incr j
  1974.                 if {$j > 100} {
  1975.                         break
  1976.                 }
  1977.         }
  1978.         set final_list [lsort -unique $final_list]
  1979.         if {$ignore_termination == 1 } {
  1980.                 return $final_list
  1981.         }
  1982.         set return_list [list]
  1983.         foreach employee_id_val $final_list {
  1984.                 set date_list [employee_join_terminate_date -user_id $employee_id_val]
  1985.                 set term_date [lindex $date_list 1]
  1986.                 set term_date_int [clock scan $term_date -format "%Y-%m-%d"]
  1987.                 set current_date_int [clock scan [db_string get_date "select to_char(now(),'YYYY-MM-DD')"] -format "%Y-%m-%d"]
  1988.                 if {$current_date_int < $term_date_int} {
  1989.                         lappend return_list $employee_id_val
  1990.                 }
  1991.         }  
  1992.        
  1993.         if { $flag_val != 1 } {  
  1994.                 return $return_list
  1995.         }
  1996. }
  1997.  
  1998.  
  1999.  
  2000. ad_proc -public im_subordinates_options {
  2001.     { -user_id 0 }
  2002.         { -include_supervisor_p 0}
  2003. } {
  2004.         Returns a list of (user_id user_name) tuples that are subordinates of a particular user.
  2005. } {
  2006.     if {"" == $user_id} { return "" }    
  2007.         set sub_list [im_subordinates_list -user_id $user_id]
  2008.         if {$include_supervisor_p } {
  2009.                 lappend sub_list $user_id
  2010.         }
  2011.         set option [list]
  2012.         if {$sub_list != ""} {
  2013.         # Edited to show all the subordinates till depth
  2014.     set options [db_list_of_lists user_options "
  2015.                 select distinct
  2016.                         acs_object__name(u.user_id) as name,
  2017.                         u.user_id
  2018.                 from
  2019.                         users_active u,
  2020.                         group_distinct_member_map m,
  2021.                         im_employees e
  2022.                 where
  2023.                         u.user_id = m.member_id
  2024.                         and e.employee_id = u.user_id
  2025.                         and u.user_id in ([join $sub_list ","]) order by name
  2026.         "]
  2027.         }
  2028.        
  2029.     return $options
  2030. }
  2031.  
  2032. ad_proc im_subordinates_select {
  2033.     {-include_empty_p 0}
  2034.     {-include_empty_name "All"}
  2035.     {-user_id 0 }
  2036.         {-include_supervisor_p 0}
  2037.     select_name
  2038.     { default "" }
  2039. } {
  2040.     Returns an html select box named $select_name and defaulted to
  2041.     $default with a list of all the available project_leads in
  2042.     the system
  2043. } {
  2044.     set user_options [im_subordinates_options -user_id $user_id -include_supervisor_p $include_supervisor_p]
  2045.     if {$include_empty_p} { set user_options [linsert $user_options 0 [list $include_empty_name ""]] }
  2046.     return [im_options_to_select_box $select_name $user_options $default]
  2047. }
  2048.  
  2049.  
  2050. ad_proc employee_profile_data_component { -user_id:required } {
  2051.         # component to show promotions, domains and type of projects of employees
  2052.         set current_user_id [ad_maybe_redirect_for_registration]
  2053.         set edit_p 0
  2054.         set admin_p [im_is_user_site_wide_or_intranet_admin $current_user_id]
  2055.         set hr_p [im_profile::member_p -profile "HR Managers" -user_id $current_user_id]
  2056.         set vp_p [im_profile::member_p -profile "Freelance Managers" -user_id $current_user_id]
  2057.         set srm_p [im_profile::member_p -profile "Senior Managers" -user_id $current_user_id]
  2058.         set supervisor_p [db_0or1row chk_supr "select department_id from im_employees where employee_id=:user_id and (supervisor_id =:current_user_id or immediate_supervisor_id=:current_user_id)"]
  2059.         if {$admin_p || $hr_p || $supervisor_p || $vp_p || $srm_p } {
  2060.                 set edit_p 1
  2061.         }
  2062.         set component_html ""
  2063.         set data_lists [db_list_of_lists get_emp_data "select data_type, data, to_char(data_date, 'YYYY-MM-DD') from im_employees_multiple_data where employee_id=:user_id order by data_type,data_date "]
  2064.  
  2065.         set promotions_data_table_body ""
  2066.         set project_type_table_body ""
  2067.         set domain_data_table_body ""
  2068.        
  2069.         set promotions_data_table_head "<table class='common_tab_css'><thead>
  2070.         <tr><th  class='table-heading' colspan=2>Promotions</th></tr>
  2071.         <tr>
  2072.         <th>Designation</th>
  2073.         <th>Start Date</th>
  2074.         </tr></thead><tbody>"
  2075.  
  2076.  
  2077.         set domain_data_table_head "<table class='common_tab_css'><thead>
  2078.         <tr><th  class='table-heading' colspan=2>Domains</th></tr>
  2079.         </thead><tbody>"
  2080.  
  2081.  
  2082.         set project_type_table_head "<table class='common_tab_css'><thead>
  2083.         <tr><th colspan=2 class='table-heading'>Project Types</th></tr>
  2084.         </thead><tbody>"
  2085.         set count_pt 1
  2086.         set count_d 1
  2087.         foreach data_list $data_lists {
  2088.                 set temp_data_type [lindex $data_list 0]
  2089.                 set temp_data [lindex $data_list 1]
  2090.                 set temp_data_date [lindex $data_list 2]
  2091.                 switch $temp_data_type {
  2092.                         "promotion" {
  2093.                                 append promotions_data_table_body "<tr>
  2094.                                 <td>$temp_data</td>
  2095.                                 <td>$temp_data_date</td>
  2096.                                 </tr>"                         
  2097.                         }
  2098.                         "project_type" {
  2099.                                 if {$count_pt == 1 } {
  2100.                                         append project_type_table_body "<tr>"
  2101.                                 }
  2102.                                 append project_type_table_body "<td>[im_category_from_id $temp_data]</td>"
  2103.                                 if {$count_pt == 2 } {
  2104.                                         append project_type_table_body "</tr>"
  2105.                                         set count_pt 0
  2106.                                 }
  2107.                                 incr count_pt
  2108.                                
  2109.                         }
  2110.                         "domain" {
  2111.                                 if {$count_d == 1 } {
  2112.                                         append domain_data_table_body "<tr>"
  2113.                                 }
  2114.                                 append domain_data_table_body "<td>[im_category_from_id $temp_data]</td>"
  2115.                                 if {$count_d == 2 } {
  2116.                                         append domain_data_table_body "</tr>"
  2117.                                         set count_d 0
  2118.                                 }
  2119.                                 incr count_d
  2120.                         }
  2121.                 }
  2122.         }
  2123.         if { $promotions_data_table_body != ""} {
  2124.                 append promotions_data_table_head "$promotions_data_table_body </tbody></table>"
  2125.         } else {
  2126.                 set promotions_data_table_head ""
  2127.         }
  2128.         if { $project_type_table_body != ""} {
  2129.                 if {$count_pt == 2} {
  2130.                         append project_type_table_body "<td></td></tr>"
  2131.                 }
  2132.                 append project_type_table_head "$project_type_table_body </tbody></table>"
  2133.         } else {
  2134.                 set project_type_table_head ""
  2135.         }
  2136.         if { $domain_data_table_body != ""} {
  2137.                 if {$count_d == 2} {
  2138.                         append domain_data_table_body "<td></td></tr>"
  2139.                 }
  2140.                 append domain_data_table_head "$domain_data_table_body </tbody></table>"
  2141.         } else {
  2142.                 set domain_data_table_head ""
  2143.         }
  2144.         append component_html "$promotions_data_table_head"
  2145.         append component_html "$project_type_table_head"
  2146.         append component_html "$domain_data_table_head"
  2147.         if {$component_html == "" } {
  2148.                 append component_html "No information found click <b>Edit</b> to add new data"
  2149.         }
  2150.         if {$edit_p } {
  2151.         append component_html "<form action='add-employee-profile-data' method='get' >
  2152.                 <input type='hidden' name='employee_id' value='$user_id'>
  2153.                 <input type='submit' value='Edit'>
  2154.                 </form>"
  2155.         }
  2156.         append component_html " <style>
  2157.                 .table-heading {
  2158.                         text-align:center;
  2159.                         background-color:#c5d1fb;
  2160.                 }
  2161.                 .common_tab_css {
  2162.                         width:100%;
  2163.                 }
  2164.                 </style>"
  2165.         return $component_html
  2166. }
  2167.  
  2168. ad_proc appraisal_xlplat_block {
  2169.     { -page_title "" }
  2170. } {
  2171.         set user_id [ad_maybe_redirect_for_registration]
  2172.         set cust_p [im_user_is_customer_p $user_id]
  2173.         #amit add training_feedback form tooo and evaluation form too
  2174.     if {  $page_title == "Performance Dev Form" || $page_title == "Set Form Dates" || $page_title == "Training Feedback Form" || $page_title == "Training Evaluation Form" ||$page_title == "Score Page" || $page_title == "Score" || $page_title == "Project Score Details" || $cust_p }  {
  2175.         return ""
  2176.     } else {
  2177.        
  2178.         set current_user_id $user_id
  2179.         set is_freelance_p [im_profile::member_p -profile "Freelance Managers" -user_id $user_id ]
  2180.         set is_avp_p [im_profile::member_p -profile "AVP" -user_id $user_id ]
  2181.         set c_date [db_string get_date "select to_char(now(),'YYYY-MM-DD')"]
  2182.         # set c_date "2019-03-05"
  2183.         set c_year [lindex [split $c_date "-"] 0]
  2184.         set c_month [lindex [split $c_date "-"] 1]
  2185.         # this scan is to remove 08 octal error
  2186.         scan $c_month %d c_month
  2187.         set upper_year [expr $c_year + 1]
  2188.         set second_last_day_employee_review ""
  2189.         set lower_year $c_year
  2190.         set no_block 0
  2191.         set employee_review_close ""
  2192.         set second_last_day_employee_review ""
  2193.         set check_flag ""
  2194.         set year "$c_year-$upper_year"
  2195.         set lower_year_dummy [expr $c_year - 1]  
  2196.  
  2197.         #shivani sharma
  2198.         set appraisal_for_previous_year [db_0or1row get_info "select row_id from new_app_form_fields_data where user_id=:user_id and year='$lower_year_dummy-$c_year' and year_part='2' and ( state='closed' or state is null or state='in_review' or state='in_review_manager' or state='locked' ) limit 1"]
  2199.         # doc_return 200 "text/plain" $appraisal_for_previous_year
  2200.         set is_appraisal_filled [db_0or1row get_appraisal_filled_details "select row_id from new_app_form_fields_data where user_id=:user_id and year='$lower_year_dummy-$c_year' and year_part='2' limit 1"]
  2201.        
  2202.                 set appraisal_for_previous_year_filled [list]
  2203.             set user_subordinate_list [im_subordinates_list -user_id $user_id]
  2204.             if { $user_subordinate_list != ""  } {
  2205.                     if {$appraisal_for_previous_year == 1 } {
  2206.                         foreach each_subordinate $user_subordinate_list {
  2207.                                 set appraisal_for_previous_year_subordinate [db_0or1row get_info "select row_id from new_app_form_fields_data where user_id=:each_subordinate and year='$lower_year_dummy-$c_year' and year_part='2' and ( state='in_review' or state='locked' or state='in_review_manager') limit 1"]  
  2208.  
  2209.                                 # doc_return 200 "text/plain" "$lower_year_dummy-$c_year"
  2210.                                 if { $appraisal_for_previous_year == 1 } {
  2211.                                         lappend appraisal_for_previous_year_filled $appraisal_for_previous_year_subordinate
  2212.                                 }  
  2213.                         }
  2214.                        
  2215.                         if { $appraisal_for_previous_year_filled != "" } {
  2216.                                 if { [lsearch -all $appraisal_for_previous_year_filled 1] > -1 } {
  2217.                                         set lower_year [expr $c_year - 1]
  2218.                                     set year "$lower_year-$c_year"
  2219.                                 }
  2220.                             }
  2221.                            
  2222.                     } else {
  2223.                         if { $appraisal_for_previous_year == 0 && $is_appraisal_filled == 1 } {
  2224.                             set lower_year [expr $c_year - 1]
  2225.                             set year "$lower_year-$c_year"
  2226.                                 }
  2227.                     }
  2228.             } else {
  2229.                 if { $appraisal_for_previous_year == 0 && $is_appraisal_filled == 1 } {
  2230.                     set lower_year [expr $c_year - 1]
  2231.                     set year "$lower_year-$c_year"
  2232.                         }
  2233.             }
  2234.  
  2235.  
  2236.                 set employee_join_date [employee_join_terminate_date -user_id $user_id]
  2237.                 set joining_date [lindex [split $employee_join_date " "] 0]
  2238.                 set joining_year [lindex [split $joining_date "-"] 0]
  2239.                 set joining_month [lindex [split $joining_date "-"] 1]
  2240.                 scan $joining_month %d joining_month
  2241.                 set fill_mid_year 0
  2242.                 set fill_year_end 0
  2243.                 set fill_next_mid_year 0  
  2244.                 if { $lower_year == $joining_year } {
  2245.                         if { $joining_month >= 1 && $joining_month < 4 } {
  2246.                                 set fill_mid_year 1
  2247.                                 set fill_year_end 1
  2248.                         } elseif { $joining_month >= 4 && $joining_month < 7 } {
  2249.                                 set fill_year_end 1
  2250.                                 set fill_mid_year 0
  2251.                         } elseif { $joining_month >= 7 && $joining_month < 10 } {
  2252.                                 set fill_year_end 1
  2253.                                 set fill_mid_year 0
  2254.                         } elseif { $joining_month >= 10 && $joining_month < 13 } {
  2255.                                 set fill_next_mid_year 1
  2256.                                 set fill_mid_year 0
  2257.                                 set fill_year_end 0
  2258.                         }
  2259.                 } else {
  2260.                         set fill_mid_year 1
  2261.                         set fill_year_end 1
  2262.                 }
  2263.  
  2264.             set ignorelist [list]
  2265.                 lappend ignorelist [employee_ignore_list 3]
  2266.                 set trainee_list [db_list get_trainee_list "select member_id from group_member_map where group_id=241834 and member_id in (select e.user_id from im_costs c, im_employees_active e, im_repeating_costs r where c.cause_object_id= e.user_id and r.end_date >= '$c_date' and r.rep_cost_id = c.cost_id) "]
  2267.                 set trainee_list [join $trainee_list ","]
  2268.                 if {$trainee_list != "" } {
  2269.                         append ignorelist ",$trainee_list"
  2270.                 }      
  2271.                 set one_month_from_joining [clock format [clock add [clock scan $joining_date -format "%Y-%m-%d"] +1 months ] -format "%Y-%m-%d" ]
  2272.                 if { $c_date < $one_month_from_joining } {
  2273.                         append ignorelist ",$user_id"
  2274.                 }
  2275.                
  2276.                 set final_ignore_list [split $ignorelist ","]
  2277.                 set user_available [lsearch -all $final_ignore_list $user_id]
  2278.                 if { ( $year != "2018-2019" && $user_available == "" ) } {
  2279.  
  2280.                         set starting_year [lindex [split $year "-"] 0]
  2281.                         set starting_year [expr $starting_year - 1]
  2282.  
  2283.                         set manager_review_year_end_date [db_string get_last_date "select close_yr_end_review_mgr from new_appraisal_form_dates where year=:starting_year" -default ""]
  2284.                     set three_weeks_later [clock format [clock add [clock scan $manager_review_year_end_date -format "%Y-%m-%d"] +21 days ] -format "%Y-%m-%d" ]
  2285.                     set objectives_filled [db_0or1row is_filled "select user_id from new_app_form_fields_data where year=:year and year_part='1' and (state='submitted' or state='in_review' or state='in_review_manager' or state='locked' or (state='saved' and emp_comments is not null and type!='career_journey'))  and user_id=:user_id limit 1"]
  2286.                     set record_exist [db_0or1row get_value "select user_id from new_app_form_fields_data where  year=:year and year_part='1' and user_id=:user_id limit 1"]
  2287.  
  2288.                     if { $objectives_filled == 0 && $fill_mid_year == 0 && $record_exist == 1} {
  2289.                         set fill_mid_year 1
  2290.                     }
  2291.  
  2292.                     if { $c_date > $three_weeks_later && $fill_mid_year == 1 && $objectives_filled == 0 } {
  2293.                         if { $objectives_filled == 0 && $fill_mid_year == 1 } {
  2294.                                 #155293
  2295.                                 if { $user_id == 155293 } {
  2296.                                         return
  2297.                                 } else {
  2298.                                         ad_returnredirect "/intranet/users/new_appraisal_form?flag=7&show_year=$year"
  2299.                                 }
  2300.                         }
  2301.                     } else {
  2302.                         set starting_year [lindex [split $year "-"] 0]
  2303.                         set manager_review_last_date [db_string get_last_date "select close_mid_yr_review_mgr from new_appraisal_form_dates where year=:starting_year" -default ""]
  2304.                         set two_weeks_later [clock format [clock add [clock scan $manager_review_last_date -format "%Y-%m-%d"] +14 days ] -format "%Y-%m-%d" ]
  2305.                         set objectives_filled_year_end [db_0or1row is_filled "select user_id from new_app_form_fields_data where year=:year and year_part='2' and (state='submitted' or state='in_review' or state='in_review_manager' or state='locked' or state='sent_for_sign_off' or state='closed' or (state='saved_emp' and emp_comments is not null and type!='career_journey'))  and user_id=:user_id limit 1"]  
  2306.                         # doc_return 200 "text/plain" "$objectives_filled_year_end $two_weeks_later"
  2307.                         if { $c_date >= $two_weeks_later } {
  2308.                                 if { $objectives_filled_year_end == 0 && $fill_year_end == 1 } {
  2309.                                         #155293
  2310.                                         if { $user_id == 155293  } {
  2311.                                                 return
  2312.                                         } else {
  2313.                                                 ad_returnredirect "/intranet/users/new_appraisal_form?flag=8&show_year=$year"
  2314.                                         }
  2315.                                 }
  2316.                         }
  2317.  
  2318.                         # else {
  2319.                         #       if { $joining_year == $lower_year && $fill_year_end == 1 && $objectives_filled_year_end == 0 } {
  2320.                         #               ad_returnredirect "/intranet/users/new_appraisal_form?flag=8&show_year=$year"
  2321.                         #       }      
  2322.                         # }
  2323.                     }
  2324.             }
  2325.             #manager blocking for 2019-2020
  2326.             #shivani sharma
  2327.         if { $is_freelance_p == 1 || $is_avp_p == 1 } {
  2328.                  set employee_review_close [db_string get_last_review_date "select close_mid_yr_review_mgr from new_appraisal_form_dates where year=:lower_year" -default ""]  
  2329.                
  2330.                 if { $employee_review_close != "" } {
  2331.                         set second_last_day_employee_review [clock format [clock add [clock scan $employee_review_close -format "%Y-%m-%d"] -1 days ] -format "%Y-%m-%d" ]
  2332.                 }
  2333.         } else {
  2334.                 set employee_review_close [db_string get_last_review_date "select close_mid_yr_review_emp from new_appraisal_form_dates where year=:lower_year" -default ""]  
  2335.                
  2336.                 if { $employee_review_close != "" } {
  2337.                         set second_last_day_employee_review [clock format [clock add [clock scan $employee_review_close -format "%Y-%m-%d"] -1 days ] -format "%Y-%m-%d" ]
  2338.                 }
  2339.             }
  2340.             set immediate_supervisor_list [db_list get_supervisor "select immediate_supervisor_id from im_employees where immediate_supervisor_id is not null"]
  2341.             set appraisal_filled [db_0or1row get_info "select row_id from new_app_form_fields_data where user_id=:user_id and year=:year and year_part='1' and ( state='in_review' or state='locked' or state is null ) limit 1"]
  2342.             set appraisal_not_filled [db_0or1row get_info "select row_id from new_app_form_fields_data where user_id=:user_id and year=:year and year_part='1' limit 1"]
  2343.             set manager_review_close [db_string get_last_review_date "select close_mid_yr_review_mgr from new_appraisal_form_dates where year=:lower_year" -default ""]
  2344.  
  2345.             if { $employee_review_close != "" } {
  2346.                
  2347.                 if { $second_last_day_employee_review == $c_date || $employee_review_close == $c_date || ( $employee_review_close < $c_date && $appraisal_filled != 1 && $appraisal_not_filled != 0 ) } {
  2348.                     set appraisal_filled [db_0or1row get_info "select row_id from new_app_form_fields_data where user_id=:user_id and year=:year and year_part='1' and ( state='in_review' or state='locked' or state='in_review_manager') limit 1"]
  2349.                    
  2350.                     set employee_join_term_date [employee_join_terminate_date -user_id $user_id]
  2351.                     set join_date [lindex [split $employee_join_term_date " "] 0]
  2352.                     set barrier_date "$c_year-05-01"
  2353.                     # if { $join_date >= $barrier_date && $appraisal_not_filled != 1 } {
  2354.                     #     set no_block 1
  2355.                     # }
  2356.                     if { $appraisal_not_filled != 1 } {
  2357.                         set no_block 1
  2358.                     }
  2359.  
  2360.                     if { $appraisal_filled == 1 || $no_block == 1 || $appraisal_not_filled == 0 } {
  2361.                         if { [lsearch -all $immediate_supervisor_list $user_id] > -1 } {
  2362.                                 set check_flag 1
  2363.                         } else {
  2364.                                 return ""
  2365.                         }
  2366.                     } else {
  2367.                         set current_status_part_one [db_string get_status "select state from new_app_form_fields_data where user_id=:current_user_id and year_part='1' and year=:year limit 1" -default ""]
  2368.                         if { $current_status_part_one == "submitted" || $current_status_part_one == "saved" } {
  2369.                                 ad_returnredirect "/intranet/users/new_appraisal_form?flag=1&show_year=$year"
  2370.                         }
  2371.                     }
  2372.                 } elseif { $c_date > $employee_review_close } {  
  2373.                     set employee_review_close_end_year [db_string get_last_review_date "select close_yr_end_review_emp from new_appraisal_form_dates where year=:lower_year" -default ""]  
  2374.  
  2375.                     set second_last_day_employee_review_end_year [clock format [clock add [clock scan $employee_review_close_end_year -format "%Y-%m-%d"] -1 days ] -format "%Y-%m-%d" ]
  2376.                    
  2377.                     set appraisal_filled [db_0or1row get_info "select row_id from new_app_form_fields_data where user_id=:user_id and year=:year and year_part='2' and ( state='in_review' or state='locked'  or state='closed' or state='in_review_manager')  limit 1"]  
  2378.                     set appraisal_not_filled [db_0or1row get_info "select row_id from new_app_form_fields_data where user_id=:user_id and year=:year and year_part='2' limit 1"]  
  2379.                         if { [lsearch -all $immediate_supervisor_list $user_id] > -1 } {
  2380.                                 set check_flag 1
  2381.                         }
  2382.                     if { $second_last_day_employee_review_end_year == $c_date || $employee_review_close_end_year == $c_date || ( $employee_review_close < $c_date && $appraisal_filled != 1 && $appraisal_not_filled != 0 ) } {  
  2383.                        
  2384.                         set employee_join_term_date [employee_join_terminate_date -user_id $user_id]
  2385.                         set join_date [lindex [split $employee_join_term_date " "] 0]
  2386.                         set barrier_date "$c_year-11-01"
  2387.                         # if { $join_date >= $barrier_date && $appraisal_not_filled != 1 } {
  2388.                         #     set no_block 1
  2389.                         # }
  2390.                         if { $appraisal_not_filled != 1 } {
  2391.                             set no_block 1
  2392.                         }
  2393.                         if { $appraisal_filled == 1 || $no_block == 1 || $appraisal_not_filled == 0 } {
  2394.  
  2395.                                 if { [lsearch -all $immediate_supervisor_list $user_id] > -1 } {
  2396.                                         set check_flag 1
  2397.                                 } else {
  2398.                                         return ""
  2399.                                 }
  2400.                         } else {  
  2401.                                
  2402.                                 set current_status [db_string get_status "select state from new_app_form_fields_data where user_id=:current_user_id and year_part='2' and year=:year limit 1" -default ""]
  2403.                                 if { ( $second_last_day_employee_review_end_year == $c_date || $employee_review_close_end_year == $c_date || $c_date > $employee_review_close_end_year && $appraisal_filled != 1 ) } {  
  2404.                                         if { ( $current_status == "" || $current_status != "sent_for_sign_off" ) } {
  2405.                                                 ad_returnredirect "/intranet/users/new_appraisal_form?flag=2&show_year=$year"
  2406.                                         } else {
  2407.                                                 ad_returnredirect "/intranet/users/new_appraisal_form?flag=5&show_year=$year"
  2408.                                         }  
  2409.                                 }
  2410.                         }
  2411.                     }
  2412.                 } else {
  2413.                         # doc_return 200 "text/plain" "$join_date 1"
  2414.                         #       ad_script_abort
  2415.                         return ""
  2416.                 }
  2417.  
  2418.  
  2419.                 set flag_val 1
  2420.                 set user_subordinate_list [im_subordinates_list -user_id $user_id -flag_val $flag_val]
  2421.                 set no_flag 0
  2422.                 set subordinate_list [list]
  2423.                 if { $user_subordinate_list != "" && $check_flag == 1 } {
  2424.                         set manager_review_close [db_string get_last_review_date "select close_mid_yr_review_mgr from new_appraisal_form_dates where year=:lower_year" -default ""]  
  2425.                         set second_last_day_manager_review [clock format [clock add [clock scan $manager_review_close -format "%Y-%m-%d"] -1 days ] -format "%Y-%m-%d" ]
  2426.                         set block_list [list]
  2427.                         set left_employees ""
  2428.                         foreach each_subordinate $user_subordinate_list {  
  2429.                                 set any_manager_review_left [db_0or1row get_info "select user_id from new_app_form_fields_data where user_id=:each_subordinate and year=:year and year_part='1' and (state='locked' or state='submitted' or state='saved') limit 1"]
  2430.                                 set appraisal_not_filled [db_0or1row get_info "select row_id from new_app_form_fields_data where user_id=:each_subordinate and year=:year and year_part='1' limit 1"]
  2431.                                 if { $any_manager_review_left != 1 && $appraisal_not_filled != 0 } {
  2432.                                         set block_xlplat 1
  2433.                                         lappend block_list $block_xlplat
  2434.                                         append left_employees "$each_subordinate,"
  2435.                                 }
  2436.                         }                      
  2437.                         if { $second_last_day_manager_review == $c_date || $manager_review_close == $c_date || ( $manager_review_close < $c_date && ([lsearch -all $block_list 1] > -1 )) } {  
  2438.                                 foreach each_subordinate $user_subordinate_list {  
  2439.                                     set appraisal_filled [db_0or1row get_info "select row_id from new_app_form_fields_data where user_id=:each_subordinate and year=:year and year_part='1' and (state='locked' or state='submitted' or state='saved') limit 1"]
  2440.                                      set appraisal_not_filled [db_0or1row get_info "select row_id from new_app_form_fields_data where user_id=:each_subordinate and year=:year and year_part='1' limit 1"]
  2441.                                     set employee_join_term_date [employee_join_terminate_date -user_id $each_subordinate]
  2442.                                     set join_date [lindex [split $employee_join_term_date " "] 0]
  2443.                                     set barrier_date "$c_year-05-01"
  2444.                                     # if { $join_date >= $barrier_date && $appraisal_not_filled == 0 } {
  2445.                                     #     set no_block 1
  2446.                                     # }
  2447.                                     # if { $appraisal_not_filled == 0 } {
  2448.                                     #     set no_block 1
  2449.                                     # }
  2450.                                     if { $appraisal_filled == 1 || $appraisal_not_filled == 0 } {
  2451.                                         set val 0
  2452.                                         lappend subordinate_list $val
  2453.                                 } else {               
  2454.                                         set val 1
  2455.                                         lappend subordinate_list $val
  2456.                                 }
  2457.                                 }  
  2458.                                 if { [lsearch -exact $subordinate_list 1 ] > -1 } {
  2459.                                     set no_flag 1
  2460.                             } else {
  2461.                                 set no_flag 0
  2462.                             }
  2463.  
  2464.                                         if { $no_flag == 1 } {  
  2465.                                 ad_returnredirect "/intranet/users/new_appraisal_form?flag=3&remaining_employees=$left_employees&show_year=$year"
  2466.                             } else {
  2467.                                 return ""
  2468.                             }
  2469.                         } elseif { $c_date > $manager_review_close } {    
  2470.                                
  2471.                             set subordinate_list_two [list]
  2472.                             set manager_review_close_end_year [db_string get_last_review_date "select close_yr_end_review_mgr from new_appraisal_form_dates where year=:lower_year" -default ""]  
  2473.                             set second_last_day_manager_review_end_year [clock format [clock add [clock scan $manager_review_close_end_year -format "%Y-%m-%d"] -1 days ] -format "%Y-%m-%d" ]
  2474.  
  2475.                             set block_list_two [list]
  2476.                                 set left_employees_two ""
  2477.                                 foreach each_subordinate $user_subordinate_list {  
  2478.                                         set any_manager_review_left_two [db_0or1row get_info "select user_id from new_app_form_fields_data where user_id=:each_subordinate and year=:year and year_part='2' and (state='submitted' or state='saved' or state='saved_emp' or state='closed' or state='sent_for_sign_off') limit 1"]
  2479.  
  2480.                                         set appraisal_not_filled [db_0or1row get_info "select row_id from new_app_form_fields_data where user_id=:each_subordinate and year=:year and year_part='2' limit 1"]
  2481.                                        
  2482.                                         if { $any_manager_review_left_two != 1 && $appraisal_not_filled != 0 } {
  2483.                                                 set block_xlplat 1
  2484.                                                 lappend block_list_two $block_xlplat
  2485.                                                 append left_employees_two "$each_subordinate,"
  2486.                                         }
  2487.                                
  2488.                                         set any_manager_sign_off_left [db_0or1row get_info "select user_id from new_app_form_fields_data where user_id=:each_subordinate and year=:year and year_part='2' and (state='submitted' or state='saved' or state='saved_emp' or state='closed' or state='sent_for_sign_off') limit 1"]
  2489.                                          
  2490.  
  2491.                                         if { $any_manager_sign_off_left != 1 && $appraisal_not_filled != 0 } {
  2492.                                                 append left_employees_sign_off "$each_subordinate,"
  2493.                                         }
  2494.                                 }
  2495.  
  2496.                             if { $second_last_day_manager_review_end_year == $c_date || $manager_review_close_end_year == $c_date || ( $manager_review_close_end_year < $c_date && ([lsearch -all $block_list_two 1] > -1 )) } {
  2497.                      
  2498.                                 foreach each_subordinate $user_subordinate_list {  
  2499.                                         set appraisal_filled [db_0or1row get_info "select row_id from new_app_form_fields_data where user_id=:each_subordinate and year=:year and year_part='2' and ( state='locked' or state='submitted' or state='saved_emp' or state='closed' or state='saved' or state='sent_for_sign_off') limit 1"]  
  2500.                                        
  2501.                                         set sent_for_sign_off_check [db_0or1row sent_for_sign_off_done "select state from new_app_form_fields_data where user_id=:each_subordinate and year=:year and year_part='2' and state='locked' limit 1"]
  2502.  
  2503.                                                 set appraisal_not_filled [db_0or1row get_info "select row_id from new_app_form_fields_data where user_id=:each_subordinate and year=:year and year_part='2' limit 1"]
  2504.  
  2505.                                         set employee_join_term_date [employee_join_terminate_date -user_id $each_subordinate]
  2506.                                         set join_date [lindex [split $employee_join_term_date " "] 0]
  2507.                                         set barrier_date "$c_year-11-01"
  2508.                                         # if { $join_date >= $barrier_date && $appraisal_not_filled != 1 } {
  2509.                                         #     set no_block 1
  2510.                                         # }
  2511.                                         # if { $appraisal_not_filled != 1 } {
  2512.                                         #     set no_block 1
  2513.                                         # }  
  2514.  
  2515.                                         if { $appraisal_filled == 1  || $appraisal_not_filled == 0 } {
  2516.                                                 set val 0
  2517.                                                 lappend subordinate_list_two $val
  2518.                                                 lappend sent_for_sign_off_track $sent_for_sign_off_check
  2519.                                         } else {
  2520.                                                 set val 1
  2521.                                                 lappend subordinate_list_two $val
  2522.                                                 lappend sent_for_sign_off_track $sent_for_sign_off_check
  2523.                                         }  
  2524.                                     }
  2525.                                        
  2526.                                     if { [lsearch -exact $subordinate_list_two 1 ] >= 0 } {
  2527.                                     set no_flag 1
  2528.                                 } else {
  2529.                                    set no_flag 0
  2530.                                 }  
  2531.                                 # doc_return 200 "text/plain" $sent_for_sign_off_track
  2532.                                 if { [lsearch -exact $sent_for_sign_off_track 1 ] >= 0  } {
  2533.                                         set sign_off_val 1     
  2534.                                 } else {
  2535.                                         set sign_off_val 0
  2536.                                 }
  2537.  
  2538.                                 if { $no_flag == 1 } {
  2539.                                         # doc_return 200 "text/plain" $left_employees_two
  2540.                                          ad_returnredirect "/intranet/users/new_appraisal_form?show_year=$year&flag=4&remaining_employees=$left_employees_two"
  2541.                                 } else {
  2542.                                        
  2543.                                         if { $sign_off_val == 1 } {
  2544.                                                  ad_returnredirect "/intranet/users/new_appraisal_form?show_year=$year&flag=6&left_sign_off_employees=$left_employees_sign_off"
  2545.                                         } else  {
  2546.                                                 return ""
  2547.                                         }
  2548.                                     }
  2549.                             }
  2550.                         } else {
  2551.                                 return ""
  2552.                             }
  2553.                         }
  2554.                 } else {
  2555.                         return ""
  2556.                 }
  2557.     }
  2558. }  
  2559.  
  2560.  
  2561.  
  2562.  
  2563.  
  2564.  
  2565. ad_proc -public im_filing_employees_select {
  2566.         { -select_name "" }
  2567. } {
  2568.         set filing_member_list [db_list_of_lists members_filing "
  2569.         select A.user_id, A.employee_name from (select
  2570.                 u.user_id,
  2571.                 im_name_from_user_id(u.user_id) as employee_name
  2572.         from
  2573.                 registered_users u,
  2574.                 group_distinct_member_map gm
  2575.         where
  2576.                 u.user_id = gm.member_id
  2577.                 and gm.group_id = 155702) as A
  2578.         join
  2579.         (select u.user_id,
  2580.                 im_name_from_user_id(u.user_id) as employee_name
  2581.         from
  2582.                 registered_users u,
  2583.                 group_distinct_member_map gm
  2584.         where
  2585.                 u.user_id = gm.member_id
  2586.                 and gm.group_id = 463) as B
  2587.         on (A.user_id = B.user_id)
  2588.         "]  
  2589.        
  2590.         set select_list "<select name='$select_name'>
  2591.         <option value=''>Please Select</option>"
  2592.         foreach each_members $filing_member_list {
  2593.                 set user_id_val [lindex $each_members 0]
  2594.                 set user_name_val [lindex $each_members 1]
  2595.                 append select_list "<option value='$user_id_val'>$user_name_val</option>"
  2596.         }
  2597.         append select_list "</select>"
  2598.         return $select_list
  2599. }
  2600.  
  2601. #shivani sharma
  2602. ad_proc -public deactivate_employee_after_termination {
  2603.  
  2604. } {
  2605.         set output ""
  2606.         set member_state "banned"
  2607.         set c_date [db_string get_date "select to_char(now(),'YYYY-MM-DD')"]
  2608.         set joining_date_list [db_list get_start_date "select rep_cost_id from im_repeating_costs where end_date<=:c_date"]  
  2609.         foreach each_joining $joining_date_list {
  2610.                 set cost_id_val [db_string get_cost_id "select cause_object_id from im_costs where cost_id=:each_joining" -default ""]  
  2611.                 set employee_active [db_0or1row active_employee "select user_id from im_employees_active where user_id=:cost_id_val"]
  2612.                 if { $employee_active == 1 } {
  2613.                         if {$cost_id_val != 33957} {
  2614.                                 acs_user::change_state -user_id $cost_id_val -state $member_state      
  2615.                                 append output "[im_name_from_user_id $cost_id_val] $cost_id_val \n"
  2616.                         }
  2617.                 }      
  2618.         }
  2619.         return $output
  2620. }
  2621.  
  2622. ad_proc -public nine_monthly_approve_percent {
  2623.  
  2624. } {
  2625.         set c_date [db_string get_current_date "select to_char(now(),'YYYY-MM-DD')"]
  2626.         set c_year [lindex [split $c_date "-"] 0]
  2627.         set c_month [lindex [split $c_date "-"] 1]  
  2628.         scan $c_month %d c_month
  2629.         set one_month_ago [clock format [clock add [clock scan $c_date -format "%Y-%m-%d"] -1 months ] -format "%Y-%m-%d" ]
  2630.         set previous_month [lindex [split $one_month_ago "-"] 1]
  2631.         scan $previous_month %d previous_month  
  2632.         set previous_month_start_date "$c_year-$previous_month-01"
  2633.         set days_in_month [dt_num_days_in_month $c_year $previous_month]
  2634.         set previous_month_end_date "$c_year-$previous_month-$days_in_month"
  2635.  
  2636.         set blank_status_entries [db_string get_enteries "select count(view_for) from im_appraisal_task_complete_percent where (status is null or status='Hold') and (percent_save_date>='$previous_month_start_date' and percent_save_date<='$previous_month_end_date')" -default ""]
  2637.         set domain_url [parameter::get_from_package_key -parameter "SystemURL" -package_key "acs-kernel"]
  2638.         set mail_to "[email protected]"
  2639.         set from_mail "[email protected]"
  2640.         set subject "Pending Nine Monthly Approval Requests"
  2641.         set message "Hi All"
  2642.         append message ", <br><br>
  2643.                 Pending Requests for approval of Nine Monthly Bonuses: <b>$blank_status_entries</b>
  2644.                 <br>
  2645.                 For approving requests, Kindly click on the link:&nbsp;&nbsp;<a href='$domain_url/intranet/payroll/referral-bonus-claim?flag=1'>Nine Monthly Bonus Approval</a><br><br>
  2646.                 Regards,<br>
  2647.                 Team XLPLAT."
  2648.         set extraheaders [ns_set create]
  2649.         ns_set put $extraheaders "Content-type" "text/html"
  2650.         ns_sendmail $mail_to $from_mail $subject $message $extraheaders
  2651. }
  2652.  
  2653.  
  2654. ad_proc -public travel_desk_basic_details {
  2655. } {  
  2656.  
  2657.         set user_id_from_search ""
  2658.         set purpose_val ""
  2659.         set invitee_val ""
  2660.         set invitation_letter ""
  2661.         set travel_start_val ""
  2662.         set travel_end_val ""
  2663.         set travel_phase_one ""
  2664.         set current_user_id [ad_maybe_redirect_for_registration]
  2665.         set office_admin_p [im_profile::member_p -profile "Office Admin" -user_id $current_user_id]
  2666.         append travel_phase_one "<br><form name='travel_form' id='travel_form' method='post' enctype='multipart/form-data'><table style='border-collapse:collapse;width:100%' >
  2667.         <tr>
  2668.         <td class='bold_data'>Name of The Traveller :</td>"
  2669.         if { $office_admin_p == 1 || [im_user_is_admin_p $current_user_id] } {
  2670.                 append travel_phase_one "<td>[im_user_select -include_empty_p 1 -add_html "onchange fill_user_details(this.value) style width:relative%" -include_empty_name "" user_id_from_search $user_id_from_search]</td>"
  2671.         } else {
  2672.                 append travel_phase_one "<td><select name='user_id_from_search' style='width:relative' onchange='fill_user_details(this.value)' style='width:relative'>
  2673.                 <option value=''>Please Select</option>
  2674.                 <option value='$current_user_id'>[im_name_from_user_id $current_user_id]</option>
  2675.                 </select>
  2676.                 </td>"
  2677.         }
  2678.         append travel_phase_one "</tr>
  2679.         <tr>
  2680.         <td class='bold_data'>Purpose of Travel:</td>
  2681.         <td><input type='hidden' name='dummy_var' value='1'><input type='hidden' name='dummy_var_another' value='1'><input type='text' name='travel_purpose' value='' ></td>
  2682.         </tr>
  2683.         <tr>
  2684.         <td class='bold_data'>Proposer/Invitee details :</td>
  2685.         <td><input type='text' name='invitee_details' value='' id='invitee_details' ></td>
  2686.         </tr>
  2687.         "
  2688.         append travel_phase_one "<tr id='invite_letter'><td class='bold_data'>Invitation Letter</td>
  2689.         <td><input type='file' name='invitation_letter' id='invitation_letter' accept='.doc,.pdf,.docx'></td></tr>"
  2690.         append travel_phase_one "<tr>
  2691.         <td class='bold_data'>Travel Start Date (Boarding Time)</td>
  2692.         <td><input type='text' name='travel_start_date' id='travel_start_date' value=''></td>
  2693.         </tr>
  2694.         <tr>
  2695.         <td class='bold_data'>Travel End Date  (Boarding Time) :</td>
  2696.         <td><input type='text' name='travel_end_date' id='travel_end_date' value=''></td>
  2697.         </tr>
  2698.  
  2699.         <tr>
  2700.         <td class='bold_data'>Travel Forex Card Number:</td>
  2701.         <td><input type='text' name='forex_card_number' value='' id='forex_card_number' onblur='show_forex_dependent()'></td>
  2702.         </tr>  
  2703.         <tr class='forex_dependent' style='display:none'>
  2704.         <td class='bold_data'>Currency:</td>
  2705.         <td><input type='text' name='currency_card' value=''></td>
  2706.         </tr>
  2707.         <tr class='forex_dependent'>
  2708.         <td class='bold_data'>Topup Amount:</td>
  2709.         <td><input type='text' name='topup_amount' value=''></td>
  2710.         </tr>
  2711.         <tr>
  2712.         <td class='bold_data'>Currency(In Cash):</td>
  2713.         <td><input type='text' name='currency_cash' value=''></td>
  2714.         </tr>
  2715.         <tr>
  2716.         <td class='bold_data'>Travel Type:</td>
  2717.         <td>[im_category_select -include_empty_name "Please Select" -add_html "style=width:relative onchange='travel_type_val(this.value)'" -include_empty_p 1 "Intranet Travel Category" travel_type]</td>
  2718.         </tr>
  2719.         <tr>
  2720.         <td class='bold_data'>Aadhar Card:</td>
  2721.         <td><input type='text' name='aadhar_id' id='aadhar_card' value=''></td>
  2722.         </tr>
  2723.         <tr>
  2724.         <td class='bold_data'>PAN Card:</td>
  2725.         <td><input type='text' name='pan_number' id='pan_card' value=''></td>
  2726.         </tr>
  2727.         </table>
  2728.         </form>"
  2729. }
  2730.  
  2731. ad_proc -public im_ex_employees_list {
  2732.  
  2733. } {
  2734.         set c_date [db_string current_date "select to_char(now(),'YYYY-MM-DD')"]
  2735.         set employee_id_indirect [db_list employee_cost_id "select rep_cost_id from im_repeating_costs where end_date<:c_date"]  
  2736.         set employee_list [list]
  2737.         foreach each_employee_cost_id $employee_id_indirect {
  2738.                 set employee_id [db_string employee_id_val "select cause_object_id from im_costs where cost_id=:each_employee_cost_id" -default ""]
  2739.                 if { $employee_id != "" } {
  2740.                         set employee_name [im_name_from_user_id $employee_id]
  2741.                         lappend employee_list [list $employee_id $employee_name]
  2742.                 }
  2743.         }  
  2744.         return $employee_list
  2745. }
  2746.  
  2747. ad_proc -public send_mail_exit {
  2748.         { send_data ""}
  2749. } {
  2750.         set data_list [split $send_data "~"]
  2751.         set user_list_str [lindex $data_list 0]
  2752.         set user_id_value [lindex $data_list 1]
  2753.         set flag_val [lindex $data_list 2]
  2754.         db_0or1row get "select supervisor_id,immediate_supervisor_id,ttc_code,job_title from im_employees where employee_id=:user_id_value"
  2755.         db_0or1row get "select user_resign_date,relieve_date,reason_of_leaving from xlplat_ats_resignation_data where resignation_of=:user_id_value and deleted='false'"
  2756.         set job_title_name [im_category_from_id $job_title]
  2757.         set user_list [split $user_list_str "_"]
  2758.         if { $flag_val == "request_resignation" } {
  2759.                 set subject "Resignation of [im_name_from_user_id $user_id_value]"
  2760.                 set message "Hi [im_name_from_user_id $supervisor_id],<br><br>This is to inform that [im_name_from_user_id $user_id_value] ($ttc_code) has resigned from the post of $job_title_name on [clock format [clock scan $user_resign_date -format "%Y-%m-%d"] -format "%d %B, %Y"] and has requested to be relieved from the services by [clock format [clock scan $relieve_date -format "%Y-%m-%d"] -format "%d %B, %Y"].<br><br>The reason of resignation stated is as follows: <br>$reason_of_leaving <br><br>Kindly <a href='https://xlplat.ttconsultants.com/py/xlplat_ats/modify_user_application/$user_id_value' target='_blank'>Approve or Change</a> the relieving date. <br> <br>Thanks & Regards,<br>TTC HR"
  2761.         } elseif { $flag_val == "date_approved" } {
  2762.                 set subject "Approval of Relieving Date of [im_name_from_user_id $user_id_value]"
  2763.                 set message "Hi,<br><br>Relieving date of [im_name_from_user_id $user_id_value] has been approved as [clock format [clock scan $relieve_date -format "%Y-%m-%d"] -format "%d %B, %Y"].<br><br>Thanks & Regards,<br>TTC HR"
  2764.         } elseif { $flag_val == "exit_approval" } {
  2765.                 set subject "Exit Interview Form of [im_name_from_user_id $user_id_value]"
  2766.                 set message "Hi,<br><br>[im_name_from_user_id $user_id_value] has filled the <a href='https://xlplat.ttconsultants.com/py/xlplat_ats/exit_employee_form/$user_id_value' target='_blank'>Exit Interview Form</a>. Kindly approve the same.<br><br>Thanks & Regards,<br>TTC HR"
  2767.         } elseif { $flag_val == "manager_clearance_approve" } {
  2768.                 set subject "Clearance Form of [im_name_from_user_id $user_id_value]"
  2769.                 set message "Hi [im_name_from_user_id $immediate_supervisor_id] ,<br><br>[im_name_from_user_id $user_id_value] has filled the <a href='https://xlplat.ttconsultants.com/py/xlplat_ats/employee_clearance_form/$user_id_value/MANAGER' target='_blank'>Clearance Form</a> as his last date is [clock format [clock scan $relieve_date -format "%Y-%m-%d"] -format "%d %B, %Y"]. Kindly check the same and Sign off or Send back to [im_name_from_user_id $user_id_value] for review’.<br><br>Thanks & Regards,<br>TTC HR"
  2770.         } elseif { $flag_val == "manager_clearance_mail" } {
  2771.                 set subject " Employee Clearance Form of [im_name_from_user_id $user_id_value]"
  2772.                 set message "Hi,<br><br>Kindly approve the Employee Clearance Form of [im_name_from_user_id $user_id_value] ($ttc_code) by [clock format [clock scan $relieve_date -format "%Y-%m-%d"] -format "%d %B, %Y"].<br><br>
  2773.                 "
  2774.         }
  2775.         set message_1 $message
  2776.         set from "[email protected]"
  2777.         set to [list]
  2778.         foreach user_val $user_list {
  2779.                 set message $message_1
  2780.                 set to_special ""
  2781.                 if { $user_val == "EMPLOYEE"} {
  2782.                         set to [im_email_from_user_id $user_id_value]
  2783.                 } elseif { $user_val == "HR" } {
  2784.                         lappend to "[email protected]"
  2785.                         if { $flag_val == "manager_clearance_mail" } {
  2786.                                 set to_special "[email protected]"
  2787.                                 append message "<br><a href='https://xlplat.ttconsultants.com/py/xlplat_ats/employee_clearance_form/$user_id_value/HR' target='_blank'>Click here to fill Clearance Form</a><br><br>Thanks & Regards,<br>TTC HR"
  2788.                         }
  2789.                 } elseif { $user_val == "MANAGER" } {
  2790.                         lappend to [im_email_from_user_id $supervisor_id]
  2791.                 } elseif { $user_val == "MANAGER1" } {
  2792.                         lappend to [im_email_from_user_id $immediate_supervisor_id]
  2793.                         if { $flag_val == "manager_clearance_mail" } {
  2794.                                 set to_special [im_email_from_user_id $immediate_supervisor_id]
  2795.                                 append message "<br><a href='https://xlplat.ttconsultants.com/py/xlplat_ats/employee_clearance_form/$user_id_value/MANAGER' target='_blank'>Click here to fill Clearance Form</a><br><br>Thanks & Regards,<br>TTC HR"
  2796.                         }
  2797.                 } elseif { $user_val == "ACCOUNTS" } {
  2798.                         lappend to "[email protected]"
  2799.                         if { $flag_val == "manager_clearance_mail" } {
  2800.                                 set to_special "[email protected]"
  2801.                                 append message "<br><a href='https://xlplat.ttconsultants.com/py/xlplat_ats/employee_clearance_form/$user_id_value/ACCOUNTS' target='_blank'>Click here to fill Clearance Form</a><br><br>Thanks & Regards,<br>TTC HR"
  2802.                         }
  2803.                 } elseif { $user_val == "IT" } {
  2804.                         lappend to "[email protected]"
  2805.                         if { $flag_val == "manager_clearance_mail" } {
  2806.                                 set to_special "[email protected]"
  2807.                                 append message "<br><a href='https://xlplat.ttconsultants.com/py/xlplat_ats/employee_clearance_form/$user_id_value/IT' target='_blank'>Click here to fill Clearance Form</a><br><br>Thanks & Regards,<br>TTC HR"
  2808.                         }
  2809.                 } elseif { $user_val == "ADMIN" } {
  2810.                         lappend to "[email protected]"
  2811.                         if { $flag_val == "manager_clearance_mail" } {
  2812.                                 set to_special "[email protected]"
  2813.                                 append message "<br><a href='https://xlplat.ttconsultants.com/py/xlplat_ats/employee_clearance_form/$user_id_value/ADMIN' target='_blank'>Click here to fill Clearance Form</a><br><br>Thanks & Regards,<br>TTC HR"
  2814.                         }
  2815.                 } elseif { $user_val == "VP" } {
  2816.                         set vp_id [db_string get "select get_hod_from_user_id($user_id_value)" -default ""]
  2817.                         if { $vp_id != "" } {
  2818.                                 lappend to [im_email_from_user_id $vp_id]      
  2819.                         }
  2820.                 }
  2821.                 if { $flag_val == "manager_clearance_mail" } {
  2822.                         set extraheaders [ns_set create]
  2823.                         ns_set put $extraheaders "Content-type" "text/html"
  2824.                         ns_sendmail $to_special $from $subject $message $extraheaders
  2825.                 }
  2826.                
  2827.                
  2828.         }
  2829.         if { $flag_val != "manager_clearance_mail" && $to != "" } {
  2830.                 set extraheaders [ns_set create]
  2831.                 ns_set put $extraheaders "Content-type" "text/html"
  2832.                 ns_sendmail [join $to ","] $from $subject $message $extraheaders
  2833.         }
  2834.         return $message
  2835. }
  2836. ad_proc -public specific_user_access {} {
  2837.         set u_id [ad_maybe_redirect_for_registration]
  2838.         set url_main [string trim [ns_conn url]]
  2839.         set check_permission [db_string get "select url_name from im_specific_user_permissions where user_id=:u_id limit 1" -default "not_exist"]
  2840.         if { $check_permission == "not_exist" || $check_permission == ""} {
  2841.                 return ""
  2842.         } else {
  2843.                 set url_name_list [list]
  2844.                 set url_name_list [split $check_permission ","]
  2845.                 if {$url_main in $url_name_list} {
  2846.                         ad_returnredirect "/intranet/permission_denied"
  2847.                 }
  2848.         }
  2849.  
  2850.         return ""
  2851.  
  2852. }
  2853. ad_proc -public sub_power_user_access {} {
  2854.         set check_sub_power [check_sub_power_user]
  2855.         if { !$check_sub_power } {
  2856.                 set url_main [string trim [ns_conn url]]
  2857.                 set check_url_perm [db_0or1row get "select url_name from im_work_from_home_permissions where trim(url_name)=:url_main or trim(url_name) || '.tcl'=:url_main "]
  2858.                 if { $check_url_perm } {
  2859.                         ad_returnredirect "/intranet/permission_denied"
  2860.                 }
  2861.         }
  2862.         return ""
  2863.  
  2864. }
  2865. ad_proc -public check_sub_power_user {} {
  2866.         set user_id [ad_maybe_redirect_for_registration]
  2867.         set sub_power [im_profile::member_p -profile "Sub Power User" -user_id $user_id]
  2868.         set ipaddress [im_otp_peer_ip]
  2869.         set nettype [im_otp_ip_network_type $ipaddress]
  2870.         set prev_ip_type [ad_get_cookie "configToken"]
  2871.         set cookie_value [db_string get_date "select to_char(now(),'YYYY-MM-DD')"]
  2872.         append cookie_value $nettype
  2873.         #for storing ip type value for logging out when ip changes
  2874.         if { $prev_ip_type != [ns_sha1 $cookie_value] } {
  2875.                 ad_user_logout
  2876.                 db_release_unused_handles
  2877.                 ad_returnredirect [ns_conn url]
  2878.         }
  2879.         if { $sub_power } {
  2880.                 if {$nettype == "public"} {
  2881.                         return 0
  2882.                 }
  2883.         }
  2884.         return 1
  2885.  
  2886. }
  2887. ad_proc access_denied_sub_power {
  2888. } {
  2889.     return "Access Denied!! Please contact HR"
  2890. }
  2891. ad_proc -public delete_backup_files {
  2892. } {
  2893.     set c_date [db_string get_date "select to_char(now() - INTERVAL '15 days' , 'DD-MM-YYYY')"]
  2894.     set dir "/web/projop/filestorage/backup"
  2895.         set all_files_delete [glob -dir $dir -nocomplain "backup-$c_date*"]
  2896.         foreach file_delete $all_files_delete {
  2897.                 exec rm $file_delete
  2898.         }
  2899.         return ""
  2900. }