Info : LCR mit Preisansage und Fallback

if pos ('01',callerString) = 1 then Distance := Mobile;

Hmm, fallen da jetzt nicht auch 0180er (und 0190er sofern es die noch gibt?) Nummern rein?

Gruß,
Tin
 
Hi,
also der beschriebene Fehler scheint wirklich nur zwischen 23 und 0 Uhr aufzutreten - wahrscheinlich würde er nicht auftreten wenn das Zeitfenster von billiger-telefonieren mit 23-24 Uhr definiert werden würde.
Was mich angeht kann ich damit leben - um die Zeit telefoniere ich sowiso fast nie...

Dann habe ich noch einen 2. kleinen Fehler: wenn ich meine vorwahl mitwähle wird diese zwar als Ortsgespräch erkannt - allerdings trotzdem nochmal dazugefügt - also habe ich sie doppelt.
Wenn ich das richtig lese ist die Zeile 84 dafür verantwortlich:
Code:
if Distance = local then pre := paramstr(2);
Ich vermute hier wird der paramstr(2), der meine an das agi übergebene Ortsvorwahl in die Variable pre kopiert.
In Zeile 69 wird dann der wählstring aus LCR+PRE erstellt.
Code:
writeln ( 'SET VARIABLE LCR ',lcr,pre);
Also müsste ich hier das PRE löschen. Dann gilt allerdings auch die Pflicht immer die Vorwahl zu wählen.
Die Zeile 79 währe dann damit auch überflüssig:
Code:
if callerString[1] <> '0' then Distance := local;

Schöner währe es wohl das PRE nur zu definieren wenn keine Vorwahl mitewählt wird. Also zeile 84 zu ändern in
Code:
if Distance = local "and callerString[1] <> '0' then pre := paramstr(2);
Nur kann ich kein Pascal und weiss nicht die richtige schreibweisse...

So - wenn ich nicht falschliege habe ich während des erstellens dieses Beitrags die Lösung gefunden :)
Programmieren ist doch einfacher als man denkt :-D

Gruß
Thorsten
 
Hi,
@Tin,
die 0180er und 0190 werden sowiso (egal was du für Call-by-call verwendest) AUSSCHLIESSLICH über deinen Netzbetreiber (Telekom) gewählt. Das ist leider so.
Ich fange diese Nummern sowiso im Dialplan ab und behandle diese seperat...

@DerDominic: Mist - während ich meinen letzten Beitrag geschrieben habe hast du schon wieder eine neue version rausgebraucht.... ich muss schneller schreiben üben :-D
Danke fürs schnelle Bugfixing.... (auch wenn der Doppelvorwahl-"Bug" noch vorhanden ist - da war ich ja zu spät mit der Meldung....)


Gruß
Thorsten
 
thorsten.gehrig schrieb:
Hi,
also der beschriebene Fehler scheint wirklich nur zwischen 23 und 0 Uhr aufzutreten - wahrscheinlich würde er nicht auftreten wenn das Zeitfenster von billiger-telefonieren mit 23-24 Uhr definiert werden würde.
Was mich angeht kann ich damit leben - um die Zeit telefoniere ich sowiso fast nie...
Rischdisch, ist ja auch schon geändert, sollte also nicht mehr vorkommen.

thorsten.gehrig schrieb:
Dann habe ich noch einen 2. kleinen Fehler: wenn ich meine vorwahl mitwähle wird diese zwar als Ortsgespräch erkannt - allerdings trotzdem nochmal dazugefügt - also habe ich sie doppelt.
Wenn ich das richtig lese ist die Zeile 84 dafür verantwortlich:
Guter Junge ;) genau so... hatte ich auch erhlich gesagt noch garnicht getestet ... bin halt doch ne faule Sau !

Ja TinTin, Du hast Recht, da wird brutal nicht zwischen 0190 017x 016x unterschieden, ist ja natürlich noch erweiterbar, halt ich mal vor für das nächste Mal, wenn sich noch einiges angesammelt hat.
Gibt sicherlich noch einige Sonderfälle.

Gruß
Dominic
 
