import "layer92.dll"

unsigned int NumOfOrder=0; /* переменная для отслежеивания порядкового номера     */
                         /* печатаемой записи при печати в формате пользователя */
double Itog=0;
int LenStrItog=0;

User_Print_Title_Script( HandleOutputFile )
/**************************************************************
** Функция печатает заголовок в файл.
** Используется при передачи кассовых ведомостей и ордеров
** в файл в формате пользователя.
***************************************************************
*/
{
  // return Sys_Print_Title_Script( HandleOutputFile );

  // ВНИМАНИЕ !!! Файл открыт для записи в двоичном режиме
// { для УБРиР  12.05.00
  char Title[81]; char CurData[11];
  var EndTable="└─────┴───────────────────┴─────────────────┴──────────┘\r\n";
  int LenStrTable=strlen(EndTable);

  strcpy(CurData,datatek);
  CurData[6] = CurData[8]; // эти манипуляции необходимы
  CurData[7] = CurData[9]; // чтобы привести дату из формата
  CurData[8] = '\0';       // ДД.ММ.ГГГГ в формат ДД.ММ.ГГ
  sprintf(Title,"%.8s 98 2 3 4 75000 \r\n",CurData);
  write(HandleOutputFile, Title, strlen(Title));

  write(HandleOutputFile,
       "┌─────┬───────────────────┬─────────────────┬──────────┐\r\n", LenStrTable);
/*
  write(HandleOutputFile,
       "│  N  │ Номер карточки    │ Сумма операции  │  Счет    │\r\n", LenStrTable);
  write(HandleOutputFile,
       "├─────┼───────────────────┼─────────────────┼──────────┤\r\n", LenStrTable);
*/
  write(HandleOutputFile, EndTable, LenStrTable);
  NumOfOrder=0;
// } для УБРиР  12.05.00
  return;
}

User_Transfer_One_Script( &pDoc, HandleOutputFile, Num, Flag, Otbor )
/*-------------------------------------------------------------------*/
/* Pазноска одной стpоки из списка оpдеpов или ведомости.            */
/* pDoc - указатель на объект (ордер или ведомость)                  */
/* HandleOutputFile - файл в который пишем                           */
/* Num -  номеp стpоки в списке оpдеpов или в ведомости.             */
/* Flag - 'O' pазноска оpдеpа.                                       */
/* Flag - 'I' pазноска ведомости.                                    */
/* Otbor - 0  передача только непереданных ЛС                        */
/* Otbor - 1  передача всех ЛС (независимо от того, передавался он   */
/*            раньше или нет)                                        */
/* Функция используется при передачи кассовых ведомостей и ордеров   */
/* в файл в формате пользователя.                                    */
/*-------------------------------------------------------------------*/
{
  // return Sys_Transfer_One_Script( pDoc, HandleOutputFile, Num, Flag, Otbor );

  var Ved =  CreateObject("Doc");
  Ved.Initial(static_cast_to_string(pDoc));

  int N_Fld_Transf=Ved.GetNumFld("TRANSFER"); // Номер поля с именем TRANSFER в которое заносится
                                              // признак передачи в файл (в АРМ).

   // Проверка: "оpдеp или стpока ведомости pазнесены в АРМ"
   // Если поле TRANSFER отсутствует в ордере или ведомости то разноска
   // все равно будет происходить, только не будет проставлятся признак
   // разноски.
   // Если не надо передавать уже переданные ЛС и есть отметка, что
   // текущий ЛС передан, то его мы передавать не будем
   if ( Ved.Char_From_Field( N_Fld_Transf,Num )=='П' && !Otbor )
      return;

// { 12.05.00 для УБРиР
   var EndTable="└─────┴───────────────────┴─────────────────┴──────────┘\r\n";
   long tn=sizetn*atol(Ved.TextS(Ved.Get_N_POD(), Num))
                 +atol(Ved.TextS(Ved.Get_N_TAB(), Num));
   char  ls[LSSTR];

   lsname(tn, ls);
   int c=lsread(ls, 2);
   if ( c==ESC || c==0 )  return;

    // Записываем номер карточки
    char NumCard[17];       /* Номер карточки                                 */
    kch_from("kart",NumCard);
// } 12.05.00 для УБРиР

   // Записываем ТН
                           /* Табельный номер                                */
   long Tab_Num = atol( static_cast_to_string(Ved.TextS(Ved.Get_N_TAB(), Num)) );
   char Fio[40],           /* ФИО                                            */
        Name_Podr[81],     /* Название подразделения                         */
        Data_Transf[11],   /* Дата передачи                                  */
        Month[3], Year[5]; /* Месяц и год, за которые сумма                  */
   double Summa=0.;        /* Сумма, которая разносится                      */


    // Записываем название подразделения
    long Dep = atol( static_cast_to_string(Ved.TextS(Ved.Get_N_POD(), Num)) );
    sprintf(Name_Podr,"%.80s",GetOtdName(Dep));

    // Записываем текущую дату
    sprintf(Data_Transf,"%.10s",datatek);

    // Записываем месяц и год за которые передана сумма
    sprintf(Month,"%d",Month_Cash);
    sprintf(Year, "%d",Year_Cash);

    // Записываем сумму
    Summa = atof( static_cast_to_string(Ved.TextS(Ved.Get_N_SUM(), Num)) );

    // Печать в файл сформированной записи
    // ВНИМАНИЕ !!! Файл открыт для записи в двоичном режиме

// { для УБРиР  12.05.00
   char str[255];
   int LenStrTable=strlen(EndTable);

   if ( !NumOfOrder ) Itog=LenStrItog=0;

   Itog+=Summa;
   // подготовимся к печати первой строки
   sprintf( str, "│ %3d │  %16.16s │ %15.2f │          │\r\n", ++NumOfOrder, NumCard, Summa);
   lseek(HandleOutputFile, -(LenStrTable+LenStrItog), SEEK_CUR);
   write(HandleOutputFile, str, LenStrTable);
   write(HandleOutputFile, EndTable, LenStrTable);
   sprintf( str, "  ИТОГО: %34.2f\r\n", Itog);
   LenStrItog = strlen(str);
   write(HandleOutputFile, str, LenStrItog);
// } для УБРиР  12.05.00

    // Заполнение столбца разноски
    if ( N_Fld_Transf != -1 )
       Ved.SetText( N_Fld_Transf, Num, "П");
   return;
}

