// Copyright (c) 1993-2005 "Компания БЭСТ". Все права сохраняются.

#include 'my.ch'
#include 's_public.ch'
#include 'inkey.ch'
#include 'ver_ver.ch'

#DEFINE _MenuNomer 1
#Define _MenuHead  2
#DEFINE _MenuProm  3
#DEFINE _MenuMess  4
#DEFINE _MenuBlock 5
#DEFINE _MenuTop   6
#DEFINE _MenuLeft  7
#DEFINE _MenuEsc   8
#DEFINE _MenuRec   9

#define NTRIM(n)		( LTrim(Str(n)) )

STATIC aMenuGlobal := {}
STATIC cKod := ""

PROCEDURE CreaMenu(aBase,bAddMenu)
  LOCAL nOldSel := SELECT()
  LOCAL nProces
  LOCAL nI, cType, nJ, bForMenu := {||.T./*UserDostyp()*/}

  PRIVATE aUserMenu := {}
  IF  TYPE("aGlobVars")=="U".OR.TYPE("aGlobVars")=="UE".OR.TYPE("aGlobVars")=="UI"
      PUBLIC aGlobVars:=ARRAY(100)
  ENDIF

  IF(ValType(bAddmenu) = "B",,bAddMenu := {|| NIL })
  aMenuGlobal := {}

  aBase := IF(aBase==NIL, {'MENU','MENUHEAD'}, aBase)

  aMenuGlobal := {}

  IF(NetUse('MENU',     aBase[1], aBase[1]) .AND.;
     NetUse('MENUHEAD', aBase[2], aBase[2]) .AND.;
     NetUse('USERMENU', 'USERMENU', 'USERMENU') .AND. ;
     IF( FILE( _PRO_PATH+'List_Acc.DBF').AND.!EMPTY(_USER_MENU),;
        NetUse('List_Acc', _PRO_PATH+'List_Acc', , ,'DBFCDX') ,.T.)          ;
     )



    IF "12.01" $ _CURRENT_VER
       //Если есть отчеты (меню ручками не меняли) и нет услуг
       //то вставим услуги (временно, пока версия 12.02 не выйдет == titov

       IF GlobalTask=="05".AND.;
          Menu->(DBSEEK(PADL("03",10)+PADR("01",3))).AND.;
          !Menu->(DBSEEK(PADL("03",10)+PADR("11",3)))
          Menu->(AddReportForServiceInReal())
       ENDIF

       //для 8 пакета вставляем задолженности по НДС
       IF GlobalTask=="05".AND.;
          Menu->(DBSEEK(PADL("03",10)+PADR("01",3))).AND.;
          !Menu->(DBSEEK(PADL("03",10)+PADR("12",3)))
          Menu->(AddReportNDSInReal())
       ENDIF

       IF GlobalTask=="TV".AND.;
          Menu->(DBSEEK(PADL("099",10)+PADR("01",3))).AND.;
          !Menu->(DBSEEK(PADL("099",10)+PADR("08",3)))
          Menu->(AddReportNDSInTovar())
       ENDIF
    ENDIF


    IF SELECT('List_Acc') > 0
      List_Acc->( OrdSetFocus(0),;
      dbEval( {||AADD(aUserMenu, List_Acc->TYPE+List_Acc->MENU) },;
              {|| List_Acc->ARM  == GlobalTask .AND. ;
                  List_Acc->CODE == _USER_MENU .AND. ;
                  EMPTY(List_Acc->STATUS)           ;
              };
            ))
    ENDIF
    SELECT MENUHEAD

    IF FIELDPOS( 'MENUFOR' ) > 0 // Формирование меню по условию
      bForMenu := {||/*UserDostyp().AND.*/IF(EMPTY(ALLTRIM(MENUHEAD->MENUFOR)),.T.,EVAL(&(ALLTRIM(MENUHEAD->MENUFOR))) )}
    ENDIF

    PROCES  TO nProces PROMPT "Загpузка пpогpаммы" ROW 18 MAX LASTREC()
    DBEVAL( {|| AADD(aMenuGlobal,;
                ReadMenu(ALLTRIM(MENUHEAD->MENUNOMER,10),;
                         ALLTRIM(MENUHEAD->MENUHEAD),    ;
                         MENUHEAD->MENUTOP,              ;
                         MENUHEAD->MENULEFT,             ;
                         MENUHEAD->MENUESC               ;
                        )                                ;
                     ),                                  ;
                PROCES_Update(nProces)         },;
                bForMenu;
                 )
    MENUHEAD->(DBCLOSEAREA())
    MENU->(DBCLOSEAREA())
    PROCES END
    IF ( nI := ASCAN( aMenuGlobal, {|x| x[1] == cKod } ) ) <> 0
        IF GlobalTask == "11"
           AADD( aMenuGlobal[1][_MenuProm], STR(LEN(aMenuGlobal[1][_MenuProm])+1,2)+". Настройка " )
           AADD( aMenuGlobal[1][_MenuMess], "Настройка" )
           AADD( aMenuGlobal[1][_MenuBlock],"{||QMENU('07')}" )

           AADD( aMenuGlobal, { '07',"Настройка",{},{},{},7,7,NIL,NIL } )
           nI:=LEN(aMenuGlobal)
        ENDIF




      // настройка
      AADD( aMenuGlobal[nI][_MenuProm], STR(LEN(aMenuGlobal[nI][_MenuProm])+1,2)+". Техническая настpойка " )
      AADD( aMenuGlobal[nI][_MenuMess], "Техническая настpойка рабочей станции" )
      AADD( aMenuGlobal[nI][_MenuBlock],{||All_TEX()} )

