* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*                           A U T O E X E C                                             *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* program AUTOEXEC najde v danem adresari programy (.fxp), zacinajici pismenem z parametru
* a podle abecedy je spusti, pokud jsou splneny podminy ze souboru stejneho jmena s priponou ".config"
* ten obsahuje sekce s nazvem souboru v hranatych zavorach [] (kdybychom se rozhodli mit jen 1 spolecny soubor)
* a paramatry:
*      zacatek = 1111-11-11T11:11    && kdy nejdrive ma byt program spusten
*      konec   = 2222-12-12T12:12    && kdy nejpozdeji ma byt program spusten
*      perioda = 0                   && jak casto ma byt spousten - v minutach samotne cislo,
*                                       v hodinach jako 12HOD, ve dnech napr 14DAYS nebo 14DNI (hledano jen "HO" a "DA", "DE", "DN")
*                                       muze nasledovat slovo EXCL, pak jsou pouzity semafory, aby program bezel v dane chvili jen jednou
*                                       nebo slovo "SAM"/"ALONE", pak se program spusti, pokud vubec nikde jinde neni pusten Food (pouzity semafory IS_ACTIVE)
*                                       pokud je perioda udana ve dnech, spousti se jako ALONE
*                                       pokud je perioda udana ve dnech, spousti se az po ctvrte hodine ranni
*                                       ALWAYS spusti bez ohledu na dobu od posledniho spusteni
*      podminky=                     && vyhodnoceno jako logicka hodnota v sekci try-catch, takze chyba nezbori cely program. 
* 
*      pokud je kdekoliv v config souboru v (m.gcini_path + "autoexec\") string *BEZ HADA*, je skryt had
* 
* pokud je program skutecne spusten, je do jeho sekce zaznamenano
*      spusteno=2012-01-10T14:27:39  && cas spusteni
*      spustil=">>RUNNING<<" + machine && stroj, na kterem byl spusten
* po ukonceni programu je na radku spustil smazan text ">>RUNNING<<", zustane jen jmeno stroje
* 
* soubory .config se hledaji v adresari (m.gcini_path + "autoexec\"), typicky tedy "\food600\autoexec\"
* a v (m.gchom_path + "autoexec\"), parametry z gcini_path maji prednost
*
* chybejici parametry v .config souboru v hom_path se vezmou z ini_path ze sekce s nazvem souboru a sufixem "_default",
* takze napr. v souboru z05_archivace_trzeb.config je to sekce [z05_archivace_trzeb_default]
*
* zatim se pouzivaji parametry:
*             "A" pri startu foodu
*             "Z" pri ukonceni
*             "S" po prepnuti skladu
*             "E" spusteni foodu v rezimu "autoexec + quit"
*
* takze programy se mohou jmenovat A01_<nejake_jmeno>.fxp az A99_<nejake_jmeno>.fxp
*                                a Z01_<nejake_jmeno>.fxp az Z99_<nejake_jmeno>.fxp
*
* 2023-10-10 - u sql se nepouziva config v datovem adresari, jen v pgm/autoexec
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

PARAMETERS ae_situace
PRIVATE hladajriadok

#DEFINE CRLF CHR(13)+CHR(10)
#DEFINE JMENO_LOGU "autoexec"

DO open_database
ae_situace = IIF( EMPTY(m.ae_situace), "A", LEFT(m.ae_situace,1))

IF TYPE("machine_semaf") # "C"
    machine_semaf = "muj-stroj"
ENDIF 

ae_pgm_path = m.gcini_path + "autoexec\"

ae_cfg_path = m.gchom_path + "autoexec\"
IF !DIRECTORY(m.ae_cfg_path)
     err_h_info = m.ae_cfg_path
     TRY     
         MKDIR(m.ae_cfg_path)
     CATCH 
     ENDTRY 
ENDIF
err_h_info = ""
DO clos_data 


*    *    *    *    *    *    *    *    *    *    *    *    *    *    *    *    *    *    *    
ae_pocet = ADIR(ae_soubory, m.ae_pgm_path + m.ae_situace + "*.fxp")

IF m.ae_pocet > 0
    ae_had = CREATEOBJECT("had", "autoexec")
    ae_had.SHOW()
    ACTIVATE SCREEN 
    ae_had.set_max(ae_pocet)
    ae_presny_cas=DATETIME()
    DO autoexec_log WITH CRLF + CRLF + SUBSTR(LEFT(TTOC(m.ae_presny_cas,3),16), 6) + "  " + REPLICATE(" " + UPPER(m.ae_situace), 3) + "   " + m.machine_semaf + " " + ALLTRIM(m.gcuser_id) + "  ver." + m.gcverze
    ASORT(ae_soubory, 1)
    FOR ae_iii = 1 TO ae_pocet
        ae_jmeno_souboru = JUSTSTEM(LOWER(ae_soubory(ae_iii, 1)))
        hladajriadok=PADR(ALLTRIM(ae_jmeno_souboru),50)
        ae_cmd = "DO " + m.ae_pgm_path + ae_jmeno_souboru

        IF m.issql
            IF USED("autoexec")
                REQUERY("autoexec")
            ELSE
                rv("autoexec","autoexec")
                CURSORSETPROP("Buffering" ,5,"autoexec")
            ENDIF
        ENDIF

        ae_jmeno_info_souboru = m.ae_cfg_path + ae_jmeno_souboru + ".config"
        ae_jmeno_cfg_souboru  = m.ae_pgm_path + ae_jmeno_souboru + ".config"
        ae_had.INCREMENT(m.ae_jmeno_souboru + " ... priprava")

        ae_zacatek_default  = UPPER(get_ini(ae_jmeno_souboru + "_default", "zacatek", "1111-11-11T", m.ae_jmeno_cfg_souboru))
        ae_konec_default    = UPPER(get_ini(ae_jmeno_souboru + "_default", "konec",   "2222-12-22T", m.ae_jmeno_cfg_souboru))
        ae_perioda_default  = UPPER(get_ini(ae_jmeno_souboru + "_default", "perioda", "0",           m.ae_jmeno_cfg_souboru))
        ae_podminky_default = UPPER(get_ini(ae_jmeno_souboru + "_default", "podminky", "",           m.ae_jmeno_cfg_souboru))

        IF m.issql
            ae_zacatek          = UPPER(get_ini(ae_jmeno_souboru             , "zacatek", "0000-00-00T", m.ae_jmeno_cfg_souboru))
            ae_konec            = UPPER(get_ini(ae_jmeno_souboru             , "konec",   "0000-00-00T", m.ae_jmeno_cfg_souboru))
            ae_perioda          = UPPER(get_ini(ae_jmeno_souboru             , "perioda", "0",           m.ae_jmeno_cfg_souboru))
            ae_podminky         = UPPER(get_ini(ae_jmeno_souboru             , "podminky", "",           m.ae_jmeno_cfg_souboru))
        ELSE
            ae_zacatek          = UPPER(get_ini(ae_jmeno_souboru             , "zacatek", "0000-00-00T", m.ae_jmeno_info_souboru))
            ae_konec            = UPPER(get_ini(ae_jmeno_souboru             , "konec",   "0000-00-00T", m.ae_jmeno_info_souboru))
            ae_perioda          = UPPER(get_ini(ae_jmeno_souboru             , "perioda", "0",           m.ae_jmeno_info_souboru))
            ae_podminky         = UPPER(get_ini(ae_jmeno_souboru             , "podminky", "",           m.ae_jmeno_info_souboru))
        ENDIF 

    	IF m.issql 
            STORE "" TO ae_spusteno, ae_spustil
            DO zpracuj_parametry_z_sql
    	ELSE 

            IF .not. rozumne_datum(m.ae_zacatek)
                ae_zacatek = get_ini(ae_jmeno_souboru, "zacatek",  "", m.ae_jmeno_info_souboru)
                IF .not. rozumne_datum(m.ae_zacatek)
                    ae_zacatek = m.ae_zacatek_default
                    writeprivstr( m.ae_jmeno_souboru, "zacatek", m.ae_zacatek_default, m.ae_jmeno_info_souboru)
                ENDIF 
            ENDIF 

            IF .not. rozumne_datum(m.ae_konec)
                ae_konec = get_ini(ae_jmeno_souboru, "konec", "", m.ae_jmeno_info_souboru)
                IF .not. rozumne_datum(m.ae_konec)
                    ae_konec = m.ae_konec_default
                    writeprivstr( m.ae_jmeno_souboru, "konec", m.ae_konec_default, m.ae_jmeno_info_souboru)
                ENDIF 
            ENDIF 

            IF EMPTY(m.ae_perioda)
                ae_perioda = UPPER(get_ini(ae_jmeno_souboru, "perioda", "", m.ae_jmeno_info_souboru))
                IF EMPTY(m.ae_perioda)
                    ae_perioda = m.ae_perioda_default
                    writeprivstr( m.ae_jmeno_souboru, "perioda", m.ae_perioda_default, m.ae_jmeno_info_souboru)
                ENDIF 
            ENDIF 

            IF EMPTY(m.ae_podminky)
                ae_podminky = UPPER(get_ini(ae_jmeno_souboru, "podminky", "", m.ae_jmeno_info_souboru))
                IF EMPTY(m.ae_podminky)
                    ae_podminky = ae_podminky_default
                    writeprivstr( m.ae_jmeno_souboru, "podminky", m.ae_podminky_default, m.ae_jmeno_info_souboru)
                ENDIF 
            ENDIF 

            ae_spusteno = get_ini(ae_jmeno_souboru, "spusteno", "xxnikdy", m.ae_jmeno_info_souboru)
            ae_spustil  = get_ini(ae_jmeno_souboru, "spustil" ,   "nikdo", m.ae_jmeno_info_souboru)
    	ENDIF 


        IF vyhodnot_podminky()
           ae_spustit = .F.
           
           IF ("ALWAYS" $ m.ae_perioda)
               ae_spustit = .T.
           ELSE 
               IF ("DA" $ m.ae_perioda) .or. ("DN" $ m.ae_perioda) .or. ("DE" $ m.ae_perioda)        && perioda udana ve dnech
                   IF (TTOD(m.ae_presny_cas) >= TTOD(CTOT(m.ae_spusteno)) + VAL(m.ae_perioda)) .AND. (HOUR(m.ae_presny_cas) > 4 .or. ATC("evzen", m.machine_semaf) + ATC("apc04", m.machine_semaf) > 0)
                       ae_spustit = EMPTY(n_checkall("IS_ACTIVE")) .AND. n_slock_ex("AUTO:" + m.ae_jmeno_souboru)    && nikdo jiny neni ve foodu a jde nastavit exclusivni semafor
                   ENDIF 
               ELSE 
                   IF ATC("HO", m.ae_perioda) + ATC("HR", m.ae_perioda) > 0    && perioda udana v hodinach nebo minutach
                       perioda_ve_vterinach = VAL(m.ae_perioda)*60*60
                   ELSE
                       perioda_ve_vterinach = VAL(m.ae_perioda)*60
                       ae_perioda = m.ae_perioda + "MIN"
                   ENDIF 
                   IF (m.ae_presny_cas > CTOT(m.ae_spusteno) + m.perioda_ve_vterinach)
                       DO CASE 
                       CASE ("SAM" $ m.ae_perioda) .or. ("ALONE" $ m.ae_perioda)
                           ae_spustit = EMPTY(n_checkall("IS_ACTIVE")) .AND. n_slock_ex("AUTO:" + m.ae_jmeno_souboru)    && nikdo jiny neni ve foodu a jde nastavit exclusivni semafor

                       CASE "EXCL" $ m.ae_perioda
                           ae_spustit = n_slock_ex("AUTO:" + m.ae_jmeno_souboru)

                       OTHERWISE 
                           ae_spustit = .T.

                       ENDCASE
                   ENDIF 
               ENDIF
           ENDIF

           small_log (IIF(m.ae_spustit, PADR(UPPER(m.ae_jmeno_souboru),40) + "SPUSTIT ", PADR(LOWER(m.ae_jmeno_souboru),40) + "        ") + LEFT(m.ae_zacatek, 10) + " " + LEFT(m.ae_konec, 10) + "  perioda:" + PADR(m.ae_perioda, 9) + IIF(EMPTY(m.ae_podminky), "", "  podminky:" + m.ae_podminky) + "  minule spusteno:" + ALLTRIM(LEFT(m.ae_spusteno, 16)), JMENO_LOGU)

           IF m.ae_spustit
              ae_trvani = DATETIME()
              IF m.issql
                  SELECT autoexec
                  REPLACE spusteno WITH TTOC(m.ae_presny_cas, 3), spustil WITH ">>RUNNING<<" + m.machine_semaf
                  tux(.T.,.T.,"autoexec", "requery")
              ELSE
                  writeprivstr( m.ae_jmeno_souboru, "spusteno", TTOC(m.ae_presny_cas, 3)      , m.ae_jmeno_info_souboru)
                  writeprivstr( m.ae_jmeno_souboru, "spustil", ">>RUNNING<<" + m.machine_semaf, m.ae_jmeno_info_souboru)
                  DO clos_data 
              ENDIF

              IF FILE(m.ae_pgm_path + ae_jmeno_souboru + ".config")
                  ex_s_txt = FILETOSTR(m.ae_pgm_path + ae_jmeno_souboru + ".config")
                  IF (ATC("*BEZ HADA*", m.ex_s_txt ) > 0)
                      ae_had.hide()
                  ELSE 
                      ae_had.SHOW()
                  ENDIF 
              ENDIF

              ae_had.set_txt2(UPPER(m.ae_jmeno_souboru) + " ... PROVEDENI")

              TRY 
                  &ae_cmd
              CATCH TO aex_oErr 
                  DO autoexec_log WITH CRLF + CHR(9) + PADR(m.ae_jmeno_souboru, 32) + ALLTRIM(STR(aex_oErr.ErrorNo)) + " " + aex_oErr.Message + " Line:" + ALLTRIM(STR(aex_oErr.LineNo))
              ENDTRY 


              IF m.issql
                  IF USED("autoexec")
                       =REQUERY("autoexec")
                  ELSE
                       rv("autoexec","autoexec")
                       CURSORSETPROP("Buffering" ,5,"autoexec")
                  ENDIF
                  SELECT autoexec
                  REPLACE spustil WITH m.machine_semaf + " " + m.gcuser_id
                  tux(.T.,.T.,"autoexec", "requery")
              ELSE
                  DO clos_data 
                  writeprivstr( m.ae_jmeno_souboru, "spustil", m.machine_semaf, m.ae_jmeno_info_souboru )
              ENDIF

              DO autoexec_log WITH CRLF + CHR(9) + UPPER(PADR(m.ae_jmeno_souboru, 40)) + formatovana_doba (DATETIME() - m.ae_trvani)
           ELSE 
              DO autoexec_log WITH CRLF + CHR(9) + LOWER(PADR(m.ae_jmeno_souboru, 40)) + "      --"

           ENDIF 
           = n_sunlock("AUTO:" + m.ae_jmeno_souboru)
        ELSE 
 *             DO autoexec_log WITH SPACE(12)
        ENDIF 
*        DO autoexec_log WITH CRLF + CHR(9) + PADR(m.ae_jmeno_souboru, 32) + LEFT(ae_zacatek, 7)  + " - " + LEFT(ae_konec, 7) + " Perioda: "  + ae_perioda +  IIF(EMPTY(m.ae_podminky), "", " Podminky: " + ae_podminky) + " Naposledy: " + ae_spusteno + " "  + ae_spustil 
    ENDFOR
    RELEASE ae_had
ENDIF
DO clos_data 


* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
FUNCTION rozumne_datum(datum_txt)
IF ISNULL(m.datum_txt)
    datum_txt = "9999-12-22"
ENDIF 
RETURN BETWEEN(m.datum_txt, "1100", "2345")


* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
FUNCTION formatovana_doba (__doba)
DO CASE 
CASE m.__doba < 5
     vysl =  "   OK"
CASE m.__doba < 58
     vysl = TRANSFORM(m.__doba, " 99sec")
OTHERWISE 
    __minut  = INT(m.__doba/60)
    IF __minut < 3
        __vterin = ROUND(m.__doba % 60 / 5, 0) * 5
    ELSE
        __vterin = ROUND(m.__doba % 60 , -1)
    ENDIF 
    IF m.__vterin = 60
        vysl = TRANSFORM(m.__minut+1, " 99:00min")
    ELSE 
        vysl = TRANSFORM(m.__minut  , " 99:") + TRANSFORM(m.__vterin, "@L 99min")
    ENDIF 
ENDCASE 
RETURN PADC(m.vysl, 12)


* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
PROCEDURE autoexec_log
LPARAMETERS parch1
IF ISNULL(m.parch1)
    parch1 = "#" + CRLF
ENDIF 

IF LEN(m.parch1) # 0
    if vartype(parch1) # "C"
        parch1 = "Spatny typ " + vartype(parch1) + CRLF
        wait "Autoexec " + m.parch1 + "   " + program(2) + program(3) + program(4) + program(5) + program(6) + program(7) wind time 2
    endif

    fh__zur = -99
    zkus_otevrit_zurnal     (m.ae_cfg_path + "zurnal_autoexec" + LEFT(DTOS(DATE()), 4) + ".txt")
    IF m.fh__zur < 0
        ae_zur_path = SYS(5) + SYS(2003)
        backslash( @m.ae_zur_path )
        zkus_otevrit_zurnal (m.ae_zur_path + "zurnal_autoexec" + LEFT(DTOS(DATE()), 4) + ".txt")
    ENDIF 

    IF m.fh__zur > 0
        FSEEK(m.fh__zur, 0, 2)
        FWRITE(m.fh__zur, m.parch1)
        FCLOSE(m.fh__zur)
    ENDIF
    FCLOSE(m.fh__zur)
ENDIF 


* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
FUNCTION zkus_otevrit_zurnal (jmeno_zurnaloveho_souboru)
TRY 
    IF .NOT. FILE(m.jmeno_zurnaloveho_souboru)
        fh__zur = FCREA(m.jmeno_zurnaloveho_souboru)
        FCLOSE(m.fh__zur)
    ENDIF
CATCH
ENDTRY 

_iii = 0
fh__zur     = FOPEN(m.jmeno_zurnaloveho_souboru, 2)
DO WHILE m.fh__zur < 0 .AND. m._iii < 1
    _iii = m._iii + 0.3
    WAIT "Cekejte, oteviram " + m.jmeno_zurnaloveho_souboru + STR(m._iii, 6,1) WIND TIME m._iii
    fh__zur = FOPEN(m.jmeno_zurnaloveho_souboru, 2)
ENDDO


* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
PROCEDURE zpracuj_parametry_z_sql

zps_trvani = SECONDS()

SELECT autoexec
IF RECCOUNT() = 0
    INSERT INTO autoexec(subor, c_data,   zacatek           ,    konec          ,   perioda           ,   podminky) ;
       VALUES (m.hladajriadok, m.cdata, m.ae_zacatek_default, m.ae_konec_default, m.ae_perioda_default, m.ae_podminky_default)
    tux(.T.,.T.,"autoexec", "requery")
ENDIF 
GO TOP 

IF rozumne_datum(m.ae_zacatek) .and. rozumne_datum(m.ae_konec)
      *   neberou se parametry z sql, ale ze souboru .config, pokud tam existuji a jsou rozumne
    REPLACE zacatek WITH m.ae_zacatek, konec WITH m.ae_konec, perioda WITH m.ae_perioda, podminky WITH m.ae_podminky
    tux(.T.,.T.,"autoexec", "requery")
ELSE 

    IF .not. rozumne_datum(autoexec.zacatek)
        REPLACE zacatek WITH m.ae_zacatek_default
        tux(.T.,.T.,"autoexec", "requery")
    ENDIF 
    GO TOP 
    ae_zacatek=ALLTRIM(autoexec.zacatek)

    	
    IF .not. rozumne_datum(autoexec.konec)
         REPLACE konec WITH m.ae_zacatek_default            && opravdu se tam soupne default zacatku, aby se nahodou nespustilo neco, co se poustet nema
         tux(.T.,.T.,"autoexec", "requery")
    ENDIF 
    GO TOP 
    ae_konec=ALLTRIM(autoexec.konec)


    IF ISNULL(autoexec.perioda)
         REPLACE perioda WITH m.ae_perioda_default
    ENDIF 
    IF EMPTY(autoexec.perioda) .OR. (.NOT. BETWEEN(VAL(autoexec.perioda), 0, 999))
         REPLACE perioda WITH m.ae_perioda_default
    ENDIF 
    tux(.T.,.T.,"autoexec", "requery")
    GO TOP 
    ae_perioda=ALLTRIM(autoexec.perioda)

    IF ISNULL(autoexec.podminky)
        REPLACE podminky WITH ""
        tux(.T.,.T.,"autoexec", "requery")
        GO TOP 
    ENDIF 
    ae_podminky=ALLTRIM(autoexec.podminky)

ENDIF 

ae_spustil  = IIF( ISNULL(autoexec.spustil) , "", ALLTRIM(autoexec.spustil)  )
ae_spusteno = IIF( ISNULL(autoexec.spusteno), "", ALLTRIM(autoexec.spusteno) )

zps_trvani = SECONDS() - m.zps_trvani
IF m.zps_trvani > 1
    DO autoexec_log WITH " zprac.parametru sql trvalo" + TRANSFORM(m.zps_trvani , "999.9sec")
ENDIF 


* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
FUNCTION vyhodnot_podminky

spoustime = .F.

IF LEN(m.ae_zacatek) < 16
    ae_zacatek = m.ae_zacatek + SUBSTR("1111-11-11T", LEN(m.ae_zacatek)+1)
    IF ae_zacatek < "1999"
        ae_zacatek = "1111-11-11T"
    ENDIF 
ENDIF 

IF LEN(m.ae_konec) < 16
    ae_konec = m.ae_konec + SUBSTR("2222-12-22T23:59", LEN(m.ae_konec)+1)
    IF ae_konec > "2200"
        ae_konec = "2222-12-22T"
    ENDIF 
ENDIF 

IF BETWEEN(m.ae_presny_cas, CTOT(m.ae_zacatek), CTOT(m.ae_konec))
    IF EMPTY(m.ae_podminky)
        spoustime = .T.
    ELSE 
        TRY     
            spoustime = .not. EMPTY(EVALUATE(m.ae_podminky))
        CATCH 
            do autoexec_log with CRLF + CHR(9) + PADR(m.ae_jmeno_souboru, 32) + " NELZE VYHODNOTIT PODMINKU: " + m.ae_podminky
        ENDTRY 
    ENDIF 
ENDIF 
RETURN m.spoustime
