Advertisement
apog

utm_2_atirra.php

Dec 23rd, 2014
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 22.41 KB | None | 0 0
  1. <?PHP
  2.     define('MYSQL_ACCOUNT_FILED','account_id');
  3.     define('ACCOUNT_PREFIX','');
  4.     define('ACCOUNT_POSTFIX',' INTERNET');
  5.  
  6.     $debug   = 0;
  7.     if ($debug) error_reporting(E_ALL);
  8.  
  9.     require_once (dirname(__FILE__).'/config.php');
  10.     require_once (dirname(__FILE__).'/lib/class_db.php');
  11.     require_once (dirname(__FILE__).'/lib/str_func.php');
  12.  
  13.     // Функция, разбирающая Ф. И. О. на три поля
  14.     function get_fio($s, $z) {
  15.         $res = array();
  16.         $s = trim($s);
  17.         $fio = explode(' ',$s);
  18.         if (count($fio)==3 and $z==0) {
  19.             $res[0] = $fio[0];
  20.             $res[1] = $fio[1];
  21.             $res[2] = $fio[2];
  22.         }
  23.         else {
  24.             $res[0] = $s;
  25.             $res[1] = '';
  26.             $res[2] = '';
  27.         }
  28.         return $res;
  29.     }
  30.  
  31.     // Форматируем телефонные номера
  32.     function get_phone_string($phones) {
  33.         if ($phones <> '') {
  34.             $trans = array(" " => "", ";" => ",", "+7" => "", "-" => "", "!" => ""); // удаляем в номере телефона пробелы, дефизы, +7...
  35.             $result = strtr($phones, $trans);
  36.             return $result;
  37.         }
  38.         else {
  39.             return $phones;
  40.         }
  41.     }
  42.  
  43.     // Функция преобразования статуса Интернета и кода блокировки лицевого счета абонента UTM в текстовое описание
  44.     function get_status($o, $p) {
  45.         // Описание типов блокировок лицевого счета абонента
  46.         // http://www.netup.ru/UTM5/documentation/008/Base_rus.html
  47.         switch ($p) {
  48.             case 0:    $IS_BLOCKED = 'Блокировок нет';break;
  49.             case 16:   $IS_BLOCKED = 'Системная блокировка';break;
  50.             case 48:   $IS_BLOCKED = 'Системная блокировка с перерасчетом абонентской платы';break;
  51.             case 80:   $IS_BLOCKED = 'Системная блокировка с перерасчетом трафика';break;
  52.             case 112:  $IS_BLOCKED = 'Системная блокировка с перерасчетом абонентской платы и трафика';break;
  53.             case 256:  $IS_BLOCKED = 'Административная блокировка';break;
  54.             case 768:  $IS_BLOCKED = 'Административная блокировка с перерасчетом абонентской платы';break;
  55.             case 1280: $IS_BLOCKED = 'Административная блокировка с перерасчетом трафика';break;
  56.             case 1792: $IS_BLOCKED = 'Административная блокировка с перерасчетом абонентской платы и трафика';break;
  57.             case 4112: $IS_BLOCKED = 'Системная блокировка по квоте';break;
  58.             case 4144: $IS_BLOCKED = 'Системная блокировка по квоте с перерасчетом абонентской платы';break;
  59.             case 4176: $IS_BLOCKED = 'Системная блокировка по квоте с перерасчетом трафика';break;
  60.             case 4208: $IS_BLOCKED = 'Системная блокировка по квоте с перерасчетом абонентской платы и трафика';break;
  61.             default:   $IS_BLOCKED = 'Неизвестное состояние лицевого счета';
  62.         }
  63.         if ($o) {
  64.             $CUST_STATE_DESCR = 'Включен';
  65.             }
  66.         else {
  67.             $CUST_STATE_DESCR = 'Выключен. '.$IS_BLOCKED;
  68.             }
  69.         return $CUST_STATE_DESCR;
  70.     }
  71.  
  72.     // Функция раскрашивания строки в зависимости от того включен Интернет или нет
  73.     function get_row_color($int_status) {
  74.         if ($int_status) {
  75.             $HIS_COLOR = '$00DDFFDD'; // зеленый фон для включенных абонентов
  76.         }
  77.         else {
  78.             $HIS_COLOR = '$00DDDDFF'; // красный фон для выключенных абонентов
  79.             }
  80.         return $HIS_COLOR;
  81.     }
  82.  
  83.     $fb_session = new fbsql_db(FB_HOST, FB_DB, FB_USER, FB_PASS, 'UTF8');
  84.     $my_session = new mysql_db(UTM_DB_HOST, UTM_DB_NAME, UTM_DB_USER, UTM_DB_PASS);
  85.  
  86.     // mysql_query('set names utf8');
  87.     // перенес эту строчку в файл class_db.php в функцию mysql_db()
  88.     // у меня без нее вся кириллица значками вопроса
  89.  
  90.     // Начало текущего месяца
  91.     $start_date = date('Y-m-01');
  92.  
  93.     $exists_in_utm = array(); // массив абонентов UTM для проверки отсутствия абонентов из Атирры в UTM
  94.     $mysql = "SELECT users.id,
  95.            users_accounts.account_id,
  96.            users.login,
  97.            users.full_name,
  98.            users.work_telephone,
  99.            users.home_telephone,
  100.            users.mobile_telephone,
  101.            users.is_juridical,
  102.            users.house_id,
  103.            users.flat_number,
  104.            users.entrance,
  105.            users.floor,
  106.            users.remote_switch_id,
  107.            users.port_number,
  108.            users.create_date,
  109.            users.last_change_date,
  110.            users.connect_date,
  111.            accounts.is_blocked,
  112.            accounts.int_status,
  113.            accounts.balance,
  114.            accounts.credit,
  115.            account_tariff_link.tariff_id,
  116.            account_tariff_link.next_tariff_id,
  117.            account_tariff_link.discount_period_id,
  118.            (select tariffs.name from tariffs where tariffs.id = account_tariff_link.tariff_id) as current_tariff,
  119.            (select tariffs.name from tariffs where tariffs.id = account_tariff_link.next_tariff_id) as next_tariff,
  120.            (select tariffs.comments from tariffs where tariffs.id = account_tariff_link.tariff_id) as current_tariff_comment,
  121.            (select tariffs.comments from tariffs where tariffs.id = account_tariff_link.next_tariff_id) as next_tariff_comment
  122.        FROM
  123.            users, accounts, account_tariff_link, users_accounts
  124.        WHERE
  125.            users.is_deleted = 0
  126.            AND accounts.id = users_accounts.account_id
  127.            AND accounts.is_deleted = 0
  128.            AND account_tariff_link.account_id = accounts.id
  129.            AND account_tariff_link.is_deleted = 0
  130.            AND users_accounts.uid = users.id
  131.        ORDER BY
  132.            users.id";
  133.     $myres = $my_session ->select_assoc_all($mysql);
  134.  
  135.     $houses = array();
  136.     $sql = "select h.HOUSE_ID, H.HOUSE_CODE from house h"; // получаем из БД Атирры список домов с их кодами
  137.     $fbres = $fb_session->select_assoc_all($sql);
  138.     foreach($fbres as $row) {
  139.         $houses[$row['HOUSE_CODE']] = $row['HOUSE_ID']; // тут строим массив, содержаищий соответствие кода дома и его id
  140.     }
  141.  
  142.     foreach($myres as $myrow) {
  143.         $a = ACCOUNT_PREFIX.$myrow[MYSQL_ACCOUNT_FILED].ACCOUNT_POSTFIX; // генерируем номер лицевого счета с суффиксом INTERNET
  144.         $exists_in_utm[$a] = $myrow[MYSQL_ACCOUNT_FILED];
  145.         $house = $myrow['house_id'];
  146.         $sql = "SELECT
  147.                    C.CUSTOMER_ID,
  148.                    H.HOUSE_CODE,
  149.                    C.FLAT_NO,
  150.                    C.FIRSTNAME,
  151.                    C.SURNAME,
  152.                    C.MIDLENAME,
  153.                    C.HOUSE_ID,
  154.                    C.JURIDICAL,
  155.                    C.DOGOVOR_NO,
  156.                    C.CONTRACT_DATE,
  157.                    C.VALID_TO,
  158.                    C.ACTIVIZ_DATE,
  159.                    C.PORCH_N,
  160.                    C.FLOOR_N,
  161.                    C.DEBT_SUM,
  162.                    C.PREPAY,
  163.                    C.NOTICE,
  164.                    C.CUST_STATE,
  165.                    C.CUST_STATE_DESCR,
  166.                    C.HIS_COLOR,
  167.                    C.PHONE_NO,
  168.                    C.MOBILE_PHONE
  169.                FROM CUSTOMER C INNER JOIN HOUSE H ON (C.HOUSE_ID = H.HOUSE_ID)
  170.                WHERE C.ACCOUNT_NO = '$a'"; // смотрим абонента в БД Атирры с таким лицевым
  171.         $atrcust = $fb_session->select_assoc_all($sql);
  172.         if (count($atrcust) == 0) { // если абонента нет, то добавим
  173.             if (array_key_exists($house, $houses)) { // если id дома в БД Атирры есть, то...
  174.                 $fio = get_fio($myrow['full_name'], $myrow['is_juridical']); // парсим Ф.И.О.
  175.                 $HOUSE_ID   = $houses[$house]; // id дома
  176.                 $ACCOUNT_NO = $a; // номер лицевого счета с суффиксом INTERNET
  177.                 $SURNAME    = $fio[0]; // фамилия
  178.                 $FIRSTNAME  = $fio[1]; // имя
  179.                 $MIDLENAME  = $fio[2]; // отчество
  180.                 $PHONE_NO = get_phone_string($myrow['home_telephone']); // домашний телефон
  181.                 $MOBILE_PHONE = get_phone_string($myrow['mobile_telephone']); // мобильный телефон
  182.                 $FLAT_NO    = $myrow['flat_number']; // номер квартиры
  183.                 $JURIDICAL  = $myrow['is_juridical']; // 0 - физ. лица, 1 - юр. лица
  184.                 $DOGOVOR_NO = $myrow['id']; // номер договора
  185.                 $CONTRACT_DATE = date('Y-m-d', $myrow['create_date']); // дата договора
  186.                 $ACTIVIZ_DATE = date('Y-m-d', $myrow['connect_date']); // дата подключения
  187.                 $PORCH_N = $myrow['entrance']; // номер подъезда
  188.                 $FLOOR_N = $myrow['floor']; // этаж
  189.                 $BALANCE = round($myrow['balance'], 2); // баланс лицевого счета в UTM
  190.                 $PREPAY = round($myrow['credit'], 2); // обещанный платеж
  191.                 $NOTICE = 'Текущий тариф: '.$myrow['current_tariff'].' ('.$myrow['current_tariff_comment'].')'.PHP_EOL.'Следующий тариф: '.$myrow['next_tariff'].' ('.$myrow['next_tariff_comment'].')'; // примечание (текущий и следующий ТП)
  192.                 $CUST_STATE = $myrow['int_status']; // статус Интернета
  193.                 $CUST_STATE_DESCR = get_status($myrow['int_status'], $myrow['is_blocked']); // расшифровываем статус
  194.                 $HIS_COLOR = get_row_color($myrow['int_status']); // цвет фона строки
  195.                 $sql = "insert into CUSTOMER (
  196.                        HOUSE_ID,
  197.                        ACCOUNT_NO,
  198.                        SURNAME,
  199.                        FIRSTNAME,
  200.                        MIDLENAME,
  201.                        FLAT_NO,
  202.                        JURIDICAL,
  203.                        DOGOVOR_NO,
  204.                        CONTRACT_DATE,
  205.                        ACTIVIZ_DATE,
  206.                        PORCH_N,
  207.                        FLOOR_N,
  208.                        PREPAY,
  209.                        NOTICE,
  210.                        CUST_STATE,
  211.                        CUST_STATE_DESCR,
  212.                        HIS_COLOR,
  213.                        PHONE_NO,
  214.                        MOBILE_PHONE)
  215.                    values (
  216.                        '$HOUSE_ID',
  217.                        '$ACCOUNT_NO',
  218.                        '$SURNAME',
  219.                        '$FIRSTNAME',
  220.                        '$MIDLENAME',
  221.                        '$FLAT_NO',
  222.                        '$JURIDICAL',
  223.                        '$DOGOVOR_NO',
  224.                        '$CONTRACT_DATE',
  225.                        '$ACTIVIZ_DATE',
  226.                        '$PORCH_N',
  227.                        '$FLOOR_N',
  228.                        '$PREPAY',
  229.                        '$NOTICE',
  230.                        '$CUST_STATE',
  231.                        '$CUST_STATE_DESCR',
  232.                        '$HIS_COLOR',
  233.                        '$PHONE_NO',
  234.                        '$MOBILE_PHONE')";
  235.                 $fb_session->exec_modify_sql($sql);
  236.                 // тут добавляем атрибут "ИНТЕРНЕТ" вновь добавленному абоненту
  237.             $sql = "SELECT C.CUSTOMER_ID FROM CUSTOMER C WHERE C.ACCOUNT_NO = '$a'"; // узнаем ID абонента, чтоб добавить ему атрибут
  238.             $atrcustid = $fb_session->select_assoc_all($sql);
  239.                 $cust_id = $atrcustid[0];
  240.                 $CUSTOMER_ID = $cust_id['CUSTOMER_ID'];
  241.                 $NOTICE = 'Добавлен автоматически из биллинга UTM';
  242.                 $sql = "insert into CUSTOMER_ATTRIBUTES (
  243.                        CUSTOMER_ID,
  244.                        O_ID,
  245.                        NOTICE)
  246.                    values (
  247.                        '$CUSTOMER_ID',
  248.                        '234',
  249.                        '$NOTICE')"; // 234 - в моей БД id атрибута "ИНТЕРНЕТ". В вашей БД наверняка будет другой
  250.                 $fb_session->exec_modify_sql($sql);
  251.                 // Если баланс в UTM не ноль, то добавляем новому абоненту услугу синхронизации баланса
  252.                 if ($BALANCE <> 0) {
  253.                     $discount = round($BALANCE*'-1',2);
  254.                     $sql = "select ERROR, SALDO from MIGRATE_SERVICE_BY_ACCOUNT('$a',
  255.                     '20188', '$discount', '$start_date')"; // 20188 - разовая услуга "Начисления в биллинге UTM"
  256.                     $res = $fb_session->exec_modify_sql_with_result($sql);
  257.                 }
  258.             }
  259.             else {
  260.         // Тут мылим себе письмо с сообщением о проблеме
  261.         $body = "В БД Атирры не найден дом с кодом $house.".PHP_EOL
  262.         ."Необходимо найти в UTM этот дом, и указать его ID в поле КОД ДОМА в справочнике Атирры.".PHP_EOL
  263.         ."В противном случае абоненты, проживающие в этом доме не будут добавлены в БД Атирры.";
  264.         mailinform($body);
  265.         }
  266.         }
  267.         else {
  268.             // проверка на предмет изменений сведений об абоненте
  269.             $atr_ab = $atrcust[0];
  270.             $fio = get_fio($myrow['full_name'], $myrow['is_juridical']); // парсим Ф.И.О.
  271.             if (array_key_exists($house,$houses)) {
  272.                $HOUSE_ID   = $houses[$house]; // id дома
  273.             }
  274.             else {
  275.                $HOUSE_ID = 0; // Если не найден код дома в Атирре, то дом не указываем
  276.                // Тут мылим себе письмо с сообщением о проблеме
  277.                $body = "В БД Атирры не найден дом с кодом $house.".PHP_EOL
  278.                ."Необходимо найти в UTM этот дом, и указать его ID в поле КОД ДОМА в справочнике Атирры.".PHP_EOL
  279.                ."В противном случае абоненты, проживающие в этом доме не будут обновлены в БД Атирры.";
  280.                mailinform($body);
  281.             }
  282.             $ACCOUNT_NO = $a; // номер лицевого счета с суффиксом INTERNET
  283.             $SURNAME    = $fio[0]; // фамилия
  284.             $FIRSTNAME  = $fio[1]; // имя
  285.             $MIDLENAME  = $fio[2]; // отчество
  286.             $PHONE_NO = get_phone_string($myrow['home_telephone']); // домашний телефон
  287.             $MOBILE_PHONE = get_phone_string($myrow['mobile_telephone']); // мобильный телефон
  288.             $FLAT_NO    = $myrow['flat_number']; // номер квартиры
  289.             $JURIDICAL  = $myrow['is_juridical']; // 0 - физ. лица, 1 - юр. лица
  290.             $DOGOVOR_NO = $myrow['id']; // номер договора
  291.             $CONTRACT_DATE = date('Y-m-d', $myrow['create_date']); // дата договора
  292.             $ACTIVIZ_DATE = date('Y-m-d', $myrow['connect_date']); // дата подключения
  293.             $PORCH_N = $myrow['entrance']; // номер подъезда
  294.             $FLOOR_N = $myrow['floor']; // этаж
  295.             $BALANCE = round($myrow['balance'], 2); // баланс лицевого счета в UTM
  296.             $PREPAY = round($myrow['credit'], 2); // обещанный платеж
  297.             $NOTICE = 'Текущий тариф: '.$myrow['current_tariff'].' ('.$myrow['current_tariff_comment'].')'.PHP_EOL.'Следующий тариф: '.$myrow['next_tariff'].' ('.$myrow['next_tariff_comment'].')'; // примечание (текущий и следующий ТП)
  298.             $CUST_STATE = $myrow['int_status']; // статус Интернета
  299.             $CUST_STATE_DESCR = get_status($myrow['int_status'], $myrow['is_blocked']); // расшифровываем статус
  300.             $HIS_COLOR = get_row_color($myrow['int_status']); // цвет фона строки
  301.             $VALID_TO = ''; // дата окончания действия договора должна быть пустой у абонентов, которые попали в результат запроса в UTM
  302.             // если изменилось хотябы что то, то обновляем запись полностью
  303.             // сервер Firebird будет обновлять только фактически измененные поля, на сколько я знаю
  304.             $update_sql = '';
  305.             if (($house <> $atr_ab['HOUSE_CODE']) and ($HOUSE_ID <> 0)) $update_sql = $update_sql." HOUSE_ID  = '$HOUSE_ID',";
  306.             if ($SURNAME <> $atr_ab['SURNAME']    )        $update_sql = $update_sql." SURNAME   = '$SURNAME',";
  307.             if ($FIRSTNAME <> $atr_ab['FIRSTNAME'])        $update_sql = $update_sql." FIRSTNAME = '$FIRSTNAME',";
  308.             if ($MIDLENAME <> $atr_ab['MIDLENAME'])        $update_sql = $update_sql." MIDLENAME = '$MIDLENAME',";
  309.             if ($PHONE_NO <> $atr_ab['PHONE_NO']  )        $update_sql = $update_sql." PHONE_NO  = '$PHONE_NO',";
  310.             if ($FLAT_NO <> $atr_ab['FLAT_NO']    )        $update_sql = $update_sql." FLAT_NO   = '$FLAT_NO',";
  311.             if ($JURIDICAL <> $atr_ab['JURIDICAL'])        $update_sql = $update_sql." JURIDICAL = '$JURIDICAL',";
  312.             if ($DOGOVOR_NO <> $atr_ab['DOGOVOR_NO'])      $update_sql = $update_sql." DOGOVOR_NO= '$DOGOVOR_NO',";
  313.             if ($PORCH_N <> $atr_ab['PORCH_N'])            $update_sql = $update_sql." PORCH_N   = '$PORCH_N',";
  314.             if ($FLOOR_N <> $atr_ab['FLOOR_N'])            $update_sql = $update_sql." FLOOR_N   = '$FLOOR_N',";
  315.             if ($PREPAY <> $atr_ab['PREPAY'])              $update_sql = $update_sql." PREPAY    = '$PREPAY',";
  316.             if ($NOTICE <> $atr_ab['NOTICE'])              $update_sql = $update_sql." NOTICE    = '$NOTICE',";
  317.             if ($CUST_STATE <> $atr_ab['CUST_STATE'])      $update_sql = $update_sql." CUST_STATE= '$CUST_STATE',";
  318.             if ($HIS_COLOR <> $atr_ab['HIS_COLOR'])        $update_sql = $update_sql." HIS_COLOR = '$HIS_COLOR',";
  319.             if ($MOBILE_PHONE <> $atr_ab['MOBILE_PHONE'])  $update_sql = $update_sql." MOBILE_PHONE  = '$MOBILE_PHONE',";
  320.             if ($CONTRACT_DATE <> $atr_ab['CONTRACT_DATE'])$update_sql = $update_sql." CONTRACT_DATE = '$CONTRACT_DATE',";
  321.             if ($ACTIVIZ_DATE <> $atr_ab['ACTIVIZ_DATE'])  $update_sql = $update_sql." ACTIVIZ_DATE  = '$ACTIVIZ_DATE',";
  322.             if ($CUST_STATE_DESCR <> $atr_ab['CUST_STATE_DESCR'])  $update_sql = $update_sql." CUST_STATE_DESCR = '$CUST_STATE_DESCR',";
  323.             if ($VALID_TO <> $atr_ab['VALID_TO'])          $update_sql = $update_sql." VALID_TO = NULL,";
  324.  
  325.             if ($update_sql <> '') { // если есть что обновлять, то...
  326.                 $update_sql = substr($update_sql,0,-1); // удаляем лишнюю запятую в конце
  327.                 $sql = "update CUSTOMER set $update_sql where ACCOUNT_NO = '$ACCOUNT_NO'"; // окончательный запрос
  328.                 $fb_session->exec_modify_sql($sql);
  329.             }
  330.             // Проверка баланса. Если баланс в UTM и в Атирре отличаются, то корректируем сумму услуги синхронизации баланса
  331.             if ($BALANCE <> round($atr_ab['DEBT_SUM']*'-1',2)) {
  332.                 $sql = "select ERROR, SALDO from MIGRATE_SERVICE_BY_ACCOUNT('$a',
  333.                 '20188', '0', '$start_date')";
  334.                 $res = $fb_session->exec_modify_sql_with_result($sql);
  335.             $error_saldo = $res[0];
  336.             if (!$error_saldo['ERROR']) {
  337.                 $saldo = round($error_saldo['SALDO']*'-1'-$atr_ab['PREPAY'],2);
  338.                 $new_discount = round($saldo-$BALANCE,2);
  339.                     $sql = "select ERROR, SALDO from MIGRATE_SERVICE_BY_ACCOUNT('$a',
  340.                     '20188', '$new_discount', '$start_date')";
  341.                     $res = $fb_session->exec_modify_sql_with_result($sql);
  342.                     unset($res);
  343.             }
  344.             }
  345.         }
  346.         unset($atrcust);
  347.     }
  348.     unset($res);
  349.     // Тут мы выставляем дату окончания действия договора тем абонентам, которые больше не видны в запросах в UTM
  350.     $sql = "SELECT C.CUSTOMER_ID, C.ACCOUNT_NO, C.VALID_TO FROM CUSTOMER C WHERE C.ACCOUNT_NO like '".ACCOUNT_PREFIX."%".ACCOUNT_POSTFIX."'"; // смотрим абонента в БД Атирры с таким лицевым
  351.     $atrcust = $fb_session->select_assoc_all($sql);
  352.     foreach($atrcust as $fbrow) {
  353.         if (!array_key_exists($fbrow['ACCOUNT_NO'],$exists_in_utm)) {
  354.         $ACCOUNT_NO = $fbrow['ACCOUNT_NO'];
  355.         $VALID_TO = $fbrow['VALID_TO'];
  356.         // Если поле даты окончания договора пустое, то добавляем сегодняшнюю дату
  357.         if ($VALID_TO == '') {
  358.         $NOW = date('Y-m-d');
  359.         $sql = "update CUSTOMER set VALID_TO = '$NOW' where ACCOUNT_NO = '$ACCOUNT_NO'";
  360.         $fb_session->exec_modify_sql($sql);
  361.         }
  362.     }
  363.     }
  364. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement