# Paysys System
# Support Webmoney, Rupay, SMSProxy,  Ukrpays

eval { require Paysys; };
if (!$@) {
  Paysys->import();
}
else {
  print "Content-Type: text/html\n\n";
  print "Can't load 'Paysys'. Purchase this module http://abills.net.ua";
  exit;
}

use Finance;
my $payments = Finance->payments($db, $admin, \%conf);
my $fees = Finance->fees($db, $admin, \%conf);

my $Paysys = Paysys->new($db, $admin, \%conf);

my %PAY_SYSTEMS = (
  41 => "Webmoney",
  42 => "RUpay",
  43 => "SMSProxy",
  44 => "OSMP",
  45 => "Portmone",
  46 => "Ukrpays",
  47 => "USMP",
  48 => "Privat Bank (Visa/Master Cards)",
  49 => "Pegas",
  50 => "Comepay",
  51 => "24_non_STOP",
  52 => "24_non_STOP_SELF",
  53 => "Express_Oplata",
  54 => "Privat Bank - Privat 24",
  55 => "Pay4",
  56 => " ",
  57 => "EasySoft",
  58 => "Liberty Reserve",
  59 => "QIWI",
  60 => "Ibox",
  61 => "OSMPv4",
  62 => 'LiqPAY',
  63 => 'UkrNET',
  64 => 'Regulpay',
  65 => 'Privat - Terminal',
  66 => 'Paypal',
  67 => 'Sberbank',
  68 => 'Gigs',
  70 => 'CyberPlat',
  71 => 'Telcell',
  72 => 'Ipay',
  73 => 'Yandex',
  74 => 'Alpha-pay',
  75 => 'Zaplati',
  76 => 'Paynet',
  77 => 'CyberPlat Visa/Master cards',
  78 => 'Epay',
  79 => 'Private bank terminal (json)',
  80 => 'Pegas Self Terminals'
);

my %CONF_OPTIONS = (
  PAYSYS_WEBMONEY_ACCOUNTS     => 41,
  PAYSYS_RUPAY_ID              => 42,
  PAYSYS_SMSPROXY              => 43,
  PAYSYS_OSMP_ACCOUNT_KEY      => 44,
  PAYSYS_PORTMONE_PAYEE_ID     => 45,
  PAYSYS_UKRPAYS_SERVICE_ID    => 46,
  PAYSYS_USMP_ACCOUNT_KEY      => 47,
  PAYSYS_PB_MERID              => 48,
  PAYSYS_PEGAS                 => 49,
  PAYSYS_COMEPAY               => 50,
  PAYSYS_24_NON_STOP_SECRET    => 51,
  PAYSYS_24_NON_STOP_SECRET    => 52,
  PAYSYS_EXPRESS_OPLATA        => 53,
  PAYSYS_P24_MERCHANT_ID       => 54,
  PAYSYS_PAY4                  => 55,
  PAYSYS_ERIPT                 => 56,
  PAYSYS_EASYPAY_SERVICE_ID    => 57,
  PAYSYS_LR_ACCOUNT_NUMBER     => 58,
  PAYSYS_QIWI_TERMINAL_ID      => 59,
  PAYSYS_IBOX_ACCOUNT_KEY      => 60,
  PAYSYS_OSMP_ACCOUNT_KEY      => 61,
  PAYSYS_LIQPAY_MERCHANT_ID    => 62,
  PAYSYS_UKRNET_ACCOUNT_KEY    => 63,
  PAYSYS_REGULPAY_ACCOUNT_KEY  => 64,
  PAYSYS_PRIVAT_TERMINAL_KEY   => 65,
  PAYSYS_PAYPAL_RECIEVER_EMAIL => 66,
  PAYSYS_SBERBANK_PASSWORD     => 67,
  PAYSYS_GIGS_IPS              => 68,

  PAYSYS_CYBERPLAT_ACCOUNT_KEY    => 70,
  PAYSYS_TELLCELL_ACCOUNT_KEY     => 71,
  PAYSYS_IPAY_MERCHANT_ID         => 72,
  PAYSYS_YANDEX_ID                => 73,
  PAYSYS_ALFA_PAY_ACCOUNT_KEY     => 74,
  PAYSYS_ZAPLATI_SUMY_ACCOUNT_KEY => 75,
  PAYSYS_USMP_ACCOUNT_KEY         => 76,
  PAYSYS_CP_VISA                  => 77,
  PAYSYS_EPAY_ACCOUNT_KEY         => 78,
  PAYSYS_PRIVATE_JSON_ACCOUNT_KEY => 79,
  PAYSYS_PEGAS_SELF_TERMINALS     => 80
);

my @status = ('UNKNOWN', 'IN PROCCESS', 'COMPLETE', 'CANCELED', 'EXPIRED', 'INCORRECT_CHECKSUM', 'PAYMENT_ERROR', 'DUBLICATE', 'USER_ERROR', 'USER_NOT_EXIST', 'SMALL_PAYMENT_SUM', 'SQL_ERROR');

#require "modules/Paysys/paysys_cons";

if ($conf{PAYSYS_SUCCESSIONS}) {
  $conf{PAYSYS_SUCCESSIONS} =~ s/[\n\r]+//g;
  my @systems_arr = split(/;/, $conf{PAYSYS_SUCCESSIONS});

  # IPS:ID:NAME:SHORT_NAME:MODULE_function;
  foreach my $line (@systems_arr) {
    my ($ips, $id, $name, $short_name, $function) = split(/:/, $line);
    $PAY_SYSTEMS{$id} = $name;
    my $system_conf_name = uc('PAYSYS_' . $short_name);
    $CONF_OPTIONS{$system_conf_name} = $id;
    $conf{$system_conf_name}         = 1;
  }
}

#*******************************************************************
# Delete user from module
# paysys_user_del()
#*******************************************************************
sub paysys_user_del {
  my ($uid, $attr) = @_;

  $Paysys->{UID} = $uid;
  $Paysys->del(0, { UID => $uid });

  return 0;
}

#**********************************************************
# 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 payments from_file
#**********************************************************
sub paysys_import_payments {
  paysys_import_form(
    {
      TYPE         => 'PAYMENTS',
      IMPORT_TYPE  => $FORM{IMPORT_TYPE},
      IMPORT_RULES => $conf{PAYSYS_IMPORT_RULES}
    }
  );

}

