Site Tools


Hotfix release available: 2025-05-14b "Librarian". upgrade now! [56.2] (what's this?)
Hotfix release available: 2025-05-14a "Librarian". upgrade now! [56.1] (what's this?)
New release available: 2025-05-14 "Librarian". upgrade now! [56] (what's this?)
tmp:p_number_usecases
<?php
 
// dummy nimega functioon, mis boksi võrku ilmudes teeb kõik tegevused, et andmed baasis hetke olukorrale vastavaks viia
function validate_stb() {
 
    // --- üritame tuvastada, millise ühenduse tagant stb võrku ilmus --- //
 
    // ---------------
    // leiame, millise ühenduse tagant boks hetkel võrku tuli
    // vastuseks saame P numbri või veateate
    // see peaks olema päring Henri poole ning siin ta lihtsalt suvaline dummy funktsioon lihtsalt näitamaks,
    //  et selline tegevus tehakse ning vastav info tulemusena saadakse
    list($real_p_number, $p_num_error) = ip_to_p_number($ip);
    // ---------------
 
 
    if (!$real_p_number) {
        if ($no_serial) {
            // sellist olukorda ei tohiks kunagi sisuliselt juhtuda. Kui juhtub, siis saab näidata vaid veateadet ning mitte midagi muud
            fatal_error("Helista 165!");
            exit;
        }
        else if ($no_ip) {
            // andmed on puudulikud ning üritame säilitada kliendil sama olukorra, mis tal seni oli,
            // sest, eeldame, et Elion on olukorras süüdi
            maintain_status_quo($serial, "no_ip");
            return true;
        }
        else if ($no_circuit_id OR $circuit_id_format_wrong) {
            // andmed on puudulikud ning üritame säilitada kliendil sama olukorra, mis tal seni oli,
            // sest, eeldame, et Elion on olukorras süüdi
            maintain_status_quo($serial, "circuit_id problem (no_circuit_id=".$no_circuit_id." | circuit_id_format_wrong=".$circuit_id_format_wrong);
            return true;
        }
        else if ($no_pnumber) {
            // boks on ühenduse taga, mis tehniliste baaside järgi ei tohiks toimida
            // paneme peale free_mode'i, sest eeldame, et klient on olukorras süüdi
            // (tegu ei saa olla ka ärikliendi erijuhtumiga, sest ka ärikliendil peab P number vähemasti olemas olema)
            create_dummy_client($serial, FREE_MODE, "no_pnumber");
            return true;
        }
        else if ($unknown_p_number_error)
            // andmed on puudulikud ning üritame säilitada kliendil sama olukorra, mis tal seni oli,
            // sest, eeldame, et Elion on olukorras süüdi
            maintain_status_quo($serial, "unknown_p_number_error (".$unknown_p_number_error.")");
            return true;
        }
 
    }
 
 
    // --- kui siiani jõuame, siis me teame täpselt, millise ühenduse taga stb hetkel on --- //
 
 
    // ---------------
    // vaja leida all olev info, kuid täpseid funktsioone ei tea ning siin nad suvaliste dummy nimedega
    $last_known_client = serial_to_client($serial);
    $last_known_p_number = $last_known_client->inet_p_number;
 
    // ühele interneti P numrile võib vastata mitu clientit (kui tegu ärikliendiga)
    $real_clients = inet_p_number_to_clients($real_p_number);
    // kuigi ärikliendil võib olla mitu client't ning need ka erinevate service'tega,
    // siis meid huvitab vaid fakt, kas tegu ärikliendiga ning seega sobib ühe suvalise tema client'i service
    $real_client = $real_clients[0];
    $real_service = $real_client->service;
    // ---------------
 
 
    // -- tuvastame, kas tegu ärikliendiga -- //
    //
    // See siin on AINUS koht kus ärikliendi teemadega tegeleme, 
    // sest kui meil baasis eelenvalt puudub info, et antud interneti ühenduse taga on ärikliendi asjad, 
    // siis ei saa me seda infot ka kuidagi tuletada ning käsitleme ühendust kui tavalist erakliendi case'i.
    // Lisamõttena juurde, et stb võrku tulemise hetkel me MITTE KUNAGI ei tee uut ärikliendi service'ga client'it. See tehakse AINULT argose synci peale.
    if (in_array($real_service, array(BUSINESS_HOUSING, BUSINESS_OFFICE))) {
        // kuna ühe ärikiendi ühenduse taga võib olla mitu erinevat toodet erinevate service'tega,
        // siis tuleb kontrollida, millise tootega antud boks seotud on või peab olema
 
        // leiame kas stb on juba mõne antud ühenduse client'ga seotud
        foreach ($real_clients AS $real_client) {
            if ($real_client->id == $stb->client_id) {
                // stb asub seal, kus ta ka varem asus ning midagi muuta pole vaja
                return $stb;
            }
        }
 
        // kui siia jõuame, siis stb varem antud ühendusega seotud ei olnud ning tuleb teada saada, millise client'i külge ta nüüd ühendada
        findClientForBusinessStb($stb, $real_clients);
 
        return $stb;
    }
 
 
    // -- siia j6udes tegu erakliendi stb (või uue ühenduse tagant tulnud stb'ga) -- //
 
    // stb tuli võrku sealt, kus ta varemgi oli
    // ehk, et stb on juba baasis seotud õige client'ga
    // (kuigi 99,9% kordadest maandutakse siia, siis ei saa seda blokki ärikliendi omast ettepoole tõsta, sest seal ei piisa sellest, kui stb tuleb sama ühenduse tagant vaid vaja ka TV P numbri järgi õiget client'it kontrollida)
    if ($real_p_number == $last_known_p_number) {
        // midagi pole muutunud ning seega pole ka midagi teha vaja
        return $stb;
    }
    // stb on liikunud teise ühensue taha kui ta varem oli
    else if ($real_client) {
        // seome boksi lihtsalt õige client'iga ning rohkem midagi kontrollida ega teha pole vaja
        Client::bindStbWithClient($stb, $real_client->id);
        return $stb;
    }
    // boks on tulnud võrku sellise ühenduse tagant, mille kohta client'it veel pole
    else {
        // Enamikul juhtudel ongi tegu uue kliendiga, kelle kohta veel Argose synci pole tulnud.
        // Peale paneme kõige tavalisema erakliendi baaspaketi, sest me ei saa hetkel kuidagi teada, et mis tal tulevikus olema hakkab.
        // Kui Argosest nüüd mingi hetk sync tuleb, siis keeratakse tal (vajadusel) service õigeks ning lisatakse ka preview.
        // Kui aga boks ilmus võrku kohast, kus digiTV'd ei olegi lubatud, siis paari päeva pärast keerab cron'i skript tal service free_mode'i peale.
        $client = Client::createClient($real_p_number, $real_tv_p_number);
        Client::bindStbWithClient($stb, $client->id);
        return $stb;
    }
} //end validate_stb
 
 
 
/**
* Andmed on puudulikud ning üritame säilitada kliendil sama olukorra, mis tal seni oli.
* Tekib siis, kui ei õnnestu leida mingeid olulisi andmeid, kuid seda ilmselt meie (Elioni) enda vea tõttu. 
* Eeldame, et klient pole midagi valesti teinud ning üritame teda mitte häirida.
*
*/
function maintain_status_quo($serial, $reason) {
    if ($no_stb) {
        // loome uue stb ning dummy kliendi, kellel peal free_mode
        // (kuna isegi stb'd pole baasis, siis ei saa tegu olla ka ärikliendi erijuhtumige ning paneme seega ikkagi free_mode peale)
        create_stb_with_dummy_client($serial, FREE_MODE);
    }
    else if ($no_client) {
        // loome dummy kliendi, kellel peal free_mode
        // (kuna stb oli baasis ilma client'ta, siis ei saa tegu olla ka ärikliendi erijuhtumige ning paneme seega ikkagi free_mode peale)
        create_dummy_client($stb, FREE_MODE);
    }
    else {
        // do nothing - maintain status quo
    }
 
    // kõik siia funktsiooni maandunud case'd tuleb selgelt eristuvalt logida ning nende ilmumist logisse pidevalt jälgida,
    // sest tegu ei ole normaalse olukorraga
    // näiteks logi kirje ees alati "NEEDS ATTENTION ASAP: "
    log_with_special_tag("maintain_status_quo ".$reason);
}
 
 
/**
* Loome uue dummy client'i, millel puuduvad korrektsed P numbrid
*
*/
function create_dummy_client($serial, $service = FREE_MODE, $reason) {
 
    // leiame baasist stb või vajadusel loome selle...    
 
 
    $inet_p_number = "DUMMY_".$client_id;
    $tv_p_number = NULL;
 
 
    // teeme clienti ...
 
 
    // kõik siia funktsiooni maandunud case'd tuleb selgelt eristuvalt logida ning nende ilmumist logisse pidevalt jälgida,
    // sest tegu ei ole normaalse olukorraga
    // näiteks logi kirje ees alati "NEEDS ATTENTION ASAP: "
    log_with_special_tag("created new dummy client (service=".$service.")".$reason);
}
 
 
/**
* Kontrollime, kas ärikliendil sama netiühenduse taga mitu erinevat TV toodet
* ning kui on, siis tuleb tuvastada (või kliendilt üle küsida) millisele vaatajakohale ta antud boksi lisas
* Lõpuks seome antud stb valitud client'ga.
*
*/
function findClientForBusinessStb($stb, $real_clients) {
    $open_locations = array();
    $different_services = array();
    // k2ime järjest läbi kõik antud interneti ühendusega seotud client'd
    foreach ($real_clients AS $real_client) {
        // muutuja, millesse kogume erinevad service'd, mis antud ühenduse taga võivad olla
        // enamasti on neid vaid 1, kuid äriklientide puhul võib ka olla mitu erinevat
        $different_services[$real_client->service_id] = true;
 
        // leiame, kas antud client'i küljes on hetkel vaba koht uue stb jaoks ehk ega client'ga juba pole mõnda stb'd seotud
        if (!client_to_stbs($real_client->id))  <- TODO: vaja kirjutada või kasutusele võtta õige funktsioon, mis seda teeks
            $open_locations[] = $real_client;
    }
 
 
    // kui kliendil on vaba vaatajakoht ning tema ühenduse taga on vaid üks service võimalik, 
    // siis seome lihtsalt stb antud client'ga ja elu on lill
    if (count($open_locations) AND count($different_services) == 1) {
        // Bind client with stb
        Client::bindStbWithClient($stb, $open_locations[0]->id);
 
        Yii::log('Business client\'s stb '.$stb->serial.' bonded with client '.$stb->client_id, 'info', 'application.models.Stb.findClientForBusinessStb');
        return true;
    }
    else {
        // kui ühendusel mitu client't või pole vaba vaatajakohta, siis tuleb igaljuhul kasutajalt üle küsida, et kas/kuhu boks ühendada 
        askUserToChooseClient($open_locations, $different_services, $real_clients);
        return true;
    }
}
 
 
function askUserToChooseClient($&stb, $real_clients, $open_locations) {
    // TODO/FIXME: hetkel teeme ikkagi valiku kasutaja eest ise ära, kuid see peab tulevikus muutuma!!!
    // peab andma kasutajale ette nimekirja kus iga tema vaatajakoha kohta on üks rida kujul: "service name (serial)"
    // kui antud vaatajakohaga ühtegi stb'd seotud ei ole, siis on seriali asemel kiri "vaba"
    // kui kasutaja valib mõne sellise rea, kus juba serial olemas, siis nimetutud serialiga stb seotakse client'i küljest lahti
 
    // ---- AJUTIN HÄKK ---- //
    // kui mõni vaba koht olemas, siis valime suvaliselt esimese neist
    if (count($open_locations)) {
        $client_id = $open_locations[0]->id;
        Yii::log('NEEDS ATTENTION ASAP: business client\'s stb '.$stb->serial.' bonded with first random free client '.$stb->client_id.' -> it means that service could be wrong', 'warning', 'application.models.Client.askUserToChooseClient');
    }
    else {
        // kui vabu vaatajakohti pole, siis seome boksi suvalise client'ga, mis on tegelikult suht vale käitumine kuna 
        // ärikliendil ei tohiks olla ühe client'i küljes mitut stb'd
        $client_id = $real_clients[0]->id;
        Yii::log('NEEDS ATTENTION ASAP: business client\'s stb '.$stb->serial.' bonded with first random client '.$stb->client_id.' -> business client has now 2 stb\'s and that is VERY WRONG!!!', 'warning', 'application.models.Client.askUserToChooseClient');
    }
    //END ---- AJUTIN HÄKK ---- //
 
 
    // seome stb uue valitud client'ga
    Client::bindStbWithClient($stb, $client_id);
    Yii::log('Business client\'s stb '.$stb->serial.' bonded with client '.$stb->client_id.' by user choice', 'info', 'application.models.Client.askUserToChooseClient');
}
 
/**
* Bind stb with (new) client and senda sync command to WideVine
* (old client will stay even if it hasn't got anymore stb bindings, because service in Argos is still active and stb might return)
*
*/
function bindStbWithClient($&stb, $client_id) {
    // vana seos logisse kirja (kui see eksisteeris)
    if ($stb->client_id)
        Yii::log('stb '.$stb->serial.' bonding with client '.$stb->client_id.' removed', 'info', 'application.models.Client.bindStbWithClient');
 
    $stb->client_id = $client_id;
    $stb->save();
    $stb->getActiveRelation('client');
 
    // syncime boksi tema uue client'iga määratud võtmed
    syncWideVineKeys($stb);
}
 
 
// Create new client
function createClient($real_p_number, $real_tv_p_number) {
    Yii::log('Create new client with inet pnumber ' . $real_p_number . ' and tv pnumber ' . $real_tv_p_number, 'info', 'application.models.Client.createClient');
 
    $client = new Client;
    $client->p_number = $real_p_number;
    $client->tv_p_number = $real_p_number;
    $client->service_id = Client::NEW_CLIENT_DEFAULT_SERVICE;  <-- lisasin muutja nimesse DEFAULT juurde
    $client->save();
    return $client;
}
 
 
function syncWideVineKeys($stb) {
    // TODO: all lihtsalt lambi nimedega funktsioonid, mis vaja alles kirjutada...
    $packets = getClientPackets($stb->client_id);
    doTheMagicWgetToHenri($stb->serial, $packets); // see ei pea eraldi funktsioon olema, vaid võiks siin samas lahti kirjutatud olla
}
tmp/p_number_usecases.txt · Last modified: 2019/09/20 15:52 by 127.0.0.1