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

#include "inkey.ch"
#include "s_public.ch"
#include "ver_ver.ch"

#include "dbinfo.ch"
#include "inkey.ch"

#include "set.ch"
#include "ads.ch"


REQUEST HB_CODEPAGE_RU866, HB_LANG_RU866
#ifdef __PLATFORM__Linux
REQUEST HB_CODEPAGE_RUKOI8
#endif

REQUEST DBFCDX,DBFFPT
//REQUEST _ADS

#define _DEFAULT_PAROL '~`~`~`~`~`'

#define DOS_SCREEN 1
#define DOS_ROW    2
#define DOS_COL    3
#define DOS_CURSOR 4
#define DOS_BLINK  5
#define DOS_COUNT  5

STATIC saSaveDos[ DOS_COUNT ]
STATIC aInitLogin
// Информация об АРМвх
STATIC nStaticArm := 0, lYesUpgrade := .T.,lCheck := .F.
//Static nRainTime := 0

ANNOUNCE MyInit

INIT PROCEDURE dosSave( cAllNast, cPar2, cPar3, cPar4, cPar5 )       // пакетный режим victor
   LOCAL iSalar,cLine:='',cChek:='', cDbfPath, aDir
   LOCAL YNSE,NNSE,SNSE,cRetry,nRetry := 1,iRetry
   LOCAL nWidth,nHeight
   PLOCAL cExeName := UPPER(EXENAME())
   PLOCAL lInit := .F.,;
         aTmp, aLogin, cParol := '', aError := {},;
         nRow := MIN( ROW()+1, MAXROW() ) ,nCol:= MIN( COL(), MAXCOL() ),;
         lNoLabel := .T.
   PLOCAL cEnv, aProPath, i,cMouse
   PLOCAL aAllArm := GetAllArm()
   PUBLIC cProPath := 'PRO\', cExePath := 'BIN\'
   PUBLIC c_My_Code  := _DEFAULT_PAROL       // пароль доступа к базам

   Public lValidEdit := '0'
   Public cValidPath
   #ifndef __PLATFORM__Linux
    Win_DisableExit()
   #endif
   SETBLINK(.F.)

	hb_SetCodepage( "RU866" )
	Hb_LangSelect('RU866')
        RddSetDefault("DBFCDX")

//        rddRegister( "ADS", 1 )
//        AdsSetServerType ( ADS_REMOTE_SERVER )
//        AdsSetFileType(ADS_CDX)
//        AdsLocking(  .f.   )
//        AdsRightsCheck( .t. )
//        AdsSetCharType(2) // OEM

        //
        // Основной ( рабочий ) RDD определяется в LoadLabel()
        // в зависимости от наличия файла 'ads.ads' в корне базы
        //


	SET( _SET_EVENTMASK, INKEY_KEYBOARD+INKEY_LDOWN+INKEY_LUP+INKEY_RDOWN+INKEY_RUP+INKEY_MWHEEL )
	SET( _SET_AUTOPEN, .F. )

        SET EPOCH TO 1920  // до этой даты 20.., после этого 19..
#ifdef __PLATFORM__Linux
       SET(_SET_DIRCASE,1)
#endif
	SET(_SET_FILECASE,1) // Lower !!!

#ifdef __PLATFORM__Linux
        hb_setkeycp( "RUKOI8","RU866" )
#else
        IF HB_GT_VERSION()$"GTWVT"
//        WVT_SetCodePage(255)
          WVT_SetIcon(1717)
          WVT_DefColorB('BG',WVT_RGB(0x0,0x99,0x99)) //подкрутим
          WVT_DefColor('G',WVT_RGB(0x00,0xFF,0x00)) //подкрутим
          WVT_DefColorB('B',WVT_RGB(0x00,0x00,0x99)) //подкрутим
        ELSE
           GTInitClipboard() //gt_win
        ENDIF
#endif

       cMouse := Upper(GETENV('BEST_MOUSE'))
       IF !EMPTY(cMouse).AND.cMouse[1]="F"
          MSetCursor(.F.)
       ENDIF

//        #ifndef __PLATFORM__Linux
//        #ifndef _DEBUG
//        HB_IdleAdd( {||MouseHandler()} )
//         HB_IdleAdd( {||MyShowTime()})
//        #endif
//        #endif


#ifdef __PLATFORM__Linux
   nStaticArm := ASCAN( aAllArm, {|x| '/'+Upper(x[2]) $ Upper(cExeName) } )
