IT Eksamen! 08/05/2013 Indledning Dette projekt gik ud på, at designe og udvikle en hjemmeside til en kunde, som havde et problem med deres hidtidige løsning. Der skulle hermed laves en rapport, som forklarede problemet bag den hidtidige løsning og hvad den nye løsning skulle kunne. Hertil skulle der derfor vælges en udviklingsmodel, som skulle følges og opbygningen af det nye system skulle dokumenteres. Indholdsfortegnelse 1. Problemformulering! 4 2. Mål for projekt! 4 3. Brugere af systemet ! 4 3.1 Deltagere i projektet! 4 3.2 Uddannelse af brugere! 5 3.3 Information til medarbejderene! 5 4. Valg af udviklingsmodel! 5 5 Foreløbig afgrænsninger! 5 5.1 Mindmap! 6 5.2 Context Diagram! 6 5.3 Valg af kerne til hjemmeside! 6 6. Kravspecifikation! 6 6.1 Medarbejderne! 7 6.2 Brugervenlighed! 7 6.3 Systemet! 7 6.4 Vedligeholdelse! 8 6.5 Økonomi! 8 6.6 Sikkerhed! 8 6.7 Kompatibilitet! 8 6.8 Anskaffelse! 9 7. De første økonomiske overslag! Sebastian Nyholm! 9 HTX 3A! 2/39 IT Eksamen! 08/05/2013 8. Projekttidsplan! 9 8.1 Gantkort! 9 8.2 Milepæle! 10 9. Analyse! 11 9.1 Flowdiagram! 11 9.2 E/R Diagram! 12 9.3 Normalisering! 14 9.4 Datadictionary! 15 10. Konstruktion! 22 10.1 Designfasen! 22 10.2 Udviklingsfasen! 23 10.3 Forklaring af kodning! 24 11. Implementering! 30 12. Test og afprøvning! 30 13. Revision! 31 14. Bilag! 31 Sebastian Nyholm! HTX 3A! 3/39 IT Eksamen! 08/05/2013 1. Problemformulering Køkto er en isenkræmmer og de har haft en stor tilbagegang i salget i den seneste tid, grundet den udvikling vi har i dag. Tidligere foretog folk deres indkøb i byen, men som tiden er gået, er internettet og webshoppene blevet mere og mere populære og har derfor tiltrukket en stor del af kunderne. Køkto er her blevet overhalet og de bliver derfor nødt til at få lavet en hjemmeside, så de kan begynde at komme ind på e-handlen og få deres kunder tilbage, for ellers kan de ikke forsætte med positive tal. 2. Mål for projekt Målet med projektet er at få lavet en hjemmeside og identitet til Køkto, så de kan komme ind på markedet igen og få deres retmæssige kunder tilbage. Underforstået skal Køkto altså efter en vis tid begynde at få overskud igen, så de ikke bliver nødt til at lukke ned. 3. Brugere af systemet Herunder kan de grupper af folk, som skal være med ind over projektet ses samt hvilke uddannelser brugerne skal have og hvilke informationer der skal strømme mellem medarbejderne. 3.1 Deltagere i projektet Systemudviklingen skal foregå i samarbejde med Køktos markedsføring, økonomiafdelingen, vareafdelingen, kunder og udviklerne bag hjemmesiden. Dette projekt vil derfor have en lille gruppe af personer, som hver i sær skal være med til at klare en given opgave. Markedsføringen skal være med til at lave en identitet og de skal kunne ændre tilbud og reklamer på hjemmesiden. Økonomiafdelingen skal holde styr på økonomien bag projektet og kunne udtrække fakturer fra databasen. Vareafdelingen skal kunne gå ind på hjemmesiden og oprette produkter. Afdelingerne skal derfor have lidt indsigt i hvordan siden fungere, men udviklerne bag hjemmesiden vil holde den ved lige. Til selve udviklingen af hjemmesiden, skal der også være nogle kunder, som kan afprøve systemets funktionalitet, da det er vigtigt, at det er nemt for brugerne at finde rundt på hjemmesiden, tilføje ting til indkøbskurven og købe dem. I dette projekt vil det dog være eleven selv der skal stå for det meste, da det er et skoleprojekt. Sebastian Nyholm! HTX 3A! 4/39 IT Eksamen! 08/05/2013 3.2 Uddannelse af brugere Køktos medarbejdere behøver ikke den store IT uddannelse for at kunne håndtere dette, men en forståelse af IT og simple koder kan blive nyttigt. Kunderne behøver ingen uddannelse, da det skal være en webshop. De skal dog kunne finde ud af at bruge nettet og betale online. 3.3 Information til medarbejderene Medarbejderne skal kende målet for projektet. I dette tilfælde er det en ny identitet og en hjemmeside til Køkto. Informationer mellem medarbejderne skal også være flydende og der skal være forståelse mellem de forskellige parter. 4. Valg af udviklingsmodel Da dette projekt omhandler både udviklere, Køktos ansatte og kunder og herunder deres teknologi, de opgaver de beskæftiger sig med, personerne og strukturen i firmaet, er der tale om, at projektet berøre alle fire berøringsflader i Leavitts model. Dette vil sige, at det er et forholdsvis stort projekt. Dette medfører at fasemodellen er blevet valgt som udviklingsmodel og herunder FAKIR-modellen, da der er en tidsbegrænsning på projektet. Man kan derfor ikke side og prøve sig frem, da det vil tage for lang tid og muligvis ikke ende op med noget sammenhængene. Der vil dog blive brugt lidt iterativt til programmeringen, da man her skal prøve sig frem, for ikke at fejle i koderne. En anden grund til at fasemodellen er blevet valgt er, at hjemmesiden skal testes af kunderne samt medarbejdere og fungere så den er nem og håndterlig at arbejde med. 5 Foreløbig afgrænsninger I det følgende vil man kunne se et mindmap og et context diagram, som giver en ide om, hvilke afgrænsninger der vil være i projektet og tilsidst vil der blive forklaret hvilken kerne hjemmesiden vil blive opbygget af. Sebastian Nyholm! HTX 3A! 5/39 IT Eksamen! 08/05/2013 5.1 Mindmap Mindmappet viser grundstrukturen over hjemmesiden og hvilke ting der regnes med vil blive implementeret i den. 5.2 Context Diagram I context diagrammet kan man se, at kunderne skal kunne foretage en bestilling. Hermed skal Køkto sende kunden en fakture, hvorpå kunden kan se ordren. Hvis Køkto ikke lægger inde med varen, skal de konktake leverandøren og lave en ordre der og leverandøren skal dermed sende en følgeseddel. 5.3 Valg af kerne til hjemmeside Projektet skal laves fra bunden af, da Køkto havde tænkt sig at begynde på en frisk. Dvs. at der ikke vil blive taget et eksisterende system, som bare skal tilpasses. Man kunne dog komme ind på CMS systemer, som f.eks. Magento eller Wordpress, da de giver en god, solid og håndterlig backend, men da dette projekt går ud på at udvikle sit eget, vil dette ikke tages i brug. 6. Kravspecifikation Herunder kan der ses hvilke krav, der vil blive stillet til produktet, som projektet ender ud med. Sebastian Nyholm! HTX 3A! 6/39 IT Eksamen! 08/05/2013 6.1 Medarbejderne Medarbejderne skal kunne håndtere hjemmesiden og databasen uden de store problemer. Der regnes med, at medarbejderne får et lille kursus til at lære dette. Medarbejderne skal herefter kunne lære de nyansatte, som kommer senere, at bruge hjemmesiden og databasen og lave de udtræk der er brug for. De medarbejdere som arbejder med hjemmesiden, skal ud over deres egen uddannelse, som har gjort, at de enten kan finde ud af økonomien eller sørger for varelageret, skal også have en forståelse af lidt IT. Dette har dog en minimalt indflydelse, da de får et lille begynderkursus i det de skal kunne. Det kan dog give problemer for medarbejderne i forhold til at beholde jobbet, hvis ikke de kan finde ud af det. 6.2 Brugervenlighed Da dette er en webshop, som handler med køkkenudstyr, vil den primære målgruppe være kvinder i alderen 25-45 år. Denne målgruppe har normalt styr på de moderne medier og kan finde ud af at navigere rundt på hjemmesider og finde frem til det de søger. Kravende til hjemmesiden er derfor også, at den skal være nem at navigere rundt på og det skal være nemt at søge efter de produkter man leder efter. I den primære målgruppe må der derfor ikke forekomme de store problemer. Mænd i den samme alder eller unge skal også kunne klare disse krav, dog er de i anden række, i forhold til ændringer, da de ikke er den primære målgruppe. Ældre kunder skal helst også kunne klare det, men her er kravende ikke helt så høje, da de ofte ikke har helt så meget styr på de moderne medier samt at de også oftest foretrækker at handle i fysiske butikker. Navigationen og det at finde frem til måden man skal lede efter et produkt på, må ikke tage meget mere end 20 sekunder, hvis der arbejdes på det. Det regnes dog med, at dette vil tage omkring 10-15 sekunder for den gennemsnitlige bruger. Hjemmesiden skal også være hurtig at lære. Dette skal gerne tage samme tid, som det øvrige. Hvis man har været væk fra siden længe, er kravende det samme. 6.3 Systemet Systemet skal fungere optimalt, uden store fejl. Alt dataudtræk skal være i orden, men de informationer, som priser og tekster, som er lagret i databasen, kan der forekomme fejl i, hvilket ikke vil være et stort problem, men det regnes dog med, at der er tjek på det alligevel. Sebastian Nyholm! HTX 3A! 7/39 IT Eksamen! 08/05/2013 Systemet skal være tilfredsstillende, i forhold til tilgængelig, hvilket betyder, at det skal have en “oppetid” på 97-99%. 6.4 Vedligeholdelse Når hjemmesiden er færdig, skal brugen af vedligeholdelse være minimal. Den skal dog optimeres med tiden, eftersom der kommer nye standarder. Vedligeholdelse af webserver og hostnavn sker hos en udbyder. 6.5 Økonomi Med hjemmesiden regnes det med at omsætningen stiger. Omkostningerne til hjemmesiden skal være minimale, hvilket også er grunden til at vedligeholdelsen skal være minimal. Webserver og hostnavn regnes ikke med at ændre sig, så dette vil bare være det årlige abonnement. De omkostninger der er i de kursuser, som medarbejdere skal have for at kunne håndtere hjemmesiden, skal også være små, da det gerne skulle være overskueligt at lære hurtigt og efterhånden skal medarbejderne også kunne lære de nye medarbejdere det, i stedet for at de skal have kursuser udefra. 6.6 Sikkerhed Der vil være en persondatapolitik, som indbefatter kundernes data. Den data der bliver lagret om dem, skal være i sikkerhed og må kun bruges af kunderne selv. Login-systemet hos medarbejderne skal også være sikkert, så her skal passwords krypteres, så de ikke kan blive opsnappet af uvedkommende. 6.7 Kompatibilitet Systemet skal være kompatibelt til diverse browsere, herunder Internet Explorer, Google Chrome, Firefox, Safari og Opera. Systemet skal også fungere, hvis browserne opdateres, men dette plejer normalt ikke at hindre hjemmesiden i at fungere. Hvis det skulle hindre siden i at vise noget korrekt, skal dette løses, ved hjælp af vedligeholdelse. Sebastian Nyholm! HTX 3A! 8/39 IT Eksamen! 08/05/2013 6.8 Anskaffelse Da hjemmesiden og identiteten bliver lavet af mig selv, vil der ikke forekomme noget udbudsmateriale eller indhentning af nogle tilbud. Forhandlinger vil der heller ikke være nogle af og kontrakten findes ikke. Implementering og test af hjemmesiden vil ske af mig selv og i givet fald nogle brugere. Andre øjne på produktet er her nødvendigt, da fejl og mangler skal findes og man ofte overseer noget selv eller ikke har sammen opfattelse af ting. 7. De første økonomiske overslag Til dette projekt er der beregnet en arbejdstid på 36 timer i skolen og 50 timer hjemme af en enkelt elev. Dette er til udarbejdelse af en rapport over projektet samt et færdigt produkt. Ud over elevens timer, skal der også være nogle ansatte i firmaet, som skal kunne bruge produktet. Det vil derfor sige, at der skal afsættes et par timer til de nødvendige ansatte, så de kan håndtere produktet uden at skulle have en livesupporter til rådighed. 8. Projekttidsplan Tidsplanen over projektet er blevet sat op i et gantkort samt et milepælsskema, så man kan følge fremgangen i projektet og se om det følger tidsplanen. 8.1 Gantkort Aktivitet Foranalyse Analyse Kravspecifikation Systemdesign Uge 6 Uge 8 1 1 2 Uge 9 Uge 10 Uge 11 Uge 12 Uge 14 Uge 15 Uge 16 4 4 4 4 4 5 5 5 Uge 17 Uge 18 2 3 3 4 System- og brugertest Implementering 5 6 6 Test og aflevering 7 Revision 8 Sebastian Nyholm! Uge 19 HTX 3A! 8 9/39 IT Eksamen! 08/05/2013 1. Foranalyse går ud på at samle information om projektet og beskrive hvilke rammer der er. 2. Analyse går mere i dybden end foranalysen. Her kan der beskrives hvilke ting der er brug for og hvilke krav der er til det endelige produkt. 3. Kravspecifikation er der hvor man opstiller de krav der er til produktet. 4. Systemdesign er når selve produktet skal designes og laves. 5. System- og brugertest er når produktet skal testes for fejl og mangler samt om det er brugervenlig i den forstand om de kan håndtere det. 6. Implementeringen er når produktet skal implementeres i firmaet. 7. Test og aflevering er når det hele produktet skal testes og afleveres til Køkto. 8. Revisionen er når produktet har været i drift i en aftalt periode og det tages op til en diskusion. 8.2 Milepæle Planlagt sluttidspunkt Aktivitet Køktos hjemmeside Milepæle Uge 8 Foranalyse Skal være færdig Uge 9 Analyse Skal være færdig Uge 10 Kravspecifikation Skal være færdig Uge 16 Systemdesign Skal være færdig Uge 17 System- og brugertest Skal være færdig Uge 18 Implementering Skal være færdig Uge 18 Test og aflevering Skal være færdig Uge 19 Revision Skal være færdig Sebastian Nyholm! HTX 3A! 10/39 IT Eksamen! 08/05/2013 9. Analyse Her vil ideer og diagrammer for hjemmesidens struktur blive dannet og forklaret, da det giver et grundlag for selve hjemmesidens opbygning. 9.1 Flowdiagram Smid v are Udskriv søgning en til ku nden Søgn ing Kunde i kurv Kunde indtaster 2. Sammenlign og print b ren Ord 1. Indtastning 3. Smid vare i kurv Var ein fo re kommer i gang Ord bi ne r Ordre jem me 6. Modtagelse af vare og opdatering k a l tj re s Od k es 5. Sammenlign varer og ordre ek k e vare noteres Solgt Status Faktura af solgte vare Regnskab er d at af n Op te va 4. Sammenlign kundeinfo og kurv es jek Bestil vare, hvis ikke hjemme Lis ye et r rh Va va ren e Opdatering al ro m nr. lkø dt sen te fte Kundeinfo Ko m Kunde ftes kræ i at rs lle te fte ræ ek rb live n be Odre S ø g e k rite r i e r Varer da ta re 7. Modtagelse af fakture og indtastning Leverandør Fakt ur a I flowdiagramet kan man se hvordan alt data skal flyde rundt inde i systemet. Dette er dog kun et midlertidligt udkast, da det sandsynligvis vil ændre sig i løbet af designperioden. I denne skitse, vil en kunde begynde med at søge efter noget og derved vil søgningen og databasens ord blive sammenlignet og de steder hvor der er et match vil der blive printet noget på siden. Herefter kan kunden smide varen i kurven og søge igen. Når kunden køber varen, vil der blive tjekket om der allerede er en identisk kunde. Hvis tilfældet er ja, vil denne data blive hentet fra databasen og hvis tilfældet er nej, vil der blive oprettet en ny. Ordren vil herefter blive placeret i en ordre tabel, som skal kobles sammen med kunden og de vare der bliver købt. Mens dette sker, vil der også være en tabel, som holder styr på hvor meget der er blevet solgt af hver ting, så man ved hvad der er populært. Samtidig tjekkes der for om varerne er på lager og hvis dette ikke er tilfældet vil Køkto blive informeret om, at de skal bestille nogle vare hos leverandøren. Kunden vil herefter blive informeret om, at ordren er blevet sat i værks eller sat i kø. Sebastian Nyholm! HTX 3A! 11/39 IT Eksamen! 08/05/2013 9.2 E/R- & Datastrukturdiagram Ud fra ovenstående flowdiagram er følgende E/R diagram lavet: Her kan det første udsnit af E/R diagramet ses. Her kan man se, at det er en mange til mange kardinalitet, hvilket betyder, at der skal oprettes en relationstabel. Indtil videre vil der derfor være tre tabeller i alt. Hvis man indsætter nogle rækker i disse tabeller, vil det derfor komme til at se ud som følgende: I disse tabeller kan det ses, at hvis en kunde køber en vare, vil den blive linket via ordretabellen til den egentlige vare. fk_ står for foreign key, og betyder, at den hænger sammen med den oprindelige. Der opstår dog et problem her, hvis en kunde gerne vil købe mere end en vare, da der i dette tilfælde skal oprettes to ordrer, da en ordre kun kan indeholde et product_id. Der skal derfor laves en tabel yderligere. Det vil nu være muligt for en kunde at bestille mere end en vare pr. ordre og order_date og order_time er blevet taget med i orders tabellen, så man kan holde styr på hvornår ordren er lavet samt, så man kan finde den præcise ordre, når man skal oprette og opdatere de andre tabeller i forhold til ordren. Hvis man udvider varetabellen, vil den også få nogle flere rækker. Sebastian Nyholm! HTX 3A! 12/39 IT Eksamen! 08/05/2013 Her kan det ses, at product_brand og product_category er punkter, som gerne må indholde mere data, hvilket gør, at der vil blive oprettet tabeller til dem hver i sær. Der er en m-m kardinalitet mellem kategorier og vare, da en vare godt kan lægge under flere kategorier og en kategori godt kan have flere vare. Der er en 1-m kardinalitet mellem vare og brands, da en vare kun kan have et brand, mens et brand godt kan have flere vare. Her kan det ses, hvordan tabellerne skal designes. Her kan man se, hvordan brands- og kategoritabellerne blive koblet sammen. Grundet m-m kardinaliteten, bliver kategorier-vare lavet og grundet 1-m kardinaliteten, bliver brands koblet direkte sammen med vare. En sidste tabel der mangler at blive nævnt i dette emne, er den tabel der holder styr på hvor meget der er blevet solgt af hver ting. Den vil komme til at blive koblet sammen med varer-tabellen på følgende måde. Sebastian Nyholm! HTX 3A! 13/39 IT Eksamen! 08/05/2013 sold_pieces kolonnen kunne også være blevet optaget inden i varer-tabellen for at slippe for en tabel, men for at holde en adskillelse af informationerne er det blevet valgt at give den sin egen tabel. Der er også nogle resterende tabeller, men de er ikke koblet sammen med nogle andre. Dette forklares under systemdesign. En oversigt over alle tabellerne og deres relationer kan ses i bilag 7. 9.3 Normalisering Der er ikke meget normalisering at lave, da tabellerne allerede opfylder de fleste krav inden for dette. En tabel er på 1. normalform, hvis: • Tabellen har en nøgle. • Alle tabellens poster har det samme antal felter. Disse kriterier er opfyldt. I 2. normalform, fjerner man redundans, da redundans medføre at databasen fylder mere, besværliggør opdateringer og kan medføre inkonsistens i databasen. Inkonsistens er når data optræder forskelligt flere steder i databasen. På 2. normalform deler man derfor tabellen op i flere tabeller. Disse kriterier er også opfyldt, hvilket kunde og ordre tabellerne kan være et eksempel på. Hvis de to tabeller ikke var delt i to ville en kunde optræde flere gange i træk, for hver ordre kunden havde foretaget sig og dette ville medfører redundans, da de samme data ville optræde flere steder i databasen. For at en tabel er på 3. normalform skal tabellen være på 2. normalform og alle tabellens felter, som ikke er nøglefelter, må kun være afhængig af tabellens nøglefelt (id). Dette er også blevet gjort på flere af tabellerne, men i kundetabellen optræder postnr. og by navn, hvilket i realiteten afhænger af hinanden, men da kunder kan lave tastefejl, er det blevet valgt, at lade dem være uafhængige af hinanden, så ordren kan sammenlignes, hvis en tastefejl skulle ske. Sebastian Nyholm! HTX 3A! 14/39 IT Eksamen! 08/05/2013 9.4 Datadictionary Her kan ses, hvilke værdier alle rækkerne i tabellerne i databasens skal have. Systemnavn Dato Udført af Projektstyring 2013 - uge 9 Sebastian Nyholm Tabelnavn Relaterer til admins ingen Nr Datanavn Datatype Format Egenskaber 1 admin_id INT auto++ Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Unik 2 admin_username Varchar Max 55 tegn Skal udfyldes Unik 3 admin_password Varchar Max 255 tegn Skal udfyldes Systemnavn Dato Udført af Projektstyring 2013 - uge 9 Sebastian Nyholm Tabelnavn Relaterer til admin_menus ingen Nr Datanavn Datatype Format Egenskaber 1 admin_menu_id INT auto++ Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Unik 2 admin_menu_parent_id INT Max 11 tegn Skal udfyldes 3 admin_menu_title Varchar Max 55 tegn Skal udfyldes 4 admin_menu_link Varchar Max 255 tegn Skal udfyldes Sebastian Nyholm! HTX 3A! 15/39 IT Eksamen! 08/05/2013 Systemnavn Dato Udført af Projektstyring 2013 - uge 9 Sebastian Nyholm Tabelnavn Relaterer til brands products Nr Datanavn Datatype Format Egenskaber 1 brand_id INT auto++ Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Unik 2 brand_name Varchar Max 55 tegn Skal udfyldes 3 brand_description Varchar Max 255 tegn 4 brand_img Varchar Max 255 tegn 5 brand_link Varchar Max 255 tegn Systemnavn Dato Udført af Projektstyring 2013 - uge 9 Sebastian Nyholm Tabelnavn Relaterer til categories categories_products - products Nr Datanavn Datatype Skal udfyldes Format Egenskaber 1 category_id INT auto++ Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Unik 2 category_name Varchar Max 55 tegn Skal udfyldes 3 category_description Varchar Max 255 tegn 4 category_img Varchar Max 255 tegn 5 category_link Varchar Max 255 tegn Sebastian Nyholm! HTX 3A! Skal udfyldes 16/39 IT Eksamen! 08/05/2013 Systemnavn Dato Udført af Projektstyring 2013 - uge 9 Sebastian Nyholm Tabelnavn Relaterer til categories_products categories - products Nr Datatype Datanavn Format Egenskaber 1 id INT auto++ Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Unik 2 fk_product_id INT Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres 3 fk_category_id INT Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Systemnavn Dato Udført af Projektstyring 2013 - uge 9 Sebastian Nyholm Tabelnavn Relaterer til customers orders Nr Datanavn Datatype Format Egenskaber 1 customer_id INT auto++ Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Unik 2 customer_name Varchar Max 55 tegn Skal udfyldes 3 customer_address Varchar Max 55 tegn Skal udfyldes 4 customer_zip INT Max 11 tegn Skal udfyldes 5 customer_city Varchar Max 55 tegn Skal udfyldes 6 customer_email Varchar Max 255 tegn Skal udfyldes 7 customer_phone INT Max 11 tegn Sebastian Nyholm! HTX 3A! 17/39 IT Eksamen! 08/05/2013 Systemnavn Dato Udført af Projektstyring 2013 - uge 9 Sebastian Nyholm Tabelnavn Relaterer til menus Nr Datanavn Datatype Format Egenskaber 1 menu_id INT auto++ Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Unik 2 parent_id INT Max 11 tegn Skal udfyldes 3 title Varchar Max 255 tegn Skal udfyldes 4 link Varchar Max 255 tegn Skal udfyldes Systemnavn Dato Udført af Projektstyring 2013 - uge 9 Sebastian Nyholm Tabelnavn Relaterer til opening_hours Nr Datanavn Datatype Format Egenskaber 1 opening_hours_id INT auto++ Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Unik 2 days Varchar Max 55 tegn Skal udfyldes 3 time Varchar Max 55 tegn Skal udfyldes Sebastian Nyholm! HTX 3A! 18/39 IT Eksamen! 08/05/2013 Systemnavn Dato Udført af Projektstyring 2013 - uge 9 Sebastian Nyholm Tabelnavn Relaterer til orders customers - orders_products Nr Datanavn Datatype Format Egenskaber 1 order_id INT auto++ Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Unik 2 fk_customer_id Varchar Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres 3 order_data Date 4 order_time Varchar Max 11 tegn Skal udfyldes 5 order_total_amount Int Max 11 tegn Skal udfyldes Skal udfyldes Systemnavn Dato Udført af Projektstyring 2013 - uge 9 Sebastian Nyholm Tabelnavn Relaterer til orders_products orders - products Nr Datanavn Datatype Format Egenskaber 1 id INT auto++ Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Unik 2 fk_order_id INT Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres 3 fk_product_id INT Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres 4 order_product_pieces INT Max 11 tegn Skal udfyldes Sebastian Nyholm! HTX 3A! 19/39 IT Eksamen! 08/05/2013 Systemnavn Dato Udført af Projektstyring 2013 - uge 9 Sebastian Nyholm Tabelnavn Relaterer til products orders_products - category_products - brands sold Nr Datanavn Datatype Format Egenskaber 1 product_id INT auto++ Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Unik 2 fk_brand_id INT Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres 3 product_title Varchar Max 255 tegn Skal udfyldes Skrivebeskyttet Indekseres 4 product_pieces INT Max 11 tegn Skal udfyldes 5 normalprice Varchar Max 11 tegn Skal udfyldes 6 saleprice Varchar Max 11 tegn Skal udfyldes Skrivebeskyttet 7 onsale Varchar Max 1 tegn Skal udfyldes Skrivebeskyttet Indekseres 8 product_link Varchar Max 255 tegn Skal udfyldes 9 product_img Varchar Max 255 tegn Skal udfyldes 10 product_description TEXT Sebastian Nyholm! HTX 3A! 20/39 IT Eksamen! 08/05/2013 Systemnavn Dato Udført af Projektstyring 2013 - uge 9 Sebastian Nyholm Tabelnavn Relaterer til services Nr Datanavn Datatype Format Egenskaber 1 service_id INT auto++ Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Unik 2 parent_id INT Max 11 tegn Skal udfyldes 3 service_name Varchar Max 55 tegn Skal udfyldes 4 service_information TEXT 5 service_link Varchar Max 55 tegn Skal udfyldes 6 service_img Varchar Max 55 tegn Skal udfyldes Skal udfyldes Systemnavn Dato Udført af Projektstyring 2013 - uge 9 Sebastian Nyholm Tabelnavn Relaterer til side_banner Nr Datanavn Datatype Format Egenskaber 1 side_banner_id INT auto++ Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Unik 2 side_banner_title Varchar Max 55 tegn Skal udfyldes 3 side_banner_img Varchar Max 255 tegn 4 side_banner_link Varchar Max 255 tegn Sebastian Nyholm! HTX 3A! Skal udfyldes 21/39 IT Eksamen! 08/05/2013 Systemnavn Dato Udført af Projektstyring 2013 - uge 9 Sebastian Nyholm Tabelnavn Relaterer til sold products Nr Datanavn Datatype Format Egenskaber 1 sold_id INT auto++ Max 11 tegn Skal udfyldes Skrivebeskyttet Indekseres Unik 2 fk_product_id INT Max 11 tegn Skal udfyldes Skrivebeskyttet 3 sold_pieces INT Max 11 tegn Skal udfyldes Skrivebeskyttet Hermed er alle tabellerne i databasen blevet lavet, i form af datatyper og rækker. 10. Konstruktion 10.1 Designfasen I designfasen blev logoet først designet, da det giver dem deres grundidentitet. Bilag 1 viser logoet. Denne identitet (farver, former, tekst, osv.) skal nemlig gå igen gennem hele deres hjemmeside, så det hele går op i en højere enhed og ikke bare er tilfældige farver der er smidt ind, hvor det nu så godt ud. Hjemmesiden er herefter blevet designet i photoshop og senere blevet implementeret på deres hjemmeside i form af html og php. Designet er dog kun retningslinjer for kodningen, da der oftest bliver foretaget små ændringer fra designperioden og til selve kodningen. I bilag 2, 3, 4 og 5 kan disse designs ses. Man kan se den grønne farve fra logoet går igen ved informationer, da denne farve er rolig og giver en naturlig fornemmelse. Den orange farve er ikke synlig på nogle af disse billeder, men den er blevet implementeret i koderne, så den optræder når et produkt er på tilbud. Denne farve repræsentere nemlig varme og energi og giver kunderne en lyst til at købe tingene. Den blå farve er brugt under kundeservice i få tilfælde, da den repræsentere troværdighed og pålidelighed. Her skal Køkto nemlig vise at de er en seriøs virksomhed og at det er sikkert at handle hos dem. Denne farve kan også først ses på hjemmesiden. Ud over det grafiske design er der også hjemmesidens struktur, som handler om, hvordan folk skal kunne bevæge sig rundt på hjemmesiden. Her er det nemlig vigtigt at man finder en overskuelig måde for folk at bevæge sig rundt på, så kunderne ikke bliver forvirret og Sebastian Nyholm! HTX 3A! 22/39 IT Eksamen! 08/05/2013 ender steder de ikke ønskede. Det er derfor vigtigt at der bliver lavet en retningslinje for, hvordan siden skal opbygges og hvilke sider der skal kobles sammen. På bilag 6 kan et diagram ses for den designede struktur. Tanken bag dette design var, at det skulle være nemt for brugeren at finde produkterne fra forsiden, så kunden får lyst til at handle der. Det skulle også være nemt at bevæge sig rundt på siden og ensformigt, hvilket er grunden til at toppen af alle siderne, også kaldet “en header” er identiske og indholder en fast menu. Samtidig skulle det også være nemt for kunden at finde informationer om Køkto og deres handlingsmåde under kundeservice, hvilket er grunden til, at bunden af hver eneste side, også kaldet “en footer”, har en menu med kundeservice, så man kan komme direkte til det ønskede, hvis man har spørgsmål, fra hvilken som helst side. Det er også blevet valgt, at næsten alt på hjemmesiden i form af billeder, tekst og links, skal være database udtræk. Dette er også grunden til, at der under E/R diagrammer, blev nævnt, at der også var nogle andre tabeller, som kunne ses i bilag 7. Grunden til dette er blevet valgt er, at man så ikke behøver gå ind i html’en eller php’en for at ændre en ting, men at det kan gøres ved brug af databasen. 10.2 Udviklingsfasen Til at begynde med, skal databaserne laves ud fra normaliseringens resultat og fyldes op med data. Efter dette skal hjemmesiden kodes. Her vil forsiden først blive lavet og generelt for alle siderne, vil de blive opbygget af <div> tags, som er små firkantede bokse, som man kan placere som man vil, ud fra et tilhørende stylesheet. Når disse bokse er placeret ordenligt, kan man begynde at indsætte tekster, billeder, priser osv. ud fra udtrak fra databasen. Hele denne opsætning sker ud fra de designs, som er blevet lavet af siderne. Der er dog ingen koder, som er blevet lavet på forhånd, hvilket gør, at man bliver nødt til at gå iterativt til værks, for at få det til at virke. Efter forsiden er blevet lavet, kan den deles op i tre separate dokumenter. En header, en footer og en indexfil. Headeren og footeren bliver lavet, da det skal gå igen på alle siderne og ved at lave separate dokumenter for disse, behøvede man ikke kopiere dem ind på de næste sider. Man kan her include dem i stedet i toppen og i bunden og derved spare en masse kodning. Indexfilen er det, som kan ses specielt på forsiden mellem headeren og footeren, ligesom alle undersiderne også vil have deres specielle indhold mellem headeren og footeren. Alle undersiderne kan herefter kodes, men her begynder man som nævnt, med at include headeren og footeren, hvilket gør, at man begynder med en allerede predesignet side, hvor indholdet mellem top og bund kun skal kodes. Dette gør, at man sparer en vis tid på Sebastian Nyholm! HTX 3A! 23/39 IT Eksamen! 08/05/2013 kodningen og ud over det, gør en header og en footer også, at designet vil være fast og ikke flytte sig eller ændre sig. Footeren vil selvfølgelig flytte sig lidt i højden, da alle siderne ikke har samme højde, men andre ændringer vil ikke kunne ske. 10.3 Forklaring af kodning På hjemmesiden er der en række sider, som alle indholder html, CSS og php. Alt kodningen vil derfor ikke blive forklaret, men lidt af hver slags vil blive forklaret, så man har en chance for at forstå det resterende. Først vil det mest brugte html blive brugt, da dette er nemmest at forstå. <div id=”navn”> </div> Denne tag laver en firkant, som nævnt tidligere og bruges til at bygge hjemmesiden op af. Man kan ved hjælp af et stylesheet, som er koblet sammen med dokumentet, nemt ændre størrelser, former og farver mm. på div’en, hvis det ønskes. <ul> ! <li></li> ! <li></li> </ul> Denne tag bygges punkter op med. <ul> begynder punktrækken, mens <li> er den der laver hver enkelt punkt. Disse tags bruges også til at lave menuer med, hvilket bruges en del på siden. Man kan også style denne som det ønskes. For lige at se et eksempel på et stylesheet er her et uddrag fra en. #menu { ! width: 711px; ! height: 50px; ! float: left; } #menu ul { ! list-style: none; ! float: right; ! margin-top: 20px; } Sebastian Nyholm! HTX 3A! 24/39 IT Eksamen! 08/05/2013 #menu ul li { ! float: left; } #menu ul li a { ! color: black; ! text-decoration: none;! ! padding: 10px; ! font-size: 16px; } #menu ul li a:hover { ! padding: 10px; ! background-color: black; ! color: white; } Denne del af stylesheetet styler hovedmenuen på hjemmesiden, som lægger under en div kaldet menu. De resterende ting indenfor html’en vil ikke blive forklaret her, da det er meget simple tags. Mere info om dem kan findes på http://www.w3schools.com. Php’en er den lidt mere indviklet del af kodningen, men her vil nogle uddrag fra siden blive eksemplificeret. <?php ! // Start the session ! session_start(); ?> Denne kode står i toppen af hver side. Den begynder enten en ny periode på hjemmesiden for den enkelte besøgene eller henter ældre oplysninger om den besøgene, som gemmes i form af cookies. På Køkto’s hjemmeside bruges denne til indkøbskurven, så den husker hvilke varer der er i den eller til backenden, hvor den kan tjekke om man er logget ind eller ej. <?php ! php include_once('inc/header.php'); ?> Sebastian Nyholm! HTX 3A! 25/39 IT Eksamen! 08/05/2013 Denne kode bruges til at hente noget ind på den pågældende side man er på. Dette gøres, som nævnt tidligere, for at man f.eks. ikke behøver at lave toppen af hjemmesiden på hver enkelt side, men i stedet bare hente det udefra. <?php $brand = $_GET['brand']; ?> Denne kode bruges til at hente noget i url’en, så man kan hente det rigtige ind på den side man kommer til. I dette tilfælde henter den det brand_id, som står efter brand i url’en, hvis der klikkes på et brand under produkter. Herfra henter den så alle de produkter frem og viser dem, som har det samme fk_brand_id, som det der blev hentet fra url’en. <?php function writeShoppingCart() { ! $cart = $_SESSION['cart']; ! if (!$cart) { ! ! ! } else { ! ! // Parse the cart session variable ! ! $items = explode(',',$cart); ! ! $s = (count($items) > 1) ? 's':''; ! ! return '<div id="cart_count"><a href="cart.php">('.count($items).')</div><img src="img/graphics/cart.png"/></a>'; ! } return '<div id="cart_count"><a href="cart.php">(0)</div><img src="img/graphics/cart.png"/></a>'; ?> Denne kode er en funktion kaldet “writeShoppingCart”, som viser hvor mange varer der er i indkøbskurven. Den virker i samarbejde med session_start();, som blev nævnt tidligere. Denne kode siger, at hvis variablen $cart er tom, skal den vise 0 ved indkøbskurven og ellers skal den tælle hvor mange items der er og vise det tal. Funktioner lægger typisk i et seperat dokument sammen, som blive included i headeren. Herved kan man så vise en funktion et vilkårligt sted med følgende kode: <? ! echo writeShoppingCart(); ?> Nu vil der komme nogle eksempler på my_sql kald, da stort set hele siden er opsat af databaseudtræk. På forsiden kan man se ni forskellige produkter på tilbud. Her er koden for dette: Sebastian Nyholm! HTX 3A! 26/39 IT Eksamen! 08/05/2013 <div id="index_right_column"> ! <?php ! $sql = "select * from kokto_products ! LEFT JOIN kokto_brands ON brand_id = fk_brand_id ! ! ! where on_sale='Y' limit 9"; ! $result = mysql_query($sql) or die(mysql_error()); ! while ($row = mysql_fetch_assoc($result)) ! { ! ?> ! <div id="index_right_column_box"> ! ! <div id="index_product_img"> ! ! ! <a href="<?=$row['product_link'];?>"> ! ! ! ! ! ! ! </a> ! ! ! <div id="index_product_rabat"> ! ! ! <h1>spar <? $price = $row['normalprice']; ! ! ! ! $sale = $row['saleprice']; ! ! ! ! $save = ($price - $sale) / $price * 100; ! ! ! ! echo round($save, 0) . "%"; ! ! ! ?></h1> ! ! </div> ! ! <? if($row['product_pieces'] <= 0) ! ! { ! ! ?> ! ! ! <div id="index_product_pieces"> ! ! ! ! ! ! ! </div> ! ! <? ! ! } ! ! ?> ! </div> ! <div id="index_product_title"> ! ! ! </div> ! <div id="index_product_brand"> ! ! ! </div> ! <div id="index_product_price"> ! ! ! </div> Man kan se, at dette udtræk sker i en masse forskellige div, hvilket er grunden til opsætningen er som den er. ! Til at begynde med selecter den tabellen “kokto_products” og siger, at tabellen “kokto_brands”, hvor fk_brand_id = brand_id skal være tilgængelige. <img src="<?=$row['product_img'];?>"/> Kriterierne for de ting der skal vises, er at kolonnen on_sale i kokto_products skal være lig med Y. Herefter laves der en while lykke, som viser de forskellige udtræk i en bestem rækkefølge. Ved <h1> tagen regnes procentdelen man spare ud og vises i diven index_product_rabat. <img src="img/graphics/udsolgt.png"/> “If statementet” gør, at hvis der ikke er flere af et givent produkt på lager, vil der automatisk stå udsolgt over det. Det resterende af while lykken er udtræk af information om produktet samt et link til selve produktet. <?=$row['product_title'];?> <?=$row['brand_name'];?> før <?=$row['normalprice'];?>,- ! <div id="index_product_sale"> ! ! ! </div> ! <div id="index_product_read_more"> ! ! ! </div> ! </div> DKK <?=$row['saleprice'];?>,- <a href="<?=$row['product_link'];?>">læs mere</a> Sebastian Nyholm! HTX 3A! 27/39 IT Eksamen! ! <?php ! } ! ?> 08/05/2013 </div> Når der placeres en ordre, sker der også en masse sql aktiviter. Her skal der både oprettes en kunde, hvis ikke kunden findes. Der skal oprettes en ordre samt opdateres i diverse tabeller i forhold til antal varer tilbage og hvor mange varer der er solgt af det givne. Alt dette sker inden i en funktion, men her vil vi nøjes med de forskellige sql aktiviter. <?php if(isset($_POST['send_order']) and $_POST['name'] != '' and $_POST['address'] != '' and $_POST['zip'] != '' and $_POST['city'] != '' and $_POST['email'] != ''){ ! ! ! $name = $_POST['name']; ! ! $address = $_POST['address']; ! ! $zip = $_POST['zip']; ! ! $city = $_POST['city']; ! ! $email = $_POST['email']; ! ! $phone = $_POST['phone']; Her vil der ud fra en html form, blive lavet nogle variabler, hvis der trykkes på submitknappen i formen. Hvis nogle af de inputfelter i formen er tomme, som ikke må være det, vil der komme en lille tekst om, at de skal udfyldes, men hvis ikke, vil følgende ske: Først vil den hente informationer i customers tabellen: $sql = "SELECT * FROM kokto_customers where customer_name = '$name' and customer_address = '$address' and customer_zip = '$zip'";! ! $result = mysql_query($sql) or die(mysql_error()); while($row = mysql_fetch_assoc($result)) { ! $name1 = $row['customer_name']; ! $address1 = $row['customer_address']; ! $zip1 = $row['customer_zip']; } Her henter den nogle udtrak, hvis kriterierne for søgningen gav noget. De variabler sammenlignes så med nogle af dem fra inputsne i formen. Sebastian Nyholm! HTX 3A! 28/39 IT Eksamen! 08/05/2013 if($name == $name1 and $address == $address1 and $zip == $zip1) {} else { ! mysql_query("INSERT INTO kokto_customers (customer_name, customer_address, customer_zip, customer_city, customer_email, customer_phone) VALUES ('$name', '$address', '$zip', '$city', '$email', '$phone')")or die(mysql_error());! } Hvis disse inputs er identiske med de udtrak fra tabellen, vil der ikke ske noget, men hvis ikke, vil der blive oprettet en ny kunde. Bagefter vil ordren blive oprettet med et customer_id, som er blevet hentet ligeledes fra customers tabellen. mysql_query("INSERT INTO kokto_orders (fk_customer_id, order_date, order_time, order_total_amount) VALUES ('$customer_id', '$date','$time', '$total')")or die(mysql_error()); Herefter vil den opdatere producttabellen, med et nyt antal varer tilbage, af de solgte. $sql = "SELECT * FROM kokto_products where product_id = '$id'";! ! $result = mysql_query($sql) or die(mysql_error()); while($row = mysql_fetch_assoc($result)) { ! $pieces_left = ($row['product_pieces'] - $qty); ! ! mysql_query("UPDATE kokto_products SET product_pieces='$pieces_left' WHERE product_id='$id'") or die(mysql_error()); } Her har den fået et product_id fra da ordren blev placeret ud fra sessionen og sendt det videre til products tabellen. Den vil ligeledes opdatere sold tabellen, med antal solgte varer. Tilsidst vil denne funktion sende emails til kunden og Køkto, om at ordren er gået igennem og blevet modtaget. mail($to, $subject, $message, $headers); Variablerne er tidligere i dokumentet blevet lavet, men her ses den del der sender mailen. Sebastian Nyholm! HTX 3A! 29/39 IT Eksamen! 08/05/2013 En sidste sql aktivitet der er med, dog ikke i denne funktion, men under backenden, hvor man kan fjerne produkter er delete. Denne bruges til at fjerne produkter fra products tabellen. if(isset($_POST['remove_product'])) { ! $product_id = $_POST['product_id']; ! ! ! mysql_query("DELETE FROM kokto_products where product_id='$product_id'") or die(mysql_error());! ! ! ! mysql_query("DELETE FROM kokto_categories_products where fk_product_id='$product_id'") or die(mysql_error());! ! } Her ses, at hvis der trykkes på en submitknap, vil der ske det, at den henter et product_id fra formen og deleter de rækker i tabellerne kokto_products og kokto_categories_products hvor product_id’et matcher. Hvis man er mere nysgerrig i kodningen, kan man se det inde i php dokumenterne, hvor hjemmesiden er bygget op. 11. Implementering Køktos produkter er fra første dag blevet brugt som tests på hjemmesiden, da det er disse produkter der skal sælges og derfor også disse produkter hjemmesiden skal bygges op af. Der skal dog ændres på diverse priser, tekster og antal, da det er op til de ansatte selv at indtaste det. Hjemmesiden skal også flytte domæne, da den ikke skal lægge på et domæne under et andet. 12. Test og afprøvning Der har ikke været store teste og afprøvninger, da det ikke har været muligt at få en stor håndfuld mennesker til at prøve den, men få bekendte har afprøvet hjemmesiden og fået lavet en ordre, hvilket også har virket. Backenden er det kun mig selv der har siddet med, men de funktioner den har, har også virket for mig. Sebastian Nyholm! HTX 3A! 30/39 IT Eksamen! 08/05/2013 13. Revision Denne del er svær at komme ind på, da hjemmesiden ikke er blevet taget rigtigt i brug og derfor ikke er blevet undersøgt for mangler. Man kan dog tale om de ting, man gerne ville forbedre eller ikke var tilfredse med. Et bedre betalingssystem ville f.eks. ikke have været nogle ulempe, da bankoverførelser ikke er særlig troværdige samt at det ikke giver virksomheden den seriøsitet de gerne ville have. Et loginsystem til kunderne ville også være en mulig forbedring, da mange kunder ofte mener at de er i sikre hænder, hvis de kan være medlem eller have en bruger hos en webshop. Samtidig gør det også, at kunderne bliver mere loyale overfor butikken, hvilket gør, at de kommer tilbage. Der mangler også en oploader, så man kan oploade billeder til serveren. Man kan dog gøre dette manuelt, hvis man kan finde ud af at tilslutte en ftp server. Når man skal oprette et produkt, skal man også nu kende en del informationer fra databasen, da linket f.eks. afhænger af det id produktet får. Her ville det derfor være godt, hvis nogle af felterne blev automatiseret, så man ikke behøvede kende disse værdier. 14. Bilag Bilag 1 - Design af logo og identitet. Bilag 2 - Predesign af forside Bilag 3 - Predesign af siden med produkter Bilag 4 - Predesign af siden med et specifikt produkt Bilag 5 - Predesign af indkøbskurven Bilag 6 - Design af hjemmesidens struktur Bilag 7 - Oversigt over alle tabellerne og deres relationer Bilag 8 - Logbog Sebastian Nyholm! HTX 3A! 31/39 IT Eksamen! 08/05/2013 Bilag 1 - Her kan man se Køktos nye logo, som indeholder de standarder, som skal gå igen over hele deres hjemmeside. Sebastian Nyholm! HTX 3A! 32/39 IT Eksamen! 08/05/2013 Bilag 2 - Her kan man se et tidligt design af forsiden inden den blev kodet. Sebastian Nyholm! HTX 3A! 33/39 IT Eksamen! 08/05/2013 Bilag 3 - Her kan man se et tidligt design af produktsiden inden den blev kodet. Sebastian Nyholm! HTX 3A! 34/39 IT Eksamen! 08/05/2013 Bilag 4 - Her kan man se et tidligt design af et specifikt produkt inden den blev kodet. Sebastian Nyholm! HTX 3A! 35/39 IT Eksamen! 08/05/2013 Bilag 5 - Her kan man se et tidligt design af kurven inden den blev kodet. Sebastian Nyholm! HTX 3A! 36/39 IT Eksamen! 08/05/2013 Bilag 6 - Her kan ses et design over hjemmesidens struktur. Det er altså disse muligheder kunderne vil have have for at bevæge sig rundt inde på hjemmesiden. Hvis der forekommer et * over boksene, betyder det, at der vil være et link til disse sider fra alle and sider. Sebastian Nyholm! HTX 3A! 37/39 IT Eksamen! 08/05/2013 Bilag 7 - Her kan ses en oversigt over alle tabellerne. Sebastian Nyholm! HTX 3A! 38/39 IT Eksamen! 08/05/2013 Bilag 8 - Logbog for projektet Uge 6 & 8 Eksamensprojektet er sat igang og foranalysen er lavet. Rapporten for projektet er også igangsat. Uge 9, 10 Analysen af projektet er blevet igang sat og lavet færdig. Uge 11 Kravspecifikationen er blevet lavet. Rapporten er blevet opdateret med de nye indputs. Uge 12 Tidlige designs af hjemmesiden er blevet påbegyndt. Uge 13 De designs der er blevet lavet, er nu blevet færdige. Uge 14 Kodningen er så småt begyndt samt databasens indhold er igang med at blive fundet og lagt ind. Uge 15, 16, 17 & 18 I disse uger er der blevet kodet løs og databasens indhold er blevet færdiggjort. Hjemmesiden er også så småt ved at være færdigprogrammeret. I denne periode er der også blevet lavet tests på de forskellige koder og dataudtrak, for at se om det virker. Uge 19 Hjemmesiden er blevet færdig, testet og afleveret og rapporten er blevet skrevet færdig. Sebastian Nyholm! HTX 3A! 39/39
© Copyright 2024