You are on page 1of 24

INFORMACIONI SISTEM ZA PODRŠKU

RADA PREDUZEĆA KOJA SE BAVI


PROIZVODNJOM METALNE
GALANTERIJE
-SISTEMI BAZA PODATAKA-

David Feješ IT70g2017

Novi Sad, 2021.


SADRŽAJ

UVOD 2

ANALIZA PROGRAMSKOG DOMENA 2

ER MODEL 3

ER MODEL PODŠEME 4

TABELARNI PRIKAZ OBELEŽJA I OGRANIČENJA 5

RELACIONI MODEL 6

DDL 6

DML 6

SQL 6

OBJEKTI 6

UPITI 7

FUNKCIJE 8

PROCEDURE 9

TRIGERI 10

ZAKLJUČAK 11
UVOD

Projekat predstavlja razvoj baze podataka većeg informacionog sistema koji se


bavi podrškom rada preduzeća za proizvodnju metalne galanterije. Smisao ovog
projekta je evidencija podataka o pristiglim porudzbenicama iz kojih proizilaze
radni nalozi, a na osnovu njih i same operacije u proizvodnom procesu. Cilj
ovog projekta je poboljšanje celokupnog poslovanja preduzeća.

U daljem tekstu će biti prikazana analiza programskog domena, ER model cele


baze podataka, ER model podšeme baze podataka koja je izrađena u okviru
projekta, tabelarni prikaz svih obeležja i njihovih ograničenja. Za kreiranje baze
podataka, kao i unošenje podataka i njihovo manipulisanje, koristiće se DDL,
DML i SQL.

ANALIZA PROGRAMSKOG DOMENA

Značaj sistema se ogleda u lakšem i bržem poslovanju preduzeća, počevši od


evidencije pristiglih porudžbenica, radnih naloga i radnih listi, operacija, pa
preko radnih mašina i radnika koji su ovučeni za njihovo rukovanje. Korisnici
će imati uvid o:
 Porudžbenicama i kupcima
 Šefovima koji su zaduženi za prijem porudzbenica
 Radnim nalozima sa količinom robe i njihovim mernim jedinicama
 Radnim listama
 Operacijama, radnicima i mašinama na kojima su obučeni
 Svim radnim mašinama u preduzeću
ER MODEL

Prikaz cele ER šeme proizvodnje metalne galanterije:


ER MODEL PODŠEME

Prikazana je šema koja predstavlja aktivnosti definisanja radnig naloga, a zatim


i radnih lista. Porudzbenicu nastalu od strane kupca, prima šef preduzeća koji na
osnovu iste zadaje jedan radni nalog. Na osnovu radnog naloga mogu nastati
jedna ili više radnih lista. Radna liste definišu operacije koje je potrebno izvršiti.
Svaka radna lista sadrži tačno jednu operaciju.
predstavlja razvoj baze podataka većeg informacionog sistema koji se bavi
podrškom rada preduzeća za proizvodnju metalne galanterije – modula za
praćenje proizvodnje. Prioritet ovog projekta je evidencija podataka o pristiglim
porudzbenicama iz kojih proizilaze radni nalozi, a na osnovu njih i same
operacije u proizvodnom procesu. Cilj ovog projekta je poboljšanje celokupnog
poslovanja preduzeća. Operacije izvršavaju radnici koji su obučeni za određene
tipove radnih mašina. Svaki tip radne mašine ima jednu ili više mašina.
TABELARNI PRIKAZ OBELEŽJA I OGRANIČENJA

Tabela 1. Tip entiteta "KUPAC"

Tip Dužina
Redn Naziv Opis
podatk podatk Null Uslov
i broj obeležja obeležja
a a
Identifikacio FALS
1. KupacID int 8 d>0
ni broj kupca E
nvarcha FALS Δ
2. ImeKupca Ime kupca 20
r E
Prezime nvarcha FALS Δ
3. PrzKupca 30
kupca r E
length(KontaktKupc
KontaktKupc Kontakt FALS
4. numeric 14 a) ≤ 14
a telefon kupca E
Ključ {KupacID}

Tabela 2. Tip entiteta "PORUDZBENICA"

Redni Tip Dužina


