#!C:\perl\bin -w -I./t
# PROGRAM modul : EDIREX1.pm  
# auther : LPO , M&F Hlinsko, Palackeho 1295, f.o. 
# GNU : garante jusqu a non changee  file.
# L'Original est depose chez auther
# Date de commence de creation  : 21.11.2002
# La dernier change             : 14.07.2003
#***************************************************
#

#****************************************
sub Move_z_in_do_inbound
{ use File::Copy;

my $StatusS="";
my $ChybaKop=0;

       @bestanden =();
       opendir (DIRDIR,"$param{'edirex_in_dir'}"); 
       @bestanden = readdir(DIRDIR);
       closedir(DIRDIR);
     if ($#bestanden > -1)  {
       if ($param{'edirex_edi_type'} eq "B"){
         foreach $vstup (@bestanden) {
           if ($vstup =~ /^\./){ next; }   # Je to adresar
           if ($param{'edirex_biolit'} >= 1){
             print AUDIT  "* $datum - MOVE $vstup ->  $param{'edirex_inbound'}/$vstup\n";
           }
           &NactiCtrlHlavicku($vstup);
           $ChybaKop=0;
           if(( -e "$param{'edirex_inbound'}/$vstup" ) and ($param{'Zakaz_prepis_inbound'} eq 0)) {
             unlink ("$param{'edirex_inbound'}/$vstup");
             &Hlaska("!! Prepisuji predchozi soubor $vstup !!");
           }
           if( -d "$param{'edirex_inbound'}/temp"){
             if( -e "$param{'edirex_inbound'}/$vstup" ) {
               &Hlaska("!!! Soubor $vstup jiz v $param{'edirex_inbound'} existuje !!");
               $ChybaKop=1;
             } elsif(!copy ("$param{'edirex_in_dir'}/$vstup","$param{'edirex_inbound'}/temp")){
               &Hlaska("!!! Nemohu zkopirovat soubor $vstup do $param{'edirex_inbound'}/temp !!");
               $ChybaKop=2;
             } elsif(!rename ("$param{'edirex_inbound'}/temp/$vstup","$param{'edirex_inbound'}/$vstup")){
               &Hlaska("!!! Nemohu presunout soubor $vstup do $param{'edirex_inbound'} !");
               $ChybaKop=3;
             } else {
               print AUDIT "* $datum ---> File : $vstup moved to $param{'edirex_inbound'}/$vstup \n";
             }
           } else {
             if( -e "$param{'edirex_inbound'}/$vstup" ) {
               &Hlaska("!!! Soubor $vstup jiz v $param{'edirex_inbound'} existuje !!");
               $ChybaKop=4;
             } elsif(!copy ("$param{'edirex_in_dir'}/$vstup","$param{'edirex_inbound'}")){
               &Hlaska("!!! Nemohu zkopirovat soubor $vstup do $param{'edirex_inbound'} !");
               $ChybaKop=5;
             } else {
               print AUDIT "* $datum ---> File : $vstup copied to $param{'edirex_inbound'}/$vstup \n";
             }
           }
           if($ChybaKop == 0) {
             &LogujSoubor("in",$vstup);
             if( -e "$param{'edirex_inarchiv'}/$vstup" ) {
               if(copy ("$param{'edirex_in_dir'}/$vstup","$param{'edirex_inarchiv'}/$vstup$cas")){
                 unlink("$param{'edirex_in_dir'}/$vstup");
                 &Hlaska("! V archivu je soubor stejneho jmena, archivuji jako $vstup$cas !!");
               } else {
                 &Hlaska("! Nemohl jsem presunout $vstup do $param{'edirex_inarchiv'}/$vstup$cas !!");
               }
             } else {
               if(copy ("$param{'edirex_in_dir'}/$vstup","$param{'edirex_inarchiv'}/$vstup")){
                 unlink("$param{'edirex_in_dir'}/$vstup");
               } else {
                 &Hlaska("! Nemohl jsem presunout $vstup do $param{'edirex_inarchiv'} !!");
               }
             }
           }
           if($OdeslatCtrl) { &PosliCtrl($vstup,$ChybaKop); }
         } # end of each
         if($ChybaKop != 0) {
           $Chyba="! Problem pri zapisu dat do $param{'edirex_inbound'}! - viz audit.log.";
           &waruj_na_doline;
           &sli_alert;
         }
       } else {
         if(!open (VYSTUP ,">>$param{'edirex_inbound'}/$param{'edirex_in_fiche'}")) {
           $Chyba="! Problem pri zapisu dat do souboru $param{'edirex_inbound'}/$param{'edirex_in_fiche'} !";
           &Hlaska("$Chyba");
           &waruj_na_doline;
           &sli_alert;
         } else {
           binmode(VYSTUP);
           foreach $vstup (@bestanden) {
             if ($vstup =~ /^\./){ next; }  # Je to adresar
             &NactiCtrlHlavicku($vstup);
             &LogujSoubor("in",$vstup);
             open(VSTUP, "<$param{'edirex_in_dir'}/$vstup");
             binmode(VSTUP);  # Bylo pouzito, protoze nekdo dal do EDI zpravy znak 1A=end file.
             while (my $pom=<VSTUP>) {
               print VYSTUP "$pom";
             }
             close (VSTUP);
             if($OdeslatCtrl) { &PosliCtrl($vstup,0); }
             rename ("$param{'edirex_in_dir'}/$vstup","$param{'edirex_inarchiv'}/Ie_$vstup"); 
             print AUDIT "* $datum ----> File: $param{'edirex_in_dir'}\\$vstup  added to $param{'edirex_inbound'}\\$param{'edirex_in_fiche'}\n";
           } # end of each
           close (VYSTUP);
           @StatusS=stat("$param{'edirex_inbound'}/$param{'edirex_in_fiche'}") ;
           if ($StatusS[7] == 0) { unlink ("$param{'edirex_inbound'}/$param{'edirex_in_fiche'}"); }
         }
       } # end of else 
    ;
    }; # end of if  
;
}

