# Iptv web functions

use Iptv;
use Tariffs;
use Fees;
use Shedule;

my $Tariffs = Tariffs->new($db, \%conf, $admin);
my $Iptv    = Iptv->new($db, $admin, \%conf);
my $Fees    = Fees->new($db, $admin, \%conf);

my $debug          = 0;
my @status         = ($_ENABLE, $_DISABLE);
my @service_status = ("$_ENABLE", "$_DISABLE", "$_NOT_ACTIVE");

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

  $Iptv->{UID} = $uid;
  $Iptv->user_del({ UID => $uid });

  return 0;
}

#*******************************************************************
# close period
#*******************************************************************
sub iptv_close_period {

  if ($FORM{CLOSE_PERIOD}) {
    $users->config_del('IPTV_CLOSED_PERIOD');
    $users->config_add(
      {
        PARAM => 'IPTV_CLOSED_PERIOD',
        VALUE => "1"
      }
    );
  }

  $users->config_info({ PARAM => 'IPTV_CLOSED_PERIOD' });
  my $close_period = ($users->{VALUE} eq '1') ? "$_MONTH_FEE" : "$users->{VALUE}";

  my $table = $html->table(
    {
      width      => '300',
      caption    => "$_CLOSE_PERIOD",
      cols_align => [ 'left', 'left' ],
      rows       => [ [ "$_STATUS:", "$close_period" ] ],
      ID         => 'CLOSE_PERIOD'
    }
  );
  my %submit = ();

  if ($users->{VALUE} ne '1') {
    $submit{CLOSE_PERIOD} = "$_CLOSE_PERIOD";
  }

  print $html->form_main(
    {
      CONTENT => $table->show(),
      HIDDEN  => { index => "$index", },
      SUBMIT  => \%submit
    }
  );

}

#*******************************************************************
# Change user variant form
# form_chg_vid()
#*******************************************************************
sub iptv_chg_tp {
  my ($attr) = @_;

  my $user;

  if (defined($attr->{USER_INFO})) {
    $user = $attr->{USER_INFO};
    $Iptv = $Iptv->user_info($user->{UID});
    if ($Iptv->{TOTAL} < 1) {
      $html->message('info', $_INFO, $_NOT_ACTIVE);
      return 0;
    }
  }
  else {
    $html->message('err', $_ERROR, "$_USER_NOT_EXIST");
    return 0;
  }

  my $period = $FORM{period} || 0;

  if (
       $Iptv->{MONTH_ABON} > 0
    && !$Iptv->{STATUS}
    && !$users->{DISABLE}
    && ( $users->{DEPOSIT} + $users->{CREDIT} > 0
      || $Iptv->{POSTPAID_ABON}
      || $Iptv->{PAYMENT_TYPE} == 1)
  )
  {

    if ($users->{ACTIVATE} ne '0000-00-00') {
      my ($Y, $M, $D) = split(/-/, $users->{ACTIVATE}, 3);
      $M--;
      $Iptv->{ABON_DATE} = strftime "%Y-%m-%d", localtime((mktime(0, 0, 0, $D, $M, ($Y - 1900), 0, 0, 0) + 31 * 86400 + (($conf{START_PERIOD_DAY}) ? $conf{START_PERIOD_DAY} * 86400 : 0)));
    }
    else {
      my ($Y, $M, $D) = split(/-/, $DATE, 3);
      $M++;
      if ($M == 13) {
        $M = 1;
        $Y++;
      }

      if ($conf{START_PERIOD_DAY}) {
        $D = $conf{START_PERIOD_DAY};
      }
      else {
        $D = '01';
      }
      $Iptv->{ABON_DATE} = sprintf("%d-%02d-%02d", $Y, $M, $D);
    }
  }

  $shedule = Shedule->new($db, $admin);

  if ($FORM{set}) {
    if (!$permissions{0}{4}) {
      $html->message('err', $_ERROR, "$ERR_ACCESS_DENY");
      return 0;
    }

    if ($period > 0) {
      my ($year, $month, $day);
      if ($period == 1) {
        ($year, $month, $day) = split(/-/, $Iptv->{ABON_DATE}, 3);
      }
      else {
        ($year, $month, $day) = split(/-/, $FORM{DATE}, 3);
      }

      $shedule->add(
        {
          UID          => $user->{UID},
          TYPE         => 'tp',
          ACTION       => $FORM{TP_ID},
          D            => $day,
          M            => $month,
          Y            => $year,
          COMMENTS     => "$_FROM: $Dv->{TP_ID}:$Dv->{TP_NAME}",
          ADMIN_ACTION => 1,
          MODULE       => 'Iptv'
        }
      );

      if ($shedule->{errno}) {
        $html->message('err', $_ERROR, "[$shedule->{errno}] $err_strs{$shedule->{errno}}");
      }
      else {
        $html->message('info', $_CHANGED, "$_CHANGED");
        $Iptv->user_info($Iptv->{UID});
      }
    }
    else {
      $Iptv->user_change({%FORM});

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

        #Take Fees
        if ($Iptv->{TP_INFO}->{MONTH_FEE} > 0 && !$Iptv->{STATUS}) {
          iptv_get_month_fee($Iptv);
        }

        $html->message('info', $_CHANGED, "$_CHANGED");
        $Iptv->user_info($user->{UID});
        iptv_user_channels({ QUIET => 1, USER_INFO => $Iptv });
      }
    }
  }
  elsif ($FORM{del}) {
    $shedule->del(
      {
        UID => $user->{UID},
        ID  => $FORM{SHEDULE_ID}
      }
    );

    $html->message('info', $_DELETED, "$_DELETED [$FORM{SHEDULE_ID}]");
  }

  $shedule->info(
    {
      UID    => $user->{UID},
      TYPE   => 'tp',
      MODULE => 'Iptv'
    }
  );

  if ($shedule->{TOTAL} > 0) {
    $table = $html->table(
      {
        width      => '100%',
        caption    => "$_SHEDULE",
        cols_align => [ 'left', 'left' ],
        rows       => [ [ "$_TARIF_PLAN:", "$shedule->{ACTION}" ], [ "$_DATE:", "$shedule->{D}-$shedule->{M}-$shedule->{Y}" ], [ "$_ADMIN:", "$shedule->{ADMIN_NAME}" ], [ "$_ADDED:", "$shedule->{DATE}" ], [ "ID:", "$shedule->{SHEDULE_ID}" ] ]
      }
    );

    $Tariffs->{TARIF_PLAN_SEL} = $table->show() . $html->form_input('SHEDULE_ID', "$shedule->{SHEDULE_ID}", { TYPE => 'HIDDEN' });
    $Tariffs->{ACTION}         = 'del';
    $Tariffs->{LNG_ACTION}     = $_DEL;
  }
  else {
    $Tariffs->{TARIF_PLAN_SEL} = $html->form_select(
      'TP_ID',
      {
        SELECTED          => $Iptv->{TP_ID},
        SEL_MULTI_ARRAY   => $Tariffs->list({ MODULE => 'Iptv' }),
        MULTI_ARRAY_KEY   => 18,
        MULTI_ARRAY_VALUE => '0,1',
        NO_ID             => 1,
        MAIN_MENU         => ($permissions{0}{10}) ? get_function_index('iptv_tp') : undef,
        MAIN_MENU_AGRV    => "TP_ID=$Iptv->{TP_ID}"
      }
    );

    $Tariffs->{PARAMS}    .= form_period($period, { ABON_DATE => $Iptv->{ABON_DATE} });
    $Tariffs->{ACTION}     = 'set';
    $Tariffs->{LNG_ACTION} = $_CHANGE;
  }

  my $tp_index = get_function_index('iptv_tp');
  $Tariffs->{UID}     = $attr->{USER_INFO}->{UID};
  $Tariffs->{TP_ID}   = $Iptv->{TP_ID};
  $Tariffs->{TP_NAME} = "$Iptv->{TP_NUM}:$Iptv->{TP_NAME}";
  print $html->tpl_show(templates('form_chg_tp'), $Tariffs);
}

#**********************************************************
# user_iptv
#**********************************************************
sub iptv_users_list {
  if ($FORM{TP_ID}) {
    $LIST_PARAMS{TP_ID} = $FORM{TP_ID};
    $pages_qs .= "&TP_ID=$FORM{TP_ID}";
  }

  $FORM{GROUP_SEL}  = sel_groups();
  $FORM{STATUS_SEL} = $html->form_select(
    'STATUS',
    {
      SELECTED     => $FORM{STATUS},
      SEL_ARRAY    => [ '', @service_status ],
      ARRAY_NUM_ID => 1
    }
  );

  form_search({ SEARCH_FORM => $html->tpl_show(_include('iptv_users_search', 'Iptv'), {%FORM}, { notprint => 1 }) });

  print $html->letters_list({ pages_qs => $pages_qs });

  if ($FORM{letter}) {
    $LIST_PARAMS{FIRST_LETTER} = $FORM{letter};
    $pages_qs .= "&letter=$FORM{letter}";
  }

  my $list = $Iptv->user_list({%LIST_PARAMS});

  my @TITLE = ($_LOGIN, $_FIO, $_DEPOSIT, $_CREDIT, $_TARIF_PLANS, $_STATUS, 'Dv Crypt', '-');
  for (my $i = 0 ; $i < $Iptv->{SEARCH_FIELDS_COUNT} ; $i++) {
    push @TITLE, '-';
    $TITLE[ 7 + $i ] = "$_SEARCH";
  }

  if ($Iptv->{errno}) {
    $html->message('err', $_ERROR, "[$Iptv->{errno}] $err_strs{$Iptv->{errno}}");
    return 0;
  }
  elsif ($Iptv->{TOTAL} == 1) {
    $FORM{MODULE} = 'Iptv';

    form_users({ USER => user_info($list->[0]->[ $Iptv->{SEARCH_FIELDS_COUNT} + 6 ]) });
    return 0;
  }

  my $table = $html->table(
    {
      width      => '100%',
      border     => 1,
      caption    => 'IPTV',
      title      => \@TITLE,
      cols_align => [ 'left', 'left', 'right', 'right', 'left', 'center', 'left', 'center', 'center', 'center' ],
      qs         => $pages_qs,
      pages      => $Iptv->{TOTAL}
    }
  );

  foreach my $line (@$list) {
    my $payments = ($permissions{1}) ? $html->button($_PAYMENTS, "index=2&UID=" . ($line->[ $Iptv->{SEARCH_FIELDS_COUNT} + 6 ]), { CLASS => 'payments' }) : '';

    my @fields_array = ();
    for (my $i = 0 ; $i < $Iptv->{SEARCH_FIELDS_COUNT} ; $i++) {
      push @fields_array, $line->[ 7 + $i ];
    }

    $table->addrow(user_ext_menu($line->[ $Iptv->{SEARCH_FIELDS_COUNT} + 6 ], $line->[0], { EXT_PARAMS => "&MODULE=Iptv" }), "$line->[1]", "$line->[2]", "$line->[3]", "$line->[4]", $status[ $line->[5] ], "$line->[6]", @fields_array, $payments);
  }
  print $table->show();

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

  return 0;
}

