-- dbo.ep_Vyroba_GenOdvodZeMzdy
CREATE PROCEDURE dbo.ep_Vyroba_GenOdvodZeMzdy
     @IDMzdy INT,
     @bezVyrCis BIT=1,
     @errMsg NVARCHAR(500)=N'' OUT,
     @realizujPrijem BIT=0,
     @IDDoklad INT=NULL OUT
AS

-- HD Consulting Strakonice, T. Buzin
-- !! proceduru neupravujte, bude stejne pregenerovana pri startu sluzby HDCAPI !!
-- konfiguraci lze ovlivnit pres tabulku #HDCTabGenOdvodZeMzdyKonfig
--  pozor, v tom pripade musi byt na rade prikazu sklad pro generovani odvodu roven NULL


SET NOCOUNT ON

DECLARE
 @ret integer,
 @bChyba BIT,
 @idUziv INT,
 @idDZ INT,
 @IDPrikaz INT,
 @IDKmen INT,
 @NekontrolMnozOdvedFinal bit=0,
 @mnozstvi numeric(19,6)=0,
 @radaOdvNaSklad NVARCHAR(3)=NULL,
 @sklProOdvod NVARCHAR(30)=NULL,
 @radaVPr NVARCHAR(10) 



IF OBJECT_ID(N'dbo.TabUserCfg', N'U') IS NOT NULL
 SET @idUziv = (SELECT ID FROM dbo.TabUserCfg WHERE LoginName=SUSER_SNAME())
SET @idUziv = ISNULL(@idUziv, 0)


-- CREATE TABLE #HDCTabGenOdvodZeMzdyKonfig (RadaOdvodNaSklad NVARCHAR(3), SkladProOdvod NVARCHAR(30), BezVyrobnichCisel BIT=0, IDUziv INT)
IF OBJECT_ID(N'tempdb..#HDCTabGenOdvodZeMzdyKonfig', N'U') IS NOT NULL
 SELECT TOP(1) @radaOdvNaSklad=RadaOdvodNaSklad, @sklProOdvod=SkladProOdvod, @bezVyrCis=ISNULL(BezVyrobnichCisel,@bezVyrCis),
               @idUziv=ISNULL(IDUziv, @idUziv)
  FROM #HDCTabGenOdvodZeMzdyKonfig




DROP TABLE IF EXISTS #TabOdved
CREATE TABLE #TabOdved (
 ID INT IDENTITY NOT NULL,
 IDPrikaz INT NOT NULL,
 IDDilec INT NOT NULL,
 IDZakazModif INT NULL,
 IDZakazka INT NULL,
 maxMnozstvi NUMERIC(19,6) NULL,
 mnozstvi NUMERIC(19,6) NOT NULL,
 EvidJednotka NUMERIC(19,6) NOT NULL,
 Sklad NVARCHAR(30) NULL,
 KodUmisteni NVARCHAR(15) NULL,
 IDPohZbo INT NULL,
 PomVnoreni INT NULL,
 StavPrikazu TINYINT NULL,
 PRIMARY KEY(ID)
)


DROP TABLE IF EXISTS #TabOdved_IDMzdy
CREATE TABLE #TabOdved_IDMzdy (IDPrikaz int, IDMzdy int)




DROP TABLE IF EXISTS #TabVyrCisProGenOdv
CREATE TABLE #TabVyrCisProGenOdv (
 ID INT IDENTITY NOT NULL,
 IDOdvedeni INT NOT NULL,
 IDPrikaz INT NOT NULL,
 VyrCislo NVARCHAR(100) NOT NULL,
 Mnozstvi NUMERIC(19,6) NOT NULL DEFAULT 0,
 MaxMnozstvi NUMERIC(19,6) NULL,
 IDVyrCP INT NULL,
 PRIMARY KEY(ID)
)



DROP TABLE IF EXISTS #TabPolotovProGenOdv
CREATE TABLE #TabPolotovProGenOdv (
 ID INT IDENTITY NOT NULL,
 IDOdvedeni INT NOT NULL,
 IDPrikaz INT NOT NULL,
 Doklad INT NOT NULL,
 IDDilec INT NOT NULL,
 Mnozstvi NUMERIC(19,6) NOT NULL,
 MaxMnozstvi NUMERIC(19,6) NULL,
 PRIMARY KEY(ID)
)


DROP TABLE IF EXISTS #TabGenPrijem
CREATE TABLE #TabGenPrijem (ID INT NOT NULL, PRIMARY KEY(ID))






IF EXISTS (SELECT 1 FROM dbo.TabPrikazMzdyAZmetky WHERE GenerovanoOdvadeni=1 AND ID=@IDMzdy)
 RETURN 0


SELECT @mnozstvi=kusy_odv FROM dbo.TabPrikazMzdyAZmetky WHERE ID=@IDMzdy

UPDATE dbo.TabPrikazMzdyAZmetky SET GenerovanoOdvadeni=1 WHERE ID=@IDMzdy
IF (@@ROWCOUNT=0) RETURN 0
IF @mnozstvi<=0.0 RETURN 0



SELECT @IDPrikaz=IDPrikaz FROM dbo.TabPrikazMzdyAZmetky WHERE ID=@IDMzdy
SELECT @radaVPr=Rada, @IDKmen=IDTabKmen FROM dbo.TabPrikaz WHERE ID=@IDPrikaz

-- nastav sklad pro odvod podle karty
IF (@sklProOdvod IS NULL)
 SELECT @sklProOdvod=VychoziSklad FROM dbo.TabParKmZ WHERE IDKmenZbozi=@IDKmen

