GO
ALTER TABLE [HM].[DW] ADD krajPochodzenia INT NULL;
ALTER TABLE [HM].[IT] ADD iddw INT NULL;
GO
IF OBJECT_ID('[HM].[hm_DW_WstawDostawe]', 'P') IS NOT NULL DROP PROCEDURE [HM].[hm_DW_WstawDostawe]
GO
CREATE PROCEDURE HM.hm_DW_WstawDostawe
@idpoz int,
@iddwo int,
@iddw  int output
as
declare @return_status int
if @iddwo <> 0
 begin
  set @iddw = 0
  select @iddw = DW.id
  from DW join MZ on DW.idtw = MZ.idtw and DW.magazyn = MZ.magazyn
  where MZ.id = @idpoz and DW.iddw = @iddwo
  if @iddw <> 0
   return 0
  insert into DW select DWO.flag, 0, 1, DWO.kod, DWO.id, MG.id, MG.khid, NULL,
              ISNULL((select MAX(numer) from DW where DW.idtw = MZ.idtw and DW.numer > 0), 16777215) + 1,
              MZ.idtw, MZ.data, 0.0, 0.0, MZ.cena, 0.0, MZ.magazyn, 0.0, 0.0, 0.0, MG.bufor,NEWID(),NULL
              from DW as DWO, MZ join MG on MZ.super = MG.id where DWO.id = @iddwo and MZ.id = @idpoz
 end
else
 begin
  insert into DW select 0, 0, 1, case when MG.bufor = 0 then MG.kod else '' end, NULL, MG.id, MG.khid, NULL,
              ISNULL((select MAX(numer) from DW where DW.idtw = MZ.idtw and DW.numer > 0), 16777215) + 1,
              MZ.idtw, MZ.data, 0.0, 0.0, MZ.cena, 0.0, MZ.magazyn, 0.0, 0.0, 0.0, MG.bufor,NEWID(),NULL
              from MZ join MG on MZ.super = MG.id where MZ.id = @idpoz
 end
select @return_status = @@error, @iddw = SCOPE_IDENTITY()
if @return_status <> 0 return @return_status
GO
IF OBJECT_ID('[HM].[hm_PW_WstawPW]', 'P') IS NOT NULL DROP PROCEDURE [HM].[hm_PW_WstawPW]
GO
CREATE PROCEDURE HM.hm_PW_WstawPW
@idmz int,
@iddw int,
@iddwm int,
@ilosc float,
@wartosc float,
@kod varchar(100),
@numer int,
@zatwwart smallint,
@krajPochodzenia int
as
declare @iddwo int, @idpwo int, @idkoryg int, @idpw int
declare @return_status int
declare @iloscpw decimal(24,6), @wartoscpw decimal(24,2)
declare @iloscdosp decimal(24,6), @wartoscdosp decimal(24,2), @iloscdw decimal(24,6), @wartoscdw decimal(24,2), @iloscPz decimal(24,6)
declare @new smallint, @bufor smallint, @subtyp smallint, @typ smallint
declare @datao datetime
declare @cena decimal(24,6)
declare @przychod smallint
set @iloscpw = @ilosc
set @wartoscpw = @wartosc
set @cena = @wartosc / @ilosc
set @new = 0
select @bufor = MZ.bufor, @subtyp = MG.subtyp from MZ join MG on MZ.super = MG.id where MZ.id = @idmz
select @przychod = case when @subtyp in (74,131,75,132,81,82,83,89) then 1 else 0 end
if @przychod = 1 and @iddw = 0
begin
  if @iddwm = 0
  begin
    select @kod = case when @kod <> '' then @kod else
                  case when TW.szablon <> '' then '' else
                  case when MG.bufor = 0 then MG.kod else '' end end end
    from MZ join MG on MG.id = MZ.super join TW on TW.id = MZ.idtw where MZ.id = @idmz
    insert into DW select @zatwwart, 0, 0, ISNULL(@kod, ''), NULL, MZ.super, MG.khid, NULL,
                        case when @numer <> 0 then @numer else ISNULL((select MAX(numer) from DW where DW.idtw = MZ.idtw and DW.numer > 0), 16777215) + 1 end,
                        MZ.idtw, MZ.data, @iloscpw, 0.0, @cena, 0.0, MZ.magazyn, 0.0, 0.0, 0.0, MZ.bufor,NEWID(),@krajPochodzenia
    from MZ join MG on MG.id = MZ.super where MZ.id = @idmz
    select @return_status = @@error, @iddw = SCOPE_IDENTITY()
    if @return_status <> 0 return @return_status
    set @new = 1
  end
  else
  begin
    select @iddwo = ISNULL(DW.iddw, DW.id) from DW where DW.id = @iddwm
    select @iddw = DW.id
    from DW join MZ on DW.idtw = MZ.idtw and DW.magazyn = MZ.magazyn
    where MZ.id = @idmz and ISNULL(DW.iddw, DW.id) = @iddwo
    if @iddw = 0
    begin
      insert into DW select DWO.flag, 0, 0, DWO.kod, DWO.id, MZ.super, NULL, NULL,
                        ISNULL((select MAX(numer) from DW where DW.idtw = MZ.idtw and DW.numer > 0), 16777215) + 1,
                        MZ.idtw, MZ.data, @iloscpw, 0.0, DWO.cena, 0.0, MZ.magazyn, 0.0, 0.0, 0.0, MZ.bufor,NEWID(),@krajPochodzenia
      from MZ, DW as DWO where MZ.id = @idmz and DWO.id = @iddwo
      select @return_status = @@error, @iddw = SCOPE_IDENTITY()
      if @return_status <> 0 return @return_status
      set @new = 1
    end
  end
  if @iddw is NULL
    return -1
end
if @iddw = 0
  return -1
set @idkoryg = NULL
if @new = 0
begin
  select @idkoryg = MIN(PW.id)
  from MZ join MZ as MZK on MZ.superkoryg = MZK.superkoryg and MZ.lp = MZK.lp join PW on PW.typ = 37 and PW.idmg = MZK.id
  where MZ.id = @idmz and PW.iddw = @iddw and MZ.idpozkoryg is not NULL
end
if @przychod = 1
begin
  set @iloscpw = -@iloscpw
  set @wartoscpw = -@wartoscpw
end
else
begin
  if @bufor = 0 or @iloscpw > 0
  begin
    select @iloscdosp = iloscdosp, @wartoscdosp = wartoscdosp, @cena = cena
    from DW where id = @iddw
    if @iloscdosp = 0.0
      set @wartoscpw = @iloscpw * @cena
    else
      set @wartoscpw = @iloscpw * @wartoscdosp / @iloscdosp
  end
end
insert into PW select (case when @przychod = 1 then 0x10 else 0 end |
                       case when @new = 1 then 0x08 else 0 end |
                       case when (DW.flag & 1) <> 0 then 0x04 else 0 end),
                  MG.subtyp, case when MZ.bufor <> 0 then 39 else 37 end, MZ.super, MZ.id, DW.id, MZ.idtw, @iloscpw, @wartoscpw, 0.0, @idkoryg, MZ.data
from MZ join MG on MG.id = MZ.super, DW where MZ.id = @idmz and DW.id = @iddw
select @return_status = @@error, @idpw = SCOPE_IDENTITY()
if @return_status <> 0 return @return_status
if @bufor = 0
begin
  select @iloscdosp = iloscdosp - @iloscpw, @wartoscdosp = wartoscdosp - @wartoscpw,
         @iloscdw = stan - @iloscpw, @wartoscdw = wartoscst - @wartoscpw,
         @iloscPz = iloscPz - case when @przychod = 1 then @iloscpw else 0.0 end
  from DW where id = @iddw
  if @iloscdosp < 0.0
    return -4900
  if @wartoscdosp < 0.0
    return -4901
  update DW set iloscdosp = @iloscdosp, wartoscdosp = @wartoscdosp,
                stan = @iloscdw, wartoscst = @wartoscdw, iloscPz = @iloscPz,
                typ = case when @iloscdw = 0.0 then 0 else 1 end
  from DW where DW.id = @iddw
  set @return_status = @@error
  if @return_status <> 0 return @return_status
end
if @new = 0 and @subtyp in (82,83)
begin
  set @datao = NULL
  set @typ = NULL
  select @datao = MIN(data), @typ = MIN(typ) from PW where typ = 37 and (flag & 0x10) <> 0 and iddw = @iddw
  if @typ is NULL
    select @datao = min(data), @typ = MIN(typ) from PW where typ = 39 and (flag & 0x10) <> 0 and iddw = @iddw
  select @idpwo = MIN(id) from PW where typ = @typ and (flag & 0x10) <> 0 and data = @datao and iddw = @iddw
  if @idpwo = @idpw
  begin
    update PW set flag = (flag | 8) where id = @idpw
    set @return_status = @@error
    if @return_status <> 0 return @return_status
    update PW set flag = (flag & ~8) where id <> @idpw and iddw = @iddw and (flag & 0x10) <> 0
    set @return_status = @@error
    if @return_status <> 0 return @return_status
    update DW set iddkpz = PW.iddkmg, data = PW.data, ilosc = -PW.ilosc from DW join PW on DW.id = PW.iddw where PW.id = @idpw
    set @return_status = @@error
    if @return_status <> 0 return @return_status
  end
end
GO
IF OBJECT_ID('[HM].[hm_PW_ZatwierdzPowiazaniaPZ]', 'P') IS NOT NULL DROP PROCEDURE [HM].[hm_PW_ZatwierdzPowiazaniaPZ]
GO
CREATE PROCEDURE HM.hm_PW_ZatwierdzPowiazaniaPZ
@iddok int
as
set NOCOUNT ON
declare @return_status int
declare @tblDWB TABLE
  (id int, idtw int)
declare @tblDWS TABLE
  (id int primary key not NULL, idtw int, magazyn int, iloscdosp decimal(24,6), wartoscdosp decimal(24,2), ilosc decimal(24,6), wartosc decimal(24,2),
   iloscPz decimal(24,6), data datetime)
declare @tblPWO TABLE
  (iddw int primary key not NULL, idpwo int, data datetime)
declare @tblSMS TABLE
  (id int primary key not NULL, idtw int, magazyn int, iloscdosp decimal(24,6), ilosc decimal(24,6), wartosc decimal(24,2))
update PW set flag = (PW.flag | 0x10), idmg = MZ.id, iddkmg = MG.id, subtyp = MG.subtyp, typ = 37, data = MZ.data
from PW join MZ on PW.typ = 39 and PW.idmg = MZ.id
join MG on MZ.super = MG.id
where MG.id = @iddok
set @return_status = @@error
if @return_status <> 0 return @return_status
insert @tblDWB
select DW.id, PWS.idtw
from DW join
(select distinct PW.iddw, MZ.idtw
 from PW join MZ on PW.typ = 37 and PW.idmg = MZ.id where MZ.super = @iddok) as PWS on PWS.iddw = DW.id
where DW.bufor = 1
update PW set flag = (flag & ~8)
from PW join @tblDWB as DWB on PW.iddw = DWB.id where (PW.flag & 0x08) <> 0
set @return_status = @@error
if @return_status <> 0 return @return_status
if exists (select * from @tblDWB)
begin
  update DW set bufor = 0, iddkpz = MG.id, data = MG.data, idtw = DWB.idtw, magazyn = MG.magazyn, idkh = MG.khid, kod = CASE WHEN '' = DW.kod THEN MG.kod ELSE DW.kod END
  from DW join @tblDWB as DWB on DW.id = DWB.id, MG where MG.id = @iddok
  set @return_status = @@error
  if @return_status <> 0 return @return_status
end
insert @tblDWS
select distinct PW.iddw, NULL, NULL, 0.0, 0.0, 0.0, 0.0, 0.0, NULL
from PW join MZ on PW.typ = 37 and PW.idmg = MZ.id where MZ.super = @iddok
update @tblDWS
set iloscdosp = PWR.ilosc, wartoscdosp = PWR.wartosc, ilosc = PWS.ilosc, wartosc = PWS.wartosc, iloscPz = PWP.ilosc, data = PWP.data,
    idtw = DW.idtw, magazyn = DW.magazyn
from @tblDWS as DWS join DW on DW.id = DWS.id
join
(select PW.iddw, -SUM(PW.ilosc) as ilosc, -SUM(PW.wartosc) as wartosc
 from PW where PW.typ = 37 or PW.typ = 26 group by PW.iddw) as PWR on PWR.iddw = DWS.id
join
(select PW.iddw, -SUM(PW.ilosc) as ilosc, -SUM(PW.wartosc) as wartosc
 from PW where PW.typ = 37 group by PW.iddw) as PWS on PWS.iddw = DWS.id
join
(select PW.iddw, -SUM(PW.ilosc) as ilosc, min(data) as data
 from PW where PW.typ = 37 and (PW.flag & 0x10) <> 0 group by PW.iddw) as PWP on PWP.iddw = DWS.id
if exists (select * from @tblDWS where ilosc < 0.0)
  return -4900
if exists (select * from @tblDWS where wartosc < 0.0)
  return -4901
update DW set iloscdosp = DWS.iloscdosp, wartoscdosp = DWS.wartoscdosp,
              stan = DWS.ilosc, wartoscst = DWS.wartosc, iloscPz = DWS.iloscPz,
              typ = case when DWS.ilosc = 0.0 then 0 else 1 end
from DW join @tblDWS as DWS on DW.id = DWS.id
set @return_status = @@error
if @return_status <> 0 return @return_status
insert @tblPWO
select distinct DWS.id, 0, DWS.data
from @tblDWS as DWS
left join (select min(data) as data, iddw from PW where typ = 37 and (flag & 0x08) <> 0 group by iddw) as PWO on DWS.id = PWO.iddw
where PWO.data is NULL or DWS.data <> PWO.data
if exists (select * from @tblPWO)
begin
  update @tblPWO set idpwo = PWDO.idpwo
  from @tblPWO as PWO join
  (select MIN(PW.id) as idpwo, PWO.iddw
   from @tblPWO as PWO join PW on PWO.iddw = PW.iddw and PWO.data = PW.data
   where (PW.flag & 0x10) <> 0 and PW.typ = 37 group by PWO.iddw) as PWDO on PWO.iddw = PWDO.iddw
  update PW set flag = (flag |  8) where PW.id in (select idpwo from @tblPWO)
  set @return_status = @@error
  if @return_status <> 0 return @return_status
  update PW set flag = (flag & ~8) from PW join @tblPWO as PWO on PW.iddw = PWO.iddw
  where PW.id not in (select idpwo from @tblPWO) and (PW.flag & 0x10) <> 0 and (PW.flag & 0x08) <> 0
  set @return_status = @@error
  if @return_status <> 0 return @return_status
  update DW set iddkpz = PW.iddkmg, data = PW.data, ilosc = -PW.ilosc, cena = case when cast(PW.ilosc as decimal(24,6)) = 0.0 then 0.0 else PW.wartosc/PW.ilosc end
  from DW join PW on DW.id = PW.iddw where PW.id in (select idpwo from @tblPWO)
  set @return_status = @@error
  if @return_status <> 0 return @return_status
end
insert @tblSMS
select SM.id, SM.idtw, SM.magazyn, SUM(DW.iloscdosp), SUM(DW.stan), SUM(DW.wartoscst)
from SM WITH (NOLOCK, INDEX(UC_SM_IDTW_MAGAZYN)) join DW on SM.idtw = DW.idtw and SM.magazyn = DW.magazyn
join (select distinct DWS.idtw, DWS.magazyn from @tblDWS as DWS) as DWS on SM.idtw = DWS.idtw and SM.magazyn = DWS.magazyn
where DW.bufor = 0
group by SM.id, SM.idtw, SM.magazyn
if exists (select * from @tblSMS where ilosc < 0.0)
  return -4700
if exists (select * from @tblSMS where wartosc < 0.0)
  return -4702
update SM set stanHandl = SMS.iloscdosp, stan = SMS.ilosc, wartosc = SMS.wartosc
from SM join @tblSMS as SMS on SM.id = SMS.id
set @return_status = @@error
if @return_status <> 0 return @return_status
insert LOCAL_LOG (baseName, rec_id,operation,term) select distinct 'SM', SMS.id, 3, @@SPID
from @tblSMS as SMS where SMS.id IS NOT NULL
insert DW
select 0, 0, 0, 'Rezerwacja ilościowa', NULL, NULL, NULL, NULL, -SMS.magazyn, SMS.idtw, convert(datetime, '9999-01-01', 20),
       0.0, 0.0, 0.0, 0.0, SMS.magazyn, 0.0, 0.0, 0.0, 0, NEWID(),NULL
from @tblSMS as SMS
left join DW on DW.numer < 0 and SMS.idtw = DW.idtw and SMS.magazyn = DW.magazyn
where SMS.id IS NULL and DW.id IS NULL
set @return_status = @@error
if @return_status <> 0 return @return_status
GO
IF OBJECT_ID('[HM].[stdhm_getrec_dw]', 'P') IS NOT NULL DROP PROCEDURE [HM].[stdhm_getrec_dw]
GO
CREATE PROCEDURE HM.stdhm_getrec_dw
@id int
AS
SELECT id,flag,subtyp,typ,kod,iddw,iddkpz,idkh,iddkzk,numer,idtw,data,ilosc,iloscdosp,cena,wartoscdosp,magazyn,iloscPz,stan,wartoscst,bufor,krajPochodzenia
FROM DW
WHERE id = @id
ORDER BY id ASC
GO
IF OBJECT_ID('[HM].[stdhm_update_dw]', 'P') IS NOT NULL DROP PROCEDURE [HM].[stdhm_update_dw]
GO
CREATE PROCEDURE HM.stdhm_update_dw
@id int, @flag smallint, @subtyp smallint, @typ smallint, @kod varchar(101),
@iddw int, @iddkpz int, @idkh int, @iddkzk int, @numer int,
@idtw int, @data datetime, @ilosc float, @iloscdosp float, @cena float,
@wartoscdosp float, @magazyn int, @iloscPz float, @stan float, @wartoscst float, @bufor smallint, @krajPochodzenia int
AS
UPDATE DW
SET flag = @flag, subtyp = @subtyp, typ = @typ, kod = @kod, iddw = @iddw,
iddkpz = @iddkpz, idkh = @idkh, iddkzk = @iddkzk, numer = @numer, idtw = @idtw,
data = @data, ilosc = @ilosc, iloscdosp = @iloscdosp, cena = @cena, wartoscdosp = @wartoscdosp,
magazyn = @magazyn, iloscPz = @iloscPz, stan = @stan, wartoscst = @wartoscst, bufor = @bufor, krajPochodzenia = @krajPochodzenia
WHERE @id = id
UPDATE IT SET idKrajuPo = @krajPochodzenia where iddw = @id
GO
IF OBJECT_ID('[HM].[hm_DW_PowiazaniaDostawPozycji]', 'P') IS NOT NULL DROP PROCEDURE [HM].[hm_DW_PowiazaniaDostawPozycji]
GO
CREATE PROCEDURE HM.hm_DW_PowiazaniaDostawPozycji
@poz int
AS
declare @superkoryg int
declare @super int
declare @lp smallint
declare @bufor smallint
declare @przychod smallint
select @superkoryg = ISNULL(MG.iddokkoryg, MG.id), @super = MZ.super, @lp = MZ.lp, @bufor = MG.bufor,
       @przychod = case when (MG.flag & 0x0100) <> 0 then 1 else 0 end
from MG join MZ on MG.id = MZ.super where MZ.id = @poz
declare @tblPWM TABLE
  (iddw int primary key, ilosc decimal(24,6), idpw int, flagpw smallint, datapw datetime, idkoryg int,
   ilmag decimal(24,6), wartmag decimal(24,2), ilbuf decimal(24,6), wartbuf decimal(24,2), ilrez decimal(24,6), wartrez decimal(24,2))
declare @tblPWA TABLE
  (id int, iddw int, ilosc decimal(24,6), wartosc decimal(24,2), idmz int, super int, primary key (iddw, super))
if @bufor = 1
 if @superkoryg = @super
  begin
   if @przychod = 1
    begin
     insert @tblPWM (iddw, ilosc, idpw, flagpw, datapw, idkoryg, ilmag, wartmag, ilbuf, wartbuf, ilrez, wartrez)
     select PW.iddw, PW.ilosc, PW.id, PW.flag, PW.data, 0, 0.0, 0.0, PW.ilosc, PW.wartosc, 0.0, 0.0
     from PW where PW.typ = 39 and PW.idmg = @poz
    end
   else
    begin
     insert @tblPWM (iddw, ilosc, idpw, flagpw, datapw, idkoryg, ilmag, wartmag, ilbuf, wartbuf, ilrez, wartrez)
     select PW.iddw, 0.0, 0, 0, NULL, 0, 0.0, 0.0, 0.0, 0.0, PW.ilosc, PW.wartosc
     from PW join RZ on (PW.typ = 26 and PW.idmg = RZ.id) where RZ.idpozrz = @poz
    end
  end
 else
  begin
    insert @tblPWA
    select MIN(PW.id) as id, PW.iddw, SUM(PW.ilosc), SUM(PW.wartosc + ISNULL(PWK.wartosc, 0.0)), MZ.id as idmz, MZ.super
    from PW join MZ on (PW.typ = 37 and PW.idmg = MZ.id)
    left join
    (select SUM(PW.wartosc) as wartosc, PW.idkoryg
     from PW where PW.subtyp = 90 group by PW.idkoryg) as PWK on PWK.idkoryg = PW.id
    where MZ.lp = @lp and MZ.superkoryg = @superkoryg and MZ.super < @super
    group by MZ.id, MZ.super, PW.iddw
    declare @tblPWB TABLE
      (id int, iddw int, ilosc decimal(24,6), wartosc decimal(24,2), idmz int, super int, primary key (iddw, super))
    insert @tblPWB
    select PW.id, PW.iddw, PW.ilosc, PW.wartosc, MZ.id as idmz, MZ.super
    from PW join MZ on (PW.typ = 39 and PW.idmg = MZ.id)
    where MZ.id = @poz
    declare @tblPWR TABLE
      (id int, iddw int, ilosc decimal(24,6), wartosc decimal(24,2), idmz int, super int, primary key (iddw, super))
    insert @tblPWR
    select PW.id, PW.iddw, PW.ilosc, PW.wartosc, MZ.id as idmz, MZ.super
    from PW join RZ on (PW.typ = 26 and PW.idmg = RZ.id)
    join MZ on (RZ.bazadokrz = 33 and RZ.bazapozrz = 37 and RZ.idpozrz = MZ.id)
    where RZ.idpozrz = @poz
    insert @tblPWM (iddw, ilosc, idpw, flagpw, datapw, idkoryg, ilmag, wartmag, ilbuf, wartbuf, ilrez, wartrez)
    select PWA.iddw, ISNULL(PW.ilosc, 0.0), ISNULL(PW.id, 0), ISNULL(PW.flag, 0), PW.data, ISNULL(PW3.idkoryg, 0),
           ISNULL(PW3.ilosc, 0.0), ISNULL(PW3.wartosc, 0.0), ISNULL(PW1.ilosc, 0.0), ISNULL(PW1.wartosc, 0.0), ISNULL(PW2.ilosc, 0.0), ISNULL(PW2.wartosc, 0.0)
    from ( select iddw from @tblPWA union select iddw from @tblPWB union select iddw from @tblPWR) as PWA
    left join (select id, iddw, ilosc, wartosc from @tblPWB) as PW1 on PW1.iddw = PWA.iddw
    left join PW on PW.id = PW1.id
    left join (select iddw, ilosc, wartosc from @tblPWR) as PW2 on PW2.iddw = PWA.iddw
    left join (select iddw, SUM(ilosc) as ilosc, SUM(wartosc) as wartosc, MIN(id) as idkoryg
		       from @tblPWA group by iddw) as PW3 on PW3.iddw = PWA.iddw
  end
else
 if @superkoryg = @super
  begin
    insert @tblPWM (iddw, ilosc, idpw, flagpw, datapw, idkoryg, ilmag, wartmag, ilbuf, wartbuf, ilrez, wartrez)
    select PW.iddw, PW.ilosc, PW.id, PW.flag, PW.data, PW.id, PW.ilosc, PW.wartosc + ISNULL(PWK.wartosc, 0.0), 0.0, 0.0, 0.0, 0.0
    from PW left join
    (select PW.idkoryg, SUM(PW.wartosc) as wartosc
     from PW where PW.subtyp = 90 group by PW.idkoryg) as PWK on PWK.idkoryg = PW.id
    where PW.typ = 37 and PW.idmg = @poz
  end
 else
  begin
    insert @tblPWA
    select MIN(PW.id) as id, PW.iddw, SUM(PW.ilosc), SUM(PW.wartosc + ISNULL(PWK.wartosc, 0.0)), MZ.id as idmz, MZ.super
    from PW join MZ on (PW.typ = 37 and PW.idmg = MZ.id)
    left join
    (select SUM(PW.wartosc) as wartosc, PW.idkoryg
     from PW where PW.subtyp = 90 group by PW.idkoryg) as PWK on PWK.idkoryg = PW.id
    where MZ.lp = @lp and MZ.superkoryg = @superkoryg and MZ.super <= @super
    group by MZ.id, MZ.super, PW.iddw
    insert @tblPWM (iddw, ilosc, idpw, flagpw, datapw, idkoryg, ilmag, wartmag, ilbuf, wartbuf, ilrez, wartrez)
    select PWA.iddw, ISNULL(PW.ilosc, 0.0), ISNULL(PW.id, 0), ISNULL(PW.flag, 0), PW.data, PWA.idkoryg, PWA.ilosc, PWA.wartosc, 0.0, 0.0, 0.0, 0.0
    from (select iddw, SUM(ilosc) as ilosc, SUM(wartosc) as wartosc, MIN(id) as idkoryg
		  from @tblPWA group by iddw) as PWA
    left join (select id, iddw from @tblPWA where idmz = @poz) as PW1 on PW1.iddw = PWA.iddw
    left join PW on PW.id = PW1.id
  end
select DW.id, DW.flag, DW.typ, DW.kod, DW.numer, DW.idtw, DW.data, DW.ilosc, DW.iloscdosp, DW.cena, DW.wartoscdosp, DW.magazyn, DW.iloscPz, DW.stan, DW.wartoscst, DW.iddw,
     PWM.ilosc, PWM.idpw, PWM.flagpw, PWM.datapw, PWM.idkoryg, PWM.ilmag, PWM.wartmag, PWM.ilbuf, PWM.wartbuf, PWM.ilrez, PWM.wartrez, DW.krajPochodzenia
from DW join @tblPWM as PWM on DW.id = PWM.iddw
GO
IF OBJECT_ID('[HM].[hm_DW_QPowiazaniaDostawMg]', 'P') IS NOT NULL DROP PROCEDURE [HM].[hm_DW_QPowiazaniaDostawMg]
GO
CREATE PROCEDURE HM.hm_DW_QPowiazaniaDostawMg
@super int
AS
declare @superkoryg int
declare @bufor smallint
declare @przychod smallint
declare @charakter smallint
select @superkoryg = ISNULL(iddokkoryg, id), @bufor = bufor, @przychod = case when (MG.flag & 0x0100) <> 0 then 1 else 0 end, @charakter = MG.subtyp
from MG where MG.id = @super
declare @tblPWM TABLE
  (id int, lp smallint, super int, iddw int, ilosc decimal(24,6), idpw int, flagpw smallint, datapw datetime, idkoryg int,
   ilmag decimal(24,6), wartmag decimal(24,2), ilbuf decimal(24,6), wartbuf decimal(24,2), ilrez decimal(24,6), wartrez decimal(24,2), primary key (id, iddw))
declare @tblPWA TABLE
  (id int, iddw int, ilosc decimal(24,6), wartosc decimal(24,2), idmz int, lp smallint, super int, primary key (iddw, super, lp))
declare @tblPWS TABLE
  (id int, lp smallint, super int, iddw int, ilosc decimal(24,6), wartosc decimal(24,2), primary key (iddw, super, lp))
