Free Russian Billing Panel - Need Help - data-stream_ru - 07-07-2011 07:34 PM
ДД!
Спасибо что меня ещё не уволили с должности модератора за систематическую неявку на рабочее место.
Просто семью кормить надо и на бесплатные проекты времени не стало совсем
Особенно с учётом того, что их не включают в сборку. Наверное по томк что мы исть русские и есьмь по определению дебилы. А то что я нос утёр буржуям со своим кроном и со своими графиками загрузки серверов, так это им и не нужно. Зазорно им русский код принимать.
Это одна из причин почему я тут долго не появлялся...
"Не ходил бы ты ванёк во солдаты"
Так вот такие дела...
Я озаботился панелью билинга, т.к. количество юзеров растёт, и экселевских табличек и ручного выставления счетов уже недостаточно.
Я тут подумал, что для бесплатной панели управления сервером актуальна так же и _бесплатная_ панель билинга.
Посему от покупки _rootpanel_ я отказался. Не смотря на то, что я могу её дезендить и единожды купив за 30$ попользовать навсегда. пополнение за 2 бакса. Тоже раззендить.
Но там нет IspCP, а за доделку деньгов требуют.
Я так думаю не нарушая, о великий закон, есть возможность взять панель управления в открытом коде и бесплатную. Интерфейс с платёжными системами типа яндекс-деньги, вебмани, и т.д уже присутствует, и другие РБК-деньги присутсвует. Так же API с регистраторами доменов в большинстве своём есть.
Надо лишь чуток доптлить под нашу панель.
Ну и конечшно свои имхатые имхо реализовать.
Для начала ссылки
http://.joonte.com/
http://wiki.joonte.com/
http://forum.joonte.com/
Могу сделать тестера в уже установленной панели если кому надо.
RE: Free Russian Billing Panel - Need Help - data-stream_ru - 07-07-2011 09:33 PM
Извиниьте, поторопился, нас там не ждут.
Там какие то свои интересы.
Тема закрывается.
Ног панель можно взять "под себя!" Там разрабы учстали типа. и набижали доброхоты типа. А панель типа нечья...
RE: Free Russian Billing Panel - Need Help - data-stream_ru - 07-19-2011 02:40 AM
Тем не мене, первый кусочек.
Данная панель формирует свои логины , тогда как логином к IspCP является имя домена.
Некоторое ковыряне принесло следующие результаты.
Лично у меня путь выглядит так
/var/www/virtual/data-stream.ru/billing/htdocs/hosts/billing.data-stream.ru/comp/www/API
Надо положить файл HostingOrder.comp следующего содержания
Code:
#-------------------------------------------------------------------------------
/** @author Великодный В.В. (Joonte Ltd.) */
/******************************************************************************/
/******************************************************************************/
Eval(COMP_INIT);
/******************************************************************************/
/******************************************************************************/
$Args = Args();
#-------------------------------------------------------------------------------
$ContractID = (integer) @$Args['ContractID'];
$Domain = (string) @$Args['Domain'];
$HostingSchemeID = (integer) @$Args['HostingSchemeID'];
$DomainTypeID = (string) @$Args['DomainTypeID'];
$DomainName = (string) @$Args['DomainName'];
$DomainSchemeID = (integer) @$Args['DomainSchemeID'];
#-------------------------------------------------------------------------------
if(Is_Error(System_Load('modules/Authorisation.mod')))
return ERROR | @Trigger_Error(500);
#-------------------------------------------------------------------------------
$Regulars = Regulars();
#-------------------------------------------------------------------------------
if($DomainTypeID != 'None'){
#-----------------------------------------------------------------------------
$Domain = StrToLower($Domain);
#-----------------------------------------------------------------------------
if(Preg_Match('/^www\.(.+)$/',$Domain,$Mathces))
$Domain = Next($Mathces);
#-----------------------------------------------------------------------------
if(!Preg_Match($Regulars['Domain'],$Domain))
return new gException('WRONG_DOMAIN','Неверный домен');
#-----------------------------------------------------------------------------
$Count = DB_Count('HostingOrders',Array('Where'=>SPrintF("(`Domain` LIKE '%%%s%%' OR `Parked` LIKE '%%%s%%') AND `StatusID` != 'Waiting'",$Domain,$Domain)));
if(Is_Error($Count))
return ERROR | @Trigger_Error(500);
#-----------------------------------------------------------------------------
if($Count)
return new gException('DOMAIN_ALREADY_EXISTS','Доменное имя уже используется для одного из заказов хостинга');
}
#-------------------------------------------------------------------------------
if(!$HostingSchemeID)
return new gException('HOSTING_SCHEME_NOT_DEFINED','Тарифный план не выбран');
#-------------------------------------------------------------------------------
$HostingScheme = DB_Select('HostingSchemes',Array('ID','Name','ServersGroupID','IsActive'),Array('UNIQ','ID'=>$HostingSchemeID));
#-------------------------------------------------------------------------------
switch(ValueOf($HostingScheme)){
case 'error':
return ERROR | @Trigger_Error(500);
case 'exception':
return new gException('SCHEME_NOT_FOUND','Выбранный тарифный план заказа хостинга не найден');
case 'array':
#---------------------------------------------------------------------------
if(!$HostingScheme['IsActive'])
return new gException('SCHEME_NOT_ACTIVE','Выбранный тарифный план заказа хостинга не активен');
#---------------------------------------------------------------------------
$Contract = DB_Select('Contracts',Array('ID','UserID'),Array('UNIQ','ID'=>$ContractID));
#---------------------------------------------------------------------------
switch(ValueOf($Contract)){
case 'error':
return ERROR | @Trigger_Error(500);
case 'exception':
return new gException('CONTRACT_NOT_FOUND','Договор не найден');
case 'array':
#-----------------------------------------------------------------------
$__USER = $GLOBALS['__USER'];
#-----------------------------------------------------------------------
$IsPermission = Permission_Check('ContractRead',(integer)$__USER['ID'],(integer)$Contract['UserID']);
#-----------------------------------------------------------------------
switch(ValueOf($IsPermission)){
case 'error':
return ERROR | @Trigger_Error(500);
case 'exception':
return ERROR | @Trigger_Error(400);
case 'false':
return ERROR | @Trigger_Error(700);
case 'true':
#-------------------------------------------------------------------
$HostingServer = DB_Select('HostingServers',Array('ID','Domain','Prefix'),Array('Where'=>SPrintF("`ServersGroupID` = %u AND `IsDefault` = 'yes'",$HostingScheme['ServersGroupID'])));
#-------------------------------------------------------------------
switch(ValueOf($HostingServer)){
case 'error':
return ERROR | @Trigger_Error(500);
case 'exception':
return new gException('SERVER_NOT_DEFINED','Сервер размещения не определен');
case 'array':
#---------------------------------------------------------------
$HostingServer = Current($HostingServer);
#---------------------------------------------------------------
$Password = SubStr(Md5(UniqID()),0,12);
#-------------------------TRANSACTION---------------------------
if(Is_Error(DB_Transaction($TransactionID = UniqID('HostingOrder'))))
return ERROR | @Trigger_Error(500);
#---------------------------------------------------------------
$Where = SPrintF("`ContractID` = %u AND `TypeID` = 'HostingRules'",$Contract['ID']);
#---------------------------------------------------------------
$Count = DB_Count('ContractsEnclosures',Array('Where'=>$Where));
if(Is_Error($Count))
return ERROR | @Trigger_Error(500);
#---------------------------------------------------------------
if($Count < 1){
#-------------------------------------------------------------
$Comp = Comp_Load('www/API/ContractEnclosureMake',Array('ContractID'=>$Contract['ID'],'TypeID'=>'HostingRules'));
#-------------------------------------------------------------
switch(ValueOf($Comp)){
case 'error':
return ERROR | @Trigger_Error(500);
case 'exception':
return ERROR | @Trigger_Error(400);
case 'integer':
# No more...
break;
default:
return ERROR | @Trigger_Error(101);
}
}
#---------------------------------------------------------------
$OrderID = DB_Insert('Orders',Array('ContractID'=>$Contract['ID'],'ServiceID'=>10000));
if(Is_Error($OrderID))
return ERROR | @Trigger_Error(500);
#---------------------------------------------------------------
$Login = SPrintF('%s%s',$HostingServer['Prefix'],$OrderID);
#---------------------------------------------------------------
if($DomainTypeID == 'None')
$Domain = SPrintF('%s.%s',$Login,$HostingServer['Domain']);
#---------------------------------------------------------------
$IHostingOrder = Array(
#-------------------------------------------------------------
'OrderID' => $OrderID,
'SchemeID' => $HostingScheme['ID'],
'ServerID' => $HostingServer['ID'],
'Domain' => $Domain,
'Login' => $Domain,
'Password' => $Password,
);
#---------------------------------------------------------------
$HostingOrderID = DB_Insert('HostingOrders',$IHostingOrder);
if(Is_Error($HostingOrderID))
return ERROR | @Trigger_Error(500);
#---------------------------------------------------------------
$Comp = Comp_Load('www/API/StatusSet',Array('ModeID'=>'HostingOrders','StatusID'=>'Waiting','RowsIDs'=>$HostingOrderID,'Comment'=>'Заказ создан и ожидает оплаты'));
#---------------------------------------------------------------
switch(ValueOf($Comp)){
case 'error':
return ERROR | @Trigger_Error(500);
case 'exception':
return ERROR | @Trigger_Error(400);
case 'array':
#-----------------------------------------------------------
$IsInsert = DB_Insert('Events',Array('UserID'=>$Contract['UserID'],'PriorityID'=>'Billing','Text'=>SPrintF('Сформирована заявка на заказ хостинга логин (%s), домен (%s), тариф (%s)',$Login,$Domain,$HostingScheme['Name'])));
if(Is_Error($IsInsert))
return ERROR | @Trigger_Error(500);
#-----------------------------------------------------------
switch($DomainTypeID){
case 'Order':
#-------------------------------------------------------
if(!Preg_Match($Regulars['DomainName'],$DomainName))
return new gException('WRONG_DOMAIN_NAME','Неверное имя домена');
#-------------------------------------------------------
$DomainScheme = DB_Select('DomainsSchemes',Array('ID','IsActive','MinOrderYears'),Array('UNIQ','ID'=>$DomainSchemeID));
#-------------------------------------------------------
switch(ValueOf($DomainScheme)){
case 'error':
return ERROR | @Trigger_Error(500);
case 'exception':
return new gException('DOMAIN_SCHEME_NOT_FOUND','Выбранный тарифный домена план не найден');
case 'array':
#---------------------------------------------------
if(!$DomainScheme['IsActive'])
return new gException('SCHEME_NOT_ACTIVE','Выбранный тарифный план заказа домена не активен');
#---------------------------------------------------
$DomainOrder = Comp_Load('www/API/DomainOrder',Array('ContractID'=>$Contract['ID'],'DomainName'=>$DomainName,'DomainSchemeID'=>$DomainScheme['ID'],'HostingOrderID'=>$HostingOrderID));
#---------------------------------------------------
switch(ValueOf($DomainOrder)){
case 'error':
return ERROR | @Trigger_Error(500);
case 'exception':
# No more...
break 3;
case 'array':
#-----------------------------------------------
$DomainOrderPay = Comp_Load('www/API/DomainOrderPay',Array('DomainOrderID'=>$DomainOrder['DomainOrderID'],'YearsPay'=>$DomainScheme['MinOrderYears']));
#-----------------------------------------------
switch(ValueOf($DomainOrderPay)){
case 'error':
return ERROR | @Trigger_Error(500);
case 'exception':
# No more...
break 4;
case 'array':
# No more...
break 4;
default:
return ERROR | @Trigger_Error(101);
}
default:
return ERROR | @Trigger_Error(101);
}
default:
return ERROR | @Trigger_Error(101);
}
case 'Transfer':
#-------------------------------------------------------
$DomainScheme = DB_Select('DomainsSchemes','ID',Array('UNIQ','ID'=>$DomainSchemeID));
#-------------------------------------------------------
switch(ValueOf($DomainScheme)){
case 'error':
return ERROR | @Trigger_Error(500);
case 'exception':
return new gException('DOMAIN_SCHEME_NOT_FOUND','Выбранный тарифный домена план не найден');
case 'array':
#---------------------------------------------------
$DomainTransfer = Comp_Load('www/API/DomainTransfer',Array('ContractID'=>$Contract['ID'],'DomainName'=>$DomainName,'DomainSchemeID'=>$DomainScheme['ID']));
#---------------------------------------------------
switch(ValueOf($DomainTransfer)){
case 'error':
return ERROR | @Trigger_Error(500);
case 'exception':
# No more...
break 2;
case 'array':
# No more...
break 2;
default:
return ERROR | @Trigger_Error(101);
}
default:
return ERROR | @Trigger_Error(101);
}
break;
case 'Nothing':
# No more...
break;
default:
# No more...
}
#-----------------------------------------------------------
if(Is_Error(DB_Commit($TransactionID)))
return ERROR | @Trigger_Error(500);
#----------------------END TRANSACTION----------------------
return Array('Status'=>'Ok','HostingOrderID'=>$HostingOrderID);
default:
return ERROR | @Trigger_Error(101);
}
default:
return ERROR | @Trigger_Error(101);
}
default:
return ERROR | @Trigger_Error(101);
}
default:
return ERROR | @Trigger_Error(101);
}
default:
return ERROR | @Trigger_Error(101);
}
#-------------------------------------------------------------------------------
Если верить описанию, то аналогичный файл в дефолтной структуре перепишется при певервом же апгрейте. Т.е. все ваши изменения пропадут.
Тогда как файлы в папке имени вашего домена имеют наивысший приоритет.
Либу для панели напишу позже, уже начал.
P/S что касается жития святой фришной панели, то там такая ситуация - разрабы забили и почили на лаврах. На форуме рулят какие то предиректы к манам, которых нет. Сами ни хрена не въезжают и дописывают всякую фигню.
Идеальный вариант взять наработку "под себя" (попросту спи#дить) и допилить до логического уровня.
|