#**********************************************************
# user_dv
#**********************************************************
sub iptv_user {
  my ($attr) = @_;
  $Iptv->{UID} = $FORM{UID};
  
  #Check stalker instalation
  my $Iptv_stalker;
  eval { require Iptv_stalker; };
  if (!$@) {
    Iptv_stalker->import();
    $Iptv_stalker = Iptv_stalker->new($db, $admin, \%conf);
  }

  if ($FORM{add}) {
    $Iptv->user_add({%FORM});
    if (!$Iptv->{errno}) {
      $Iptv->{ACCOUNT_ACTIVATE} = $attr->{USER_INFO}->{ACTIVATE};
      iptv_get_month_fee($Iptv) if (!$FORM{STATUS});
      $html->message('info', $_INFO, "$_ADDED");
      if ($conf{IPTV_DVCRYPT_FILENAME}) {
        dv_crypt();
      }

      if ($conf{IPTV_USER_EXT_CMD}) {
      	iptv_ext_cmd($conf{IPTV_USER_EXT_CMD}, { %$users, %$Iptv })
      }
    }
  }
  elsif ($FORM{set}) {
    $Iptv->user_change({%FORM});
    if (!$Iptv->{errno}) {
      $Iptv->{ACCOUNT_ACTIVATE} = $attr->{USER_INFO}->{ACTIVATE};
      iptv_get_month_fee($Iptv) if (!$FORM{STATUS});
      $Iptv->user_channels({ UID => $FORM{UID} });
      $html->message('info', $_INFO, "$_CHANGED");
      if ($conf{IPTV_DVCRYPT_FILENAME}) {
        dv_crypt();
      }

      if ($conf{IPTV_USER_EXT_CMD}) {
      	iptv_ext_cmd($conf{IPTV_USER_EXT_CMD}, { %$users, %$Iptv })
      }
    }
  }
  elsif ($FORM{del} && $FORM{is_js_confirmed}) {
    $Iptv->user_del();
    if (!$Iptv->{errno}) {
      $html->message('info', $_INFO, "$_CHANGED");
    }
  }

  if ($Iptv->{errno}) {
    $html->message('err', $_ERROR, "[$Iptv->{errno}] $err_strs{$Iptv->{errno}}");
  }
  my $user = $Iptv->user_info($FORM{UID});
  if ($user->{TOTAL} < 1) {
    $html->message('info', $_INFO, $_NOT_ACTIVE);
    $user               = $Iptv->defaults();
    $user->{ACTION}     = 'add';
    $user->{LNG_ACTION} = $_ACTIVATE;
    $user->{TP_NUM}     = $html->form_select(
      'TP_ID',
      {
        SELECTED          => $user->{TP_ID},
        SEL_MULTI_ARRAY   => $Tariffs->list({ MODULE => 'Iptv' }),
        MULTI_ARRAY_KEY   => 18,
        MULTI_ARRAY_VALUE => '0,1',
        NO_ID             => 1,
      }
    );

  }
  else {
    $user->{ACTION}           = 'set';
    $user->{LNG_ACTION}       = $_CHANGE;
    $user->{CHANGE_TP_BUTTON} = $html->button($_CHANGE, 'UID=' . $FORM{UID} . '&index=' . get_function_index('iptv_chg_tp'), { CLASS => 'change rightAlignText' });
  }

  $user->{STATUS_SEL} = $html->form_select(
    'STATUS',
    {
      SELECTED     => $Iptv->{STATUS},
      SEL_ARRAY    => \@service_status,
      ARRAY_NUM_ID => 1
    }
  );

  if ($Iptv_stalker) {
    $user->{MODEMS} = $html->form_select(
      'CID',
      {
        SELECTED          => $FORM{TP_ID},
        SEL_MULTI_ARRAY   => $Iptv_stalker->stalker_users_list({ UNREGISTER => 1 }),
        MULTI_ARRAY_KEY   => 0,
        MULTI_ARRAY_VALUE => 1,
      }
    );

    $user->{IPTV_MODEMS} = $html->tpl_show(_include('iptv_modems', 'Iptv'), { %$attr, %$user }, { OUTPUT2RETURN => 1 });
  }

  $html->tpl_show(_include('iptv_user', 'Iptv'), { %$attr, %$user });

  if ($user->{TOTAL} > 0) {
    iptv_user_channels({ USER_INFO => $user });
  }
}


#**********************************************************
#
#**********************************************************
sub iptv_ext_cmd {
	my ($cmd, $attr)=@_;

  if (in_array('Dhcphosts', \@MODULES)) {
  	use Dhcphosts;
    my $Dhcphosts = Dhcphosts->new($db, $admin, \%conf);
    my $hosts_list = $Dhcphosts->hosts_list({ PORTS => '!',
    	                                        UID   => $attr->{UID},
    	                                        NAS_ID=> '>0',
    	                                        NAS_IP=> '!0.0.0.0',
    	                                        COLS_NAME => 1
    	                                        });
    my $cmd_tpl = $cmd;
    my @cmd_arr = ();
    foreach my $host (@$hosts_list) {
      $cmd = tpl_parse("$cmd_tpl", { LOGIN    => $host->{login},
      	                             NAS_IP   => $host->{mng_host_port} || $host->{nas_ip},
      	                             NAS_ID   => $host->{nas},
      	                             PORT_ID  => $host->{ports},
      	                             IP       => $host->{ip},
      	                             NAS_LOGIN=> $host->{mng_user},
      	                             NAS_PASSWORD => $host->{ip},
      	                           });    	
      
      push @cmd_arr, $cmd;
    }
    
    if ($#cmd_arr > -1) {
    	$cmd = join(';', @cmd_arr);
    }
  }


  $cmd = tpl_parse("$cmd", $attr);
  
  print $cmd;
  
  my $output = `$cmd`;
}



#**********************************************************
#
#**********************************************************
#sub iptv_payments_maked {
#	my ($attr) = @_;
#
#	return '' if ($FORM{DISABLE});
#
#	$Iptv->info($attr->{USER_INFO}->{UID});
#
#  my $deposit = $attr->{USER_INFO}->{DEPOSIT} + (($attr->{USER_INFO}->{CREDIT} > 0) ? $attr->{USER_INFO}->{CREDIT} : $Dv->{TP_CREDIT});
#
#  my $abon_fees = ($attr->{USER_INFO}->{REDUCTION} ) ? $Dv->{MONTH_ABON} + $Dv->{DAY_ABON} : ($Dv->{MONTH_ABON} + $Dv->{DAY_ABON}) * (100 - $attr->{USER_INFO}->{REDUCTION}) / 100;
#
#	if ($Iptv->{STATUS} > 3 && ($deposit > $abon_fees || $Iptv->{ABON_DISTRIBUTION})) {
#		$Iptv->change({ UID     => $attr->{USER_INFO}->{UID},
#			            STATUS  => 0  });
#    $Iptv->{ACCOUNT_ACTIVATE}=$attr->{USER_INFO}->{ACTIVATE} || '0000-00-00';
#		iptv_get_month_fee($Iptv, $attr);
#	 }
#}

#**********************************************************
# Time intervals
# form_intervals()
#**********************************************************
sub iptv_nas {
  $FORM{subf} = 18;
  iptv_tp();
}

#**********************************************************
# Time intervals
# form_intervals()
#**********************************************************
sub iptv_ti_channels {
  my ($attr) = @_;

  if (defined($attr->{TP})) {
    if ($FORM{change}) {
      $Iptv->channel_ti_change({%FORM});
      if (!$Iptv->{errno}) {
        $html->message('info', $_INFO, "$_CHANGED");
      }
    }
  }
  else {
    iptv_tp({ f => 'iptv_ti_channels' });
    return 0;
  }

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

  my $pages_qs = '';

  my ($delete, $change);

  $pages_qs .= "&channels=$FORM{channels}";
  $list = $Iptv->channel_ti_list(
    {
      %LIST_PARAMS,
      TI     => $FORM{channels},
      STATUS => 0
    }
  );

  my $table = $html->table(
    {
      width      => '100%',
      caption    => $_CHANNELS,
      border     => 1,
      title      => [ "# ", "$_NUM", $_NAME, $_DESCRIBE, "$_MONTH $_PRICE", "$_DAY $_PRICE", "$_MANDATORY " ],
      cols_align => [ 'right', 'right', 'left', 'left', 'right', 'right', 'center' ],
      qs         => $pages_qs . "&TP_ID=$FORM{TP_ID}",

      #pages      => $Iptv->{TOTAL},
      ID => 'IPTV_INTERVAL_CHANNELS',
    }
  );

  foreach my $line (@$list) {
    $table->addrow(
      $html->form_input('IDS', "$line->[9]", { TYPE => 'checkbox', STATE => $line->[0] || undef }),
      $line->[1], $line->[2], $line->[3],
      $html->form_input("MONTH_PRICE_" . $line->[9], (($line->[4]) ? $line->[4] : 0.00), { SIZE => 8 }),
      $html->form_input("DAY_PRICE_" . $line->[9],   (($line->[5]) ? $line->[5] : 0.00), { SIZE => 8 }),
      $html->form_input("MANDATORY_" . $line->[9], 1, { TYPE => 'checkbox', STATE => (($line->[6]) ? 1 : undef) })
    );
  }

  form_search(
    {
      SIMPLE => {
        $_NUM      => "NUMBER",
        $_NAME     => "ROUTE_NAME",
        $_DISABLE  => "DISABLE",
        $_DESCRIBE => "DESCRIBE",
        $_PORT     => "PORT"
      },

      HIDDEN_FIELDS => {
        TP_ID    => $FORM{TP_ID},
        channels => $FORM{channels}
      }
    }
  );

  print $html->form_main(
    {
      CONTENT => $table->show(),
      HIDDEN  => {
        TP_ID       => "$FORM{TP_ID}",
        index       => "$index",
        channels    => "$FORM{channels}",
        INTERVAL_ID => "$FORM{channels}"
      },
      SUBMIT => { change => "$_CHANGE" }
    }
  );

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

  print $table->show();

}

