/*$Id: imp_kasord.c,v 5.30 2013/05/17 14:56:02 sasa Exp $*/
/*22.02.2016	28.03.2007	Белых А.И.	imp_kasord_rf.c
Импорт кассовых ордеров из файла
*/
#include        <errno.h>
#include        <sys/types.h>
#include        <sys/stat.h>
#include "bezcurses.h"
#include <unistd.h>

int zaphkor(int mkor,
const char *kassa,
int tipz,
short d,short m,short g,
const char *nomd,
const char *shetk,
const char *kodop,
const char *osnov,
const char *dopol,
const char *fio,
const char *dokum,
const char *kassaz,
const char *nomdz,
short dz,short mz,short gz,
const char *nomer_bl,
const char *nomv);

int zapzkor(int metka,
const char *kassa,int tipz,
short dd,short md,short gd,
const char *nomd,const char *kodkont,double suma,
const char *kontrz,
const char *koment);

void avtprkas(const char *kassa,short tipz,const char *nomd,short dd,short md,short gd,const char *shetk,const char *shetd,const char *kodop);
void	provpodko(const char *kassa,const char *nomd,short dd,short md,short gd,short tipz);
void provprkas(const char *kassa,short tipz,const char *nomd,short dd,short md,short gd,const char *kodop);
int imp_kasord_r_vp(short dd,short md,short gd,const char *kassa,int tipzap,const char *nomdok,const char *kodop,const char *shetd,int *kol_oh);