Hi Dominic,
gerade hab ich telefoniert - und mich gewundert dass mein Dialplan über GMX rausgeht (dass macht er wenn ein Minutenpreis von über einem cent ermittelt wird) - also hab ich mir die Tarifübersicht angeschaut und festgestellt:
das Downloadscript lädt immer
zeitraum=wt
was für Werktag steht. Wenn man sein cron-script ändert auf
zeitraum=we
wird die richtige, wochenend-tabelle geladen. Ich mache das jetzt mal manuell. Sicherlich gibt es aber auch script-befehle mit denen man feststellen kann ob wochenende ist oder nicht - und die entsprechende tarifübersicht zu laden...

Gruß
Thorsten
 
Hi
und schon hab ich was gefunden!
mein script sieht jetzt so aus
Code:
#!/bin/bash

GREP=/usr/grep
WERKTAG=1
today=`date +%d.%m.`
year=`date +%Y`

if $GREP $today /etc/feiertag/feiertag-fest > /dev/null
then
    WERKTAG=0
fi
if $GREP $today /etc/feiertag/feiertag-$year > /dev/null
then
    WERKTAG=0
fi
if date +%a |$GREP Sun >/dev/null 
then
    WERKTAG=0
fi
										
if [ $WERKTAG = 0 ]
then
    #Wochenende
    wget 'http://www.billiger-telefonieren.de/tarife/tagesuebersicht.php3?maxanzeige=2&inlandszone%5B%5D=Ort&inlandszone%5B%5D=Fern&inlandszone%5B%5D=E2&inlandszone%5B%5D=NULL&inlandszone%5B%5D=NULL&auslandszonen%5B%5D=Italien&auslandszonen%5B%5D=&zeitraum=we&tageszeitraum=0-24&kompakt=y&ids%5B%5D=8378&taktmax=60&tarif_ansage=n&inc_190=on&berechnen=berechnen&ids%5B%5D=8516&ids%5B%5D=8494&ids%5B%5D=8636&ids%5B%5D=8621&ids%5B%5D=8614&ids%5B%5D=8610&ids%5B%5D=8580&ids%5B%5D=8345&ids%5B%5D=8058&ids%5B%5D=8639&ids%5B%5D=8343&ids%5B%5D=8496&ids%5B%5D=8633&ids%5B%5D=8561&ids%5B%5D=8254&ids%5B%5D=8619&ids%5B%5D=8550&ids%5B%5D=8061&ids%5B%5D=8563&ids%5B%5D=8638&ids%5B%5D=8604&ids%5B%5D=8611&ids%5B%5D=7775&ids%5B%5D=8059&ids%5B%5D=8634&ids%5B%5D=8562&ids%5B%5D=8377&ids%5B%5D=8615&ids%5B%5D=8605&ids%5B%5D=8057&ids%5B%5D=8631&ids%5B%5D=7765&ids%5B%5D=7732&ids%5B%5D=7513&ids%5B%5D=8612&ids%5B%5D=8632&ids%5B%5D=8635&ids%5B%5D=8616&ids%5B%5D=8624&ids%5B%5D=8599&ids%5B%5D=8592&printversion=yes' -O /tmp/bt.txt
fi
										 
if [ $WERKTAG = 1 ]
then
    #Werktag
    wget 'http://www.billiger-telefonieren.de/tarife/tagesuebersicht.php3?maxanzeige=2&inlandszone%5B%5D=Ort&inlandszone%5B%5D=Fern&inlandszone%5B%5D=E2&inlandszone%5B%5D=NULL&inlandszone%5B%5D=NULL&auslandszonen%5B%5D=Italien&auslandszonen%5B%5D=&zeitraum=wt&tageszeitraum=0-24&kompakt=y&ids%5B%5D=8378&taktmax=60&tarif_ansage=n&inc_190=on&berechnen=berechnen&ids%5B%5D=8516&ids%5B%5D=8494&ids%5B%5D=8636&ids%5B%5D=8621&ids%5B%5D=8614&ids%5B%5D=8610&ids%5B%5D=8580&ids%5B%5D=8345&ids%5B%5D=8058&ids%5B%5D=8639&ids%5B%5D=8343&ids%5B%5D=8496&ids%5B%5D=8633&ids%5B%5D=8561&ids%5B%5D=8254&ids%5B%5D=8619&ids%5B%5D=8550&ids%5B%5D=8061&ids%5B%5D=8563&ids%5B%5D=8638&ids%5B%5D=8604&ids%5B%5D=8611&ids%5B%5D=7775&ids%5B%5D=8059&ids%5B%5D=8634&ids%5B%5D=8562&ids%5B%5D=8377&ids%5B%5D=8615&ids%5B%5D=8605&ids%5B%5D=8057&ids%5B%5D=8631&ids%5B%5D=7765&ids%5B%5D=7732&ids%5B%5D=7513&ids%5B%5D=8612&ids%5B%5D=8632&ids%5B%5D=8635&ids%5B%5D=8616&ids%5B%5D=8624&ids%5B%5D=8599&ids%5B%5D=8592&printversion=yes' -O /tmp/bt.txt