Naziv obeležja Opis obeležja Null Uslov
broj podatka podatka
Identifikacioni FALSE d > 0
1. PorudzbenicaID int 8
broj porudžbenice
Količina poručene
2. KolicinaRobe int 4 FALSE d > 0
robe
Ključ {KupacID + PorudzbenicaID}

Tabela 3. Tip entiteta "SEF"

Redni Naziv Tip Dužina


Opis obeležja Null Uslov
broj obeležja podatka podatka
1. Matični broj FALSE d > 0
MBRSefa numeric 13
radnika
2. ImeSefa Ime radnika string 20 FALSE Δ
Prezime FALSE Δ
3. PrzSefa string 30
radnika
4. SSS
Stepen stručne
int 1 FALSE d ∈
spreme {1,2,3,4,5,6,7,8}
5. Kontakt Kontakt telefon numeric 14 FALSE length(Kontakt)
≤ 14
Datum FALSE d ≤
6. DatZap date 8
zaposlenja trenutni_datum
Ključ { MBRSefa }
Tabela 4. Tip entiteta "RADNI_NALOG"

Redni Naziv Tip Dužina


Opis obeležja Null Uslov
broj obeležja podatka podatka
Identifikacioni
1. RadniNalogID broj radnog int 8 FALSE d > 0
naloga
Broj serija
2. BrojSerija proizvodnog int 3 TRUE Δ
procesa
Ukupno vreme
3. UkupnoVreme izvršenja time FALSE d > 0
procesa
Količina
proizvoda koju
4. KolicinaProiz int 4 FALSE d > 0
treba
proizvesti
Vrsta
proizvoda koju
5. VrstaProiz nvarchar 30 FALSE Δ
treba
proizvesti
Rok u kojem
treba završiti d>
6. RokZaProiz date TRUE
proces trenutno_vreme
proizvodnje
Ključ {RadniNalogID}

Tabela 5. Tip entiteta “MERNA_JEDINICA”

Redni Tip Dužina


Naziv obeležja Opis obeležja Null Uslov
broj podatka podatka
Identifikacioni
1. MernaJedinicaID broj merne int 8 FALSE d > 0
jedinice
d∈
{m, m , 2

Naziv jedinice kg,


2. NazivMerneJedinice nvarchar 5 FALSE
mere kom,
tabla,
L}
Ključ {MernaJedinicaID}
Tabela 6. Tip entiteta "RADNA_LISTA"

Redni Naziv Tip Dužina


Opis obeležja Null Uslov
broj obeležja podatka podatka
Identifikaciono FALSE d > 0
1. RadnaListaID int 8
broj radne liste
Ključ {RadniNalogID + RadnaListaID}

Tabela 7. Tip entiteta "OPERACIJA"

Redni Naziv Tip Dužina


Opis obeležja Null Uslov
broj obeležja podatka podatka
Identifikacioni
broj FALS
1. OperacijaID int 8 E d>0
proizvodne
operacije
Naziv
FALS
2. NazivO proizvodne nvarchar 30 Δ
E
operacije
Tekstualni opis
FALS
3. OpisO proizvodne nvarchar 50 Δ
E
operacije
Opasnost od
štete prilikom
4. OpasnostO nvarchar 100 TRUE Δ
izvšavanja
operacije
Trajanje
FALS length(TrajanjeO)
5. TrajanjeO proizvodne nvarchar 6
E >0
operacije
Ključ {OperacijaID}
Tabela 8. Tip entiteta "PROIZVODNI RADNIK"

Tip
Redn Naziv Dužina
Opis obeležja podatk Null Uslov
i broj obeležja podatka
a
1. Matični broj FALSE d > 0
MBRRadnika numeric 13
radnika
2. ImeRadnika Ime radnika string 20 FALSE Δ
Prezime FALSE Δ
3. PrzRadnika string 30
radnika
4. SSS
Stepen stručne
int 1 FALSE d ∈
spreme {1,2,3,4,5,6,7,8}
Kontakt FALSE length(Kontakt)
5. Kontakt numeric 14
telefon ≤ 14
Datum FALSE d ≤
6. DatZap date 8
zaposlenja trenutni_datum
Posao za koji
je
7. Specijalizacija nvarchar 20 TRUE Δ
radnik
specijalizovan
Sektor u kome
8. Sektor nvarchar 20 TRUE Δ
radi
Ključ { MBRRadnika }

Tabela 9. Tip entiteta “TIP_RADNE_MASINE”

