
CREATE PROCEDURE [dbo].[ApiProdTechnLinesProc] 
@ObjectType int,
 @ObjectId int
as 
BEGIN

/*
declare @ObjectType int;
declare @ObjectId int;

set @ObjectType = 500; -- operacja
set @ObjectId = 653;
*/

-- Linie WMS
create table #WmsLines
(
		ItemId int
	   ,TechnLine int 
	   ,Direction int	  
	     , UM nvarchar(10)
      ,Quantity decimal(16,4)
)


IF ( @ObjectType = 501)
BEGIN
INSERT INTO #WmsLines
select wl.ItemId,wl.ErpId TechnLine,  wd.Direction , wl.UM, SUM(case when(wd.StateId=0) then wl.OrgQuantity else wl.Quantity end)  Quantity
 from dbo.ApiWmsDocLines wl 
 JOIN dbo.ApiWmsDocuments wd 
 ON wd.StateId<3 and  wl.DocumentId = wd.Id 
  and (
 (wd.ObjectType = 501 and  wd.ObjectId = @ObjectId)
 OR
 (wd.ObjectType = 502 
	and EXISTS( select * from dbo.ApiProdActivities apa where apa.Id = -wl.ErpId 
		and apa.ActionId = wd.ObjectId and apa.OperationId = @ObjectId  ))
 )

 GROUP BY wd.Direction, wl.ErpId, wl.ItemId, wl.UM;
 END 
 ELSE IF (@ObjectType = 500)
 BEGIN
 INSERT INTO #WmsLines
 select wl.ItemId,wl.ErpId TechnLine,  wd.Direction ,wl.UM, SUM(case when(wd.StateId=0) then wl.OrgQuantity else wl.Quantity end)  Quantity
 from dbo.ApiWmsDocLines wl 
 JOIN dbo.ApiWmsDocuments wd 
 ON wd.StateId<3 and  wl.DocumentId = wd.Id and (
 (wd.ObjectType = 500 and  wd.ObjectId = @ObjectId ) -- wprost wywiedzione ze zlecenia
 OR (wd.ObjectType = 501 and  wd.ObjectId in (select ID from dbo.Operacje where Technologia = @ObjectId ) ))
 GROUP BY wd.Direction, wl.ErpId,  wl.ItemId,wl.UM;
 END

--select * from #WmsLines;


-------------------
create table #ErpLines
(
		ItemId int
	   ,TechnLine int 
	   ,Direction int	   
	     , UM nvarchar(10)
      ,Quantity decimal(16,4)
);

IF ( @ObjectType = 501)
BEGIN
INSERT INTO #ErpLines
select poz.Towar ItemId, pt.ID TechnLine, dok.KierunekMagazynu Direction, poz.IloscSymbol UM, SUM(cast(poz.IloscValue as decimal(16,4))) Quantity  
from dbo.PozycjeDokHan poz JOIN dbo.DokHandlowe dok on dok.ID = poz.Dokument and dok.Definicja in ( 92,93)
JOIN dbo.PozRelHandlowej prh ON prh.PodrzednyDok = dok.ID and prh.PodrzednaIdent = poz.Ident
JOIN dbo.PozycjeTechn pt ON prh.ProdukcjaInfoIdentyfikatorElementuPowiazanego = pt.Guid
where pt.Operacja = @ObjectId and poz.IloscValue>0
GROUP BY dok.KierunekMagazynu, pt.ID, poz.Towar, poz.IloscSymbol;


INSERT INTO #ErpLines
-- teraz dodajemy te które nie są w relacji produkcyjnej żadnej ale są powiązane pprzez ceche
select poz.Towar ItemId, 0 TechnLine, dok.KierunekMagazynu Direction, poz.IloscSymbol UM,SUM(cast(poz.IloscValue as decimal(16,4))) Quantity   from dbo.PozycjeDokHan poz JOIN dbo.DokHandlowe dok on dok.ID = poz.Dokument and dok.Definicja in ( 92,93)
JOIN dbo.Features f ON f.Name='Operacja' and f.ParentType ='DokHandlowe' and f.lp=0 and f.Parent = dok.ID and f.Data = @ObjectId
-- nie są w żadnej relacji produkcyjnej na pozycjach)
where NOT EXISTS ( select * from dbo.PozRelHandlowej prh 
		JOIN  dbo.PozycjeTechn pt ON prh.ProdukcjaInfoIdentyfikatorElementuPowiazanego = pt.Guid 
		where prh.PodrzednyDok = dok.ID and prh.PodrzednaIdent = poz.Ident )
		and poz.IloscValue>0
GROUP BY dok.KierunekMagazynu, poz.Towar,poz.IloscSymbol ;
END

