SET TERM ^ ; create or alter procedure SREDIKARTICU ( MAGACINID smallint, ROBAID integer, DATUM_OD date, STOP_NA_MINUS smallint) returns ( OK smallint) as declare variable VRDOK smallint; declare variable BRDOK integer; declare variable STAVKAID integer; declare variable VRDOKOUT smallint; declare variable BRDOKOUT integer; declare variable VRDOKIN smallint; declare variable BRDOKIN integer; declare variable S_PRECENA numeric(15,4); declare variable S_PRENAB numeric(15,4); declare variable S_PROSNAB numeric(15,4); declare variable S_PROSPROD numeric(15,4); declare variable S_PRODCENABP numeric(15,4); declare variable S_NIVKOL numeric(15,3); declare variable SADCENA numeric(15,4); declare variable PRETHNAB numeric(15,4); declare variable PRODCENA numeric(15,4); declare variable PRETHCENA numeric(15,4); declare variable PROSNAB numeric(15,4); declare variable PROSPROD numeric(15,4); declare variable NABCENA numeric(15,4); declare variable NABVRED numeric(15,4); declare variable KOLICINA numeric(15,3); declare variable NABKOL numeric(15,3); declare variable NIVKOL numeric(15,3); declare variable STANJE numeric(15,3); declare variable EVIDSTANJE numeric(15,3); declare variable REZERVISANO numeric(15,3); declare variable PRENETONARN numeric(15,3); declare variable NARUCENO numeric(15,3); declare variable PROSEK smallint; declare variable MAGVRSTA smallint; declare variable MOZEMINUS smallint; declare variable VODISE smallint; declare variable DATUM date; declare variable KURSNADAN numeric(15,4); declare variable MPKZM smallint; declare variable VRSTAROBE smallint; declare variable S_TREN_STANJE numeric(15,3); declare variable PRVI_JANUAR date; declare variable GODINA integer; declare variable SUM_1 numeric(15,2); declare variable SUM_2 numeric(15,2); declare variable SUM_3 numeric(15,2); declare variable SUM_4 numeric(15,2); declare variable DEFINISECENU smallint; declare variable REFVAL varchar(3); declare variable DEVCENA NUMERIC(15,4); declare variable DEVNABCENA NUMERIC(15,4); declare variable S_DEVNABCENA numeric(15,4); declare variable S_DEVPRODCENA numeric(15,4); declare variable PROSDEVNAB numeric(15,4); declare variable DEVIZNAPRODAJNACENA numeric(15,4); declare variable DOK_VALUTA varchar(3); declare variable MAGID_OUT smallint; declare variable MAGID_OUT_OK smallint; declare variable INTKALK_DEVNABCENA numeric(15,4); declare variable REKLAMACIJE numeric(15,3); declare variable REVERSI numeric(15,3); declare variable DAT_ISPORUKE date; declare variable MATPROID integer; declare variable STAVPROID integer; declare variable MATPROCENA numeric(15,4); declare variable MAT_KOL DOUBLE PRECISION; declare variable KALK_BRDOK integer; declare variable GP_ROBAID integer; declare variable GP_NABCENA numeric(15,4); declare variable GP_VODISE smallint; BEGIN SELECT VRSTA FROM ROBA WHERE ROBAID = :ROBAID INTO :VRSTAROBE; OK = 1; IF (:VRSTAROBE in (1, 3)) THEN BEGIN /* Procedura koja sredjuje karticu robe u slucaju izmene stavke kartice koja nije poslednja!!! */ /* Prosecne nabavne cene da ili ne ? */ SELECT PROSEK, VRSTA, MOZEMINUS, VODISE, MPKALKZM FROM MAGACIN WHERE MAGACINID = :MAGACINID INTO :PROSEK, :MAGVRSTA, :MOZEMINUS, :VODISE, :MPKZM; IF (MPKZM IS NULL) THEN MPKZM = 0; PRETHCENA = 0; STANJE = 0; EVIDSTANJE = 0; REZERVISANO = 0; PRENETONARN = 0; NARUCENO = 0; PRETHNAB = 0; EXECUTE PROCEDURE GET_INT_PARAM('godina') RETURNING_VALUES (GODINA); PRVI_JANUAR = CAST('01.01.' || CAST(GODINA AS CHAR(4)) AS DATE); IF (DATUM_OD = PRVI_JANUAR) THEN BEGIN /* Pokupim pocetno stanje */ /* Funkcije resavaju problem visestrukog pocetnog stanja SELECT AVG(S.PRODAJNACENA), AVG(S.NABAVNACENA), SUM(S.KOLICINA), MAX(D.DATUM) FROM STAVKA S LEFT JOIN DOKUMENT D ON S.VRDOK = D.VRDOK AND S.BRDOK = D.BRDOK WHERE S.ROBAID = :ROBAID AND S.MAGACINID = :MAGACINID AND S.VRDOK = 0 AND D.KODDOK = 0 INTO :PRETHCENA, :PRETHNAB, :STANJE, :DATUM; */ PRETHNAB = 0; PRETHCENA = 0; STANJE = 0; DEVIZNAPRODAJNACENA = 0; PROSDEVNAB = 0; END ELSE BEGIN EXECUTE PROCEDURE stanje_do_datuma(:MAGACINID, :ROBAID, :DATUM_OD) returning_values (:PRETHCENA, :PRETHNAB, :STANJE, :DEVNABCENA, :DEVCENA); DEVIZNAPRODAJNACENA = :DEVCENA; PROSDEVNAB = :DEVNABCENA; END IF (PRETHCENA IS NULL) THEN PRETHCENA = 0; IF (STANJE IS NULL) THEN STANJE = 0; IF (PRETHNAB IS NULL) THEN PRETHNAB = 0; NABKOL = STANJE; NABVRED = NABKOL * PRETHNAB; PRODCENA = PRETHCENA; PROSNAB = PRETHNAB; PROSPROD = PRETHCENA; EVIDSTANJE = 0; REZERVISANO = 0; /* Sad idem kroz sve (PREOSTALE) stavke kartice zadate robe */ SELECT VREDNOST FROM parametri WHERE NAZIV = 'poscenval' INTO :REFVAL; FOR SELECT S.STAVKAID, S.VRDOK, S.BRDOK, S.PRODAJNACENA, S.NABAVNACENA, S.KOLICINA, D.DATUM, K.KURS, S.PRECENA, S.PRENAB, S.PROSNAB, S.PROSPROD, S.NIVKOL, S.PRODCENABP, S.TREN_STANJE, S.DEVNABCENA, S.DEVPRODCENA, V.DEFINISECENU, D.VRDOKOUT, D.BRDOKOUT, D.VALUTA, D.VRDOKIN, D.BRDOKIN FROM STAVKA S LEFT JOIN DOKUMENT D ON S.VRDOK = D.VRDOK AND S.BRDOK = D.BRDOK LEFT JOIN VRSTADOK V ON S.VRDOK = V.VRDOK LEFT JOIN KURS(D.DATUM, :REFVAL) K ON 1=1 WHERE S.ROBAID = :ROBAID AND S.MAGACINID = :MAGACINID AND D.DATUM >= :DATUM_OD AND ((D.LINKED <> '9999999999') OR (D.LINKED IS NULL)) AND D.KODDOK = 0 ORDER BY D.DATUM, D.LINKED, V.IO, S.VRDOK, S.BRDOK, S.STAVKAID INTO :STAVKAID, :VRDOK, :BRDOK, :SADCENA, :NABCENA, :KOLICINA, :DATUM, :KURSNADAN, :S_PRECENA, :S_PRENAB, :S_PROSNAB, :S_PROSPROD, :S_NIVKOL, :S_PRODCENABP, :S_TREN_STANJE, :S_DEVNABCENA, :S_DEVPRODCENA, :DEFINISECENU, :VRDOKOUT, :BRDOKOUT, :DOK_VALUTA, :VRDOKIN, :BRDOKIN DO BEGIN /**************************************************/ /**************** POCETNO STANJE ******************/ /**************************************************/ IF (VRDOK = 0) THEN BEGIN NABKOL = ROUNDDEC(:STANJE + :KOLICINA, 3); NABVRED = ROUNDDEC(:PROSNAB * :STANJE + :KOLICINA * :NABCENA, 4); PRODCENA = SADCENA; IF (PROSEK = 1) THEN BEGIN /* racuna se prosecna nabavna */ IF (NABKOL > 0) THEN PROSNAB = ROUNDDEC(:NABVRED / :NABKOL, 4); ELSE PROSNAB = :NABCENA; END ELSE PROSNAB = NABCENA; IF (PROSNAB < 0) THEN PROSNAB = 0; IF ((:S_DEVNABCENA = 0) OR (:S_DEVNABCENA IS NULL)) THEN PROSDEVNAB = ROUNDDEC(:PROSNAB / :KURSNADAN, 4); ELSE PROSDEVNAB = :S_DEVNABCENA; DEVIZNAPRODAJNACENA = ROUNDDEC(:SADCENA / :KURSNADAN, 4); /* ostale */ IF ( (S_PRECENA <> PRETHCENA) OR (S_PRENAB <> PRETHNAB) OR (S_PROSNAB <> PROSNAB) OR (S_NIVKOL <> STANJE) OR (S_TREN_STANJE <> (STANJE + KOLICINA)) OR (S_TREN_STANJE IS NULL) OR (S_DEVNABCENA IS NULL) OR (S_DEVNABCENA <> PROSDEVNAB) OR (S_DEVPRODCENA IS NULL) OR (S_DEVPRODCENA <> DEVIZNAPRODAJNACENA) ) THEN UPDATE STAVKA SET PRECENA = ROUNDDEC(:PRETHCENA, 4), PRENAB = ROUNDDEC(:PRETHNAB, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), NIVKOL = :STANJE, TREN_STANJE = :STANJE + :KOLICINA, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), DEVPRODCENA = ROUNDDEC(:DEVIZNAPRODAJNACENA, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; IF (:VODISE = 4) THEN /* PROSECNA NABAVNA */ PRETHCENA = PROSNAB; ELSE PRETHCENA = SADCENA; PRETHNAB = NABCENA; STANJE = STANJE + KOLICINA; END /* ...IF (VRDOk = 0)... */ /**************************************************/ /*** ULAZNI DOKUMENTI I TO: **********************/ /************* 1 - VP KALKULACIJA ****************/ /************* 2 - DEVIZNA KALKULACIJA ***********/ /************* 3 - PROIZVODNA KALKULACIJA ********/ /************* 11 - MP KALKULACIJA ****************/ /************* 12 - KALKULACIJA MATERIJALA ********/ /************* 18 - INTERNA MP KALKULACIJA ********/ /************* 26 - VP INTERNA KALKULACIJA ********/ /************* 16 - MP ZADUZENJE ******************/ /************* 22 - MP POVRATNICA KUPCA ***********/ /************* 30 - VP ZADUZENJE ******************/ /************* 29 - VP POVRATNICA KUPCA ***********/ /************* 46 - REVERS - VRACANJE *************/ /**************************************************/ ELSE IF (VRDOK IN (1, 2, 3, 11, 12, 18, 26, 16, 22, 30, 29, 46)) THEN BEGIN NABKOL = ROUNDDEC(:STANJE + :KOLICINA, 3); NABVRED = ROUNDDEC(:PROSNAB * :STANJE + :KOLICINA * :NABCENA, 4); IF (:PROSEK = 1) THEN BEGIN /* racuna se prosecna nabavna */ IF (NABKOL > 0) THEN PROSNAB = ROUNDDEC(:NABVRED / :NABKOL, 4); END ELSE PROSNAB = NABCENA; IF (PROSNAB < 0) THEN PROSNAB = 0; /* Samo REALNI ulazi robe definisu DEVNABCENU Internim kalk. ne azuriram devnabcenu vec to radi sredjivanje kartice artikla u polaznom magacinu (magacinu int. otpremnice) ??? OVDE GA PRESKACEM */ IF ( (VRDOK IN (1, 2, 3, 11, 12)) AND (:STANJE + :KOLICINA > 0) ) THEN BEGIN PROSDEVNAB = ROUNDDEC( ROUNDDEC((:PROSDEVNAB * :STANJE) + (:KOLICINA * (:NABCENA / :KURSNADAN)), 8) / (:STANJE + :KOLICINA), 4); END ELSE BEGIN /* U slucaju ostalih ulaznih dokumenata devnabcenu racunam samo ako je pre toga bila 0 tj ovaj dokument je prvi u kartici artikla u tom magacinu U suprotnom ostavljam kolika je i bila */ IF (VRDOK IN (18, 26)) THEN PROSDEVNAB = S_DEVNABCENA; IF (:PROSDEVNAB = 0) THEN BEGIN PROSDEVNAB = ROUNDDEC( :NABCENA / :KURSNADAN, 4); END END DEVIZNAPRODAJNACENA = ROUNDDEC(:SADCENA / :KURSNADAN, 4); IF ((:VODISE = 4) OR (:MPKZM = 0)) THEN BEGIN /* vodi se po prosecnoj ceni ili ne zaduzuje magacin -> nema aut.nivelacija */ NIVKOL = 0; IF (:VODISE = 4) THEN PRODCENA = PROSNAB; ELSE PRODCENA = SADCENA; END ELSE IF (VODISE = 2) THEN BEGIN /* <> PLANSKE CENE */ NIVKOL = :KOLICINA ; END ELSE BEGIN IF (VRDOK IN (22, 29, 16, 30, 46)) THEN BEGIN /* Povratice kupca i zaduzenja mogu da definisu cenu ili ne */ IF (:DEFINISECENU = 1) THEN BEGIN NIVKOL = :STANJE; PRODCENA = SADCENA; END ELSE BEGIN NIVKOL = :KOLICINA; PRETHCENA = PRODCENA; END END ELSE BEGIN /* Ostali ulazni dokumenti obavezno definisu cenu */ NIVKOL = :STANJE; PRODCENA = SADCENA; END END IF ( (S_PRECENA <> PRETHCENA) OR (S_PRENAB <> PRETHNAB) OR (S_PROSNAB <> PROSNAB) OR (S_TREN_STANJE <> (STANJE + KOLICINA)) OR (S_TREN_STANJE IS NULL) OR (S_NIVKOL <> :NIVKOL) OR (S_DEVNABCENA IS NULL) OR (S_DEVNABCENA <> PROSDEVNAB) OR (S_DEVPRODCENA IS NULL) OR (S_DEVPRODCENA <> DEVIZNAPRODAJNACENA) ) THEN BEGIN IF (VRDOK IN (18, 26)) THEN BEGIN UPDATE STAVKA SET PRECENA = ROUNDDEC(:PRETHCENA, 4), PRENAB = ROUNDDEC(:PRETHNAB, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), NIVKOL = :NIVKOL, TREN_STANJE = :STANJE + :KOLICINA, DEVPRODCENA = ROUNDDEC(:DEVIZNAPRODAJNACENA, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; END ELSE BEGIN UPDATE STAVKA SET PRECENA = ROUNDDEC(:PRETHCENA, 4), PRENAB = ROUNDDEC(:PRETHNAB, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), NIVKOL = :NIVKOL, TREN_STANJE = :STANJE + :KOLICINA, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), DEVPRODCENA = ROUNDDEC(:DEVIZNAPRODAJNACENA, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; END END IF (:VODISE = 4) THEN BEGIN /* MAGACIN SE VODI PO PROSECNOJ NABAVNOJ CENI */ PRETHCENA = PROSNAB; END ELSE IF ((:VODISE <> 2) AND (:DEFINISECENU = 1)) THEN BEGIN /* nisu planske cene i definise se cena */ PRETHCENA = SADCENA; END PRETHNAB = NABCENA; STANJE = STANJE + KOLICINA; END /* ...IF (VRDOk = ULAZNI DOKUMENTI)... */ /**************************************************/ /******************** NIVELACIJA ******************/ /**************************************************/ ELSE IF (VRDOK = 21) THEN BEGIN IF (:VODISE IN (3,4,5)) THEN BEGIN /* Samo za materijale se radi nivelacija nabavne cene */ PROSNAB = :SADCENA; NABVRED = ROUNDDEC(:NABKOL * :SADCENA, 4); END DEVIZNAPRODAJNACENA = ROUNDDEC(:SADCENA / :KURSNADAN, 4); IF ( (S_PRECENA <> PRETHCENA) OR (S_PROSNAB <> PROSNAB) OR (S_NIVKOL <> STANJE) OR (S_PRECENA <> S_PRODCENABP) OR (S_TREN_STANJE <> :STANJE) OR (S_TREN_STANJE IS NULL) OR (S_DEVNABCENA IS NULL) OR (S_DEVNABCENA <> PROSDEVNAB) OR (S_DEVPRODCENA IS NULL) OR (S_DEVPRODCENA <> DEVIZNAPRODAJNACENA) ) THEN BEGIN IF ((MAGVRSTA = 2) AND (MPKZM = 0)) THEN BEGIN UPDATE STAVKA SET PRECENA = ROUNDDEC(:PRETHCENA, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), PRODCENABP = ROUNDDEC(:PRETHCENA, 4), TREN_STANJE = :STANJE, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), DEVPRODCENA = ROUNDDEC(:DEVIZNAPRODAJNACENA, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; END ELSE BEGIN UPDATE STAVKA SET PRECENA = ROUNDDEC(:PRETHCENA, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), NIVKOL = ROUNDDEC(:STANJE, 3), PRODCENABP = ROUNDDEC(:PRETHCENA, 4), TREN_STANJE = :STANJE, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), DEVPRODCENA = ROUNDDEC(:DEVIZNAPRODAJNACENA, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; END /* Ovo mora jer se menjaju polja koja update-uju dokument */ SELECT SUM(ROUND2(S.NIVKOL * (S.PRODAJNACENA - S.PRODCENABP))), SUM(ROUND2(S.NIVKOL * S.PRODAJNACENA)), SUM(ROUND2(S.NIVKOL * S.PRODCENABP)) FROM STAVKA S WHERE S.VRDOK = 21 AND S.BRDOK = :BRDOK INTO :SUM_1, :SUM_2, :SUM_3; IF (:SUM_1 IS NULL) THEN SUM_1 = 0; IF (:SUM_2 IS NULL) THEN SUM_2 = 0; IF (:SUM_3 IS NULL) THEN SUM_3 = 0; UPDATE DOKUMENT SET DUGUJE = :SUM_1, POTRAZUJE = :SUM_2, PRODVREDBP = :SUM_3 WHERE VRDOK = 21 AND BRDOK = :BRDOK; END PRETHCENA = SADCENA; PRODCENA = SADCENA; END /* ...IF (VRDOk = 21)... */ /**************************************************/ /******************** POPIS ***********************/ /**************************************************/ ELSE IF (VRDOK = 7) THEN BEGIN IF ( (S_PRECENA <> PRETHCENA) OR (S_PROSNAB <> PROSNAB) OR (SADCENA <> PRETHCENA) OR (S_TREN_STANJE <> :STANJE) OR (S_TREN_STANJE IS NULL) ) THEN BEGIN /* Ako je popis pretvoren u visak manjak a treba da se menja prodajnacena ili trenutno stanje -> exception */ /* IF ((SADCENA <> PRETHCENA) OR (S_TREN_STANJE <> :STANJE)) THEN BEGIN SELECT VRDOKIN, VRDOKOUT FROM DOKUMENT WHERE VRDOK = 7 AND BRDOK = :BRDOK INTO :VISAK, :MANJAK; IF (:VISAK IS NULL) THEN VISAK = 0; IF (:MANJAK IS NULL) THEN MANJAK = 0; IF ((:VISAK <> 0) OR (:MANJAK <> 0)) THEN EXCEPTION POPIS_PRETVOREN; END */ DEVIZNAPRODAJNACENA = ROUNDDEC(:SADCENA / :KURSNADAN, 4); IF ( (S_PRECENA <> PRETHCENA) OR (S_PROSNAB <> PROSNAB) OR (S_TREN_STANJE <> :STANJE) OR (S_TREN_STANJE IS NULL) OR (S_DEVNABCENA IS NULL) OR (S_DEVNABCENA <> PROSDEVNAB) OR (S_DEVPRODCENA IS NULL) OR (S_DEVPRODCENA <> DEVIZNAPRODAJNACENA) ) THEN BEGIN IF (VODISE = 4) THEN BEGIN UPDATE STAVKA SET PRODAJNACENA = ROUND2(:PROSNAB), PRECENA = ROUNDDEC(:PRETHCENA, 4), NABAVNACENA = ROUNDDEC(:PROSNAB, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), PRODCENABP = ROUNDDEC(:PRETHCENA, 4), TREN_STANJE = :STANJE, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), DEVPRODCENA = ROUNDDEC(:DEVIZNAPRODAJNACENA, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; END ELSE BEGIN UPDATE STAVKA SET PRODAJNACENA = ROUND2(:PRETHCENA), PRECENA = ROUNDDEC(:PRETHCENA, 4), NABAVNACENA = ROUNDDEC(:PROSNAB, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), PRODCENABP = ROUNDDEC(:PRETHCENA, 4), TREN_STANJE = :STANJE, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), DEVPRODCENA = ROUNDDEC(:DEVIZNAPRODAJNACENA, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; END END /* Ovo mora jer se menjaju polja koja update-uju dokument */ SELECT SUM(ROUND2(S.KOLICINA * S.NABAVNACENA)), SUM(ROUND2(S.KOLICINA * S.PRODAJNACENA)) FROM STAVKA S WHERE S.VRDOK = 7 AND S.BRDOK = :BRDOK INTO :SUM_1, :SUM_2; IF (:SUM_1 IS NULL) THEN SUM_1 = 0; IF (:SUM_2 IS NULL) THEN SUM_2 = 0; /* Visak */ SELECT SUM(ROUND2((S.KOLICINA - S.TREN_STANJE) * S.PRODAJNACENA)) FROM STAVKA S WHERE S.VRDOK = 7 AND S.BRDOK = :BRDOK AND S.KOLICINA > S.TREN_STANJE INTO :SUM_3; IF (:SUM_3 IS NULL) THEN SUM_3 = 0; /* Manjak */ SELECT SUM(ROUND2((S.TREN_STANJE - S.KOLICINA) * S.PRODAJNACENA)) FROM STAVKA S WHERE S.VRDOK = 7 AND S.BRDOK = :BRDOK AND S.KOLICINA < S.TREN_STANJE INTO :SUM_4; IF (:SUM_4 IS NULL) THEN SUM_4 = 0; UPDATE DOKUMENT SET DUGUJE = :SUM_1, POTRAZUJE = :SUM_2, POPUST = :SUM_3, DODPOREZ = :SUM_4, RAZLIKA = :SUM_3 - :SUM_4 WHERE VRDOK = 7 AND BRDOK = :BRDOK; END END /* ...IF (VRDOk = 7)... */ /*******************************************************/ /******* IZLAZNI DOKUMENTI I TO: ***********************/ /************* 13 - FAKTURA ****************************/ /************* 14 - IZVOZNA FAKTURA ********************/ /************* 15 - MP RACUN ***************************/ /************* 17 - MP RAZDUZENJE **********************/ /************* 19 - MP INTERNA OTPREMNICA **************/ /************* 23 - MP POVRATNICA DOBAVLJACU ***********/ /************* 25 - VP INTERNA OTPREMNICA **************/ /************* 28 - VP RAZDUZENJE **********************/ /************* 31 - TREBOVANJE *************************/ /************* 45 - REVERS *****************************/ /*******************************************************/ ELSE IF (VRDOK IN (13, 14, 15, 17, 19, 23, 25, 28, 31, 45)) THEN BEGIN IF ((:DOK_VALUTA <> :REFVAL) AND (VRDOK <> 14)) THEN DEVIZNAPRODAJNACENA = ROUNDDEC(:SADCENA / :KURSNADAN, 4); ELSE DEVIZNAPRODAJNACENA = :S_DEVPRODCENA; /* ACA I ZOKA 20.11.2012 IF (:MAGVRSTA <> 3) THEN BEGIN */ IF (:VODISE NOT IN (3, 4, 5)) THEN BEGIN /* Ne vodi se po prosecnoj ceni */ IF ( (:MAGVRSTA = 2) AND (:MPKZM = 0) ) THEN NIVKOL = 0; ELSE NIVKOL = :KOLICINA; IF (VRDOK = 23) THEN BEGIN IF ( (S_PRECENA <> PRETHCENA) OR (S_PROSNAB <> PROSNAB) OR (S_NIVKOL <> :NIVKOL) OR (S_TREN_STANJE <> (:STANJE - :KOLICINA)) OR (S_TREN_STANJE IS NULL) OR (S_DEVNABCENA IS NULL) OR (S_DEVNABCENA <> PROSDEVNAB) OR (S_DEVPRODCENA IS NULL) OR (S_DEVPRODCENA <> DEVIZNAPRODAJNACENA) ) THEN BEGIN UPDATE STAVKA SET PRECENA = ROUNDDEC(:PRETHCENA, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), NIVKOL = :NIVKOL, TREN_STANJE = :STANJE - :KOLICINA, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), DEVPRODCENA = ROUNDDEC(:DEVIZNAPRODAJNACENA, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; END END ELSE BEGIN IF ( (S_PRECENA <> PRETHCENA) OR (S_PROSNAB <> PROSNAB) OR (S_NIVKOL <> :NIVKOL) OR (S_TREN_STANJE <> (:STANJE - :KOLICINA)) OR (S_TREN_STANJE IS NULL) OR (NABCENA <> PROSNAB) OR (S_DEVNABCENA IS NULL) OR (S_DEVNABCENA <> PROSDEVNAB) OR (S_DEVPRODCENA IS NULL) OR (S_DEVPRODCENA <> DEVIZNAPRODAJNACENA) ) THEN BEGIN UPDATE STAVKA SET PRECENA = ROUNDDEC(:PRETHCENA, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), NABAVNACENA = ROUNDDEC(:PROSNAB, 4), NIVKOL = :NIVKOL, TREN_STANJE = :STANJE - :KOLICINA, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), DEVPRODCENA = ROUNDDEC(:DEVIZNAPRODAJNACENA, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; EXECUTE PROCEDURE PRESABERIDOKUMENT(:VRDOK, :BRDOK); END END END /* Vodi se po prosecnoj ceni */ ELSE IF ( (S_PRECENA <> PRETHNAB) OR (S_PROSNAB <> PROSNAB) OR (:NABCENA <> PROSNAB) OR (S_NIVKOL <> KOLICINA) OR (S_TREN_STANJE <> (:STANJE - :KOLICINA)) OR (S_TREN_STANJE IS NULL) OR (S_DEVNABCENA IS NULL) OR (S_DEVNABCENA <> PROSDEVNAB) OR (S_DEVPRODCENA IS NULL) OR (S_DEVPRODCENA <> DEVIZNAPRODAJNACENA) ) THEN BEGIN IF (VRDOK IN (25, 31)) THEN BEGIN UPDATE STAVKA SET PRECENA = ROUNDDEC(:PRETHNAB, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), NABAVNACENA = ROUNDDEC(:PROSNAB, 4), PRODAJNACENA = ROUNDDEC(:PROSNAB, 4), NIVKOL = :KOLICINA, TREN_STANJE = :STANJE - :KOLICINA, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), DEVPRODCENA = ROUNDDEC(:DEVIZNAPRODAJNACENA, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; EXECUTE PROCEDURE PRESABERIDOKUMENT(:VRDOK, :BRDOK); END ELSE UPDATE STAVKA SET PRECENA = ROUNDDEC(:PRETHNAB, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), NIVKOL = :KOLICINA, TREN_STANJE = :STANJE - :KOLICINA, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), DEVPRODCENA = ROUNDDEC(:DEVIZNAPRODAJNACENA, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; END /* Ako je u pitanju interna otpremnica onda azuriram devnabcenu u internoj kalkulaciji */ IF ( (VRDOK IN (19, 25)) AND (NOT VRDOKOUT IS NULL) AND (NOT BRDOKOUT IS NULL) ) THEN BEGIN /* Kolika li je devnabcena u povezanoj int. kalk.? */ SELECT MAX(DEVNABCENA) FROM STAVKA WHERE VRDOK = :VRDOKOUT AND BRDOK = :BRDOKOUT AND ROBAID = :ROBAID INTO INTKALK_DEVNABCENA; IF ( (S_DEVNABCENA IS NULL) OR (PROSDEVNAB IS NULL) OR (S_DEVNABCENA <> PROSDEVNAB) OR (S_DEVNABCENA <> INTKALK_DEVNABCENA) OR (INTKALK_DEVNABCENA IS NULL) ) THEN BEGIN UPDATE STAVKA SET DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), PT = 'T' WHERE VRDOK = :VRDOKOUT AND BRDOK = :BRDOKOUT AND ROBAID = :ROBAID; /* E sad jos samo sredim karticu u tok magacinu od datuma int. kalk. pa na dole */ SELECT MAX(MAGACINID) FROM STAVKA WHERE VRDOK = :VRDOKOUT AND BRDOK = :BRDOKOUT AND ROBAID = :ROBAID INTO :MAGID_OUT; /* Ovo je madjikurama: Da ne bi se sa sredjivanjem kartica vratio u magacin cije kartice i inace sredjujem... Parametar STOP_NA_MINUS koristim da prenes MAGACINID magacina iz kog sam rekurzivno pozvao sredikarticu Stavljam mu - da se nebi doslo do sranja kad je magacinid = 1 */ IF (:MAGID_OUT <> -:STOP_NA_MINUS) THEN EXECUTE PROCEDURE SREDIKARTICU(:MAGID_OUT,:ROBAID,:DATUM, -:MAGACINID) RETURNING_VALUES :MAGID_OUT_OK; END END IF ((VRDOK = 31) AND (:NABCENA <> PROSNAB) AND (NOT VRDOKIN IS NULL) AND (NOT BRDOKIN IS NULL)) THEN BEGIN /* Ako je stavka trebovanja imala losu nabavnu cenu, koju smo ispravili, pokusavam da sredim nabavnu cenu u nalogu za proizvodnju iz koga je trebovanje nastalo i u proizvodnoj kalkulaciji koja je nastala od tog naloga za proizvodnju */ MATPROCENA = ROUNDDEC(:PROSNAB, 4); FOR SELECT M.MATPROID, M.KOLICINA, M.STAVPROID, MAG.VODISE, S.ROBAID FROM MATPRO M LEFT JOIN STAVKA S ON M.STAVPROID = S.STAVKAID LEFT JOIN MAGACIN MAG ON S.MAGACINID = MAG.MAGACINID WHERE M.VRDOK = :VRDOKIN AND M.BRDOK = :BRDOKIN AND M.ROBAID = :ROBAID INTO :MATPROID, :MAT_KOL, :STAVPROID, :GP_VODISE, :GP_ROBAID DO BEGIN UPDATE MATPRO SET CENA = :MATPROCENA WHERE MATPROID = :MATPROID; IF (:GP_VODISE = 4) THEN UPDATE STAVKA SET PRODAJNACENA = NABAVNACENA, PT = 'P' WHERE STAVKAID = :STAVPROID; /* Menjam nabavnu cenu u kalkulaciji gotovog proizvoda */ SELECT BRDOK FROM DOKUMENT WHERE VRDOK = 3 AND VRDOKIN = :VRDOKIN AND BRDOKIN = :BRDOKIN INTO :KALK_BRDOK; IF ((NOT :KALK_BRDOK IS NULL) AND (:KALK_BRDOK <> 0)) THEN BEGIN SELECT NABCENABT FROM STAVKA WHERE STAVKAID = :STAVPROID INTO :GP_NABCENA; IF (:GP_VODISE = 4) THEN UPDATE STAVKA SET FAKTURNACENA = :GP_NABCENA, NABAVNACENA = :GP_NABCENA + (TROSKOVI + NABCENSAPOR)/KOLICINA, PRODAJNACENA = :GP_NABCENA + (TROSKOVI + NABCENSAPOR)/KOLICINA, PT = 'P' WHERE VRDOK = 3 AND BRDOK = :KALK_BRDOK AND ROBAID = :GP_ROBAID; ELSE UPDATE STAVKA SET FAKTURNACENA = :GP_NABCENA, NABAVNACENA = :GP_NABCENA + (TROSKOVI + NABCENSAPOR)/KOLICINA, PT = 'P' WHERE VRDOK = 3 AND BRDOK = :KALK_BRDOK AND ROBAID = :GP_ROBAID; END END END /* Ake je u pitanje revers -> azuriram stanje po reversu */ IF (VRDOK = 45) THEN BEGIN SELECT SUM(KOLICINA-TAKSA) FROM STAVKA WHERE VRDOK = 45 AND MAGACINID = :MAGACINID AND ROBAID = :ROBAID INTO :REVERSI; UPDATE ROBAUMAGACINU SET STANJEPOREVERSU = :REVERSI WHERE MAGACINID = :MAGACINID AND ROBAID = :ROBAID; END STANJE = STANJE - KOLICINA; END /************* 27 - VP POVRATNICA DOBAVLJACU ***********/ ELSE IF (VRDOK = 27) THEN BEGIN IF (:DOK_VALUTA <> :REFVAL) THEN DEVIZNAPRODAJNACENA = ROUNDDEC(:SADCENA / :KURSNADAN, 4); ELSE DEVIZNAPRODAJNACENA = :S_DEVPRODCENA; IF ((:MAGVRSTA <> 3) and (not (:VODISE in (4, 5, 6)))) THEN BEGIN /* Nije repromaterijal i ne vodi se po prosnab ceni */ IF ( (:MAGVRSTA = 2) AND (:MPKZM = 0) ) THEN NIVKOL = 0; ELSE NIVKOL = :KOLICINA; IF ( (S_PRECENA <> PRETHCENA) OR (S_PROSNAB <> PROSNAB) OR (S_NIVKOL <> :NIVKOL) OR (S_TREN_STANJE <> (:STANJE - :KOLICINA)) OR (S_TREN_STANJE IS NULL) OR (S_DEVNABCENA IS NULL) OR (S_DEVNABCENA <> PROSDEVNAB) OR (S_DEVPRODCENA IS NULL) OR (S_DEVPRODCENA <> DEVIZNAPRODAJNACENA) ) THEN BEGIN UPDATE STAVKA SET PRECENA = ROUNDDEC(:PRETHCENA, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), NIVKOL = :NIVKOL, TREN_STANJE = :STANJE - :KOLICINA, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), DEVPRODCENA = ROUNDDEC(:DEVIZNAPRODAJNACENA, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; END END /* Repromaterijal */ ELSE BEGIN /**********************/ /* Samo REALNI ulazi robe definisu DEVNABCENU Internim kalk. ne azuriram devnabcenu vec to radi sredjivanje kartice artikla u polaznom magacinu (magacinu int. otpremnice) ??? OVDE GA PRESKACEM */ IF (:STANJE - :KOLICINA > 0) THEN PROSDEVNAB = ROUNDDEC( ROUNDDEC((:PROSDEVNAB * :STANJE) - (:KOLICINA * (:NABCENA / :KURSNADAN)), 8) / (:STANJE - :KOLICINA), 4); DEVIZNAPRODAJNACENA = ROUNDDEC(:SADCENA / :KURSNADAN, 4); IF ((:VODISE = 4) OR (:MPKZM = 0)) THEN BEGIN /* vodi se po prosecnoj ceni ili ne zaduzuje magacin */ NIVKOL = :KOLICINA; IF (:VODISE = 4) THEN PRODCENA = PROSNAB; ELSE PRODCENA = SADCENA; END ELSE IF (VODISE = 2) THEN BEGIN /* <> PLANSKE CENE */ NIVKOL = :KOLICINA ; END IF ( (S_PRECENA <> PRETHCENA) OR (S_PRENAB <> PRETHNAB) OR (S_PROSNAB <> PROSNAB) OR (S_TREN_STANJE <> (STANJE - KOLICINA)) OR (S_TREN_STANJE IS NULL) OR (S_NIVKOL <> :NIVKOL) OR (S_DEVNABCENA IS NULL) OR (S_DEVNABCENA <> PROSDEVNAB) OR (S_DEVPRODCENA IS NULL) OR (S_DEVPRODCENA <> DEVIZNAPRODAJNACENA) ) THEN BEGIN UPDATE STAVKA SET PRECENA = ROUNDDEC(:PRETHCENA, 4), PRENAB = ROUNDDEC(:PRETHNAB, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), NIVKOL = :NIVKOL, TREN_STANJE = :STANJE - :KOLICINA, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), DEVPRODCENA = ROUNDDEC(:DEVIZNAPRODAJNACENA, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; END IF (:VODISE = 4) THEN BEGIN /* MAGACIN SE VODI PO PROSECNOJ NABAVNOJ CENI */ PRETHCENA = PROSNAB; END ELSE IF ((:VODISE <> 2) AND (:DEFINISECENU = 1)) THEN BEGIN /* nisu planske cene i definise se cena */ PRETHCENA = SADCENA; END PRETHNAB = NABCENA; /**********************/ END STANJE = STANJE - KOLICINA; END /**************************************************/ /***************** NARUDZBENICA *******************/ /**************************************************/ /**************************************************/ /****************** OTPREMNICA ********************/ /**************************************************/ ELSE IF (VRDOK = 35) THEN BEGIN IF (:MAGVRSTA <> 3) THEN BEGIN IF ( (S_PRECENA <> PRETHCENA) OR (S_PROSNAB <> PROSNAB) OR (S_NIVKOL <> KOLICINA) OR (S_TREN_STANJE <> STANJE) OR (S_TREN_STANJE IS NULL) OR (S_DEVNABCENA IS NULL) OR (S_DEVNABCENA <> PROSDEVNAB) ) THEN BEGIN IF ( (:MAGVRSTA = 2) AND (MPKZM = 0)) THEN UPDATE STAVKA SET PRECENA = ROUNDDEC(:PRETHCENA, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), TREN_STANJE = :STANJE, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; ELSE UPDATE STAVKA SET PRECENA = ROUNDDEC(:PRETHCENA, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), NIVKOL = :KOLICINA, TREN_STANJE = :STANJE, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; END END ELSE IF ( (S_PRECENA <> PRETHNAB) OR (S_PROSNAB <> PROSNAB) OR (S_NIVKOL <> KOLICINA) OR (S_TREN_STANJE <> STANJE) OR (S_TREN_STANJE IS NULL) OR (S_DEVNABCENA IS NULL) OR (S_DEVNABCENA <> PROSDEVNAB) ) THEN UPDATE STAVKA SET PRECENA = ROUNDDEC(:PRETHNAB, 4), PROSNAB = ROUNDDEC(:PROSNAB, 4), NIVKOL = :KOLICINA, TREN_STANJE = :STANJE, DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4), PT = 'T' WHERE STAVKAID = :STAVKAID; END /* ...IF (VRDOk = 35)... */ /* REKLAMACIJA */ ELSE IF (VRDOK = 80) THEN BEGIN SELECT SUM(KOLICINA-NIVKOL) FROM STAVKA WHERE VRDOK = 80 AND MAGACINID = :MAGACINID AND ROBAID = :ROBAID INTO :REKLAMACIJE; UPDATE ROBAUMAGACINU SET STANJEPOREKLAM = :REKLAMACIJE WHERE MAGACINID = :MAGACINID AND ROBAID = :ROBAID; END /* ...IF (VRDOk = 80)... */ /**************************************************/ /****************** PRIJEMNICA ********************/ /**************************************************/ ELSE IF (VRDOK = 5) THEN BEGIN END /* ...IF (VRDOk = 5)... */ ELSE BEGIN IF ((S_TREN_STANJE <> STANJE) OR (S_TREN_STANJE IS NULL)) THEN UPDATE STAVKA SET TREN_STANJE = :STANJE, PT = 'T' WHERE STAVKAID = :STAVKAID; END/* Vrste dokumenata */ /**************************************************/ /*************** STANJE ODE U MINUS ****************/ /**************************************************/ IF ((ROUNDDEC(:STANJE, 3) < 0) AND (:MOZEMINUS = 0)) THEN BEGIN OK = 0; IF (:STOP_NA_MINUS = 1) THEN EXCEPTION STANJE_ODE_U_MINUS; END END /* Za SELECT po kartici */ IF (:VODISE IN (3, 4, 5)) THEN /* Magacin materijala se vodi po nabavnim cenama */ PRODCENA = :PROSNAB; /* Rezervisano iz profakture i proracuna */ SELECT SUM(S.KOLICINA) FROM STAVKA S LEFT JOIN DOKUMENT D ON S.VRDOK = D.VRDOK AND S.BRDOK = D.BRDOK WHERE S.VRDOK in (4, 9, 32) AND S.ROBAID = :ROBAID AND D.KODDOK = 0 AND D.MAGID = 1 AND S.MAGACINID = :MAGACINID INTO :REZERVISANO; IF (REZERVISANO IS NULL) THEN REZERVISANO = 0; /* Rezervisano iz radnog naloga */ FOR SELECT S.STAVKAID, S.KOLICINA FROM STAVKA S LEFT JOIN DOKUMENT D ON S.VRDOK = D.VRDOK AND S.BRDOK = D.BRDOK WHERE S.VRDOK = 165 AND S.ROBAID = :ROBAID AND S.MAGACINID = :MAGACINID AND D.KODDOK = 0 AND D.STATUS <= 1 INTO :STAVKAID, :KOLICINA DO BEGIN /* Rezervisano iz pripreme radnog naloga */ REZERVISANO = :REZERVISANO + :KOLICINA; /* Preneto u UGRADJENO radnog naloga */ SELECT SUM(SS.KOLICINA) FROM STAVKA_STAVKA SS WHERE SS.STAVKAID = :STAVKAID AND SS.NEW_VRSTA = 1 INTO :PRENETONARN; IF (PRENETONARN IS NULL) THEN PRENETONARN = 0; REZERVISANO = :REZERVISANO - :PRENETONARN; END /* BackOrders iz narudzbenice */ SELECT SUM(S.KOLICINA - S.NIVKOL), MAX(D.DATROKA) FROM STAVKA S LEFT JOIN DOKUMENT D ON S.VRDOK = D.VRDOK AND S.BRDOK = D.BRDOK WHERE S.VRDOK = 33 AND S.ROBAID = :ROBAID AND D.KODDOK = 0 AND D.PLACEN <> 2 AND S.MAGACINID = :MAGACINID INTO :NARUCENO, :DAT_ISPORUKE; IF (NARUCENO IS NULL) THEN NARUCENO = 0; IF (DAT_ISPORUKE IS NOT NULL) THEN UPDATE ROBA SET DATUM_ISPORUKE = :DAT_ISPORUKE WHERE ROBAID = :ROBAID AND DATUM_ISPORUKE <> :DAT_ISPORUKE; ELSE UPDATE ROBA SET DATUM_ISPORUKE = NULL WHERE ROBAID = :ROBAID AND (DATUM_ISPORUKE IS NOT NULL); IF ((MPKZM = 0) AND (MAGVRSTA = 2)) THEN BEGIN UPDATE ROBAUMAGACINU SET STANJE = 0, PRODAJNACENA = ROUND2(:PRODCENA), NABAVNACENA = ROUNDDEC(:PROSNAB, 4) WHERE ROBAID = :ROBAID AND MAGACINID = :MAGACINID AND ((STANJE <> 0) OR (PRODAJNACENA <> ROUND2(:PRODCENA)) OR (NABAVNACENA <> ROUNDDEC(:PROSNAB, 4))); END ELSE BEGIN IF (PROSDEVNAB is null) THEN PROSDEVNAB = 0; UPDATE ROBAUMAGACINU SET STANJE = :STANJE, EVIDSTANJE = :EVIDSTANJE, REZERVISANO = :REZERVISANO, NARUCENO = :NARUCENO, PRODAJNACENA = ROUND2(:PRODCENA), NABAVNACENA = ROUNDDEC(:PROSNAB, 4), DEVNABCENA = ROUNDDEC(:PROSDEVNAB, 4) WHERE ROBAID = :ROBAID AND MAGACINID = :MAGACINID AND ( (STANJE <> :STANJE) OR (EVIDSTANJE <> :EVIDSTANJE) OR (REZERVISANO <> :REZERVISANO) OR (NARUCENO <> :NARUCENO) OR (PRODAJNACENA <> ROUND2(:PRODCENA)) OR (NABAVNACENA <> ROUNDDEC(:PROSNAB, 4)) OR (DEVNABCENA <> ROUNDDEC(:PROSDEVNAB, 4)) ); END END /* VRSTAROBE <> 2 */ END ^ SET TERM ; ^