Jump to content
Калькуляторы

UTM5 и СОРМ

Коллеги, доброго дня.

 

Внедряемся по СОРМ3, готовимся к опытной эксплуатации

 

встал вопрос заполнения справочников СОРМа ( .csv - файлы)  из биллинга  UTM5

подскажите, кто-то делал такое,

и возможно есть какое-то обкатанное  готовое решение? 

 

 

Edited by Trapp

Share this post


Link to post
Share on other sites
4 часа назад, Trapp сказал:

Внедряемся по СОРМ3, готовимся к опытной эксплуатации

 

встал вопрос заполнения справочников СОРМа ( .csv - файлы)  из биллинга  UTM5

У меня когнитивный диссонанс - "готовимся к опытной эксплуатации" vs "встал вопрос заполнения справочников".

Мы на стадии подготовки ТЗ вендорам на решение по приказу 573.

И уже сейчас меняем биллинг из за "встал вопрос заполнения справочников".

 

П.С. Извиняюсь за офф топ.

Share this post


Link to post
Share on other sites

Обычно производитель СОРМа выдает требования - в каком виде и какие  данные ему нужно выгрузить из биллинга.

У нас не UTM, но подход был именно такой. Приложением к договору на поставку СОРМ идет описание, где указано как должны называться имена файлов с данными, какие данные и в каком формате в этих файлах должны содержаться, с какой периодичностью они должны обновляться и куда выгружаться. А дальше уже софт СОРМа берет эти файлики и заполняет этими данными ИС СОРМ3.

Share this post


Link to post
Share on other sites
14 минут назад, Andrei сказал:

Приложением к договору на поставку СОРМ идет описание, где указано как должны называться имена файлов с данными, какие данные и в каком формате в этих файлах должны содержаться, с какой периодичностью они должны обновляться и куда выгружаться. А дальше уже софт СОРМа берет эти файлики и заполняет этими данными ИС СОРМ3. 

Тут главная проблема, что нужных полей может просто не быть.

Информация о структуре выгрузок не секретна, проверяйте свои базы данных и если всё хорошо - парсер Вам поможет.

Или нет. :)

Share this post


Link to post
Share on other sites
10 часов назад, bike сказал:

проверяйте свои базы данных и если всё хорошо

У меня-то все хорошо. Это топикстартеру совет.

10 часов назад, bike сказал:

Тут главная проблема, что нужных полей может просто не быть.

А вот это никого не волнует, кроме оператора.

Share this post


Link to post
Share on other sites

Коллеги, в том то и вопрос, что описание всех полей у всех интеграторов СОРМ +- одинковое

 

Вопрос найти - делал ли кто-то парсер для  UTM5,
чтобы не задействовать знакомого программиста

( он есть, но ленивый, почти как памятник, а пинать уже не интересно, люди то взрослые уже) 

 

либо с кем-то кто делал, или плотно работал с УТМ5 - договориться об изменениях под нас, так сказать в хорошем и взаимовыгодном темпе.

 

 

 

Share this post


Link to post
Share on other sites

Если есть описание БД (или дамп для примера) + описание от производителя СОРМ, то пишите в личку.

Share this post


Link to post
Share on other sites

Делал такое, но у меня еще своя дублирующая база связанная с утм.

Share this post


Link to post
Share on other sites

Нам куратор намекнул как то недавно, что бы им хотелось иметь базу данных абонентов, со всеми данными...не хотят видите ли они лишний раз к биллингу цепляться.  Тоже думаю, как бы им выгрузить.

Share this post


Link to post
Share on other sites
1 час назад, Cramac сказал:

@Antares ну так берем базу, выгружаем в цвс нужные поля и грузим на сорм. делов то :)

В том то и дело, что не в сорм надо ))) а куратору типа ексель, csv и т.п.

Share this post


Link to post
Share on other sites
23 минуты назад, Antares сказал:

В том то и дело, что не в сорм надо ))) а куратору типа ексель, csv и т.п.

У нас был специальный фтпшник и туда каждую неделю складывали данные в csv.

Share this post


