************
*
* Программа..:  SCLAD
* Имя файла..:  S_Schet.Prg
* Назначение.:  Настройка счетов запасов
*
******

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

#INCLUDE "sc_all.ch"
#INCLUDE "task.ch"
#INCLUDE "inkey.ch"
#INCLUDE "sclad.ch"

STATIC aUchet
STATIC aUchet1:={;
   {'1','Учетные   '},;
   {'2','          '};
   }

STATIC aMetod:={;
   {'1','ФИФО      '},;
   {'2','ЛИФО      '},;
   {'3','Средние   '};
    }

FUNCTION SchetInit()
LOCAL aSetKey:=SaveSetKey()
LOCAL aYes:= IF(!_ROZNICA, {{' ','Да '},{'1','Нет'}}, {{' ','Да '}})
LOCAL cScreen:=SAVESCREEN()
LOCAL cHead:='Настройка счетов учета ТМЦ'
LOCAL cColHead:={;
     PADR(PADC('',_LEN_SCHET+1)+'                                                                   ',78),;
PADR(PADC(' Счет',_LEN_SCHET+1)+'         Наименование          Способ хранения       Метод учета   ',78),;
     PADR(PADC('',_LEN_SCHET+1)+'                                                                   ',78)}
LOCAL aBlockCols:={;
{{||LEFT(Schet,_LEN_SCHET)},0},;
{{||PADR(MSchet->Name_Sch,30)},1+_LEN_SCHET},;
{{||PADR(StrS(MSCHET->Xran,m->aXran),22-_LEN_SCHET) },32+_LEN_SCHET},;
{{||PADR(StrS(Uchet,aUchet),20)},55}}

LOCAL nTop:=3
LOCAL nBottom:=20
LOCAL cCurProc
LOCAL aHeads:={;
     {'Номер счета.....: ','Schet'},;
     {'Наименование....: ','Name_Sch'},;
     {'Способ хранения.: ','Xran'},;
     {'Метод учета.....: ','Uchet'},;
     {'Метод списания    ','pNil'},;
     {'  для бух.учета.: ','Metod'},;
     {'  для нал.учета.: ','MetodNal'}}
LOCAL aGetBlock:={;
          NIL,;
          NIL,;
          {|x,oGet| x := RotateBlock(x,m->aXran,'aIn[3]'),IF(aIn[HEAD_POZ] != HEAD_BAK,MessFilial(aIn[1]),NIL),x},;
          {|x|RotateBlock(x,aUchet,'aIn[4]')},;
          {||''},;
          {|x| IF(aIn[3] = '1',RotateBlock(x,aMetod,'aIn[6]'),'Партионный') },;
          {|x| IF(aIn[3] = '1',RotateBlock(x,aMetod,'aIn[7]'),'Партионный') },;
          {|x|RotateBlock(x,aYes,IF(m->lYesNalUch,'aIn[8]','aIn[7]'))}}
LOCAL aRef:={;
            'Plan',;
            NIL,;
           {|x| RotateAndReader(x,m->aXran) },;
           {|x|RotateAndReader(x,aUchet)},;
           NIL,;
           {|x|RotateAndReader(x,aMetod)},;
           {|x|RotateAndReader(x,aMetod)},;
           {|x|RotateAndReader(x,aYes)};
             }
LOCAL aPict:={_PIC_SCHET,'@KS50 '+REPLICATE('X',50)}
LOCAL aWhen:={{|| WSchetIni() },;
              {|| WName(),.T.},;
              ,;
              {|| IF(aIn[3] = "1",(aIn[4] := '1',aIn[6] := '3',aIn[7] := '3',.F.),!_ROZNICA) },;
              {||.F.},;
              {|oGet|WMetod(oGet,6)},;
              {|oGet|WMetod(oGet,7)},;
              {|| !_ROZNICA}}
LOCAL aValid
LOCAL nUniMode:=2
LOCAL bDelInit:={||SchetSeek()}
LOCAL bScrInit
LOCAL aSortSeek
LOCAL aPHeads:={'Счета групп запасов',;
{'Счет','Schet',_PIC_SCHET},;
{'Наименование','Name_Sch'},;
{'Способ хранения','StrS(Xran,aXran)','XXXXXXXXXXXXXXX'},;
{'Метод учета','StrS(Uchet,aUch)','XXXXXXXXXXXXXXXXXXXX'},;
{'Метод списания','StrS1(Uchet,Metod)','XXXXXXXXXXXXXX'};
}
LOCAL bPost:={||Post()},cHELP_CODE:=HELP_CODE
LOCAL aBase := {{"PLAN","PLAN_SCH"},'MSCLAD','MSchet','MStru','MDoc','SPR_PART'}




HELP_CODE:='7.3.1'

