Bug
+ (!!!!krytyczny!!!!)  na telefonie nie dziala dynamieczne doladowywanie zdjec w galerii (ten sam problem moze dotyczyc strony z produktami - do sprawdzenia)
+ (poprawione) #uwaga!!! - ja wlacze  cache w .env to jest probvlem z wywwolaniem:  GET http://demo.cmsrs.pl/api/productsGetNameAndPrice/en
# trzeba zbadac - patrz demo (aktualnie dziala)


in Future:
- rejestracja przy checkout (do przemyslenia)
- w zakladce setting mozna dodac parametry np. koszt wysylki lub moze walute...
- metody dostawy - grubszy temat
+ waluta w env


- wdrozyc system wysylki maili (przy rejestracji i przypomnij haslo) - funkcjonalność framweorku
- rejestracja uzytkownika - wymagany mail z url-em aktywacyjnym - funkcjonalność framweorku

- sprawdzenie jak dzila sklep dla wiekszej ilosci produktow - problem wydajnosciowy
- sprawdzenie czy produkty doladowywuja sie dynamicznie - tak jak ma to miejsce w galerii zdjec .... 

css to fix:
- widok produktu - mobile - poprawic
- zbyt mala czcionka na urzadzeniach mobilnyc - moze wczesniej nalezy dac kwadracik z kreskami - dla wiekszej rozdzielczosci - dla tableata


210510
+ naprawione - ale nie przez sesje ale na podstawie url-i
  (na pierwszy rzut okla to nie wyglada jak blad - aktualnie bierze defaultowy lang z plki konf - pierwsza wartosc)  
Problem z sesia odczytujaca wartosc lang z sessi
zmiana jezykow z panelu klienta (brak obslugi sessi w panelu klienta) - jesli zmeiniam jezyk na stronie frontowej w panelu zawsze pozostaje jezyk defaultowy
czyli pierwszy ustawiony w konfigu


+-  !!!!!!!!blad krytyczny!!!!!! - jak ktos zlozy zamownienie wejdzie na payu - ale zrezygnuje (zalozy sie rekord w basket), a pozniej wejdzie na strone glowna 
to utworzy sie orders! ( nie wiem jak zrobic dodatkowa walidacje - http_refferer? - z payu musi byc wejscie)
!!!moze trzeba ustawic w payu dodatkowe api dot. czy platnosc zostala zrealizowana


+(zrobione)  !!!!!!!!blad krytyczny!!!!!! - trzeba bybloby jakos oprogramowac przypadek koszyka w przypadku zmiany nazwy produktu lub jego kwoty (bo w localstorage beda stare dane)
todo - do przemyslenia.

- !!!!!!!!!!blad krytyczny!!!!!! - weryfikacja maila przy zlozeniu zamowienia (checkout) ?? - todo - do przemyslenia.
- !!!!!!!!!!blad krytyczny!!!!!! - weryfikacja maila rejestracja ?? - todo - do przemyslenia. (aktualnie wylaczona)


- po logowaniu / rejestracji / przypomnij haslo - przechodzimy na /home  w jezyku defaultowym - a jezyk powinien byc brany z sessi


+ obsluzyc przypadek gdy cena produktu sie zmieni - do zastanowienia ( - zapsis tej ceny w baskecie -)

new future:
+ w panelu adm. moznabyloby zrobic zestawienie orderow jakie wykonal dany uzytkownik
+ wyszukiwarka produktow  (bardzo prosta aktualnie)
+ strona forget pass


UWAGA!!!


+ przy zmianie linkow trzeba aktualizowac sitmape - wywolujac skrypt (patrz: .go_clear_cache_and_update_sitempa.sh)



20201002

todo
+ wiecej jezykow
+ kontakt form 
+ capute w contact form (TODO)
+ alt obrazka na froncie - i dodatnie go do skryptu
+ wydajnosc gallerii - duzo wiecej zdjec
+ cache
+ strony dostepne tylko po zalogowaniu