fi

grep fbbb /tmp/bt.txt | awk -F 'fbbb">' \
'{ split ($2,ar,"<"); print ar[1] " " ar[3]; \
split ($3,ar,"<"); print ar[1] " " ar[3]; \
split ($4,ar,"<"); print ar[1] " " ar[3]; \
split ($5,ar,"<"); print ar[1] " " ar[3]; \
}' > /tmp/bt-call-cost.txt

Das ganze ist geklaut aus
http://www.fli4l.de/german/extern/opt/download.pl?file=1264-OPT_cm-callback.tgz

Da gibt es auch die Feiertagsdateien - die man natürlich auch gerne weglassen kann....

Kleines Problem: Grep sucht jetzt nur nach SUN für Sonntag. Der Samstag wird als Werktag erkannt. Ich habe leider gerad keine Zeit herauszusuchen wie grep nach "entweder 'Sun' oder 'Sat' sucht" - ist aber sicherlich möglich....
Jetzt muss ich erstmal weg.

Gruß
Thorsten
 
So - jetzt bin ich wieder zurück :-D
Die Grep-suche ist auch ganz einfach - da nur in Sat und Sun ein "S" vorkommt - in den restlichen Wochentagen aber nicht - muss man aus dem grep Sun einfach nur ein grep S machen - und schon hat man Samstag und Sonntag erwischt :-D
Gruß
Thorsten
 
Hmmm,
nööö, das machen wir anders.
Die Feiertage kann man sich ja berechnen, ich werde da mal ein kleines Pascalprogrämmchen zusammenkloppen was eine 1 oder 0 für Feiertag/Wochenende oder nicht ausgibt, das kann man dann ja im bt.sh aufrufen und abfragen, dürfte um einiges flexibler sein.
Gruß
Dominic
 
Hi
gut - ich bin immer zu haben für verbesserungsvorschläge.
Aber: die Date / grep sache funktioniert doch ganz gut - was willst du da flexibler machen? Die zeilen mit dem abgleich der verschiebbaren feiertage sind zwar unschön - aber irgendwoher brauchst man ja die infos...

Ich bin mal gespannt was da kommt :-D

Gruß
Thorsten
 
Die variablen Feiertage sind alle von Ostern abhänging, kannst ja mal ein google nach Feiertagsberechnung machen. In dem Fall mußt Du überhaupt keine Tabelle mehr pflegen.
Wird aber heute nix mehr, vielleicht morgen, habe noch andere Arbeit hier liegen, für die gibt es sogar noch Geld ;)

Gruß
Dominic
 
Yo - geld geht vor.
Feiertage sind eh zweitrangig - die Wochenenden sind mir wichtiger... und eine interimslösung habe ich ja :-D

Gruß
Thorsten
 
Soso, sind wir scon auf Seite 3 angelangt, das wird ja langsam richtig unübersichtlich....

Nun mal die weft.pas als attachement, wie imer mit fpc compilieren.
Unser kleiner Pascal liefert eine 0 zurück wenn Wochentag, eine 1 wenn Feiertag oder Wochenende.
Dist dann einfach im shellscript abfragen und entsprechenden Context von billiger-telefonieren herunterladen....

Gruß
Dominic
 
Warum kann ich eigentlich kein Attachement dranhängen, blöde Sache, hier dann mal wieder so ...
Code:
program weft;
uses
 dos;


var
  akttag,aktmonat,aktjahr,aktwday : word;

