2021-12-30 12:05:56 +01:00
package Pricing ;
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# Copyright (c) Rainer Gümpelein, TeilRad GmbH
#
2022-04-12 11:21:19 +02:00
#Rental counting and pricing methods
#
#perl -cw
2022-04-30 08:12:55 +02:00
#use lib qw(/var/www/copri-bike/shareeapp-operator/src);
2022-04-12 11:21:19 +02:00
#
2021-12-30 12:05:56 +01:00
use strict ;
use warnings ;
use POSIX ;
use CGI ; # only for debugging
use Scalar::Util qw( looks_like_number ) ;
2022-04-12 11:21:19 +02:00
use DateTime ;
use DateTime::Format::Pg ;
2023-04-17 15:30:19 +02:00
use Date::Calc qw( Add_Delta_YMD ) ;
2021-12-30 12:05:56 +01:00
use Lib::Config ;
use Mod::Libenz ;
use Mod::DBtank ;
use Mod::Basework ;
use Data::Dumper ;
my $ cf = new Config ;
my $ lb = new Libenz ;
my $ dbt = new DBtank ;
my $ bw = new Basework ;
sub new {
my $ class = shift ;
my $ self = { } ;
bless ( $ self , $ class ) ;
return $ self ;
}
my $ dbh = "" ;
2022-05-01 18:31:03 +02:00
sub round () {
my $ self = shift ;
my ( $ amount ) = @ _ ;
$ amount = $ amount * ( 10 ** ( 2 ) ) ;
my $ rounded = int ( $ amount + .5 * ( $ amount <=> 0 ) ) / ( 10 ** ( 2 ) ) ;
return $ rounded ;
}
2023-04-17 15:30:19 +02:00
#for one freed rental
#depends on operator, only 1 rental get freed_time
sub count_freedrental {
my $ self = shift ;
my $ q = shift || "" ;
my $ varenv = shift ;
my $ ca_id = shift || 0 ;
my $ pos = shift || { } ;
my $ freed_count = 0 ;
my $ dbh = "" ;
my $ today4db = strftime ( "%Y-%m-%d %H:%M:%S" , localtime ( time ) ) ;
my $ pricing = { } ;
my $ counting = { } ;
( $ pricing , $ counting ) = $ self - > counting_rental ( $ varenv , $ pos ) ;
my $ debug = 1 ;
open ( FILE , ">>$varenv->{logdir}/count_freedrental.log" ) if ( $ debug ) ;
print FILE "\n*-->$today4db $varenv->{dbname}\n" if ( $ debug ) ;
print FILE Dumper ( $ q ) if ( $ debug ) ;
print FILE "--> c_id:$pos->{c_id} rental_minute_all: $pricing->{rentalog}->{rental_minute_all} > 0\n" if ( $ debug ) ;
#freed mangement will be only dony on accountable rental
if ( $ pricing - > { rentalog } - > { rental_minute_all } > 0 ) {
my $ pref_pos = {
table = > "contenttranspos" ,
fetch = > "all" ,
keyfield = > "c_id" ,
ca_id = > "$ca_id" ,
time02 = > ">::00:00" ,
} ;
#one freed time by parallel rentals
if ( $ dbt - > { operator } - > { $ varenv - > { dbname } } - > { project } eq "Konstanz" ) {
$ pref_pos - > { int10 } = "3" ;
}
#one freed time per day
else {
my $ day = strftime "%d" , localtime ;
my $ mon = strftime "%m" , localtime ;
my $ year = strftime "%Y" , localtime ;
my ( $ nyear , $ nmon , $ nday ) = Add_Delta_YMD ( $ year , $ mon , $ day , 0 , 0 , 1 ) ;
$ pref_pos - > { time_range } = "((start_time >= '$year-$mon-$day' and start_time < '$nyear-$nmon-$nday' and start_time != end_time) OR int10=3)" ;
}
my $ 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 + + ;
print FILE "if($freed_count > 1 && $pos->{c_id} != $record_pos->{$pid}->{c_id})\n" if ( $ debug ) ;
if ( $ freed_count > 1 && $ pos - > { c_id } != $ record_pos - > { $ pid } - > { c_id } ) {
my $ pos_ref = {
table = > "contenttranspos" ,
c_id = > $ record_pos - > { $ pid } - > { c_id } ,
} ;
$ dbt - > update_one ( $ dbh , $ pos_ref , "time02='00:00'" ) ;
print FILE "--> delete freed_time on c_id=$record_pos->{$pid}->{c_id} to time02=00:00\n" if ( $ debug ) ;
}
}
}
close ( FILE ) if ( $ debug ) ;
return ;
} #end count_freedrental
2022-04-12 11:21:19 +02:00
#new counting rental time in hours method (last sharee_pricing)
sub counting_rental {
my $ self = shift ;
my $ varenv = shift ;
my $ ctpos = shift ;
my $ today4db = strftime ( "%Y-%m-%d %H:%M:%S" , localtime ( time ) ) ;
my $ return = { } ;
2022-04-26 20:57:13 +02:00
my $ counting = { c_id = > $ ctpos - > { c_id } } ;
2022-04-12 11:21:19 +02:00
my $ computed_end_time = $ ctpos - > { end_time } || $ today4db ;
$ computed_end_time = $ today4db if ( $ ctpos - > { int10 } && $ ctpos - > { int10 } == 3 ) ;
2022-09-21 19:24:42 +02:00
my $ computed_start_time = $ ctpos - > { start_time } || $ today4db ; #should be only used on parts
2022-04-12 11:21:19 +02:00
2022-04-26 20:57:13 +02:00
#main counting rental time and convert it to minute
2022-09-21 19:24:42 +02:00
my $ dt0 = DateTime::Format::Pg - > parse_datetime ( $ computed_start_time ) ;
2022-04-12 11:21:19 +02:00
my $ dt1 = DateTime::Format::Pg - > parse_datetime ( $ computed_end_time ) ;
2023-06-21 14:59:05 +02:00
2022-04-20 12:07:48 +02:00
my $ dur10 = $ dt1 - > subtract_datetime ( $ dt0 ) ;
2023-06-21 14:59:05 +02:00
my ( $ durmonth , $ durdd , $ durhh , $ durmm ) = $ dur10 - > in_units ( 'months' , 'days' , 'hours' , 'minutes' ) ;
2022-04-20 12:07:48 +02:00
$ durhh = sprintf ( '%.2d' , $ durhh ) ;
$ durmm = sprintf ( '%.2d' , $ durmm ) ;
my $ real_clock = "$durhh:$durmm" ;
$ real_clock = "$durdd day $durhh:$durmm" if ( $ durdd ) ;
2023-06-21 14:59:05 +02:00
$ real_clock = "$durmonth month $durdd day $durhh:$durmm" if ( $ durmonth ) ;
2022-04-20 12:07:48 +02:00
my $ computed_clock = $ real_clock ;
2023-06-21 14:59:05 +02:00
my $ dur = $ dt0 - > delta_ms ( $ dt1 ) ;
my $ rental_minute = $ dur - > { minutes } ;
2022-04-20 12:07:48 +02:00
2022-07-21 20:06:25 +02:00
#if end_station == start_station and rental minutes < 5 minutes, then 0
2023-04-24 14:49:30 +02:00
$ rental_minute = 0 if ( $ ctpos - > { int04 } && $ ctpos - > { int06 } && $ ctpos - > { int04 } == $ ctpos - > { int06 } && $ rental_minute && $ rental_minute < 5 ) ;
2022-08-16 06:44:58 +02:00
my $ rental_minute_all = $ rental_minute ;
2022-07-21 20:06:25 +02:00
2022-04-20 12:07:48 +02:00
#init with some defaults
my $ total_price = 0 ;
my $ ctpos_freed = { c_id = > 0 } ;
2022-11-28 18:28:06 +01:00
$ ctpos - > { int35 } = 0 if ( ! $ ctpos - > { int35 } ) ;
2022-04-12 11:21:19 +02:00
2022-04-26 20:57:13 +02:00
#convert tariff unit by minute time
2022-04-20 12:07:48 +02:00
my $ tariff_unitbyminute = 60 ; #defaults to Stundentarif
if ( $ ctpos - > { time01 } && $ ctpos - > { time01 } =~ /[1-9]/ ) {
2023-06-21 14:59:05 +02:00
my ( $ dhh , $ dmm ) = split ( /:/ , $ ctpos - > { time01 } ) ;
$ tariff_unitbyminute = $ dmm if ( $ dmm && $ dmm > 0 ) ;
$ tariff_unitbyminute = ( $ dhh * 60 ) + $ dmm if ( $ dhh && $ dhh > 0 ) ;
2022-04-20 12:07:48 +02:00
}
2022-04-26 20:57:13 +02:00
#substract free time from rental time ex. 00:30 Min/Gratis
2023-04-12 16:12:19 +02:00
#freed_time depends on operator and will be set by rental end "count_freedrental"
2022-04-30 08:12:55 +02:00
my $ freed_time = "" ;
2023-04-12 16:12:19 +02:00
if ( $ ctpos - > { time02 } && $ ctpos - > { time02 } =~ /[1-9]/ ) {
2022-04-20 12:07:48 +02:00
my ( $ dhh , $ dmm ) = split ( /:/ , $ ctpos - > { time02 } ) ;
2022-04-30 08:12:55 +02:00
$ freed_time = "- $dhh:$dmm" if ( $ dhh || $ dmm ) ;
2022-04-20 12:07:48 +02:00
#adding free minutes to start_time
$ dt0 - > add ( hours = > $ dhh , minutes = > $ dmm ) if ( looks_like_number ( $ dhh ) && looks_like_number ( $ dmm ) ) ;
my $ cdur10 = $ dt1 - > subtract_datetime ( $ dt0 ) ;
2023-06-21 14:59:05 +02:00
my ( $ durmonth , $ durdd , $ durhh , $ durmm ) = $ cdur10 - > in_units ( 'months' , 'days' , 'hours' , 'minutes' ) ;
2022-04-20 12:07:48 +02:00
$ durhh = sprintf ( '%.2d' , $ durhh ) ;
$ durmm = sprintf ( '%.2d' , $ durmm ) ;
$ computed_clock = "$durhh:$durmm" ;
$ computed_clock = "$durdd day $durhh:$durmm" if ( $ durdd ) ;
2023-06-21 14:59:05 +02:00
$ computed_clock = "$durmonth month $durdd day $durhh:$durmm" if ( $ durmonth ) ;
$ rental_minute = 0 ;
if ( $ dt1 > $ dt0 ) {
my $ dur = $ dt0 - > delta_ms ( $ dt1 ) ;
$ rental_minute = $ dur - > { minutes } ;
}
2022-04-12 11:21:19 +02:00
}
2022-07-21 20:06:25 +02:00
2022-04-26 20:57:13 +02:00
my $ rental_unit = 0 ;
my $ price_by_allunit = 0 ;
2022-04-20 12:07:48 +02:00
my $ max_daily_unit = 0 ; #how many rental_minute is one daily_unit
2022-04-26 20:57:13 +02:00
my $ max_fee_daily_minute = 0 ;
2022-04-21 21:15:01 +02:00
my $ rental_day_price = 0 ;
2022-04-20 12:07:48 +02:00
my $ restal_minute = 0 ;
my $ rental_time_price = 0 ;
2022-04-26 20:57:13 +02:00
my $ rental_unit_rounded = 0 ;
2022-04-21 21:15:01 +02:00
my $ used_max_fee = "off" ;
2022-04-26 20:57:13 +02:00
my $ used_methode = "" ;
2022-04-20 12:07:48 +02:00
2022-04-26 20:57:13 +02:00
#on time unit (int35 keeps unit_price1)
2022-06-07 06:53:15 +02:00
if ( $ rental_minute && $ rental_minute > 0 && $ ctpos - > { int35 } && $ ctpos - > { int35 } > 0 ) {
2022-04-26 20:57:13 +02:00
$ rental_unit = $ rental_minute / $ tariff_unitbyminute ;
$ price_by_allunit = $ rental_unit * $ ctpos - > { int35 } ;
#max_fee/day (day = 1440 minutes)
#useless if time01 unit is set to 24:00
if ( $ ctpos - > { int17 } && $ ctpos - > { int17 } > 0 && $ price_by_allunit >= $ ctpos - > { int17 } && $ tariff_unitbyminute < 1440 ) {
$ used_methode . = "max_fee/day" ;
$ used_max_fee = "ON $ctpos->{int17}" ;
$ max_daily_unit = $ ctpos - > { int17 } / $ ctpos - > { int35 } ;
$ max_fee_daily_minute = $ max_daily_unit * $ tariff_unitbyminute ;
2022-04-20 12:07:48 +02:00
my $ days_dec = $ rental_minute / 1440 ;
2022-05-17 09:24:02 +02:00
my $ days = $ days_dec ;
( $ days , my $ ddec ) = split ( /\./ , $ days_dec ) if ( $ days_dec =~ /\.\d/ ) ;
2022-04-26 20:57:13 +02:00
if ( $ days > 0 ) {
$ rental_day_price = $ days * $ ctpos - > { int17 } ;
$ counting - > { int39 } = $ days ; #by day
$ used_methode . = " | rental_day_price: $days days * $ctpos->{int17} pos.int17" ;
}
2022-04-20 12:07:48 +02:00
$ restal_minute = $ rental_minute - $ days * 1440 ;
2022-04-26 20:57:13 +02:00
if ( $ restal_minute >= $ max_fee_daily_minute ) {
2022-04-21 21:15:01 +02:00
$ rental_day_price += $ ctpos - > { int17 } ;
2022-04-26 20:57:13 +02:00
$ counting - > { int39 } += 1 ; #by day
$ used_methode . = " | += $ctpos->{int17} pos.int17" ;
2022-04-20 12:07:48 +02:00
} else {
2022-04-26 20:57:13 +02:00
$ rental_unit = $ restal_minute / $ tariff_unitbyminute ;
#
$ rental_unit = sprintf ( '%.2f' , $ rental_unit ) ;
$ rental_unit_rounded = $ rental_unit ;
if ( $ rental_unit =~ /(\d+)\.(\d+)$/ ) {
2022-04-30 08:12:55 +02:00
$ rental_unit_rounded = $ 1 + 1 if ( $ 2 > 0 ) ;
2022-04-20 12:07:48 +02:00
}
2022-04-26 20:57:13 +02:00
$ rental_time_price = $ rental_unit_rounded * $ ctpos - > { int35 } ;
$ counting - > { int38 } = $ rental_unit_rounded ; #by time
$ used_methode . = " | $rental_unit_rounded rental_unit_rounded * $ctpos->{int35} int35" ;
2022-04-20 12:07:48 +02:00
}
2022-04-26 20:57:13 +02:00
#else if price by all unit < max_fee/day
2022-04-20 12:07:48 +02:00
} else {
2022-04-26 20:57:13 +02:00
$ rental_unit = $ rental_minute / $ tariff_unitbyminute ;
$ rental_unit = sprintf ( '%.2f' , $ rental_unit ) ;
$ rental_unit_rounded = $ rental_unit ;
if ( $ rental_unit =~ /(\d+)\.(\d+)/ ) {
2022-04-30 08:12:55 +02:00
$ rental_unit_rounded = $ 1 + 1 if ( $ 2 > 0 ) ;
2022-04-26 20:57:13 +02:00
}
2022-05-01 18:31:03 +02:00
if ( $ ctpos - > { int36 } == 0 && $ ctpos - > { int17 } && $ ctpos - > { int17 } > 0 ) {
2022-04-26 20:57:13 +02:00
$ counting - > { int38 } = $ rental_unit_rounded ; #count by time
$ rental_time_price = $ rental_unit_rounded * $ ctpos - > { int35 } ;
$ used_methode . = " | $rental_unit_rounded rental_unit_rounded * $ctpos->{int35} int35" ;
2022-05-01 18:31:03 +02:00
} elsif ( $ ctpos - > { int36 } > 0 ) { #if second unit_price2 defined
2022-04-26 20:57:13 +02:00
$ counting - > { int40 } = 1 ; #by day
$ rental_time_price = 1 * $ ctpos - > { int35 } ;
2022-05-01 18:31:03 +02:00
$ used_methode . = " | 1 rental_unit_rounded * $ctpos->{int35} int35 with unit_price2 $ctpos->{int36} 36" ;
2022-04-26 20:57:13 +02:00
if ( $ rental_unit_rounded >= 2 && $ ctpos - > { int36 } && $ ctpos - > { int36 } > 0 ) {
my $ rental_unit_rounded2 = $ rental_unit_rounded - 1 ; #by day
$ counting - > { int41 } = $ rental_unit_rounded2 ;
$ rental_time_price += $ rental_unit_rounded2 * $ ctpos - > { int36 } ;
$ used_methode . = " | $rental_unit_rounded2 rental_unit_rounded * $ctpos->{int36} int36" ;
}
2022-04-20 12:07:48 +02:00
}
2022-04-12 11:21:19 +02:00
}
}
2022-04-20 12:07:48 +02:00
2022-04-21 21:15:01 +02:00
my $ computed_hours = $ rental_minute / 60 ;
$ total_price = $ rental_day_price + $ rental_time_price ;
2022-04-26 20:57:13 +02:00
$ used_methode . = " --> $total_price total_price = $rental_day_price rental_day_price + $rental_time_price rental_time_price" ;
2022-05-01 18:31:03 +02:00
my $ discount = "" ;
my $ discount_val = $ ctpos - > { int07 } || 0 ;
if ( $ discount_val != 0 && $ total_price ) {
my $ discount_eur = $ discount_val ;
2022-05-04 08:02:59 +02:00
$ discount_eur = $ total_price * $ discount_val / 100 if ( ! $ ctpos - > { int08 } || $ ctpos - > { int08 } != 1 ) ;
2022-05-01 18:31:03 +02:00
$ total_price -= $ discount_eur ;
$ discount = "-" . $ ctpos - > { int07 } ;
2022-05-04 08:02:59 +02:00
if ( $ ctpos - > { int08 } && $ ctpos - > { int08 } == 1 ) {
2022-05-01 18:31:03 +02:00
$ discount . = " €" ;
} else {
$ discount =~ s/\.00// ;
$ discount . = "%" ;
}
}
2022-08-17 21:22:57 +02:00
$ total_price = $ total_price * $ ctpos - > { int01 } if ( $ ctpos - > { int01 } ) ;
2023-01-23 12:56:14 +01:00
$ total_price = sprintf ( '%.2f' , $ total_price ) ;
2022-04-12 11:21:19 +02:00
2022-09-21 19:24:42 +02:00
$ return - > { start_time } = "$computed_start_time" ;
2022-04-12 11:21:19 +02:00
$ return - > { end_time } = "$computed_end_time" ;
2022-04-30 08:12:55 +02:00
$ return - > { freed_time } = "$freed_time" ;
2022-04-21 21:15:01 +02:00
$ return - > { computed_hours } = "$computed_hours" ;
2022-11-28 18:28:06 +01:00
$ return - > { unit_price } = "$ctpos->{int35}" || "" ;
2022-04-26 20:57:13 +02:00
$ return - > { real_clock } = "$real_clock" ;
2022-04-20 12:07:48 +02:00
$ return - > { total_price } = "$total_price" ;
2022-05-01 18:31:03 +02:00
$ return - > { discount } = "$discount" ;
2022-04-20 12:07:48 +02:00
2022-04-21 21:15:01 +02:00
$ return - > { rentalog } - > { real_clock } = "$real_clock" ;
2022-04-30 08:12:55 +02:00
$ return - > { rentalog } - > { freed_time } = "$freed_time" ;
2022-04-21 21:15:01 +02:00
$ return - > { rentalog } - > { computed_clock } = "$computed_clock" ;
$ return - > { rentalog } - > { computed_hours } = "$computed_hours" ;
2022-04-20 12:07:48 +02:00
$ return - > { rentalog } - > { rental_minute } = "$rental_minute" ;
2022-08-16 06:44:58 +02:00
$ return - > { rentalog } - > { rental_minute_all } = "$rental_minute_all" ;
2022-04-26 20:57:13 +02:00
$ return - > { rentalog } - > { max_fee_daily_minute } = "$max_fee_daily_minute" ;
2022-04-20 12:07:48 +02:00
$ return - > { rentalog } - > { tariff_unitbyminute } = "$tariff_unitbyminute" ;
$ return - > { rentalog } - > { restal_minute } = "$restal_minute" ;
2022-04-26 20:57:13 +02:00
$ return - > { rentalog } - > { rental_unit_rounded } = "$rental_unit_rounded" ;
$ return - > { rentalog } - > { rental_unit } = "$rental_unit" ;
$ return - > { rentalog } - > { price_by_allunit } = "$price_by_allunit" ;
2022-04-21 21:15:01 +02:00
$ return - > { rentalog } - > { rental_day_price } = "$rental_day_price" ;
$ return - > { rentalog } - > { total_price } = "$total_price" ;
2022-04-20 12:07:48 +02:00
$ return - > { rentalog } - > { rental_time_price } = "$rental_time_price" ;
2022-08-16 06:44:58 +02:00
$ return - > { rentalog } - > { ctpos_freed } = $ ctpos_freed - > { c_id } ;
2022-04-21 21:15:01 +02:00
$ return - > { rentalog } - > { used_max_fee } = "$used_max_fee" ;
2022-04-26 20:57:13 +02:00
$ return - > { rentalog } - > { used_methode } = "$used_methode" ;
$ return - > { rentalog } - > { counting } = $ counting ;
2022-04-20 12:07:48 +02:00
2022-08-16 06:44:58 +02:00
#$bw->log("Pricing counting_rental return:",$return,"");
2022-04-26 20:57:13 +02:00
return ( $ return , $ counting ) ;
2022-04-12 11:21:19 +02:00
} #end counting_rental
#all other values returned by user_bikes_occupied
sub fetch_rentalfeed {
my $ self = shift ;
my $ varenv = shift ;
my $ ctpos = shift ;
2022-04-26 20:57:13 +02:00
my $ returned_counting = shift || { } ;
2022-08-11 11:42:24 +02:00
my $ lang = "de" ;
2022-04-12 11:21:19 +02:00
2022-05-04 17:50:14 +02:00
my $ td_template = $ dbt - > rental_description_template ( ) ;
2022-07-21 20:06:25 +02:00
my $ bike_group = "$dbt->{operator}->{$varenv->{dbname}}->{oprefix}$ctpos->{int29}" || "" ;
2022-04-12 11:21:19 +02:00
my $ return = { } ;
$ return - > { bike_group } = [ "$bike_group" ] ;
2022-06-21 15:30:22 +02:00
#TOD save with prefix
$ return - > { station } = "$dbt->{operator}->{$varenv->{dbname}}->{oprefix}$ctpos->{int04}" ;
$ return - > { uri_operator } = "$varenv->{wwwhost}" ; #TOD, should be DB select
2022-04-12 11:21:19 +02:00
$ return - > { bike } = "$dbt->{operator}->{$varenv->{dbname}}->{oprefix}$ctpos->{barcode}" ;
2022-06-21 15:30:22 +02:00
#TOD save also sig prefix
if ( $ dbt - > { operator } - > { $ varenv - > { dbname } } - > { oprefix } eq "SX" ) {
$ return - > { bike } = "S3X$ctpos->{barcode}" ;
#$return->{station} = "S3X$ctpos->{int04}";
}
2022-04-12 11:21:19 +02:00
$ return - > { state } = "$dbt->{copri_conf}->{bike_state}->{$ctpos->{int10}}" || "" ;
2022-07-15 14:08:04 +02:00
$ return - > { lock_state } = "$dbt->{copri_conf}->{lock_state}->{$ctpos->{int20}}" ;
#defaults
$ return - > { bike_type } - > { category } = "city" ;
$ return - > { bike_type } - > { wheels } = "2" ;
#for station_type_id mapping
2022-07-21 20:06:25 +02:00
if ( $ ctpos - > { int29 } && $ ctpos - > { int29 } == 300101 ) {
2022-07-15 14:08:04 +02:00
$ return - > { bike_type } - > { category } = "cargo" ;
$ return - > { bike_type } - > { wheels } = "2" ;
$ return - > { bike_type } - > { wheels } = "3" if ( $ ctpos - > { txt01 } =~ /drei|trike/i ) ;
2022-07-21 20:06:25 +02:00
if ( $ ctpos - > { txt01 } =~ /E-/i ) {
$ return - > { bike_type } - > { engine } - > { manufacturer } = "dummy" ;
my $ max_bars = 5 ;
my $ current_bars = 0 ;
$ return - > { bike_type } - > { battery } - > { charge_max_bars } = "$max_bars" ;
$ return - > { bike_type } - > { battery } - > { charge_current_bars } = "$current_bars" ;
$ return - > { bike_type } - > { battery } - > { charge_current_percent } = "0" ;
2022-08-01 15:13:43 +02:00
$ return - > { bike_type } - > { battery } - > { hidden } = "0" ; #1=hide charge view
2022-07-21 20:06:25 +02:00
if ( $ ctpos - > { int19 } ) {
$ current_bars = $ bw - > battery_bars ( $ max_bars , $ ctpos - > { int19 } ) ;
$ return - > { bike_type } - > { battery } - > { charge_current_bars } = "$current_bars" ;
$ return - > { bike_type } - > { battery } - > { charge_current_percent } = "$ctpos->{int19}" ;
}
}
2022-07-15 14:08:04 +02:00
}
$ return - > { Ilockit_ID } = "$ctpos->{txt18}" if ( $ ctpos - > { int11 } == 2 ) ;
2022-04-12 11:21:19 +02:00
$ return - > { description } = "$ctpos->{txt01}" ;
$ return - > { request_time } = "$ctpos->{itime}" ;
$ return - > { system } = "Ilockit" if ( $ ctpos - > { int11 } && $ ctpos - > { int11 } == 2 ) ;
$ return - > { system } = "sigo" if ( $ ctpos - > { int11 } && $ ctpos - > { int11 } == 3 ) ;
if ( $ ctpos - > { int11 } ) {
( $ return - > { gps } - > { latitude } , $ return - > { gps } - > { longitude } ) = split ( /,/ , $ ctpos - > { txt06 } ) ;
2022-05-04 17:50:14 +02:00
$ return - > { rental_description } - > { name } = "$ctpos->{txt04}" ;
$ return - > { rental_description } - > { id } = "$ctpos->{int09}" ;
2022-06-28 13:50:59 +02:00
$ return - > { rental_description } - > { reserve_timerange } = "15" ;
$ return - > { rental_description } - > { reserve_timerange } = "30" if ( $ ctpos - > { int11 } == 3 ) ;
2022-04-21 21:15:01 +02:00
2023-04-05 14:53:26 +02:00
$ return - > { aa_ride } = "0" ;
if ( $ ctpos - > { int42 } ) {
$ return - > { rental_description } - > { rental_info } - > { 2 } = [ "AAFahrten" , "Dieses E-Lastenrad darf nur an der Station zurück gegeben werden an der es ausgeliehen wurde!" ] ;
$ return - > { aa_ride } = "1" ;
}
2022-04-26 20:57:13 +02:00
foreach my $ td ( sort keys ( %$ td_template ) ) {
2022-04-21 21:15:01 +02:00
my $ time_unit = "" ;
2022-04-26 20:57:13 +02:00
if ( $ td_template - > { $ td } - > { int35 } && $ ctpos - > { int35 } && $ ctpos - > { int35 } > 0 ) {
2022-08-11 11:42:24 +02:00
$ ctpos - > { int35 } =~ s/\./,/ if ( $ lang eq "de" ) ;
2022-04-26 20:57:13 +02:00
$ time_unit = $ dbt - > time_format ( $ ctpos - > { time01 } ) ;
2022-05-04 17:50:14 +02:00
$ return - > { rental_description } - > { tarif_elements } - > { $ td } = [ "$td_template->{$td}->{int35}" , "$ctpos->{int35} € / $time_unit" ] ;
2022-04-26 20:57:13 +02:00
} elsif ( $ td_template - > { $ td } - > { int36 } && $ ctpos - > { int36 } && $ ctpos - > { int36 } > 0 ) {
2022-08-11 11:42:24 +02:00
$ ctpos - > { int36 } =~ s/\./,/ if ( $ lang eq "de" ) ;
2022-04-21 21:15:01 +02:00
$ time_unit = $ dbt - > time_format ( $ ctpos - > { time01 } ) ;
2022-05-04 17:50:14 +02:00
$ return - > { rental_description } - > { tarif_elements } - > { $ td } = [ "$td_template->{$td}->{int36}" , "$ctpos->{int36} € / $time_unit" ] ;
2022-04-26 20:57:13 +02:00
} elsif ( $ td_template - > { $ td } - > { int17 } && $ ctpos - > { int17 } && $ ctpos - > { int17 } > 0 ) {
2022-08-11 11:42:24 +02:00
$ ctpos - > { int17 } =~ s/\./,/ if ( $ lang eq "de" ) ;
2022-05-04 17:50:14 +02:00
$ return - > { rental_description } - > { tarif_elements } - > { $ td } = [ "$td_template->{$td}->{int17}" , "$ctpos->{int17} € / Tag" ] ;
2022-04-26 20:57:13 +02:00
} elsif ( $ td_template - > { $ td } - > { time02 } && $ ctpos - > { time02 } =~ /[1-9]/ ) {
2022-04-21 21:15:01 +02:00
$ time_unit = $ dbt - > time_format ( $ ctpos - > { time02 } ) ;
2023-04-14 18:08:14 +02:00
$ time_unit . = " / Tag" if ( $ dbt - > { operator } - > { $ varenv - > { dbname } } - > { project } ne "Konstanz" ) ;
2022-11-22 18:10:06 +01:00
$ return - > { rental_description } - > { tarif_elements } - > { $ td } = [ "$td_template->{$td}->{time02}" , "$time_unit" ] ;
2022-05-04 08:02:59 +02:00
} elsif ( $ td_template - > { $ td } - > { xduration } && $ returned_counting - > { real_clock } && $ returned_counting - > { real_clock } =~ /[1-9]/ ) {
2022-04-26 20:57:13 +02:00
$ time_unit = $ dbt - > time_format ( $ returned_counting - > { real_clock } ) ;
2022-05-04 17:50:14 +02:00
$ return - > { rental_description } - > { tarif_elements } - > { $ td } = [ "$td_template->{$td}->{xduration}" , "$time_unit" ] ;
2022-04-26 20:57:13 +02:00
} elsif ( $ td_template - > { $ td } - > { xprice } && $ returned_counting - > { total_price } && $ returned_counting - > { total_price } > 0 ) {
2022-08-11 11:42:24 +02:00
$ returned_counting - > { total_price } =~ s/\./,/ if ( $ lang eq "de" ) ;
2022-05-04 17:50:14 +02:00
$ return - > { rental_description } - > { tarif_elements } - > { $ td } = [ "$td_template->{$td}->{xprice}" , "$returned_counting->{total_price} €" ] ;
2022-04-21 21:15:01 +02:00
}
2022-05-04 17:50:14 +02:00
} #end new rental_description
2022-04-21 21:15:01 +02:00
2022-04-12 11:21:19 +02:00
}
return $ return ;
}
2021-12-30 12:05:56 +01:00
#CO2 calculator
#Bsp Berechnungen:
# Pkw:
# Distanz * CO2-Emission Pkw / 100 km
# 8.760 km * 20 kg CO2 / 100 km = 1.752 kg CO2
# Pedelec:
# Distanz * CO2-Emission Pedelec / 100 km
# 10.950 km * 0,546 kg CO2 / 100 km = 62 kg CO2
#
# Aus der Differenz zwischen der CO2-Emission Pkw und der CO2-Emission Pedelec ergibt sich das Einsparpotenzial:
# 1.752 kg CO2 – 62 kg CO2 = 1.690 kg CO2, also rund 1,7 t CO2 pro Jahr
#
sub co2calc {
my $ self = shift ;
my $ ctpos = shift ;
my $ co2diff = 0 ;
my $ co2pkw = $ ctpos - > { int26 } * 20 / 100 ;
my $ co2ped = $ ctpos - > { int26 } * 0.546 / 100 ;
$ co2diff = $ co2pkw - $ co2ped ;
$ co2diff = sprintf ( '%.2f' , $ co2diff ) ;
$ co2diff =~ s/\./,/ ;
return $ co2diff ;
}
#calculates sprit saving
2022-10-31 08:11:53 +01:00
#disabled
2021-12-30 12:05:56 +01:00
sub sprit2calc {
my $ self = shift ;
my $ ctpos = shift ;
my $ einzel = $ ctpos - > { int02 } ;
my $ menge = $ ctpos - > { int03 } ;
2022-05-01 18:31:03 +02:00
my $ discount_val = $ ctpos - > { int07 } || 0 ;
2022-04-26 20:57:13 +02:00
my $ total = 0 ;
2022-05-01 18:31:03 +02:00
if ( $ discount_val != 0 && $ einzel && $ menge ) {
my $ discount_eur = $ discount_val ;
2021-12-30 12:05:56 +01:00
#if int08 != 1 alias €
2022-05-01 18:31:03 +02:00
$ discount_eur = $ einzel * $ menge * $ discount_val / 100 if ( $ ctpos - > { int08 } != 1 ) ;
$ total = $ einzel * $ menge - $ discount_eur ;
2021-12-30 12:05:56 +01:00
} elsif ( $ einzel && $ menge ) {
2022-04-26 20:57:13 +02:00
$ total = $ einzel * $ menge ;
2021-12-30 12:05:56 +01:00
}
my $ sprit_price = 0 ;
$ sprit_price = $ ctpos - > { int26 } * 0.3 if ( $ ctpos - > { int26 } != 0 ) ;
2022-04-26 20:57:13 +02:00
$ sprit_price -= $ total ;
2021-12-30 12:05:56 +01:00
$ sprit_price = sprintf ( '%.2f' , $ sprit_price ) ;
$ sprit_price =~ s/\./,/ ;
2022-10-31 08:11:53 +01:00
$ sprit_price = "" ;
2021-12-30 12:05:56 +01:00
return $ sprit_price ;
}
2022-05-01 18:31:03 +02:00
#computes article position price and rabatt
2021-12-30 12:05:56 +01:00
sub price2calc {
my $ self = shift ;
my $ ctpos = shift ;
2022-04-26 20:57:13 +02:00
my $ total = 0 ;
2022-05-11 19:01:13 +02:00
my $ discount = "" ;
2022-05-04 08:02:59 +02:00
my $ einzel = $ ctpos - > { int02 } || 0 ;
my $ menge = $ ctpos - > { int03 } || 0 ;
2022-05-01 18:31:03 +02:00
my $ discount_val = $ ctpos - > { int07 } || 0 ;
if ( $ discount_val != 0 && $ einzel && $ menge ) {
my $ discount_eur = $ discount_val ;
2021-12-30 12:05:56 +01:00
#if int08 != 1 alias €
2022-05-04 08:02:59 +02:00
$ discount_eur = $ einzel * $ menge * $ discount_val / 100 if ( ! $ ctpos - > { int08 } || $ ctpos - > { int08 } != 1 ) ;
2022-05-01 18:31:03 +02:00
$ total = $ einzel * $ menge - $ discount_eur ;
2021-12-30 12:05:56 +01:00
} elsif ( $ einzel && $ menge ) {
2022-04-26 20:57:13 +02:00
$ total = $ einzel * $ menge ;
2021-12-30 12:05:56 +01:00
}
2022-09-16 16:33:52 +02:00
$ total = $ total * $ ctpos - > { int01 } if ( $ ctpos - > { int01 } ) ;
2021-12-30 12:05:56 +01:00
if ( $ ctpos - > { int07 } && $ ctpos - > { int07 } > 0 && $ menge > 0 ) {
2022-05-01 18:31:03 +02:00
$ discount = "-" . $ ctpos - > { int07 } ;
2022-05-04 08:02:59 +02:00
if ( $ ctpos - > { int08 } && $ ctpos - > { int08 } == 1 ) {
2022-05-01 18:31:03 +02:00
$ discount . = " €" ;
} else {
$ discount =~ s/\.00// ;
$ discount . = " %" ;
}
}
return ( $ total , $ discount ) ;
}
2022-10-18 20:15:11 +02:00
#computes operator invoices for accounting
sub operator_accounting2calc {
my $ self = shift ;
my $ varenv = shift ;
my $ ctpos = shift ; #client invoices
my $ ctf = shift ; #Operator-Faktura config
2022-10-31 08:11:53 +01:00
my $ tplf = $ dbt - > get_tpl ( $ dbh , "196" ) ; #Operator-Faktura
2022-10-18 20:15:11 +02:00
my @ tplf_order = split /,/ , $ tplf - > { tpl_order } ;
#returned values
my $ oac = {
int01 = > 0 ,
int02 = > 0 ,
int93 = > 0 ,
2022-10-31 08:11:53 +01:00
int94 = > 0 ,
int95 = > 0 ,
int96 = > 0 ,
int97 = > 0 ,
int98 = > 0 ,
int99 = > 0 ,
int100 = > 0 ,
2022-10-18 20:15:11 +02:00
} ;
foreach ( @ tplf_order ) {
my ( $ key , $ val , $ size ) = split /=/ , $ _ ;
if ( $ key =~ /int/ ) {
2023-05-05 07:30:00 +02:00
my $ invoice_brutto = 0 ;
if ( $ key eq "int01" && $ ctpos - > { int01 } ) {
$ invoice_brutto = $ ctpos - > { int01 } ;
#substract Fibu Gebühren like Rücklastschrift or Mahnung
$ invoice_brutto = $ ctpos - > { int01 } - $ ctpos - > { int08 } if ( $ ctpos - > { int08 } && $ ctpos - > { int08 } > 0 ) ;
$ oac - > { int99 } = $ invoice_brutto ;
#invoice capture netto
$ oac - > { int01 } = $ invoice_brutto / 119 * 100 ;
}
2022-12-02 07:25:27 +01:00
$ oac - > { int01 } = sprintf ( '%.2f' , $ oac - > { int01 } ) ;
2022-11-06 18:45:59 +01:00
2023-05-05 07:30:00 +02:00
if ( $ ctpos - > { state } =~ /Lastschrift|Überweisung/ ) {
2022-11-16 21:22:00 +01:00
$ oac - > { int93 } = $ oac - > { int01 } / 100 * $ ctf - > { $ key } if ( $ key eq "int01" ) ; #7,5%
2022-11-06 18:45:59 +01:00
$ oac - > { int93 } = sprintf ( '%.3f' , $ oac - > { int93 } ) ;
2022-10-31 08:11:53 +01:00
$ oac - > { int98 } = $ oac - > { int93 } * 0.19 if ( $ oac - > { int93 } ) ; #UmSt auf 7,5%
2022-11-06 18:45:59 +01:00
$ oac - > { int98 } = sprintf ( '%.3f' , $ oac - > { int98 } ) ;
$ oac - > { int94 } = $ oac - > { int01 } / 100 * $ ctf - > { $ key } * - 1 if ( $ key eq "int02" ) ; #po Disagio %
$ oac - > { int94 } = sprintf ( '%.3f' , $ oac - > { int94 } ) ;
$ oac - > { int95 } = $ ctf - > { $ key } * - 1 if ( $ key eq "int04" ) ; #po Trans
$ oac - > { int95 } = sprintf ( '%.3f' , $ oac - > { int95 } ) ;
$ oac - > { int96 } = $ ctf - > { $ key } * - 1 if ( $ key eq "int06" ) ; #po Zahlungsmeldung
$ oac - > { int96 } = sprintf ( '%.3f' , $ oac - > { int96 } ) ;
2022-10-31 08:11:53 +01:00
$ oac - > { int97 } = 0 ;
2022-10-18 20:15:11 +02:00
}
if ( $ ctpos - > { state } =~ /Kreditkarte/ ) {
2022-11-16 21:22:00 +01:00
$ oac - > { int93 } = $ oac - > { int01 } / 100 * $ ctf - > { $ key } if ( $ key eq "int01" ) ; #7,5%
2022-11-06 18:45:59 +01:00
$ oac - > { int93 } = sprintf ( '%.3f' , $ oac - > { int93 } ) ;
2022-10-31 08:11:53 +01:00
$ oac - > { int98 } = $ oac - > { int93 } * 0.19 if ( $ oac - > { int93 } ) ; #UmSt auf 7,5%
2022-11-06 18:45:59 +01:00
$ oac - > { int98 } = sprintf ( '%.3f' , $ oac - > { int98 } ) ;
$ oac - > { int94 } = $ oac - > { int01 } / 100 * $ ctf - > { $ key } * - 1 if ( $ key eq "int03" ) ; #po Disagio %
$ oac - > { int94 } = sprintf ( '%.3f' , $ oac - > { int94 } ) ;
$ oac - > { int95 } = $ ctf - > { $ key } * - 1 if ( $ key eq "int05" ) ; #po Trans
$ oac - > { int95 } = sprintf ( '%.3f' , $ oac - > { int95 } ) ;
$ oac - > { int96 } = $ ctf - > { $ key } * - 1 if ( $ key eq "int06" ) ; #po Zahlungsmeldung
$ oac - > { int96 } = sprintf ( '%.3f' , $ oac - > { int96 } ) ;
$ oac - > { int97 } = $ ctf - > { $ key } * - 1 if ( $ key eq "int07" ) ; #po CC Zuordnung
$ oac - > { int97 } = sprintf ( '%.3f' , $ oac - > { int97 } ) ;
2022-10-18 20:15:11 +02:00
}
2022-10-31 08:11:53 +01:00
#operator accounting
2022-11-06 18:45:59 +01:00
$ oac - > { int02 } = $ oac - > { int01 } + $ oac - > { int94 } + $ oac - > { int95 } + $ oac - > { int96 } + $ oac - > { int97 } ;
$ oac - > { int02 } = sprintf ( '%.3f' , $ oac - > { int02 } ) ;
#operator invoice
2022-11-28 18:28:06 +01:00
#$oac->{int100} = $oac->{int93} + $oac->{int98};#brutto
$ oac - > { int100 } = $ oac - > { int93 } ; #netto
2022-11-06 18:45:59 +01:00
$ oac - > { int100 } = sprintf ( '%.3f' , $ oac - > { int100 } ) ;
2022-10-18 20:15:11 +02:00
}
}
return $ oac ;
}
2021-12-30 12:05:56 +01:00
1 ;