#**********************************************************
# Time intervals
# form_intervals()
#**********************************************************
sub iptv_intervals {
  my ($attr) = @_;

  my @DAY_NAMES = ("$_ALL", $WEEKDAYS[1], $WEEKDAYS[2], $WEEKDAYS[3], $WEEKDAYS[4], $WEEKDAYS[5], $WEEKDAYS[6], $WEEKDAYS[7], "$_HOLIDAYS");
  my %visual_view = ();
  my $tarif_plan;

  if (defined($attr->{TP})) {
    $tarif_plan               = $attr->{TP};
    $tarif_plan->{ACTION}     = 'add';
    $tarif_plan->{LNG_ACTION} = $_ADD;

    if ($FORM{channels}) {
      iptv_ti_channels({ TP => $attr->{TP} });
    }
    elsif ($FORM{add}) {
      $tarif_plan->ti_add({%FORM});
      if (!$tarif_plan->{errno}) {
        $html->message('info', $_INFO, "$_INTERVALS $_ADDED");
      }
    }
    elsif ($FORM{change}) {
      $tarif_plan->ti_change($FORM{TI_ID}, {%FORM});

      if (!$tarif_plan->{errno}) {
        $html->message('info', $_INFO, "$_INTERVALS $_CHANGED [$tarif_plan->{TI_ID}]");
      }
    }
    elsif (defined($FORM{chg})) {
      $tarif_plan->ti_info($FORM{chg});
      if (!$tarif_plan->{errno}) {
        $html->message('info', $_INFO, "$_INTERVALS $_CHANGE [$FORM{chg}]");
      }

      $tarif_plan->{ACTION}     = 'change';
      $tarif_plan->{LNG_ACTION} = $_CHANGE;
    }
    elsif ($FORM{del} && $FORM{is_js_confirmed}) {
      $tarif_plan->ti_del($FORM{del});
      if (!$tarif_plan->{errno}) {
        $html->message('info', $_DELETED, "$_DELETED $FORM{del}");
      }
    }
    else {
      $tarif_plan->ti_defaults();
    }

    my $list  = $tarif_plan->ti_list({%LIST_PARAMS});
    my $table = $html->table(
      {
        width      => '100%',
        caption    => $_INTERVALS,
        border     => 1,
        title      => [ '#', $_DAYS, $_BEGIN, $_END, '-', '-', '-', '-' ],
        cols_align => [ 'left', 'left', 'right', 'right', 'right', 'center', 'center', 'center', 'center' ],
        qs         => $pages_qs,
        caption    => $_INTERVALS,
        ID         => 'IPTV_INTERVALS'
      }
    );

    my $color = "AAA000";
    foreach my $line (@$list) {

      my $delete = $html->button($_DEL, "index=$index$pages_qs&del=$line->[0]", { MESSAGE => "$_DEL [$line->[0]] ?", CLASS => 'del' });
      $color = sprintf("%06x", hex('0x' . $color) + 7000);

      #day, $hour|$end = color
      my ($h_b, $m_b, $s_b) = split(/:/, $line->[2], 3);
      my ($h_e, $m_e, $s_e) = split(/:/, $line->[3], 3);

      push(@{ $visual_view{ $line->[1] } }, "$h_b|$h_e|$color|$line->[0]");

      if (($FORM{tt} eq $line->[0]) || ($FORM{chg} eq $line->[0])) {
        $table->{rowcolor} = $_COLORS[0];
      }
      else {
        undef($table->{rowcolor});
      }

      $table->addtd(
        $table->td($line->[0], { rowspan => ($line->[5] > 0) ? 2 : 1 }),
        $table->td($html->b($DAY_NAMES[ $line->[1] ])),
        $table->td($line->[2]),
        $table->td($line->[3]),
        $table->td($html->button("$_CHANNELS", "index=$index$pages_qs&channels=$line->[0]", { BUTTON => 1 })),
        $table->td($html->button("$_CHANGE",   "index=$index$pages_qs&chg=$line->[0]",      { CLASS  => 'change' })),
        $table->td($delete), $table->td("&nbsp;", { bgcolor => '#' . $color, rowspan => ($line->[5] > 0) ? 2 : 1 })
      );

    }
    print $table->show();

  }
  elsif (defined($FORM{TP_ID})) {
    $FORM{subf} = $index;
    iptv_tp();
    return 0;
  }

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

  $table = $html->table(
    {
      width       => '100%',
      title_plain => [ $_DAYS, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 ],
      caption     => "$_INTERVALS",
      rowcolor    => $_COLORS[1]
    }
  );

  for (my $i = 0 ; $i < 9 ; $i++) {
    my @hours = ();

    my ($h_b, $h_e, $color, $p);
    my $link = "&nbsp;";
    for (my $h = 0 ; $h < 24 ; $h++) {

      if (defined($visual_view{$i})) {
        $day_periods = $visual_view{$i};

        foreach my $line (@$day_periods) {

          #print "$i -- $line    <br>\n";
          ($h_b, $h_e, $color, $p) = split(/\|/, $line, 4);
          if (($h >= $h_b) && ($h < $h_e)) {

            #     	   	 print "$i // $h => $h_b && $h <= $h_e // $color <br> \n";
            $tdcolor = '#' . $color;
            $link = $html->button('#', "index=$index&TP_ID=$FORM{TP_ID}&subf=$FORM{subf}&chg=$p", { BUTTON => 1 });
            last;
          }
          else {
            $link    = "&nbsp;";
            $tdcolor = $_COLORS[1];
          }
        }
      }
      else {
        $link    = "&nbsp;";
        $tdcolor = $_COLORS[1];
      }

      push(@hours, $table->td("$link", { align => 'center', bgcolor => $tdcolor }));
    }

    $table->addtd($table->td($DAY_NAMES[$i]), @hours);
  }

  print $table->show();

  $tarif_plan->{SEL_DAYS} = $html->form_select(
    'TI_DAY',
    {
      SELECTED     => $day_id,
      SEL_ARRAY    => \@DAY_NAMES,
      ARRAY_NUM_ID => 1
    }
  );

  $html->tpl_show(_include('iptv_ti', 'Iptv'), $tarif_plan);

}