#**********************************************************
# Import from file
#**********************************************************
sub paysys_import_form {
  my ($attr) = @_;

  my @import_types = ();
  if ($attr->{IMPORT_RULES}) {
    @import_types = split(/,/, $attr->{IMPORT_RULES});
  }

  my $debug = $FORM{DEBUG} || 0;
  my $table;

  if ($FORM{IMPORT}) {

    #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_TYPE})) {
      $import_expr = $conf{ 'PAYSYS_IMPORT_EXPRATION_' . $attr->{IMPORT_TYPE} };
      $BINDING_FIELD = $conf{ 'PAYSYS_IMPORT_BINDING_' . $attr->{IMPORT_TYPE} } if ($conf{ 'PAYSYS_IMPORT_BINDING_' . $FORM{IMPORT_TYPE} });
    }
    my ($DATA_ARR, $BINDING_IDS);
    my %binding_hash = ();
    my $total_count  = 0;
    my $total_sum    = 0;

    #Confirmation
    if (defined($FORM{IDS})) {
      my @IDS = split(/, /, $FORM{IDS});
      for (my $i = 0 ; $i <= $#IDS ; $i++) {
        my $ID        = $IDS[$i];
        my %DATA_HASH = (
          PAYSYS_EXT_ID  => $ID,
          EXT_ID         => $FORM{ 'EXT_ID_' . $ID },
          PHONE          => $FORM{ 'PHONE_' . $ID },
          FIO            => $FORM{ 'FIO_' . $ID },
          SUM            => $FORM{ 'SUM_' . $ID },
          DATE           => $FORM{ 'DATE_' . $ID },
          TYPE           => $FORM{ 'TYPE_' . $ID },
          PAYMENT_METHOD => $FORM{ 'PAYMENT_METHOD_' . $ID },
          METHOD         => $FORM{ 'METHOD_' . $ID },
          DESCRIBE       => $FORM{ 'DESCRIBE_' . $ID },
          INNER_DESCRIBE => $FORM{ 'INNER_DESCRIBE_' . $ID },
          ADDRESS        => $FORM{ 'ADDRESS_' . $ID },
          $BINDING_FIELD => $FORM{ $BINDING_FIELD . '_' . $ID }
        );
        push @{$DATA_ARR}, {%DATA_HASH};
        push @{$BINDING_IDS}, $DATA_HASH{$BINDING_FIELD};
      }
    }

    #Get data from file
    elsif ($FORM{FILE_DATA}) {
      my $content = $FORM{"FILE_DATA"}{'Contents'};
      ($DATA_ARR, $BINDING_IDS) = paysys_import_parse($content, $import_expr, $BINDING_FIELD, { DEBUG => $debug, ENCODE => $FORM{ENCODE} });
      my $table2 = $html->table(
        {
          width => '100%',
          rows  => [ [ $_NAME, $FORM{FILE_DATA}{filename} ], [ $_TOTAL, $#{$DATA_ARR} + 1 ], [ "$_SIZE", $FORM{FILE_DATA}{Size} ] ]
        }
      );
      print $table2->show();
    }

    push @PAYMENT_METHODS, @EX_PAYMENT_METHODS if (@EX_PAYMENT_METHODS);

    for (my $i = 0 ; $i <= $#PAYMENT_METHODS ; $i++) {
      $PAYMENTS_METHODS{"$i"} = "$PAYMENT_METHODS[$i]";
    }

    my %PAYSYS_PAYMENT_METHODS = %{ cfg2hash($conf{PAYSYS_PAYMENTS_METHODS}) };

    while (my ($k, $v) = each %PAYSYS_PAYMENT_METHODS) {
      $PAYMENTS_METHODS{$k} = $v;
    }

    my $ids = join(';', @$BINDING_IDS);

    if ($ids eq '') {
      $html->message('err', $_ERROR, "$_USER_NOT_EXIST");
      return 0;
    }
    my $users = Users->new($db, $admin, \%conf);
    my $list = $users->list(
      {
        $BINDING_FIELD => "$ids",
        PAGE_ROWS      => 1000000
      }
    );

    if ($users->{errno}) {
      $html->message('err', $_ERROR, "[$users->{errno}] $err_strs{$users->{errno}}");
      return 0;
    }

    $binding_field_id = 5;
    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]";
    }

    my %HIDDEN_HASH = ();

    if ($FORM{PAYMENTS}) {
      for (my $i = 0 ; $i <= $#{$DATA_ARR} ; $i++) {
        my $ID = $DATA_ARR->[$i]->{PAYSYS_EXT_ID} || $i;

        if ($binding_hash{ lc($DATA_ARR->[$i]->{$BINDING_FIELD}) }) {
          my ($uid, $login, $fio) = split(/:/, $binding_hash{ lc($DATA_ARR->[$i]->{$BINDING_FIELD}) });
          my $user = $users->info($uid);
          my $ext_id = $DATA_ARR->[$i]->{EXT_ID} || "$DATA_ARR->[$i]->{DATE}_$FORM{IMPORT_TYPE}.$ID";
          $payments->add(
            $user,
            {
              SUM      => $DATA_ARR->[$i]->{SUM},
              DESCRIBE => $DATA_ARR->[$i]->{DESCRIBE} || '',
              METHOD   => ($DATA_ARR->[$i]->{PAYMENT_METHOD} && $DATA_ARR->[$i]->{PAYMENT_METHOD} ne '') ? $DATA_ARR->[$i]->{PAYMENT_METHOD} : 1,
              DATE => $DATA_ARR->[$i]->{DATE} || undef,
              EXT_ID         => $ext_id,
              CHECK_EXT_ID   => $ext_id,
              INNER_DESCRIBE => $DATA_ARR->[$i]->{INNER_DESCRIBE} || ''
            }
          );

          if ($payments->{errno} && $payments->{errno} == 7) {
            $html->message('err', $_ERROR, "$_EXIST: EXT_ID: " . $html->button("$ext_id", "&index=2&ID=$payments->{ID}"));
          }
          else {
            $total_count++;
            $total_sum += $DATA_ARR->[$i]->{SUM};
          }
        }
        else {
          $html->message('err', $_ERROR, "$_NOT_EXIST $BINDING_FIELD - '$DATA_ARR->[$i]->{$BINDING_FIELD}' ");
        }
      }

      print $html->message('info', $_INFO, "$_TOTAL: $total_count $_SUM: $total_sum");
      return 0;
    }
    elsif ($FORM{FEES}) {
      for (my $i = 0 ; $i <= $#{$DATA_ARR} ; $i++) {
        my $ID = $DATA_ARR->[$i]->{PAYSYS_EXT_ID} || $i;
        if ($binding_hash{ $DATA_ARR->[$i]->{$BINDING_FIELD} }) {
          my ($uid, $login, $fio) = split(/:/, $binding_hash{ $DATA_ARR->[$i]->{$BINDING_FIELD} });
          my $user = $users->info($uid);
          $fees->take(
            $user,
            $DATA_ARR->[$i]->{SUM},
            {
              DESCRIBE       => $DATA_ARR->[$i]->{DESCRIBE}       || '',
              INNER_DESCRIBE => $DATA_ARR->[$i]->{EXT_ID}         || '',
              DATE           => $DATA_ARR->[$i]->{DATE}           || undef,
              INNER_DESCRIBE => $DATA_ARR->[$i]->{INNER_DESCRIBE} || '',
              METHOD         => $DATA_ARR->[$i]->{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) {
            $html->message('err', $_ERROR, "$_EXIST: EXT_ID: $DATA_ARR->[$i]->{DATE}.$FORM{IMPORT_TYPE}.$ID");
          }
          else {
            $total_count++;
            $total_sum += $DATA_ARR->[$i]->{SUM};
          }
        }
        else {
          $html->message('err', "$_FEES - $_ERROR", "$_NOT_EXIST $BINDING_FIELD - $DATA_ARR->[$i]->{$BINDING_FIELD} ");
        }
      }

      print $html->message('info', $_INFO, "$_TOTAL: $total_count $_SUM: $total_sum");
      return 0;
    }
    elsif ($FORM{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};
        }
      }

      if ($#payments_arr == -1) {
        $html->message('err', $_ERROR, "_NO_DATA");
        return 0;
      }

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

      foreach my $line (@$list) {
        $payments->del({ UID => $line->[11] }, $line->[0]);
        $total_count++;
        $total_sum += $line->[4];
      }

      $html->message('info', $_DELETED, "\n$_TOTAL: $total_count $_SUM: $total_sum");
      return 0;
    }
    else {

      $table = $html->table(
        {
          width   => '100%',
          caption => "$_PRE Import - $import_types[$FORM{IMPORT_TYPE}]",
          border  => 1,
          title   => [ 'ID', "$_FIO", "$_PHONE", "$_CONTRACT_ID", "$_SUM", "$_DATE", "$_BANK $_ACCOUNT", "$_TYPE", "$_ADDRESS", "$_DESCRIBE", "$_INNER $_DESCRIBE", "$_BINDING", "EXT ID", '-' ],
          cols_align => [ 'left', 'left', 'right', 'right', 'left', 'right', 'right', 'center:noprint', 'center:noprint' ],
          qs         => $pages_qs,
          ID         => 'PAYSYS_IMPORT_LIST',
          header     => "<script language=\"JavaScript\" type=\"text/javascript\">
<!-- 
function CheckAllINBOX() {
  for (var i = 0; i < document.FORM_IMPORT.elements.length; i++) {
    if(document.FORM_IMPORT.elements[i].type == 'checkbox' && document.FORM_IMPORT.elements[i].name == 'IDS'){
      document.FORM_IMPORT.elements[i].checked =         !(document.FORM_IMPORT.elements[i].checked);
    }
  }
}
//-->
</script>\n<a href=\"javascript:void(0)\" onClick=\"CheckAllINBOX();\">$_SELECT_ALL</a>\n"

        }
      );

      #Draw table
      for (my $i = 0 ; $i <= $#{$DATA_ARR} ; $i++) {
        my $ID = $DATA_ARR->[$i]->{PAYSYS_EXT_ID} || $i;

        my $PAYMENT_METHOD_SEL = '';

        if ($attr->{TYPE} eq 'PAYMENTS') {
          $PAYMENT_METHOD_SEL = $html->form_select(
            'PAYMENT_METHOD_' . $ID,
            {
              SELECTED => $DATA_ARR->[$i]->{PAYMENT_METHOD} || '',
              SEL_HASH => \%PAYMENTS_METHODS,
              NO_ID    => 1,
              SORT_KEY => 1
            }
          );
        }
        elsif ($attr->{TYPE} eq 'FEES') {
          %FEES_METHODS = %{ get_fees_types({ SHORT => 1 }) };

          $PAYMENT_METHOD_SEL = $html->form_select(
            'METHOD_' . $ID,
            {
              SELECTED => $FORM{ 'METHOD_' . $ID },
              SEL_HASH => {%FEES_METHODS},
              NO_ID    => 1,
              SORT_KEY => 1
            }
          );
        }

        my $info = '';

        if ($binding_hash{ lc($DATA_ARR->[$i]->{$BINDING_FIELD}) }) {
          my ($uid, $login, $fio) = split(/:/, $binding_hash{ lc($DATA_ARR->[$i]->{$BINDING_FIELD}) });
          $info = $html->button($fio, "&index=11&UID=$uid", { TARGET => $uid }) . "/$login/$uid";
          $table->{rowcolor} = undef;
        }
        else {
          $table->{rowcolor} = $_COLORS[6];
        }

        #print "$DATA_ARR->[$i]->{TERMINAL_ID}, $DATA_ARR->[$i]->{NUM_AGENT}<br>";
        my $date = $DATA_ARR->[$i]->{DATE} || $FORM{DATE};
        $table->addrow(
          $html->form_input(IDS, $ID, { TYPE => 'checkbox' }) . $ID,
          $html->form_input('FIO_' . $ID,   $DATA_ARR->[$i]->{FIO}   || '', { SIZE => 40 }) . "$info",
          $html->form_input('PHONE_' . $ID, $DATA_ARR->[$i]->{PHONE} || '', { SIZE => 12 }),
          ($BINDING_FIELD eq 'CONTRACT_ID') ? $DATA_ARR->[$i]->{CONTRACT_ID} : $html->form_input('CONTRACT_ID_' . $ID, $DATA_ARR->[$i]->{CONTRACT_ID} || '', { SIZE => 12 }),
          $DATA_ARR->[$i]->{SUM},
          $date,
          $DATA_ARR->[$i]->{BANK_ACCOUNT},
          $PAYMENT_METHOD_SEL,
          $DATA_ARR->[$i]->{ADDRESS},
          $html->form_input('DESCRIBE_' . $ID,          $DATA_ARR->[$i]->{DESCRIBE}       || ''),
          $html->form_input('INNER_DESCRIBE_' . $ID,    $DATA_ARR->[$i]->{INNER_DESCRIBE} || ''),
          $html->form_input($BINDING_FIELD . '_' . $ID, $DATA_ARR->[$i]->{$BINDING_FIELD} || ''),
          $html->form_input('EXT_ID_' . $ID,            $DATA_ARR->[$i]->{EXT_ID}         || $date . '_' . $FORM{IMPORT_TYPE} . $ID),
        );

        $HIDDEN_HASH{ 'SUM_' . $ID }          = $DATA_ARR->[$i]->{SUM};
        $HIDDEN_HASH{ 'DATE_' . $ID }         = $DATA_ARR->[$i]->{DATE} || $FORM{DATE};
        $HIDDEN_HASH{ 'BANK_ACCOUNT_' . $ID } = $DATA_ARR->[$i]->{BANK_ACCOUNT};
        $HIDDEN_HASH{ 'ADDRESS_' . $ID }      = $DATA_ARR->[$i]->{ADDRESS};

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

    print $html->form_main(
      {
        CONTENT => $table->show() . $html->form_input($attr->{TYPE}, 1, { TYPE => 'radio' }) . (($attr->{TYPE} && $attr->{TYPE} eq 'FEES') ? "$_FEES" : " $_PAYMENTS " . $html->form_input('CANCEL_PAYMENTS', 1, { TYPE => 'radio' }) . " $_CANCEL_PAYMENTS "),
        HIDDEN => {
          index       => "$index",
          OP_SID      => $op_sid,
          IMPORT_TYPE => $FORM{IMPORT_TYPE},
          %HIDDEN_HASH
        },
        SUBMIT => { IMPORT => "IMPORT" },
        NAME   => 'FORM_IMPORT'
      }
    );

    $table = $html->table(
      {
        width      => '100%',
        cols_align => [ 'right', 'right' ],
        rows       => [ [ "$_TOTAL:", "$total_count", "$_SUM", $total_sum ] ]
      }
    );
    print $table->show();

  }

  $info{IMPORT_TYPE_SEL} = $html->form_select(
    'IMPORT_TYPE',
    {
      SELECTED     => $FORM{IMPORT_TYPE},
      SEL_ARRAY    => \@import_types || undef,
      ARRAY_NUM_ID => 1
    }
  );

  $info{ENCODE_SEL} = $html->form_select(
    'ENCODE',
    {
      SELECTED  => $FORM{ENCODE},
      SEL_ARRAY => [ '', 'win2utf8', 'utf82win', 'win2koi', 'koi2win', 'win2iso', 'iso2win', 'win2dos', 'dos2win' ],
    }
  );

  $html->tpl_show(_include('paysys_file_import', 'Paysys'), \%info);
}

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

  my $debug = $attr->{DEBUG} || 0;
  $import_expr =~ s/ //g;
  $import_expr =~ s/\n//g;
  my ($expration, $columns) = split(/:/, $import_expr);
  my @EXPR_IDS = split(/,/, $columns);

  print "$_EXPRESSION: $expration " . $html->br() . "$_INFO_FIELDS: $columns" . $html->br();
  my @rows = split(/[\r]{0,1}\n/, $content);
  my $line_count = 1;

  foreach my $line (@rows) {

    if ($attr->{ENCODE}) {
      $line = convert($line, { $attr->{ENCODE} => 1 });
    }

    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]" . $html->br() if ($debug > 0);

        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 'LOGIN') {
          $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 '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});
    }
    else {
      print $html->b("Error: line: $line_count") . " '$line'" . $html->br();
    }

    $line_count++;
  }

  return \@DATA_ARR, \@BINDING_IDS;
}

