/*$Id:$*/
/*27.07.2023	21.07.2023	Белых А.И.	glk_osps.cpp
Обнуление сальдо по счетам
*/
#include "buhg.h"
#include "math.h"

extern short startgodb; /*Стартовый год главной книги*/
int glk_osps_get_saldo_sh(const char *shet,const char *data_saldo,double *debet,double *kredit);

int glk_osps()
{
class VVOD VVOD1(2);
int K=0;
static class iceb_tu_str data_s("");

VVOD1.VVOD_spisok_add_MD(gettext("Обнуление сальдо по счетам"));
VVOD1.VVOD_spisok_add_MD(gettext("Введите дату сальдо (д.м.г)"));

naz:;

clear();

helstr(LINES-1,0,
"F2/ENTER",gettext("рассчёт"),
"F5",gettext("настройка"),
"F10",gettext("выход"),NULL);

K=vvod1(&data_s,11,&VVOD1,NULL,stdscr,-1,-1);


switch(K)
 {
  case ENTER:
  case FK2:
   break;

  case FK5:
   iceb_redfil("glk_osps.alx",0);
   goto naz;

  case ESC:
  case FK10:
   return(1);
   
  default:
   goto naz;
 }
 


char strsql[1024];
int kolstr=0;
SQL_str row_alx,row;
class SQLCURSOR cur_alx,cur;


if(data_s.getdlinna() <= 1)
 {
  iceb_t_soob(gettext("Не введена дата!"));
  goto naz;
 }

if(data_s.prov_dat() != 0)
 {
  iceb_t_soob(gettext("Не правильно введена дата!"));
  goto naz;
 }


sprintf(strsql,"select str from Alx where fil='glk_osps.alx' order by ns asc");
if((kolstr=cur_alx.make_cursor(&bd,strsql)) < 0)
 {
  iceb_t_msql_error(&bd,gettext("Ошибка создания курсора !"),strsql);
  return(1);
 }

if(kolstr == 0)
 {
  iceb_t_soob(gettext("Не найдено ни одной записи настройки!"));
  return(1);
 }

clear();
short dz=0,mz=0,gz=0;

iceb_tu_rsdat(&dz,&mz,&gz,data_s.ravno(),0);

class iceb_tu_str shet("");
class iceb_tu_str shet_deb("");
class iceb_tu_str shet_kre("");
double debet=0.,kredit=0.;
class iceb_tu_str koment("");
int kolstr1=0;
int kol_prov=0;


sprintf(strsql,"DELETE FROM Prov WHERE datp='%04d-%02d-%02d' and komen like '%s%%'",gz,mz,dz,gettext("Обнуление сальдо"));

iceb_t_sql_zapis(strsql,1,0);

while(cur_alx.read_cursor(&row_alx) != 0)
 {
  strzag(LINES-1,0,kolstr,++kolstr1);

  if(row_alx[0][0] == '#')
   continue;

  printw("%s\n",row_alx[0]);
  refresh();
  
  if(iceb_tu_polen(row_alx[0],&shet,1,'|') != 0)
   continue;
  
  if(iceb_tu_polen(row_alx[0],&shet_deb,2,'|') != 0)
   continue;

  if(iceb_tu_polen(row_alx[0],&shet_kre,3,'|') != 0)
   continue;

  if(iceb_t_prsh1(shet.ravno()) != 0)
   continue;

  if(iceb_t_prsh1(shet_deb.ravno()) != 0)
   continue;
 
  if(iceb_tu_SRAV(shet_deb.ravno(),shet_kre.ravno(),0) != 0)
   if(iceb_t_prsh1(shet_kre.ravno()) != 0)
    continue;

  sprintf(strsql,"select saldo from Plansh where ns='%s'",shet_deb.ravno());
  if(iceb_t_sql_readkey(strsql,&row,&cur) == 1)
   {
    if(atoi(row[0]) == 3)
     {
      sprintf(strsql,"%s %s %s!",gettext("Счёт"),shet_deb.ravno(),gettext("имеет развёрнутое сальдо"));      
      iceb_t_soob(strsql);
      continue;      
     }
   }  

  sprintf(strsql,"select saldo from Plansh where ns='%s'",shet_kre.ravno());
  if(iceb_t_sql_readkey(strsql,&row,&cur) == 1)
   {
    if(atoi(row[0]) == 3)
     {
      sprintf(strsql,"%s %s %s!",gettext("Счёт"),shet_kre.ravno(),gettext("имеет развёрнутое сальдо"));      
      iceb_t_soob(strsql);
      continue;      
     }
   }  

  if(glk_osps_get_saldo_sh(shet.ravno(),data_s.ravno(),&debet,&kredit) != 0)
   continue;
  
  sprintf(strsql,"%s %s",gettext("Обнуление сальдо"),shet.ravno());
  koment.new_plus(strsql);
  
  if(fabs(debet) >= 0.01)
   {
    iceb_t_zapprov(0,gz,mz,dz,shet.ravno(),shet_deb.ravno(),"","","","","",0.,debet,koment.ravno_filtr(),2,0,time(NULL),0,0,0,0,0);
    kol_prov++;
   }

  if(fabs(kredit) >= 0.01)
   {
    iceb_t_zapprov(0,gz,mz,dz,shet.ravno(),shet_kre.ravno(),"","","","","",kredit,0.,koment.ravno_filtr(),2,0,time(NULL),0,0,0,0,0);
    kol_prov++;
   }
 } 
 
printw("%s:%d\n",gettext("Количество выполненных проводок"),kol_prov);
refresh();
if(kol_prov > 0)
 { 
  sprintf(strsql,"Проводки записаны по дате %02d.%02d.%04d с кометарием \"%s\"\n\%s:%d",
  dz,mz,gz,gettext("Обнуление сальдо"),
  gettext("Количество проводок"),kol_prov);
  iceb_t_soob(strsql);
 }
else
 OSTANOV();
 
return(0);



}
/*****************************************/
/*получение сальдо*/
/****************************************/ 
int glk_osps_get_saldo_sh(const char *shet,const char *data_saldo,double *debet,double *kredit)
{
short ds=0,ms=0,gs=0;
char strsql[1024];
SQL_str         row;
class SQLCURSOR cur;
int kolstr=0;short godn=startgodb;
double deb=0.,kre=0.;

*debet=0.;
*kredit=0.;

printw("%s:%s\n",gettext("Счёт"),shet);
refresh();

if(iceb_t_prsh1(shet) != 0)
 return(1);

if(iceb_tu_rsdat(&ds,&ms,&gs,data_saldo,0) != 0)
 return(1);

if(startgodb == 0 || startgodb > gs)
  godn=gs;


int vsaldo=0;
/*Узнаём наименование счёта*/
class iceb_tu_str naim_shet("");
sprintf(strsql,"select nais,saldo from Plansh where ns='%s'",shet);
if(iceb_t_sql_readkey(strsql,&row,&cur) == 1)
 {
  naim_shet.new_plus(row[0]);
  vsaldo=atoi(row[1]);
  if(vsaldo == 3)
   {
    sprintf(strsql,"%s %s %s!",gettext("Счёт"),shet,gettext("имеет развёрнутое сальдо"));
    iceb_t_soob(strsql);
    return(1);
   }
 }
else
 {
  sprintf(strsql,"%s %s %s!",gettext("Нет счёта"),shet,gettext("в плане счетов"));
  iceb_t_soob(strsql);
  return(1);
 }


sprintf(strsql,"select ns,deb,kre from Saldo where kkk='0' and gs=%d and ns like '%s%%'",
godn,shet);

if((kolstr=cur.make_cursor(&bd,strsql)) < 0)
 {
  iceb_t_msql_error(&bd,gettext("Ошибка создания курсора !"),strsql);
  return(1);
 }

while(cur.read_cursor(&row) != 0)
 {
  deb+=atof(row[1]);
  kre+=atof(row[2]);
 }

printw("%s %10.2f %10.2f\n",gettext("Стартовое сальдо"),deb,kre);
refresh();

sprintf(strsql,"select deb,kre from Prov where val=0 and datp >= '%04d-%02d-%02d' and \
datp <= '%04d-%02d-%02d' and sh like '%s%%'",
godn,1,1,gs,ms,ds,shet);

if((kolstr=cur.make_cursor(&bd,strsql)) < 0)
 {
  iceb_t_msql_error(&bd,gettext("Ошибка создания курсора !"),strsql);
  return(1);
 }

while(cur.read_cursor(&row) != 0)
 {
  deb+=atof(row[0]);
  kre+=atof(row[1]);
 }

printw("%s %10.2f %10.2f\n",gettext("Конечное сальдо"),deb,kre);
refresh();

if(deb > kre)
 {
  *debet=deb-kre;
  printw("%s:%10.2f\n",gettext("Дебет"),*debet);
 }
else
 {
  *kredit=kre-deb;
  printw("%s:%10.2f\n",gettext("Кредит"),*kredit);
 }  

return(0);

}
