package stichprobe;

use benutzer;
#use strict;

@ISA = qw ( benutzer );


####################################################################
####         Konstruktor der Umfragenklasse
####         Argumente  : -
####         Returnwert : -
####################################################################
sub init {
	my $that = shift;
	my $class = ref($that) || $that;
	my $self = template->init(@_);
	bless $self, $class;	
	$self->{name}     = "Neue Umfrage";
	$self->{umfid}	  = $baseq::VARS{umfid}+0;
	if ($self->{umfid}==0) {return;}
	($self->{template},
	$self->{sprache},$self->{knr}) = $self->sqlselect("select template,sprache,knr from umfragen where umfid=$self->{umfid}");
    $self->loadtmp();
    $self->loadsprache($self->{sprache});
	return $self;
}

####################################################################
####         Konstruktor der Umfragenklasse
####         Argumente  : -
####         Returnwert : -
####################################################################
sub getbearb {
	my $self=shift; 
	if ($baseq::VARS{sbut} eq $self->trans("BU1") ){$self->save;}
	if ($baseq::VARS{sbut} eq $self->trans("BU24") ){$self->hilfe;}
	if ($baseq::VARS{sbut} eq $self->trans("BU29") ){$self->deletestprobe;}
	if ($baseq::VARS{sbut} eq $self->trans("BU30") ){$self->selectmail;}
	if ($baseq::VARS{sbut} eq $self->trans("BU31") ){$self->automail("esiemon\@prorata.de\n");}

	my $HTML=$self->qfont("Bereits erstellte Stichproben")."\n<BR>\n".
         $self->stprobtable.$self->afont("Es sind ".$self->automail." E-Mails in Automail eingetragen")."<BR>\n".
         $self->SMrow(["sbut","sbut","sbut","sbut"],["BU29","BU30","BU31","BU24"])."<HR>\n".
         $self->htmltop.  $self->SMrow(["sbut","sbut","sbut","sbut"],["BU22","BU11","BU1","BU24"]);

	if ($baseq::VARS{sbut} eq $self->trans("BU22") ) {$HTML.="<HR>\n".$self->benutzerliste;}
	$self->{helpkontext}="stichproben";
	$self->printhtml("Stichprobe",$HTML);
	$self->exit;
}