#**********************************************************
# Tarif plans
# form_tp
#**********************************************************
sub iptv_tp {
  my $tarif_info;
  my @Payment_Types = ($_PREPAID, $_POSTPAID);
  $tarif_info               = $Tariffs->defaults();
  $tarif_info->{LNG_ACTION} = $_ADD;
  $tarif_info->{ACTION}     = 'ADD_TP';

  if ($FORM{ADD_TP}) {
    $FORM{TP_ID} = $FORM{CHG_TP_ID};
    $Tariffs->add({ %FORM, MODULE => 'Iptv' });
    if (!$Tariffs->{errno}) {
      $html->message('info', $_ADDED, "$_ADDED $Tariffs->{TP_ID}");
    }
  }
  elsif (defined($FORM{TP_ID})) {
    $tarif_info = $Tariffs->info($FORM{TP_ID});

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

    $pages_qs .= "&TP_ID=$FORM{TP_ID}&subf=$FORM{subf}";
    $LIST_PARAMS{TP} = $FORM{TP_ID};
    %F_ARGS = (TP => $Tariffs);

    $Tariffs->{NAME_SEL} = $html->form_main(
      {
        CONTENT => $html->form_select(
          'TP_ID',
          {
            SELECTED          => $FORM{TP_ID},
            SEL_MULTI_ARRAY   => $Tariffs->list({ %LIST_PARAMS, MODULE => 'Iptv' }),
            MULTI_ARRAY_KEY   => 0,
            MULTI_ARRAY_VALUE => 1,
          }
        ),
        HIDDEN => { index => "$index" },
        SUBMIT => { show  => "$_SHOW" }
      }
    );

    func_menu(
      {
        'ID'   => $Tariffs->{TP_ID},
        $_NAME => $Tariffs->{NAME_SEL}
      },
      {},
      { f_args => {%F_ARGS} }
    );

    if ($FORM{subf}) {

      return 0;
    }
    elsif ($FORM{change}) {
      $Tariffs->change($FORM{TP_ID}, { %FORM, MODULE => 'Iptv' });

      if (!$Tariffs->{errno}) {
        $html->message('info', $_CHANGED, "$_CHANGED $Tariffs->{TP_ID}");
      }
    }

    $tarif_info->{LNG_ACTION} = $_CHANGE;
    $tarif_info->{ACTION}     = 'change';

  }
  elsif (defined($FORM{del}) && $FORM{is_js_confirmed}) {
    $Tariffs->del($FORM{del});

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

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

  $tarif_info->{PAYMENT_TYPE_SEL} = $html->form_select(
    'PAYMENT_TYPE',
    {
      SELECTED     => $tarif_info->{PAYMENT_TYPE},
      SEL_ARRAY    => \@Payment_Types,
      ARRAY_NUM_ID => 1
    }
  );

  $tarif_info->{GROUPS_SEL} = $html->form_select(
    'TP_GID',
    {
      SELECTED          => $tarif_info->{TP_GID},
      SEL_MULTI_ARRAY   => [ [ '', '' ], @{ $Tariffs->tp_group_list() } ],
      MULTI_ARRAY_KEY   => 0,
      MULTI_ARRAY_VALUE => 1,
    }
  );

  $tarif_info->{REDUCTION_FEE}    = ($tarif_info->{REDUCTION_FEE})    ? 'checked' : '';
  $tarif_info->{POSTPAID_FEE}     = ($tarif_info->{POSTPAID_FEE})     ? 'checked' : '';
  $tarif_info->{PERIOD_ALIGNMENT} = ($tarif_info->{PERIOD_ALIGNMENT}) ? 'checked' : '';

  if ($conf{EXT_BILL_ACCOUNT}) {
    my $checked = ($tarif_info->{EXT_BILL_ACCOUNT}) ? ' checked' : '';
    $tarif_info->{EXT_BILL_ACCOUNT} = "<tr><td>$_EXTRA $_BILL:</td><td><input type='checkbox' name='EXT_BILL_ACCOUNT' value='1' $checked></td></tr>\n";
  }

  $html->tpl_show(_include('iptv_tp', 'Iptv'), $tarif_info);

  my $list = $Tariffs->list({ %LIST_PARAMS, MODULE => 'Iptv' });

  # Time tariff Name Begin END Day fee Month fee Simultaneously - - -
  my $table = $html->table(
    {
      width   => '100%',
      caption => "$_TARIF_PLANS",
      border  => 1,
      title   => [ '#', $_NAME, $_HOUR_TARIF, $_TRAFIC_TARIFS, $_PAYMENT_TYPE, $_DAY_FEE, $_MONTH_FEE, $_SIMULTANEOUSLY, $_AGE, $_GROUP, '-', '-', '-' ],
      cols_align => [ 'right', 'left', 'center', 'center', 'center', 'right', 'right', 'right', 'right', 'center:noprint', 'center:noprint', 'center:noprint' ],
      ID         => 'IPTV_TARIF_PLANS'
    }
  );

  my ($delete, $change);
  foreach my $line (@$list) {
    if ($permissions{4}{1}) {
      $delete = $html->button($_DEL, "index=$index&del=$line->[18]", { MESSAGE => "$_DEL $line->[0]?", CLASS => 'del' });
      $change = $html->button($_CHANGE, "index=$index&TP_ID=$line->[18]", { CLASS => 'change' });
    }

    if ($FORM{TP_ID} eq $line->[18]) {
      $table->{rowcolor} = $_COLORS[0];
    }
    else {
      undef($table->{rowcolor});
    }

    $table->addrow(
      $html->b($line->[0]),
      $html->button($line->[1], "index=$index&TP_ID=$line->[18]"),
      $bool_vals[ $line->[2] ],
      $bool_vals[ $line->[3] ],
      $Payment_Types[ $line->[4] ],
      $line->[5], $line->[6], $line->[7], $line->[8], $line->[9], $html->button($_INTERVALS, "index=" . get_function_index('iptv_intervals') . "&subf=73&TP_ID=$line->[18]", { CLASS => 'interval' }),
      $change, $delete
    );
  }

  print $table->show();

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

}

#**********************************************************
# Tarif plans
# iptv_routes
#**********************************************************
sub iptv_channels {

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

  if ($FORM{add}) {
    $Iptv->channel_add({%FORM});
    if (!$Iptv->{errno}) {
      $html->message('info', $_ADDED, "$_ADDED '$FORM{NAME}' ");
    }
  }
  elsif ($FORM{change}) {
    $Iptv->channel_change({%FORM});
    if (!$Iptv->{errno}) {
      $html->message('info', $_INFO, "$_CHANGED");
    }
  }
  elsif ($FORM{chg}) {
    $Iptv->channel_info({ %FORM, ID => $FORM{chg} });
    if (!$Iptv->{errno}) {
      $html->message('info', $_INFO, "$_CHANGED");

      $Iptv->{ACTION}     = 'change';
      $Iptv->{LNG_ACTION} = $_CHANGE;
    }
  }
  elsif (defined($FORM{del}) && $FORM{is_js_confirmed}) {
    $Iptv->channel_del($FORM{del});
    if (!$Iptv->{errno}) {
      $html->message('info', $_DELETE, "$_DELETED $FORM{del}");
    }
  }

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

  $Iptv->{DISABLE} = ' checked' if ($Iptv->{DISABLE} == 1);
  $html->tpl_show(_include('iptv_channel', 'Iptv'), $Iptv);

  my %SEARCH_FIELDS = (
    $_NUM      => "NUMBER",
    $_NAME     => "ROUTE_NAME",
    $_DISABLE  => "DISABLE",
    $_DESCRIBE => "DESCRIBE",
    $_PORT     => "PORT"
  );

  $output .= form_search({ SIMPLE => \%SEARCH_FIELDS, });

  my $list  = $Iptv->channel_list({%LIST_PARAMS});
  my $table = $html->table(
    {
      width   => '100%',
      caption => "$_CHANNELS",
      border  => 1,
      title   => [ $_NUM, $_NAME, $_DESCRIBE, "$_PORT", $_STATUS, '-', '-' ],
      cols_align => [ 'right', 'left', 'left', 'right', 'center', 'center' ],
      qs         => $pages_qs,
      pages      => $Iptv->{TOTAL},
      ID         => 'IPTV_CHANNELS',
      header     => ''
    }
  );

  my ($delete, $change);
  foreach my $line (@$list) {
    if ($permissions{4}{1}) {
      $delete = $html->button($_DEL, "index=$index&del=$line->[5]", { MESSAGE => "$_DEL $line->[1] / $line->[2]?", CLASS => 'del' });
      $change = $html->button($_CHANGE, "index=$index&chg=$line->[5]", { CLASS => 'change' });
    }

    $table->addrow($line->[0], $line->[1], $line->[2], $line->[3], $status[ $line->[4] ], $change, $delete);

  }
  print $table->show();

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

#*******************************************************************
# online users
#*******************************************************************
sub iptv_online {

  my $nas = Nas->new($db, \%conf);
  my $message;

  if ($FORM{ping}) {
    if ($FORM{ping} =~ /^(\d){1,3}\.(\d){1,3}\.(\d){1,3}\.(\d){1,3}$/) {
      my $res = `$PING -c 5 $FORM{ping}`;
      $html->message('info', $_INFO, "Ping  $FORM{ping}<br>Result:<br><pre>$res</pre>");
    }
    else {
      $html->message('err', $_ERROR, "$ERR_WRONG_DATA");
    }
  }
  elsif ($FORM{hangup}) {
    my ($nas_id, $acct_session_id, $user_name) = split(/ /, $FORM{hangup}, 4);
    $nas->info({ NAS_ID => $nas_id, SECRETKEY => $conf{secretkey} });

    if ($nas->{errno}) {
      $html->message('err', $_NAS, "$nas->{errstr}");
      return 0;
    }

    $nas_port_id = 0;
    require "Abills/nas.pl";
    my $ret = hangup($nas, "$nas_port_id", "", "$acct_session_id");

    if ($ret == 0) {
      my $table = $html->table(
        {
          width   => '100%',
          caption => $_HANGUPED,
          rows    => [ [ "$_NAS ID", $nas_id ], [ "$_NAS IP", $nas->{NAS_IP} ], [ "$_PORT", $nas_port_id ], [ "SESSION_ID", $acct_session_id ], [ "", $ret ] ]
        }
      );

      $message = $table->show();
      sleep 3;

    }
    elsif ($ret == 1) {
      $message = 'NAS NOT supported yet';
    }

    $html->message('info', $_INFO, "$message");
  }
  elsif ($FORM{zap}) {
    my ($nas_id, $acct_session_id) = split(/ /, $FORM{zap}, 3);
    $sessions->zap($nas_id, $acct_session_id);

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

    $nas->info({ NAS_ID => $nas_id, SECRETKEY => $conf{secretkey} });
    $message = "<table width=100%>
     <tr><th colspan=2 align=left>$_CLOSED</th></tr>
     <tr><td>$_NAS:</td><td>$nas->{NAS_IP} / $nas->{NAS_INDENTIFIER}</td></tr>
     <tr><td>$_PORT:</td><td>$nas_port_id</td></tr>
     <tr><td>SESSION_ID:</td><td>$acct_session_id</td></tr>
     </table>\n";

    $sessions->list(
      {
        ACCT_SESSION_ID => $acct_session_id,
        NAS_ID          => $nas->{NAS_ID}
      }
    );

    if ($sessions->{TOTAL} < 1) {
      $message .= $html->button('add to log', "index=$index&tolog=$acct_session_id&nas_id=$nas_id", { BUTTON => 1 }) . "
         " . $html->button("$_DEL", "index=$index&del=$acct_session_id&nas_id=$nas_id&nas_port_id=$nas_port_id", { BUTTON => 1 });
    }
    else {
      $message = "$_EXIST";
      $sessions->online_del(
        {
          NAS_ID          => $nas_id,
          ACCT_SESSION_ID => $acct_session_id
        }
      );

    }

    $html->message('info', $_INFO, $message);
  }
  elsif ($FORM{tolog}) {
    my $ACCT_INFO = $sessions->online_info(
      {
        NAS_ID          => $FORM{nas_id},
        ACCT_SESSION_ID => $FORM{tolog}
      }
    );

    if ($ACCT_INFO->{TOTAL} < 1) {
      $html->message('err', $_ERROR, "$_NOT_EXIST");
      return 0;
    }

    require Iptv_aaa;
    $ACCT_INFO->{ACCT_STATUS_TYPE} = 'Stop';

    $nas->info(
      {
        NAS_ID    => $ACCT_INFO->{NAS_ID},
        SECRETKEY => $conf{secretkey}
      }
    );

    Iptv_aaa->import();
    my $Acct = Iptv_aaa->new($db, \%conf);
    my $r = $Acct->accounting($ACCT_INFO, $nas, \%conf);

    if ($Acct->{errno}) {
      $html->message('err', $_ERROR, "[$Acct->{errno}] $Acct->{errstr}");
    }
    else {
      my $table = $html->table({ width => '100%' });
      while (my ($k, $v) = each %$ACCT_INFO) {
        $table->addrow($k, $v);
      }
      while (my ($k, $v) = each %$Acct) {
        $table->addrow($k, $v);
      }
      $html->message('info', $_ADDED, $table->show());
    }

    $sessions->online_del(
      {
        NAS_ID          => $ACCT_INFO->{NAS_ID},
        ACCT_SESSION_ID => $ACCT_INFO->{ACCT_SESSION_ID}
      }
    );
  }
  elsif ($FORM{del} || $FORM{dellist}) {
    if ($FORM{dellist}) {
      my @sessions_list = split(/, /, $FORM{dellist});
      $sessions->online_del({ SESSIONS_LIST => \@sessions_list });
      $FORM{del} = $FORM{dellist};
    }
    else {
      $sessions->online_del(
        {
          NAS_ID          => $FORM{nas_id},
          ACCT_SESSION_ID => $FORM{del}
        }
      );
    }

    if (!$sessions->{errno}) {
      my $table = $html->table(
        {
          width => '100%',
          rows  => [ [ "NAS_ID", $FORM{nas_id} ], [ "ACCT_SESSION_ID", $FORM{del} ] ]
        }
      );

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

  }

  $form_link = '';
  my $cure = '';

  if ($FORM{ZAPED}) {
    $LIST_PARAMS{ZAPED} = '1';
    $form_link = $html->button('On line', "index=$index", { BUTTON => 1 });
    $cure = 'Zap';
  }
  else {
    $sessions->online({ ZAPED => 'yes' });
    $form_link = $html->button($_ZAPED, "index=$index&ZAPED=1", { BUTTON => 1 }) . " ($sessions->{TOTAL})";
    $cure = 'Online';
  }

  $sessions->online({%LIST_PARAMS});
  my $dub_ports  = $sessions->{dub_ports};
  my $dub_logins = $sessions->{dub_logins};

  my $table = $html->table(
    {
      caption    => "$cure",
      width      => '100%',
      title      => [ "$_USER", "$_FIO", "CALLING_STATION_ID", "CALLING_STATION_ID", "$_DURATION", "CLIENT_IP_ADDRESS", "-", "-", "-" ],
      cols_align => [ 'left', 'left', 'right', 'right', 'right', 'right', 'right', 'right', 'right', 'center' ],
      qs         => $pages_qs,
    }
  );

  my $bg;
  my $online = $sessions->{nas_sorted};

  my $nas_list = $nas->list();

  foreach my $nas_row (@$nas_list) {
    next if (!defined($online->{ $nas_row->[0] }));

    $table->{rowcolor} = $_COLORS[0];
    $table->{extra}    = "colspan=\"9\" class=\"small\"";
    $table->addrow("$nas_row->[0]:<b>$nas_row->[1]</b>:$nas_row->[4]");

    my $l = $online->{ $nas_row->[0] };
    foreach my $line (@$l) {
      undef($table->{rowcolor});
      undef($table->{extra});
      if (defined($dub_logins->{ $line->[0] })) { $bg = '#FFFF00'; }

      #    elsif (defined($dub_ports->{$nas_row->[4]}{$line->[2]})) { $bg='#00FF40';    }
      elsif ($line->[9] == 3) { $bg = '#FF0000'; }
      else                    { $bg = ($bg eq $_COLORS[1]) ? $_COLORS[2] : $_COLORS[1]; }

      my $zap = $html->button('Z', "index=$index&zap=$nas_row->[0]+$line->[9]", { TITLE => 'Zap', BUTTON => 1 });
      my $hangup = ($FORM{ZAPED}) ? $html->form_input('dellist', "$line->[9]", { TYPE => 'checkbox', { BUTTON => 1 } }) : $html->button('H', "index=$index&hangup=$nas_row->[0]+$line->[2]+$line->[9]+$line->[0]", { TITLE => 'Hangup', BUTTON => 1 });

      $table->addrow(user_ext_menu($line->[8], $line->[0]), $line->[1], $line->[2], $line->[3], $line->[4], $line->[5], $html->button('P', "index=$index&ping=$line->[3]", { TITLE => 'Ping', BUTTON => 1 }), "$zap", "$hangup");
    }
  }

  my $table2 = $html->table(
    {
      width      => '100%',
      cols_align => [ 'right', 'right', 'right' ],
      rows       => [ [ "$_TOTAL:", $html->b($sessions->{TOTAL}), "$form_link" ] ]
    }
  );

  my $total  = $table2->show();
  my $output = $total . $table->show();

  $table = $html->table(
    {
      width       => '100%',
      title_plain => [ "$_REFRESH (sec): " . $html->form_input('REFRESH', int(($FORM{REFRESH}) ? $FORM{REFRESH} : 0), { SIZE => 4 }), $html->form_input('SHOW', $_SHOW, { TYPE => 'SUBMIT' }) ],
      cols_align => [ 'center:noprint', 'center:noprint' ],
    }
  );

  if ($FORM{ZAPED}) {
    $output = $html->form_main(
      {
        CONTENT => $output,
        HIDDEN  => {
          index => "$index",
          ZAPED => 1
        },
        SUBMIT => { go => "$_DEL" },
        METHOD => 'GET'
      }
    );
  }
  else {
    $output .= $html->form_main(
      {
        CONTENT => $table->show(),
        HIDDEN  => { index => "$index" },
        METHOD  => 'GET'
      }
    );

    $output .= $html->button('Zap All', "index=$index&zapall=1", { MESSAGE => "Do you realy want zap all sessions ?", BUTTON => 1 });
  }

  print $output;

}

#**********************************************************
# iptv_use_all_monthes();
#**********************************************************
sub iptv_use_allmonthes {

  $FORM{allmonthes} = 1;
  iptv_use();
}

#**********************************************************
# dv_use();
#**********************************************************
sub iptv_use {
  reports(
    {
      DATE   => $FORM{DATE},
      REPORT => ''
    }
  );

  my ($tables_sessions, $table_Fees);

  #Day reposrt
  if (defined($FORM{DATE})) {

    #Used Fraffic
    $table_sessions = $html->table(
      {
        width      => '100%',
        caption    => "$_SESSIONS",
        title      => [ "$_DATE", "$_USERS", "$_SESSIONS", $_DURATION, $_SUM ],
        cols_align => [ 'right', 'left', 'right', 'right', 'right' ],
        qs         => $pages_qs
      }
    );

    my $list = $sessions->reports({%LIST_PARAMS});
    foreach my $line (@$list) {
      $table_sessions->addrow($html->b($line->[0]), $html->button("$line->[1]", "index=11&subf=22&UID=$line->[5]&DATE=$line->[0]"), $line->[2], $line->[3], $html->b($line->[4]));
    }

  }
  else {

    #Used Traffic
    $table_sessions = $html->table(
      {
        width      => '100%',
        caption    => "$_SESSIONS",
        title      => [ "$_DATE", "$_USERS", "$_SESSIONS", $_DURATION, $_SUM ],
        cols_align => [ 'right', 'right', 'right', 'right', 'right' ],
        qs         => $pages_qs
      }
    );

    my $list = $sessions->reports({%LIST_PARAMS});
    foreach my $line (@$list) {
      $table_sessions->addrow($html->button($line->[0], "index=$index&$type=$line->[0]$pages_qs"), $line->[1], $line->[2], $line->[3], $html->b($line->[4]));
    }

  }

  $table = $html->table(
    {
      width      => '100%',
      caption    => $_SESSIONS,
      cols_align => [ 'right', 'right', 'right', 'right', 'right', 'right' ],
      rows => [ [ "$_USERS: " . $html->b($sessions->{USERS}), "$_SESSIONS: " . $html->b($sessions->{SESSIONS}), "$_DURATION: " . $html->b($sessions->{DURATION}), "$_SUM: " . $html->b($sessions->{SUM}) ] ],
      rowcolor => $_COLORS[2]
    }
  );

  print $table_sessions->show() . $table->show();

}

#**********************************************************
# dv_error
#**********************************************************
sub iptv_error {
  my ($attr) = @_;
  my $PAGE_ROWS = 100;
  $conf{LOGFILE} = "/usr/local/abills/var/log/abills.iptv";
  my $login = '';

  if ($attr->{USER_INFO}) {
    my $user = $attr->{USER_INFO};
    $login = $user->{LOGIN};
  }
  elsif ($FORM{LOGIN_EXPR}) {
    $login = $FORM{LOGIN_EXPR};
    $pages_qs .= "&LOGIN_EXPR=$FORM{LOGIN_EXPR}";
  }
  elsif ($FORM{UID}) {
    iptv_users();
    return 0;
  }

  if (!-f $conf{LOGFILE}) {
    $html->message('info', $_INFO, "'$conf{LOGFILE}' $_NOT_EXIST");
    return 0;
  }

  if (defined($FORM{LOG_TYPE})) {
    $pages_qs .= "&LOG_TYPE=$FORM{LOG_TYPE}";
  }

  my ($list, $types, $totals) = show_log(
    "$login",
    "$conf{LOGFILE}",
    {
      DATE      => $FORM{DATE},
      LOG_TYPE  => $FORM{LOG_TYPE},
      PG        => $PG,
      PAGE_ROWS => $PAGE_ROWS
    }
  );

  print $html->form_main(
    {
      CONTENT => "$_LOGIN: " . $html->form_input('LOGIN_EXPR', "$FORM{LOGIN_EXPR}"),
      HIDDEN  => {
        sid   => "$sid",
        index => "$index",
        UID   => "$UID"
      },
      SUBMIT => { show => "$_SHOW" }

    }
  );

  my $table = $html->table(
    {
      caption => "$_LOG",
      width   => '100%',
      pages   => $totals,
      qs      => $pages_qs
    }
  );

  foreach my $line (@$list) {
    if ($line =~ m/LOG_WARNING/i) {
      $line = "<font color='#FF0000'>$line</font>";
    }

    #  if ($line =~ m/LOG_WARNING/i) {
    #    $table->{rowcolor}='#FF0000';
    #   }
    #  else {
    #  	$table->{rowcolor}=undef;
    #   }

    $table->addrow($line);
  }
  print $table->show();

  $table = $html->table(
    {
      width      => '100%',
      cols_align => [ 'right', 'right' ]
    }
  );

  $table->addrow($html->button("$_TOTAL", "index=$index&$pages_qs"), $totals);
  while (my ($k, $v) = each %$types) {
    $table->addrow($html->button($k, "index=$index&LOG_TYPE=$k$pages_qs"), $v);
  }
  print $table->show();

}

#**********************************************************
# iptv_user_info
#**********************************************************
sub iptv_user_info {
  if ($conf{IPTV_ALLOW_GIDS}) {
    $conf{IPTV_ALLOW_GIDS} =~ s/ //g;
    my @allow_arr = split(/,/, $conf{IPTV_ALLOW_GIDS});

    if (!in_array($user->{GID}, \@allow_arr)) {
      $html->message('info', $_INFO, "$_NOT_ALLOW_GROUP");
      return 0;
    }
  }

  my $user = $Iptv->user_info($LIST_PARAMS{UID});

  if ($user->{TOTAL} < 1) {
    $html->message('info', $_INFO, "$_NOT_ACTIVE");
    return 0;
  }

  if ($conf{IPTV_USER_CHG_TP}) {
    $Iptv->{TP_CHANGE} = $html->button("$_CHANGE", 'index=' . get_function_index('iptv_user_chg_tp') . '&sid=' . $sid, { BUTTON => 1 });
  }

  $Iptv->{DISABLE} = $_ENABLE;
  $html->tpl_show(_include('iptv_user_info', 'Iptv'), $Iptv);

  iptv_user_channels({ USER_INFO => $user });
}

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

  # my $user;
  my $shedule = Shedule->new($db, $admin, \%conf);
  my $period = $FORM{period} || 0;

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

  if ($LIST_PARAMS{UID}) {
    $Iptv = $Iptv->user_info($LIST_PARAMS{UID});
    if ($Iptv->{TOTAL} < 1) {
      $html->message('info', $_INFO, "$_NOT_ACTIVE /");
      return 0;
    }
  }
  else {
    $html->message('err', $_ERROR, "$_USER_NOT_EXIST");
    return 0;
  }

  #Get TP groups
  $Tariffs->tp_group_info($Iptv->{TP_GID});

  if (!$Tariffs->{USER_CHG_TP}) {
    $html->message('err', $_ERROR, "$_NOT_ALLOW");
    return 0;
  }

  if ($Iptv->{TP_ID} == $FORM{TP_ID}) {

  }
  elsif ($FORM{set}) {
    use POSIX;

    if ($period == 1 && $conf{IPTV_USER_CHG_TP_SHEDULE}) {

      my $seltime = POSIX::mktime(0, 0, 0, $FORM{date_D}, $FORM{date_M}, ($FORM{date_Y} - 1900));

      if ($seltime <= time()) {
        $html->message('info', $_INFO, "$ERR_WRONG_DATA");
        return 0;
      }

      $FORM{date_M}++;
      $shedule->add(
        {
          UID      => $LIST_PARAMS{UID},
          TYPE     => 'tp',
          ACTION   => $FORM{TP_ID},
          D        => sprintf("%02.d", $FORM{date_D}),
          M        => sprintf("%02.d", $FORM{date_M}),
          Y        => $FORM{date_Y},
          DESCRIBE => "$message<br>
                   $_FROM: '$FORM{date_Y}-$FORM{date_M}-$FORM{date_D}'",
          MODULE => 'Iptv'
        }
      );

      if ($shedule->{errno}) {
        $html->message('err', $_ERROR, "[$shedule->{errno}] $err_strs{$shedule->{errno}}");
      }
      else {
        $html->message('info', $_CHANGED, "$_CHANGED");
        $Iptv->user_info($user->{UID});
        iptv_user_channels({ QUIET => 1, USER_INFO => $Iptv });
      }
    }
    else {

      # Get next month
      my $Y;
      my $M;
      my $D;

      if ($user->{ACTIVATE} eq '0000-00-00') {

        # Get next month
        ($Y, $M, $D) = split(/-/, $DATE, 3);
        $D = '01';
      }
      else {
        ($Y, $M, $D) = split(/-/, $user->{ACTIVATE}, 3);
      }

      $M++;
      if ($M == 13) {
        $M = 1;
        $Y++;
      }
      $M = sprintf("%02.d", $M);

      my $seltime = POSIX::mktime(0, 0, 0, $D, $M, ($Y - 1900));

      if ($seltime > time()) {
        $shedule->add(
          {
            UID      => $LIST_PARAMS{UID},
            TYPE     => 'tp',
            ACTION   => $FORM{TP_ID},
            D        => $D,
            M        => $M,
            Y        => $Y,
            DESCRIBE => "$message<br>
                   $_FROM: '$Y-$M-$D'",
            MODULE => 'Iptv'
          }
        );
      }
      else {
        $FORM{UID} = $LIST_PARAMS{UID};
        $Iptv->change({%FORM});

        if ($user->{errno}) {
          $html->message('err', $_ERROR, "[$Iptv->{errno}] $err_strs{$Iptv->{errno}}");
        }
        else {
          if ($Iptv->{TP_INFO}->{MONTH_FEE} > 0 && !$Iptv->{STATUS}) {
            iptv_get_month_fee($Iptv);
          }

          $html->message('info', $_CHANGED, "$_CHANGED");
          $Iptv->user_info($user->{UID});
        }
      }
    }

  }
  elsif ($FORM{del}) {
    $shedule->del(
      {
        UID => $LIST_PARAMS{UID},
        ID  => $FORM{SHEDULE_ID}
      }
    );

    $html->message('info', $_DELETED, "$_DELETED [$FORM{SHEDULE_ID}]");
  }

  $shedule->info(
    {
      UID      => $user->{UID},
      TYPE     => 'tp',
      DESCRIBE => "$message\n$_FROM: '$FORM{date_y}-$FORM{date_m}-$FORM{date_d}'",
      MODULE   => 'Iptv'
    }
  );

  if ($shedule->{TOTAL} > 0) {
    $Tariffs->info($shedule->{ACTION});

    $table = $html->table(
      {
        width      => '100%',
        caption    => "$_SHEDULE",
        cols_align => [ 'left', 'left' ],
        rows       => [ [ "$_TARIF_PLAN:", "$shedule->{ACTION} : $Tariffs->{NAME}" ], [ "$_DATE:", "$shedule->{Y}-$shedule->{M}-$shedule->{D}" ], [ "$_ADDED:", "$shedule->{DATE}" ], [ "ID:", "$shedule->{SHEDULE_ID}" ] ]
      }
    );
    $Tariffs->{TARIF_PLAN_SEL} = $table->show({ OUTPUT2RETURN => 1 }) . $html->form_input('SHEDULE_ID', "$shedule->{SHEDULE_ID}", { TYPE => 'HIDDEN', OUTPUT2RETURN => 1 });
    $Tariffs->{ACTION}         = 'del';
    $Tariffs->{LNG_ACTION}     = $_DEL;
  }
  else {
    $Tariffs->{TARIF_PLAN_SEL} = $html->form_select(
      'TP_ID',
      {
        SELECTED          => $Iptv->{TP_ID},
        SEL_MULTI_ARRAY   => $Tariffs->list({ TP_GID => $Iptv->{TP_GID}, MODULE => 'Iptv' }),
        MULTI_ARRAY_KEY   => 0,
        MULTI_ARRAY_VALUE => 1,
      }
    );

    $Tariffs->{PARAMS} .= form_period($period) if ($conf{IPTV_USER_CHG_TP_SHEDULE} && !$conf{IPTV_USER_CHG_TP_NPERIOD});
    $Tariffs->{ACTION}     = 'set';
    $Tariffs->{LNG_ACTION} = $_CHANGE;
  }

  $Tariffs->{UID}     = $attr->{USER_INFO}->{UID};
  $Tariffs->{m}       = $m;
  $Tariffs->{TP_ID}   = $Iptv->{TP_ID};
  $Tariffs->{TP_NAME} = "$Iptv->{TP_ID}:$Iptv->{TP_NAME}";

  $html->tpl_show(templates('form_chg_tp'), $Tariffs);
}

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

  my $Iptv;

  if ($attr->{USER_INFO}) {
    $Iptv = $attr->{USER_INFO};
  }
  else {
    $Iptv->user_info($LIST_PARAMS{UID});
  }

  my $list = $Tariffs->ti_list({ TP_ID => $Iptv->{TP_ID} });
  my @interval_ids = ();

  if ($Tariffs->{TOTAL} < 1) {
    $html->message('info', $_INFO, "$_INTERVAL $_NOT_EXIST", { ID => '404' }) if (!$attr->{QUIET});
    return 0;
  }

  my $intervals             = $Tariffs->{TOTAL};
  $LIST_PARAMS{INTERVAL_ID} = $list->[0]->[0];
  $LIST_PARAMS{TI}          = $list->[0]->[0];
  $LIST_PARAMS{DISABLE}     = 0;

  #Active channels
  my %select_channels       = ();

  $list = $Iptv->user_channels_list(
    {
      TP_ID => $Iptv->{TP_ID},
      UID   => $Iptv->{UID}
    }
  );
  foreach my $line (@$list) {
    $select_channels{ $line->[2] } = $line->[3];
  }

  my @mandatory_arr = ();

  #LIst channels
  $list = $Iptv->channel_ti_list({ %LIST_PARAMS, MANDATORY => 1 });

  foreach my $line (@$list) {
    if ($FORM{add} || $FORM{set}) {
      if (($users->{CREDIT} + $users->{DEPOSIT}) > $line->[4] || $Iptv->{PEYMENT_TYPE}) {
        $Iptv->{TP_INFO}->{PERIOD_ALIGNMENT} = $Iptv->{PERIOD_ALIGNMENT} || 0;
        $Iptv->{TP_INFO}->{MONTH_FEE}        = $line->[4];
        $Iptv->{TP_INFO}->{DAY_FEE}          = $line->[5];
        $Iptv->{TP_INFO}->{TP_ID}            = $Iptv->{TP_ID};

        my %PARAMS = (
          DESCRIBE => "$_TV: $_DAY_FEE",
          METHOD   => 1
        );

        if ($Iptv->{TP_INFO}->{MONTH_FEE} > 0) {
          $Iptv->{ACCOUNT_ACTIVATE} = $users->{ACTIVATE};
          iptv_get_month_fee($Iptv, { EXT_DESCRIBE => " $_CHANNEL: $line->[1]", QUIET => 1 });
        }
        else {
          $Fees->take($users, $Iptv->{TP_INFO}->{DAY_FEE}, {%PARAMS});
        }

        push @mandatory_arr, $line->[9];
      }
      else {
        $html->message('err', $_ERROR, "$ERR_SMALL_DEPOSIT") if (!$attr->{QUIET});
      }
    }
    else {
      push @mandatory_arr, $line->[9];
    }
  }

  if ($FORM{add} || $FORM{set}) {
    $Iptv->user_channels(
      {
        UID   => $Iptv->{UID},
        TP_ID => $Iptv->{TP_ID},
        IDS   => join(', ', @mandatory_arr)
      }
    );
    $html->message('info', $_INFO, "$_CHANNELS: " . join(', ', @mandatory_arr)) if (!$attr->{QUIET});
  }

  my $Shedule = Shedule->new($db, $admin, \%conf);
  if ($FORM{change}) {
    $FORM{IDS} =~ s/, /;/g;

    #Add to shedule
    my ($Y, $M, $D) = split(/-/, $DATE);
    $D = '01';
    $M = $M + 1;
    if ($M > 12) {
      $M = '01';
      $Y = $Y + 1;
    }
    $M = sprintf("%.2d", $M);

    $Shedule->add(
      {
        UID      => $Iptv->{UID},
        TYPE     => 'channels',
        ACTION   => "$FORM{IDS}",
        D        => $D,
        M        => $M,
        Y        => $Y,
        DESCRIBE => "
                   $_FROM: '$Y-$M-$D'",
        MODULE => 'Iptv'
      }
    );

    if ($Shedule->{errno}) {
      if ($Shedule->{errno} == 7) {
        $html->message('err', "$_ERROR : $_SHEDULE", "$_EXIST");
      }
      else {
        $html->message('err', $_ERROR, "[$Shedule->{errno}] $err_strs{$Shedule->{errno}}") if (!$attr->{QUIET});
      }
    }
    else {
      $html->message('info', $_INFO, "$_CHANGED") if (!$attr->{QUIET});
    }
  }
  elsif ($FORM{change_now}) {
    #===============
    my @new_arr  = ();
    my @ids_arr  = split(/, /, $FORM{IDS});
    my %ids_hash = ();
    my @add_arr  = ();

    foreach my $k (@ids_arr) {
      $ids_hash{$k} = 1;
    }

    $users = $user if ($user->{UID});

    foreach my $channel (keys %select_channels) {
      #Tarif exists
      if ($ids_hash{$channel}) {
        delete $ids_hash{$channel};
        #Add new tarif
        push @add_arr, $channel;
      }
    }

    @new_arr = keys %ids_hash;
    if ($#new_arr > -1) {
      my $list = $Iptv->channel_ti_list({ %LIST_PARAMS, IDS => join('; ', @new_arr) });
      foreach my $line (@$list) {
        if (($users->{CREDIT} + $users->{DEPOSIT}) > $line->[4] || $Iptv->{PEYMENT_TYPE}) {
          $Iptv->{TP_INFO}->{PERIOD_ALIGNMENT} = $Iptv->{PERIOD_ALIGNMENT} || 0;
          $Iptv->{TP_INFO}->{MONTH_FEE}        = $line->[4];
          $Iptv->{TP_INFO}->{DAY_FEE}          = $line->[5];
          $Iptv->{TP_INFO}->{TP_ID}            = $Iptv->{TP_ID};

          my %PARAMS = (
            DESCRIBE => "$_TV: $_DAY_FEE",
            METHOD   => 1
          );

          if ($Iptv->{TP_INFO}->{MONTH_FEE} > 0) {
            $Iptv->{ACCOUNT_ACTIVATE} = $users->{ACTIVATE};
            iptv_get_month_fee($Iptv, { EXT_DESCRIBE => " $_CHANNEL: $line->[1]" });
          }
          else {
            $Fees->take($users, $Iptv->{TP_INFO}->{DAY_FEE}, {%PARAMS});
          }

          $select_channels{ $line->[9] } = '1111';
          push @add_arr, $line->[9];
        }
        else {
          $html->message('err', $_ERROR, "$ERR_SMALL_DEPOSIT") if (!$attr->{QUIET});
        }
      }
    }

    delete $FORM{IDS};
    push @add_arr, @mandatory_arr;
    $Iptv->user_channels(
      {
        UID   => $Iptv->{UID},
        TP_ID => $Iptv->{TP_ID},
        IDS   => join(', ', @add_arr)
      }
    );

    if (!$Iptv->{errno}) {
      $html->message('info', $_INFO, "$_CHANGED") if (!$attr->{QUIET});
    }
    else {
      $html->message('err', $_ERROR, "[$Iptv->{errno}] $err_strs{$Iptv->{errno}}") if (!$attr->{QUIET});
    }
  }
  elsif ($FORM{del_shedule}) {
    $Shedule->del({ ID => $FORM{SHEDULE_ID} });

    if (!$Shedule->{errno}) {
      $html->message('info', "$_INFO : $_SHEDULE", "$_SHEDULE $_DELETED") if (!$attr->{QUIET});
      $Shedule->{Y} = undef;
    }

  }

  if ($attr->{QUIET}) {
    return 0;
  }

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

  $Shedule->info(
    {
      UID    => $Iptv->{UID},
      TYPE   => 'channels',
      MODULE => 'Iptv'
    }
  );

  my %shedule = ();

  if ($Shedule->{TOTAL} > 0) {
    $Shedule->{EXEC_DATE} = "$Shedule->{Y}-$Shedule->{M}-$Shedule->{D}";
    my @shedule_channels_arr = split(/;/, $Shedule->{ACTION});
    foreach my $channel_id (@shedule_channels_arr) {
      $shedule{$channel_id} = "$Shedule->{Y}-$Shedule->{M}-$Shedule->{D}";
    }
  }

  %select_channels = ();
  $list            = $Iptv->user_channels_list(
    {
      TP_ID => $Iptv->{TP_ID},
      UID   => $Iptv->{UID}
    }
  );
  foreach my $line (@$list) {
    $select_channels{ $line->[2] } = $line->[3];
  }

  $list = $Iptv->channel_ti_list({%LIST_PARAMS});

  my $table = $html->table(
    {
      width   => '100%',
      caption => $_CHANNELS,
      border  => 1,
      title   => [ '#', $_NUM, $_NAME, $_DESCRIBE, "$_MONTH $_PRICE", "$_DAY $_PRICE", "$_MANDATORY", "$_PORT" ],
      cols_align => [ 'right', 'left', 'left', 'right' ],
      qs         => $pages_qs,
      pages      => $Iptv->{TOTAL},
      ID         => 'IPTV_CHANNELS',
    }
  );

  foreach my $line (@$list) {
    my $status = '';

    if ($conf{IPTV_USER_CHG_CHANNELS}) {

      $status = ($select_channels{ $line->[9] }) ? $html->b($status[0]) . ' ' : $html->b($status[1]) . ' ';

      if ($Shedule->{Y} && !$line->[6]) {
        if ($shedule{ $line->[9] }) {
          $status .= "/ $_ENABLE $_FROM: $shedule{$line->[9]}";
        }
        else {
          $status .= "/ $_DISABLE $_FROM: $Shedule->{EXEC_DATE}";
        }
      }
      else {
        if (!$line->[6]) {
          $status .= $html->form_input(
            'IDS',
            "$line->[9]",
            {
              TYPE          => 'checkbox',
              STATE         => (($select_channels{ $line->[9] }) ? 1 : undef),
              OUTPUT2RETURN => 1
            }
          );
        }
      }
    }
    else {
      $status = $status[ $line->[6] ];
    }

    $table->addrow(
      $status,
      $line->[1],
      $line->[2],
      $line->[3],
      ($line->[4]) ? $line->[4]  : '0.00',
      ($line->[5]) ? $line->[5]  : '0.00',
      ($line->[6]) ? $_MANDATORY : '',
      $line->[7]

    );
  }

  if ($conf{IPTV_USER_CHG_CHANNELS}) {
    my %submit_h = (change => "$_ADD $_SHEDULE");
    if ($Shedule->{Y}) {
      %submit_h = (del_shedule => "$_DEL $_SHEDULE");
    }

    #elsif($users->{UID}) {
    $submit_h{change_now} = "$_CHANGE $_NOW";

    # }

    print $html->form_main(
      {
        CONTENT => $table->show({ OUTPUT2RETURN => 1 }),
        HIDDEN  => {
          UID        => "$users->{UID}",
          TP_ID      => "$users->{TP_ID}",
          index      => "$index",
          SHEDULE_ID => $Shedule->{SHEDULE_ID}
        },
        SUBMIT => \%submit_h
      }
    );

  }
  else {
    print $table->show();
  }

}

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

  my $debug        = $attr->{DEBUG} || 0;
  my $debug_output = '';
  my $DOMAIN_ID    = $attr->{DOMAIN_ID} || 0;

  if ($attr->{USERS_WARNINGS_TEST}) {
    return $debug_output;
  }
  require Tariffs;
  Tariffs->import();
  my $Tariffs = Tariffs->new($db, $conf, $admin);
  my $list = $Tariffs->list({ %LIST_PARAMS, MODULE => 'Iptv' });

  foreach my $tp (@$list) {
    if ($tp->{daily_fee} > 0) {

      my $ulist = $Iptv->user_list(
        {
          ACTIVATE     => "<=$ADMIN_REPORT{DATE}",
          EXPIRE       => "0000-00-00,>$ADMIN_REPORT{DATE}",
          DISABLE      => '0',
          TP           => $tp->{tp_id},
          COLS_NAME    => 1
        }
      );

      foreach my $u (@$ulist) {
        my %user = (
          UID        => $u->{uid},
          BILL_ID    => $u->{bill_id}
        );

        my %PARAMS = (
              DESCRIBE => "Tv: $_DAY_FEE_SHORT $tp->{name} ($tp->{tp_id})",
              DATE     => "$ADMIN_REPORT{DATE} $TIME",
              METHOD   => ($tp->{fees_method}) ? $tp->{fees_method} : 1
        );

        if ($tp->{payments_type} || $u->{deposit} + $u->{credit} > 0) {
          $Fees->take(\%user, $tp->{daily_fee}, \%PARAMS );
        }
      }
    }
  }
}

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

  my $debug         = $attr->{DEBUG} || 0;
  my $debug_output  = '';
  $debug_output    .= "Iptv - Monthly periodic payments\n" if ($debug > 1);
  my $START_PERIOD_DAY = ($conf{START_PERIOD_DAY}) ? $conf{START_PERIOD_DAY} : 1;

  use Users;

  $LIST_PARAMS{TP_ID}       = $attr->{TP_ID} if ($attr->{TP_ID});
  my %USERS_LIST_PARAMS     = ();
  $USERS_LIST_PARAMS{LOGIN} = $attr->{LOGIN} if ($attr->{LOGIN});
  $USERS_LIST_PARAMS{EXT_BILL} = 1 if ($conf{BONUS_EXT_FUNCTIONS});

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

  #close period Fees
  if ($conf{IPTV_CLOSE_PERIOD}) {
    $users->config_info({ PARAM => 'IPTV_CLOSED_PERIOD' });
    if ($users->{VALUE} ne '1') {
      $debug_output .= "Period not closed\n" if ($debug > 1);
      $DEBUG .= $debug_output;
      return $debug_output;
    }
  }

  $Tariffs->{debug} = 1 if ($debug > 6);
  my $list = $Tariffs->list({ %LIST_PARAMS, MODULE => 'Iptv', COLS_NAME => 1 });
  $ADMIN_REPORT{DATE} = $DATE if (!$ADMIN_REPORT{DATE});
  my ($y, $m, $d) = split(/-/, $ADMIN_REPORT{DATE}, 3);
  $m--;

  if ($d != 1) {
    $debug_output .= "Period not closed\n" if ($debug > 1);
    $DEBUG .= $debug_output;
    return $debug_output;
  }

  my $date_unixtime = mktime(0, 0, 0, $d, $m, $y - 1900, 0, 0, 0);

  #Get Preview month begin end
  if ($m == 0) {
    $m = 12;
    $y--;
  }
  $m = sprintf("%02.d", $m);
  my $days_in_month = ($m != 2 ? (($m % 2) ^ ($m > 7)) + 30 : (!($y % 400) || !($y % 4) && ($y % 25) ? 29 : 28));

  my $pre_month_begin = "$y-$m-01";
  my $pre_month_end   = "$y-$m-$days_in_month";

  foreach my $tp (@$list) {
    my $TP_ID       = $tp->{tp_id};
    my $min_use     = $tp->{min_use};
    my $postpaid    = $tp->{payment_type};
    my $tp_postpaid = $tp->{postpaid_monthly_fee};
    my $month_fee   = $tp->{month_fee};
    my $TP_NUM      = $tp->{id};

    my %used_traffic = ();

    #Monthfee & min use
    if ($month_fee > 0 || $min_use > 0) {
      $debug_output .= "TP ID: $TP_NUM MF: $month_fee POSTPAID: $postpaid REDUCTION: $tp->{reduction_fee} EXT_BILL_ID: $tp->{ext_bill_account} CREDIT: $tp->{credit} MIN_USE: $min_use\n" if ($debug > 1);

      $Iptv->{debug} = 1 if ($debug > 6);
      my $ulist = $Iptv->user_list(
        {
          ACTIVATE     => "<=$ADMIN_REPORT{DATE}",
          EXPIRE       => "0000-00-00,>$ADMIN_REPORT{DATE}",
          STATUS       => 0,
          LOGIN_STATUS => 0,
          TP_ID        => $TP_ID,
          SORT         => 1,
          PAGE_ROWS    => 1000000,
          COLS_NAME    => 1,
          %USERS_LIST_PARAMS
        }
      );

      foreach my $u (@$ulist) {
        $debug_output .= " Login: $u->{id} ($u->{uid})  TP_ID: $u->{tp_id} Fees: $tp->{month_fee} REDUCTION: $u->{reduction}  $u->{deposit} $u->{credit}\n" if ($debug > 3);
        my %user = (
          LOGIN     => $u->{id},
          UID       => $u->{uid},
          BILL_ID   => ($tp->{ext_bill_account} > 0) ? $u->{ext_bill_id} : $u->{bill_id},
          REDUCTION => $u->{reduction},
          ACTIVATE  => $u->{activate},
          DEPOSIT   => $u->{deposit},
          CREDIT    => ($u->{credit} > 0) ? $u->{credit} : $tp->{credit}
        );

        #Check bill ID and deposit
        if (($user{BILL_ID} && $user{BILL_ID} > 0) &&  defined($user{DEPOSIT})) {
          my %FEES_PARAMS = (
            DATE   => $ADMIN_REPORT{DATE},
            METHOD => 1
          );

          my $sum = 0;
          #Min use
          if ($min_use > 0 && $d == $START_PERIOD_DAY) {

          }
          #Month Fee
          else {
            #Make sum
            $sum = $month_fee;

            if ($tp->{reduction_fee} == 1 && $user{REDUCTION} > 0) {
              $sum = $sum * (100 - $user{REDUCTION}) / 100;
            }

            #If deposit is above-zero or TARIF PALIN is POST PAID or PERIODIC PAYMENTS is POSTPAID
            if ($postpaid == 1 || $user{DEPOSIT} + $user{CREDIT} > 0 || $tp_postpaid == 1) {

              #take Fees in first day of month
              $FEES_PARAMS{DESCRIBE} = "$_MONTH_FEE ($_TV/$TP_ID)";

              if (($user{ACTIVATE} eq '0000-00-00' and $d == $START_PERIOD_DAY) || $conf{IPTV_CLOSE_PERIOD}) {
                if ($debug > 4) {
                  $debug_output .= " UID: $user{UID} SUM: $sum REDUCTION: $user{REDUCTION}\n";
                }
                else {
                  $Fees->take(\%user, $sum, {%FEES_PARAMS});
                  $debug_output .= " $user{LOGIN}  UID: $user{UID} SUM: $sum REDUCTION: $user{REDUCTION}\n" if ($debug > 0);
                }
              }

              # If activation set to monthly Fees taken throught 30 days
              elsif ($user{ACTIVATE} ne '0000-00-00') {
                my ($activate_y, $activate_m, $activate_d) = split(/-/, $user{ACTIVATE}, 3);
                $activate_m--;
                my $active_unixtime = mktime(0, 0, 0, $activate_d, $activate_m, $activate_y - 1900, 0, 0, 0);
                if ($date_unixtime - $active_unixtime > 30 * 86400) {
                  if ($debug > 4) {
                    $debug_output .= " $user{LOGIN} UID: $user{UID} SUM: $sum REDUCTION: $user{REDUCTION}\n";
                  }
                  else {
                    $Fees->take(\%user, $sum, {%FEES_PARAMS});
                    $debug_output .= " $user{LOGIN} UID: $user{UID} SUM: $sum REDUCTION: $user{REDUCTION} CHANGE ACTIVATE\n" if ($debug > 0);
                    if ($Fees->{errno}) {
                      print "Error: [$Fees->{errno}] $Fees->{errstr} ";
                      if ($Fees->{errno} == 14) {
                        print "[ $user{UID} ] $user{LOGIN} - Don't have money account";
                      }
                      print "\n";
                    }
                    else {
                      $users->change(
                        $user{UID},
                        {
                          UID      => $user{UID},
                          ACTIVATE => $ADMIN_REPORT{DATE}
                        }
                      );
                    }
                  }
                }
              }
            }

          }
        }
        else {
          print "[ $user{UID} ] $user{LOGIN} - Don't have money account\n";
        }
      }
    }

    #Channels Fees
    $ulist = $Iptv->user_list(
      {
        ACTIVATE      => "<=$ADMIN_REPORT{DATE}",
        EXPIRE        => "0000-00-00,>$ADMIN_REPORT{DATE}",
        STATUS        => 0,
        LOGIN_STATUS  => 0,
        TP_ID         => $TP_ID,
        SORT          => 1,
        PAGE_ROWS     => 1000000,
        SHOW_CHANNELS => 1,
        MONTH_PRICE   => '>0',
        COLS_NAME     => 1,
        %USERS_LIST_PARAMS
      }
    );

    foreach my $u (@$ulist) {
      my $channel_num = $u->{channel_id};
      my $sum         = $u->{month_price};
      $debug_output .= " Login: $u->{id} ($u->{uid})  TP_ID: $u->{tp_id} Channel: $channel_num Month Price: $sum REDUCTION: $u->{reduction}  $u->{credit} $u->{credit}\n" if ($debug > 3);

      #Check bill id and deposit
      my %user = (
        LOGIN     => $u->{id},
        UID       => $u->{uid},
        BILL_ID   => ($tp->{ext_bill_account} > 0) ? $u->{ext_bill_id} : $u->{bill_id},
        REDUCTION => $u->{reduction},
        ACTIVATE  => '0000-00-00',
        DEPOSIT   => $u->{deposit},
        CREDIT    => ($u->{credit} > 0) ? $u->{credit} : $tp->{credit}
      );

      if ($postpaid == 1 || $user{DEPOSIT} + $user{CREDIT} > 0 || $tp_postpaid == 1) {
        #take Fees in first day of month
        $FEES_PARAMS{DESCRIBE} = "$_MONTH_FEE ($_TV $_CHANNELS:$channel_num)";

        if (($user{ACTIVATE} eq '0000-00-00' and $d == $START_PERIOD_DAY) || $conf{IPTV_CLOSE_PERIOD}) {
          if ($debug > 4) {
            $debug_output .= " UID: $user{UID} SUM: $sum REDUCTION: $user{REDUCTION}\n";
          }
          else {
            $Fees->take(\%user, $sum, {%FEES_PARAMS});

            if ($Fees->{errno}) {
              print "Error: [ $user{UID} ] $user{LOGIN} SUM: $sum [$Fees->{errno}] $Fees->{errstr} ";
              if ($Fees->{errno} == 14) {
                print "UID: $user{UID} LOGIN: $user{LOGIN} - Don't have money account";
              }
              print "\n";
            }
            else {
              $debug_output .= " $user{LOGIN}  UID: $user{UID} SUM: $sum CHANNEL: $channel_num REDUCTION: $user{REDUCTION}\n" if ($debug > 0);
            }
          }
        }
      }
    }
  }

  if ($conf{IPTV_CLOSE_PERIOD}) {
    $users->config_del('IPTV_CLOSED_PERIOD');
    $users->config_add(
      {
        PARAM => 'IPTV_CLOSED_PERIOD',
        VALUE => "$DATE $TIME"
      }
    );
  }

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

