-- dbo.ep_Vyroba_GenObjednavkuMatDoVyroby
CREATE PROCEDURE dbo.ep_Vyroba_GenObjednavkuMatDoVyroby
      @cilovySklad NVARCHAR(30)=N'',
      @radaDokl NVARCHAR(3)=N'',
      @druhPohybuZbo TINYINT=4,
      @errMsg NVARCHAR(500)=N'' OUT
AS

-- HD Consulting Strakonice, T. Buzin
-- !! proceduru neupravujte, bude stejne pregenerovana pri spusteni pluginu Pekarna nebo pri startu Windows sluzby HDCDZApi !!

SET NOCOUNT ON


DECLARE
 @tranPred INT,
 @cnt INT

DECLARE
 @idObj INT,
 @radaPrijem NVARCHAR(3),
 @druhPohybuZboPrijem TINYINT,
 @idDoklad INT,
 @datumDokladuMat DATETIME,
 @datumDokladuFin DATETIME,
 @genDokladMat BIT=0,
 @idDokladMat INT,
 @genDokladFin BIT=0,
 @idDokladFin INT,
 @cOrg INT=0,
 @dzMena NVARCHAR(3),
 @dzKurz NUMERIC(19,6),
 @dzKurzEur NUMERIC(19,6),
 @jednM INT,
 @vstC TINYINT,
 @idPohyb INT,
 @idPZ INT,
 @idZboSklad INT,
 @idKmen INT,
 @idKZ INT,
 @sz NVARCHAR(3),
 @rc NVARCHAR(30),
 @sarze NVARCHAR(100),
 @paletList NVARCHAR(100),
 @skladMat NVARCHAR(30),
 @skladFin NVARCHAR(30),
 @mnoz NUMERIC(19,6),
 @mnozVydano NUMERIC(19,6),
 @material BIT


IF OBJECT_ID(N'tempdb..#VyrobaGenObjednavkuMatDoVyroby', N'U') IS NOT NULL
 SELECT TOP(1) @skladMat=SkladMaterial, @skladFin=SkladVyrobky
   FROM #VyrobaGenObjednavkuMatDoVyroby


SET @radaDokl = ISNULL(@radaDokl, N'231')
SET @druhPohybuZbo = ISNULL(@druhPohybuZbo, 4)
IF NOT EXISTS(SELECT 1 FROM dbo.TabDruhDokZbo WHERE RadaDokladu=@radaDokl AND DruhPohybuZbo=@druhPohybuZbo)
 RETURN


SELECT @cilovySklad=IDSkladPrevodu, @radaPrijem=TypPrevodky, @druhPohybuZboPrijem=TabDruhDZ_DruhPohybuZboPre
 FROM dbo.TabDruhDokZbo WHERE RadaDokladu=@radaDokl AND DruhPohybuZbo=@druhPohybuZbo
SET @radaPrijem = ISNULL(@radaPrijem, N'281')
SET @druhPohybuZboPrijem = ISNULL(@druhPohybuZboPrijem, 0)
IF NOT EXISTS (SELECT 1 FROM dbo.TabDruhDokZbo WHERE RadaDokladu=@radaPrijem AND DruhPohybuZbo=@druhPohybuZboPrijem)
 RETURN



SET @cilovySklad = ISNULL(@cilovySklad, N'')
IF (@cilovySklad=N'')
 SET @cilovySklad = N'211'

SET @skladMat = ISNULL(@skladMat, N'')
IF (@skladMat=N'')
 SET @skladMat = N'311'

SET @skladFin = ISNULL(@skladFin, N'')
IF (@skladFin=N'')
 SET @skladFin = N'312'



SET @genDokladMat=0
IF EXISTS (SELECT 1 FROM dbo._TabVyroba_Objednavky o WHERE o.Splneno=0 AND o.OdmitnutoSkladem=0 AND o.NocniObjednavka=0 AND o.Storno=0 AND o.Vratka=0
            AND o.JeMaterial=1 AND o.Blokovano=0 AND (o.Mnozstvi-ISNULL( (SELECT SUM(Mnozstvi) FROM dbo._TabVyroba_Objednavky_Pol WHERE IDHlava=o.ID), 0))>0
          )
 BEGIN
  SET @genDokladMat=1
  SET @datumDokladuMat = (SELECT MIN(o.DatPorizeni) FROM dbo._TabVyroba_Objednavky o WHERE o.Splneno=0 AND o.OdmitnutoSkladem=0 AND o.NocniObjednavka=0 AND o.Storno=0 AND o.Vratka=0
                           AND o.JeMaterial=1 AND o.Blokovano=0 AND (o.Mnozstvi-ISNULL( (SELECT SUM(Mnozstvi) FROM dbo._TabVyroba_Objednavky_Pol WHERE IDHlava=o.ID), 0))>0
                          )
 END
SET @datumDokladuMat = ISNULL(@datumDokladuMat, GETDATE())



SET @genDokladFin=0
IF EXISTS (SELECT 1 FROM dbo._TabVyroba_Objednavky o WHERE o.Splneno=0 AND o.OdmitnutoSkladem=0 AND o.NocniObjednavka=0 AND o.Storno=0 AND o.Vratka=0
            AND o.JeMaterial=0 AND o.Blokovano=0 AND (o.Mnozstvi-ISNULL( (SELECT SUM(Mnozstvi) FROM dbo._TabVyroba_Objednavky_Pol WHERE IDHlava=o.ID), 0))>0
          )
 BEGIN
  SET @genDokladFin=1
  SET @datumDokladuFin = (SELECT MIN(o.DatPorizeni) FROM dbo._TabVyroba_Objednavky o WHERE o.Splneno=0 AND o.OdmitnutoSkladem=0 AND o.NocniObjednavka=0 AND o.Storno=0 AND o.Vratka=0
                           AND o.JeMaterial=0 AND o.Blokovano=0 AND (o.Mnozstvi-ISNULL( (SELECT SUM(Mnozstvi) FROM dbo._TabVyroba_Objednavky_Pol WHERE IDHlava=o.ID), 0))>0
                         )
 END
SET @datumDokladuFin = ISNULL(@datumDokladuFin, GETDATE())





IF (@genDokladMat=1) OR (@genDokladFin=1)
 BEGIN

  DECLARE m CURSOR LOCAL FAST_FORWARD FOR
   SELECT DISTINCT(JeMaterial)
    FROM dbo._TabVyroba_Objednavky
    WHERE Splneno=0
      AND OdmitnutoSkladem=0
      AND NocniObjednavka=0
      AND Storno=0
      AND Vratka=0
      AND Blokovano=0
    GROUP BY JeMaterial
  OPEN m
  WHILE (1=1)
   BEGIN
    FETCH NEXT FROM m INTO @material
    IF (@@FETCH_STATUS<>0) BREAK

    SET @cnt = (SELECT COUNT(d.ID) FROM dbo.TabDokladyZbozi d JOIN dbo.TabDokladyZbozi_EXT de ON (de.ID=d.ID) WHERE d.IDSklad=@cilovySklad AND d.RadaDokladu=@radaDokl
                  AND CAST(d.DatPorizeni AS DATE)=IIF(@material=0, CAST(@datumDokladuMat AS DATE), CAST(@datumDokladuFin AS DATE)) AND d.BlokovaniEditoru IS NULL
                  AND d.DruhPohybuZbo=@druhPohybuZbo AND d.Realizovano=0 AND de._Vyroba_ObjednavkaMat_Typ=(@material+1)
               )
    IF (@cnt<=1)
     BEGIN

      IF (@material=0)
       IF (@idDokladFin IS NULL)
         SET @idDoklad = (SELECT d.ID FROM dbo.TabDokladyZbozi d JOIN dbo.TabDokladyZbozi_EXT de ON (de.ID=d.ID) WHERE d.IDSklad=@cilovySklad AND d.RadaDokladu=@radaDokl
                           AND CAST(d.DatPorizeni AS DATE)=CAST(@datumDokladuFin AS DATE) AND d.DruhPohybuZbo=@druhPohybuZbo AND d.Realizovano=0 AND de._Vyroba_ObjednavkaMat_Typ=2
                           AND d.BlokovaniEditoru IS NULL AND de._Vydej_ObjednavkaMat=1
                         )
        ELSE
         SET @idDoklad = @idDokladFin

      IF (@material=1)
       IF (@idDokladMat IS NULL)
         SET @idDoklad = (SELECT d.ID FROM dbo.TabDokladyZbozi d JOIN dbo.TabDokladyZbozi_EXT de ON (de.ID=d.ID) WHERE d.IDSklad=@cilovySklad AND d.RadaDokladu=@radaDokl
                           AND CAST(d.DatPorizeni AS DATE)=CAST(@datumDokladuMat AS DATE) AND d.DruhPohybuZbo=@druhPohybuZbo AND d.Realizovano=0 AND de._Vyroba_ObjednavkaMat_Typ=1
                           AND d.BlokovaniEditoru IS NULL AND de._Vydej_ObjednavkaMat=1
                         )
        ELSE
         SET @idDoklad = @idDokladMat


      IF (@idDoklad IS NULL)
       BEGIN
        IF (@material=0) AND (@genDokladFin=1)
         EXEC dbo.hp_InsertHlavickyOZ @Ident=@idDoklad OUT, @Sklad=@skladFin, @DruhPohybu=@druhPohybuZbo, @RadaDokladu=@radaDokl, @CisloOrg=@cOrg, @DatumPorizeni=@datumDokladuFin
        IF (@material=1) AND (@genDokladMat=1)
         EXEC dbo.hp_InsertHlavickyOZ @Ident=@idDoklad OUT, @Sklad=@skladMat, @DruhPohybu=@druhPohybuZbo, @RadaDokladu=@radaDokl, @CisloOrg=@cOrg, @DatumPorizeni=@datumDokladuMat
        IF (@idDoklad IS NOT NULL)
         BEGIN
          IF NOT EXISTS (SELECT 1 FROM dbo.TabDOkladyZbozi_EXT WHERE ID=@idDoklad)
           INSERT dbo.TabDokladyZbozi_EXT (ID) VALUES (@idDoklad)
          UPDATE dbo.TabDokladyZbozi_EXT SET _Vydej_ObjednavkaMat=1 WHERE ID=@idDoklad
          IF (@material=0)
            SET @idDokladFin = @idDoklad
           ELSE
            SET @idDokladMat = @idDoklad
         END
       END


      SELECT @dzMena=Mena, @dzKurz=Kurz, @dzKurzEur=KurzEuro, @vstC=VstupniCena, @jednM=JednotkaMeny
        FROM dbo.TabDokladyZbozi WHERE ID=@idDoklad

      IF (@idDoklad IS NOT NULL)
       BEGIN
        DECLARE c CURSOR LOCAL FOR
         SELECT ID, SkupZbo, RegCis, IDKmenZbozi, Mnozstvi, PaletovyList, Sarze
          FROM dbo._TabVyroba_Objednavky
          WHERE Splneno=0
            AND OdmitnutoSkladem=0
            AND NocniObjednavka=0
            AND Storno=0
            AND Vratka=0
            AND Blokovano=0
            AND JeMaterial=@material
          ORDER BY DatPorizeni
        OPEN c
        WHILE (1=1)
         BEGIN
          FETCH NEXT FROM c INTO @idObj, @sz, @rc, @idKmen, @mnoz, @paletList, @sarze
          IF (@@FETCH_STATUS<>0) BREAK

          SET @mnozVydano = ISNULL( (SELECT SUM(Mnozstvi) FROM dbo._TabVyroba_Objednavky_Pol WHERE IDHlava=@idObj), 0)
          SET @mnoz = @mnoz - @mnozVydano
          IF (@mnoz>0)
           BEGIN
            SET @idZboSklad = NULL
            IF (@material=0)
              SET @idZboSklad = (SELECT ID FROM dbo.TabStavSkladu WHERE IDKmenZbozi=@idKZ AND IDSklad=@skladFin)
             ELSE
              SET @idZboSklad = (SELECT ID FROM dbo.TabStavSkladu WHERE IDKmenZbozi=@idKZ AND IDSklad=@skladMat)
            IF (@idZboSklad IS NULL)
             IF (@material=0)
               EXEC dbo.hp_InsertStavSkladu @IDKmen=@idKZ, @IDSklad=@skladFin, @IDZboSklad=@idZboSklad OUT
              ELSE
               EXEC dbo.hp_InsertStavSkladu @IDKmen=@idKZ, @IDSklad=@skladMat, @IDZboSklad=@idZboSklad OUT
            IF (@idZboSklad IS NOT NULL)
             BEGIN
              EXEC dbo.hp_InsertPolozkyOZ @Ident=@idPZ OUT, @IDDoklad=@idDoklad, @DruhPohybu=@druhPohybuZbo, @CisloOrg=@cOrg, @IDZboSklad=@idZboSklad,
                                          @Mena=@dzMena, @Kurz=@dzKurz, @KurzEuro=@dzKurzEur, @JednotkaMeny=@jednM, @SazbaSD=NULL, @SazbaDPH=NULL,
                                          @ZakazanoDPH=0, @VstupniCena=@vstC, @PovolitDuplicitu=1, @Mnozstvi@=mnoz
              IF (@idPZ IS NOT NULL)
               BEGIN
                INSERT dbo._TabVyroba_Objednavky_Pol (IDHlava, IDDokladOZ, IDPohybOZ, Mnozstvi, Sarze, PaletovyList, SkupZbo, RegCis)
                 SELECT @idObj, @idDoklad, @idPZ, @mnoz, @sarze, @paletList, @sz, @rc

                SET @paletList = ISNULL(@paletList, N'')
                SET @sarze = ISNULL(@sarze, N'')
                IF (@paletList<>N'')
                 BEGIN
                  IF NOT EXISTS (SELECT 1 FROM dbo.TabPohybyZbozi_EXT WHERE ID=@idPZ)
                   INSERT dbo.TabPohybyZbozi_EXT (ID) VALUES (@idPZ)
                  UPDATE dbo.TabPohybyZbozi_EXT SET _Vyroba_PaletList=@paletList, _Vyroba_Sarze=@sarze WHERE ID=@idPZ
                 END
               END  -- @idPZ IS NOT NULL

             END  -- @idSS IS NOT NULL

           END  -- @mnoz>0

         END
        CLOSE c
        DEALLOCATE c

       END  -- @idDoklad IS NOT NULL
     END  -- @cnt<=1

   END
  CLOSE m
  DEALLOCATE m
  
 END  -- mam neco k zapsani ?