Redni Tip Dužina


Naziv obeležja Opis obeležja Null Uslov
broj podatka podatka
Identifikacioni FALSE d > 0
1. TipMasineID int 8
broj tipa mašine
Naziv tipa radne
2. NazivTipaMasine nvarchar 30 TRUE Δ
mašine
Ukupan broj
3. UkupanBrojTM int 8 FALSE d ≥ 0
mašina tog tipa
Ključ {TipMasineID}

Tabela 10. Tip poveznika “JE_OBUCEN”

Redni Naziv Opis Tip Dužina Nul


Uslov
broj obeležja obeležja podatka podatka l
Ključ {TipMasineID + MBRRadnika }
Tabela 11. Tip entiteta “RADNA_MASINA”

Tip Dužina
Redn Opis
Naziv obeležja podatk podatk Null Uslov
i broj obeležja
a a
Identifikacion FALS
RadnaMasinaI
1. i broj radne int 8 E d>0
D
mašine
Datum FALS d≤
2. DatProizvodnje date
proizvodnje E trenutni_datum
Ukazuje na to
da li je radna FALS
3. Slobodna boolean 1 Δ
mašina E
slobodna
Ključ {TipMasineID + RadnaMasinaID}
RELACIONI MODEL

Opis šta je to relacioni model i relaciona baza podataka (osnovni koncepti).


Relacioni model je model podataka koji bazu podataka predstavlja kao skup
relacija. Svi podaci su predstavljeni kao uređeni parovi, grupisani u relacije.
Svaka relacija ima svoje atribute. Navodi se tip i dužina podataka. Relacije se
povezuju preko primarnih ključeva. Svaka relacija ima svoj ključ, na osnovu
kog jedinstveno identifikujemo torke u datoj relaciji. Svrha relacionog modela
je da pruži deklarativno specificiranje podataka i upita.
Osnovni koncepti:
 Atribut - svojstvo klase entiteta (opisuje jednu kolonu u relaciji)
 Torka – reprezentuje jedan entitet (jedan red u relaciji)
 Tabela – relacija. Čini je konačan skup torki.
 Šema – pogled na strukturu baze
 Kardinalitet – određuje odnose između relacija
 Ključ relacije – atribut kojim se jedinstveno identifikuju torke u relaciji
 Domen – skup dozvoljenih vrednosti

DDL

DDL (Data Definition Language) je jezik koji omogućava definisanje baze


podataka.
Koristi se za kreiranje, brisanje i modifikovanje objekata baze podataka.

DDL komande:

 CREATE – komanda koja služi za kreiranje novog objekta.


Naveden je primer kreiranja tabele Kupac koja pripada šemi Proizvodnja. Pored
atributa naveden je i primarni ključ tabele, kao i ograničenje za atribut
kontaktKupca.
 ALTER – komanda koja služi za izmenu baze.
Promena može modifikovati karakteristike postojećeg atributa ili dodati
novi. Primer prikazuje modifikaciju atributa imeKupca tako da je njegov tip
podataka VARCHAR i dužina 40. Nije dozvoljena null vrednost.

 DROP – komanda koja služi za brisanje objekta, kao i vrednosti u njima.


Primer prikazuje brisanje tabele Kupac iz šeme Proizvodnja:

 TRUNCATE – komanda zadužena za brisanje svih torki u tabeli.


Brisanje svih torki u tabeli Kupac šeme Proizvodnja:

DML

DML (Data Manipulation Language) je jezik koji služi za manipulaciju bazom


podataka. DML komande:

 INSERT – komanda koja unosi podatke u tabelu.


Prikazan je primer unosa podataka u tabelu Kupac šeme Proizvodnja:

 UPDATE – komanda koja ažurira podatke u tabeli.

Prikazan je primer ažuriranja postojećih vrednosti kontakta kupca gde je ime


kupca Petar Petrović. Ažuriranje se vrši nad tablelom Kupac koja pripada šemi
Proizvodnja.

 DELETE – komanda koja briše podatke iz tabele.

Vrši se brisanje torke iz tabele Kupac gde je ID kupca 1. Briše se troka iz tabele
Kupac koja pripada šemi Proizvodnja.

SQL