#**********************************************************
# user_warnings
#
#**********************************************************
sub iptv_users_warning_messages {

  my %LIST_PARAMS = (USERS_WARNINGS => 'y');
  my $list = $Iptv->list({%LIST_PARAMS});

  $ADMIN_REPORT{USERS_WARNINGS} = sprintf("%-14s| %4s|%-20s| %9s| %8s|\n", $_LOGIN, 'TP', $_TARIF_PLAN, $_DEPOSIT, $_CREDIT) . "---------------------------------------------------------------\n";
  return 0 if ($Iptv->{TOTAL} < 1);
  my %USER_INFO = ();

  foreach my $line (@$list) {

    #u.id, u.email, u.tp_id, u.credit, u.deposit, tp.name, tp.uplimit

    $USER_INFO{LOGIN}   = $line->[0];
    $USER_INFO{TP_NAME} = $line->[5];
    $USER_INFO{TP_ID}   = $line->[2];
    $USER_INFO{DEPOSIT} = $line->[4];
    $USER_INFO{CREDIT}  = $line->[3];

    my $email = ((!defined($line->[1])) || $line->[1] eq '') ? "$line->[0]\@$conf{USERS_MAIL_DOMAIN}" : "$line->[1]";

    $ADMIN_REPORT{USERS_WARNINGS} .= sprintf("%-14s| %4d|%-20s| %9.4f| %8.2f|\n", $USER_INFO{LOGIN}, $USER_INFO{TP_ID}, $USER_INFO{TP_NAME}, $USER_INFO{DEPOSIT}, $USER_INFO{CREDIT});

    my $message = $html->tpl_show(_include('iptv_users_warning_messages', 'Iptv'), \%USER_INFO, { notprint => 'yes' });

    sendmail("$conf{ADMIN_MAIL}", "$email", "???????????? ??????? ??????????.", "$message", "$conf{MAIL_CHARSET}", "2 (High)");
  }

  $ADMIN_REPORT{USERS_WARNINGS} .= "---------------------------------------------------------------
$_TOTAL: $Iptv->{TOTAL}\n";
}