+ nie intuicyjnie dziala add/edit w panelu administracyjnym
+ pokazanie w panelu, ktore srony sa odpublikowane


na dalszy plan:
+ zarzadzanie komentarzami 
- (do przemyslenia)  moze nalezy zrobic dodatkowy input na url i h1 (bo to sie zapisuje jako title), albo przynajmniej jakies info, ze to tak dziala przy inpucie title
- wyszukiwarka kontentu
- menu lewe czy pokazywac




bledy:
+ (2404 + poprawione przez nalozenie modal winsdow ) - w admin/pages - dodaje obrazek a pozniej przechodze na inna strone to obrazek zostaje
(2404 + )  - problem z kolejnoscia obrazkow dla produktu w panelu
+ galeria po zalogowaniu nie dziala - patrz moja strona




kamienie milowe:
+- testy reacta / tu zmienilem na vuejs i napsalem testy
+ migracja
- docker (czy to jest az tak wazne)



20201103


todo
+ capture w contact form
+ widomosci w panelu adm z formularza contact form
+-(mozna poprawic - nie wszystkie zapytania sie cachuja)   cache - wydajnosc strony
+-(podepnij do googla)    sitemap.xml - zrobione z automatu
- cross w laravelu (po stronie servera) - bezpieczenstow - do przemyslenia i testow
+ podepnij google analytics
+ linki googla przepisac
+ przekierowanie na www




+ inny url do admina - bezpieczenstow
+ pokazanie w panelu strony, ktore sa odpublikowane (na jakis wyszazony kolor)
(?)  - select w parent page powinien pokazywac short_title a nie title (to jest nietrafiony pomysl bo w projektach nie widomo co wybrac - jest 2x opis np)
+ edycja i dodawanie - malo intuicyjne w panelu administracyjnym - do przemyslenia (przy kasowaniu obrazkow przechodzi na strone glowna)
+ dla page.type == project (or privacy - moze niemkoniecznie) - tylko jeden jezyk



bledy (o niskiej waznosci):
- 2x mozna dodac formularz kontaktowy - moze do poprawy
- tlumaczenie bledow przy logowaniu na polski
- tranzakcje db - jesli nie uda sie dodac strony to nalezy usunac takze tlumaczenia powiazane z ta strona 
- tranzakcje db - jesli nie uda sie dodac  checkout - to trzeba sprawdzic czy  tlumaczenia takze zniknely - todo - do sptawdzenia i testowania 
+ obsluzyc przypadek unikatowych tytulow ston dla danego menu (chociaz short_title jest takie same w projektach -wiec nie jest uniq)
+ obsluzyc przypadek unikatowych tytulow menu
(2405 poprawione + )  - kolejnosc obrazkow dla produktu - nie zawsze dzialala -do  poprawy (nie wiem co jest problemem)


critical
+ !!!!contact nie musli byc podpiety pod menu (mozna obsluzyc ten przypadek) - bedzie inny url - to samo sie tyczy wszsytkich stron nie podpierych pod menu 


uwagi:
+ zrzuty bez ladowania vue - stworzyc nowy tym np clear (bez vue)
- zmienic nazwe privacy na independent (chodzi o typ page) - moze niech ta nazwa zostanie - w koncu tylko te prawnicze glupoty nie sa powiazane z menu
+ (2405 - brak tego w vuejs) - blad obrazkow w galerii  jest migotanie przy pokazaniu dynamicznie nowych obrazkow
+ galeria po zalogowaniu nie dziala
+ !!!- dla typu cms - mozna zrobic edytor wyswig
- unpublish img (przydaloby sie) 
+ mozna kod przeleciec jakims parserem (do czyszczenia formatowania sladni)
+ wywalic komentarze w kodzie
240522 +  - zbiorowy upload image - todo
- Image::filter trzeba poprawic dla innych jezykow poza polskim 
- mechanizm cachowania zrobic lepszy - moze w panelu adm. wlacaac i wylaczac cache i - i tam od razu go czyscic
a nie jak to jest do tej pory:
1. zmiana w pluku .env
2. uruchomienie skryptu: ./go_clear_cache_and_sitemap.sh


