From 44d47011af7cc6e3b37fb681a66ca12df00d1b8a Mon Sep 17 00:00:00 2001 From: ragu Date: Tue, 24 Oct 2023 07:26:06 +0200 Subject: [PATCH] beta App api extension with bikes-occupied on bikes-available request. Rental freed-time without rental-count restriction on TR. --- copri4/main/src/Mod/APIfunc.pm | 20 ++++--- copri4/main/src/Mod/APIjsonserver.pm | 11 +++- copri4/main/src/Mod/DBtank.pm | 2 +- copri4/main/src/Mod/Indexsharee.pm | 81 +++++++++++++++++++--------- copri4/main/src/Mod/Pricing.pm | 9 ++-- 5 files changed, 85 insertions(+), 38 deletions(-) diff --git a/copri4/main/src/Mod/APIfunc.pm b/copri4/main/src/Mod/APIfunc.pm index 042e192..ffe896c 100755 --- a/copri4/main/src/Mod/APIfunc.pm +++ b/copri4/main/src/Mod/APIfunc.pm @@ -1641,7 +1641,10 @@ sub user_rentals_history(){ my $self = shift; my $q = shift || ""; my $auth = shift; + my $daily = shift || 0; + my %varenv = $cf->envonline(); + my $today = strftime("%Y-%m-%d",localtime(time)); my $record_all = {}; my $pref = { @@ -1652,7 +1655,9 @@ sub user_rentals_history(){ ca_id => "$auth->{c_id}", }; - if(looks_like_number($q->param('month')) && $q->param('month') > 0){ + if($daily > 0){ + $pref->{start_time} = ">=::$today"; + }elsif(looks_like_number($q->param('month')) && $q->param('month') > 0){ my $month = $q->param('month'); $pref->{mtime} = ">=::(now() - interval '$month month')"; }else{ @@ -1884,11 +1889,12 @@ sub bikes_available(){ my $td_template = $dbt->rental_description_template($varenv_prim); #return list of occupied/requested bikes - my $rentals_record = {}; - my $rentals_response = {}; - $rentals_record = $self->user_bikes_occupied($dbh,$auth,""); - $rentals_response = $self->rentals($varenv_prim,$rentals_record,$auth,"");#returns JSON rental values - $rentals_response->{further_freedtime_available} = 1 if(!keys (%$rentals_response)); + my $adjust_freedtime = 0; + my $further_freedtime_available = 1; + my ($cttpos,$operator_hash) = $self->user_rentals_history($q,$auth,1); + foreach my $id (sort { lc($cttpos->{$b}->{itime}) cmp lc($cttpos->{$a}->{itime}) } keys(%$cttpos)){ + $further_freedtime_available = $pri->count_freedrental("rentals by bikes_available",$varenv,$auth->{c_id},$cttpos->{$id},$adjust_freedtime); + } foreach my $id (sort { $record->{$a}->{barcode} <=> $record->{$b}->{barcode} } keys (%$record)){ $return->{$id}->{authed} = "$authed"; @@ -1984,7 +1990,7 @@ sub bikes_available(){ $tariff_content->{$tid}->{int17} =~ s/\./,/ if($lang eq "de"); $return->{$id}->{rental_description}->{tarif_elements}->{$td} = ["$td_template->{$td}->{int17}","$tariff_content->{$tid}->{int17} € / 24 $varenv_prim->{cms}->{'unit-hour'}->{txt}"]; }elsif($td_template->{$td}->{time02} && $tariff_content->{$tid}->{time02} =~ /[1-9]/){ - if($rentals_response->{further_freedtime_available} == 1 || !$auth->{c_id}){ + if($further_freedtime_available == 1 || !$auth->{c_id}){ $time_unit = $dbt->time_format($varenv_prim,$tariff_content->{$tid}->{time02}); $time_unit .= " / $varenv_prim->{cms}->{'unit-day'}->{txt}" if($dbt->{operator}->{$varenv->{dbname}}->{project} ne "Konstanz"); $return->{$id}->{rental_description}->{tarif_elements}->{$td} = ["$td_template->{$td}->{time02}","$time_unit"]; diff --git a/copri4/main/src/Mod/APIjsonserver.pm b/copri4/main/src/Mod/APIjsonserver.pm index 95428a0..8dd5100 100755 --- a/copri4/main/src/Mod/APIjsonserver.pm +++ b/copri4/main/src/Mod/APIjsonserver.pm @@ -505,6 +505,7 @@ elsif($q->param('request') eq "bikes_available"){ }else{ ($aowner,my $return_merchant) = $apif->fetch_merchant($q,\%varenv,$coo,$q->param('merchant_id')); $varenv{merchant_id} = $return_merchant->{merchant_id}; + $response = { %$response, %$return_merchant }; #on operator loop select, operator adr must be select to get user_group my $auth = {}; @@ -519,12 +520,20 @@ elsif($q->param('request') eq "bikes_available"){ }else{ $response->{bikes} = $apif->bikes_available($q,\%varenv,\%varenv,$authraw); } + + #return also bikes_occupied on bikes_available by operator request + if(1==1 && $varenv{syshost} ne "shareeapp-primary" && $dbt->{copri_conf}->{betau_id}->{$authraw->{c_id}}){ + #return list of occupied/requested bikes + my $record = {}; + $record = $apif->user_bikes_occupied($dbh,$authraw,""); + $response->{bikes_occupied} = $apif->rentals(\%varenv,$record,$authraw,"1");#returns JSON rental values + } } if(ref($response->{bikes}) ne "HASH"){ $response->{response_state} = "Failure 5003: cannot find any user defined bike tariff"; $response->{response_text} = "Abbruch, es konnte kein gültiger Tarif gefunden werden"; } -} +}#end bikes_available #bikes_all with service_state calculater #cronjob for maintenance update runs at ~ 7:00 diff --git a/copri4/main/src/Mod/DBtank.pm b/copri4/main/src/Mod/DBtank.pm index cce8f17..4b06cd8 100755 --- a/copri4/main/src/Mod/DBtank.pm +++ b/copri4/main/src/Mod/DBtank.pm @@ -835,7 +835,7 @@ sub fetch_record(){ #ct.* because of nd.txt01 and ct.txt01 . my $sql = "SELECT ct.*,rel.*,nd.node_name,nd.parent_id,nd.type_id,nd.energy_id FROM $fetch->{table} ct, relation rel, nodes nd $where $order"; - $bw->log("DBtank fetch_record : ",$sql,"") if($debug); + #$bw->log("DBtank fetch_record : ",$sql,"") if($debug); my $sth = $dbh->prepare($sql); my $rc = $sth->execute(); diff --git a/copri4/main/src/Mod/Indexsharee.pm b/copri4/main/src/Mod/Indexsharee.pm index 9a10f81..d9a2aa9 100755 --- a/copri4/main/src/Mod/Indexsharee.pm +++ b/copri4/main/src/Mod/Indexsharee.pm @@ -24,7 +24,6 @@ use Mod::Prelogic; use Lib::Mlogic; use Mod::Basework; use Mod::DBtank; -use Mod::Libenzdb; use Mod::APIfunc; use Mod::Shareework; use Mod::Prelib; @@ -43,7 +42,6 @@ sub handler { my $pre = new Prelogic; my $tk = new Shareework; my $dbt = new DBtank; - my $db = new Libenzdb; my $apif = new APIfunc; my $but = new Buttons; my $pl = new Prelib; @@ -252,8 +250,13 @@ sub handler { if($mode =~ /logout/){ if($mode =~ /logout_sharee/){ $apif->authout($q,$coo); - }else{ - $db->cook_out($coo); + }elsif($users_dms->{u_id}){ + my $update_users = { + table => "users", + change => "no_time", + u_id => $users_dms->{u_id} + }; + $dbt->update_one($dbh,$update_users,"cookie=''"); } print redirect("$varenv{wwwhost}"); exit 0; @@ -265,7 +268,15 @@ sub handler { if($R::login_sharee){ if($users_sharee->{c_id} && (!$payable_check || ($users_sharee->{txt31} && $tpl->{tpl_order} =~ /$users_sharee->{txt31}/))){ - my $row = $db->updater("contentadr","c_id","$users_sharee->{c_id}","int12","1") if(!$payable_check);#Vde + if(!$payable_check){ + my $update_adr = { + table => "contentadr", + mtime => "now()", + owner => $aowner, + c_id => $users_sharee->{c_id} + }; + $dbt->update_one($dbh,$update_adr,"int12=1"); + } print redirect("$varenv{wwwhost}/$varenv{mandant}/Account/$varenv{accounting_1}$session"); exit 0; }elsif($users_sharee->{c_id} && !$payable_check){ @@ -299,6 +310,12 @@ sub handler { #DMS & Tools if($varenv{orga} eq "dms" && $users_dms->{u_id}){ + my $update_users = { + table => "users", + change => "no_time", + u_id => $users_dms->{u_id} + }; + if($R::cal_delta_start){ use Date::Calc qw(Add_Delta_YMD); my $day = strftime "%d", localtime; @@ -308,21 +325,21 @@ sub handler { ($year,$mon,$day) = split(/-/,$users_dms->{cal_start}) if($users_dms->{cal_start}); my ($year1,$mon1,$day1) = split(/:/,$R::cal_delta_start); my ($Dy,$Dm,$Dd) = Add_Delta_YMD($year,$mon,$day, $year1,$mon1,$day1); - $db->users_up("cal_start","$Dy-$Dm-$Dd",$users_dms->{u_id}); + $dbt->update_one($dbh,$update_users,"cal_start='$Dy-$Dm-$Dd'"); } if($R::cal_today){ my $today4db = strftime("%Y-%m-%d %H:%M",localtime(time)); - $db->users_up("cal_start","$today4db",$users_dms->{u_id}); + $dbt->update_one($dbh,$update_users,"cal_start='$today4db'"); } if($R::cal_sort_updown){ - $db->users_up("cal_sort_updown",$R::cal_sort_updown,$users_dms->{u_id}); + $dbt->update_one($dbh,$update_users,"cal_sort_updown='$R::cal_sort_updown'"); } if($R::col_sort && $node_meta->{ct_table}){ - $db->users_up("col_sort_$node_meta->{ct_table}",$R::col_sort,$users_dms->{u_id}); + $dbt->update_one($dbh,$update_users,"col_sort_$node_meta->{ct_table}='$R::col_sort'"); } if($R::sort_updown){ - $db->users_up("sort_updown_$node_meta->{ct_table}",$R::sort_updown,$users_dms->{u_id}); + $dbt->update_one($dbh,$update_users,"sort_updown_$node_meta->{ct_table}='$R::sort_updown'"); } #base_edit implements new DMS methodes without Pre* things @@ -420,15 +437,20 @@ sub handler { #DMS Faktura if($node_meta->{ct_table} eq "contenttrans"){ $bw->log("DMS action from $users_dms->{u_id} on $node_meta->{ct_table}",$q,""); + my $update_users = { + table => "users", + change => "no_time", + u_id => $users_dms->{u_id} + }; my $dbh_primary = $dbt->dbconnect_extern($dbt->{primary}->{sharee_primary}->{database}->{dbname}); my $users_dms_primary = { u_id => 0 }; $users_dms_primary = $dbt->select_users($dbh_primary,$users_dms->{u_id},"and int03 >= 1"); if($users_dms_primary->{u_id} && $users_dms_primary->{int03} >= 1 && $users_dms->{u_id} && $users_dms->{int03} >= 1 && $R::ct_trans eq "open"){#DMS Faktura read - $db->update_users4trans($R::c_id4trans,$R::tpl_id4trans,"",$users_dms->{u_id}) if(looks_like_number($R::c_id4trans) && looks_like_number($R::tpl_id4trans)); + $dbt->update_one($dbh,$update_users,"c_id4trans=$R::c_id4trans,tpl_id4trans=$R::tpl_id4trans") if(looks_like_number($R::c_id4trans) && looks_like_number($R::tpl_id4trans)); } if($users_dms_primary->{u_id} && $users_dms_primary->{int03} == 2 && $users_dms->{u_id} && $users_dms->{int03} == 2){#DMS Faktura rw - $db->update_users4trans($R::c_id4trans,$R::tpl_id4trans,"",$users_dms->{u_id}) if(looks_like_number($R::c_id4trans) && looks_like_number($R::tpl_id4trans)); + $dbt->update_one($dbh,$update_users,"c_id4trans=$R::c_id4trans,tpl_id4trans=$R::tpl_id4trans") if(looks_like_number($R::c_id4trans) && looks_like_number($R::tpl_id4trans)); if($R::ct_trans =~ /set_workflow2invoice|set_workflow2storno/){ $return = $pl->set_workflow($q,$users_dms,$R::c_id4trans,$R::set_main_id4workflow) if(looks_like_number($R::c_id4trans) && looks_like_number($R::tpl_id4trans) && looks_like_number($R::set_main_id4workflow)); }elsif($R::ct_trans =~ /set_accounting2invoice/){ @@ -624,6 +646,11 @@ sub handler { #email and sms acknowledgments, check and save confirm states if($R::confirm_userid && $R::confirm_userid =~ /^\d+$/ && ($R::confirm_code && length($R::confirm_code) >= 5 || $R::confirm_smscode && length($R::confirm_smscode) >= 5)){ + my $update_adr = { + table => "contentadr", + mtime => "now()", + owner => $aowner, + }; #keep in mind, for now and just for testing confirm codes are just c_id open(FILE,">>$varenv{logdir}/confirm.log") if($debug); @@ -639,25 +666,30 @@ sub handler { my $authref = { table => "contentadr", fetch => "one", - template_id => "202", c_id => $R::confirm_userid, txt34 => "ilike::$confirm_code%", }; my $confirmed_email = { c_id => 0 }; - $confirmed_email = $dbt->fetch_record($dbh,$authref); + $confirmed_email = $dbt->fetch_tablerecord($dbh,$authref); - #($api_return,$users_sharee) = $apif->auth_verify($q,"",$R::confirm_code); if($confirmed_email->{c_id}){ - $db->updater("contentadr","c_id","$confirmed_email->{c_id}","int04","1"); + $update_adr->{c_id} = $confirmed_email->{c_id}; + $dbt->update_one($dbh,$update_adr,"int04=1"); #save verified email - $db->updater("contentadr","c_id","$confirmed_email->{c_id}","txt32","$confirmed_email->{txt08}"); + $dbt->update_one($dbh,$update_adr,"txt32='$confirmed_email->{txt08}'"); print FILE "confirmed_email: $confirmed_email->{c_id} update because confirm_code:$confirm_code\n" if($debug); #after mailAck, delete all douple adr with no mailAck - my $ctadr = $db->collect_ct4rel3("contentadr","","","ilike","txt08","$confirmed_email->{txt08}","","",""); + my $authref = { + table => "contentadr", + fetch => "all", + keyfield => "c_id", + txt08 => "ilike::" . $q->escapeHTML($confirmed_email->{txt08}), + }; + my $ctadr = $dbt->fetch_tablerecord($dbh,$authref); foreach my $aid (keys(%$ctadr)){ if(!$ctadr->{$aid}->{int04}){ - $db->delete_content("contentadr",$ctadr->{$aid}->{c_id}); + $dbt->delete_content("contentadr",$ctadr->{$aid}->{c_id}); print FILE "c_id $ctadr->{$aid}->{c_id} $confirmed_email->{txt08} delete because of dopplel\n" if($debug); } } @@ -668,18 +700,17 @@ sub handler { my $authref = { table => "contentadr", fetch => "one", - template_id => "202", c_id => $R::confirm_userid, txt34 => "ilike::%$confirm_smscode", }; my $confirmed_sms = { c_id => 0 }; - $confirmed_sms = $dbt->fetch_record($dbh,$authref); + $confirmed_sms = $dbt->fetch_tablerecord($dbh,$authref); - #($api_return,$users_sharee) = $apif->auth_verify($q,"",$R::confirm_smscode); if($confirmed_sms->{c_id}){ - $db->updater("contentadr","c_id","$confirmed_sms->{c_id}","int13","1"); + $update_adr->{c_id} = $confirmed_sms->{c_id}; + $dbt->update_one($dbh,$update_adr,"int13=1"); #save verified telnr - $db->updater("contentadr","c_id","$confirmed_sms->{c_id}","txt33","$confirmed_sms->{txt07}"); + $dbt->update_one($dbh,$update_adr,"txt33='$confirmed_sms->{txt07}'"); print FILE "confirmed_sms: $confirmed_sms->{c_id} update because confirm_smscode:$confirm_smscode\n" if($debug); } } @@ -687,8 +718,6 @@ sub handler { ($api_return,$users_sharee) = $apif->auth_verify($q,"",$users_sharee->{c_id}) if($users_sharee->{c_id}); if($users_sharee->{int04} && $users_sharee->{int13}){ - #2023-01-17 disabled because of should only be set by pseudocardpan ajax - #my $row = $db->updater("contentadr","c_id","$users_sharee->{c_id}","int12","0");#Vde $dbt->update_operatorsloop($varenv{dbname},$users_sharee->{c_id},"update"); }else{ my $field = "int13"; diff --git a/copri4/main/src/Mod/Pricing.pm b/copri4/main/src/Mod/Pricing.pm index 14db48c..e506cc4 100755 --- a/copri4/main/src/Mod/Pricing.pm +++ b/copri4/main/src/Mod/Pricing.pm @@ -56,6 +56,9 @@ sub count_freedrental { my $further_freedtime_available = 1; my $freed_count = 0; + my $max_freed_count = 1; + #workaround to freedtime all rentals + $max_freed_count = 100 if($dbt->{operator}->{$varenv->{dbname}}->{oprefix} eq "TR"); my $dbh = ""; my $today4db = strftime("%Y-%m-%d %H:%M:%S",localtime(time)); @@ -98,7 +101,7 @@ sub count_freedrental { $record_pos = $dbt->fetch_tablerecord($dbh,$pref_pos); foreach my $pid (sort { $record_pos->{$a}->{c_id} <=> $record_pos->{$b}->{c_id} } keys (%$record_pos)){ $freed_count++; - if($freed_count > 1 && $pos->{c_id} != $record_pos->{$pid}->{c_id}){ + if($freed_count > $max_freed_count && $pos->{c_id} != $record_pos->{$pid}->{c_id}){ $further_freedtime_available = 0; if($adjust_freedtime && $pricing->{rentalog}->{rental_minute_all} >= 5){ @@ -113,8 +116,8 @@ sub count_freedrental { } } - $further_freedtime_available = 0 if($freed_count == 1); - print FILE "if($freed_count > 1 && $pos->{c_id} != $record_pos->{$pid}->{c_id})\nfurther_freedtime_available:$further_freedtime_available\n" if($debug); + $further_freedtime_available = 0 if($freed_count >= $max_freed_count); + print FILE "if($freed_count >= $max_freed_count && $pos->{c_id} != $record_pos->{$pid}->{c_id})\nfurther_freedtime_available:$further_freedtime_available\n" if($debug); } } close(FILE) if($debug);