#!/usr/bin/perl
# Card System


require "Cards.pm";
Cards->import();
my $Cards = Cards->new($db, $admin, $conf);

use Payments;
use Tariffs;
my $tariffs = Tariffs->new($db, \%conf, $admin);
my $payments = Payments->new($db, $admin, \%conf);

my @status = ('ENABLE', 'DISABLE', 'USED');



#**********************************************************
#
#**********************************************************
sub cards_bruteforce () {
  
  
  if ($FORM{del} &&  $FORM{is_js_confirmed}) {
	  $Cards->bruteforce_del({ UID => $FORM{del} });
    if (! $Cards->{errno}) {
  	  $html->message('info', $_DELETED, "$_DELETED ");
     }
   }
  elsif($FORM{UID}) {

    $LIST_PARAMS{UID}=$FORM{UID};
    my $list = $Cards->bruteforce_list({ %LIST_PARAMS });
    my $table = $html->table( { width      => '100%',
                                title      => ["$_USER", "PIN", "$_DATE" ],
                                cols_align => ['left', 'left', 'right'],
                                qs         => $pages_qs,
                                pages      => $Cards->{TOTAL}
                             } );

    foreach my $line (@$list) {
 	 	  $table->addrow($html->button($line->[0], "index=15&UID=$line->[4]"), 
 		      $line->[1], 
  		    $line->[2]
  		  );
     }

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

   return 0;
  }
 
  my $list = $Cards->bruteforce_list({ %LIST_PARAMS });
  my $table = $html->table( { width      => '100%',
                              title      => ["$_USER", "$PERIODS[0]", "$_TOTAL", "$_DATE", '-', '-'],
                              cols_align => ['left', 'right', 'right', 'right', 'center', 'center' ],
                              qs         => $pages_qs,
                              pages      => $Cards->{TOTAL}
                            });


  foreach my $line (@$list) {
 		$table->addrow($html->button($line->[0], "index=15&UID=$line->[4]"), 
 		      $line->[1], 
  		    $line->[2],
  		    $line->[3],
  		    $html->button("$_SHOW", "index=$index&UID=$line->[4]"), 
  		    $html->button($_DEL, "index=$index$pages_qs&del=$line->[4]", { MESSAGE => "$_DEL [$line->[0]] ?" })
  		  );
   }

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

}


