-- dbo.ep_Vyroba_GenVydejZeMzdy
CREATE PROCEDURE dbo.ep_Vyroba_GenVydejZeMzdy
      @IDMzdy INT=NULL,
      @IDDoklad INT=NULL,
      @spotrebaTesto BIT=0,
      @spotreba702 BIT=0,
      @smazVydejTesto BIT=0,
      @errMsg NVARCHAR(500)=N'' OUT,
      @extTab NVARCHAR(50)=NULL,
      @vydejAll BIT=0,
      @realizujVydej BIT=0,
      @denSmena NVARCHAR(15)=NULL,
      @sklVydej NVARCHAR(30)=N'321',
      @radaVydej NVARCHAR(3)=N'223'
AS

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

-- @extTab - tabulka, do ktere budou vraceny pohyby vydejky @extTab (ID INT NOT NULL, IDPohZbo INT NOT NULL)
-- @vydejAll - bude vydano vse, nejen kde jde splnena podminka TabPrKVazby - dbo.hf_GetPrPDokladForPrKV(PrKV.ID)=@PrP_Doklad
-- pokud existuje objekt #HDCTabPrKVazbyGenPredna, jedu vydej podle nej


SET NOCOUNT ON

DECLARE
 @bChyba BIT,
 @retVal INT=0,
 @errID int,
 @sql NVARCHAR(1000),
 @idUziv INT=0,
 @idZam INT,
 @sklTechnolog NVARCHAR(30),
 @sklMatHlavni NVARCHAR(30),
 @sklPekarna NVARCHAR(30),
 @szDilec NVARCHAR(3)



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)
  

SET @denSmena = ISNULL(@denSmena, N'')
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'Technologický sklad%výdej%'
IF (@sklPekarna IS NULL)
 SELECT @sklPekarna=Cislo FROM dbo.TabStrom WHERE Nazev LIKE N'Výroba - Pekárna'


IF EXISTS(SELECT 1 FROM dbo.TabPrikazMzdyAZmetky)
  BEGIN
   SELECT @retVal=MAX(ID) FROM dbo.TabPrikazMzdyAZmetky
   DBCC CHECKIDENT(TabPrikazMzdyAZmetky, RESEED, @retVal)
  END
 ELSE
  DBCC CHECKIDENT(TabPrikazMzdyAZmetky, RESEED, 1)


DROP TABLE IF EXISTS #TabPrKVazbyGen
CREATE TABLE #TabPrKVazbyGen (
 ID INT IDENTITY NOT NULL,
 Generuj BIT NOT NULL DEFAULT 1,
 PoKorekciDat BIT NOT NULL DEFAULT 0,
 IDPrKV INT NOT NULL,
 Doklad INT NOT NULL,
 IDPrikaz INT NOT NULL,
 Prednastaveno BIT NOT NULL DEFAULT 1,
 Sklad NVARCHAR(30) NULL,
 VyrStredisko NVARCHAR(30) NULL,
 IDPracoviste INT NULL,
 mnoz_zad NUMERIC(19,6) NOT NULL DEFAULT 0,
 Mnoz_nepotrebne NUMERIC(19,6) NOT NULL DEFAULT 0,
 Mnoz_skut_realizovane NUMERIC(19,6) NOT NULL DEFAULT 0,
 Cena_real NUMERIC(19,6) NOT NULL DEFAULT 0,
 Mnoz_odv NUMERIC(19,6) NOT NULL DEFAULT 0,
 Cena_odv NUMERIC(19,6) NOT NULL DEFAULT 0,
 MnozstviMax NUMERIC(19,6) NULL,
 PuvodniMnozstviPoz NUMERIC(19,6) NULL,
 MnozstviPoz NUMERIC(19,6) NOT NULL,
 PomMnozPoz NUMERIC(19,6) NOT NULL DEFAULT 0,
 IDPohZbo INT NULL,
 PoznamkaNaDoklad NVARCHAR(max) NULL,
 priorita INT NOT NULL DEFAULT 0,
 vyssi INT NOT NULL,
 nizsi INT NOT NULL,
 DavkaTPV NUMERIC(19,6) NOT NULL DEFAULT 1,
 pozice NVARCHAR(100) NULL DEFAULT N'',
 Operace NCHAR(4) NULL,
 FixniMnozstvi NUMERIC(19,6) NOT NULL DEFAULT 0,
 mnozstvi NUMERIC(19,6) NOT NULL DEFAULT 1,
 ProcZtrat NUMERIC(5,2) NOT NULL DEFAULT 0,
 mnozstviSeZtratou NUMERIC(19,6) NOT NULL DEFAULT 0,
 Prirez NUMERIC(19,6) NOT NULL DEFAULT 1,
 Poznamka NTEXT NULL,
 pom_pomer_A NUMERIC(19,6) NULL,
 pom_pomer_B NUMERIC(19,6) NULL,
 Dodavatel INT NULL,
 MJ NVARCHAR(10) NULL,
 mnoz_pozadovane AS (CONVERT(numeric(19,6),(CASE WHEN [mnoz_nepotrebne]>[mnoz_zad] THEN 0.0 ELSE [mnoz_zad] - [mnoz_nepotrebne] END))),
 PRIMARY KEY (ID)
)



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



