/*$I:$*/
/*13.04.2021	01.02.2021	Белых А.И.	zarpkp.cpp
Перерасчёт квартальной премии в счёт месяцев начисления этой премии
Применяется для расчёта отпускных и командировочных расходов
*/
#include "buhg.h"

extern double okrg;

void zarpkp(short mn,short gn,
short mk,short gk,
int tabnom,
class zarpkp_dat *kpr,
int kolmes,
const char *kod_kp, /*код начисления квартральной премии*/
const char *kod_tab_kp) /*коды табеля для расчёта квартальной премии*/
{
int nom_kv=0;
int god_kv=0;
double suma_kv=0.;
short mes[3];
char strsql[1024];
char strsql1[2048];
int kolstr=0;
class SQLCURSOR cur,cur1;
SQL_str row,row1;
short metka_per[3];
float otr_dnei[3];
double suma_mes[3];
class iceb_tu_str kvartal("");
class iceb_tu_str god("");

if(atoi(kod_kp) == 0)
 return;

zar_pr_ins("\n"); /*отделяемся от вывода других подпрограмм*/ 

int kol_kod_kp=iceb_tu_pole2(kod_kp,',');

/*************************************
на данный момент у нас в списке квартальных премий только премии 
начисленные в диапазоне дат расчёта отпускных/командировочных. Могут быть премии
начиленные за диапазоном дат в счёт кварталов входящих в диапазон
дат расчёта отпукных/командировочных. Нужно их найти и добавить в список кварталов
************************************/


short d=1,m=mk,g=gk;
iceb_tu_dpm(&d,&m,&g,3);

if(kol_kod_kp == 0)
 sprintf(strsql,"select datz,suma,kom from Zarp where datz >= '%04d-%02d-%02d' and tabn=%d and knah=%d and suma <> 0. and prn='1' order by datz asc",
 g,m,1,tabnom,atoi(kod_kp));
else
 {
  class iceb_tu_str str("(");
  class iceb_tu_str kod("");
  for(int nomm=0; nomm < kol_kod_kp; nomm++)
   {
    if(iceb_tu_polen(kod_kp,&kod,nomm+1,',') != 0)
     continue;
    if(nomm == 0)
     str.plus("knah = ",kod.ravno());
    else
     str.plus(" or knah = ",kod.ravno());
   }  

  str.plus(")");
 
  sprintf(strsql,"select datz,suma,kom from Zarp where datz >= '%04d-%02d-%02d' and tabn=%d and ",
  g,m,1,tabnom);
  
  strcat(strsql,str.ravno());
  strcat(strsql," and suma <> 0. and prn='1' order by datz asc");
  
 }

sprintf(strsql1,"%s-%s\n",__FUNCTION__,strsql); 
zar_pr_ins(strsql1);

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

while(cur.read_cursor(&row) != 0)
 {
  iceb_tu_polen(row[2],&kvartal,2,'-');

  if(kvartal.ravno_atoi() > 4 || kvartal.ravno_atoi() < 1)
   continue;

  iceb_tu_polen(row[2],&god,3,'-');
  if(god.ravno_atoi() != gn && god.ravno_atoi() != gk)
   continue;  

  sprintf(strsql,"%d|%d|%s|%s",kvartal.ravno_atoi(),god.ravno_atoi(),row[1],iceb_tu_datzap(row[0]));

  kpr->kp.plus(strsql);  
 }



if(kpr->kp.kolih() == 0)
 return;

for(int nom=0; nom < kpr->kp.kolih(); nom++)
 {
  sprintf(strsql,"%s-%s\n",__FUNCTION__,kpr->kp.ravno(nom));
  zar_pr_ins(strsql);
  
  iceb_tu_polen(kpr->kp.ravno(nom),&nom_kv,1,'|');
  iceb_tu_polen(kpr->kp.ravno(nom),&god_kv,2,'|');
  iceb_tu_polen(kpr->kp.ravno(nom),&suma_kv,3,'|');
  
    
  if(nom_kv == 1)
   {
    mes[0]=1;
    mes[1]=2;
    mes[2]=3;
   }

  if(nom_kv == 2)
   {
    mes[0]=4;
    mes[1]=5;
    mes[2]=6;
   }

  if(nom_kv == 3)
   {
    mes[0]=7;
    mes[1]=8;
    mes[2]=9;
   }

  if(nom_kv == 4)
   {
    mes[0]=10;
    mes[1]=11;
    mes[2]=12;
   }
  
  metka_per[0]=metka_per[1]=metka_per[2]=0;
  
  /*проверяем входят ли даты в диапазон дат расчёта отпускных*/   
  sprintf(strsql,"%s-%02d.%d %02d.%d %02d.%d\n",
  __FUNCTION__,
  mes[nom],god_kv,
  mn,gn,
  mk,gk);
  
  zar_pr_ins(strsql);

  for(int nom=0; nom < 3; nom++)
   if(iceb_tu_sravmydat(1,mes[nom],god_kv,1,mn,gn) >= 0 && iceb_tu_sravmydat(1,mes[nom],god_kv,1,mk,gk) <= 0)
    metka_per[nom]=1; /*дата в диапазоне дат*/


  if(metka_per[0] == 0 and metka_per[1] == 0 and metka_per[2] == 0)
   {
    sprintf(strsql,"%s-Не подходит\n",__FUNCTION__);
    zar_pr_ins(strsql);
    continue;
   }

  sprintf(strsql,"%s-Подходит\n",__FUNCTION__);
  zar_pr_ins(strsql);
  
  if(kod_tab_kp[0] == '\0')
   {
    sprintf(strsql,"%s-Не введены коды табеля для расчёта квартальной премии!\n",__FUNCTION__);
    zar_pr_ins(strsql);
    continue;
   }       
  /*узнаём количество отработанных дней в каждом месяце*/
  otr_dnei[0]=otr_dnei[1]=otr_dnei[2]=0.;  
  for(int nom1=0; nom1 < 3; nom1++)
   {
    
    sprintf(strsql,"select god,mes,kodt,dnei from Ztab where god=%d and mes=%d and tabn=%d",
    god_kv,mes[nom1],tabnom);
  

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

    while(cur.read_cursor(&row) != 0)
     {
      if(iceb_tu_proverka(kod_tab_kp,row[2],0,1) != 0)
       continue;

      class iceb_tu_str nai_tab("");
      sprintf(strsql,"select naik from Tabel where kod=%d",atoi(row[2]));

      if(iceb_t_sql_readkey(strsql,&row1,&cur1) > 0)
         nai_tab.new_plus(row1[0]);
         

      sprintf(strsql,"%s-Отработано дней %s.%s %2s %2s %s\n",__FUNCTION__,row[1],row[0],row[3],row[2],nai_tab.ravno());
      zar_pr_ins(strsql);
      
      otr_dnei[nom1]+=atof(row[3]);
     }
   }

  float itogo_otr_dnei=0.;
  for(int nom=0; nom < 3; nom++)
   itogo_otr_dnei+=otr_dnei[nom];

  suma_mes[0]=suma_mes[1]=suma_mes[2]=0.;   
  for(int nom2=0; nom2 < 3; nom2++)
   {
    suma_mes[nom2]=suma_kv/itogo_otr_dnei*otr_dnei[nom2];
    suma_mes[nom2]=iceb_tu_okrug(suma_mes[nom2],okrg);

    sprintf(strsql,"%s-Год %d Квартал %d месяц %d - %.2f/%.2f*%.2f=%.2f\n",
    __FUNCTION__,god_kv,nom_kv,nom2+1,suma_kv,itogo_otr_dnei,otr_dnei[nom2],suma_mes[nom2]);
    zar_pr_ins(strsql);
   }


  d=1;
  m=mn;
  g=gn;

  for(int nomer=0; nomer < kolmes; nomer++)
   {
    for(int nom3=0; nom3 < 3; nom3++)
     {
      if(metka_per[nom3] == 1)
        if(m == mes[nom3])
          kpr->suma_kp_mes.plus(suma_mes[nom3],nomer);
           
     }
    iceb_tu_dpm(&d,&m,&g,3);
   }
 }

}

