#!/usr/local/bin/perl -w
# PaySys Console
# Console interface for payments and fees import

use vars qw($begin_time %FORM %LANG
$DATE $TIME
$CHARSET
@MODULES
$Paysys
$debug
$payments
$html
);

BEGIN {
  my $libpath = '../../../';
  $sql_type = 'mysql';
  unshift(@INC, $libpath . "Abills/$sql_type/");
  unshift(@INC, $libpath . "/usr/local/abills/Abills/$sql_type/");
  unshift(@INC, $libpath);
  unshift(@INC, $libpath . 'libexec/');
  unshift(@INC, '/usr/local/abills/');
  unshift(@INC, '/usr/local/abills/Abills/');
  unshift(@INC, '/usr/local/abills/Abills/mysql/');

  eval { require Time::HiRes; };
  if (!$@) {
    Time::HiRes->import(qw(gettimeofday));
    $begin_time = gettimeofday();
  }
  else {
    $begin_time = 0;
  }
}

use FindBin '$Bin';

require $Bin . '/../../../libexec/config.pl';

use Abills::Base;
use Abills::SQL;
use Abills::HTML;
use Users;
use Paysys;
use Finance;
use Admins;

$html    = Abills::HTML->new();
my $sql  = Abills::SQL->connect($conf{dbtype}, $conf{dbhost}, $conf{dbname}, $conf{dbuser}, $conf{dbpasswd}, { CHARSET => ($conf{dbcharset}) ? $conf{dbcharset} : undef });
my $db   = $sql->{db};

#Operation status

my $admin  = Admins->new($db, \%conf);
$admin->info($conf{SYSTEM_ADMIN_ID}, { IP => '127.0.0.1' });
$payments  = Finance->payments($db, $admin, \%conf);
my $fees   = Finance->fees($db, $admin, \%conf);
$Paysys    = Paysys->new($db, $admin, \%conf);
my $status = '';
$debug     = 0;
my $error_str = '';

require "Abills/Misc.pm";
require "Abills/templates.pl";

#Arguments
my $ARGV = parse_arguments(\@ARGV);

if ($#ARGV < 0) {
  help();
  exit;
}

if ($ARGV->{DEBUG}) {
  $debug = $ARGV->{DEBUG};
  print "DEBUG: $debug\n";
}

require "language/$conf{default_language}.pl";

$DATE = $ARGV->{DATE} if ($ARGV->{DATE});

if ($ARGV->{PLUGIN}) {
  if (-f $Bin . '/plugins/' . $ARGV->{PLUGIN}) {
    require $Bin . '/plugins/' . $ARGV->{PLUGIN};
  }
  else {
    print "Plugin not found: $ARGV->{PLUGIN}\n";
  }
}
elsif ($ARGV->{TYPE}) {
  if (defined($ARGV->{EMAIL_CHECK})) {
    paysys_import_pop3();
  }
  elsif ($ARGV->{FTP_CHECK}) {
    paysys_import_ftp();
  }
  elsif ($ARGV->{TYPE} eq 'PAYMENTS' || $ARGV->{TYPE} eq 'CANCEL_PAYMENTS') {
    paysys_import_payments();
  }
  elsif ($ARGV->{TYPE} eq 'FEES') {
    paysys_import_fees();
  }
  elsif ($ARGV->{TYPE} eq 'ERIPT') {
    eript_202();
  }
}