Opis štaj je to SQL gde i kako se koristi, navesti kratke primere. (sql se u
projektu prikazuje kroz upite)
SQL (Structured Q uery Language) je deklarativni jezik korišćen u
programiranju koji omogućava upravljanje podacima u relacionim bazama
podataka. SQL omogućava pristup podacima na osnovu upita.

Osnovni oblik naredbe za kreiranje upita:


 SELECT – lista atributa koje korisnik želi da prikaže kao rezultat upita,
 FROM – tabela kojoj je upit upućen,
 WHERE – logički uslov na osnovu kog se vrši izbor torki.

Pored osnovnog oblika upita korisnik može koristiti i klauzule (GROUP BY,
HAVING, ORDER BY), grupne funkcije (SUM, MIN, MAX, COUNT, AVG),
kao i ugrađene funkcije ili podupite.

Primer upita izlistava broj slobodnih mašina za sektore u kojima su zaposleni


proizvodni radnici. Tabeli ProizvodniRadnik se pridružuju tabele JeObucen na
osnovu ključa proizvodnog radnika pod nazivom MBRRadnika, zatim se
pridružuju tabele TipRadneMasine na osnovu ključa tipMasineID i tabela
RadnaMasina na osnovu tipMasineID. Torke se grupišu na osnovu sektora
radnika i ređaju se na osnovu opadajuće vrednosti sektora radnika.
OBJEKTI

Sledi opis svih objekata koji su koriščeni u ovom projektu.

Schema
Šema predstavlja kolekciju svih objekata koji dele isti prostor imenovanja.
Šema može sadržati više tabela, dok tabela mora pripadati tačno jednoj šemi.

Kreiranje šeme:

CREATE SCHEMA [SchemaName]

Tabela
Tabele predstavljaju objekte baze podataka koje čuvaju podatke u relacionim
bazama podataka. Sastoje se iz kolona koje imaju svoje ime i tip podataka.
Podaci se čuvaju u torkama.

Kreiranje tabele:

CREATE TABLE [SchemaName].[TableName]


(
-- ColumnName, type, is it null
[Id] INT NOT NULL PRIMARY KEY,
[ColumnName2] NVARCHAR(50) NOT NULL,
[ColumnName3] NVARCHAR(50) NOT NULL
);
GO

Sekvenca
Sekvence su bojekti koji se koriste za generisanje numeričkih vrednosti. U
projektu su se koristile za generisanje jedinstvenih ključeva.
Kreiranje sekvence:

CREATE SEQUENCE [SchemaName].[SequenceName] AS INT


START WITH 1 -- start value
minvalue 1 -- minimal value
increment BY 1 -- increment by
GO

Funkcija
Funkcije su objekti koji izvršavaju operacije nad ulaznim parametrima i vraćaju
rezultat. Korisnički definisane funkcije su:
FN – SQL skalarne funkcije
IF – SQL inline table-valued funkcije
TF – SQL table-valued funkcije

Kreairanje skalarne funkcije:

CREATE FUNCTION [SchemaName].[FunctionName](


@param1 INT, -- first parameter
@param2 INT -- second parameter
)
RETURNS -- return type
AS
RETURN
GO

Poziv funkcije za vrednosti 1 i 2:

SELECT [SchemaName].[FunctionName] 1, 2

Procedura
Procedura predstavlja SQL izraz koji se može sačuvati pod određenim nazivom
i koristiti se više puta na različite načine. Benefit procedura je pisanje “čistog
koda”, odnosno omogućava da se kod ne ponavlja što doprinosi preglednosti,
efikasnosti, ali i čini da je lakše održavati dati kod.

Kreiranje procedure:

CREATE PROCEDURE [SchemaName].[ProcedureName]


@param1 int, -- first parameter
@param2 int -- second parameter

AS
BEGIN
-- body of the stored procedure
RETURN
END
GO

Pozivanje procedure za vrednosti 1 i 2:

EXECUTE [SchemaName].[ProcedureName] 1, 2
GO

Triger
Trigeri su uskladištene procedure koje se vezuju za određene DML događaje
(INSERT, UPDATE, DELETE) koji su okidači za pokretanje trigera. Postoje
dve vrste trigera:
1. AFTER triger – okida se nakon izvršene DML naredbe i
2. INSTEAD OF triger – okida se umesto DML naredbe.

U trigeru je moguće pristupiti privremenim tabelama INSERTED i DELETED.


Tabele sadrže trojke koje su pod uticajem DML instrukcije koje je dovela do
okidanja trigera.

