/*$Id:$*/
/*18.12.2024	12.08.2014	Белых А.И.	zarvn.c
Расчёт военного сбора
*/
#include "buhg.h"
extern double   okrg; /*Округление*/
extern char *shetb; /*Бюджетные счета начислений*/
extern short kodvn; /*код военного сбора*/
extern short kodvs_b; /*код военного сбора с больничног*/
extern class iceb_tu_str kodvn_nvr; /*коды не входящие в расчёт*/
extern short *kodbl;  /*Коды начисления больничного*/
extern float  kof_prog_min; //Коэффициент прожиточного минимума

double zarnv_stip(int tn,short mr,short gr,double suma);

void zarvn(int tabnom,short mes,short god,int podr)
{
char strsql[2048];
int kolstr=0;
SQL_str row;
class SQLCURSOR cur;
class iceb_tu_str shet("");
class iceb_tu_str shet_b("");

sprintf(strsql,"\n%s-Расчёт военного сбора. Код военного сбора %d Код военного сбора с больничного %d\n\
-----------------------------------------------\n",__FUNCTION__,kodvn,kodvs_b);

zar_pr_ins(strsql);

/*Проверяем есть ли код удержания в списке*/
sprintf(strsql,"select shet from Zarn1 where tabn=%d and prn='2' and knah=%d",tabnom,kodvn); 
//printw("%s\n",strsql);
if(iceb_t_sql_readkey(strsql,&row,&cur) > 0)
 {
  
  sprintf(strsql,"%s-Коды не входящие в расчёт-%s\n",__FUNCTION__,kodvn_nvr.ravno());
  zar_pr_ins(strsql);
  
  shet.new_plus(row[0]);
 }
else 
 {
  sprintf(strsql,"%s-Не введён код военного сбора для работника\n",__FUNCTION__);
  zar_pr_ins(strsql);
  
  return;
 } 

sprintf(strsql,"select knah,suma,shet,mesn,godn from Zarp where datz >= '%04d-%02d-%02d' and \
datz <= '%04d-%02d-%02d' and tabn=%d and prn='1' and suma <> 0.",
god,mes,1,god,mes,31,tabnom);

if((kolstr=cur.make_cursor(&bd,strsql)) < 0)
 {
  iceb_t_msql_error(&bd,__FUNCTION__,strsql);
  return;
 }

if(kolstr == 0)
 {
  sprintf(strsql,"%s-Не найдено ни одного начисления\n",__FUNCTION__);
  zar_pr_ins(strsql);
 }

double suma=0.;
double sumab=0.;
double suma_bol=0.;
double suma_bolb=0.;
class iceb_tu_spisok mes_god_bol;
class iceb_tu_double mes_god_bol_suma;
class iceb_tu_double mes_god_bol_suma_b;
int nom=0;
while(cur.read_cursor(&row) != 0)
 {
  if(iceb_tu_proverka(kodvn_nvr.ravno(),row[0],0,1) == 0)
   {
    sprintf(strsql,"%s-Не вошло в расчёт Код=%s Сумма=%s\n",__FUNCTION__,row[0],row[1]);
    zar_pr_ins(strsql);
    
    continue;
   }

  suma+=atof(row[1]);
  if(iceb_tu_proverka(shetb,row[2],0,1) == 0)
     sumab+=atof(row[1]);

  if(provkod(kodbl,row[0]) >= 0)
   {
    sprintf(strsql,"%s.%s",row[3],row[4]);
    if((nom=mes_god_bol.find(strsql)) == -1)
     {
      mes_god_bol.plus(strsql);
      mes_god_bol_suma.plus(atof(row[1]));
      mes_god_bol_suma_b.plus(0.);
     }
    else
     {
      mes_god_bol_suma.plus(atof(row[1]),nom);
      mes_god_bol_suma.plus(0.,nom);
     }

    suma_bol+=atof(row[1]);   
    if(iceb_tu_proverka(shetb,row[2],0,1) == 0)
     {
      sprintf(strsql,"%s.%s",row[3],row[4]);
      if((nom=mes_god_bol.find(strsql)) == -1)
       {
        mes_god_bol.plus(strsql);
        mes_god_bol_suma.plus(0.);
        mes_god_bol_suma_b.plus(atof(row[1]));
       }
      else
       {
        mes_god_bol_suma.plus(0.,nom);
        mes_god_bol_suma_b.plus(atof(row[1]),nom);
       }
      
      suma_bolb+=atof(row[1]);   
     }
   }
 }

int zvan=0;
class iceb_tu_str haract_r("");
double suman=0.;
/*для студентов со стипендии сума в расчёт считается по другому*/
sprintf(strsql,"select harac,zvan from Kartb where tabn=%d",tabnom);
if(iceb_t_sql_readkey(strsql,&row,&cur) <= 0)
 {
  sprintf(strsql,"%s-Не найден карточка для табельного номера %d",__FUNCTION__,tabnom);
  zar_pr_ins(strsql);
 }
else
 {
  zvan=atoi(row[1]);
  haract_r.new_plus(row[0]);  
 } 

sprintf(strsql,"%s-Характер работы-%s Звание=%d\n",__FUNCTION__,haract_r.ravno(),zvan);
zar_pr_ins(strsql);

if(iceb_tu_strstrm(haract_r.ravno(),"студент") == 1)
 {

  if((suman=zarnv_stip(tabnom,mes,god,suma)) == 0.)
   return;
  suma=suman;
  sumab=0.;
 }
else
 {
  if(kodvs_b != 0)
   suma-=suma_bol; 

  suman=suma;
 }

sprintf(strsql,"%s-Cумма с которой берётся налог %.2f Cумма больничных %.2f\n",__FUNCTION__,suma,suma_bol);
zar_pr_ins(strsql);

if(sumab != 0.)
 {
  /*узнаём бюджетный и хозрасчётный счёт*/
  sprintf(strsql,"select shet,shetb from Uder where kod=%d",kodvn);
  if(iceb_t_sql_readkey(strsql,&row,&cur) == 1)
   {
    shet.new_plus(row[0]);
    shet_b.new_plus(row[1]);
    if(shet_b.getdlinna() <= 1)
     {
      sprintf(strsql,"%s-Не введён бюджетный счёт для кода удержания %d\n",__FUNCTION__,kodvn);
      zar_pr_ins(strsql);
     }
   }  

  sprintf(strsql,"%s-Бюджетная сумма с которой берётся налог%.2f\n",__FUNCTION__,sumab);
  zar_pr_ins(strsql);
 
 }
 
float proc_vn=zar_get_pvs(1,mes,god,zvan);
double suma_nal_b=0.;

if(sumab != 0.)
 {
  
  suma_nal_b=sumab*proc_vn/100.;
  suma_nal_b=iceb_tu_okrug(suma_nal_b,0.01);
  sprintf(strsql,"%s-Бюджетный налог %.2f*%.2f/100.=%.2f\n",__FUNCTION__,sumab,proc_vn,suma_nal_b);
  zar_pr_ins(strsql);
 }

double suma_nal=0.;


if(suman - sumab > 0.009)
 {
  suma_nal=(suman-sumab)*proc_vn/100.;
  suma_nal=iceb_tu_okrug(suma_nal,0.01);
  sprintf(strsql,"%s-%.2f-%.2f*%.2f/100.=%.2f\n",__FUNCTION__,suman,sumab,proc_vn,suma_nal);
  zar_pr_ins(strsql);
 }
 
suma_nal*=-1; /*удержание должно быть отрицательным*/
suma_nal_b*=-1; /*удержание должно быть отрицательныйм*/

short d=31;

iceb_tu_dpm(&d,&mes,&god,5);

class ZARP     zp;

zp.dz=d;
zp.mesn=mes; zp.godn=god;
zp.nomz=0;
zp.podr=podr;
strcpy(zp.shet,shet.ravno());
sprintf(strsql,"%.2f%%",proc_vn);
class iceb_tu_str koment(strsql);

zapzarp(d,mes,god,tabnom,2,kodvn,suma_nal,shet.ravno(),mes,god,0,0,koment.ravno(),podr,"",zp); 

if(shetb != NULL)
if(shetb[0] != '\0')
if(shet_b.getdlinna() > 1)
 {
  strcpy(zp.shet,shet_b.ravno());
  zapzarp(d,mes,god,tabnom,2,kodvn,suma_nal_b,shet_b.ravno(),mes,god,0,0,koment.ravno(),podr,"",zp); 
 }


if(kodvs_b == 0)
 {
  sprintf(strsql,"%s-Код военного сбора с больничного равен нолю!\n",__FUNCTION__);
  zar_pr_ins(strsql);
  return;
 }

sprintf(strsql,"select shet from Zarn1 where tabn=%d and prn='2' and knah=%d",tabnom,kodvs_b); 
if(iceb_t_sql_readkey(strsql,&row,&cur) <= 0)
 {
  sprintf(strsql,"select shet,shetb from Uder where kod=%d",kodvs_b);
  if(iceb_t_sql_readkey(strsql,&row,&cur) <= 0)
   {
    sprintf(strsql,"%s-Не найден код военного сбора с больничного в справочнике удержаний!\n",__FUNCTION__);
    zar_pr_ins(strsql);
    return;
   }
  else
   {
    if(row[0][0] == '\0')
     {
      sprintf(strsql,"%s-В справочнике удержаний для \"Военный сбор с больничных\" не введён счёт!\n",__FUNCTION__);
      zar_pr_ins(strsql);
      return;
     }
    shet.new_plus(row[0]);
    shet_b.new_plus(row[1]);
   }
 } 
else
 {
  shet.new_plus(row[0]);

  if(shetb != NULL)/*если расчёт с бюджетом до счета нужно брать только в справочнике удержаний так как неизветно какой счёт был в последней записи удержания*/
  if(shetb[0] != '\0')
   {
    sprintf(strsql,"select shet,shetb from Uder where kod=%d",kodvs_b);
    if(iceb_t_sql_readkey(strsql,&row,&cur) <= 0)
     {
      sprintf(strsql,"%s-Не найден код военного сбора с больничного в справочнике удержаний!\n",__FUNCTION__);
      zar_pr_ins(strsql);
      return;
     }
    else
     {
      if(row[1][0] == '\0')
       {
        sprintf(strsql,"%s-В справочнике удержаний для \"Военный сбор с больничных\" не введён бюджетный счёт!\n",__FUNCTION__);
        zar_pr_ins(strsql);
       }
      shet.new_plus(row[0]);
      shet_b.new_plus(row[1]);
     }
   }
 }


if(shet.getdlinna() <= 1)
 {
  sprintf(strsql,"%s-Для удержания \"Военный сбор с больничных\" не введён счёт!\n",__FUNCTION__);
  zar_pr_ins(strsql);
  return;
 }

/*считаем с больничных*/

suma_nal_b=0.;
suma_nal=0.;
short mr=0,gr=0;
double sm=0.;
for(nom=0; nom < mes_god_bol.kolih(); nom++)
 {
  sm=0.;   
  /*больничные могут быть в счёт месяцев с рдугим процентом*/
  iceb_tu_rsdat1(&mr,&gr,mes_god_bol.ravno(nom));  
  proc_vn=zar_get_pvs(1,mr,gr,zvan);

  if(mes_god_bol_suma_b.ravno(nom) != 0.)
   {
    
    sm=mes_god_bol_suma_b.ravno(nom)*proc_vn/100.;
    sm=iceb_tu_okrug(sm,0.01)*-1;
    suma_nal_b+=sm;
    sprintf(strsql,"%s-%d.%d Бюджетный налог с больничных %.2f*%.2f/100.=%.2f\n",__FUNCTION__,mr,gr,mes_god_bol_suma_b.ravno(nom),proc_vn,sm);
    zar_pr_ins(strsql);
   }    

  if(mes_god_bol_suma.ravno(nom) != 0.)
   {

    sm=(mes_god_bol_suma.ravno(nom)-mes_god_bol_suma_b.ravno(nom))*proc_vn/100.;

    
    sm=iceb_tu_okrug(sm,0.01)*-1;
    suma_nal+=sm;

    sprintf(strsql,"%s-%d.%d Налог с больничных %.2f*%.2f/100.=%.2f\n",__FUNCTION__,mr,gr,mes_god_bol_suma.ravno(nom)-mes_god_bol_suma_b.ravno(nom),proc_vn,sm);
    zar_pr_ins(strsql);

   }
 }
if(suma_nal_b != 0.)
 {
  sprintf(strsql,"%s-Бюджетный военный сбор=%.2f\n",__FUNCTION__,suma_nal_b);
  zar_pr_ins(strsql);
 }
if(suma_nal != 0.)
 {
  sprintf(strsql,"%s-Военный сбор=%.2f\n",__FUNCTION__,suma_nal);
  zar_pr_ins(strsql);
 }
/********************** 
if(suma_bolb != 0.)
 {
  suma_nal_b=suma_bolb*proc_vn/100.;
  suma_nal_b=iceb_tu_okrug(suma_nal_b,0.01);
  sprintf(strsql,"%s-Бюджетный налог с больничных %.2f*%.2f/100.=%.2f\n",__FUNCTION__,suma_bolb,proc_vn,suma_nal_b);
  zar_pr_ins(strsql);
 }

if(suma_bolb < suma_bol)
 {
  suma_nal=(suma_bol-suma_bolb)*proc_vn/100.; 
  suma_nal=iceb_tu_okrug(suma_nal,0.01)*-1;
 }
sprintf(strsql,"%s-Налог с больничных %.2f*%.2f/100.=%.2f\n",__FUNCTION__,suma_bol-suma_bolb,proc_vn,suma_nal);
zar_pr_ins(strsql);
***************************/
koment.plus(" ",gettext("С больничного"));
strcpy(zp.shet,shet.ravno());

if(zapzarp(d,mes,god,tabnom,2,kodvs_b,suma_nal,shet.ravno(),mes,god,0,0,koment.ravno(),podr,"",zp) == 1)
 {
  sprintf(strsql,"%s-Запись уже есть!\n",__FUNCTION__);
  zar_pr_ins(strsql);
 }


if(shetb != NULL)
if(shetb[0] != '\0')
if(shet_b.getdlinna() > 1)
 {
  sprintf(strsql,"%s-Налог с бюджетных больничных %.2f\n",__FUNCTION__,suma_nal_b);
  zar_pr_ins(strsql);

  strcpy(zp.shet,shet_b.ravno());
  koment.plus(" ",gettext("бюджет"));

  zapzarp(d,mes,god,tabnom,2,kodvs_b,suma_nal_b,shet_b.ravno(),mes,god,0,0,koment.ravno(),podr,"",zp); 
 }


}
/****************************************/
/*расчёт для стипендии*/
/***********************************/
double zarnv_stip(int tn,short mr,short gr,double suma)
{
class zar_read_tn1h nast_mz;
double suma_for_nal=0.;
char strsql[1024];


sprintf(strsql,"%s-Расчёт для стипендии\n",__FUNCTION__);
zar_pr_ins(strsql);
zar_read_tn1(1,mr,gr,&nast_mz);

sprintf(strsql,"%s-Коэффициент прожиточного минимума=%.2f\n",__FUNCTION__,kof_prog_min);
zar_pr_ins(strsql);

sprintf(strsql,"%s-Сумма всех начислений %.2f\n",__FUNCTION__,suma);
zar_pr_ins(strsql);

double maxsum_bn=nast_mz.prog_min_ng*kof_prog_min;
maxsum_bn=iceb_tu_okrug(maxsum_bn,10.);

sprintf(strsql,"%s-Максимальная стипендия с которой не берётся налог %.2f*%.2f=%.2f\n",__FUNCTION__,nast_mz.prog_min_ng,kof_prog_min,maxsum_bn);
zar_pr_ins(strsql);

if(maxsum_bn >= suma)
 {
  sprintf(strsql,"%s-Налог не берётся так как %.2f > %.2f\n",__FUNCTION__,maxsum_bn,suma);
  zar_pr_ins(strsql);
  return(0.);  
 }

suma_for_nal=suma-maxsum_bn;
suma_for_nal=iceb_tu_okrug(suma_for_nal,okrg);

sprintf(strsql,"%s-Сумма которой берётся налог %.2f-%.2f=%.2f\n",__FUNCTION__,suma,maxsum_bn,suma_for_nal);
zar_pr_ins(strsql);


return(suma_for_nal);

}