#**********************************************************
# Import fees from_file
#**********************************************************
sub paysys_import_form {
  my ($attr) = @_;
  my @import_types = ();
  if ($attr->{IMPORT_RULES}) {
    @import_types = split(/,/, $attr->{IMPORT_RULES});
  }

  my $table;

  #Default import extration
  my $import_expr = ($attr->{IMPORT_EXPR}) ? $attr->{IMPORT_EXPR} : '(\d+)\t(.+)\t(\d+)\t(\S+)\t([0-9.,]+)\t(\d{2}-\d{2}-\d{4})\t(.+)\t(.+):ID, FIO, PHONE, CONTRACT_ID, SUM, DATE, ADDRESS, DESCRIBE';

  #Default Binding field
  my $BINDING_FIELD = ($attr->{BINDING_FIELDS}) ? $attr->{BINDING_FIELDS} : 'CONTRACT_ID';

  if (defined($attr->{IMPORT_RULE})) {
    $import_expr       = $conf{ 'PAYSYS_IMPORT_EXPRATION_' . $attr->{IMPORT_RULE} };
    $BINDING_FIELD     = $conf{ 'PAYSYS_IMPORT_BINDING_' . $attr->{IMPORT_RULE} } if ($conf{ 'PAYSYS_IMPORT_BINDING_' . $attr->{IMPORT_RULE} });
    $FORM{IMPORT_TYPE} = $attr->{IMPORT_RULE};
  }

  my ($DATA_ARR, $BINDING_IDS);
  my %binding_hash      = ();
  my $total_count       = 0;
  my $total_sum         = 0;
  my $total_added_count = 0;
  my $total_added_sum   = 0;
  if (!$ARGV->{FILE} && !$attr->{CONTENT}) {
    print "Select input file !!!\n";
    exit;
  }

  my $content  = '';
  my $filename = $ARGV->{FILE} || '';

  if ($attr->{CONTENT}) {
    $content = $attr->{CONTENT};
  }
  else {
    open(FILE, "$filename") || die "Can't open file '$filename' $!\n";
    while (<FILE>) {
      $content .= $_;
    }
    close(FILE);
  }

  ($DATA_ARR, $BINDING_IDS) = payasys_import_parse($content, $import_expr, $BINDING_FIELD);

  #Make users binding hash
  my $ids = join(';', @$BINDING_IDS);
  my $users = Users->new($db, $admin, \%conf);
  my $list = $users->list(
    {
      $BINDING_FIELD => "$ids",
      PAGE_ROWS      => 1000000
    }
  );
  $binding_field_id = 5;
  $binding_field_id++ if ($conf{EXT_BILL_ACCOUNT});
  if ($BINDING_FIELD eq 'LOGIN') {
    $binding_field_id = 0;
  }

  foreach my $line (@$list) {
    $binding_hash{ lc($line->[$binding_field_id]) } = $line->[ 5 + $users->{SEARCH_FIELDS_COUNT} ] . ":$line->[0]:" . (($line->[1]) ? $line->[1] : '');
  }

  my $error = 0;
  for (my $i = 0 ; $i <= $#{$DATA_ARR} ; $i++) {
    my $ID = $DATA_ARR->[$i]->{PAYSYS_EXT_ID} || $i;
    $DATA_ARR->[$i]->{DATE} = $DATE if (!$DATA_ARR->[$i]->{DATE});
    if ($binding_hash{ lc($DATA_ARR->[$i]->{$BINDING_FIELD}) }) {
      my ($uid, $login, $fio) = split(/:/, $binding_hash{ lc($DATA_ARR->[$i]->{$BINDING_FIELD}) });

      next if ($DATA_ARR->[$i]->{SUM} == 0);
      $error     = 0;
      $error_str = '';
      my $user           = $users->info($uid);
      my $describe       = $DATA_ARR->[$i]->{DESCRIBE} || '';
      my $inner_describe = $DATA_ARR->[$i]->{INNER_DESCRIBE} || '';
      if ($describe ne '' && $ARGV->{DECODE}) {
        $describe = convert($describe, { $ARGV->{DECODE} => 1 });
      }

      if ($inner_describe ne '' && $ARGV->{DECODE}) {
        $inner_describe = convert($inner_describe, { $ARGV->{DECODE} => 1 });
      }

      if ($ARGV->{TYPE} eq 'PAYMENTS') {
        my $ext_id = '';
        if ($debug < 5) {
          if (!$DATA_ARR->[$i]->{DATE} && $DATA_ARR->[$i]->{DATE_DMY}) {
            $DATA_ARR->[$i]->{DATE_DMY} =~ /(\d{2})(\d{2})(\d{4})/;
            $DATA_ARR->[$i]->{DATE} = "$3-$2-$1";
          }
          my $method = $DATA_ARR->[$i]->{PAYMENT_METHOD} || $ARGV->{METHOD} || 2;
          $ext_id = $DATA_ARR->[$i]->{EXT_ID} || "$DATA_ARR->[$i]->{DATE}_$FORM{IMPORT_TYPE}.$ID";
          $payments->add(
            $user,
            {
              SUM            => $DATA_ARR->[$i]->{SUM},
              DESCRIBE       => $describe,
              METHOD         => $method,
              DATE           => $DATA_ARR->[$i]->{DATE},
              EXT_ID         => $ext_id,
              CHECK_EXT_ID   => $ext_id,
              INNER_DESCRIBE => $inner_describe
            }
          );
        }
        if ($payments->{errno} && $payments->{errno} == 7) {
          $error_str = "ERROR: EXIST: EXT_ID: $ext_id\n";
          $error     = 1;
        }
        else {
        	if (! $ARGV->{SKIP_CROSSMODULES_CALLS}) {
            cross_modules_call('_payments_maked', { 
          	      USER_INFO    => $user, 
          	      PAYMENT_ID   => $payments->{PAYMENT_ID},  
          	      SKIP_MODULES => 'Paysys'
          	      });
          }
        }
      }
      elsif ($ARGV->{TYPE} eq 'FEES') {
        if ($debug < 5) {
          $fees->take(
            $user,
            $DATA_ARR->[$i]->{SUM},
            {
              DESCRIBE       => $describe,
              INNER_DESRIBE  => $DATA_ARR->[$i]->{EXT_ID},
              DATE           => $DATA_ARR->[$i]->{DATE} || undef,
              INNER_DESCRIBE => $inner_describe,
              METHOD         => $DATA_ARR->[$i]->{PAYMENT_METHOD} || $ARGV->{METHOD},

              #    EXT_ID       => "$DATA_ARR->[$i]->{DATE}.$FORM{IMPORT_TYPE}.$ID",
              #    CHECK_EXT_ID => "$DATA_ARR->[$i]->{DATE}.$FORM{IMPORT_TYPE}.$ID"
            }
          );
        }

        if ($fees->{errno} && $fees->{errno} == 7) {
          $error_str = "ERROR: EXIST: EXT_ID: $DATA_ARR->[$i]->{DATE}.$ID\n";
          $error     = 1;
        }
      }
      elsif ($ARGV->{TYPE} eq 'CANCEL_PAYMENTS') {
        my @payments_arr = ();
        for (my $i = 0 ; $i <= $#{$DATA_ARR} ; $i++) {
          my $ID = $DATA_ARR->[$i]->{PAYSYS_EXT_ID} || $i;
          if ($DATA_ARR->[$i]->{EXT_ID}) {
            push @payments_arr, $DATA_ARR->[$i]->{EXT_ID};
          }
        }
        $payments->{debug} = 1 if ($debug > 5);

        if ($#payments_arr == -1) {
          print "Select ext ID for cancel payments\n";
          return 0;
        }

        my $list = $payments->list(
          {
            EXT_ID    => join(';', @payments_arr),
            PAGE_ROWS => 1000000,
            COLS_NAME => 1
          }
        );

        foreach my $p (@$list) {
          $payments->del({ UID => $p->{uid} }, $p->{id});
          print "ID: $p->{id} SUM: $p->{uid}\n" if ($debug > 1);
        }
      }

      if (!$error) {
        $total_added_count++;
        $total_added_sum += $DATA_ARR->[$i]->{SUM};
      }
    }
    else {
      $error_str = "ERROR: NOT_EXIST BIND_FIELD: $BINDING_FIELD - $DATA_ARR->[$i]->{$BINDING_FIELD} DATE: $DATA_ARR->[$i]->{DATE} SUM: $DATA_ARR->[$i]->{SUM}\n ";
    }

    print $error_str if ($error_str ne '');

    $total_count++;
    $total_sum += $DATA_ARR->[$i]->{SUM};
  }

  print "
  TOTAL: $total_count SUM: $total_sum
  ADDED: $total_added_count SUM: $total_added_sum\n" if ($debug > 0);

  return ($error) ? 0 : 1;
}