/**********
      AADD( aMenuGlobal[nI][_MenuProm], STR(LEN(aMenuGlobal[nI][_MenuProm])+1,2)+". О программе " )
      AADD( aMenuGlobal[nI][_MenuMess], "Информация о Разработчике" )
      AADD( aMenuGlobal[nI][_MenuBlock],{||PrgTitul()} )
      IF FILE( LoadPath()+'Diler.DOC' )
        AADD( aMenuGlobal[nI][_MenuProm], STR(LEN(aMenuGlobal[nI][_MenuProm])+1,2)+". Список наших дилеров " )
        AADD( aMenuGlobal[nI][_MenuMess], "Информация о наших дилерах" )
        AADD( aMenuGlobal[nI][_MenuBlock],{||PrgDiler()} )
      ENDIF
*************/
    ENDIF
    EVAL(bAddMenu,aMenuGlobal)





    IF  MenuExchExpImp()
        AADD( aMenuGlobal[1][_MenuProm], STR(LEN(aMenuGlobal[1][_MenuProm])+1,2)+". Режимы пользователей " )
        AADD( aMenuGlobal[1][_MenuMess], "Режимы пользователей" )
    ENDIF

    SELECT USERMENU
    nJ := 0
    dbEVAL({||nJ++})
    IF nJ > 0
      nJ := LEN(aMenuGlobal[1][_MenuProm])
      AADD( aMenuGlobal[1][_MenuProm], STR(nJ+1,2)+". Программы пользователей " )
      AADD( aMenuGlobal[1][_MenuMess], "Вызов внешних программ пользователей" )
      AADD( aMenuGlobal[1][_MenuBlock],"{||QMENU('USERMENU')}" )
      nJ := LEN(aMenuGlobal)
      AADD( aMenuGlobal, { 'USERMENU',"Программы пользователей",{},{},{},7,7,NIL,NIL } )
      nJ := LEN(aMenuGlobal)
      dbEVAL( {|| AADD( aMenuGlobal[nJ][_MenuProm], STR(LEN(aMenuGlobal[nJ][_MenuProm])+1,2)+". "+PADR(ALLTRIM(FIELD->MENUPROMPT),25) ),;
                  AADD( aMenuGlobal[nJ][_MenuMess], ALLTRIM(FIELD->MENUMESSEG) ),;
                  AADD( aMenuGlobal[nJ][_MenuBlock],'{||CreateMyRun("'+ALLTRIM(FIELD->MENUBLOCK)+'")}') ;
              } )
    ENDIF
    USERMENU->(DBCLOSEAREA())

    IF Count_Lbl() > 1
      AADD( aMenuGlobal[1][_MenuProm], STR(LEN(aMenuGlobal[1][_MenuProm])+1,2)+". Смена предприятия " )
      AADD( aMenuGlobal[1][_MenuMess], "Смена предприятия" )
      AADD( aMenuGlobal[1][_MenuBlock],{||InitALL()} )
    ENDIF
    AADD( aMenuGlobal[1][_MenuProm], ;
          STR(LEN(aMenuGlobal[1][_MenuProm])+1,2)+". Конец сеанса работы " )
    AADD( aMenuGlobal[1][_MenuMess], "Конец сеанса работы и выход в ОС" )
    AADD( aMenuGlobal[1][_MenuBlock],;
          "{||YesOrNo({'Закончить работу?'},.T.)}" )

  ELSE

     Error_Use()
  ENDIF
  IF SELECT('List_Acc') > 0
    List_Acc->( dbCloseArea() )
  ENDIF


  SELECT(nOldSel)


