*    *    *    *    *    *    *    *    *    *    *    *    *    *    *    *    *    *    *    *    
*
*  KONTROLA_ZALOH.PRG: program kontroluje existenci zaloh v danem adresari - sleduje data vytvoreni a velikosti
*
* 2017-04-27 - se dvema parametry vypisuje i kompletni seznam zalohovych souboru s datem vytvoreni a delkou
* 2017-05-02 - detekuje se i prazdna zaloha (soubor je mensi nez 55Bytes)
* 2017-05-15 - u souboru, vytvorenych po 19:00, se o den posune datum vytvoreni
* 2017-05-15 - hlida i postgresove dumpy, ktere maji priponu .pgdump
* 2017-07-13 - u postgresovych dumpu se bere datum vytvoreni z nazvu, protoze jsou stahovany z sftp a jako datum vytvoreni maji datum prenosu
* 2017-07-25 - u postgresovych dumpu posunut datum o jednicku, jinak se dnesni soubor hlasil vzdy jako chybejici
*            - vynechava adresare, obsahujici "\jlv\"
*            - delka souboru je zobrazena retezem hvezdicek pro rychly nahled velkych souboru
* 2018-03-11 - vynechavaji se podadresare \archiv
* 2018-03-28 - zarovnany texty, delky souboru se zobrazuji na desetiny megabyte
* 2019-03-11 - vynechavaji se podadresare \stc
* 2019-12-09 - omezena maximalni delka nazvu
*
*    *    *    *    *    *    *    *    *    *    *    *    *    *    *    *    *    *    *    *    

PARAM adresar_zaloh, i_seznam_souboru

vysledek = " v.2019-03-13"
vysledek = vysledek + crlf + "[2T#B]informace o zalohach z deseti poslednich dni, v hlavicce jsou posledni cifry datumu" + m.crlf
vysledek = vysledek + crlf + "[2T#B]vyznam symbolu: <b>#</b> - zaloha chybi, <b>&lt;</b> - mensi nez obvykle, <b>x</b> - o hodne mensi, <b>0</b> - prazdna "
clos data
crea table (m.pri_path + "soubory_zaloh") (adresar c(99), nazev c(99), atrib c(1), delka N(13,1), vytvoreno D, cas C(5))

DO priprav_seznam_souboru

COPY ALL TO .\sssouubory_zaloh

SELECT nazev, ROUND(AVG(delka), 1) as avg_delka, SPACE(66) as rozsudek, 00.0 as body FROM soubory_zaloh GROUP BY 1 ORDER BY 1 INTO TABLE (m.pri_path + "soubory_zaloh2")

SCAN
   SCATTER FIELDS nazev, avg_delka memvar
   SELECT soubory_zaloh
   rozsudek = ""
   body = 0
   koeficient = 2.1    && dava snizujici vahu starsim zaloham, takze napr. kdyz chybi dnesni zaloha, je to vaznejsi, nez kdyz chybi 7 dni stara
   FOR ii = 0 to 9
       LOCATE FOR nazev = m.nazev .and. vytvoreno = DATE() - m.ii
       DO CASE
       CASE .not. FOUND()
          rozsudek = m.rozsudek + "# "
       CASE delka < 55
          rozsudek = m.rozsudek + "0 "
          body = body + .1 * m.koeficient
       CASE delka < m.avg_delka * .3
          rozsudek = m.rozsudek + "x "
          body = body + .3 * m.koeficient
       CASE delka < m.avg_delka * .8
          rozsudek = m.rozsudek + "&lt; "
          body = body + .7 * m.koeficient
       OTHERWISE
          rozsudek = m.rozsudek + ". "
          body = body + m.koeficient
       ENDCASE
       koeficient = SQRT(m.koeficient)
   ENDFOR 
   SELECT soubory_zaloh2
   GATHER FIELDS rozsudek, body memvar
ENDSCAN

SELECT soubory_zaloh2
REPLACE FOR ". . . . . . . . . ." $ rozsudek rozsudek with ". .     O.K.    . ."
REPLACE ALL avg_delka WITH ROUND(avg_delka/1024/1024, 1)
REPLACE FOR avg_delka > 20 avg_delka WITH ROUND(avg_delka,  0)
REPLACE FOR avg_delka > 99 avg_delka WITH ROUND(avg_delka, -1)

max_delka_nazvu = 0
SCAN
    max_delka_nazvu = MAX(m.max_delka_nazvu, LEN(ALLTRIM(nazev)))
    IF .NOT. EMPT(rozsudek)
          REPLACE nazev WITH ALLTRIM(nazev) + IIF(LEN(ALLTRIM(nazev)) % 2 = 0, ".", " .")
    ENDIF       
    REPLACE rozsudek WITH ALLT(rozsudek) + " " + PADL(ALLTRIM(STR(avg_delka,7,1)),7," ") + "MB " + delka2stars(avg_delka)
*    REPLACE rozsudek WITH STRTR(rozsudek, ".0MB", "  MB")
ENDSCAN 
max_delka_nazvu = MAX(m.max_delka_nazvu, 44)

REPL ALL nazev WITH LEFT(ALLTRIM(nazev) + " . . . . . . . . . . . . . . . . . . ", m.max_delka_nazvu + 2)

seznam_pripon = ""
FOR ii = 0 to 9
    seznam_pripon = m.seznam_pripon + " " + RIGHT(DTOS(DATE() - m.ii), 1)
ENDFOR 