function schaltjahr:boolean;
begin
      Schaltjahr :=  (aktjahr Mod 4 = 0) And (aktjahr Mod 100 <> 0) Or (aktjahr Mod 400 = 0);
end;

function tij(t,m,j:word):word;
const
 monate : array[1..12] of byte = (31,28,31,30,31,30,31,30,31,30,31,30);

var
  tz : word;
  i  : byte;
begin
 tz:=0;
 if schaltjahr then monate[2] := 29;
 for i:=1 to m-1 do tz:=tz+monate[i];
 tz:=tz+t;
 tij:=tz;
end;

function osterdatum(jahr :word):word;
var
   g, h, x, z, d, e, t,m: integer;

begin
     g := jahr mod 19 + 1;
     h := trunc(jahr/100) + 1;
     x := trunc(3*h/4) - 12;
     z := trunc((8*h + 5)/25) - 5;
     d := trunc(5*jahr/4) - x - 10;
     e := (11*g + 20 + z - x) mod 30;
     if (e = 25) and (g > 11) or (e = 24) then e := e + 1;
     t := 44 - e;
     if t < 21 then t := t + 30;
     t := t + 7 - (d + t) mod 7;
     if t > 31 then begin
        m := 4;
        t := t-31;
     end else begin
              m := 3;
         end;
     osterdatum := tij (t,m,jahr);
end;

function wochenende:boolean;

begin
     wochenende := (aktwday=0) or (aktwday=6);
end;

function istFeiertag:boolean;
var
   Tag,
   osterTag : word;

begin
     Tag := tij (aktTag,aktMonat,aktJahr);
     osterTag := OsterDatum (aktjahr);
     istFeiertag:=false;
     if Tag = OsterTag -2 then   istFeiertag:=true; {Karfreitag}
     if Tag = OsterTag    then   istFeiertag:=true; {OsterSonntag}
     if Tag = OsterTag +1 then   istFeiertag:=true; {OsterMontag}
     if Tag = OsterTag+39 then   istFeiertag:=true; {ChristiHimmlefaht}
     if Tag = OsterTag+49 then   istFeiertag:=true; {PfingstSonntag}
     if Tag = OsterTag+50 then   istFeiertag:=true; {PfingstMontag}
     if Tag = OsterTag+60 then   istFeiertag:=true; {Fronleichnahm}
     if Tag = tij(1,1,aktjahr)   then   istFeiertag:=true; {Neujahr}
     if Tag = tij(1,5,aktjahr)   then   istFeiertag:=true; {Tag der Arbeit, jaja...}
     if Tag = tij(25,12,aktjahr) then   istFeiertag:=true; {Weihnachten}
     if Tag = tij(26,12,aktjahr) then   istFeiertag:=true; {Weihnachten}
     if Tag = tij(3,10,aktjahr)  then   istFeiertag:=true; {Eine Einheit ???}
end;

begin
     getDate (aktJahr,aktMonat,aktTag,aktWday);
     if wochenende or istFeiertag then writeln('1')
     else writeln('0');
end.
 
Und hier noch die angepasste bt.sh für den Cron
Code:
#!/bin/bash
tag=`/root/weft`

if [ "$tag" = "0" ]; then

wget 'http://www.billiger-telefonieren.de/tarife/tagesuebersicht.php3?maxanzeige=2&inlandszone%5B%5D=Ort&inlandszone%5B%5D=Fern&inlandszone%5B%5D=D1&inlandszone%5B%5D=NULL&inlandszone%5B%5D=NULL&auslandszonen%5B%5D=Frankreich&auslandszonen%5B%5D=&zeitraum=wt&tageszeitraum=0-24&kompakt=y&ids%5B%5D=8378&taktmax=60&tarif_ansage=n&inc_190=on&berechnen=berechnen&ids%5B%5D=8516&ids%5B%5D=8494&ids%5B%5D=8636&ids%5B%5D=8621&ids%5B%5D=8614&ids%5B%5D=8610&ids%5B%5D=8580&ids%5B%5D=8345&ids%5B%5D=8058&ids%5B%5D=8639&ids%5B%5D=8343&ids%5B%5D=8496&ids%5B%5D=8633&ids%5B%5D=8561&ids%5B%5D=8254&ids%5B%5D=8619&ids%5B%5D=8550&ids%5B%5D=8061&ids%5B%5D=8563&ids%5B%5D=8638&ids%5B%5D=8604&ids%5B%5D=8611&ids%5B%5D=7775&ids%5B%5D=8059&ids%5B%5D=8634&ids%5B%5D=8562&ids%5B%5D=8377&ids%5B%5D=8615&ids%5B%5D=8605&ids%5B%5D=8057&ids%5B%5D=8631&ids%5B%5D=7765&ids%5B%5D=7732&ids%5B%5D=7513&ids%5B%5D=8612&ids%5B%5D=8632&ids%5B%5D=8635&ids%5B%5D=8616&ids%5B%5D=8624&ids%5B%5D=8599&ids%5B%5D=8592&printversion=yes' -O /tmp/bt.txt

  else