####################################################################
####         Gibt einen String mit den Auswahlfeldern zurueck
####         Argumente  : -
####         Returnwert : HTML-String
####################################################################
sub htmltop {
		my $self=shift; 
        $self->{warntext}="Teilnehmerselection für Umfragenummer $baseq::VARS{umfid}";

        #--------------------------------------------------------------------------------------------------------
        #Liste der Einzelkriterien;
        my $HTML=
        "<TABLE BORDER=1>".
        $self->TR([$self->CB("anzahl",1,$baseq::VARS{anzahl}),"Personen",$self->TF("Personen",$baseq::VARS{Personen},5) ]).
        $self->TR([$self->CB("calterv",1,$baseq::VARS{calterv}),"von",$self->TF("alterv",$baseq::VARS{alterv},5) ]).
        $self->TR([$self->CB("calterb",1,$baseq::VARS{calterb}),"bis",$self->TF("alterb",$baseq::VARS{alterb},5) ]).
        $self->TR([$self->CB("cbis3",1,$baseq::VARS{cbis3}),"Anzahl 0-3 jährige",$self->TF("bis3",$baseq::VARS{bis3},5) ]).
        $self->TR([$self->CB("cbis12",1,$baseq::VARS{cbis12}),"Anzahl 4-12 jährige",$self->TF("bis12",$baseq::VARS{bis12},5) ]).
        $self->TR([$self->CB("cbis22",1,$baseq::VARS{cbis22}),"Anzahl 13-22 jährige",$self->TF("bis22",$baseq::VARS{bis22},5) ]).
        $self->TR([$self->CB("cbis55",1,$baseq::VARS{cbis55}),"Anzahl 23-54 jährige",$self->TF("bis55",$baseq::VARS{bis55},5) ]).
        $self->TR([$self->CB("cab55",1,$baseq::VARS{cab55}),"Anzahl ab 55",$self->TF("ab55",$baseq::VARS{ab55},5) ]).
        $self->TR([$self->CB("sex",1,$baseq::VARS{sex}),"Anrede",$self->DDanrede("anrede",$baseq::VARS{anrede}) ]).
        $self->TR([$self->CB("fam",1,$baseq::VARS{fam}),"Familienstand", $self->DDfamilie("famstand",$baseq::VARS{famstand}) ]).
        $self->TR([$self->CB("bild",1,$baseq::VARS{bild}),"Ausbildung", $self->DDbildung("bildung",$baseq::VARS{bildung}) ]) .
        $self->TR([$self->CB("besch",1,$baseq::VARS{besch}),"Besch&auml;ftigung", $self->DDarbeit('arbeit',$baseq::VARS{arbeit}) ]) .
        "</TABLE><BR>\n";

        #--------------------------------------------------------------------------------------------------------
        #Ausgewählte Produktkategorien & Hobbys
        ($krit, $hobby)= $self->krittable;
        $HTML.= $self->qfont("Ausgewählte Produktkategorien")."\n<BR>\n". $krit . "<BR>\n" .
               $self->qfont("Hobbys")."\n<BR>\n". $hobby . "<BR>\n";

        #--------------------------------------------------------------------------------------------------------
        #Angegebene Versand-Haeuser
        $HTML.= $self->qfont("Versandh&auml;user")."<BR>\n".
        "<TABLE BORDER=1>\n".
        $self->TR([$self->RB("vhtest",1,$baseq::VARS{vhtest})."AND",$self->RB("vhtest",0,$baseq::VARS{vhtest}==0)."OR",$self->CB("vhtestx",1,$baseq::VARS{vhtestx})."NICHT" ]).
        "</TABLE>\n".
        $self->vhtable;
        return $HTML;
}

####################################################################
####         erstellt die SQL-clause und INSERT-Listen anhand der
####         uebergebenen Variablen
####         Argumente  : -
####         Returnwert : sql,sqllist1,sqllist2
####################################################################
sub createlisten {
   my $self=shift; 
   my (@chk, @chk1, $sqlist, $sqlist2,$x);
   my $rlist;
   my $jahr = (localtime)[5]+1900;
   unshift @chk,"pin>0";
   if (!$baseq::VARS{anzahl})  {$baseq::VARS{Personen}=-1}
   if ($baseq::VARS{calterv})	{$geb=$jahr-$baseq::VARS{alterv}; unshift @chk,"gdat<'$geb-12-31'" }else{$baseq::VARS{alterv}=-1}
   if ($baseq::VARS{calterb})	{$geb=$jahr-$baseq::VARS{alterb}; unshift @chk,"gdat>'$geb-01-01'" }else{$baseq::VARS{alterb}=-1}
   if ($baseq::VARS{cbis3})	{unshift @chk,"pers3=$baseq::VARS{bis3}" }else{$baseq::VARS{bis3}=-1}
   if ($baseq::VARS{cbis12})	{unshift @chk,"pers12=$baseq::VARS{bis12}" }else{$baseq::VARS{bis12}=-1}
   if ($baseq::VARS{cbis22})	{unshift @chk,"pers22=$baseq::VARS{bis22}" }else{$baseq::VARS{bis22}=-1}
   if ($baseq::VARS{cbis55})	{unshift @chk,"pers54=$baseq::VARS{bis55}" }else{$baseq::VARS{bis55}=-1}
   if ($baseq::VARS{cab55})	{unshift @chk,"pers55=$baseq::VARS{ab55}" }else{$baseq::VARS{ab55}=-1}
   if ($baseq::VARS{sex})	{unshift @chk,"anrede='$baseq::VARS{anrede}'" }else{$baseq::VARS{anrede}=-1}
   if ($baseq::VARS{fam}){unshift @chk,"famstand='$baseq::VARS{famstand}'" }else{$baseq::VARS{famstand}=-1}
   if ($baseq::VARS{bild})	{unshift @chk,"bildung='$baseq::VARS{bildung}'" }else{$baseq::VARS{bildung}=-1}
   if ($baseq::VARS{besch})	{unshift @chk,"arbeit='$baseq::VARS{arbeit}'" }else{$baseq::VARS{arbeit}=-1}

        #-------------------------------------------------
        #  Kriterien
        for ($x=1; $x<49 ;$x++ ) {
                if ($baseq::VARS{"pk$x"}) {
                        $sqlist.= ",1";                         # String für insert into stprobe..........
                        push @chk, "pk$x=1";
                }
                else {$sqlist.= ",0"};
        }

        foreach $a (@chk) {push @chk1,"benutzer.".$a;}
        @chk=();
        #  Versandhaeuser
        for($x=0; $x<20;$x++){
                if ($baseq::VARS{"vh$x"}) {
                        $sqlist2.= ",1";
           push @chk, "vh$x=1";
        }
        else {$sqlist2.= ",0"};
}

  if ($chk[0] ne "" ) { $rlist2=" and ".("","not")[$baseq::VARS{vhtestx}]." ( ".join( (" or "," and ")[$baseq::VARS{vhtest}], @chk ) ." ) "; } # AND/OR Versandhaus...... NOT

  my $sql="select benutzer.PIN, benutzer.anrede, benutzer.VNAME, benutzer.NNAME, count(ergebnis.pin) CNT ".
           "from benutzer left join ergebnis using (pin) left join umfidpin on benutzer.pin=umfidpin.pin and umfidpin.umfid=$baseq::VARS{umfid} where " .
           "umfidpin.umfid is NULL and benutzer.email !='' and ".join(" and ",@chk1) . $rlist2 . " group by benutzer.pin order by CNT limit $baseq::VARS{Personen}";
  return $sql , $sqlist, $sqlist2;
}