int imp_kasord_rf(const char *imafim,int metka) //0-проверка на ошибки 1- загрузка
{
if(metka == 0)
 printf("%s\n",gettext("Проверка на наличие ошибок"));
if(metka == 1)
 printf("\n\n%s\n",gettext("Загружаем документы из файла"));
class iceb_tu_str stroka("");
class iceb_tu_str kod_str("");
class iceb_tu_str bros("");
int kol_oh=0; //количество ошибок
int tipzap=0;
class iceb_tu_str tip("");
class iceb_tu_str kassa("");
short dd,md,gd;
class iceb_tu_str nomdok("");
class iceb_tu_str shetd("");
class iceb_tu_str shetk("");
class iceb_tu_str kodop("");
class iceb_tu_str osnov("");
class iceb_tu_str dopol("");
class iceb_tu_str fio("");
class iceb_tu_str dokum("");
int razmer=0;
int i=0;
char strsql[1024];
SQL_str row;
SQLCURSOR cur;
struct OPSHET rek_shet;
class iceb_tu_str kontr("");
double suma=0.;
class iceb_tu_str fam("");
class iceb_tu_str inn("");
class iceb_tu_str nomer_bl(""); /*Номер бланка кассового ордера*/  
int koldok_p=0; /*количество приходных документов*/
int koldok_r=0; /*количество расходных документов*/
double i_sumap=0.;
double i_sumar=0.;
int kodkontr=1;
struct stat work;

if(stat(imafim,&work) != 0)
 {
  printf("%s %s!\n",gettext("Нет такого файла"),imafim);
  return(1);
 }

class iceb_fopen ffimp;

if(ffimp.start(imafim,"r") != 0)
 return(1);
 


while(iceb_tu_fgets(&stroka,ffimp.ff) == 0)
 {
  if(stroka.ravno()[0] == '#')
   continue;
   
  i=strlen(stroka.ravno());
  razmer+=i;

  printf("%s",stroka.ravno());

  if(iceb_tu_polen(stroka.ravno(),&kod_str,1,'|') != 0)
   continue;  

  if(iceb_tu_SRAV(kod_str.ravno(),"KON",0) == 0) /*запись реквизитов контрагента*/
   {
    iceb_t_zkvsk(stroka.ravno(),&kodkontr,NULL);
    continue;
   }
  
  if(iceb_tu_SRAV("KDOK",kod_str.ravno(),0) == 0) //Строка с шапкой документа
   {
    if(nomdok.getdlinna() > 1)/*подтверждаем документ и выполняем проводки*/
     imp_kasord_r_vp(dd,md,gd,kassa.ravno(),tipzap,nomdok.ravno(),kodop.ravno(),shetd.ravno(),&kol_oh);
    
    iceb_tu_polen(stroka.ravno(),&tip,2,'|');
    
    if(tip.ravno()[0] == '+')
     tipzap=1;
    if(tip.ravno()[0] == '-')
     tipzap=2;
     
    iceb_tu_polen(stroka.ravno(),&kassa,3,'|');
    iceb_tu_polen(stroka.ravno(),&bros,4,'|');
    if(iceb_tu_rsdat(&dd,&md,&gd,bros.ravno(),1) != 0)
     {
   
      printf("%s\n",gettext("Не правильно введена дата !"));
      kol_oh++;
     }

    if(iceb_t_pbpds(md,gd) != 0) /*проверка блокировки*/
      kol_oh++;

    iceb_tu_polen(stroka.ravno(),&nomdok,5,'|');
    iceb_tu_polen(stroka.ravno(),&shetd,6,'|');
    iceb_tu_polen(stroka.ravno(),&kodop,7,'|');
    iceb_tu_polen(stroka.ravno(),&osnov,8,'|');
    iceb_tu_polen(stroka.ravno(),&dopol,9,'|');
    iceb_tu_polen(stroka.ravno(),&fio,10,'|');
    iceb_tu_polen(stroka.ravno(),&dokum,11,'|');
    iceb_tu_polen(stroka.ravno(),&nomer_bl,12,'|');

    if(metka == 0) //проверка на ошибки
     {
      //Проверяем код кассы
      sprintf(strsql,"select kod from Kas where kod=%s",kassa.ravno());
      if(iceb_t_sql_readkey(strsql,&row,&cur) != 1)
       {
        printf("%s %s !\n",gettext("Не найден код кассы"),kassa.ravno());
        kol_oh++;
       }
      //проверяем код операции
      if(tip.ravno()[0] == '+')
        sprintf(strsql,"select shetkor from Kasop1 where kod='%s'",kodop.ravno());
      if(tip.ravno()[0] == '-')
        sprintf(strsql,"select shetkor from Kasop2 where kod='%s'",kodop.ravno());
        
      if(iceb_t_sql_readkey(strsql,&row,&cur) != 1)
       {
        printf("%s %s!\n",gettext("Не найден код операции"),kodop.ravno());
        kol_oh++;
       }

      if(shetd.getdlinna() <= 1)
       shetd.new_plus(row[0]);

      if(shetd.getdlinna() <= 1)
       {
        printf("%s!\n",gettext("Не введён счёт"));
        kol_oh++;
       }
      else
       {
        //проверяем счёт
          
        if(iceb_t_prsh1(shetd.ravno(),&rek_shet) != 0)
          kol_oh++;
       }
       
      //проверяем номер документа
      if(nomdok.ravno()[0] != '\0')
       {
        
        sprintf(strsql,"select nomd from Kasord where nomd='%s' and kassa=%s and tp=%d and god=%d",
        nomdok.ravno(),kassa.ravno(),tipzap,gd);
        if(iceb_t_sql_readkey(strsql,&row,&cur) >= 1)
         {
          printf("%s %s %s !\n",gettext("Номер документа"),nomdok.ravno(),gettext("уже есть в базе"));
          kol_oh++;
         }
           
       
       }
      /*Проверяем номер бланка кассового ордера*/
      if(nomer_bl.getdlinna() > 1)
       {
        sprintf(strsql,"select nomd from Kasord where nb='%s'",nomer_bl.ravno_filtr());
        if(iceb_t_sql_readkey(strsql,&row,&cur) >= 1)
         {
          printf("%s %s %s %s!\n",gettext("Номер бланка"),nomer_bl.ravno(),gettext("уже имеет документ с номером"),row[0]);
          kol_oh++;
         }
       
       }    
              
     }
      
    if(metka == 1) //запись в базу шапки документа
     {
      class iceb_t_lock_tables kkkk("LOCK TABLE Kasord WRITE,icebuser READ");
      if(nomdok.ravno()[0] == '\0')
          nomnak(gd,kassa.ravno(),&nomdok,tipzap,2,1);

      if(zaphkor(0,kassa.ravno(),tipzap,dd,md,gd,nomdok.ravno(),shetd.ravno(),kodop.ravno(),
      osnov.ravno_filtr(),dopol.ravno_filtr(),fio.ravno_filtr(),
      dokum.ravno_filtr(),"","",0,0,0,nomer_bl.ravno_filtr(),"") != 0)
       {
        kol_oh++;
        return(1);
       }
      if(tipzap == 1)
        koldok_p++;
      else
        koldok_r++;
     }
   }
  
  if(iceb_tu_SRAV("KZAP",kod_str.ravno(),0) == 0 ) //Строка содержимым документа
   {
    iceb_tu_polen(stroka.ravno(),&kontr,2,'|');
    iceb_tu_polen(stroka.ravno(),&suma,3,'|');
    iceb_tu_polen(stroka.ravno(),&inn,4,'|');
    iceb_tu_polen(stroka.ravno(),&fam,5,'|');

    if(fam.getdlinna() <= 1)
     {
      printf("%s\n",gettext("Не введено наименование контрагента"));
      kol_oh++;
     }

    if(iceb_t_get_kkfname(fam.ravno(),kontr.ravno(),&kontr,&kodkontr) < 0)
     {
      kol_oh++;
      continue;
     }

#if 0
################################################################################3
    class iceb_tu_str kod_kontr("");
    /*Проверяем индивидуальный налоговый номер*/
    if(inn.getdlinna() > 1)
     {         
      sprintf(strsql,"select kodkon from Kontragent where kod='%s'",inn.ravno());
      if(iceb_t_sql_readkey(strsql,&row,&cur) > 0)
        kod_kontr.new_plus(row[0]);
     }
    if(kontr.getdlinna() <= 1)
     {
      /*Проверяем по фамилии*/
       
      sprintf(strsql,"select kodkon from Kontragent where naikon='%s'",fam.ravno_filtr());
      if(iceb_t_sql_readkey(strsql,&row,&cur) > 0)
        kod_kontr.new_plus(row[0]);
     }        

    if(kod_kontr.getdlinna() <= 1)
     {
      /*Записываем в базу данных нового контрагента*/
      class iceb_t_lock_tables kkkk("LOCK TABLE Kontragent WRITE,icebuser READ");
      if(kontr.getdlinna() > 1) /*проверяем свободен ли код*/
       {
        sprintf(strsql,"select kodkon from Kontragent where kodkon='%s'",kontr.ravno_filtr());
        if(iceb_t_sql_readkey(strsql) >= 1)
          kontr.new_plus(iceb_t_getnkontr(kodkontr));     
       }
      else
        kontr.new_plus(iceb_t_getnkontr(kodkontr));     

      sprintf(strsql,"insert into Kontragent (kodkon,naikon,kod,ktoz,vrem) values ('%s','%s','%s',%d,%ld)",
      kontr.ravno_filtr(),fam.ravno_filtr(),inn.ravno(),iceb_t_getuid(),time(NULL));
      
      if(iceb_t_sql_zapis(strsql,1,0) != 0)
       {
        kol_oh++;
        continue;
       }
      kodkontr=kontr.ravno_atoi()+1;
     }
    else
     kontr.new_plus(kod_kontr.ravno());
####################################3
#endif
    if(metka == 1) //запись в базу строки документа
     {
  
        /*проверяем может контрагент грузится повторно*/
      sprintf(strsql,"select suma from Kasord1 where kassa=%d and god=%d and tp=%d and nomd='%s' and kontr='%s'",
      kassa.ravno_atoi(),
      gd,
      tipzap,
      nomdok.ravno_filtr(),
      kontr.ravno_filtr());
      if(iceb_t_sql_readkey(strsql,&row,&cur) == 1)
       {
        if(zapzkor(1,kassa.ravno(),tipzap,dd,md,gd,nomdok.ravno(),kontr.ravno_filtr(),suma+atof(row[0]),kontr.ravno_filtr(),"") != 0)
         {
          printf("%s\n",gettext("Ошибка корректировки записи в кассовом ордере"));
          kol_oh++;
          continue;
         }
       }
      else      
       if(zapzkor(0,kassa.ravno(),tipzap,dd,md,gd,nomdok.ravno(),kontr.ravno_filtr(),suma,"","") != 0)
        {
         printf("%s\n",gettext("Ошибка записи в кассовый ордер"));
         kol_oh++;
         continue;
        }

      if(tipzap == 1)
       i_sumap+=suma;
      else
       i_sumar+=suma;
#if 0
#####################################################################3      
      /*подтверждаем документ*/
      sprintf(strsql,"UPDATE Kasord1 set datp='%d-%d-%d' where \
kassa=%s and god=%d and tp=%d and nomd='%s' and datp='0000-00-00'",
      gd,md,dd,kassa.ravno(),gd,tipzap,nomdok.ravno());

      if(iceb_t_sql_zapis(strsql,0,0)  != 0)
       kol_oh++;
      
      /*выполняем проводки*/

      //Читаем счет кассы в коде операции если он там есть
      shetk.new_plus("");

      if(tipzap == 1)
       sprintf(strsql,"select shetkas,metkapr from Kasop1 where kod='%s'",kodop.ravno());
      if(tipzap == 2)
       sprintf(strsql,"select shetkas,metkapr from Kasop2 where kod='%s'",kodop.ravno());

      if(iceb_t_sql_readkey(strsql,&row,&cur) == 1)
       {
        shetk.new_plus(row[0]);
        if(row[1][0] == '0')
         continue; /*проводок делать для этой операции не нужно*/
       }

      //Читаем счет кассы
      if(shetk.ravno()[0] == '\0')
       {
        sprintf(strsql,"select shet from Kas where kod=%s",kassa.ravno());
        if(iceb_t_sql_readkey(strsql,&row,&cur) != 1)
         {
          printf("%s %s !\n",gettext("Не найдена касса"),kassa.ravno());
          continue;
         }
        else
         shetk.new_plus(row[0]);
        
       }
      if(shetk.ravno()[0] == '\0')
       continue;
      
      avtprkas(kassa.ravno(),tipzap,nomdok.ravno(),dd,md,gd,shetk.ravno(),shetd.ravno(),kodop.ravno()); /*выполняем проводки*/

      provpodko(kassa.ravno(),nomdok.ravno(),dd,md,gd,tipzap); /*проверяем подтверждение документа*/
      provprkas(kassa.ravno(),tipzap,nomdok.ravno(),dd,md,gd,kodop.ravno()); /*проверяем выполнение проводок*/
############################################
#endif
     }
   }




 }

ffimp.end();

if(nomdok.getdlinna() > 1)/*подтверждаем документ и выполняем проводки*/
 imp_kasord_r_vp(dd,md,gd,kassa.ravno(),tipzap,nomdok.ravno(),kodop.ravno(),shetd.ravno(),&kol_oh);

if(metka == 1)
 {
  
  printf("%s %d %s %.2f\n",gettext("Приходных документов"),koldok_p,gettext("на сумму"),i_sumap);

  printf("%s %d %s %.2f\n",gettext("Расходных документов"),koldok_r,gettext("на сумму"),i_sumar);

  printf("%s:%d\n",gettext("Количество ошибок"),kol_oh);
 }

return(kol_oh);
}
/***********************************************/
/*подтверждение документа и выполнение проводок*/
/************************************************/
int imp_kasord_r_vp(short dd,short md,short gd,
const char *kassa,
int tipzap,
const char *nomdok,
const char *kodop,
const char *shetd,
int *kol_oh)
{
char strsql[512];
class SQLCURSOR cur;
SQL_str row;
/*подтверждаем документ*/
sprintf(strsql,"UPDATE Kasord1 set datp='%d-%d-%d' where \
kassa=%s and god=%d and tp=%d and nomd='%s' and datp='0000-00-00'",
gd,md,dd,kassa,gd,tipzap,nomdok);

if(iceb_t_sql_zapis(strsql,0,0)  != 0)
 *kol_oh+=1;

/*выполняем проводки*/

//Читаем счет кассы в коде операции если он там есть
class iceb_tu_str shetk("");

if(tipzap == 1)
 sprintf(strsql,"select shetkas,metkapr from Kasop1 where kod='%s'",kodop);
if(tipzap == 2)
 sprintf(strsql,"select shetkas,metkapr from Kasop2 where kod='%s'",kodop);

if(iceb_t_sql_readkey(strsql,&row,&cur) == 1)
 {
  shetk.new_plus(row[0]);
  if(row[1][0] == '0')
   return(1); /*проводок делать для этой операции не нужно*/
 }

//Читаем счет кассы
if(shetk.ravno()[0] == '\0')
 {
  sprintf(strsql,"select shet from Kas where kod=%s",kassa);
  if(iceb_t_sql_readkey(strsql,&row,&cur) != 1)
   {
    printf("%s %s !\n",gettext("Не найдена касса"),kassa);
    return(1);
   }
  else
   shetk.new_plus(row[0]);
  
 }
if(shetk.ravno()[0] == '\0')
 return(1);

avtprkas(kassa,tipzap,nomdok,dd,md,gd,shetk.ravno(),shetd,kodop); /*выполняем проводки*/

provpodko(kassa,nomdok,dd,md,gd,tipzap); /*проверяем подтверждение документа*/
provprkas(kassa,tipzap,nomdok,dd,md,gd,kodop); /*проверяем выполнение проводок*/
return(0);
}