DROP TABLE IF EXISTS #TabPrKVazbyGenVC
CREATE TABLE #TabPrKVazbyGenVC (
 ID INT IDENTITY NOT NULL,
 IDPolozky INT NOT NULL,
 VyrCislo NVARCHAR(100) NOT NULL,
 Mnozstvi NUMERIC(19,6) NOT NULL,
 Sklad NVARCHAR(30) NULL,
 IDKmenZbozi INT NULL,
 IDVyrCP INT NULL,
 PRIMARY KEY(ID)
)







DECLARE
 @RespektovatExistEvid bit=0,
 @idDilec INT,
 @IDPrikaz int=NULL,
 @IDPrPostup INT=NULL,
 @mnozstviPomer_A numeric(19,6),
 @mnozstviPomer_B numeric(19,6),
 @IDPrKV int,
 @mnoz_zad numeric(19,6),
 @PrKVDoklad int,
 @PocetVazeb int,
 @PrP_Doklad int





SELECT @errID=NULL, @errMsg='', @PocetVazeb=0 
SELECT @IDPrikaz=MZ.IDPrikaz, @mnozstviPomer_A=(MZ.kusy_odv+MZ.kusy_zmet_opr+MZ.kusy_zmet_neopr), @mnozstviPomer_B=PrP.kusy_zad, @PrP_Doklad=PrP.Doklad,
       @IDPrPostup=PrP.ID, @szDilec=k.SkupZbo
  FROM dbo.TabPrikazMzdyAZmetky MZ 
   INNER JOIN dbo.TabPrPostup PrP ON (PrP.IDPrikaz=MZ.IDPrikaz AND PrP.Doklad=MZ.DokladPrPostup AND PrP.Alt=MZ.AltPrPostup AND PrP.IDOdchylkyDo IS NULL)
   INNER JOIN dbo.TabPrikaz vp ON (vp.ID=MZ.IDPrikaz)
   INNER JOIN dbo.TabKmenZbozi k ON (k.ID=vp.IDTabKmen)
  WHERE MZ.ID=@IDMzdy 

UPDATE dbo.TabPrikazMzdyAZmetky SET GenerovanaMatVydejka=1 WHERE ID=@IDMzdy
-- pokud uz byla generovana vydejka, skonci
IF (@@ROWCOUNT=0)
  RETURN 0


SELECT @idZam=Zamestnanec FROM dbo.TabPrikazMzdyAZmetky WHERE ID=@IDMzdy
SELECT @idDilec = IDTabKmen FROM dbo.TabPrikaz WHERE ID=@IDPrikaz