Kreiranje trigera:

create trigger [trigger_name]


[before | after]
{insert | update | delete}
on [table_name]
[for each row]
[trigger_body]

Kursor
Kursori su objekti koji omogućavaju prolazak kroz redove tabele koji nastaju
kao rezultat upita.
Kreiranje kursora:

DECLARE @ColumnName1 NVARCHAR(50), @ColumnName2 NVARCHAR(50)

DECLARE [CursorName] CURSOR FOR


SELECT ColumnName1, Column2
FROM [SchemaName].[TableName]

OPEN [CursorName]
FETCH NEXT FROM [CursorName] INTO @ColumnName1, @ColumnName2

WHILE @@FETCH_STATUS = 0
BEGIN
-- add instructions to be executed for every row

FETCH NEXT FROM [CursorName] INTO @ColumnName1, @ColumnName2


END

CLOSE [CursorName]
DEALLOCATE [CursorName]
GO

UPITI

Prvi upit:
Upit izlistava imena i prezimena kupaca, kao i ukupnu količinu robe koju su oni
poručili. Uslov je da je količina robe veća od 100 i da je merna jedinica
proizvoda komad. Podaci su grupisani na osnovu imena i prezimena kupaca,
dok je rezultat upita sortiran na osnovu količine robe u opadajućem redosledu.

Drugi upit:
Rezultat ovog upita je lista radnika i tip mašine za koju je radnik obučen.
Koristi se pod upit gde se proverava da li je stručna sprema radnika veća od
prosečne stručne spreme svih proizvodnih radnika. Ukoliko nije, ti radnici neće
biti izlistani.

Treći upit:
Izlistava imena i prezimena proizvodnih radnika i šefova, kao i ID radnog
naloga na kojem učestvuju. Uslov ovog upita je da su proizvodni radnik, kao i
šef zaposleni pre 2011 godine.

Četvrti upit:
Rezultat četvrtog upita je vrsta proizvoda, ukupna količina i merna jedinica.
Rezultat je grupisan na osnovu vrste i merne jedinice proizvoda. Proverava se
da li je ukupna količina proizvoda veća od prosečne količine proizvoda u
radnim nalozima. Ispis je prikazan u opadajućem nizu na osnovu količine
proizvoda.

Peti upit:
Izlistava radnike koji su vršili operacije za kupce, pod uslovom da su operacije
izvršene na brusilici, glodalici ili bušilici. Takođe se izlistavaju podaci o mašini
i nazivu proizvoda.
FUNKCIJE

U ovom poglavlju su detaljno opisane dve fukncije: BrojMasina i BrojNaloga.

Funkcija BrojMasina:
Ulazni parametri ove funkcije su: @datumOd i @datumDo. Izlazni parametar je
@brojMasina. Funkcija na osnovu dva ulazna datuma vraća broj mašina koje su
proizvedene između ta dva datuma. Broj mašina se dobija funkcijom COUNT,
prebrojavaju se sve mašine iz tabele TipRadneMasine, dok se pridružuje tabela
RadnaMasina gde se nalazi podatak o datumu proizvodnje mašina. Na osnovu
uslova gde datum mora biti uzmeđu dva ulazna parametra, vraća se broj mašina
koje zadovoljavaju navedeni uslov. Primeri poziva funkcije za validne datume:

Rezultati poziva:

Rezultat poziva koji nema validan ulazni parametar:


Funkcija BrojMasina:
Ulazni parametar funkcije je @jmbg. Izlazni parametar je @brojNaloga.
Funkcija vraća broj radnih naloga na kojima je proizvodni radnik angažovan
kao @brojNaloga. Broj naloga se dobija funkcijom COUNT koja prebrojava
sve radne naloge za koje važi da je MBRRadnika jednak ulaznom parametru.
Da bi se ova funkcija realizovala pridružile su se tabele RadnaLista i Operacija.
Primeri poziva funkcije sa validnim parametrima:

PROCEDURE

U ovom poglavlju su objašnjene procedure RadniNalogOperacije i


KupacPorudzbenica.