+ backup bazy danych kodu zrobic zrobic (kod jest na githubvie - tylko to z gitingnora zrobilem)
+ logowanie mozna takze podpiac do menu - moze to dziwne ale bedzie dzialc - sprawdzalem - nie jest to blad 
+(2405 - dziala) - brak zmiany pozycji w panelu dla stron nie powiazanych z menu - kod w laravelu zostal zrobiony a w panelu sie tto nie pojawia - ale i tak tego nie wykorzystuje w wersji produkcyjnej - moze kiedys w przyszlosci sie to przyda.



+ aktualizacja laravela
lokalnie na serwerze:
0. sprawdz wersje laravela: $php artian list
1. wstaw odpowiednie wersje w composer.json  nie zapomnij zaktualizowac takze wersji php-a w tym pliku
2. comoser update 
3. utworzy sie plik composer.lock
4. przeslij te dwa pliki na serwer

pozniej na serwerze:
0. sprawdz wersje laravela: $php artian list
1. $git pull - pobiora sie nowe pliki composer.json i comploser.lock
2. $php_ver  ~/script/php_ver/composer install  (przy update - nie dalo sie wykonac polecenia poniewaz byl 'Kill' przy wykonaniau komendy)


210126

bledy:
- nie dodaja sie strony z produktami do sitemapy - do poprawy


221201
bledy
+- pozycja w dol dla ostatniej strony  dla stron co maja zagniezdzenia nie dziala popraweni - ale da sie wyklikac klikajac wiele razy do gory
240522 - nie wiem jak to powtorzyc - w vuejs 


230219
- cush testy np dla koszyka (mutex):
(proba zabezpieczenia przez - 'select update')


230902
+ (2405  zle myslenie - zostawiamy jak jest)+ ziana pozycje zjec zdjecic - pierwszy i ostatni - wydaje mio sie ze po przesyuynieciue ostatniego na poczatek wszystkie pozaostale powinny zostrac zwiekszone o 1
a aktualnie jest tylko zmiana 1 z ostatnim - czy to oby jest ok
proponuje aby byla mozliwoisc ziany polozenia za pomoca liczy takze - uprosci to robote przy duzej liczbie zdjec

<code>
import fetch from 'node-fetch';

const time = new Date();
console.log(time.getHours() + ":" + time.getMinutes() + ":" + time.getSeconds());

const url = 'http://cmsrs.pl/basket';
const endpoints = [url+ '/a.php' , url+ '/a.php', url+ '/a.php'];

async function runExt( endpoints  ) {
    try {
        const responses = await Promise.all(
            endpoints.map(async u => {
                const res = await fetch(u);
            })
        );
    } catch (error) {
        console.log(error);
    }
}

console.log(endpoints );
runExt(endpoints );

</code>

+- transkacje dla koszyka (w: Route::post('/post/checkout', 'FrontController@postCheckout'); - jest tranzakajcja - moze to wystarczy na ta chwile)
patrz: public function saveCheckout($data, $userId, $sessionId): product.php

+- (nie wiem jak to powrortzyc - na producji w react dziala i w vuejs tez) - sortowanie w php drzewa nie dziala dla ostatniego nie przechodzi na poczatek - dla srodkowego wezla w drzewie
(do poprawy)

---

- vuejs dla panelu
- aktualizacja do najnowej wersji laravela


-


- obluda bledow w vuejs moze byc lepsze (np przy duplikacie tytulu nalezy zaznaczyc ktore pole trzeba zmienic a to ptrzeba przekaza w api ) - proponuje takze zrobic dokumentacje na stronie o bledach, nie tylko o pozytywnej odpowiedzi 