o_adresar = "\):*(/"
SCAN
     zacatek_cesty = LEFT(nazev, AT("\", nazev, 2))
     IF m.zacatek_cesty # m.o_adresar
         o_adresar = m.zacatek_cesty
         o_adresar_1 = LEFT("===== " + UPPER(ALLTRIM(m.o_adresar)) + " ==========================", m.max_delka_nazvu-2)
*         o_adresar_1 = PADC(" = = = = " + UPPER(ALLTRIM(m.o_adresar)) + " = = = = ", m.max_delka_nazvu-2)
         vysledek = vysledek + "<BR>" + crlf + "[2T#K]" + m.o_adresar_1 + m.seznam_pripon
     ENDIF 

     DO CASE
     CASE body > 8
           vysledek = vysledek + crlf + "[2T#g]"
     CASE body > 6
           vysledek = vysledek + crlf + "[2T#r]"
     OTHER
           vysledek = vysledek + crlf + "[2T#R]"
     ENDCASE
*     vysledek = vysledek + ALLTRIM(SUBSTR(nazev, 4)) + " " + ALLT(rozsudek) + " " + PADL(ALLTRIM(STR(avg_delka,7,1)),7," ") + "MB " + delka2stars(avg_delka)
     vysledek = vysledek + ALLTRIM(SUBSTR(nazev, 4)) + " " + ALLT(rozsudek)
ENDSCAN 
vysledek = vysledek + m.crlf


IF .NOT. EMPT(m.i_seznam_souboru)
   SELECT soubory_zaloh
   REPLACE ALL            delka WITH ROUND(delka/1024/1024, 1)
   REPLACE FOR delka > 20 delka WITH ROUND(delka          , 0)
   REPLACE FOR delka > 99 delka WITH ROUND(delka          ,-1)
   REPL FOR cas > "16" vytvoreno with vytvoreno - 1
   INDEX ON nazev + STR(({^2044-12-12} - vytvoreno)) TAG nv
   o_naz = "\):*(/"
   SCAN
      IF m.o_naz # nazev
          o_naz = nazev
          vysledek = vysledek + m.crlf + "[2T#B] - - - - " + UPPER(ALLT(nazev)) + " - - - -" + m.crlf
      ENDIF 
      vysledek = vysledek + IIF(vytvoreno > DATE() - 10, "[1T#K]", "[1T#k]") + LEFT(ttoc(vytvoreno,3), 10) + " " + cas + "     " + STR(delka, 7,1) + "MB   " + JUSTFNAME(ALLTRIM(adresar)) + m.crlf
   ENDSCAN
ENDIF

COPY ALL TO .\sssouubory_zaloh2

CLOS DATA
*vysledek = STRTR(m.vysledek, " ", "_")

vysledek = STRTR(m.vysledek, "  ", "&nbsp; ")
vysledek = STRTR(m.vysledek, "  ", "&nbsp; ")
vysledek = STRTR(m.vysledek, "  ", "&nbsp; ")
*vysledek = STRTR(m.vysledek, "&nbsp;&nbsp;&nbsp;", "&nbsp; &nbsp;")


**** **** **** **** **** **** **** **** **** **** **** **** 
FUNCTION delka2stars(delka)
RETURN IIF(delka<266, "", REPLICATE("*", delka/188))


**** **** **** **** **** **** **** **** **** **** **** **** 
PROCEDURE  priprav_seznam_souboru
do jedenadresar with m.adresar_zaloh

sele soubory_zaloh
do while .t.
  locate for "D" $ atrib .and. delka = 0
  if found()
    repl delka with -111
    do jedenadresar with allt(adresar) + allt(nazev) + "\"
  else
    exit
  endif
enddo

DELETE FOR ATC("\jlv", adresar) + ATC("jlv-", nazev) + ATC("az-", nazev) > 0

DELETE FOR ATC("\archiv", adresar) > 0
DELETE FOR ATC("\stc"   , adresar) > 0

DELETE FOR atrib = "D"
DELETE FOR ATC(".zip  ", nazev) + ATC(".7z  ", nazev) + ATC(".pgdump  ", nazev) = 0
DELETE FOR vytvoreno < DATE() - 33
DELETE FOR .not. ("_" $ nazev .or. "-20" $ nazev)
REPLACE ALL nazev WITH ALLTRIM(adresar) + nazev, adresar WITH nazev

SCAN FOR ATC(".pgdump  ", nazev) > 0 && pgdumpy maji datum prenosu, nikoli vytvoreni, tak se to vezme z nazvu
    dat_v = RIGHT(JUSTSTEM(adresar), 10)
*    vysledek = vysledek + crlf + adresar + "--" + m.dat_v
    REPLACE vytvoreno WITH DATE(VAL(LEFT(dat_v, 4)), VAL(SUBSTR(dat_v, 6, 2)), VAL(RIGHT(dat_v, 2))), cas with "22"
ENDSCAN

SCAN FOR ATC(".pgdump  ", nazev) = 0 
    IF SUBSTR(adresar, RAT(".", adresar)-1, 1) > "9"
        REPLACE adresar WITH LEFT(adresar, RAT(".", adresar)-1) + "_99." + JUSTEXT(adresar), nazev WITH LEFT(adresar,  RAT("_", adresar)-1)
    ENDIF 
ENDSCAN

SCAN
    DO CASE
    CASE AT("-20", nazev) > 1
        REPLACE nazev WITH LEFT(nazev, AT("-20", nazev)-1)
    CASE RAT("_", nazev) > 1
        REPLACE nazev WITH LEFT(nazev,  RAT("_", nazev)-1)
    ENDCASE
ENDSCAN 

REPL FOR cas > "18" vytvoreno with vytvoreno + 1

**** **** **** **** **** **** **** **** **** **** **** **** 
proc jedenadresar
param adr
pocet = adir(qqq, m.adr + "*.*", "D")
for ii = 1 to m.pocet
  if left(qqq(ii, 1), 1) # "."
     insert into soubory_zaloh (adresar, nazev, atrib, delka, vytvoreno, cas) ;
        value (lowe(m.adr), lowe(qqq(ii, 1)), iif("D" $ qqq(ii, 5), "D", ""), qqq(ii, 2), qqq(ii, 3), strtr(qqq(ii, 4), " ", "0"))
  endif
endfor