#***********************************************************
# iptv_sheduler
#***********************************************************
sub iptv_sheduler {
  my ($type, $action, $uid) = @_;

  my $user = $Iptv->user_info($uid);

  if ($type eq 'tp') {
    $Iptv->user_change(
      {
        UID   => $uid,
        TP_ID => $action
      }
    );
  }

  #Set channel
  elsif ($type eq 'channels') {
    return 0 if ($action eq '');
    
    $action =~ s/;/, /g;
    $FORM{IDS}        = $action;
    $LIST_PARAMS{UID} = $uid;
    $FORM{change_now} = 1;
    
    $Iptv->user_info($uid);
    if (!$Iptv->{errno}) {
      iptv_user_channels({ QUIET => 1, USER_INFO => $Iptv });
    }
    else {
      print "!! UID: $uid / $Iptv->{errno}\n";
    }
    iptv_user_channels({ QUIET => 1, USER_INFO => $users });
  }
}

#***********************************************************
# Add asterisk user
#***********************************************************
sub iptv_mk_users_conf {
  my ($attr) = @_;

  my $content = "#ABILLS users config\n#DATE: $DATE $TIME\n\n";

  my $list = $Iptv->user_list(
    {
      PAGE_ROWS => 100000,
      CID       => '*',
      PASSWORD  => 1
    }
  );

  foreach my $line (@$list) {
    my %info = (
      LOGIN     => $line->[0],
      FIO       => $line->[1],
      NUMBER    => $line->[6],
      CALLER_ID => $line->[7],
      PASSWORD  => $line->[8],
    );

    $content .= $html->tpl_show(_include('iptv_users_conf', 'Iptv'), \%info, { OUTPUT2RETURN => 1 });
  }

  open(FILE, ">$conf{VOIP_ASTERISK_USERS}") || $html->message('err', $_ERROR, "Can't open file '$conf{VOIP_ASTERISK_USERS}' $!");
  print FILE "$content\n";
  close(FILE);

}