------------------skrypty------biblioteki--cdn----


<!--
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
-->
<!--
    //needless - dont use
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
-->
<!--
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
-->



<!--
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.js"></script>      
-->

todo 240615

- sprawdzic jak zachowuja sie tabelki w vuejs bez zadnych danych
- pozycja produktow ... do przemyslenia
- #uwaga!!! + ja wlacze ten cache to jest probvlem z wywwolaniem:  GET http://demo.cmsrs.pl/api/productsGetNameAndPrice/en
# trzeba zbadac
CACHE_ENABLE=true


/******************************************
* old code, maybe it would be useful:
*******************************************/

1. send email:


//use Illuminate\Support\Facades\Mail;
    /**
     * helper function
     */
    /*
    public function mailTestRs()
    {
        $to_name = 'R S';
        $to_email = 'test@yahoo.com';
        $data = array('name'=>"Sam Jose", "body" => "Test mail");
        Mail::send('emails', $data, function($message) use ($to_name, $to_email) {
            $message->to($to_email, $to_name)->subject('Artisans Web Testing Mail');
            $message->from('test@gmail.com','Artisans Web');
        });
    }
    */



2. in homeContrller.php

    /*
    public function basket()
    {
        $token = User::getTokenForClient();

        return view('basket', [
            'token' => $token,
            //'tab' => 'basket'
        ]);
    }

    public function orders()
    {
        $user = Auth::user();
        $arrOrders = Order::inOrdersByUserId($user->id)->toArray();
        $orders = [];
        if( !empty($arrOrders) ){
            $arrOrdersReindex = Base::reIndexArr($arrOrders, 'product_id');
            $baskets = false;
            Product::getDataToPayment( $arrOrdersReindex, $baskets, $orders);
        }

        //$orders = [];

        return view('orders', [
            'orders' => $orders,
            //'tab' => 'order'
        ]);
    }
    */

    /*
    public function tobank(Request $request)
    {
        User::checkApiClientByToken($request->token);

        $data = $request->only('cart');

        if( empty($data['cart']) || !is_array($data['cart']) ){
            throw new \Exception("Wrong data from post");
        }

        $demoStatus = env('DEMO_STATUS', false);
        if( $demoStatus ){
            return response()->json(['success'=> false, 'error'=> 'No access (set DEMO_STATUS on false)'], 200);
        }


        $arrCart = Base::reIndexArr($data['cart']);

        $baskets = [];
        $productsDataAndTotalAmount = Product::getDataToPayment( $arrCart, $baskets );

        $user = Auth::user();
        Basket::deleteBasketAndAddNewData($user->id, $baskets);

        $payu = new Payu;
        $data = $payu->dataToSend( $productsDataAndTotalAmount );

        Log::debug(' data sended to payu: '.var_export($data, true ) );

        $redirectUri = $payu->getOrder($data);
        if( empty($redirectUri) ){
            //throw new \Exception("Somthing wrong with payu - i cant obtain the redirectUri");
            Log::debug("Somthing wrong with payu - i cant obtain the redirectUri");
            return response()->json(['success'=> false, 'error'=> 'Somthing wrong with payu - try later.'], 200);
        }
        Log::debug('payu redirect url: '.$redirectUri );
        return response()->json(['success' => true, 'data'=> $redirectUri], 200);
        //return redirect($redirectUri);
    }
    */


