интеграция биллинг и хостинг панель

Тема в разделе "Мегафлуд", создана пользователем WOLF_2010, 21 авг 2014.

  1. WOLF_2010

    WOLF_2010 Постоялец

    Заблокирован
    Регистр.:
    8 окт 2011
    Сообщения:
    86
    Симпатии:
    109
    ребят разъясните пожалуйста как биллинг блокирует хостинг панель за неуплату клиенту?
    вот например возьмем тот же xfes биллинг допустим и ispmagaer они связывают свой биллинг и хостинг панель по id что ль? (сильно не пинайте просто пока что не могу понять как это все связывается)
     
  2. Цукер

    Цукер Сам себе призедент

    Moderator
    Регистр.:
    5 мар 2008
    Сообщения:
    404
    Симпатии:
    371
  3. WOLF_2010

    WOLF_2010 Постоялец

    Заблокирован
    Регистр.:
    8 окт 2011
    Сообщения:
    86
    Симпатии:
    109
    Цукер спасибо что откликнулись, это получается мне нужно писать дополнительный скрипт типа этого? http://c.vestacp.com/0.9.8/rhel/whmcs-module.php (если например хочу связать с vestacp)

    просто в самом биллинге у меня крон уже имеется
    <?

    global $CFG,$UE,$AGREES;
    $UE=$CFG['UE'];

    $ORDERS=array(
    '0'=>array('img'=>'c_888','text'=>'Еще не активирован'),
    '1'=>array('img'=>'c_0f0','text'=>'Активно, работает'),
    'X'=>array('img'=>'c_f00','text'=>'В очереди на удаление'),
    '-'=>array('img'=>'c_f0f','text'=>'Отключен или заблокирован'),
    '.'=>array('img'=>'c_0ff','text'=>'Выполнен, можно удалять'),
    '8'=>array('img'=>'c_00f','text'=>'Работает постоянно')
    );

    global $ORDS;
    $ORDS=array(
    '0'=>'Новый',
    '1'=>'Активный',
    'X'=>'На удалении',
    '-'=>'Отключен',
    '.'=>'Выполнен',
    '8'=>'Постоянный'
    );

    $REASONS=array(
    'C'=>'Недостаточно средств на счету заказа',
    'U'=>'По запросу владельца',
    'X'=>'Нарушение договора-оферты',
    'T'=>'Техническая неисправность',
    'W'=>'Обслуживание персоналом'
    );

    function calc_seq($n,$x,$min,$mul) {
    for ($i=2; $i<=$n; $i++) {
    if ($x*$mul<=$min) return($min);
    else $x*=$mul;
    }
    return($x);
    }
    function calc_price($s,$n) {
    global $UE,$USER;
    $r=isset($USER->ratio)?$USER->ratio:1; if ($r<0) $r=1;
    if (!$s or !is_array($s)) return array('p'=>0,'p1'=>0,'d'=>0);
    $d=$n>1?$s['dec']*$n:0;
    $p1=round($s['price']*(1-$d)*$UE*$r,2);
    $p=$p1*$n;
    return(array('d'=>$d,'p1'=>$p1,'p'=>$p));
    }
    function calc_price_h($s,$n) {
    $x=calc_price($s,$n);
    $x['p']=round($x['p']);
    $x['p1']=round($x['p1']);
    $x['d']=round($x['d']*100);
    return($x);
    }

    function hosting_core_users_list_head() {
    $r=mysql_query("select user,count(*) from orders group by user");
    $o=array(); while (list($id,$n)=mysql_fetch_row($r)) $o[$id]=$n;
    }

    function hosting_operation_admin($add) {
    global $MODULE;
    return module_url($MODULE,"admin/actions?$add");
    }

    function order_remove($id,$rm=false) {
    global $USER;
    if (!$o=get_sql_row('orders',"id=$id")) return;
    $s=get_sql_row('hserv',"id=$o[service]");
    $u=get_sql_row('users',"id=$o[user]");
    $rm=$rm?",rm='1'":",rm='0'";
    mysql_query("update orders set dt_block=now()$rm where id=$o[id]");
    mysql_query("update hserv set rm='1' where user=0 and (select count(*) from orders where service=$s[id] and rm='0')<1");
    sys_log('O','hosting.order',$o['id'],"Удален заказ");
    if ($o['money']!=0) {
    $o['money']=round($o['money'],2);
    mysql_query("update orders set money=0 where id=$o[id]");
    mysql_query("update users set money=money+$o[money] where id=$o[user]");
    if ($o['money']>0) { $cr='I.O'; $db='I.U'; $dir='c'; }
    else { $cr='I.U'; $db='I.X'; $dir='c'; }
    if ($USER->id==$o['user']) $USER->fetch();
    $m=new money();
    $m->create($cr,$db,abs($o['money']),$u['id'],"Удаление заказа пользователя $u[id] ($u[login])");
    $m->addapp('hosting.order',$o['id'],$dir);
    sys_log('$','fin.money',$m->id,"Средства $o[money] Р. возвращены при удалении заказа #$o[id]");
    }
    }

    class order {

    function order($id=0) {
    $this->id=$id;
    $this->fetch($id);
    }

    function clean() {
    $o=get_sql_fields('orders');
    $o['id']=0;
    foreach ($o as $p=>$v) $this->$p=$v;
    }

    function fetch($id=0) {
    global $USER;
    if ($id!=0) $this->id=$id;
    if ($this->id) {
    if (!$o=get_sql_row('orders',"id='$this->id'")) $this->clean();
    else foreach ($o as $p=>$v) $this->$p=$v;
    }
    else $this->clean();
    if ($this->id) {
    if ($this->user!=$USER->id and !$USER->allowed('a')) $this->clean();
    }
    }

    function store1($p,$v=null) {
    if (!$this->id) return false;
    if (!isset($this->$p)) return false;
    if ($v==null) $v=$this->$p;
    mysql_query("update users set $p='$v' where id=$this->id");
    return true;
    }

    function info() {
    if (!$this->id) return "";
    global $ORDS;
    $h=get_sql_row('hosts',"id='$this->host'");
    $s=get_sql_row('hserv',"id='$this->service'");
    $tip=array();
    $tip[]="<b>ID:</b> $this->id";
    if ($this->st) $tip[]='<b>Статус:</b> '.$ORDS[$this->st];
    if ($this->dt) $tip[]="<b>Создан:</b> $this->dt";
    if ($this->rm=='1' and $this->dt_block) $tip[]="<b>Удалён:</b> $this->dt";
    if (isset($this->money)) $tip[]='<b>Счёт:</b> '.round($this->money,2).' Р.';
    $tip[]='';
    if ($s) $tip[]="<b>Услуга:</b> $s[name]";
    if ($this->num) $tip[]="<b>Срок:</b> $this->num";
    if ($this->name) $tip[]="<b>Название:</b> $this->name";
    $tip[]='';
    if ($h) $tip[]="<b>Сервер:</b> ".($h['purl']?"<a href='$h[purl]' title='$h[pname]'>$h[name]</a>":$h['name']);
    if ($this->login) $tip[]="<b>Логин/ID:</b> $this->login";
    if ($this->ip) $tip[]="<b>IP:</b> $this->ip";
    $tip=implode('<br>',$tip);
    return $tip;
    }

    function linkto($text='') {
    global $USER;
    if (!$this->id) return('(нет)');
    if (!$USER->allowed('a')) return "Заказ #$this->id";
    if ($text=='') $text=module_to('hosting',"admin/orders?edit=$this->id","Заказ #$this->id");
    $s='<nobr>'.$text.' ';
    $s.=skin_tt_load(self_url("_CLEAN&TOOLTIP_ORDER=$this->id")).'</nobr>';
    return($s);
    }

    }

    function cron() {
    global $MODULE,$PAR,$CFG,$USER;
    $P=$PAR['hosting'];
    mysql_query("lock tables config WRITE");
    mysql_query("update config set val=val+1 where module='hosting' and par='CRON'");
    $r=mysql_query("select val from config where module='hosting' and par='CRON'");
    list($cron)=mysql_fetch_row($r);
    mysql_query("unlock tables");
    if ($cron%$P['CRON_PERIOD']!=0) return;

    // Обработка не активированных заказов
    $r=mysql_query("select id from orders where st='0' and rm='0' and timestampdiff(day,dt,now())>=3");
    while (list($id)=mysql_fetch_row($r)) {
    $o=get_sql_row('orders',"id=$id");
    $s=get_sql_row('hserv',"id=$o[service]");
    $u=user_array($o['user']);
    $p=calc_price_h($s,$o['num']);
    $a="Заказ не активирован 3 дня, удалён автоматически";
    if (round($o['money'],2)>0) {
    mysql_query("update users set money=money+$o[money] where id=$o[user]");
    $a.=" (возвращено $o[money] Р.)";
    $m=new money();
    $m->create('I.O','I.U',$o['money'],$u['id'],'Удаление неактивированного заказа');
    $m->addapp('hosting.order',$o['id'],'c');
    }
    sys_log('O','hosting.order',$id,$a);
    $x=array_merge(mail_tpl_mkpar('ORDER_',$o),mail_tpl_mkpar('SERVICE_',$s),mail_tpl_mkpar('PRICE_',$p),mail_tpl_mkpar('USER_',$u));
    $x['ORDER_MONEY']=round($x['ORDER_MONEY'],2);
    if ($t=mail_tpl_get('mail_user_order_newrm')) mail_tpl_mail($t,$u['email'],$x);
    mysql_query("delete from orders where id=$id");
    }
    ?>

    // Удаление неиспользуемых тарифов
    mysql_query("delete from hserv where user!=0 and timestampdiff(day,dt,now())>=3 and (select count(*) from orders where service=hserv.id)=0");
    mysql_query("update hserv set rm='1' where user!=0 and timestampdiff(day,dt,now())>=3 and (select count(*) from orders where service=hserv.id and rm='0')<1");

    // Обработка активных и блокированных заказов
    $ss=get_sql_table("hservices.id");
    $hs=array();
    $hosts=get_sql_table("hosts.id");
    $orders=get_sql_table("orders.id","rm='0' and (st='1' or st='-')",'user',"timestampdiff(day,dt_block,now())blocked, timestampdiff(day,dt_pay,now())pay, timestampdiff(month,dt,now())months, timestampdiff(day,dt,now())days");
    $u=array('id'=>0);
    foreach ($orders as $id=>$o) if ($o['pay']) {
    mysql_query("update orders set dt_pay=concat(curdate(),' ',time(dt)) where id='$id'");
    $o['id']=$id;
    if (!isset($hs[$o['service']])) {
    $s=get_sql_row('hserv',"id=$o[service]");
    $hs[$o['service']]=$s;
    }
    else $s=$hs[$o['service']];
    if (!$s['daily']) continue;
    if ($u['id']!=$o['user']) {
    $u=user_array($o['user']);
    }
    $h=isset($hosts[$o['host']])?$hosts[$o['host']]:array('id'=>0,'name'=>'(не указан)');
    $p=calc_price_h($s,$o['num']); $dec=$p['p1']/date('t');
    if (round($dec,2)==0) continue;
    if ($o['num']<$o['months'] and $o['num']<$s['max']) {
    $o['num']=$o['months'];
    mysql_query("update orders set num='$o[months]' where id='$id'");
    }
    $block=($o['num']>12)?12:$o['num'];
    if ($block>$o['minus']) $block=$o['minus'];
    if ($block<1) $block=1;
    switch ($o['st']) {
    case '1':
    if ($o['free']>0) {
    mysql_query("update orders set free=free-1 where id='$id'");
    continue;
    }
    $decr=round($dec*$o['pay'],2);
    if ($o['money']>0 and $u['ref']) {
    $am=($o['money']-$decr)<0?$o['money']:$decr;
    user_refpay($u['id'],$am);
    }
    $o['money']=round($o['money'],2)-$decr;
    mysql_query("update orders set money=money-$decr,spent=spent+$decr where id=$id");
    $m=new money();
    $m->create('I.O','I.X',$decr,$u['id'],"$o[dt_pay] - ".date('Y-m-d H:i:s'));
    $m->addapp('hosting.order',$id,'c');
    $o['daysleft']=floor($o['money']/$decr);
    if ($o['daysleft']<0) $o['daysleft']=($o['block']-$o['pay']>0)?$o['block']-$o['pay']:0;
    $x=array_merge(mail_tpl_mkpar('ORDER_',$o),mail_tpl_mkpar('SERVICE_',$s),mail_tpl_mkpar('PRICE_',$p),mail_tpl_mkpar('USER_',$u));
    $x['ORDER_MONEY']=round($x['ORDER_MONEY'],2);
    if ($o['money']<$dec) {
    if ($o['block']<1) $o['block']=$block;
    else $o['block']-=$o['pay'];
    mysql_query("update orders set block='$o[block]' where id='$id'");
    if ($o['block']<1) {
    if ($t=mail_tpl_get('mail_user_order_block')) mail_tpl_mail($t,$u['email'],$x);
    if ($t=mail_tpl_get('mail_admin_order_block')) mail_tpl_mail($t,$CFG['SITE_EMAIL'],$x);
    mysql_query("update orders set st='-',reason='C',dt_block=now(),block=$block where id=$o[id]");
    $r=array('access'=>'a','user'=>$u['id'],'subj'=>$o['id'],'object'=>'hosting.order',
    'rem'=>"Автозаявка: необходимо заблокировать заказ '$o[login]' на сервере '$h[name]'.");
    $a=new operation(0,$r);
    $a->set_cat('suspend'); $a->store();
    $m="Заказ автоматически заблокирован.";
    sys_log('O','hosting.order',$id,$m);
    mysql_query("insert into tasks set dt=now(),op='$a->id',subj='$o[id]',task='block'");
    }
    else {
    if ($t=mail_tpl_get('mail_user_order_aminus')) mail_tpl_mail($t,$u['email'],$x);
    }
    }
    elseif ($o['money']<$decr*3) {
    if ($t=mail_tpl_get('mail_user_order_aminus')) mail_tpl_mail($t,$u['email'],$x);
    }
    else {
    if ($o['block']) {
    $o['block']=0;
    mysql_query("update orders set block='$o[block]' where id='$id'");
    }
    }
    break;
    case '-': if ($o['reason']=='C' or $o['reason']=='U' or $o['reason']=='X') {
    $o['block']-=$o['pay'];
    $x=array_merge(mail_tpl_mkpar('ORDER_',$o),mail_tpl_mkpar('SERVICE_',$s),mail_tpl_mkpar('PRICE_',$p),mail_tpl_mkpar('USER_',$u));
    $x['ORDER_MONEY']=round($x['ORDER_MONEY'],2);
    if ($o['block']<1) {
    if ($t=mail_tpl_get('mail_user_order_nprm')) mail_tpl_mail($t,$u['email'],$x);
    if ($t=mail_tpl_get('mail_admin_order_nprm')) mail_tpl_mail($t,$CFG['SITE_EMAIL'],$x);
    mysql_query("update orders set st='X',block=0,dt_block=now(),reason='C' where id=$id");
    order_remove($o['id'],true);
    $r=array('access'=>'a','user'=>$u['id'],'subj'=>$o['id'],'object'=>'hosting.order',
    'rem'=>"Автозаявка: необходимо удалить заказ '$o[login]' с сервера '$h[name]'.");
    $a=new operation(0,$r);
    $a->set_cat('remove'); $a->store();
    $m="Заказ автоматически удалён.";
    sys_log('O','hosting.order',$id,$m);
    mysql_query("insert into tasks set dt=now(),op='$a->id',subj='$o[id]',task='remove'");
    }
    else {
    mysql_query("update orders set block=$o[block] where id=$id");
    if ($t=mail_tpl_get('mail_user_order_bminus')) mail_tpl_mail($t,$u['email'],$x);
    }
    } break;
    default:
    break;
    }
    }
    }

    cron();
     
    Последнее редактирование модератором: 21 авг 2014
  4. WOLF_2010

    WOLF_2010 Постоялец

    Заблокирован
    Регистр.:
    8 окт 2011
    Сообщения:
    86
    Симпатии:
    109
    просто знаю что xfes свою деятельность начали в 2008 году, думаю их биллинг как то заточен под Api, может кто знает как к их биллингу привязывать хостинг панели?
    P.s только не пишите чтоб спросил у xfes, я пытался спросить они не отвечают нигде....
     
    Последнее редактирование: 21 авг 2014
  5. WOLF_2010

    WOLF_2010 Постоялец

    Заблокирован
    Регистр.:
    8 окт 2011
    Сообщения:
    86
    Симпатии:
    109
    как думаете может это создана для связки хостинг панели с биллингом?
     

    Вложения:

  6. Цукер

    Цукер Сам себе призедент

    Moderator
    Регистр.:
    5 мар 2008
    Сообщения:
    404
    Симпатии:
    371
    У них скорее всего самопис.
    Ту ссылку на whmcs - это модуль к нему для панельку, тобиш это модуль ставить в билинг и настраивается данные доступа.
    Я совсем понял остальное что вы имеете ввиду - сформулируйте както иначе вопрос... или подскажите что в итоге вы хотите получить я вам помогу... подскажу.. в какую сторону гуглить и думать
     
    WOLF_2010 нравится это.
  7. WOLF_2010

    WOLF_2010 Постоялец

    Заблокирован
    Регистр.:
    8 окт 2011
    Сообщения:
    86
    Симпатии:
    109
    Цукер да вы правы у них биллинг самописанный, я спросил имеется ли у них API на что они мне ответили

    я вот не знаю как быть если нету API, как биллинг настроить вручную к vestaCp?
     
  8. WOLF_2010

    WOLF_2010 Постоялец

    Заблокирован
    Регистр.:
    8 окт 2011
    Сообщения:
    86
    Симпатии:
    109
    а есть пример как подключить биллинг систему без Api к API панели VestaCP?

    или может есть вариант как написать для биллинга API?
     
    Последнее редактирование: 22 авг 2014
  9. WOLF_2010

    WOLF_2010 Постоялец

    Заблокирован
    Регистр.:
    8 окт 2011
    Сообщения:
    86
    Симпатии:
    109
    :(похоже с такой задачей никто мне не поможет....
     
  10. WOLF_2010

    WOLF_2010 Постоялец

    Заблокирован
    Регистр.:
    8 окт 2011
    Сообщения:
    86
    Симпатии:
    109
    цукер подскажите хоть как привязать к крону пользователя чтоб крон биллинга заблокировал пользователя и хостинг панель не открывалась пока он не оплатит?