#***********************************************************
# iptv_report
#***********************************************************
sub iptv_report {
  my ($type, $attr) = @_;
  my $REPORT = "Module: Iptv\n";
  %LIST_PARAMS = %{ $attr->{LIST_PARAMS} } if (defined($attr->{LIST_PARAMS}));
  return $REPORT;
}

#**********************************************************
#
#Make month feee
#**********************************************************
sub iptv_get_month_fee {
  my ($Iptv, $attr) = @_;

  my $info_message = '';

  #Get active price
  if ($Iptv->{TP_INFO}->{ACTIV_PRICE}) {
    my $users = Users->new($db, $admin, \%conf);
    my $user  = $users->info($Iptv->{UID});
    my $date  = ($user->{ACTIVATE} ne '0000-00-00') ? $user->{ACTIVATE} : $DATE;
    my $time  = ($user->{ACTIVATE} ne '0000-00-00') ? '00:00:00' : $TIME;

    $Fees->take(
      $user,
      $Iptv->{TP_INFO}->{ACTIV_PRICE},
      {
        DESCRIBE => "$_ACTIVATE $_TARIF_PLAN",
        DATE     => "$date $time"
      }
    );

    $info_message .= "$_ACTIVATE $_TARIF_PLAN\n";
  }

  #Get month fee
  if ($Iptv->{TP_INFO}->{MONTH_FEE} > 0) {
    my $sum   = $Iptv->{TP_INFO}->{MONTH_FEE};
    my $users = Users->new($db, $admin, \%conf);
    my $user  = $users->info($Iptv->{UID});

    if ($Iptv->{TP_INFO}->{EXT_BILL_ACCOUNT}) {
      $user->{BILL_ID} = $user->{EXT_BILL_ID} if ($user->{EXT_BILL_ID});
    }

    my $message = '';

    #Current Month
    my ($y, $m, $d) = split(/-/, $DATE, 3);
    my ($active_y, $active_m, $active_d) = split(/-/, $Iptv->{ACCOUNT_ACTIVATE}, 3);
    if (int("$y$m$d") < int("$active_y$active_m$active_d")) {
      return;
    }

    if ($Iptv->{TP_INFO}->{PERIOD_ALIGNMENT} && !$Iptv->{TP_INFO}->{ABON_DISTRIBUTION}) {
      $message = "$_MONTH_ALIGNMENT\n";
      my $days_in_month = ($m != 2 ? (($m % 2) ^ ($m > 7)) + 30 : (!($y % 400) || !($y % 4) && ($y % 25) ? 29 : 28));

      if ($Iptv->{ACCOUNT_ACTIVATE} && $Iptv->{ACCOUNT_ACTIVATE} ne '0000-00-00') {
        $days_in_month = ($active_m != 2 ? (($active_m % 2) ^ ($active_m > 7)) + 30 : (!($active_y % 400) || !($active_y % 4) && ($active_y % 25) ? 29 : 28));
        $d = $active_d;
      }

      $conf{START_PERIOD_DAY} = 1 if (!$conf{START_PERIOD_DAY});
      $sum = sprintf("%.2f", $sum / $days_in_month * ($days_in_month - $d + $conf{START_PERIOD_DAY}));
    }

    return 0 if ($sum == 0);

    my $periods = 0;
    if ($active_m > 0 && $active_m < $m) {
      $periods = $m - $active_m;
    }
    elsif ($active_m > 0 && ($active_m >= $m && $active_y < $y)) {
      $periods = 12 - $active_m + $m;
    }

    $message .= "$_MONTH_FEE: $sum ($Iptv->{TP_INFO}->{TP_ID})";
    $message .= $attr->{EXT_DESCRIBE} if ($attr->{EXT_DESCRIBE});

    if ($Iptv->{TP_INFO}->{ABON_DISTRIBUTION}) {
      $sum = $sum / (($m != 2 ? (($m % 2) ^ ($m > 7)) + 30 : (!($y % 400) || !($y % 4) && ($y % 25) ? 29 : 28)));
      $message .= " - $_ABON_DISTRIBUTION";
    }

    $m = $active_m if ($active_m > 0);
    for (my $i = 0 ; $i <= $periods ; $i++) {
      if ($m > 12) {
        $m        = 1;
        $active_y = $active_y + 1;
      }

      $m = sprintf("%.2d", $m);

      if ($i > 0) {
        $sum     = $Iptv->{TP_INFO}->{MONTH_FEE};
        $message = "$_MONTH_FEE: $sum ($Iptv->{TP_INFO}->{TP_ID})";

        $message .= $attr->{EXT_DESCRIBE} if ($attr->{EXT_DESCRIBE});
        $DATE = "$active_y-$m-01";
        $TIME = "00:00:00";
      }
      elsif ($Iptv->{ACCOUNT_ACTIVATE} && $Iptv->{ACCOUNT_ACTIVATE} ne '0000-00-00') {
        $DATE = "$active_y-$m-$active_d";
        $TIME = "00:00:00";

        if ($Iptv->{TP_INFO}->{PERIOD_ALIGNMENT}) {
          $users->change(
            $Iptv->{UID},
            {
              ACTIVATE => '0000-00-00',
              UID      => $Iptv->{UID}
            }
          );
        }
      }

      $Fees->take(
        $users, $sum,
        {
          DESCRIBE => "$_TV: $message",
          METHOD   => 1,
          DATE     => "$DATE $TIME"
        }
      );

      if ($Fees->{errno}) {
        $html->message('err', $_ERROR, "[$Fees->{errno}] $Fees->{errstr}") if (!$attr->{QUIET});
        return 0;
      }
      $info_message .= "$_DATE: $DATE $message\n";
      $m++;
    }
  }

  $html->message('info', $_INFO, $info_message) if ($info_message && !$attr->{QUIET});
}