-- pripadne zkus podle rady prikazu
SELECT @radaOdvNaSklad=CASE WHEN RadaDokl_OdvedeniPrikazu IS NULL THEN @radaOdvNaSklad ELSE RadaDokl_OdvedeniPrikazu END,
       @sklProOdvod=CASE WHEN PrijemVyrDil_SkladProGenHlavDZ IS NULL THEN @sklProOdvod ELSE PrijemVyrDil_SkladProGenHlavDZ END
 FROM dbo.TabRadyPrikazu WHERE Rada=@radaVPr




UPDATE #tabOdved SET mnozstvi=CASE WHEN @NekontrolMnozOdvedFinal=0 AND mnozstvi+@mnozstvi>maxMnozstvi THEN maxMnozstvi ELSE mnozstvi+@mnozstvi END WHERE IDPrikaz=@IDPrikaz 
IF (@@ROWCOUNT=0) 
  INSERT INTO #tabOdved (IDPrikaz, IDDilec, IDZakazModif, IDZakazka, maxMnozstvi, EvidJednotka, mnozstvi, sklad, StavPrikazu) 
    SELECT P.ID, 
           CASE WHEN ISNULL(ParKZ.OdvadetNaZaklVari,0)=0 THEN P.IDTabKmen ELSE KZ.IDKusovnik END, 
           ZMD.IDZakazModif,
           P.IDZakazka, 
           CASE WHEN @NekontrolMnozOdvedFinal=1 THEN NULL ELSE P.kusy_zive END, 
           P.EvidJednotka, 
           CASE WHEN @NekontrolMnozOdvedFinal=0 AND @mnozstvi>P.kusy_zive THEN P.kusy_zive ELSE @mnozstvi END, 
           P.sklad,
           P.StavPrikazu 
      FROM dbo.TabPrikaz P 
        INNER JOIN dbo.TabKmenZbozi KZ ON (KZ.ID=P.IDTabKmen) 
        LEFT OUTER JOIN dbo.TabZakazModifDilce ZMD ON (ZMD.IDZakazModif=P.IDZakazModif AND ZMD.IDKmenZbozi=KZ.ID) 
        LEFT OUTER JOIN dbo.TabParKmZ ParKZ ON (ParKZ.IDKmenZbozi=P.IDTabKmen) 
      WHERE P.ID=@IDPrikaz AND 
            (CASE WHEN @NekontrolMnozOdvedFinal=0 AND @mnozstvi>P.kusy_zive THEN P.kusy_zive ELSE @mnozstvi END)>0 
INSERT INTO #TabOdved_IDMzdy (IDPrikaz, IDMzdy) VALUES (@IDPrikaz, @IDMzdy)



UPDATE O SET maxMnozstvi=CASE WHEN RP.NekontrolMnozOdvedFinal=1 THEN NULL ELSE P.kusy_zive END 
  FROM #tabOdved O 
    INNER JOIN dbo.TabPrikaz P ON (P.ID=O.IDPrikaz) 
    INNER JOIN dbo.TabRadyPrikazu RP ON (RP.rada=P.rada) 

UPDATE #tabOdved SET mnozstvi=maxMnozstvi WHERE maxMnozstvi IS NOT NULL AND mnozstvi>maxMnozstvi 
DELETE #TabVyrCisProGenOdv WHERE IDOdvedeni  IN (SELECT O2.ID FROM #tabOdved O2 WHERE O2.Mnozstvi<=0.0) 
DELETE #TabPolotovProGenOdv WHERE IDOdvedeni IN (SELECT O2.ID FROM #tabOdved O2 WHERE O2.Mnozstvi<=0.0) 
DELETE #tabOdved WHERE Mnozstvi<=0.0


EXEC dbo.hp_PrednabidniTabVyrCisProGenOdv @ProIDPrikaz=NULL
IF (@bezVyrCis=1)
 DELETE #TabVyrCisProGenOdv


BEGIN TRY
 EXEC @ret=dbo.hp_OdvedeniPrikazu @RadaDokladu=@radaOdvNaSklad, @IDObdobi=NULL, @KonecneOdvedeni=0, @DatPorizeni=NULL, @SekejZakazky=1, @SekejPrikazy=1
END TRY
BEGIN CATCH
 SET @errMsg = 'Chyba pri odvadeni: ' + ERROR_MESSAGE()
END CATCH





IF (@realizujPrijem=1)
 BEGIN
  DECLARE
   @idPrij INT

  DECLARE prij CURSOR LOCAL FOR
   SELECT ID FROM #TabGenPrijem
  OPEN prij
  WHILE (1=1)
   BEGIN
    FETCH NEXT FROM prij INTO @idPrij
    IF (@@FETCH_STATUS<>0) BREAK

    BEGIN TRY
     EXEC dbo.hp_Realizuj_Prijem @ID=@idPrij, @DatumRealizace=NULL, @Uzivatel=@idUziv, @BylaChyba=@bChyba OUT, @VypnoutUpozorneniPriZajistovani=1
    END TRY
    BEGIN CATCH
     SET @errMsg = ERROR_MESSAGE()
    END CATCH
   
   END
  CLOSE prij
  DEALLOCATE prij
END



SET @IDDoklad = NULL
IF (1=(SELECT COUNT(*) FROM #TabGenPrijem))
 SET @IDDoklad=(SELECT TOP(1) ID FROM #TabGenPrijem)



-- cisteni
DROP TABLE IF EXISTS #TabGenPrijem
DROP TABLE IF EXISTS #TabPolotovProGenOdv
DROP TABLE IF EXISTS #TabVyrCisProGenOdv
DROP TABLE IF EXISTS #TabOdved_IDMzdy
DROP TABLE IF EXISTS #TabOdved

DROP TABLE IF EXISTS #HDCTabGenOdvodZeMzdyKonfig
