#!/usr/bin/perl -Tw # # LMS version 1.8.1 Shyla _ moded by ReYu # # (C) 2001-2011 LMS Developers & Simson # # Please, see the doc/AUTHORS for more information about authors! # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License Version 2 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # use strict; use DBI; use Config::IniFiles; use Getopt::Long; use HTTP::Cookies; use HTTP::Request::Common qw(POST GET); use Crypt::SSLeay; use LWP::UserAgent; use POSIX; use POSIX qw(mktime strftime); use HTML::TokeParser; use Time::Local; use vars qw($configfile $quiet $help $version); use Digest::MD5; use Text::Iconv; use Digest::MD5 qw(md5_hex); $ENV{'PATH'}='/usr/local/bin'; my $_version = '1.8.2 Shyla moded by ReYu & Simson'; my %options = ( "--config-file|C=s" => \$configfile, "--quiet|q" => \$quiet, "--help|h" => \$help, "--version|v" => \$version, ); Getopt::Long::config("no_ignore_case"); GetOptions(%options); if($help) { print STDERR < $configfile; print @Config::IniFiles::errors; my $dbtype = $ini->val('database', 'type') || 'mysql'; my $dbhost = $ini->val('database', 'host') || ''; my $dbuser = $ini->val('database', 'user') || 'root'; my $dbpasswd = $ini->val('database', 'password') || ''; my $dbname = $ini->val('database', 'database') || 'lms'; my $konto = $ini->val('cashimport_inteligo', 'account') || ''; my $login_i = $ini->val('cashimport_inteligo', 'id') || ''; my $passwd_i = $ini->val('cashimport_inteligo', 'pass') || ''; my $trans_type = $ini->val('cashimport_inteligo', 'trans_type') || 'CREDIT'; my $file_out_dir = $ini->val('cashimport_inteligo', 'history_dir') ||'/var/lms/cashimport'; my $account_id = $ini->val('cashimport_inteligo', 'account') || ''; my $time_start = $ini->val('cashimport_inteligo', 'statement_start') || strftime "%Y-%m-%d", localtime(time-86400); my $time_end = $ini->val('cashimport_inteligo', 'statement_end') || strftime "%Y-%m-%d", localtime(time); my $dbase; if($dbtype eq "mysql") { $dbase = DBI->connect("DBI:mysql:database=$dbname;host=$dbhost","$dbuser","$dbpasswd", { RaiseError => 1 }); } elsif($dbtype eq "postgres") { $dbase = DBI->connect("DBI:Pg:dbname=$dbname;host=$dbhost","$dbuser","$dbpasswd", { RaiseError => 1 }); } else { print STDERR "Fatal error: unsupported database type: $dbtype, exiting.\n"; exit 1; } # Definicja Agenta http my $sd =''; my $cookie_jar = HTTP::Cookies->new; my $ua = new LWP::UserAgent; $ua->timeout(30); $ua->agent('Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4'); $ua->env_proxy(); # Wchodzimy na strone my $get = new HTTP::Request(GET => 'https://inteligo.pl/secure'); my $res = $ua->request($get); if ($res->content =~ /Przepraszamy/ ){ print "ERROR: System chwilowo niedostepny", "\n"; exit 1; } if ($res->content =~ /Identyfikator/ ){ my $p = HTML::TokeParser->new(\$res->content); while ( my $token1 = $p->get_tag("input")){ if (my $ur = $token1->[1]{name} eq "sd"){ my $url = $token1->[1]{name} || "-"; my $url2 = $token1->[1]{value} || "-"; $sd = $url2; } } } print "Logujemy do Serwisu ... \n"; my $post = POST 'https://inteligo.pl/secure', [ sd => $sd, form_name => "login", btn_ok => "", menu => "", cif => "$login_i", password => "$passwd_i", btn_ok => "", ]; my $res1 = $ua->request($post); my $ias_sid = ''; my $back_reload_protection = ''; my $ias_form_protect = ''; my $ias_navi_map = ''; if ($res1->content =~ /Stan Twoich/ ){ print "Jestesmy zalogowani ...\n"; my $p = HTML::TokeParser->new(\$res1->content); while ( my $token1 = $p->get_tag("input")){ if (my $ur = $token1->[1]{name} eq "ias_sid"){ my $url = $token1->[1]{name} || "-"; my $url2 = $token1->[1]{value} || "-"; $ias_sid = $url2; } if (my $ur = $token1->[1]{name} eq "back_reload_protection"){ my $url = $token1->[1]{name} || "-"; my $url2 = $token1->[1]{value} || "-"; $back_reload_protection = $url2; } if (my $ur = $token1->[1]{name} eq "ias.form_protect"){ my $url = $token1->[1]{name} || "-"; my $url2 = $token1->[1]{value} || "-"; $ias_form_protect = $url2; } if (my $ur = $token1->[1]{name} eq "ias_navi_map"){ my $url = $token1->[1]{name} || "-"; my $url2 = $token1->[1]{value} || "-"; $ias_navi_map = $url2; } } } else { exit 1; } print "Przechodzimy do historii ...\n"; my $post1 = POST 'https://inteligo.pl/secure/igo2', [ ias_sid => $ias_sid, __ie__bug__workaround__ => "", ias_navi_map => $ias_navi_map, ias_post_into => "/accounts/accounts/submit", back_reload_protection => $back_reload_protection, "ias.form_protect" => $ias_form_protect, menu => "", dynsub_10 => "", ]; $res = $ua->request($post1); if ($res->content =~ /Historia rachunku/ ){ print "Strona Historii Rachunku \n"; my $p1 = HTML::TokeParser->new(\$res->content); while ( my $token1 = $p1->get_tag("input")){ if (my $ur = $token1->[1]{name} eq "ias_sid"){ my $url = $token1->[1]{name} || "-"; my $url2 = $token1->[1]{value} || "-"; $ias_sid = $url2; } if (my $ur = $token1->[1]{name} eq "back_reload_protection"){ my $url = $token1->[1]{name} || "-"; my $url2 = $token1->[1]{value} || "-"; $back_reload_protection = $url2; } if (my $ur = $token1->[1]{name} eq "ias.form_protect"){ my $url = $token1->[1]{name} || "-"; my $url2 = $token1->[1]{value} || "-"; $ias_form_protect = $url2; } if (my $ur = $token1->[1]{name} eq "ias_navi_map"){ my $url = $token1->[1]{name} || "-"; my $url2 = $token1->[1]{value} || "-"; $ias_navi_map = $url2; } } } else { print "\nExit\n"; exit 1; } print "Zmieniamy filtr historii....\n"; my $post2 = POST 'https://inteligo.pl/secure/igo2', [ ias_sid => $ias_sid, __ie__bug__workaround__ => "", ias_navi_map => $ias_navi_map, back_reload_protection => $back_reload_protection, "ias.form_protect" => $ias_form_protect, menu => "", ias_post_into => "/accounts/history/submit", "fields_search-selected_acc" => $account_id, "fields_search-date_range-since" => $time_start, "fields_search-date_range-to" => $time_end, format => "pdf", dynsub_11 => "", ]; $res = $ua->request($post2); if ($res->content =~ /Historia rachunku/ ){ print "Zmieniono filtr $time_start - $time_end\n"; my $p1 = HTML::TokeParser->new(\$res->content); while (my $token1 = $p1->get_tag("input")){ if (my $ur = $token1->[1]{name} eq "ias_sid"){ my $url = $token1->[1]{name} || "-"; my $url2 = $token1->[1]{value} || "-"; $ias_sid = $url2; } if (my $ur = $token1->[1]{name} eq "back_reload_protection"){ my $url = $token1->[1]{name} || "-"; my $url2 = $token1->[1]{value} || "-"; $back_reload_protection = $url2; } if (my $ur = $token1->[1]{name} eq "ias.form_protect"){ my $url = $token1->[1]{name} || "-"; my $url2 = $token1->[1]{value} || "-"; $ias_form_protect = $url2; } if (my $ur = $token1->[1]{name} eq "ias_navi_map"){ my $url = $token1->[1]{name} || "-"; my $url2 = $token1->[1]{value} || "-"; $ias_navi_map = $url2; } } } else { print "\nExit\n"; exit 1; } print "Pobieramy plik historii....\t"; my $post3 = POST 'https://inteligo.pl/secure/igo2', [ ias_sid => $ias_sid, __ie__bug__workaround__ => "", ias_navi_map => $ias_navi_map, back_reload_protection => $back_reload_protection, "ias.form_protect" => $ias_form_protect, menu => "", dynsub_12 => "", ias_post_into => "/accounts/history/submit", "fields_search-selected_acc" => $account_id, "fields_search-date_range-since" => $time_start, "fields_search-date_range-to" => $time_end, format => "csv", ]; $res = $ua->request($post3); print "Pobrano plik\n"; my @dana = split("\n", $res->content); my $file_name = $file_out_dir."/". $account_id ."_". time(); if ($file_out_dir){ open (DOUT,">$file_name"); my $y = scalar(@dana) - 1 ; print DOUT "Ilosc pozycji : ". $y ."\n" } my $okCounter = 0; for (my $x=1;$xnew("ISO-8859-2", "UTF-8"); ## $line = $converter->convert($line); my @linia = split("@",$line); my @da = split('-',$linia[2]); $linia[2] = mktime(0,0,0,$da[2],$da[1]-1, $da[0]-1900); $linia[4] =~ s/[^0-9,]//g; $linia[9] = $linia[9] || ""; $linia[10] = $linia[10] || ""; $linia[11] = $linia[11] || ""; $linia[12] = $linia[12] || ""; $linia[13] = $linia[13] || ""; if ($file_out_dir){ print DOUT $line ."\n"; } my $date = $linia[2]; my $customer = $linia[8]; my $description = ""; #my $description = $linia[9] ." ". $linia[10] ." ". $linia[11] ." ". $linia[12]; if ($linia[3] =~ m/QuickMoney/i){ $description = $linia[10]; } else { $description = $linia[11] ." ". $linia[12]; } $description =~ s/'//g; #' $description =~ s{|}{}; #| my $value = $linia[4]; my $customerid = '0'; my @spr; my @punkty; $spr[1] = 0; $spr[2] = 0; $spr[3] = 0; $punkty[1] = 0; $punkty[2] = 0; $punkty[3] = 0; # sprawdza id if ($description =~ m/(ID|AJDI|I\WD)/i){ my $customerid_t = $description; $customerid_t =~ s/.+(ID|AJDI|I\WD)//gi; $customerid_t =~ s/[^0-9 ]//g; $customerid_t =~ s/^\s+//; $customerid_t =~ s/[ ].*//; $customerid_t =~ s/\s+$//; $spr[1]=$customerid_t; $punkty[1]='2'; } # sprawdza numer faktury if($description =~ m/(LMS|lms)/i){ my $ls = '/usr/local/bin/php -r'; my $command1 = 'preg_match("/([0-9]{1,5})(?=(\W?[^0-9]?(LMS|lms).+))/","' . $description . '",$k); print $k[0];'; my $command2 = 'preg_match("/(LMS|lms).?.?[0-9]+/","' . $description . '",$k); print $k[0];'; my $numer = `$ls '$command1'`; my $rok = `$ls '$command2'`; $rok =~ s/[^0-9 ]//g; $rok =~ s/^\s+//; $rok =~ s/[ ].*//; $rok =~ s/\s+$//; if($rok == "08") { $rok = '2008'; } elsif($rok == "09") { $rok = '2009'; } elsif($rok == "10") { $rok = '2010'; } elsif($rok == "11") { $rok = '2011'; } elsif($rok == "12") { $rok = '2012'; } my $sdbq222 = $dbase->prepare("select customerid as id222 from documents where number='$numer' and cdate > UNIX_TIMESTAMP('$rok-01-01 00:00:00') and cdate < UNIX_TIMESTAMP('$rok-12-20 00:00:00')"); $sdbq222->execute; my $id222 = '0'; if (my $row = $sdbq222->fetchrow_hashref()){ $spr[2]=$row->{'id222'}; $punkty[2]='2'; } } # sprawdza imie i nazwisko if($linia[8] =~ m/ /i){ @da = split(" ", $linia[8]); my $sdbq = $dbase->prepare("SELECT id FROM customers WHERE UPPER(lastname)=UPPER('$da[0]') and UPPER(name)=UPPER('$da[1]')"); $sdbq->execute; my $id = '0'; if (my $row = $sdbq->fetchrow_hashref()){ $spr[3] = $row->{'id'}; $punkty[3]='2'; }else { my $sdbq = $dbase->prepare("SELECT id FROM customers WHERE UPPER(lastname)=UPPER('$da[1]') and UPPER(name)=UPPER('$da[0]')"); $sdbq->execute; if (my $row = $sdbq->fetchrow_hashref()){ $spr[3] = $row->{'id'}; $punkty[3]='2'; } } } my $ocena = '0'; # sprawdza ID + imie i nazwisko if(($punkty[1] + $punkty[3]) == '4') { if($spr[1] == $spr[3]) { # dostaje 4 punkty zaznacza na zielona + box $customerid = $spr[1]; $ocena = '4'; } else { # dostaje 1 punkt i zaznacza na czerwono $customerid = $spr[1]; $ocena = '1'; } # sprawdza F.vat + imie i nazwisko } elsif(($punkty[2] + $punkty[3]) == '4') { if($spr[2] == $spr[3]) { # dostaje 4 punkty zaznacza na zielona + box $customerid = $spr[2]; $ocena = '4'; } else { # dostaje 1 punkt i zaznacza na czerwono $customerid = $spr[2]; $ocena = '1'; } } elsif($punkty[1] == '2') { # dostaje 2 punkty na zolto my $sdbq223 = $dbase->prepare("SELECT lastname FROM customers WHERE id='$spr[1]'"); $sdbq223->execute; my $lastname = '0'; my $nazwisko = '9999999999999999999999999999999999999999999999C'; if (my $row = $sdbq223->fetchrow_hashref()){ $nazwisko = $row->{'lastname'}; $nazwisko =~ s/�/a/gi; $nazwisko =~ s/�/c/gi; $nazwisko =~ s/�/e/gi; $nazwisko =~ s/�/l/gi; $nazwisko =~ s/�/n/gi; $nazwisko =~ s/�/o/gi; $nazwisko =~ s/�/s/gi; $nazwisko =~ s/�/z/gi; $nazwisko =~ s/�/z/gi; $nazwisko =~ s/�/A/gi; $nazwisko =~ s/�/C/gi; $nazwisko =~ s/�/E/gi; $nazwisko =~ s/�/L/gi; $nazwisko =~ s/�/N/gi; $nazwisko =~ s/�/O/gi; $nazwisko =~ s/�/S/gi; $nazwisko =~ s/�/Z/gi; $nazwisko =~ s/�/Z/gi; } my $isko = $line; $isko =~ s/�/a/gi; $isko =~ s/�/c/gi; $isko =~ s/�/e/gi; $isko =~ s/�/l/gi; $isko =~ s/�/n/gi; $isko =~ s/�/o/gi; $isko =~ s/�/s/gi; $isko =~ s/�/z/gi; $isko =~ s/�/z/gi; $isko =~ s/�/A/gi; $isko =~ s/�/C/gi; $isko =~ s/�/E/gi; $isko =~ s/�/L/gi; $isko =~ s/�/N/gi; $isko =~ s/�/O/gi; $isko =~ s/�/S/gi; $isko =~ s/�/Z/gi; $isko =~ s/�/Z/gi; if($isko =~ m/$nazwisko/i){ $customerid = $spr[1]; $ocena = '4'; } else { $ocena = '3'; $customerid = $spr[1]; } } elsif($punkty[2] == '2') { my $sdbq2234 = $dbase->prepare("SELECT lastname FROM customers WHERE id='$spr[2]'"); $sdbq2234->execute; my $lastname = '0'; my $nazwisko = '9999999999999999999999999999999999999999999999C'; if (my $row = $sdbq2234->fetchrow_hashref()){ $nazwisko = $row->{'lastname'}; $nazwisko =~ s/�/a/gi; $nazwisko =~ s/�/c/gi; $nazwisko =~ s/�/e/gi; $nazwisko =~ s/�/l/gi; $nazwisko =~ s/�/n/gi; $nazwisko =~ s/�/o/gi; $nazwisko =~ s/�/s/gi; $nazwisko =~ s/�/z/gi; $nazwisko =~ s/�/z/gi; $nazwisko =~ s/�/A/gi; $nazwisko =~ s/�/C/gi; $nazwisko =~ s/�/E/gi; $nazwisko =~ s/�/L/gi; $nazwisko =~ s/�/N/gi; $nazwisko =~ s/�/O/gi; $nazwisko =~ s/�/S/gi; $nazwisko =~ s/�/Z/gi; $nazwisko =~ s/�/Z/gi; } my $isko = $line; $isko =~ s/�/a/gi; $isko =~ s/�/c/gi; $isko =~ s/�/e/gi; $isko =~ s/�/l/gi; $isko =~ s/�/n/gi; $isko =~ s/�/o/gi; $isko =~ s/�/s/gi; $isko =~ s/�/z/gi; $isko =~ s/�/z/gi; $isko =~ s/�/A/gi; $isko =~ s/�/C/gi; $isko =~ s/�/E/gi; $isko =~ s/�/L/gi; $isko =~ s/�/N/gi; $isko =~ s/�/O/gi; $isko =~ s/�/S/gi; $isko =~ s/�/Z/gi; $isko =~ s/�/Z/gi; if($isko =~ m/$nazwisko/i){ $customerid = $spr[2]; $ocena = '4'; } else { $ocena = '3'; $customerid = $spr[2]; } # dostaje 2 punkty na zolto # $customerid = $spr[2]; # $ocena = '2'; } elsif($punkty[3] == '2') { # dostaje 2 punkty na zolto $customerid = $spr[3]; $ocena = '2'; } my $hash = $konto.$linia[0]; my $sdbq = $dbase->prepare("SELECT id FROM cashimport WHERE hash = '$hash'"); $sdbq->execute(); my $row = $sdbq->fetchrow_hashref(); if ($row->{'id'}) { print "ERROR: Hash exists, ignoring $hash $customer $description", "\n"; # print $customerid ."|". $customer ."|". $ocena ."\n"; } else { my $sdbq = $dbase->prepare("INSERT INTO cashimport ( Date , Value , Customer ,Description , CustomerId , Hash, ocena ) VALUES ('$date', '$value', '$customer','$description', '$customerid', '$hash', '$ocena');"); $sdbq->execute(); # print $customerid ."|". $customer ."|". $ocena ."\n"; } } close DOUT; exit 0; print "ERROR: Nieznany b��d"; exit 1;