else IF (@ObjectType =500)
BEGIN
INSERT INTO #ErpLines
select poz.Towar ItemId, pt.ID TechnLine, dok.KierunekMagazynu Direction, poz.IloscSymbol UM, SUM(cast(poz.IloscValue as decimal(16,4))) Quantity  
from dbo.PozycjeDokHan poz JOIN dbo.DokHandlowe dok on dok.ID = poz.Dokument and dok.Definicja in ( 92,93)
JOIN dbo.PozRelHandlowej prh ON prh.PodrzednyDok = dok.ID and prh.PodrzednaIdent = poz.Ident
JOIN dbo.PozycjeTechn pt ON prh.ProdukcjaInfoIdentyfikatorElementuPowiazanego = pt.Guid
where pt.Technologia = @ObjectId and poz.IloscValue>0
GROUP BY dok.KierunekMagazynu, pt.ID, poz.Towar,poz.IloscSymbol;



INSERT INTO #ErpLines
-- teraz dodajemy te które nie są w relacji produkcyjnej żadnej ale są powiązane pprzez ceche
select poz.Towar ItemId, 0 TechnLine, dok.KierunekMagazynu Direction, poz.IloscSymbol UM,SUM(cast(poz.IloscValue as decimal(16,4))) Quantity   from dbo.PozycjeDokHan poz JOIN dbo.DokHandlowe dok on dok.ID = poz.Dokument and dok.Definicja in ( 92,93)
-- są w relacji ze zleceniem
JOIN dbo.RelacjeHandlowe rh ON rh.Podrzedny = dok.ID 
JOIN dbo.DokHandlowe zlec ON zlec.ID = rh.Nadrzedny 
JOIN dbo.Technologie techn ON techn.Zlecenie = zlec.ID and techn.ID = @ObjectId
-- nie są w żadnej relacji produkcyjnej na pozycjach)
where NOT EXISTS ( select * from dbo.PozRelHandlowej prh 
		JOIN  dbo.PozycjeTechn pt ON prh.ProdukcjaInfoIdentyfikatorElementuPowiazanego = pt.Guid 
		where prh.PodrzednyDok = dok.ID and prh.PodrzednaIdent = poz.Ident )
		and poz.IloscValue>0
GROUP BY dok.KierunekMagazynu, poz.Towar, poz.IloscSymbol;
END
 --select * from #ErpLines;


-- łączymy ze sobą tabele dokumentowe
create table #DocLines
(
		ItemId int
	   ,TechnLine int 
	   ,Direction int
	    , UM nvarchar(10)
      ,WmsQuantity decimal(16,4), DocQuantity decimal(16,4)
	 
);
INSERT INTO #DocLines
select ISNULL(el.ItemId,wl.ItemId) ItemId, ISNULL(el.TechnLine,wl.TechnLine) TechnLine,
ISNULL(el.Direction,wl.Direction) Direction, 
ISNULL(el.UM,wl.UM) UM, 
ISNULL(wl.Quantity,cast(0 as decimal(16,4))) WmsQuantity,
ISNULL(el.Quantity,cast(0 as decimal(16,4))) DocQuantity
from #ErpLines el FULL OUTER JOIN #WmsLines wl ON wl.TechnLine = el.TechnLine and wl.Direction = el.Direction and wl.ItemId = el.ItemId;

--select * from #DocLines;

-- Pozycje technologi
create table #TechnLines
(
		ItemId int
	   ,TechnLine int 
	   ,Direction int	
	   , UM nvarchar(10)
      ,Quantity decimal(16,4)
	  , ProductionInProgressQuantity decimal(16,4)
	  , ReservationQuantity decimal(16,4)
	  , OperationId int
	  , OperationName nvarchar(100)
	  , Guid uniqueidentifier
	  , RelTechnId int
	  , RelTechnNumber nvarchar(100)
);

-- Pozycje technologii
INSERT INTO #TechnLines
select   pt.Towar ItemId, pt.Id TechnLine, case when ( pt.Rodzaj =0) then -1 else 1 end Direction,
pt.IloscSymbol UM ,
cast(pt.IloscValue as decimal(16,4)) Quantity  , 
cast ( podrz.PiPQuant as decimal(16,4)) ProductionInProgressQuantity,
cast ( 0 as decimal(16,4)) ReservationQuantity,
pt.Operacja OperationId, op.Nazwa OperationName, pt.Guid,
ISNULL(podrz.PodrzTechnId,ISNULL(tn.Id,0)) RelTechnId, ISNULL(podrz.PodrzZlecNumer,ISNULL(zn.NumerPelny,'')) RelTechnNumber
from dbo.PozycjeTechn pt
LEFT OUTER JOIN dbo.Operacje op ON op.ID = pt.Operacja

