nextgenpos evi francishilde van roey wim serroyenignas van tricht david van effenliesbeth vertommen

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

Upload: sonja-kok

Post on 04-Aug-2015

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

NextGenPos

Evi Francis Hilde Van RoeyWim Serroyen Ignas Van TrichtDavid Van Effen Liesbeth Vertommen

Page 2: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

Inleiding

• Geautomatiseerde applicatie voor kassasysteem

• Aankopen samenstellen• Flexibiliteit• Aanpasbaarheid

Page 3: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

Context diagram

Page 4: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

Data flow diagram

Page 5: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

ERD

Page 6: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

Use case

Page 7: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

Het programma

Page 8: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

Pluggable business rules& Prijsstrategieën

Page 9: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

[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; } }}

Page 10: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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); } }

Page 11: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

<?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>...

Page 12: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen
Page 13: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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;

}...

}

Page 14: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

[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>();

}

Page 15: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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);XmlSerializer serializer = new XmlSerializer(typeof(PluggableRules));

PluggableRules myRules = (PluggableRules)serializer.Deserialize(reader);reader.Close();return myRules;

}

Page 16: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

<?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> <PaymentTypeRule type="NextGenPOS.Model.Rules.PaymentTypeRule"> <MinAmount>15</MinAmount> <MaxAmount>10000</MaxAmount> <PaymentType>DirectDebit</PaymentType> </PaymentTypeRule> <PaymentTypeRule type="NextGenPOS.Model.Rules.PaymentTypeRule"> <MinAmount>50</MinAmount> <MaxAmount>25000</MaxAmount> <PaymentType>CreditCard</PaymentType> </PaymentTypeRule> </Rules></PluggableRules>

Page 17: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

ServiceFactorypublic 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)]; }}

Page 18: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

ServiceFactorypublic interface IService{}

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

Page 19: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

Model- klassendiagram

Page 20: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

SaleStatus- toestandsdiagram- klassendiagram- code voorbeeld

Page 21: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

- toestandsdiagram- klassendiagram- code voorbeeld

SaleStatus

Page 22: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

- toestandsdiagram- klassendiagram- code voorbeeld

SaleStatus

public interface ISaleStatus{

double[] addLineItem(Product product, int quantity);void removeLineItem(int indexLine);double getTotal () double getTotalWithoutDiscounts();double doPayment(PaymentType ptype, double amountReceived);

}

Page 23: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

- toestandsdiagram- klassendiagram- code voorbeeld

SaleStatusclass Empty : ISaleStatus{

Sale sale;private static ILogger log = LogManager.GetLogger();

public Empty(Sale sale){

this.sale = sale;}

public double[] addLineItem(Product product, int quantity){

SalesLineItem sli = new SalesLineItem(quantity, product);this.sale.ItemsPurchased.Add(sli);int lineIndex = this.sale.ItemsPurchased.Count - 1;double subTotal = sli.GetSubtotal();double[] indexAndTotal = new double[2];indexAndTotal[0] = subTotal;indexAndTotal[1] = lineIndex;log.Message("add product: " + product.Description + " item quantity:" + quantity, LoggerState.INFO);this.sale.SaleStatus = this.sale.Running;return indexAndTotal;

}...

Page 24: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

- klassendiagram- code voorbeeld Discounts

Page 25: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

- klassendiagram- code voorbeeld

Discounts

public double getTotal(){ IDiscountStrategy currentStrategy =PricingStrategyFactory.Instance.GetCurrentStrategy(); this.totalToPay = currentStrategy.GetTotal(this); log.Message("Total: "+this.totalToPay,Convert.ToInt32(LoggerState.INFO)); return this.totalToPay;}

Page 26: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

- klassendiagram- code voorbeeld- sequentiediagram

Payments

Page 27: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

- klassendiagram- code voorbeeld- sequentiediagram

Payments

public abstract class IPaymentTemplate{

public Boolean doPayment(double amountToPay, Customer customer){

if (SolvabilityIsQuestioned(amountToPay,customer)){

return checkSolvability(amountToPay,customer);}return true;

}

public Boolean SolvabilityIsQuestioned(double amountToPay, Customercustomer)

{return true;}

public abstract Boolean checkSolvability (double amountToPay, Customercustomer);

}

Page 28: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

- klassendiagram- code voorbeeld- sequentiediagram

Payments

class CreditCardPayment : IPaymentTemplate{

public override Boolean checkSolvability(double amountToPay, Customer customer)

{ICreditAuthorizationAdapter icrat = AuthorizationFactory.Instance.createAuthorization(PaymentType.CreditCard);return icrat.isAuthorized(string.Empty, customer.Name, amountToPay);

}}

Page 29: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

- klassendiagram- code voorbeeld- sequentiediagram

Payments

Page 30: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

- klassendiagram- code voorbeeld- sequentiediagram

Payments

Page 31: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

Database• Controller

public Controller(){ string connectionString = server=(local)\\SQLEXPRESS; “ + “database=NEXTGENPOS.MDF;Integrated Security=SSPI"; mySqlConnection = new SqlConnection(connectionString);}// dynamische query opbouwerprivate 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;}

Page 32: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

public DataSet getProductByName(string name){ string selectString = "select * from product where

description like” + '%" + name + "%'"; return genericSelectQueryFunction(selectString,

"product");}

Page 33: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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; try { 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(); catch (Exception ex) { Console.WriteLine(ex.Message); if (transaction != null) { Console.WriteLine("Transactie rollback"); transaction.Rollback(); } } mySqlConnection.Close(); }

Page 34: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

• Datafacade

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

Page 35: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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;}

Page 36: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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());}

Page 37: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

• Stored procedure

Page 38: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

Kortingen - Strategy

Page 39: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

Adapters

Page 40: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

• Voorraadbeheersysteem

Page 41: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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;}

Page 42: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

• Boekhoudsysteem

Page 43: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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) { }}

Page 44: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

• Authorization service

Page 45: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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 false; return true; } }

Page 46: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

Logger

• Design Patterns:• Chain of Responsibility pattern

• Verschillende niveaus (debug/info/fatal) • verschillende outputs (console/file/email)

• Observer pattern• Event logging

Page 47: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

• Observer

Page 48: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen
Page 49: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

• IObservable

public interface IObserver { void Notify(object anObject); }

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

Page 50: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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); } } }}

Page 51: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

• Voorbeeld

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

Page 52: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

• Chain op responsibility

Page 53: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen
Page 54: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen
Page 55: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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):

Page 56: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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"); }

Page 57: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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);

Page 58: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen
Page 59: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

view

• Model-view-controller

Page 60: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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.

Page 61: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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()

Page 62: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

• 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.

Page 63: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen
Page 64: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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:

Page 65: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen
Page 66: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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

Page 67: NextGenPos Evi FrancisHilde Van Roey Wim SerroyenIgnas Van Tricht David Van EffenLiesbeth Vertommen

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.