....................................../////.===Shadow-Here===./////................................................ > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < ------------------------------------------------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// RIFF¤ WEBPVP8 ˜ ðÑ *ôô>‘HŸK¥¤"§£±¨àð enü¹%½_F‘åè¿2ºQú³íªú`N¿­3ÿƒügµJžaÿ¯ÿ°~¼ÎùnúîÞÖô•òíôÁÉß®Sm¥Ü/ ‡ó˜f£Ùà<˜„xëJ¢Ù€SO3x<ªÔ©4¿+ç¶A`q@Ì“Úñè™ÍÿJÌ´ª-˜ÆtÊÛL]Ïq*‘Ý”ì#ŸÌÏãY]@ê`¿ /ªfkØB4·®£ó z—Üw¥Pxù–ÞLШKÇN¾AkÙTf½è'‰g gÆv›Øuh~ a˜Z— ïj*á¥t d£“uÒ ¨`K˜¹ßþ]b>˜]_ÏÔ6W—è2r4x•íÖ…"ƒÖNîä!¦å Ú}ýxGøÌ —@ ;ÆÚŠ=ɾ1ý8lªË¥ô ^yf®Œ¢u&2©nÙÇ›ñÂñŒ³ aPo['½»øFùà­+4ê“$!lövlüÞ=;N®3ð‚õ›DÉKòÞ>ÄÍ ¥ˆuߤ#ˆ$6ù™¥îЇy’ÍB¼ çxÛ;X"WL£R÷͝*ó-¶Zu}º.s¸sšXqù–DþÿvªhüïwyŸ ¯é³lÀ:KCûÄ£Ëá\…­ ~—ýóî ¼ûûÜTÓüÇy…ŽÆvc»¾×U ñ¸žþоP÷¦ó:Ò¨¨5;Ð#&#ÖúñläÿÁœ GxÉ­/ñ‡áQðìYÉtÒw޼GÔ´zàÒò ð*ëzƒ•4~H]Ø‹f ñÓÈñ`NåWçs'ÆÏW^ø¹!XžµmQ5ÃËoLœÎ: ÞËÍ¥J ù…î èo£ßPÎñ¶ž8.Œ]ʵ~5›ÙË-ù*8ÙÖß±~ ©¹rÓê‚j¶d¸{^Q'˜±Crß ÚH—#¥¥QlÀ×ëã‡DÜ«èî þ&Çæžî;ŽÏºò6ÒLÃXy&ZŒ'j‚¢Ù€IßÚù+–MGi‰*jE€‘JcÜ ÓÌ EÏÚj]o˜ Þr <¾U ûŪæÍ/šÝH¥˜b”¼ ÁñßX GP›ï2›4WŠÏà×£…íÓk†¦H·ÅíMh–*nó÷à]ÁjCº€b7<ب‹¨5車bp2:Á[UªM„QŒçiNMa#<5›áËó¸HýÊ"…×Éw¹¦ì2º–x<›»a±¸3Weü®FÝ⑱ö–î–³|LPÈ~çð~Çå‡|º kD¢µÏàÆAI %1À% ¹Ò – ”ϝS¦‰4&¶£°à Öý”û_Ò Áw°A«Å€?mÇÛgHÉ/8)á¾ÛìáöŽP í¨PŸNÙµº¦‡§Ùš"ÿ«>+ªÕ`Ê÷‡‚ß Õû˜þãÇ-PÍ.¾XV‘€ dÜ"þ4¹ ±Oú‘©t¥¦FªÄÃÄ•b‚znýu½—#cDs˜ÃiÑOˆñ×QO=*IAÊ,¶ŽZƒ;‡wøXè%EÐk:F±Ú” .Ѽ+Áu&Ç`."pÈÉw o&¿dE6‘’EqTuK@Ì¥ã™À(Êk(h‰,H}RÀIXÛš3µ1©_OqÚÒJAñ$ÊÙÜ;D3çŒ[þùœh¬Ã³™ö6ç†NY".Ú‰ï[ªŸŒ '²Ð öø_¨ÂÉ9ué¶³ÒŠõTàîMØ#û¯gN‡bÙ놚X„ö …ÉeüÌ^J ‹€.œ$Æ)βÄeæW#óüßĺŸ€ ÀzwV 9oä»f4V*uB «Ë†¹ì¯žR霓æHXa=&“I4K;¯ç‹h×·"UŠ~<•╪Vêª&ÍSÃÆÅ?ÔqÎ*mTM ˜›µwêd#[C¡©§‘D<©àb†–ÁœøvH/,í:¯( ²£|4-„Æövv„Yͼ™^Á$ˆ„¢Û[6yB.åH*V¨æ?$=˜Ñ€•ñ·­(VlŸ‘ nÀt8W÷´Bûba?q9ú¶Xƒl«ÿ\ù¶’þòUÐj/õ¢Ìµ³g$ƒÎR!¸»|Oߍë’BhîÚÑ¢ñåŒJ„®„£2Ð3•ô02Nt…!£Í]Ïc½Qÿ?ˆ<&ÃA¾Ú,JˆijÌ#5yz„‰Î|ÊŽ5QÏ:‹ÐaóVÔxW—CpeÏzÐïíçôÿÅ_[hãsÐ_/ŽTÝ?BîˆííV$<¿i>²F¬_Eß¿ †bÊŒº­ÿ®Z H“C}”¬,Mp ý/Bá£w>˜YV°aƒúh+cŠ- r/[%|üUMHäQ°X»|û/@|°¥Ð !BÔ Ç¢Ä©š+Õì D«7ìN¶ŽðÔ " ƶ’ÖçtA‰Û×}{tþz­¾GÍ›k¹OEJR$ Â׃ «ëÁ"oÉôž$oUK(Ä)Ãz³Ê-‹êN[Ò3Œñbï8P 4ƒ×q¢bo|?<ÛX¬òÄͰL–±›(™ûG?ýË©ÚÄ–ÂDØÐ_Ç¡ô ¾–ÄÏø ×e8Ë©$ÄF¹Å‹ì[©óìl:F¾f´‹‹Xì²ï®\¬ôùƒ ÿat¥óèÒùHß0äe‚;ü×h:ÆWðHž=Ã8骣"kœ'Y?³}Tûè€>?0l›e1Lòñ„aæKÆw…hÖŠùW…ÈÆÄ0ši·›[pcwËþñiêíY/~-Á5˜!¿†A›™Mÿþ(±“t@â“ö2­´TG5yé]çå僳 .·ÍïçÝ7UÚ±Ð/Nè»,_Ï ùdj7\ï Wì4›„»c¸àešg#ÒÊ⥭áØo5‘?ÌdÝô¯ ¹kzsƒ=´#ëÉK›Ø´±-¥eW?‡çßtòTã…$Ý+qÿ±ƒ÷_3Ô¥í÷:æ–ž<·Ö‡‰Å¢ š‡%Ô—utÌÈìðžgÖÀz²À—ï÷Óîäõ{K'´È÷³yaÏÁjƒô}ž§®æÊydÕÈë5¯èˆõvÕ©ã*çD„ “z„Ó‡^^xÂ3M§A´JG‚öï 3W'ˆ.OvXè¡ÊÕª?5º7†˜(˜Ç¶#çê’¶!ÌdZK§æ 0fãaN]òY³RV ™î$®K2R¨`W!1Ôó\;Ý ýB%qæK•&ÓÈe9È0êI±žeŸß -ú@žQr¦ ö4»M¼Áè¹µmw 9 EÆE_°2ó„ŸXKWÁ×Hóì^´²GѝF©óäR†¦‰ç"V»eØ<3ùd3ÿÚ¤Žú“Gi" —‘_ÙËÎ~Üö¯¥½Î»üŸEÚŽåmÞþí ;ÞólËΦMzA"Âf(´òá;Éï(/7½ûñÌ­cïÕçлþÝz¾-ÍvÑ“pH­–ðÓj$¸Äû¤‚‘ãUBË-n“2åPkS5&‹Â|+g^œ®Ì͆d!OïäîU«c;{Û!ÅŽ«ëZ9Ókóˆ]¯ƒ›né `ÇÒ+tÆš (ØKá¾—=3œ®•vuMñg²\ï Ec€ 05±d™‡×iÇ×›UúvÌ¢£Èþ¡ÕØô¶ßÎA"ß±#Ö²ˆÊŸ¦*Ä~ij|àø.-¼'»Ú¥£h ofº¦‡VsR=N½„Î v˜Z*SÌ{=jÑB‹tê…;’HžH¯8–îDù8ñ¢|Q•bÛçš–‹m³“ê¨ åÏ^m¬Žãþ©ïêO‡½6] µÆ„Ooòü ²x}N¦Ë3ïé¿»€›HA˜m%çÞ/¿í7Fø“‹léUk)É°Œµ8Q8›:ÀŠeT*šõ~ôڝG6 ¢}`ùH­–”¡k ‰P1>š†®9z11!X wKfmÁ¦xÑ,N1Q”–æB¶M…ÒÃv6SMˆhU¬ÊPŽï‘öj=·CŒ¯u¹ƒVIЃsx4’ömÛýcå¡¶7ßŠß 57^\wÒÐÆ k§h,Œý î«q^R½3]J¸ÇðN ‚çU¬ôº^Áì} ³f©Õœ§ˆã:FÄÈ‚é(€™?àýÓüè1Gô£¼éj‚OÅñ  #>×—ßtà 0G¥Åa뀐kßhc™À_ÉñÞ#±)GD" YîäË-ÿÙ̪ ¹™a¯´¢E\ÝÒö‚;™„ë]_ p8‰o¡ñ+^÷ 3‘'dT4œŽ ðVë½° :¬víÑ«£tßÚS-3¶“þ2 †üüʨòrš¹M{É_¤`Û¨0ìjœøJ‡:÷ÃáZ˜†@GP&œÑDGÏs¡þ¦þDGú‘1Yá9Ôþ¼ ûø…§÷8&–ÜÑnÄ_m®^üÆ`;ÉVÁJ£?â€-ßê}suÍ2sõA NÌúA磸‘îÿÚ»ƒìö·á¿±tÑÐ"Tÿü˜[@/äj¬€uüªìù¥Ý˜á8Ý´sõj 8@rˆð äþZÇD®ÿUÏ2ùôõrBzÆÏÞž>Ì™xœ“ wiÎ×7_… ¸ \#€MɁV¶¥üÕÿPÔ9Z‡ø§É8#H:ƒ5ÀÝå9ÍIŒ5åKÙŠ÷qÄ>1AÈøžj"µÂд/ªnÀ qªã}"iŸBå˜ÓÛŽ¦…&ݧ;G@—³b¯“•"´4í¨ôM¨åñC‹ïùÉó¯ÓsSH2Ý@ßáM‡ˆKÀªÛUeø/4\gnm¥‹ŸŒ qÄ b9ÞwÒNÏ_4Ég³ú=܆‚´ •â¥õeíþkjz>éÚyU«Íӝ݃6"8/ø{=Ô¢»G¥ äUw°W«,ô—¿ãㆅү¢³xŠUû™yŒ (øSópÐ 9\åTâ»—*oG$/×ÍT†Y¿1¤Þ¢_‡ ¼ „±ÍçèSaÓ 3ÛMÁBkxs‰’R/¡¤ˆÙçª(*õ„üXÌ´ƒ E§´¬EF"Ù”R/ÐNyÆÂ^°?™6¡œïJ·±$§?º>ÖüœcNÌù¯G ‹ñ2ЁBB„^·úìaz¨k:#¨Æ¨8LÎõލ£^§S&cŒÐU€ü(‡F±Š¼&P>8ÙÁ ‰ p5?0ÊÆƒZl¸aô š¼¡}gÿ¶zÆC²¹¬ÎÖG*HB¡O<º2#ñŒAƒ–¡B˜´É$¥›É:FÀÔx¾u?XÜÏÓvN©RS{2ʈãk9rmP¼Qq̳ è¼ÐFׄ^¡Öì fE“F4A…!ì/…¦Lƒ… … $%´¾yã@CI¬ á—3PþBÏNÿ<ý°4Ü ËÃ#ØÍ~âW«rEñw‹eùMMHß²`¬Öó½íf³:‹k˜¯÷}Z!ã¿<¥,\#öµÀ¯aÒNÆIé,Ћ–lŽ#Àæ9ÀÒS·I’½-Ïp Äz¤Š Â* ­íÄ9­< h>׍3ZkËU¹§˜ŒŠ±f­’¤º³Q ÏB?‹#µíÃ¥®@(Gs«†vI¥Mµ‹Á©e~2ú³ÁP4ìÕi‚²Ê^ö@-DþÓàlÜOÍ]n"µã:žpsŽ¢:! Aõ.ç~ÓBûH÷JCÌ]õVƒd «ú´QÙEA–¯¯Œ!.ˆˆëQ±ù œ·Ì!Õâ )ùL„ÅÀlÚè5@B…o´Æ¸XÓ&Û…O«˜”_#‡ƒ„ûÈt!¤ÁÏ›ÎÝŠ?c9 â\>lÓÁVÄÑ™£eØY]:fÝ–—ù+p{™ðè û³”g±OƒÚSù£áÁÊ„ä,ï7š²G ÕÌBk)~ÑiCµ|h#u¤¶îK¨² #²vݯGãeÖ϶ú…¾múÀ¶þÔñ‚Š9'^($¤§ò “š½{éúp÷J›ušS¹áªCÂubÃH9™D™/ZöØÁ‡¦ÝÙŸ·kð*_”.C‹{áXó€‡c¡c€§/šò/&éš÷,àéJþ‰X›fµ“C¨œ®r¬"kL‰Â_q…Z–.ÉL~O µ›zn‚¹À¦Öª7\àHµšÖ %»ÇníV[¥*Õ;ƒ#½¾HK-ÖIÊdÏEÚ#=o÷Óò³´Š: Ç?{¾+9›–‘OEáU·S€˜j"ÄaÜ ŒÛWt› á–c#a»pÔZÞdŽtWê=9éöÊ¢µ~ ë ;Öe‡Œ®:bî3±ýê¢wà¼îpêñ¹¾4 zc¾ðÖÿzdêŒÑÒŝÀ‰s6¤í³ÎÙB¿OZ”+F¤á‡3@Ñëäg©·Ž ˆèª<ù@É{&S„œÕúÀA)‰h:YÀ5^ÂÓŒ°õäU\ ùËÍû#²?Xe¬tu‰^zÒÔãë¼ÛWtEtû …‚g¶Úüâî*moGè¨7%u!]PhÏd™Ý%Îx: VÒ¦ôÊD3ÀŽKÛËãvÆî…N¯ä>Eró–ð`5 Œ%u5XkñÌ*NU%¶áœÊ:Qÿú»“úzyÏ6å-၇¾ ´ ÒÊ]y žO‘w2Äøæ…H’²f±ÎÇ.ª|¥'gîV•Ü .̘¯€šòü¤U~Ù†*¢!?ò wý,}´°ÔÞnïoKq5µb!áÓ3"vAßH¡³¡·G(ÐÎ0Îò¼MG!/ài®@—¬04*`…«é8ªøøló“ˆÊ”èù¤…ßÊoÿé'ËuÌÖ5×È¡§ˆˆfŽë9}hìâ_!!¯  B&Ëö¶‰ÀAÙNVŸ Wh›¸®XÑJì¨ú“¿÷3uj²˜¨ÍÎìë±aúŠÝå¯ð*Ó¨ôJ“yºØ)m°WýOè68†ŸÏ2—‰Ïüꪫٚ¥‹l1 ø ÏÄFjêµvÌbü¦èÝx:X±¢H=MÐß—,ˆÉÇ´(9ú¾^ÅÚ4¿m‡$âX‘å%(AlZo@½¨UOÌÕ”1ø¸jÎÀÃÃ_ µ‘Ü.œº¦Ut: Æï’!=¯uwû#,“pþÇúŒø(é@?³ü¥‘Mo §—s@Œ#)§ŒùkL}NOÆêA›¸~r½¼ÙA—HJ«eˆÖ´*¡ÓpÌŸö.m<-"³ûÈ$¬_6­åf£ïÚâj1y§ÕJ½@dÞÁr&Í\Z%D£Íñ·AZ Û³øüd/ªAi†/Й~  ‡âĮҮÏh§°b—›Û«mJžòG'[ÈYýŒ¦9psl ýÁ ®±f¦x,‰½tN ‚Xª9 ÙÖH.«Lo0×?͹m¡å†Ѽ+›2ƒF ±Ê8 7Hցϓ²Æ–m9…òŸï]Â1äN†VLâCˆU .ÿ‰Ts +ÅÎx(%¦u]6AF Š ØF鈄‘ |¢¶c±soŒ/t[a¾–û:s·`i햍ê›ËchÈ…8ßÀUÜewŒðNOƒõD%q#éû\9¤x¹&UE×G¥ Í—™$ð E6-‡¼!ýpãÔM˜ Âsìe¯ñµK¢Ç¡ùôléœ4Ö£”À Š®Ðc ^¨À}ÙËŸ§›ºê{ÊuÉC ×Sr€¤’fÉ*j!úÓ’Gsùìoîßîn%ò· àc Wp÷$¨˜)û»H ×8ŽÒ€Zj¤3ÀÙºY'Ql¦py{-6íÔCeiØp‘‡XÊîÆUߢ܂ž£Xé¼Y8þ©ëgñß}é.ÎógÒ„ÃØËø¯»™§Xýy M%@NŠ À(~áÐvu7&•,Ù˜ó€uP‡^^®=_E„jt’ 403WebShell
403Webshell
Server IP : 107.180.102.13  /  Your IP : 216.73.216.161
Web Server : Apache
System : Linux ip-107-180-102-13.ip.secureserver.net 3.10.0-1160.119.1.el7.tuxcare.els25.x86_64 #1 SMP Wed Oct 1 17:37:27 UTC 2025 x86_64
User : nobody ( 99)
PHP Version : 7.3.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /home/egdeals/public_html/admin/controller/extension/advertise/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/egdeals/public_html/admin/controller/extension/advertise/google.php
<?php