User_Before_Summa_W( &Doc , Kind_Form)
{
   // Функция вызываемая перед приемом ЛС в кассовую ведомость
   // если вернуть 0 - текущий лс по текущему фильтру не будет приниматься (не будет вызвана Summa_W_Script)
   // вернуть 1 для приема суммы
   // Doc - объект класса Doc 

   return 1;
}

User_Summa_W_Script( &pDoc, Kind_Form )
/********************************************************************/
/* Вычисление суммы в ведомость или оpдеp                           */
/* Kind_Form - тип ведомости/оpдеpа ( Аванс, Заpплата и т.д. )      */
/********************************************************************/
{
   return Sys_Summa_W_Script( pDoc, Kind_Form );
}

User_Forma_W_Script( &pDoc, Kind_Form, Code, Col )
//////////////////////////////////////////////////////////////////////
// Вспомогательная функция для панели Panel_Cash
//////////////////////////////////////////////////////////////////////
{
   return Sys_Forma_W_Script( pDoc, Kind_Form, Code, Col );
}

User_Prepar_User_Append_To_Text_Script(HandleOutputFile)
/*************************************************************************
** Функция производит подготовку открытого текстового файла к добавлению
** так, как это требуется пользователю при печати кассовых документов
** в формате пользователя.
** ( Внимание !!! Файл открыт в двоичном виде, т.е. с флагом O_BINARY )
**************************************************************************/
{
  // return Sys_Prepar_User_Append_To_Text_Script(HandleOutputFile);
  // 12.05.00 для УБРиР
  char buffer[4];
  /*********************************************************************
  ** В связи с тем что нужен для печати номер по-порядку, необходимо
  ** определить каким был номер последней напечатанной записи
  **********************************************************************
   */
  char str[81];
  long LengthFile=lseek(HandleOutputFile,0,SEEK_END);
  long CountStr=0;
  // Отойдем назад на две строки (количество строк на которое отходим
  // назад зависит от формы печати!!!), для того чтобы встать на последнюю
  // запись в таблице
  NumOfOrder=0;
  for ( long OffsetFile=4; OffsetFile<=LengthFile; )
  {
    lseek(HandleOutputFile,-OffsetFile++,SEEK_END);
    read(HandleOutputFile, buffer, 2);
    if ( buffer[0]=='\r' && buffer[1]=='\n' && ++CountStr==3 )
    {
      read(HandleOutputFile,str,1);
      read(HandleOutputFile,str,9);
      NumOfOrder = atoi(str);
      break;
    }
    if ( buffer[0]=='\r' && buffer[1]=='\n' && CountStr==1 )
    {
      read(HandleOutputFile,str,20);
      read(HandleOutputFile,str,60);
      Itog = atof(str);
      LenStrItog = OffsetFile-3;
    }
  }
  lseek(HandleOutputFile,0,SEEK_END);
  return;
}