-- zlecenia nadrzędne
left JOIN dbo.Technologie tt ON tt.ID = pt.Technologia and pt.Rodzaj=1
left outer join dbo.RelacjeHandlowe nrh ON nrh.Podrzedny =tt.Zlecenie
left outer join dbo.Technologie tn ON tn.Zlecenie = nrh.Nadrzedny
left outer join dbo.DokHandlowe zn ON zn.ID = tn.Zlecenie

-- podrzędne zlecenia
LEFT OUTER JOIN 
(
select pprh.ProdukcjaInfoIdentyfikatorElementuPowiazanego, 
STRING_AGG (pzpodrz.NumerPelny,',') PodrzZlecNumer,
Max(ptt.Id) PodrzTechnId, 
ISNULL(SUM( pip.ProdInProgress),0) PiPQuant 
from dbo.PozRelHandlowej pprh 
JOIN dbo.DokHandlowe pzpodrz on pzpodrz.ID = pprh.PodrzednyDok
JOIN dbo.Technologie ptt ON ptt.Zlecenie = pzpodrz.ID
LEFT OUTER JOIN 
(select Techn, SUM(Quantity) ProdInProgress 
from dbo.ApiProdInProgressView  GROUP BY Techn) pip
ON pip.Techn = ptt.ID 
--where pprh.ProdukcjaInfoIdentyfikatorElementuPowiazanego = pt.Guid
GROUP BY pprh.ProdukcjaInfoIdentyfikatorElementuPowiazanego
) podrz ON podrz.ProdukcjaInfoIdentyfikatorElementuPowiazanego = pt.Guid and pt.Rodzaj=0

where pt.Rodzaj in (0,1) and (@ObjectType = 501 and pt.Operacja = @ObjectId) OR (@ObjectType= 500 and pt.Technologia = @ObjectId)

-- zlecenia podrzędne dla surowców


--select * from #TechnLines;

-- Rezultat
/*
    public int Id { get; set; }
      //  public int TechnologyId { get; set; } // poprzenia
       // public int OperationId { get; set; } // poprzenia

        public int Direction { get; set; } //  
       
        public int ItemId { get; set; }
        public string ItemName { get; set; }
        public string ItemCode { get; set; }
        
        public double Quantity { get; set; }

        public double RealizedQuantity { get; set; } // ilość zrealizowane poprzez dokumenty magazynowe + dyspozycje niezrealizowane
        public double ProductionInProgressQuantity { get; set; } // produkcja w toku w podrzędnych zleceniach

        public double ReservationQuantity { get; set; } // produkcja w toku w podrzędnych zleceniach

        public double WmsQuantity { get; set; } // produkcja w toku w podrzędnych zleceniach

        public string UM { get; set; }
*/

select ISNULL(tl.TechnLine,0) Id, ISNULL(tl.Direction,dl.Direction) Direction,
ISNULL(tl.ItemId,dl.ItemId) ItemId,
tow.Nazwa ItemName, tow.Kod ItemCode,
ISNULL(tl.Quantity,cast(0 as decimal(16,4))) Quantity,
ISNULL(dl.DocQuantity,cast(0 as decimal(16,4))) RealizedQuantity,
ISNULL(tl.ProductionInProgressQuantity,cast(0 as decimal(16,4))) ProductionInProgressQuantity,
ISNULL(tl.ReservationQuantity,cast(0 as decimal(16,4))) ReservationQuantity,
ISNULL(dl.WmsQuantity,cast(0 as decimal(16,4))) WmsQuantity,
ISNULL(tl.UM,dl.UM) UM,
ISNULL((select SUM(IloscValue)
from dbo.Zasoby z
JOIN  dbo.OkresyMag o  ON o.ID = z.Okres and o.Zamkniety = 0
where
 Kierunek =1  and PartiaTyp=1 and z.Towar = ISNULL(tl.ItemId,dl.ItemId)
 ),0) Stock, 
 tow.EAN Barcode,
 ISNULL(OperationId,0) OperationId, ISNULL(OperationName,'') OperationName,
 ISNULL(tl.RelTechnId,0) RelTechnId ,ISNULL(tl.RelTechnNumber,'')  RelTechnNumber
from #TechnLines tl FULL OUTER JOIN #DocLines dl ON dl.TechnLine = tl.TechnLine
LEFT OUTER JOIN dbo.Towary tow on tow.ID = tl.ItemId OR tow.ID = dl.ItemId



DROP TABLE #TechnLines;
DROP TABLE #ErpLines;
DROP TABLE #WmsLines;
DROP TABLE #DocLines;

END


--select Techn, SUM(Quantity) ProdInProgress from dbo.ApiProdInProgressView GROUP BY Techn
GO