#**********************************************************
#
#**********************************************************
sub cards_payments () {
  
 
  if ($FORM{add}) {
    if (! $FORM{SUM} || $FORM{SUM} == 0 ) {
      $html->message('err', $_ERROR, "$_NO_SUM");
     }
    else {
      my $export = '';
    	my $begin = $FORM{BEGIN} || 0;
  	  my $count = $FORM{COUNT} || 0;
  	  
  	  my $i = 0;
  	  my $added=0;
  	  for(my $i=$begin; $i<$begin+$count; $i++) {
#        REPLAY:
          my $pin = mk_unique_value($FORM{PASSWD_LENGTH}, { SYMBOLS => $FORM{PASSWD_SYMBOLS} || undef });
  	 	    my $serial = sprintf("%s%.10d", $FORM{SERIAL}, $i);
          $Cards->cards_payments_add({ SERIAL    => "$FORM{SERIAL}",
        	                             NUMBER    => "$i",
            	                         PIN       => "$pin",
           	                           SUM       => "$FORM{SUM}",
        	                             STATUS    => 0,
        	                             EXPIRE    => "$FORM{EXPIRE}",
        	                             DILLER_ID => int($FORM{DILLER_ID})
        	                           });

          if ($Cards->{errno}) {
       	    $html->message('err', $_ERROR, "[$Cards->{errno}] $err_strs{$Cards->{errno}}");
       	    return 0;
           }
       $export .= (defined($FORM{EXPORT}) && $FORM{EXPORT} eq 'XML' ) ? "<CARD SERIA='$serial' PIN='$pin' SUM='$FORM{SUM}' EXPIRE='$FORM{EXPIRE}'/>\n" : "$serial\t$pin\t$FORM{SUM}\t$FORM{EXPIRE}\n";
  	   $added++;
  	   }

      $export="<?xml version=\"1.0\" encoding=\"$html->{CHARSET}\"?>\n<CARDS>\n$export</CARDS>" if ($FORM{EXPORT} eq 'XML');
   	  
 	    if ($FORM{qindex}){
        $export = ($FORM{EXPORT} eq 'XML') ? "Content-Type: text/xml\n\n$export" : "Content-Type: text/plain\n\n$export";
        print "$export";
        return 0;
   	   }
   	  else {
   	    $html->message('info', $_INFO, "$_ADDED: $added $_CARDS");
   	    print "<textarea cols='70' rows='30'>$export</textarea>\n";
   	   }
    }
 }
elsif ($FORM{change}) {
  $Cards->cards_payments_change({ %FORM  });
  if (! $Cards->{errno}) {
  	$html->message('info', $_CHANGED, "$_SERIAL: $FORM{IDS} ");
   }
}
elsif ($FORM{del}  && $FORM{is_js_confirmed} ) {
  $Cards->cards_payments_del({ SERIA => $FORM{SERIA}, NUMBER => $FORM{ID}  });
  if (! $Cards->{errno}) {
  	$html->message('info', $_DELETED, "$_SERIAL: $FORM{SERIA} ");
   }
}

  $Cards->defaults();
  $Cards->{DILLERS_SEL}=$html->form_select('DILLER_ID', 
                                         { 
 	                                         SELECTED          => $user->{DILLER_ID},
 	                                         SEL_MULTI_ARRAY   => [['', ''] , @{ $Cards->cards_dillers_list({ DISABLE => 0 }) }],
 	                                         MULTI_ARRAY_KEY   => 0,
 	                                         MULTI_ARRAY_VALUE => 1,
 	                                         NO_ID             => 1,
 	                                        });

  $Cards->{STATUS_SEL}=$html->form_select('DILLER_ID', 
                                         { 
 	                                         SEL_ARRAY   => \@status,
 	                                        });


	$html->tpl_show(_include('cards_payments', 'Cards'), $Cards);
	

my $table;
	$html->tpl_show(_include('cards_payments_search', 'Cards'), { %FORM, %$Cards });


if (defined($FORM{SERIA})) {
  $pages_qs.="&SERIA=$FORM{SERIA}";
  my @pin = ();
  @pin = ("PIN") if ($conf{CARDS_SHOW_PINS}) ;

  my $list = $Cards->cards_payments_list({ %LIST_PARAMS, SERIA => $FORM{SERIA} });
  $table = $html->table( { width      => '100%',
                           caption    => "$_SERIAL: $FORM{SERIA}",
                           title      => ["$_SERIAL", "$_NUM", "$_SUM", "$_STATUS", "$_EXPIRE", "$_ADDED", "$_DILLERS", "$_ADMINS", @pin, '-'],
                           cols_align => ['right', 'right','right','right', 'right', 'left', 'left', 'center'],
                           qs         => $pages_qs,
                           pages      => $Cards->{TOTAL}
                         });


  foreach $line (@$list) {
   	@pin = ("$line->[8]") if ($conf{CARDS_SHOW_PINS}) ;
   	$table->addrow(
   	    
   	    $line->[0]. $html->form_input("IDS", $line->[1], {TYPE => 'checkbox'}), 
  	    $line->[1],
  		  $line->[2],
        $status[$line->[3]],
  		  $line->[4],
  		  $line->[5],
  		  $line->[6],
  		  $line->[7],
  		  @pin,
  		  $html->button($_DEL, "index=$index&del=y&SERIA=$line->[0]&ID=$line->[1]", { MESSAGE => "$_DEL [$line->[0]] ?" })
  		);
    }



  print $html->form_main({ CONTENT => $table->show().
                                                      "$_DILLERS: ". $Cards->{DILLERS_SEL},
	                       HIDDEN  => { index => "$index",
	                       	            SERIA => $FORM{SERIA}   },
	                       SUBMIT  => { change  => "$_CHANGE" } 
	                        });
   
 }
else {
  my $list = $Cards->cards_payments_list({ %LIST_PARAMS });
	$table = $html->table( { width      => '100%',
                           caption    => "$_SERIAL",
                           title      => ["$_SERIAL", "$_BEGIN", "$_SUM", "$_COUNT", 
                                "$_ENABLE", "$_USED",  "$_EXPIRE", "$_ADDED", "$_ADMINS", '-', '-'],
                           cols_align => ['right', 'right','right','right', 'right', 'left', 'center'],
                           qs         => $pages_qs,
                           pages      => $Cards->{TOTAL}
                               });


  foreach $line (@$list) {
   	$table->addrow($line->[0], 
  	    $line->[1],
  		  $line->[2],
        $line->[3],
  		  $line->[4],
  		  $line->[5],
  		  $line->[6],
  		  $line->[7],
  		  $line->[8],
  		  $html->button($_SHOW, "index=$index$pages_qs&SERIA=$line->[0]"),
  		  $html->button($_DEL, "index=$index$pages_qs&del=y&SERIA=$line->[0]", { MESSAGE => "$_DEL [$line->[0]] ?" })
  		   );
    }

  print $table->show();	
}



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


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


  if ($FORM{create}) {
      my $export = '';
    	my $begin = $FORM{BEGIN} || 0;
  	  my $count = $FORM{COUNT} || 0;
  	  my $LOGIN_NUMBER = $FORM{LOGIN_BEGIN} || 0;
  	  my $generated = 0;
      my $DATA_ARRAY = ();

      if ($FORM{LOGIN_FILE}) {
      	 $html->message('info', $_INFO, "$_FILE: $FORM{LOGIN_FILE}{filename}");
       }

      if(defined($FORM{FILE_DATA})) {

      	my @rows = split(/[\r]\n/, $FORM{"FILE_DATA"}{'Contents'});

        foreach my $line (@rows) {
      	   my $other='';        	 
        	 my %USER_HASH = ();
        	 my @params = split(/\t/, $line);
           $USER_HASH{LOGIN}=$params[0];
           $USER_HASH{DILLER_ID}=int($FORM{DILLER_ID});

           if ($params[1] eq '-') {
           	 $USER_HASH{PASSWORD}=mk_unique_value($FORM{PASSWD_LENGTH}, { SYMBOLS => $FORM{PASSWD_SYMBOLS} || undef });
            }
           else {
             $USER_HASH{PASSWORD}=$params[1];
            }
            
           for(my $i=2; $i<=$#params; $i++) {
           	 #print "$params[$i]<br>\n";
           	 my($k, $v)=split(/=/, $params[$i], 2);
           	 $v =~ s/"//g;
           	 
           	 $USER_HASH{$k}=$v;
           	 if (defined($FORM{EXPORT}) && $FORM{EXPORT} eq 'XML') {
           	 	  $other.="<$k>$v</$k>";
           	  }
             else {
             	  $other.="\t$k: $v";
              }
            }

           $export .= (defined($FORM{EXPORT}) && $FORM{EXPORT} eq 'XML') ? "<LOGIN>$USER_HASH{LOGIN}</LOGIN><PASSWORD>$USER_HASH{PASSWORD}</PASSWORD><ID>$serial</ID><EXPIRE>$FORM{EXPIRE}</EXPIRE>\n" : "$USER_HASH{LOGIN}\t$USER_HASH{PASSWORD}\t$serial\t$FORM{EXPIRE}$other\n";

           push @DATA_ARRAY, { %USER_HASH };
           $generated++;
          }

      	$table = $html->table({ width  => '100%',
                                rows   => [ [$_NAME, $FORM{FILE_DATA}{filename}],
                                            ["$_SIZE", $FORM{FILE_DATA}{Size}  ]
                                           ]
                               });

      	$html->message('info', $_INFO, $table->show());
       }

#Create numeric logins
  	  for(my $i=$begin; $i<$begin+$count; $i++) {
#        REPLAY:

          my $LOGIN_LENGTH = (length("$FORM{LOGIN_PREFIX}$LOGIN_NUMBER") < $FORM{LOGIN_LENGTH}) ? $FORM{LOGIN_LENGTH} - length($FORM{LOGIN_PREFIX}) : $FORM{LOGIN_LENGTH};

          my $password = mk_unique_value($FORM{PASSWD_LENGTH}, { SYMBOLS => $FORM{PASSWD_SYMBOLS} || undef });
  	 	    my $serial = sprintf("%s%.10d", $FORM{SERIAL}, $i);
  	 	    my $login = sprintf(  "%s%.". $LOGIN_LENGTH."d", $FORM{LOGIN_PREFIX}, $LOGIN_NUMBER);
          
         
#          $Cards->cards_users_add({ LOGIN     => "$login",
#        	                          NUMBER    => "$i",
#        	                          PASSWORD  => "$password",
#        	                          SERIA     => "$serial",
#        	                          SUM       => "$FORM{SUM}",
#        	                          STATUS    => 0,
#        	                          GROUP     => int($FORM{GROUP})   });

          if ($Cards->{errno}) {
       	    $html->message('err', $_ERROR, "[$Cards->{errno}] $err_strs{$Cards->{errno}} $_LOGIN: '$login' / $_ADDED: $generated");
       	    return 0;
           }

          $export .= ($FORM{EXPORT} eq 'XML') ? "<CARD LOGIN='$login' PASSWORD='$password' ID='$serial' EXPIRE='$FORM{EXPIRE}'/>\n" : "$login\t$password\t$serial\t$FORM{EXPIRE}\n";
  	      $LOGIN_NUMBER++;
  	      $generated++;

  	      push @DATA_ARRAY, { LOGIN      => "$login",
  	      	                  PASSWORD   => "$password",
  	      	                  SERIA      => "$serial",
  	      	                  DILLER_ID  => $FORM{DILLER_ID}
 	      	                   };
  	   }

    if ($generated > 0) {
      $export="<?xml version=\"1.0\" encoding=\"$html->{CHARSET}\"?>\n<CARDS>\n$export</CARDS>" if ($FORM{EXPORT} eq 'XML');

# 	    if ($FORM{qindex}){
#        $export = ($FORM{EXPORT} eq 'XML') ? "Content-Type: text/xml\n\n$export" : "Content-Type: text/plain\n\n$export";
#        print "$export";
#        #return 0;
#   	   }
#   	  else {
   	    $html->message('info', $_INFO, "$_CREATE: $generated");
   	    print "<textarea cols='70' rows='30'>$export</textarea>\n";
#   	   }
   	 }
   	  
   return \@DATA_ARRAY;
 }
elsif ($FORM{del}  && $FORM{is_js_confirmed} ) {
  $Cards->cards_users_del({ SERIA => $FORM{SERIA}  });
  if (! $Cards->{errno}) {
  	$html->message('info', $_DELETED, "$_SERIAL: $FORM{SERIA} ");
   }
 }
  
  $Cards = $Cards->defaults();
  $Cards->{EXPARAMS}=$attr->{EXTRA_TPL};
  $Cards->{DILLERS_SEL}=$html->form_select('DILLER_ID', 
                                         { 
 	                                         SELECTED          => $FORM{DILLER_ID},
 	                                         SEL_MULTI_ARRAY   => [['', ''] , @{ $Cards->cards_dillers_list({ DISABLE => 0 }) }],
 	                                         MULTI_ARRAY_KEY   => 0,
 	                                         MULTI_ARRAY_VALUE => 1,
 	                                         NO_ID             => 1
 	                                        });

	$html->tpl_show(_include('cards_add', 'Cards'), $Cards);
}