#**********************************************************
#
#**********************************************************
sub paysys_payment {
  my ($attr) = @_;
  $FORM{SUM} = sprintf("%.2f", $FORM{SUM} || 0);

  if ($FORM{pre} && $FORM{SUM} <= 0 && $FORM{PAYMENT_SYSTEM} != 43) {
    $html->message('err', $_ERROR, "$ERR_WRONG_SUM");
    goto PRE_LABEL;
  }

  if ($FORM{PAYMENT_SYSTEM} == 41 || $FORM{LMI_PAYMENT_NO}) {
    paysys_webmoney();
  }
  elsif ($FORM{PAYMENT_SYSTEM} == 42) {
    paysys_rupay();
  }
  elsif ($FORM{PAYMENT_SYSTEM} == 43) {
    paysys_smsproxy();
  }
  elsif ($FORM{PAYMENT_SYSTEM} == 45 || $FORM{SHOPORDERNUMBER}) {
    paysys_portmone();
  }
  elsif ($FORM{PAYMENT_SYSTEM} == 46) {
    return paysys_ukrpays($attr);
  }
  elsif ($FORM{PAYMENT_SYSTEM} == 48) {
    paysys_privatbank();
  }
  elsif ($FORM{PAYMENT_SYSTEM} == 54) {
    paysys_privatbank_p24();
  }
  elsif ($FORM{PAYMENT_SYSTEM} == 58) {
    paysys_lr();
  }
  elsif ($FORM{PAYMENT_SYSTEM} == 66) {
    paysys_paypal();
  }
  elsif ($FORM{PAYMENT_SYSTEM} == 62 || $FORM{pay_way}) {
    paysys_liqpay();
  }
  elsif ($FORM{PAYMENT_SYSTEM} == 59) {
    paysys_qiwi();
  }
  elsif ($FORM{PAYMENT_SYSTEM} == 72) {
    paysys_ipay();
  }
  elsif ($FORM{PAYMENT_SYSTEM} == 73) {
    paysys_yandex();
  }
  elsif ($FORM{PAYMENT_SYSTEM} == 77 or defined($FORM{abillserrormsg})) {
    paysys_cp_visa();
  }
  else {
    PRE_LABEL:
    my %info = ();
    $info{OPERATION_ID} = mk_unique_value(8, { SYMBOLS => '0123456789' });
    my %PAY_SYSTEM_ACCOUNTS = (
      41 => 'PAYSYS_WEBMONEY_ACCOUNTS',
      42 => 'PAYSYS_RUPAY_ID',
      43 => 'PAYSYS_SMSPROXY',
      45 => 'PAYSYS_PORTMONE_PAYEE_ID',
      46 => 'PAYSYS_UKRPAYS_SECRETKEY',
      48 => 'PAYSYS_PB_MERID',
      54 => 'PAYSYS_P24_MERCHANT_ID',
      58 => 'PAYSYS_LR_ACCOUNT_NUMBER',
      59 => 'PAYSYS_QIWI_TERMINAL_ID',
      62 => 'PAYSYS_LIQPAY_MERCHANT_ID',
      66 => 'PAYSYS_PAYPAL_RECIEVER_EMAIL',
      72 => 'PAYSYS_IPAY_MERCHANT_ID',
      73 => 'PAYSYS_YANDEX_ID',
      77 => 'PAYSYS_CP_VISA'

    );

    while (my ($k, $v) = each %PAY_SYSTEMS) {
      delete $PAY_SYSTEMS{$k} if (!$conf{ $PAY_SYSTEM_ACCOUNTS{$k} });
    }

    $info{PAY_SYSTEM_SEL} = $html->form_select(
      'PAYMENT_SYSTEM',
      {
        SELECTED => $FORM{PAYMENT_SYSTEM},
        SEL_HASH => \%PAY_SYSTEMS,
        NO_ID    => 1
      }
    );

    return $html->tpl_show(_include('paysys_main', 'Paysys'), \%info, { OUTPUT2RETURN => $attr->{OUTPUT2RETURN} });
  }
}

#**********************************************************
#
#**********************************************************
sub paysys_log {

  if ($Paysys::VERSION < 4.01) {
    $html->message('info', "UPDATE", "Please update module 'Paysys' to version 4.01 or higher. http://abills.net.ua/");
    return 0;
  }

  if ($FORM{info}) {
    $Paysys->info({ ID => $FORM{info} });
    my @info_arr = split(/\n/, $Paysys->{INFO});
    my $table = $html->table({ width => '100%' });
    foreach my $line (@info_arr) {
      my ($k, $v) = split(/,/, $line, 2);
      $table->addrow($k, $v);
    }

    $Paysys->{INFO} = $table->show();
    $table = $html->table(
      {
        width   => '500',
        caption => $_INFO,
        rows    => [
          [ "ID",            $Paysys->{ID} ],
          [ "$_LOGIN",       $Paysys->{LOGIN} ],
          [ "$_DATE",        $Paysys->{DATETIME} ],
          [ "$_SUM",         $Paysys->{SUM} ],
          [ "$_COMMISSION",  $Paysys->{COMMISSION} ],
          [ "$_PAY_SYSTEM",  $PAY_SYSTEMS{ $Paysys->{SYSTEM_ID} } ],
          [ "$_TRANSACTION", $Paysys->{TRANSACTION_ID} ],
          [ "$_USER IP",     $Paysys->{IP} ],
          [ "PAYSYS IP",     $Paysys->{PAYSYS_IP} ],
          [ "$_INFO",        $Paysys->{INFO} ],
          [ "$_STATUS",      $status[ $Paysys->{STATUS} ] ],

        ],
        ID => 'PAYSYS_INFO'
      }
    );

    print $table->show();
  }
  elsif (defined($FORM{del}) && $FORM{is_js_confirmed}) {
    $Paysys->del($FORM{del});

    if (!$Paysys->{errno}) {
      $html->message('info', $_DELETE, "$_DELETED $FORM{del}");
    }
  }

  if ($Paysys->{errno}) {
    $html->message('err', $_ERROR, "[$Paysys->{errno}] $err_strs{$Paysys->{errno}}");
  }

  my %info = ();

  if (!$user->{UID}) {
    my %ACTIVE_SYSTEMS = %PAY_SYSTEMS;

    while (my ($k, $v) = each %CONF_OPTIONS) {
      if (!$conf{$k}) {
        delete $ACTIVE_SYSTEMS{$v};
      }
    }

    $info{PAY_SYSTEMS_SEL} = $html->form_select(
      'PAYMENT_SYSTEM',
      {
        SELECTED => $FORM{PAYMENT_SYSTEM} || '',
        SEL_HASH => { '' => $_ALL, %ACTIVE_SYSTEMS },
        NO_ID    => 1
      }
    );

    $info{STATUS_SEL} = $html->form_select(
      'STATUS',
      {
        SELECTED => $FORM{STATUS} || '',
        SEL_ARRAY    => [@status],
        ARRAY_NUM_ID => 1,
        SEL_OPTIONS  => { '' => $_ALL }
      }
    );

    form_search({ SEARCH_FORM => $html->tpl_show(_include('paysys_search', 'Paysys'), { %info, %FORM }, { OUTPUT2RETURN => 1 }) });
  }

  if (!defined($FORM{sort})) {
    $LIST_PARAMS{SORT} = 1;
    $LIST_PARAMS{DESC} = DESC;
  }

  my $list  = $Paysys->list({%LIST_PARAMS});
  my $table = $html->table(
    {
      width      => '100%',
      caption    => "Paysys",
      border     => 1,
      title      => [ 'ID', "$_LOGIN", "$_DATE", "$_SUM", "$_PAY_SYSTEM", "$_TRANSACTION", "$_USER IP", "$_STATUS", '-', '-' ],
      cols_align => [ 'left', 'left', 'right', 'right', 'left', 'right', 'right', 'center:noprint', 'center:noprint' ],
      qs         => $pages_qs,
      pages      => $Paysys->{TOTAL},
      ID         => 'PAYSYS_LOG'
    }
  );

  foreach my $line (@$list) {

    $table->addrow(
      $line->[0], $html->button("$line->[1]", "index=15&UID=$line->[8]"),
      "$line->[2]", 
      "$line->[3]", 
      "$PAY_SYSTEMS{$line->[4]}", 
      $html->button("$line->[5]", "index=2&EXT_ID=$line->[5]&search=1"),
      "$line->[6]",
      "$line->[7]:$status[$line->[7]]",
      $html->button($_INFO, "index=$index&info=$line->[0]", { CLASS => 'show' }),
      ($user->{UID}) ? '-' : $html->button($_DEL, "index=$index&del=$line->[0]", { MESSAGE => "$_DEL $line->[0]?", CLASS => 'del' })
    );
  }
  print $table->show();

  $table = $html->table(
    {
      width      => '100%',
      cols_align => [ 'right', 'right', 'right', 'right' ],
      rows       => [ [ "$_TOTAL:", $html->b($Paysys->{TOTAL}), "$_SUM", $html->b($Paysys->{SUM}) ] ]
    }
  );
  print $table->show();
}

#**********************************************************
#
#**********************************************************
sub paysys_user_log {

  if ($FORM{info}) {
    $Paysys->info({ ID => $FORM{info} });

    my @info_arr = split(/\n/, $Paysys->{INFO});
    my $table = $html->table({ width => '100%' });
    foreach my $line (@info_arr) {
      my ($k, $v) = split(/,/, $line, 2);
      $table->addrow($k, $v) if ($k =~ /STATUS/);
    }

    $Paysys->{INFO} = $table->show({ OUTPUT2RETURN => 1 });

    $table = $html->table(
      {
        width => '500',
        rows =>
        [ [ "ID", $Paysys->{ID} ], 
        [ "$_LOGIN", $Paysys->{LOGIN} ], 
        [ "$_DATE", $Paysys->{DATETIME} ], 
        [ "$_SUM", $Paysys->{SUM} ], 
        [ "$_PAY_SYSTEM", $PAY_SYSTEMS{ $Paysys->{SYSTEM_ID} } ], 
        [ "$_TRANSACTION", $Paysys->{TRANSACTION_ID} ], 
        [ "$_USER IP", $Paysys->{IP} ], 
        [ "$_INFO", $Paysys->{INFO} ] ]
      }
    );

    print $table->show();
  }

  if (!defined($FORM{sort})) {
    $LIST_PARAMS{SORT} = 1;
    $LIST_PARAMS{DESC} = DESC;
  }

  my $list  = $Paysys->list({%LIST_PARAMS});
  my $table = $html->table(
    {
      width      => '100%',
      caption    => "Paysys",
      border     => 1,
      title      => [ 'ID', "$_LOGIN", "$_DATE", "$_SUM", "$_PAY_SYSTEM", "$_TRANSACTION", "IP", '-' ],
      cols_align => [ 'left', 'left', 'right', 'right', 'left', 'right', 'right', 'center:noprint' ],
      qs         => $pages_qs,
      pages      => $Paysys->{TOTAL},
      ID         => 'PAYSYS'
    }
  );

  foreach my $line (@$list) {

    $table->addrow($line->[0], 
    $line->[1], 
    "$line->[2]", 
    "$line->[3]", 
    "$PAY_SYSTEMS{$line->[4]}", 
    $line->[5], "$line->[6]", 
    $html->button($_INFO, "index=$index&info=$line->[0]"));
  }
  print $table->show();

  $table = $html->table(
    {
      width      => '100%',
      cols_align => [ 'right', 'right', 'right', 'right' ],
      rows       => [ [ "$_TOTAL:", $html->b($Paysys->{TOTAL}), "$_SUM:", $html->b($Paysys->{SUM}) ] ]
    }
  );
  print $table->show();

}