PRIVATE lYesNalUch:=.T.

PRIVATE aSclad:={}


PRIVATE aUch, pNil
PRIVATE aXran :={;
   {' ','Сортовой  '},;
   {'1','Партионный'};
                }
IF !m->lYesNalUch
   ADEL(aHeads,7)
   ASIZE(aHeads,LEN(aHeads)-1)
   ADEL(aRef,7)
   ADEL(aWhen,7)
   ADEL(aGetBlock,7)
   ADEL(aHeads,7)
ENDIF
AADD(aHeads,{'Вкл.в прайс-лист: ','Price'})
SETKEY(K_F6,{||1})
aUchet:={{'1','По учетным ценам    '}}
IF !_ROZNICA  //В рознице только по учетным
   AADD(aUchet,{'2','По фактическим ценам'})
ENDIF
aUch:=aUchet
FRAME("",2,0,23,79,COL_BROWSE,2,.T.)
ScrTitul(1,cHead)
ScrTitul(MaxRow(),'┘:Правка F4:Ввод F8:Удалить F9:Печать')
@ 21,00 SAY "╟"+REPLICATE("─",78)+"╢" COLOR COL_BROWSE
cCurProc := {||;
              SetPos(22,2),DispOut("Метод списания: ",COL_BROWSE),;
              DispOut(StrS1(Uchet,Metod),COL_BROWS0),;
              IF(.T.,;
                 (;
                  SetPos(22,44),DispOut("Включать в прайс лист: ",COL_BROWSE),;
                  DispOut(IF(EMPTY(Schet),SPACE(3),StrS(Price,aYes)),COL_BROWS0);
                  ),;
                 NIL;
                 );
              }

//Открытие баз
dbOpenBases(aBase)

MSclad->(DBEVAL({||AADD(aSclad,' '+Code+'. '+ShortName+' ')}))




Spr_Part->(OrdSetFocus("TAG_NUM"))
SELECT Plan
MakeSchetRefer("Plan","aIn[1]",1)
SELECT MSchet
InitList(nTop,nBottom,cColHead,aBlockCols,cCurProc,aHeads,aRef,;
    aPict,aWhen,aValid,nUniMode,bDelInit,bScrInit,aSortSeek,aPHeads,bPost,;
    ,aGetBlock)
RestSetKey(aSetKey)
ClearRefer()
dbCloseBases(aBase)
RESTSCREEN(,,,,cScreen)
HELP_CODE:=cHelp_Code
RETURN (NIL)

STATIC FUNCTION Post()
IF aIn[4]='1'
   REPLACE Metod WITH ' '
ENDIF
RETURN(NIL)

STATIC FUNCTION WSchetIni()
LOCAL i,lYes:=.F.,lYes1:=(nApp==2).OR.MDoc->(EOF())
MEMVAR GetList
IF(EMPTY(aIn[4]),aIn[4]:= "1",)
IF nApp==1
    FOR i:=1 TO LEN(aSclad)
    IF MStru->(DBSEEK(UPPER(SUBSTR(aSclad[i],2,6)+aIn[1])))
      lYes:=.T.
      EXIT
   ENDIF
   NEXT
ENDIF
IF lYes
   GetList[3]:preBlock:= {|| lYes1 .AND. !IsSchetSeek(aIn[1],GetList[3],GetList[4],GetList[6]) .AND. !IsAllSeek(aIn[1]) }
   GetList[4]:preBlock:={|| lYes1.AND.!IsSchetSeek(aIn[1],GetList[3],getList[4],GetList[6]).AND.!_ROZNICA }
   SAYSCREEN('[Задействован]',GetList[1]:row,GetList[1]:col+_LEN_SCHET+1)
ELSE
   GetList[3]:preBlock:= {|| !IsSchetSeek(aIn[1],GetList[3],GetList[4],GetList[6]).AND.!IsAllSeek(aIn[1]) }
   GetList[4]:preBlock:={|| !IsSchetSeek(aIn[1],GetList[3],GetList[4],GetList[6]).AND.!_ROZNICA }
   SAYSCREEN(SPACE(28),GetList[1]:row,GetList[1]:col+5)
ENDIF
GetList[6]:preBlock:={|oGet|WMetod(oGet,6) .AND. !IsSchetSeek(aIn[1],GetList[3],GetList[4],GetList[6]) }
WMetod(GetList[6],6)
GetList[6]:display()
IF m->lYesNalUch
   GetList[7]:preBlock:={|oGet|WMetod(oGet,7) .AND. !IsSchetSeek(aIn[1],GetList[3],GetList[4],GetList[7]) }
   WMetod(GetList[7],7)
   GetList[7]:display()
ENDIF
QHelp('...')
RETURN(!lYes)

