Cand?
Exista mai multe situatii in care o company NU poate functiona corect iar situatia poate fi reglementata prin niste actiuni automate (care nu necesita interventia user-ului – diferit fata de – de exemplu – situatia in care compania nu are nici un cont asignat si user-ul trebuie sa aleaga conturile din planul de conturi). De exemplu atunci cand ceva nu este in regula in tabela de conturi company_account_catalog, sau cand exista un update pe aceasta tabela, care este obligatoriu. Sa luam un exemplu concret.
Exemplu
Astazi, 03.01.2017, am introdus un nou feature in company_account_catalog, si anume campul path. De acum inainte acest camp va fi exclusiv folosit pentru lua conturile pe compania curenta si a popula toate selectorarele de conturi. Pentru ca sa mearga insa, trebuie sa aiba date in el. Ca sa aiba date in el, trebuie din nou rulata CfoAccountUtils::updateCompanyAccountCatalog() pe toate companiile individual.
Am facut o migrare care va avertizeaza de asta, si va pune sa dati “yes” daca ati inteles. Voi dati yes, dar nu ati inteles, pentru ca nu o sa rulati functia asta pe toate companiile. Insa asta este obligatoriu.
Ca sa fim siguri ca functia este rulata, bagam un check automat in CfoContentUpdater :
static function pointCheck_companyAccountCatalogPath($companyId) {
$cacWithoutPaths = CompanyAccountCatalog::find()->where(["companyId" => $companyId])->andWhere("trim(path)=''")->all();
return count($cacWithoutPaths) && is_array($cacWithoutPaths);
}
Si un fix aotumat, tot acolo:
static function pointFix_companyAccountCatalogPath($companyId) {
CfoAccountUtils::updateCompanyAccountCatalogPaths($companyId);
}
Ideea este ca pointCheck_xxx() trebuie sa intoarca TRUE daca sunt fix-uri automate de facut iar pointFix_xxx() sa faca efectiv aceste fix-uri. “xxx” este un nume dat de voi care sa reprezinta cat mai clar ce este acest fix.
Codul acesta verifica daca exista cel putin un entry cu path gol, si daca exista, executa CfoAccountUtils::updateCompanyAccountCatalog() pe $companyId care vine ca parametru in cele doua functii. ATENTIE, NU FOLOSIT COMPANIA CURENTA in pointCheck_xxx() si pointFix_xxx()!
Ce vede user-ul in contul sau?
Daca este pe aceasta companie, atunci o sa vada un mesaj de avertizare, si toate functiile site-ului sunt blocate:
|
Maintenance in progress
The current company is being upgraded.
This process can take a few minutes, please wait. |
Ce se intampla in spate?
Se seteaza company.updateMarker pe 1, se fac operatiunile de update automate, se seteaza company.updateMarker pe 0 (deoarece cat timp company.updateMarker este > 0 , user-ul va vedea acel mesaj de mai sus).
Ce se intampla si mai in spate?
CommonController apeleaza asincron updater/check (care seteaza sau nu updaterMarker) apoi verifica daca updaterMarker este setat. Daca este setat, afisaza mesajul de mai sus. Daca nu, atunci nu intervine.
Concluzie
Cand ai o operatiune obligatorie per companie, trebuie sa creezi cele doua functii descrise mai sus. Atentie la erori, daca este ceva fatal, compania o sa ramana pe updaterMarker si user-ul va vedea mereu acel mesaj.
Din nou, mare atentie!
- codul tau din pointCheck_xxx() si pointFix_xxx() trebuie sa fie impecabil, si sa aiba error handling; daca apare vre-o eroare care opreste php-ul, compania va ramane in Maintenance Mode forever! (pana cand se reseteaza flag-ul manual)
- codul tau din pointCheck_xxx() trebuie sa fie extrem de rapid, el se executa la fiecare refresh, odata.
Yet another simple thing!