Скрипт расчета ЗП по отчету

EXECUTE block
RETURNS (
  DCODE INTEGER,
  DNAME VARCHAR(48),
  BDATE DATE,
  FDATE DATE,
  RAZDEL INTEGER,
  depname TYPE OF COLUMN buh$zarplata_calc.depname,
  FILIAL INTEGER,
  FNAME VARCHAR(48),
  SECTID INTEGER,
  CSECT VARCHAR(128),
  SCHTYPEID INTEGER,
  SCHTYPE VARCHAR(48),
  SPECCODE INTEGER,
  SPECNAME VARCHAR(255),
  wday INT,
  wdayname VARCHAR(24),
  CALCTYPE INTEGER,               --  ( 1 - выработка, 2 - списание, 3 - экспертиза СК, 7 - zaved line ) (+0 - invis / +10 - visible)
  SUMMA_NACH_DOCT NUMERIC(10,2),
  SUMMA_NACH NUMERIC(10,2),
  schcount INTEGER,
  PROC_MINUS NUMERIC(10,2),
  PROC_ZP NUMERIC(10,2),
  SUMMA_ZP NUMERIC(10,2),
  DCODE_ZAVED INTEGER,
  SUMMA_ZAVED NUMERIC(10,2)
)
AS
--
DECLARE inbdate DATE;
DECLARE infdate DATE;
DECLARE inList  ttext16k;
DECLARE ch CHAR(1);
--
DECLARE doclist  ttext16k;
DECLARE sqlText  ttext16k;
DECLARE sqlText2 ttext16k;
DECLARE tmp_date DATE;
--
DECLARE wday0 INT;
DECLARE wday1 INT;
DECLARE wday2 INT;
DECLARE wday3 INT;
DECLARE wday4 INT;
DECLARE wday5 INT;
DECLARE wday6 INT;
DECLARE wday7 INT;
DECLARE wday11 INT;
DECLARE wday17 INT;
--
BEGIN
  inbdate = '<bdate>';
  infdate = '<fdate>';
  inList  = '<DoctorList>';
 
  --
  ch  = ascii_char(39);                                                   
  -- --
  -- 1.1 формируем список докторов
  -- --
  sqlText = 'select d.dcode, 11 calctype from getlist('||ch||inList||ch||') l left join doctor d on d.dcode=l.id';
 
  -- --
  -- 1.2 добавляем к списку докторов для вычисления заведования
  -- --
  sqlText = sqlText||' union all select rekvint11, 1 from getlist('||ch||inList||ch||') l left join dicinfo d on d.rekvint10=l.id where refid=1111110 and d.rekvint11 not in ('||inList||')';
 
  -- --                                                                                     
  -- 2. добавляем периоды для вычисления (помесячно)
  -- --
  sqlText = 'select distinct t.dcode, calctype, doc.filial||'' ''||doc.dname, dep.depname, dep.razdel, 
                    maxvalue(dt.bdate, outdate+1-extract(day from outdate)), 
                    minvalue(dt.fdate, dateadd(1 month to outdate+1-extract(day from outdate))-1, coalesce(doc.lockdate-1,dt.fdate))
               from ('||sqlText||') t
               left join (select cast(? as timestamp) bdate, cast(? as timestamp) fdate from rdb$database) dt on 1=1
               left join doctor doc on doc.dcode=t.dcode     
               left join departments dep on dep.depnum=doc.depnum
               left join getdate(dt.bdate, dt.fdate) d on 1=1';
  FOR EXECUTE statement (sqlText)(inbdate, infdate)
  ON external '192.168.2.47:MED99' AS USER 'CHEA' password 'PDNTP'
  INTO dcode, calctype, dname, depname, razdel, bdate, fdate do
  BEGIN
    dcode_zaved=0;
    EXECUTE statement ('select first 1 rekvint10 from dicinfo where refid=1111110 and ? in (rekvint10,rekvint11) and (disdate is null or disdate> ? ) and bdate <= ? ')(dcode,bdate,fdate)
    ON external '192.168.2.47:MED99' AS USER 'CHEA' password 'PDNTP'
    INTO dcode_zaved;
    EXECUTE statement ('insert into buh$zarplata_calc(dcode, calctype, dname, depname, razdel, bdate, fdate, dcode_zaved) values (?,?,?,?,?,?,?,?)')(dcode,calctype,dname,depname,razdel,bdate,fdate,dcode_zaved);               
  END      
 
  -- --
  -- 3. вычисляем начисленные суммы
  -- --                            
  FOR SELECT dcode, dname, calctype, bdate, fdate, depname, razdel, dcode_zaved FROM buh$zarplata_calc
  INTO dcode, dname, calctype, bdate, fdate, depname, razdel, dcode_zaved do
  BEGIN
    -- --
    -- 3.0 Получение данных по дням недели по %
    -- --
    wday0=0;                                                       -- все
    wday1=0; wday2=0; wday3=0; wday4=0; wday5=0; wday6=0; wday7=0; -- по дням
    wday11=0; wday17=0;                                            -- будни/вых
    FOR EXECUTE statement ('select rekvint3 from dicinfo where refid=1111111
                               and bdate <= ? and (disdate is null or disdate>= ?  )
                               and dcode = ? ')(bdate, fdate, dcode)
    ON external '192.168.2.47:MED99' AS USER 'CHEA' password 'PDNTP'
    INTO wday do
    BEGIN
      IF (wday=0) THEN wday0=1;
      IF (wday=1) THEN wday1=1;
      IF (wday=2) THEN wday2=1;
      IF (wday=3) THEN wday3=1;
      IF (wday=4) THEN wday4=1;
      IF (wday=5) THEN wday5=1;
      IF (wday=6) THEN wday6=1;
      IF (wday=7) THEN wday7=1;
      IF (wday=11) THEN wday11=1;
      IF (wday=17) THEN wday17=1;
    END
 
    -- --
    -- 3.1 расчет всех наловых приходных операций
    -- --
    sqlText2 = '/* оплата нал */
                select ''nal'' tables, i.filial, i.pcode, extract(weekday from coalesce(t.treatdate,i.paydate)) wday, t.amountcl_disc amountcl, t.orderno, t.doctype, i.paycode, i.dcode, null depnum, i.amountrub summa_pay
                  from incom i
                  left join treat t on i.orderno = t.orderno or i.extreatcode = t.treatcode
                 where i.paydate between ? and ?
                   and i.dcode= ?
                   and i.PayCode not in (5,6) union all
                /* оплата карта */
                select ''cred'', i.filial, i.pcode, extract(weekday from coalesce(t.treatdate,i.pmdate)) wday, t.amountcl_disc, t.orderno, t.doctype, 1, i.dcode, null, i.amountrub
                  from jppayments i
                  left join treat t on i.extreatcode = t.treatcode
                 where i.jid=100
                   and i.pmdate between ? and ?
                   and i.dcode= ?
                   and coalesce(i.bnalpay,0) = 0
                   and i.opertype not in (5,6) union
                select ''cred'', i.filial, i.pcode, extract(weekday from coalesce(t.treatdate,i.lcdate)) wday, t.amountcl_disc, t.orderno, t.doctype, 1, i.dcode, null, i.amountrub
                  from losecredit i
                 inner join treat t on i.treatcode = t.treatcode
                 where i.lcdate between ? and ?
                   and i.dcode= ?
                   and i.paycode in (-1,-3,-2) union all
                /* погашение из аванса (нал + карта) */
                select ''avans'', i.filial, i.pcode, extract(weekday from coalesce(t.treatdate,i.paydate)) wday, t.amountcl_disc, t.orderno, t.doctype, i.typeoper, i.dcode, null, i.amountrub
                  from clavans i
                 inner join treat t on i.treatcode = t.treatcode
                 where i.paydate between ? and ?
                   and i.dcode= ?
                   and i.typeoper in (1,3)';
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    sqlText = '';
    -- --
    -- 3.1.1 расчет прихода нала без программ и без франшизы для стоматологии
    -- --
    IF (razdel = 1) THEN
    BEGIN
      sqlText = 'select f.filid, f.shortname,
                        sectid, csect,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        schtypeid, schtype,
                        wday,
                        sum(realcount), sum(schamount)
                   from (select ii.filial,
                                case when ii.tables=''cred'' and ii.paycode=-1 then 0 when ii.orderno is null then 1 else od.realcount end realcount,
                                case when ii.orderno is null then summa_pay else od.schamount*ii.summa_pay/ii.amountcl end schamount,
                                sr.sectid, sr.shortname csect,
                                4 schtypeid, null schtype,
                                max(case when ws.speccode=36 then 35                 /* парадонтология => стом терапия */
                                         when ws.speccode between 55 and 59 then 15  /* лаборатория */
                                         else ws.speccode end) over (partition by ii.orderno) speccode,
                                ii.wday,
                                (select spp.scode from speciality spp where spp.depnum=dep.depnum and mainspec=1) spec_dep
                           from ('||sqlText2||') ii
                           join orderdet od on od.orderno=ii.orderno and od.doctype !=7 and coalesce(od.progservid,0)=0 and od.doctype<10
                           left join doctor d on d.dcode=ii.dcode
                           left join departments dep on dep.depnum=coalesce(ii.depnum, d.depnum)
                           left join wschema ws on od.schcode = ws.schid
                           left join sectorref sr on sr.sectid=4363
                          ) t
                   left join filials f on f.filid=t.filial
                   left join speciality sp on sp.scode=case when t.speccode=33 then t.spec_dep else t.speccode end
                  group by t.filial, 1, 2, 3, 4, 5, 6, 7, 8, 9
                  order by t.filial, 4, 7, 6, 1';
    END
 
    -- --
    -- 3.1.2 расчет прихода нала без программ и без франшизы для поликлиники
    -- --
    ELSE IF (razdel = 2) THEN
    BEGIN
      sqlText = 'select f.filid, f.shortname,
                        sr.sectid, sr.shortname,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        case when coalesce(w.consult,0)=1 then 1
                              when coalesce(w.diagnost,0)=1 then 2
                              when coalesce(w.isoperation,0)=1 then 3
                              when ii.doctype in (13,14) then 5
                              else 4 end,
                        case when coalesce(w.consult,0)=1 then ''1. Косультация''
                              when coalesce(w.diagnost,0)=1 then ''2. Диагностика''
                              when coalesce(w.isoperation,0)=1 then ''3. Операция''
                              when ii.doctype in (13,14) then ''5. Лаборатория''
                              when ii.doctype is null then ''4. Опл. возвратов''
                              else ''4. Манипуляция'' end,
                        ii.wday,
                        sum(case when ii.tables=''cred'' and ii.paycode=-1 then 0 when ii.orderno is null then 1 else od.realcount end),
                        sum(case when ii.orderno is null then summa_pay else schamount*summa_pay/ii.amountcl end)
                   from ('||sqlText2||') ii
                   join orderdet od on od.orderno=ii.orderno and od.doctype !=7 and coalesce(od.progservid,0)=0 and od.doctype<10
                   left join doctor d on d.dcode=ii.dcode
                   left join departments dep on dep.depnum=coalesce(ii.depnum, d.depnum)
                   left join wschema w on od.schcode = w.schid
                   left join speciality sp on (sp.scode=case when w.speccode between 55 and 59 then 15 else w.speccode end  or
                                               w.speccode is null and sp.depnum=dep.depnum and sp.mainspec=1 )
                   left join filials f on f.filid=ii.filial
                   left join sectorref sr on sr.sectid=4363
                  group by 1,2,3,4,5,6,7,8, 9
                  order by 1, 4, 7, 6, 1 ';
    END
 
    -- не определено
    ELSE
    BEGIN
      EXECUTE statement ('select OUTSTR from GET_TRANSLIT(?)')('Не определен раздел медицины / отделение для доктора '||COALESCE(dname,'-')||' [dcode='||COALESCE(dcode,-1)||']') INTO sqlText;
      EXECUTE PROCEDURE raise_exception('=>'||ascii_char(13)||ascii_char(10)||'=>'||sqlText||ascii_char(13)||ascii_char(10)||'=>');
    END
 
    FOR EXECUTE statement (sqlText)(bdate, fdate, dcode,
                               bdate, fdate, dcode,
                               bdate, fdate, dcode,
                               bdate, fdate, dcode)
    ON external '192.168.2.47:MED99' AS USER 'CHEA' password 'PDNTP'
    INTO filial, fname, sectid, csect, speccode, specname, schtypeid, schtype, wday, schcount, summa_nach do
    BEGIN
      IF (wday=0) THEN wday=7;
      --
      IF (wday=1 AND wday1=1) THEN BEGIN END
      ELSE IF (wday=2 AND wday2=1) THEN BEGIN END
      ELSE IF (wday=3 AND wday3=1) THEN BEGIN END
      ELSE IF (wday=4 AND wday4=1) THEN BEGIN END
      ELSE IF (wday=5 AND wday5=1) THEN BEGIN END
      ELSE IF (wday=6 AND wday6=1) THEN BEGIN END
      ELSE IF (wday=7 AND wday7=1) THEN BEGIN END
      ELSE IF (wday11=1 AND wday BETWEEN 1 AND 5) THEN wday = 11;
      ELSE IF (wday17=1 AND wday BETWEEN 6 AND 7) THEN wday = 17;
      ELSE wday=0;
      --
      EXECUTE statement('insert into buh$zarplata_calc (dcode, dname, depname, razdel, calctype, dcode_zaved, bdate, fdate, filial, fname, sectid, csect, speccode, specname, schtypeid, schtype, wday, schcount, summa_nach)
          values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)')(dcode, dname, depname, razdel,calctype,dcode_zaved,bdate,fdate,filial,fname,sectid,csect,speccode,specname,schtypeid,schtype,wday,schcount,summa_nach);
    END
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    sqlText = '';
    -- --
    -- 3.1.3 расчет по франшизе, наловая приходная часть для стоматологии
    -- --
    IF (razdel = 1) THEN
    BEGIN
      sqlText = 'select f.filid, f.shortname,
                        sectid, csect,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        schtypeid, schtype,
                        wday,
                        sum(realcount), sum(schamount)
                   from (select ii.filial,
                                case when ii.tables=''cred'' and ii.paycode=-1 then 0 when ii.orderno is null then 1 else od.realcount end realcount,
                                case when ii.orderno is null then summa_pay else od.schamount*ii.summa_pay/ii.amountcl end schamount,
                                sr.sectid, sr.shortname csect,
                                4 schtypeid, null schtype,
                                max(case when ws.speccode=36 then 35                 /* парадонтология => стом терапия */
                                         when ws.speccode between 55 and 59 then 15  /* лаборатория */
                                         else ws.speccode end) over (partition by ii.orderno) speccode,
                                ii.wday,
                                (select spp.scode from speciality spp where spp.depnum=dep.depnum and mainspec=1) spec_dep
                           from ('||sqlText2||') ii
                           join orderdet od on od.orderno=ii.orderno and od.doctype =7
                           left join doctor d on d.dcode=ii.dcode
                           left join departments dep on dep.depnum=coalesce(ii.depnum, d.depnum)
                           left join wschema ws on od.schcode = ws.schid
                           left join sectorref sr on sr.sectid=994052961
                          ) t
                   left join filials f on f.filid=t.filial
                   left join speciality sp on sp.scode=case when t.speccode=33 then t.spec_dep else t.speccode end
                  group by t.filial, 1, 2, 3, 4, 5, 6, 7, 8, 9
                  order by t.filial, 4, 7, 6, 1';
    END
 
    -- --
    -- 3.1.4 расчет по франшизе, наловая приходная часть для поликлиики
    -- --
    ELSE IF (razdel = 2) THEN
    BEGIN
      sqlText = 'select f.filid, f.shortname,
                        sr.sectid, sr.shortname,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        case when coalesce(w.consult,0)=1 then 1
                              when coalesce(w.diagnost,0)=1 then 2
                              when coalesce(w.isoperation,0)=1 then 3
                              when ii.doctype in (13,14) then 5
                              else 4 end,
                        case when coalesce(w.consult,0)=1 then ''1. Косультация''
                              when coalesce(w.diagnost,0)=1 then ''2. Диагностика''
                              when coalesce(w.isoperation,0)=1 then ''3. Операция''
                              when ii.doctype in (13,14) then ''5. Лаборатория''
                              when ii.doctype is null then ''4. Опл. возвратов''
                              else ''4. Манипуляция'' end,
                        wday,
                        sum(case when ii.tables=''cred'' and ii.paycode=-1 then 0 when ii.orderno is null then 1 else od.realcount end),
                        sum(case when ii.orderno is null then summa_pay else schamount*summa_pay/ii.amountcl end)
                   from ('||sqlText2||') ii
                   join orderdet od on od.orderno=ii.orderno and od.doctype =7
                   left join doctor d on d.dcode=ii.dcode
                   left join departments dep on dep.depnum=coalesce(ii.depnum, d.depnum)
                   left join wschema w on od.schcode = w.schid
                   left join speciality sp on (sp.scode=case when w.speccode between 55 and 59 then 15 else w.speccode end  or
                                               w.speccode is null and sp.depnum=dep.depnum and sp.mainspec=1 )
                   left join filials f on f.filid=ii.filial
                   left join sectorref sr on sr.sectid=994052961
                  group by 1,2,3,4,5,6,7,8,9
                  order by 1, 4, 7, 6, 1 ';
    END
 
    -- не определено
    ELSE
    BEGIN
      EXECUTE statement ('select OUTSTR from GET_TRANSLIT(?)')('Не определен раздел медицины / отделение для доктора '||COALESCE(dname,'-')||' [dcode='||COALESCE(dcode,-1)||']') INTO sqlText;
      EXECUTE PROCEDURE raise_exception('=>'||ascii_char(13)||ascii_char(10)||'=>'||sqlText||ascii_char(13)||ascii_char(10)||'=>');
    END
 
    FOR EXECUTE statement (sqlText)(bdate, fdate, dcode,
                               bdate, fdate, dcode,
                               bdate, fdate, dcode,
                               bdate, fdate, dcode)
    ON external '192.168.2.47:MED99' AS USER 'CHEA' password 'PDNTP'
    INTO filial, fname, sectid, csect, speccode, specname, schtypeid, schtype, wday, schcount, summa_nach do
    BEGIN
      csect = TRIM(csect)||' (нал)';
      IF (wday=0) THEN wday=7;
      --
      IF (wday=1 AND wday1=1) THEN BEGIN END
      ELSE IF (wday=2 AND wday2=1) THEN BEGIN END
      ELSE IF (wday=3 AND wday3=1) THEN BEGIN END
      ELSE IF (wday=4 AND wday4=1) THEN BEGIN END
      ELSE IF (wday=5 AND wday5=1) THEN BEGIN END
      ELSE IF (wday=6 AND wday6=1) THEN BEGIN END
      ELSE IF (wday=7 AND wday7=1) THEN BEGIN END
      ELSE IF (wday11=1 AND wday BETWEEN 1 AND 5) THEN wday = 11;
      ELSE IF (wday17=1 AND wday BETWEEN 6 AND 7) THEN wday = 17;
      ELSE wday=0;
      --
      EXECUTE statement('insert into buh$zarplata_calc  (dcode, dname, depname, razdel, calctype, dcode_zaved, bdate, fdate, filial, fname, sectid, csect, speccode, specname, schtypeid, schtype, wday, schcount, summa_nach)
          values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)')(dcode, dname, depname, razdel,calctype,dcode_zaved,bdate,fdate,filial,fname,sectid,csect,speccode,specname,schtypeid,schtype,wday,schcount,summa_nach);
    END
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    -- --
    -- 3.2 расчет всех наловых возвратов
    -- --
    sqlText2 = '/* возврат нал */
                select ''v.nal'' tables, i.filial, i.pcode, extract(weekday from coalesce(t.treatdate,i.paydate)) wday, t.amountcl_disc amountcl, t.orderno, t.doctype, i.paycode, i.dcode, i.depnum, -i.amountrub summa_pay
                  from incom i
                  left join treat t on i.extreatcode = t.treatcode
                 where i.paydate between ? and ?
                   and i.dcode= ?
                   and i.paycode = 5 union all
 
                /* возврат карта */
                select ''v.cred'',i.filial,i.pcode, extract(weekday from coalesce(t.treatdate,i.pmdate)) wday,t.amountcl_disc,t.orderno, t.doctype,i.opertype,i.dcode,i.depnum,-i.amountrub
                  from jppayments i
                  left join treat t on i.extreatcode = t.treatcode
                 where i.jid = 100
                   and i.pmdate between ? and ?
                   and i.dcode= ?
                   and coalesce(i.bnalpay,0) = 0
                   and i.opertype = 5';
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    sqlText = '';
    -- --
    -- 3.2.1 расчет возврата нала без программ и без франшизы для стоматологии
    -- --
    IF (razdel = 1) THEN
    BEGIN
      sqlText = 'select f.filid, f.shortname,
                        sectid, csect,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        schtypeid, schtype,
                        wday,
                        sum(realcount), sum(schamount)
                   from (select ii.filial,
                                case when ii.tables=''cred'' and ii.paycode=-1 then 0 when ii.orderno is null then 1 else od.realcount end realcount,
                                case when ii.orderno is null then summa_pay else od.schamount*ii.summa_pay/ii.amountcl end schamount,
                                sr.sectid, sr.shortname csect,
                                6 schtypeid, ''6. Опл. возвратов'' schtype,
                                max(case when ws.speccode=36 then 35                 /* парадонтология => стом терапия */
                                         when ws.speccode between 55 and 59 then 15  /* лаборатория */
                                         else ws.speccode end) over (partition by ii.orderno) speccode,
                                wday,
                                (select spp.scode from speciality spp where spp.depnum=dep.depnum and mainspec=1) spec_dep
                           from ('||sqlText2||') ii
                           left join orderdet od on od.orderno=ii.orderno and od.doctype !=7 and coalesce(od.progservid,0)=0 and od.doctype<10
                           left join doctor d on d.dcode=ii.dcode
                           left join departments dep on dep.depnum=coalesce(ii.depnum, d.depnum)
                           left join wschema ws on od.schcode = ws.schid
                           left join sectorref sr on sr.sectid=4363
                          ) t
                   left join filials f on f.filid=t.filial
                   left join speciality sp on sp.scode=case when t.speccode=33 then t.spec_dep else coalesce(t.speccode,t.spec_dep) end
                  group by t.filial, 1, 2, 3, 4, 5, 6, 7, 8, 9
                  order by t.filial, 4, 7, 6, 1';
    END
 
    -- --
    -- 3.2.2 расчет возврата нала без программ и без франшизы для поликлиники
    -- --
    ELSE IF (razdel = 2) THEN
    BEGIN
      sqlText = 'select f.filid, f.shortname,
                        sr.sectid, sr.shortname,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        case when coalesce(w.consult,0)=1 then 1
                              when coalesce(w.diagnost,0)=1 then 2
                              when coalesce(w.isoperation,0)=1 then 3
                              when ii.doctype in (13,14) then 5
                              when ii.doctype is null then 6
                              else 4 end,
                        case when coalesce(w.consult,0)=1 then ''1. Косультация''
                              when coalesce(w.diagnost,0)=1 then ''2. Диагностика''
                              when coalesce(w.isoperation,0)=1 then ''3. Операция''
                              when ii.doctype in (13,14) then ''5. Лаборатория''
                              when ii.doctype is null then ''6. Опл. возвратов''
                              else ''4. Манипуляция'' end,
                        wday,
                        sum(case when ii.tables=''cred'' and ii.paycode=-1 then 0 when ii.orderno is null then 1 else od.realcount end),
                        sum(case when ii.orderno is null then summa_pay else schamount*summa_pay/ii.amountcl end)
                   from ('||sqlText2||') ii
                   left join orderdet od on od.orderno=ii.orderno and od.doctype !=7 and coalesce(od.progservid,0)=0 and od.doctype<10
                   left join doctor d on d.dcode=ii.dcode
                   left join departments dep on dep.depnum=coalesce(ii.depnum, d.depnum)
                   left join wschema w on od.schcode = w.schid
                   left join speciality sp on (sp.scode=case when w.speccode between 55 and 59 then 15 else w.speccode end  or
                                               w.speccode is null and sp.depnum=dep.depnum and sp.mainspec=1 )
                   left join filials f on f.filid=ii.filial
                   left join sectorref sr on sr.sectid=4363
                  group by 1,2,3,4,5,6,7,8,9
                  order by 1, 4, 7, 6, 1 ';
    END
 
    -- не определено
    ELSE
    BEGIN
      EXECUTE statement ('select OUTSTR from GET_TRANSLIT(?)')('Не определен раздел медицины / отделение для доктора '||COALESCE(dname,'-')||' [dcode='||COALESCE(dcode,-1)||']') INTO sqlText;
      EXECUTE PROCEDURE raise_exception('=>'||ascii_char(13)||ascii_char(10)||'=>'||sqlText||ascii_char(13)||ascii_char(10)||'=>');
    END
 
    FOR EXECUTE statement (sqlText)(bdate, fdate, dcode,
                               bdate, fdate, dcode)
    ON external '192.168.2.47:MED99' AS USER 'CHEA' password 'PDNTP'
    INTO filial, fname, sectid, csect, speccode, specname, schtypeid, schtype, wday, schcount, summa_nach do
    BEGIN
      IF (wday=0) THEN wday=7;
      --
      IF (wday=1 AND wday1=1) THEN BEGIN END
      ELSE IF (wday=2 AND wday2=1) THEN BEGIN END
      ELSE IF (wday=3 AND wday3=1) THEN BEGIN END
      ELSE IF (wday=4 AND wday4=1) THEN BEGIN END
      ELSE IF (wday=5 AND wday5=1) THEN BEGIN END
      ELSE IF (wday=6 AND wday6=1) THEN BEGIN END
      ELSE IF (wday=7 AND wday7=1) THEN BEGIN END
      ELSE IF (wday11=1 AND wday BETWEEN 1 AND 5) THEN wday = 11;
      ELSE IF (wday17=1 AND wday BETWEEN 6 AND 7) THEN wday = 17;
      ELSE wday=0;
      --
      EXECUTE statement('insert into buh$zarplata_calc  (dcode, dname, depname, razdel, calctype, dcode_zaved, bdate, fdate, filial, fname, sectid, csect, speccode, specname, schtypeid, schtype, wday, schcount, summa_nach)
          values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)')(dcode, dname, depname, razdel,calctype,dcode_zaved,bdate,fdate,filial,fname,sectid,csect,speccode,specname,schtypeid,schtype,wday,schcount,summa_nach);
    END
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    -- комментировано
    --   если идет возврат аванса, то не будет указания доктора, соттветственно алгоритм не выполнится.
    --   если идет возварт денег, то записей в orderdet не будет.
    --     соответственно нет смысла выполнять алгоритм, т.к. он выполнен выше в шаге 3.2.1/3.2.2
 
 
    /*sqlText = '';
    -- --
    -- 3.2.3 расчет по франшизе, наловая возвратная часть для стоматологии
    -- --
    if (razdel = 1) then
    begin
      sqlText = 'select f.filid, f.shortname,
                        sectid, csect,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        schtypeid, schtype,
 
                        sum(realcount), sum(schamount)
                   from (select ii.filial,
                                case when ii.tables=''cred'' and ii.paycode=-1 then 0 when ii.orderno is null then 1 else od.realcount end realcount,
                                case when ii.orderno is null then summa_pay else od.schamount*ii.summa_pay/ii.amountcl end schamount,
                                sr.sectid, sr.shortname csect,
                                6 schtypeid, null schtype,
                                max(case when ws.speccode=36 then 35                 /* парадонтология => стом терапия * /
                                         when ws.speccode between 55 and 59 then 15  /* лаборатория * /
                                         else ws.speccode end) over (partition by ii.orderno) speccode,
                                (select spp.scode from speciality spp where spp.depnum=dep.depnum and mainspec=1) spec_dep
                           from ('||sqlText2||') ii
                           left join orderdet od on od.orderno=ii.orderno and od.doctype =7
                           left join doctor d on d.dcode=ii.dcode
                           left join departments dep on dep.depnum=coalesce(ii.depnum, d.depnum)
                           left join wschema ws on od.schcode = ws.schid
                           left join sectorref sr on sr.sectid=994052961
                          ) t
                   left join filials f on f.filid=t.filial
                   left join speciality sp on sp.scode=case when t.speccode=33 then t.spec_dep else t.speccode end
                  group by t.filial, 1, 2, 3, 4, 5, 6, 7, 8
                  order by t.filial, 4, 7, 6, 1';
    end
 
    -- --
    -- 3.2.4 расчет по франшизе, наловая возвратная часть для поликлиики
    -- --
    else if (razdel = 2) then
    begin
      sqlText = 'select f.filid, f.shortname,
                        sr.sectid, sr.shortname,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        case when coalesce(w.consult,0)=1 then 1
                              when coalesce(w.diagnost,0)=1 then 2
                              when coalesce(w.isoperation,0)=1 then 3
                              when ii.doctype in (13,14) then 5
                              when ii.doctype is null then 6
                              else 4 end,
                        case when coalesce(w.consult,0)=1 then ''1. Косультация''
                              when coalesce(w.diagnost,0)=1 then ''2. Диагностика''
                              when coalesce(w.isoperation,0)=1 then ''3. Операция''
                              when ii.doctype in (13,14) then ''5. Лаборатория''
                              when ii.doctype is null then ''6. Опл. возвратов''
                              else ''4. Манипуляция'' end,
                        sum(case when ii.tables=''cred'' and ii.paycode=-1 then 0 when ii.orderno is null then 1 else od.realcount end),
                        sum(case when ii.orderno is null then summa_pay else schamount*summa_pay/ii.amountcl end)
                   from ('||sqlText2||') ii
                   left join orderdet od on od.orderno=ii.orderno and od.doctype =7
                   left join doctor d on d.dcode=ii.dcode
                   left join departments dep on dep.depnum=coalesce(ii.depnum, d.depnum)
                   left join wschema w on od.schcode = w.schid
                   left join speciality sp on (sp.scode=case when w.speccode between 55 and 59 then 15 else w.speccode end  or
                                               w.speccode is null and sp.depnum=dep.depnum and sp.mainspec=1 )
                   left join filials f on f.filid=ii.filial
                   left join sectorref sr on sr.sectid=994052961
                  group by 1,2,3,4,5,6,7,8
                  order by 1, 4, 7, 6, 1 ';
    end
 
    -- не определено
    else
    begin
      execute statement ('select OUTSTR from GET_TRANSLIT(?)')('Не определен раздел медицины / отделение для доктора '||coalesce(dname,'-')||' [dcode='||coalesce(dcode,-1)||']') into sqlText;
      execute procedure raise_exception('=>'||ascii_char(13)||ascii_char(10)||'=>'||sqlText||ascii_char(13)||ascii_char(10)||'=>');
    end
 
    for execute statement (sqlText)(bdate, fdate, dcode,
                               bdate, fdate, dcode)
    on external '192.168.2.47:MED99' as user 'CHEA' password 'PDNTP'
    into filial, fname, sectid, csect, speccode, specname, schtypeid, schtype, schcount, summa_nach do
    begin
      csect = trim(csect)||' (нал)';
      execute statement('insert into buh$zarplata_calc  (dcode, dname, depname, razdel, calctype, dcode_zaved, bdate, fdate, filial, fname, sectid, csect, speccode, specname, schtypeid, schtype, schcount, summa_nach)
          values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)')(dcode, dname, depname, razdel,calctype,dcode_zaved,bdate,fdate,filial,fname,sectid,csect,speccode,specname,schtypeid,schtype,schcount,summa_nach);
    end      */
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    sqlText = '';                           
    -- --
    -- 3.3.1 расчет по программам для стоматологии
    -- --
    IF (razdel = 1) THEN
    BEGIN
      sqlText = 'select f.filid, f.shortname,
                        sectid, csect,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        schtypeid, schtype,
                        wday,
                        sum(realcount), sum(schamount)
                   from (select t.filial, od.realcount, od.schamount_a*clo.schamount/clo.schamount_a schamount,
                                sr.sectid, sr.shortname||case when jp.agrtype=1 then ''(''||lp.shortname||'')'' else '''' end csect,
                                4 schtypeid, null schtype,
                                max(case when ws.speccode=36 then 35                 /* парадонтология => стом терапия */
                                         when ws.speccode between 55 and 59 then 15  /* лаборатория */
                                         else ws.speccode end) over (partition by t.treatcode) speccode,
                                extract(weekday from t.treatdate) wday,
                                (select spp.scode from speciality spp where spp.depnum=dep.depnum and mainspec=1) spec_dep
                           from treat t
                           left join jpagreement jp on jp.agrid=t.jid
                           left join jplists lp on lp.lid=t.lstid
                           left join orderdet od on t.orderno = od.orderno
                           left join wschema ws on od.schcode = ws.schid
                           left join doctor d on d.dcode=t.dcode
                           left join departments dep on dep.depnum=coalesce(t.depnum, d.depnum)
                           left join sectorref sr on sr.sectid=jp.sectid
                           left join clservice cl on cl.id=od.progservid
                           left join discountsprav ds on ds.did=cl.did
                           left join treat clt on clt.treatcode=cl.treatcode
                           left join orderdet clo on clo.orderno=clt.orderno and ds.schid=clo.schcode
                          where od.doctype < 10
                            and coalesce(od.progservid,0)>0
                            and t.dcode= ?
                            and t.treatdate between ? and ?
                          ) t
                   left join filials f on f.filid=t.filial
                   left join speciality sp on sp.scode=case when t.speccode=33 then t.spec_dep else t.speccode end
                  group by t.filial, 1, 2, 3, 4, 5, 6, 7, 8, 9
                  order by t.filial, 4, 7, 6, 1';
    END
 
    -- --
    -- 3.3.2 расчет по программам для поликлиики
    -- --
    ELSE IF (razdel = 2) THEN
    BEGIN
      sqlText = 'select f.filid, f.shortname,
                        sr.sectid, sr.shortname,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        case when coalesce(w.consult,0)=1 then 1
                             when coalesce(w.diagnost,0)=1 then 2
                             when coalesce(w.isoperation,0)=1 then 3
                             when t.doctype in (13,14) then 5
                             else 4 end,
                        case when coalesce(w.consult,0)=1 then ''1. Косультация''
                             when coalesce(w.diagnost,0)=1 then ''2. Диагностика''
                             when coalesce(w.isoperation,0)=1 then ''3. Операция''
                             when t.doctype in (13,14) then ''5. Лаборатория''
                             else ''4. Манипуляция'' end,
                        extract(weekday from t.treatdate) wday,
                        sum(od.realcount), sum(od.schamount_a*clo.schamount/clo.schamount_a) from treat t
                   left join orderdet od on t.orderno = od.orderno
                   left join wschema w on od.schcode = w.schid
                   left join speciality sp on sp.scode=case when w.speccode between 55 and 59 then 15 else w.speccode end
                   left join filials f on f.filid=t.filial
                   left join sectorref sr on sr.sectid=4363
                   left join clservice cl on cl.id=od.progservid
                   left join discountsprav ds on ds.did=cl.did
                   left join treat clt on clt.treatcode=cl.treatcode
                   left join orderdet clo on clo.orderno=clt.orderno and ds.schid=clo.schcode
                  where od.doctype < 10
                    and coalesce(od.progservid,0)>0
                    and t.dcode= ?
                    and t.treatdate between ? and ?
                  group by t.filial, 1, 2, 3, 4, 5, 6, 7, 8, 9
                  order by t.filial, 4, 7, 6, 1';
    END
 
    -- не определено
    ELSE
    BEGIN
      EXECUTE statement ('select OUTSTR from GET_TRANSLIT(?)')('Не определен раздел медицины / отделение для доктора '||COALESCE(dname,'-')||' [dcode='||COALESCE(dcode,-1)||']') INTO sqlText;
      EXECUTE PROCEDURE raise_exception('=>'||ascii_char(13)||ascii_char(10)||'=>'||sqlText||ascii_char(13)||ascii_char(10)||'=>');
    END
 
    FOR EXECUTE statement (sqlText)(dcode, bdate, fdate)
    ON external '192.168.2.47:MED99' AS USER 'CHEA' password 'PDNTP'
    INTO filial, fname, sectid, csect, speccode, specname, schtypeid, schtype, wday, schcount, summa_nach do
    BEGIN
      csect = TRIM(csect)||' (прг)';
      IF (wday=0) THEN wday=7;
      --
      IF (wday=1 AND wday1=1) THEN BEGIN END
      ELSE IF (wday=2 AND wday2=1) THEN BEGIN END
      ELSE IF (wday=3 AND wday3=1) THEN BEGIN END
      ELSE IF (wday=4 AND wday4=1) THEN BEGIN END
      ELSE IF (wday=5 AND wday5=1) THEN BEGIN END
      ELSE IF (wday=6 AND wday6=1) THEN BEGIN END
      ELSE IF (wday=7 AND wday7=1) THEN BEGIN END
      ELSE IF (wday11=1 AND wday BETWEEN 1 AND 5) THEN wday = 11;
      ELSE IF (wday17=1 AND wday BETWEEN 6 AND 7) THEN wday = 17;
      ELSE wday=0;
      --
      EXECUTE statement('insert into buh$zarplata_calc  (dcode,dname,depname,razdel,calctype,dcode_zaved,bdate,fdate,filial,fname,sectid,csect,speccode,specname,schtypeid,schtype,wday,schcount,summa_nach)
          values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)')(dcode,dname,depname,razdel,calctype,dcode_zaved,bdate,fdate,filial,fname,sectid,csect,speccode,specname,schtypeid,schtype,wday,schcount,summa_nach);
    END
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    sqlText = '';       
    -- --
    -- 3.4.1 расчет страховых (остальных, без прямой оплаты) для стоматологии
    -- --
    IF (razdel = 1) THEN
    BEGIN
      sqlText = 'select f.filid, f.shortname,
                        sectid, csect,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        schtypeid, schtype,
                        wday,
                        sum(realcount), sum(schamount)
                   from (select t.filial, realcount, schamount,
                                sr.sectid, trim(sr.shortname)||case when jp.agrtype=1 then '' (''||lp.shortname||'')'' when sr.sectid=994052961 then '' (дмс)'' else '''' end csect,
                                4 schtypeid, null schtype,
                                max(case when ws.speccode=36 then 35                 /* парадонтология => стом терапия */
                                         when ws.speccode between 55 and 59 then 15  /* лаборатория */
                                         else ws.speccode end) over (partition by t.treatcode) speccode,
                                extract(weekday from t.treatdate) wday,
                                (select spp.scode from speciality spp where spp.depnum=dep.depnum and mainspec=1) spec_dep
                           from treat t
                           left join jpagreement jp on jp.agrid=t.jid
                           left join jplists lp on lp.lid=t.lstid
                           left join orderdet od on t.orderno = od.orderno
                           left join wschema ws on od.schcode = ws.schid
                           left join doctor d on d.dcode=t.dcode
                           left join departments dep on dep.depnum=coalesce(t.depnum, d.depnum)
                           left join sectorref sr on sr.sectid=jp.sectid
                          where od.doctype > 10
                            and t.dcode= ?
                            and t.treatdate between ? and ?
                          ) t
                   left join filials f on f.filid=t.filial
                   left join speciality sp on sp.scode=case when t.speccode=33 then t.spec_dep else t.speccode end
                  group by t.filial, 1, 2, 3, 4, 5, 6, 7, 8, 9
                  order by t.filial, 4, 7, 6, 1';
    END
 
    -- --
    -- 3.4.2 расчет страховых (остальных, без прямой оплаты) для поликлиники
    -- --
    ELSE IF (razdel = 2) THEN
    BEGIN
      sqlText = 'select f.filid, f.shortname,
                        sr.sectid, trim(sr.shortname)||case when jp.agrtype=1 then '' (''||lp.shortname||'')'' when sr.sectid=994052961 then '' (дмс)'' else '''' end,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        case when coalesce(ws.consult,0)=1 then 1
                             when coalesce(ws.diagnost,0)=1 then 2
                             when coalesce(ws.isoperation,0)=1 then 3
                             when t.doctype in (13,14) then 5
                             else 4 end,
                        case when coalesce(ws.consult,0)=1 then ''1. Косультация''
                             when coalesce(ws.diagnost,0)=1 then ''2. Диагностика''
                             when coalesce(ws.isoperation,0)=1 then ''3. Операция''
                             when t.doctype in (13,14) then ''5. Лаборатория''
                             else ''4. Манипуляция'' end,
                        extract(weekday from t.treatdate) wday,
                        sum(od.realcount), sum(od.schamount) from treat t
                   left join jpagreement jp on jp.agrid=t.jid
                   left join jplists lp on lp.lid=t.lstid
                   left join orderdet od on t.orderno = od.orderno
                   left join wschema ws on od.schcode = ws.schid
                   left join speciality sp on sp.scode=case when ws.speccode between 55 and 59 then 15 else ws.speccode end
                   left join filials f on f.filid=t.filial
                   left join sectorref sr on sr.sectid=jp.sectid
                  where od.doctype > 10
                    and t.dcode= ?
                    and t.treatdate between ? and ?
                  group by t.filial, 1, 2, 3, 4, 5, 6, 7, 8, 9
                  order by t.filial, 4, 7, 6, 1';            
    END
 
    -- не определено
    ELSE
    BEGIN
      EXECUTE statement ('select OUTSTR from GET_TRANSLIT(?)')('Не определен раздел медицины / отделение для доктора '||COALESCE(dname,'-')||' [dcode='||COALESCE(dcode,-1)||']') INTO sqlText;
      EXECUTE PROCEDURE raise_exception('=>'||ascii_char(13)||ascii_char(10)||'=>'||sqlText||ascii_char(13)||ascii_char(10)||'=>');
    END
 
    FOR EXECUTE statement (sqlText)(dcode, bdate, fdate)
    ON external '192.168.2.47:MED99' AS USER 'CHEA' password 'PDNTP'
    INTO filial, fname, sectid, csect, speccode, specname, schtypeid, schtype, wday, schcount, summa_nach do
    BEGIN
      IF (wday=0) THEN wday=7;
      --
      IF (wday=1 AND wday1=1) THEN BEGIN END
      ELSE IF (wday=2 AND wday2=1) THEN BEGIN END
      ELSE IF (wday=3 AND wday3=1) THEN BEGIN END
      ELSE IF (wday=4 AND wday4=1) THEN BEGIN END
      ELSE IF (wday=5 AND wday5=1) THEN BEGIN END
      ELSE IF (wday=6 AND wday6=1) THEN BEGIN END
      ELSE IF (wday=7 AND wday7=1) THEN BEGIN END
      ELSE IF (wday11=1 AND wday BETWEEN 1 AND 5) THEN wday = 11;
      ELSE IF (wday17=1 AND wday BETWEEN 6 AND 7) THEN wday = 17;
      ELSE wday=0;
      --
      EXECUTE statement('insert into buh$zarplata_calc  (dcode,dname,depname,razdel,calctype,dcode_zaved,bdate,fdate,filial,fname,sectid,csect,speccode,specname,schtypeid,schtype,wday,schcount,summa_nach)
          values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)')(dcode,dname,depname,razdel,calctype,dcode_zaved,bdate,fdate,filial,fname,sectid,csect,speccode,specname,schtypeid,schtype,wday,schcount,summa_nach);
    END             
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  END                              
 
  -- --
  -- 4 считаю акты списания
  -- --
  FOR SELECT DISTINCT dcode, dname, depname, razdel, bdate, fdate, filial,dcode_zaved, calctype FROM buh$zarplata_calc                                                           
       WHERE razdel =1 /* только стоматология */
         AND filial IS NULL
         AND calctype IN (1,11)                      
  INTO dcode, dname, depname, razdel, bdate, fdate, filial, dcode_zaved, calctype do      
  BEGIN
    sqlText = '';                                              
    -- --
    -- 4.1 расчет списания для стоматологии
    -- --        
    IF (razdel = 1) THEN
    BEGIN
      sqlText = 'select iv.filial, ''Акт списания'' fname,
                        sr.sectid, trim(sr.shortname)||case when sr.sectid=994052961 then '' (дмс)'' else '''' end csect,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        4 schtypeid, it.invsubtype||''. ''||it.invname schtype,
                        sum(mi.xfromnum*1.0), -sum(mi.xfromprice*1.0)
                   from m_invoice iv
                   join m_items mi on mi.invcode=iv.invcode
                   left join m_invtype it on it.invtype=iv.invtype and it.invmode=iv.invmode and it.invsubtype=iv.invsubtype
                   left join doctor d on d.dcode=iv.doccode
                   left join departments dep on dep.depnum= d.depnum
                   left join sectorref sr on sr.sectid= coalesce(completefilial,4363)
                   left join speciality sp on sp.scode=coalesce(nullif(iv.importid,33),(select spp.scode from speciality spp where spp.depnum=dep.depnum and mainspec=1))
                  where iv.invtype=1 and iv.invmode=1
                    and iv.doccode= ?   
                    and iv.invdate between ? and ?   
                    and mi.state=1          
                  group by 1, 2, 3, 4, 5, 6, 7, 8
                  order by 4, 7, 6, 1';             
    END      
 
    -- --
    -- 4.2 расчет списания для поликлиники
    -- --        
    ELSE IF (razdel = 2) THEN
    BEGIN                
      sqlText = 'select first 1 null, null, null, null, null, null, null, null, null, null from (select dcode from doctor where dcode= ? ) d left join getdate(?,?) on 1=1';
    END
 
    -- не определено                                
    ELSE                                                                                                                                                 
    BEGIN       
      EXECUTE statement ('select OUTSTR from GET_TRANSLIT(?)')('Не определен раздел медицины / отделение для доктора '||COALESCE(dname,'-')||' [dcode='||COALESCE(dcode,-1)||']') INTO sqlText;                     
      EXECUTE PROCEDURE raise_exception('=>'||ascii_char(13)||ascii_char(10)||'=>'||sqlText||ascii_char(13)||ascii_char(10)||'=>');                                                                                                       
    END
 
    FOR EXECUTE statement (sqlText)(dcode, bdate, fdate)
    ON external '192.168.2.47:MED99' AS USER 'CHEA' password 'PDNTP'
    INTO filial, fname, sectid, csect, speccode, specname, schtypeid, schtype, schcount, summa_nach do      
    BEGIN                                                                                      
      EXECUTE statement('insert into buh$zarplata_calc  (dcode,dname,depname,razdel,calctype,dcode_zaved,bdate,fdate,filial,fname,sectid,csect,speccode,specname,schtypeid,schtype,schcount,summa_nach,proc_zp)
          values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,1)')(dcode,dname,depname,razdel,calctype+1,dcode_zaved,bdate,fdate,filial,fname,sectid,csect,speccode,specname,schtypeid,schtype,schcount,summa_nach);                                                                                                                                                                          
    END    
  END
 
  -- --
  -- 5. считаю акты экспертизы                                      
  -- --   
  FOR SELECT DISTINCT dcode, dname, depname, razdel, bdate, fdate,dcode_zaved, calctype FROM buh$zarplata_calc WHERE calctype IN (1,11) AND filial IS NULL                                                                                                                           
  INTO dcode, dname, depname, razdel, bdate, fdate,dcode_zaved, calctype do
  BEGIN
    sqlText = '';                                              
    -- --
    -- 5.1 расчет страховых (остальных, без прямой оплаты) для стоматологии
    -- --        
    IF (razdel = 1) THEN
    BEGIN
      sqlText = 'select f.filid, f.shortname,       
                        sectid, csect,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        schtypeid, schtype,  
 
                        sum(realcount), -sum(schamount)    
                   from (select t.filial,
                                case when p.schnum=od.schnum then ert.schcount else 0 end realcount,
                                case when p.schnum=od.schnum then ert.amountrub else 0 end schamount,                       
                                sr.sectid, trim(sr.shortname)||case when jp.agrtype=1 then '' (''||lp.shortname||'')'' when sr.sectid=994052961 then '' (дмс)'' else '''' end csect,
                                4 schtypeid, null schtype,  
                                max(case when ws.speccode=36 then 35                 /* парадонтология => стом терапия */                                                                             
                                         when ws.speccode between 55 and 59 then 15  /* лаборатория */                                    
                                         else ws.speccode end) over (partition by t.treatcode) speccode,
                                (select spp.scode from speciality spp where spp.depnum=dep.depnum and mainspec=1) spec_dep                                 
                           from jaccounts jc
                           join jpexpertreportdet ert on ert.accid=jc.accid
                           left join jpaymdet p on ert.pdid = p.pdid
                           left join treat t on p.treatcode=t.treatcode
                           left join orderdet odx on odx.orderno=t.orderno and p.schnum=odx.schnum
                           left join orderdet od on od.orderno=t.orderno
                           left join jpagreement jp on jp.agrid=p.jid
                           left join jplists lp on lp.lid=t.lstid
                           left join wschema ws on p.schid = ws.schid
                           left join doctor d on d.dcode=t.dcode
                           left join departments dep on dep.depnum=coalesce(t.depnum, d.depnum)
                           left join sectorref sr on sr.sectid=jp.sectid
                          where jc.acctype=11                                            
                            and t.dcode= ? 
                            and jc.accdate between ? and ?
                          ) t
                   left join filials f on f.filid=t.filial
                   left join speciality sp on sp.scode=case when t.speccode=33 then t.spec_dep else t.speccode end
                  group by t.filial, 1, 2, 3, 4, 5, 6, 7, 8
                  order by t.filial, 4, 7, 6, 1';                                       
    END      
 
    -- --
    -- 5.2 расчет страховых (остальных, без прямой оплаты) для поликлиники
    -- --        
    ELSE IF (razdel = 2) THEN
    BEGIN                
      sqlText = 'select f.filid, f.shortname,
                        sr.sectid, trim(sr.shortname)||case when jp.agrtype=1 then '' (''||lp.shortname||'')'' when sr.sectid=994052961 then '' (дмс)'' else '''' end,
                        sp.scode, case when sp.scode=15 then ''Лаборатория'' else sp.sname end,
                        case when coalesce(ws.consult,0)=1 then 1
                             when coalesce(ws.diagnost,0)=1 then 2
                             when coalesce(ws.isoperation,0)=1 then 3
                             when t.doctype in (13,14) then 5
                             else 4 end,
                        case when coalesce(ws.consult,0)=1 then ''1. Косультация''
                             when coalesce(ws.diagnost,0)=1 then ''2. Диагностика''
                             when coalesce(ws.isoperation,0)=1 then ''3. Операция''
                             when t.doctype in (13,14) then ''5. Лаборатория''
                             else ''4. Манипуляция'' end,
                        sum(ert.schcount), -sum(ert.amountrub) from jaccounts jc 
                   left join jaccounts jcp on jcp.accid=jc.accparent
                   join jpexpertreportdet ert on ert.accid=jc.accid
                   left join jpaymdet p on ert.pdid = p.pdid
                   left join treat t on p.treatcode=t.treatcode
                   left join jplists lp on lp.lid=t.lstid
                   left join jpagreement jp on jp.agrid=p.jid
                   left join wschema ws on p.schid = ws.schid
                   left join filials f on f.filid=p.filial
                   left join sectorref sr on sr.sectid=jp.sectid
                   left join speciality sp on sp.scode=case when ws.speccode between 55 and 59 then 15 else ws.speccode end
                  where jc.acctype=11
                    and t.dcode= ?
                    and jc.accdate between ? and ?
                  group by t.filial, 1, 2, 3, 4, 5, 6, 7, 8
                  order by t.filial, 4, 7, 6, 1';
    END
 
    -- не определено                                
    ELSE                                                                                                                                                 
    BEGIN       
      EXECUTE statement ('select OUTSTR from GET_TRANSLIT(?)')('Не определен раздел медицины / отделение для доктора '||COALESCE(dname,'-')||' [dcode='||COALESCE(dcode,-1)||']') INTO sqlText;                     
      EXECUTE PROCEDURE raise_exception('=>'||ascii_char(13)||ascii_char(10)||'=>'||sqlText||ascii_char(13)||ascii_char(10)||'=>');                                                                                                       
    END
 
    FOR EXECUTE statement (sqlText)(dcode, bdate, fdate)
    ON external '192.168.2.47:MED99' AS USER 'CHEA' password 'PDNTP'
    INTO filial, fname, sectid, csect, speccode, specname, schtypeid, schtype, schcount, summa_nach do      
    BEGIN
      EXECUTE statement('insert into buh$zarplata_calc  (dcode,dname,depname,razdel,calctype,dcode_zaved,bdate,fdate,filial,fname,sectid,csect,speccode,specname,schtypeid,schtype,schcount,summa_nach,proc_zp)
          values (?,?,?,?,?,?,?,?,?,''Акт экспертизы'',?,?,?,?,?,?,?,?,1)')(dcode,dname,depname,razdel,calctype+2,dcode_zaved,bdate,fdate,filial,sectid,csect,speccode,specname,schtypeid,schtype,schcount,summa_nach);                                                                                                                                                                          
    END            
  END          
 
  -- --
  -- 6. убираем нулевые начисления
  -- --
  DELETE FROM buh$zarplata_calc WHERE COALESCE(summa_nach,0)=0;
 
  -- --
  -- 7. выставляю 1%, там где будет ЗП
  -- --
  FOR SELECT DISTINCT dcode, bdate, fdate, filial, sectid, schtypeid, COALESCE(speccode,0) FROM buh$zarplata_calc WHERE calctype IN (1,11)                              
  INTO dcode, bdate, fdate, filial, sectid, schtypeid, speccode do
  BEGIN
    proc_zp = NULL;
    EXECUTE statement ('select first 1 rekvfloat from (select rekvfloat, abs(sign(coalesce(dcode,0))) dcode,
                                                                       abs(sign(coalesce(rekvint1,0))) filial,
                                                                       abs(sign(coalesce(rekvint2,0))) schtype,
                                                                       abs(sign(coalesce(rekvint4,0))) speccode,
                                                                       abs(sign(coalesce(rekvint5,0))) sectid
                                               from dicinfo where refid=1111111
                                                and bdate <= ?
                                                and (disdate is null or disdate>= ?  )
                                                and coalesce(dcode, -1) in ( ? ,-1)
                                                and coalesce(rekvint1,-1) in ( ? , -1)
                                                and coalesce(rekvint2,-1) in ( ? , -1)
                                                and coalesce(rekvint4,-1) in ( ? , -1)
                                                and coalesce(rekvint5,-1) in ( ? , -1)        )
                       order by case when dcode+filial+schtype+speccode  =0 and sectid>0 then 230 else 0 end +
                                case when schtype>0 and dcode>0 then 200
                                     when filial+speccode+sectid+dcode =0 and schtype>0 then 110
                                     else 0 end +
                                dcode*90 + sectid*30 + filial + schtype + speccode desc')
                       (fdate,bdate,dcode,filial,schtypeid,speccode,sectid)
    ON external '192.168.2.47:MED99' AS USER 'CHEA' password 'PDNTP'
      INTO proc_zp;
    proc_zp = abs(sign(COALESCE(proc_zp,0)));
    EXECUTE statement ('update buh$zarplata_calc set proc_zp= ? where calctype in (1,11) and dcode= ?         
       and bdate= ?  and fdate= ? and filial= ? and sectid= ?  and schtypeid= ? and coalesce(speccode,0)= ? ')(proc_zp,dcode,bdate,fdate,filial,sectid,schtypeid,speccode);
  END
 
  -- --
  -- 8. Считаю общую выработку по доктору
  -- --
  FOR SELECT dcode, bdate, fdate, SUM(proc_zp*summa_nach) FROM buh$zarplata_calc GROUP BY dcode, bdate, fdate
  INTO dcode, bdate, fdate, summa_nach_doct do
  EXECUTE statement ('update buh$zarplata_calc set summa_nach_doct= ? where dcode= ? and bdate= ? and fdate= ? ')(summa_nach_doct,dcode,bdate,fdate); 
 
  -- --
  -- 9.1. Сталю %ЗП на основе таблицы по % и выработки
  -- --
  FOR SELECT DISTINCT dcode, bdate, fdate, filial, sectid, schtypeid, COALESCE(speccode,0), summa_nach_doct, wday FROM buh$zarplata_calc WHERE proc_zp>0 AND calctype IN (1,11)                                                                       
  INTO dcode, bdate, fdate, filial, sectid, schtypeid, speccode, summa_nach_doct,wday do
  BEGIN
    proc_zp = NULL;
    EXECUTE statement ('select first 1 rekvfloat from (select rekvfloat, abs(sign(coalesce(dcode,0))) dcode,
                                                                       abs(sign(coalesce(rekvint1,0))) filial,
                                                                       abs(sign(coalesce(rekvint2,0))) schtype,
                                                                       abs(sign(coalesce(rekvint4,0))) speccode,
                                                                       abs(sign(coalesce(rekvint5,0))) sectid,
                                                                       rekvint3 wday  
                                               from dicinfo where refid=1111111
                                                and bdate <= ?
                                                and (disdate is null or disdate>= ?  )
                                                and coalesce(dcode, -1) in ( ? ,-1)
                                                and coalesce(rekvint1,-1) in ( ? , -1)
                                                and coalesce(rekvint2,-1) in ( ? , -1)
                                                and coalesce(rekvint4,-1) in ( ? , -1)
                                                and coalesce(rekvint5,-1) in ( ? , -1)
                                                and (rekvint8 is null or rekvint8<= ? )
                                                and (rekvint9 is null or rekvint9>  ? )      )
                       order by case when dcode+filial+schtype+speccode  =0 and sectid>0 then 230 else 0 end +
                                case when schtype>0 and dcode>0 then 200
                                     when filial+speccode+sectid+dcode =0 and schtype>0 then 110
                                     else 0 end +
                                dcode*90 + sectid*30 + filial + schtype + speccode desc,
                                case when wday = ? then 0 else 1 end,
                                rekvfloat desc')
                       (fdate,bdate,dcode,filial,schtypeid,speccode,sectid,summa_nach_doct,summa_nach_doct,wday)
    ON external '192.168.2.47:MED99' AS USER 'CHEA' password 'PDNTP'
      INTO proc_zp;
    proc_zp = COALESCE(proc_zp,0);                                                                                                                 
    EXECUTE statement ('update buh$zarplata_calc set proc_zp= ? where calctype in (1,11) and dcode= ?         
       and bdate= ?  and fdate= ? and filial= ? and sectid= ?  and schtypeid= ? and coalesce(speccode,0)= ? and coalesce(wday,0)= ? ')(proc_zp,dcode,bdate,fdate,filial,sectid,schtypeid,speccode,wday);                 
  END  
 
  -- --
  -- 9.2. Сталю % на снятия на основе таблицы по % и выработки
  -- --
  FOR SELECT DISTINCT dcode, bdate, fdate, filial, sectid, schtypeid, COALESCE(speccode,0), summa_nach_doct FROM buh$zarplata_calc WHERE proc_zp>0 AND calctype IN (2,3,12,13)                                                                       
  INTO dcode, bdate, fdate, filial, sectid, schtypeid, speccode, summa_nach_doct do
  BEGIN
    proc_zp = NULL;
    EXECUTE statement ('select first 1 rekvfloat from (select rekvfloat, abs(sign(coalesce(dcode,0))) dcode,
                                                                       abs(sign(coalesce(rekvint1,0))) filial,
                                                                       abs(sign(coalesce(rekvint2,0))) schtype,
                                                                       abs(sign(coalesce(rekvint4,0))) speccode,
                                                                       abs(sign(coalesce(rekvint5,0))) sectid
                                               from dicinfo where refid=1111111
                                                and bdate <= ?
                                                and (disdate is null or disdate>= ?  )
                                                and coalesce(dcode,-1) in ( ? )
                                                and coalesce(rekvint1,-1) in ( ? , -1)
                                                and coalesce(rekvint2,-1) in ( ? , -1)
                                                and coalesce(rekvint4,-1) in ( ? , -1)
                                                and coalesce(rekvint5,-1) in ( ? , -1)
                                                and (rekvint8 is null or rekvint8<= ? )
                                                and (rekvint9 is null or rekvint9>  ? )      )
                       order by case when dcode+filial+schtype+speccode  =0 and sectid>0 then 230 else 0 end +
                                case when schtype>0 and dcode>0 then 200
                                     when filial+speccode+sectid+dcode =0 and schtype>0 then 110
                                     else 0 end +
                                dcode*90 + sectid*30 + filial + schtype + speccode desc,
                                rekvfloat asc')
                       (fdate,bdate,dcode,filial,schtypeid,speccode,sectid,summa_nach_doct,summa_nach_doct)
    ON external '192.168.2.47:MED99' AS USER 'CHEA' password 'PDNTP'
      INTO proc_zp;           
    proc_zp = COALESCE(proc_zp,0);                                                                                                                 
    EXECUTE statement ('update buh$zarplata_calc set proc_zp= ? where calctype in (2,3,12,13) and dcode= ?         
       and bdate= ?  and fdate= ? and filial= ? and sectid= ?  and schtypeid= ? and coalesce(speccode,0)= ? ')(proc_zp,dcode,bdate,fdate,filial,sectid,schtypeid,speccode);                        
  END
 
  -- --
  -- 10. Ставлю % уменьшения на основе филиал|категория|razdel|специализация                                      
  -- --
  EXECUTE statement ('update buh$zarplata_calc set proc_minus= 0');
  FOR SELECT DISTINCT bdate, fdate, filial, sectid, razdel, speccode FROM buh$zarplata_calc
  INTO bdate, fdate, filial, sectid, razdel, speccode do
  BEGIN
    proc_minus = NULL;
    EXECUTE statement ('select first 1 rekvfloat from dicinfo where refid=1111109
                           and bdate <= ?
                           and (disdate  is null or disdate> ?)
                           and (rekvint1 is null or rekvint1 = ? )
                           and (rekvint5 is null or rekvint5 = ? )
                           and (rekvint6 is null or rekvint6 = ? )
                           and (rekvint4 is null or rekvint4 = ? )
                         order by sign(coalesce(rekvint1,0))+
                                  sign(coalesce(rekvint4,0))+
                                  sign(coalesce(rekvint5,0))+
                                  sign(coalesce(rekvint6,0)) desc, 
                                  rekvfloat desc')(fdate,bdate,filial,sectid,razdel,speccode)
    ON external '192.168.2.47:MED99' AS USER 'CHEA' password 'PDNTP'
      INTO proc_minus;
    proc_minus = COALESCE(proc_minus,0);
    EXECUTE statement ('update buh$zarplata_calc set proc_minus= ? where bdate= ? and fdate= ? and filial= ? and sectid= ? and razdel= ? and speccode = ? ')(proc_minus,bdate,fdate,filial,sectid,razdel,speccode);
  END
 
  -- --
  -- 11. Считаю сумму в ЗП
  -- --
  UPDATE buh$zarplata_calc SET summa_zp = summa_nach*((100-proc_minus)/100.0)*(proc_zp/100.0);
 
  -- --
  -- 12. Считаю сумму заведования как таблица в виде заведующий|доктор|сумма
  -- --
  UPDATE buh$zarplata_calc SET summa_zaved = summa_nach/100.0 WHERE dcode_zaved>0 AND proc_zp>0;
  FOR SELECT DISTINCT dcode, dname, bdate, fdate, depname, razdel FROM buh$zarplata_calc WHERE dcode_zaved=dcode AND calctype=11  
  INTO dcode, dname, bdate, fdate, depname, razdel do
  BEGIN
    FOR EXECUTE statement ('select dcode, dname, sum(summa_zaved) from buh$zarplata_calc where dcode_zaved= ? and bdate= ? and fdate= ? group by dcode, dname')
                          (dcode,bdate,fdate)          
    INTO speccode, specname, summa_nach do
    BEGIN
      IF (summa_nach>0) THEN
        EXECUTE statement ('insert into buh$zarplata_calc(dcode,dname, bdate,fdate, calctype, speccode, specname, summa_zp, fname, depname, razdel)
          values (?,?,?,?,17,?,?,?, ''Заведование'',?,?)')(dcode,dname,bdate,fdate,speccode,specname,summa_nach,depname,razdel);
    END
  END                                     
 
  -- --        
  -- 13. Вывожу данные
  -- --
  FOR SELECT dcode,dname,bdate,fdate,razdel,depname,filial,fname,sectid,csect,
             schtypeid,schtype,speccode,specname,wday,calctype,summa_nach_doct,SUM(summa_nach),SUM(schcount),proc_minus,
             proc_zp,SUM(summa_zp),dcode_zaved,summa_zaved
        FROM buh$zarplata_calc WHERE calctype>10                      
       GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,20,21,23,24  
       ORDER BY dname, bdate, calctype, csect, filial, schtype, specname                                                                                                                                                                                           
  INTO dcode,dname,bdate,fdate,razdel,depname,filial,fname,sectid,csect,schtypeid,schtype,speccode,specname,wday,calctype,summa_nach_doct,summa_nach,schcount,proc_minus,proc_zp,summa_zp,dcode_zaved,summa_zaved do
  BEGIN
    wdayname = CASE wday
                    WHEN  1 THEN 'Пн'
                    WHEN  2 THEN 'Вт'
                    WHEN  3 THEN 'Ср'
                    WHEN  4 THEN 'Чт'
                    WHEN  5 THEN 'Пт'
                    WHEN  6 THEN 'Сб'
                    WHEN  7 THEN 'Вс'
 
                    WHEN 11 THEN 'Буд'
                    WHEN 17 THEN 'Вых'
 
                    WHEN  0 THEN ''
                    END;                                
    suspend;
  END
END