#**********************************************************
# Import fees from_file
#**********************************************************
sub paysys_import_fees {
  paysys_import_form(
    {
      TYPE           => 'FEES',
      BINDING_FIELDS => $conf{PAYSYS_FEES_BINDING},
      IMPORT_EXPR    => $conf{PAYSYS_FEES_IMPORT},
      IMPORT_RULES   => FEES
    }
  );
}

#**********************************************************
# Import fees from_file
#**********************************************************
sub paysys_import_payments {
  paysys_import_form(
    {
      TYPE         => $ARGV->{TYPE},
      IMPORT_RULE  => $ARGV->{IMPORT_RULE},
      IMPORT_RULES => $conf{PAYSYS_IMPORT_RULES}
    }
  );

}

#**********************************************************
# Parce file
#**********************************************************
sub payasys_import_parse {
  my ($content, $import_expr, $BINDING_FIELD) = @_;
  my @DATA_ARR    = ();
  my @BINDING_IDS = ();

  $import_expr =~ s/ //g;
  $import_expr =~ s/\n//g;
  my ($expration, $columns) = split(/:/, $import_expr);
  my @EXPR_IDS = split(/,/, $columns);
  print "EXPRESSION: $expration\nColumns: $columns\n" if ($debug > 0);
  my @rows = split(/[\r]{0,1}\n/, $content);

  foreach my $line (@rows) {
    my %DATA_HASH = ();

    #next if ($#params < $#EXPR_IDS);
    if (my @res = ($line =~ /$expration/)) {
      for (my $i = 0 ; $i <= $#res ; $i++) {
        print "$EXPR_IDS[$i] / $res[$i]\n" if ($debug > 5);
        next if ($EXPR_IDS[$i] eq 'UNDEF');

        $DATA_HASH{ $EXPR_IDS[$i] } = $res[$i];

        if ($EXPR_IDS[$i] eq 'PHONE') {
          $DATA_HASH{ $EXPR_IDS[$i] } =~ s/-//g;
        }
        elsif ($EXPR_IDS[$i] eq 'CONTRACT_ID') {
          $DATA_HASH{ $EXPR_IDS[$i] } =~ s/-//g;
        }
        elsif ($EXPR_IDS[$i] eq 'LOGIN') {
          $DATA_HASH{ $EXPR_IDS[$i] } =~ s/ //g;
        }
        elsif ($EXPR_IDS[$i] eq 'SUM') {
          $DATA_HASH{ $EXPR_IDS[$i] } =~ s/,/\./g;
        }
        elsif ($EXPR_IDS[$i] eq 'DATE' && $DATA_HASH{ $EXPR_IDS[$i] } =~ /^(\d{2})[.-](\d{2})[.-](\d{4})$/) {
          $DATA_HASH{ $EXPR_IDS[$i] } = "$3-$2-$1";
        }
      }

      push @DATA_ARR, {%DATA_HASH};
      push @BINDING_IDS, $DATA_HASH{$BINDING_FIELD} if ($DATA_HASH{$BINDING_FIELD});
    }
    elsif ($line ne '') {
      print "'$line'<br>\n" if ($debug > 0);
    }
  }

  return \@DATA_ARR, \@BINDING_IDS;
}

