package SubListe; # # SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) Rainer Gümpelein, TeilRad GmbH # # #uncomment for perl -cw src/Tpl/Liste3.pm #use lib qw(/var/www/copri4/shareedms-primary/src); # use strict; use warnings; use POSIX; use CGI; use URI::Escape; use Encode; use Lib::Config; use Mod::Buttons; use Mod::Libenz; use Mod::Libenzdb; use Mod::DBtank; use Mod::APIfunc; use Date::Calc qw(:all); use Storable; use Data::Dumper; sub new { my $class = shift; my $self = {}; bless($self,$class); return $self; } #Template sub tpl(){ my $node_meta = shift; my $users_dms = shift; my $u_group = shift; my $return = shift; my $q = new CGI; my @keywords = $q->param; my $keycount = scalar(@keywords); my $time = time; my $now_db = strftime("%d.%m.%Y %H:%M:%S",localtime(time)); my $cf = new Config; my $lb = new Libenz; my $db = new Libenzdb; my $dbt = new DBtank; my $apif = new APIfunc; my $but = new Buttons; my %varenv = $cf->envonline(); my $script = $q->script_name(); my $path_info = $q->path_info(); my $path = $path_info; #with meta_host, if("$varenv{metahost}"){ $path = "$script" . "$path_info"; $script=""; } my $lang = "de"; my $dbh = ""; my $parent_node4rel = $db->get_node4rel($node_meta->{parent_id},"","","null"); my %ib = $but->ibuttons(); my $tpl_order = $node_meta->{tpl_order}; if(1==2 && $node_meta->{tpl_id} >= 400 && $node_meta->{tpl_id} < 500){ $tpl_order =~ s/barcode=Rad/barcode=Rad,txt10=Station-log,txt09=Wartungsprotokoll=area/; $tpl_order =~ s/int04=Station/int04=Station,txt09=Wartungsprotokoll=area/ if($node_meta->{tpl_id} == 403); } my @tpl_order = split /,/,$tpl_order; my $message = ""; #$message = "Fehler: bitte Unter \"Servicetechnik\" die Datenklasse konfigurieren!" if(scalar(@tpl_order) < 1); my $s_owner_id = ""; #my $s_u_name = ""; my @viewsel = split /\//,$1 if($path =~ /^\/(.*)/); my $depth = scalar(@viewsel); my $view_base = $viewsel[1] || "nothing";#like Waren my $node_mandant = $db->get_node("$view_base","$lang"); #TODO, build service path by pos.template_id or pos.barcode alis bike_id #my $pref = { table => "content", # table_pos => "contentpos", #}; #my $template_group = $dbt->pos_template_group($dbh,$pref); #my $subrelnode = $dbt->get_subrelnode($dbh,$crecord->{main_id},$template_id_pos); my $searchref = {}; my $channel_map = $dbt->channel_map(); my $mapref = {}; my $ct_users = $dbt->users_map($dbh,$mapref);#get serviceAPP and DMS users from contentadr my @_users = (""); foreach my $id (sort { $channel_map->{$a} cmp $channel_map->{$b} } keys (%$channel_map)){ push (@_users, "$id:$channel_map->{$id}"); if($R::s_owner && $channel_map->{$id} eq $R::s_owner){ $searchref->{owner} = $id; #$s_u_name = $channel_map->{$id}; } } foreach my $ctu_id (sort { $ct_users->{$a}->{txt01} cmp $ct_users->{$b}->{txt01} } keys (%$ct_users)){ push (@_users, "$ct_users->{$ctu_id}->{c_id}:$ct_users->{$ctu_id}->{txt01}"); if($ct_users->{$ctu_id}->{ct_name} && ($ct_users->{$ctu_id}->{txt01} =~ /$R::s_owner/i) || ($ct_users->{$ctu_id}->{c_id} eq $searchref->{owner})){ $searchref->{owner} = $ct_users->{$ctu_id}->{c_id}; #$s_u_name = $ct_users->{$ctu_id}->{txt01}; } } my $limit = $R::limit || $varenv{limit}; my $offset = $R::offset || "0"; if($node_meta->{int10} && $node_meta->{int10} < $varenv{limit}){ $offset = 0; } #backward | forward if($R::go eq "backward_list"){ $offset -= $limit if($offset >= $limit); }elsif($R::go eq "forward_list"){ $offset += $limit; } my $date; my $start_chck=0;my $end_chck=0; my $last_year; if($R::s_start_mtime){ ($date,$start_chck) = $lb->checkdate($R::s_start_mtime) if($R::s_start_mtime !~ "%"); $message .= ">>> Datum Eingabefehler: $date <<<" if($start_chck); my ($c_dd,$c_mm,$c_yy) = split(/\./,$date); $last_year = $c_yy if("$c_yy" eq "2011"); } if($R::s_end_mtime){ ($date,$end_chck) = $lb->checkdate($R::s_end_mtime) if($R::s_end_mtime !~ "%"); $message .= ">>> Datum Eingabefehler: $date <<<" if($end_chck); my ($c_dd,$c_mm,$c_yy) = split(/\./,$date); } #because of search we need parents my $main_ids = $parent_node4rel->{main_id}; my $tpl_ids = $parent_node4rel->{template_id}; my $rows = 0; my $scol = "mtime"; my $table = "content"; $searchref->{table_pos} = "contentpos"; if($node_meta->{tpl_id} > 600 && $node_meta->{tpl_id} < 700){ $table = "contentadr"; $searchref->{table_pos} = "contentadrpos"; $searchref->{template_id_pos} = "$node_meta->{tpl_id}"; } if($node_meta->{tpl_id} == 198){ my $mandant_id = 100002; $table = "contentadr"; $searchref->{table_pos} = "users"; #$searchref->{template_id_pos} = "$node_meta->{tpl_id}"; $main_ids = 200011; $tpl_ids = 202; print< .ui-autocomplete { text-align:left; background:#eeeeee; border:1px solid silver; } EOF ; } #print Dumper($node_meta); my $hashfile = "$varenv{logdir}/$users_dms->{u_id}-$searchref->{table_pos}-searchhash"; my $ct4rel = {}; if(!$start_chck && !$end_chck && $parent_node4rel ne "Servicetechnik" && $main_ids && $tpl_ids){ #$rows = $db->count_content($searchref->{table_pos},"$main_ids","$tpl_ids"); #collect search keys foreach my $postkey (@keywords){ foreach(@tpl_order){ my ($key,$val,$size) = split /=/,$_; if($postkey =~ /s_$key|s_start_$key|s_end_$key/){ my $val = $q->param($postkey); $postkey =~ s/^s_//; $searchref->{$postkey} = $val; } } } #trying to save hashref if($R::detail_search && ref($searchref) eq "HASH"){ store $searchref, $hashfile; }elsif($keycount > 0 && !$R::detail_search && -f $hashfile){ $searchref = {}; $searchref = retrieve($hashfile); } #print Dumper($searchref); my $export = ""; my $todo = ""; my $ck4ex = ""; #only if permission read if(($node_meta->{ct_table} eq "users" && $users_dms->{int07} >= 1) || ($node_meta->{ct_table} eq "contentadrpos" && $users_dms->{int02} >= 1) || ($node_meta->{ct_table} eq "contentpos" && $users_dms->{int01} >= 1)){ $ct4rel = $db->search_content3($searchref,$table,$node_mandant->{parent_id},$node_meta,$users_dms->{u_id},$lang,"$main_ids","$tpl_ids","","",$time,"",$scol,$users_dms->{sort_updown},$offset,$limit,$export,$todo,$ck4ex,""); }else{ $return = "failure::Abbruch. Keine Zugriffsberechtigung"; } } print "
\n"; if($varenv{syshost} ne "azn"){ my $header_style = ""; $header_style = "border:2px solid #9f1f0e;" if($message); print $q->div({-class=>"copri_header",-style=>"background-color:$node_meta->{bg_color};"},"$path",$q->span({-style=>"$header_style"},"$message")); } print $q->div({-style=>'background-color:silver;height:10px;'},""),"\n"; print $q->start_form(-name=>'searchform'),"\n"; print $q->hidden(-name=>'offset', -value=>"$offset"),"\n"; print $q->hidden(-name=>'main_id', -value=>"$node_meta->{main_id}"),"\n"; print $q->hidden(-name=>'mode', -value=>"manager"),"\n"; print $q->hidden(-name=>'owner', -value=>"$users_dms->{u_id}"),"\n"; print $q->hidden(-name=>'template_id', -value=>"$node_meta->{template_id}"),"\n"; my $hstyle = "width:20px;background-color:$node_meta->{bg_color};border-right: solid thin gray;border-bottom: solid thin gray;"; print $q->start_table({ -style=>'clear:both;', -border=>'0', -width=>'100%',-align=>'center', -cellpadding=>'0', -cellspacing=>'0'}),"\n"; #new_edit and search (disabled for DMS-Account) if($node_meta->{tpl_id} != 198){ my $edit="rel_edit"; my $new_key="service_done"; my $search = "search"; print $q->Tr(),"\n"; print $q->td({-style=>"background-color:silver;$hstyle"},$but->singlesubmit1("detail_search","$search","","")),"\n"; #https://tinkwwp.copri4.de/APIjsonserver?request=service_done&bike=202&work_id=txt11&work_val=aaa&authcookie=1842_ad720ed63bd40039e4abe8a9ad7315e1_34567890 #disabled if(1==2 && $node_meta->{tpl_id} >= 400 && $node_meta->{tpl_id} < 500){ print $q->td({-style=>"$hstyle"}, $but->singlesubmit2glyph("$edit","$new_key","$ib{$new_key}","background-color:$node_meta->{bg_color};")),"\n"; }else{ print $q->td({-style=>"$hstyle"}," "),"\n"; } #1. Search-fields my $s_val = ""; foreach(@tpl_order){ my ($key,$val,$size) = split /=/,$_; $size = 15 if($size =~ /area/); $size = 10 if($size =~ /time/); $size = 2 if($size =~ /checkbox/); $s_val = $searchref->{$key} if($searchref->{$key}); #print "$key=$searchref->{$key}|"; if($key =~ /node|txt|int|uri|ct_name|_id|barcode|sort|public/){ if($key =~ /barcode|int04/){ print $q->td({-class=>"search_line"},$q->textfield(-class=>'stxt',-name=>"s_$key",-size=>"4",-default=>"$s_val",-maxlength=>40, -autofocus=>1)),"\n"; }else{ print $q->td({-class=>"search_line"},$q->textfield(-class=>'stxt',-name=>"s_$key",-size=>"$size",-default=>"$s_val",-maxlength=>40)),"\n"; } }elsif($key =~ /owner/){ print $q->td({-class=>'search_line'},$but->selector("s_$key","","$s_val",@_users)),"\n"; } my $s_mtime; my $e_mtime; if($key eq "mtime"){ $s_mtime = $searchref->{start_mtime}; $e_mtime = $searchref->{end_mtime}; } if($key eq "date_time"){ $s_mtime = $searchref->{start_date_time}; $e_mtime = $searchref->{end_date_time}; } print $q->td({-nowrap=>1,-class=>"search_line"},$q->textfield(-id=>'datepicker1',-class=>'etxt',-name=>"s_start_$key",-default=>"$s_mtime",-size=>"$size",-maxlength=>20),"-",$q->textfield(-id=>'datepicker2',-class=>'etxt',-name=>"s_end_$key",-default=>"$e_mtime",-size=>"$size", -maxlength=>20)),"\n" if($key =~ /time/); }#end Search-fields } #2. Tableheader print $q->Tr(); my $i=0; if($node_meta->{tpl_id} == 198){ my $edit="base_edit"; my $new_key="new_dmsusers"; print "\n"; print $but->singlesubmit2glyph("$edit","$new_key","$ib{$new_key}","background-color:$node_meta->{bg_color};"),"\n"; #print $q->hidden(-name=>'c_id4trans', -override=>'1', -value=>"$ctx->{c_id}"),"\n"; #from json_selectadr print $q->hidden(-id=>'c_idadr', -name=>"c_idadr", -override=>'1'),"\n"; print $q->hidden(-id=>'vorname_name', -name=>"vorname_name", -override=>'1'),"\n"; print $q->textfield(-style=>'border:1px solid grey;height:25px;width:80%;',-id=>"json_selectadr",-name=>"json_selectadr", -placeholder=>'Neuer DMS-Account', -value=>""),"\n"; print "\n"; }else{ print $q->th({-style=>""}," "),"\n"; print $q->th({-style=>""}," "),"\n"; } #my $sort_up = "up"; #my $sort_down = "down"; #$sort_up = "$sort_up" if($users_dms->{sort_updown} eq "up"); #$sort_down = "$sort_down" if($users_dms->{sort_updown} eq "down"); #print $q->th($q->a({-class=>"sortnav",-href=>"?sort_updown=up\&offset=$offset\&limit=$limit",-title=>'Aufsteigend sortieren'},"$sort_up"),"|",$q->a({-class=>"sortnav",-href=>"?sort_updown=down\&offset=$offset\&limit=$limit",-title=>'Absteigend sortieren'},"$sort_down")),"\n"; foreach (@tpl_order){ my ($key,$val,$size,$interval) = split /=/,$_; my $divstyle = ""; if($size =~ /checkbox/){ $size = 2; $divstyle = "width:20px;white-space:nowrap;overflow:hidden;"; } my $sort_title="| $val"; $val = "$val" if($key eq $users_dms->{col_sort}); $i++; print $q->th({-style=>'padding:5px 0'},$q->div({-style=>"$divstyle"},$q->a({-class=>"sortnav",-href=>"?col_sort=$key\&offset=$offset\&limit=$limit",-title=>"$val"},"$val"))),"\n" if($key ne "u_id"); }#end Tableheader #BIG LOOP loop content table #if($users_dms->{sort_updown} eq "up"){ my $nr=0; foreach my $id (sort { if($users_dms->{sort_updown} eq "down"){ if ($scol =~ /barcode|int/) { $ct4rel->{$b}->{$scol} <=> $ct4rel->{$a}->{$scol} }else{ $ct4rel->{$b}->{$scol} cmp $ct4rel->{$a}->{$scol} } }else{ if ($scol =~ /barcode|int/) { $ct4rel->{$a}->{$scol} <=> $ct4rel->{$b}->{$scol} }else{ $ct4rel->{$a}->{$scol} cmp $ct4rel->{$b}->{$scol} } } } keys(%$ct4rel)){ my $set_style = ""; $nr++; #Tablecontent (parameter) print $q->Tr(),"\n"; if($node_meta->{tpl_id} != 198){ print $q->td({-class=>'tdtxt',-style=>"$set_style"},""),"\n"; print $q->td({-class=>'tdint',-style=>"$set_style"},""),"\n"; } my $k=0; foreach (@tpl_order){ $k++; my ($key,$val,$size) = split /=/,$_; $size = 15 if($size =~ /area/); $size = 2 if($size =~ /checkbox/); my $tdclass = "tdtxt"; my $tdstyle = "text-align:left;"; if($size =~ /\w\+\w/){ $size = 5; }elsif($key =~ /barcode|c_id|ct_name|int|state|sort|public/){ $tdclass = "tdint"; $tdstyle = "text-align:right;max-width:8em;$size px;"; } $ct4rel->{$id}->{$key} = $lb->time4de($ct4rel->{$id}->{$key},"1") if($key =~ /time/); $ct4rel->{$id}->{$key} = $q->unescapeHTML($ct4rel->{$id}->{$key}) if($ct4rel->{$id}->{$key}); $ct4rel->{$id}->{$key} = $lb->newline($ct4rel->{$id}->{$key},"","") if($ct4rel->{$id}->{$key}); if($key eq "owner"){ my $u_name = $ct4rel->{$id}->{owner}; foreach my $ctu_id (keys (%$ct_users)){ if($channel_map->{$u_name}){ $u_name = $channel_map->{$u_name}; }elsif($ct4rel->{$id}->{owner} eq $ct_users->{$ctu_id}->{c_id}){ $u_name = $ct_users->{$ctu_id}->{txt01}; } } #$u_name = $ct_users->{$ct4rel->{$id}->{$key}}->{txt01} || $ct4rel->{$id}->{$key}; print $q->td({-class=>"$tdclass",-style=>"$tdstyle $set_style"},"$u_name"),"\n"; }elsif($key eq "barcode" && $node_meta->{ct_table} eq "contentadrpos"){ print $q->td({-class=>"$tdclass",-style=>"$tdstyle $set_style"},$q->a({-class=>"linknav3",-href=>"/$users_dms->{fullurl}/Waren/?detail_search=1\&s_barcode=$ct4rel->{$id}->{barcode}",-title=>"zum Rad "},"$ct4rel->{$id}->{barcode}")),"\n"; #print $q->td({-class=>"$tdclass",-style=>"$tdstyle $set_style"},$q->a({-class=>"editnav",-href=>"/$users_dms->{fullurl}/Waren/?detail_search=1\&s_barcode=$ct4rel->{$id}->{barcode}",-title=>"zur Liste der Rad $ct4rel->{$id}->{barcode} Servicearbeiten"}, $q->img({-src=>"$varenv{metahost}/glyphicons/glyphicons-440-wrench.png", -style=>'height:1.3em;'}),"$ct4rel->{$id}->{barcode}")),"\n"; }elsif($key eq "u_id" && $node_meta->{ct_table} eq "users"){ my $adref = { table => "contentadr", fetch => "one", template_id => "202", c_id => "$ct4rel->{$id}->{$key}", }; my $ctadr = $dbt->fetch_record($dbh,$adref); print $q->td({-class=>"$tdclass",-style=>"$tdstyle $set_style width:300px;"},$q->a({-class=>"linknav3",-href=>"?node2edit=editpart\&u_id=$ct4rel->{$id}->{u_id}",-title=>"edit"},"$ctadr->{txt01} - $ctadr->{txt08} ($ct4rel->{$id}->{$key})")),"\n"; }elsif($key eq "txt08" && $node_meta->{ct_table} eq "contentadrpos"){ my $subject = "sharee.bike feedback"; my $body = "Hallo $ct4rel->{$id}->{txt01},\%0A\%0Avielen Dank für Ihre Nachricht \"$ct4rel->{$id}->{txt02}\""; print $q->td({-class=>"$tdclass",-style=>"$tdstyle $set_style"},$q->a({-class=>"editnav",-href=>"mailto:$ct4rel->{$id}->{$key}?subject=$subject&body=$body"},$q->span({-class=>"bi bi-envelope"}," $ct4rel->{$id}->{$key}"))),"\n"; }elsif($key =~ /int0[1-8]/ && $node_meta->{ct_table} eq "users"){ print $q->td({-class=>"$tdclass",-style=>"$tdstyle $set_style",-nowrap=>1},"$dbt->{copri_conf}->{permission}->{$ct4rel->{$id}->{$key}}"),"\n"; }elsif($key =~ /int09/ && $node_meta->{ct_table} eq "users"){ print $q->td({-class=>"$tdclass",-style=>"$tdstyle $set_style",-nowrap=>1},"$dbt->{copri_conf}->{access}->{$ct4rel->{$id}->{$key}}"),"\n"; }else{ print $q->td({-class=>"$tdclass",-style=>"$tdstyle $set_style"},"$ct4rel->{$id}->{$key}"),"\n"; } } } print $q->end_table; my $offset_nr = $offset + $nr; print $q->div({-style=>'float:left;padding:0.5em;'},"Zeile: $offset - $offset_nr"); #backward | forward print "
\n"; print $q->a({-class=>"linknav",-href=>"?go=backward_list;offset=$offset;limit=$limit",-title=>''},"< zurück ... ") if($offset >= $limit); print $q->a({-class=>"linknav",-href=>"?go=forward_list;offset=$offset;limit=$limit",-title=>''}," ... vorwärts >") if($nr >= $limit-10); #if($rows > $limit && $nr > 0); print "
\n"; print $q->end_form,"\n"; print "
\n"; my $debug = "(ct_table: $node_meta->{ct_table} | main_id: $node_meta->{main_id} | template_id: $node_meta->{template_id})"; print $q->div({-style=>'position:fixed;bottom:1%;font-size:13px;'},"$debug"),"\n" if($users_dms->{u_id} eq $varenv{superu_id}); return $return; } 1;