NextGenPos Evi Francis Hilde Van Roey Wim Serroyen Ignas Van Tricht

Slides:



Advertisements
Verwante presentaties
KINN 2010 •OOP •O Object •O Georiënteerd •P Programmeren.
Advertisements

Zelf objecten maken in VBA Ynte Jan Kuindersma, BIRD Automation Nationale Officedag 2009 EDE, 14 Oktober 2009.
SAP ABAP A short introduction. SAP ABAP • Selectie: – IF …… ENDIF. – IF …. ELSE … ENDIF. – IF …. ELSEIF …. ELSEIF …. ELSE …. ENDIF. – IF condition_1.
Stateful web, developments, trends 1 Webtechnologie Lennart Herlaar.
JQuery en ASP.NET Bart De Meyer.
Visual Basic 2008 – What’s new André Obelink, MCSD – MVP MarYor | software & consultancy | |
Access en MySql Ynte Jan Kuindersma, BIRD Automation Nationale Officedag 2009 EDE, 14 Oktober 2009.
QAD Reporting & Analytics
Van domeinklasse tot implementatie
MagentaPurpleTeal PinkOrangeBlue LimeBrown RedGreen Introductie C# /.NET
Biml en Data Vault.
Hibernate Ignace Van Tricht Bert Jacobs 2 Juni 2009
Het ontwerpen van een klasse
NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen.
Hoofdstuk 10.2 Rekenmachine-casus.
OOS Object geOrienteerd Software-ontwerp - 4 Codeerperikelen Singleton Specificeren Scheiding GUI en Domein Facade.
AAHA (voor intern gebruik)
Omgevingen zijn dan geïmplementeerd als Symbol Tables. Symbol Table mapt een symbool met een Binding Meerdere noties van binding –Meerdere manieren te.
SQL injections en meer... PERU. web application vulnerabilities Cross Site Scripting (21.5%) SQL Injection (14%) PHP includes (9.5%) Buffer overflows.
Computervaardigheden en Programmatie Universiteit AntwerpenObjecten 4.1 Computervaardigheden en Programmatie 1rste BAC Toegepaste Biologische Wetenschappen.
Modula vs Java MODULE Show; CONST PI = ; TYPE PointRc = RECORD x,y : INTEGER; speed : REAL; angle : REAL; END; VAR a,b : PointRc; BEGIN.
Server side scripting 1 Webtechnologie Lennart Herlaar.
Algoritmiek Arrays: wat zijn dat en wat kun je ermee? Loops: hoe hou je ze in bedwang? Hoorcollege 6 - Ma. 9 okt L.M. Bosveld-de Smet.
Databases I (H.3) Het Entity-Relationship Model Wiebren de Jonge Vrije Universiteit, Amsterdam versie 2003.
Opgave 1a: afronden int n=5; double a, b, c, d; a = n * 1.5; b = n * 3 / 2; c = n / 2 * 3; d = 3 / 2 * n; a b c d
Array nDeclaratie nCreatie nOpvragen nWijzigen nLengte String [ ] a; a = new String[10]; ……a[5]…… a[5] = ……; …a.Length… …is eigenlijk overbodig! List a;
Hoorcollege 8 Game object structuren. Arrays in games Grid-gebaseerd speelveld (zoals Tetris) Lijst van spelers Lijst van inventory items Lijst van alle.
Eerste deeltoets Uitwerking. Resultaten Gemiddeld: 6,01 Tips voor de volgende keer: – Werk in klad uit, schrijf duidelijk – Oefenen met loops en tellertjes.
Hoorcollege 7 Collections, arrays. Programma ‘Snowflakes’ Sneeuwvlok object.
JAVA -- H51 CONSTRUCTOR –- COPY-CONSTRUCTOR 1Constructor: Dezelfde naam als de klasse Wordt uitgevoerd d.m.v. new Initialisatie van de (private) attributen.
Hibernate Object relational mapping
Algoritmiek Strings & Stringmanipulaties; Controle Structuren; Floating-point notation. Hoorcollege 4 - Ma. 25 sept L.M. Bosveld-de Smet.
H21. en H22. COLLECTIONS FRAMEWORK. 1. INLEIDING.
JAVA1 H 22. COLLECTIONS FRAMEWORK. 1. INLEIDING. Collections framework Is een verzameling van data structuren, interfaces en algoritmen Meest voorkomende.
Addendum – ADO.NET ADO.NET : het object model .NET Data Providers
Hoofdstuk 5 – Object Based Programmeren
Hoorcollege 12 Afronding Penguin Pairs & overzicht Tick Tick.
Hoofdstuk 9 Objecten en klassen.
Hoorcollege 9 Jewel Jam The revenge. Hierarchie van game objecten Game object (lijst) Game object (grid) Game object (lijst) Game object.
Arrays.
Deel XIII Eerste echte e-commerce applicatie (iteraties + impl ) 1 Internetapplicaties Deel 13: Eerste echte e-commerce applicatie: Enkele iteraties met.
Internetapplicaties - IV Collecties 1 Internetapplicaties Deel 4: Java hulpklassen: Collecties.
OO Analyse in de praktijk OO Analyse in de praktijk IV OO basisregels.
Herhaling Java-programmatie en geautomatiseerd testen (vervolg)
Deel XIV Eerste echte e-commerce applicatie Implementatie (vervolg) 1 Internetapplicaties Deel 15: Herhaling Java-programmatie en geautomatiseerd testen.
1 Oracle InterConnect - Pagoni files - KC Server Development & Programming Languages 11 mei 2006 Harm Verschuren.
1 december KC Development Tools Hands-on Oracle HTML DB v2.0.
Windows Azure Multi-tenant applicatie Bouwen van een multi-tenant applicatie in de praktijk 1.
KINN 2010 OOP O Object O Georiënteerd P Programmeren.
Hoofdstuk 10.1 Toepassing: Bitmap-editor. nKlik punten op scherm nPlaatje verschuiven left, right, up, down nPlaatje bewerken clear, invert, bold, outline.
Hoofdstuk 5 Interactie. Controls Form Label Button Label TextBox.
C++ C++ als een verbetering van C Abstracte datatypen met classes Constructoren en destructoren Subklassen binding van functies 1.
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 C programmeren voor niet-C programmeurs les 2 definitie.
Algoritmiek Class Hierarchies, Inheritance. Hoorcollege 12 - Ma. 20 nov L.M. Bosveld-de Smet.
Hoofdstuk 17: FILES EN STREAMS.
Hoofdstuk 14.1 Algoritmen: Zoeken in een netwerk.
Hoofdstuk 10.3 Tekst-editor: MDI-interface Dialogen Files lezen Abstracte klassen.
Reader en Writer Stream FileStream MemoryStream NetworkStream BufferedStream GZipStream CryptoStream TextWriter StreamWriter StringWriter BinaryWriter.
Objectgeoriënteerd Programmeren (2)
Reader en Writer leest en schrijft bytes leest string en char
Gameprogrammeren: Lists en interfaces
OOS Object geOrienteerd Software-ontwerp - 5
Arjan Egges & Paul Bergervoet
Voortborduren op eerder gedaan werk
Arjan Egges Paul Bergervoet Wouter van Toll
Implementatie Zoekboom
Software Development fundamentals
SQL Les February 2019.
Software Development fundamentals
Chapter 1: Introduction
Transcript van de presentatie:

NextGenPos Evi Francis Hilde Van Roey Wim Serroyen Ignas Van Tricht David Van Effen Liesbeth Vertommen

Inleiding Geautomatiseerde applicatie voor kassasysteem Aankopen samenstellen Flexibiliteit Aanpasbaarheid

Context diagram

Data flow diagram

ERD

Use case

Het programma

Pluggable business rules & Prijsstrategieën

[Serializable] public class DiscountSettings { private IDiscountStrategy[] strategies; private static XmlSerializer serializer; [XmlIgnore] public IDiscountStrategy[] Strategies get { return strategies; } set { strategies = value; } } [XmlElement(Type = typeof(DiscountStrategySerializer))] public DiscountStrategySerializer[] XmlStrategies get { if (Strategies == null) return null; else { DiscountStrategySerializer[] dss = new DiscountStrategySerializer[Strategies.Length]; for (int i = 0; i < Strategies.Length; i++) { dss[i] = new DiscountStrategySerializer(strategies[i]); return dss;

public class DiscountStrategySerializer : IXmlSerializable { private IDiscountStrategy strategy; public DiscountStrategySerializer(IDiscountStrategy strategy) { this.strategy = strategy; } public void ReadXml(XmlReader reader) Type type = Type.GetType(reader.GetAttribute("type")); reader.ReadStartElement(); this.strategy = (IDiscountStrategy)new XmlSerializer(type).Deserialize(reader); reader.ReadEndElement(); public void WriteXml(XmlWriter writer) writer.WriteAttributeString("type", strategy.GetType().ToString()); new XmlSerializer(strategy.GetType()).Serialize(writer, strategy);

<?xml version="1.0" encoding="utf-8"?> <DiscountSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <XmlStrategies type="NextGenPOS.Model.Discounts.ItemPriceDiscountStrategy"> <ItemPriceDiscountStrategy> <Description>Bedrag op product</Description> <Product> <ProductID>4</ProductID> <Description>Chef Antons Cajun Seasoning</Description> <Price>22</Price> </Product> <Amount>100</Amount> <Quantity>100</Quantity> </ItemPriceDiscountStrategy> </XmlStrategies> ...

public class RulesFacade { private static RulesFacade instance; private PluggableRules rules; private RulesFacade() rules = new PluggableRules().Deserialize(RulesFacade.RulesFile); } ... public bool IsInvalid(Sale sale) foreach (PaymentTypeRule ptr in rules.Rules) { if (ptr.PaymentType == sale.PaidBy.Type) return ptr.IsInvalid(sale); return false;

[System.Xml.Serialization.XmlRoot("PluggableRules")] public class PluggableRules { private Rule[] rules; public PluggableRules() rules = new Rule[0]; } [System.Xml.Serialization.XmlArray("Rules"), System.Xml.Serialization.XmlArrayItem(typeof(PaymentTypeRule))] public Rule[] Rules get{return rules;} set{rules = value;} public void addRule(Rule r) IList<Rule> ruleList = this.Rules.ToList<Rule>(); ruleList.Add(r); this.Rules = ruleList.ToArray<Rule>();

public void Serialize(string path) { XmlSerializer serializer = new XmlSerializer(typeof(PluggableRules)); Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); serializer.Serialize(stream, this); stream.Close(); } public PluggableRules Deserialize(string path) TextReader reader = new StreamReader(path); PluggableRules myRules = (PluggableRules)serializer.Deserialize(reader); reader.Close(); return myRules;

<?xml version="1.0"?> <PluggableRules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Rules> <PaymentTypeRule type="NextGenPOS.Model.Rules.PaymentTypeRule"> <MinAmount>0</MinAmount> <MaxAmount>5000</MaxAmount> <PaymentType>Cash</PaymentType> </PaymentTypeRule> <MinAmount>15</MinAmount> <MaxAmount>10000</MaxAmount> <PaymentType>DirectDebit</PaymentType> <MinAmount>50</MinAmount> <MaxAmount>25000</MaxAmount> <PaymentType>CreditCard</PaymentType> </Rules> </PluggableRules>

ServiceFactory public class ServiceFactory { private Hashtable services = new Hashtable(); public ServiceFactory() Add<IAccountingAdapter>(new AccountingAdapter(new AccountingSystemTest())); Add<IInventoryAdapter>(new InventoryAdapter(new InventorySystemTest())); } public void Add<T>(T t) where T : IService services.Add(typeof(T), t); public T GetService<T>() return (T)services[typeof(T)];

ServiceFactory public interface IService {} public interface IAccountingAdapter : IService { /// <summary> /// Verwerkt de boekhoudkundige gegevens voor een sale /// </summary> /// <param name="s"></param> void ReportSale(Sale s); }

Model

Database Controller public Controller() { string connectionString = server=(local)\\SQLEXPRESS; “ + “database=NEXTGENPOS.MDF;Integrated Security=SSPI"; mySqlConnection = new SqlConnection(connectionString); } // dynamische query opbouwer private DataSet genericSelectQueryFunction(string selectString, string returnSetName) { if (selectString.Equals("") || returnSetName.Equals("")) { return new DataSet(); } SqlCommand mySqlCommand = mySqlConnection.CreateCommand(); mySqlCommand.CommandText = selectString; SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(); mySqlDataAdapter.SelectCommand = mySqlCommand; DataSet myDataSet = new DataSet(); mySqlConnection.Open(); mySqlDataAdapter.Fill(myDataSet, returnSetName); mySqlConnection.Close(); return myDataSet; }

public DataSet getProductByName(string name) { public DataSet getProductByName(string name) { string selectString = "select * from product where description like” + '%" + name + "%'"; return genericSelectQueryFunction(selectString, "product"); }

public void saleTransaction(int customerId, DateTime saleDateTime, bool complete, double amount, int paymentTypeId, int[,] productIdQuantity) { try mySqlConnection.Open(); } catch (Exception ex) Console.WriteLine(ex.Message); SqlTransaction transaction = null; SqlCommand command = new SqlCommand(); int saleId = 0; string insertSaleQueryString = "insert into sale (customer_id,date,complete) values ( “ + customerId + ", '" + saleDateTime + "', '" + complete + "')" + "; select id from sale where id= @@IDENTITY"; transaction = mySqlConnection.BeginTransaction(); command.Connection = mySqlConnection; command.CommandText = insertSaleQueryString; command.Transaction = transaction; saleId = (int)command.ExecuteScalar(); if (transaction != null) Console.WriteLine("Transactie rollback"); transaction.Rollback(); mySqlConnection.Close();

Datafacade public static DatabaseFacade Instance { get { if (null == instance) instance = new DatabaseFacade(); return instance; } }

public IList<Employee> getAllEmployees() { public IList<Employee> getAllEmployees() { IList<Employee> eList = new List<Employee>(); DataSet employees = control.getAllEmployees(); DataTable myDataTable = employees.Tables["employee"]; foreach (DataRow row in myDataTable.Rows) { Employee emp = new Employee(); emp.EmployeeID = int.Parse(row["id"].ToString()); emp.FirstName = row["firstname"].ToString(); emp.LastName = row["lastname"].ToString(); emp.UserName = row["username"].ToString(); emp.IsManager = row["function_id"]. ToString().TrimEnd().Equals("2"); eList.Add(emp); } return eList; }

public Customer getCustomerById(int id) { public Customer getCustomerById(int id) { DataSet customerDataSet = control.getCustomerById(id); DataTable myDataTable = customerDataSet.Tables["customer"]; if (myDataTable.Rows.Count == 0) { throw new CustomerNotFoundException("Geen klant gevonden met id " + id); } DataRow temp = myDataTable.Rows[0]; return new Customer(int.Parse(temp["id"].ToString()), temp["name"].ToString(), temp["address"].ToString(), temp["city"].ToString(), System.DateTime.Parse(temp["dob"].ToString()); }

Stored procedure

Kortingen - Strategy

Adapters

Voorraadbeheersysteem

interface IInventoryAdapter { bool IsInStock(Product p); //is het item in voorraad? int GetNumberInStock(Product p); //aantal items in voorraad void UpdateStock(Sale s); //werk de stock bij met de //items in de sale } public int GetNumberInStock(Product p) { if (p.Description.Equals("Tofu") || p.Description.Equals("Konbu")) return 0; return 9999999; }

Boekhoudsysteem

public interface IAccountingAdapter { /// Verwerkt de boekhoudkundige gegevens voor een sale void ReportSale(Sale s); } public class AccountingSystemTest { public void UpdateSales(Sale s) Console.WriteLine("Sale:{0}", s.ToString()); } public void UpdateCommissions(Sale s)

Authorization service

public interface ICreditAuthorizationAdapter { bool isAuthorized(string cardNumber, string customername, double amount); } public class CreditCardAuthorizationServiceTest { public bool isAuthorized(string cardnumber, string customername, double amount) if ((customername.Equals("Antonio Moreno") || customername.Equals("Yang Wang")) && amount > 0) return false; else if ((customername.Equals("Maria Anders") || customername.Equals("Thomas Hardy")) && amount > 1000) return true; }

Logger Design Patterns: Chain of Responsibility pattern Verschillende niveaus (debug/info/fatal) verschillende outputs (console/file/email) Observer pattern Event logging

Observer

IObservable public interface IObservable { public interface IObserver { void Notify(object anObject); } public interface IObservable { void Register(IObserver anObserver); void UnRegister(IObserver anObserver);

public class ObservableImpl:IObservable { protected Hashtable _observerContainer=new Hashtable(); public void Register(IObserver anObserver){ _observerContainer.Add(anObserver,anObserver); } public void UnRegister(IObserver anObserver){ _observerContainer.Remove(anObserver); public void NotifyObservers(object anObject) { foreach(IObserver anObserver in _observerContainer.Keys) { anObserver.Notify(anObject);

Voorbeeld public IList<SalesLineItem> ItemsPurchased { get { return itemsPurchased; } set { base.NotifyObservers(itemsPurchased); itemsPurchased = value; }

Chain op responsibility

public enum LoggerState { FATAL = 1, //Fatale error --> hoogste niveau: stuur een email naar de persoon die verantwoordelijke is EXCEPT = 3, //Zware fout --> Exceptions ERROR = 5, EMAIL = 6, // versturen van een email INFO = 7, //Notice (opmerking) : schrijf naar een logbestand OBSERVER = 8, //observer logging DEBUG = 10 //Debugging boodschap: schrijf enkel naar de console } Elk type heeft een waarde (=prioriteit of mask):

protected ILogger next; public ILogger setNext(ILogger l) { next = l; return l; } protected static ILogger l, l3; protected static OBserverLogger l2; static LogManager() { l = new ConsoleLogger(LoggerState.DEBUG); l3 = l.setNext(new LogFileLogger (LoggerState.INFO,"./logs/logFileInfo")); l2 = new OBserverLogger (LoggerState.OBSERVER, "./logs/logFileObserver"); }

public void Message(String msg, LoggerState priority) { if (priority <= mask) { WriteMessage(msg); } if (next != null) { next.Message(msg, priority); abstract protected void WriteMessage(String msg);

view Model-view-controller

New POSForm() een lijst van de klanten opgehaald een lijst binnengehaald met de gekende producten user met succes is geauthenticeerd, zal er worden nagegaan of deze user admin rechten heeft.

Hoe vullen we een component ‘combobox’ met de lijst van onze klanten? we hebben een klasse Bind de properties id en name de methode override String ToString()

Sequence diagram de lijst met klanten, verkregen door de DatabaseFacade omzetten van customer lijst naar een lijst van Bind objecten lijst van bind objecten wordt aan een BindingSource gelinked.

Sale ticket een ticket geeft een overzicht van sale de producten, subtotalen, kortingen op producten, globale kortingen de velden die in een ticket zijn instelbaar, doormiddel van een XML config bestand Vb. item in xml:

Sequence diagram: de communicatie tussen het POSForm en de controller, die uiteindelijk met het model Register communiceert

Sequence diagram: de communicatie bij aanmaak van een ticket. Een ticket wordt ingesteld wanneer de methode setFlatList (de lijst van flatLineItems) of setFlatTotal (een flatLineItem) worden aan- geroepen.