sharee.bike/copri4/main/src/scripts/statistik_amountCSV_files.pl

272 lines
9.2 KiB
Perl
Executable file

#!/usr/bin/perl
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# Copyright (c) Rainer Gümpelein, TeilRad GmbH
#
#Generates CSV for amount channels and start-station/end-station and Nuter Registrierung
#
#csv/Statistik-Allnewuser_amount_*
#csv/Statistik-channel_amount_*
#csv/Statistik-start_end_station_*
#csv/Statistik-Bonusnewuser_amount_*
#
#
#Examples
#./src/scripts/statistik_amountCSV_files.pl shareedms-operator '' '' '300103'"
#
#with start_time and end_time
#./src/scripts/statistik_amountCSV_files.pl shareedms-operator '2022-01-01' '2022-02-01' '300101'"
#./src/scripts/statistik_amountCSV_files.pl shareedms-operator '2022-01-01' '2022-02-01' '300103'"
#
use vars qw($syshost);
BEGIN {
$syshost = $ARGV[0] || exit 1;
}
use lib "/var/www/copri-bike/$syshost/src";
my $start_itime = $ARGV[1] || "";
my $end_itime = $ARGV[2] || "";
#2022-08-03 changed $bikesys int12 select to $bike_type_id int29
my $bike_type_id = $ARGV[3] || "";
my $flotte_type = "";
if($bike_type_id == 300101){
$flotte_type = "Lastenrad";
}elsif($bike_type_id == 300103){
$flotte_type = "Stadtrad";
}else{
print "Failure, bike_type_id must be nodes.type_id number of Flot\n\n";
exit 1;
}
my $owner = $ARGV[4] || "";
use strict;
use warnings;
use utf8;
use POSIX;
use CGI ':standard';
use Lib::Config;
use Mod::DBtank;
use Scalar::Util qw(looks_like_number);
use DateTime;
use DateTime::Format::Pg;
use Text::CSV_XS;
use Sys::Hostname;
my $hostname = hostname;
use Mod::Libenz;
use Mod::Pricing;
use Mod::APIfunc;
use Data::Dumper;
my $q = new CGI;
my $cf = new Config;
my %varenv = $cf->envonline();
#print "host: $varenv{wwwhost}\n";
my $dbt = new DBtank;
my $lb = new Libenz;
my $pri = new Pricing;
my $apif = new APIfunc;
my $dbh = $dbt->dbconnect();
my $dt1 = DateTime->now(time_zone => 'Europe/Berlin');
if(!$end_itime){
$end_itime = $dt1;
}
if(!$start_itime){
$start_itime = $dt1->clone->add(months => -1, end_of_month => 'preserve');
}
my $month = $1 if($start_itime =~ /\d{4}-(\d{2})-\d{2}/);
$month = sprintf('%.2d',$month);
my $year = $1 if($start_itime =~ /(\d{4})-\d{2}-\d{2}/);
my $channel_map = $dbt->channel_map();
my $channel = "ALL";
foreach my $id (keys (%$channel_map)){
$channel = $channel_map->{$id} if($id eq $owner);
}
my $new_reg=0;
my $swk_reg=0;
my $swk_i=0;
#collect new users in time-range
my $adr_search = {
table => "contentadr",
fetch => "all",
keyfield => "c_id",
int09 => "is::null", #not Service App staff
};
$adr_search = { %$adr_search , owner => $owner } if($owner && $owner =~ /^\d+$/);
$adr_search = { %$adr_search , start_itime => ">=::$start_itime" } if($start_itime);
$adr_search = { %$adr_search , end_itime => "<::$end_itime" } if($end_itime);
my $adr = $dbt->fetch_tablerecord($dbh,$adr_search);
foreach my $id (sort { $adr->{$a}->{itime} cmp $adr->{$b}->{itime} }keys (%$adr)){
#mailAck && smsAck
if($adr->{$id}->{int04} && $adr->{$id}->{int04} == 1 && $adr->{$id}->{int13} && $adr->{$id}->{int13} == 1){
$new_reg++;
#New SWK Bonus registrations
if($adr->{$id}->{txt15} && $adr->{$id}->{txt15} =~ /\d+/){
$swk_reg++;
}
}
}
#fetch all stations
my $pref = {
table => "content",
fetch => "all",
keyfield => "int04",
main_id => "=::300016",
template_id => "225",
int04 => "!=::99",#virtual station
int10 => "1", #available
txt01 => "not ilike::%Contributor%",
};
my $station_rec = $dbt->fetch_record($dbh,$pref);
#Statistik-start_end_station
my $csv_start_station = Text::CSV_XS->new ({ binary => 1, sep_char => ";", eol => "\r\n" });
my $filename_start_station = "Statistik-start_end_station_$year-$month-$flotte_type.csv";
open my $sstation, ">", "$varenv{csv}/$filename_start_station" or die "$filename_start_station: $!\n";
my @start_station = ("$year-$month Station","Menge Anmietungen/Rueckgaben");
$csv_start_station->print($sstation, \@start_station);#$start_station CSV header
#Statistik-channel_amount
my $csv_amount = Text::CSV_XS->new ({ binary => 1, sep_char => ";", eol => "\r\n" });
my $filename_amount = "Statistik-channel_amount_$year-$month-$flotte_type.csv";
open my $aamount, ">", "$varenv{csv}/$filename_amount" or die "$filename_amount: $!\n";
my @amount = ("$year-$month $flotte_type","Menge");
$csv_amount->print($aamount, \@amount);#$amount CSV header:
#Statistik-Allnewuser_amount
my $csv_allamount = Text::CSV_XS->new ({ binary => 1, sep_char => ";", eol => "\r\n" });
my $filename_allamount = "Statistik-Allnewuser_amount_$year-$month.csv";
open my $allaamount, ">", "$varenv{csv}/$filename_allamount" or die "$filename_allamount: $!\n";
my @allamount = ("$year-$month Gesamtanzahl Neuregistrierungen","Menge");
$csv_allamount->print($allaamount, \@allamount);#$allamount CSV header:
$csv_allamount->print($allaamount, ["neue NutzerInnen","$new_reg"]);
print "Neue NutzerInnen: $new_reg\n";
#Statistik-Bonusnewuser_amount
my $csv_swkamount = Text::CSV_XS->new ({ binary => 1, sep_char => ";", eol => "\r\n" });
my $filename_swkamount = "Statistik-Bonusnewuser_amount_$year-$month.csv";
open my $swkaamount, ">", "$varenv{csv}/$filename_swkamount" or die "$filename_swkamount: $!\n";
my @swkamount = ("$year-$month Gesamtanzahl Neuregistrierungen Bonusnummer","Menge");
$csv_swkamount->print($swkaamount, \@swkamount);#$swkamount CSV header:
$csv_swkamount->print($swkaamount, ["neue NutzerInnen mit Bonus Tarif","$swk_reg"]);
print "Neue NutzerInnen mit Bonus Tarif: $swk_reg\n";
my $sum_minutes=0;
my $sum_hours=0;
my $pricing = {};
my $counting = {};
my $diff_station = 0;
#station hash init
my $start_station = {};
my $end_station = {};
foreach my $int04_id (sort { $station_rec->{$a}->{int04} <=> $station_rec->{$b}->{int04} } keys (%$station_rec)){
$start_station->{$int04_id} = 0;
$end_station->{$int04_id} = 0;
}
my $pos_search = {
table => "contenttranspos",
fetch => "all",
keyfield => "c_id",
int05 => "is::null",#not if sub workflow doc
int06 => "!=::99",#virtual start-station
int29 => "$bike_type_id",#nodes.type_id
int34 => "is::null",#not if staff
};
$pos_search->{owner} = $owner if($owner && $owner =~ /^\d+$/);
$pos_search->{start_time} = ">=::$start_itime" if($start_itime);
$pos_search->{end_time} = "<::$end_itime" if($end_itime);
my $pos = $dbt->fetch_tablerecord($dbh,$pos_search);
#Loop rental positions alias Mietjournal
foreach my $id (sort { $pos->{$a}->{mtime} cmp $pos->{$b}->{mtime} }keys (%$pos)){
($pricing->{$id},my $counting) = $pri->counting_rental(\%varenv,$pos->{$id});
#umsatz by tarif-nr in int09
if($pos->{$id}->{template_id} && $pos->{$id}->{template_id} == 205 && $pos->{$id}->{int09} && $pos->{$id}->{int35} && $pos->{$id}->{int10} == 1 && $pricing->{$id}->{rentalog}->{rental_minute_all} && $pricing->{$id}->{rentalog}->{rental_minute_all} > 0){
#if sharing type public-bonus = 5
if($pos->{$id}->{int18} && $pos->{$id}->{int18} == 5){
$swk_i++;
}
$start_station->{$pos->{$id}->{int06}} += 1 if($pos->{$id}->{int06} && exists($start_station->{$pos->{$id}->{int06}}));
$end_station->{$pos->{$id}->{int04}} += 1 if($pos->{$id}->{int04} && exists($start_station->{$pos->{$id}->{int04}}));
$diff_station += 1 if($pos->{$id}->{int06} && $pos->{$id}->{int04} && $pos->{$id}->{int06} != $pos->{$id}->{int04});
$sum_minutes += $pricing->{$id}->{rentalog}->{rental_minute_all};
}
}#end Loop rental
#Service pos
my $pos_partref = {
table => "contenttranspos",
fetch => "all",
keyfield => "c_id",
int05 => "is::null",#not if sub workflow doc
start_itime => ">=::$start_itime",
end_itime => "<::$end_itime",
};
my $pos_part = $dbt->fetch_tablerecord($dbh,$pos_partref);
$sum_hours = $sum_minutes / 60 if($sum_minutes > 0);
$sum_hours = sprintf('%.2f',$sum_hours);
$sum_hours =~ s/\./,/;
$csv_amount->print($aamount, ["Gesamtnutzungsstunden im Gesamtsystem","$sum_hours"]);
print "Gesamtnutzungsstunden im Gesamtsystem: $sum_hours\n";
my $count_start = 0;
foreach my $stid (sort { $a <=> $b } (keys (%$start_station))){
$count_start += $start_station->{$stid};
my @start_station_line = ("start-Station $stid","$start_station->{$stid}");
$csv_start_station->print($sstation, \@start_station_line);#foreach line
}
print "Count start_station: $count_start\n";
my $count_end = 0;
foreach my $stid (sort { $a <=> $b } (keys (%$end_station))){
$count_end += $end_station->{$stid};
my @end_station_line = ("end-Station $stid","$end_station->{$stid}");
$csv_start_station->print($sstation, \@end_station_line);#foreach line
}
print "Count end_station: $count_end\n";
$csv_amount->print($aamount, ["APP Anmietungen","$count_start"]);
print "APP Anmietungen: $count_start\n";
$csv_amount->print($aamount, ["Gesamtanzahl Anmietungen im Gesamtsystem","$count_start"]);
print "Gesamtanzahl Anmietungen im Gesamtsystem: $count_start\n";
$csv_amount->print($aamount, ["One-Way-Fahrten","$diff_station"]);
print "\nAnteil One-Way-Fahrten: $diff_station\n";
if($swk_i){
$csv_amount->print($aamount, ["Anmietungen mit Bonusnummer","$swk_i"]);
print "Anmietungen mit Bonusnummer: $swk_i\n";
}