Link to post
Share on other sites
42 минуты назад, VolanD666 сказал:

У нас был специальный фтпшник и туда каждую неделю складывали данные в csv.

А есть скриптик для забора данных из базы? )))

Share this post


Link to post
Share on other sites
2 минуты назад, Antares сказал:

А есть скриптик для забора данных из базы? )))

А у нас не утм-ка была. Но в приципе, зная структуру бд- такой скрипт пишется за день, а может и меньше )

Share this post


Link to post
Share on other sites
4 часа назад, Antares сказал:

В том то и дело, что не в сорм надо ))) а куратору типа ексель, csv и т.п.

ну эт не знаю, для продажи видимо :)

а так, та же выгрузка, да ему куда скажет. могу свой скинуть, но опять же, там выборка с двух баз, сначала своя, потом утм

Share this post


Link to post
Share on other sites

@Trapp очень много будет зависеть от того какие поля в том же utm заполнены.

Нам приходилось много дописывать, т.к. не все поля есть в стандартных.

К тому же если у вас не 5+, то писать точно все самим придется.

 

 

Share this post


Link to post
Share on other sites
5 часов назад, ShumBor сказал:

@Trapp очень много будет зависеть от того какие поля в том же utm заполнены.

Нам приходилось много дописывать, т.к. не все поля есть в стандартных.

К тому же если у вас не 5+, то писать точно все самим придется.

 

 

А там разве нельзя кастомные поля добавлять в UTM?

Share this post


Link to post
Share on other sites
В 09.04.2021 в 20:22, VolanD666 сказал:

А там разве нельзя кастомные поля добавлять в UTM?

Я кумекал и там много вещей.
Во первых это персональные данные и нужно регаться в РКН как оператор со всеми требованиями, организационными и техническими.
Персональные данные и данные юриков простые операторы видеть лучше не должны да и админы, кроме того нужна политика доступа к данным с логированием к ним доступа, УТМ тут не вкатывает.
Выгружать нужно изменения, поправил фамилию нужно выгружать событие с отменой старой записи, отслеживать изменения в двух базах геморно.
С wifi зонами тоже нужно интегрировать, тут нужно генерировать пользователя для СОРМ но у есть только сотовый и координаты  но обязательных полей нет ... потому бум решать как без обязательных требований.
Про необходимость сохранения оплаты и координат автоматов и т.п. тоже не в пользу УТМ.
Короче планирую выгружать пользователей в базу и минимум данных, потом отдельный человек будет заполнять все персональные данные под логи и к этой записи уже автоматом будут добавляться IP и удаляться.
Ну и wifi только в базе СОРМ, чтобы УТМ не нагружать абонентами только с номером телефона, а в СОРМ выгружалось начало сессии и конец сессии, но как координаты обновлять нужно разбираться.
В общем нужно будет писать под версию СОРМ-а, ну нужно соображать.

Share this post


Link to post
Share on other sites

Опять же нужно решать с абонентами которые в органах работают, вообще никаких данных в UTM быть не должно так зная логин пароль всё видно в личном кабинете, тупо писать "РФ" ))))
А вот уже в СОРМ-овой базе всё по полной.

Share this post


Link to post
Share on other sites
В 08.04.2021 в 20:10, Cramac сказал:

ну эт не знаю, для продажи видимо :)

а так, та же выгрузка, да ему куда скажет. могу свой скинуть, но опять же, там выборка с двух баз, сначала своя, потом утм

Кидай, посмотрю

Share this post


Link to post
Share on other sites

@VolanD666 У нас так и сделано. Просто до этого эти данные были только в бумажных договорах.

Share this post


Link to post
Share on other sites

@Antares 

Скрытый текст

<?php
include ("/var/www/html/tech/admin/inc/config.php");
include ("/var/www/html/tech/admin/inc/function.php");

if($start_date = str_replace(array(" ","\r","\n"), "",file_get_contents('/var/www/html/tech/admin/sorm/date.txt')) )
echo date("d-m-Y H:i:s", $start_date);
 