wget 'http://www.billiger-telefonieren.de/tarife/tagesuebersicht.php3?maxanzeige=2&inlandszone%5B%5D=Ort&inlandszone%5B%5D=Fern&inlandszone%5B%5D=D1&inlandszone%5B%5D=NULL&inlandszone%5B%5D=NULL&auslandszonen%5B%5D=Frankreich&auslandszonen%5B%5D=&zeitraum=we&tageszeitraum=0-24&kompakt=y&ids%5B%5D=8378&taktmax=60&tarif_ansage=n&inc_190=on&berechnen=berechnen&ids%5B%5D=8516&ids%5B%5D=8494&ids%5B%5D=8636&ids%5B%5D=8621&ids%5B%5D=8614&ids%5B%5D=8610&ids%5B%5D=8580&ids%5B%5D=8345&ids%5B%5D=8058&ids%5B%5D=8639&ids%5B%5D=8343&ids%5B%5D=8496&ids%5B%5D=8633&ids%5B%5D=8561&ids%5B%5D=8254&ids%5B%5D=8619&ids%5B%5D=8550&ids%5B%5D=8061&ids%5B%5D=8563&ids%5B%5D=8638&ids%5B%5D=8604&ids%5B%5D=8611&ids%5B%5D=7775&ids%5B%5D=8059&ids%5B%5D=8634&ids%5B%5D=8562&ids%5B%5D=8377&ids%5B%5D=8615&ids%5B%5D=8605&ids%5B%5D=8057&ids%5B%5D=8631&ids%5B%5D=7765&ids%5B%5D=7732&ids%5B%5D=7513&ids%5B%5D=8612&ids%5B%5D=8632&ids%5B%5D=8635&ids%5B%5D=8616&ids%5B%5D=8624&ids%5B%5D=8599&ids%5B%5D=8592&printversion=yes' -O /tmp/bt.txt

fi


grep fbbb /tmp/bt.txt  | awk -F 'fbbb">' \
'{ split ($2,ar,"<"); print ar[1] " " ar[3]; \
   split ($3,ar,"<"); print ar[1] " " ar[3]; \
   split ($4,ar,"<"); print ar[1] " " ar[3]; \
   split ($5,ar,"<"); print ar[1] " " ar[3]; \
}' > /tmp/bt-call-cost.txt

Mal so rein Interessehalber, wer benutzt das Gerümpel hier eigentlich ?

Gruß
Dominic
 
Ich :lol:

Vielen Dank für Eure coole Arbeit, habe es eben erst mit den aktuellen Änderungen implementiert, und es läuft *träum* ...

Edle Sache!
 
Ich werds bestimmt auch nutzen ... muss nur Zeit finden, mir erst mal nen Asterisk zusammen zu basteln :)
 
Und natürlich benutze ich es :-D
Danke.
Frage: funktioniert bei dir das Fallback? Wenn ja, welchen Capi-Treiber verwendest du (chan_capi 3,5?) und mit early-B3 oder ohne?
Oder HFC-Treiber?

Derzeit mache ich "manuelles" Fallback - also eine andere Amtskennziffer für die alternativnummer... (wenn die billig-vorwahl versagt)

Gruß
Thorsten
 
Öhm, Fallback, hmm, gute Frage,
ich benutze die HFC-Bristuff und denke mal es funktioniert, bisher bin ich immer beim ersten mal duchgekommen ;)

Gruß
Dominic
 
Neues Problemchen