Procedura RadniNalogOperacije:
Ulazni parametar ove procedure je @RadniNalogID. Unos validnog ID-ja
radnog naloga rezultuje izlistavanjem svih operacija koje su povezane sa istim,
kao i radnike, ali i radne mašine nad kojima se te operacije izvršavaju.
Procedura prvo proverava da li postoji radni nalog sa tim ID-jem i to tako što
proverava da li za zadat radni nalog postoji količina robe. Pri kreiranju tabele
RadniNalog eksplicitno je navedeno ograničenje da svaki radni nalog mora da
ima količinu robe veću od 0. U slučaju da nema količine robe procedura vraća
ispis “Radni nalog sa ID-jem ne postoji.”. Ukoliko pak radni nalog ima
operacija, kreira se kursor uz pomoć kog se prolazi kroz listu operacija koje se
nalaze na unetom radnom nalogu i ispisuju se sledeće vrednosti: naziv
operacije, opis operacije, trajanje operacije, naziv tipa radne mašine, ime i
prezime radnika. Na kraju se ispisuje koliko je radni nalog imao operacija.
Ukoliko radni nalog nema operacija ispisuje se da radni nalog nema operacija.
Pozivi procedure za sva 3 slučaja:
Procedura KupacPorudzbenica:
Ulazni parametar ove procedure je @KupacID. Unos validnog ID-ja dovodi do
izlistavanja porudžbenica koje je kupac poručio. Pored toga izlistavaju se i
šefovi koji su te porudžbenice primili. Procedura prvo proverava da li postoji
radni nalog sa ID-jem kupca. Na osnovu toga proverava da li postoji količina
robe za radne naloge koji su povezani sa unetim kupcom. Količina robe
predstavlja zbir svih količina na svim radnim nalozima. Pri kreiranju tabele
RadniNalog eksplicitno je navedeno ograničenje da svaki radni nalog mora da
ima količinu robe veću od 0. Da se utvrdi postojanje kupca proverava se da li
postoji ime kupca sa zadatim ID-jem u bazi podataka. U slučaju da postoji
količina robe, kreira se kursor uz pomoć kog se izlistavaju radni nalozi i šefovi
koji su primili te radne naloge. U slučaju da ne postoji kupac ispisuje se “Ne
postoji kupac sa ID-jem.”. Pozivi procedure:
TRIGERI

ProizvodniRadnik triger:
Triger služi za implementaciju pravila koja glasi da proizvodni radnik ne može
u jednom trenutku da podigne svoj stepen stručne spreme za više od 1. U trigeru
se deklarišu dve promenjive, @staraSSS koja se dobija tako što se iz privreme
tabele deleted uzme vrednost SSSRadnika i @novaSSS koja se dobija iz
privremene tabele inserted za vrednost SSSRadnika. Proverava se da li se
izvršava ažuriranje atributa SSSRadnika. Zatim se proverava da li je trenutna
stručna sprema radnika 8 što je ujedno i maksimalna stručna sprema koju radnik
može da ima. Ukoliko jeste, neće se izvršiti ažuriranje već će se ispisati greška u
vidu poruke „Ne moze se povecati strucna sprema radnika za vise od jednog
stepena.“. Ukoliko uneti parametri zadovoljavaju uslove izvršiće se ažuriranje
tabele ProizvodniRadnik i biće uneta nova stručna sprema radnika. Navedena su
dva primera, jedan gde je uspešno uneta nova vrednost i drugi gde triger ne
dozvoljava unos u bazu:
ZAKLJUČAK

Na osnovu ER šeme, urađeni su DDL, DML, SQL upiti, funkcije, procedure i


trigeri. Evidencijom porudzbenica, a zatim i radnih naloga zaposleni imaju uvid
u vrstu, kao i količinu robe koju kupac zahteva. Ovo omogućava tačne i
precizne podatke u daljem angažovanju proizvodnih radnika u operacijama koje
se odvijaju kao i o radnim mašinama koje su uključene u iste. Na taj način
olakšava se svakodnevna evidencija pristiglih porudzbina, koja za krajnji cilj
ima poboljšanje poslovanja i efikasnosti u realizaciji radnih operacija.

Realizacijom ovog projekta nadogradio sam postojeća i stekao nova znanja, kao
i iskustvo. Prilikom razvoja projekta uočio sam potencijalna poboljšanja koja bi
unapredila projektovanu šemu baze podataka informacionog sistema za podršku
rada preduzeća za proizvodnju metalne galanterije čiji sam deo obuhvatio ovim
projektom.

You might also like