RETURN

******
*Функция считывания Меню
*
*****
STATIC FUNCTION ReadMenu(cMenuNomer, cMenuHead, nMenuTop, nMenuLeft, cMenuEsc)
  PLOCAL aMenuProm := {}
  PLOCAL aMenuMess := {}
  PLOCAL aMenuBlock:= {}
  PLOCAL aMenuRec:= {}
  PLOCAL nOldSel   := SELECT()
  PLOCAL nI        := 1, nJ,nK
  PLOCAL bMenuEsc := IF(LEN(ALLTRIM(cMenuEsc))==0, NIL, &(cMenuEsc))
  PLOCAL aBlockSim := {}, cRunBlock,bForMenu:={||UserDostyp()}

  SELECT MENU
  SEEK PADL(cMenuNomer,10)
  IF FOUND()
    IF FIELDPOS( 'MENUFOR' ) > 0 // Формирование меню по условию
      bForMenu := {||UserDostyp().AND.IF(EMPTY(ALLTRIM(MENU->MENUFOR)),.T.,EVAL(&(ALLTRIM(MENU->MENUFOR))) )}
    ENDIF
    DBEVAL({||;
               cRunBlock := IF(LEN(ALLTRIM(MENU->MENUBLOCK))==0,'{|| ALERT("В данной версии; этот режим не поддерживается","  Ok  "), .F.}',ALLTRIM(MENU->MENUBLOCK)),;
               AADD( aMenuProm,  STR(nI,2)+". "+ALLTRIM(MENU->MENUPROMPT)+" " ),;
               AADD( aMenuMess,  ALLTRIM(MENU->MENUMESSEG) ),;
               AADD( aBlockSim,  ALLTRIM(MENU->MENUBLOCK) ), ;
               AADD( aMenuRec,   MENU->(RECNO())), ;
               AADD( aMenuBlock, cRunBlock),;
               nI++;
             },;
             bForMenu,;
               {|| PADL(cMenuNomer,10) == MENU->MENUNOMER } )

  ENDIF
  SELECT(nOldSel)
  IF LEN( aMenuGlobal ) == 0 .AND. ( nI := LEN( aBlockSim ) ) > 0
    nJ := AT( "(", aBlockSim[nI] )
    nK := AT( ")", aBlockSim[nI] )
    cKod := SUBSTR( aBlockSim[nI], nJ+1, nK-nJ-1 )
    IF ( nJ := AT( "'", cKod ) ) == 0
      nJ := AT( '"', cKod )
      nK := ATNUM( '"', cKod )
    ELSE
      nK := ATNUM( "'", cKod )
    ENDIF
    cKod := ALLTRIM( SUBSTR( cKod, nJ+1, nK-nJ-1 ) )
  ENDIF

RETURN ({cMenuNomer,;
         cMenuHead ,;
         aMenuProm ,;
         aMenuMess ,;
         aMenuBlock,;
         nMenuTop  ,;
         nMenuLeft ,;
         bMenuEsc  ,;
         aMenuRec;
         })


*****
*  Преобразуем блок кода из символьного вида
******
//STATIC FUNCTION BlockMakro(cBlock)
//RETURN &cBlock