IF OBJECT_ID(N'tempdb..#HDCTabPrKVazbyGenPredna', N'U') IS NULL
  BEGIN
   IF (@mnozstviPomer_A<=0.0)
    RETURN -1

   IF (@vydejAll=1)
     DECLARE crPom1334 CURSOR FAST_FORWARD LOCAL FOR 
      SELECT PrKV.ID, PrKV.Mnoz_zad, PrKV.Doklad 
        FROM dbo.TabPrKVazby PrKV 
         INNER JOIN dbo.TabPrikaz P ON (P.ID=PrKV.IDPrikaz) 
         INNER JOIN dbo.TabRadyPrikazu RP ON (RP.rada=P.rada) 
         INNER JOIN dbo.TabKmenZbozi KZ ON (KZ.ID=PrKV.nizsi AND KZ.sluzba=0) 
        WHERE P.StavPrikazu IN (30,50) AND (P.kusy_zive>0.0 OR RP.KontrolovatRozpracPriUzav=0) AND PrKV.predzpracovano=0 AND PrKV.uzavreno=0 AND PrKV.RezijniMat=0 AND 
              PrKV.IDPrikaz=@IDPrikaz AND PrKV.prednastaveno=1 AND PrKV.IDOdchylkyDo IS NULL 
    ELSE
     DECLARE crPom1334 CURSOR FAST_FORWARD LOCAL FOR 
      SELECT PrKV.ID, PrKV.Mnoz_zad, PrKV.Doklad 
        FROM dbo.TabPrKVazby PrKV 
         INNER JOIN dbo.TabPrikaz P ON (P.ID=PrKV.IDPrikaz) 
         INNER JOIN dbo.TabRadyPrikazu RP ON (RP.rada=P.rada) 
         INNER JOIN dbo.TabKmenZbozi KZ ON (KZ.ID=PrKV.nizsi AND KZ.sluzba=0) 
        WHERE P.StavPrikazu IN (30,50) AND (P.kusy_zive>0.0 OR RP.KontrolovatRozpracPriUzav=0) AND PrKV.predzpracovano=0 AND PrKV.uzavreno=0 AND PrKV.RezijniMat=0 AND 
              PrKV.IDPrikaz=@IDPrikaz AND dbo.hf_GetPrPDokladForPrKV(PrKV.ID)=@PrP_Doklad AND PrKV.prednastaveno=1 AND PrKV.IDOdchylkyDo IS NULL 
   OPEN crPom1334 
   FETCH NEXT FROM crPom1334 INTO @IDPrKV, @Mnoz_zad, @PrKVDoklad 
   WHILE @@fetch_status=0 
     BEGIN 
       UPDATE #TabPrKVazbyGen SET MnozstviPoz=@mnoz_zad * (pom_pomer_A+@mnozstviPomer_A)/pom_pomer_B, pom_pomer_A=pom_pomer_A+@mnozstviPomer_A 
         WHERE IDPrKV=@IDPrKV 
       IF (@@ROWCOUNT=0) 
         BEGIN 
           IF @RespektovatExistEvid=1 
             SELECT @mnozstviPomer_A=SUM(MZ.kusy_odv+MZ.kusy_zmet_opr+MZ.kusy_zmet_neopr)
              FROM dbo.TabPrikazMzdyAZmetky MZ WHERE MZ.IDPrikaz=@IDPrikaz AND MZ.DokladPrPostup=@PrP_Doklad AND MZ.GenerovanaMatVydejka=1 
           INSERT INTO #TabPrKVazbyGen (IDPrKV,  MnozstviPoz, pom_pomer_A, pom_pomer_B, Doklad, IDPrikaz, Prednastaveno, Sklad, VyrStredisko, IDPracoviste, mnoz_zad,
                                        Mnoz_nepotrebne, Mnoz_skut_realizovane, Cena_real, Mnoz_odv, Cena_odv, priorita, vyssi, nizsi, DavkaTPV, pozice, Operace, FixniMnozstvi,
                                        mnozstvi, ProcZtrat, mnozstviSeZtratou, Prirez, Poznamka) 
             SELECT PrKV.ID, 
                    PrKV.mnoz_zad * @mnozstviPomer_A/@mnozstviPomer_B, 
                    @mnozstviPomer_A, @mnozstviPomer_B, 
                    PrKV.Doklad, PrKV.IDPrikaz, PrKV.Prednastaveno, PrKV.Sklad, PrKV.VyrStredisko, PrKV.IDPracoviste, PrKV.mnoz_zad, PrKV.Mnoz_nepotrebne,
                    PrKV.Mnoz_skut_realizovane, PrKV.Cena_real, PrKV.Mnoz_odv, PrKV.Cena_odv, PrKV.priorita, PrKV.vyssi, PrKV.nizsi, PrKV.DavkaTPV, PrKV.pozice, PrKV.Operace, PrKV.FixniMnozstvi,
                    PrKV.mnozstvi, PrKV.ProcZtrat, PrKV.mnozstviSeZtratou, PrKV.Prirez, PrKV.Poznamka 
               FROM dbo.TabPrKVazby PrKV 
               WHERE PrKV.ID=@IDPrKV AND PrKV.uzavreno=0
         END 
       INSERT INTO #TabPrKVazbyGen_IDMzdy (IDPrikaz, Doklad, IDMzdy) VALUES (@IDPrikaz, @PrKVDoklad, @IDMzdy) 
       SET @PocetVazeb=@PocetVazeb + 1 
       FETCH NEXT FROM crPom1334 INTO @IDPrKV, @Mnoz_zad, @PrKVDoklad 
     END 
   CLOSE crPom1334 
   DEALLOCATE crPom1334 

   IF (@PocetVazeb<=0)
    RETURN -2

  END
 ELSE
  BEGIN -- pokud mam seznam na co vygenerovat vydejku, jedu podle nej
   DELETE FROM #TabPrKVazbyGen
   INSERT INTO #TabPrKVazbyGen
    SELECT Generuj, PoKorekciDat, IDPrKV, Doklad, IDPrikaz, Prednastaveno, Sklad, VyrStredisko, IDPracoviste, mnoz_zad, Mnoz_nepotrebne, Mnoz_skut_realizovane,
           Cena_real, Mnoz_odv, Cena_odv, MnozstviMax, PuvodniMnozstviPoz, MnozstviPoz, PomMnozPoz, IDPohZbo, PoznamkaNaDoklad, priorita, vyssi, nizsi, DavkaTPV,
           pozice, Operace, FixniMnozstvi, mnozstvi, ProcZtrat, mnozstviSeZtratou, Prirez, Poznamka, pom_pomer_A, pom_pomer_B, Dodavatel
     FROM #HDCTabPrKVazbyGenPredna
   DROP TABLE #HDCTabPrKVazbyGenPredna
  END