####################################################################
####         erstellt eine HTML-Tabelle mit den Stichproben
####         uebergebenen Variablen zurueck
####         Argumente  : -
####         Returnwert : -
####################################################################
sub stprobtable {
  my $self=shift; 
  my $sql="select * from stprobe where umfid=$self->{umfid} order by stpro";
  my $sth = $self->sqlprepare($sql);
  my ($x, @result, @neue);
  my $tab=$self->TR(["","Anz.","Von","Bis","0-3","4-13","13-22","23-55","ab 55","Geschl.","Familie","Bildung","Arbeit","Kriterien"]);
  while (@result = $sth->fetchrow_array) {
         @neue=();
         for ($x=1; $x<13; $x++) {
            if ($result[$x] == -1) {$result[$x]="&nbsp;";}
            else {
               if ($x==9) {$result[9]=$baseq::HF[$result[9]];}
               if ($x==10) {$result[10]=$baseq::FS[$result[10]];}
               if ($x==11) {$result[11]=$baseq::BI[$result[11]];}
               if ($x==12) {$result[12]=$baseq::BS[$result[12]];}
            }
            push @neue,$result[$x];
         }
         for ($x=13; $x<61; $x++) {
            if ( $result[$x] ) {push @neue,$baseq::KRIT[$x-12];}
         }
       unshift @neue, $self->CB("chostpro".$result[61],$result[61],$result[61]==$baseq::VARS{"chostpro".$result[61]} );
       $tab.=$self->TR(\@neue);
  }
  if ($tab ne "") {return  "<TABLE BORDER=1>\n".$tab."</TABLE>\n";}
  return;
}

####################################################################
####         speichert eine Stichprobe in stprobe und umfidpin
####         uebergebenen Variablen zurueck
####         Argumente  : -
####         Returnwert : -
####################################################################
sub save {
   my $self=shift; 
   ($sql, $sqlist1, $sqlist2)=$self->createlisten;
   my $sth=$self->sqlprepare($sql);
   my $za=0;
   while (@result=$sth->fetchrow_array) {push @L,$result[0];}
   my $stpro=($self->sqlselect("select max(stpro) from stprobe"))+1;
   foreach $pin (@L) {$za+= $self->sqldo("insert into umfidpin values ($baseq::VARS{umfid}, $pin, $stpro)");}
   my $sql1="insert into stprobe values ( $baseq::VARS{umfid},$za,$baseq::VARS{alterv},$baseq::VARS{alterb},$baseq::VARS{bis3},$baseq::VARS{bis12},$baseq::VARS{bis22},$baseq::VARS{bis55},$baseq::VARS{ab55},'$baseq::VARS{anrede}','$baseq::VARS{famstand}','$baseq::VARS{bildung}','$baseq::VARS{arbeit}' $sqlist1 , $stpro, 0 $sqlist2)" ;
   if ($za>0) {$self->sqldo($sql1);}
   return $za;
}