if @charakter not in (90,91)
if @bufor = 1
 if @superkoryg = @super
  begin
   if @przychod = 1
    begin
     insert @tblPWM (id, lp, super, iddw, ilosc, idpw, flagpw, datapw, idkoryg, ilmag, wartmag, ilbuf, wartbuf, ilrez, wartrez)
     select MZ.id, MZ.lp, MZ.super, PW.iddw, PW.ilosc, PW.id, PW.flag, PW.data, 0,
            0.0, 0.0, PW.ilosc, PW.wartosc, 0.0, 0.0
     from PW join MZ on (PW.typ = 39 and MZ.id = PW.idmg)
     where MZ.super = @super
    end
   else
    begin
     insert @tblPWM (id, lp, super, iddw, ilosc, idpw, flagpw, datapw, idkoryg, ilmag, wartmag, ilbuf, wartbuf, ilrez, wartrez)
     select MZ.id, MZ.lp, MZ.super, PW.iddw, 0.0, 0, 0, NULL, 0,
            0.0, 0.0, 0.0, 0.0, PW.ilosc, PW.wartosc
     from PW join RZ on (PW.typ = 26 and PW.idmg = RZ.id)
     join MZ on (RZ.bazadokrz = 33 and RZ.bazapozrz = 37 and RZ.idpozrz = MZ.id)
     where RZ.iddokrz = @super
    end
  end
 else
  begin
    insert @tblPWA
    select MIN(PW.id) as id, PW.iddw, SUM(PW.ilosc), SUM(PW.wartosc + ISNULL(PWK.wartosc, 0.0)), MZ.id as idmz, MZ.lp, MZ.super
    from PW join MZ on (PW.typ = 37 and PW.idmg = MZ.id)
    left join
    (select SUM(PW.wartosc) as wartosc, PW.idkoryg
     from PW where PW.subtyp = 90 group by PW.idkoryg) as PWK on PWK.idkoryg = PW.id
    where MZ.superkoryg = @superkoryg and MZ.super < @super
    group by MZ.id, MZ.lp, MZ.super, PW.iddw
    declare @tblPWB TABLE
      (id int, iddw int, ilosc decimal(24,6), wartosc decimal(24,2), idmz int, lp smallint, super int, primary key (iddw, super, lp))
    insert @tblPWB
    select PW.id, PW.iddw, PW.ilosc, PW.wartosc, MZ.id as idmz, MZ.lp, MZ.super
    from PW join MZ on (PW.typ = 39 and PW.idmg = MZ.id)
    where MZ.super = @super
    declare @tblPWR TABLE
      (id int, iddw int, ilosc decimal(24,6), wartosc decimal(24,2), idmz int, lp smallint, super int, primary key (iddw, super, lp))
    insert @tblPWR
    select PW.id, PW.iddw, PW.ilosc, PW.wartosc, MZ.id as idmz, MZ.lp, MZ.super
    from PW join RZ on (PW.typ = 26 and PW.idmg = RZ.id)
    join MZ on (RZ.bazadokrz = 33 and RZ.bazapozrz = 37 and RZ.idpozrz = MZ.id)
    where RZ.iddokrz = @super
    insert @tblPWS
    select MIN(id), lp, super, iddw, SUM(ilosc), SUM(wartosc)
    from ( select id, lp, super, iddw, ilosc, wartosc from @tblPWA
     union select id, lp, super, iddw, ilosc, wartosc from @tblPWB
     union select id, lp, super, iddw, ilosc, wartosc from @tblPWR) as PWA
    group by lp, super, iddw
    insert @tblPWM (id, lp, super, iddw, ilosc, idpw, flagpw, datapw, idkoryg, ilmag, wartmag, ilbuf, wartbuf, ilrez, wartrez)
    select PWA.idmz, PWA.lp, PWA.super, PWA.iddw, ISNULL(PW.ilosc, 0.0), ISNULL(PW.id, 0), ISNULL(PW.flag, 0), PW.data, ISNULL(PW3.idkoryg, 0),
           ISNULL(PW3.ilosc, 0.0), ISNULL(PW3.wartosc, 0.0), ISNULL(PW1.ilosc, 0.0), ISNULL(PW1.wartosc, 0.0), ISNULL(PW2.ilosc, 0.0), ISNULL(PW2.wartosc, 0.0)
    from ( select lp, super, idmz, iddw from @tblPWA
     union select lp, super, idmz, iddw from @tblPWB
     union select lp, super, idmz, iddw from @tblPWR) as PWA
    left join (select id, idmz, iddw, ilosc, wartosc from @tblPWB) as PW1 on (PW1.idmz = PWA.idmz and PW1.iddw = PWA.iddw)
    left join PW on PW.id = PW1.id
    left join (select idmz, iddw, ilosc, wartosc from @tblPWR) as PW2 on (PW2.idmz = PWA.idmz and PW2.iddw = PWA.iddw)
    left join
       (select PWS1.lp, PWS1.super, PWS1.iddw, SUM(PWS2.ilosc) as ilosc, SUM(PWS2.wartosc) as wartosc, MIN(PWS1.id) as idkoryg
        from @tblPWS as PWS1
        join @tblPWS as PWS2 on (PWS1.lp = PWS2.lp and PWS1.iddw = PWS2.iddw and PWS1.super >= PWS2.super)
        group by PWS1.lp, PWS1.super, PWS1.iddw) as PW3 on PW3.lp = PWA.lp and PW3.super = PWA.super and PW3.iddw = PWA.iddw
  end
else
 if @superkoryg = @super
  begin
    insert @tblPWM (id, lp, super, iddw, ilosc, idpw, flagpw, datapw, idkoryg, ilmag, wartmag, ilbuf, wartbuf, ilrez, wartrez)
    select MZ.id, MZ.lp, MZ.super, PW.iddw, PW.ilosc, PW.id, PW.flag, PW.data, PW.id,
           PW.ilosc, PW.wartosc + ISNULL(PWK.wartosc, 0.0), 0.0, 0.0, 0.0, 0.0
    from PW join MZ on (PW.typ = 37 and MZ.id = PW.idmg)
    left join
    (select PW.idkoryg, SUM(PW.wartosc) as wartosc
     from PW where PW.subtyp = 90 group by PW.idkoryg) as PWK on PWK.idkoryg = PW.id
    where MZ.super = @super
  end
 else
  begin
    insert @tblPWA
    select MIN(PW.id) as id, PW.iddw, SUM(PW.ilosc), SUM(PW.wartosc + ISNULL(PWK.wartosc, 0.0)), MZ.id as idmz, MZ.lp, MZ.super
    from PW join MZ on (PW.typ = 37 and PW.idmg = MZ.id)
    left join
    (select SUM(PW.wartosc) as wartosc, PW.idkoryg
     from PW where PW.subtyp = 90 group by PW.idkoryg) as PWK on PWK.idkoryg = PW.id
    where MZ.superkoryg = @superkoryg and MZ.super <= @super
    group by MZ.id, MZ.lp, MZ.super, PW.iddw
    insert @tblPWS
    select MIN(id), lp, super, iddw, SUM(ilosc), SUM(wartosc)
    from @tblPWA group by lp, super, iddw
    insert @tblPWM (id, lp, super, iddw, ilosc, idpw, flagpw, datapw, idkoryg, ilmag, wartmag, ilbuf, wartbuf, ilrez, wartrez)
    select PWA.idmz, PWA.lp, PWA.super, PWA.iddw, PW.ilosc, PW.id, PW.flag, PW.data, ISNULL(PW3.idkoryg, 0),
           ISNULL(PW3.ilosc, 0.0), ISNULL(PW3.wartosc, 0.0), 0.0, 0.0, 0.0, 0.0
    from (select id, lp, super, idmz, iddw from @tblPWA) as PWA
    join PW on PW.id = PWA.id
    left join
       (select PWS1.lp, PWS1.super, PWS1.iddw, SUM(PWS2.ilosc) as ilosc, SUM(PWS2.wartosc) as wartosc, min(PWS1.id) as idkoryg
        from @tblPWS as PWS1
        join @tblPWS as PWS2 on (PWS1.lp = PWS2.lp and PWS1.iddw = PWS2.iddw and PWS1.super >= PWS2.super)
        group by PWS1.lp, PWS1.super, PWS1.iddw) as PW3 on PW3.lp = PWA.lp and PW3.super = PWA.super and PW3.iddw = PWA.iddw
  end
select DW.id, DW.flag, DW.typ, DW.kod, DW.numer, DW.idtw, DW.data, DW.ilosc, DW.iloscdosp, DW.cena, DW.wartoscdosp, DW.magazyn, DW.iloscPz, DW.stan, DW.wartoscst, DW.iddw,
     PWM.lp, PWM.super, PWM.id as idmz, PWM.ilosc, PWM.idpw, PWM.flagpw, PWM.datapw, PWM.idkoryg,
     PWM.ilmag, PWM.wartmag, PWM.ilbuf, PWM.wartbuf, PWM.ilrez, PWM.wartrez, DW.krajPochodzenia
from DW join @tblPWM as PWM on DW.id = PWM.iddw
order by PWM.lp, PWM.super desc, PWM.iddw desc
GO
IF OBJECT_ID('[HM].[hm_PW_ZmienPW]', 'P') IS NOT NULL DROP PROCEDURE [HM].[hm_PW_ZmienPW]
GO
CREATE PROCEDURE HM.hm_PW_ZmienPW
@idpw int,
@ilosc float,
@wartosc float,
@kod varchar(100),
@numer int,
@zatwwart smallint,
@krajPochodzenia int
as
declare @iddwo int, @idpwo int, @iddw int, @iddwm int, @idmz int
declare @return_status int
declare @iloscpw decimal(24,6), @wartoscpw decimal(24,2), @iloscpwo decimal(24,6), @wartoscpwo decimal(24,2)
declare @iloscdosp decimal(24,6), @wartoscdosp decimal(24,2), @iloscdw decimal(24,6), @wartoscdw decimal(24,2), @iloscPz decimal(24,6)
declare @new smallint, @bufor smallint, @subtyp smallint, @typ smallint
declare @datao datetime, @data datetime
declare @cena float
declare @przychod smallint, @koryg smallint
set @iloscpw = @ilosc
set @wartoscpw = @wartosc
set @cena = @wartosc / @ilosc
set @new = 0
set @koryg = 0
select @bufor = case when PW.typ = 37 then 0 else 1 end, @subtyp = PW.subtyp, @iddw = PW.iddw, @idmz = PW.idmg,
       @new = case when (PW.flag & 0x08) <> 0 then 1 else 0 end, @iloscpwo = PW.ilosc, @wartoscpwo = PW.wartosc, @datao = PW.data
from PW where PW.id = @idpw
select @przychod = case when @subtyp in (74,131,75,132,81,82,83,89) then 1 else 0 end
select @iddwm = ISNULL(DW.iddw, 0) from DW where DW.id = @iddw
select @data = MZ.data from MZ where MZ.id = @idmz
if @iddw = 0
  return -1
if exists ( select id from PW where idkoryg = @idpw )
	set @koryg = 1
if @koryg = 0
begin
	if @przychod = 1 and @new = 1
	begin
	  if @iddwm = 0
	  begin
		update DW set flag = @zatwwart, kod = case when @kod <> '' then @kod else DW.kod end, idkh = MG.khid,
					  numer = case when @numer <> 0 then @numer else DW.numer end, data = MZ.data, ilosc = @iloscpw,
					  cena = @cena, magazyn = MZ.magazyn, krajPochodzenia = @krajPochodzenia
		from DW, MZ join MG on MZ.super = MG.id where DW.id = @iddw and MZ.id = @idmz
		UPDATE IT SET idKrajuPo = @krajPochodzenia where iddw = @iddw
		set @return_status = @@error
		if @return_status <> 0 return @return_status
	  end
	  else
	  begin
		update DW set data = MZ.data, ilosc = @iloscpw, magazyn = MZ.magazyn, krajPochodzenia = @krajPochodzenia
		from DW, MZ where DW.id = @iddw and MZ.id = @idmz
		UPDATE IT SET idKrajuPo = @krajPochodzenia where iddw = @iddw
		set @return_status = @@error
		if @return_status <> 0 return @return_status
	  end
	end
	if @przychod = 1
	begin
	  set @iloscpw = -@iloscpw
	  set @wartoscpw = -@wartoscpw
	end
	else
	begin
	  if @bufor = 0 or @iloscpw > 0
	  begin
		select @iloscdosp = iloscdosp + @iloscpwo, @wartoscdosp = wartoscdosp + @wartoscpwo, @cena = cena
		from DW where id = @iddw
		if @iloscdosp = 0.0
		  set @wartoscpw = @iloscpw * @cena
		else
		  set @wartoscpw = @iloscpw * @wartoscdosp / @iloscdosp
	  end
	end
	update PW set flag = (PW.flag & ~4) | case when (DW.flag & 1) <> 0 then 0x04 else 0 end,
				  ilosc = @iloscpw, wartosc = @wartoscpw, data = @data
	from PW join DW on PW.iddw = DW.id where PW.id = @idpw
	set @return_status = @@error
	if @return_status <> 0 return @return_status
	if @bufor = 0
	begin
	  if @przychod = 1 and @new = 1 and @iloscpwo <> 0.0
		  set @wartoscpw = @iloscpw * @wartoscpwo / @iloscpwo
	  select @iloscdosp = iloscdosp - @iloscpw + @iloscpwo, @wartoscdosp = wartoscdosp - @wartoscpw + @wartoscpwo,
			 @iloscdw = stan - @iloscpw + @iloscpwo, @wartoscdw = wartoscst - @wartoscpw + @wartoscpwo,
			 @iloscPz = iloscPz - case when @przychod = 1 then (@iloscpw - @iloscpwo) else 0.0 end
	  from DW where id = @iddw
	  if @iloscdosp < 0.0
		return -4900
	  if @wartoscdosp < 0.0
		return -4901
	  update DW set iloscdosp = @iloscdosp, wartoscdosp = @wartoscdosp,
					stan = @iloscdw, wartoscst = @wartoscdw, iloscPz = @iloscPz,
					typ = case when @iloscdw = 0.0 then 0 else 1 end, krajPochodzenia = @krajPochodzenia
	  from DW where DW.id = @iddw
	  set @return_status = @@error
	  if @return_status <> 0 return @return_status
	end
end
else
begin
	update PW set flag = (PW.flag & ~4) | case when (DW.flag & 1) <> 0 then 0x04 else 0 end, data = @data
	from PW join DW on PW.iddw = DW.id where PW.id = @idpw
	set @return_status = @@error
	if @return_status <> 0 return @return_status
end
if @subtyp in (82,83) and @data <> @datao
begin
  set @datao = NULL
  set @typ = NULL
  select @datao = MIN(data), @typ = MIN(typ) from PW where typ = 37 and (flag & 0x10) <> 0 and iddw = @iddw
  if @typ is NULL
    select @datao = min(data), @typ = MIN(typ) from PW where typ = 39 and (flag & 0x10) <> 0 and iddw = @iddw
  select @idpwo = MIN(id) from PW where typ = @typ and (flag & 0x10) <> 0 and data = @datao and iddw = @iddw
  if @idpwo = @idpw
  begin
    update PW set flag = (flag | 8) where id = @idpw
    set @return_status = @@error
    if @return_status <> 0 return @return_status
    update PW set flag = (flag & ~8) where id <> @idpw and iddw = @iddw and (flag & 0x10) <> 0
    set @return_status = @@error
    if @return_status <> 0 return @return_status
    update DW set iddkpz = PW.iddkmg, data = PW.data, ilosc = -PW.ilosc from DW join PW on DW.id = PW.iddw where PW.id = @idpw
    set @return_status = @@error
    if @return_status <> 0 return @return_status
  end
end
GO
IF OBJECT_ID('[HM].[hm_DW_QDostawyTowaru]', 'P') IS NOT NULL DROP PROCEDURE [HM].[hm_DW_QDostawyTowaru]
GO
CREATE PROCEDURE HM.hm_DW_QDostawyTowaru
@tw int,
@mg int,
@niezerowe smallint
AS
select id, flag, subtyp, typ, kod, iddw, iddkpz, idkh, iddkzk, numer, idtw, data, ilosc, iloscdosp, cena, wartoscdosp, magazyn, iloscPz, stan, wartoscst, bufor, krajPochodzenia
from DW WITH (INDEX (IDX_DW_IDTW_MAGAZYN_BUFOR))
where DW.bufor = 0 and DW.idtw = @tw and DW.magazyn = @mg and (@niezerowe = 0 or DW.iloscdosp <> 0.0)
GO
IF OBJECT_ID('[HM].[hm_IntrastatZnajdzNiespojneTowary]', 'P') IS NOT NULL DROP PROCEDURE [HM].[hm_IntrastatZnajdzNiespojneTowary]
GO
CREATE PROCEDURE HM.hm_IntrastatZnajdzNiespojneTowary
@wywoz int,
@przywoz int,
@odDate datetime,
@doDate datetime,
@kodCN varchar(10)
AS
select	distinct(TW.id), 
		TW.kod, 
		case when TW.przelit = 2 then 'TAK' else 'NIE' end AS [przelitAtr], 
		case when TW.jmuzup = '' then 'BRAK' else TW.jmuzup end AS [jmuzup]
		from IT INNER JOIN
			 MZ ON IT.idmg = MZ.id 		INNER JOIN
			 MG ON MZ.super = MG.id 		INNER JOIN
			 TW ON MZ.idtw = TW.id
		where TW.pcn = @kodCN and MG.data >= @odDate  AND MG.data < @doDate
		and mg.subtyp IN (78, 88, 76, 77, 74, 75, 89, 81)
GO
SET IDENTITY_INSERT [Common].[CardIndexFilters] ON
INSERT INTO [Common].[CardIndexFilters] ([Id],[Name],[EntityType],[Irremovable],[FilterFields])
VALUES
    (9120,	'Dane do deklaracji - poprzedni miesiąc',			'IntrastatCardIndexDTO',				1, 'IsPreviousMonth([PeriodDate])'),
	(9121,	'Wszystkie',			                            'IntrastatCardIndexDTO',				1,	NULL)
SET IDENTITY_INSERT [Common].[CardIndexFilters] OFF
GO
IF OBJECT_ID('[HM].[hm_IntrastatDekl]', 'P') IS NOT NULL DROP PROCEDURE [HM].[hm_IntrastatDekl]
GO
CREATE PROCEDURE [HM].[hm_IntrastatDekl]
	@wywoz INT,
    @poszerz INT,
    @odDate DATETIME,
    @doDate DATETIME,
    @komasuj INT,
    @wartKorekty INT