-- preddefinovana mzda pro provazani
IF OBJECT_ID(N'tempdb..#HDCTabPrKVazbyGen_IDMzdyPredna', N'U') IS NOT NULL
 BEGIN
  DELETE FROM #TabPrKVazbyGen_IDMzdy
  INSERT INTO #TabPrKVazbyGen_IDMzdy
   SELECT IDPrikaz, Doklad, IDMzdy FROM #HDCTabPrKVazbyGen_IDMzdyPredna
  DROP TABLE #HDCTabPrKVazbyGen_IDMzdyPredna
 END



EXEC dbo.hp_AktualizaceTabPrKVazbyGenVC @Vratka=0
UPDATE #TabPrKVazbyGen SET Generuj=1, Sklad=@sklVydej


IF (@smazVydejTesto=1)
 IF (@szDilec<>N'701') AND EXISTS (SELECT 1 FROM dbo.TabPrikaz p INNER JOIN dbo.TabKmenZbozi k ON (k.ID=p.IDTabKmen) WHERE p.IDPrikazVyssi=@IDPrikaz AND k.SkupZbo=N'701')
  DELETE FROM #TabPrKVazbyGen WHERE vyssi=@idDilec AND nizsi IN (SELECT ID FROM dbo.TabKmenZbozi WHERE SkupZbo=N'701')