#**********************************************************
# Import from POP3 mail box
#**********************************************************
sub paysys_import_pop3 {
  print "POP3 check\n" if ($debug > 2);
  use Net::POP3;

  # Constructors
  my @mailboxes = split(/;/, $conf{PAYSYS_EMAIL_CHECK});

  if ($ARGV->{EMAIL_CHECK} ne '') {
    $ARGV->{EMAIL_CHECK}--;
    if (!$mailboxes[ $ARGV->{EMAIL_CHECK} ]) {
      print "Not defined mail box '$ARGV->{EMAIL_CHECK}'\n";
      exit;
    }
    else {
      @mailboxes = ($mailboxes[ $ARGV->{EMAIL_CHECK} ]);
    }
  }

  foreach my $mailbox (@mailboxes) {
    my ($host, $username, $password) = split(/:/, $mailbox, 3);

    my $pop = Net::POP3->new($host, Timeout => 60);
    if (!$pop) {
      print "POP3 Error: Can't connect '$host' $!\n";
      exit;
    }

    if ($pop->login($username, $password)) {
      my $msgnums = $pop->list;       # hashref of msgnum => size
      my $total   = keys %$msgnums;
      print "Total: $total\n\n" if ($debug > 2);

      foreach my $msgnum (keys %$msgnums) {
        my $content = '';
        my $uidl    = $pop->uidl($msgnum);
        my $msg     = $pop->get($msgnum);
        $full_message = join('', @$msg);
        my ($header, $message) = split(/\n\n/, $full_message, 2);

        # Parse header
        my @lines      = split(/\n/, $header);
        my $boundary   = '';
        my $date       = '';
        my $subject    = '';
        my $message_id = '';

        foreach $line (@lines) {
          if ($line =~ /boundary="(.+)"/i) {
            $boundary = $1;
          }
          elsif ($line =~ /Subject: (.+)/) {
            $subject = $1;
          }
          elsif ($line =~ /Date: (.+)/) {
            $date = $1;
          }
          elsif ($line =~ /Message-ID: (.+)/) {
            $message_id = $1;
          }
        }

        my @parts = ();
        if ($boundary ne '') {
          @parts = split(/--$boundary/, $message);
        }

        if ($#parts > -1) {
          foreach my $part (@parts) {
            my $filename = '';
            my $encoding = '';

            my ($part_header, $part_body) = split(/\n\n/, $part, 2);
            my @lines = ();
            @lines = split(/\n/, $part_header) if ($part_header);
            foreach $line (@lines) {
              if ($line =~ /filename="(.+)"/i) {
                $filename = $1;
              }
              elsif ($line =~ /Content-Transfer-Encoding: (.+)/i) {
                $encoding = $1;
              }
            }

            if ($encoding eq 'base64') {
              $content .= "\n" . decode_base64($part_body);
            }

          }
        }
        else {
          $content .= $message;
        }

        if ($ARGV->{DECODE}) {
          $content = convert($content, { $ARGV->{DECODE} => 1 });
        }

        if (
          paysys_import_form(
            {
              TYPE         => $ARGV->{TYPE},
              IMPORT_RULE  => $ARGV->{IMPORT_RULE},
              IMPORT_RULES => $conf{PAYSYS_IMPORT_RULES},
              CONTENT      => $content
            }
          )
        )
        {
          $pop->delete($msgnum);
          print "Delete\n" if ($debug == 1);
        }
        else {
          my $message = "
   Date:  $date
   Subject: $subject
   Message id: $message_id
   
   $content
   
   Error: $error_str
";

          sendmail("$conf{ADMIN_MAIL}", "$conf{ADMIN_MAIL}", "POP3 Import Error", "$message", "$conf{MAIL_CHARSET}", "2 (High)");
        }
      }
    }
    else {
      print "POP3 Error: Wrong login or password $!\n";
    }
  }

  #return $content;
}