#*******************************************************************
#
#*******************************************************************
sub cards_users_gen_confim {
  my ($attr) = @_;
  
  
  print "$attr->{LOGIN},  $attr->{PASSWORD}, $attr->{SERIA}, $attr->{DILLER_ID}/<br>";

  $Cards->cards_users_add({ %$attr });
   if ($Cards->{errno}) {
     $html->message('err', $_CARDS, "[$Cards->{errno}] $err_strs{$Cards->{errno}}");
    }

  
  return 0;
}

#*******************************************************************
# cards_users_list();
#*******************************************************************
sub cards_users {
  
  cards_users_add();

  my $list = $Cards->cards_users_list({ %LIST_PARAMS });
	$table = $html->table( { width      => '100%',
                           caption    => "$_SERIAL",
                           title      => ['ID', "$_LOGIN", "$_ADDED", "$_GROUP", "$_STATUS", "$_EXPIRE", "$_DILLERS", "$_ADMINS", '-'],
                           cols_align => ['right', 'left', 'left', 'center'],
                           qs         => $pages_qs,
                           pages      => $Cards->{TOTAL}
                          });


  foreach $line (@$list) {
   	$table->addrow(
   	    $line->[0].$html->form_input("IDS", $line->[1], {TYPE => 'checkbox'}),  
  	    $line->[1],
  		  $line->[2],
        $line->[3],
  		  $line->[4],
  		  $line->[5],
  		  $line->[6],
  		  $line->[7],
  		  $html->button($_DEL, "index=$index$pages_qs&del=y&SERIA=$line->[0]", { MESSAGE => "$_DEL [$line->[0]] ?" })
  		   );
    }



  print $html->form_main({ CONTENT => $table->show().
                                                      "$_DILLERS: ". $Cards->{DILLERS_SEL},
  	                       HIDDEN  => { index => "$index"},
	                         SUBMIT  => { change  => "$_CHANGE" } 
	                        });

  $table = $html->table({ width      => '100%',
                          cols_align => ['right', 'right'],
                          rows       => [ [ "$_TOTAL:", "<b>$Cards->{TOTAL}</b>" ] ]
                        });

  print $table->show();	
}