####################################################################
####         Gibt eine Tabelle der ausgewaehlten benutzer zurück
####         uebergebenen Variablen zurueck
####         Argumente  : -
####         Returnwert : -
####################################################################
sub benutzerliste {
  my $self=shift; 
  ($sql, $sqlinsert)=$self->createlisten;
  my $sth = $self->sqlprepare($sql);
  $self->log(4,"ROWS: ".$sth->rows);
  my $HTML= $self->qfont("Gefundene &Uuml;bereinstimmungen: ". $sth->rows ) .
  "<TABLE BORDER=1>\n".
  $self->TR(["PIN","Anrede","Vorname","Name","Count"],"align=\"center\"");
  while (@result = $sth->fetchrow_array) {
    $result[1]=$baseq::HF[$result[1]];
    $HTML.=$self->TR(\@result);
  }
  return $HTML."</TABLE>\n";
}


####################################################################
####         Schreibt mit SSH in die .qmail-automail datei...
####         oder holt die Anzahl der eingetragenen
####         Argumente  : einzutragender String
####         Returnwert : Zeilen in Automail
####################################################################
sub automail {
     my $self=shift; 
	 my $AUTOMAIL=".qmail-automail"; my $HOST="proxy";
     my $OUT="|ssh -l automail $HOST \"tee $AUTOMAIL >/dev/null\"";
     my $IN ="ssh -l automail $HOST \"cat $AUTOMAIL|wc -l\" |";
     my $tring=shift;
     if ($tring eq ""){
        open (FILE, $IN);
        $num=<FILE>;
        close FILE;
        chomp $num;
        $num=~s/\s//g;
        $self->log(4,"READ from automail: $num Mails");
        return $num;
     }
     else {
        open (FILE, $OUT);
        $self->log(4,"Opening: $OUT");
        print FILE $tring;
        close FILE;
     }
}

####################################################################
####         Selectiert die Emails und schreibt sie mit &automail
####         Argumente  : einzutragender String
####         Returnwert : Zeilen in Automail
####################################################################
sub selectmail {
     	my $self=shift; 
		my $sql="select benutzer.email from umfidpin left join benutzer using (pin) where benutzer.email!='' and ";
        my @wh=(); my $MAILS="";
        foreach $x (keys %baseq::VARS) {
          if ($x=~/^chostpro(\d{1,4})$/) {push @wh,"umfidpin.stprobe=$1";}
        }
        if ($wh[0] eq ""){return;}
        my $sth=$self->sqlprepare($sql.join(" or ",@wh));
        while ($mail=$sth->fetchrow_array) {$MAILS.=$mail."\n";}
        #$self->log(4,"MAILS=$MAILS");
        $self->automail($MAILS);
        return;
}

####################################################################
####         Loescht eine oder mehrere Stichprobe(n)
####         Argumente  : einzutragender String
####         Returnwert : Zeilen in Automail
####################################################################
sub deletestprobe {
       my $self=shift; 
	   my $sql="delete from stprobe where ";
       my $sql1="delete from umfidpin where ";
       my @wh=(); my @wh1=(); my $MAILS="";
       foreach $x (keys %baseq::VARS) {
          if ($x=~/^chostpro(\d{1,4})$/) {push @wh,"stprobe=$1"; push @wh1,"stpro=$1";}
        }
       if ($wh[0] eq ""){return;}
       $self->sqldo($sql.join(" or ",@wh1));
       $self->sqldo($sql1.join(" or ",@wh));
}