#**********************************************************
# Import from POP3 mail box
#**********************************************************
sub paysys_import_ftp {
  my ($attr) = @_;

  print "FTP check\n" if ($debug > 2);
  use Net::FTP;

  # Constructors
  my @hosts = split(/;/, $conf{PAYSYS_FTP_CHECK});

  if ($ARGV->{FTP_CHECK} && $ARGV->{FTP_CHECK} ne '') {
    $ARGV->{FTP_CHECK}--;
    if (!$hosts[ $ARGV->{FTP_CHECK} ]) {
      print "Not defined FTP '$ARGV->{FTP_CHECK}'\n";
      exit;
    }
    else {
      @hosts = ($hosts[ $ARGV->{FTP_CHECK} ]);
    }
  }

  foreach my $host_params (@hosts) {
    my ($host, $username, $password, $dir, $files) = split(/:/, $host_params, 5);
    my $ftp = Net::FTP->new("$host", Debug => 0)
    or die "Cannot connect to '$username\@$host': $@";

    if ($ftp->login("$username", "$password")) {
      $dir = $attr->{FTP_DIR} if ($attr->{FTP_DIR});
      if ($dir) {
        $ftp->cwd("$dir")
        or die "Cannot change working directory '$dir' ", $ftp->message;
      }

      if ($attr->{UPLOAD}) {
        $ftp->put("$attr->{UPLOAD}")
        or die "Ftp get failed '$attr->{UPLOAD}' ", $ftp->message;
        print "Upload: $attr->{UPLOAD}\n" if ($debug > 1);
        next;
      }

      my $files_arr = $ftp->ls("$files");
      foreach my $filename (@$files_arr) {
        my $content = '';
        $ftp->get("$filename")
        or die "Ftp get failed '$filename' ", $ftp->message;
        print $filename. "\n" if ($debug > 2);

        $filename =~ /\/?([a-zA-Z0-9\.\-\_\?]+)$/;
        my $local_filename = $1;
        open(FILE, "$local_filename") || die "Can't open file '$filename' $!\n";
        while (<FILE>) {
          $content .= $_;
        }
        close(FILE);

        if ($ARGV->{DECODE}) {
          $content = convert($content, { $ARGV->{DECODE} => 1 });
        }

        if (
          paysys_import_form(
            {
              TYPE         => $ARGV->{TYPE},
              IMPORT_RULE  => $ARGV->{IMPORT_RULE},
              IMPORT_RULES => $conf{PAYSYS_IMPORT_RULES},
              CONTENT      => $content
            }
          )
        )
        {

          if ($ARGV->{BACKUP_FILES} && -d $ARGV->{BACKUP_FILES}) {
            my $a = `cp $local_filename $ARGV->{BACKUP_FILES}`;
          }
          unlink $local_filename;

          $ftp->delete("$filename")
          or die "Ftp del failed '$filename'\n", $ftp->message;
          print "Delete LOCAL:$local_filename 'FTP:$filename'\n" if ($debug == 1);
        }
        else {
          my $message = "
   Filename: $filename
  
   $content
   
   Error: $error_str
";

          sendmail("$conf{ADMIN_MAIL}", "$conf{ADMIN_MAIL}", "POP3 Import Error", "$message", "$conf{MAIL_CHARSET}", "2 (High)");
        }
      }
    }
    else {
      print "FTP Error: Wrong login or password $!\n";
    }
  }

  #return $content;
}