#**********************************************************
#
#**********************************************************
sub iptv_crypt {
  my ($attr) = @_;
  my @channels = (
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  );
  my $filename = $conf{IPTV_DVCRYPT_FILENAME} || $conf{TPL_DIR} . '/dvcrypt.conf';
  my $content = '';

  my %tp_channels_list = ();
  my %users_channels   = ();
  my $tp_list          = $Tariffs->list({ %LIST_PARAMS, MODULE => 'Iptv', COLS_NAME => 1 });

  foreach my $tp (@$tp_list) {
    my $TP_ID       = $tp->{tp_id};
    my $min_use     = $tp->{min_use};
    my $postpaid    = $tp->{payment_type};
    my $tp_postpaid = $tp->{postpaid_monthly_fee};
    my $month_fee   = $tp->{month_fee};

    $Tariffs->ti_list({ TP_ID => $TP_ID });

    if ($Tariffs->{TOTAL} == 0) {
      next;
    }

    my $channels_list = $Iptv->channel_ti_list(
      {
        INTERVAL_ID => $Tariffs->{list}->[0]->[0],
        MANDATORY   => 1
      }
    );
    foreach my $line (@$channels_list) {
      $tp_channels_list{ $line->[1] } = $line->[9];
    }


    #Main users list
    my $ulist = $Iptv->user_list(
      {
        ACTIVATE     => "<=$DATE",
        EXPIRE       => "0000-00-00,>$DATE",
        DVCRYPT_ID   => '>0',
        STATUS       => ">=0",
        LOGIN_STATUS => ">=0",
        TP_ID        => $TP_ID,
        SORT         => 1,
        PAGE_ROWS    => 1000000,
        COLS_NAME    => 1
      }
    );

    foreach my $u (@$ulist) {
      if ($u->{deposit} + $u->{credit} > 0 && $u->{iptv_status} == 0) {
        %{ $users_channels{ $u->{dvcrypt_id} } } = %tp_channels_list;
      }
      else {
        %{ $users_channels{ $u->{dvcrypt_id} } } = ();
      }
    }

    # Custom channels users list
    my $list = $Iptv->user_list(
      {
        PAGE_ROWS     => 1000000,
        DVCRYPT_ID    => '>0',
        ACTIVATE      => "<=$DATE",
        EXPIRE        => "0000-00-00,>$DATE",
        STATUS        => ">=0",
        LOGIN_STATUS  => ">=0",
        TP_ID         => $TP_ID,
        SORT          => 1,
        SHOW_CHANNELS => 1,
        COLS_NAME     => 1
      }
    );

    foreach my $u (@$list) {
      if ($u->{deposit} + $u->{credit} > 0 && $u->{login_status} + $u->{iptv_status} == 0) {
        $users_channels{ $u->{dvcrypt_id} }{ $u->{channel_id} } = "$u->{deposit}";
      }
      else {
        $users_channels{ $u->{dvcrypt_id} }{ $u->{channel_id} } = 0;
      }
    }
  }

  foreach my $dv_crypt_id (sort { $a <=> $b } keys %users_channels) {
    my @arr = ();
    for (my $channel_id = 1 ; $channel_id <= 127 ; $channel_id++) {
      $arr[ $channel_id - 1 ] = ($users_channels{$dv_crypt_id}->{$channel_id}) ? 1 : 0;
    }
    $content .= "$dv_crypt_id;" . (join('', @arr)) . "\n";
  }

  print $html->pre($content) if ($debug > 1);

  if (open(FILE, ">$filename")) {
    print FILE $content;
    close(FILE);
  }
  else {
    print "Can't create Dv_crypt file '$filename' $!\n";
  }

  print "Generated '$filename'\n" if ($debug > 1);
}

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

  my $list  = $Iptv->reports_channels_use({%LIST_PARAMS});
  my $table = $html->table(
    {
      width      => '100%',
      caption    => $_CHANNELS,
      border     => 1,
      title      => [ $_NUM, $_NAME, $_USERS, $_DEBETORS ],
      cols_align => [ 'right', 'left', 'right', 'right' ],
      qs         => $pages_qs,
      pages      => $Iptv->{TOTAL},
      ID         => 'IPTV_CHANNELS',
    }
  );

  foreach my $line (@$list) {
    $table->addrow($html->b($line->[0]), $line->[1], $line->[2], $line->[3],);
  }
  print $table->show();

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

}

1