#****************************************
sub NactiCtrlHlavicku()  #Nacte radky "TLDNDELIV" do seznamu a vytvori novy vstupni soubor
{                              # ve kterem jsou tyto radky odstraneny.
my $radek;                     # Nastavi priznak "OdeslatCtrl",zda se ma odesilat CONTROL
my $SoubPathName;
my $PomSoubPathName;

  my($insoubor)=@_;
  $OdeslatCtrl=0;
  $SoubPathName="$param{'edirex_in_dir'}/$insoubor";
  $PomSoubPathName="$param{'edirex_in_dir'}/$insoubor.pom";
  @seznamtd=();
  if(!open(VSTUP, "<$SoubPathName")){
    &Hlaska("! Nemohu otevrit soubor $SoubPathName pro nacteni hlavicky !! Za 5s zkusim znovu.");
    sleep(5);
    if(!open(VSTUP, "<$SoubPathName")){
      &Hlaska("! Nemohu otevrit soubor $SoubPathName pro nacteni hlavicky !!");
      return();
    }
  }
  binmode(VSTUP);
  $radek=<VSTUP>;
  if($radek=~/^TLDNDELIV/) {       # Je to DELIVERY radek
    $OdeslatCtrl=1;
    $radek=~s/\x0a//g;           # Vyhod CRLF z binarniho souboru
    $radek=~s/\x0d//g; 
    @seznamtd=($radek);
    open(VYSTUP2, ">$PomSoubPathName");
    binmode(VYSTUP2);
    while($radek=<VSTUP>){
      if($radek=~/^TLDNDELIV/) {
        $radek=~s/\x0a//g;           # Vyhod CRLF z binarniho souboru
        $radek=~s/\x0d//g;
        push(@seznamtd,$radek);
      } else {
        print(VYSTUP2 $radek);
      }
    }
    close(VYSTUP2);
    close(VSTUP);
    ##unlink $SoubPathName;
    rename $SoubPathName , "$param{'edirex_tmp_dir'}/$insoubor" ;
    rename $PomSoubPathName , $SoubPathName ;
  } else {
    close(VSTUP);
  }
} # NactiCtrlHlavicku($vstup);

#****************************************