#**********************************************************
#
#**********************************************************
sub paysys_webmoney () {

  if ($FORM{FALSE}) {
    $html->message('err', $_ERROR, "$_FAILED $_TRANSACTION ID: $FORM{LMI_PAYMENT_NO}");
  }
  elsif ($FORM{LMI_PAYMENT_NO}) {
    my $users = Users->new($db, $admin, \%conf);
    my $user = $users->info($FORM{UID});

    if ($user->{errno}) {
      $html->message('err', $_ERROR, "$_ERROR $user->{errno}");
    }
    elsif ($user->{TOTAL} < 0) {
      $html->message('err', $_ERROR, "$_NOT_EXIST");
    }
    else {
      if ($conf{PAYSYS_LMI_RESULT_URL}) {
        $html->message('info', $_INFO, "$_ADDED ID: $FORM{LMI_PAYMENT_NO}");
      }
      else {
        my $list = $Paysys->list({ TRANSACTION_ID => "$FORM{'LMI_PAYMENT_NO'}", UID => $LIST_PARAMS{UID} });

        if ($Paysys->{TOTAL} > 0) {
          $html->message('info', $_INFO, "$_ADDED $_SUM: $list->[0][3] ID: $FORM{LMI_PAYMENT_NO}");

          if ($conf{PAYSYS_EMAIL_NOTICE}) {
            my $message = "\n" . "System: Webmoney\n" . "$_DATE: $DATE $TIME\n" . "$_LOGIN: $user->{LOGIN} [$LIST_PARAMS{UID}]\n" . "\n" . "\n" . "ID: $FORM{LMI_PAYMENT_NO}\n" . "$_SUM: $list->[0][3]\n";

            sendmail("$conf{ADMIN_MAIL}", "$conf{ADMIN_MAIL}", "Paysys Webmoney Add", "$message", "$conf{MAIL_CHARSET}", "2 (High)");

          }
        }
        else {
          $html->message('err', $_ERROR, "$_FAILED ID: $FORM{LMI_PAYMENT_NO} $_ERR_NO_TRANSACTION");
        }
      }
    }

    return 0;
  }

  my %info = ();
  $info{LMI_PAYMENT_NO} = $FORM{OPERATION_ID};

  if ($conf{PAYSYS_WEBMONEY_TESTMODE}) {
    my ($LMI_MODE, $LMI_SIM_MODE) = split(/:/, $conf{PAYSYS_WEBMONEY_TESTMODE}, 2);
    $info{TEST_MODE} = "
   <input type='hidden' name='LMI_SIM_MODE' value='$LMI_SIM_MODE'>
   <font color='red'>$_TEST_MODE (LMI_MODE: $LMI_MODE, LMI_SIM_MODE: $LMI_SIM_MODE)</font>";
  }

  my @ACCOUNTS = split(/;/, $conf{PAYSYS_WEBMONEY_ACCOUNTS});
  $info{ACCOUNTS_SEL} = $html->form_select(
    'LMI_PAYEE_PURSE',
    {
      SELECTED  => $FORM{sum_val},
      SEL_ARRAY => \@ACCOUNTS,
      NO_ID     => 1
    }
  );

  $info{LMI_PAYMENT_AMOUNT} = $FORM{SUM};
  my $pay_describe = "Login: $LIST_PARAMS{LOGIN}, UID: $LIST_PARAMS{UID}";
  $info{DESCRIBE}              = $pay_describe;
  $info{LMI_PAYMENT_DESC}      = ($conf{dbcharset} eq 'utf8') ? convert($pay_describe, { utf82win => 1 }) : $pay_describe;
  $conf{PAYSYS_LMI_RESULT_URL} = "http://$ENV{SERVER_NAME}" . (($ENV{SERVER_PORT} != 80) ? ":$ENV{SERVER_PORT}" : '') . "/paysys_check.cgi" if (!$conf{PAYSYS_LMI_RESULT_URL});

  $html->tpl_show(_include('paysys_webmoney_add', 'Paysys'), \%info);
}

#**********************************************************
# version Ver. 2.0.005
#**********************************************************
sub paysys_ukrpays () {
  my ($attr) = @_;

  if ($FORM{FALSE}) {
    $html->message('err', $_ERROR, "$_FAILED $_TRANSACTION ID: $FORM{OPERATION_ID}");
    return 0;
  }
  if ($FORM{TRUE}) {
    my $list = $Paysys->list({ INFO => "*$FORM{'OPERATION_ID'}*", UID => $LIST_PARAMS{UID} });
    if ($Paysys->{TOTAL} > 0) {
      $html->message('info', $_INFO, "$_ADDED $_SUM: $list->[0]->[3] $_TRANSACTION ID: '$FORM{OPERATION_ID}' ");
    }
    else {
      $html->message('err', $_ERROR, "$_FAILED $_TRANSACTION ID: $FORM{OPERATION_ID} $_NOT_EXIST");
      return 0;
    }
    return 1;
  }

  my %info = (UID => $LIST_PARAMS{UID});
  $info{AMOUNT} = sprintf("%.2f", $FORM{SUM});
  $conf{PAYSYS_UKRPAYS_URL} = 'https://ukrpays.com/frontend/frontend.php' if (!$conf{PAYSYS_UKRPAYS_URL});

  return $html->tpl_show(_include('paysys_ukrpays_add', 'Paysys'), \%info, { OUTPUT2RETURN => $attr->{OUTPUT2RETURN} });
}

#**********************************************************
#
#**********************************************************
sub paysys_periodic () {
  my ($attr) = @_;

  my $debug = $attr->{DEBUG} || 0;
  my $debug_output = '';
  $debug_output .= "Paysys: Daily periodic payments\n" if ($debug > 1);

  if ($conf{PAYSYS_PORTMONE_PAYEE_ID}) {
    $ADMIN_REPORT{DATE} = $DATE if (!$ADMIN_REPORT{DATE});
    my ($y, $m, $mday) = split(/-/, $ADMIN_REPORT{DATE});

    #replace the parameters with your own values..
    $mon  = $m - 1;
    $year = $y - 1900;
    my $timestamp = mktime(0, 0, 0, $mday, $mon, $year, 0, 0, -1);

    my $DATE = strftime "%Y-%m-%d", localtime($timestamp - 86400);
    my $res_arr = paysys_portmone_result(0, { DEBUG => $debug, DATE => $DATE });

    my %res_hash = ();
    for (my $i = 0 ; $i < $#{$res_arr} ; $i++) {
      $res_hash{ $res_arr->[$i]{ordernumber} } = $i;
    }

    my $list = $Paysys->list({ DATE => $DATE, PAYMENT_SYSTEM => 45, INFO => '-' });
    my $users = Users->new($db, $admin, \%conf);
    foreach my $line (@$list) {

      #Add payments to abills
      $debug_output .= "Unfinished payment ID: $line->[0]/$line->[5]\n" if ($debug > 2);
      if (defined($res_hash{ $line->[5] })) {
        my $uid       = $line->[8];
        my $sum       = $line->[3];
        my $order_num = $line->[5];
        my $user      = $users->info($uid);
        $payments->add(
          $user,
          {
            SUM          => $sum,
            DESCRIBE     => 'PORTMONE',
            METHOD       => ($conf{PAYSYS_PAYMENTS_METHODS} && $PAYSYS_PAYMENTS_METHODS{54}) ? 54 : '2',
            EXT_ID       => "PM:$order_num",
            CHECK_EXT_ID => "PM:$order_num"
          }
        );

        #Exists
        if ($payments->{errno} && $payments->{errno} == 7) {
          $status = 8;
        }
        elsif ($payments->{errno}) {
          $status = 4;
        }
        else {
          $Paysys->change(
            {
              ID   => $line->[0],
              INFO => "APPROVALCODE: $res_arr->[$res_hash{$line->[5]}]{approvalcode}"
            }
          );
          $status = 1;
        }

        if ($conf{PAYSYS_EMAIL_NOTICE}) {
          my $message = "\n" . "System: Portmone\n" . "DATE: $DATE $TIME\n" . "LOGIN: $user->{LOGIN} [$uid]\n" . "\n" . "\n" . "ID: $line->[0]\n" . "SUM: $sum\n";

          sendmail("$conf{ADMIN_MAIL}", "$conf{ADMIN_MAIL}", "Paysys Portmone Add", "$message", "$conf{MAIL_CHARSET}", "2 (High)");

        }
        $debug_output .= "Add payments TRANSACTION_ID: $line->[5]\n" if ($debug > 0);
      }
    }
  }

  $DEBUG .= $debug_output;
  return $debug_output;
}

#**********************************************************
# portmone get result
#=commencts
#
#<?xml version='1.0' encoding='windows-1251' standalone='yes'?>
#<portmoneresult count='<???-?? ????????>'>
#	<request>
#		<shopordernumber>??????????? ???????? SHOPORDERNUMBER</shopordernumber>
#		<shop_id>??????????? ???????? SHOP_ID</shop_id>
#		<paymenttype>??????????? ???????? PAYMENTTYPE</paymenttype>
#		<startdate>??????????? ???????? STARTMONTH/STARTDAY/STARTYEAR</startdate>
#		<enddate>??????????? ???????? ENDMONTH/ENDDAY/ENDYEAR</enddate>
#		<success>??????????? ???????? SUCCESS</success>
#	</request>
#	<orders>
#		<order>
#			<ordernumber>????? ??????</ordernumber>
#			<description>???????????</ description >
#			<orderdate>????</orderdate>
#			<total>?????</total>
#			<currency>??? ??????</currency>
#			<approvalcode>??? ???????????</approvalcode>
#			<billnumber>????? ???????</billnumber>
#			<billdate>???? ???????</billdate>
#			<error_code>??? ?????? ??????????????? ??????</error_code>
#			<error_message>??????????? ?????? ??????????????? ??????</error_ message>
#		</order>
#		<order>
#			...
#		</order>
#		...
#	</orders>
#</portmoneresult>
#
#
#=end
#**********************************************************
sub paysys_portmone_result () {
  my ($order_id, $attr) = @_;

  my $debug = $attr->{DEBUG} || 0;
  my $request = "https://www.portmone.com.ua/secure/bills/results.php?SHOPORDERNUMBER=$order_id&SHOP_ID=$conf{PAYSYS_PORTMONE_PAYEE_ID}&LOG=$conf{PAYSYS_PORTMONE_LOG}&PASS=$conf{PAYSYS_PORTMONE_PASS}";

  #my $request = 'https://192.168.0.40:9443/test.xml';
  my $ex_params = '&PAYMENTTYPE=1';

  if ($attr->{DATE}) {
    my ($y, $m, $d) = split(/-/, $attr->{DATE});
    $ex_params = "&STARTDAY=$d&STARTMONTH=$m&STARTYEAR=$y&ENDDAY=$d&ENDMONTH=$m&ENDYEAR=$y";
  }
  my $cmd = "/usr/local/bin/curl -s --insecure --url '$request$ex_params' -A \"Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\"\n";
  if ($debug > 4) {
    print $cmd;
  }

  my $request_result = `$cmd`;

  my @res_array    = split(/\n[\r]?/, $request_result);
  my %request_hash = ();
  my $request_end  = 0;
  my $cure_object  = 0;
  my $objects      = 0;
  my @orders       = ();

  foreach my $line (@res_array) {
    if ($line =~ /<portmoneresult count='(\d+)'>/) {
      $objects = $1;
    }
    elsif ($line =~ /<\/request>/) {

      #print "End request\n";
      $request_end = 1;
    }
    elsif ($line =~ /<\/order>/) {
      $cure_object++;
    }
    elsif (!$request_end && $line =~ /<(\S+)>(.+)<\/\S+>/) {
      $request_hash{$1} = $2;
    }
    elsif ($line =~ /<(\S+)>(.+)<\/\S+>/) {
      $orders[$cure_object]{$1} = $2;
    }
  }

  if ($debug > 0) {
    print "Objects: $objects\n";
    while (my ($k, $v) = each %request_hash) {
      print "$k, $v\n";
    }

    my $i = 0;
    foreach my $obj (@orders) {
      print "Order: $i\n";
      while (my ($k, $v) = each %$obj) {
        print "  $k, $v\n";
      }
      $i++;
    }
  }

  if ($attr->{CHECK}) {
    if ($orders[0]{total}) {
      return 1;
    }
    else {
      return 0;
    }
  }

  return \@orders;
}