#else
   nStaticArm := ASCAN( aAllArm, {|x| '\'+Upper(x[2])+'.EXE' $ Upper(cExeName) } )
#endif


   IF nStaticArm>0
      lInit     :=  aAllArm[nStaticArm][5] // Является ли модуль настройкой
   ENDIF
   cProPath  :=  aAllArm[nStaticArm][4] // путь к PRO


   IF ValType(cProPath) == 'A'
     i := ASCAN( cProPath, {|x| !EMPTY(DIRECTORY(x+'\*.*')) } )
     IF i > 0 ; cProPath := cProPath[i]
     ELSE     ; cProPath := ''
     ENDIF
   ENDIF


   IF !FILE(cProPath+'NUMBER.PRO').AND."SP.EXE"$UPPER(EXENAME())
      IF FILE("S_PRO\NUMBER.PRO")
         cProPath:="S_PRO\"
      ELSEIF FILE("Z_PRO\NUMBER.PRO")
         cProPath:="Z_PRO\"
      ELSEIF FILE("KPM_PRO\NUMBER.PRO")
         cProPath:="KPM_PRO\"
      ELSEIF FILE("BK_PRO\NUMBER.PRO")
         cProPath:="BK_PRO\"
      ENDIF
   ENDIF



   IF  !FILE( 'PRO.INI' ) .AND. !FILE( cProPath+'NUMBER.PRO' )
       ALERT( "Нарушена структура каталогов БЭСТ-4", { ' Завершить '} )
       QUIT
   ENDIF

   IF( ValType( cAllNast ) == 'C', cAllNast := UPPER(cAllNast), )

   SAVE SCREEN TO saSaveDos[ DOS_SCREEN ]
   saSaveDos[ DOS_ROW ]   := ROW()
   saSaveDos[ DOS_COL ]   := COL()
   saSaveDos[ DOS_CURSOR ]:= SETCURSOR()
//   saSaveDos[ DOS_BLINK ] := SETBLINK()
   SETCURSOR(0)
   @ 00,00,MAXROW(),MAXCOL() BOX "░░░░░░░░░" COLOR "W/B"
   SAYSCREEN( '*** Загрузка ***', 10,30)


#ifdef _DEBUG
         @ 09, 10 SAY PADC(' ',50) COLOR 'W+/R'
         @ 10, 10 SAY PADC('Win32 GT'+HB_GT_VERSION()+' '+DTOC(STOD(__DATE__))+' '+__TIME__,50) COLOR 'W+/R'
         @ 11, 10 SAY SPACE(50) COLOR 'W+/R'
         @ 12, 10 SAY PADC('Только для служебного использования !',50) COLOR 'W+/R'
         @ 13, 10 SAY SPACE(50) COLOR 'W+/R'
  INKEY(1)
#endif
   REQUEST DESCEND
   // Узнаем где Программы
   i := AT( UPPER(aAllArm[nStaticArm][2])+'.EXE' , UPPER(cExeName) )
   cExePath := LEFT(cExeName,i-1)
   IF (i := AT(UPPER(DIRNAME()), UPPER(cExePath) )) > 0
     // сделаем короткий путь если получится
     IF( DIRNAME() == '\', i--,  )
     cExePath := SUBSTR( cExePath, i+LEN(DIRNAME())+1 )
   ENDIF

   SetPublic()

   IF (i:= UPPER(ALLTRIM(MEMOLINE(MEMOREAD(_CONFIG_INI('')),100,9)))) $ '4МО'
     _VERSIA := i
   ENDIF
   i:= 0

   IF FILE( 'PRO.INI' ) //  Узнаем где находится каталог PRO\
     aProPath := STR_TO_ARRAY( ALLTRIM(MEMOREAD('PRO.INI')) )
     @ 00,00,MAXROW(),MAXCOL() BOX "░░░░░░░░░" COLOR "W/B"

     IF LEN(aProPath) == 1
       i := 1
     ELSE
       i := BoxMenu( '', 10, 20, aProPath )
       IF i == 0
         QUIT
       ENDIF
     ENDIF
     cProPath := ALLTRIM(aProPath[i])
     IF  !FILE( cProPath+'NUMBER.PRO' )
        ALERT( "В pro.ini неправильно указан путь!", { ' Завершить '} )
     QUIT
   ENDIF
   ENDIF



    lYesUpgrade := .T. 

   // создадим TMP каталог в директории PRO\

   aDir := DIRECTORY( cProPath+OS_FILE_MASK, 'D')
   IF ASCAN( aDir, {|x| ALLTRIM(UPPER(x[1]))=='TMP'} ) == 0
       IF DIRMAKE(LOWER( cProPath+"TMP" )) <> 0
         SayError( 'Нет директории: '+cProPath+"TMP\" )
         QUIT
       ENDIF
   ENDIF

   IF !EMPTY( aError )
     SayError( aError )
     QUIT
   ENDIF


#ifndef __PLATFORM__Linux
#ifndef _DEBUG

   @ 00,00,MAXROW(),MAXCOL() BOX "░░░░░░░░░" COLOR "W/B"
#endif
#endif


   IF !FILE( cProPath+'NUMBER.PRO' )
       SayError( {'Нет директории: '+_PRO_PATH,'или файла: '+_PRO_PATH+'NUMBER.PRO'} )
       QUIT
   ENDIF

  IF !lInit .AND.  !FILE( _PRO_PATH+'LABEL.PRO' )
     SayError( 'Выполните начальную настройку системы!' )
     QUIT
   ENDIF

   IF !lInit .AND.  !FILE( _PRO_PATH+'STATION.PRO' )
     SayError( 'Выполните техническую настройку рабочей станции!' )
     QUIT
   ENDIF
  IF lInit.AND.cAllNast='TEST'
     IF EMPTY(cPar2)
        cPar2:=""
     ENDIF
     IF RIGHT(cPar2,1)!="\"
        cPar2+="\"
     ENDIF
     LoadPath(cPar2)
     IF !FILE(LoadPath()+"ini/global_v.dbf")
        IF EMPTY(cPar2)
           SayError("Укажите вторым параметром путь к тестовой базе!")
        ELSE
           SayError("Второй параметр (путь к тестовой базе)"+CHR(13)+CHR(10)+"указан неправильно!")
        ENDIF
        QUIT
     ENDIF
  ELSEIF  AT( 'UPGRADE.EXE', cExeName ) == 0  .AND. ;
       AT( 'DBFTODBF.EXE', cExeName ) == 0  .AND. ;
       AT( 'SP.EXE', cExeName ) == 0  .AND. ;
       FILE( _PRO_PATH+'STATION.PRO' )      .AND. ;
        !(ValType(cAllNast)=='C'.AND. lInit.AND.cAllNast<>'DENOM';
            .AND.cAllNast<>'SORTPART' .AND.;
                 cAllNast<>'TEST' )
     _MENU_YES := Glob_Vars( { 'MENU_YES' }, .F., _PRO_PATH+'INIT_LBL', .T. )
     IF  EMPTY(_MENU_YES)  .OR.           ;
          ValType( _MENU_YES[1] ) <> 'L'  ; _MENU_YES := .T.
     ELSE                                 ; _MENU_YES := _MENU_YES[1]
     ENDIF
     cAllNast:=IF(VALTYPE(cAllNast)='C',cAllNast,'')           // пакетный режим victor 2
     cAllNast +=IF(VALTYPE(cPar2)='C',cPar2,'')+IF(VALTYPE(cPar3)='C',cPar3,'')+IF(VALTYPE(cPar4)='C',cPar4,'')+IF(VALTYPE(cPar5)='C',cPar5,'')
     LoadLabel( IsLegal(), aLogin, ,.T.,,GetGlobalParam(cAllNast,'/L') ) // Загрузка карточки предприятия
     aInitLogin:= aLogin
     lNoLabel := .F.
  ENDIF


   IF !(lInit.AND.!EMPTY(cAllNast))
      // Поддержка PLUG INS
//      CompilePlugIns() - в этой версии нет предкомпиляции == titov
      RunPlugIns("АРМ","ВХОД")
   ENDIF

   lInit := .T.




   GlobalTmpPath := B4_GetTempPath()
   if Right(GlobalTmpPath,1) != '\'
      GlobalTmpPath += '\'
   endif

   // Для ADS временные файлы на сервере
//   if IsAds()
//      GlobalTmpPath := LoadPath()+'TMP\'
//   endif







#ifndef _DEBUG
   SETKEY( K_ALT_C, {|| __QUIT() } )
   // Проверка только при наличие базы
   IF FILE( LoadPath()+'BASE_ALL.DBF' ) .AND. ;
      AT( 'UPGRADE.EXE', cExeName ) == 0.AND.;
      AT( 'SP.EXE', cExeName ) == 0

     IF !(ValType(cAllNast)=='C'.AND.UPPER(cAllNast)=='UPGRADE' )
       // Выясним можно входить в БЭСТ
       IF BestActive( '1', LoadPath() ) <> '0'
          SayAndWait( {'Идет индексация баз данных на другой рабочей станции'} )
          QUIT
       ENDIF
     ENDIF

     IF !EMPTY(aAllArm[nStaticArm][6])
       IF BestActive( '1', LoadPath()+aAllArm[nStaticArm][6] ) <> '0'
         SayAndWait( {'Данный АРМ временно недоступен!'} )
         QUIT
       ENDIF
     ENDIF

     IF AT("INIT.EXE",Upper(ExeName())) == 0.and.FILE(LoadPath()+'BASES_FP.DBF').AND.NetUse('BASES_FP',LoadPath()+'BASES_FP' )
       IF LastRec() > 0
         SayAndWait( {'Вам необходимо выполнить индексацию баз данных',;
                      'из модуля "Настройка комплекса"'} )
         QUIT
       ENDIF
       dbCloseArea()
     ENDIF

     // Сравним номер версии БЭСТа  в DBASE и в корне

     IF !SverkaVersion( _CURRENT_VER, '', LoadPath() )
       SayAndWait( { 'Нужно выполнить UPGRADE  базы в директории:',;
                     LoadPath() } )
       QUIT
     ENDIF

   ENDIF
#else
   SETKEY( K_ALT_C, {|| NIL } )
#endif

RETURN

EXIT PROCEDURE PlugInsExit()
   // Поддержка PLUG INS
   RunPlugIns("АРМ","ВЫХОД")
RETURN


EXIT PROCEDURE dosRestore()
LOCAL aAllArm := GetAllArm()

LOCAL nExit := ERRORLEVEL(), a[3],cExit:='',;
         cParol := CHR(12)+CHR(45)+CHR(76)+CHR(06)+CHR(99)+CHR(123)+CHR(212)+CHR(204)+CHR(52)+CHR(77)

LOCAL aTemp
   IF nExit > 1
     ERRORLEVEL(0)
   ENDIF


a[1] :=;
{165,224,232,143,24,231,120,211,78,136,48,35,52,235,175,89,169,191,248,32,178,247,201,179,23,67,9,4,90,180,80,;
169,113,116,145,189,31,13,61,249,29,234,60,241,240,234,216,34,8,125,229,135,22,144,77,235,19,73,229,147,218,49,119,;
63,162,94,228,133,64,174,133,168,97,228,156,147,174,130,38,88,129,131,7,70,86,226,35,52,55,217,231,92,194,156,38,;
112,72,201,237,61,236,31,128,73,62,74,225,96,224,238,178,79,100,158,139,27,231,101,12,29,110,49,113,1,210,32,64,;
75,235,4}
a[2] :=;
{160,161,47,199,26,230,116,94,68,13,54,35,61,230,168,29,224,178,122,41,50,189,201,191,94,12,3,65,223,250,213,;
169,49,244,68,25,84,66,188,242,92,167,50,41,214,228,156,170,64,56,224,129,88,80,70,168,86,68,164,220,83,51,114,;
127,224,153,227,12,238,130,174,104,162,198,154,31,175,131,107,80,135,3,47,57,98,145,237,47,119,92,194,252,108,148,52,;
195,211,76,98,168,117,135,66,92,135,250,70,194}
a[3] :=;
{168,160,100,66,87,236,244,81,15,131,56,37,116,110,237,152,174,254,57,101,178,255,195,253,209,208,47,15,16,118,223,;
168,123,116,222,125,90,79,57,250,87,230,50,74,228,205,151,34,9,60,173,137,94,208,65,235,19,5,161,92,88,241,89,;
16,130,153,99,166,206,160,143,232,45,228,219,147,129,190,87,106,74,24,76,1,88,45,239,60,165,192,92,251,108,137,48,;
202,203,80,122,176,119,135}
#ifndef __PLATFORM__Linux
 Win_DisableExit(.t.)
#endif

dbCloseAll()
TempFileDelete() //общий механизм зачистки темпфайлов
Finish()
BestActive( '3', LoadPath() ) // Завершение сеанса работы с БЭСТОМ
IF !EMPTY(nStaticArm).AND.!EMPTY(aAllArm[nStaticArm][6])
  BestActive( '3', LoadPath()+aAllArm[nStaticArm][6] )
ENDIF
ctexit()
FRUnLoad() //выгрузка FastReport Dll

//     if IsAds().and.IsAdsConnected()
//        ADSDisconnect()
//     endif


IF !HB_GT_VERSION()$"GTWVT"
   RESTORE SCREEN FROM saSaveDos[ DOS_SCREEN ]
   SETPOS( saSaveDos[ DOS_ROW ], saSaveDos[ DOS_COL ] )
   SETCURSOR( saSaveDos[ DOS_CURSOR ] )
//   SETBLINK(saSaveDos[ DOS_BLINK ])
ENDIF


   IF     nExit == 2
     nExit := 1
   ELSEIF nExit == 7
     nExit := 2
   ELSEIF nExit <> 3
     nExit := 0
   ENDIF
   IF nExit <> 0
     AEVAL( a[nExit], {|x| cExit+=CHR(x) } )
     ALERT(CRYPT( cExit, cParol ))
   ENDIF

RETURN


* Смена предприятия и его настройки
FUNCTION InitAll(lShop)
  PLOCAL lRez := .T., aLogin,cParol:=''
  dbCloseAll()
  BestActive( '3', LoadPath() )
  LoadLabel( IsLegal(), aInitLogin,,,lShop) // Загрузка карточки предприятия
  lNewFirm := .T.
  IF TYPE('LBLCode')='C'
     m->LBLCode:=m->LBL_Code
  ENDIF
  @ 00,00 SAY PADR(M->LBL_NAME,25) COLOR 'G+/N'
RETURN( lRez )
// DIM88
//--------------------------------------------------------------------------//
                    PROCEDURE InitStation()
//--------------------------------------------------------------------------//
// Инициализация кода станции требует актуальной записи в STATION
// и инициализация пути к отчетам

  LOCAL nRec,nNoper := 0, cEnv

Local GlobLen := Len(_GLOB_SET_DEF)

    IF ValType( Global_Set ) != 'A'
       Global_Set := _GLOB_SET_DEF
    ELSEIF LEN(Global_set) != GlobLen
           Global_Set := ASIZE( Global_Set, GlobLen )
    ENDIF
    IF STATION->NNOPER = 0
      nRec := RECNO()
      dbGoTo(1)
      WHILE !RecLock(); ENDDO
      DBEVAL({|| nNoper := MAX(STATION->NNOPER,nNoper) })
      dbGoTo(nRec)
      IF RecLock()
        STATION->NNOPER := nNoper+1
        dbUnLock()
      ENDIF
      dbGoTo(1)
      dbUnLock()
      dbGoTo(nRec)
    ENDIF
    _USER_STATION := STATION->NNOPER





     _PATH_REPORT:=GETENV('BEST_REPORT')
     IF EMPTY(_PATH_REPORT)
       _PATH_REPORT:=STRTRAN(UPPER(DISKNAME())+':'+DIRNAME()+'\REPORT\Report.TXT','\\','\')
     ENDIF

          IF LEFT(Station->NUM_DISK,3)!="..."
        IF FIELDNUM("PALETTE")>0
           InitFontPalette(Station->Palette,Station->FontName,Station->FontWidth,Station->FontHeight)
        ELSE
           Alert("Структура PRO\Station.dbf не соответствует текущей версии!")
           QUIT
        ENDIF
     ENDIF
RETURN
//--------------------------------------------------------------------------//
                            FUNCTION GetAllArm(cGlobalTask,cExeName)
//--------------------------------------------------------------------------//
// Возвращает массив информации о АРМ'ах
// Если cGlobalTask определен, то информация по конкретному АРМ'у
#ifdef __PLATFORM__Linux
LOCAL aAllArm := ;
   { ; //   Наименование АРМа        Exe имя     TASK  PRO_PATH  lInit, Path_Semafor PlugIns     lDescribe - включать в описание БД
     { 'АРМ главного бухгалтера',    'MAIN',     '00', 'PRO/',     .F., 'MAIN/'      ,"ГЛАВ.БУХ",.T.}, ;
     { 'Расчетные и валютные счета', 'BANK',     '01', 'PRO/',     .F., 'BANK/'      ,"БАНК"  ,.T.}, ;
     { 'Касса. Подотчетные лица',    'CASH',     '02', 'PRO/',     .F., 'CASH/'      ,"КАССА" ,.T.}, ;
     { 'Учет заpаботной платы',      'MONEY',    '07', 'PRO/',     .F., 'MONEY/'     ,"СТАР.ЗАРПЛАТА" ,.F.}, ;
     { 'Учет заpаботной платы',      'SALARY',   '14', 'PRO/',     .F., 'SALARY/'    ,"ЗАРПЛАТА",.T.}, ;
     { 'Учет основных средств и НМА','OC',       '06', 'PRO/',     .F., 'OC/'        ,"ОСНОВНЫЕ_СР." ,.T.}, ;
     { 'Формирование отчетов',       'REPORT',   'RP', 'PRO/',     .F., ''           ,"ОТЧЕТЫ" ,.F.}, ;
     { 'Конструктор отчетов',        'GEN_REP',  'GE', 'PRO/',     .F., ''           ,"КОНСТРУКТОР" ,.F.}, ;
     { 'Товары. Готовая продукция',  'SCLAD',    '03', 'PRO/',     .F., 'SCLAD/'     ,"СКЛАД"  ,.T.}, ;
     { 'Проверка резерва',           'REZERV',   '03', 'PRO/',     .F., 'SCLAD/'     ,"РЕЗЕРВ",.F.}, ;
     { 'Упpавление пpодажами',       'REAL',     '05', {'PRO/','S_PRO/','Z_PRO/'},     .F., 'REAL/'      ,"УПР.ПРОДАЖАМИ" ,.T.}, ;
     { 'Учет материалов и МБП',      'ZAPAS',    '09', 'PRO/',     .F., 'ZAPAS/'     ,"ЗАПАСЫ",.T.}, ;
     { 'Торговый зал',               'TZ',       'TZ', {'PRO/','S_PRO/','Z_PRO/'},     .F., 'TZ/'        ,"ТОРГОВЫЙ_ЗАЛ" ,.T.}, ;
     { 'Учет закупок',               'TOVAR',    'TV', {'PRO/','S_PRO/','Z_PRO/'},     .F., 'TOVAR/'     ,"УЧЕТ_ЗАКУПОК" ,.T.}, ;
     { 'Анализ движения товаров',    'ANALIZ',   '11', 'PRO/',     .F., ''           ,"АНАЛИЗ" ,.F.}, ;
     { 'АРМ Налоговые накладные',    'PODATOK',  'PD', 'PRO/',     .F., 'PODATOK/'   ,"НАЛОГ.НАКЛАДНЫЕ",.F.}, ;
     { 'Настройка комплекса',        'INIT',     '10', 'PRO/',     .T., ''           ,"НАСТРОЙКА" ,.F.}, ;
     { 'БЭСТ - Магазин',             'SHOP',     'MG', 'PRO/',     .F., 'SHOP/'      ,"МАГАЗИН" ,.F.}, ;
     { 'Перенос данных',             'UPGRADE',  '10', {'S_PRO/','Z_PRO/','KPM_PRO/' ,"UPGRADE"},  .T., '' ,.F.}, ;
     { 'Удаленный склад',            'SCLADR',   'SR', 'S_PRO/',   .T., ''           ,"УДАЛ.СКЛАД",.F.}, ;
     { 'Удаленные запасы',           'ZAPASR',   'ZR', 'Z_PRO/',   .T., ''           ,"УДАЛ.ЗАПАСЫ",.F.}, ;
     { 'Сводный баланс',             'BK',       'BK', 'BK_PRO/',  .T., ''           ,"БАЛАНС",.F.}, ;
     { 'КПМ'                ,        'KPM'     , 'KP', 'KPM_PRO/', .F., ''           ,"КПМ",.F.}, ;
     { 'Кассовый модуль'    ,        'CR'     ,  'CR', 'CR_PRO/', .F., ''           ,"КМ",.F.}, ;
     { 'Налогоплательщик',           'DBFTODBF', 'DD', 'PRO/',     .T., ''           ,"НАЛОГОПЛАТЕЛЬЩИК",.F.},;
     { 'Модуль обмена данными',      'EXCHANGE', 'EX', {'PRO/','S_PRO/','Z_PRO/'},     .F., ''           ,"ОБМЕН_ДАННЫМИ",.F.},;
     { 'Модуль Расчеты. Договоры.',  'CONTRACT', 'CN', {'PRO/','S_PRO/','Z_PRO/'},     .F., 'CONTRACT/',"РАСЧЕТЫ.ДОГОВОРЫ",.T.},;
     { 'Экспорт налоговых форм.'  ,  'TAXI'    , 'TX', {'PRO/','S_PRO/','Z_PRO/'},     .F., 'TAXI/',"ЭКСПОРТ_ФОРМ",.F.},;
     { 'Ключи',                      'KEY_NOM',  'KK', 'PRO/',     .T., ''           ,"НАЛОГОПЛАТЕЛЬЩИК",.F.},;
     { 'Планирование закупок',       'PLAN'    , 'IP', 'PRO/',     .F., 'PLAN/'      ,"ПЛАНИРОВАНИЕ ЗАКУПОК",.T.}, ;
     { 'Мобильная торговля',         'MOBILE'  , 'DS', 'PRO/',     .F., 'MOBILE/'      ,"МОБИЛЬНАЯ ТОРГОВЛЯ",.T.}, ;
     { 'Установка сервис-паков',     'SP',       'SP', 'PRO/',     .T., ''     ,"СЕРВИСПАК"}, ;
     { 'Пример',                     'SAMPLE',   'SA', 'PRO/',     .F., ''     ,"ПРИМЕР"} ;
   }
#else
LOCAL aAllArm := ;
   { ; //   Наименование АРМа        Exe имя     TASK  PRO_PATH  lInit, Path_Semafor PlugIns           lDescribe - включать в описание БД
     { 'АРМ главного бухгалтера',    'MAIN',     '00', 'PRO\',     .F., 'MAIN\'      ,"ГЛАВ.БУХ",.T.}, ;
     { 'Расчетные и валютные счета', 'BANK',     '01', 'PRO\',     .F., 'BANK\'      ,"БАНК"  ,.T.}, ;
     { 'Касса. Подотчетные лица',    'CASH',     '02', 'PRO\',     .F., 'CASH\'      ,"КАССА" ,.T.}, ;
     { 'Учет заpаботной платы',      'MONEY',    '07', 'PRO\',     .F., 'MONEY\'     ,"СТАР.ЗАРПЛАТА" ,.F.}, ;
     { 'Учет заpаботной платы',      'SALARY',   '14', 'PRO\',     .F., 'SALARY\'    ,"ЗАРПЛАТА",.T.}, ;
     { 'Учет основных средств и НМА','OC',       '06', 'PRO\',     .F., 'OC\'        ,"ОСНОВНЫЕ_СР." ,.F.}, ;
     { 'Формирование отчетов',       'REPORT',   'RP', 'PRO\',     .F., ''           ,"ОТЧЕТЫ" ,.F.}, ;
     { 'Конструктор отчетов',        'GEN_REP',  'GE', 'PRO\',     .F., ''           ,"КОНСТРУКТОР" ,.F.}, ;
     { 'Товары. Готовая продукция',  'SCLAD',    '03', 'PRO\',     .F., 'SCLAD\'     ,"СКЛАД"  ,.T.}, ;
     { 'Проверка резерва',           'REZERV',   '03', 'PRO\',     .F., 'SCLAD\'     ,"РЕЗЕРВ",.F.}, ;
     { 'Упpавление пpодажами',       'REAL',     '05', {'PRO\','S_PRO\','Z_PRO\'},     .F., 'REAL\'      ,"УПР.ПРОДАЖАМИ" ,.T.}, ;
     { 'Учет материалов и МБП',      'ZAPAS',    '09', 'PRO\',     .F., 'ZAPAS\'     ,"ЗАПАСЫ",.T.}, ;
     { 'Торговый зал',               'TZ',       'TZ', {'PRO\','S_PRO\','Z_PRO\'},     .F., 'TZ\'        ,"ТОРГОВЫЙ_ЗАЛ" ,.T.}, ;
     { 'Учет закупок',               'TOVAR',    'TV', {'PRO\','S_PRO\','Z_PRO\'},     .F., 'TOVAR\'     ,"УЧЕТ_ЗАКУПОК" ,.T.}, ;
     { 'Анализ движения товаров',    'ANALIZ',   '11', 'PRO\',     .F., ''           ,"АНАЛИЗ" ,.F.}, ;
     { 'АРМ Налоговые накладные',    'PODATOK',  'PD', 'PRO\',     .F., 'PODATOK\'   ,"НАЛОГ.НАКЛАДНЫЕ",.F.}, ;
     { 'Настройка комплекса',        'INIT',     '10', 'PRO\',     .T., ''           ,"НАСТРОЙКА" ,.F.}, ;
     { 'БЭСТ - Магазин',             'SHOP',     'MG', 'PRO\',     .F., 'SHOP\'      ,"МАГАЗИН" ,.F.}, ;
     { 'Перенос данных',             'UPGRADE',  '10', {'S_PRO\','Z_PRO\','KPM_PRO\' ,"UPGRADE"},  .T., '' ,.F.}, ;
     { 'Удаленный склад',            'SCLADR',   'SR', 'S_PRO\',   .T., ''           ,"УДАЛ.СКЛАД",.F.}, ;
     { 'Удаленные запасы',           'ZAPASR',   'ZR', 'Z_PRO\',   .T., ''           ,"УДАЛ.ЗАПАСЫ",.F.}, ;
     { 'Сводный баланс',             'BK',       'BK', 'BK_PRO\',  .T., ''           ,"БАЛАНС",.F.}, ;
     { 'КПМ'                ,        'KPM'     , 'KP', 'KPM_PRO\', .F., ''           ,"КПМ",.F.}, ;
     { 'Кассовый модуль'    ,        'CR'     ,  'CR', 'CR_PRO\', .F., ''           ,"КМ",.F.}, ;
     { 'Налогоплательщик',           'DBFTODBF', 'DD', 'PRO\',     .T., ''           ,"НАЛОГОПЛАТЕЛЬЩИК",.F.},;
     { 'Модуль обмена данными',      'EXCHANGE', 'EX', {'PRO\','S_PRO\','Z_PRO\'},     .F., ''           ,"ОБМЕН_ДАННЫМИ",.F.},;
     { 'Модуль Расчеты. Договоры.',  'CONTRACT', 'CN', {'PRO\','S_PRO\','Z_PRO\'},     .F., 'CONTRACT\',"РАСЧЕТЫ.ДОГОВОРЫ",.T.},;
     { 'Экспорт налоговых форм.'  ,  'TAXI'    , 'TX', {'PRO\','S_PRO\','Z_PRO\'},     .F., 'TAXI\',"ЭКСПОРТ_ФОРМ",.F.},;
     { 'Ключи',                      'KEY_NOM',  'KK', 'PRO\',     .T., ''           ,"НАЛОГОПЛАТЕЛЬЩИК",.F.},;
     { 'Планирование закупок',       'PLAN'    , 'IP', 'PRO\',     .F., 'PLAN\'      ,"ПЛАНИРОВАНИЕ ЗАКУПОК",.T.}, ;
     { 'Мобильная торговля',         'MOBILE'  , 'DS', 'PRO\',     .F., 'MOBILE\'      ,"МОБИЛЬНАЯ ТОРГОВЛЯ",.T.}, ;
     { 'Установка сервис-паков',     'SP',       'SP', 'PRO\',     .T., ''     ,"СЕРВИСПАК"}, ;
     { 'Пример',                     'SAMPLE',   'SA', 'PRO\',     .F., ''     ,"ПРИМЕР"} ;
   }
#endif
LOCAL nPoz
#ifdef _DEBUG
#ifdef __PLATFORM__Linux
    aadd(aAllArm,{ 'Учет заpаботной платы',      'PAY',   '14', 'PRO/', .F., 'SALARY/'    ,"ЗАРПЛАТА"})
#else
    aadd(aAllArm,{ 'Учет заpаботной платы',      'PAY',   '14', 'PRO\', .F., 'SALARY\'    ,"ЗАРПЛАТА"})
#endif
#endif
IF cGlobalTask != NIL .OR. cExeName != NIL
  IF (nPoz := ASCAN(aAllArm,{|x| x[3] = cGlobalTask .OR. (cExeName != NIL .AND. x[2] $ UPPER(cExeName)) })) != 0
    RETURN aAllArm[nPoz]
  ELSE
    RETURN AEVAL(aAllArm[1],{|x,n| aAllArm[1,n] := BLANK(x) })
  ENDIF
ENDIF
RETURN aAllArm

// Информация о версии
PROCEDURE InfoStart( lMyYesUpgrade, lMyCheck )
  lMyYesUpgrade := lYesUpgrade
  lMyCheck      := lCheck
RETURN
//
Function Is2Windows()
Return (IsMsWin().or.IsMSNT())
//***************************************************************************
Function SalRename(cExePath, cDbfPath)
  Local lPayIni
//altd()
   If !File(cExePath+"PAY.INI")
      lPayIni := .F.  // "международная"
   Else
      lPayIni := .T.  // российская
   EndIf
   If lPayIni
      If File(cExePath+"PAY.EXE")
        If File(cExePath +"SALARY.EXE")
          FERASE(cExePath+"SALARY.EXE")
        EndIf
        If File(cExePath+"PAY.EXE")
          FRENAME(cExePath+"PAY.EXE",cExePath+"SALARY.EXE")
        EndIf
      EndIf
      If File(cDbfPath+"S_MENUH2.DBF") .And.;
         File(cDbfPath+"S_MENU2.DBF") .And.;
         File(cDbfPath+"INTAXH2.DBF") .And.;
         File(cDbfPath+"INTAXC2.DBF")

         If File(cDbfPath+"S_MENU.DBF")
            FERASE(cDbfPath+"S_MENU.DBF")
         EndIf
         If File(cDbfPath+"S_MENU.CDX")
            FERASE(cDbfPath+"S_MENU.CDX")
         EndIf
         If File(cDbfPath+"S_MENUH.DBF")
            FERASE(cDbfPath+"S_MENUH.DBF")
         EndIf
         If File(cDbfPath+"S_MENUH.CDX")
            FERASE(cDbfPath+"S_MENUH.CDX")
         EndIf
         If File(cDbfPath+"S_MENU2.DBF")
            FRENAME(cDbfPath+"S_MENU2.DBF",cDbfPath+"S_MENU.DBF")
         EndIf
         If File(cDbfPath+"S_MENU2.CDX")
            FRENAME(cDbfPath+"S_MENU2.CDX",cDbfPath+"S_MENU.CDX")
         EndIf
         If File(cDbfPath+"S_MENUH2.DBF")
            FRENAME(cDbfPath+"S_MENUH2.DBF",cDbfPath+"S_MENUH.DBF")
         EndIf
         If File(cDbfPath+"S_MENUH2.CDX")
            FRENAME(cDbfPath+"S_MENUH2.CDX",cDbfPath+"S_MENUH.CDX")
         EndIf
         FERASE(cDbfPath+"INTAXC.DBF")
         FERASE(cDbfPath+"INTAXH.DBF")
         FERASE(cDbfPath+"INTAXC.CDX")
         FERASE(cDbfPath+"INTAXH.CDX")
         FRENAME(cDbfPath+"INTAXC2.DBF",cDbfPath+"INTAXC.DBF")
         FRENAME(cDbfPath+"INTAXH2.DBF",cDbfPath+"INTAXH.DBF")
         FRENAME(cDbfPath+"INTAXC2.CDX",cDbfPath+"INTAXC.CDX")
         FRENAME(cDbfPath+"INTAXH2.CDX",cDbfPath+"INTAXH.CDX")
      EndIf
   EndIf
Return (Nil)


/***************

PROCEDURE MouseHandler(lOnOff)
LOCAL nRow:=mRow(.F.),nCol:=mCol(.F.)
STATIC lOn:=.T.

IF lOnOff!=NIL
   lOn:=lOnOff
ELSEIF lOn.AND.LASTKEY() = K_LBUTTONDOWN .AND. (nRow>22.OR.nRow=0) //MAXROW()-2
   GenerateKeyFromScreen(nRow,nCol)
ENDIF

RETURN

*************************/


/*********************
STATIC PROCEDURE MyShowTime(lOn)
STATIC sTime:="00:00:00"
STATIC sOn:=.T.
LOCAL nwi:=WSELECT()
WSELECT(0)
IF lOn!=NIL
   sOn:=lOn
   IF !sOn
      @ 1,MAXCOL()-8 SAY SPACE(8)
   ENDIF
ENDIF
IF sOn.AND.!TIME()==sTime
   @ 1,MAXCOL()-8 SAY (sTime:=TIME()) COLOR "n/w"
ENDIF
WSELECT(nWi)
Sleep(10)
RETURN
*************************/






FUNCTION IsHarbour()
RETURN .T.

****************
FUNCTION GetGlobalParam(cStr, cKey)
****************
LOCAL n,cSt := ''
IF(EMPTY(cStr),cStr:='',NIL)
IF (n:=AT(UPPER(cKey), UPPER(cStr))) > 0
   cSt:=SUBSTR(cStr,n+LEN(cKey))
ENDIF
IF AT('/',cSt) >0
   cSt:= LEFT(cSt,AT('/',cSt)-1)
ENDIF
cSt:= ALLTRIM(cSt)

RETURN cSt
