diff --git a/copri4/main/src/Mod/APIfunc.pm b/copri4/main/src/Mod/APIfunc.pm index c66741a..469be83 100755 --- a/copri4/main/src/Mod/APIfunc.pm +++ b/copri4/main/src/Mod/APIfunc.pm @@ -884,92 +884,6 @@ sub service_work { }#end service_work -#check and set user-bike rental tarif -sub fetch_bike_tariff { - my $self = shift; - my $varenv = shift; - my $auth = shift; - my $bike = shift; - my $owner = shift; - - my $bike_id = $bike || ""; - $bike_id =~ s/S[1-9]X/SX/; - $bike_id = $1 if($bike_id =~ /(\d+)/); - - my $main_ids = ""; - my ($bike_group,$bike_node,$user_tour,$tariff_content,$adrtarif_hash) = $self->fetch_tariff($varenv->{dbname},$auth,""); - $main_ids = join(",",@{$bike_node}); - $main_ids =~ s/[a-z_]+//ig; - my $ct_bike = {}; - my $pref_cc = { - table => "content", - fetch => "one", - main_id => "IN::($main_ids)", - barcode => $bike_id, - template_id => 205, - #int10 => 1, - }; - - $ct_bike = $dbt->fetch_record($dbh,$pref_cc) if($main_ids); - - #$tariff_nr in contentadr are saved by copri or user tarif-select!!! - my $tariff_nr = ""; - my @adr_tariff = (); - if($auth->{txt30}){ - @adr_tariff = ("$auth->{txt30}"); - @adr_tariff = split(/\s+/,$auth->{txt30}) if($auth->{txt30} =~ /\w\s+\w/); - } - - #This is the automatic user tariff setter - if(ref($ct_bike) eq "HASH" && $ct_bike->{main_id}){ - foreach my $id (keys (%$tariff_content)){ - foreach(@adr_tariff){ - $bw->log("booking_request adr_tariff array form $auth->{txt30}",$_,""); - if($tariff_content->{$id}->{int12} && $tariff_content->{$id}->{int12} == $ct_bike->{main_id} && $tariff_content->{$id}->{barcode} && $_ == $tariff_content->{$id}->{barcode}){ - $bw->log("booking_request tariff loop matches:",$tariff_content->{$id}->{barcode},""); - $tariff_nr = $tariff_content->{$id}->{barcode}; - } - } - } - #if no tarif then update user account to fallback default public or private or hidden tarif - if(!$tariff_nr){ - - my $update_adr = { - table => "contentadr", - mtime => "now()", - owner => "$owner", - c_id => "$auth->{c_id}", - }; - - my @txt30 = (); - foreach my $id (keys (%$tariff_content)){ - # - if($tariff_content->{$id}->{int18} && ($tariff_content->{$id}->{int18} == 2 || $tariff_content->{$id}->{int18} == 3 || $tariff_content->{$id}->{int18} == 4)){ - - #auto set tarif if requested bike matches flot - if($tariff_content->{$id}->{int12} && $tariff_content->{$id}->{int12} == $ct_bike->{main_id} && $tariff_content->{$id}->{barcode}){ - $bw->log("booking_request tariff loop matches:",$tariff_content->{$id}->{barcode},""); - $tariff_nr = $tariff_content->{$id}->{barcode}; - push(@txt30, "$tariff_content->{$id}->{barcode}"); - } - #add also other public tarif - elsif($tariff_content->{$id}->{int18} && $tariff_content->{$id}->{int18} == 2 && $tariff_content->{$id}->{int12} && $tariff_content->{$id}->{barcode}){ - push(@txt30, "$tariff_content->{$id}->{barcode}"); - } - } - } - $bw->log("booking_request NO user tariff defined, update user account to fallback default public or private or hidden",\@txt30,""); - $dbt->update_one($dbh,$update_adr,"txt30='@txt30'"); - }else{ - $bw->log("booking_request user tariff selected",$tariff_nr,""); - } - } - - $bw->log("booking_request fetch_bike_tariff result ---> bike $ct_bike->{barcode} matching by bike_node: @{$bike_node} main_ids:$main_ids | bike_group by type_id:@{$bike_group} | Tarif selected: $tariff_nr",$tariff_content->{$tariff_nr}->{ct_name},""); - - return ($ct_bike,$tariff_content->{$tariff_nr}); -} - #2022-04-05 refactored bike reservation sub booking_request(){ my $self = shift; @@ -1308,7 +1222,7 @@ sub booking_update(){ my $geo_distance_next = 100000; my $station_next = 0; my $geo_debug=""; - my ($stations,$stations_raw) = $self->stations_available($q,$varenv,$auth,$record_pos); + my ($stations,$stations_raw) = $self->stations_available($q,$varenv,$auth,$record_pos,""); foreach my $id (sort { $stations_raw->{$a}->{barcode} <=> $stations_raw->{$b}->{barcode} } keys (%$stations_raw)){ my $latitude_station = $1 if($stations_raw->{$id}->{txt06} =~ /^(\d+\.\d+)/); @@ -1996,6 +1910,7 @@ sub bikes_available(){ #new rental_description $return->{$id}->{rental_description}->{name} = "$tariff_content->{$tid}->{ct_name}"; $return->{$id}->{rental_description}->{id} = "$tariff_content->{$tid}->{barcode}"; + $return->{$id}->{rental_description}->{tarif_type} = "$adrtarif_hash->{$tariff_content->{$tid}->{barcode}}"; $return->{$id}->{rental_description}->{reserve_timerange} = "15"; $return->{$id}->{rental_description}->{reserve_timerange} = "30" if($record->{$id}->{int11} == 3);#sig timeout time $return->{$id}->{rental_description}->{rental_info}->{1} = ["Tracking","Ich stimme der Speicherung (Tracking) meiner Fahrstrecke zwecks wissenschaftlicher Auswertung und Berechnung der CO2-Einsparung zu!"] if($record->{$id}->{int25}); @@ -2168,6 +2083,29 @@ sub bikes_all(){ return ($op_return,$record,$bikes_on_station); }#end bikes_all +#station caching for each tarif +sub stations_caching { + my $self = shift; + my $q = shift || ""; + my $varenv = shift; + my $auth = shift || ""; + + my $tariff = { + table => "content", + fetch => "all", + keyfield => "barcode", + template_id => "210",#Tariff tpl_id + }; + + my $tariff_all = $dbt->fetch_record($dbh,$tariff); + if(ref($tariff_all) eq "HASH"){ + foreach my $cachme (keys (%$tariff_all)){ + $self->stations_available($q,$varenv,$auth,"",$cachme); + } + } + return; +} + #stations_available sub stations_available(){ my $self = shift; @@ -2175,11 +2113,12 @@ sub stations_available(){ my $varenv = shift; my $auth = shift || ""; my $record_pos = shift || {}; - + my $cachme = shift || 0; my $authed = 0; $authed = 1 if(ref($auth) eq "HASH" && $auth->{c_id}); - my ($bike_group,$bike_node,$user_tour,$tariff_content,$adrtarif_hash) = $self->fetch_tariff($varenv->{dbname},$auth,$q->param('authcookie')); + my $authcookie = $q->param('authcookie') || $q->cookie('domcookie'); + my ($bike_group,$bike_node,$user_tour,$tariff_content,$adrtarif_hash) = $self->fetch_tariff($varenv->{dbname},$auth,$authcookie,$cachme); $bw->log("fetch_tariff adrtarif_hash from $varenv->{dbname}\n",$adrtarif_hash,""); @@ -2278,10 +2217,6 @@ sub stations_available(){ my $record_bikes = {}; $record_bikes = $dbt->fetch_record($dbh,$bpref,""); - #user_rental_count - my $record_rentals = {}; - $record_rentals = $self->user_bikes_occupied($dbh,$auth,"") if($auth->{c_id}); - my $hotline_hash = { table => "contentuser", fetch => "one", @@ -2303,14 +2238,6 @@ sub stations_available(){ } $return->{$id}->{bike_count} = "$bike_count"; - my $user_rental_count = 0; - foreach my $r_id (keys (%$record_rentals)){ - if($record->{$id}->{int04} == $record_rentals->{$r_id}->{int06}){ - $user_rental_count++; - } - } - $return->{$id}->{user_rental_count} = "$user_rental_count"; - $return->{$id}->{uri_operator} = "$varenv->{wwwhost}"; $return->{$id}->{authed} = "$authed"; @@ -2341,22 +2268,41 @@ sub stations_available(){ $return->{$id}->{operator_data}->{operator_phone} = $hotline_data->{txt07} if($hotline_data->{txt07}); $return->{$id}->{operator_data}->{operator_email} = $hotline_data->{txt08} if($hotline_data->{txt08}); + $return->{$id}->{cached} = "0"; $op_return->{$dbt->{operator}->{$varenv->{dbname}}->{oprefix} . $id} = $return->{$id}; - } - } - #json caching - #call "stations_available" after each station state change - my $public_user = 1; - foreach my $atid (keys (%$adrtarif_hash)){ - $public_user = 0 if($adrtarif_hash->{$atid} == 1); - } - - if($dbt->{operator}->{$varenv->{dbname}}->{cache_station} == 1 && $public_user == 1){ - my $stationsout = $json->pretty->encode({ shareejson => { stations => $op_return } }); - open(CACHE,">$dbt->{copri_conf}->{basedir}/$dbt->{primary}->{sharee_primary}->{dir_app}/json/stations-$dbt->{operator}->{$varenv->{dbname}}->{oprefix}.json"); - print CACHE $stationsout; - close(CACHE); + + #json caching + if($dbt->{operator}->{$varenv->{dbname}}->{cache_station} == 1 && $cachme){ + $return->{$id}->{withpub} = "0"; + + #order by sharing_type + foreach my $tarif_key (keys(%$adrtarif_hash)){ + $return->{$id}->{withpub}= "1" if($adrtarif_hash->{$tarif_key} == 2 || $adrtarif_hash->{$tarif_key} == 5); + $return->{$id}->{cached} = "$cachme"; + $op_return->{$dbt->{operator}->{$varenv->{dbname}}->{oprefix} . $id} = $return->{$id}; + #my $stationsout = $json->pretty->encode({ shareejson => { stations => $op_return } }); + my $stationsout = $json->pretty->encode($op_return); + + if($cachme){ + #not public + if($adrtarif_hash->{$tarif_key} == 3 || $adrtarif_hash->{$tarif_key} == 4){ + $bw->log("tarif_key: $tarif_key, sharing_type: $adrtarif_hash->{$tarif_key} Trigger json-caching stations-$dbt->{operator}->{$varenv->{dbname}}->{oprefix}$tarif_key.json by cachme:$cachme","",""); + open(CACHE,">$dbt->{copri_conf}->{basedir}/$dbt->{operator}->{$varenv->{dbname}}->{dir_app}/json/stations-$dbt->{operator}->{$varenv->{dbname}}->{oprefix}$tarif_key.json"); + print CACHE $stationsout; + close(CACHE); + } + #public + else{ + $bw->log("tarif_key: $tarif_key, sharing_type: $adrtarif_hash->{$tarif_key} Trigger json-caching stations-$dbt->{operator}->{$varenv->{dbname}}->{oprefix}.json by cachme:$cachme","",""); + open(CACHE,">$dbt->{copri_conf}->{basedir}/$dbt->{operator}->{$varenv->{dbname}}->{dir_app}/json/stations-$dbt->{operator}->{$varenv->{dbname}}->{oprefix}.json"); + print CACHE $stationsout; + close(CACHE); + } + } + } + }#end caching + } } return ($op_return, $record); @@ -2521,12 +2467,13 @@ sub fetch_tariff(){ my $dbname = shift; my $adr = shift || {}; my $authcookie = shift || ""; + my $cachme = shift || 0; my $merchant_id = ""; $merchant_id = $1 if($authcookie && $authcookie =~ /\w+_(\w+)$/); - my $tariff_content = ""; + my $tariff_all = ""; my @user_tour = (); - my $auth_operator = { c_id => 0 }; + my $auth_operator = { c_id => 0, txt30 => "" }; #int18 # @@ -2544,11 +2491,23 @@ sub fetch_tariff(){ my ($nodes,$rows) = $dbt->collect_node($dbh,$dbt->{shareedms_conf}->{waren}); - #if no primary address then only 2=public - if((ref($adr) ne "HASH" || !$adr->{c_id}) && ($dbname ne "sharee_lv")){ + #public caching + if($cachme eq "public"){ $tariff->{int18} = 2; - $tariff_content = $dbt->fetch_record($dbh,$tariff); - $bw->log("1. Tariff type $tariff->{int18} select on",$dbname,""); + $tariff_all = $dbt->fetch_record($dbh,$tariff); + $bw->log("$dbname $cachme Tariff type for No operator registered user by int18:$tariff->{int18} select 1:",$tariff_all,""); + } + elsif(looks_like_number($cachme) && $cachme > 0){ + $tariff->{barcode} = $cachme; + $tariff_all = $dbt->fetch_record($dbh,$tariff); + $auth_operator = { txt30 => "$cachme" }; + $bw->log("$dbname $cachme Tariff type for No operator registered user by barcode:$tariff->{barcode} select 2:",$tariff_all,""); + } + #if no primary address then only 2=public + elsif((ref($adr) ne "HASH" || !$adr->{c_id}) && ($dbname ne "sharee_lv")){ + $tariff->{int18} = 2; + $tariff_all = $dbt->fetch_record($dbh,$tariff); + $bw->log("$dbname Tariff type for No operator registered user by int18:$tariff->{int18} select 3:",$tariff_all,""); } #select operators address to get users tarifnr array in txt30 elsif(ref($adr) eq "HASH" && $adr->{c_id}){ @@ -2562,7 +2521,7 @@ sub fetch_tariff(){ $auth_operator = $dbt->fetch_record($dbh,$authref); #shareetool user_tour - if($merchant_id && $dbt->{merchant_ids}->{$merchant_id}->{id} && $dbt->{merchant_ids}->{$merchant_id}->{id} == 187){ + if($auth_operator->{c_id} && $merchant_id && $dbt->{merchant_ids}->{$merchant_id}->{id} && $dbt->{merchant_ids}->{$merchant_id}->{id} == 187){ my $users_serviceapp = $dbt->select_users($dbh,$auth_operator->{c_id},"and int09=1"); if($users_serviceapp->{int09}){ $auth_operator->{txt18} =~ s/(\d+)/$dbt->{operator}->{$dbname}->{oprefix}$1/g; @@ -2571,66 +2530,161 @@ sub fetch_tariff(){ } }#end user_tour - $tariff->{int18} = 4 if($dbname eq "sharee_lv"); - - $tariff_content = $dbt->fetch_record($dbh,$tariff); - $bw->log("2. Tariff type $tariff->{int18} select on",$dbname,""); + #4=hidden + if($dbname eq "sharee_lv"){ + if($auth_operator->{txt30}){ + $tariff->{int18} = 4; + }else{ + $tariff->{int18} = 9;#disables because not defined + } + } + #else select all available user tarif entries + $tariff_all = $dbt->fetch_record($dbh,$tariff); + $bw->log("$dbname Tariff type for operator registered user by int18:$tariff->{int18} select 4:",$tariff_all,""); } #end operators address else{ - $bw->log("3. NO tariff_content on",$dbname,""); + $bw->log("$dbname Tariff type NO tariff_all 4:","",""); } my $oprefix = ""; $oprefix = "$dbt->{operator}->{$dbname}->{oprefix}" if($dbt->{operator}->{$dbname}->{oprefix}); - #2022-07-16 refactored + #2023-03-13, just hash all tarif_type by tarif-Nr #collect setted user tarifs and available public tarifs + my %tarif_hash = (); my %adrtarif_hash = (); - if($auth_operator->{c_id}){ - if($auth_operator->{txt30} && $auth_operator->{txt30} =~ /\d\s\d/){ - %adrtarif_hash = map { $_ => 1 } split(/\s+/,$auth_operator->{txt30}); - }else{ - $adrtarif_hash{$auth_operator->{txt30}} = 1; - } - } - if(ref($tariff_content) eq "HASH"){ - foreach my $tid (keys (%$tariff_content)){ - #public or public-bonus tarifs are public viewable stations - if($tariff_content->{$tid}->{int18} && ($tariff_content->{$tid}->{int18} == 2 || $tariff_content->{$tid}->{int18} == 5)){ - $adrtarif_hash{$tariff_content->{$tid}->{barcode}} = 2; - } - } - } - - #collect tarif values for user rentable bikes - my %tarifnr = (); my %bike_node = (); my %bike_group = (); - if(ref($tariff_content) eq "HASH"){ - foreach my $tid (sort { $tariff_content->{$a}->{barcode} <=> $tariff_content->{$b}->{barcode} } keys (%$tariff_content)){ - foreach my $atid (keys (%adrtarif_hash)){ - if($tariff_content->{$tid}->{int12} && $tariff_content->{$tid}->{barcode} && $atid == $tariff_content->{$tid}->{barcode}){ - $bw->log("Tarif FOUND with merchant $merchant_id for authorized user-id $auth_operator->{c_id} if($tariff_content->{$tid}->{int12}) (s-type:$tariff_content->{$tid}->{int18})",$tariff_content->{$tid}->{barcode},""); - $tarifnr{$tariff_content->{$tid}->{barcode}} = 1; - $bike_node{$oprefix . $tariff_content->{$tid}->{int12}} = 1;#sharee bike_node.main_id - my $type_id = $nodes->{$tariff_content->{$tid}->{int12}}->{type_id} || ""; - $bike_group{$oprefix . $type_id} = 1 if($type_id);#sharee bike_node.type_id - } - } - } + if($auth_operator->{txt30} && $auth_operator->{txt30} =~ /\d\s\d/){ + %tarif_hash = map { $_ => 1 } split(/\s+/,$auth_operator->{txt30}); + }elsif($auth_operator->{txt30}){ + $tarif_hash{$auth_operator->{txt30}} = 1; } + + if(ref($tariff_all) eq "HASH"){ + foreach my $rid (keys (%$tariff_all)){ + if(ref(\%tarif_hash) eq "HASH" && $tarif_hash{$tariff_all->{$rid}->{barcode}}){ + foreach my $tk (keys(%tarif_hash)){ + $bw->log("Tarif FOUND condition: $tk && $rid && $tariff_all->{$rid}->{barcode} == $tk","",""); + + if($tk && $rid && $tariff_all->{$rid}->{barcode} == $tk){ + $adrtarif_hash{$tariff_all->{$rid}->{barcode}} = $tariff_all->{$rid}->{int18} if($tariff_all->{$rid}->{int18}); + $bw->log("Tarif FOUND with merchant $merchant_id with user-id $auth_operator->{c_id} if($tariff_all->{$rid}->{int12}) (s-type:$tariff_all->{$rid}->{int18})",$tariff_all->{$rid}->{barcode},""); + $bike_node{$oprefix . $tariff_all->{$rid}->{int12}} = 1;#sharee bike_node.main_id + my $type_id = $nodes->{$tariff_all->{$rid}->{int12}}->{type_id} || ""; + $bike_group{$oprefix . $type_id} = 1 if($type_id);#sharee bike_node.type_id + } + } + }elsif($tariff_all->{$rid}->{int18} == 2){ + $adrtarif_hash{$tariff_all->{$rid}->{barcode}} = $tariff_all->{$rid}->{int18}; + $bw->log("Tarif FOUND with merchant $merchant_id without user-id! if($tariff_all->{$rid}->{int12}) (s-type:$tariff_all->{$rid}->{int18})",$tariff_all->{$rid}->{barcode},""); + $bike_node{$oprefix . $tariff_all->{$rid}->{int12}} = 1;#sharee bike_node.main_id + my $type_id = $nodes->{$tariff_all->{$rid}->{int12}}->{type_id} || ""; + $bike_group{$oprefix . $type_id} = 1 if($type_id);#sharee bike_node.type_id + } + } + } + my @tarifnr = (); my @bike_node = (); my @bike_group = (); - @tarifnr = keys %tarifnr; + @tarifnr = keys %adrtarif_hash; @bike_node = keys %bike_node; @bike_group = keys %bike_group; - $bw->log("FETCHED_Tarif by dbname:$dbname with merchant $merchant_id and optional userID $adr->{c_id} | bike_node:@bike_node | bike_group:@bike_group | user_tour:@user_tour | tarifnr: @tarifnr",\%adrtarif_hash,""); - return (\@bike_group,\@bike_node,\@user_tour,$tariff_content,\%adrtarif_hash); -} + $bw->log("Tarif FOUND FETCHED_Tarif by dbname:$dbname with merchant $merchant_id and optional userID $adr->{c_id} | bike_node:@bike_node | bike_group:@bike_group | user_tour:@user_tour | tarifnr: @tarifnr",\%adrtarif_hash,""); + return (\@bike_group,\@bike_node,\@user_tour,$tariff_all,\%adrtarif_hash); +}#end fetch_tariff + + +#check and set user-bike rental tarif +sub fetch_bike_tariff { + my $self = shift; + my $varenv = shift; + my $auth = shift; + my $bike = shift; + my $owner = shift; + + my $bike_id = $bike || ""; + $bike_id =~ s/S[1-9]X/SX/; + $bike_id = $1 if($bike_id =~ /(\d+)/); + + my $main_ids = ""; + my ($bike_group,$bike_node,$user_tour,$tariff_content,$adrtarif_hash) = $self->fetch_tariff($varenv->{dbname},$auth,""); + $main_ids = join(",",@{$bike_node}); + $main_ids =~ s/[a-z_]+//ig; + my $ct_bike = {}; + my $pref_cc = { + table => "content", + fetch => "one", + main_id => "IN::($main_ids)", + barcode => $bike_id, + template_id => 205, + #int10 => 1, + }; + + $ct_bike = $dbt->fetch_record($dbh,$pref_cc) if($main_ids); + + #$tariff_nr in contentadr are saved by copri or user tarif-select!!! + my $tariff_nr = ""; + my @adr_tariff = (); + if($auth->{txt30}){ + @adr_tariff = ("$auth->{txt30}"); + @adr_tariff = split(/\s+/,$auth->{txt30}) if($auth->{txt30} =~ /\w\s+\w/); + } + + #This is the automatic user tariff setter + if(ref($ct_bike) eq "HASH" && $ct_bike->{main_id}){ + foreach my $id (keys (%$tariff_content)){ + foreach(@adr_tariff){ + $bw->log("booking_request adr_tariff array form $auth->{txt30}",$_,""); + if($tariff_content->{$id}->{int12} && $tariff_content->{$id}->{int12} == $ct_bike->{main_id} && $tariff_content->{$id}->{barcode} && $_ == $tariff_content->{$id}->{barcode}){ + $bw->log("booking_request tariff loop matches:",$tariff_content->{$id}->{barcode},""); + $tariff_nr = $tariff_content->{$id}->{barcode}; + } + } + } + #if no tarif then update user account to fallback default public or private or hidden tarif + if(!$tariff_nr){ + + my $update_adr = { + table => "contentadr", + mtime => "now()", + owner => "$owner", + c_id => "$auth->{c_id}", + }; + + my @txt30 = (); + foreach my $id (keys (%$tariff_content)){ + # + if($tariff_content->{$id}->{int18} && ($tariff_content->{$id}->{int18} == 2 || $tariff_content->{$id}->{int18} == 3 || $tariff_content->{$id}->{int18} == 4)){ + + #auto set tarif if requested bike matches flot + if($tariff_content->{$id}->{int12} && $tariff_content->{$id}->{int12} == $ct_bike->{main_id} && $tariff_content->{$id}->{barcode}){ + $bw->log("booking_request tariff loop matches:",$tariff_content->{$id}->{barcode},""); + $tariff_nr = $tariff_content->{$id}->{barcode}; + push(@txt30, "$tariff_content->{$id}->{barcode}"); + } + #add also other public tarif + elsif($tariff_content->{$id}->{int18} && $tariff_content->{$id}->{int18} == 2 && $tariff_content->{$id}->{int12} && $tariff_content->{$id}->{barcode}){ + push(@txt30, "$tariff_content->{$id}->{barcode}"); + } + } + } + $bw->log("booking_request NO user tariff defined, update user account to fallback default public or private or hidden",\@txt30,""); + $dbt->update_one($dbh,$update_adr,"txt30='@txt30'"); + }else{ + $bw->log("booking_request user tariff selected",$tariff_nr,""); + } + } + + $bw->log("booking_request fetch_bike_tariff result ---> bike $ct_bike->{barcode} matching by bike_node: @{$bike_node} main_ids:$main_ids | bike_group by type_id:@{$bike_group} | Tarif selected: $tariff_nr",$tariff_content->{$tariff_nr}->{ct_name},""); + + return ($ct_bike,$tariff_content->{$tariff_nr}); +}#fetch_bike_tariff + #authout sub authout(){ @@ -2952,13 +3006,13 @@ sub auth_verify(){ } #if any no public user on request, then don't generate cache - my $public_user = 1; - if(ref($adrtarif_hash) eq "HASH"){ - foreach my $atid (keys (%$adrtarif_hash)){ - $public_user = 0 if($adrtarif_hash->{$atid} == 1); - } - } - $return->{public_user} = "$public_user"; + #my $public_user = 1; + #if(ref($adrtarif_hash) eq "HASH"){ + # foreach my $atid (keys (%$adrtarif_hash)){ + # $public_user = 0 if($adrtarif_hash->{$atid} == 1); + # } + #} + #$return->{public_user} = "$public_user"; print FILE "final return: $return->{authcookie}\n" if($debug); diff --git a/copri4/main/src/Mod/APIjsonclient.pm b/copri4/main/src/Mod/APIjsonclient.pm index 55fb8f1..00ecc28 100755 --- a/copri4/main/src/Mod/APIjsonclient.pm +++ b/copri4/main/src/Mod/APIjsonclient.pm @@ -67,8 +67,13 @@ sub loop_sharees { my @user_group = (); my @user_tour = (); my $fetch_hash = {}; + my $o=0; while (my ($key, $op_name) = each %{ $globalconf{operator} }) { my $ret_json = ""; + my %ret_json_all = (); + my %ret_json_private = (); + my %ret_json_public = (); + my %withpub = (); #shareetool, to loop only operators who is the shareetool by usersconf enabled my $users_serviceapp = { u_id => 0 }; @@ -79,26 +84,107 @@ sub loop_sharees { } #every sharee client must have a merchant_id which associate a project if($op_name->{operatorApp} && ($users_serviceapp->{u_id} || $return_merchant->{merchant_id} eq $globalconf{website}->{'shareeweb-sharee'}->{merchant_id} || ($return_merchant->{project_id} eq $op_name->{project}))){ - + $o++; + if($rest_hash->{request} eq "stations_available"){ + push(@uri_operator_array, $op_name->{operatorApp}); #station caching (empty user_group) - ##TODO check private public hidden .... - #FIXME $auth->{public_user} - if(1==2 && $op_name->{cache_station} == 1 && $auth->{public_user} == 1 && $rest_hash->{request} eq "stations_available"){ - my $primary_cache = "$globalconf{primary}->{sharee_primary}->{primaryApp}/json/stations-$op_name->{oprefix}.json"; - $ret_json = $self->fetch_operator_json("$primary_cache",""); - #print "$primary_cache" . "\n" . Dumper($ret_json); - - eval { - my $response_in = ""; - $response_in = decode_json($ret_json); - }; - if ($@){ - $ret_json = $self->fetch_operator_json("$op_name->{operatorApp}/APIjsonserver",$rest); - #print "$op_name->{operatorApp}/APIjsonserver?$rest" . "\n" . Dumper($ret_json); - } + #if disabled, reads DB + if($op_name->{cache_station} == 1){ + #primary authraw + if($authraw->{txt30}){ + my %prim_tarif_hash = (); + if($authraw->{txt30} =~ /\w\s\w/){ + %prim_tarif_hash = map { $_ => 1 } split(/\s+/,$authraw->{txt30}); + }elsif($authraw->{txt30}){ + $prim_tarif_hash{$authraw->{txt30}} = 1; + } + foreach my $optarif (keys(%prim_tarif_hash)){ + my $op_key = ""; + my $tarif_key = ""; + if($optarif =~ /([A-Z]+)(\d+)/){ + $op_key = $1; + $tarif_key = $2; + } + if($op_key && $op_key eq $op_name->{oprefix}){ + #print $optarif . "---" . $op_name->{oprefix} . "\n"; + $ret_json_private{$optarif} = $self->fetch_operator_json("$op_name->{operatorApp}/json/stations-$optarif.json",""); + eval { + $bw->log("$o $key) Test Decode json-caching, using 1: $op_name->{operatorApp}/json/stations-$optarif.json","",""); + my $response_in = ""; + $response_in = decode_json($ret_json_private{$optarif}); + }; + if ($@){ + $bw->log("$o $key) Failure Test reading json-caching, using fallback 1 and generate cache just-in-time: $op_name->{operatorApp}/APIjsonserver?$rest&cachme=$tarif_key",$ret_json,""); + #$ret_json_private{$optarif} = $self->fetch_operator_json("$op_name->{operatorApp}/APIjsonserver",$rest); + $self->fetch_operator_json("$op_name->{operatorApp}/APIjsonserver","$rest&cachme=$tarif_key"); + $ret_json_private{$optarif} = $self->fetch_operator_json("$op_name->{operatorApp}/json/stations-$optarif.json",""); + } + } + %ret_json_all = %ret_json_private; + } + }#primary private Tarifs + + $withpub{$op_name->{oprefix}} = 0; + foreach my $optarif (keys(%ret_json_all)){ + my $opx = $1 if($optarif =~ /([A-Z]+)(\d+)/); + if($op_name->{oprefix} eq $opx){ + eval { + $bw->log("$o $key) Test Decode json-caching, using 2: ret_json_private hash","",""); + my $response_in = ""; + $response_in = decode_json($ret_json_all{$optarif}); + foreach my $station (keys (%{ $response_in })) { + $withpub{$op_name->{oprefix}} = $response_in->{$station}->{withpub}; + } + }; + if ($@){ + $bw->log("$o $key) Failure Test reading json-caching, No fallback for ret_json_private hash","",""); + } + } + } + + #print "$op_name->{oprefix}: $withpub{$op_name->{oprefix}}\n"; + if($withpub{$op_name->{oprefix}} || $op_name->{withpub}){ + $ret_json_public{$op_name->{oprefix}} = $self->fetch_operator_json("$op_name->{operatorApp}/json/stations-$op_name->{oprefix}.json",""); + eval { + $bw->log("$o $key) Test Decode json-caching, using 3: $op_name->{operatorApp}/json/stations-$op_name->{oprefix}.json","",""); + my $response_in = ""; + $response_in = decode_json($ret_json_public{$op_name->{oprefix}}); + }; + if ($@){ + $bw->log("$o $key) Failure Test reading json-caching, using fallback 3 and generate cache just-in-time: $op_name->{operatorApp}/APIjsonserver?$rest&cachme=public",$ret_json,""); + #$ret_json_public{$op_name->{oprefix}} = $self->fetch_operator_json("$op_name->{operatorApp}/APIjsonserver",$rest); + $self->fetch_operator_json("$op_name->{operatorApp}/APIjsonserver","$rest&cachme=public"); + $ret_json_public{$op_name->{oprefix}} = $self->fetch_operator_json("$op_name->{operatorApp}/json/stations-$op_name->{oprefix}.json",""); + } + %ret_json_all = ( %ret_json_all, %ret_json_public ); + } + + foreach my $optarif (keys(%ret_json_all)){ + if($ret_json_all{$optarif}){ + eval { + $bw->log("$o $key) Test Decode json-caching, using 3: ret_json_all hash","",""); + my $response_in = ""; + $response_in = decode_json($ret_json_all{$optarif}); + foreach my $result (keys (%{ $response_in })) { + $fetch_hash->{$result} = $response_in->{$result}; + } + }; + if ($@){ + $bw->log("$o $key) Failure Test reading json-caching, No fallback for ret_json_all hash","",""); + } + } + } + + }#end caching_stations + else{ + $ret_json = $self->fetch_operator_json("$op_name->{operatorApp}/APIjsonserver",$rest); + $bw->log("$o $key) Caching disabled, No reading json-caching, taking: $op_name->{operatorApp}/APIjsonserver?$rest",$ret_json,""); } - - $ret_json = $self->fetch_operator_json("$op_name->{operatorApp}/APIjsonserver",$rest); + + }#end stations_available + else{ + $ret_json = $self->fetch_operator_json("$op_name->{operatorApp}/APIjsonserver",$rest); + } if($ret_json){ push(@uri_operator_array, $op_name->{operatorApp}); @@ -138,11 +224,11 @@ sub loop_sharees { } }; if ($@){ - $bw->log("Failure, eval json from jsonclient","",""); + $bw->log("$o $key) Failure, eval json from jsonclient",$ret_json,""); warn $@; } }else{ - $bw->log("NO json from Operator:",$op_name->{operatorApp},""); + $bw->log("$o $key) NO json from Operator:",$op_name->{operatorApp},""); } #$bw->log("--> LOOP-end jsonclient loop_sharees user_group:\n",\@user_group,""); } diff --git a/copri4/main/src/Mod/APIjsonserver.pm b/copri4/main/src/Mod/APIjsonserver.pm index fd3cd10..e55e05e 100755 --- a/copri4/main/src/Mod/APIjsonserver.pm +++ b/copri4/main/src/Mod/APIjsonserver.pm @@ -276,6 +276,7 @@ elsif($q->param('request') eq "booking_request"){ $sig_book->{rentalId} = "$R::rentalId" if($R::rentalId);#only for cmd tests } $response_book = $apif->booking_request($q,\%varenv,$authraw,$bike,$ct_bike,$ct_tariff,$aowner,$gps,$sig_book); + $apif->stations_caching($q,\%varenv,$authraw); } #just in time booking @@ -368,6 +369,7 @@ elsif($q->param('request') eq "booking_cancel" || $q->param('request') eq "booki ($rows, $booking_values) = $apif->booking_update($q,\%varenv,$authraw,$aowner,$sig_book); }else{ ($rows, $booking_values) = $apif->booking_update($q,\%varenv,$authraw,$aowner,""); + $apif->stations_caching($q,\%varenv,$authraw); } $response = {%$response, %$booking_values}; @@ -397,6 +399,7 @@ elsif($q->param('request') eq "booking_cancel" || $q->param('request') eq "booki #update on Ilockit }else{ ($rows, $booking_values) = $apif->booking_update($q,\%varenv,$authraw,$aowner,$sig_book); + $apif->stations_caching($q,\%varenv,$authraw); $response = {%$response, %$booking_values}; my $record = $apif->user_bikes_occupied($dbh,$authraw,""); @@ -729,7 +732,8 @@ elsif($q->param('request') eq "stations_available"){ ($response->{stations},my $return2copri->{stations}) = $si->sig_available($q,\%varenv,$authraw); $tk->sigstation_cupdate($return2copri->{stations}); }else{ - ($response->{stations}, my $response_raw) = $apif->stations_available($q,\%varenv,$authraw,""); + my $cachme = $R::cachme || ""; + ($response->{stations}, my $response_raw) = $apif->stations_available($q,\%varenv,$authraw,"",$cachme); } } diff --git a/copri4/main/src/Mod/DBtank.pm b/copri4/main/src/Mod/DBtank.pm index 69fa080..2d83218 100755 --- a/copri4/main/src/Mod/DBtank.pm +++ b/copri4/main/src/Mod/DBtank.pm @@ -152,9 +152,9 @@ sub update_operatorsloop { delete $record_primary->{txt15};#Bonusnr delete $record_primary->{int07};#Rabatt delete $record_primary->{txt18};#Service tour - delete $record_primary->{int05};#Web-Login delete $record_primary->{int16};#payone-cron-interval delete $record_primary->{int19};#Ilockit Admin + #delete $record_primary->{int05};#Web-Login #delete $record_primary->{int12};#Vde (remove delete for global setting) delete $record_primary->{int23};#mini_answer count will be saved on operator delete $record_primary->{txt29};#Sonstiges diff --git a/copri4/main/src/Mod/Indexsharee.pm b/copri4/main/src/Mod/Indexsharee.pm index 966ea9f..df7668a 100755 --- a/copri4/main/src/Mod/Indexsharee.pm +++ b/copri4/main/src/Mod/Indexsharee.pm @@ -365,14 +365,13 @@ sub handler { $feedb = $pl->new_content($q,$users_dms); }elsif($R::base_edit eq "save_content"){ $feedb = $pl->save_content($q,$users_dms,$node_meta,$R::c_id) if(looks_like_number($R::c_id)); + $apif->stations_caching($q,\%varenv,$users_sharee) if($node_meta->{template_id} =~ /210|225/); }elsif($R::c_id && $R::base_edit eq "remove_chk4rel"){ my $delete_key = "delete_content"; $feedb->{message} = "failure::Datensatz wirklich löschen. ::?base_edit=$delete_key\&exit_box2=1\&c_id=$R::c_id ::löschen"; }elsif($R::c_id && $R::base_edit eq "delete_content"){ $feedb = $pl->delete_content($node_meta,$R::c_id); - - #}elsif($R::rel_edit){ - #$return = $pm->maininit($users_dms); + $apif->stations_caching($q,\%varenv,$users_sharee) if($node_meta->{template_id} =~ /210|225/); } }else{ $feedb->{message} = "failure::Abbruch. Schreibender Zugriff \"Waren Stammdaten\" verweigert."; diff --git a/copri4/main/src/Tpl/BaseEdit.pm b/copri4/main/src/Tpl/BaseEdit.pm index a881eb4..14155ed 100755 --- a/copri4/main/src/Tpl/BaseEdit.pm +++ b/copri4/main/src/Tpl/BaseEdit.pm @@ -604,7 +604,7 @@ EOF elsif($key =~ /int12/ && "$size" eq "select" && $node_meta->{tpl_id} == 210){#Flotte bike_group (bikenode.main_id) my @_valxx = (""); foreach my $rid (sort { $bike_nodes->{$a}->{node_name} cmp $bike_nodes->{$b}->{node_name} } keys (%$bike_nodes)){ - push (@_valxx, "$bike_nodes->{$rid}->{main_id}:$bike_nodes->{$rid}->{node_name} - $bike_nodes->{$rid}->{main_id}"); + push (@_valxx, "$bike_nodes->{$rid}->{main_id}:$bike_nodes->{$rid}->{node_name} - $dbt->{copri_conf}->{type_id}->{$bike_nodes->{$rid}->{type_id}}"); } print $q->Tr(); print $q->td({-class=>'left_italic_cms',-colspan=>'1'},"$des"); @@ -746,14 +746,8 @@ EOF #my @_valxx_filter = (""); my @_valxx = (""); foreach my $rid (sort { $bike_nodes->{$a}->{node_name} cmp $bike_nodes->{$b}->{node_name} } keys (%$bike_nodes)){ - push (@_valxx, "$bike_nodes->{$rid}->{main_id}:$bike_nodes->{$rid}->{node_name} - $bike_nodes->{$rid}->{main_id}"); - #$station_filter_hash{$bike_nodes->{$rid}->{type_id}} = 1; + push (@_valxx, "$bike_nodes->{$rid}->{main_id}:$bike_nodes->{$rid}->{node_name} - $dbt->{copri_conf}->{type_id}->{$bike_nodes->{$rid}->{type_id}}"); } - #foreach my $type_id (keys (%station_filter_hash)){ - # push (@_valxx_filter, "$type_id"); - #} - #type_id will be set on submit by selected values - #print $q->hidden(-name=>"txt25",-override=>1,-value=>"@_valxx_filter"); my $height = scalar(@_valxx); print $q->Tr(); diff --git a/copri4/main/src/Tpl/Liste3.pm b/copri4/main/src/Tpl/Liste3.pm index 28c1d75..105199a 100755 --- a/copri4/main/src/Tpl/Liste3.pm +++ b/copri4/main/src/Tpl/Liste3.pm @@ -429,7 +429,14 @@ EOF keyfield => "main_id", }; my $bike_nodes = $dbt->fetch_rel4tpl4nd($dbh,$node); - my $tariff_all = $db->collect_ct4rel("content","300026",$lang,"","","","","210"); + my $tariff_all = {}; + my $tariff = { + table => "content", + fetch => "all", + keyfield => "barcode", + template_id => "210",#Tariff tpl_id + }; + $tariff_all = $dbt->fetch_record($dbh,$tariff); my $dbh_primary = $dbt->dbconnect_extern($dbt->{primary}->{sharee_primary}->{database}->{dbname}); my $users_dms_primary = { u_id => 0 }; @@ -602,20 +609,16 @@ EOF }elsif($size =~ /select/ && $key =~ /int12/ && $tpl_id =~ /210/){#Tarif for Flot my @s_valxx = (""); foreach my $rid (sort { $bike_nodes->{$a}->{node_name} cmp $bike_nodes->{$b}->{node_name} } keys (%$bike_nodes)){ - push (@s_valxx, "$bike_nodes->{$rid}->{main_id}:$bike_nodes->{$rid}->{node_name} - $bike_nodes->{$rid}->{main_id}"); + push (@s_valxx, "$bike_nodes->{$rid}->{main_id}:$bike_nodes->{$rid}->{node_name} - $dbt->{copri_conf}->{type_id}->{$bike_nodes->{$rid}->{type_id}}"); } print $q->td({-class=>'search_line'},$but->selector_class("s_$key","","",$s_val,@s_valxx)),"\n"; }elsif($size =~ /select/ && $key =~ /txt24/ && $tpl_id =~ /225/){#txt24=bike_group (for station filter) #my %station_filter_hash = (); my @s_valxx = (""); foreach my $rid (sort { $bike_nodes->{$a}->{node_name} cmp $bike_nodes->{$b}->{node_name} } keys (%$bike_nodes)){ - push (@s_valxx, "$bike_nodes->{$rid}->{main_id}:$bike_nodes->{$rid}->{node_name} - $bike_nodes->{$rid}->{main_id}"); - #$station_filter_hash{$bike_nodes->{$rid}->{type_id}} = 1; + push (@s_valxx, "$bike_nodes->{$rid}->{main_id}:$bike_nodes->{$rid}->{node_name} - $dbt->{copri_conf}->{type_id}->{$bike_nodes->{$rid}->{type_id}}"); } - #foreach my $type_id (keys (%station_filter_hash)){ - # push (@s_valxx, "$type_id:$dbt->{copri_conf}->{type_id}->{$type_id} - $type_id"); - #} print $q->td({-class=>'search_line'},$but->selector_class("s_$key","","",$s_val,@s_valxx)),"\n"; }elsif($size =~ /select/ && $key =~ /int21|int22/ && $tpl_id == 228){#Bonusnummern @@ -1023,13 +1026,13 @@ EOF }elsif($ct4rel->{$id}->{template_id} == 210 && $key eq "int12"){ my $flotten = ""; foreach my $rid (sort { $bike_nodes->{$a}->{node_name} cmp $bike_nodes->{$b}->{node_name} } keys (%$bike_nodes)){ - $flotten .= "$bike_nodes->{$rid}->{node_name} - $bike_nodes->{$rid}->{main_id}
" if($ct4rel->{$id}->{$key} =~ /$bike_nodes->{$rid}->{main_id}/); + $flotten .= "$bike_nodes->{$rid}->{node_name} - $dbt->{copri_conf}->{type_id}->{$bike_nodes->{$rid}->{type_id}}
" if($ct4rel->{$id}->{$key} =~ /$bike_nodes->{$rid}->{main_id}/); } print $q->td({-class=>'tdtxt',-style=>"$txtstyle $set_style"},"$flotten"),"\n"; }elsif($ct4rel->{$id}->{template_id} == 225 && $key eq "txt24"){ my $flotten = ""; foreach my $rid (sort { $bike_nodes->{$a}->{node_name} cmp $bike_nodes->{$b}->{node_name} } keys (%$bike_nodes)){ - $flotten .= "$bike_nodes->{$rid}->{node_name} - $bike_nodes->{$rid}->{main_id}
" if($ct4rel->{$id}->{$key} =~ /$bike_nodes->{$rid}->{main_id}/); + $flotten .= "$bike_nodes->{$rid}->{node_name} - $dbt->{copri_conf}->{type_id}->{$bike_nodes->{$rid}->{type_id}}
" if($ct4rel->{$id}->{$key} =~ /$bike_nodes->{$rid}->{main_id}/); } print $q->td({-class=>'tdtxt',-style=>"$txtstyle $set_style"},"$flotten"),"\n"; }elsif($ct4rel->{$id}->{template_id} == 228 && $key =~ /int21|int22/){ @@ -1071,7 +1074,16 @@ EOF $teaser = substr($ct4rel->{$id}->{$key},0,50) . " ..."; } print $q->td({-class=>'tdtxt',-style=>"$txtstyle $set_style; min-width:200px;"},"$teaser"),"\n"; - + }elsif($key eq "txt30" && $node_meta->{template_id} == 202){ + $txtstyle = "text-align:left;"; + my @user_tarif = ("$ct4rel->{$id}->{$key}"); + @user_tarif = split(/\s/,$ct4rel->{$id}->{$key}) if($ct4rel->{$id}->{$key} =~ /\w\s+\w/); + my $registered_tarif = ""; + foreach(@user_tarif){ + $registered_tarif .= "$_ - $dbt->{copri_conf}->{sharing_type}->{$tariff_all->{$_}->{int18}} - $tariff_all->{$_}->{ct_name} - $bike_nodes->{$tariff_all->{$_}->{int12}}->{node_name} | "; + } + #print $q->td({-class=>'tdtxt',-style=>"$txtstyle $set_style"},"$registered_tarif"),"\n"; + print $q->td({-class=>'tdtxt',-style=>"$txtstyle $set_style", -title=>"$registered_tarif"},"$ct4rel->{$id}->{$key}"),"\n"; #default to anything else }elsif($key =~ /ct_name|node|txt|uri/){ $txtstyle = "text-align:left;";