PageService.php:

    /*
    public function getPageWithImagesByIdCache($pageId)
    {
        $isCache =  (new Config)->isCacheEnable();
        if ($isCache) {
            $ret = cache()->remember('page_with_images_page_id_'.$pageId, CacheService::setTime(), function () use ($pageId) {
                return  (new Page)->getPageWithImagesById($pageId);
            });
        } else {
            $ret = (new Page)->getPageWithImagesById($pageId);
        }

        return $ret;
    }

    public function getPageWithImagesById($pageId)
    {
        $page = Page::with(['translates', 'contents'])->where('id', $pageId)->where('published', true)->where('after_login', false)->orderBy('position', 'asc')->get($this->pageFields)->first(); //->toSql(); ///toArray();

        $out = [];
        if($page){
            $page = $page->toArray();
            $out = $this->getPageDataFormat($page);
            $out['images'] = Image::getImagesAndThumbsByTypeAndRefId('page', $page['id']);
        }

        return $out;
    }
    */

    /**
     * todo
     * this method not use
     */
    /*
    public function getFirstPageWithImagesForGuestCache($type)
    {
        $isCache =  (new ConfigService)->isCacheEnable();
        if ($isCache) {
            $ret = cache()->remember('page_with_images_by_type_'.$type, CacheService::setTime(), function () use ($type) {
                return  (new PageService()  )->getFirstPageWithImagesForGuest($type);
            });
        } else {
            $ret = (new PageService()  )->getFirstPageWithImagesForGuest($type);
        }

        return $ret;
    }
    */



ProductService.php

    /**
     * this function is similar to: getDataToPayment
     */
    /*
    static public function getDataToOrders( $arrCart )
    {
        $user = Auth::user();
        if( empty($user) ){
            throw new \Exception("User not auth - this exception is impossible");
        }

        $ids = array_keys($arrCart);
        $arrProducts = Product::with(['translates'])->whereIn('id', $ids)->orderBy('id', 'asc')->get()->toArray();

        $out = [];
        $totalAmount = 0;
        foreach($arrProducts as $arrProduct){

            $itemIn = $arrCart[$arrProduct['id']];
            $out["products"][] = [
                "name" => Product::getDefaultProductName($arrProduct['translates']),
                "unitPrice" => $arrProduct['price'],
                "quantity" => $itemIn['qty']
            ];
            $baskets[] = [
                "qty" => $itemIn['qty'],
                "user_id" => $user->id,
                "product_id" => $arrProduct['id']
            ];

            $totalAmount += $arrProduct['price'] * $itemIn['qty'];
        }
        $out['totalAmount'] =  $totalAmount;

        return  $out;
    }
    */

    // public function setTranslate($objTranslate)
    // {
    //     if (!empty($objTranslate)) {
    //         $this->translate = $objTranslate;
    //     }
    // }

    /*
    // not use
    public function getProductDataByProductId( $productId )
    {
        $product = Product::with(['translates', 'contents'])->where('id', $productId)->orderBy('id', 'asc')->get()->first();
        $out = $this->getProductDataByProductArr( $product );

        return $out;
    }
    */


    //old filter function - change file name
    //it will reaplaced by Str:slug
    /**
     * TODO - move function to helper
     * fix for another language
     */
    /*
    public static function filter($string, $delimiter = '-')
    {
        $to_replace = ['ą', 'ę', 'ó', 'ś', 'ć', 'ń', 'ł', 'ż', 'ź', 'Ą', 'Ę', 'Ó', 'Ś', 'Ć', 'Ń', 'Ł', 'Ż', 'Ź', //Polish
            'ä', 'ö', 'ü', 'ß', 'Ä', 'Ö', 'Ü',  //German
            '%20', ' '];
        $replace_with = ['a', 'e', 'o', 's', 'c', 'n', 'l', 'z', 'z', 'A', 'E', 'O', 'S', 'C', 'N', 'L', 'Z', 'Z',
            'a', 'o', 'u', 'ss', 'A', 'O', 'U',
            $delimiter, $delimiter];
        //$filter = array('!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '=', '+', '[', ']', ';', ':', '"', '\'', '<', '>', '/', '?', '.');
        $filter = ['!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '=', '+', '[', ']', ';', ':', '"', '\'', '<', '>', '/', '?'];

        $string = str_replace($to_replace, $replace_with, $string);
        $string = str_replace($filter, '', $string);

        return strtolower(trim($string));
    }
    */