#**********************************************************
# Main iport  parser
#**********************************************************
sub paysys_import {

}

#**********************************************************
# Main iport  parser
#**********************************************************
sub help {
  my @import_types = ();
  if ($conf{PAYSYS_IMPORT_RULES}) {
    @import_rules_arr = split(/,/, $conf{PAYSYS_IMPORT_RULES});
  }
  my $import_rules = '';
  for (my $i = 0 ; $i <= $#import_rules_arr ; $i++) {
    $import_rules .= "      $i - $import_rules_arr[$i]\n";
  }

  print << "[END]"
Paysys console interface:

  TYPE=[PAYMENTS|CANCEL_PAYMENTS|FEES|ERIPT] - Operation TYPE
  IMPORT_RULE=         - for payments import type id
$import_rules    
  EMAIL_CHECK=...      - Check E-mail for documents. E-mail box number. Default read all mailboxes with import rule.
  FTP_CHECK=...        - Check files from ftp. FTP  servers. Default check all servers with import rule.
  BACKUP_FILES=[DIR]   - Backup ftp files
  SKIP_CROSSMODULES_CALLS - Skip cros modules calls   
  METHOD=[0..]         - Method for fees or payments
  FILE=                - Import FILE
  DATE=                - Import Date  
  DEBUG=1,2..5         - Debug Mode  
  DECODE=              - Decode from other charsets
    win2koi 
    koi2win
    win2iso
    iso2win
    win2dos
    dos2win
  PLUGIN=...           - Run plugin
  help                 - this help

[END]
}

