Adding prepaid payment methode and prepaid accounting with api interface

This commit is contained in:
ragu 2024-01-09 07:27:19 +01:00
parent da31898968
commit 2dc53f4087
22 changed files with 815 additions and 236 deletions

View file

@ -930,8 +930,7 @@ sub booking_request(){
if($ct_bike->{barcode} && $ct_tariff->{barcode}){
my $ctt = {};
my $rentable_check=0;
$rentable_check = $bw->isuser_rentable($auth,$varenv);
$rentable_check = $bw->isuser_rentable($auth,$varenv);
$bw->log("booking_request isuser_rentable:",$rentable_check,"");
if($rentable_check == 2){
@ -957,7 +956,38 @@ sub booking_request(){
#if invoice exist
if($ctt->{c_id}){
#if payment-type prepaid, then check whether balance positive
my $sum_balance = 0;
if($auth->{int03} && $auth->{int03} == 3){
my $dbh_primary = $dbt->dbconnect_extern($dbt->{primary}->{sharee_primary}->{database}->{dbname});
my $adref = {
table => "contentadr",
fetch => "one",
c_id => "$auth->{c_id}",
};
my $auth_prim = $dbt->fetch_tablerecord($dbh_primary,$adref);
#get prepaid balance, like in users App RentalData
#collects all open (not captured) positions incl. primary-prepaid to get saldo
my ($cttpos,$operator_hash) = $self->user_rentals_history($q,$auth_prim,0,1);
foreach my $id (keys(%$cttpos)){
if($cttpos->{$id}->{int35} && $cttpos->{$id}->{start_time} && $cttpos->{$id}->{end_time}){
my $pricing = { total_price => 0 };
($pricing, my $counting) = $pri->counting_rental($varenv,$cttpos->{$id});
$sum_balance += $pricing->{total_price};
}else{
my $total_price = 0;
($total_price,my $rabatt) = $pri->price2calc($cttpos->{$id});
#prepaid * -1
$total_price *= -1 if($cttpos->{$id}->{template_id} && $cttpos->{$id}->{template_id} == 219);
$sum_balance += $total_price;
}
}
$bw->log("booking_request prepaid balance sum: $sum_balance, userID: $auth->{c_id} ",$sum_balance,"");
}
#Rental is only permitted if sum_balance <= 0 (in primary prepaid context positive)
if($sum_balance <= 1){
#2 = "requested"
$pos_id = $dbt->insert_pos($dbh,$ctt->{c_id},$ct_bike,$ct_station,$auth,$ct_tariff,$now_dt,$bike,"2",$owner,$sig_book);
$bw->log("booking_request insert_pos:",$pos_id,"");
@ -1009,6 +1039,10 @@ sub booking_request(){
$response_state="Failure 1007: booking request fails";
$response_text="Entschuldigung, es ist ein Fehler aufgetreten. Bitte kontaktieren Sie unsere hotline damit wir das Problem lösen können";
}
}else{
$response_state="Failure 1593: rental is prohibited because of prepaid balance - $sum_balance";
$response_text="Bitte überprüfen Sie Ihren Prepaid/Vorkasse Kontostand, aktuell: - $sum_balance €. Nur bei positiven Kontostand können wir das Mietradsystem für Sie freischalten.";
}#end if $sum_balance
}
}elsif($rentable_check == 1){
$response_state="Failure 1006: rental is prohibited because of user profil";
@ -1641,6 +1675,7 @@ sub user_rentals_history(){
my $q = shift || "";
my $auth = shift;
my $daily = shift || 0;
my $allop = shift || 0;
my %varenv = $cf->envonline();
my $today = strftime("%Y-%m-%d",localtime(time));
@ -1662,23 +1697,31 @@ sub user_rentals_history(){
my $month = $q->param('month');
$pref->{mtime} = ">=::(now() - interval '$month month')";
}else{
#2021-06-18, list only postions which are not invoiced (Form Buchungsdaten)
#$pref->{close_time} = "is::null";
$pref->{'ct.state'} = "is::null";
$pref->{'ct.int14'} = "is::null";
#2024-01-08 list not succesfully captured positions by also using ct.int14 >= 1
$pref->{'ct.state'} = "is::null";# OR ct.int14 >= 1
#$pref->{'ct.int14'} = "is::null";
}
if($varenv{dbname} eq $dbt->{primary}->{sharee_primary}->{database}->{dbname}){
if($allop || $varenv{dbname} eq $dbt->{primary}->{sharee_primary}->{database}->{dbname}){
#$bw->log("user_rentals_history userID: $auth->{c_id} with operators",$auth->{txt17},"");
if($auth->{txt17}){
if($auth->{txt17} =~ /\w\s\w/){
%operator_hash = map { $_ => "$dbt->{operator}{$_}->{operatorApp}" } split(/\s+/,$auth->{txt17});
}else{
$operator_hash{$auth->{txt17}} = "$dbt->{operator}{$auth->{txt17}}->{operatorApp}";
}
#adding primary to get prepaid
#$operator_hash{sharee_primary} = "$dbt->{primary}{sharee_primary}->{primaryApp}";
foreach my $sharee_operator (keys (%operator_hash)){
my $dbh_operator = $dbt->dbconnect_extern("$sharee_operator");
my $cttpos = $dbt->collect_post($dbh_operator,$pref);
$record_all = { %$record_all, %$cttpos };
#$bw->log("operator_hash sharee_operator: $sharee_operator",$sharee_operator,"");
my $dbh_operator = "";
$dbh_operator = $dbt->dbconnect_extern("$sharee_operator");
if($dbh_operator){
my $cttpos = $dbt->collect_post($dbh_operator,$pref);
$record_all = { %$record_all, %$cttpos };
}
}
}
}else{
@ -1892,7 +1935,7 @@ sub bikes_available(){
#return list of occupied/requested bikes
my $adjust_freedtime = 0;
my $further_freedtime_available = 1;
my ($cttpos,$operator_hash) = $self->user_rentals_history($q,$auth,1);
my ($cttpos,$operator_hash) = $self->user_rentals_history($q,$auth,1,0);
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);
}
@ -2291,12 +2334,15 @@ sub stations_available(){
$record->{$id}->{txt06} =~ s/\s//g if($record->{$id}->{txt06});
if($record->{$id}->{txt06} && $record->{$id}->{txt06} =~ /\d+\.\d+\,\d+\.\d+/){
my $bike_count = 0;
my @bike_ids = ();
foreach my $b_id (keys (%$record_bikes)){
if($record->{$id}->{int04} == $record_bikes->{$b_id}->{int04}){
push @bike_ids,$dbt->{operator}->{$varenv->{dbname}}->{oprefix} . $record_bikes->{$b_id}->{barcode};
$bike_count++;
}
}
$return->{$id}->{bike_count} = "$bike_count";
$return->{$id}->{bike_ids} = [@bike_ids];
$return->{$id}->{authed} = "$authed";
$return->{$id}->{capacity} = "$record->{$id}->{int05}" || "1";
@ -2911,7 +2957,7 @@ sub auth_verify(){
#first, save operator array which are used
my %operator_hash = ();#local DB
#$bw->log("booking_request auth_verified by dbname $varenv{dbname}",$auth_primary->{c_id},"");
$bw->log("booking_request auth_verified by dbname $varenv{dbname}",$auth_primary->{c_id},"");
print FILE "booking_request auth_verified by dbname $varenv{dbname} | pri $auth_primary->{c_id}\n" if($debug);
if($auth_primary->{txt17} && $auth_primary->{txt17} =~ /\w\s\w/){#append DB's
@ -2940,7 +2986,7 @@ sub auth_verify(){
$update_primary->{txt26} = $q->escapeHTML($user_agent) if($user_agent);
}
#check prepaid account
#first prepaid account check (not save because without rental history)
if($auth_primary->{int03} == 3){
my $prepaidhash = { prepaid_total => 0 };
$prepaidhash = $pri->collect_prepaid($dbh_primary,$auth_primary) if($auth_primary->{c_id});
@ -2948,6 +2994,7 @@ sub auth_verify(){
my $vde = $auth_primary->{int12} || 1;
$update_primary->{int12} = $vde;
}
$bw->log("auth_verify booking_request prepaid check",$update_primary,"");
}
my $rows = $dbt->update_record($dbh_primary,$update_primary,$auth_primary);

View file

@ -71,7 +71,7 @@ my $response = {
apiserver => "$apiserver",
response => "$respreq",
uri_primary => "$dbt->{primary}->{sharee_primary}->{primaryApp}",
copri_version => "4.1.23.23",
copri_version => "4.1.23.24",
user_id => "",
authcookie => "",
new_authcoo => "0",

View file

@ -21,7 +21,6 @@ use XML::Simple qw(:strict);
use Lib::Config;
use Mod::DBtank;
use Mod::Basework;
use Mod::Shareework;
use Mod::APIfunc;
use Data::Dumper;
use Sys::Hostname;
@ -35,7 +34,6 @@ sub handler {
my $cf = new Config;
my $dbt = new DBtank;
my $bw = new Basework;
my $tk = new Shareework;
my $apif = new APIfunc;
my %varenv = $cf->envonline();
@ -46,6 +44,8 @@ sub handler {
my $user_agent = $q->user_agent();
my $dbh = "";
$bw->log("APIpayone request:\n--> user-agent '$user_agent'",$q,"");
if(1==1){
foreach(@keywords){
if(length($_) > 40 || length($q->param($_)) > 400){
@ -56,7 +56,6 @@ sub handler {
}
}
$bw->log("APIpayone request:\n--> user-agent '$user_agent'",$q,"");
print $q->header( -charset => 'ISO-8859-1' );
print "TSOK";
@ -73,10 +72,54 @@ sub handler {
my $update_adr = {
table => "contentadr",
pay_time => "now()",
#owner => $owner
pay_time => "now()",#just to see who changes at what time
};
#primary payonelink prepaid transaction-status
#TODO live tests if aid matches
if($q->param('aid') eq "55218"){
print FILE "TeilRad payonelink transaction on $dbt->{primary}->{sharee_primary}->{database}->{dbname}\n";
my $update_pos = {
table => "contenttranspos",
mtime => "now()",
owner_end => $owner,
};
my $pos_id = "";
foreach(@keywords){
my $val = $q->param($_);
$val = $q->escapeHTML("$val");
print FILE "$_=$val\n";
#reference keeps ct_id-pos_id
if($_ eq "reference" && $val =~ /\d+-(\d+)/){
$pos_id = $1;
}elsif($_ eq "txid"){
$update_pos->{txt15} = $val;
}elsif($_ eq "receivable"){
$update_pos->{int02} = $val;
}
}
if($q->param('txaction') eq "paid"){
$dbh = $dbt->dbconnect_extern($dbt->{primary}->{sharee_primary}->{database}->{dbname});
my $fetch_ctpos = {
table => "contenttranspos",
fetch => "one",
c_id => $pos_id,
};
my $ctpos = { c_id => 0 };
$ctpos = $dbt->fetch_tablerecord($dbh,$fetch_ctpos) if($pos_id);
$dbt->update_record($dbh,$update_pos,$ctpos) if($ctpos->{c_id});
print FILE Dumper($update_pos) . "\n";
}
}
#operator invoice transaction-status
else{
my $update_ctt = {
table => "contenttrans",
mtime => "now()",
@ -169,13 +212,14 @@ sub handler {
if(($update_adr->{int24} && $update_adr->{int24} > 0 || $ctadr->{int12} ne $update_adr->{int12}) && $ctadr->{c_id} > 0){
$dbt->update_record($dbh,$update_adr,$ctadr);
#update adr also on primary
my $dbh_primary = $dbt->dbconnect($dbt->{primary}->{sharee_primary}->{database}->{dbname});
my $dbh_primary = $dbt->dbconnect_extern($dbt->{primary}->{sharee_primary}->{database}->{dbname});
$dbt->update_record($dbh_primary,$update_adr,$ctadr);
print FILE Dumper($update_adr) . "\n";
}
}
}
}
close(FILE);
return Apache2::Const::OK;

View file

@ -3,7 +3,7 @@ package Mod::APIshareeio;
# SPDX-License-Identifier: AGPL-3.0-or-later
# Copyright (c) Rainer Gümpelein, TeilRad GmbH
#
#use lib qw(/var/www/copri-bike/shareeapp-sx/src);
#use lib qw(/var/www/copri-bike/shareeapp-primary/src);
#
use warnings;
use strict;
@ -22,6 +22,7 @@ use Mod::DBtank;
use Mod::Basework;
use Mod::Shareework;
use Mod::APIfunc;
use Mod::Pricing;
use Data::Dumper;
sub handler {
@ -58,6 +59,7 @@ sub handler {
open(FILE,">>$varenv{logdir}/APIshareeio.log") if($debug);
print FILE "\n*** $now_dt user-agent: '$user_agent' to syshost: $varenv{syshost}\n" if($debug);
print FILE "headers:\n" . Dumper(\%headers) . "\n" if($debug);
print FILE "<=== DUMP query\n " . Dumper($q) . "\n" if($debug);
print FILE "<=== DUMP postdata:\n " . Dumper($q->param('POSTDATA')) . "\n" if($debug);
@ -78,7 +80,7 @@ sub handler {
}
foreach(@keywords){
if(length($_) > 40 || length($q->param($_)) > 400){
if(length($_) > 40 || length($q->param($_)) > 900){
$response->{response_state} = "Failure 9000: amount of characters in $_ exceeds";
$bw->log("Failure 9000: amount of characters in $_ exceeds",$q,"");
my $jrout = $json->pretty->encode({shareeio => $response});
@ -88,10 +90,154 @@ sub handler {
}
}
#sig booking_update
#main
my $POSTDATA = $q->param('POSTDATA');
my $response_out = {};
$response_out = sig_booking_update($q,\%varenv,$response,$aowner);# sig json post
eval {
my $response_in = {};
$response_in = decode_json($POSTDATA) if($POSTDATA);
if($response_in->{data}->{rentalId}){
$response_out = sig_booking_update($q,\%varenv,$response,$aowner);#sig json post
}
#operator invoice capture request
if($response_in->{request} eq "capture_prepaid"){
$response = {
request => "$response_in->{request}",
response_state => "Init",
sum_paid => "0",
sum_prepaid_available => "0",
};
$response_out = srv_capture_prepaid($q,\%varenv,$response,$response_in,$aowner);
}
#operator payment balance alias p-saldo @all request
if($response_in->{request} eq "collect_prepaid_invoices"){
$response = {
request => "$response_in->{request}",
response_state => "Init",
};
$response_out = srv_collect_prepaid_invoices($q,\%varenv,$response,$response_in,$aowner);
}
};
if ($@){
print FILE "failure! can not decode POST json, POSTDATA:\n" . Dumper($q->param('POSTDATA')) . "\n" if($debug);
#warn $@;
print FILE "warn:" . $@ . "\n" if($debug);
$response_out->{response_state} = "Failure: can not decode POST json";
}
#end main eval
#sharee collect prepaid json api
sub srv_collect_prepaid_invoices {
my $q = shift;
my $varenv = shift;
my $response = shift || {};
my $response_in = shift || {};
my $aowner = shift || "";
my $dbt = new DBtank;
my $apif = new APIfunc;
my $pri = new Pricing;
my $dbh = "";
my $pref_ctt = {
table => "contenttrans",
fetch => "all",
keyfield => "int10",#userID
main_id => 300023,
template_id => 219,#prepaid tpl
state => "is::null",
close_time => "is::null",
};
$response_in->{userID} if($response_in->{userID});
my $ctt_prepaid = { };
$ctt_prepaid = $dbt->fetch_record($dbh,$pref_ctt);
foreach my $id (sort { $ctt_prepaid->{$a}->{c_id} <=> $ctt_prepaid->{$b}->{c_id} } keys (%$ctt_prepaid)){
my $ctadr = { c_id => $ctt_prepaid->{$id}->{int10} };
my $sum_prepaid_available = 0;
$sum_prepaid_available = $pri->primary_sum_prepaid($dbh,$ctadr,$ctt_prepaid);
$response->{users_prepaid_invoices}->{$id}->{invoiceID} = "$ctt_prepaid->{$id}->{c_id}";
$response->{users_prepaid_invoices}->{$id}->{userID} = "$ctt_prepaid->{$id}->{int10}";
$response->{users_prepaid_invoices}->{$id}->{sum_prepaid_available} = "$sum_prepaid_available";
}
$response->{response_state} = "Success: collect_prepaid_invoives";
return $response;
}#end collect_prepaid_invoices
#sharee capture payment json api
#host must be shareeapp-primary.copri.....
sub srv_capture_prepaid {
my $q = shift;
my $varenv = shift;
my $response = shift || {};
my $response_in = shift || {};
my $aowner = shift || "";
my $dbt = new DBtank;
my $apif = new APIfunc;
my $pri = new Pricing;
my $dbh = "";
my $debug=1;
if(looks_like_number($response_in->{userID}) && looks_like_number($response_in->{sum_paid})){
my $ctadr = { c_id => $response_in->{userID} };
my $invoice_reference = $q->escapeHTML($response_in->{invoice_reference}) || "error";
my $pref_ctt = {
table => "contenttrans",
fetch => "one",
main_id => 300023,
template_id => 219,#prepaid tpl
int10 => "$ctadr->{c_id}",
state => "is::null",
close_time => "is::null",
};
my $ctt_prepaid = { c_id => 0 };
$ctt_prepaid = $dbt->fetch_record($dbh,$pref_ctt);
if($ctt_prepaid->{c_id} > 0){
my $sum_prepaid_available = 0;
$sum_prepaid_available = $pri->primary_sum_prepaid($dbh,$ctadr,$ctt_prepaid);
$response->{sum_prepaid_available} = "$sum_prepaid_available";
if($sum_prepaid_available >= $response_in->{sum_paid}){
#pseudo part. not available in content
my $ct = {
c_id => 0,
barcode => 0,
ca_id => $ctadr->{c_id},
ct_id => $ctt_prepaid->{c_id},
int02 => "-$response_in->{sum_paid}",
txt01 => 'Operator prepaid capture',
int16 => 5,#fibumark for operator prepaid capture
template_id => 219,
};
#Gegenbuchung
my $cttpos = { c_id => 0 };
$cttpos->{c_id} = $dbt->insert_pos($dbh,$ctt_prepaid->{c_id},$ct,"",$ctadr,"","","$invoice_reference","0",$aowner,"");
if($cttpos->{c_id}){
$response->{sum_paid} = "$response_in->{sum_paid}";
$response->{response_state} = "Success: Prepaid capture ID $invoice_reference";
}else{
$response->{response_state} = "Failure: Prepaid capture";
}
}else{
$response->{response_state} = "Failure: Users Prepaid-Account not funded";
}
}else{
$response->{response_state} = "Failure: no Prepaid-Invoice available";
}
}else{
$response->{response_state} = "Failure: no userID defined";
}
return $response;
}#end capture_prepaid
#sig json api
sub sig_booking_update {

View file

@ -66,7 +66,6 @@ sub dbconnect_extern {
#$bw->log("dbconnect_extern call with instance_type:$instance_type and copri_instance:",$dbname,"");
#keep in mind, only one DB can be returned by this way
#while (my ($key, $value) = each %{ $self->{$instance_type} }) {
while (my ($key, $value) = each %{ $globalconf{$instance_type} }) {
if($key eq $dbname){
$bw->log("dbconnect_XX",$value->{database}->{dbname},"");
@ -686,7 +685,7 @@ sub collect_post(){
}
}elsif($key =~ /ct\.close_time|ct\.state|ct\.int14/ && $value){#used to get open invoices
if($key =~ /ct\.state/ && $value eq "null"){
$ct_where .= " and ($key $op $value OR $key = '')";
$ct_where .= " and ($key $op $value OR $key = '' OR ct.int14 >= 1)";
}else{
$ct_where .= " and $key $op $value";
}
@ -1624,7 +1623,7 @@ sub insert_contenttrans(){
$doc_name = "Prepaid Account" if($tpl_id == 219);
$owner="199" if(!$owner);
#keep in mind int10 will be mainly used by Prelogic and Printpreview, thats because we save it also
my $sth = $dbh->prepare("INSERT INTO contenttrans (ct_name,txt00,int10,txt02,txt01,txt03,txt06,txt07,txt08,txt10,txt11,owner,itime) VALUES('$invoice_nr','$doc_name','$ctadr->{c_id}','$ctadr->{txt02}','$ctadr->{txt01}','$ctadr->{txt03}','$ctadr->{txt06}','$ctadr->{txt07}','$ctadr->{txt08}','$ctadr->{txt10}','$ctadr->{txt11}','$owner','now()') RETURNING c_id");
my $sth = $dbh->prepare("INSERT INTO contenttrans (ct_name,txt00,int10,int03,txt02,txt01,txt03,txt06,txt07,txt08,txt10,txt11,owner,itime) VALUES('$invoice_nr','$doc_name','$ctadr->{c_id}','$ctadr->{int03}','$ctadr->{txt02}','$ctadr->{txt01}','$ctadr->{txt03}','$ctadr->{txt06}','$ctadr->{txt07}','$ctadr->{txt08}','$ctadr->{txt10}','$ctadr->{txt11}','$owner','now()') RETURNING c_id");
my $rows = $sth->execute();
my $last_id;

View file

@ -469,7 +469,11 @@ sub handler {
}
elsif($R::c_id && $R::ct_trans eq "remove_chk4rel"){
my $delete_key = "delete_trans";
$feedb->{message} = "failure::Datensatz wirklich löschen. ::?ct_trans=$delete_key\&exit_box2=1\&c_id=$R::c_id ::löschen";
if(looks_like_number($R::tpl_id4trans) && $R::tpl_id4trans == 219){
$feedb->{message} = "failure::Datensatz löschen ist für Prepaid-Account deaktiviert. Prepaid requests oder payments müssen erhalten bleiben.";
}else{
$feedb->{message} = "failure::Datensatz wirklich löschen. ::?ct_trans=$delete_key\&exit_box2=1\&c_id=$R::c_id ::löschen";
}
}
elsif($R::c_id && $R::ct_trans eq "delete_trans"){
$feedb = $pl->delete_content($node_meta,$R::c_id);
@ -780,7 +784,7 @@ sub handler {
#redirections
if($users_sharee->{c_id} && ($path =~ /$varenv{mandant}\/$varenv{profile}/ || $path =~ /$varenv{mandant}\/Account/)){
if($R::sharee_edit =~ /save_account/){
if($R::sharee_edit && $R::sharee_edit =~ /save_account/){
$returnwww =~ s/::/=/g if($returnwww && $returnwww =~ /success::\w+/);
($api_return,$users_sharee) = $apif->auth_verify($q,$coo,"");
$payable_check = $bw->isuser_rentable($users_sharee,\%varenv);
@ -807,7 +811,7 @@ sub handler {
exit 0;
}
elsif($payable_check && $payable_check == 2){
print redirect("$varenv{wwwhost}/$varenv{mandant}/Account/$varenv{accounting_3}?cum=2-$payable_check$session_and\&$returnwww");
print redirect("$varenv{wwwhost}/$varenv{mandant}/Account/$varenv{accounting_2}?cum=2-$payable_check$session_and\&$returnwww");
exit 0;
}
}elsif($path =~ /$varenv{mandant}\/$varenv{profile}/ && $referer !~ /failure=\w/){

View file

@ -10,7 +10,7 @@ use strict;
use warnings;
use POSIX;
use CGI;
use Digest::SHA qw(hmac_sha256_base64);
use Digest::SHA qw(hmac_sha256 hmac_sha256_base64);
use JSON;
my $json = JSON->new->allow_nonref;
use LWP::UserAgent;
@ -18,15 +18,15 @@ use URI::Encode;
my $uri_encode = URI::Encode->new( { encode_reserved => 1 } );
use Scalar::Util qw(looks_like_number);
use Lib::Config;
use Mod::Callib;
use Mod::DBtank;
use Mod::Basework;
use Mod::RPCshareeio;
use Data::Dumper;
my $q = new CGI;
my $cf = new Config;
my $cal = new Callib;
my $dbt = new DBtank;
my $rpcs = new RPCshareeio;
my $bw = new Basework;
@ -55,7 +55,7 @@ sub book_payment {
my $now_dt = strftime "%Y-%m-%d %H:%M:%S", localtime;
open(EMA, ">> $varenv->{logdir}/book_payment.log");
print EMA "\n*** $now_dt invoice pdf print c_id4trans:$R::c_id4trans\n" . Dumper($q) . "\n";
print EMA "\n*** $now_dt book_payment invoice c_id4trans:$R::c_id4trans\n" . Dumper($q) . "\n";
my $pref_ctt = {
table => "contenttrans",
@ -65,6 +65,12 @@ sub book_payment {
my $ctt = { c_id => 0 };
$ctt = $dbt->fetch_record($dbh,$pref_ctt) if($R::c_id4trans);
my $update_adr = {
table => "contentadr",
mtime => "now()",
owner => $users_dms->{u_id},
};
my $update_ctt = {
table => "contenttrans",
mtime => "now()",
@ -98,12 +104,14 @@ sub book_payment {
};
my $ctadr = { c_id => 0 };
$ctadr = $dbt->fetch_tablerecord($dbh,$pref_adr) if($ctt->{int10});
my $vde_on_fail = $ctadr->{int12} || 1;#keep last or set 1
print EMA "Used adr c_id:$ctadr->{c_id} by ctt.int10: $ctt->{int10}\n";
my $sum_paid = "null";
my $sum_operatorcredit = "null";
my $sumgeb_teil = "null";
my $sumgeb_bank = "null";
my $sum_prepaid = "null";
my $state = $R::state || "";
$update_ctt->{state} = "$state";
$update_ctt->{int14} = 2;#set OPOS
@ -113,24 +121,27 @@ sub book_payment {
$sum_paid =~ s/,/\./;
$update_ctt->{int01} = $sum_paid;
}
if($R::sum_operatorcredit){
$sum_operatorcredit = $R::sum_operatorcredit;
$sum_operatorcredit =~ s/,/\./;
$update_ctt->{int02} = $sum_operatorcredit;
$update_ctt->{int14} = "null";
}
if($R::sumgeb_bank){
$sumgeb_bank = $R::sumgeb_bank;
$sumgeb_bank =~ s/,/\./;
$update_ctt->{int07} = $sumgeb_bank;
}
if($R::sumgeb_teil){
$sumgeb_teil = $R::sumgeb_teil;
$sumgeb_teil =~ s/,/\./;
$update_ctt->{int08} = $sumgeb_teil;
}
if($R::sumgeb_bank){
$sumgeb_bank = $R::sumgeb_bank;
$sumgeb_bank =~ s/,/\./;
$update_ctt->{int07} = $sumgeb_bank;
#maybe, we don't use it
if($R::sum_prepaid){
$sum_prepaid = $R::sum_prepaid;
$sum_prepaid =~ s/,/\./;
#$update_ctt->{int09} = $sum_prepaid;
}
$feedb->{u_rows} = $dbt->update_record($dbh,$update_ctt,$ctt);
@ -187,6 +198,31 @@ sub book_payment {
$update_ctt->{pay_time} = "now()";
$feedb->{u_rows} = $dbt->update_record($dbh,$update_ctt,$ctt);
}
elsif($state eq "Prepaid" && $ctadr->{c_id}){
#APIshareeio APIcall
my $shareeio_json = {
request => "capture_prepaid",
userID => "$ctadr->{c_id}",
sum_paid => "$update_ctt->{int01}",
invoice_reference => "$dbt->{operator}->{$varenv->{dbname}}->{oprefix}-$ctt->{c_id}-$ctt->{ct_name}",
};
my $response_in = {};
$response_in = $rpcs->request_shareeio($varenv,$dbh,$ctadr,$shareeio_json);
if($response_in->{shareeio}->{response_state} =~ /Success/i){
$update_ctt->{int14} = "null";
$update_ctt->{pay_time} = "now()";
$update_adr->{int12} = "null";
}else{
$update_adr->{int12} = $vde_on_fail;#Vde
}
$update_ctt->{txt28} = $now_dt . " $state\n" . $response_in->{shareeio}->{response_state} . "\n\n" . $ctt->{txt28};
$feedb->{u_rows} = $dbt->update_record($dbh,$update_ctt,$ctt);
$dbt->update_record($dbh,$update_adr,$ctadr);
my $dbh_primary = $dbt->dbconnect_extern($dbt->{primary}->{sharee_primary}->{database}->{dbname});
$dbt->update_record($dbh_primary,$update_adr,$ctadr);
}
$ctt = $dbt->fetch_record($dbh,$pref_ctt);#re-read values
@ -931,14 +967,15 @@ sub rpc {
print FILE Dumper($update_adr) . "\n" if($debug);
#2023-04-11 set it global by update adr also on primary
#disabled, because isuser_rentable will be only used by operator rental
#my $dbh_primary = $dbt->dbconnect($dbt->{primary}->{sharee_primary}->{database}->{dbname});
#$dbt->update_record($dbh_primary,$update_adr,$ctadr);
#2024-01-08 enabled again, also done in APIpayone after payone feedback
my $dbh_primary = $dbt->dbconnect_extern($dbt->{primary}->{sharee_primary}->{database}->{dbname});
$dbt->update_record($dbh_primary,$update_adr,$ctadr);
}
$dbt->update_record($dbh,$update_ctt,$ctt) if($ctt->{c_id} > 0);
close(FILE) if($debug);
return $payoneret;
}
}#end rpc
#SEPA PDFGenerator
sub pdfmandat {
@ -1091,7 +1128,7 @@ sub payone_capture {
return ($retval,$return_text);
}
#Request "payone-link"
#request "payone-link"
sub generate_payonelink {
my $self = shift;
my $varenv = shift;
@ -1100,17 +1137,18 @@ sub generate_payonelink {
my $prepaid_amount = shift || 0;
my $owner = shift || 0;
my $payonelink_conf = $dbt->{payonelink_conf} || {};
my $ret_json = {};
my $response_in = {};
my $feedb = { message => "" };
my $dbh = "";
my $now_dt = strftime "%Y-%m-%d %H:%M:%S", localtime;
open(FILE,">>$varenv->{logdir}/payonelink.log");
print FILE "\n*** $now_dt 'generate_payonelink' ctadr:$ctadr->{c_id}|$ctadr->{txt08}\n";
$prepaid_amount =~ s/,/\./;
my $prepaid_amount2 = 0;
$prepaid_amount2 = $1 if($prepaid_amount =~ /^(\d+)/);
$prepaid_amount2 = $1 if($prepaid_amount =~ /(\d+\.\d{2})/ || $prepaid_amount =~ /(\d+)/);
if($ctadr->{c_id} && $prepaidhash->{prepaid_id} && $prepaid_amount2 >= 5){
@ -1118,94 +1156,123 @@ sub generate_payonelink {
(my $firstname,$lastname) = split(/\s+/,$ctadr->{txt01}) if($ctadr->{txt01} =~ /\w\s+\w/i);
chomp($firstname);
chomp($lastname);
my $city = $ctadr->{txt06};
(my $zip, $city) = split(/\s+/,$ctadr->{txt06}) if($ctadr->{txt06} =~ /[\w\d]\s+[\w\d]/i);
chomp($zip);
chomp($city);
my $firstName = Encode::encode('utf-8', Encode::decode('iso-8859-1', $firstname));
my $lastName = Encode::encode('utf-8', Encode::decode('iso-8859-1', $lastname));
my $email = Encode::encode('utf-8', Encode::decode('iso-8859-1', $ctadr->{txt08}));
my $currency = "EUR";
my $amount = 0;
$amount = $prepaid_amount2 * 100 if($prepaid_amount2);
my $pay_request = {
my $reference = Encode::encode('utf-8', Encode::decode('iso-8859-1', $prepaidhash->{prepaid_id}));
#my $epoche = time();
#$reference = "1_$epoche";#For tests generate always new reference!
my $description = Encode::encode('utf-8', Encode::decode('iso-8859-1', $prepaidhash->{description}));
my $pay_json = {
currency => "$currency",
intent => 'authorization',
active => 1,
paymentMethods => ['visa', 'mastercard', 'paypal', 'sofort', 'paydirekt', 'giropay', 'sepa'],
userId => "$ctadr->{c_id}",
email => "$ctadr->{txt08}",
firstName => "$firstname",
lastName => "$lastname",
country => "$ctadr->{txt10}",
language => "de_DE",
reference => "$prepaidhash->{prepaid_id}",
merchantId => "$dbt->{payonelink_conf}->{merchantId}",
accountId => "$dbt->{payonelink_conf}->{accountId}",
portalId => "$dbt->{payonelink_conf}->{portalId}",
userId => "$ctadr->{c_id}",
mode => "$dbt->{payonelink_conf}->{mode}",
notifyUrl => "$dbt->{payonelink_conf}->{notifyUrl}",
description => "Ihr vorbereiteter sharee.bike Prepaid/Vorkasse Auftrag",
paymentMethods => ['visa', 'mastercard', 'giropay', 'sepa'],
reference => "$reference",
shoppingCart => [{
type => "prepaid",
type => "goods",
number => "$prepaidhash->{number}",
description => "$description",
price => $amount,
quantity => 1,
description => "$prepaidhash->{description}",
vatRate => 19
}]
}],
"billing" => {
firstName => "$firstName",
lastName => "$lastName",
email => "$email",
country => "DE"
}
};
#paymentMethods => ['visa', 'mastercard', 'paypal', 'sofort', 'paydirekt', 'giropay', 'sepa'],
my $datahash = "$pay_json->{merchantId}$pay_json->{accountId}$pay_json->{portalId}$pay_json->{mode}$pay_json->{reference}$amount$currency";
my $paytoken = hmac_sha256_base64($datahash, $dbt->{payonelink_conf}->{portalKey});
# Fix padding of Base64 digests
while (length($paytoken) % 4) {
$paytoken .= '=';
}
print FILE "datahash: $datahash, $dbt->{payonelink_conf}->{portalKey}\n";
print FILE "paytoken: $paytoken\n";
my $rest_json = encode_json(\%{ $pay_json });
print FILE "rest_json:\n" . Dumper($rest_json) . "\n";
($ret_json, my $ret_status) = $self->rpcpayone_postjson("$paytoken","$rest_json");
my $update_pos = {
table => "contenttranspos",
ca_id => "$ctadr->{c_id}",
mtime => "now()",
owner => "$owner",
};
my $datahash = $payonelink_conf->{merchantId} . $payonelink_conf->{accountId} . $payonelink_conf->{portalId} . $payonelink_conf->{mode} . $prepaidhash->{prepaid_id} . $amount . $currency;
my $paytoken = hmac_sha256_base64($datahash, $payonelink_conf->{portalKey});
#my $whole_json = { %$payonelink_conf, %$pay_request};
#my $rest_json = encode_json($whole_json);
my $rest_json = encode_json(\%{ $pay_request });
print FILE "rest_json:\n" . Dumper($rest_json) . "\n";
($ret_json, my $ret_status) = $self->rpc_postjson($paytoken,$rest_json);
eval {
$response_in = decode_json($ret_json);
print FILE "<--- payonelink response_in with status_line: $ret_status\n" . Dumper($response_in);
print FILE $response_in->{link} . "\n";
$update_pos->{txt30} = $response_in->{link};
print FILE $ret_json . "\n";
#expecting something like this:
#return "https://onelink.pay1.de/p/YNEVNS4N1N5JXTFLYPMQJ5PVADEEZ0UL?lang=de_DE";
};
if ($@){
print FILE "<--- failure payonelink raw response_in with status_line: $ret_status\n" . Dumper($ret_json) . "\n";
#warn $@;
print FILE "warn:" . $@ . "\n";
}
}else{
$update_pos->{txt25} = "$prepaidhash->{response_log}\n- $ret_status";
my $ctpos = { c_id => $prepaidhash->{number} };
my $rows = $dbt->update_record($dbh,$update_pos,$ctpos) if($ctpos->{c_id});
my $cms_message_key = "email-payonelink";
if(!$varenv->{cms}->{$cms_message_key}->{txt}){
$feedb->{message} = "failure::Achtung, '$cms_message_key' ist nicht vorhanden. Es wurde keine eMail versandt!";
}elsif($ctpos->{c_id}){
system("$dbt->{copri_conf}->{basedir}/$varenv->{syshost}/src/scripts/mailTransportcms.pl '$varenv->{syshost}' 'send_payonelink' '$ctadr->{c_id}' '$ctpos->{c_id}' '' '$cms_message_key' ''");
}
}#end if($ctadr->{c_id} && $prepaidhash->{prepaid_id} && $prepaid_amount2 >= 5)
else{
$ret_json = "failure:: $ctadr->{c_id} && $prepaidhash->{prepaid_id} && $prepaid_amount2 >= 5";
}
close FILE;
return $ret_json;
}#end Request "send_payone_link"
}#end generate_payonelink
#JSON POST to onelink
sub rpc_postjson {
#request JSON POST to onelink
sub rpcpayone_postjson {
my $self = shift;
my $paytoken = shift;
my $rest_json = shift || "";
my $api_file = "/var/www/copri4/shareeconf/apikeys.cfg";
my $aconf = Config::General->new($api_file);
my %apikeyconf = $aconf->getall;
my $ua = LWP::UserAgent->new(
ssl_opts => {
SSL_version => 'TLSv12:!SSLv2:!SSLv3:!TLSv1:!TLSv11',
}
);
$ua->agent("sharee payone jsonPOST API");
$ua->agent("sharee payonelink POST API");
my $bytes = 100000;
$ua->max_size( $bytes );
$ua->default_header( 'Authorization' => "payone-hmac-sha256 $paytoken" );
print Dumper($ua);
#print Dumper($ua);
#local TEST
my $endpoint = "https://shareeapp-fr01.copri-bike.de/APIvelo";
#my $endpoint = "https://onelink.pay1.de/api/v1/payment-links/";
#local tests
#my $endpoint = "https://shareeapp-fr01.copri-bike.de/APIvelo";
my $endpoint = "https://onelink.pay1.de/api/v1/payment-links/";
my $req = HTTP::Request->new(POST => "$endpoint");
$req->content_type('application/json');

View file

@ -3,9 +3,8 @@ package Prelib;
# SPDX-License-Identifier: AGPL-3.0-or-later
# Copyright (c) Rainer Gümpelein, TeilRad GmbH
#
#migrate some methodes form Prelogic and Premain to here
#defined methodes are available for web-app and backend
#this module holds some basic data management methodes
#
use strict;
use warnings;
use POSIX;
@ -114,7 +113,7 @@ sub prepaid_request {
};
$cttpos->{c_id} = $dbt->insert_pos($dbh,$ctt_prepaid->{c_id},$ct,"",$ctadr,"","","","0",$owner,"");
$dbt->update_one($dbh,{table => 'contenttranspos',c_id => $cttpos->{c_id}},"barcode = $cttpos->{c_id},ct_name = '$cttpos->{c_id}'");
$dbt->update_one($dbh,{table => 'contenttranspos',c_id => $cttpos->{c_id}},"barcode = $cttpos->{c_id},ct_name = '$ctt_prepaid->{c_id}-$cttpos->{c_id}'");
$feedb->{prepaid_id} = $ctt_prepaid->{c_id} . "-" . $cttpos->{c_id};
}
@ -858,20 +857,6 @@ sub save_contenttranspos {
};
if($ctpos->{c_id}){
$u_rows += $dbt->update_record($dbh,$update_pos,$ctpos);
#prepaid account Vde management by booking prepaid amount
if($R::tpl_id4trans && $R::tpl_id4trans == 219){
my $update_adr = {
table => "contentadr",
owner => $owner,
mtime => "now()",
c_id => $ctpos->{ca_id},
int12 => "0",
};
my $ctadr = { c_id => $ctpos->{ca_id} };
$u_rows += $dbt->update_record($dbh,$update_adr,$ctadr);#check int12=0 update
#$dbt->update_one($dbh,$update_adr,"int12=0");#Vde
$dbt->update_operatorsloop($varenv{dbname},$ctadr->{c_id},"update");
}
}else{
$feedb->{message} = "failure::Fehler 1, Änderung abgelehnt da Rechnung bereits gebucht";
}
@ -895,7 +880,27 @@ sub delete_contenttranspos {
my $feedb = { d_rows => 0,
message => "",
};
$feedb->{d_rows} = $dbt->delete_content($dbh,"contenttranspos",$c_id);
#prepaid pos check
my $pref = {
table => "contenttrans",
table_pos => "contenttranspos",
fetch => "one",
template_id => "219",#prepaid tpl_id
c_id => $c_id,
int02 => ">=::1",
"ct.state" => "is::null",
};
my $ctpos = { c_id => 0 };
$ctpos = $dbt->collect_post($dbh,$pref) if($c_id);
#prefent deleting prepaid positions
if($ctpos->{c_id}){
$feedb->{message} = "failure::Datensatz löschen ist für Prepaid-Account deaktiviert. Prepaid payments müssen erhalten bleiben.";
}else{
$feedb->{d_rows} = $dbt->delete_content($dbh,"contenttranspos",$c_id);
}
return $feedb;
}#end delete_contenttranspos

View file

@ -44,51 +44,6 @@ sub round(){
return $rounded;
}
#collect prepaid
sub collect_prepaid {
my $self = shift;
my $dbh = shift;
my $ctadr = shift || {};
my $prepaidhash = {
prepaid_total => 0,
prepaid_id => 0,
};
if($ctadr->{c_id}){
my $posref = {
table => "contenttrans",
table_pos => "contenttranspos",
fetch => "all",
keyfield => "c_id",
ca_id => "$ctadr->{c_id}",
'ct.state' => "is::null",
'ct.close_time' => "is::null",
};
my $cttpos = { c_id => 0 };
$cttpos = $dbt->collect_post($dbh,$posref);
#TODO negative counting booked operator invoices
foreach my $id (sort { $cttpos->{$b}->{c_id} <=> $cttpos->{$a}->{c_id} } keys(%$cttpos)){
#print $cttpos->{$id}->{barcode} . ":" . $cttpos->{$id}->{int02},"<br>";
if($cttpos->{$id}->{barcode} && $cttpos->{$id}->{int02} == 0){
$prepaidhash->{prepaid_id} = $cttpos->{$id}->{ct_id} . "-" . $cttpos->{$id}->{c_id};
$prepaidhash->{number} = $cttpos->{$id}->{c_id};
$prepaidhash->{description} = $cttpos->{$id}->{txt01};
}
#if($cttpos->{$id}->{barcode} && $cttpos->{$id}->{int02} > 0){
# $prepaidhash->{prepay_id_payed} = $cttpos->{$id}->{int02};
#}
if($cttpos->{$id}->{int02} > 0){
$prepaidhash->{prepaid_total} += $cttpos->{$id}->{int02};
}
}
}
$bw->log("Pricing prepaidhash:",$prepaidhash,"");
return $prepaidhash;
}
#for one freed rental
#depends on operator, only 1 rental get freed_time
@ -381,7 +336,7 @@ sub counting_rental {
$return->{rentalog}->{used_methode} = "$used_methode";
$return->{rentalog}->{counting} = $counting;
$bw->log("Pricing counting_rental return:",$return,"");
#$bw->log("Pricing counting_rental return:",$return,"");
return ($return,$counting);
}#end counting_rental
@ -677,5 +632,103 @@ sub operator_accounting2calc {
return $oac;
}
#primary collect prepaid
sub collect_prepaid {
my $self = shift;
my $dbh = shift;
my $ctadr = shift || {};
my $prepaidhash = {
prepaid_total => 0,
prepaid_id => 0,
};
if($ctadr->{c_id}){
my $posref = {
table => "contenttrans",
table_pos => "contenttranspos",
fetch => "all",
keyfield => "c_id",
ca_id => "$ctadr->{c_id}",
'ct.state' => "is::null",
'ct.close_time' => "is::null",
};
my $cttpos = { c_id => 0 };
$cttpos = $dbt->collect_post($dbh,$posref);
foreach my $id (sort { $cttpos->{$b}->{c_id} <=> $cttpos->{$a}->{c_id} } keys(%$cttpos)){
#print $cttpos->{$id}->{barcode} . ":" . $cttpos->{$id}->{int02},"<br>";
if($cttpos->{$id}->{barcode} && $cttpos->{$id}->{int02} == 0){
$prepaidhash->{invoice_id} = $cttpos->{$id}->{ct_id};
$prepaidhash->{number} = $cttpos->{$id}->{c_id};
$prepaidhash->{prepaid_id} = $cttpos->{$id}->{ct_id} . "-" . $cttpos->{$id}->{c_id};#payone reference
$prepaidhash->{description} = $cttpos->{$id}->{txt01};
$prepaidhash->{response_log} = $cttpos->{$id}->{txt25};
$prepaidhash->{payone_link} = $cttpos->{$id}->{txt30};
if($cttpos->{$id}->{txt25} =~ /(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}) mailing/){
$prepaidhash->{mail_datetime} = $1;
$prepaidhash->{mail_datetime} = $lb->time4de($prepaidhash->{mail_datetime},"1");
}
}
if($cttpos->{$id}->{int02} && $cttpos->{$id}->{int02} != 0){
$prepaidhash->{prepaid_total} += $cttpos->{$id}->{int02};
}
}
if($prepaidhash->{invoice_id} && $ctadr->{int03} && $ctadr->{int03} == 3 && (!$ctadr->{int12} || $ctadr->{int12} != 2)){
my $update_adr = {
table => "contentadr",
ct_name => "Prepaid-$prepaidhash->{invoice_id}",
pay_time => "now()",#just to see who changes at what time
};
#for int12 vde update we need also open operator invoices to get saldo balance
#int12 => "1",
#if($prepaidhash->{prepaid_total} > 0){
#$update_adr->{int12} = "null";
#}else{
# $update_adr->{int12} = "1";
#}
$dbt->update_record($dbh,$update_adr,$ctadr);
$dbt->update_operatorsloop("",$ctadr->{c_id},"update");
}
}
$bw->log("Pricing prepaidhash:",$prepaidhash,"");
return $prepaidhash;
}#end collect prepaid
#sum of primary prepaid
sub primary_sum_prepaid {
my $self = shift;
my $dbh = shift;
my $auth = shift;
my $ctt = shift;
my $presum = 0;
#if($ctt->{int03} && $ctt->{int03} == 3){
#my $dbh_primary = $dbt->dbconnect_extern($dbt->{primary}->{sharee_primary}->{database}->{dbname});
my $pref = {
table => "contenttrans",
table_pos => "contenttranspos",
fetch => "all",
keyfield => "c_id",
ca_id => "$auth->{c_id}",
'ct.state' => "is::null",
};
my $prepaid_pos = { c_id => 0 };
$prepaid_pos = $dbt->collect_post($dbh,$pref) if($auth->{c_id});
foreach my $id (sort { $prepaid_pos->{$b}->{itime} cmp $prepaid_pos->{$a}->{itime} } keys(%$prepaid_pos)){
(my $preprice,my $rabatt) = $self->price2calc($prepaid_pos->{$id});
$presum += $preprice;
}
$presum = $self->round($presum);
$presum = sprintf('%.2f', $presum);
#}
return $presum;
}
1;

View file

@ -0,0 +1,106 @@
package RPCshareeio;
#
# SPDX-License-Identifier: AGPL-3.0-or-later
# Copyright (c) Rainer Gümpelein, TeilRad GmbH
#
#APIshareeio APIcall
#
#use lib "/var/www/copri-bike/shareedms-primary/src";
#
use strict;
use warnings;
use POSIX;
use CGI;
use Digest::SHA qw(hmac_sha256 hmac_sha256_base64);
use JSON;
my $json = JSON->new->allow_nonref;
use LWP::UserAgent;
use URI::Encode;
my $uri_encode = URI::Encode->new( { encode_reserved => 1 } );
use Scalar::Util qw(looks_like_number);
use Mod::DBtank;
use Mod::Basework;
use Data::Dumper;
my $q = new CGI;
my $dbt = new DBtank;
my $bw = new Basework;
sub new {
my $class = shift;
my $self = {};
bless($self,$class);
return $self;
}
#@all request with defined $shareeio_json
sub request_shareeio {
my $self = shift;
my $varenv = shift;
my $dbh = shift;
my $ctadr = shift || {};
my $shareeio_json = shift || { request => ""};
my $response_in = {};
my $now_dt = strftime "%Y-%m-%d %H:%M:%S", localtime;
open(EMA, ">> $varenv->{logdir}/RPCshareeio.log");
print EMA "\n*** $now_dt RPC $shareeio_json->{request}\n";
if($shareeio_json->{request}){
my $rest_json = encode_json(\%{ $shareeio_json });
print EMA "rest_json:\n" . Dumper($rest_json) . "\n";
my $ret_json = {};
($ret_json, my $ret_status) = $self->rpcsharee_postjson($rest_json);
eval {
$response_in = decode_json($ret_json);
print EMA "<--- success shareeio response_in: $ret_status\n" . Dumper($response_in) . "\n";
print EMA $ret_json . "\n";
};
if ($@){
print EMA "<--- failure shareeio raw response_in: $ret_status\n" . Dumper($ret_json) . "\n";
print EMA "warn:" . $@ . "\n";
$response_in->{shareeio}->{response_state} = "Failure: $ret_status";
}
}
close EMA;
return $response_in;
}
#request JSON POST to shareeio
sub rpcsharee_postjson {
my $self = shift;
my $rest_json = shift || "";
my $api_file = "/var/www/copri4/shareeconf/apikeys.cfg";
my $aconf = Config::General->new($api_file);
my %apikeyconf = $aconf->getall;
my $ua = LWP::UserAgent->new();
$ua->agent("RPCshareeio POST");
my $bytes = 100000;
$ua->max_size( $bytes );
$ua->default_header( 'SHAREE-API-KEY' => "$apikeyconf{shareeio}->{sharee_api_key}" );
#print Dumper($ua);
my $req = HTTP::Request->new(POST => "$apikeyconf{shareeio}->{endpoint}");
$req->content_type('application/json');
$req->content($rest_json);
my $res = $ua->request($req);
if ($res->is_success) {
#print $res->content;
#print $res->status_line, "\n";
return ($res->content, $res->status_line);
}else {
#print $res->status_line, "\n";
return ("", $res->status_line);
}
}
1;

View file

@ -3,9 +3,12 @@ package Shareework;
# SPDX-License-Identifier: AGPL-3.0-or-later
# Copyright (c) Rainer Gümpelein, TeilRad GmbH
#
#this module holds sharee app user-account management methods.
#some methods are also used by DMS Basedit
#
#disable for syntax check
#use lib qw(/var/www/copri-bike/shareeapp-primary/src);
#
use strict;
use warnings;
use POSIX;