sub PosliCtrl()
{
my ($insoubor,$CopyRet)=@_;  #0=povedlo se vlozit do INBOUND, ne 0=nepovedlo - podle tohoto priznaku vytvaret CONTROL

  #if(($CopyRet eq 1) or ($CopyRet eq 4)) { @seznamtd=(); return; }
  print AUDIT "* $datum - Vytvarim zpravu CONTROL $insoubor.ctr $seznamtd[0] Ret=$CopyRet\n";
  &getdatum;
  open(CTRLOUT, ">$param{'edirex_out_dir'}/$insoubor.ctr");
  foreach $i (@seznamtd){
    print CTRLOUT "$i;$datum;$CopyRet\n";
  }
  close CTRLOUT;
  @seznamtd=();
  ##$IOmode=3;     # Okamzite odeslani ctr se resi jinak - v edirex.pl
  if( -e "$param{'edirex_tmp_dir'}/$insoubor" ) { unlink "$param{'edirex_tmp_dir'}/$insoubor"; }
} # PosliCtrl()

#****************************************
sub VratTmp()   # Presune soubory z tmp do IN, pokud zustaly od minula (po padu)
{
  if(!chdir($param{'edirex_tmp_dir'})) { return; }
  foreach my $vstup (<*>) {
    if( -f $vstup) { rename($vstup,"$param{'edirex_in_dir'}/$vstup"); }
  }
}

#****************************************

sub LogujSoubor() # Analyzuje vstupni soubor, zapisuje do inmsg.log a outmsg.log - rozlisit in a out!!!
{
  my $radek;       
  my $SoubPathName;
  my $PomSoubPathName;
  my $SouborData;

  my($mod,$soubor)=@_;
  &getdatum;
  if($mod eq "in") {
    open(MSGLOG,">>$param{'edirex_log_dir'}/inmsg.tmp");
    $SouborData=AnalyzujSoubor("$param{'edirex_in_dir'}/$soubor");
    &OznamPrijetiMailem($soubor);
  } else {
    open(MSGLOG,">>$param{'edirex_log_dir'}/outmsg.tmp");
    $SouborData=AnalyzujSoubor("$param{'edirex_out_dir'}/$soubor");
  }
  print MSGLOG "$datum|$soubor|$SouborData\n";
  close MSGLOG;
}  # LogujSoubor($mod,$vstup)

#****************************************

sub OznamPrijetiMailem()
{
  my ($soubor)=@_;
  my ($smtpip,$smtpport);
  my ($authjm,$authpass); 

  if (!defined ($param{'Email_INFO_TO'}) or ($param{'Email_INFO_TO'} eq '')) { return; }
  if ($param{'SMTP_server'} eq '') { &Hlaska("Neni nakonfigurovan SMTP server, info email neodesilam!"); return; }
  #use Mail::Sender;

  ($smtpip,$smtpport)=split(/\:/,$param{'SMTP_server'});
  if(!defined($smtpport)) { $smtpport='25'; }

  if(defined $param{'Email_authid'} ) { $authjm=$param{'Email_authid'} } else { $authjm=''; }
  if(defined $param{'Email_authpwd'} ) { $authpass=$param{'Email_authpwd'} } else { $authpass=''; }

  if(($authjm eq'' ) or ( $authpass eq '' )) {
    $ret1 = system ("$EDIREX_HOME\\Perl\\bin\\mailsend-go.exe -smtp $smtpip -port $smtpport -f $param{'Email_FROM'} -t $param{'Email_INFO_TO'} -sub \"EDIREX info: prijato: $soubor\" -M \"EDIREX prijal $datum: soubor $soubor\"");
  } else {
    $ret1 = system ("$EDIREX_HOME\\Perl\\bin\\mailsend-go.exe -smtp $smtpip -port $smtpport -f $param{'Email_FROM'} -t $param{'Email_INFO_TO'} -sub \"EDIREX info: prijato: $soubor\" -M \"EDIREX prijal $datum: soubor $soubor\" -starttls -auth -user $authjm -pass $authpass");
  }
  if($ret1) { &Hlaska("! Problem pri zasilani info e-mailu, ret=$ret1"); }

}	# OznamPrijetiMailem($soubor)

#****************************************

sub AnalyzujSoubor()
{
  my($soubor)=@_;
  my $SouborData="";
 
  $SouborData=&AnalEDI($soubor);
  if($SouborData ne "") { return $SouborData; }
  #$SouborData=&TestNaXML($soubor);
  #if($SouborData ne "") { return $SouborData; }
  #$SouborData=&TestNaCTRL($soubor);
  #if($SouborData ne "") { return $SouborData; }
  $SouborData="";
  return $SouborData;
}

#****************************************

sub TestNaXML()
{
  my($soubor)=@_;
  return "";
}

sub TestNaCTRL()
{
  my($soubor)=@_;
  return "";
}

#****************************************

1;