IF OBJECT_ID(N'dbo.ep_Vyroba_GenObjednavkuMatDoVyroby2', 'P') IS NOT NULL
 EXEC dbo.ep_Vyroba_GenObjednavkuMatDoVyroby2 @idDoklad



-- oznac splnene polozky
DECLARE c CURSOR LOCAL FAST_FORWARD FOR
 SELECT ID, Mnozstvi
  FROM dbo._TabVyroba_Objednavky
  WHERE Splneno=0
    AND Vratka=0
    AND Storno=0
    AND OdmitnutoSkladem=0
OPEN c
WHILE (1=1)
 BEGIN
  FETCH NEXT FROM c INTO @idObj, @mnoz
  IF (@@FETCH_STATUS<>0) BREAK

  SET @mnozVydano = ISNULL( (SELECT SUM(op.Mnozstvi) FROM dbo._TabVyroba_Objednavky_Pol op JOIN dbo.TabPohybyZbozi p ON (p.ID=op.IDPohybOZ)
                              WHERE op.IDHlava=@idObj AND p.SkutecneDatReal IS NOT NULL), 0)
  IF (@mnoz=@mnozVydano)
   UPDATE dbo._TabVyroba_Objednavky SET Splneno=1 WHERE ID=@idObj

 END
CLOSE c
DEALLOCATE c