AS
BEGIN
    SET NOCOUNT ON;
    SELECT DISTINCT
           MZ.superkoryg,
           MZ.lp,
           MZ.cena
    INTO #MZCENY
    FROM hm.MZ
    WHERE MZ.id NOT IN
          (
              SELECT idpozkoryg FROM HM.MZ WHERE (idpozkoryg IS NOT NULL) AND (bufor = 0)
          )
          AND MZ.kompensata = 0;
    IF @wywoz = 1
    BEGIN
        SET NOCOUNT ON;
        SELECT MG.subtyp,
               ISNULL(MG.iddokkoryg, MG.id) AS [iddokkoryg],
               MZ.super,
               MZ.lp,
               SUM(MZ.iloscwp * MZC.cena + MZ.wartk) AS [wartNetto],
               SUM(MZ.ilosc) AS [ilosc]
        INTO #MZW
        FROM HM.MG AS MG
            JOIN HM.MZ AS MZ
                ON MZ.super = MG.id
            JOIN #MZCENY AS MZC
                ON MZC.superkoryg = MZ.superkoryg
                   AND MZC.lp = MZ.lp
        WHERE MG.data >= @odDate
              AND MG.data < @doDate
        GROUP BY MG.subtyp,
                 ISNULL(MG.iddokkoryg, MG.id),
                 MZ.super,
                 MZ.lp
        HAVING (SUM(MZ.ilosc) > 0)
               AND (MG.subtyp IN ( 78, 76, 88, 77 ));
        SELECT DISTINCT
               MZ.super,
               MZ.lp,
               DP.wartNetto,
               DP.ilosc
        INTO #DPW
        FROM HM.MG AS MG
            JOIN HM.MZ AS MZ
                ON MZ.super = MG.id
            LEFT OUTER JOIN HM.OP OPMZ
                ON OPMZ.owner_id = MZ.id
            LEFT OUTER JOIN HM.RO RO
                ON RO.id2 = OPMZ.id
            LEFT OUTER JOIN HM.OP OPDP
                ON OPDP.id = RO.id1
            LEFT OUTER JOIN HM.DP
                ON ISNULL(DP.idpozkoryg, DP.id) = OPDP.owner_id
        WHERE OPMZ.subtyp = 3
              AND DP.id IS NOT NULL
              AND DP.kompensata <> 1
              AND DP.bufor = 0
              AND DP.id NOT IN
                  (
                      SELECT idpozkoryg FROM HM.DP WHERE (idpozkoryg IS NOT NULL AND bufor = 0)
                  )
              AND RO.flag & 0x1000 <> 0x1000
              AND RO.typ = 1
              AND MG.id IN
                  (
                      SELECT iddokkoryg FROM #MZW
                  );
        IF @wartKorekty <> 0
        BEGIN
            SELECT MG.subtyp,
                   ISNULL(MG.iddokkoryg, MG.id) AS [iddokkoryg],
                   MZ.super,
                   MZ.lp,
                   SUM(MZ.iloscwp * MZC.cena + MZ.wartk) AS [wartNetto],
                   SUM(MZ.ilosc) AS [ilosc]
            INTO #MZPZ
            FROM HM.MG AS MG
                JOIN HM.MZ AS MZ
                    ON MZ.super = MG.id
                JOIN #MZCENY AS MZC
                    ON MZC.superkoryg = MZ.superkoryg
                       AND MZC.lp = MZ.lp
            WHERE MG.data >= @odDate
                  AND MG.data < @doDate
            GROUP BY MG.subtyp,
                     ISNULL(MG.iddokkoryg, MG.id),
                     MZ.super,
                     MZ.lp
            HAVING (SUM(MZ.ilosc) > 0)
                   AND (MG.subtyp IN ( 81, 75 ));
            INSERT INTO #DPW
            SELECT DISTINCT
                   MZ.super,
                   MZ.lp,
                   ISNULL(
                             NULLIF(ISNULL(DP.cenawal, 0) * ISNULL(DP.iloscwp, 0) * ISNULL(DK2.kurs, 0), 0),
                             (ISNULL(DP.wartNetto, 0) - SIGN(ISNULL(DP.wartNetto, 0)) * ISNULL(DP.iloscjedn, 0))
                         ) AS [wartnetto],
                   DP.ilosc
            FROM HM.MG AS MG
                JOIN HM.MZ AS MZ
                    ON MZ.super = MG.id
                LEFT OUTER JOIN HM.OP OPMZ
                    ON OPMZ.owner_id = MZ.id
                LEFT OUTER JOIN HM.RO RO
                    ON RO.id1 = OPMZ.id
                LEFT OUTER JOIN HM.OP OPDP
                    ON OPDP.id = RO.id2
                LEFT OUTER JOIN HM.DP
                    ON ISNULL(DP.idpozkoryg, DP.id) = OPDP.owner_id
                LEFT OUTER JOIN HM.DK DK1
                    ON DK1.id = DP.super
                LEFT OUTER JOIN HM.ZZ
                    ON (
                           ZZ.baza2 IN ( 16, 34 )
                           AND ZZ.typ = 151
                           AND ZZ.id2 = DK1.id
                       )
                LEFT OUTER JOIN HM.DK DK2
                    ON DK2.id = ZZ.id1
            WHERE OPMZ.subtyp = 2
                  AND DP.id IS NOT NULL
                  AND DP.kompensata <> 1
                  AND DP.bufor = 0
                  AND DP.id NOT IN
                      (
                          SELECT idpozkoryg FROM HM.DP WHERE (idpozkoryg IS NOT NULL AND bufor = 0)
                      )
                  AND RO.flag & 0x1000 <> 0x1000
                  AND RO.typ = 1
                  AND MG.id IN
                      (
                          SELECT iddokkoryg FROM #MZPZ
                      );
            INSERT INTO #MZW
            SELECT *
            FROM #MZPZ;
        END;
        IF @poszerz = 1
        BEGIN
            SELECT  ISNULL(SUBSTRING(TX.opis, 1, 255), TW.nazwa) AS [OpisTowaru],
                   'tw' AS [JakiOpis],
                   IT.idKrajuPo AS [KrajPochodzenia],
                   IT.idKrajuWy AS [KrajPrzeznaczeniaWysylki],
                   ISNULL(a.nip, '') AS [IdKontrahenta],
                   IT.dostawa AS [WarunkiDostawy],
                   IT.transakcja AS [RodzajTransakcji],
                   IT.transport AS [RodzajTransportu],
                   TW.pcn AS [KodTowarowy],
                   MAX(TW.przelit) AS [PrzelicznikIT],
                   SUM(pw.ilosc * ISNULL(NULLIF(TW.przelkg, 0), 0)) AS [MasaNetto],
                   SUM(pw.ilosc * ISNULL(NULLIF(TW.przeluz, 0), 0)) AS [IloscUzupelniajacaJm],
                   SUM(ISNULL(PW.ilosc*(#DPW.wartNetto/NULLIF ( #DPW.ilosc , 0 )),ROUND((#MZW.wartNetto/NULLIF(#MZW.ilosc,0))*pw.ilosc,2))) as [WartoscFaktury],
                   SUM(ABS(IT.wartStat)) AS [WartoscStatystyczna],
                   MAX(TW.id) AS [idtw]
            INTO #ISTPW
            FROM hm.IT
                INNER JOIN hm.MZ
                    ON IT.idmg = MZ.id
                INNER JOIN hm.MG d
                    ON MZ.super = d.id
				INNER JOIN HM.PW
					ON pw.iddkmg=mz.super AND pw.idmg=mz.id AND pw.iddw=it.iddw AND pw.ilosc<>0
                LEFT JOIN hm.AD a
                    ON d.khadid = a.id
                INNER JOIN #MZW
                    ON MZ.super = #MZW.super
                       AND MZ.lp = #MZW.lp
                INNER JOIN hm.TW
                    ON MZ.idtw = TW.id
                LEFT OUTER JOIN #DPW
                    ON #MZW.iddokkoryg = #DPW.super
                       AND #MZW.lp = #DPW.lp
                LEFT OUTER JOIN hm.TX
                    ON TX.id = TW.idlongname
                LEFT OUTER JOIN hm.MZ AS MZK
                    ON MZ.idpozkoryg = MZK.id
            WHERE IT.idKrajuWy <> 1
            GROUP BY ISNULL(SUBSTRING(TX.opis, 1, 255), TW.nazwa),
                     IT.idKrajuPo,
                     IT.idKrajuWy,
                     ISNULL(a.nip, ''),
                     IT.dostawa,
                     IT.transakcja,
                     IT.transport,
                     TW.pcn
            IF @komasuj <> 1
            BEGIN
                SELECT COUNT(*) AS [LacznaLiczbaPozycji],
                       SUM(ROUND(WartoscFaktury, 0)) AS [LacznaWartoscFaktur],
                       SUM(ROUND(WartoscStatystyczna, 0)) AS [LacznaWartoscStatystyczna]
                FROM #ISTPW
                HAVING SUM(WartoscFaktury) <> 0;
                SELECT *
                FROM #ISTPW;
            END;
            ELSE
            BEGIN
                SELECT KrajPochodzenia,
                       KrajPrzeznaczeniaWysylki,
                       IdKontrahenta,
                       WarunkiDostawy,
                       RodzajTransakcji,
                       RodzajTransportu,
                       KodTowarowy,
                       SUM(MasaNetto) AS [MasaNetto],
                       SUM(IloscUzupelniajacaJm) AS [IloscUzupelniajacaJm],
                       SUM(WartoscFaktury) AS [WartoscFaktury],
                       SUM(WartoscStatystyczna) AS [WartoscStatystyczna],
                       COUNT(*) AS [ilepoz],
                       MAX(idtw) AS [idtw],
                       MAX(PrzelicznikIT) AS [PrzelicznikIT]
                INTO #ISTPWKOM
                FROM #ISTPW
                GROUP BY KrajPochodzenia,
                         KrajPrzeznaczeniaWysylki,
                         IdKontrahenta,
                         WarunkiDostawy,
                         RodzajTransakcji,
                         RodzajTransportu,
                         KodTowarowy;
                SELECT COUNT(*) AS [LacznaLiczbaPozycji],
                       SUM(ROUND(WartoscFaktury, 0)) AS [LacznaWartoscFaktur],
                       SUM(ROUND(WartoscStatystyczna, 0)) AS [LacznaWartoscStatystyczna]
                FROM #ISTPWKOM
                HAVING SUM(WartoscFaktury) <> 0;
                SELECT KrajPochodzenia,
                       KodTowarowy,
                       KrajPrzeznaczeniaWysylki,
                       IdKontrahenta,
                       WarunkiDostawy,
                       RodzajTransakcji,
                       RodzajTransportu,
                       MasaNetto,
                       IloscUzupelniajacaJm,
                       WartoscFaktury,
                       WartoscStatystyczna,
                       CASE
                           WHEN (ilepoz > 1) THEN
                               'pcn'
                           ELSE
                               'tw'
                       END AS [JakiOpis],
                       ISNULL(SUBSTRING(TX.opis, 1, 255), TW.nazwa) AS [OpisTowaru],
                       PrzelicznikIT
                FROM #ISTPWKOM
                    INNER JOIN HM.TW
                        ON idtw = TW.id
                    LEFT OUTER JOIN HM.TX
                        ON TX.id = TW.idlongname;
            END;
        END;
        ELSE
        BEGIN
            SELECT ISNULL(SUBSTRING(TX.opis, 1, 255), TW.nazwa) AS [OpisTowaru],
                   'tw' AS [JakiOpis],
                   IT.idKrajuPo AS [KrajPochodzenia],
                   IT.idKrajuWy AS [KrajPrzeznaczeniaWysylki],
                   ISNULL(a.nip, '') AS [IdKontrahenta],
                   IT.transakcja AS [RodzajTransakcji],
                   TW.pcn AS [KodTowarowy],
                   MAX(TW.przelit) AS [PrzelicznikIT],
                   SUM(PW.ilosc * ISNULL(NULLIF(TW.przelkg, 0), 0)) AS [MasaNetto],
                   SUM(PW.ilosc * ISNULL(NULLIF(TW.przeluz, 0), 0)) AS [IloscUzupelniajacaJm],
                   SUM(ISNULL(PW.ilosc*(#DPW.wartNetto/NULLIF ( #DPW.ilosc , 0 )),ROUND((#MZW.wartNetto/NULLIF(#MZW.ilosc,0))*pw.ilosc,2))) as [WartoscFaktury],
                   MAX(TW.id) AS [idtw]
            INTO #ISTW
            FROM hm.IT
                INNER JOIN hm.MZ
                    ON IT.idmg = MZ.id
                INNER JOIN hm.MG d
                    ON MZ.super = d.id
				INNER JOIN HM.PW
					ON pw.iddkmg=mz.super AND pw.idmg=mz.id AND pw.iddw=it.iddw
                LEFT JOIN HM.AD a
                    ON d.khadid = a.id
                INNER JOIN #MZW
                    ON MZ.super = #MZW.super
                       AND MZ.lp = #MZW.lp
                INNER JOIN HM.TW
                    ON MZ.idtw = TW.id
                LEFT OUTER JOIN #DPW
                    ON #MZW.iddokkoryg = #DPW.super
                       AND #MZW.lp = #DPW.lp
                LEFT OUTER JOIN HM.TX
                    ON TX.id = TW.idlongname
            WHERE IT.idKrajuWy <> 1
            GROUP BY ISNULL(SUBSTRING(TX.opis, 1, 255), TW.nazwa),
                     IT.idKrajuWy,
					 IT.idKrajuPo,
                     ISNULL(a.nip, ''),
                     IT.transakcja,
                     TW.pcn;
            IF @komasuj <> 1
            BEGIN
                SELECT COUNT(*) AS [LacznaLiczbaPozycji],
                       SUM(ROUND(WartoscFaktury, 0)) AS [LacznaWartoscFaktur]
                FROM #ISTW
                HAVING SUM(WartoscFaktury) <> 0;
                SELECT *
                FROM #ISTW;
            END;
            ELSE
            BEGIN
                SELECT KrajPochodzenia,
                       KrajPrzeznaczeniaWysylki,
                       IdKontrahenta,
                       RodzajTransakcji,
                       KodTowarowy,
                       SUM(MasaNetto) AS [MasaNetto],
                       SUM(IloscUzupelniajacaJm) AS [IloscUzupelniajacaJm],
                       SUM(WartoscFaktury) AS [WartoscFaktury],
                       COUNT(*) AS [ilepoz],
                       MAX(idtw) AS [idtw],
                       MAX(PrzelicznikIT) AS [PrzelicznikIT]
                INTO #ISTWKOM
                FROM #ISTW
                GROUP BY KrajPochodzenia,
                         KrajPrzeznaczeniaWysylki,
                         IdKontrahenta,
                         RodzajTransakcji,
                         KodTowarowy;
                SELECT COUNT(*) AS [LacznaLiczbaPozycji],
                       SUM(ROUND(WartoscFaktury, 0)) AS [LacznaWartoscFaktur]
                FROM #ISTWKOM
                HAVING SUM(WartoscFaktury) <> 0;
                SELECT KrajPochodzenia,
                       KodTowarowy,
                       KrajPrzeznaczeniaWysylki,
                       IdKontrahenta,
                       RodzajTransakcji,
                       MasaNetto,
                       IloscUzupelniajacaJm,
                       WartoscFaktury,
                       CASE
                           WHEN (ilepoz > 1) THEN
                               'pcn'
                           ELSE
                               'tw'
                       END AS [JakiOpis],
                       ISNULL(SUBSTRING(TX.opis, 1, 255), TW.nazwa) AS [OpisTowaru],
                       PrzelicznikIT
                FROM #ISTWKOM
                    INNER JOIN HM.TW
                        ON idtw = TW.id
                    LEFT OUTER JOIN HM.TX
                        ON TX.id = TW.idlongname;
            END;
        END;
    END;
    ELSE
    BEGIN
        SET NOCOUNT ON;
		
        SELECT MG.subtyp,
               ISNULL(MG.iddokkoryg, MG.id) AS [iddokkoryg],
               MZ.super,
               MZ.lp,
               SUM(MZ.iloscwp * MZC.cena + MZ.wartk) AS [wartNetto],
               SUM(MZ.ilosc) AS [ilosc]
        INTO #MZP
        FROM hm.MG AS MG
            JOIN HM.MZ AS MZ
                ON MZ.super = MG.id
            JOIN #MZCENY AS MZC
                ON MZC.superkoryg = MZ.superkoryg
                   AND MZC.lp = MZ.lp
        WHERE MG.data >= @odDate
              AND MG.data < @doDate
        GROUP BY MG.subtyp,
                 ISNULL(MG.iddokkoryg, MG.id),
                 MZ.super,
                 MZ.lp
        HAVING (SUM(MZ.ilosc) < 0)
               AND (MG.subtyp IN ( 74, 75, 89, 81 ));
        SELECT DISTINCT
               MZ.super,
               MZ.lp,
               ISNULL(
                         NULLIF(ISNULL(DP.cenawal, 0) * ISNULL(DP.iloscwp, 0) * ISNULL(DK2.kurs, 0), 0),
                         (ISNULL(DP.wartNetto, 0) - SIGN(ISNULL(DP.wartNetto, 0)) * ISNULL(DP.iloscjedn, 0))
                     ) AS [wartnetto],
               DP.ilosc
        INTO #DPP
        FROM HM.MG AS MG
            JOIN HM.MZ AS MZ
                ON MZ.super = MG.id
            LEFT OUTER JOIN HM.OP OPMZ
                ON OPMZ.owner_id = MZ.id
            LEFT OUTER JOIN HM.RO RO
                ON RO.id1 = OPMZ.id
            LEFT OUTER JOIN HM.OP OPDP
                ON OPDP.id = RO.id2
            LEFT OUTER JOIN HM.DP
                ON ISNULL(DP.idpozkoryg, DP.id) = OPDP.owner_id
            LEFT OUTER JOIN HM.DK DK1
                ON DK1.id = DP.super
            LEFT OUTER JOIN HM.ZZ
                ON (
                       ZZ.baza2 IN ( 16, 34 )
                       AND ZZ.typ = 151
                       AND ZZ.id2 = DK1.id
                   )
            LEFT OUTER JOIN HM.DK DK2
                ON DK2.id = ZZ.id1
        WHERE OPMZ.subtyp = 2
              AND DP.id IS NOT NULL
              AND DP.kompensata <> 1
              AND DP.bufor = 0
              AND DP.id NOT IN
                  (
                      SELECT idpozkoryg FROM HM.DP WHERE (idpozkoryg IS NOT NULL AND bufor = 0)
                  )
              AND RO.flag & 0x1000 <> 0x1000
              AND RO.typ = 1
              AND MG.id IN
                  (
                      SELECT iddokkoryg FROM #MZP
                  );
        IF @wartKorekty <> 0
        BEGIN
			SELECT MG.subtyp,
                   ISNULL(MG.iddokkoryg, MG.id) AS [iddokkoryg],
                   MZ.super,
                   MZ.lp,
                   SUM(MZ.iloscwp * MZC.cena + MZ.wartk) AS [wartNetto],
                   SUM(MZ.ilosc) AS [ilosc]
            INTO #MZWZ
            FROM HM.MG AS MG
                JOIN HM.MZ AS MZ
                    ON MZ.super = MG.id
                JOIN #MZCENY AS MZC
                    ON MZC.superkoryg = MZ.superkoryg
                       AND MZC.lp = MZ.lp
            WHERE MG.data >= @odDate
                  AND MG.data < @doDate
            GROUP BY MG.subtyp,
                     ISNULL(MG.iddokkoryg, MG.id),
                     MZ.super,
                     MZ.lp
            HAVING (SUM(MZ.ilosc) < 0)
                   AND (MG.subtyp IN ( 77, 88 ));
            INSERT INTO #DPP
            SELECT DISTINCT
                   MZ.super,
                   MZ.lp,
                   DP.wartNetto,
                   DP.ilosc
            FROM HM.MG AS MG
                JOIN HM.MZ AS MZ
                    ON MZ.super = MG.id
                LEFT OUTER JOIN HM.OP OPMZ
                    ON OPMZ.owner_id = MZ.id
                LEFT OUTER JOIN HM.RO RO
                    ON RO.id2 = OPMZ.id
                LEFT OUTER JOIN HM.OP OPDP
                    ON OPDP.id = RO.id1
                LEFT OUTER JOIN HM.DP
                    ON ISNULL(DP.idpozkoryg, DP.id) = OPDP.owner_id
            WHERE OPMZ.subtyp = 3
                  AND DP.id IS NOT NULL
                  AND DP.kompensata <> 1
                  AND DP.bufor = 0
                  AND DP.id NOT IN
                      (
                          SELECT idpozkoryg FROM HM.DP WHERE (idpozkoryg IS NOT NULL AND bufor = 0)
                      )
                  AND RO.flag & 0x1000 <> 0x1000
                  AND RO.typ = 1
                  AND MG.id IN
                      (
                          SELECT iddokkoryg FROM #MZWZ
                      );
            INSERT INTO #MZP
            SELECT *
            FROM #MZWZ;
        END;
        IF @poszerz = 1
        BEGIN
		 
		
		    SELECT ISNULL(SUBSTRING(TX.opis, 1, 255), TW.nazwa) AS [OpisTowaru],
                   'tw' AS [JakiOpis],
                   IT.idKrajuPo AS [KrajPochodzenia],
                   IT.idKrajuWy AS [KrajPrzeznaczeniaWysylki],
                   IT.dostawa AS [WarunkiDostawy],
                   IT.transakcja AS [RodzajTransakcji],
                   IT.transport AS [RodzajTransportu],
                   TW.pcn AS [KodTowarowy],
                   MAX(TW.przelit) AS [PrzelicznikIT],
                   SUM(pw.ilosc * ISNULL(NULLIF(TW.przelkg, 0), 0)) AS [MasaNetto],
                   SUM(pw.ilosc * ISNULL(NULLIF(TW.przeluz, 0), 0)) AS [IloscUzupelniajacaJm],
                   SUM(ABS(ISNULL(PW.ilosc*(#DPP.wartNetto/NULLIF ( #DPP.ilosc , 0 )),ROUND((#MZP.wartNetto/NULLIF(#MZP.ilosc,0))*pw.ilosc,2)))) as [WartoscFaktury],
                   SUM(ABS(IT.wartStat)) AS [WartoscStatystyczna],
                   MAX(TW.id) AS [idtw]
		INTO #ISTPP 
            FROM HM.IT
                INNER JOIN HM.MZ
                    ON IT.idmg = MZ.id
				INNER JOIN hm.MG
					ON MG.id=mz.super
				INNER JOIN hm.PW
					ON pw.iddkmg=mg.id AND pw.idmg=mz.id  AND it.iddw=pw.iddw AND pw.ilosc<>0
                INNER JOIN #MZP
                    ON MZ.super = #MZP.super
                       AND MZ.lp = #MZP.lp
                INNER JOIN HM.TW
                    ON MZ.idtw = TW.id
                LEFT OUTER JOIN #DPP
                    ON #MZP.iddokkoryg = #DPP.super
                       AND #MZP.lp = #DPP.lp
                LEFT OUTER JOIN HM.TX
                    ON TX.id = TW.idlongname
                LEFT OUTER JOIN HM.MZ AS MZK
                    ON MZ.idpozkoryg = MZK.id
            WHERE IT.idKrajuWy <> 1 --AND mz.typ=0
            GROUP BY ISNULL(SUBSTRING(TX.opis, 1, 255), TW.nazwa),
                     IT.idKrajuPo,
                     IT.idKrajuWy,
                     IT.dostawa,
                     IT.transakcja,
                     IT.transport,
                     TW.pcn
					 
				   
            IF @komasuj <> 1
            BEGIN
                SELECT COUNT(*) AS [LacznaLiczbaPozycji],
                       SUM(ROUND(WartoscFaktury, 0)) AS [LacznaWartoscFaktur],
                       SUM(ROUND(WartoscStatystyczna, 0)) AS [LacznaWartoscStatystyczna]
                FROM #ISTPP
                HAVING SUM(WartoscFaktury) <> 0;
                SELECT  *
                FROM #ISTPP;
            END;
            ELSE
            BEGIN
				
                SELECT KrajPochodzenia,
                       KrajPrzeznaczeniaWysylki,
                       WarunkiDostawy,
                       RodzajTransakcji,
                       RodzajTransportu,
                       KodTowarowy,
                       SUM(MasaNetto) AS [MasaNetto],
                       SUM(IloscUzupelniajacaJm) AS [IloscUzupelniajacaJm],
                       SUM(WartoscFaktury) AS [WartoscFaktury],
                       SUM(WartoscStatystyczna) AS [WartoscStatystyczna],
                       COUNT(*) AS [ilepoz],
                       MAX(idtw) AS [idtw],
                       MAX(PrzelicznikIT) AS [PrzelicznikIT]
                INTO #ISTPPKOM
                FROM #ISTPP
                GROUP BY KrajPochodzenia,
                         KrajPrzeznaczeniaWysylki,
                         WarunkiDostawy,
                         RodzajTransakcji,
                         RodzajTransportu,
                         KodTowarowy,
                         KrajPochodzenia;
                SELECT COUNT(*) AS [LacznaLiczbaPozycji],
                       SUM(ROUND(WartoscFaktury, 0)) AS [LacznaWartoscFaktur],
                       SUM(ROUND(WartoscStatystyczna, 0)) AS [LacznaWartoscStatystyczna]
                FROM #ISTPPKOM
                HAVING SUM(WartoscFaktury) <> 0;
                SELECT KrajPochodzenia,
                       KodTowarowy,
                       KrajPrzeznaczeniaWysylki,
                       WarunkiDostawy,
                       RodzajTransakcji,
                       RodzajTransportu,
                       MasaNetto,
                       IloscUzupelniajacaJm,
                       WartoscFaktury,
                       WartoscStatystyczna,
                       CASE
                           WHEN (ilepoz > 1) THEN
                               'pcn'
                           ELSE
                               'tw'
                       END AS [JakiOpis],
                       ISNULL(SUBSTRING(TX.opis, 1, 255), TW.nazwa) AS [OpisTowaru],
                       PrzelicznikIT
                FROM #ISTPPKOM
                    INNER JOIN HM.TW
                        ON idtw = TW.id
                    LEFT OUTER JOIN HM.TX
                        ON TX.id = TW.idlongname;
            END;
        END;
        ELSE
        BEGIN
            SELECT ISNULL(SUBSTRING(TX.opis, 1, 255), TW.nazwa) AS [OpisTowaru],
                   'tw' AS [JakiOpis],
                   IT.idKrajuPo AS [KrajPochodzenia],
                   IT.idKrajuWy AS [KrajPrzeznaczeniaWysylki],
                   IT.transakcja AS [RodzajTransakcji],
                   TW.pcn AS [KodTowarowy],
                   MAX(TW.przelit) AS [PrzelicznikIT],
                   SUM(pw.ilosc * ISNULL(NULLIF(TW.przelkg, 0), 0)) AS [MasaNetto],
                   SUM(pw.ilosc * ISNULL(NULLIF(TW.przeluz, 0), 0)) AS [IloscUzupelniajacaJm],
				   SUM(ABS(ISNULL(PW.ilosc*(#DPP.wartNetto/NULLIF ( #DPP.ilosc , 0 )),ROUND((#MZP.wartNetto/NULLIF(#MZP.ilosc,0))*pw.ilosc,2)))) as [WartoscFaktury],
                   MAX(TW.id) AS [idtw]
            INTO #ISTP
            FROM HM.IT
                INNER JOIN HM.MZ
                    ON IT.idmg = MZ.id
				INNER JOIN hm.MG
					ON MG.id=mz.super 
				INNER JOIN hm.PW
					ON pw.iddkmg=mg.id AND pw.idmg=mz.id  AND it.iddw=pw.iddw
                INNER JOIN #MZP
                    ON MZ.super = #MZP.super
                       AND MZ.lp = #MZP.lp
                INNER JOIN HM.TW
                    ON MZ.idtw = TW.id
                LEFT OUTER JOIN #DPP
                    ON #MZP.iddokkoryg = #DPP.super
                       AND #MZP.lp = #DPP.lp
                LEFT OUTER JOIN HM.TX
                    ON TX.id = TW.idlongname
            WHERE IT.idKrajuWy <> 1 
			GROUP BY ISNULL(SUBSTRING(TX.opis, 1, 255), TW.nazwa),
                     IT.idKrajuPo,
                     IT.idKrajuWy,
                     IT.transakcja,
                     TW.pcn,
                     IT.idKrajuPo;
            IF @komasuj <> 1
            BEGIN
                SELECT COUNT(*) AS [LacznaLiczbaPozycji],
                       SUM(ROUND(WartoscFaktury, 0)) AS [LacznaWartoscFaktur]
                FROM #ISTP
                HAVING SUM(WartoscFaktury) <> 0;
                SELECT *
                FROM #ISTP;
            END;
            ELSE
            BEGIN
                SELECT KrajPochodzenia,
                       KrajPrzeznaczeniaWysylki,
                       RodzajTransakcji,
                       KodTowarowy,
                       SUM(MasaNetto) AS [MasaNetto],
                       SUM(IloscUzupelniajacaJm) AS [IloscUzupelniajacaJm],
                       SUM(WartoscFaktury) AS [WartoscFaktury],
                       COUNT(*) AS [ilepoz],
                       MAX(idtw) AS [idtw],
                       MAX(PrzelicznikIT) AS [PrzelicznikIT]
                INTO #ISTPKOM
                FROM #ISTP
                GROUP BY KrajPochodzenia,
                         KrajPrzeznaczeniaWysylki,
                         RodzajTransakcji,
                         KodTowarowy,
                         KrajPochodzenia;
                SELECT COUNT(*) AS [LacznaLiczbaPozycji],
                       SUM(ROUND(WartoscFaktury, 0)) AS [LacznaWartoscFaktur]
                FROM #ISTPKOM
                HAVING SUM(WartoscFaktury) <> 0;
                SELECT KrajPochodzenia,
                       KodTowarowy,
                       KrajPrzeznaczeniaWysylki,
                       RodzajTransakcji,
                       MasaNetto,
                       IloscUzupelniajacaJm,
                       WartoscFaktury,
                       CASE
                           WHEN (ilepoz > 1) THEN
                               'pcn'
                           ELSE
                               'tw'
                       END AS [JakiOpis],
                       ISNULL(SUBSTRING(TX.opis, 1, 255), TW.nazwa) AS [OpisTowaru],
                       PrzelicznikIT
                FROM #ISTPKOM
                    INNER JOIN HM.TW
                        ON idtw = TW.id
                    LEFT OUTER JOIN HM.TX
                        ON TX.id = TW.idlongname;
            END;
        END;
    END;
END;
GO
IF OBJECT_ID('[HM].[hm_IT_NaliczPoz]', 'P') IS NOT NULL DROP PROCEDURE [HM].[hm_IT_NaliczPoz]
GO
CREATE PROCEDURE HM.hm_IT_NaliczPoz
    @transakcja SMALLINT,
    @dostawa VARCHAR(3),
    @transport SMALLINT,
    @id INT,
    @kraj INT,
    @ueKraju SMALLINT,
    @krajPolska SMALLINT
AS
DECLARE @return_status INT;
DECLARE @ue BIT;
DECLARE @przychod SMALLINT;
DECLARE @iddokkoryg INT;
SELECT @ue = CASE
                 WHEN
                 (
                     @ueKraju = 1
                     AND @krajPolska = 0
                 ) THEN
                     1
                 ELSE
                     0
             END;
SET @iddokkoryg = 0;
SELECT @przychod = CASE
                       WHEN (MG.flag & 0x0100) <> 0 THEN
                           1
                       ELSE
                           0
                   END,
       @iddokkoryg = ISNULL(MG.iddokkoryg, 0)
FROM MG
WHERE MG.id = @id;
IF @ue = 0
BEGIN
    EXEC @return_status = hm_IT_DeletePoz @id, 1;
    RETURN @return_status;
END;
DELETE FROM IT
WHERE id IN
      (
          SELECT IT.id
          FROM IT
              JOIN MZ
                  ON IT.idmg = MZ.id
              JOIN TW
                  ON TW.id = MZ.idtw
          WHERE (MZ.flag & 0x1000) <> 0
                OR TW.subtypext = 4
      ); -- pomijamy kompletopodobne i usługi marża na IST
DECLARE @tblITM TABLE
(
    idmg INT,
    lp SMALLINT,
    wartosc DECIMAL(24, 2),
    ilosc DECIMAL(24, 2),
    data DATETIME,
    idkoryg INT,
    idkrajuPoch INT,
    iddw INT
);
/*W deklaracji Intrastat jeśli jest wywóz towarów z rodzajem transakcji 11 i kodem transportu FOB 
wartość statystyczna powinna być wartością z faktury*/
DECLARE @iddk INT;
SELECT @iddk=dk.id FROM hm.mg
LEFT JOIN hm.tr ON tr.owner_id=mg.id AND owner_base=33
LEFT JOIN hm.PO ON tr.id=po.id2
LEFT JOIN hm.tr trdk ON po.id1=trdk.id AND trdk.owner_base=16
LEFT JOIN hm.dk ON dk.id=trdk.owner_id 
WHERE mg.id=@id;
IF (OBJECT_ID('tempdb..[#wartStatFromDP]') IS NOT NULL) DROP TABLE #wartStatFromDP	
IF  (@iddk IS NOT NULL AND @transakcja=11 AND @dostawa='FOB' AND @przychod<>1 )
BEGIN
	
	SELECT dp.id AS dpid ,mz.id AS mzid, dp.wartNetto, dw.id AS dwid
	INTO #wartStatFromDP
	FROM hm.MZ
	LEFT JOIN hm.op AS opmz ON opmz.owner_id=mz.id AND opmz.owner_base=37
	LEFT JOIN hm.ro AS ro ON ro.id2=opmz.id
	LEFT JOIN hm.op AS opdk ON opdk.id=ro.id1 AND opdk.owner_base=18
	LEFT JOIN hm.dp AS dp ON dp.id=opdk.owner_id
	LEFT JOIN hm.pw AS pw ON pw.iddkmg=mz.super and pw.idmg=mz.id AND pw.typ=37
	LEFT JOIN hm.dw AS dw ON pw.iddw=dw.id
	WHERE mz.super=@id
	INSERT @tblITM
	SELECT MZ.id, MZ.lp, 
	ROUND(temp.wartNetto/mz.ilosc*pw.ilosc,2) AS wartstat, ISNULL(CASE WHEN @przychod=1 THEN PW.ilosc *-1 ELSE PW.ilosc END, CASE WHEN @przychod=1 THEN (MZ.ilosc+ISNULL(MZK.ilosc, 0.0))*-1.0 ELSE MZ.ilosc+ISNULL(MZK.ilosc, 0.0)END),
	MZ.data, MZ.idpozkoryg, DW.krajPochodzenia, DW.id
FROM HM.MG
     JOIN HM.MZ ON MZ.super=MG.id AND MZ.kompensata=0
     LEFT JOIN HM.MZ AS MZK ON MZK.super=MG.id AND MZK.kompensata=1 AND MZ.lp=MZK.lp
     LEFT JOIN HM.TW AS TW ON TW.id=MZ.idtw
     LEFT JOIN HM.PW AS PW ON PW.idmg=MZ.id AND PW.iddkmg=MG.id AND PW.ilosc<>0
     LEFT JOIN HM.DW AS DW ON DW.id=PW.iddw
	 LEFT JOIN #wartStatFromDP AS temp ON temp.mzid=mz.id AND temp.dwid=DW.id
WHERE MG.id=@id AND(MZ.flag & 0x1000)=0 AND TW.subtypext<>4; -- pomijamy kompletopodobne i usługi marża na IST
END
ELSE
BEGIN
INSERT @tblITM
SELECT MZ.id,
       MZ.lp,
       ISNULL(   CASE
                     WHEN @przychod = 1 THEN
                         ROUND(   CASE
                                      WHEN @przychod = 1 THEN
                                  (MZ.przychod + ISNULL(MZK.przychod, 0.0)) * -1.0
                                      ELSE
                                          MZ.rozchod + ISNULL(MZK.rozchod, 0.0)
                                  END / NULLIF(CASE
                                                   WHEN @przychod = 1 THEN
                                  (MZ.ilosc + ISNULL(MZK.ilosc, 0.0)) * -1.0
                                                   ELSE
                                                       MZ.ilosc + ISNULL(MZK.ilosc, 0.0)
                                               END, 0) * PW.ilosc,
                                  2
                              ) * -1
                     ELSE
                         ROUND(   CASE
                                      WHEN @przychod = 1 THEN
                                  (MZ.przychod + ISNULL(MZK.przychod, 0.0)) * -1.0
                                      ELSE
                                          MZ.rozchod + ISNULL(MZK.rozchod, 0.0)
                                  END / CASE
                                            WHEN @przychod = 1 THEN
                                  (MZ.ilosc + ISNULL(MZK.ilosc, 0.0)) * -1.0
                                            ELSE
                                                MZ.ilosc + ISNULL(MZK.ilosc, 0.0)
                                        END * PW.ilosc,
                                  2
                              )
                 END,
                 CASE
                     WHEN @przychod = 1 THEN
                 (MZ.przychod + ISNULL(MZK.przychod, 0.0)) * -1.0
                     ELSE
                         MZ.rozchod + ISNULL(MZK.rozchod, 0.0)
                 END
             ) AS wartstat,
       ISNULL(   CASE
                     WHEN @przychod = 1 THEN
                         PW.ilosc * -1
                     ELSE
                         PW.ilosc
                 END,
                 CASE
                     WHEN @przychod = 1 THEN
                 (MZ.ilosc + ISNULL(MZK.ilosc, 0.0)) * -1.0
                     ELSE
                         MZ.ilosc + ISNULL(MZK.ilosc, 0.0)
                 END
             ),
       MZ.data,
       MZ.idpozkoryg,
       DW.krajPochodzenia,
       DW.id
FROM HM.MG
    JOIN HM.MZ
        ON MZ.super = MG.id
           AND MZ.kompensata = 0
    LEFT JOIN HM.MZ AS MZK
        ON MZK.super = MG.id
           AND MZK.kompensata = 1
           AND MZ.lp = MZK.lp
    LEFT JOIN HM.TW AS TW
        ON TW.id = MZ.idtw
    LEFT JOIN HM.PW AS PW
        ON PW.idmg = MZ.id
           AND PW.iddkmg = MG.id
           AND PW.ilosc <> 0
    LEFT JOIN HM.DW AS DW
        ON DW.id = PW.iddw
WHERE MG.id = @id
      AND (MZ.flag & 0x1000) = 0
      AND TW.subtypext <> 4; -- pomijamy kompletopodobne i usługi marża na IST
END
DECLARE @tblITpoz TABLE
(
    id INT,
    lp SMALLINT,
    data DATETIME,
    transakcja SMALLINT
);
IF @iddokkoryg <> 0
BEGIN
    SELECT TOP 1
           @dostawa = CASE
                          WHEN (dostawa <> @dostawa) THEN
                              dostawa
                          ELSE
                              @dostawa
                      END,
           @transport = CASE
                            WHEN (transport <> @transport) THEN
                                transport
                            ELSE
                                @transport
                        END
    FROM IT
        JOIN MZ
            ON IT.idmg = MZ.id
    WHERE MZ.super = @iddokkoryg;
    INSERT @tblITpoz
    (
        id,
        lp
    )
    SELECT DISTINCT
           MZ.id,
           MZ.lp
    FROM MZ
    WHERE MZ.superkoryg = @iddokkoryg
          AND MZ.super = MZ.superkoryg
    ORDER BY lp ASC;
    SET @return_status = @@error;
    IF @return_status <> 0
        RETURN @return_status;
    UPDATE @tblITpoz
    SET data = MZ.data,
        transakcja = IT.transakcja
    FROM @tblITpoz AS IP
        JOIN MZ
            ON IP.id = MZ.id
        JOIN IT
            ON IT.idmg = MZ.id;
    SET @return_status = @@error;
    IF @return_status <> 0
        RETURN @return_status;
END;
SELECT TOP 1
       @dostawa = CASE
                      WHEN (dostawa <> @dostawa) THEN
                          dostawa
                      ELSE
                          @dostawa
                  END,
       @transport = CASE
                        WHEN (transport <> @transport) THEN
                            transport
                        ELSE
                            @transport
                    END
FROM IT
    JOIN MZ
        ON IT.idmg = MZ.id
WHERE MZ.super = @id;
IF @iddokkoryg <> 0
BEGIN
   
    INSERT HM.IT
    (
        idmg,
        idKrajuWy,
        idKrajuPo,
        transakcja,
        dostawa,
        transport,
        wartStat,
        iddw
    )
    SELECT ITM.idmg,
           @kraj,
           ITM.idkrajuPoch,
           CASE
               WHEN (IP.transakcja IN ( '11', '12', '13', '15' ))
                    AND (ITM.ilosc <= -0.000001) THEN
                   '21'
               ELSE
                   CASE
                       WHEN ITK.transakcja IS NULL THEN
                           @transakcja
                       ELSE
                           ITK.transakcja
                   END
           END,
           @dostawa,
           @transport,
           ITM.wartosc,
           ITM.iddw
    FROM @tblITM AS ITM
        LEFT JOIN HM.IT
            ON ITM.idmg = IT.idmg
        LEFT JOIN IT AS ITK
            ON ITK.idmg = ITM.idkoryg
               AND ITM.iddw = ITK.iddw
        LEFT JOIN @tblITpoz AS IP
            ON IP.lp = ITM.lp
    WHERE IT.id IS NULL;
    SET @return_status = @@error;
    IF @return_status <> 0
        RETURN @return_status;
END;
ELSE
BEGIN
 
    INSERT HM.IT
    (
        idmg,
        idKrajuWy,
        idKrajuPo,
        transakcja,
        dostawa,
        transport,
        wartStat,
        iddw
    )
    SELECT ITM.idmg,
           @kraj,
           ITM.idkrajuPoch,
           @transakcja,
           @dostawa,
           @transport,
           ITM.wartosc,
           ITM.iddw
    FROM @tblITM AS ITM
        LEFT JOIN IT
            ON ITM.idmg = IT.idmg
        LEFT JOIN IT AS ITK
            ON ITK.idmg = ITM.idkoryg
    WHERE IT.id IS NULL;
    SET @return_status = @@error;
    IF @return_status <> 0
        RETURN @return_status;
END;
GO
IF OBJECT_ID('[HM].[IntrastatCardIndexView]','V') IS NOT NULL DROP VIEW [HM].[IntrastatCardIndexView];
GO
CREATE VIEW [HM].[IntrastatCardIndexView] 
AS 
Select Distinct 
	it.id as Id,
	mg.id as IdMg,
	mg.kod as DocNumber,
	mg.datasp as PeriodDate,
	tw.nazwa as Name,	
	tw.kod as Kod,
	tw.pcn as KodCN,
	ISNULL(step.Title, ' ') as CountryP,
	ISNULL(stew.Title, ' ') as CountryW,
	Cast(IT.transakcja as Int) as KindTrans,
	Case When mg.subtyp in (76,85,84,76,78)					Then 'wywóz'
		 When mg.subtyp in (77,88, 75,81) And pw.ilosc >= 0 Then 'wywóz'
		 When mg.subtyp in (77,88, 75,81) And pw.ilosc <  0	Then 'przywóz'
		 When mg.subtyp in (74,83,82,75,89,81)				Then 'przywóz' End as KindIntrastat,
	ABS(pw.ilosc) as CountTW,
	Case When mg.iddokkoryg Is Not Null And ABS(pw.ilosc) = 0 And mg.subtyp in (74,83,82,74,75,89,81) Then FORMAT(mg2.data,'yyyy-MM') Else FORMAT(mg.data,'yyyy-MM') End DateToIntrastat,
	Round(ABS(pw.ilosc)*ISNULL(NULLIF(tw.przelkg,0),0),2) as WeightNetto,
	ISNULL(Round(ABS(ISNULL(pw.ilosc*(dp.wartNetto/NULLIF(dp.ilosc,0)), ROUND(((mz.iloscwp * mz.cena + mz.wartk)/NULLIF(mz.ilosc,0))*pw.ilosc,2))),2),0) as ValueInvoice,
	tw.jmuzup as JmComplete,
	Round(ABS(pw.ilosc) * ISNULL(NULLIF(tw.przeluz,0),0),2) as QuantityCompleteJm
from hm.it
Left Join hm.mz on mz.id = it.idmg
Left Join hm.dw on dw.id = it.iddw
Left Join hm.mg on mg.id = mz.super
Left Join hm.mg as mg2 on mg.iddokkoryg = mg2.id 
Left Join hm.tw on tw.id = mz.idtw
Left Join hm.pw on pw.iddkmg = mg.id and pw.idmg = mz.id and pw.iddw = it.iddw and pw.typ = 37
Left Join SSCommon.STElements as step on step.ElementId = it.idKrajuPo
Left Join SSCommon.STElements as stew on stew.ElementId = it.idKrajuWy
Left Join hm.op OpMz on OpMz.owner_id = mz.id
Left Join hm.ro		 on ro.id1 = OpMz.owner_id 
Left Join hm.op OpDp on OpDp.id = ro.id1 
Left Join hm.dp		 on dp.id = Opdp.owner_id 
INNER JOIN HM.AppUserWarehouses as ur on ur.WarehouseId = mg.magazyn
INNER JOIN HM.DocumentTypePermission as dtp on dtp.DocumentTypeId = mg.subtyp and dtp.UserId=ur.UserId
Where stew.Shortcut <>'PL' 
GO
IF OBJECT_ID('[HM].[hm_DW_PowiazaniaDostawRezerwacji]', 'P') IS NOT NULL DROP PROCEDURE [HM].[hm_DW_PowiazaniaDostawRezerwacji]
GO
CREATE PROCEDURE HM.hm_DW_PowiazaniaDostawRezerwacji
@rez int
AS
declare @tblPWR TABLE
  (id int primary key not NULL)
insert @tblPWR
select PW.id from PW with (NOLOCK, index (IDX_PW_IDMG_TYP_IDDW)) where PW.typ = 26 and PW.idmg = @rez
declare @tblZZ2 TABLE
  (id1 int primary key, id2 int, ilosc float)
insert @tblZZ2
select ZZ.id1, min(ZZ.id2) as id2, sum(ZZ.ilosc) as ilosc
from ZZ with (NOLOCK, index(IDX_ZZ_TYP_ID2)) where ZZ.typ = 96 and ZZ.baza1 = 36 and ZZ.id1 in (select id from @tblPWR)
group by ZZ.id1
declare @tblZZ1 TABLE
  (id1 int, id2 int primary key, ilosc float)
insert @tblZZ1
select min(ZZ.id1) as id1, ZZ.id2, sum(ZZ.ilosc) + sum(PW.ilosc) as ilosc
from ZZ WITH (NOLOCK, INDEX(IDX_ZZ_TYP_ID2)) join PW on ZZ.id1 = PW.id where PW.typ = 26 and ZZ.typ = 96 and ZZ.baza2 = 36 and ZZ.id2 in (select id from @tblPWR)
group by ZZ.id2
select PW.id, PW.flag, PW.typ, PW.iddkmg, PW.idmg, PW.iddw, PW.idtw, PW.ilosc, PW.wartosc, PW.data, PW.idkoryg,
       DW.id, DW.kod, DW.numer, DW.idtw, DW.data, DW.ilosc, DW.iloscdosp, DW.wartoscdosp,
   	   ISNULL(ZZ2.ilosc, 0.0), ISNULL(ZZ2.id2, 0), ISNULL(ZZ1.ilosc, 0.0), ISNULL(ZZ1.id1, 0), DW.krajPochodzenia
from PW WITH (NOLOCK) join @tblPWR as PWR on PW.id = PWR.id
join DW on DW.id = PW.iddw
left join @tblZZ2 as ZZ2 on ZZ2.id1 = PW.id
left join @tblZZ1 as ZZ1 on ZZ1.id2 = PW.id
GO
IF EXISTS (SELECT count(*) FROM [HM].[INIFILE] WHERE plik = 'FIRMA.HM' AND sekcja = 'Intrastat')
BEGIN
	IF EXISTS (SELECT * FROM [HM].[INIFILE] WHERE plik = 'FIRMA.HM' AND sekcja = 'Intrastat' AND klucz IN (8, 9, 10))
	BEGIN
		INSERT INTO [HM].[INIFILE] VALUES (
					'FIRMA.HM',
					'Intrastat', 
					12, 
					(SELECT napis FROM HM.INIFILE WHERE plik = 'FIRMA.HM' AND sekcja = 'Intrastat' AND klucz = 8))
		INSERT INTO [HM].[INIFILE] VALUES (
					'FIRMA.HM',
					'Intrastat', 
					13, 
					(SELECT napis FROM HM.INIFILE WHERE plik = 'FIRMA.HM' AND sekcja = 'Intrastat' AND klucz = 9))
		INSERT INTO [HM].[INIFILE] VALUES (
					'FIRMA.HM',
					'Intrastat', 
					14, 
					(SELECT napis FROM HM.INIFILE WHERE plik = 'FIRMA.HM' AND sekcja = 'Intrastat' AND klucz = 10))
	END
END
GO
IF OBJECT_ID('[HM].[dbo_WarehouseDeliveriesView]','V') IS NOT NULL DROP VIEW [hm].[dbo_WarehouseDeliveriesView]
GO
CREATE VIEW [HM].[dbo_WarehouseDeliveriesView]
AS
SELECT	 d.[id]				AS Id
		,d.[kod]			AS Name
		,d.[krajPochodzenia] AS CountryOfOriginId
		,d.[data]			AS Date
		,d.[idtw]			AS ProductId
		,d.[magazyn]		AS InventoryId
		,CAST(IIF(d.[typ] = 0, 1, 0) AS BIT)	-- dostawa wyczerpana
							AS IsExhausted
		,CAST(IIF(d.[bufor]	> 0, 0, 1) AS BIT)	-- dostawa z dokumentu wystawionego
							AS IsIssued
		,CAST(d.[cena] AS DECIMAL(24,6))			
							AS Price
		,CAST(d.[stan] AS DECIMAL(24,4))		-- stan - ilość
							AS StockQuantity
		,CAST(d.[wartoscst] AS DECIMAL(24,2))	-- stan wartość
							AS StockValue
		,CAST(d.[iloscdosp] AS DECIMAL(24,4))		-- ilość dostępna (stan - ilość zarezerwowana)
							AS AvailableQuantity
		,CAST(d.[wartoscdosp] AS DECIMAL(24,2))		-- wartość dostępna
							AS AvailableValue
		,CAST(IIF(d.[numer] < 0, 1, 0) AS BIT)		-- rekord rezerwacji ilościowej
							AS IsQuantityReservation
		,ISNULL(guid,NEWID()) AS guid
FROM [HM].[DW] d
GO
IF OBJECT_ID('[HM].[SaveDocumentToBuffer]', 'P') IS NOT NULL DROP PROCEDURE [HM].[SaveDocumentToBuffer]
GO
CREATE PROCEDURE [HM].[SaveDocumentToBuffer]
(
    @documentBaseType INT,
    @id_doc INT,
    @documentData AS XML,
    @documentDataIn AS XML,
    @documentType AS BIT, -- 1 rozchodowy (fvs, wz, zo) -- 0 przychód (zw,pz,zakup)
	@currentUser AS INT,
	@crc VARBINARY(200),
    @documentid INT OUT
)
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT ON;
    BEGIN TRY
        BEGIN TRANSACTION;
        DECLARE @ErMessage NVARCHAR(2048),
                @ErSeverity INT,
                @ErState INT;
        /* Sage.PL.HandelBusinessLayer.Enums.DocumentBaseTypeEnum 
		Sale = 0,
        Purchase = 1,
        Store = 2,
        Payment = 3,
        ForeignOrder = 4,
        OwnOrder = 5
		*/
        --Deklaracje zmiennych potrzebnych do zapisu dokumentu
        DECLARE @id_dok INT,
                @id_tran INT;
        DECLARE @isOk BIT;
        DECLARE @docGuid UNIQUEIDENTIFIER;
        CREATE TABLE [#tblDTOSaleHeader]
        (
            [Id] INT,
            [BaseType] INT,
            [DepartmentId] INT,
            [DocumentTypeId] INT,
            [DocumentNuerationId] INT,
            [KindId] INT,
            [CatalogId] INT,
            [Tag] INT,
            [DocumentNumber] NVARCHAR(100),
            [DefaultSellingPriceTypeId] INT,
            [IsGross] BIT,
            [CurrencyRate] DECIMAL(24, 8),
            [IssueDate] DATE,
            [SaleDate] DATE,
            [InRegisterDate] DATE,
            [Deadline] DATE,
            [ContractorId] INT,
            [PaymentRegisterId] INT,
            [PaymentFormId] INT,
            [ContractorCode] NVARCHAR(200),
            [DepartmentCode] NVARCHAR(100),
            [DocumentNumerationCode] NVARCHAR(100),
            [DocumentNumerationId] INT,
            [DocumentTypeCode] NVARCHAR(100),
            [PaymentRegisterCode] NVARCHAR(100),
            [ReceivedBy] NVARCHAR(40),
            [ReceiverId] INT,
            [PaymentFormName] NVARCHAR(100),
            [PaymentFormDate] INT,
            [IsDeliveryDataFromContractor] BIT,
            [ReceiverCode] NVARCHAR(200),
            [TableId] INT,
            [SellingPriceTypeId] INT,
            [AmountToPay] DECIMAL(24, 2),
            [IsIssued] BIT,
            [DocumentStatus] INT,
            [ValueNet] DECIMAL(24, 2),
            [ValueVat] DECIMAL(24, 2),
            [ValueNetInCurrency] DECIMAL(24, 2),
            [ValueGrossInCurrency] DECIMAL(24, 2),
            [IsCanceled] BIT,
            [CalculateVatMethod] SMALLINT,
            [FromFiscalReceipt] BIT,
		    [SplitPayment] BIT,
            [JpkV7] varchar(256),
            [IsSettled] BIT,
            [AccountingPattern] NVARCHAR(100),
            [ReservationType] INT,
			[PublishInventoryDocumentMode] SMALLINT,
            [Description] NVARCHAR(80),
            [Guid] UNIQUEIDENTIFIER
        );
        CREATE TABLE [#tblDTOSalePositions]
        (
            [Id] INT,
            [ProductId] INT,
            [ProductCode] NVARCHAR(200),
            [ProductDescription] NVARCHAR(200),
            [ProductName] NVARCHAR(200),
            [UnitOfMeasurement] NVARCHAR(20),
            [Quantity] DECIMAL(24, 4),
            [EvidenceUnitOfMeasurement] NVARCHAR(20),
            [EvidenceQuantity] DECIMAL(24, 4),
            [PriceTypeId] INT,
            [PriceListPriceInCurrency] DECIMAL(24, 4),
            [Price] DECIMAL(24, 4),
            [DiscountPercent] DECIMAL(24, 4),
            [DiscountAmountInCurrency] DECIMAL(24, 4),
            [ValueGross] DECIMAL(24, 2),
            [ValueVat] DECIMAL(24, 2),
            [ValueNet] DECIMAL(24, 2),
            [VatRateId] INT,
            [OrdinalNumber] INT,
            [VatRegister] INT,
            [ReverseCharge] BIT,
            [AccountingPattern] NVARCHAR(100),
			[ReservationType] SMALLINT,
            [PKWiU] NVARCHAR(200),
            [Guid] UNIQUEIDENTIFIER,
			[JPK_V7] NVARCHAR(10)
        );
        CREATE TABLE [#tblDTOSaleContractorAddressData]
        (
            [Name] NVARCHAR(400),
            [Street] NVARCHAR(400),
            [HouseNumber] VARCHAR(300),
            [FlatNumber] NVARCHAR(100),
            [NIP] VARCHAR(100),
            [PostalCode] VARCHAR(100),
            [City] VARCHAR(100),
            [CountrySymbol] NVARCHAR(100),
            [AddressName] NVARCHAR(200)
        );
        CREATE TABLE [#tblDTOSaleReceiverAddressData]
        (
            [Name] NVARCHAR(400),
            [Street] NVARCHAR(400),
            [HouseNumber] VARCHAR(300),
            [FlatNumber] NVARCHAR(100),
            [NIP] VARCHAR(100),
            [PostalCode] VARCHAR(100),
            [City] VARCHAR(100),
            [CountrySymbol] NVARCHAR(100),
            [AddressName] NVARCHAR(200)
        );
        CREATE TABLE [#tblDTOForeignOrderHeader]
        (
            [Id] INT,
            [BaseType] INT,
            [DepartmentId] INT,
            [DocumentTypeId] INT,
            [DocumentNuerationId] INT,
            [KindId] INT,
            [CatalogId] INT,
            [Tag] INT,
            [DocumentNumber] NVARCHAR(100),
            [DefaultSellingPriceTypeId] INT,
            [IsGross] BIT,
            [Currency] NVARCHAR(3),
            [CurrencyRate] DECIMAL(24, 8),
            [IssueDate] DATE,
            [SaleDate] DATE,
            [Deadline] DATE,
            [ContractorId] INT,
            [PaymentRegisterId] INT,
            [PaymentFormId] INT,
            [ContractorCode] NVARCHAR(200),
            [DepartmentCode] NVARCHAR(100),
            [DocumentNumerationCode] NVARCHAR(100),
            [DocumentNumerationId] INT,
            [DocumentTypeCode] NVARCHAR(100),
            [PaymentRegisterCode] NVARCHAR(100),
            [ReceivedBy] NVARCHAR(40),
            [ReceiverId] INT,
            [PaymentFormName] NVARCHAR(100),
            [PaymentFormDate] INT,
            [IsDeliveryDataFromContractor] BIT,
            [ReceiverCode] NVARCHAR(200),
            [TableId] INT,
            [SellingPriceTypeId] INT,
            [AmountToPay] DECIMAL(24, 2),
            [IsIssued] BIT,
            [DocumentStatus] INT,
            [ValueNet] DECIMAL(24, 2),
            [ValueVat] DECIMAL(24, 2),
            [ValueNetInCurrency] DECIMAL(24, 2),
            [ValueGrossInCurrency] DECIMAL(24, 2),
            [IsCanceled] BIT,
            [CalculateVatMethod] SMALLINT,
            [FromFiscalReceipt] BIT,
            [IsSettled] BIT,
            [AccountingPattern] NVARCHAR(100),
            [ReservationType] INT,
            [Description] NVARCHAR(80),
            [Guid] UNIQUEIDENTIFIER,
		    [SplitPayment] BIT
        );
        CREATE TABLE [#tblDTOForeignOrderPositions]
        (
            [Id] INT,
            [ProductId] INT,
            [ProductCode] NVARCHAR(200),
            [ProductDescription] NVARCHAR(200),
            [ProductName] NVARCHAR(200),
            [UnitOfMeasurement] NVARCHAR(20),
            [Quantity] DECIMAL(24, 4),
            [EvidenceUnitOfMeasurement] NVARCHAR(20),
            [EvidenceQuantity] DECIMAL(24, 4),
            [PriceTypeId] INT,
            [PriceListPriceInCurrency] DECIMAL(24, 4),
            [Price] DECIMAL(24, 4),
            [DiscountPercent] DECIMAL(24, 4),
            [DiscountAmountInCurrency] DECIMAL(24, 4),
            [ValueGross] DECIMAL(24, 2),
            [ValueVat] DECIMAL(24, 2),
            [ValueNet] DECIMAL(24, 2),
            [VatRateId] INT,
            [OrdinalNumber] INT,
            [ReverseCharge] BIT,
			[ReservationType] SMALLINT,
            [Guid] UNIQUEIDENTIFIER
        );
        CREATE TABLE [#tblDTOForeignOrderContractorAddressData]
        (
            [Name] NVARCHAR(400),
            [Street] NVARCHAR(400),
            [HouseNumber] VARCHAR(300),
            [FlatNumber] NVARCHAR(100),
            [NIP] VARCHAR(100),
            [PostalCode] VARCHAR(100),
            [City] VARCHAR(100),
            [CountrySymbol] NVARCHAR(100),
            [AddressName] NVARCHAR(200)
        );
        CREATE TABLE [#tblDTOForeignOrderReceiverAddressData]
        (
            [Name] NVARCHAR(400),
            [Street] NVARCHAR(400),
            [HouseNumber] VARCHAR(300),
            [FlatNumber] NVARCHAR(100),
            [NIP] VARCHAR(100),
            [PostalCode] VARCHAR(100),
            [City] VARCHAR(100),
            [CountrySymbol] NVARCHAR(100),
            [AddressName] NVARCHAR(200)
        );
        CREATE TABLE [#tblDTOInventoryDocumentHeader]
        (
            [Id] INT,
            [BaseType] INT,
            --, [DepartmentId] int
            [DocumentTypeId] INT,
            [DocumentNuerationId] INT,
            [KindId] INT,
            [CatalogId] INT,
            [Tag] INT,
            [DocumentNumber] NVARCHAR(100),
            [DefaultSellingPriceTypeId] INT,
            [IsGross] BIT,
            [CurrencyRate] DECIMAL(24, 8),
            [IssueDate] DATE,
            [OperationDate] DATE,
            [Deadline] DATE,
            [ContractorId] INT,
            [ContractorCode] NVARCHAR(200),
            [InventoryCode] NVARCHAR(100),
            [InventoryId] INT,
            [DocumentNumerationCode] NVARCHAR(100),
            [DocumentNumerationId] INT,
            [DocumentTypeCode] NVARCHAR(100),
            [ReceivedBy] NVARCHAR(40),
            [IsDeliveryDataFromContractor] BIT,
            [TableId] INT,
            [IsIssued] BIT,
            [DocumentStatus] INT,
            [AccountingPattern] NVARCHAR(100),
            [ReservationType] INT,
            [Description] NVARCHAR(80),
            [Guid] UNIQUEIDENTIFIER
        );
        CREATE TABLE [#tblDTOInventoryDocumentPositions]
        (
            [id] INT,
            OrdinalNumber INT,
            ProductId INT,
            ProductCode NVARCHAR(200),
            ProductDescription NVARCHAR(400),
            ProductName NVARCHAR(400),
            UnitOfMeasurement NVARCHAR(24),
            EvidenceUnitOfMeasurement NVARCHAR(24),
            Price DECIMAL(24, 6),
            Quantity DECIMAL(24, 4),
            EvidenceQuantity DECIMAL(24, 4),
            ValueNet DECIMAL(38, 6),
            DeliveryName VARCHAR(100),
            ReservationType SMALLINT,
            AccountingPattern VARCHAR(20),
            SettlementMethod SMALLINT,
            [Guid] UNIQUEIDENTIFIER
        );
        CREATE TABLE [#tblDTOInventoryContractorAddressData]
        (
            [Name] NVARCHAR(400),
            [Street] NVARCHAR(400),
            [HouseNumber] VARCHAR(300),
            [FlatNumber] NVARCHAR(100),
            [NIP] VARCHAR(100),
            [PostalCode] VARCHAR(100),
            [City] VARCHAR(100),
            [CountrySymbol] NVARCHAR(100),
            [AddressName] NVARCHAR(200)
        );
        CREATE TABLE [#InventoryPositionSettlementDTO]
        (
            ID INT,
            WarehouseDeliveryId INT,
            InventoryPositionId INT,
            OperationDate DATE,
            Quantity DECIMAL(24, 8),
            Value DECIMAL(24, 8),
            OriginalQuantity DECIMAL(24, 8),
            OriginalValue DECIMAL(24, 8),
            WarehouseDeliveryIId INT,
            WarehouseDeliveryName NVARCHAR(200),
			WarehouseDeliveryCountryOfOriginId INT,
            WarehouseDeliveryDate DATE,
            WarehouseDeliveryIsExhausted BIT,
            WarehouseDeliveryIsIssued BIT,
            WarehouseDeliveryPrice DECIMAL(24, 4),
            WarehouseDeliveryStockQuantity DECIMAL(24, 4),
            WarehouseDeliveryStockValue DECIMAL(24, 4),
            WarehouseDeliveryAvailableQuantity DECIMAL(24, 4),
            WarehouseDeliveryAvailableValue DECIMAL(24, 4),
            WarehouseDeliveryIsQuantitativeReservation BIT,
            WarehouseDeliveryInventoryId INT,
            InventoryPositionGuid UNIQUEIDENTIFIER,
            ProductId INT,
            WarehouseDeliveryGuid UNIQUEIDENTIFIER
        );
        --sprawdzamy jakiego typu jest dokument
        -- Na razie skupimy się na sprzedaży ;)
        IF (ISNULL(@id_doc, 0) = 0) -- nowy dokument
        BEGIN
            IF (@documentBaseType = 0) -- dokumenty sprzedaży
            BEGIN
                --Krok 1 - rozkodowujemy xml do tabel tymczasowych
                BEGIN TRY
                    EXEC HM.SaveSaleDocumentXMLToTempTables @DocumentData = @documentData; -- xml
                END TRY
                BEGIN CATCH
                    THROW;
                --RAISERROR('Błąd przy próbie rozkodowania XML', 16, 1);
                END CATCH;
                BEGIN
                    -- sprawdzamy nie obsługiwane przypadki
                    EXEC HM.CheckSaleDocumentConditions @isOk = @isOk OUTPUT; -- bit
                    IF @isOk = 0
                        SET @id_dok = 0;
                    ELSE
                    BEGIN
                        BEGIN TRY
                            EXEC HM.SaveSaleDocumentHeader @currentUser=@currentUser, @id_dok = @id_dok OUTPUT,   -- int
                                                           @id_tran = @id_tran OUTPUT; -- int
                        END TRY
                        BEGIN CATCH
                            THROW; --RAISERROR('Błąd przy próbie zapisu nagłówka', 16, 1);
                        END CATCH;
                        BEGIN TRY
                            EXEC HM.SaveSaleDocumentPositions @id_dok, @id_tran;
                        END TRY
                        BEGIN CATCH
                            THROW; --RAISERROR('Błąd przy próbie zapisu pozycji', 16, 1);
                        END CATCH;
                        BEGIN TRY
                            EXEC HM.RecalculateSaleDocument @id_dok = @id_dok, @id_tran = @id_tran; -- int
                        END TRY
                        BEGIN CATCH
                            THROW; --RAISERROR('Błąd przy próbie przeliczania dokumentu', 16, 1);
                        END CATCH;
                        BEGIN TRY
                            EXECUTE HM.SerializedSaleDocumentAdditionalFieldsSave @documentData,
                                                                                  @id_dok;
                        END TRY
                        BEGIN CATCH
                            THROW; --RAISERROR('Błąd przy próbie zapisu pól dodatkowych nagłowka dokumentu', 16, 1);
                        END CATCH;
                        BEGIN TRY
                            EXECUTE HM.SerializedSaleDocumentSalePositionAdditionalFieldsSave @documentData,
                                                                                              @id_dok;
                        END TRY
                        BEGIN CATCH
                            THROW; --RAISERROR('Błąd przy próbie zapisu pól dodatkowych pozycji dokumentu', 16, 1);
                        END CATCH;
                    END;
                END;
                SET @documentid = @id_dok;
                SELECT @docGuid = [Guid]
                FROM #tblDTOSaleHeader;
            END;
            IF (@documentBaseType = 2) -- dokumenty magazynowe /*Release to WZ - receive to POZ
            BEGIN
                BEGIN TRY
                    EXEC HM.SaveInventoryDocumentXMLToTempTables @DocumentData = @documentData; -- xml
                END TRY
                BEGIN CATCH
                    THROW;
                END CATCH;
                BEGIN
                    EXEC HM.CheckInventoryDocumentConditions @isOk = @isOk OUTPUT; -- bit
                    IF @isOk = 0
                        SET @id_dok = 0;
                    ELSE
                    BEGIN
                        IF (@documentType = 1)
                        BEGIN
                            BEGIN TRY
                                EXEC HM.SaveInventoryDocumentHeader @currentUser=@currentUser, @id_dok = @id_dok OUTPUT,   -- int
                                                                    @id_tran = @id_tran OUTPUT; -- int
                            END TRY
                            BEGIN CATCH
                                THROW; --RAISERROR('Błąd przy próbie zapisu nagłówka', 16, 1);
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.SaveInventoryDocumentPositions @id_dok = @id_dok,   -- int
                                                                       @id_tran = @id_tran; -- int
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.[RecalculateInventoryDocument] @id_dok, @id_tran;
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.SerializedInventoryDocumentAdditionalFieldsSave @documentData,
                                                                                        @id_dok;
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.SerializedInventoryDocumentPositionAdditionalFieldsSave @documentData,
                                                                                                @id_dok;
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                        END;
                        IF (@documentType = 0)
                        BEGIN
                            BEGIN TRY
                                EXEC HM.SaveInventoryReceiveDocumentHeader @currentUser=@currentUser, @id_dok = @id_dok OUTPUT,   -- int
                                                                           @id_tran = @id_tran OUTPUT; -- int
                            END TRY
                            BEGIN CATCH
                                THROW; --RAISERROR('Błąd przy próbie zapisu nagłówka', 16, 1);
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.SaveInventoryReceiveDocumentPositions @id_dok = @id_dok,   -- int
                                                                              @id_tran = @id_tran; -- int
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.[RecalculateInventoryReceiveDocument] @id_dok, @id_tran;
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.SerializedInventoryDocumentAdditionalFieldsSave @documentData,
                                                                                        @id_dok;
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.SerializedInventoryDocumentPositionAdditionalFieldsSave @documentData,
                                                                                                @id_dok;
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.SaveSuppliesXMLToTempTables @DocumentData = @documentData; -- xml
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.SaveSuppliesForDocument @id_dok = @id_dok; -- int
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.[SerializedInventoryDeliveryDocumentPositionAdditionalFieldsSave] @documentData,
                                                                                                          @id_dok;
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                        END;
                    END;
                END;
                SET @documentid = @id_dok;
                SELECT @docGuid = [Guid]
                FROM #tblDTOInventoryDocumentHeader;
            END;
            IF (@documentBaseType = 4)
            BEGIN
                BEGIN TRY
                    EXEC HM.SaveForeignOrderXMLToTempTables @DocumentData = @documentData;
                END TRY
                BEGIN CATCH
                    --SELECT @ErMessage = N'Błąd przy próbie rozkodowania xml zamówienia obcego :' + ERROR_MESSAGE(),
                    --       @ErSeverity = ERROR_SEVERITY(),
                    --       @ErState = ERROR_STATE();
                    --RAISERROR(@ErMessage, @ErSeverity, @ErState);
                    THROW;
                END CATCH;
                BEGIN
                    EXEC HM.CheckForeignOrderDocumentConditions @isOk = @isOk OUTPUT;
                    IF @isOk = 0
                        SET @id_dok = 0;
                    ELSE
                    BEGIN
                        BEGIN TRY
                            EXEC HM.SaveForeignOrderDocumentHeader @currentUser=@currentUser, @id_dok = @id_dok OUTPUT,   -- int
                                                                   @id_tran = @id_tran OUTPUT; -- int
                        END TRY
                        BEGIN CATCH
                            --SELECT @ErMessage = N'Błąd przy próbie zapisania nagłówka zamówienia :' + ERROR_MESSAGE(),
                            --       @ErSeverity = ERROR_SEVERITY(),
                            --       @ErState = ERROR_STATE();
                            --RAISERROR(@ErMessage, @ErSeverity, @ErState);
                            THROW;
                        END CATCH;
                        BEGIN TRY
                            EXECUTE HM.SaveForeignOrderDocumentPositions @id_dok, @id_tran;
                        END TRY
                        BEGIN CATCH
                            --SELECT @ErMessage = N'Błąd przy próbie zapisania pozycji zamówienia :' + ERROR_MESSAGE(),
                            --       @ErSeverity = ERROR_SEVERITY(),
                            --       @ErState = ERROR_STATE();
                            --RAISERROR(@ErMessage, @ErSeverity, @ErState);
                            THROW;
                        END CATCH;
                        BEGIN TRY
                            EXEC [HM].[RecalculateForeignOrderDocument] @id_dok, @id_tran;
                        END TRY
                        BEGIN CATCH
                            THROW;
                        END CATCH;
                        BEGIN TRY
                            EXEC [HM].[SerializedForeignOrderDocumentAdditionalFieldsSave] @documentData,
                                                                                           @id_dok;
                        END TRY
                        BEGIN CATCH
                            THROW;
                        END CATCH;
                        BEGIN TRY
                            EXEC [HM].[SerializedForeignOrderDocumentSalePositionAdditionalFieldsSave] @documentData,
                                                                                                       @id_dok;
                        END TRY
                        BEGIN CATCH
                            THROW;
                        END CATCH;
                    END;
                END;
                SET @documentid = @id_dok;
                SELECT @docGuid = [Guid]
                FROM #tblDTOForeignOrderHeader;
            END;
            --jak wszystko się udało to spróbujemy zapisać do historii operacji xml 
            INSERT INTO HM.XmlHistory
            (
                documentBaseType,
                id_doc,
                documentData,
			 documentDataIn,
                documentType,
                id_doc_out,
                Operation_description,
			 Crc
            )
            VALUES
            (   @documentBaseType, -- documentBaseType - int
                @id_doc,           -- id_doc - int
                @documentData,     -- documentData - xml
			 @documentDataIn,
                @documentType,     -- documentType - bit
                @documentid, 'Nowy dokument',@crc);
        END;
        ELSE
        -- jak jest id to update
        BEGIN
            IF (@documentBaseType = 0) -- dokumenty sprzedaży
            BEGIN
                BEGIN TRY
                    EXEC HM.SaveSaleDocumentXMLToTempTables @DocumentData = @documentData; -- xml
                END TRY
                BEGIN CATCH
                    --RAISERROR('Bład przy próbie  rozkodowania XML ', 16, 1);
                    THROW;
                END CATCH;
                BEGIN
                    -- sprawdzamy nie obsługiwane przypadki
                    EXEC HM.CheckSaleDocumentConditions @isOk = @isOk OUTPUT; -- bit
                    IF @isOk = 0
                        SET @id_doc = 0;
                    ELSE
                    BEGIN
                        BEGIN TRY
                            EXEC HM.UpdateSaleDocumentHeader @currentUser,@id_doc;
                        END TRY
                        BEGIN CATCH
                            SELECT @ErMessage = N'Błąd przy próbie aktualizacji danych nagłówka :' + ERROR_MESSAGE(),
                                   @ErSeverity = ERROR_SEVERITY(),
                                   @ErState = ERROR_STATE();
                            RAISERROR(@ErMessage, @ErSeverity, @ErState);
                        --THROW;
                        END CATCH;
                        BEGIN TRY
                            EXEC HM.UpdateSaleDocumentPositions @id_doc;
                        END TRY
                        BEGIN CATCH
                            --RAISERROR('Błąd przy próbie aktualizacji danych pozycji',16,1);
                            THROW;
                        END CATCH;
                        BEGIN TRY
                            SELECT @id_tran = id
                            FROM HM.TR
                            WHERE owner_id = @id_doc
                                  AND owner_base = 16 AND typ = 1;
                            EXEC HM.[RecalculateUpdatedSaleDocument] @id_doc, @id_tran;
                        END TRY
                        BEGIN CATCH
                            THROW;
                        END CATCH;
                        BEGIN TRY
                            EXECUTE HM.SerializedSaleDocumentAdditionalFieldsSave @documentData,
                                                                                  @id_doc;
                        END TRY
                        BEGIN CATCH
                            THROW; --RAISERROR('Błąd przy próbie zapisu pól dodatkowych nagłowka dokumentu', 16, 1);
                        END CATCH;
                        BEGIN TRY
                            EXECUTE HM.SerializedSaleDocumentSalePositionAdditionalFieldsSave @documentData,
                                                                                              @id_doc;
                        END TRY
                        BEGIN CATCH
                            THROW; --RAISERROR('Błąd przy próbie zapisu pól dodatkowych pozycji dokumentu', 16, 1);
                        END CATCH;
                    END;
                END;
                SET @documentid = @id_doc;
                SELECT @docGuid = [Guid]
                FROM #tblDTOSaleHeader;
            END;
            IF (@documentBaseType = 2)
            BEGIN
                BEGIN TRY
                    EXEC HM.SaveInventoryDocumentXMLToTempTables @DocumentData = @documentData; -- xml
                END TRY
                BEGIN CATCH
                   -- RAISERROR('Bład przy próbie  rozkodowania XML ', 16, 1);
                    THROW;
                END CATCH;
                BEGIN
                    EXEC HM.CheckInventoryDocumentConditions @isOk = @isOk OUTPUT;
                    IF @isOk = 0
                        SET @id_doc = 0;
                    ELSE
                    BEGIN
                        IF (@documentType = 1) --przychod
                        BEGIN
                            BEGIN TRY
                                EXEC HM.[UpdateInventoryReleaseDocumentHeader] @currentUser, @id_doc;
                            END TRY
                            BEGIN CATCH
                                RAISERROR('err', 16, 1);
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.UpdateInventoryReleaseDocumentPositions @id_doc;
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            SELECT @id_tran = id
                            FROM HM.TR
                            WHERE owner_id = @id_doc
                                  AND owner_base = 33 AND typ = 1;
                            --EXEC HM.RecalculateUpdatedInventoryReceiveDocument @id_doc, @id_tran;
                            EXEC HM.RecalculateUpdatedInventoryReleaseDocument @id_doc, @id_tran;
                            BEGIN TRY
                                EXEC HM.SerializedInventoryDocumentAdditionalFieldsSave @documentData,
                                                                                        @id_doc;
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.SerializedInventoryDocumentPositionAdditionalFieldsSave @documentData,
                                                                                                @id_doc;
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                        END;
                        IF (@documentType = 0) --rozchod 
                        BEGIN
                            BEGIN TRY
                                EXEC HM.[UpdateInventoryReceiveDocumentHeader] @currentUser,@id_doc;
                            END TRY
                            BEGIN CATCH
                                RAISERROR('err', 16, 1);
                            END CATCH;
                            EXEC HM.[UpdateInventoryReceiveDocumentPositions] @id_doc;
                            SELECT @id_tran = id
                            FROM HM.TR
                            WHERE owner_id = @id_doc
                                  AND owner_base = 33 AND typ = 1;
                            --EXEC HM.RecalculateUpdatedInventoryReleaseDocument @id_doc, @id_tran;
                            EXEC HM.RecalculateUpdatedInventoryReceiveDocument @id_doc, @id_tran;
                            BEGIN TRY
                                EXEC HM.SerializedInventoryDocumentAdditionalFieldsSave @documentData,
                                                                                        @id_doc;
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.SerializedInventoryDocumentPositionAdditionalFieldsSave @documentData,
                                                                                                @id_doc;
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.SaveSuppliesXMLToTempTables @DocumentData = @documentData; -- xml
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.UpadateSuppliesForDocument @id_doc = @id_doc; -- int
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            BEGIN TRY
                                EXEC HM.[SerializedInventoryDeliveryDocumentPositionAdditionalFieldsSave] @documentData,
                                                                                                          @id_doc;
                            END TRY
                            BEGIN CATCH
                                THROW;
                            END CATCH;
                            --SET @id_doc = 0;
                        END;
                    END;
                END;
                SET @documentid = @id_doc;
                SELECT @docGuid = [Guid]
                FROM #tblDTOInventoryDocumentHeader;
            END;
            IF (@documentBaseType = 4)
            BEGIN
                BEGIN TRY
                    EXEC HM.SaveForeignOrderXMLToTempTables @DocumentData = @documentData; -- xml
                END TRY
                BEGIN CATCH
                    THROW;
                END CATCH;
                BEGIN
                    EXEC HM.CheckForeignOrderDocumentConditions @isOk = @isOk OUTPUT;
                    IF @isOk = 0
                        SET @id_doc = 0;
                    ELSE
                    BEGIN
                        BEGIN TRY
                            EXEC HM.[UpdateForeignOrderDocumentHeader] @currentUser,@id_doc;
                        END TRY
                        BEGIN CATCH
                            THROW;
                        END CATCH;
                        BEGIN TRY
                            EXEC HM.[UpdateForeignOrderDocumentPositions] @id_doc;
                        END TRY
                        BEGIN CATCH
                            THROW;
                        END CATCH;
						SELECT @id_tran = id
                        FROM HM.TR
                        WHERE owner_id = @id_doc
                                AND owner_base = 45 AND typ = 0;
                        BEGIN TRY
                            EXEC HM.RecalculateUpdatedForeignOrderDocument @id_doc, @id_tran;
                        END TRY
                        BEGIN CATCH
                            THROW;
                        END CATCH;
                        BEGIN TRY
                            EXECUTE HM.[SerializedForeignOrderDocumentAdditionalFieldsSave] @documentData,
                                                                                            @id_doc;
                        END TRY
                        BEGIN CATCH
                            THROW;
                        END CATCH;
                        BEGIN TRY
                            EXECUTE HM.[SerializedForeignOrderDocumentSalePositionAdditionalFieldsSave] @documentData,
                                                                                                        @id_doc;
                        END TRY
                        BEGIN CATCH
                            THROW;
                        END CATCH;
                    END;
                END;
                SET @documentid = @id_doc;
                SELECT @docGuid = [Guid]
                FROM #tblDTOForeignOrderHeader;
            END;
            --jak wszystko się udało to spróbujemy zapisać do historii operacji xml 
            INSERT INTO HM.XmlHistory
            (
                documentBaseType,
                id_doc,
                documentData,
			 documentDataIn,
                documentType,
                id_doc_out,
                Operation_description,
			 Crc
            )
            VALUES
            (   @documentBaseType, -- documentBaseType - int
                @id_doc,           -- id_doc - int
                @documentData,     -- documentData - xml
			 @documentDataIn,
                @documentType,     -- documentType - bit
                @documentid, 'Edycja dokumentu',@crc);
        END;
        -- Ustawiamy status dokumentu w rezerwacjach na "zapisany"
        IF (@documentid <> 0 AND @documentType = 1)
        BEGIN
            EXEC [HM].[hm_UpdateReservationStatus] @docGuid, 1;
        END;
        --czyścimy śmieci 
        IF (OBJECT_ID('tempdb..[#tblDTOSaleHeader]') IS NOT NULL)
            DROP TABLE #tblDTOSaleHeader;
        IF (OBJECT_ID('tempdb..#tblDTOSalePositions') IS NOT NULL)
            DROP TABLE #tblDTOSalePositions;
        IF (OBJECT_ID('tempdb..#tblDTOSaleContractorAddressData') IS NOT NULL)
            DROP TABLE #tblDTOSaleContractorAddressData;
        IF (OBJECT_ID('tempdb..#tblDTOSaleReceiverAddressData') IS NOT NULL)
            DROP TABLE #tblDTOSaleReceiverAddressData;
        IF (OBJECT_ID('tempdb..#temp_positions') IS NOT NULL)
            DROP TABLE #temp_positions;
        IF (OBJECT_ID('tempdb..[#tblDTOForeignOrderHeader]') IS NOT NULL)
            DROP TABLE #tblDTOForeignOrderHeader;
        IF (OBJECT_ID('tempdb..#tblDTOForeignOrderPositions') IS NOT NULL)
            DROP TABLE #tblDTOForeignOrderPositions;
        IF (OBJECT_ID('tempdb..#tblDTOForeignOrderContractorAddressData') IS NOT NULL)
            DROP TABLE #tblDTOForeignOrderContractorAddressData;
        IF (OBJECT_ID('tempdb..#tblDTOForeignOrderReceiverAddressData') IS NOT NULL)
            DROP TABLE #tblDTOForeignOrderReceiverAddressData;
        IF (OBJECT_ID('tempdb..#temp_positions') IS NOT NULL)
            DROP TABLE #temp_positions;
        IF (OBJECT_ID('tempdb..#tblDTOInventoryDocumentHeader') IS NOT NULL)
            DROP TABLE [#tblDTOInventoryDocumentHeader];
        IF (OBJECT_ID('tempdb..#tblDTOInventoryDocumentPositions') IS NOT NULL)
            DROP TABLE [#tblDTOInventoryDocumentPositions];
        IF (OBJECT_ID('tempdb..#tblDTOInventoryContractorAddressData') IS NOT NULL)
            DROP TABLE [#tblDTOInventoryContractorAddressData];
        IF (OBJECT_ID('tempdb..[#InventoryPositionSettlementDTO]') IS NOT NULL)
            DROP TABLE #InventoryPositionSettlementDTO;
        --rozgłaszamy wszem i wobec że udało nam się czego nie zepsuć i dodaliśmy dokument ;)
        IF (@documentid <> 0)
        BEGIN
            INSERT INTO HM.LOG_BASE
            (
                baseName,
                rec_id,
                operation,
                term
            )
            VALUES
            (   'DK',    -- baseName - varchar(19)
                @id_dok, -- rec_id - int
                3,       -- operation - smallint
                @@spid   -- term - int
                );
        END;
        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
        BEGIN
            ROLLBACK TRANSACTION;
            --jak się nie udało to spróbujemy zapisać do historii operacji xml 
            INSERT INTO HM.XmlHistory
            (
                documentBaseType,
                id_doc,
                documentData,
			 documentDataIn,
                documentType,
                id_doc_out,
                Operation_description,
			 Crc
            )
            VALUES
            (   @documentBaseType, -- documentBaseType - int
                @id_doc,           -- id_doc - int
                @documentData,     -- documentData - xml
			 @documentDataIn,
                @documentType,     -- documentType - bit
                @documentid, 'ERROR',@crc);
            THROW;
        END;
    END CATCH;
END;
GO
IF OBJECT_ID('[HM].[SaveSuppliesXMLToTempTables]', 'P') IS NOT NULL DROP PROCEDURE [HM].[SaveSuppliesXMLToTempTables]
GO
CREATE PROCEDURE hm.SaveSuppliesXMLToTempTables
(@DocumentData AS XML)
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT ON;
    DECLARE @handle INT,
            @PrepareXmlStatus INT;
    --rozbieramy xml do tabel
    EXEC @PrepareXmlStatus = sp_xml_preparedocument @handle OUTPUT,
                                                    @DocumentData;
    INSERT INTO #InventoryPositionSettlementDTO
    SELECT ID,
           WarehouseDeliveryId,
           InventoryPositionId,
           CAST(OperationDate AS DATE) AS OperationDate,
           Quantity,
           Value,
           OriginalQuantity,
           OriginalValue,
           WarehouseDeliveryIId,
           WarehouseDeliveryName,
		   WarehouseDeliveryCountryOfOriginId,
           CAST(WarehouseDeliveryDate AS DATE) AS WarehouseDeliveryDate,
           WarehouseDeliveryIsExhausted,
           WarehouseDeliveryIsIssued,
           WarehouseDeliveryPrice,
           WarehouseDeliveryStockQuantity,
           WarehouseDeliveryStockValue,
           WarehouseDeliveryAvailableQuantity,
           WarehouseDeliveryAvailableValue,
           WarehouseDeliveryIsQuantitativeReservation,
           WarehouseDeliveryInventoryId,
           InventoryPositionGuid,
           ProductId,
           WarehouseDeliveryGuid
    FROM
        OPENXML(@handle,
                '/InventoryDocumentDTO/Positions/InventoryPositionDTO/InventoryPositionSettlements/InventoryPositionSettlementDTO'
               )
        WITH
        (
            ID INT 'Id',
            WarehouseDeliveryId INT 'WarehouseDeliveryId',
            InventoryPositionId INT 'InventoryPositionId',
            OperationDate DATETIMEOFFSET 'OperationDate',
            Quantity DECIMAL(24, 8) 'Quantity',
            Value DECIMAL(24, 8) 'Value',
            OriginalQuantity DECIMAL(24, 8) 'OriginalQuantity',
            OriginalValue DECIMAL(24, 8) 'OriginalValue',
            WarehouseDeliveryIId INT 'WarehouseDelivery/Id',
            WarehouseDeliveryName NVARCHAR(200) 'WarehouseDelivery/Name',
			WarehouseDeliveryCountryOfOriginId INT 'WarehouseDelivery/CountryOfOriginId',
            WarehouseDeliveryDate DATETIMEOFFSET 'WarehouseDelivery/Date',
            WarehouseDeliveryIsExhausted BIT 'WarehouseDelivery/IsExhausted',
            WarehouseDeliveryIsIssued BIT 'WarehouseDelivery/IsIssued',
            WarehouseDeliveryPrice DECIMAL(24, 4) 'WarehouseDelivery/Price',
            WarehouseDeliveryStockQuantity DECIMAL(24, 4) 'WarehouseDelivery/StockQuantity',
            WarehouseDeliveryStockValue DECIMAL(24, 4) 'WarehouseDelivery/StockValue',
            WarehouseDeliveryAvailableQuantity DECIMAL(24, 4) 'WarehouseDelivery/AvailableQuantity',
            WarehouseDeliveryAvailableValue DECIMAL(24, 4) 'WarehouseDelivery/AvailableValue',
            WarehouseDeliveryIsQuantitativeReservation BIT 'WarehouseDelivery/IsQuantitativeReservation',
            WarehouseDeliveryInventoryId INT 'WarehouseDelivery/InventoryId',
            InventoryPositionGuid UNIQUEIDENTIFIER '../../Guid',
            ProductId INT '../../ProductId',
            WarehouseDeliveryGuid UNIQUEIDENTIFIER 'WarehouseDelivery/Guid'
        );
    EXEC sp_xml_removedocument @handle;
END;
GO
IF OBJECT_ID('[HM].[UpadateSuppliesForDocument]', 'P') IS NOT NULL DROP PROCEDURE [HM].[UpadateSuppliesForDocument]
GO
CREATE PROCEDURE [HM].[UpadateSuppliesForDocument]
(@id_doc INT)
AS
BEGIN
    DECLARE @numerDW INT;
    SELECT @numerDW = ISNULL(MAX(numer), 0) + 1 
    FROM HM.DW;
 
MERGE INTO HM.DW AS target
USING
(
    SELECT dost.id,
           mag.khid,
           temp.WarehouseDeliveryId,
           temp.InventoryPositionId,
           temp.OperationDate,
           temp.Quantity,
           temp.Value,
           temp.OriginalQuantity,
           temp.OriginalValue,
           temp.WarehouseDeliveryIId,
           temp.WarehouseDeliveryName,
		   temp.WarehouseDeliveryCountryOfOriginId,
           temp.WarehouseDeliveryDate,
           temp.WarehouseDeliveryIsExhausted,
           temp.WarehouseDeliveryIsIssued,
           temp.WarehouseDeliveryPrice,
           temp.WarehouseDeliveryStockQuantity,
           temp.WarehouseDeliveryStockValue,
           temp.WarehouseDeliveryAvailableQuantity,
           temp.WarehouseDeliveryAvailableValue,
           temp.WarehouseDeliveryIsQuantitativeReservation,
           temp.WarehouseDeliveryInventoryId,
           temp.ProductId,
           temp.WarehouseDeliveryGuid
    FROM #InventoryPositionSettlementDTO temp
        LEFT JOIN HM.DW dost
            ON dost.id = temp.WarehouseDeliveryIId
        LEFT JOIN HM.MG mag
            ON mag.id = @id_doc
) AS source
ON target.id = source.id
   AND target.iddkpz = @id_doc
WHEN MATCHED THEN
    UPDATE SET target.ilosc = source.Quantity,
               target.cena = source.WarehouseDeliveryPrice,
               target.magazyn = source.WarehouseDeliveryInventoryId,
               target.idtw = source.ProductId,
			   target.kod = source.WarehouseDeliveryName,
			   target.data = source.WarehouseDeliveryDate,
			   target.krajPochodzenia = source.WarehouseDeliveryCountryOfOriginId
WHEN NOT MATCHED BY TARGET THEN
    INSERT
    (
        flag,
        subtyp,
        typ,
        kod,
        iddw,
        iddkpz,
        idkh,
        iddkzk,
        numer,
        idtw,
        data,
        ilosc,
        iloscdosp,
        cena,
        wartoscdosp,
        magazyn,
        iloscPz,
        stan,
        wartoscst,
        bufor,
		krajPochodzenia,
        Guid
    )
    VALUES
    (0, 0, 0, source.WarehouseDeliveryName, NULL, @id_doc, source.khid, NULL, @numerDW,
     source.ProductId, CONVERT(DATE, source.WarehouseDeliveryDate), source.Quantity, 0, source.WarehouseDeliveryPrice, 0,
     source.WarehouseDeliveryInventoryId, 0, 0, 0, 1,source.WarehouseDeliveryCountryOfOriginId, source.WarehouseDeliveryGuid);
--WHEN NOT MATCHED BY SOURCE AND target.iddkpz = @id_doc THEN
--    DELETE;
WITH cte AS 
(
SELECT poz.id,poz.iddkpz,numer,hm.GetNextNumberInSupplies(poz.idtw)+ROW_NUMBER() OVER (PARTITION BY poz.idtw ORDER BY poz.guid) AS numer_nowy FROM hm.dw poz WHERE poz.iddkpz=@id_doc
)
UPDATE cte
SET numer=cte.numer_nowy
WHERE cte.iddkpz=@id_doc
--teraz sobie posprzątamy w powiązaniach z DW
DECLARE @flag SMALLINT = 0;
SET @flag = @flag + 0x08 + 0x10 + 0x04;
MERGE INTO HM.PW AS target
USING
(
    SELECT mag.subtyp AS docsubtyp,
           dost.id AS iddwnew,
           poz.id AS idpoz,
           pow.id,
           pow.flag,
           pow.subtyp,
           pow.typ,
           pow.iddkmg,
           pow.idmg,
           pow.iddw,
           pow.idtw,
           pow.ilosc,
           pow.wartosc,
           pow.ilosczreal,
           pow.idkoryg,
           pow.data,
           temp.WarehouseDeliveryId,
           temp.InventoryPositionId,
           temp.OperationDate,
           temp.Quantity,
           temp.Value,
           temp.OriginalQuantity,
           temp.OriginalValue,
           temp.WarehouseDeliveryIId,
           temp.WarehouseDeliveryName,
		   temp.WarehouseDeliveryCountryOfOriginId,
           temp.WarehouseDeliveryDate,
           temp.WarehouseDeliveryIsExhausted,
           temp.WarehouseDeliveryIsIssued,
           temp.WarehouseDeliveryPrice,
           temp.WarehouseDeliveryStockQuantity,
           temp.WarehouseDeliveryStockValue,
           temp.WarehouseDeliveryAvailableQuantity,
           temp.WarehouseDeliveryAvailableValue,
           temp.WarehouseDeliveryIsQuantitativeReservation,
           temp.WarehouseDeliveryInventoryId,
           temp.InventoryPositionGuid,
           temp.ProductId,
           temp.WarehouseDeliveryGuid
    FROM #InventoryPositionSettlementDTO temp
        LEFT JOIN HM.PW pow
            ON pow.iddw = temp.WarehouseDeliveryIId
        LEFT JOIN HM.MG mag
            ON mag.id = @id_doc
        LEFT JOIN HM.MZ poz
            ON poz.guid = temp.InventoryPositionGuid
               AND poz.super = @id_doc
        LEFT JOIN HM.DW dost
            ON dost.Guid = temp.WarehouseDeliveryGuid
) AS source
ON target.id = source.id
WHEN MATCHED THEN
    UPDATE SET target.subtyp = source.docsubtyp,
               target.idtw = source.ProductId,
               target.ilosc = source.Quantity * -1,
               target.wartosc = source.Value * -1
WHEN NOT MATCHED BY TARGET THEN
    INSERT
    (
        flag,
        subtyp,
        typ,
        iddkmg,
        idmg,
        iddw,
        idtw,
        ilosc,
        wartosc,
        ilosczreal,
        idkoryg,
        data
    )
    VALUES
    (@flag, source.docsubtyp, 39, @id_doc, source.idpoz, source.iddwnew, source.ProductId,
     source.Quantity * -1, source.Value * -1, 0.0, NULL, CONVERT(DATE, source.WarehouseDeliveryDate))
	 ;
	  
	 -- DELETE FROM hm.dw WHERE id NOT IN (SELECT WarehouseDeliveryIId FROM #InventoryPositionSettlementDTO) AND iddkpz=@id_doc
	 DELETE FROM hm.pw WHERE idmg NOT IN (SELECT id FROM hm.mz WHERE super=@id_doc) AND iddkmg=@id_doc;
	DELETE FROM hm.dw WHERE iddkpz=@id_doc AND guid NOT IN (SELECT WarehouseDeliveryGuid FROM #InventoryPositionSettlementDTO);
END;
GO
CREATE PROCEDURE [HM].[ChangeOriginCountryDW]
@CoutryId INT,
@List varchar(MAX)
AS
BEGIN
	UPDATE DW SET krajPochodzenia = @CoutryId
	FROM [HM].[fn_string_na_tabele] (@List) DWID
	INNER JOIN HM.DW ON DWID.item = DW.id
	UPDATE IT SET idKrajuPo = @CoutryId
	FROM [HM].[fn_string_na_tabele] (@List) DWID
	INNER JOIN HM.IT ON IT.iddw = DWID.item
END
GO
IF OBJECT_ID('[HM].[SaveSuppliesForDocument]', 'P') IS NOT NULL DROP PROCEDURE [HM].[SaveSuppliesForDocument]
GO
CREATE PROCEDURE [HM].[SaveSuppliesForDocument]
(@id_dok INT)
AS
BEGIN
    INSERT INTO HM.DW
    (
        flag,
        subtyp,
        typ,
        kod,
        iddw,
        iddkpz,
        idkh,
        iddkzk,
        numer,
        idtw,
        data,
        ilosc,
        iloscdosp,
        cena,
        wartoscdosp,
        magazyn,
        iloscPz,
        stan,
        wartoscst,
        bufor,
		guid,
        krajPochodzenia
    )
    SELECT 0 AS flag,
           0 AS subtyp,
           0 AS typ,
           WarehouseDeliveryName AS kod,
           NULL AS iddw,
           @id_dok AS iddkpz,
           mag.khid AS idkh,
           NULL AS iddkzk,
           hm.GetNextNumberInSupplies(poz.idtw)+ROW_NUMBER() OVER (PARTITION BY poz.idtw ORDER BY poz.id) AS numer,
           ProductId AS idtw,
           CONVERT(DATE, WarehouseDeliveryDate) AS data,
           Quantity AS ilosc,
           0 AS iloscdosp,
           WarehouseDeliveryPrice AS cena,
           0 AS wartoscdosp,
           WarehouseDeliveryInventoryId AS magazyn,
           0 AS iloscPz,
           0 AS stan,
           0 AS wartoscst,
           1 AS bufor,
		   WarehouseDeliveryGuid AS guid,
           settlementDTO.WarehouseDeliveryCountryOfOriginId
    FROM #InventoryPositionSettlementDTO settlementDTO
        LEFT JOIN HM.MG mag
            ON mag.id = @id_dok
        LEFT JOIN HM.MZ poz
            ON poz.super = mag.id
               AND poz.guid = settlementDTO.InventoryPositionGuid;
    DECLARE @flag SMALLINT = 0;
    SET @flag = @flag + 0x08 + 0x10 + 0x04;
    INSERT INTO HM.PW
    (
        flag,
        subtyp,
        typ,
        iddkmg,
        idmg,
        iddw,
        idtw,
        ilosc,
        wartosc,
        ilosczreal,
        idkoryg,
        data
    )
    SELECT @flag AS flag,							-- flag - smallint
           dok.subtyp AS subtyp,					-- subtyp - smallint
           39 AS typ,								-- typ - smallint
           dok.id AS iddkmg,						-- iddkmg - int
           poz.id AS idmg,							-- idmg - int
           dost.id,									-- iddw - int
           poz.idtw,								-- idtw - int
           settlementDTO.Quantity * -1 AS ilosc,	-- ilosc - float
           settlementDTO.Value * -1 AS wartosc,		-- wartosc - float
           0.0,                     -- ilosczreal - float
           NULL,                    -- idkoryg - int
           CONVERT(DATE, WarehouseDeliveryDate) -- data - datetime
    FROM #InventoryPositionSettlementDTO settlementDTO
        JOIN HM.MG dok
            ON dok.id = @id_dok
        JOIN HM.MZ poz
            ON poz.super = dok.id
               AND poz.guid = settlementDTO.InventoryPositionGuid
		JOIN HM.DW dost
			ON dost.guid = settlementDTO.WarehouseDeliveryGuid;
END;
GO
IF EXISTS(SELECT * FROM sys.key_constraints where [name] like 'UC_IT_IDMG' and parent_object_id = OBJECT_ID(N'HM.IT'))
	ALTER TABLE [HM].[IT] DROP CONSTRAINT [UC_IT_IDMG]
GO 
-- Akutalizacja kraju dostaw 
UPDATE DW SET krajPochodzenia = COALESCE(DW.krajPochodzenia, IT.idKrajuPo)	
FROM HM.IT
INNER JOIN HM.MZ MZ ON MZ.id = IT.idmg
INNER JOIN HM.PW PW ON PW.idmg = MZ.id AND PW.ilosc <= 0
INNER JOIN HM.DW DW ON DW.id = PW.iddw
GO
UPDATE DW SET krajPochodzenia = COALESCE(DW.krajPochodzenia, KS.ElementId)	
FROM HM.DW
INNER JOIN SSCommon.STContractors KH ON KH.Id = DW.idkh
INNER JOIN SSCommon.STPostOfficeAddresses AD ON KH.ContactGuid = AD.ContactGuid AND AddressName = 'adres domyślny'
INNER JOIN SSCommon.STElements KS ON KS.Shortcut = AD.Country
WHERE DW.idkh IS NOT NULL AND DW.krajPochodzenia IS NULL
GO
UPDATE DW SET krajPochodzenia = COALESCE(DW.krajPochodzenia, KS.ElementId)	
FROM HM.DW
INNER JOIN HM.DW DW2 ON DW2.id = DW.iddw AND DW2.idkh IS NOT NULL
INNER JOIN SSCommon.STContractors KH ON KH.Id = DW2.idkh
INNER JOIN SSCommon.STPostOfficeAddresses AD ON KH.ContactGuid = AD.ContactGuid AND AddressName = 'adres domyślny'
INNER JOIN SSCommon.STElements KS ON KS.Shortcut = AD.Country
WHERE DW.iddw IS NOT NULL AND DW.krajPochodzenia IS NULL
GO
UPDATE DW SET krajPochodzenia = COALESCE(DW.krajPochodzenia, DW2.krajPochodzenia)
FROM HM.DW DW
INNER JOIN HM.MG ON MG.id = DW.iddkpz
INNER JOIN HM.TR ON MG.id = TR.owner_id
INNER JOIN HM.PO ON PO.id1 = TR.id
INNER JOIN HM.TR TR2 ON PO.id2 = TR2.id
INNER JOIN HM.MG MG2 ON TR2.owner_id = MG2.id
INNER JOIN HM.PW ON PW.iddkmg = MG2.id
INNER JOIN HM.DW DW2 ON DW2.id = PW.iddw
WHERE DW.krajPochodzenia IS NULL
GO
UPDATE HM.IT SET it.iddw = dw.id 
FROM HM.IT
JOIN HM.MZ ON it.idmg = mz.id
JOIN HM.PW ON pw.idmg =mz.id And pw.typ = 37
JOIN HM.DW ON dw.id = pw.iddw 
GO
IF EXISTS (SELECT * FROM sys.objects WHERE [type] IN (N'P', N'PC') AND OBJECT_ID = OBJECT_ID(N'[Common].[UpdateContractorFromXML]'))
DROP PROCEDURE [Common].[UpdateContractorFromXML];
GO
-- Procedura umożliwiająca zapisanie danych kontrahenta z postaci XML
CREATE PROCEDURE [Common].[UpdateContractorFromXML] (@contractorData XML, @moduleCode nvarchar(255), @contextInfo varchar(128), @contextInfoP varchar(128))
AS
BEGIN
	SET NOCOUNT ON; -- Stops the message that shows the count of the number of rows affected by a Transact-SQL statement or stored procedure from being returned as part of the result set.
	SET XACT_ABORT ON; -- Specifies whether SQL Server automatically rolls back the current transaction when a Transact-SQL statement raises a run-time error.
	--Ustawienie CONTEXT_INFO z danymi potrzebnymi trigerom do zapisu historii zmian w tabelach z sufiksem 'Rep'
	declare @ContextInfoBinary as varbinary(128)
	SET @ContextInfoBinary = convert(varbinary(128), @contextInfo)
	SET CONTEXT_INFO @ContextInfoBinary;
	declare @ContextInfoBinaryP as varbinary(128)
	SET @ContextInfoBinaryP = convert(varbinary(128), @contextInfoP)
	BEGIN TRY
		BEGIN TRANSACTION;
		
		-- tabela tymczasowa na dane kontrahenta z xml
		CREATE TABLE [#tblContractor]
		(
			[Id] INT,
			[Guid] UNIQUEIDENTIFIER,
			[Name] NVARCHAR(150),
			[Shortcut] NVARCHAR(50),
			[Nip] NVARCHAR(20),
			[NipUE] NVARCHAR(20),
			[Pesel] NVARCHAR(15),
			[Regon] NVARCHAR(20),
			[LinkedUnit] BIT,
			[PersonKind] TINYINT,
			[VATPayerActive] BIT,
			[VIES] BIT,
				-- exAttribute
			[RequestMppTransfers] NVARCHAR(10), -- splitPayment
			[PaymentFormId] INT, -- formaPlatnosci
			[PayRegistryId] INT, -- rejestr
			[SaleKindId] INT, -- rodzajCeny
			[PriceTypeId] INT, -- typCeny
			[AccountantParameter] NVARCHAR(20), -- parametrFK
			[IdFk] INT, -- idFK
			[PositionFk] INT, -- pozycja FK
			-- additional data
			[CatalogId] NVARCHAR(100),
			[ContractorKindId] INT,
			[MarkerId] INT,
			[Status] BIT,
			-- sale conditions
			[IsLimitActive] BIT,
			[LimitCurrency] NVARCHAR(20),
			[LimitValue] FLOAT,
			[PriceNegotiation] BIT,
			-- main person
			[FirstName] NVARCHAR(50),
			[Surname] NVARCHAR(50)
		)
		-- tabela tymczasowa na dane kontaktowe kontrahenta z xml
		CREATE TABLE [#tblContact]
		(
			[Id] INT,
			[Guid] UNIQUEIDENTIFIER,
			[FirstName] NVARCHAR(50),
			[Surname] NVARCHAR(50),
			[Email] NVARCHAR(100),
			[Facebook] NVARCHAR(100),
			[Fax] NVARCHAR(50),
			[Telephone1] NVARCHAR(50),
			[Telephone2] NVARCHAR(50),
			[Telex] NVARCHAR(50),
			[Website] NVARCHAR(100)
		)
		-- tabela tymczasowa na dane adresu domyślnego kontrahenta z xml
		CREATE TABLE [#tblMainAddress]
		(
			[Id] INT,
			[Guid] UNIQUEIDENTIFIER,
			[Name] NVARCHAR(100),
			[Post] NVARCHAR(50),
			[PostalCode] NVARCHAR(10),
			[Place] NVARCHAR(50),
			[Street] NVARCHAR(50),
			[HouseNo] NVARCHAR(15),
			[ApartmentNo] NVARCHAR(15),
			[Province] NVARCHAR(50),
			[Country] NVARCHAR(50)
		)
		-- tabela tymczasowa na dane adresu korespondencyjnego kontrahenta z xml
		CREATE TABLE [#tblCorespondenceAddress]
		(
			[Id] INT,
			[Guid] UNIQUEIDENTIFIER,
			[Name] NVARCHAR(100),
			[Post] NVARCHAR(50),
			[PostalCode] NVARCHAR(10),
			[Place] NVARCHAR(50),
			[Street] NVARCHAR(50),
			[HouseNo] NVARCHAR(15),
			[ApartmentNo] NVARCHAR(15),
			[Province] NVARCHAR(50),
			[Country] NVARCHAR(50)
		)
		-- tabela tymczasowa na dane handlowe kontrahenta z xml
		CREATE TABLE [#tblTradeData]
		(
			[DiscountPercent] FLOAT,
			[Receivables] FLOAT,
			[Liabilities] FLOAT
		)
		-- tabela tymczasowa na pola z rachunkami bankowymi
		CREATE TABLE [#tblBankAccounts]
		(
			[Id] INT,
			[Guid] UNIQUEIDENTIFIER,
			[AccountNo] NVARCHAR(50),
			[AccountName] NVARCHAR(100),
			[IsDefault] BIT,
			[IsActive] BIT,
			[WhiteList] BIT,
			[WhiteListDate] DATETIME2,
			[SWIFT_BIC] VARCHAR(11),
			[BankName] NVARCHAR(100),
			-- extended attributes
			[IsElectronic] BIT,
			[IsVatAccount] BIT
		)
		-- tabela tymczasowa na pola z rachunkami bankowymi
		CREATE TABLE [#tblCustomFields]
		(
			[FieldName] NVARCHAR(100),
			[Value] NVARCHAR(MAX),
			[ColumnName] NVARCHAR(128),
			[Type] NVARCHAR(250)
		)
		
		-- tabela tymczasowa na ElementExAttributes
		CREATE TABLE [#ExtAttributes]
		(
			[ElementId] INT,
			[Name] NVARCHAR(50),
			[StringValue] NVARCHAR(1024),
			[OriginalCLRType] NVARCHAR(400),
			[ElementExAttrId] INT IDENTITY(1,1),
			[Guid] UNIQUEIDENTIFIER,
			[Title] NVARCHAR(200),
			[AccessFlag] BIT,
			[InheritedFlag] BIT
		)
		
		DECLARE @extAttElementId int
		DECLARE @extAttTitle nvarchar (200)
		DECLARE @extAttActive bit
		DECLARE @extAttAccountNo nvarchar (40)
		DECLARE @extAttDescription nvarchar (4000)
		DECLARE @extAttShortcut nvarchar (100)
		DECLARE @extAttPosition int
		DECLARE @extAttExtAttributes nvarchar(max)
		DECLARE @extAttExtObjVer int
		DECLARE @extAttExtWriteAction int
		DECLARE @extAttExtOtherThenOriginal smallint
		-- przygotowanie xml
		DECLARE @handle INT, @prepareXmlStatus INT
		EXEC @prepareXmlStatus = sp_xml_preparedocument @handle OUTPUT, @contractorData
		-- deserializacja danych kontaktowych z xml
		INSERT INTO [#tblContact]
		SELECT 
			ISNULL([Id], 0), CASE WHEN [Guid] IS NULL OR [Guid] = '' OR [Guid] = '00000000-0000-0000-0000-000000000000' THEN NEWID() ELSE [GUID] END,
			[FirstName], [SurName], [Email], [Facebook], [Fax], [Telephone1], [Telephone2], [Telex], [Website]
		FROM 
			OPENXML(@handle, '/Contractor/ContactPerson')
			WITH
			(
				[Id] INT 'Id',
				[Guid] NVARCHAR(36) 'Guid',
				[FirstName] NVARCHAR(50) 'FirstName',
				[Surname] NVARCHAR(50) 'SurName',
				[Email] NVARCHAR(100) 'Email',
				[Facebook] NVARCHAR(100) 'Facebook',
				[Fax] NVARCHAR(50) 'Fax',
				[Telephone1] NVARCHAR(50) 'Telephone1',
				[Telephone2] NVARCHAR(50) 'Telephone2',
				[Telex] NVARCHAR(50) 'Tlf',
				[Website] NVARCHAR(100) 'Website'
			)
		-- wyczyszczenie pustych elementów
		DELETE FROM [#tblContact]
		WHERE [FirstName] = '' AND [Surname] = '' AND [Email] = '' AND [Facebook] = '' AND [Fax] = '' AND [Telephone1] = '' AND [Telephone2] = '' AND [Telex] = '' AND [Website] = ''
			AND [Guid] = '00000000-0000-0000-0000-000000000000' --dla nowych kontaktów, dla istniejących chcemy wyczyścić pola w bazie
		--select * from #tblContact
		-- deserializacja danych adresu domyślnego z xml
		INSERT INTO [#tblMainAddress]
		SELECT 
			ISNULL([Id], 0),
			CASE WHEN [Guid] IS NULL OR [Guid] = '' THEN '00000000-0000-0000-0000-000000000000' ELSE [GUID] END,
			[Name], [Post], [PostalCode], [Place], [Street], [HouseNo], [ApartmentNo], [Province], [Country]
		FROM
			OPENXML(@handle, '/Contractor/MainAddress')
			WITH
			(
				[Id] INT 'Id',
				[Guid] NVARCHAR(36) 'Guid',
				[Name] NVARCHAR(100) 'Name',
				[Post] NVARCHAR(50) 'Post',
				[PostalCode] NVARCHAR(10) 'PostalCode',
				[Place] NVARCHAR(50) 'Place',
				[Street] NVARCHAR(50) 'Street',
				[HouseNo] NVARCHAR(15) 'HouseNo',
				[ApartmentNo] NVARCHAR(15) 'ApartmentNo',
				[Province] NVARCHAR(50) 'Province',
				[Country] NVARCHAR(50) 'Country'
			)
		-- wyczyszczenie pustych elementów
		DELETE FROM [#tblMainAddress]
		WHERE [Name] = '' AND [Post] = '' AND [PostalCode] = '' AND [Place] = '' AND [Street] = '' AND [HouseNo] = '' AND [ApartmentNo] = '' AND [Province] = '' AND [Country] = ''
		--select * from [#tblMainAddress]
		
		-- deserializacja danych adresu korespondencyjnego z xml
		INSERT INTO [#tblCorespondenceAddress]
		SELECT 
			ISNULL([Id], 0), CASE WHEN [Guid] IS NULL OR [Guid] = '' THEN '00000000-0000-0000-0000-000000000000' ELSE [GUID] END,
			[Name], [Post], [PostalCode], [Place], [Street], [HouseNo], [ApartmentNo], [Province], [Country]
		FROM 
			OPENXML(@handle, '/Contractor/CorespondenceAddress')
			WITH
			(
				[Id] INT 'Id',
				[Guid] NVARCHAR(36) 'Guid',
				[Name] NVARCHAR(100) 'Name',
				[Post] NVARCHAR(50) 'Post',
				[PostalCode] NVARCHAR(10) 'PostalCode',
				[Place] NVARCHAR(50) 'Place',
				[Street] NVARCHAR(50) 'Street',
				[HouseNo] NVARCHAR(15) 'HouseNo',
				[ApartmentNo] NVARCHAR(15) 'ApartmentNo',
				[Province] NVARCHAR(50) 'Province',
				[Country] NVARCHAR(50) 'Country'
			)
		-- wyczyszczenie pustych elementów
		DELETE FROM [#tblCorespondenceAddress]
		WHERE [Name] = '' AND [Post] = '' AND [PostalCode] = '' AND [Place] = '' AND [Street] = '' AND [HouseNo] = '' AND [ApartmentNo] = '' AND [Province] = '' AND [Country] = ''
		--select * from [#tblCorespondenceAddress]
		
		-- deserializacja danych handlowych z xml
		INSERT INTO [#tblTradeData]
		SELECT 
			[DiscountPercent], [Receivables], [Liabilities]
		FROM 
			OPENXML(@handle, '/Contractor')
			WITH
			(
				[DiscountPercent] FLOAT 'DiscountPercent',
				[Receivables] FLOAT 'Receivables',
				[Liabilities] FLOAT 'Liabilities'
			)
		DELETE FROM [#tblTradeData]
		WHERE [DiscountPercent] = 0 AND [Receivables] = 0 AND [Liabilities] = 0
		--select * from [#tblTradeData]
		
		-- deserializacja danych rachunków bankowych z xml
		INSERT INTO [#tblBankAccounts]
		SELECT 
			[Id],CASE WHEN [Guid] IS NULL OR [Guid] = '' OR [Guid] = '00000000-0000-0000-0000-000000000000' THEN NEWID() ELSE [GUID] END,
			[AccountNo], [AccountName], [IsDefault], [IsActive],
			CASE WHEN [WhiteList] IS NULL OR [WhiteList] = '' THEN NULL ELSE (CASE WHEN [WhiteList] = 'true' THEN 1 ELSE 0 END) END [WhiteList],
			CASE WHEN [WhiteListDate] IS NULL OR [WhiteListDate] = '' THEN NULL ELSE cast([WhiteListDate] as DATETIME2) END [WhiteListDate],
			[SWIFT_BIC], [BankName],
			-- extended attributes
			[IsElectronic], [IsVatAccount]
		FROM 
			OPENXML(@handle, '/Contractor/BankAccounts/BankAccount')
			WITH
			(
				[Id] INT 'Id',
				[Guid] NVARCHAR(36) 'Guid',
				[AccountNo] NVARCHAR(50) 'AccountNo',
				[AccountName] NVARCHAR(100) 'AccountName',
				[IsDefault] BIT 'IsDefault',
				[IsActive] BIT 'IsActive',
				[WhiteList] NVARCHAR(5) 'IsInTaxPayerRegistry',
				[WhiteListDate] NVARCHAR(40) 'VerificationDate',
				[SWIFT_BIC] VARCHAR(11) 'SwiftBicNumber',
				[BankName] NVARCHAR(100) 'BankName',
				-- extended attributes
				[IsElectronic] BIT 'IsElectronic',
				[IsVatAccount] BIT 'IsVatAccount'
			)
			
		DELETE FROM [#tblBankAccounts]
		WHERE ([AccountNo] IS NULL OR [AccountNo] = '') AND ([AccountName] IS NULL OR [AccountName] = '') AND ([IsDefault] IS NULL OR [IsDefault] = 0) AND ([IsActive] IS NULL OR [IsActive] = 0)
			AND [WhiteList] = NULL AND [WhiteListDate] = NULL AND ([SWIFT_BIC] IS NULL OR [SWIFT_BIC] = '') AND ([BankName] IS NULL OR [BankName] = '')
			AND ([IsElectronic] IS NULL OR [IsElectronic] = 0)AND ([IsVatAccount] IS NULL OR [IsVatAccount] = 0)
		--select * from [#tblBankAccounts]
		-- deserializacja danych kontrahenta z xml
		INSERT INTO [#tblContractor]
		SELECT 
			[Id], CASE WHEN [Guid] IS NULL OR [Guid] = '' OR [Guid] = '00000000-0000-0000-0000-000000000000' THEN NEWID() ELSE [GUID] END,
			[Name], [Shortcut], [Nip], [NipUE], [Pesel], [Regon], [LinkedUnit],
			(CASE WHEN [PersonKind] LIKE 'Osoba fizyczna (firma)' THEN 1 ELSE (CASE WHEN [PersonKind] = 'Osoba fizyczna' THEN 2 ELSE 0 END) END) AS [Subject],
			[VATPayerActive], [VIES],
			-- exAttribute
			[RequestMppTransfers], [PaymentFormId], [PayRegistryId], [SaleKindId], [PriceTypeId], [AccountantParameter], [IdFk], [PositionFk],
			-- additional data
			[CatalogId], [ContractorKindId], [MarkerId], (CASE WHEN [Status] IS NULL OR [Status] LIKE '' OR [Status] LIKE 'Aktywny' THEN 1 ELSE 0 END) AS [Status],
			-- sale conditions
			[IsLimitActive], [LimitCurrency], [LimitValue], [PriceNegotiation],
			-- main person
			[FirstName], [Surname]
		FROM 
			OPENXML(@handle, '/Contractor')
			WITH
			(
				[Id] INT 'Id',
				[Guid] NVARCHAR(36) 'Guid',
				[Name] NVARCHAR(150) 'Name',
				[Shortcut] NVARCHAR(50) 'Shortcut',
				[Nip] NVARCHAR(20) 'Nip',
				[NipUE] NVARCHAR(20) 'NipUE',
				[Pesel] NVARCHAR(15) 'Pesel',
				[Regon] NVARCHAR(20) 'Regon',
				[LinkedUnit] BIT 'LinkedUnit',
				[PersonKind] NVARCHAR(100) 'Subject',
				[VATPayerActive] BIT 'VatPayerActive',
				[VIES] BIT 'Vies',
				-- exAttribute
				[RequestMppTransfers] NVARCHAR(10) 'RequestMppTransfers', -- splitPayment
				[PaymentFormId] INT 'PaymentFormId', -- formaPlatnosci
				[PayRegistryId] INT 'PayRegistryId', -- rejestr
				[SaleKindId] INT 'SaleKindId', -- rodzajCeny
				[PriceTypeId] INT 'PriceTypeId', -- typCeny
				[AccountantParameter] NVARCHAR(20) 'AccountantParameter', -- parametrFK
				[IdFk] INT 'IdFk', -- idFK
				[PositionFk] INT 'PositionFk', -- pozycja FK
				-- additional data
				[CatalogId] NVARCHAR(100) 'CatalogId',
				[ContractorKindId] INT 'ContractorKindId',
				[MarkerId] INT 'MarkerId',
				[Status] NVARCHAR(10) 'Status',
				-- sale conditions
				[IsLimitActive] BIT 'IsLimitActive',
				[LimitCurrency] NVARCHAR(20) 'LimitCurrency',
				[LimitValue] FLOAT 'LimitValue',
				[PriceNegotiation] BIT 'PriceNegotiation',
				-- main person
				[FirstName] NVARCHAR(50) 'FirstName',
				[Surname] NVARCHAR(50) 'SurName'
			)
		--select * from [#tblContractor]
		-- ustawienie domyślnego znacznika; wpp. bug 195961
		UPDATE [#tblContractor]
		   SET [MarkerId] = (SELECT [ElementId] FROM [SSCommon].[STElements] WHERE [Guid] = 'D205CFCC-1AF4-4E6B-919C-9AE3A2192F81')
		 WHERE 0 = ISNULL([MarkerId], 0);
		-- deserializacja pól własnych kontrahenta z xml
		DECLARE @classificationTableGuid UNIQUEIDENTIFIER
		DECLARE @classificationTableName NVARCHAR(255)
		SELECT 
			@classificationTableName = ISNULL([TableNamePrefix], '') + [TableName],
			@classificationTableGuid = [Guid]
		FROM [SSCommon].[STClasifications] 
		WHERE [TypeTable] LIKE 'Contractors' AND [Owner] = @moduleCode
		IF @classificationTableName IS NULL -- jeżeli nie pobrano na podstawie kodu modułu to ustaw nazwę wspólnej tabeli kontrahentów
			SET @classificationTableName = 'STContractorsClassification'
		DECLARE @customFieldsDefinitions TABLE([ColumnName] NVARCHAR(128),[Symbol] NVARCHAR(128),[Type] NVARCHAR(250))
		INSERT INTO @customFieldsDefinitions
		SELECT
			[Common].[GetNormalizedColumnNameForCustomField](dim.[Symbol]),
			[Common].[GetNormalizedSymbolForCustomField](dim.[Symbol]),
			dim.[DimCLRType]
		from [SSCommon].[STClasifications] clas
		INNER JOIN [SSCommon].[STClasificationDims] clasDim ON clasDim.[ClasificationsDefId] = clas.[ClasificationsDefId]
		INNER JOIN [SSCommon].[STDimensions] dim ON dim.[Id] = clasDim.[DimensionsId]
		where clas.[Guid] like @classificationTableGuid
		--SELECT * FROM @customFieldsDefinitions
		-- czy są zdefiniowane pola własne
		IF EXISTS (SELECT * FROM @customFieldsDefinitions)
		BEGIN
			SELECT * INTO #temporaryContractorData
			FROM OPENXML(@handle, '/Contractor')
			;WITH documentFields as (
				SELECT c0.[parentid] AS [Id], c0.[localname] AS [FieldName], c1.[text] AS [Value]
				FROM #temporaryContractorData c0
				INNER JOIN #temporaryContractorData c1 ON c0.[id] = c1.[parentid]
				WHERE c0.[parentid] = 0 AND c0.[nodetype] = 1 AND c1.[nodetype] = 3 -- nodetype	int	Identifies the node type. 1 = Element node, 2 = Attribute node, 3 = Text node
			)
			INSERT INTO [#tblCustomFields]
			SELECT customFieldDefinitions.[Symbol] AS [FieldName], documentFields.[Value] AS [Value], customFieldDefinitions.[ColumnName] AS [ColumnName], customFieldDefinitions.[Type] AS [Type]
			FROM documentFields
			RIGHT OUTER JOIN @customFieldsDefinitions customFieldDefinitions ON customFieldDefinitions.[Symbol] = documentFields.[FieldName]
			IF (OBJECT_ID('tempdb..#temporaryContractorData') IS NOT NULL) DROP TABLE #temporaryContractorData
			--SELECT * FROM [#tblCustomFields]
		END
		DECLARE @contractorId INT, @contractorGuid UNIQUEIDENTIFIER
		SELECT @contractorId = [Id], @contractorGuid = CASE WHEN [Guid] IS NULL OR [Guid] LIKE '00000000-0000-0000-0000-000000000000' THEN NEWID() ELSE [Guid] END FROM [#tblContractor]
		DECLARE @contactId INT
		DECLARE @contactGuid UNIQUEIDENTIFIER
		SET @contactGuid = NULL
		DECLARE @bankingInfoGuid UNIQUEIDENTIFIER
		SET @bankingInfoGuid = NULL
		IF ((@contactId IS NULL OR @contactId = 0) AND @contractorId IS NOT NULL AND @contractorId <> 0)
		BEGIN
			SELECT
				@contactGuid = ctr.[ContactGuid],
				@contactId = ct.[Id],
				@bankingInfoGuid = [BankingInfoGuid]
			FROM [SSCommon].[STContractors] ctr
			INNER JOIN [SSCommon].[STContacts] ct ON ct.[Guid] = ctr.[ContactGuid]
			WHERE ctr.[Id] = @contractorId
		END
-- zapis informacji do tabeli z danymi kontaktowymi
		-- tabela tymczasowa na TeleItContacts
		CREATE TABLE [#TeleItContacts]
		(
			[Id] INT IDENTITY(1,1),
			[Guid] UNIQUEIDENTIFIER,
			[Name] NVARCHAR(50),
			[ContactGuid] UNIQUEIDENTIFIER,
			[Telephone1] NVARCHAR(50),
			[Telephone2] NVARCHAR(50),
			[Telephone3] NVARCHAR(50),
			[Fax] NVARCHAR(50),
			[Fax2] NVARCHAR(50),
			[Telex] NVARCHAR(50),
			[Email1] NVARCHAR(100),
			[Email2] NVARCHAR(100),
			[WWW] NVARCHAR(100),
			[Communicator1] NVARCHAR(50),
			[Communicator2] NVARCHAR(50),
			[Description] NVARCHAR(3000),
			[Facebook] NVARCHAR(100)
		)
		-- tabela tymczasowa na PostOfficeAddresses
		CREATE TABLE [#PostOfficeAddresses]
		(
			[Id] INT IDENTITY(1,1),
			[AddressName] NVARCHAR(64),
			[Guid] UNIQUEIDENTIFIER,
			[Street] NVARCHAR(50),
			[Commune] NVARCHAR(50),
			[District] NVARCHAR(50),
			[Place] NVARCHAR(50),
			[PostCode] NVARCHAR(10),
			[PostOffice] NVARCHAR(50),
			[ApartmentNo] NVARCHAR(15),
			[HouseNo] NVARCHAR(15),
			[ContactGuid] UNIQUEIDENTIFIER,
			[Province] NVARCHAR(50),
			[Country] NVARCHAR(50),
			[PostOfficeBox] NVARCHAR(50)
		)
		
		DECLARE @contactName NVARCHAR(100) = ''
		DECLARE @contactMainPostOfficeAddress UNIQUEIDENTIFIER
		DECLARE @contactMainTeleITContact UNIQUEIDENTIFIER
		DECLARE @contactPostOfficeAddresses NVARCHAR(max)
		DECLARE @contactTeleItContacts NVARCHAR(max)
		DECLARE @contactWriteAction INT = 0
		IF EXISTS (SELECT * FROM [#tblContact])
		BEGIN
			
			IF (@contactId IS NULL OR @contactId = 0) -- nowy kontakt
			BEGIN
				IF (@contactGuid IS NULL OR @contactGuid LIKE '00000000-0000-0000-0000-000000000000')
					SELECT @contactGuid = CASE WHEN [Guid] IS NOT NULL AND [Guid] NOT LIKE '00000000-0000-0000-0000-000000000000' THEN [Guid] ELSE NEWID() END FROM [#tblContact]
				SELECT 
					@contactName = '',
					@contactMainTeleITContact = NEWID(),
					@contactWriteAction = 1
			END
			ELSE -- istniejący kontakt
			BEGIN
				SELECT 
					@contactName = [Name], 
					@contactWriteAction = 2
				FROM [SSCommon].[STContacts] 
				WHERE [Guid] = @contactGuid
				SELECT @contactMainTeleITContact = [Guid] FROM [SSCommon].[STTeleItContacts] WHERE [ContactGuid] LIKE @contactGuid
				IF (@contactMainTeleITContact IS NULL)
					SET @contactMainTeleITContact = NEWID()
			END
			INSERT INTO [#TeleItContacts]([Guid], [Name], [ContactGuid], [Telephone1], [Telephone2], [Telephone3], [Fax], [Fax2], [Email1], [Email2], [WWW],
				[Communicator1], [Communicator2], [Description], [Telex], [Facebook])
			SELECT @contactMainTeleITContact, 'adres domyślny', @contactGuid, ISNULL(c.[Telephone1], ''), ISNULL(c.[Telephone2], ''), '', ISNULL(c.[Fax], ''), '', ISNULL(c.[Email], ''), '', ISNULL(c.[Website], ''),
				'', '', '', ISNULL(c.[Telex], ''), ISNULL(c.[Facebook], '')
			FROM [#tblContact] c
		END
		-- zapis informacji do tabeli z danymi adresu domyślnego
		IF EXISTS (SELECT * FROM [#tblMainAddress])
		BEGIN
			IF (@contactGuid IS NULL)
				SET @contactGuid = NEWID()
			DECLARE @postOfficeAddressName NVARCHAR(64)
			SELECT @contactMainPostOfficeAddress = [Guid], @postOfficeAddressName = [Name] FROM [#tblMainAddress]
			IF (@contactId IS NULL OR @contactId = 0) -- nowy kontakt
			BEGIN
				SELECT @contactId = [Id] FROM [SSCommon].[STContacts] WHERE [Guid] LIKE @contactGuid
				IF (@contactMainPostOfficeAddress IS NULL OR @contactMainPostOfficeAddress LIKE '00000000-0000-0000-0000-000000000000')
					SET @contactMainPostOfficeAddress = NEWID()
			END
			ELSE -- istniejący kontakt
			BEGIN
				IF EXISTS(SELECT * FROM [SSCommon].[STPostOfficeAddresses] WHERE [ContactGuid] LIKE @contactGuid AND [AddressName] LIKE @postOfficeAddressName)
					SELECT @contactMainPostOfficeAddress = [Guid] FROM [SSCommon].[STPostOfficeAddresses] WHERE [ContactGuid] LIKE @contactGuid AND [AddressName] LIKE @postOfficeAddressName
				ELSE
					IF (@contactMainPostOfficeAddress IS NULL OR @contactMainPostOfficeAddress LIKE '00000000-0000-0000-0000-000000000000')
						SET @contactMainPostOfficeAddress = NEWID()
			END
			INSERT INTO [#PostOfficeAddresses]([AddressName], [Guid], [Street], [Commune], [District], [Place], [PostCode], [PostOffice], [ApartmentNo],
				[HouseNo], [ContactGuid], [Province], [Country], [PostOfficeBox])
			SELECT CASE WHEN a.[Name] IS NULL OR a.[Name] = '' THEN 'adres domyślny' ELSE a.[Name] END, @contactMainPostOfficeAddress, a.[Street], '', '', a.[Place], a.[PostalCode], a.[Post], a.[ApartmentNo],
				a.[HouseNo], @contactGuid, a.[Province], a.[Country], ''
			FROM [#tblMainAddress] a
		END	
		-- zapis informacji do tabeli z danymi adresu korespondencyjnego
		IF EXISTS (SELECT * FROM [#tblCorespondenceAddress])
		BEGIN
			DECLARE @corespondenceAddressId INT
			DECLARE @corespondenceAddressGuid UNIQUEIDENTIFIER
			DECLARE @corespondenceAddressName NVARCHAR(64)
			SELECT  @corespondenceAddressId = [Id], @corespondenceAddressGuid = [Guid], @corespondenceAddressName = [Name] FROM [#tblCorespondenceAddress]
			IF (@corespondenceAddressId IS NULL OR @corespondenceAddressId = 0) -- nowy adres korespondencyjny
				IF (@corespondenceAddressGuid IS NULL OR @corespondenceAddressGuid LIKE '00000000-0000-0000-0000-000000000000')
					SET @corespondenceAddressGuid = NEWID()	
			ELSE
			BEGIN
				IF EXISTS (SELECT * FROM [SSCommon].[STPostOfficeAddresses] WHERE [ContactGuid] LIKE @contactGuid AND [AddressName] LIKE @corespondenceAddressName)
					SELECT @corespondenceAddressGuid = [Guid] FROM [SSCommon].[STPostOfficeAddresses] WHERE [ContactGuid] LIKE @contactGuid AND [AddressName] LIKE @corespondenceAddressName
				ELSE
					IF (@corespondenceAddressGuid IS NULL OR @corespondenceAddressGuid LIKE '00000000-0000-0000-0000-000000000000')
						SET @corespondenceAddressGuid = NEWID()
			END
			INSERT INTO [#PostOfficeAddresses]([AddressName], [Guid], [Street], [Commune], [District], [Place], [PostCode], [PostOffice], [ApartmentNo],
				[HouseNo], [ContactGuid], [Province], [Country], [PostOfficeBox])
			SELECT CASE WHEN a.[Name] IS NULL OR a.[Name] = '' THEN 'adres korespondencyjny' ELSE a.[Name] END, @corespondenceAddressGuid, a.[Street], '', '', a.[Place], a.[PostalCode], a.[Post], a.[ApartmentNo],
				a.[HouseNo], @contactGuid, a.[Province], a.[Country], ''
			FROM [#tblCorespondenceAddress] a
		END
		-- odczytanie pozostałych adresów podpietych pod kontakt (np. adresy dostaw)
		INSERT INTO [#PostOfficeAddresses]([AddressName], [Guid], [Street], [Commune], [District], [Place], [PostCode], [PostOffice], [ApartmentNo],
			[HouseNo], [ContactGuid], [Province], [Country], [PostOfficeBox])
		SELECT [AddressName], [Guid], [Street], [Commune], [District], [Place], [PostCode], [PostOffice], [ApartmentNo],
			[HouseNo], [ContactGuid], [Province], [Country], [PostOfficeBox]
		FROM [SSCommon].[STPostOfficeAddresses]
		WHERE [ContactGuid] = @contactGuid AND [AddressName] NOT LIKE 'adres domyślny' AND [AddressName] NOT LIKE 'adres korespondencyjny'
		SET @contactTeleItContacts = (SELECT * FROM #TeleItContacts FOR XML PATH('TeleItContacts'), root ('DocumentElement'))
		SET @contactPostOfficeAddresses = (SELECT * FROM #PostOfficeAddresses FOR XML PATH('PostOfficeAddresses'), root ('DocumentElement'))
		
		EXEC [SSCommon].[sp_SaveContactWithDetails] 
					@contactId,
					@contactGuid,
					@contactName,
					@contactMainPostOfficeAddress,
					@contactMainTeleITContact,
					@contactPostOfficeAddresses,
					@contactTeleItContacts,
					@contactWriteAction,
					@contextInfo
-- zapis informacji do tabeli z danymi bankowymi
-- TODO wykorzystać procedurę sp_InsertBankingInfoAndAccounts, sp_UpdateBankingInfoAndAccounts, sp_InsertElementAndAttrs, sp_SaveElementAndAttrs, sp_UpdateElementAndAttrs jeżeli jest taka możliwość
		DECLARE @removingElementsTable TABLE([ElementId] INT, [AccountId] INT) -- tymczasowa tabela na elementy do usunięcia
		IF EXISTS (SELECT * FROM [#tblBankAccounts])
		BEGIN	
			-- tabela tymczasowa na Rachunki bankowe
			CREATE TABLE [#Accounts]
			(
				[Id] INT IDENTITY(1,1),
				[Guid] UNIQUEIDENTIFIER,
				[BankingInfosGuid] UNIQUEIDENTIFIER,
				[AccountNo] NVARCHAR(50),
				[BankName] NVARCHAR(100),
				[AccountName] NVARCHAR(100),
				[ElementId] INT,
				[MainElementGuid] UNIQUEIDENTIFIER,
				[SWIFT_BIC] NVARCHAR(10),
				[Active] BIT,
				[WhiteList] BIT,
				[WhiteListDate] DATETIME2
			)
			DECLARE @bankAccountsEKId INT
			DECLARE @bankAccountsEKGuid UNIQUEIDENTIFIER = '4849512E-9024-4B7C-BD06-737BF4FF3A77'
			SELECT @bankAccountsEKId = [ElementKindId] FROM [SSCommon].[STElementKinds] WHERE [Guid] LIKE @bankAccountsEKGuid
			DECLARE @minBankAccountsPosition INT
			DECLARE @bankingId INT
			DECLARE @bankingMainElement UNIQUEIDENTIFIER
			DECLARE @bankingAccounts NVARCHAR(MAX)
			-- sprawdzenie czy kontrahent ma BankingInfo
			IF (@bankingInfoGuid IS NULL) -- nowe banking info
			BEGIN
				SET @bankingInfoGuid = NEWID()
				EXEC [SSCommon].[sp_InsertBankingInfoAndAccounts] 
					0,
					@bankingInfoGuid,
					'',
					'',
					@contextInfo,
					NULL
			END
			
			-- usunięcie kont bankowych
			INSERT INTO @removingElementsTable
			SELECT cmnElements.[ElementId], cmnAccounts.[Id] FROM [SSCommon].[STElements] cmnElements
			INNER JOIN [SSCommon].[STAccounts] cmnAccounts ON cmnAccounts.[MainElementGuid] = cmnElements.[Guid]
			LEFT OUTER JOIN [#tblBankAccounts] tAccount ON tAccount.[Id] = cmnAccounts.[Id]
			WHERE tAccount.[Id] IS NULL AND cmnAccounts.[BankingInfosGuid] LIKE @bankingInfoGuid
			IF EXISTS(SELECT * FROM @removingElementsTable)
			BEGIN
				DELETE FROM [SSCommon].[STElementExAttributes]
				WHERE [ElementId] IN (SELECT [ElementId] FROM @removingElementsTable)
				UPDATE [SSCommon].[STBankingInfos]
				SET [MainAccount] = NULL
				FROM [SSCommon].[STBankingInfos] bi
				INNER JOIN #tblBankAccounts tba ON bi.[MainAccount] = tba.[Guid]
				WHERE bi.[Guid] = @bankingInfoGuid
			
				BEGIN TRY
					DELETE FROM [SSCommon].[STAccounts]
					WHERE [Id] IN (SELECT [AccountId] FROM @removingElementsTable)
			
					DELETE FROM [SSCommon].[STElements]
					WHERE [ElementId] IN (SELECT [ElementId] FROM @removingElementsTable)
				END TRY
				BEGIN CATCH
					IF (ERROR_NUMBER() = 547)
						THROW 50000, N'Nie można usunąć rachunku bankowego. Istnieją dokumenty powiązane z danym rachunkiem.', 1
					ELSE
						THROW 50000, N'Nie powiodło się usuwanie rachunków bankowych z bazy danych', 1
				END CATCH
			END		
			-- aktualizacja rachunków bankowych
			SELECT @minBankAccountsPosition = ISNULL(MIN([Position]), 0) FROM [SSCommon].[STElements] WHERE [ElementKindId] = @bankAccountsEKId
		
			BEGIN TRY
				--aktualizacja STElements
				SELECT
						@extAttAccountNo = '',
						@extAttDescription = '',
						@extAttExtAttributes = '',					
						@extAttExtOtherThenOriginal=0			
				
				DECLARE @counter INT = 0
				
				DECLARE @accountToHandle NVARCHAR(50)
				SELECT @accountToHandle = [Guid]
				FROM #tblBankAccounts
				ORDER BY [Id] ASC
				OFFSET @counter ROWS
				FETCH NEXT 1 ROWS ONLY
				
				WHILE @accountToHandle IS NOT NULL
				BEGIN
					SELECT
						@extAttElementId = CASE WHEN elem.[ElementId] IS NULL OR elem.[ElementId] = 0 THEN -1 ELSE elem.[ElementId] END,
						@extAttTitle = tAcc.[Guid],
						@extAttActive = tAcc.[IsActive],
						@extAttShortcut = tAcc.[Guid],
						@extAttPosition = @minBankAccountsPosition - 1,
						@minBankAccountsPosition = @minBankAccountsPosition - 1,
						@extAttExtWriteAction = CASE WHEN elem.[ObjVer] IS NULL THEN 1 ELSE 2 END,
						@extAttExtObjVer = CASE WHEN elem.[ElementId] IS NULL OR elem.[ElementId] = 0 THEN 0 ELSE elem.[ObjVer] + 1 END
					FROM #tblBankAccounts tAcc
					LEFT OUTER JOIN [SSCommon].[STElements] elem ON tAcc.[Guid] = elem.[Guid]
					WHERE tAcc.[Guid] = @accountToHandle
					EXEC [SSCommon].[sp_SaveElementAndAttrs] 
							@extAttElementId , 
							@accountToHandle, 
							@extAttTitle,
							@extAttActive,
							@extAttAccountNo,
							@extAttDescription,
							@bankAccountsEKId,
							@extAttShortcut,
							@extAttPosition,
							@extAttExtObjVer,
							@extAttExtAttributes,
							@bankAccountsEKGuid,
							@extAttExtWriteAction,
							@extAttExtOtherThenOriginal,
							@contextInfo
					
					SET @accountToHandle = NULL
					SELECT @accountToHandle = [Guid],
						@counter = @counter + 1
					FROM #tblBankAccounts
					ORDER BY [Id] ASC
					OFFSET @counter ROWS
					FETCH NEXT 1 ROWS ONLY
				END
				SELECT @bankingMainElement = [Guid]
				FROM #tblBankAccounts
				WHERE [IsDefault] = 1
				--aktualizacja danych konkretnych rachunków bankowych
				INSERT INTO #Accounts ([Guid], [BankingInfosGuid], [AccountNo], [BankName],
					[Active], [SWIFT_BIC], [WhiteList], [WhiteListDate])
				SELECT 
					CASE WHEN tAccount.[Guid] IS NULL OR tAccount.[Guid] LIKE '00000000-0000-0000-0000-000000000000' THEN NEWID() ELSE tAccount.[Guid] END,
					@bankingInfoGuid, tAccount.[AccountNo], ISNULL(tAccount.[BankName], ''),
					ISNULL(tAccount.[IsActive], 1), ISNULL(tAccount.[SWIFT_BIC], ''),
					tAccount.[WhiteList], tAccount.[WhiteListDate]
				FROM #tblBankAccounts tAccount
				LEFT OUTER JOIN [SSCommon].[STAccounts] sa ON tAccount.[Guid] = sa.[Guid]
				
				UPDATE #Accounts
				SET [AccountName] = [Guid],
					[MainElementGuid] = [Guid]
				FROM #Accounts
				
				SET @bankingAccounts = (SELECT * FROM #Accounts FOR XML PATH('Accounts'), root ('DocumentElement'))
			
				EXEC [SSCommon].[sp_UpdateBankingInfoAndAccounts] 
					@bankingId,
					@bankingInfoGuid,
					'',
					@bankingAccounts,
					@contextInfo,
					@bankingMainElement
			END TRY
			BEGIN CATCH
				THROW 50000, N'Nie powiodła się aktualizacja rachunków bankowych', 1
			END CATCH
		END
		ELSE -- jeżeli istniały rachunki bankowe to zostały usunięte (UWAGA: przypisane rachunki bankowe np. do dokumentów nie zostaną usunięte)
		BEGIN 
			IF (@bankingInfoGuid IS NOT NULL AND @bankingInfoGuid NOT LIKE '00000000-0000-0000-0000-000000000000')
			BEGIN
				BEGIN TRY
				-- usunięcie kont bankowych
				INSERT INTO @removingElementsTable
				SELECT cmnElements.[ElementId], cmnAccounts.[Id] FROM [SSCommon].[STElements] cmnElements
				INNER JOIN [SSCommon].[STAccounts] cmnAccounts ON cmnAccounts.[MainElementGuid] = cmnElements.[Guid]
				LEFT OUTER JOIN [#tblBankAccounts] tAccount ON tAccount.[Id] = cmnAccounts.[Id]
				WHERE tAccount.[Id] IS NULL AND cmnAccounts.[BankingInfosGuid] LIKE @bankingInfoGuid
				
				IF EXISTS(SELECT * FROM @removingElementsTable)
				BEGIN
					DELETE FROM [SSCommon].[STElementExAttributes]
					WHERE [ElementId] IN (SELECT [ElementId] FROM @removingElementsTable)
					UPDATE [SSCommon].[STBankingInfos]
					SET [MainAccount] = NULL
					WHERE [Guid] = @bankingInfoGuid
				
					DELETE FROM [SSCommon].[STAccounts]
					WHERE [Id] IN (SELECT [AccountId] FROM @removingElementsTable)
				
					DELETE FROM [SSCommon].[STElements]
					WHERE [ElementId] IN (SELECT [ElementId] FROM @removingElementsTable)
		
					UPDATE [SSCommon].[STContractors]
					SET [BankingInfoGuid] = NULL
					WHERE [Id] = @contractorId
					DELETE FROM [SSCommon].[STBankingInfos]
					WHERE [Guid] LIKE @bankingInfoGuid
					SET @bankingInfoGuid = NULL
				END
				END TRY
				BEGIN CATCH
					IF (ERROR_NUMBER() = 547)
						THROW 50000, N'Nie można usunąć rachunku bankowego. Istnieją dokumenty powiązane z danym rachunkiem.', 1
					ELSE
						THROW 50000, N'Nie powiodło się usuwanie rachunków bankowych z bazy danych', 1
				END CATCH
			END
		END
		IF EXISTS (SELECT * FROM [#tblContractor])
		BEGIN
			DECLARE @contractorMainElement UNIQUEIDENTIFIER
			DECLARE @mainPersonGuid UNIQUEIDENTIFIER
			SET @mainPersonGuid = NULL
			DECLARE @contractorElementKindGuid UNIQUEIDENTIFIER = 'BC090993-0768-4487-BE6F-E44E9501734C'
			DECLARE @contractorElementKindId INT = NULL
			DECLARE @firstname NVARCHAR(50), @surname NVARCHAR(50)
			SELECT @firstname = [FirstName], @surname = [Surname] FROM [#tblContractor]
			IF (@firstname IS NULL OR @firstname LIKE '')
				SELECT @firstname = [FirstName] FROM [#tblContact]
			IF (@surname IS NULL OR @surname LIKE '')
				SELECT @surname = [Surname] FROM [#tblContact]
			IF (@contractorId IS NULL OR @contractorId = 0)
			BEGIN
				SET @contractorMainElement = NEWID()
				IF EXISTS(SELECT * FROM [SSCommon].[STElements] elem INNER JOIN [#tblContractor] tContractor ON elem.[Shortcut] LIKE tContractor.[Shortcut] INNER JOIN [SSCommon].[STElementKinds] ekinds ON elem.[ElementKindId] = ekinds.[ElementKindId] WHERE ekinds.[Name] LIKE 'Kontrahenci')
					THROW 50000, N'Kontrahent o podanym skrócie istnieje w bazie danych', 1
				BEGIN TRY	
					SELECT 
						@extAttElementId = NULL,
						@extAttAccountNo = 'COMDA#RESETVALIDACCOUNTNO2008', 
						@extAttDescription = '',
						@extAttPosition = NULL,
						@extAttExtObjVer = 0,
						@extAttExtWriteAction = 1,
						@extAttExtOtherThenOriginal = 0
					
					IF @moduleCode LIKE 'FKF'
					BEGIN
						SELECT 
							@extAttAccountNo = 'COMDA#GENERATEVALIDACCOUNTNO2008', 
							@extAttPosition = (SELECT [PositionFk] FROM #tblContractor WHERE [Id] = @contractorId)
					END
					SELECT @extAttTitle = tContractor.[Name], 
						@extAttActive = ISNULL(tContractor.[Status], 1), 						
						@extAttShortcut = ISNULL(tContractor.[Shortcut], '')
					FROM [#tblContractor] tContractor
					
					-- exAttributes
					-- splitPayment
					INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue],
						[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
					SELECT @extAttElementId, 'splitPayment', (SELECT CASE WHEN [RequestMppTransfers] LIKE 'Wymagaj' THEN 2 ELSE (CASE WHEN [RequestMppTransfers] LIKE 'Blokada' THEN 1 ELSE 0 END) END FROM [#tblContractor]),
						'System.Int16, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', NEWID(), 'splitPayment', 0, 0
					-- idFK
					INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue],
						[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
					SELECT @extAttElementId, 'idFK', (SELECT CASE WHEN [IdFk] = 0 THEN '' ELSE CAST([IdFk] AS NVARCHAR(1024)) END FROM [#tblContractor]),
						'System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', NEWID(), 'idFK', 0, 0						
					-- parametrFK
					INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue],
						[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
					SELECT @extAttElementId, 'parametrFK', (SELECT ISNULL([AccountantParameter], '') FROM [#tblContractor]),
						'System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', NEWID(), 'parametrFK', 0, 0
					-- typCeny
					INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue],
						[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
					SELECT @extAttElementId, 'typCeny', (SELECT CASE WHEN [PriceTypeId] IS NULL OR  [PriceTypeId] < 0 THEN 0 ELSE [PriceTypeId] END FROM [#tblContractor]),
						'System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', NEWID(), 'typCeny', 0, 0
					-- rodzajCeny
					INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue],
						[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
					SELECT @extAttElementId, 'rodzajCeny', (SELECT ISNULL([SaleKindId],0) FROM [#tblContractor]),
						'System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', NEWID(), 'rodzajCeny', 0, 0
					-- rejestr
					INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue],
						[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
					SELECT @extAttElementId, 'rejestr', (SELECT ISNULL([PayRegistryId], 0) FROM [#tblContractor]),
						'System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', NEWID(), 'rejestr', 0, 0
					-- formaPlatnosci
					INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue],
						[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
					SELECT @extAttElementId, 'formaPlatnosci', (SELECT ISNULL([PaymentFormId], 0) FROM [#tblContractor]),
						'System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', NEWID(), 'formaPlatnosci', 0, 0
  
					SET @extAttExtAttributes = (SELECT * FROM #ExtAttributes FOR XML PATH('ElementExAttributes'), root ('DocumentElement'))
					
					EXEC [SSCommon].[sp_SaveElementAndAttrs] 
						@extAttElementId , 
						@contractorMainElement, 
						@extAttTitle,
						@extAttActive,
						@extAttAccountNo,
						@extAttDescription,
						@contractorElementKindId,
						@extAttShortcut,
						@extAttPosition,
						@extAttExtObjVer,
						@extAttExtAttributes,
						@contractorElementKindGuid,
						@extAttExtWriteAction,
						@extAttExtOtherThenOriginal,
						@contextInfo
					IF ((@surname IS NOT NULL AND @surname NOT LIKE '') OR (@firstname IS NOT NULL AND @firstname NOT LIKE ''))
					BEGIN
						SET CONTEXT_INFO @ContextInfoBinaryP;
						SET @mainPersonGuid = NEWID()
						INSERT INTO [SSCommon].[STPersons]([Firstname],[SecondName],[Surname],[BirthDate],[Guid],[StringIdent],
							[DualStringIdent1],[DualStringIdent2],[Note],[ContactGuid],[BankingInfoGuid],[DataSourceName],[DataSourceAddress],[DataProcessingAgree],[DataMarketingProcessingAgree],
							[MainElement],[ExcludedFromAnonymization],[Anonymized])
						SELECT ISNULL(@firstname, ''), '', ISNULL(@surname, ''), CAST('1753-01-01 00:00:00.000' AS DATETIME2), @mainPersonGuid, ISNULL(tContractor.[Name], ''),
							ISNULL(tContractor.[Pesel],''), ISNULL(tContractor.[Nip],''), '', @contactGuid, @bankingInfoGuid, '', '', 0, 0,
							@contractorMainElement, 0, 0
						FROM [#tblContractor] tContractor
						INSERT INTO [SSCommon].[STPersonsClassification]([Guid], [ElementId], [CDim_UserPerson], [CDim_EmployeePerson], [CDim_ContractorContactPerson])
							VALUES(NEWID(), @mainPersonGuid, 0, 0, 1)
						SET CONTEXT_INFO @ContextInfoBinary;
					END
					INSERT INTO [SSCommon].[STContractors]([Guid],
						[Shortcut],[Name],[NIP],[PESEL],[REGON],[NIP_UE],
						[ContactGuid],[BankingInfoGuid],[LimitFlag],[LimitAmount],[LimitCurrency],
						[VIES],[Negotiation],[MainElement],[MainPerson],[VATPayerActive],
						[NaturalPerson],[LinkedUnit])
					SELECT
						@contractorGuid, tContractor.[Shortcut], tContractor.[Name], ISNULL(tContractor.[Nip], ''), ISNULL(tContractor.[Pesel], ''), ISNULL(tContractor.[Regon], ''), ISNULL(tContractor.[NipUE], ''),
						@contactGuid, @bankingInfoGuid, ISNULL(tContractor.[IsLimitActive], 0), ISNULL(tContractor.[LimitValue], 0), ISNULL(tContractor.[LimitCurrency], ''),
						ISNULL(tContractor.[VIES], 0), ISNULL(tContractor.[PriceNegotiation], 0), @contractorMainElement, @mainPersonGuid, ISNULL(tContractor.[VATPayerActive], 0),
						ISNULL(tContractor.[PersonKind], 0), ISNULL(tContractor.[LinkedUnit], 0)
					FROM [#tblContractor] tContractor
					SELECT @contractorId = [Id] FROM [SSCommon].[STContractors] WHERE Shortcut = @extAttShortcut
					IF ((@surname IS NOT NULL AND @surname NOT LIKE '') OR (@firstname IS NOT NULL AND @firstname NOT LIKE ''))
					BEGIN
						SET CONTEXT_INFO @ContextInfoBinaryP;
						INSERT INTO [SSCommon].[STPersonsContractors]([PersonGuid],[ContractorGuid],[PersonOrder],[Guid])
							VALUES(@mainPersonGuid, @contractorGuid, 0, NEWID())
						SET CONTEXT_INFO @ContextInfoBinary;
					END
				END TRY
				BEGIN CATCH	
					THROW 50000, N'Nie powiodło się dodawanie kontrahenta', 1
				END CATCH
			END
			ELSE
			BEGIN
				BEGIN TRY
					SELECT @mainPersonGuid = [MainPerson], @contractorMainElement = [MainElement], @contractorGuid = [Guid] FROM [SSCommon].[STContractors] WHERE [Id] = @contractorId
					
					SET CONTEXT_INFO @ContextInfoBinaryP;
					IF ((@surname IS NOT NULL AND @surname NOT LIKE '') OR (@firstname IS NOT NULL AND @firstname NOT LIKE ''))
					BEGIN
						IF (@mainPersonGuid IS NULL)
						BEGIN
							SET @mainPersonGuid = NEWID()
							INSERT INTO [SSCommon].[STPersons]([Firstname],[SecondName],[Surname],[BirthDate],[Guid],[StringIdent],
								[DualStringIdent1],[DualStringIdent2],[Note],[ContactGuid],[BankingInfoGuid],[DataSourceName],[DataSourceAddress],[DataProcessingAgree],[DataMarketingProcessingAgree],
								[MainElement],[ExcludedFromAnonymization],[Anonymized])
							SELECT ISNULL(@firstname, ''), '', ISNULL(@surname, ''), CAST('1753-01-01 00:00:00.000' AS DATETIME2), @mainPersonGuid, tContractor.[Name],
								ISNULL(tContractor.[Pesel],''), ISNULL(tContractor.[Nip],''), '', @contactGuid, @bankingInfoGuid, '', '', 0, 0,
								@contractorMainElement, 0, 0
							FROM [#tblContractor] tContractor
														
							INSERT INTO [SSCommon].[STPersonsClassification]([Guid], [ElementId], [CDim_UserPerson], [CDim_EmployeePerson], [CDim_ContractorContactPerson])
								VALUES(NEWID(), @mainPersonGuid, 0, 0, 1)
							INSERT INTO [SSCommon].[STPersonsContractors]([PersonGuid],[ContractorGuid],[PersonOrder],[Guid])
								VALUES(@mainPersonGuid, @contractorGuid, 0, NEWID())
						END
						ELSE
						BEGIN
							UPDATE [SSCommon].[STPersons]
							SET [Firstname] = ISNULL(@firstname, ''), [Surname] = ISNULL(@surname, '')
							FROM [#tblContractor] tContractor
							WHERE [SSCommon].[STPersons].Guid LIKE @mainPersonGuid
						END
					END
					ELSE
					BEGIN
						UPDATE [SSCommon].[STContractors]
						SET [MainPerson] = NULL
						WHERE [Id] = @contractorId
						DELETE FROM [SSCommon].[STPersons]
						WHERE [Guid] LIKE @mainPersonGuid
						SET @mainPersonGuid = NULL
					END			
					
					SET CONTEXT_INFO @ContextInfoBinary;
					UPDATE [SSCommon].[STContractors]
					SET
						[Shortcut] = ISNULL(tContractor.[Shortcut], ''),
						[Name] = ISNULL(tContractor.[Name], ''),
						[NIP] = ISNULL(tContractor.[Nip], ''),
						[PESEL] = ISNULL(tContractor.[Pesel], ''),
						[REGON] = ISNULL(tContractor.[Regon], ''),
						[NIP_UE] = ISNULL(tContractor.NipUE, ''),
						[ContactGuid] = @contactGuid,
						[BankingInfoGuid] = @bankingInfoGuid,
						[LimitFlag] = ISNULL(tContractor.[IsLimitActive], 0),
						[LimitAmount] = ISNULL(tContractor.[LimitValue], 0),
						[LimitCurrency] = ISNULL(tContractor.[LimitCurrency], ''),
						[VIES] = ISNULL(tContractor.[VIES], 0),
						[Negotiation] = ISNULL(tContractor.[PriceNegotiation], 0),
						[MainPerson] = @mainPersonGuid,
						[VATPayerActive] = ISNULL(tContractor.[VATPayerActive], 0),
						[NaturalPerson] = ISNULL(tContractor.[PersonKind], 0),
						[LinkedUnit] = ISNULL(tContractor.[LinkedUnit], 0)
					FROM [SSCommon].[STContractors] cmnCtrs
					INNER JOIN [#tblContractor] tContractor ON tContractor.[Id] = cmnCtrs.[Id]
					WHERE cmnCtrs.[Id] = @contractorId 
												
					SELECT @extAttElementId = elem.[ElementId]
					FROM [SSCommon].[STElements] elem
					WHERE elem.[Guid] = @contractorMainElement
					
					SELECT 
						@extAttAccountNo = 'COMDA#UPDATEVALIDACCOUNTNO2008', 
						@extAttDescription = [Description],
						@extAttPosition = NULL,
						@extAttExtObjVer = [ObjVer] + 1,
						@extAttExtWriteAction = 2,
						@extAttExtOtherThenOriginal = 0
					FROM [SSCommon].[STElements] 
					WHERE [ElementId] = @extAttElementId					
					
					IF @moduleCode LIKE 'FKF'
						SET @extAttPosition = (SELECT [PositionFk] FROM #tblContractor WHERE [Id] = @contractorId)
					
					SELECT @extAttTitle = ISNULL(tContractor.[Name], ''), 
						@extAttActive = ISNULL(tContractor.[Status], 1), 						
						@extAttShortcut = ISNULL(tContractor.[Shortcut], '')
					FROM [#tblContractor] tContractor
					-- exAttributes
					DECLARE @exAttributeId INT
					DECLARE @exAttributeGuid UNIQUEIDENTIFIER
					DECLARE @exAttributeCLRType NVARCHAR(400)
					DECLARE @exAttributeTitle NVARCHAR(200)
					DECLARE @exAttributeAccessFlag BIT
					DECLARE @exAttributeInheritedFlag BIT
					--	splitPayment
					SET @exAttributeId = NULL
					SELECT @exAttributeId = ex.[ElementExAttrId], @exAttributeGuid = ex.[Guid], @exAttributeCLRType = ex.[OriginalCLRType],
							@exAttributeTitle = ex.[Title], @exAttributeAccessFlag = ex.[AccessFlag], @exAttributeInheritedFlag = ex.[InheritedFlag]
						FROM [SSCommon].[STElementExAttributes] ex
						INNER JOIN [SSCommon].[STElements] elem ON elem.[ElementId] = ex.[ElementId]
						INNER JOIN [SSCommon].[STContractors] ctrs ON ctrs.[MainElement] = elem.[Guid]
						WHERE ctrs.[Id] = @contractorId AND ex.[Name] LIKE 'splitPayment'
					IF (@exAttributeId IS NOT NULL)
					BEGIN
						INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue], 
							[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
						SELECT @exAttributeId, 'splitPayment', (SELECT CASE WHEN [RequestMppTransfers] LIKE 'Wymagaj' THEN 2 ELSE (CASE WHEN [RequestMppTransfers] LIKE 'Blokada' THEN 1 ELSE 0 END) END FROM [#tblContractor]),
							@exAttributeCLRType, @exAttributeGuid, @exAttributeTitle, @exAttributeInheritedFlag, @exAttributeAccessFlag
					END
					ELSE
					BEGIN					
						INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue],
							[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
						SELECT @extAttElementId, 'splitPayment', (SELECT CASE WHEN [RequestMppTransfers] LIKE 'Wymagaj' THEN 2 ELSE (CASE WHEN [RequestMppTransfers] LIKE 'Blokada' THEN 1 ELSE 0 END) END FROM [#tblContractor]),
						'System.Int16, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', NEWID(), 'splitPayment', 0, 0
					END
					--	idFK
					SET @exAttributeId = NULL
					SELECT @exAttributeId = ex.[ElementExAttrId], @exAttributeGuid = ex.[Guid], @exAttributeCLRType = ex.[OriginalCLRType],
							@exAttributeTitle = ex.[Title], @exAttributeAccessFlag = ex.[AccessFlag], @exAttributeInheritedFlag = ex.[InheritedFlag]
						FROM [SSCommon].[STElementExAttributes] ex
						INNER JOIN [SSCommon].[STElements] elem ON elem.[ElementId] = ex.[ElementId]
						INNER JOIN [SSCommon].[STContractors] ctrs ON ctrs.[MainElement] = elem.[Guid]
						WHERE ctrs.[Id] = @contractorId AND ex.[Name] LIKE 'idFK'
					IF (@exAttributeId IS NOT NULL)
					BEGIN
						INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue], 
							[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
						SELECT @exAttributeId, 'idFK', (SELECT CASE WHEN ISNULL([IdFk], 0) = 0 THEN '' ELSE CAST([IdFk] AS NVARCHAR(1024)) END FROM [#tblContractor]),
							@exAttributeCLRType, @exAttributeGuid, @exAttributeTitle, @exAttributeInheritedFlag, @exAttributeAccessFlag
					END
					ELSE
					BEGIN
						INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue],
							[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
						SELECT @extAttElementId, 'idFK', (SELECT CASE WHEN ISNULL([IdFk], 0) = 0 THEN '' ELSE CAST([IdFk] AS NVARCHAR(1024)) END FROM [#tblContractor]),
							'System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', NEWID(), 'idFK', 0, 0
					END
					--	parametrFK
					SET @exAttributeId = NULL
					SELECT @exAttributeId = ex.[ElementExAttrId], @exAttributeGuid = ex.[Guid], @exAttributeCLRType = ex.[OriginalCLRType],
							@exAttributeTitle = ex.[Title], @exAttributeAccessFlag = ex.[AccessFlag], @exAttributeInheritedFlag = ex.[InheritedFlag]
						FROM [SSCommon].[STElementExAttributes] ex
						INNER JOIN [SSCommon].[STElements] elem ON elem.[ElementId] = ex.[ElementId]
						INNER JOIN [SSCommon].[STContractors] ctrs ON ctrs.[MainElement] = elem.[Guid]
						WHERE ctrs.[Id] = @contractorId AND ex.[Name] LIKE 'parametrFK'
					IF (@exAttributeId IS NOT NULL)
					BEGIN					
						INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue], 
							[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
						SELECT @exAttributeId, 'parametrFK', (SELECT ISNULL([AccountantParameter], '') FROM [#tblContractor]),
							@exAttributeCLRType, @exAttributeGuid, @exAttributeTitle, @exAttributeInheritedFlag, @exAttributeAccessFlag
					END
					ELSE
					BEGIN
						INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue],
							[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
						SELECT @extAttElementId, 'parametrFK', (SELECT ISNULL([AccountantParameter], '') FROM [#tblContractor]),
							'System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', NEWID(), 'parametrFK', 0, 0
					END
					--	typCeny
					SET @exAttributeId = NULL
					SELECT @exAttributeId = ex.[ElementExAttrId], @exAttributeGuid = ex.[Guid], @exAttributeCLRType = ex.[OriginalCLRType],
							@exAttributeTitle = ex.[Title], @exAttributeAccessFlag = ex.[AccessFlag], @exAttributeInheritedFlag = ex.[InheritedFlag]
						FROM [SSCommon].[STElementExAttributes] ex
						INNER JOIN [SSCommon].[STElements] elem ON elem.[ElementId] = ex.[ElementId]
						INNER JOIN [SSCommon].[STContractors] ctrs ON ctrs.[MainElement] = elem.[Guid]
						WHERE ctrs.[Id] = @contractorId AND ex.[Name] LIKE 'typCeny'
					IF (@exAttributeId IS NOT NULL)
					BEGIN						
						INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue], 
							[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
						SELECT @exAttributeId, 'typCeny', (SELECT CASE WHEN [PriceTypeId] IS NULL OR  [PriceTypeId] < 0 THEN 0 ELSE [PriceTypeId] END  FROM [#tblContractor]),
							@exAttributeCLRType, @exAttributeGuid, @exAttributeTitle, @exAttributeInheritedFlag, @exAttributeAccessFlag
					END
					ELSE
					BEGIN
						INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue],
							[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
						SELECT @extAttElementId, 'typCeny', (SELECT CASE WHEN [PriceTypeId] IS NULL OR  [PriceTypeId] < 0 THEN 0 ELSE [PriceTypeId] END  FROM [#tblContractor]),
							'System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', NEWID(), 'typCeny', 0, 0
					END
					--	rodzajCeny
					SET @exAttributeId = NULL
					SELECT @exAttributeId = ex.[ElementExAttrId], @exAttributeGuid = ex.[Guid], @exAttributeCLRType = ex.[OriginalCLRType],
							@exAttributeTitle = ex.[Title], @exAttributeAccessFlag = ex.[AccessFlag], @exAttributeInheritedFlag = ex.[InheritedFlag]
						FROM [SSCommon].[STElementExAttributes] ex
						INNER JOIN [SSCommon].[STElements] elem ON elem.[ElementId] = ex.[ElementId]
						INNER JOIN [SSCommon].[STContractors] ctrs ON ctrs.[MainElement] = elem.[Guid]
						WHERE ctrs.[Id] = @contractorId AND ex.[Name] LIKE 'rodzajCeny'
					IF (@exAttributeId IS NOT NULL)
					BEGIN						
						INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue], 
							[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
						SELECT @exAttributeId, 'rodzajCeny', (SELECT ISNULL([SaleKindId],0) FROM [#tblContractor]),
							@exAttributeCLRType, @exAttributeGuid, @exAttributeTitle, @exAttributeInheritedFlag, @exAttributeAccessFlag
					END
					ELSE
					BEGIN
						INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue],
							[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
						SELECT @extAttElementId, 'rodzajCeny', (SELECT ISNULL([SaleKindId],0) FROM [#tblContractor]),
							'System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', NEWID(), 'rodzajCeny', 0, 0
					END
					--	rejestr
					SET @exAttributeId = NULL
					SELECT @exAttributeId = ex.[ElementExAttrId], @exAttributeGuid = ex.[Guid], @exAttributeCLRType = ex.[OriginalCLRType],
							@exAttributeTitle = ex.[Title], @exAttributeAccessFlag = ex.[AccessFlag], @exAttributeInheritedFlag = ex.[InheritedFlag]
						FROM [SSCommon].[STElementExAttributes] ex
						INNER JOIN [SSCommon].[STElements] elem ON elem.[ElementId] = ex.[ElementId]
						INNER JOIN [SSCommon].[STContractors] ctrs ON ctrs.[MainElement] = elem.[Guid]
						WHERE ctrs.[Id] = @contractorId AND ex.[Name] LIKE 'rejestr'
					IF (@exAttributeId IS NOT NULL)
					BEGIN
						INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue], 
							[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
						SELECT @exAttributeId, 'rejestr', (SELECT ISNULL([PayRegistryId], 0) FROM [#tblContractor]),
							@exAttributeCLRType, @exAttributeGuid, @exAttributeTitle, @exAttributeInheritedFlag, @exAttributeAccessFlag
					END
					ELSE
					BEGIN
						INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue],
							[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
						SELECT @extAttElementId, 'rejestr', (SELECT ISNULL([PayRegistryId], 0) FROM [#tblContractor]),
							'System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', NEWID(), 'rejestr', 0, 0
					END
					--	formaPlatnosci
					SET @exAttributeId = NULL
					SELECT @exAttributeId = ex.[ElementExAttrId], @exAttributeGuid = ex.[Guid], @exAttributeCLRType = ex.[OriginalCLRType],
							@exAttributeTitle = ex.[Title], @exAttributeAccessFlag = ex.[AccessFlag], @exAttributeInheritedFlag = ex.[InheritedFlag]
						FROM [SSCommon].[STElementExAttributes] ex
						INNER JOIN [SSCommon].[STElements] elem ON elem.[ElementId] = ex.[ElementId]
						INNER JOIN [SSCommon].[STContractors] ctrs ON ctrs.[MainElement] = elem.[Guid]
						WHERE ctrs.[Id] = @contractorId AND ex.[Name] LIKE 'formaPlatnosci'
					IF (@exAttributeId IS NOT NULL)
					BEGIN
						INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue], 
							[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
						SELECT @exAttributeId, 'formaPlatnosci', (SELECT ISNULL([PaymentFormId], 0) FROM [#tblContractor]),
							@exAttributeCLRType, @exAttributeGuid, @exAttributeTitle, @exAttributeInheritedFlag, @exAttributeAccessFlag
					END
					ELSE
					BEGIN
						INSERT INTO #ExtAttributes([ElementId], [Name], [StringValue],
							[OriginalCLRType], [Guid], [Title], [InheritedFlag], [AccessFlag])
						SELECT @extAttElementId, 'formaPlatnosci', (SELECT ISNULL([PaymentFormId], 0) FROM [#tblContractor]),
							'System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', NEWID(), 'formaPlatnosci', 0, 0
					END
					SET @extAttExtAttributes = (SELECT * FROM #ExtAttributes FOR XML PATH('ElementExAttributes'), root ('DocumentElement'))
					
					EXEC [SSCommon].[sp_SaveElementAndAttrs] 
						@extAttElementId , 
						@contractorMainElement, 
						@extAttTitle,
						@extAttActive,
						@extAttAccountNo,
						@extAttDescription,
						@contractorElementKindId,
						@extAttShortcut,
						@extAttPosition,
						@extAttExtObjVer,
						@extAttExtAttributes,
						@contractorElementKindGuid,
						@extAttExtWriteAction,
						@extAttExtOtherThenOriginal,
						@contextInfo
				END TRY
				BEGIN CATCH
					THROW 50000, N'Nie powiodła się aktualizacja kontrahenta', 1
				END CATCH
			END
		END
		
		IF EXISTS (SELECT * FROM [#tblTradeData])
		BEGIN
			DECLARE @discountPercent FLOAT
			SELECT @discountPercent = [DiscountPercent] FROM [#tblTradeData]
			IF (@discountPercent IS NOT NULL AND @discountPercent <> 0)
			BEGIN
				IF EXISTS (SELECT * FROM [HM].[ContractorDiscounts] WHERE [ContractorId] = @contractorId)
				BEGIN
					UPDATE [HM].[CN] 
					SET [cena] = @discountPercent
					WHERE [typ] = 15 and [idpd] = @contractorId
				END
				ELSE
				BEGIN
					INSERT INTO [HM].[CN]([idpd], [cena], [typ], [flag], [subtyp], [idpm], [typpd], [idck], [typpar], [parametr], [typceny], [waluta], [aktywna], [flagcen], [datastart], [dataend], [createdBy])
					VALUES (@contractorId, @discountPercent, 15, 0, 0, NULL, 0, NULL, 0, 0, 0, '%', 0, 0, NULL, NULL, NULL)
				END
			END
			ELSE
			BEGIN
				DELETE FROM [HM].[CN]
				WHERE [idpd] = @contractorId AND [typ] = 15
			END
		END
		DECLARE @markerId INT		
		DECLARE @contractorKindId INT
		DECLARE @catalogId NVARCHAR(100)
		SELECT @catalogId = [CatalogId], @contractorKindId = ISNULL([ContractorKindId], 0), @markerId = ISNULL([MarkerId], 0)
			FROM [#tblContractor]
		DECLARE @contractorKindGuid UNIQUEIDENTIFIER
		IF (@contractorKindId <> 0)
			SELECT @contractorKindGuid = [Guid] FROM [SSCommon].[STElements] WHERE [ElementId] = @contractorKindId
		
		DECLARE @catalogGuid UNIQUEIDENTIFIER
		IF (@catalogId IS NOT NULL AND @catalogId NOT LIKE '')
			SELECT @catalogGuid = [Guid] FROM [SSCommon].[STElements] WHERE [Shortcut] = @catalogId
		DECLARE @markerGuid UNIQUEIDENTIFIER
		IF (@markerId IS NOT NULL AND @markerId <> 0)
			SELECT @markerGuid = [Guid] FROM [SSCommon].[STElements] WHERE [ElementId] = @markerId
		IF EXISTS (SELECT * FROM [#tblCustomFields])
		BEGIN
			--SELECT * FROM [#tblCustomFields]
			DECLARE @valueStatement NVARCHAR(MAX)
			DECLARE @newLine NVARCHAR(10)
			SET @newLine = char(13)+char(10)
			DECLARE @setStatement NVARCHAR(MAX)
			SELECT @setStatement = COALESCE(@setStatement + ', ', '') +
					'[' + [ColumnName] + '] = ' + 
					CASE WHEN [Value] IS NULL THEN 'NULL' 
					ELSE (CASE WHEN ([Type] = 'System.Boolean, mscorlib') THEN (CASE WHEN [Value] = 'True' THEN '1' ELSE '0' END)
						ELSE (CASE WHEN ([Type] = 'System.DateTime, mscorlib') THEN 'CAST(''' + [Value] + '''AS datetime2)'
							ELSE (CASE WHEN ([Type] = 'System.String, mscorlib') THEN '''' + [Value] + ''''
								ELSE [Value] END) END) END) END
			FROM [#tblCustomFields]
			--SELECT @setStatement
			DECLARE @insertColumnsStatement NVARCHAR(MAX)
			DECLARE @insertValuesStatement NVARCHAR(MAX)
			SELECT @insertColumnsStatement = COALESCE(@insertColumnsStatement + ', ', '') + '[' + [ColumnName] + ']',
				@insertValuesStatement = COALESCE(@insertValuesStatement + ', ', '') +
					CASE WHEN [Value] IS NULL THEN 'NULL' 
					ELSE (CASE WHEN ([Type] = 'System.Boolean, mscorlib') THEN (CASE WHEN [Value] = 'True' THEN '1' ELSE '0' END)
						ELSE (CASE WHEN ([Type] = 'System.DateTime, mscorlib') THEN 'CAST(''' + [Value] + '''AS datetime2)'
							ELSE (CASE WHEN ([Type] = 'System.String, mscorlib') THEN '''' + [Value] + ''''
								ELSE [Value] END) END) END) END
			FROM [#tblCustomFields]
			--SELECT @insertColumnsStatement
			--SELECT @insertValuesStatement
			
			SET @valueStatement = CONCAT('IF EXISTS(SELECT * FROM [SSCommon].[',@classificationTableName,'] WHERE [ElementId] = ',@contractorId,')',
				@newLine,'BEGIN',
					@newLine,'UPDATE [SSCommon].[',@classificationTableName,']',
					@newLine,'SET ',
					@newLine,@setStatement,
					@newLine,'WHERE [ElementId] = ',@contractorId,
				@newLine,'END',
				@newLine,'ELSE',
				@newLine,'BEGIN',
					@newLine,'INSERT INTO [SSCommon].[',@classificationTableName,']([ElementId], [Guid],',@insertColumnsStatement,')',
					@newLine,'VALUES(',@contractorId,',''',NEWID(),''',',@insertValuesStatement,')',
				@newLine,'END')
			--SELECT @valueStatement
			EXEC (@valueStatement)
		END
		ELSE
		BEGIN
			DECLARE @deleteStatement NVARCHAR(MAX)
			SET @deleteStatement = CONCAT('DELETE FROM [SSCommon].[', @classificationTableName,'] WHERE [ElementId] = ''', @contractorId, '''')
			--SELECT @deleteStatement
			EXEC (@deleteStatement)
		END
		IF NOT EXISTS(SELECT * FROM [SSCommon].[STContractorsClassification] WHERE [ElementId] LIKE @contractorGuid)
		BEGIN
			INSERT INTO [SSCommon].[STContractorsClassification]([Guid],[ElementId],[CDim_ZnacznikKh],[CDim_RodzajKh],[CDim_KatalogKh])
			VALUES (NEWID(), @contractorGuid, @markerGuid, @contractorKindGuid, @catalogGuid)
		END
		ELSE
		BEGIN
			UPDATE [SSCommon].[STContractorsClassification]
			SET [CDim_ZnacznikKh] = @markerGuid, [CDim_RodzajKh] = @contractorKindGuid, [CDim_KatalogKh] = @catalogGuid
			WHERE [ElementId] LIKE @contractorGuid
		END
		--czyścimy śmieci
		IF (OBJECT_ID('tempdb..[#tblContractor]') IS NOT NULL) DROP TABLE [#tblContractor]
		IF (OBJECT_ID('tempdb..[#tblContact]') IS NOT NULL) DROP TABLE [#tblContact]
		IF (OBJECT_ID('tempdb..[#tblMainAddress]') IS NOT NULL) DROP TABLE [#tblMainAddress]
		IF (OBJECT_ID('tempdb..[#tblCorespondenceAddress]') IS NOT NULL) DROP TABLE [#tblCorespondenceAddress]
		IF (OBJECT_ID('tempdb..[#tblTradeData]') IS NOT NULL) DROP TABLE [#tblTradeData]
		IF (OBJECT_ID('tempdb..[#tblBankAccounts]') IS NOT NULL) DROP TABLE [#tblBankAccounts]
		IF (OBJECT_ID('tempdb..[#tblCustomFields]') IS NOT NULL) DROP TABLE [#tblCustomFields]
		exec [Common].[UpdateContractorRIFromXML] @contractorId, @contractorData, @moduleCode , @contextInfo, @contextInfoP
		COMMIT TRANSACTION;
		exec [Common].[ReadContractorAsXML] @contractorId, @moduleCode
	END TRY
	BEGIN CATCH
		IF @@TRANCOUNT > 0
		BEGIN
			ROLLBACK TRANSACTION;
			DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE();
			DECLARE @ErrorSeverity INT = ERROR_SEVERITY();
			DECLARE @ErrorState INT = ERROR_STATE();
			
			RAISERROR (@ErrorMessage, -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState -- State.
               );
		END
	END CATCH
END