DROP TABLE IF EXISTS #TabGenRezVyd
CREATE TABLE #TabGenRezVyd (ID int NOT NULL, PRIMARY KEY (ID))


BEGIN TRY
 EXEC @retVal=dbo.hp_generujRezVyd @RadaDokladu=@radaVydej, @DruhPohybuZbo=NULL, @IDObdobi=0, @DatPorizeni=NULL, @SekejZakazky=0, @SekejPrikazy=0,
                                   @IDExistDoklad=@IDDoklad, @SekejOperace=0
END TRY
BEGIN CATCH
 SET @errMsg = 'Chyba generovani vydeje: ' + ERROR_MESSAGE()
END CATCH





DECLARE
 @idVyd INT,
 @idKZ INT,
 @idPZ INT,
 @idSS INT,
 @poslSarze NVARCHAR(100),
 @errMsg702 NVARCHAR(500),
 @idKZ702 INT,
 @idPrikaz702 INT,
 @doklKV702 INT,
 @doklOp702 INT,
 @alt702 NCHAR(1),
 @mnoz702 NUMERIC(19,6),
 @idMzda702 INT,
 @aktDat DATETIME

SET @aktDat = GETDATE()


-- potrebuju si vyrobit tisicikus ? musim pred realizaci vydejky na vyssi prikaz, udelam odvedenim prikazu na vyssi
/*
IF (@spotreba702=1)
 BEGIN
  DECLARE t CURSOR LOCAL FOR
   SELECT k.ID, p.Mnozstvi
     FROM dbo.TabPohybyZbozi p
      INNER JOIN dbo.TabStavSkladu s ON (s.ID=p.IDZboSklad)
      INNER JOIN dbo.TabKmenZbozi k ON (k.ID=s.IDKmenZbozi)
    WHERE k.SkupZbo=N'702' AND k.Blokovano=0
  OPEN t
  WHILE (1=1)
   BEGIN
    FETCH NEXT FROM t INTO @idKZ702, @mnoz702
    IF (@@FETCH_STATUS<>0) BREAK

    SET @idPrikaz702 = (SELECT ID FROM dbo.TabPrikaz WHERE IDPrikazVyssi=@IDPrikaz AND IDTabKmen=@idKZ702 AND StavPrikazu=30)
    IF (@idPrikaz702 IS NOT NULL)
     BEGIN
-- evidence operace peceni
      SELECT TOP(1) @doklOp702=Doklad, @alt702=Alt FROM dbo.TabPrPostup WHERE IDOdchylkyDo IS NULL AND IDPrikaz=@idPrikaz702
      EXEC @idMzda702=dbo.hp_ZaevidujOperaci @IDPrikaz=@idPrikaz702, @Doklad=@doklOp702, @Alt=@alt702, @Datum=NULL, @Stav=1, @IDZam=@idZam, @Kusy_odv=@mnoz702
      SET @idMzda702 = ISNULL(@idMzda702, 0)
      IF (@idMzda702>0)
       BEGIN
-- vydejku materialu nedelej, testo bylo uz odepsano svym prevedenim na vyssi
--        EXEC dbo.ep_Vyroba_GenVydejZeMzdy @IDMzdy=@idMzda702, @spotrebaTesto=1, @realizujVydej=1, @errMsg=@errMsg702 OUT

        EXEC dbo.ep_Vyroba_GenOdvodZeMzdy @IDMzdy=@idMzda702, @realizujPrijem=1, @errMsg=@errMsg702 OUT
       END
-- odvedeni na vyssi prikaz
      SELECT TOP(1) @doklKV702=Doklad FROM dbo.TabPrKVazby WHERE IDOdchylkyDo IS NULL AND IDPrikaz=@IDPrikaz AND nizsi=@idKZ702
      EXEC dbo.hp_OdvedeniPrikazuPrevodem @DatPripadu=@aktDat, @KonecneOdvedeniNatvrdo=0, @IDPrikazZdroj=@idPrikaz702, @IDPrikazCil=@IDPrikaz,
                                          @Doklad=@doklKV702, @IDDilec=@idKZ702, @mnozstvi=@mnoz702, @IDOdvedeniVC=0
     END
   END
  CLOSE t
  DEALLOCATE t
 END
*/


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

  IF (@denSmena<>N'')
   BEGIN
    IF NOT EXISTS(SELECT 1 FROM dbo.TabDokladyZbozi_EXT WHERE ID=@idVyd)
     INSERT dbo.TabDokladyZbozi_EXT (ID) VALUES (@idVyd)
    UPDATE dbo.TabDokladyZbozi_EXT SET _Vyroba_DenSmena=@denSmena WHERE ID=@idVyd
   END

  DECLARE pV CURSOR LOCAL FOR
   SELECT p.ID, k.ID
    FROM dbo.TabPohybyZbozi p
     INNER JOIN dbo.TabStavSkladu s ON (s.ID=p.IDZboSklad)
     INNER JOIN dbo.TabKmenZbozi k ON (k.ID=s.IDKmenZbozi)
    WHERE p.IDDoklad=@idVyd AND k.Sluzba=0
  OPEN pV
  WHILE (1=1)
   BEGIN
    FETCH NEXT FROM pV INTO @idPZ, @idKZ
    IF (@@FETCH_STATUS<>0) BREAK
    SET @idSS = (SELECT ID FROM dbo.TabStavSkladu WHERE IDKmenZbozi=@idKZ AND IDSklad=@sklPekarna)
    SET @poslSarze = ISNULL( (SELECT _Prevod_PosledniSarze FROM dbo.TabStavSkladu_EXT WHERE ID=@idSS), N'')
    IF (@poslSarze<>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_Sarze=@poslSarze WHERE ID=@idPZ
     END
   END
  CLOSE pV
  DEALLOCATE pV

  IF (@realizujVydej=1)
   BEGIN
    BEGIN TRY
     EXEC dbo.hp_Realizuj_Vydej @ID=@idVyd, @DatumRealizace=NULL, @Uzivatel=@idUziv, @Hlidat=0, @BylaChyba=@bChyba OUT 
    END TRY
    BEGIN CATCH
     SET @errMsg = ERROR_MESSAGE()
     INSERT dbo._hdc_ph_Log (Typ, LogText, IntValue) SELECT 10, N'Chyba realizace výdejky příkazu', @idVyd
    END CATCH
   END

 END
CLOSE vyd
DEALLOCATE vyd




IF (@extTab IS NOT NULL) AND EXISTS(SELECT 1 FROM #TabPrKVazbyGen WHERE IDPohZbo IS NOT NULL)
 IF OBJECT_ID(@extTab, N'U') IS NOT NULL
  BEGIN
   SET @sql = N'DELETE FROM ' + @extTab
   EXECUTE sp_executesql @sql
   SET @sql = N'INSERT ' + @extTab + N' (ID, IDPohZbo) SELECT ID, IDPohZbo FROM #TabPrKVazbyGen WHERE IDPohZbo IS NOT NULL'
   EXECUTE sp_executesql @sql
  END


-- uklid
DROP TABLE IF EXISTS #TabPrKVazbyGen
DROP TABLE IF EXISTS #TabGenRezVyd
DROP TABLE IF EXISTS #TabPrKVazbyGen_IDMzdy
DROP TABLE IF EXISTS #TabPrKVazbyGenVC