********
* Функция поиска меню  в массиве
* <cMenuNomer> - номер меню
*
*******
FUNCTION QMenu(cMenuNomer,nRow,nCol)
  SLOCAL nI := 0,aBlock := {}, cStr
  SLOCAL bakHelp, cBlock
  SLOCAL  oErr

  IF cMenuNomer=='0'
   #ifndef __HARBOUR__
     ErrorSys()
   #Else
     hErrorSys()
   #endif
  ENDIF

 begin sequence

  nI := ASCAN(aMenuGlobal, {|aMenu| aMenu[_MenuNomer] == cMenuNomer})
  IF nI <> 0
    IF cMenuNomer=='0'
      #ifndef _DEBUG
      IF GlobalTask<>'CV'
#ifndef __PLATFORM__Linux
         ShowTime(1,MAXCOL()-8,,"n/w")
#endif
      ENDIF
      #endif
      // Поддержка PlugIns
      RunPlugIns("АРМ","ФОРМИРОВАНИЕ_МЕНЮ",aMenuGlobal)
    ENDIF

    WHILE .T.
      MainMnu(aMenuGlobal[nI][_MenuHead],   ;
              IF( ValType(nRow)=='N',nRow,aMenuGlobal[nI][_MenuTop]),    ;
              IF( ValType(nCol)=='N',nCol,aMenuGlobal[nI][_MenuLeft]),   ;
              aMenuGlobal[nI][_MenuProm],   ;
              aMenuGlobal[nI][_MenuMess],,,,;
              aMenuGlobal[nI][_MenuBlock],  ;
              aMenuGlobal[nI][_MenuEsc],;
              aMenuGlobal[nI][_MenuRec],;
              @aBlock;
              )
      IF aBlock != NIL
        IF ValType(aBlock[1]) = "C"
          cBlock := IF("HELP_" $ aBlock[1],;
                       (;
                        bakhelp := HELP_CODE,;
                        HELP_CODE := ALLTRIM(SUBSTR(aBlock[1],AT("HELP_",aBlock[1])+5)),;
                        ALLTRIM(SUBSTR(aBlock[1],1,AT("HELP_",aBlock[1])-1));
                        ),;
                       (;
                        bakHelp := NIL,;
                        cBlock := aBlock[1];
                        );
                       )
          cStr := UPPER(cBlock)
          IF  ALLTRIM(BEFORATNUM("QMENU",cStr,1)) == "{||" .AND. ALLTRIM(AFTERATNUM(")",AFTERATNUM("QMENU(",cStr,1),1)) = "}"
            cStr := ALLTRIM( BEFORATNUM(")",AFTERATNUM("QMENU(",cStr,1),1) )
            aBlock[2] := QMENU(SUBSTR(cStr,2,LEN(cStr)-2))
          ELSE
            aBlock[2] := EVAL(&(cBlock))
          ENDIF
          IF(bakHelp != NIL,HELP_CODE := bakHelp,NIL)
        ELSE
          aBlock[2] := EVAL(aBlock[1])
        ENDIF
      ELSE
        EXIT
      ENDIF
    ENDDO
    IF cMenuNomer=='0'
#ifndef __PLATFORM__Linux
       ShowTime()
#endif
    ENDIF
  ENDIF

recover using oErr
  if !empty(oErr)
    Alert('Error In QMenu !!! ' + oErr:Description)
  ENDIF
end sequence



RETURN (.F.)




***************
*Заставка " О программе "
*
**************

#define COL_OK IF(INST_COLOR,'W+/G','W+/N')

PROCEDURE PrgTitul()
  LOCAL aSetKey:=SAVESETKEY(),nKey
  PLOCAL nRow:=06, nCol:=14, nW := WSELECT(), cScr,cTitul:=""
  PLOCAL cLine1:='',nMax:=0, nCount:=0,cTitulNew:=''
  PLOCAL cLine2:='', lYesUpgrade, lCheck
  PLOCAL nVer := 1, nI:=0, cVer:="Версия 2.00"