Hi Dominic,

wie ich gerade festellen muss haben mach wohl auch billiger-telefonieren öfters mal ne umstellung.
jetzt haben die eine Zeitzone 19-5 Uhr - und diese wird scheinbar nicht richtig ausgewertet...
kannst du dein script anpassen? währe nett - mir fehlt da leider die kenntniss...

Gruß
Thorsten
 
Die bösen Jungs, sowas darf man doch auch nicht machen !
Hier dann die korrigierte Version des bt.agi mit dem es funktionieren sollte.
Habe es zumindest mal gerade getestet und scheint OK zu sein, was ich so in meinem leicht angeseuselten Zustand erkennen kann.....

Gruß und gute Nacht
Dominic

Wie immer c&p dann
fpc {dateiname.pas}
cp {dateiname} /var/lib/asterisk/agi-bin

Code:
program lcr;

uses Dos;

const 
  fallback : boolean = false;
  pre : string = '';

Type
  t_Distance = (none,local,DE,Mobile,Foreign);

var
  infile : Text;
  tString : string;
  Distance : t_Distance;
  CallerString : String;

procedure trim(var is :string);
begin
	while (pos (' ',is) > 0) do delete (is,pos (' ',is),1);
end;

function timeOK:boolean;
var
	h,m,s,hund : word;
	fromT,toT  : byte;
	temp	   : string[5];
begin
	timeOK:=false;
	if pos('Uhr',tString) > 0 then
	begin
		GetTime (h,m,s,hund);
		temp := copy (tString,1,pos('-',tString)-1);
		trim (temp);
		val (temp,fromT,hund);
		temp :=  copy (tString,pos('-',tString)+1,2);
		trim (temp);
		val (temp,toT,hund);
		if toT = 0 then toT := 24;

		{ Eieiei, schon wieder eine Sonderfall }
		if (toT < fromT) and 
		   (h>fromT) then  toT := 24;	

		if (toT < fromT) and
		   (h<toT) then
		     fromT := 0;
		timeOK:= (h>=fromT) and (h<toT);
{		writeln (tString);}
	end;
end;

procedure workOn;
const
  start = 7;
var
  count : byte;
  cost,
  lcr : string[12];
  startp : byte;
  endp : byte;
begin
  if Distance = local then count := start;
  if Distance = DE then count := start+1;
  if Distance = Mobile then count := start+2;
  if Distance = Foreign then count := start+3;
  if fallback then count:=count+4;
  while (not EOF(infile)) do
  begin
  	readln (infile,tString);
	if count = 0 then begin
		writeln (tString);
		lcr  := copy (tString,1,pos(' ',tString)-1);
		startp := pos('>',tString)+1;
		endp := pos (' c',tString);
		writeln ('Start : ',startp, ' Ende : ',endp);
		cost := copy (tString,startp, endp-startp);
		writeln ( 'SET VARIABLE LCR ',lcr,pre);
		writeln ( 'SET VARIABLE COSTS ',cost);
	end;
	dec(count);
  end;
end;

function setDistance:boolean;
begin
	Distance := none;
	if callerString[1] <> '0' then Distance := local;
	if callerString[1] = '0'  then Distance := DE;
	if pos ('01',callerString) = 1 then Distance := Mobile;
	if pos ('00',callerString) = 1 then Distance := Foreign;
	if pos (paramstr(2),callerString)> 0 then Distance := local;
	if Distance = local then pre := paramstr(2);
	setDistance := Distance <> none;
end;

begin
{ Parameter 
  1 : gewaehlte Nummer
  2 : lokale Vorwahl
  3 : Fallback
 }
  Assign  (infile, '/tmp/bt-call-cost.txt');
  Reset(infile);
  callerString := paramstr(1);
  fallback     := paramstr(3) = 'fallback';  
  if  setDistance then
  begin
	  while (not EOF(infile)) do
	  begin
		readln (infile,tString);
		if timeOK then workOn;
	  end;
  end;
  writeln;
end.
 

Zurzeit aktive Besucher

Neueste Beiträge

Statistik des Forums

Themen
244,879
Beiträge
2,220,028
Mitglieder
371,604
Neuestes Mitglied
broekar
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.

IPPF im Überblick

Neueste Beiträge