#**********************************************************
#?SHOPORDERNUMBER=23432432&BILL_AMOUNT=10&APPROVALCODE=12121&RESULT=0
#  http://portmone.ua
#**********************************************************
sub paysys_portmone () {

  if ($FORM{RESULT}) {
    $html->message('err', $_ERROR, "$_FAILED $_TRANSACTION ID: $FORM{SHOPORDERNUMBER}");
  }
  elsif ($FORM{SHOPORDERNUMBER}) {

    if ($FORM{TRUE}) {
      my $list = $Paysys->list(
        {
          TRANSACTION_ID => "$FORM{'SHOPORDERNUMBER'}",
          UID            => $LIST_PARAMS{UID},
        }
      );

      if ($Paysys->{TOTAL} > 0) {
        $html->message('info', $_INFO, "$_ADDED $_SUM: $list->[0][3] ID: $FORM{SHOPORDERNUMBER }");

        if ($conf{PAYSYS_EMAIL_NOTICE}) {
          my $message = "\n" . "System: Portmone\n" . "$_DATE: $DATE $TIME\n" . "$_LOGIN: $user->{LOGIN} [$LIST_PARAMS{UID}]\n" . "\n" . "\n" . "ID: $FORM{SHOPORDERNUMBER }\n" . "$_SUM: $list->[0][3]\n";

          sendmail("$conf{ADMIN_MAIL}", "$conf{ADMIN_MAIL}", "Paysys Portmone Add", "$message", "$conf{MAIL_CHARSET}", "2 (High)");

        }
      }
      else {
        $html->message('err', $_ERROR, "$_FAILED ID: $FORM{SHOPORDERNUMBER} $_ERR_NO_TRANSACTION");
      }
    }
    else {
      $html->message('err', $_ERROR, "$_BALANCE_RECHARCHE; $_FAILED ID: $FORM{SHOPORDERNUMBER} $_ERR_NO_TRANSACTION");
    }
    return 0;
  }
  else {

    #Info section

    $Paysys->add(
      {
        SYSTEM_ID      => 45,
        DATETIME       => "'$DATE $TIME'",
        SUM            => $FORM{SUM},
        UID            => $user->{UID},
        IP             => $FORM{IP},
        TRANSACTION_ID => "$FORM{OPERATION_ID}",
        INFO           => '-',
        PAYSYS_IP      => "$ENV{'REMOTE_ADDR'}"
      }
    );

    if ($Paysys->{errno}) {
      $html->message('err', "$_ERROR", "$_ERROR Paysys ID: '$FORM{OPERATION_ID}'");
    }
  }

  my %info = ();

  if (!$conf{PAYSYS_PORTMONE_PAYEE_ID}) {
    $html->message('err', "$_ERROR", " $_NOT_EXIST " . '$conf{PAYSYS_PORTMONE_PAYEE_ID}');
    return 0;
  }

  $conf{PAYSYS_LMI_RESULT_URL} = "http://$ENV{SERVER_NAME}" . (($ENV{SERVER_PORT} != 80) ? ":$ENV{SERVER_PORT}" : '') . "/paysys_check.cgi" if (!$conf{PAYSYS_LMI_RESULT_URL});

  if ($html->{language} eq 'english') {
    $info{LANG} = 'en';
  }
  elsif ($html->{language} eq 'ukraine') {
    $info{LANG} = 'uk';
  }
  else {
    $info{LANG} = 'ru';
  }

  $html->tpl_show(_include('paysys_portmone_add', 'Paysys'), \%info);
}

#**********************************************************
#
#**********************************************************
sub paysys_smsproxy {
  my %info = ();

  if ($FORM{CODE}) {
    my $list = $Paysys->info({ CODE => "$FORM{CODE}", UID => 0 });

    if ($Paysys->{TOTAL} > 0) {
      my @info_arr = split(/, /, $Paysys->{INFO});
      my $INFO_HASH = ();
      foreach my $l (@info_arr) {
        my ($k, $v) = split(/: /, $l, 2);
        $INFO_HASH{$k} = $v;
      }

      if ($Paysys->{UID} > 0) {
        $html->message('err', $_ERROR, "$_FAILED");
      }
      else {
        my $users = Users->new($db, $admin, \%conf);
        my $user = $users->info($LIST_PARAMS{UID});

        if ($user->{errno}) {
          $html->message('err', $_ERROR, "$_ERROR $user->{errno}");
        }
        elsif ($user->{TOTAL} < 0) {
          $html->message('err', $_ERROR, "$_NOT_EXIST");
        }
        else {

          #Exchange rate
          my $er = 1;
          $payments->exchange_info(0, { SHORT_NAME => "SMSPROXY" });
          if ($payments->{TOTAL} > 0) {
            $er = $payments->{ER_RATE};
          }

          $payments->add(
            $user,
            {
              SUM          => $Paysys->{SUM},
              DESCRIBE     => 'SMSProxy',
              METHOD       => '2',
              EXT_ID       => $Paysys->{TRANSACTION_ID},
              CHECK_EXT_ID => $Paysys->{TRANSACTION_ID},
              ER           => $er
            }
          );

          if ($payments->{errno} && $payments->{errno} == 7) {
            $html->message('err', $_ERROR, "$_EXIST");
            return 0;
          }
          elsif ($payments->{errno}) {
            $html->message('err', $_ERROR, "$_ERROR ID: $Paysys->{TRANSACTION_ID}");
          }
          else {
            $status = "Added $payments->{INSERT_ID}\n";
            $html->message('info', $_INFO, "$_ADDED $_SUM: $Paysys->{SUM} ID: $INFO_HASH{ID}");
            if ($conf{PAYSYS_EMAIL_NOTICE}) {
              my $message = "\n" . "System: SMS PROXY\n" . "$_DATE: $DATE $TIME\n" . "$_LOGIN: $user->{LOGIN} [$LIST_PARAMS{UID}]\n" . "\n" . "\n" . "ID: $Paysys->{INFO}\n" . "$_SUM: $Paysys->{SUM}\n";

              sendmail("$conf{ADMIN_MAIL}", "$conf{ADMIN_MAIL}", "Paysys Webmoney Add", "$message", "$conf{MAIL_CHARSET}", "2 (High)");
            }
          }

        }
        return 0;
      }

      $html->message('info', $_INFO, "$_TRANSACTION_PROCESSING $_SUM: $list->[0][3] ID: $FORM{OPERATION_ID}");
    }
    else {
      $html->message('err', $_ERROR, "$_FAILED $_NOT_EXIST");
    }
  }

  $html->tpl_show(_include('paysys_smsproxy_add', 'Paysys'), \%info);
}

#**********************************************************
#
#**********************************************************
sub paysys_rupay {

  my %info = ();

  if ($FORM{FALSE}) {
    $html->message('err', $_ERROR, "$_FAILED ID: $FORM{OPERATION_ID}");
  }
  elsif ($FORM{TRUE}) {
    my $list = $Paysys->list({ TRANSACTION_ID => "$FORM{OPERATION_ID}", UID => $LIST_PARAMS{UID} });

    if ($Paysys->{TOTAL} > 0) {
      $html->message('info', $_INFO, "$_TRANSACTION_PROCESSING $_SUM: $list->[0][3] ID: $FORM{OPERATION_ID}");
    }
    else {
      $html->message('err', $_ERROR, "$_FAILED ID: $FORM{OPERATION_ID} $_ERR_NO_TRANSACTION");
    }

    return 0;
  }

  $info{SUM_VAL_SEL} = $html->form_select(
    'sum_val',
    {
      SELECTED  => $FORM{sum_val},
      SEL_ARRAY => [ USD, EUR, UAH, RUR ],
      NO_ID     => 1
    }
  );

  $info{OPERATION_ID} = $FORM{OPERATION_ID};
  $info{SUM}          = $FORM{SUM};
  $info{DESCRIBE}     = $FORM{DESCRIBE};

  $html->tpl_show(_include('paysys_rupay_add', 'Paysys'), \%info);
}

#**********************************************************
# 80567161228 vadim
# vadim.ignatkin@pbank.com.ua
#**********************************************************
sub paysys_privatbank {
  my %info = ();

  my $payment_system    = 'PBANK';
  my $payment_system_id = 48;
  my $order_id          = $FORM{orderid};

  if ($FORM{FALSE}) {
    if ($FORM{reasoncode} == 11) {
      $FORM{reasoncodedesc} = "$ERR_INVALID_SIGNATURE";
    }
    elsif ($FORM{reasoncode} == 2) {
      $FORM{reasoncodedesc} = "$ERR_TRANSACTION_DECLINED";
    }
    $html->message('err', $_ERROR, "$_FAILED ID: $FORM{orderid} [$FORM{reasoncode}/$FORM{responsecode}] $FORM{reasoncodedesc} ");
    $html->setCookie('lastindex', "", "Fri, 1-Jan-2038 00:00:01", $web_path, $domain, $secure);

    return 0;
  }
  elsif ($FORM{TRUE}) {
    my $list = $Paysys->list(
      {
        TRANSACTION_ID => "$FORM{orderid}",
        UID            => $LIST_PARAMS{UID}
      }
    );

    if ($Paysys->{TOTAL} > 0) {
      $html->message('info', $_INFO, "$_ADDED $_SUM: $list->[0][3] ID: $FORM{OPERATION_ID}");
    }
    else {
      $html->message('err', $_ERROR, "$_FAILED ID: $FORM{OPERATION_ID} $_ERR_NO_TRANSACTION");
    }
    $html->setCookie('lastindex', "", "Fri, 1-Jan-2038 00:00:01", $web_path, $domain, $secure);

    return 0;
  }
  else {
    if ($FORM{SUM} <= 0) {
      $html->message('info', $_ERROR, "$ERR_WRONG_SUM $FORM{SUM}");
      return 0;
    }

    #Info section
    $Paysys->add(
      {
        SYSTEM_ID      => $payment_system_id,
        DATETIME       => "'$DATE $TIME'",
        SUM            => $FORM{SUM},
        UID            => $user->{UID},
        IP             => "$ENV{'REMOTE_ADDR'}",
        TRANSACTION_ID => "$FORM{OPERATION_ID}",
        INFO           => '-',
        PAYSYS_IP      => "$ENV{'REMOTE_ADDR'}"
      }
    );

    if ($Paysys->{errno}) {
      $html->message('err', "$_ERROR", "$_ERROR Paysys ID: '$FORM{OPERATION_ID}'");
      return 0;
    }

  }

  $html->setCookie('lastindex', "$index", "Fri, 1-Jan-2038 00:00:01", $web_path, $domain, $secure);
  $info{OPERATION_ID}   = $FORM{OPERATION_ID};
  $info{AMOUNT}         = sprintf("%.12d", int($FORM{SUM} * 100));
  $info{AMOUNT2}        = sprintf("%.12d", int($info{AMOUNT2}));
  $info{AdditionalData} = "index=$index&UID=$user->{UID}";

  #SHA1 signature
  #----------------------------
  use Digest::SHA1;

  my $ctx = Digest::SHA1->new;
  $ctx->add($conf{PAYSYS_PB_PW} . $conf{PAYSYS_PB_MERID} . '414963' . $info{OPERATION_ID} . $info{AMOUNT} . '980' . $info{AMOUNT2} . '840' . $info{AdditionalData});
  $info{HASH}            = $ctx->b64digest();
  $info{SignatureMethod} = 'SHA1';
  $info{HASH}            = $info{HASH} . '=';
  $info{DESCRIBE}        = $FORM{DESCRIBE};

  $html->tpl_show(_include('paysys_pb_add', 'Paysys'), \%info);
}