use \googleshopping\exception\Connection as ConnectionException;
use \googleshopping\Googleshopping;
use \googleshopping\traits\LibraryLoader;
use \googleshopping\traits\StoreLoader;

class ControllerExtensionAdvertiseGoogle extends Controller {
    use StoreLoader;
    use LibraryLoader;

    private $error = array();
    private $store_id = 0;

    public function __construct($registry) {
        parent::__construct($registry);

        $this->store_id = isset($this->request->get['store_id']) ? (int)$this->request->get['store_id'] : 0;

        $this->loadStore($this->store_id);

        $this->loadLibrary($this->store_id);
    }

    public function index() {
        $this->load->language('extension/advertise/google');

        $this->load->model('extension/advertise/google');

        $this->load->config('googleshopping/googleshopping');

        // Fix clashes with third-party extension table names
        $this->model_extension_advertise_google->renameTables();

        // Even though this should be ran during install, there are known cases of webstores which do not trigger the install method. This is why we run createTables here explicitly.
        $this->model_extension_advertise_google->createTables();

        // Fix a missing AUTO_INCREMENT
        $this->model_extension_advertise_google->fixColumns();
        
        // Redirect to the preliminary check-list
        if (!$this->setting->get('advertise_google_checklist_confirmed')) {
            $this->response->redirect($this->url->link('extension/advertise/google/checklist', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
        }

        try {
            // If we have not connected, navigate to connect screen
            if (!$this->setting->has('advertise_google_access_token')) {
                $this->response->redirect($this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } else if (!$this->setting->has('advertise_google_gmc_account_selected')) {
                // In case the merchant has made no decision about which GMC account to use, redirect to the form for connection
                $this->response->redirect($this->url->link('extension/advertise/google/merchant', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } else if (!$this->googleshopping->isStoreUrlClaimed()) {
                if (empty($this->session->data['error'])) {
                    $this->session->data['error'] = $this->language->get('error_store_url_claim');
                }

                // In case the merchant has made no decision about which GMC account to use, redirect to the form for connection
                $this->response->redirect($this->url->link('extension/advertise/google/merchant', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } else if (count($this->googleshopping->getTargets($this->store_id)) == 0) {
                $this->response->redirect($this->url->link('extension/advertise/google/campaign', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } else if (!$this->setting->has('advertise_google_gmc_shipping_taxes_configured')) {
                // In case the merchant has not set up shipping and taxes, redirect them to the form for shipping and taxes
                $this->response->redirect($this->url->link('extension/advertise/google/shipping_taxes', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } else if (count($this->model_extension_advertise_google->getMapping($this->store_id)) == 0) {
                // In case the merchant has not set up mapping, redirect them to the form for mapping
                $this->response->redirect($this->url->link('extension/advertise/google/mapping', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            }

            // Pull the campaign reports
            $this->googleshopping->getCampaignReports();
        } catch (ConnectionException $e) {
            $this->session->data['error'] = $e->getMessage();

            $this->response->redirect($this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
        } catch (\RuntimeException $e) {
            $this->error['warning'] = $e->getMessage();
        }

        if ($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validateSettings()) {
            $this->applyNewSettings($this->request->post);

            try {
                // Profilactic target push, as sometimes targets are not initialized properly
                $this->googleshopping->pushTargets();
                $this->googleshopping->pushCampaignStatus();

                $this->session->data['success'] = $this->language->get('success_index');

                $this->response->redirect($this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } catch (ConnectionException $e) {
                $this->session->data['error'] = $e->getMessage();

                $this->response->redirect($this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } catch (\RuntimeException $e) {
                $this->error['warning'] = $e->getMessage();
            }
        }

        $this->document->setTitle($this->language->get('heading_title'));

        $data = array();

        $data['text_connected'] = sprintf($this->language->get('text_connected'), $this->setting->get('advertise_google_gmc_account_id'));

        $data['error'] = '';

        if (isset($this->session->data['error'])) {
            $data['error'] = $this->session->data['error'];
            unset($this->session->data['error']);
        } else if (!empty($this->error['warning'])) {
            $data['error'] = $this->error['warning'];
        }

        $data['error_cron_email']                   = $this->getValidationError('cron_email');
        $data['error_cron_acknowledge']             = $this->getValidationError('cron_acknowledge');

        $data['success'] = '';

        if (isset($this->session->data['success'])) {
            $data['success'] = $this->session->data['success'];
            unset($this->session->data['success']);
        }

        $advertised_count = $this->model_extension_advertise_google->getAdvertisedCount($this->store_id);
        $last_cron_executed = (int)$this->setting->get('advertise_google_cron_last_executed');

        $data['warning'] = '';

        if (!$this->setting->get('advertise_google_status') && $this->model_extension_advertise_google->hasActiveTarget($this->store_id)) {
            $data['warning'] = $this->language->get('warning_disabled');
        } else if (!$this->model_extension_advertise_google->hasActiveTarget($this->store_id)) {
            $data['warning'] = sprintf($this->language->get('warning_no_active_campaigns'), $this->url->link('extension/advertise/google/campaign', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'] . '&from_dashboard=true', true));
        } else if ($advertised_count == 0) {
            $data['warning'] = sprintf($this->language->get("warning_no_advertised_products"), $this->language->get("text_video_tutorial_url_advertise"));
        } else if ($last_cron_executed + 24 * 60 * 60 <= time()) {
            $data['warning'] = sprintf($this->language->get("warning_last_cron_executed"), $this->language->get("text_tutorial_cron"));
        }

        $data['breadcrumbs']   = array();
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_home'),
            'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true),
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_extensions'),
            'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=advertise', true),
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('heading_title'),
            'href' => $this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true),
        );

        $reporting_intervals = $this->config->get('advertise_google_reporting_intervals');

        $data['user_token'] = $this->session->data['user_token'];

        $data['cancel'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=advertise', true);
        $data['action'] = $this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true);
        $data['shipping_taxes'] = $this->url->link('extension/advertise/google/shipping_taxes', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'] . '&from_dashboard=true', true);
        $data['campaign'] = $this->url->link('extension/advertise/google/campaign', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'] . '&from_dashboard=true', true);
        $data['mapping'] = $this->url->link('extension/advertise/google/mapping', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'] . '&from_dashboard=true', true);
        $data['disconnect'] = $this->url->link('extension/advertise/google/disconnect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true);
        $data['list_ads'] = html_entity_decode($this->url->link('extension/advertise/google/list_ads', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');
        $data['advertise'] = html_entity_decode($this->url->link('extension/advertise/google/advertise', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');
        $data['url_popup'] = html_entity_decode($this->url->link('extension/advertise/google/popup_product', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');
        $data['url_category_autocomplete'] = html_entity_decode($this->url->link('extension/advertise/google/category_autocomplete', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');
        $data['url_debug_log_download'] = html_entity_decode($this->url->link('extension/advertise/google/debug_log_download', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');

        $data['advertise_google_status']                    = $this->getSettingValue('advertise_google_status', 0);
        $data['advertise_google_debug_log']                 = $this->getSettingValue('advertise_google_debug_log', 0);
        $data['advertise_google_cron_email_status']         = $this->getSettingValue('advertise_google_cron_email_status');
        $data['advertise_google_cron_email']                = $this->getSettingValue('advertise_google_cron_email', $this->config->get('config_email'));
        $data['advertise_google_cron_token']                = $this->getSettingValue('advertise_google_cron_token');
        $data['advertise_google_cron_acknowledge']          = $this->getSettingValue('advertise_google_cron_acknowledge', null, true);

        if (isset($this->request->post['advertise_google_reporting_interval'])) {
            $data['advertise_google_reporting_interval'] = $this->request->post['advertise_google_reporting_interval'];
        } else if ($this->setting->has('advertise_google_reporting_interval') && in_array($this->setting->get('advertise_google_reporting_interval'), $reporting_intervals)) {
            $data['advertise_google_reporting_interval'] = $this->setting->get('advertise_google_reporting_interval');
        } else {
            $data['advertise_google_reporting_interval'] = $this->config->get('advertise_google_reporting_intervals_default');
        }

        $server = $this->googleshopping->getStoreUrl();

        $data['advertise_google_cron_command'] = 'export CUSTOM_SERVER_NAME=' . parse_url($server, PHP_URL_HOST) . '; export CUSTOM_SERVER_PORT=443; export ADVERTISE_GOOGLE_CRON=1; export ADVERTISE_GOOGLE_STORE_ID=' . $this->store_id . '; ' . PHP_BINDIR . '/php -d session.save_path=' . session_save_path() . ' -d memory_limit=256M ' . DIR_SYSTEM . 'library/googleshopping/cron.php > /dev/null 2> /dev/null';
        
        if (!$this->setting->get('advertise_google_cron_token')) {
            $data['advertise_google_cron_token'] = md5(mt_rand());
        }

        $host_and_uri = parse_url($server, PHP_URL_HOST) . parse_url($server, PHP_URL_PATH);

        $data['advertise_google_cron_url'] = 'https://' . rtrim($host_and_uri, '/') . '/index.php?route=extension/advertise/google/cron&cron_token={CRON_TOKEN}';

        $data['reporting_intervals'] = array();

        foreach ($reporting_intervals as $interval) {
            $data['reporting_intervals'][$interval] = $this->language->get('text_reporting_interval_' . $interval);
        }

        $campaign_reports = $this->setting->get('advertise_google_report_campaigns');

        $data['campaigns'] = $this->googleshopping->getTargets($this->store_id);

        $data['text_report_date_range'] = sprintf($this->language->get('text_report_date_range'), $campaign_reports['date_range']);
        $data['text_ads_intro'] = sprintf($this->language->get('text_ads_intro'), $data['shipping_taxes']);
        $data['advertise_google_report_campaigns'] = $campaign_reports['reports'];
        $data['text_panel_heading'] = sprintf($this->language->get('text_panel_heading'), $this->googleshopping->getStoreName());

        $data['text_selection_all'] = str_replace("'", "\\'", $this->language->get('text_selection_all'));
        $data['text_selection_page'] = str_replace("'", "\\'", $this->language->get('text_selection_page'));

        $data['tab_settings'] = $this->load->view('extension/advertise/google_settings', $data);
        $data['tab_ads']      = $this->load->view('extension/advertise/google_ads', $data);
        $data['tab_reports']  = $this->load->view('extension/advertise/google_reports', $data);

        $data['header']       = $this->load->controller('common/header');
        $data['column_left']  = $this->load->controller('common/column_left');
        $data['footer']       = $this->load->controller('common/footer');

        $this->response->setOutput($this->load->view('extension/advertise/google', $data));
    }

    public function debug_log_download() {
        $filename = sprintf(Googleshopping::DEBUG_LOG_FILENAME, $this->store_id);

        header('Pragma: no-cache');
        header('Expires: 0');
        header('Content-Description: File Transfer');
        header('Content-Type: plain/text');
        header('Content-Disposition: attachment; filename="' . $filename . '"');
        header('Content-Transfer-Encoding: binary');

        $file = DIR_LOGS . $filename;

        if (file_exists($file)) {
            readfile($file);
        }

        exit;
    }

    public function advertise() {
        $this->load->language('extension/advertise/google');
        
        $json = array(
            'success' => null,
            'redirect' => null,
            'error' => null,
            'warning' => null
        );

        if ($this->validatePermission()) {
            $this->load->model('extension/advertise/google');

            $select = array();
            $filter_data = array();

            if (!empty($this->request->post['all_pages'])) {
                $filter_data = $this->getFilter($this->request->post['filter']);
            } else if (isset($this->request->post['select']) && is_array($this->request->post['select'])) {
                $select = $this->request->post['select'];
            }

            if (!empty($select) || !empty($filter_data)) {
                $target_ids = !empty($this->request->post['target_ids']) ? $this->request->post['target_ids'] : array();

                if (!empty($select)) {
                    $this->model_extension_advertise_google->setAdvertisingBySelect($select, $target_ids, $this->store_id);
                } else if (!empty($filter_data)) {
                    $this->model_extension_advertise_google->setAdvertisingByFilter($filter_data, $target_ids, $this->store_id);
                }

                if (!empty($target_ids)) {
                    $json['success'] = $this->language->get('success_advertise_listed');
                } else {
                    $json['success'] = $this->language->get('success_advertise_unlisted');
                }
            }
        } else {
            $json['error'] = $this->error['warning'];
        }

        // Refresh warnings
        $advertised_count = $this->model_extension_advertise_google->getAdvertisedCount($this->store_id);
        $last_cron_executed = (int)$this->setting->get('advertise_google_cron_last_executed');

        if (!$this->setting->get('advertise_google_status') && $this->model_extension_advertise_google->hasActiveTarget($this->store_id)) {
            $json['warning'] = $this->language->get('warning_disabled');
        } else if (!$this->model_extension_advertise_google->hasActiveTarget($this->store_id)) {
            $json['warning'] = sprintf($this->language->get('warning_no_active_campaigns'), $this->url->link('extension/advertise/google/campaign', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'] . '&from_dashboard=true', true));
        } else if ($advertised_count == 0) {
            $json['warning'] = sprintf($this->language->get("warning_no_advertised_products"), $this->language->get("text_video_tutorial_url_advertise"));
        } else if ($last_cron_executed + 24 * 60 * 60 <= time()) {
            $json['warning'] = sprintf($this->language->get("warning_last_cron_executed"), $this->language->get("text_tutorial_cron"));
        }

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }

    public function list_ads() {
        $json = array();

        $this->load->model('extension/advertise/google');

        $this->model_extension_advertise_google->insertNewProducts(array(), $this->store_id);

        $this->load->language('extension/advertise/google');

        $page = (int)$this->request->post['page'];

        $filter_data = array(
            'sort' => $this->request->post['sort'],
            'order' => $this->request->post['order'],
            'start' => ($page - 1) * $this->config->get('config_limit_admin'),
            'limit' => $this->config->get('config_limit_admin')
        );

        $filter_data = array_merge($filter_data, $this->getFilter($this->request->post['filter']));

        $products = $this->googleshopping->getProducts($filter_data, $this->store_id);

        $json['products'] = array_map(array($this, 'product'), $products);

        $product_total = $this->googleshopping->getTotalProducts($filter_data, $this->store_id);

        $pagination = new Pagination();
        $pagination->total = $product_total;
        $pagination->page = $this->request->post['page'];
        $pagination->limit = $this->config->get('config_limit_admin');
        $pagination->url = '{page}';

        $pages = ceil($product_total / $this->config->get('config_limit_admin'));

        $json['showing'] = sprintf($this->language->get('text_pagination'), ($product_total) ? (($page - 1) * $this->config->get('config_limit_admin')) + 1 : 0, ((($page - 1) * $this->config->get('config_limit_admin')) > ($product_total - $this->config->get('config_limit_admin'))) ? $product_total : ((($page - 1) * $this->config->get('config_limit_admin')) + $this->config->get('config_limit_admin')), $product_total, $pages);

        $json['pagination'] = $pagination->render();
        $json['total'] = (int)$product_total;
        $json['pages'] = (int)$pages;

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }

    public function merchant() {
        $this->load->language('extension/advertise/google');

        $this->document->setTitle($this->language->get('heading_merchant'));

        $this->document->addStyle('view/stylesheet/googleshopping/stepper.css');

        $this->load->model('extension/advertise/google');

        if ($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validatePermission()) {
            try {
                $redirect_uri = html_entity_decode($this->url->link('extension/advertise/google/callback_merchant', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');
                $state = md5(microtime(true) . $redirect_uri . microtime(true));

                $auth_url_data = array(
                    'account_type' => $this->request->post['advertise_google_gmc_account_type'],
                    'redirect_uri' => $redirect_uri . '&state=' . $state
                );

                $this->session->data['advertise_google'] = $auth_url_data;
                $this->session->data['advertise_google']['state'] = $state;

                $this->response->redirect($this->googleshopping->getMerchantAuthUrl($auth_url_data));
            } catch (ConnectionException $e) {
                $this->session->data['error'] = $e->getMessage();

                $this->response->redirect($this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } catch (\RuntimeException $e) {
                $this->error['warning'] = $e->getMessage();
            }
        }

        $data = array();

        $data['error'] = '';

        if (isset($this->session->data['error'])) {
            $data['error'] = $this->session->data['error'];
            unset($this->session->data['error']);
        } else if (!empty($this->error['warning'])) {
            $data['error'] = $this->error['warning'];
        }

        $data['success'] = '';

        if (isset($this->session->data['success'])) {
            $data['success'] = $this->session->data['success'];
            unset($this->session->data['success']);
        }

        $data['breadcrumbs']   = array();
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_home'),
            'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true),
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_extensions'),
            'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=advertise', true),
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('heading_title'),
            'href' => $this->url->link('extension/advertise/google/merchant', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true),
        );

        $data['cancel']       = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=advertise', true);
        $data['action']       = $this->url->link('extension/advertise/google/merchant', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true);

        if (isset($this->request->post['advertise_google_gmc_account_type'])) {
            $data['advertise_google_gmc_account_type'] = $this->request->post['advertise_google_gmc_account_type'];
        } else {
            $data['advertise_google_gmc_account_type'] = 'api';
        }

        $data['header']       = $this->load->controller('common/header');
        $data['column_left']  = $this->load->controller('common/column_left');
        $data['footer']       = $this->load->controller('common/footer');

        $data['current_step'] = 2;
        $data['steps'] = $this->load->view('extension/advertise/google_steps', $data);

        $this->response->setOutput($this->load->view('extension/advertise/google_merchant', $data));
    }

    public function shipping_taxes() {
        $this->load->language('extension/advertise/google');

        $this->document->setTitle($this->language->get('heading_shipping_taxes'));

        $this->document->addStyle('view/stylesheet/googleshopping/stepper.css');

        $this->load->model('extension/advertise/google');

        $this->load->config('googleshopping/googleshopping');

        if ($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validateShippingAndTaxes()) {
            try {
                $this->applyNewSettings($this->request->post);

                $this->googleshopping->pushShippingAndTaxes();

                $this->applyNewSettings(array(
                    'advertise_google_gmc_shipping_taxes_configured' => '1'
                ));

                $this->session->data['success'] = $this->language->get('success_shipping_taxes');

                $this->response->redirect($this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } catch (ConnectionException $e) {
                $this->session->data['error'] = $e->getMessage();

                $this->response->redirect($this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } catch (\RuntimeException $e) {
                $this->error['warning'] = $e->getMessage();
            }
        }

        $available_carriers = array();

        try {
            $available_carriers = $this->googleshopping->getAvailableCarriers();
        } catch (ConnectionException $e) {
            $this->session->data['error'] = $e->getMessage();

            $this->response->redirect($this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
        } catch (\RuntimeException $e) {
            $this->error['warning'] = $e->getMessage();
        }

        $data = array();

        $data['error'] = '';

        if (isset($this->session->data['error'])) {
            $data['error'] = $this->session->data['error'];
            unset($this->session->data['error']);
        } else if (!empty($this->error['warning'])) {
            $data['error'] = $this->error['warning'];
        }

        if (isset($this->error['min_transit_time'])) {
            $data['error_min_transit_time'] = $this->error['min_transit_time'];
        } else {
            $data['error_min_transit_time'] = '';
        }

        if (isset($this->error['max_transit_time'])) {
            $data['error_max_transit_time'] = $this->error['max_transit_time'];
        } else {
            $data['error_max_transit_time'] = '';
        }

        if (isset($this->error['flat_rate'])) {
            $data['error_flat_rate'] = $this->error['flat_rate'];
        } else {
            $data['error_flat_rate'] = '';
        }

        if (isset($this->error['carrier_postcode'])) {
            $data['error_carrier_postcode'] = $this->error['carrier_postcode'];
        } else {
            $data['error_carrier_postcode'] = '';
        }

        if (isset($this->error['carrier_price_percentage'])) {
            $data['error_carrier_price_percentage'] = $this->error['carrier_price_percentage'];
        } else {
            $data['error_carrier_price_percentage'] = '';
        }

        if (isset($this->error['carrier'])) {
            $data['error_carrier'] = $this->error['carrier'];
        } else {
            $data['error_carrier'] = '';
        }

        $data['success'] = '';

        if (isset($this->session->data['success'])) {
            $data['success'] = $this->session->data['success'];
            unset($this->session->data['success']);
        }

        $data['from_dashboard'] = isset($this->request->get['from_dashboard']);

        $data['breadcrumbs']   = array();
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_home'),
            'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true),
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_extensions'),
            'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=advertise', true),
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('heading_title'),
            'href' => $this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true),
        );

        if ($data['from_dashboard']) {
            $data['breadcrumbs'][] = array(
                'text' => $this->language->get('heading_shipping_taxes'),
                'href' => $this->url->link('extension/advertise/google/shipping_taxes', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'] . '&from_dashboard=true', true),
            );
        }

        if ($data['from_dashboard']) {
            $data['cancel']       = $this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true);
        } else {
            $data['cancel']       = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=advertise', true);
        }

        $data['action']       = $this->url->link('extension/advertise/google/shipping_taxes', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true);

        if (isset($this->request->post['advertise_google_shipping_taxes'])) {
            $data['advertise_google_shipping_taxes'] = $this->request->post['advertise_google_shipping_taxes'];
        } else if ($this->setting->has('advertise_google_shipping_taxes')) {
            $data['advertise_google_shipping_taxes'] = $this->setting->get('advertise_google_shipping_taxes');
        } else {
            $data['advertise_google_shipping_taxes'] = array(
                'shipping_type' => 'flat',
                'flat_rate' => $this->config->get('shipping_flat_cost'),
                'min_transit_time' => 1,
                'max_transit_time' => 14,
                'carrier_price_percentage' => 5,
                'tax_type' => $this->config->get('config_country_id') == 223 ? 'usa' : 'not_usa'
            );
        }

        $data['available_carriers'] = $available_carriers;

        $data['states'] = $this->config->get('advertise_google_tax_usa_states');

        $data['header']       = $this->load->controller('common/header');
        $data['column_left']  = $this->load->controller('common/column_left');
        $data['footer']       = $this->load->controller('common/footer');

        $data['current_step'] = 4;
        $data['steps'] = $this->load->view('extension/advertise/google_steps', $data);

        $this->response->setOutput($this->load->view('extension/advertise/google_shipping_taxes', $data));
    }

    public function mapping() {
        $this->load->language('extension/advertise/google');

        $this->document->setTitle($this->language->get('heading_mapping'));

        $this->document->addStyle('view/stylesheet/googleshopping/stepper.css');

        $this->load->model('extension/advertise/google');

        if ($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validateMapping()) {
            try {
                foreach ($this->request->post['advertise_google_mapping'] as $google_product_category => $category_id) {
                    $this->model_extension_advertise_google->setCategoryMapping($google_product_category, $this->store_id, $category_id);
                }

                if (!empty($this->request->post['advertise_google_modify_existing'])) {
                    $this->model_extension_advertise_google->updateGoogleProductCategoryMapping($this->store_id);
                }

                $this->session->data['success'] = $this->language->get('success_mapping');

                $this->response->redirect($this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } catch (ConnectionException $e) {
                $this->session->data['error'] = $e->getMessage();

                $this->response->redirect($this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } catch (\RuntimeException $e) {
                $this->error['warning'] = $e->getMessage();
            }
        }

        $data = array();

        $data['error'] = '';

        if (isset($this->session->data['error'])) {
            $data['error'] = $this->session->data['error'];
            unset($this->session->data['error']);
        } else if (!empty($this->error['warning'])) {
            $data['error'] = $this->error['warning'];
        }

        $data['success'] = '';

        if (isset($this->session->data['success'])) {
            $data['success'] = $this->session->data['success'];
            unset($this->session->data['success']);
        }

        $data['from_dashboard'] = isset($this->request->get['from_dashboard']);

        $data['breadcrumbs']   = array();
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_home'),
            'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true),
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_extensions'),
            'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=advertise', true),
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('heading_title'),
            'href' => $this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true),
        );

        if ($data['from_dashboard']) {
            $data['breadcrumbs'][] = array(
                'text' => $this->language->get('heading_shipping_taxes'),
                'href' => $this->url->link('extension/advertise/google/mapping', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'] . '&from_dashboard=true', true),
            );
        }

        $this->load->config('googleshopping/googleshopping');

        $data['mapping'] = array();

        foreach ($this->config->get('advertise_google_google_product_categories') as $google_product_category_id => $google_product_category_name) {
            if ($google_product_category_id == 0) continue;

            $category_id = '';
            $name = '';

            if (null !== $category = $this->model_extension_advertise_google->getMappedCategory($google_product_category_id, $this->store_id)) {
                $category_id = $category['category_id'];
                $name = $category['name'];
            }

            $map = array(
                'google_product_category' => array(
                    'id' => $google_product_category_id,
                    'name' => $google_product_category_name
                ),
                'oc_category' => array(
                    'category_id' => $category_id,
                    'name' => $name
                )
            );

            $data['mapping'][] = $map;
        }

        $data['mapping_json'] = json_encode($data['mapping']);

        if ($data['from_dashboard']) {
            $data['cancel']       = $this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true);
        } else {
            $data['cancel']       = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=advertise', true);
        }

        $data['action']       = $this->url->link('extension/advertise/google/mapping', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true);

        $data['user_token'] = $this->session->data['user_token'];

        $data['url_mapping_verify'] = html_entity_decode($this->url->link('extension/advertise/google/mapping_verify', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');
        $data['url_category_autocomplete'] = html_entity_decode($this->url->link('extension/advertise/google/category_autocomplete', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');

        $data['header']       = $this->load->controller('common/header');
        $data['column_left']  = $this->load->controller('common/column_left');
        $data['footer']       = $this->load->controller('common/footer');

        $data['current_step'] = 5;
        $data['steps'] = $this->load->view('extension/advertise/google_steps', $data);

        $this->response->setOutput($this->load->view('extension/advertise/google_mapping', $data));
    }

    public function mapping_verify() {
        $this->load->language('extension/advertise/google');

        $this->load->model('extension/advertise/google');
        
        $data = array();

        $json = array(
            'submit_directly' => !$this->model_extension_advertise_google->isAnyProductCategoryModified($this->store_id),
            'modal_confirmation' => $this->load->view('extension/advertise/google_mapping_verify', $data)
        );

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }

    public function campaign_test() {
        $json = array(
            'status' => false,
            'redirect' => null,
            'error' => null
        );

        if ($this->validatePermission()) {
            try {
                $json['status'] = $this->googleshopping->testCampaigns();
            } catch (ConnectionException $e) {
                $this->session->data['error'] = $e->getMessage();

                $json['redirect'] = html_entity_decode($this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');
            } catch (\RuntimeException $e) {
                $json['status'] = false;
                $json['error'] = $e->getMessage();
            }

            $this->applyNewSettings(array(
                'advertise_google_can_edit_campaigns' => (int)$json['status']
            ));
        } else {
            $json['error'] = $this->error['warning'];
        }

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }

    public function campaign() {
        $this->load->language('extension/advertise/google');

        $this->document->setTitle($this->language->get('heading_campaign'));

        $this->document->addStyle('view/stylesheet/googleshopping/stepper.css');

        $this->load->model('extension/advertise/google');

        if ($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validateCampaign()) {
            $this->applyNewSettings($this->request->post);

            // If there is no redirect from the push of targets, go back to the extension dashboard
            $this->response->redirect($this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
        }

        $data = array();

        $data['error'] = '';

        if (isset($this->session->data['error'])) {
            $data['error'] = $this->session->data['error'];
            unset($this->session->data['error']);
        } else if (!empty($this->error['warning'])) {
            $data['error'] = $this->error['warning'];
        }

        $data['success'] = '';

        if (isset($this->session->data['success'])) {
            $data['success'] = $this->session->data['success'];
            unset($this->session->data['success']);
        }

        $data['warning'] = '';

        if (!$this->setting->get('advertise_google_status') && $this->model_extension_advertise_google->hasActiveTarget($this->store_id)) {
            $data['warning'] = $this->language->get('warning_paused_targets');
        }

        $data['from_dashboard'] = isset($this->request->get['from_dashboard']);

        $data['breadcrumbs']   = array();
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_home'),
            'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true),
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_extensions'),
            'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=advertise', true),
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('heading_title'),
            'href' => $this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true),
        );

        if ($data['from_dashboard']) {
            $data['breadcrumbs'][] = array(
                'text' => $this->language->get('heading_campaign'),
                'href' => $this->url->link('extension/advertise/google/campaign', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'] . '&from_dashboard=true', true),
            );
        }

        if (isset($this->request->post['advertise_google_auto_advertise'])) {
            $data['advertise_google_auto_advertise'] = $this->request->post['advertise_google_auto_advertise'];
        } else if ($this->setting->has('advertise_google_auto_advertise')) {
            $data['advertise_google_auto_advertise'] = $this->setting->get('advertise_google_auto_advertise');
        } else {
            $data['advertise_google_auto_advertise'] = '0';
        }

        if ($data['from_dashboard']) {
            $data['cancel']       = $this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true);
        } else {
            $data['cancel']       = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=advertise', true);
        }

        $data['action'] = $this->url->link('extension/advertise/google/campaign', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true);
        $data['target_add'] = html_entity_decode($this->url->link('extension/advertise/google/target_add', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');
        $data['target_edit'] = html_entity_decode($this->url->link('extension/advertise/google/target_edit', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'] . '&advertise_google_target_id={target_id}', true), ENT_QUOTES, 'UTF-8');
        $data['target_delete'] = html_entity_decode($this->url->link('extension/advertise/google/target_delete', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'] . '&advertise_google_target_id={target_id}', true), ENT_QUOTES, 'UTF-8');
        $data['target_list'] = html_entity_decode($this->url->link('extension/advertise/google/target_list', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');
        $data['url_campaign_test'] = html_entity_decode($this->url->link('extension/advertise/google/campaign_test', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');
        $data['can_edit_campaigns'] = (bool)$this->setting->get('advertise_google_can_edit_campaigns');
        $data['text_roas_warning'] = sprintf($this->language->get('warning_roas'), date($this->language->get('date_format_long'), time() + Googleshopping::ROAS_WAIT_INTERVAL));

        $data['json_allowed_targets'] = json_encode($this->model_extension_advertise_google->getAllowedTargets());

        $targets = $this->googleshopping->getTargets($this->store_id);

        foreach ($targets as &$target) {
            if (!$target['roas_status']) {
                $target['roas_warning'] = sprintf($this->language->get('warning_roas'), date($this->language->get('date_format_long'), $target['roas_available_on']));
            } else {
                $target['roas_warning'] = null;
            }
        }

        $data['targets'] = $targets;
        $data['json_targets'] = json_encode($targets);

        $data['header']       = $this->load->controller('common/header');
        $data['column_left']  = $this->load->controller('common/column_left');
        $data['footer']       = $this->load->controller('common/footer');

        $data['current_step'] = 3;
        $data['steps'] = $this->load->view('extension/advertise/google_steps', $data);

        $this->response->setOutput($this->load->view('extension/advertise/google_campaign', $data));
    }

    public function target_add() {
        $this->load->language('extension/advertise/google');

        $json = array(
            'success' => null,
            'redirect' => null,
            'error' => null
        );

        if ($this->validatePermission()) {
            if ($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validateTarget()) {
                $this->load->model('extension/advertise/google');

                $target = array(
                    'store_id' => $this->store_id,
                    'campaign_name' => str_replace(',', '&#44;', trim($this->request->post['campaign_name'])),
                    'country' => $this->request->post['country'],
                    'status' => $this->request->post['status'] == 'active' ? 'active' : 'paused',
                    'budget' => (float)preg_replace('~[^0-9\.]~i', '', $this->request->post['budget']),
                    'roas' => isset($this->request->post['roas']) ? (int)$this->request->post['roas'] : 0,
                    'feeds' => array_values($this->request->post['feed'])
                );

                $this->model_extension_advertise_google->addTarget($target, $this->store_id);

                try {
                    $this->googleshopping->pushTargets();

                    $json['success'] = $this->language->get('success_target_add');
                } catch (ConnectionException $e) {
                    $this->session->data['error'] = $e->getMessage();

                    $json['redirect'] = html_entity_decode($this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');
                } catch (\RuntimeException $e) {
                    $json['error'] = $e->getMessage();
                }
            } else {
                $json['error'] = $this->error['warning'];

                if (isset($this->error['campaign_name'])) {
                    $json['error_campaign_name'] = $this->error['campaign_name'];
                }

                if (isset($this->error['country'])) {
                    $json['error_country'] = $this->error['country'];
                }

                if (isset($this->error['budget'])) {
                    $json['error_budget'] = $this->error['budget'];
                }

                if (isset($this->error['feed'])) {
                    $json['error_feed'] = $this->error['feed'];
                }
            }
        } else {
            $json['error'] = $this->error['warning'];
        }

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }

    public function target_edit() {
        $this->load->language('extension/advertise/google');

        $json = array(
            'success' => null,
            'redirect' => null,
            'error' => null
        );

        if ($this->validatePermission()) {
            if ($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validateTarget()) {
                $this->load->model('extension/advertise/google');

                $target = array(
                    'campaign_name' => str_replace(',', '&#44;', trim($this->request->post['campaign_name'])),
                    'country' => $this->request->post['country'],
                    'status' => $this->request->post['status'] == 'active' ? 'active' : 'paused',
                    'budget' => (float)preg_replace('~[^0-9\.]~i', '', $this->request->post['budget']),
                    'roas' => isset($this->request->post['roas']) ? (int)$this->request->post['roas'] : 0,
                    'feeds' => array_values($this->request->post['feed'])
                );

                $this->googleshopping->editTarget((int)$this->request->get['advertise_google_target_id'], $target);

                try {
                    $this->googleshopping->pushTargets();

                    $json['success'] = $this->language->get('success_target_edit');
                } catch (ConnectionException $e) {
                    $this->session->data['error'] = $e->getMessage();

                    $json['redirect'] = html_entity_decode($this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');
                } catch (\RuntimeException $e) {
                    $json['error'] = $e->getMessage();
                }
            } else {
                $json['error'] = $this->error['warning'];

                if (isset($this->error['campaign_name'])) {
                    $json['error_campaign_name'] = $this->error['campaign_name'];
                }

                if (isset($this->error['country'])) {
                    $json['error_country'] = $this->error['country'];
                }

                if (isset($this->error['budget'])) {
                    $json['error_budget'] = $this->error['budget'];
                }

                if (isset($this->error['feed'])) {
                    $json['error_feed'] = $this->error['feed'];
                }
            }
        } else {
            $json['error'] = $this->error['warning'];
        }

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }

    public function target_delete() {
        $this->load->language('extension/advertise/google');

        $json = array(
            'success' => null,
            'redirect' => null,
            'error' => null
        );

        if ($this->validatePermission()) {
            $this->load->model('extension/advertise/google');

            $advertise_google_target_id = (int)$this->request->get['advertise_google_target_id'];

            $target_info = $this->googleshopping->getTarget($advertise_google_target_id);

            if (!empty($target_info)) {
                try {
                    $this->googleshopping->deleteCampaign($target_info['campaign_name']);

                    $this->googleshopping->deleteTarget($advertise_google_target_id);

                    $json['success'] = $this->language->get('success_target_delete');
                } catch (ConnectionException $e) {
                    $this->session->data['error'] = $e->getMessage();

                    $json['redirect'] = html_entity_decode($this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');
                } catch (\RuntimeException $e) {
                    $json['error'] = $e->getMessage();
                }
            }
        } else {
            $json['error'] = $this->error['warning'];
        }

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }

    public function target_list() {
        $this->load->language('extension/advertise/google');

        $json = array(
            'targets' => null,
            'error' => null
        );

        $this->load->model('extension/advertise/google');

        $targets = $this->googleshopping->getTargets($this->store_id);

        foreach ($targets as &$target) {
            if (!$target['roas_status']) {
                $target['roas_warning'] = sprintf($this->language->get('warning_roas'), date($this->language->get('date_format_long'), $target['roas_available_on']));
            } else {
                $target['roas_warning'] = null;
            }
        }

        $json['targets'] = $targets;

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }

    public function callback_merchant() {
        $state_verified =
            !empty($this->session->data['advertise_google']['state']) &&
            !empty($this->request->get['state']) && 
            $this->request->get['state'] == $this->session->data['advertise_google']['state'];

        $error = isset($this->request->get['error']) ? $this->request->get['error'] : null;
        $merchant_id = isset($this->request->get['merchant_id']) ? $this->request->get['merchant_id'] : null;

        if ($state_verified && is_null($error)) {
            $this->load->language('extension/advertise/google');

            try {
                $this->googleshopping->verifySite();

                $this->load->model('user/user');
                $user_info = $this->model_user_user->getUser($this->user->getId());

                $this->applyNewSettings(array(
                    'advertise_google_gmc_account_selected' => true,
                    'advertise_google_gmc_account_id' => $merchant_id,
                    'advertise_google_gmc_account_accepted_by' => array(
                        'user_id' => $user_info['user_id'],
                        'user_group_id' => $user_info['user_group_id'],
                        'user_group' => $user_info['user_group'],
                        'username' => $user_info['username'],
                        'firstname' => $user_info['firstname'],
                        'lastname' => $user_info['lastname'],
                        'email' => $user_info['email'],
                        'ip' => $user_info['ip']
                    ),
                    'advertise_google_gmc_account_accepted_at' => time(),
                    'advertise_google_conversion_tracker' => $this->googleshopping->getConversionTracker(),
                    'advertise_google_can_edit_campaigns' => '0'
                ));

                if ($this->session->data['advertise_google']['account_type'] == 'api') {
                    $this->session->data['success'] = sprintf($this->language->get('success_merchant_access'), $merchant_id);
                } else {
                    $this->session->data['success'] = $this->language->get('success_merchant');
                }

                if (count($this->googleshopping->getTargets($this->store_id)) > 0) {
                    $this->response->redirect($this->url->link('extension/advertise/google/campaign', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
                }
            } catch (ConnectionException $e) {
                $this->session->data['error'] = $e->getMessage();

                unset($this->session->data['advertise_google']);

                $this->response->redirect($this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } catch (\RuntimeException $e) {
                $this->session->data['error'] = $e->getMessage();
            }
        } else if (!is_null($error)) {
            $this->session->data['error'] = $error;

            $setting = $this->model_setting_setting->getSetting('advertise_google', $this->store_id);

            unset($setting['advertise_google_status']);
            unset($setting['advertise_google_work']);
            unset($setting['advertise_google_gmc_account_selected']);
            unset($setting['advertise_google_gmc_shipping_taxes_configured']);
            unset($setting['advertise_google_can_edit_campaigns']);

            $this->model_setting_setting->editSetting('advertise_google', $setting, $this->store_id);
        }

        unset($this->session->data['advertise_google']);

        $this->response->redirect($this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
    }

    public function callback_connect() {
        $state_verified =
            !empty($this->session->data['advertise_google']['state']) &&
            !empty($this->request->get['state']) && 
            $this->request->get['state'] == $this->session->data['advertise_google']['state'];

        if ($state_verified) {
            $this->load->language('extension/advertise/google');

            $this->load->model('extension/advertise/google');

            try {
                $access = $this->googleshopping->access($this->session->data['advertise_google'], urldecode($this->request->get['code']));

                $this->applyNewSettings(array(
                    'advertise_google_app_id' => $this->session->data['advertise_google']['app_id'],
                    'advertise_google_app_secret' => $this->session->data['advertise_google']['app_secret'],
                    'advertise_google_status' => $this->session->data['advertise_google']['status'],
                    'advertise_google_cron_token' => $this->session->data['advertise_google']['cron_token'],
                    'advertise_google_cron_acknowledge' => $this->session->data['advertise_google']['cron_acknowledge'],
                    'advertise_google_cron_email' => $this->session->data['advertise_google']['cron_email'],
                    'advertise_google_cron_email_status' => $this->session->data['advertise_google']['cron_email_status'],
                    'advertise_google_access_token' => $access['access_token'],
                    'advertise_google_refresh_token' => $access['refresh_token']
                ));

                $this->session->data['success'] = $this->language->get('success_connect');

                if (count($this->googleshopping->getTargets($this->store_id)) > 0 && $this->setting->get('advertise_google_gmc_account_selected')) {
                    $this->response->redirect($this->url->link('extension/advertise/google/campaign', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
                }
            } catch (ConnectionException $e) {
                $this->session->data['error'] = $e->getMessage();

                $this->response->redirect($this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } catch (\RuntimeException $e) {
                $this->session->data['error'] = $e->getMessage();
            }
        } else if (isset($this->request->get['error'])) {
            $this->session->data['error'] = $this->request->get['error'];
        }

        unset($this->session->data['advertise_google']);

        if ($this->setting->get('advertise_google_gmc_account_selected')) {
            $this->response->redirect($this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
        } else {
            $this->response->redirect($this->url->link('extension/advertise/google/merchant', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
        }
    }

    public function connect() {
        $this->load->language('extension/advertise/google');

        $this->document->setTitle($this->language->get('heading_title'));

        $this->document->addStyle('view/stylesheet/googleshopping/stepper.css');

        $this->load->model('extension/advertise/google');

        if ($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validateSettings() && $this->validateConnect()) {
            unset($this->session->data['advertise_google']);

            $this->session->data['advertise_google']['app_id'] = $this->request->post['advertise_google_app_id'];
            $this->session->data['advertise_google']['app_secret'] = $this->request->post['advertise_google_app_secret'];
            $this->session->data['advertise_google']['status'] = $this->request->post['advertise_google_status'];
            $this->session->data['advertise_google']['cron_email_status'] = $this->request->post['advertise_google_cron_email_status'];
            $this->session->data['advertise_google']['cron_email'] = $this->request->post['advertise_google_cron_email'];
            $this->session->data['advertise_google']['cron_token'] = $this->request->post['advertise_google_cron_token'];
            $this->session->data['advertise_google']['cron_acknowledge'] = isset($this->request->post['advertise_google_cron_acknowledge']);
            $this->session->data['advertise_google']['redirect_uri'] = html_entity_decode($this->url->link('extension/advertise/google/callback_connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true), ENT_QUOTES, 'UTF-8');
            $this->session->data['advertise_google']['state'] = md5(microtime(true) . json_encode($this->session->data['advertise_google']) . microtime(true));

            $url = $this->googleshopping->authorize($this->session->data['advertise_google']);

            $this->response->redirect($url);
        }

        $data = array();

        $data['error'] = '';

        if (isset($this->session->data['error'])) {
            if (empty($this->session->data['success']) && $this->getSettingValue('advertise_google_app_id', false) && $this->getSettingValue('advertise_google_app_secret', false)) {
                $data['error'] = $this->session->data['error'];
            }
            unset($this->session->data['error']);
        } else if (!empty($this->error['warning'])) {
            $data['error'] = $this->error['warning'];
        }

        $data['error_cron_email']                   = $this->getValidationError('cron_email');
        $data['error_cron_acknowledge']             = $this->getValidationError('cron_acknowledge');

        if (isset($this->error['app_id'])) {
            $data['error_app_id'] = $this->error['app_id'];
        } else {
            $data['error_app_id'] = '';
        }

        if (isset($this->error['app_secret'])) {
            $data['error_app_secret'] = $this->error['app_secret'];
        } else {
            $data['error_app_secret'] = '';
        }

        $data['success'] = '';

        if (isset($this->session->data['success'])) {
            $data['success'] = $this->session->data['success'];
            unset($this->session->data['success']);
        }

        $data['breadcrumbs']   = array();
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_home'),
            'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true),
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_extensions'),
            'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=advertise', true),
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('heading_title'),
            'href' => $this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true),
        );

        $data['advertise_google_status']                = $this->getSettingValue('advertise_google_status', 1);
        $data['advertise_google_app_id']                = $this->getSettingValue('advertise_google_app_id', '');
        $data['advertise_google_app_secret']            = $this->getSettingValue('advertise_google_app_secret', '');
        $data['advertise_google_cron_email_status']     = $this->getSettingValue('advertise_google_cron_email_status');
        $data['advertise_google_cron_email']            = $this->getSettingValue('advertise_google_cron_email', $this->config->get('config_email'));
        $data['advertise_google_cron_token']            = $this->getSettingValue('advertise_google_cron_token');
        $data['advertise_google_cron_acknowledge']      = $this->getSettingValue('advertise_google_cron_acknowledge', null, true);

        $server = $this->googleshopping->getStoreUrl();

        $data['advertise_google_cron_command'] = 'export CUSTOM_SERVER_NAME=' . parse_url($server, PHP_URL_HOST) . '; export CUSTOM_SERVER_PORT=443; export ADVERTISE_GOOGLE_CRON=1; export ADVERTISE_GOOGLE_STORE_ID=' . $this->store_id . '; ' . PHP_BINDIR . '/php -d session.save_path=' . session_save_path() . ' -d memory_limit=256M ' . DIR_SYSTEM . 'library/googleshopping/cron.php > /dev/null 2> /dev/null';
        
        if (!$this->setting->get('advertise_google_cron_token')) {
            $data['advertise_google_cron_token'] = md5(mt_rand());
        }

        $host_and_uri = parse_url($server, PHP_URL_HOST) . dirname(parse_url($server, PHP_URL_PATH));

        $data['advertise_google_cron_url'] = 'https://' . rtrim($host_and_uri, '/') . '/index.php?route=extension/advertise/google/cron&cron_token={CRON_TOKEN}';

        $data['header']       = $this->load->controller('common/header');
        $data['column_left']  = $this->load->controller('common/column_left');
        $data['footer']       = $this->load->controller('common/footer');

        $data['cancel']       = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=advertise', true);
        $data['action']       = $this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true);

        $data['text_connect_intro'] = sprintf($this->language->get('text_connect_intro'), Googleshopping::API_URL);

        $data['current_step'] = 1;
        $data['steps'] = $this->load->view('extension/advertise/google_steps', $data);

        $this->response->setOutput($this->load->view('extension/advertise/google_connect', $data));
    }

    public function disconnect() {
        $this->load->language('extension/advertise/google');

        if ($this->validatePermission()) {
            try {
                $this->load->model('setting/setting');

                $this->googleshopping->disconnect();

                foreach ($this->googleshopping->getTargets($this->store_id) as $target) {
                    $this->googleshopping->deleteTarget($target['target_id']);
                }

                $setting = $this->model_setting_setting->getSetting('advertise_google', $this->store_id);

                unset($setting['advertise_google_status']);
                unset($setting['advertise_google_work']);
                unset($setting['advertise_google_access_token']);
                unset($setting['advertise_google_refresh_token']);
                unset($setting['advertise_google_gmc_account_selected']);
                unset($setting['advertise_google_gmc_shipping_taxes_configured']);
                unset($setting['advertise_google_can_edit_campaigns']);

                $this->model_setting_setting->editSetting('advertise_google', $setting, $this->store_id);

                $this->session->data['success'] = $this->language->get('success_disconnect');
            } catch (ConnectionException $e) {
                $this->session->data['error'] = $e->getMessage();

                $this->response->redirect($this->url->link('extension/advertise/google/connect', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
            } catch (\RuntimeException $e) {
                $this->session->data['error'] = $e->getMessage();
            }
        } else {
            $this->session->data['error'] = $this->error['warning'];
        }

        $this->response->redirect($this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
    }

    public function checklist() {
        $this->load->language('extension/advertise/google');

        $this->document->setTitle($this->language->get('heading_title'));

        if ($this->request->server['REQUEST_METHOD'] == 'POST' && $this->validatePermission()) {
            $this->load->model('setting/setting');

            $this->model_setting_setting->editSetting('advertise_google', $this->request->post, $this->store_id);

            $this->response->redirect($this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true));
        }

        $data = array();

        $data['error'] = '';

        if (isset($this->session->data['error'])) {
            $data['error'] = $this->session->data['error'];
            unset($this->session->data['error']);
        } else if (!empty($this->error['warning'])) {
            $data['error'] = $this->error['warning'];
        }

        $data['breadcrumbs']   = array();
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_home'),
            'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true),
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_extensions'),
            'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=advertise', true),
        );
        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('heading_title'),
            'href' => $this->url->link('extension/advertise/google', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true),
        );

        $data['text_panel_heading'] = sprintf($this->language->get('text_panel_heading'), $this->googleshopping->getStoreName());

        $data['cancel']       = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=advertise', true);
        $data['action']       = $this->url->link('extension/advertise/google/checklist', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'], true);
        
        $data['header']       = $this->load->controller('common/header');
        $data['column_left']  = $this->load->controller('common/column_left');
        $data['footer']       = $this->load->controller('common/footer');

        $this->response->setOutput($this->load->view('extension/advertise/google_checklist', $data));
    }

    public function popup_product() {
        $json = array(
            'body' => '',
            'title' => '',
            'success' => false,
            'required_fields' => [],
            'success_message' => ''
        );

        $this->language->load('extension/advertise/google');

        $this->load->model('extension/advertise/google');

        $operand_info = NULL;
        $form_data = NULL;
        $filter_data = NULL;
        $product_ids = array();

        if ($this->request->post['operand']['type'] == 'single') {
            $product_advertise_google_id = $this->request->post['operand']['data'];

            $product_info = $this->model_extension_advertise_google->getProductByProductAdvertiseGoogleId($product_advertise_google_id);

            if ($product_info !== NULL) {
                $json['product_id'] = $product_info['product_id'];
                
                // Required variables:
                $operand_info = array(
                    'title' => sprintf($this->language->get('text_popup_title_single'), $product_info['name'], $product_info['model'])
                );

                $required_fields = $this->model_extension_advertise_google->getRequiredFieldsByProductIds(array($product_info['product_id']), $this->store_id);

                if ($this->request->post['action'] == 'submit') {
                    $form_data = array_merge($this->request->post['form'], array(
                        'product_id' => $product_info['product_id']
                    ));
                }

                $options = $this->model_extension_advertise_google->getProductOptionsByProductIds(array($product_info['product_id']));

                $default_form_data = $this->model_extension_advertise_google->getProductAdvertiseGoogle($product_advertise_google_id);
            }
        } else if ($this->request->post['operand']['type'] == 'multiple') {
            if (!empty($this->request->post['operand']['data']['all_pages'])) {
                $filter_data = $this->getFilter($this->request->post['operand']['data']['filter']);

                $total_products = $this->googleshopping->getTotalProducts($filter_data, $this->store_id);

                // Required variables:
                $operand_info = array(
                    'title' => sprintf($this->language->get('text_popup_title_multiple'), $total_products)
                );

                $required_fields = $this->model_extension_advertise_google->getRequiredFieldsByFilter($filter_data, $this->store_id);

                if ($this->request->post['action'] == 'submit') {
                    $form_data = $this->request->post['form'];
                }

                $options = $this->model_extension_advertise_google->getProductOptionsByFilter($filter_data);
            } else {
                $product_ids = $this->request->post['operand']['data']['select'];

                $total_products = count($product_ids);

                // Required variables:
                $operand_info = array(
                    'title' => sprintf($this->language->get('text_popup_title_multiple'), $total_products)
                );

                $required_fields = $this->model_extension_advertise_google->getRequiredFieldsByProductIds($product_ids, $this->store_id);

                if ($this->request->post['action'] == 'submit') {
                    $form_data = $this->request->post['form'];
                }

                $options = $this->model_extension_advertise_google->getProductOptionsByProductIds($product_ids);
            }

            $default_form_data = array(
                'google_product_category' => '',
                'condition' => '',
                'adult' => '',
                'multipack' => '',
                'is_bundle' => '',
                'age_group' => '',
                'color' => '',
                'gender' => '',
                'size_type' => '',
                'size_system' => '',
                'size' => ''
            );
        }

        if ($operand_info !== NULL) {
            $json['title'] = $operand_info['title'];
            $json['success_message'] = $this->language->get('success_product');

            $this->load->config('googleshopping/googleshopping');

            $json['required_fields'] = $required_fields;

            if ($this->request->post['action'] == 'submit' && $this->validateProduct($required_fields)) {
                $form_data['store_id'] = (int)$this->store_id;

                if ($this->request->post['operand']['type'] == 'single') {
                    $this->model_extension_advertise_google->updateSingleProductFields($form_data);
                } else if ($this->request->post['operand']['type'] == 'multiple') {
                    if (!empty($this->request->post['operand']['data']['all_pages'])) {
                        $this->model_extension_advertise_google->updateMultipleProductFields($filter_data, $form_data);
                    } else {
                        foreach ($product_ids as $product_id) {
                            $form_data['product_id'] = (int)$product_id;
                            $this->model_extension_advertise_google->updateSingleProductFields($form_data);
                        }
                    }
                }

                $json['success'] = true;
            }

            $data['error'] = '';

            if (!empty($this->error['warning'])) {
                $data['error'] = $this->error['warning'];
            }

            if (isset($this->error['color'])) {
                $data['error_color'] = $this->error['color'];
            } else {
                $data['error_color'] = '';
            }

            if (isset($this->error['size_system'])) {
                $data['error_size_system'] = $this->error['size_system'];
            } else {
                $data['error_size_system'] = '';
            }

            if (isset($this->error['size_type'])) {
                $data['error_size_type'] = $this->error['size_type'];
            } else {
                $data['error_size_type'] = '';
            }

            if (isset($this->error['size'])) {
                $data['error_size'] = $this->error['size'];
            } else {
                $data['error_size'] = '';
            }

            if (isset($this->error['product_category'])) {
                $data['error_product_category'] = $this->error['product_category'];
            } else {
                $data['error_product_category'] = '';
            }

            if (isset($this->error['condition'])) {
                $data['error_condition'] = $this->error['condition'];
            } else {
                $data['error_condition'] = '';
            }

            if (isset($this->error['age_group'])) {
                $data['error_age_group'] = $this->error['age_group'];
            } else {
                $data['error_age_group'] = '';
            }

            if (isset($this->error['gender'])) {
                $data['error_gender'] = $this->error['gender'];
            } else {
                $data['error_gender'] = '';
            }

            if (isset($this->error['adult'])) {
                $data['error_adult'] = $this->error['adult'];
            } else {
                $data['error_adult'] = '';
            }

            if (isset($this->error['multipack'])) {
                $data['error_multipack'] = $this->error['multipack'];
            } else {
                $data['error_multipack'] = '';
            }

            if (isset($this->error['is_bundle'])) {
                $data['error_is_bundle'] = $this->error['is_bundle'];
            } else {
                $data['error_is_bundle'] = '';
            }

            $data['google_product_categories'] = $this->config->get('advertise_google_google_product_categories');
            $data['conditions'] = array(
                'new' => $this->language->get('text_condition_new'),
                'refurbished' => $this->language->get('text_condition_refurbished'),
                'used' => $this->language->get('text_condition_used')
            );
            $data['age_groups'] = array(
                '' => $this->language->get('text_does_not_apply'),
                'newborn' => $this->language->get('text_age_group_newborn'),
                'infant' => $this->language->get('text_age_group_infant'),
                'toddler' => $this->language->get('text_age_group_toddler'),
                'kids' => $this->language->get('text_age_group_kids'),
                'adult' => $this->language->get('text_age_group_adult')
            );
            $data['genders'] = array(
                'unisex' => $this->language->get('text_gender_unisex'),
                'female' => $this->language->get('text_gender_female'),
                'male' => $this->language->get('text_gender_male')
            );
            $data['size_systems'] = array(
                '' => $this->language->get('text_does_not_apply')
            );
            foreach ($this->config->get('advertise_google_size_systems') as $system) {
                $data['size_systems'][$system] = $system;
            }

            $data['size_types'] = array(
                '' => $this->language->get('text_does_not_apply'),
                'regular' => $this->language->get('text_size_type_regular'),
                'petite' => $this->language->get('text_size_type_petite'),
                'plus' => $this->language->get('text_size_type_plus'),
                'big and tall' => $this->language->get('text_size_type_big_and_tall'),
                'maternity' => $this->language->get('text_size_type_maternity')
            );

            $data['options'] = array(
                '' => $this->language->get('text_does_not_apply')
            );

            foreach ($options as $option) {
                $data['options'][$option['option_id']] = $option['name'];
            }

            $data['required_fields'] = json_encode($required_fields);

            if ($this->request->post['action'] == 'submit') {
                $form_data = $this->request->post['form'];
            } else {
                $form_data = $default_form_data;
            }

            $data['google_product_category'] = $form_data['google_product_category'];
            $data['condition'] = $form_data['condition'];
            $data['adult'] = $form_data['adult'];
            $data['multipack'] = $form_data['multipack'];
            $data['is_bundle'] = $form_data['is_bundle'];
            $data['age_group'] = $form_data['age_group'];
            $data['color'] = $form_data['color'];
            $data['gender'] = $form_data['gender'];
            $data['size_type'] = $form_data['size_type'];
            $data['size_system'] = $form_data['size_system'];
            $data['size'] = $form_data['size'];

            $json['body'] = $this->load->view('extension/advertise/google_popup_product', $data);
        } else {
            $json['title'] = $this->language->get('error_popup_not_found_title');
            $json['body'] = $this->language->get('error_popup_not_found_body');
        }

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }

    public function popup_issues() {
        $json = array(
            'body' => '',
            'title' => ''
        );

        $this->language->load('extension/advertise/google');

        $this->load->model('catalog/product');
        $this->load->model('extension/advertise/google');

        $product_id = isset($this->request->get['product_id']) ? (int)$this->request->get['product_id'] : 0;

        $product_issues = $this->model_extension_advertise_google->getProductIssues($product_id, $this->store_id);

        if ($product_issues !== NULL) {
            $json['title'] = sprintf($this->language->get('text_popup_title_single'), $product_issues['name'], $product_issues['model']);

            $data['product_issues'] = $product_issues['entries'];

            $json['body'] = $this->load->view('extension/advertise/google_popup_issues', $data);
        } else {
            $json['title'] = $this->language->get('error_popup_not_found_title');
            $json['body'] = $this->language->get('error_popup_not_found_body');
        }

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }

    public function admin_link(&$route, &$data, &$template) {
        if (!$this->user->hasPermission('access', 'extension/advertise/google')) {
            return;
        }

        foreach ($data['menus'] as &$menu) {
            if ($menu['id'] == 'menu-marketing') {
                $children = array();

                $this->load->model('setting/store');

                $children[] = array(
                    'name' => $this->config->get('config_name'),
                    'children' => array(),
                    'href' => $this->url->link('extension/advertise/google', 'store_id=0&user_token=' . $this->session->data['user_token'], true)
                );

                foreach ($this->model_setting_store->getStores() as $store) {
                    $children[] = array(
                        'name' => $store['name'],
                        'children' => array(),
                        'href' => $this->url->link('extension/advertise/google', 'store_id=' . $store['store_id'] . '&user_token=' . $this->session->data['user_token'], true)
                    );
                }

                array_push($menu['children'], array(
                    'name' => 'Google Shopping',
                    'children' => $children,
                    'href' => ''
                ));

                return;
            }
        }
    }

    public function addProduct(&$route, &$args, &$output) {
        $this->load->model('extension/advertise/google');
        $this->load->model('catalog/product');

        foreach ($this->model_catalog_product->getProductStores($output) as $store_id) {
            $this->model_extension_advertise_google->insertNewProducts(array($output), $store_id);
        }
    }

    public function copyProduct(&$route, &$args, &$output) {
        $this->load->model('extension/advertise/google');
        $this->load->model('catalog/product');

        $final_product_id = $this->model_extension_advertise_google->getFinalProductId();

        if (!empty($final_product_id)) {
            foreach ($this->model_catalog_product->getProductStores($final_product_id) as $store_id) {
                $this->model_extension_advertise_google->insertNewProducts(array($final_product_id), $store_id);
            }
        }
    }

    public function deleteProduct(&$route, &$args, &$output) {
        $this->load->model('extension/advertise/google');

        $this->model_extension_advertise_google->deleteProducts(array((int)$args[0]));
    }

    public function install() {
        $this->load->model('extension/advertise/google');

        $this->model_extension_advertise_google->createTables();
        $this->model_extension_advertise_google->createEvents();
    }

    public function uninstall() {
        $this->load->model('extension/advertise/google');

        $this->model_extension_advertise_google->dropTables();
        $this->model_extension_advertise_google->deleteEvents();
    }

    public function category_autocomplete() {
        $json = array();

        if (isset($this->request->get['filter_name'])) {
            $this->load->model('extension/advertise/google');

            $filter_data = array(
                'filter_name' => $this->request->get['filter_name'],
                'sort'        => 'name',
                'order'       => 'ASC',
                'start'       => 0,
                'limit'       => 5
            );

            $results = $this->model_extension_advertise_google->getCategories($filter_data, $this->store_id);

            foreach ($results as $result) {
                $json[] = array(
                    'category_id' => $result['category_id'],
                    'name'        => strip_tags(html_entity_decode($result['name'], ENT_QUOTES, 'UTF-8'))
                );
            }
        }

        $sort_order = array();

        foreach ($json as $key => $value) {
            $sort_order[$key] = $value['name'];
        }

        array_multisort($sort_order, SORT_ASC, $json);

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }

    protected function getFilter($array) {
        if (!empty($array)) {
            return array(
                'filter_product_name' => $array['product_name'],
                'filter_product_model' => $array['product_model'],
                'filter_category_id' => $array['category_id'],
                'filter_is_modified' => $array['is_modified'],
                'filter_store_id' => $this->store_id
            );
        }

        return array(
            'filter_store_id' => $this->store_id
        );
    }

    protected function applyNewSettings($new_settings) {
        $this->load->model('setting/setting');

        $old_settings = $this->model_setting_setting->getSetting('advertise_google', $this->store_id);

        $new_settings = array_merge($old_settings, $new_settings);

        $this->model_setting_setting->editSetting('advertise_google', $new_settings, $this->store_id);

        foreach ($new_settings as $key => $value) {
            $this->setting->set($key, $value);
        }
    }

    protected function product(&$row) {        
        $this->load->config('googleshopping/googleshopping');

        $this->load->model('tool/image');

        if (!empty($row['image']) && file_exists(DIR_IMAGE . $row['image'])) {
            $image = $this->model_tool_image->resize($row['image'], 50, 50);
        } else {
            $image = $this->model_tool_image->resize('no_image.png', 50, 50);
        }

        return array(
            'product_advertise_google_id' => (int)$row['product_advertise_google_id'],
            'product_id' => (int)$row['product_id'],
            'image' => $image,
            'name' => htmlentities(html_entity_decode($row['name'], ENT_QUOTES, 'UTF-8'), ENT_QUOTES, 'UTF-8'),
            'model' => $row['model'],
            'impressions' => (int)$row['impressions'],
            'clicks' => (int)$row['clicks'],
            'conversions' => (int)$row['conversions'],
            'cost' => $this->googleshopping->currencyFormat($row['cost']),
            'conversion_value' => $this->googleshopping->currencyFormat($row['conversion_value']),
            'destination_status' => $row['destination_status'],
            'is_modified' => (bool)$row['is_modified'],
            'has_issues' => (bool)$row['has_issues'],
            'url_issues' => html_entity_decode($this->url->link('extension/advertise/google/popup_issues', 'store_id=' . $this->store_id . '&user_token=' . $this->session->data['user_token'] . '&product_id=' . $row['product_id'], true), ENT_QUOTES, 'UTF-8'),
            'campaigns' => $this->model_extension_advertise_google->getProductCampaigns((int)$row['product_id'], $this->store_id)
        );
    }

    protected function getSettingValue($key, $default = null, $checkbox = false) {
        if ($checkbox) {
            if ($this->request->server['REQUEST_METHOD'] == 'POST' && !isset($this->request->post[$key])) {
                return $default;
            } else {
                return $this->setting->get($key);
            }
        }

        if (isset($this->request->post[$key])) {
            return $this->request->post[$key]; 
        } else if ($this->setting->has($key)) {
            return $this->setting->get($key);
        } else {
            return $default;
        }
    }

    protected function getValidationError($key) {
        if (isset($this->error[$key])) {
            return $this->error[$key];
        } else {
            return '';
        }
    }

    protected function validateSettings() {
        $this->validatePermission();

        if (empty($this->request->post['advertise_google_status'])) {
            return true;
        }

        if (!empty($this->request->post['advertise_google_cron_email_status'])) {
            if (!filter_var($this->request->post['advertise_google_cron_email'], FILTER_VALIDATE_EMAIL)) {
                $this->error['cron_email'] = $this->language->get('error_invalid_email');
            }
        }

        if (empty($this->request->post['advertise_google_cron_acknowledge'])) {
            $this->error['cron_acknowledge'] = $this->language->get('error_cron_acknowledge');
        }

        if ($this->error && empty($this->error['warning'])) {
            $this->error['warning'] = $this->language->get('error_form');
        }

        return !$this->error;
    }

    protected function validateShippingAndTaxes() {
        $this->validatePermission();
        
        if (empty($this->request->post['advertise_google_shipping_taxes']['min_transit_time']) || !is_numeric($this->request->post['advertise_google_shipping_taxes']['min_transit_time']) || (int)$this->request->post['advertise_google_shipping_taxes']['min_transit_time'] < 0) {
            $this->error['min_transit_time'] = $this->language->get('error_min_transit_time');
        } else if (empty($this->request->post['advertise_google_shipping_taxes']['max_transit_time']) || !is_numeric($this->request->post['advertise_google_shipping_taxes']['max_transit_time']) || (int)$this->request->post['advertise_google_shipping_taxes']['max_transit_time'] < (int)$this->request->post['advertise_google_shipping_taxes']['min_transit_time']) {
            $this->error['max_transit_time'] = $this->language->get('error_max_transit_time');
        }

        switch ($this->request->post['advertise_google_shipping_taxes']['shipping_type']) {
            case 'flat' : 
                if (!isset($this->request->post['advertise_google_shipping_taxes']['flat_rate']) || !is_numeric($this->request->post['advertise_google_shipping_taxes']['flat_rate']) || (float)$this->request->post['advertise_google_shipping_taxes']['flat_rate'] <= 0) {
                    $this->error['flat_rate'] = $this->language->get('error_flat_rate');
                }
            break;
            case 'carrier' :
                if (empty($this->request->post['advertise_google_shipping_taxes']['carrier'])) {
                    $this->error['warning'] = $this->language->get('error_carrier');
                }

                if (empty($this->request->post['advertise_google_shipping_taxes']['carrier_postcode'])) {
                    $this->error['carrier_postcode'] = $this->language->get('error_carrier_postcode');
                }

                if (!isset($this->request->post['advertise_google_shipping_taxes']['carrier_price_percentage']) || !is_numeric($this->request->post['advertise_google_shipping_taxes']['carrier_price_percentage']) || (float)$this->request->post['advertise_google_shipping_taxes']['carrier_price_percentage'] < 0 || (float)$this->request->post['advertise_google_shipping_taxes']['carrier_price_percentage'] > 100) {
                    $this->error['carrier_price_percentage'] = $this->language->get('error_carrier_price_percentage');
                }
            break;
        }

        switch ($this->request->post['advertise_google_shipping_taxes']['tax_type']) {
            case 'usa' :
                if (empty($this->request->post['advertise_google_shipping_taxes']['tax'])) {
                    $this->error['warning'] = $this->language->get('error_tax');
                }
            break;
        }

        if (!isset($this->error['warning']) && $this->error) {
            $this->error['warning'] = $this->language->get('error_warning');
        }

        return !$this->error;
    }

    protected function validateMapping() {
        $this->validatePermission();
        
        if (!isset($this->error['warning']) && $this->error) {
            $this->error['warning'] = $this->language->get('error_warning');
        }

        return !$this->error;
    }

    protected function validateProduct($required_fields) {
        if (!$this->user->hasPermission('modify', 'extension/advertise/google')) {
            $this->error['warning'] = $this->language->get('error_permission');
        }

        if (empty($this->error)) {
            foreach ($required_fields as $key => $requirements) {
                if (empty($requirements['selected_field']) && (!isset($this->request->post['form'][$key]) || $this->request->post['form'][$key] == '')) {
                    $this->error[$key] = $this->language->get('error_field_no_value');
                } else if (!empty($requirements['selected_field'])) {
                    foreach ($requirements['selected_field'] as $dependency => $values) {
                        if (in_array($this->request->post['form'][$dependency], $values) && (!isset($this->request->post['form'][$key]) || $this->request->post['form'][$key] == '')) {
                            $this->error[$key] = $this->language->get('error_field_no_value');
                        }
                    }
                }
            }
        }

        if (!isset($this->error['warning']) && $this->error) {
            $this->error['warning'] = $this->language->get('error_warning');
        }

        return !$this->error;
    }

    protected function validatePermission() {
        if (!$this->user->hasPermission('modify', 'extension/advertise/google')) {
            $this->error['warning'] = $this->language->get('error_permission');
        }

        return !$this->error;
    }

    protected function validateCampaign() {
        $this->validatePermission();

        $this->load->model('extension/advertise/google');

        $targets = $this->googleshopping->getTargets($this->store_id);

        if (empty($targets)) {
            $this->error['warning'] = $this->language->get('error_no_targets');
        }

        if (!isset($this->error['warning']) && $this->error) {
            $this->error['warning'] = $this->language->get('error_warning');
        }

        return !$this->error;
    }

    protected function validateConnect() {
        $this->validatePermission();

        if (!isset($this->request->post['advertise_google_app_id']) || trim($this->request->post['advertise_google_app_id']) == '') {
            $this->error['app_id'] = $this->language->get('error_empty_app_id');
        } else if ($this->model_extension_advertise_google->isAppIdUsed($this->request->post['advertise_google_app_id'], $this->store_id)) {
            $this->error['app_id'] = $this->language->get('error_used_app_id');
        }

        if (!isset($this->request->post['advertise_google_app_secret']) || trim($this->request->post['advertise_google_app_secret']) == '') {
            $this->error['app_secret'] = $this->language->get('error_empty_app_secret');
        }

        if (!isset($this->error['warning']) && $this->error) {
            $this->error['warning'] = $this->language->get('error_warning');
        }

        return !$this->error;
    }

    protected function validateTarget() {
        $this->validatePermission();

        if (!isset($this->request->post['budget']) || !is_numeric($this->request->post['budget']) || (float)$this->request->post['budget'] < 5) {
            $this->error['budget'] = $this->language->get('error_budget');
        }

        if (empty($this->request->post['feed']) || !is_array($this->request->post['feed'])) {
            $this->error['feed'] = $this->language->get('error_empty_feed');
        } else {
            foreach ($this->request->post['feed'] as $feed) {
                if (empty($feed['language']) || empty($feed['currency'])) {
                    $this->error['feed'] = $this->language->get('error_invalid_feed');
                    break;
                }
            }
        }

        if (empty($this->request->post['country'])) {
            $this->error['country'] = $this->language->get('error_empty_country');
        }

        if (empty($this->request->post['campaign_name']) || trim($this->request->post['campaign_name']) == '') {
            $this->error['campaign_name'] = $this->language->get('error_empty_campaign_name');
        } else {
            $disallowed_names = [];

            $this->load->model('extension/advertise/google');

            foreach ($this->googleshopping->getTargets($this->store_id) as $existing_target) {
                if (isset($this->request->get['advertise_google_target_id']) && $existing_target['target_id'] == $this->request->get['advertise_google_target_id']) {
                    // Ignore this target as it is currntly being edited
                    continue;
                }

                $disallowed_names[] = strtolower(str_replace('&#44;', ',', trim($existing_target['campaign_name'])));
            }

            if (in_array(trim(strtolower($this->request->post['campaign_name'])), $disallowed_names)) {
                $this->error['campaign_name'] = $this->language->get('error_campaign_name_in_use');
            }

            if (strtolower(trim($this->request->post['campaign_name'])) == 'total') {
                $this->error['campaign_name'] = $this->language->get('error_campaign_name_total');
            }
        }

        if (!isset($this->error['warning']) && $this->error) {
            $this->error['warning'] = $this->language->get('error_warning');
        }

        return !$this->error;
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit