-- dbo.ep_Vyroba_DoplnSkladProVydejDleDokladu
CREATE PROCEDURE dbo.ep_Vyroba_DoplnSkladProVydejDleDokladu
   @IDDoklad INT,
   @errMsg NVARCHAR(500)=N'' OUT
AS

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

SET NOCOUNT ON


IF EXISTS(SELECT 1 FROM dbo.TabDokladyZbozi WHERE Realizovano=1)
 RETURN



DECLARE
 @tranPred INT,
 @uziv INT,
 @bChyba BIT

DECLARE
 @sklad NVARCHAR(30),
 @datPorizeni DATETIME,
 @datNasklad DATETIME,
 @idDZ INT,
 @idPZ INT,
 @idKZ INT,
 @idSS INT,
 @idSSPek INT,
 @prepKoef NUMERIC(19,6),
 @mnozPZ NUMERIC(19,6),
 @mnozSkl NUMERIC(19,6),
 @mnozNevyd NUMERIC(19,6),
 @mnozChybi NUMERIC(19,6)
DECLARE
 @sklMatHlavni NVARCHAR(30),
 @sklTechnolog NVARCHAR(30),
 @sklPekarna NVARCHAR(30),
 @poslSarze NVARCHAR(100),
 @poslPalList NVARCHAR(100)

DECLARE
 @idDZNew INT,
 @idPZNew INT,
 @rDokl NVARCHAR(3)=N'292',   -- rada dokladu pro prijem "nedostatecneho materialu" -> "Příjemka - vyrovnání do normy"
 @dpz TINYINT,
 @mnoz NUMERIC(19,6),
 @vstC TINYINT,
 @menaDZ NVARCHAR(3),
 @kurzDZ NUMERIC(19,6),
 @kurzE NUMERIC(19,6),
 @jednM INT


DECLARE @pol TABLE (IDZboSklad INT NOT NULL, Mnozstvi NUMERIC(19,6) NOT NULL DEFAULT 0.0, Sarze NVARCHAR(100), PaletList NVARCHAR(100) )
DELETE FROM @pol


SET @uziv = 0

IF (@sklMatHlavni IS NULL)
 SELECT @sklMatHlavni=Cislo FROM dbo.TabStrom WHERE Nazev=N'Hlavní sklad - Materiál'
IF (@sklTechnolog IS NULL)
 SELECT @sklTechnolog=Cislo FROM dbo.TabStrom WHERE Nazev LIKE N'Technolog%NOVÝ% sklad%výdej%'
IF (@sklTechnolog IS NULL)
 SELECT @sklTechnolog=Cislo FROM dbo.TabStrom WHERE Nazev LIKE N'Technolog%sklad%výdej%'
IF (@sklPekarna IS NULL)
 SELECT @sklPekarna=Cislo FROM dbo.TabStrom WHERE Nazev LIKE N'Výroba - Pekárna'




DECLARE c CURSOR LOCAL FOR
 SELECT p.ID, p.IDDoklad, p.IDZboSklad, p.Mnozstvi, p.PrepMnozstvi, s.IDKmenZbozi, d.IDSklad, d.DatPorizeni
  FROM dbo.TabPohybyZbozi p
   INNER JOIN dbo.TabDokladyZbozi d ON (d.ID=p.IDDoklad)
   INNER JOIN dbo.TabStavSkladu s ON (s.ID=p.IDZboSklad)
  WHERE d.ID=@IDDoklad
OPEN c
WHILE (1=1)
 BEGIN
  FETCH NEXT FROM c INTO @idPZ, @idDZ, @idSS, @mnozPZ, @prepKoef, @idKZ, @sklad, @datPorizeni
  IF (@@FETCH_STATUS<>0) BREAK

  SET @mnozPZ = @mnozPZ * @prepKoef
  SET @mnozNevyd = ISNULL( (SELECT SUM(p.Mnozstvi*p.PrepMnozstvi) FROM dbo.TabPohybyZbozi p
                              INNER JOIN dbo.TabDokladyZbozi d ON (d.ID=p.IDDoklad)
                             WHERE p.IDZboSklad=@idSS
                               AND p.IDDoklad<>@idDZ
                               AND p.Mnozstvi>0
                               AND d.DruhPohybuZbo IN (2,4)
                               AND d.Realizovano=0
                               AND d.DatPorizeni<@datPorizeni)
                         , 0)
  SET @mnozSkl = ISNULL( (SELECT Mnozstvi FROM dbo.TabStavSkladu WHERE ID=@idSS), 0)
  SET @mnozChybi = @mnozSkl - @mnozPZ - @mnozNevyd
  IF (@mnozChybi>0)
   BEGIN
    SET @idSSPek = NULL
    IF (@sklPekarna IS NOT NULL)
     SELECT @idSSPek=ID FROM dbo.TabStavSkladu WHERE IDSklad=@sklPekarna AND IDKmenZbozi=@idKZ
    SELECT @poslSarze=_Prevod_PosledniSarze, @poslPalList=_Prevod_PosledniPaletList
     FROM dbo.TabStavSkladu_EXT WHERE ID=@idSSPek

    UPDATE @pol SET Mnozstvi = Mnozstvi + @mnozChybi WHERE IDZboSklad=@idSS
    IF (@@ROWCOUNT=0)
     INSERT @pol (IDZboSklad, Mnozstvi, Sarze, PaletList) SELECT @idSS, @mnozChybi, @poslSarze, @poslPalList
   END

 END