#***********************************************************
# upload users list
#***********************************************************
sub eript_202 {
  my $message     = '';
  my $msgs_header = '';
  my $msg_num     = time();
  my $msg_file    = $msg_num . '.202';

  my $msg_version = 3;

  "$DATE$TIME" =~ /(\d{4})\-(\d{2})\-(\d{2})(\d{2}):(\d{2}):(\d{2})/;
  my $msg_date = "$1$2$3$4$5$6";
  "$DATE$TIME" =~ /(\d{4})\-(\d{2})\-(\d{2})(\d{2}):(\d{2}):(\d{2})/;
  my $payment_period = '';    #"$3$2.$1";

  my $record_total_count = 0;

  #
  my $msg_provider_id = $conf{PAYSYS_ERIPT_PROVIDER_ID} || 123456;    #   	M, N8
  my $msg_provider_num = $conf{PAYSYS_ERIPT_PROVIDER_NUM}
  || 123456
  ;    #     	M, N9,        ,       ;
  my $msg_provider_bank_id      = $conf{PAYSYS_ERIPT_PROVIDER_BANK_ID}      || 123456;    #    	M, N3
  my $msg_provider_bank_account = $conf{PAYSYS_ERIPT_PROVIDER_BANK_ACCOUNT} || 123456;    #     	O, N8
  my $msg_provider_service_id   = 1;
  my $msg_valuta                = 974;
  my $msg_total_sum             = 0;

  my $num          = 0;
  my $payment_date = '';                                                                  #"$DATE$TIME";
  $payment_date =~ s/:|\-//g;

  my $WHERE = '';

  if ($ARGV->{LOGIN}) {
    $WHERE = "AND u.id='$ARGV->{LOGIN}'";
  }

  my $account_key = ($conf{PAYSYS_ERIP_ACCOUNT_KEY} && $conf{PAYSYS_ERIP_ACCOUNT_KEY} eq 'LOGIN') ? 'u.id' : 'u.uid';

  $Paysys->query(
    $db, "SELECT $account_key, pi.fio, concat(pi.address_street, ', ', pi.address_build, ', ', pi.address_flat), u.credit, dv.tp_id, tp.month_fee FROM users u, 
	  users_pi pi, dv_main dv, tarif_plans tp
	  WHERE u.uid=pi.uid AND u.deleted=0
	  AND u.uid=dv.uid
	  AND dv.tp_id=tp.id
	  $WHERE
	  "
  );

  my $list = $Paysys->{list};

  foreach my $line (@{$list}) {
    $num++;
    my $uid      = $line->[0];
    my $fio      = $line->[1];
    my $address  = $line->[2];
    my $credit   = 0;            #$line->[3];
    my $comments = '';
    my $ext_info = '';

    # TP
    my $tp_id   = $line->[4];
    my $tarif_1 = '';            #$line->[5];
    my $tarif_2 = '';

    $record_total_count++;
    $msg_total_sum += $tarif_1 || 0;

    my $tariffs_fields = '';     #"1~$tp_id~5~$tarif_1~$tarif_2~0~0~0";

    $message .= "$num^$uid^$fio^$address^$payment_period^$credit^$tariffs_fields^$payment_date^$comments^$ext_info^^^\r\n";
  }

  $message = "$msg_version^$msg_provider_id^$msg_num^$msg_date^$record_total_count^$msg_provider_num^$msg_provider_bank_id^$msg_provider_bank_account^$msg_provider_service_id^$msg_valuta\r\n" . $message;

  if ($debug > 4) {
    print $message;
  }
  else {
    my $upload_file = '/tmp/' . $msg_file;

    open(FILE, ">$upload_file") or die "Can't create file '$upload_file' $!\n";
    print FILE $message;
    close(FILE);
    paysys_import_ftp({ UPLOAD => $upload_file, FTP_DIR => '/in/' });
  }

=comments


       .      1.2.
 1.2 -    202
 	 		,
 , 
1	1,2, 3	 	M, N6
2	1,2, 3	  	M, S20
3	1,2, 3	  	O, S90
4	1,2, 3	  	O, S99
5	1,2, 3	 	O, DMM.YYYY
6	1,2, 3	 	M, F12,2
7	1,2, 3	   	SubField
8	1,2, 3	    	O, DYYYYMMDDhhmmss
9	1,2, 3	 	O, S500
10	1,2, 3	 	O, S255
11	2, 3	 ,  	O, F12,2
12	2, 3	 	O, N2
13	2, 3	 	O, N2


      :
?	 2          ;
?	 6        - .       -;
?	 7  ,       1.3;
?	 9   ,       / .       .      "~" (  0x7E);
?	 10        , -         206, 210, 216;
?	 6 / 7    ;
?	 11   ,     -   .            ;
?	 12  13          -.
 1.3 -   "   "
 		,


 , 
1	 	M, N1
2	  	O, S20
3	 	O, N2
4	  1	M, F5,6
5	  2	O, F5,6
6	 	O, F6,5
7	  	M, N16
8	  	O, N16
      :
?	 4     ,  ,     ,      6. , -  ,      5;
?	  3     [1..16];
?	    7  8    , -  3    ;
?	          1.
    202      .
     NNNNNNNN.204,  NNNNNNNN   .
     1.4.



=cut	

}

1