function ftp_upload ($src,$remote)
{

    // установка соединения
    $conn_id = ftp_connect("10.10.10.22");

    // проверка имени пользователя и пароля
    $login_result = ftp_login($conn_id, "", "");

    // загрузка файла 
    if (ftp_put($conn_id, $remote, $src, FTP_ASCII)) {
     echo "$file успешно загружен на сервер<br>\r\n";
    } else {
     echo "Не удалось загрузить $file на сервер<br>\r\n";
    }

    // закрытие соединения
    ftp_close($conn_id);
}
        
$index_arr[1]="123123";

// типы платежей которые не смотрим
$dont_show_type_pay="(102,116,117,103,104,105,1,2,3,7)";

################################# Абоненты ####################################################
$city= runSQL("SELECT * FROM `acl_city` where id_user=2",$database_lan);
for ($i=0;$i<count($city);$i++)
{
    $citya.=" or city_id=".$city[$i]["id_city"];
}

echo "SELECT * FROM `user` where 1=1".$citya;
$user= runSQL("SELECT * FROM `user` where 1=1".$citya,$database_lan);

$user_out=array();
for ($i=0;$i<count($user);$i++)
{
    //Дом номер
    $res1= runSQL("SELECT * FROM doma where id='".$user[$i]["address"]."'",$database_lan);
    $nomer_doma = $res1[0]['nomer'];
    $street_id = $res1[0]['street_id'];

    //название улицы
    $res1= runSQL("SELECT * FROM street where id='$street_id'",$database_lan);
    $name_street = $res1[0]['name'];
    $id_gorod = $res1[0]['gorod_id'];
    $user_index=$index_arr[$res1[0]['gorod_id']];
    
    //название города
    $res1= runSQL("SELECT name FROM gorod where id='$id_gorod'",$database_lan);
    $name_gorod = $res1[0]['name'];

    $kvart = $user[$i]['kvart'];

    $utm= runSQL("
        SELECT *
        FROM users u, 
         service_links sl, 
         iptraffic_service_links isl, 
         ip_groups ig, 
         accounts a 
        WHERE u.id=sl.user_id 
         AND u.basic_account=a.id 
         AND u.login = '".$user[$i]["login"]."'
         AND isl.id=sl.id 
         AND isl.ip_group_id=ig.ip_group_id 
         AND ig.is_deleted=0 
         AND u.is_deleted=0 
         AND sl.is_deleted=0 ORDER BY u.id
    ",$database_utm);
    /*
        SELECT users.id, users.login, users_accounts.account_id
        FROM users_accounts
        LEFT JOIN users ON users.id = users_accounts.`uid`
        where users.login='".$user[$i]["login"]."'
    */
    $user_login_arr[]=$utm[0]["login"];
    if ($utm[0]["basic_account"]!="") 
        {
        $user_login_arr[]=$utm[0]["uname"];
        $user_basicid_arr[$user[$i]["login"]]=$utm[0]["basic_account"];
        }
        //print_r($utm);
        
        if ($user[$i]["data"]>$start_date or $user[$i]["update"]>$start_date)
        {
            $user_out[]=array(
                "1_id_filial"=>chr(34)."1".chr(34),
                "2_login"=>chr(34).($utm[0]["login"]!="" ? $utm[0]["uname"] : $user[$i]["login"]).chr(34),
                "3_static_ip"=>chr(34)."".chr(34),
                "4_email"=>chr(34).'-'.chr(34),
                "5_telefon"=>chr(34).$user[$i]["mobile_nomer"].chr(34),
                "6_mac"=>chr(34).''.chr(34),
                "7_data_reg"=>chr(34).date("d.m.Y H:i:s", $user[$i]["data"]).chr(34),
                "8_num_dogovor"=>chr(34).$user[$i]["id"].chr(34),
                "9_status_dog"=>chr(34).($user[$i]["otkl"]==0 ? "0": "1").chr(34), //0 podkl, 1 otkl
                "10_data_podkl_usl"=>chr(34).date("d.m.Y H:i:s", $user[$i]["data"]).chr(34),
                "11_data_otkl_usl"=>chr(34).($user[$i]["otkl"]!=0 ? date("d.m.Y H:i:s", $user[$i]["data_otkl"]) : "").chr(34),
                "12_tip_abon"=>chr(34)."0".chr(34), //0 fizik, 1 urik
                "13_tip_dannix_fio"=>chr(34)."1".chr(34),
                "14_name"=>chr(34)."".chr(34),
                "15_otch"=>chr(34)."".chr(34),
                "16_famil"=>chr(34)."".chr(34),
                "17_nestrukt_fio"=>chr(34).$user[$i]["name_full"].chr(34),
                "18_data_rogd"=>chr(34)."".chr(34),
                "19_tip_pasp_dann"=>chr(34)."0".chr(34), //0 - структурированные паспортные данные, 1 - неструктурированные
                "20_seriya_pasp"=>chr(34).$user[$i]["seria"].chr(34),
                "21_nomer_pasp"=>chr(34).$user[$i]["nomer"].chr(34),
                "22_kem_kogda_pasp"=>chr(34).$user[$i]["vidan"]." ".$user[$i]["data_vidachi"].chr(34),
                "23_nestrukt_pasp"=>chr(34)."".chr(34),
                "24_id_tip_dokumenta"=>chr(34)."1".chr(34),
                "25_bank_abon"=>chr(34)."".chr(34),
                "26_nomer_scheta_abon"=>chr(34)."".chr(34),
                "27_ur_name"=>chr(34)."".chr(34),
                "28_ur_inn"=>chr(34)."".chr(34),
                "29_ur_kont_lico"=>chr(34)."".chr(34),
                "30_ur_kont"=>chr(34)."".chr(34),
                "31_ur_bank"=>chr(34)."".chr(34),
                "32_ur_shcet"=>chr(34)."".chr(34),
                "33_tip_addr_abon"=>chr(34)."0".chr(34),//0 - структурированные данные, 1 - неструктурированные
                "34_index"=>chr(34).$user_index.chr(34),
                "35_strana"=>chr(34)."Россия".chr(34),
                "36_obl"=>chr(34)."Московская область".chr(34),
                "37_rayon"=>chr(34)."Орехово-Зуевский".chr(34),
                "38_gorod"=>chr(34).$name_gorod.chr(34),
                "39_ulica"=>chr(34).$name_street.chr(34),
                "40_dom"=>chr(34).$nomer_doma.chr(34),
                "41_korpus"=>chr(34)."".chr(34),
                "42_kvart"=>chr(34).$kvart.chr(34),
                "43_nestrukt_adr"=>chr(34)."".chr(34),
                "44_ustr_tip_addr"=>chr(34)."0".chr(34), //адрес устройства 0 - структурированные данные, 1 - неструктурированные
                "45_ustr_index"=>chr(34).$user_index.chr(34),
                "46_ustr_strana"=>chr(34)."Россия".chr(34),
                "47_ustr_obl"=>chr(34)."Московская область".chr(34),
                "48_ustr_rayon"=>chr(34)."Орехово-Зуевский".chr(34),
                "49_ustr_gorod"=>chr(34).$name_gorod.chr(34),
                "50_ustr_ulica"=>chr(34).$name_street.chr(34),
                "51_ustr_dom"=>chr(34).$nomer_doma.chr(34),
                "52_ustr_korpus"=>chr(34)."".chr(34),
                "53_ustr_kvart"=>chr(34).$kvart.chr(34),
                "54_ustr_nestrukt_adr"=>chr(34)."".chr(34),
                );    
        }

}

$fp = fopen('/var/www/html/tech/admin/sorm/abonents_new.csv', 'w');
foreach ($user_out as $fields) {
    $fields=implode(';', $fields);
    $fields=iconv('UTF-8', 'cp1251', $fields);
    fwrite($fp, $fields . PHP_EOL);
}
fclose($fp);

    
ftp_upload ("/var/www/html/tech/admin/sorm/abonents_new.csv","/abonents/abonents/abonents_new.csv");


################################# Абоненты - услуги ####################################################
unset($utm);
for ($i=0;$i<count($user);$i++)
{
        //Услуга интернет
    //$serv= runSQL("SELECT * FROM `user` limit 10",$database_lan);
    $service[]=array(
    "1_id_filial"=>chr(34)."1".chr(34),
    "2_login"=>chr(34).$user[$i]["login"].chr(34),
    "3_num_dog"=>chr(34).$user[$i]["id"].chr(34),
    "4_id_uslugi"=>chr(34).'1'.chr(34),
    "5_data_podkl"=>chr(34).date("d.m.Y H:i:s", $user[$i]["data"]).chr(34),
    "6_data_otkl"=>chr(34).($user[$i]["data_otkl"]>0 ? date("d.m.Y H:i:s", $user[$i]["data_otkl"]) : "").chr(34),
    "7_nastroyki"=>chr(34)."".chr(34)
    );

    //ищем обещанный
    if ($user_basicid_arr[$user[$i]["login"]]!="")
        {
        $utm= runSQL("SELECT *
            FROM payment_transactions
            where actual_date>'".$start_date."' and method in ('103','104') and account_id =".$user_basicid_arr[$user[$i]["login"]]."
        ",$database_utm);
        
        for ($q=0;$q<count($utm);$q++)
            {
                $service[]=array(
                "1_id_filial"=>chr(34)."1".chr(34),
                "2_login"=>chr(34).$user[$i]["login"].chr(34),
                "3_num_dog"=>chr(34).$user[$i]["id"].chr(34),
                "4_id_uslugi"=>chr(34).$utm[$q]["method"].chr(34),
                "5_data_podkl"=>chr(34).date("d.m.Y H:i:s", $utm[$q]["actual_date"]).chr(34),
                "6_data_otkl"=>chr(34).date("d.m.Y H:i:s", $utm[$q+1]["actual_date"]).chr(34),
                "7_nastroyki"=>chr(34)."".chr(34)
                );
                $q=$q+1;
            }
        }

    //ищем турбо    
}

$fp = fopen('/var/www/html/tech/admin/sorm/services.csv', 'w');
foreach ($service as $fields) {
    $fields=implode(';', $fields);
    fwrite($fp, $fields . PHP_EOL);
}
fclose($fp);
//ftp_upload ("/var/www/html/tech/admin/sorm/services.csv","/abonents/services/services.csv");

############################## Справочники - тип услуг ##########################################################
$tip_service=array();

    $tip_service[]=array(
    "1_id_filial"=>chr(34)."1".chr(34),
    "2_id_uslugi"=>chr(34)."1".chr(34),
    "3_obozn_uslugi"=>chr(34).'интернет'.chr(34),
    "4_start_time"=>chr(34).'01.01.1970 00:00:00'.chr(34),
    "5_end_time"=>chr(34)."".chr(34),
    "6_opisanie"=>chr(34).'интернет'.chr(34)
    );

    $tip_service[]=array(
    "1_id_filial"=>chr(34)."1".chr(34),
    "2_id_uslugi"=>chr(34)."104".chr(34),
    "3_obozn_uslugi"=>chr(34).'Обещанный платеж'.chr(34),
    "4_start_time"=>chr(34).'01.01.1970 00:00:00'.chr(34),
    "5_end_time"=>chr(34)."".chr(34),
    "6_opisanie"=>chr(34).'Обещанный платеж'.chr(34)
    );
    
$fp = fopen('/var/www/html/tech/admin/sorm/supplement_services.csv', 'w');
foreach ($tip_service as $fields) {
    $fields=implode(';', $fields);
    $fields=iconv('UTF-8', 'Windows-1251', $fields);
    fwrite($fp, $fields . PHP_EOL);
}
fclose($fp);
//ftp_upload ("/var/www/html/tech/admin/sorm/supplement_services.csv","/dictionaries/supplement-services/supplement_services.csv");

############################## Справочники - тип документов ##########################################################
$tip_dok=array();

    $tip_dok[]=array(
    "1_id_filial"=>chr(34)."1".chr(34),
    "2_id_dok"=>chr(34)."1".chr(34),
    "3_start_time"=>chr(34)."01.01.1970 00:00:00".chr(34),
    "4_end_time"=>chr(34).''.chr(34),
    "5_opisanie"=>chr(34)."Паспорт РФ".chr(34)
    );

$fp = fopen('/var/www/html/tech/admin/sorm/doc_types.csv', 'w');
foreach ($tip_dok as $fields) {
    $fields=implode(';', $fields);
    $fields=iconv('UTF-8', 'Windows-1251', $fields);
    fwrite($fp, $fields . PHP_EOL);
}
fclose($fp);
//ftp_upload ("/var/www/html/tech/admin/sorm/doc_types.csv","/dictionaries/doc-types/doc_types.csv");

 

############################## Справочники - способов оплаты ##########################################################
$tip_pay=array();
    $paytype= runSQL("SELECT * FROM `payment_methods` where id not in ".$dont_show_type_pay,$database_utm);
    for ($i=0;$i<count($paytype);$i++)
    {
        $tip_pay[]=array(
        "1_id_filial"=>chr(34)."1".chr(34),
        "2_id_tippay"=>chr(34).$paytype[$i]["id"].chr(34),
        "3_start_time"=>chr(34)."01.01.1970 00:00:00".chr(34),
        "4_end_time"=>chr(34).''.chr(34),
        "5_opisanie"=>chr(34).$paytype[$i]["name"].chr(34)
        );
    }

$fp = fopen('/var/www/html/tech/admin/sorm/pay_types.csv', 'w');
foreach ($tip_pay as $fields) {
    $fields=implode(';', $fields);
    $fields=iconv('UTF-8', 'Windows-1251', $fields);
    fwrite($fp, $fields . PHP_EOL);
}
fclose($fp);
//ftp_upload ("/var/www/html/tech/admin/sorm/pay_types.csv","/dictionaries/pay-types/pay_types.csv");

############################## Справочники - 7.6Пополнение баланса личного счета  ##########################################################
$pay=array();

    for ($i=0;$i<count($user);$i++)
    {
        /*$pays= runSQL("SELECT payment_transactions.method,payment_transactions.actual_date,payment_transactions.payment_incurrency FROM `users`
        left join users_accounts on users_accounts.uid=users.id
        left join payment_transactions on users_accounts.account_id=payment_transactions.account_id
        where users.login='".$user[$i]["login"]."' and payment_transactions.method not in ".$dont_show_type_pay." 
        ",$database_utm);*/
        
        $pays= runSQL("SELECT method,actual_date,payment_incurrency FROM `payment_transactions`
        where actual_date>'".$start_date."' and account_id='".$user_basicid_arr[$user[$i]["login"]]."' and method not in ".$dont_show_type_pay." 
        ",$database_utm);
        
        for($q=0;$q<count($pays);$q++)
        {
            $pay[]=array(
            "1_id_filial"=>chr(34)."1".chr(34),
            "2_id_tippay"=>chr(34).$pays[$q]["method"].chr(34),
            "3_numdog"=>chr(34).$user[$i]["id"].chr(34),
            "4_statikip"=>chr(34).''.chr(34),
            "5_data"=>chr(34).date("d.m.Y H:i:s",$pays[$q]["actual_date"]).chr(34),
            "6_summa"=>chr(34).$pays[$q]["payment_incurrency"].chr(34),
            "7_dopinfo"=>chr(34).''.chr(34)
            );            
        }

    }

$fp = fopen('/var/www/html/tech/admin/sorm/balance-fillup.csv', 'w');
foreach ($pay as $fields) {
    $fields=implode(';', $fields);
    $fields=iconv('UTF-8', 'Windows-1251', $fields);
    fwrite($fp, $fields . PHP_EOL);
}
fclose($fp);
ftp_upload ("/var/www/html/tech/admin/sorm/balance-fillup.csv","/payments/balance-fillup/balance-fillup.csv");

//записываем дату 
$fp = fopen('/var/www/html/tech/admin/sorm/date.txt', 'w');
fwrite($fp, time() . PHP_EOL);
fclose($fp);

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now