CLOSE c
DEALLOCATE c


-- pokud mam polozky na doplneni, udelej doklad a realizuj ho
IF EXISTS(SELECT 1 FROM @pol)
 BEGIN
  BEGIN TRY
   SET @tranPred=@@TRANCOUNT
   IF (@tranPred=0)
    BEGIN TRAN

   SET @datNasklad = (SELECT MIN(d.DatPorizeni) FROM dbo.TabPohybyZbozi p INNER JOIN dbo.TabDokladyZbozi d ON (d.ID=p.IDDoklad)
                       WHERE p.Mnozstvi>0 AND d.DruhPohybuZbo IN (2,4) AND d.Realizovano=0 AND p.IDZboSklad IN (SELECT IDZboSklad FROM @pol))
   IF (@datNasklad IS NULL)
    SET @datNasklad = DATEADD(second, -5, @datPorizeni)

   SET @dpz=0
   EXEC dbo.hp_InsertHlavickyOZ @ident=@idDZNew OUT, @Sklad=@sklad, @DruhPohybu=@dpz, @RadaDokladu=@rDokl, @CisloOrg=0, @DatumPorizeni=@datNasklad
   IF (@idDZNew IS NOT NULL)
    BEGIN
     SELECT @menaDZ=Mena, @vstC=VstupniCena, @kurzDZ=Kurz, @kurzE=KurzEuro, @jednM=JednotkaMeny FROM dbo.TabDokladyZbozi WHERE ID=@idDZNew

     DECLARE c CURSOR LOCAL FOR
      SELECT IDZboSklad, Mnozstvi, ISNULL(Sarze,N''), ISNULL(PaletList,N'') FROM @pol
     OPEN c
     WHILE (1=1)
      BEGIN
       FETCH NEXT FROM c INTO @idSS, @mnoz, @poslSarze, @poslPalList
       IF (@@FETCH_STATUS<>0) BREAK

       EXEC dbo.hp_InsertPolozkyOZ @ident=@idPZNew OUT, @IDDoklad=@idDZNew, @DruhPohybu=@dpz, @CisloOrg=0, @IDZboSklad=@idSS, @Mena=@menaDZ,
                                   @Kurz=@kurzDZ, @KurzEuro=@kurzE, @JednotkaMeny=@jednM, @SazbaSD=NULL, @SazbaDPH=NULL, @ZakazanoDPH=0,
                                   @VstupniCena=@vstC, @Mnozstvi=@mnoz
       IF (@idPZNew IS NOT NULL)
        BEGIN
         IF (@poslSarze<>N'') OR (@poslPalList<>N'')
          BEGIN
           IF NOT EXISTS(SELECT 1 FROM dbo.TabPohybyZbozi_EXT WHERE ID=@idPZNew)
            INSERT dbo.TabPohybyZbozi_EXT (ID) VALUES (@idPZNew)
           UPDATE dbo.TabPohybyZbozi_EXT SET _Vyroba_Sarze=@poslSarze, _Vyroba_PaletList=@poslPalList WHERE ID=@idPZNew
          END
        END

      END
     CLOSE c
     DEALLOCATE c

     UPDATE dbo.TabDokladyZbozi SET BlokovaniEditoru=NULL WHERE ID=@idDZNew
     EXEC dbo.hp_VypCenOZPolozek_IDDokladu @IDDoklad=@idDZ, @AktualizaceSlev=0
-- realizace
     EXEC dbo.hp_Realizuj_Prijem @ID=@idDZNew, @DatumRealizace=@datNasklad, @Uzivatel=@uziv, @BylaChyba=@bChyba OUT

    END
   IF (@tranPred=0) AND (@@TRANCOUNT>0)
    COMMIT TRAN
  END TRY
  BEGIN CATCH
   SET @errMsg = ERROR_MESSAGE()
   IF (@tranPred=0) AND (@@TRANCOUNT>0)
    ROLLBACK TRAN
  END CATCH
 END