SETKEY(K_ALT_E,{||InfoEnv()})
ScrTitul(MAXROW(),"Alt-E: Переменные среды")


  IF FILE( _CONFIG_INI() )
    cTitulNew := ALLTRIM(MEMOLINE( MEMOREAD( _CONFIG_INI() ), 100, 1))
    cVer      := ALLTRIM(MEMOLINE( MEMOREAD( _CONFIG_INI() ), 100, 2))
  ENDIF

  WSELECT( 0 )
  SETCOLOR( COL_GET )
  ShadowBox("", nRow, nCol-2, nRow+14+nI, nCol+50+3 )
  @ nRow+02, nCol+2 SAY PADC( IF(EMPTY(cTitulNew),"СИСТЕМА БУХГАЛТЕРСКОГО УЧЕТА 'БЭСТ-4'",cTitulNew), 50 )
  @ nRow+03, nCol+2 SAY PADC( cVer, 45 )
  If GlobalTask != 'KP'.AND.!EMPTY(cTitul)
     @ nRow+04, 18 SAY "Раздел : "
     @ nRow+04, 28 SAY MEMOLINE( cTitul, 36, 1 )
  EndIf
  @ nRow+05, 28 SAY MEMOLINE( cTitul, 36, 2 )

    @ nRow+10+nI, 34 SAY "    Ok!   " COLOR COL_OK
    @ nRow+10+nI, 44 SAY "▄"
    @ nRow+11+nI, 35 SAY "▀▀▀▀▀▀▀▀▀▀"

   While (nKey:=Inkey(.1))==0;EndDo
   If VALTYPE(bKey:=SetKey(nKey)) = "B"
      Eval(bKey, ProcName(1), ProcLine(1), "")
   EndIf

  RESTSCREEN(nRow-1,nCol-1-2,nRow+17, nCol+54+3, cScr)
  WSELECT( nW )
  RestSetKey(aSetKey)
RETURN

STATIC PROCEDURE PrgDiler()
  PLOCAL nRow:=06, nCol:=14, nW := WSELECT(), cScr,cTitul:=""
  WSELECT( 0 )
  cScr := SAVESCREEN(nRow-1,nCol-1,nRow+15, nCol+54)
  SETCOLOR( COL_GET )
  ShadowBox("", nRow, nCol, nRow+12, nCol+50 )
  Memoedit( MemoRead(LoadPath()+'Diler.DOC'), nRow+1,nCol+1,nRow+11, nCol+49, .F.,,200 )
  RESTSCREEN(nRow-1,nCol-1,nRow+15, nCol+54, cScr)
  WSELECT( nW )
RETURN