#**********************************************************
#
#**********************************************************
sub paysys_p24_get_payments {
  require "modules/Paysys/P24.pm";

  if ($FORM{PAYMENTS}) {
    paysys_import_form();
    return 0;
  }

  my $total_in      = 0;
  my $total_out     = 0;
  my $total_in_sum  = 0;
  my $total_out_sum = 0;

  $table = $html->table(
    {
      width    => '100%',
      rowcolor => $_COLORS[0],
      rows     => [
        [
          "$_FROM: ", $html->date_fld2('START_DATE', { MONTHES => \@MONTHES, FORM_NAME => 'stats', WEEK_DAYS => \@WEEKDAYS }),
          "$_TO: ",
          $html->date_fld2('END_DATE', { MONTHES => \@MONTHES, FORM_NAME => 'stats', WEEK_DAYS => \@WEEKDAYS }),
          $html->form_input('show', $_SHOW, { TYPE => 'submit', OUTPUT2RETURN => 1 })
        ]
      ],
      ID => 'STATS_PERIODS_SEARCH',
    }
  );

  print $html->form_main(
    {
      CONTENT => $table->show({ OUTPUT2RETURN => 1 }),
      HIDDEN  => {
        sid   => "$sid",
        index => "$index",
        UID   => "$UID",
        UIDS  => "$FORM{UIDS}",
      },
      NAME => 'stats'
    }
  );

  my $info = p24({ HISTORY => 1, DATE => $DATE, %FORM });

  my ($BINDING_FIELD, $BINDING_EXPR);
  if ($conf{PAYSYS_P24_EXPR}) {
    ($BINDING_FIELD, $BINDING_EXPR) = split(/:/, $conf{PAYSYS_P24_EXPR}, 2);
  }

  #print %{ $info->{data}->{info}->[0]->{vitiazsybr}->[0]->{row} };

  my $table = $html->table(
    {
      caption     => "$_LOG",
      title_plain => [ 'ID', "$_USER ($BINDING_FIELD)", "$_REST", "$_COMMENTS", $_DATE, "$_SUM", 'card', 'cardamount', 'termainal' ],
      width       => '100%',
      header      => "<script language=\"JavaScript\" type=\"text/javascript\">
<!-- 
function CheckAllINBOX() {
  for (var i = 0; i < document.FORM_IMPORT.elements.length; i++) {
    if(document.FORM_IMPORT.elements[i].type == 'checkbox' && document.FORM_IMPORT.elements[i].name == 'IDS'){
      document.FORM_IMPORT.elements[i].checked =         !(document.FORM_IMPORT.elements[i].checked);
    }
  }
}
//-->
</script>\n
<a href=\"javascript:void(0)\" onClick=\"CheckAllINBOX();\">$_SELECT_ALL</a>\n"
    }
  );

  if ($info->{data}->{info}->[0]->{error}) {
    $html->message('err', $_ERROR, "$info->{data}->{info}->[0]->{error}->[0]");
    return 0;
  }

  my %BINDING_IDS = ();

  if ($conf{PAYSYS_P24_MERCHANT_YUR}) {
    my %added_payments;
    my $payments_ids = ();
    if ($conf{PAYSYS_P24_EXPR}) {
      while (my ($k, $v) = each %{ $info->{data}->{info}->[0]->{vitiazsybr}->[0]->{row} }) {
        $payments_ids{$k} = 1;
        next if ($v->{col}->{BPL_C_ACC}->{content} ne $conf{PAYSYS_P24_CARDNUM});
        my $describe = convert($v->{col}->{BPL_OSND}->{content}, { utf82win => 1 });
        if ($describe =~ /$BINDING_EXPR/g) {
          my $ID = $k;
          $ID =~ s/ //g;
          $BINDING_IDS{$ID} = $1;
        }
      }

      #Get payments
      my $payments_extid_list = 'P24:' . join(',P24:', keys(%payments_ids));
      my $payments_list = $payments->list({ EXT_ID => $payments_extid_list, PAGE_ROWS => 10000 });
      foreach my $line (@$payments_list) {
        $line->[7] =~ s/P24://;
        $added_payments{ $line->[7] } = "$line->[0]:$line->[1]:$line->[2]";
      }

      my $ids = join(',', values %BINDING_IDS);
      my $users = Users->new($db, $admin, \%conf);
      my $list = $users->list(
        {
          $BINDING_FIELD => $ids,
          PAGE_ROWS      => 1000000
        }
      );
      my $binding_field_id = 5;
      if ($BINDING_FIELD eq 'LOGIN') {
        $binding_field_id = 0;
      }
      elsif ($BINDING_FIELD eq 'FIO') {
        $binding_field_id = 1;
      }
      elsif ($BINDING_FIELD eq 'CONTRACT_ID') {
        $binding_field_id = 5;
      }

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

    while (my ($k, $v) = each %{ $info->{data}->{info}->[0]->{vitiazsybr}->[0]->{row} }) {
      my $ID = $k;
      $ID =~ s/ //g;
      my ($LOGIN, $BIND, $UID);
      if ($BINDING_IDS{$ID} ne '') {
        ($LOGIN, $FIO, $UID, $SEARCH_FIELD) = split(/:/, $binding_hash{ $BINDING_IDS{$ID} });
      }

      my $description = convert($v->{col}->{BPL_OSND}->{content}, { utf82win => 1 });
      my $sum         = $v->{col}->{BPL_SUM}->{content};
      my $date        = $v->{col}->{BPL_DAT_OD}->{content};
      $date =~ s/([0-9\-\:\ ])/$1/;

      my $table_id_col    = '';
      my $table_login_col = '';

      if ($added_payments{$ID}) {
        my ($id, $login, $date) = split(/:/, $added_payments{$ID}, 3);
        $table_id_col = $html->button("$_ADDED", "index=2&ID=$added_payments{$ID}") . $html->br() . $html->b($login) . $html->br() . $date;
        $table_login_col = '';
      }
      else {
        $table_id_col = ($v->{col}->{BPL_C_ACC}->{content} eq $conf{PAYSYS_P24_CARDNUM} && $description ne 'Account Rechards') ? $html->form_input('IDS', "$ID", { TYPE => 'checkbox' }) . $ID : '';

        $table_login_col =
        (   ($UID > 0) ? $html->button($LOGIN, "index=15&UID=$UID") . $html->br() . $FIO . $html->br() . $html->form_input('CONTRACT_ID_' . $ID, "$BINDING_IDS{$ID}",)
          : ($v->{col}->{BPL_C_ACC}->{content} eq $conf{PAYSYS_P24_CARDNUM} && $description ne 'Account Rechards') ? $html->form_input($BINDING_FIELD . '_' . $ID, $FORM{ $BINDING_FIELD . '_' . $ID })
          :                                                                                                          '')
        . $html->form_input('UID_' . $ID,      "$UID",         { TYPE => 'hidden' })
        . $html->form_input('SUM_' . $ID,      "$sum",         { TYPE => 'hidden' })
        . $html->form_input('DATE_' . $ID,     "$date",        { TYPE => 'hidden' })
        . $html->form_input('DESCRIBE_' . $ID, "$description", { TYPE => 'hidden' })
        . $html->form_input('EXT_ID_' . $ID,   "P24:$ID",      { TYPE => 'hidden' });
      }

      $table->addrow(
        $table_id_col, $table_login_col, '', $description, $date, $sum,
        ($v->{col}->{BPL_A_ACC}->{content} eq $conf{PAYSYS_P24_CARDNUM}) ? $html->b($v->{col}->{BPL_A_ACC}->{content}) : $v->{col}->{BPL_A_ACC}->{content},
        ($v->{col}->{BPL_C_ACC}->{content} eq $conf{PAYSYS_P24_CARDNUM}) ? $html->b($v->{col}->{BPL_C_ACC}->{content}) : $v->{col}->{BPL_C_ACC}->{content}, ''
      );

      if ($v->{col}->{BPL_C_ACC}->{content} eq $conf{PAYSYS_P24_CARDNUM}) {
        $total_in++;
        $total_sum_in += $sum;
      }
      elsif ($v->{col}->{BPL_A_ACC}->{content} eq $conf{PAYSYS_P24_CARDNUM}) {
        $total_out++;
        $total_sum_out += $sum;
      }
    }
  }
  else {
    if ($conf{PAYSYS_P24_EXPR}) {
      foreach my $line (@{ $info->{data}->{info}->[0]->{statements}->[0]->{statement} }) {
        my $describe = convert($line->{'description'}, { utf82win => 1 });
        if ($describe =~ /$BINDING_EXPR/g) {
          $BINDING_IDS{ $line->{'appcode'} } = $1;
        }
      }

      my $ids = join(',', values %BINDING_IDS);
      my $users = Users->new($db, $admin, \%conf);
      my $list = $users->list(
        {
          $BINDING_FIELD => $ids,
          PAGE_ROWS      => 1000000
        }
      );
      my $binding_field_id = 5;
      if ($BINDING_FIELD eq 'LOGIN') {
        $binding_field_id = 0;
      }
      elsif ($BINDING_FIELD eq 'FIO') {
        $binding_field_id = 1;
      }
      elsif ($BINDING_FIELD eq 'CONTRACT_ID') {
        $binding_field_id = 5;
      }

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

    foreach my $line (@{ $info->{data}->{info}->[0]->{statements}->[0]->{statement} }) {
      my $description = convert($line->{'description'}, { utf82win => 1 });
      my $ID = $line->{'appcode'};
      my ($LOGIN, $BIND, $UID, $CONTRACT_ID) = split(/:/, $binding_hash{ $BINDING_IDS{ $line->{'appcode'} } });
      my $date = $line->{'trandate'};
      my $sum  = $line->{'amount'};

      $table->addrow(
        $ID,
        (($binding_hash{ $BINDING_IDS{$ID} }) ? $html->button($LOGIN, "index=15&UID=$UID") . $html->br() . $BIND . ' / ' . $CONTRACT_ID : $html->form_input('UID_' . $ID, "$FORM{UID}"))
        . $html->form_input('IDS',             "$ID",          { TYPE => 'hidden' })
        . $html->form_input('UID_' . $ID,      "$UID",         { TYPE => 'hidden' })
        . $html->form_input('SUM_' . $ID,      "$sum",         { TYPE => 'hidden' })
        . $html->form_input('DATE_' . $ID,     "$date",        { TYPE => 'hidden' })
        . $html->form_input('DESCRIBE_' . $ID, "$description", { TYPE => 'hidden' }),
        $line->{'rest'},
        $description,
        $date,
        $sum,
        $line->{'card'},
        $line->{'cardamount'},
        convert($line->{'termainal'}, { utf82win => 1 })
      );

      if ($line->{'card'} eq $conf{PAYSYS_P24_CARDNUM}) {
        $total_in++;
        $total_sum_in += $sum;
      }
      elsif ($v->{col}->{BPL_A_ACC}->{content} eq $conf{PAYSYS_P24_CARDNUM}) {
        $total_out++;
        $total_sum_out += $sum;
      }
    }

    while (my ($k, $v) = each %{ @{ $info->{data}->{info} }[0]->{cardbalance}->[0] }) {
      $table->addrow($k, $v->[0]) if ($k ne 'card');
    }
  }

  print $html->form_main(
    {
      CONTENT => $table->show() . $_PAYMENTS . ' ' . $html->form_input(PAYMENTS, 1, { TYPE => 'checkbox' }),
      HIDDEN => { index  => "$index", },
      SUBMIT => { IMPORT => "IMPORT" },
      NAME   => 'FORM_IMPORT'
    }
  );

  $table = $html->table(
    {
      width      => '100%',
      cols_align => [ 'right', 'right', 'right', 'right' ],
      rows       => [ [ "IN $_TOTAL:", $html->b($total_in), "$_SUM", $html->b($total_in_sum) ], [ "OUT $_TOTAL:", $html->b($total_out), "$_SUM", $html->b($total_out_sum) ] ]
    }
  );
  print $table->show();

}

#**********************************************************
#
#**********************************************************
sub paysys_p24 {
  require "modules/Paysys/P24.pm";

  paysys_p24_get_payments();
  return 0 if ($conf{PAYSYS_P24_MERCHANT_YUR});

  my $info = p24({ CARD_INFO => $conf{'PAYSYS_P24_CARDNUM'} });

  if ($info->{data}->{error}) {
    $html->message('err', $_ERROR, "$info->{data}->{error}->[0]->{message}");
  }

  my $table = $html->table(
    {
      caption => 'CARD_INFO',
      width   => '100%'
    }
  );

  while (my ($k, $v) = each %{ $info->{data}->{info}->[0]->{cardbalance}->[0]->{card}->[0] }) {
    $table->addrow($k, $v->[0]);
    $table->{caption} = 'CARD: ' . $v->[0] if ($k eq 'account');
  }

  while (my ($k, $v) = each %{ @{ $info->{data}->{info} }[0]->{cardbalance}->[0] }) {
    $table->addrow($k, $v->[0]) if ($k ne 'card');
  }

  print $table->show();
}

#**********************************************************
# User portal payments system with privat 24
#**********************************************************
sub paysys_privatbank_p24 {
  my %info = ();

  if ($FORM{OrderID}) {
    my $list = $Paysys->list(
      {
        TRANSACTION_ID => "$FORM{OrderID}",
        UID            => $LIST_PARAMS{UID}
      }
    );

    if ($Paysys->{TOTAL} > 0) {
      $Paysys->info({ ID => $list->[0][0] });

      if ($Paysys->{INFO} =~ /STATE: ok/) {
        $html->message('info', $_INFO, "$_ADDED $_SUM: $list->[0][3] ID: $FORM{OrderID}");
      }
      elsif ($Paysys->{INFO} =~ /STATE: test/) {
        $html->message('info', $_INFO, "$_ADDED $_SUM: $list->[0][3] ID: $FORM{OrderID} ($_TEST_PAYMENT)");
      }
      else {
        $html->message('err', $_ERROR, "$_FAILED ID: $FORM{OrderID}");
      }

    }
    else {
      $html->message('err', $_ERROR, "$_FAILED ID: $FORM{OrderID} $_ERR_NO_TRANSACTION");
    }

    $html->setCookie('lastindex', "", "Fri, 1-Jan-2038 00:00:01", $web_path, $domain, $secure);
    return 0;
  }
  else {
    if ($FORM{SUM} <= 0) {
      $html->message('info', $_ERROR, "$ERR_WRONG_SUM $FORM{SUM}");
      return 0;
    }

    #Info section
    $Paysys->add(
      {
        SYSTEM_ID      => 54,
        DATETIME       => "'$DATE $TIME'",
        SUM            => $FORM{SUM},
        UID            => $user->{UID},
        IP             => "$ENV{'REMOTE_ADDR'}",
        TRANSACTION_ID => "$FORM{OPERATION_ID}",
        INFO           => '-',
        PAYSYS_IP      => "$ENV{'REMOTE_ADDR'}"
      }
    );

    if ($Paysys->{errno}) {
      $html->message('err', "$_ERROR", "$_ERROR Paysys ID: '$FORM{OPERATION_ID}'");
      return 0;
    }

  }

  $conf{PAYSYS_P24_MERCHANT_CURRENCY}='USD' if(! $conf{PAYSYS_P24_MERCHANT_CURRENCY}); 

  $html->setCookie('lastindex', "$index", "Fri, 1-Jan-2038 00:00:01", $web_path, $domain, $secure);
  $html->tpl_show(_include('paysys_privatbank_p24_add', 'Paysys'), { %info, %$user });
}

#**********************************************************
# User portal payments system with LiqPAY
#**********************************************************
sub paysys_liqpay {
  require "modules/Paysys/Liqpay.pm";
  my %info = ();

  if ($FORM{TRUE} || $FORM{status}) {
    my $order_id = $FORM{order_id} || $FORM{OPERATION_ID};

    my $list = $Paysys->list(
      {
        TRANSACTION_ID => "$order_id",
        UID            => $LIST_PARAMS{UID}
      }
    );

    if ($Paysys->{TOTAL} > 0) {
      $html->message('info', $_INFO, "$_ADDED $_SUM: $list->[0][3] ID: $order_id");
    }
    else {
      $html->message('err', $_ERROR, "$_FAILED ID: $order_id $_ERR_NO_TRANSACTION");
    }

    $html->setCookie('lastindex', "", "Fri, 1-Jan-2038 00:00:01", $web_path, $domain, $secure);
    return 0;
  }
  else {
    $info{COMMISSION_SUM} = 0;
    if ($FORM{SUM} <= 0) {
      $html->message('info', $_ERROR, "$ERR_WRONG_SUM $FORM{SUM}");
      return 0;
    }

    if ($conf{PAYSYS_LIQPAY_COMMISSION}) {
      $conf{PAYSYS_LIQPAY_COMMISSION} =~ /([0-9\.]+)([\%]?)/;
      $info{COMMISSION} = $1;
      my $type = $2;

      if ($type) {
        $info{COMMISSION_SUM} = sprintf("%.2f", $FORM{SUM} / 100 * $info{COMMISSION});
      }
      else {
        $info{COMMISSION_SUM} = sprintf("%.2f", $info{COMMISSION});
      }
    }

    #Info section
    $Paysys->add(
      {
        SYSTEM_ID      => 62,
        DATETIME       => "'$DATE $TIME'",
        SUM            => $FORM{SUM},
        COMMISSION     => $info{COMMISSION_SUM},
        UID            => $user->{UID},
        IP             => "$ENV{'REMOTE_ADDR'}",
        TRANSACTION_ID => "$FORM{OPERATION_ID}",
        INFO           => '-',
        PAYSYS_IP      => "$ENV{'REMOTE_ADDR'}",
        STATUS         => 1
      }
    );

    if ($Paysys->{errno}) {
      $html->message('err', "$_ERROR", "$_ERROR Paysys ID: '$FORM{OPERATION_ID}'");
      return 0;
    }
  }

  $FORM{TOTAL_SUM} = sprintf("%.2f", $FORM{SUM} + $info{COMMISSION_SUM});
  my %methods = (
    'card'   => "Visa/Master Card",
    'liqpay' => "LiqPAY"
  );

  $info{PAY_WAY_SEL} = $html->form_select(
    'METHOD',
    {
      SELECTED => $FORM{METHOD},
      SEL_HASH => \%methods,
      NO_ID    => 1
    }
  );

  $html->setCookie('lastindex', "$index", "Fri, 1-Jan-2038 00:00:01", $web_path, $domain, $secure);
  
  ($info{SIGN}, $info{XML_ENCODED}) =  liqpay_make_request();
    
  $html->tpl_show(_include('paysys_liqpay_add', 'Paysys'), { %info, %$user });
}

#**********************************************************
# Payment system: Liberty Reserver
# https://www.libertyreserve.com
#
#  $conf{PAYSYS_LR_ACCOUNT_NUMBER} = "U4035898"; # Enter your account
#  $conf{PAYSYS_LR_STORE_NAME} = ""; # Enter the name of your store
#  $conf{PAYSYS_LR_SECURITY_WORD} = ""; # Your store's security word
#  $conf{PAYSYS_LR_EMAIL} = ""; # Your e-mail
#
#**********************************************************
sub paysys_lr {
  my ($attr) = @_;

  if ($FORM{FALSE}) {
    $html->message('err', $_ERROR, "$_FAILED $_TRANSACTION ID: $FORM{OPERATION_ID}");
    return 0;
  }
  elsif ($FORM{TRUE}) {
    my $list = $Paysys->list({ TRANSACTION_ID => "LR:$FORM{OPERATION_ID}", UID => $LIST_PARAMS{UID} });
    if ($Paysys->{TOTAL} > 0) {
      $html->message('info', $_INFO, "$_ADDED $_SUM: $list->[0]->[3] $_TRANSACTION ID: LR:$FORM{OPERATION_ID}");
    }
    else {
      $html->message('err', $_ERROR, "$_FAILED ID: $FORM{OPERATION_ID} $_ERR_NO_TRANSACTION");
    }
    return 0;
  }

  my %info = ();
  $html->setCookie('lastindex', "$index", "Fri, 1-Jan-2038 00:00:01", $web_path, $domain, $secure);
  $conf{PAYSYS_LMI_RESULT_URL} = "http://$ENV{SERVER_NAME}" . (($ENV{SERVER_PORT} != 80) ? ":$ENV{SERVER_PORT}" : '') . "/paysys_check.cgi" if (!$conf{PAYSYS_LMI_RESULT_URL});
  $html->tpl_show(_include('paysys_lr_add', 'Paysys'), \%info);
}

#**********************************************************
# Paysys OSMP QIWI
#**********************************************************
sub paysys_qiwi {
  my %info = ();
  require "modules/Paysys/Qiwi.pm";

  my $payment_system    = 'QIWI';
  my $payment_system_id = 59;

  if ($FORM{send_invoice}) {
    $FORM{COMMENT} = $user->{LOGIN};
    my $result = qiwi_invoice_request(\%FORM);

    if ($result->{'result-code'}->[0]->{fatal} eq 'true') {
      my $error = "$result->{'result-code'}->[0]->{content}";
      if ($result->{'result-code'}->[0]->{content} == 150) {
        $error .= "$ERR_TERMINAL";
      }
      $html->message('err', "$_ERROR", "$_ERROR: $error");
    }
    else {
      $html->message('info', "$_INFO", "$_INVOICE_SENDED ID: '$FORM{OPERATION_ID}'\n$_PHONE: $FORM{PHONE}");
      $Paysys->add(
        {
          SYSTEM_ID      => $payment_system_id,
          DATETIME       => "'$DATE $TIME'",
          SUM            => $FORM{SUM},
          UID            => $user->{UID},
          IP             => "$ENV{'REMOTE_ADDR'}",
          TRANSACTION_ID => "$FORM{OPERATION_ID}",
          INFO           => '-',
          PAYSYS_IP      => "$ENV{'REMOTE_ADDR'}",
          STATUS         => 1,
        }
      );
    }

    return 0;
  }

  if (in_array('Dv', \@MODULES)) {
    use Dv;

    #    use Tariffs;
    my $Dv = Dv->new($db, $admin, \%conf);

    #    my $Tariffs  = Tariffs->new($db, \%conf, $admin);
    $Dv = $Dv->info($user->{UID});

    #    print "Content-Type: text/html\n\n";
    #    print "$info{SUM}=($Dv->{MONTH_ABON} > $info{SUM}) ? $Dv->{MONTH_ABON} : $info{SUM};";
    if ($Dv->{MONTH_ABON} > $FORM{SUM}) {
      $FORM{SUM}      = $Dv->{MONTH_ABON};
      $info{DESCRIBE} = "$_TARIF_PLAN_SUM";
    }
  }

  $html->tpl_show(_include('paysys_qiwi_add', 'Paysys'), \%info);
}

#**********************************************************
#
#**********************************************************
sub paysys_qiwi_list {
  my %info = ();
  require "modules/Paysys/Qiwi.pm";

  my $list = $Paysys->list({ %LIST_PARAMS, PAYMENT_SYSTEM => 59, INFO => '-' });
  my $table = $html->table(
    {
      width      => '100%',
      caption    => "Paysys",
      border     => 1,
      title      => [ 'ID', "$_LOGIN", "$_DATE", "$_SUM", "$_PAY_SYSTEM", "$_TRANSACTION", "IP", "$_STATUS", '-' ],
      cols_align => [ 'left', 'left', 'right', 'right', 'left', 'right', 'right', 'center:noprint', 'center:noprint' ],
      qs         => $pages_qs,
      pages      => $Paysys->{TOTAL},
      ID         => 'PAYSYS'
    }
  );

  my %status_hash = (
    10  => ' ',
    20  => '  ',
    25  => '',
    30  => '',
    48  => '  ',
    49  => '  ',
    50  => '',
    51  => ' (51)',
    58  => '',
    59  => '  ',
    60  => '',
    61  => '',
    125 => '   ',
    130 => '  ',
    148 => '  . ',
    149 => '  . ',
    150 => '  ( /)',
    160 => ' ',
  );

  my @ids_arr = ();
  foreach my $line (@$list) {
    push @ids_arr, $line->[5];
  }

  my $result = qiwi_status({ IDS => \@ids_arr });

  my %res_hash = ();
  foreach my $id (keys %{ $result->{'bills-list'}->[0]->{bill} }) {
    $res_hash{$id} = $result->{'bills-list'}->[0]->{bill}->{$id}->{status};
  }

  foreach my $line (@$list) {
    $table->addrow(
      $line->[0], $html->button("$line->[1]", "index=15&UID=$line->[8]"),
      "$line->[2]", "$line->[3]", "$PAY_SYSTEMS{$line->[4]}", $html->button("$line->[5]", "index=2&EXT_ID=QIWI:$line->[5]&search=1"),
      "$line->[6]",
      $status_hash{ $res_hash{ $line->[5] } },
      $html->button($_INFO, "index=$index&info=$line->[0]"),
    );
  }
  print $table->show();

  $table = $html->table(
    {
      width      => '100%',
      cols_align => [ 'right', 'right', 'right', 'right' ],
      rows       => [ [ "$_TOTAL:", $html->b($Paysys->{TOTAL}), "$_SUM", $html->b($Paysys->{SUM}) ] ]
    }
  );
  print $table->show();

}

#**********************************************************
# User portal payments system with privat 24
#**********************************************************
sub paysys_paypal {
  my %info = ();
  require "modules/Paysys/Paypal.pm";

  if ($FORM{cancel}) {
    $html->message('err', $_ERROR, "$_FAILED ID: $FORM{OPERATION_ID} Cancel");
  }
  elsif ($FORM{finish}) {
    $Paysys->info({ CODE => $FORM{OPERATION_ID} });
    if ($Paysys->{TOTAL} > 0) {
      if ($Paysys->{UID} != $LIST_PARAMS{UID}) {
        $html->message('err', $_ERROR, "$_FAILED ID: $FORM{OPERATION_ID}");
      }
      else {
        if ($Paysys->{STATUS} == 2) {
          $html->message('info', $_INFO, "$_ADDED $_SUM: $Paysys->{SUM} $_TRANSACTION ID: $FORM{OPERATION_ID}");
        }
        elsif ($Paysys->{STATUS} == 0) {
          my $resArray = CallPaymentDetails('', '', $FORM{OPERATION_ID});
          my $result = '';
          while (my ($k, $v) = each %$resArray) {
            $v =~ s/\%([A-Fa-f0-9]{2})/pack('C', hex($1))/seg;
            $result .= "$k -> $v\n";
          }

          if ($resArray->{status} eq 'COMPLETED') {
            $Paysys->change(
              {
                ID     => $Paysys->{ID},
                STATUS => 2,
                INFO   => "$result"
              }
            );

            my $ext_id = "$Paysys->{TRANSACTION_ID}";
            $payments->add(
              $user,
              {
                SUM          => $Paysys->{SUM},
                DESCRIBE     => 'Paypal',
                METHOD       => ($conf{PAYSYS_PAYMENTS_METHODS} && $PAYSYS_PAYMENTS_METHODS{$payment_system_id}) ? $payment_system_id : '2',
                EXT_ID       => $ext_id,
                CHECK_EXT_ID => $ext_id,
              }
            );
          }
          else {
            $html->message('err', $_ERROR, "$_FAILED ID: $FORM{OPERATION_ID} / $Paysys->{TRANSACTION_ID}");
          }

          $html->message('info', $_INFO, "$_ADDED $_SUM: $Paysys->{SUM} $_TRANSACTION ID: $FORM{OPERATION_ID}");

        }
        else {
          $html->message('err', $_ERROR, "$_FAILED ID: $FORM{OPERATION_ID} / $Paysys->{TRANSACTION_ID}/ $Paysys->{STATUS}");
        }
      }
    }
    else {
      $html->message('err', $_ERROR, "$_FAILED $_TRANSACTION: $FORM{OPERATION_ID} $_NOT_FOUND");
    }
    $html->setCookie('lastindex', "", "Fri, 1-Jan-2038 00:00:01", $web_path, $domain, $secure);
    return 0;
  }
  else {
    if ($FORM{SUM} <= 0) {
      $html->message('info', $_ERROR, "$ERR_WRONG_SUM $FORM{SUM}");
      return 0;
    }

    if ($Paysys->{errno}) {
      $html->message('err', "$_ERROR", "$_ERROR Paysys ID: '$FORM{OPERATION_ID}'");
      return 0;
    }
    else {
      my $ipnNotificationUrl = "https://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/paysys_check.cgi";
      my $returnUrl          = "https://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}$ENV{REQUEST_URI}?OPERATION_ID=$FORM{OPERATION_ID}&PAYMENT_SYSTEM=66&index=$index&finish=1";
      my $cancelUrl          = "https://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}$ENV{REQUEST_URI}?OPERATION_ID=$FORM{OPERATION_ID}&PAYMENT_SYSTEM=66&index=$index&cancel=1";
      my $trackingId         = $FORM{OPERATION_ID};
      my $actionType         = 'PAY';

      my $resArray = CallPay($actionType, $cancelUrl, $returnUrl, [ $conf{PAYSYS_PAYPAL_RECIEVER_EMAIL} ], [ $FORM{SUM} ], $receiverPrimaryArray, [ $FORM{OPERATION_ID} ], $feesPayer, $ipnNotificationUrl, $memo, $pin, $preapprovalKey, $reverseAllParallelPaymentsOnError, $senderEmail, $trackingId);

      #Info section
      $Paysys->add(
        {
          SYSTEM_ID      => $payment_system_id,
          DATETIME       => "'$DATE $TIME'",
          SUM            => $FORM{SUM},
          UID            => $user->{UID},
          IP             => "$ENV{'REMOTE_ADDR'}",
          TRANSACTION_ID => "$payment_system:" . $resArray->{"payKey"},
          INFO           => "$FORM{OPERATION_ID}",
          CODE           => "$FORM{OPERATION_ID}",
          PAYSYS_IP      => "$ENV{'REMOTE_ADDR'}"
        }
      );

      #print "Content-Type: text/html\n\n";

      if ($resArray->{'responseEnvelope.ack'} eq 'Success') {
        $html->setCookie('lastindex', "$index", "Fri, 1-Jan-2038 00:00:01", $web_path, $domain, $secure);
        if ("" eq $preapprovalKey) {

          # redirect for web approval flow
          my $cmd = "cmd=_ap-payment&paykey=" . $resArray->{"payKey"};
          $info{PP_LINK} = RedirectToPayPal($cmd, { OUTPUT2RETURN => undef });
        }
        else {

          # payKey is the key that you can use to identify the payment resulting from the Pay call
          my $payKey = $resArray->{"payKey"};

          # paymentExecStatus is the status of the payment
          my $paymentExecStatus = $resArray->{"paymentExecStatus"};
        }
      }
      else {
        $html->message('err', $_ERROR, "$_FAILED ID: $FORM{OrderID}");

        print "Content-Type: text/html\n\n";
        while (my ($k, $v) = each %$resArray) {
          print "$k, $v <br>";
        }

        return 0;
      }
    }
  }

  $html->tpl_show(_include('paysys_paypal_add', 'Paysys'), { %info, %$user });
}

#**********************************************************
# User portal payments system with Ipay
#**********************************************************
sub paysys_ipay () {

  if ($FORM{ipay_transaction}) {
    if ($FORM{ipay_transaction} ne 'FALSE') {
      my $list = $payments->list({ INNER_DESCRIBE => $FORM{ipay_transaction}, PAGE_ROWS => 1 });
      if ($list->[0]->[0]) {
        $html->message('info', $_INFO, "$_ADDED $_TRANSACTION: $FORM{ipay_transaction}");
      }
      else {
        $html->message('err', $_ERROR, "$_FAILED");
      }
    }
    else {
      $html->message('err', $_ERROR, "$_FAILED");
    }
  }
  else {

    my %info = ();
    my $sum;
    $info{IPAY_PAYMENT_NO} = $FORM{OPERATION_ID};

    if ($FORM{SUM} =~ /^(\d+)\.?(\d+)?$/) {
      $sum = "$1$2";
    }
    $info{amount_with_point} = $FORM{SUM};
    $info{amount}            = $sum;
    my $pay_describe = "Login: $LIST_PARAMS{LOGIN}, Transaction: $FORM{OPERATION_ID}, UID: $LIST_PARAMS{UID}";
    $info{desc} = $pay_describe;

    #$conf{PAYSYS_LMI_RESULT_URL} = "http://$ENV{SERVER_NAME}". ( ($ENV{SERVER_PORT}!= 80) ? ":$ENV{SERVER_PORT}" : '' ) ."/paysys_check.cgi" if (! $conf{PAYSYS_LMI_RESULT_URL});
    return $html->tpl_show(_include('paysys_ipay_add', 'Paysys'), \%info, { OUTPUT2RETURN => $attr->{OUTPUT2RETURN} });
  }
}

#**********************************************************
# User portal payments system with Cyberplat Visa
#**********************************************************
sub paysys_cp_visa () {

  if (defined($FORM{abillserrormsg})) {
    my @AbillsErrorMsg = ('Transaction successfuly added', 'User not found', 'Billing system error', 'Dublicate payment', 'Transaction error');

    $html->message('err', $_ERROR, "$_FAILED - $AbillsErrorMsg[$FORM{abillserrormsg}]");

    #print 'lol';
  }
  else {
    my @fio;
    my $users = Users->new($db, $admin, \%conf);
    $user = $users->info($LIST_PARAMS{UID});
    $users->pi({ UID => $LIST_PARAMS{UID} });
    (@fio) = split(' ', $users->{FIO});

    my %info = ();
    my $sum;
    $info{PAYMENT_NO} = $FORM{OPERATION_ID};

    if ($FORM{SUM} =~ /^(\d+)\.?(\d+)?$/) {
      $sum = "$1$2";
    }
    $info{amount_with_point} = $FORM{SUM};
    $info{desc}              = $FORM{DESCRIBE};

    if ($conf{PAYSYS_CP_VISA_TEST_MODE} == 1) {
      $info{lastname}   = 'Ivanov';
      $info{firstname}  = 'Ivan';
      $info{middlename} = 'Ivanovich';
      $info{email}      = 'support@cyberplat.com';
      $info{phone}      = 7445 - 4060;
    }
    else {
      $info{lastname}   = $fio[0]         || '';
      $info{firstname}  = $fio[1]         || '';
      $info{middlename} = $fio[2]         || '';
      $info{email}      = $users->{EMAIL} || '';
      $info{phone}      = $users->{PHONE} || '';

    }

    return $html->tpl_show(_include('paysys_cyberplat_visa', 'Paysys'), \%info, { OUTPUT2RETURN => $attr->{OUTPUT2RETURN} });
  }
}

1