STATIC FUNCTION WName()
IF nApp=2.OR.(nApp>0.AND.aIn[1]!=aLastIn[1])
   Plan->(DBSEEK(UPPER(aIn[1])))
   aIn[2]:=Plan->Name_Sch
   M->GetList[2]:updateBuffer()
ENDIF
RETURN (.T.)

STATIC FUNCTION WMetod(oGet,n)
IF aIn[4]=aUchet[1,1]
  aIn[n]:=aIn[4]
  oGet:block:={|x|IF(aIn[4]#aUchet[1,1],RotateBlock(x,aMetod,'aIn['+STR(n,2,0)+']'),(aIn[n]:=IF(x==NIL,aIn[n],x),aUchet1[IF(EMPTY(VAL(aIn[n])),1,VAL(aIn[n])),2]))}
  oGet:UpdateBuffer()
  RETURN (.F.)
ELSEIF aIn[3] = '1'
  aIn[n] := '3'
ENDIF
oGet:block:={|x|RotateBlock(x,aMetod,'aIn['+STR(n,2,0)+']')}
RETURN aIn[3] != '1'.AND.!_ROZNICA

STATIC FUNCTION SchetSeek()
LOCAL lYes:=.F.,i
FOR i:=1 TO LEN(aSclad)
IF MStru->(DBSEEK(UPPER(SUBSTR(aSclad[i],2,6)+MSchet->Schet)))
   lYes:=.T.
   SayError('Счет задействован в схеме хранения ТМЦ')
   EXIT
ENDIF
NEXT
RETURN (!lYes)

//--------------------------------------------------------------------------//
                STATIC FUNCTION IsAllSeek(cSchet)
//--------------------------------------------------------------------------//
// Проверка на задействованость счета в учете
LOCAL lSeek := .F.
dbPush("MSTRU","MSTRU","","","")
DBEVAL({||;
         lSeek := IsSeekNom("",MSTRU->GRUP) .OR. IsMdocM(MSTRU->GRUP) .OR.;
                  IsSeekKart(MSTRU->GRUP).OR.SPR_PART->(DBSEEK(UPPER(MSTRU->GRUP)));
        },;
       {||;
         UPPER(MSTRU->SCHET) = UPPER(cSchet);
         },;
       {||;
         !lSeek;
        };
       )
dbPop()
RETURN lSeek
//--------------------------------------------------------------------------//
                           FUNCTION MessFilial(cSchet)
//--------------------------------------------------------------------------//
// Выдает предупреждение в случае задействованности cSchet в филиале
LOCAL lSeek := .F.
dbPush("MSCLAD","MSCLAD_C","","","")
dbPush("MSTRU","MSTRU","","","")
DBEVAL({||;
         lSeek := MSCLAD->(dbSeek(UPPER(MSTRU->SCLAD))) .AND. !EMPTY(MSCLAD->FILIAL);
        },;
       {||;
         UPPER(MSTRU->SCHET) = UPPER(cSchet);
         },;
       {||;
         !lSeek;
        };
       )
IF lSeek
  SayError({" Счет "+TRIM(cSchet)+" задействован в филиале '"+MSCLAD->FILIAL+"' склад '"+MSCLAD->CODE+"'"," Изменение способа хранения при наличии документов по данному счету"," на удаленном складе может привести к некорректной работе программы !"})
ENDIF
dbPop()
dbPop()
RETURN NIL
//--------------------------------------------------------------------------//
                           FUNCTION IsSchetSeek(cSchet,oGetXran,oGetUchet,oGetMetod)
//--------------------------------------------------------------------------//
// Проверка связи счета cSchet с другими счетами по способу хранения или методу учета
LOCAL lSeek := .F.
dbPush("MSCHET","MSCHET","","","")
dbPush("MSTRU","MSTRU","","","")
DBEVAL({||;
         dbPush("MSTRU","TAG_GRUP","",{"UPPER(GRUP)",UPPER(MSTRU->GRUP),,.F.,{"TAG_GRUP"}},""),;
         DBEVAL({||;
                    MSCHET->(dbSeek(UPPER(MSTRU->SCHET))),;
                    aIn[oGetXran:name[3]] := MSCHET->XRAN,;
                    oGetXran:display(),;
                    aIn[oGetUchet:name[3]] := MSCHET->UCHET,;
                    oGetUchet:display(),;
                    aIn[oGetMetod:name[3]] := MSCHET->METOD,;
                    oGetMetod:display(),;
                    lSeek := .T.;
                 },{|| UPPER(MSTRU->SCHET) != UPPER(cSchet) },{|| !lSeek }),;
         dbPop();
        },;
       {||;
         UPPER(MSTRU->SCHET) = UPPER(cSchet);
         },;
       {||;
         !lSeek;
        };
       )
dbPop()
dbPop()
RETURN lSeek