PROCEDURE CreateMyRun( cRun )
  PLOCAL aSet :=SaveSet(), cMemFile:=''
  PLOCAL  cOldPath := DIRNAME(), cOldDisk := DISKNAME()
  // Для Гриши
  IF AT( 'OTCH', UPPER(cRun) ) <> 0
   cMemFile := TEMPFILE( 'PRO\', 'MEM')
   SAVE TO (cMemFile) ALL
  ENDIF
  BS_RUN( cRun+" "+cMemFile )
  DISKCHANGE( cOldDisk )
  DIRCHANGE( cOldPath )

  IF !EMPTY( cMemFile ) ;    FERASE( cMemFile ) ;  ENDIF
  RestSet(aSet)
RETURN


// Определяет имя файла CONFIG.INI
// #TRANSLATE _CONFIG_INI() => NameConfigIni('')
FUNCTION NameConfigIni( cPath )
#ifdef KPM_EXE
  LOCAL aConfig := { 'KP' },i
#else
  LOCAL aConfig := { 'INI', 'KP', 'SR', 'ZR', 'AXS' },i
#endif

  i :=  ASCAN( aConfig, {|x| FILE( cPath+'CONFIG.'+x ) } )
  IF( i==0, i:=1, )
RETURN( cPath+'CONFIG.'+aConfig[i] )

STATIC FUNCTION UserDostyp()
  FIELD MENUNOMER, PROMPTNOME IN MENU
  MEMVAR aUserMenu
RETURN ( SELECT('List_Acc') <= 0 .OR. ASCAN( aUserMenu, MENUNOMER+PROMPTNOME)<>0 )

*
FUNCTION MenuExchExpImp()
    LOCAL aTask := {'00', '01','02','03','05','09','TV','14','06','TZ','SR','ZR'}
    LOCAL lRet:=.F.
    IF  ASCAN(aTask,{|x|GlobalTask==x})==0 //Если АРМ не входит в список
        RETURN .F.
    ENDIF
    IF  NetUse("LST",LoadPath()+"EXCHANGE\DTD_LIST")
        LST->(DBGOTOP())
        LST->(DBEVAL({||lRet:=.T.},{||GlobalTask==LST->USED_ARM.OR.LST->USED_ARM=="**"},{||!lRet}))
    ENDIF
RETURN lRet


#ifdef __HARBOUR__
STATIC PROCEDURE InfoEnv()
LOCAL aMenu:={}
LOCAL aHelp:={}


AADD(aMenu,'BEST_KEY    : '+GETENV('BEST_KEY'))
AADD(aHelp,'Тип электронного ключа защиты')
AADD(aMenu,'BEST_MOUSE  : '+GETENV('BEST_MOUSE'))
AADD(aHelp,'Отключение мыши')
AADD(aMenu,'BEST_NAME   : '+GETENV('BEST_NAME'))
AADD(aHelp,'Имя электронного ключа защиты')
AADD(aMenu,'BEST_NET    : '+GETENV('BEST_NET'))
AADD(aHelp,'Протоколы поиска электронного ключа защиты')
AADD(aMenu,'BEST_REPORT : '+GETENV('BEST_REPORT'))
AADD(aHelp,'Путь для сохранения отчетов')
AADD(aMenu,'BEST_RETRY  : '+GETENV('BEST_RETRY'))
AADD(aHelp,'Количество попыток поиска электронного ключа защиты')
AADD(aMenu,'BEST_WARNING: '+GETENV('BEST_WARNING'))
AADD(aHelp,'Отлючение предупреждения о демоверсии')
AADD(aMenu,'BEST5_ALTINS: '+GETENV('BEST5_ALTINS'))
AADD(aHelp,'Доступ к отладочной информации по Alt-Ins')
AADD(aMenu,'HB_GT       : '+GETENV('HB_GT'))
AADD(aHelp,'Тип используемого терминала')
AADD(aMenu,'TEMP        : '+GETENV('TEMP'))
AADD(aHelp,'Путь для формирования временных файлов')
AADD(aMenu,'TERMINAL    : '+GETENV('TERMINAL'))
AADD(aHelp,'Имя терминального рабочего места')
MainMnu(" Переменные среды ",12,14,aMenu,aHelp)

RETURN
#endif


STATIC PROCEDURE AddReportForServiceInReal()
altd()
IF DBSEEK(PADL("03",10)+PADR("10",3))
   RecLock()
   REPLACE PROMPTNOME WITH "11"
   UNLOCK
ENDIF
AddRec()
REPLACE MenuNomer WITH PADL("03",10),PROMPTNOME WITH "10",;
MenuPrompt WITH "Ведомость выполненных работ,услуг",;
MenuMesSeg WITH "Отчеты по услугам и выполненным работам",;
MenuBlock WITH "{|| RepShFact(11)}"
UNLOCK
RETURN


STATIC PROCEDURE AddReportNDSInReal()
altd()
IF DBSEEK(PADL("03",10)+PADR("11",3))
   RecLock()
   REPLACE PROMPTNOME WITH "12"
   UNLOCK
ENDIF
IF DBSEEK(PADL("03",10)+PADR("10",3))
   RecLock()
   REPLACE PROMPTNOME WITH "11"
   UNLOCK
ENDIF

AddRec()
REPLACE MenuNomer WITH PADL("03",10),PROMPTNOME WITH "10",;
MenuPrompt WITH "Дебиторская задолженность по НДС",;
MenuMesseg WITH "Акт инвентаризации деб.задолженности,в связи с изменением исчисления НДС",;
MenuBlock WITH "{|| RepShFact(13)}"
UNLOCK
RETURN



STATIC PROCEDURE AddReportNDSInTovar()
altd()
IF DBSEEK(PADL("099",10)+PADR("07",3))
   RecLock()
   REPLACE PROMPTNOME WITH "08"
   UNLOCK
ENDIF

AddRec()
REPLACE MenuNomer WITH PADL("099",10),PROMPTNOME WITH "07",;
MenuPrompt WITH "Кредиторская задолженность по НДС",;
MenuMesseg WITH "Акт инвентаризации кред.задолженности,в связи с изменением исчисления НДС",;
MenuBlock WITH "{|| RepShFact(14)}"
UNLOCK
RETURN