#**********************************************************
#
#**********************************************************
sub cards_user_payment () {
	
  if (! defined($user)) {
   	$user = Users->new($db, $admin, \%conf);
   }

	
	if ($FORM{PIN}) {
		my $BRUTE_LIMIT = ($conf{CARDS_BRUTE_LIMIT}) ? $conf{CARDS_BRUTE_LIMIT} : 5;

	 my $brute = $Cards->bruteforce_list({ UID => $LIST_PARAMS{UID} });
	 
	 if ($conf{CARDS_UMT} && $FORM{PIN} =~ /^user#/) {
	 	 #print transfer money from one account to other
	 	 my $user_new = Users->new($db, $admin, \%conf);
	 	 my (undef, $login, $password)=split(/#/, $FORM{PIN}, 3);
	 	 
	 	 $user_new->info(0, {
 	                   LOGIN    => "$login", 
 	                   PASSWORD => "$password",
 	                   DISABLE  => 0,
 	                   ACTIVATE => '0000-00-00',
 	                   EXPIRE   => "<=$DATE" 
 	                   });

	   if ($user_new->{TOTAL} > 0) {
	   	 $Cards->{TOTAL}=1;
	   	 $Cards->{SUM}=$user_new->{DEPOSIT};
	   	 $Cards->{SERIAL}='user';
	   	 $Cards->{NUMBER}="$login";

	   	 my $fees = Fees->new($db, $admin, \%conf);
       
       $fees->take($user_new, $Cards->{SUM}, { DESCRIBE => "TRANSFER TO $user->{LOGIN}" });
      
       $user_new->change($user_new->{UID}, { 
       	UID      => $user_new->{UID},
       	DISABLE  => 1 });
	   	}
     else {
     	 $Cards->{TOTAL} = -1;
      }

	  }
	 else {
	   $Cards->cards_payments_info({ %FORM });
    }
    
   if ($Cards->{error}) {
     $html->message('err', $_ERROR, "$ERR_SUPPORT");	
     return 0;
    }
	 elsif (int($Cards->{BRUTE_COUNT}) >= $BRUTE_LIMIT) {
     $html->message('err', $_ERROR, "$_BRUTE_ATACK $Cards->{BRUTE_COUNT}) >= $BRUTE_LIMIT");	
     return 0;
 	 	}
	 elsif ($Cards->{EXPIRE_STATUS} == 1) {
     $html->message('err', $_ERROR, "$_EXPIRE '$Cards->{EXPIRE}'");	
     return 0;
	  }
	 elsif ($Cards->{TOTAL} < 1) {
	 	 $html->message('err', $_ERROR, "$_NOT_EXIST");
	 	 $Cards->bruteforce_add({ UID => $LIST_PARAMS{UID}, PIN => $FORM{PIN} });
	  }
	 elsif ($Cards->{STATUS} != 0) {
	   $html->message('err', $_ERROR, "$_CARD $_DISABLE");
	   return 0;
	  }
   
   
   $user->info($LIST_PARAMS{UID});
   
   
   
   $payments->add($user, { SUM     => $Cards->{SUM},
                           METHOD  => 2, 
                           EXT_ID  => "$Cards->{SERIAL}$Cards->{NUMBER}"
                           });  


   if (! $payments->{errno}) {
     $html->message('info', $_PAYMENTS, "$_ADDED $_SUM: $Cards->{SUM}");
     $Cards->cards_payments_change({ PIN      => $FORM{PIN}, 
     	                               STATUS   => 2, 
     	                               DATETIME => "$DATE $TIME" });	
     return 0;
    }
   
	 }
	
	$html->tpl_show(_include('cards_payment_add', 'Cards'), $Cards);
	
}

#**********************************************************
#
#**********************************************************
sub cards_dillers {

 	$Cards->{ACTION}='add';
 	$Cards->{LNG_ACTION}=$_ADD;

if ($FORM{add}) {
  $Cards->cards_diller_add({ %FORM });
  if (! $Cards->{errno}) {
    $html->message('info', $_INFO, "$_ADDED");	
   }
}
elsif ($FORM{change}) {
  $Cards->cards_diller_change({ %FORM });
  if (! $Cards->{errno}) {
    $html->message('info', $_INFO, "$_CHANGED");	
   }
 }
elsif ($FORM{chg}) {
  $Cards->cards_diller_info({ ID => $FORM{chg} });
  if (! $Cards->{errno}) {
    $html->message('info', $_INFO, "$_CHANGING");	
   }
 	$Cards->{ACTION}='change';
 	$Cards->{LNG_ACTION}=$_CHANGE;

 }
elsif ($FORM{del} && $FORM{is_js_confirmed}) {
  $Cards->cards_diller_del({ ID => $FORM{del} });
  if (! $Cards->{errno}) {
    $html->message('info', $_INFO, "$_DELETED");	
   }
}

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

 
 $Cards->{DISABLE} = ($Cards->{DISABLE} == 1)? 'checked' : '';
 $html->tpl_show(_include('cards_dillers', 'Cards'), $Cards);

  my $list = $Cards->cards_dillers_list({ %LIST_PARAMS });
	$table = $html->table( { width      => '100%',
                           caption    => "$_DILLERS",
                           title      => ['ID', "$_NAME", "$_ADDRESS", "E-Mail", "$_REGISTRATION", "$_STATE", 
                              "$_USERS",  "$_PAYMENTS", '-', '-'],
                           cols_align => ['right', 'left', 'left',  'left', 'right', 'right', 'center', 'center'],
                           qs         => $pages_qs,
                           pages      => $Cards->{TOTAL}
                          });


  foreach $line (@$list) {
   	$table->addrow($line->[0], 
  	    $line->[1],
  		  $line->[2],
        $line->[3],
  		  $line->[4],
  		  $status[$line->[5]],
  		  $line->[6],
  		  $line->[7],
  		  $html->button($_CHANGE, "index=$index$pages_qs&chg=$line->[0]"),
  		  $html->button($_DEL, "index=$index$pages_qs&del=$line->[0]", { MESSAGE => "$_DEL [$line->[0]] ?" })
		   );
    }

  print $table->show();
}




1

