draft for seatplans
authorKonrad Rosenbaum <konrad@silmor.de>
Sun, 11 Feb 2018 23:06:34 +0000 (00:06 +0100)
committerKonrad Rosenbaum <konrad@silmor.de>
Mon, 12 Feb 2018 14:33:56 +0000 (15:33 +0100)
Change-Id: I8d2ec513094d434441d45f0cc8c223fd25d75ffa

32 files changed:
Makefile
commonlib/misc/config.h [new file with mode: 0644]
commonlib/widgets/seatplanview.cpp [new file with mode: 0644]
commonlib/widgets/seatplanview.h [new file with mode: 0644]
commonlib/widgets/widgets.pri
doc/index.html
doc/seatplans.txt
doc/template.html
doc/web/config.html [new file with mode: 0644]
doc/web/flow.html [new file with mode: 0644]
doc/web/flow.odg [new file with mode: 0644]
doc/web/flow.svg [new file with mode: 0644]
doc/web/variables.html [new file with mode: 0644]
iface/wext/seatplanobj2.h
magicsmoke.aurora
pack
seatplangui/seatplangui.pro [new file with mode: 0644]
seatplangui/spgui.cpp [new file with mode: 0644]
seatplangui/spgui.h [new file with mode: 0644]
src/dialogs/eventedit.cpp
src/dialogs/pricecatdlg.cpp
taurus
tests/docker/qtenv/Dockerfile
tzone
wob/classes/seatplan.wolf
wob/magicsmoke.wolf
www/inc/classes/basevars.php
www/inc/rendering/cart_listing.php
www/inc/rendering/event_listing.php
www/inc/wext/customer.php
www/index.php
www/template/en/login.html

index 949b933..b11bea6 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -142,6 +142,7 @@ sdoc:
        $(MAKE) -C pack doc
        cd tzone && $(DOXYGEN) Doxyfile
        cd taurus && ./build-src-doc.sh
+       cd twig/doc && touch contents.rst && sphinx-build -C . ../../doc/twig
 
 lrelease:
        cd src && $(LREL) smoke.pro
diff --git a/commonlib/misc/config.h b/commonlib/misc/config.h
new file mode 100644 (file)
index 0000000..fd9bd8c
--- /dev/null
@@ -0,0 +1,6 @@
+/*this is an autogenerated config.h for libqrencode as used by qrcode.* */
+#define STATIC_IN_RELEASE static
+#define VERSION "4.0.0"
+#define MAJOR_VERSION 4
+#define MINOR_VERSION 0
+#define MICRO_VERSION 0
diff --git a/commonlib/widgets/seatplanview.cpp b/commonlib/widgets/seatplanview.cpp
new file mode 100644 (file)
index 0000000..6b1b301
--- /dev/null
@@ -0,0 +1,307 @@
+//
+// C++ Implementation: seatplan viewer
+//
+// Description: 
+//
+//
+// Author: Konrad Rosenbaum <konrad@silmor.de>, (C) 2017
+//
+// Copyright: See README/COPYING.GPL files that come with this distribution
+//
+//
+
+#include "seatplanview.h"
+
+#include <QMouseEvent>
+#include <QResizeEvent>
+#include <QPainter>
+#include <QDebug>
+
+MSeatPlanView::MSeatPlanView(const MOSeatPlan&p){resetPlan(p);}
+
+
+static inline QRect parseGeo(const QString s)
+{
+        QStringList g=s.trimmed().split(' ');
+        if(g.size()!=4)return QRect();
+        QRect r(g[0].toInt(), g[1].toInt(), g[2].toInt(), g[3].toInt());
+        return r;
+}
+
+enum ColorRole {Background=0,TkBackground,WBackground,UBackground,Foreground,TkForeground,WForeground,UForeground,MaxColor=UForeground};
+
+static inline QVector<QColor> getColors(const MOSeatPlan&plan,const MOSeatPlanGroup&group,const MOSeatPlanRow&row)
+{
+        auto getcol=[](Nullable<QString>ps,Nullable<QString>gs,Nullable<QString>rs,QColor fb)->QColor{
+                if(!rs.isNull() && !rs.data().trimmed().isEmpty())return QColor(rs);
+                if(!gs.isNull() && !gs.data().trimmed().isEmpty())return QColor(gs);
+                if(!ps.isNull() && !ps.data().trimmed().isEmpty())return QColor(ps);
+                return fb;
+        };
+        QVector<QColor> pcolor((int)MaxColor+1);
+        pcolor[Foreground]=getcol(plan.fgcolor(),group.fgcolor(),row.fgcolor(),QColor(Qt::black));
+        pcolor[Background]=getcol(plan.bgcolor(),group.bgcolor(),row.bgcolor(),QColor(Qt::white));
+        pcolor[TkForeground]=getcol(plan.tkfgcolor(),group.tkfgcolor(),row.tkfgcolor(),pcolor[Foreground]);
+        pcolor[TkBackground]=getcol(plan.tkcolor(),group.tkcolor(),row.tkcolor(),QColor(Qt::darkGray));
+        pcolor[WForeground]=getcol(plan.wfgcolor(),group.wfgcolor(),row.wfgcolor(),pcolor[Foreground]);
+        pcolor[WBackground]=getcol(plan.wcolor(),group.wcolor(),row.wcolor(),QColor(Qt::darkGreen));
+        pcolor[UForeground]=getcol(plan.ufgcolor(),group.ufgcolor(),row.ufgcolor(),pcolor[Foreground]);
+        pcolor[UBackground]=getcol(plan.ucolor(),group.ucolor(),row.ucolor(),QColor(Qt::gray));
+        return pcolor;
+}
+
+void MSeatPlanView::resetPlan(const MOSeatPlan&p)
+{
+        mplan=p;
+        
+        //parse plan for seats
+        mrows.clear();
+        const QRect mr=QRect(QPoint(0,0),mplan.qSize());
+        for(const auto&grp:mplan.Group()){
+                QRect gr=parseGeo(grp.geo());
+                if(!gr.isValid())gr=mr;
+                qDebug()<<"scanning group"<<grp.id().data()<<gr;
+                if(grp.id()->contains(':'))
+                        qDebug()<<"WARNING: group"<<grp.id()<<"contains a colon. This is not permitted. Please fix the plan!";
+                QTransform gt;
+                gt.translate(gr.x(),gr.y());
+                gt.rotate(grp.angle());
+                for(const auto&row:grp.Row()){
+                        QRect rr=parseGeo(row.geo());
+                        if(!rr.isValid())rr=QRect(QPoint(0,0),gr.size());
+                        qDebug()<<"scanning row"<<row.id()<<rr;
+                        if(row.id()->contains(':'))
+                                qDebug()<<"WARNING: row"<<row.id()<<"contains a colon. This is not permitted. Please fix the plan!";
+                        QTransform rt(gt);
+                        rt.translate(rr.x(),rr.y());
+                        rt.rotate(row.angle());
+                        //create row object
+                        Row nrow(row.id(),row.name(),grp.id(),grp.name());
+                        nrow.colors=getColors(mplan,grp,row);
+                        //auto-generate or explicit seating?
+                        if(!row.capacity().isNull()){
+                                //assume auto generation
+                                if(row.Seat().size()>0)
+                                        qDebug()<<"WARNING: row"<<row.id().data()<<"has a capacity for auto-generation, but also contains <Seat> elements! Ignoring  explicit seats. Please fix the plan!";
+                                const int cap=row.capacity().data(0);
+                                const int first=row.first().data(1);
+                                QSize ssz=QSize(rr.width()/cap-1,rr.height());
+                                if(ssz.width()>ssz.height())ssz.setWidth(ssz.height());
+                                qDebug()<<"generating"<<cap<<"seats";
+                                int tx=(rr.width()-cap*ssz.width())/(cap>1?cap-1:1) + ssz.width();
+                                for(int i=0;i<cap;i++){
+                                        QTransform st(rt);
+                                        st.translate(i*tx,0);
+                                        nrow.seats<<Seat(i+first,st,ssz);
+                                }
+                        }else{
+                                //assume explicit seating
+                                for(const auto&seat:row.Seat()){
+                                        QTransform st(rt);
+                                        QRect sr=parseGeo(seat.geo());
+                                        qDebug()<<"scanning seat"<<seat.id();
+                                        st.translate(sr.x(),sr.y());
+                                        st.rotate(seat.angle());
+                                        nrow.seats<<Seat(seat.id(),st,sr.size());
+                                }
+                        }
+                        //store row
+                        if(nrow.seats.size()>0)
+                                mrows<<nrow;
+                        else
+                                qDebug()<<"WARNING: row"<<row.id().data()<<"is empty, ignoring it.";
+                }
+        }
+        
+        //repaint
+        resizeEvent(nullptr);
+        update();
+}
+
+void MSeatPlanView::setBlocked(const QStringList&){}
+void MSeatPlanView::setWanted(const QStringList&){}
+QStringList MSeatPlanView::wanted()const{return QStringList();}
+
+enum class BgType {Unknown,Line,Rect,Text,Circle,Image};
+static inline BgType bgType(const QString s)
+{
+        if(s=="line")return BgType::Line;
+        if(s=="rect")return BgType::Rect;
+        if(s=="text")return BgType::Text;
+        if(s=="circle")return BgType::Circle;
+        if(s=="image")return BgType::Image;
+        
+        return BgType::Unknown;
+}
+
+static inline QRect toGeo(const QString s,double scale,QRect clip)
+{
+        QStringList g=s.trimmed().split(' ');
+        if(g.size()!=4)return QRect();
+        return QRect(clip.x()+scale*g[0].toInt(), clip.y()+scale*g[1].toInt(),
+                     scale*g[2].toInt(), scale*g[3].toInt());
+}
+
+static inline QImage findImage(const MOSeatPlan &plan,QString imgName)
+{
+        for(auto&img:plan.Image()){
+                if(img.name().data().trimmed()==imgName){
+//                         qDebug()<<"image found"<<img.Data().data().size();
+                        return QImage::fromData(img.Data());
+                }
+        }
+        //not found
+        qDebug()<<"image"<<imgName<<"not found";
+        return QImage();
+}
+
+void MSeatPlanView::paintEvent(QPaintEvent*e)
+{
+        QWidget::paintEvent(e);
+        if(!mplan.isGraphical())return;
+        
+        // painter and background color
+        QPainter p(this);
+        p.setClipRect(mclip);
+        p.fillRect(mclip,QColor(mplan.bgcolor()));
+        
+        // first paint background
+        for(auto bg:mplan.Background()){
+                QRect geo=toGeo(bg.geo(),mscale,mclip);
+                p.setPen(QColor(bg.fgcolor()));
+                p.setBrush(QColor(bg.bgcolor()));
+                switch(bgType(bg.type())){
+                        case BgType::Line:
+                                p.drawLine(geo.x(),geo.y(),geo.x()+geo.width(),geo.y()+geo.height());
+                                break;
+                        case BgType::Rect:
+                                p.drawRect(geo);
+                                break;
+                        case BgType::Text:{
+                                QFont ft(bg.font().data("Sans"));
+                                ft.setPixelSize(bg.fontsize().data(10)*mscale);
+                                p.setFont(ft);
+                                p.drawText(geo,0,bg.content());
+                                break;
+                        }
+                        case BgType::Circle:
+                                p.drawEllipse(geo);
+                                break;
+                        case BgType::Image:
+                                //find image & paint
+                                p.drawImage(geo,findImage(mplan,bg.content().data().trimmed()));
+                                break;
+                        default:
+                                qDebug()<<"Warning: unknown background element of type"<<bg.type();
+                                break;
+                }
+        }
+        
+        // paint groups -> rows -> seats
+        p.setPen(QColor(Qt::blue));
+        p.setBrush(QColor(Qt::yellow));
+        for(const auto&row:mrows)
+                for(const auto&seat:row.seats){
+//                         qDebug()<<"painting seat"<<row.id<<seat.id;
+                        p.resetTransform();
+                        QTransform sp(seat.position);
+                        QTransform t;
+                        t.translate(mclip.x(),mclip.y());
+                        t.scale(mscale,mscale);
+                        p.setTransform(sp*t);
+                        int fg=Foreground,bg=Background;
+                        switch(seat.state){
+                                case Free:fg=Foreground;bg=Background;break;
+                                case Blocked:fg=TkForeground;bg=TkBackground;break;
+                                case Wanted:fg=WForeground;bg=WBackground;break;
+                                case Unavailable:fg=UForeground;bg=UBackground;break;
+                        }
+                        p.setPen(row.colors[fg]);
+                        p.setBrush(row.colors[bg]);
+                        QFont ft("Helvetica");
+                        ft.setPixelSize(qMin(seat.size.width(),seat.size.height())-4);
+                        p.setFont(ft);
+                        p.drawRect(QRect(QPoint(0,0),seat.size));
+                        p.drawText(QRect(QPoint(0,0),seat.size),Qt::AlignCenter,QString::number(seat.id));
+                }
+}
+
+bool MSeatPlanView::Seat::contains(QPoint p)
+{
+        QPoint r=p*position.inverted();
+        if(r.x()<0||r.y()<0)return false;
+        return r.x()<=size.width() && r.y()<=size.height();
+}
+
+void MSeatPlanView::mousePressEvent(QMouseEvent *event)
+{
+        //QWidget::mousePressEvent(event);
+        //convert mouse coordinates to plan coordinates
+        int x=event->pos().x();
+        int y=event->pos().y();
+        x-=mclip.x();
+        y-=mclip.y();
+        x/=mscale;
+        y/=mscale;
+        //find matching seat
+        for(auto&row:mrows)
+                for(auto&seat:row.seats)
+                        if(seat.contains(QPoint(x,y))){
+                                qDebug()<<"found seat"<<row.id<<seat.id<<"at"<<x<<y<<"mouse"<<event->pos();
+                                event->setAccepted(true);
+                                //button press...
+                                if((event->button()&Qt::LeftButton)==Qt::LeftButton){
+                                        if(seat.state==Free){
+                                                seat.state=Wanted;
+                                                emit seatSelected(SelectedSeat(row.gid,row.gname,row.id,row.name,seat.id));
+                                                emit selectionChanged();
+                                        }else if(seat.state==Wanted){
+                                                seat.state=Free;
+                                                emit seatDeselected(SelectedSeat(row.gid,row.gname,row.id,row.name,seat.id));
+                                                emit selectionChanged();
+                                        }
+                                        //TODO: handle multiple available price categories?
+                                }
+                                if(mrightIsBlock && (event->button()&Qt::RightButton)==Qt::RightButton){if(seat.state==Blocked)seat.state=Free;else seat.state=Blocked;}
+                                if(mrightIsBlock && (event->button()&Qt::MiddleButton)==Qt::MiddleButton){if(seat.state==Unavailable)seat.state=Free;else seat.state=Unavailable;}
+                                //done
+                                update();
+                                return;
+                        }
+}
+void MSeatPlanView::mouseReleaseEvent(QMouseEvent *event)
+{
+        QWidget::mouseReleaseEvent(event);
+}
+
+
+void MSeatPlanView::resizeEvent(QResizeEvent *event)
+{
+        //calculate scaled plan size
+        QSize ps=mplan.qSize();
+        if(ps.width()>0 && ps.height()>0){
+                QSize ws=event?event->size():size();
+                double f=(double)ws.width()/ps.width();
+                if((f*ps.height())>ws.height())f=(double)ws.height()/ps.height();
+                mscale=f;
+                mclip.setX((ws.width()-f*ps.width())/2);
+                mclip.setY((ws.height()-f*ps.height())/2);
+                mclip.setWidth(f*ps.width());
+                mclip.setHeight(f*ps.height());
+//                 qDebug()<<"widget size"<<ws<<size()<<"plan size"<<ps<<"scale"<<f<<"clip"<<mclip;
+        }
+        if(event){
+                QWidget::resizeEvent(event);
+                update();
+        }
+}
+
+QList<MSeatPlanView::SelectedSeat> MSeatPlanView::selection()const
+{
+        QList<SelectedSeat>result;
+        for(const auto&row:mrows)
+                for(const auto&seat:row.seats)
+                        if(seat.state==Blocked)
+                                result<<SelectedSeat(row.gid,row.gname,row.id,row.name,seat.id);
+        return result;
+}
diff --git a/commonlib/widgets/seatplanview.h b/commonlib/widgets/seatplanview.h
new file mode 100644 (file)
index 0000000..41c0c21
--- /dev/null
@@ -0,0 +1,109 @@
+//
+// C++ Interface: seatplan viewer
+//
+// Description: 
+//
+//
+// Author: Konrad Rosenbaum <konrad@silmor.de>, (C) 2017
+//
+// Copyright: See README/COPYING.GPL files that come with this distribution
+//
+//
+
+#ifndef SMOKE_SEATPLANVIEW_H
+#define SMOKE_SEATPLANVIEW_H
+
+#include <QWidget>
+#include <QList>
+
+#include <QtGui/QTransform>
+
+#include "MOSeatPlan"
+
+#include "commonexport.h"
+
+class MAGICSMOKE_COMMON_EXPORT MSeatPlanView:public QWidget
+{
+    Q_OBJECT
+public:
+        MSeatPlanView(const MOSeatPlan&);
+        
+        void resetPlan(const MOSeatPlan&);
+        void setBlocked(const QStringList&);
+        void setWanted(const QStringList&);
+        QStringList wanted()const;
+        
+        ///used by test gui only: if true then right-click blocks or unblocks instead of "wanting", middle click sets to Unavailable
+        void setRightIsBlock(bool b){mrightIsBlock=b;}
+        ///if true it is not possible to select seats
+        void setReadOnly(bool b){mreadOnly=b;}
+        
+        MOSeatPlan plan()const{return mplan;}
+        
+        class SelectedSeat{
+                QString mgroupId,mrowId,mgroupName,mrowName;
+                int mseatId=0;
+                friend class MSeatPlanView;
+                SelectedSeat(QString gid,QString gn,QString rid,QString rn,int sid):mgroupId(gid),mrowId(rid),mgroupName(gn),mrowName(rn),mseatId(sid){}
+        public:
+                SelectedSeat()=default;
+                SelectedSeat(const SelectedSeat&)=default;
+                
+                SelectedSeat& operator=(const SelectedSeat&)=default;
+                bool operator==(const SelectedSeat&s)const{return mgroupId==s.mgroupId && mrowId==s.mrowId && mgroupName==s.mgroupName && mrowName==s.mrowName && mseatId==s.mseatId;}
+                
+                QString groupId()const{return mgroupId;}
+                QString groupName()const{return mgroupName;}
+                QString rowId()const{return mrowId;}
+                QString rowName()const{return mrowName;}
+                int seatId()const{return mseatId;}
+                
+                QString fullId()const{return QString("%1:%2:%3").arg(mgroupId).arg(mrowId).arg(mseatId);}
+        };
+        QList<SelectedSeat>selection()const;
+signals:
+        void seatSelected(SelectedSeat);
+        void seatDeselected(SelectedSeat);
+        void selectionChanged();
+        
+private slots:
+        void checkSelection(SelectedSeat);
+        
+protected:
+        void paintEvent(QPaintEvent*)override;
+        void mousePressEvent(QMouseEvent *event)override;
+        void mouseReleaseEvent(QMouseEvent *event)override;
+        void resizeEvent(QResizeEvent *event)override;
+
+
+private:
+        MOSeatPlan mplan;
+        double mscale=0.0;
+        QRect mclip;
+        bool mrightIsBlock=false,mreadOnly=false;
+        enum SeatState {Free,Blocked,Wanted,Unavailable};
+        struct Seat {
+                Seat(){}
+                Seat(int i,QTransform f,QSize s):id(i),position(f),size(s){}
+                Seat(const Seat&)=default;
+                Seat& operator=(const Seat&)=default;
+                
+                bool contains(QPoint);
+                
+                int id=0;
+                SeatState state=Free;
+                QTransform position;
+                QSize size;
+        };
+        struct Row {
+                Row(QString i,QString n,QString gi,QString gn):id(i),name(n),gid(gi),gname(gn){if(name.isEmpty())name=id;if(gname.isEmpty())gname=gid;}
+                Row(const Row&)=default;
+                Row& operator=(const Row&)=default;
+                QString id,name,gid,gname;
+                QList<Seat> seats;
+                QVector<QColor> colors;
+        };
+        QList<Row> mrows;
+};
+
+#endif
index 40f1ed2..1063557 100644 (file)
@@ -3,13 +3,15 @@ HEADERS += \
        widgets/listview.h \
        widgets/treeview.h \
        widgets/barcodeline.h \
-       widgets/eventview.h
+       widgets/eventview.h \
+       widgets/seatplanview.h
 
 SOURCES += \
        widgets/centbox.cpp \
        widgets/listview.cpp \
        widgets/treeview.cpp \
        widgets/barcodeline.cpp \
-       widgets/eventview.cpp
+       widgets/eventview.cpp \
+       widgets/seatplanview.cpp
 
 INCLUDEPATH += ./widgets
index eff0da3..3527240 100644 (file)
@@ -8,7 +8,7 @@
 
 <h2>Copyright</h2>
 
-&copy; Konrad Rosenbaum, 2007-2016<br/>
+&copy; Konrad Rosenbaum, 2007-2017<br/>
 &copy; Peter Keller, 2007/8<p>
 
 MagicSmoke is licensed under <a href="copying-gpl.html">GPL</a> (Client), <a href="copying-agpl.html">AGPL</a> (Server), 
@@ -60,6 +60,11 @@ This software comes with no warranty at all. You use it at your own risk.
 <li><a href="build.html">Building and Installing MagicSmoke from Source</a></li>
 <li><a href="preinst.html">Installing pre-packaged MagicSmoke</a></li>
 <li><a href="server.html">Creating a Server Instance</a></li>
+<li>Web-Client Configuration:<ul>
+ <li><a href="web/config.html">Web Configuration</a></li>
+ <li><a href="web/flow.html">Function Flow and Templates</a></li>
+ <li><a href="web/variables.html">Template Variable Reference</a></li>
+ </ul></li>
 <li><a href="client/config.html">Configuring the Client</a></li>
 <li>Templates:<ul>
  <li><a href="template.html">Web Template Design</a></li>
@@ -94,4 +99,4 @@ Source Documentation:
 </ul>
 
 </body>
-</html>
\ No newline at end of file
+</html>
index 13c7ac1..540fc75 100644 (file)
@@ -1,12 +1,12 @@
 Seat-Plans
 ===========
 
-Specification Version (YYYYnn): 201601
+Specification Version (YYYYnn): 201801
 
 Server Side Minimum:
 ---------------------
 
-<SeatPlan version="201601" exclusive="1">
+<SeatPlan version="201801" exclusive="1">
   <Group capacity="123" id="pr" name="Premium" numbered="no" price="1 3"/>
   <Group capacity="234" id="ch" name="Cheapo" numbered="no" price="2 4"/>
   <VGroup capacity="maxcat" name="VIP" price="1 2"/>
@@ -65,7 +65,7 @@ one of the following values:
 
 To number seats by row add Row-elements to the Group tag:
 
-<SeatPlan version="201601">
+<SeatPlan version="201801">
   <Group capacity="123" id="pr" name="Premium" numbered="yes">
     <Row id="2" capacity="23" first="2"/>
     <Row id="3" capacity="25"/>
@@ -87,8 +87,11 @@ match the sum of row capacities.
 <Row> defines a single row of seats inside this group
   id - a free form ID for the row, must only contain letters and digits,
     may be empty, but no spaces, the default is empty
-  capacity - number of seats in this row
-  first - a number if counting does not start at 1
+  capacity - number of seats in this row, the seats are auto-generated left-to-right
+  first - number of the first seat if counting does not start at 1
+  
+<Seat> defines a single seats inside a row, only used if capacity is missing from Row,
+  can be used to give rows unusual geometries
 
 If two rows have identical IDs then the seat numbers in those rows must be unique.
 E.g. above: in the Expensive group above both rows use the empty ID, one of them
@@ -122,14 +125,23 @@ Graphical Seat Plans
 ---------------------
 
 This part is never evaluated by the server, only by displays:
+                <Property name="angle" type="int">GUI: rotation of the row rectangle</Property>
 
-<SeatPlan version="201601" size="100 200" bgcolor="darkred" tkcolor="black">
+<SeatPlan version="201801" size="100 200" bgcolor="darkred" tkcolor="black">
   <Group capacity="123" id="pr" name="Premium" numbered="yes" geo="0 20 100 100" bgcolor="#fcc">
-    <Row id="2" capacity="23" first="2" geo="10 0 90 10/>
-    <Row id="3" capacity="25" geo="0 20 100 10"/>
-    <Row id="4" capacity="25" geo="0 40 100 10"/>
+    <Row id="2" capacity="23" first="2" geo="10 0 90 10"/>
+    <Row id="3" capacity="25" geo="0 20 100 10" closegap="1"/>
+    <Row id="4" capacity="25" geo="0 40 100 10" closegap="2"/>
     <Row id="5" capacity="25" geo="0 60 100 10"/>
-    <Row id="6" capacity="25" geo="0 80 100 10"/>
+    <Row id="6" geo="0 80 100 10">
+      <Seat id="1" geo="0 0 7 7" angle="20"/>
+      <Seat id="2" geo="10 0 7 7" angle="20"/>
+      <Seat id="3" geo="20 0 7 7" angle="20"/>
+      <Seat id="4" geo="30 0 7 7" angle="20"/>
+      <Seat id="5" geo="40 0 7 7" angle="20"/>
+      <Seat id="6" geo="50 0 7 7" angle="20"/>
+      <Seat id="7" geo="60 0 7 7" angle="20"/>
+    </Row>
   </Group>
   <Group name="Expensive" id="ex" numbered="yes" geo="0 100 100 30" bgcolor="#cfc">
     <Row id="" capacity="25" geo="0 0 100 10"/>
@@ -139,17 +151,26 @@ This part is never evaluated by the server, only by displays:
 </SeatPlan>
 
 New Attributes:
- SeatPlan/size - relative canvas size, the actual canvas will be scaled to fit the display
+ SeatPlan/size - relative canvas size, the actual canvas will be scaled to fit the display; if size is missing all graphical elements are ignored!
  geo - coordinates "x y w h" - top left corner X and Y (canvas top left is 0,0), width and height
  Group/geo - geometry relative to the canvas
  Row/geo - geometry relative to the Group
- bgcolor - (Plan/Group/Row) background or fill color
- fgcolor - (Plan/Group/Row) foreground or text color
+ Row/closegap - hint to the gap closing algorithm (see below)
+ Seat/geo - geometry relative to the Row
+ bgcolor - (Plan/Group/Row) background or fill color for seats
+ fgcolor - (Plan/Group/Row) foreground or line & text color for seats
  tkcolor - (Plan/Group/Row) fill color for seats that are taken (on Plan/Group it sets the default)
- linecolor - (Group/Row) the color of the outline; defaults to bgcolor
- linewidth - (Group/Row) the width of the outline; defaults to 1 pixel
- Group/angle - rotate the group (value in degrees)
- Row/curve - row curvature, see below
+ tkfgcolor - (Plan/Group/Row) foreground or line & text color for seats when tkcolor is used, fallback is fgcolor
+ wcolor -  (Plan/Group/Row) fill color for seats that are wanted by the user (on Plan/Group it sets the default)
+ wfgcolor - (Plan/Group/Row) foreground or line & text color for seats when wcolor is used, fallback is fgcolor
+ angle - (Group/Row/Seat) rotate the group (value in degrees)
+ name - (Group/Row) human readable name for the group or row
+ Note: within each specific Row element the use of the capacity attribute and Seat elements are exclusive. Only
+ one or the other is permitted. Use of both leads to undefined behavior.
+ Note: Groups and Rows are not painted themselves, they are organizational elements. If you want to trace the outline
+ of a group or row you need to do this with additional Background elements (see below).
 
 Colors: all web colors can be used by name, numeric values can be specified in hex
 either as "#rgb" or "#rrggbb".
@@ -172,28 +193,53 @@ Curvature of Rows: a series of points at which to align seats... ?
  
 TODO: define trapezes(?), curved rows, etc.
 
+The closegap algorithm: this algorithm makes sure there are no unsightly gaps between guests.
+Per default this algorithm is off (value of zero "0"). If active then the closegap attribute
+contains the maximum number of empty seats in a gap that will be closed for the sale to
+continue. The algorithm always works on rows by moving seats wanted by the customer closer to already
+occupied seats or closer to the side of the row. The algorithm choses the closest occupied sear or isle.
+
+For example (O=empty, #=already sold, +=wanted by customer), assuming closegap=1:
+OOOOO+OO -> sale will be allowed as is
+OOOOOO+O -> will move the customer to the right
+O+OOOOOO -> will move the customer to the left
+##O++OOO -> will move the customer left
+##OO++OO -> will be allowed
+##OOOO++ -> will be allowed
+OO+O+OOO -> will move seats together, closing gap
+OO+OO+OO -> will be allowed
+OO+#+OOO -> will be allowed (gap is not empty)
+assuming closegap=2:
+OOOOO+OO -> will be moved right
+OOOO+OOO -> will be allowed
+OO+OO+OO -> gap will be closed towards center
+OO+##+OO -> will be allowed (gap not empty)
+
 Additional Graphics
 --------------------
 
-The background of the seat plan can be defined in an additional element:
+The background of the seat plan can be defined in aDas Stuhlhaus Dresden
+4,0 (6) Â· Möbelgeschäft
+Dresden Â· 0351 5637610
+Geöffnet bis 18:00n additional element:
 
-<SeatPlan version="201501" size="100 200">
+<SeatPlan version="201801" size="100 200">
   <Group capacity="123" id="pr" name="Premium" numbered="yes" geo="0 20 100 100" bgcolor="#fcc"/>
 
   <!-- create a line -->
-  <Background type="line" geo="10 10 30 10" bgcolor="yellow"/>
+  <Background type="line" geo="10 10 30 10" fgcolor="yellow"/>
 
   <!-- create a rectangle -->
   <Background type="rect" geo="10 10 30 10" bgcolor="yellow"/>
 
   <!-- create a simple text -->
-  <Background type="text" geo="10 10 30 10" fgcolor="darkblue" fontsize="15" content="hello"/>
+  <Background type="text" geo="10 10 30 10" fgcolor="darkblue" font="mono" fontsize="15" content="hello"/>
 
   <!-- create a circle or elipse -->
   <Background type="circle" geo="40 40 10 20" bgcolor="lightred"/>
 
   <!-- insert a simple icon or picture -->
-  <Background type="image" geo="10 40 25 25" image="icon.png"/>
+  <Background type="image" geo="10 40 25 25" content="icon.png"/>
   <Image name="icon.png"><Data>base64-encoded data</Data></Image>
 </SeatPlan>
 
@@ -205,7 +251,7 @@ Attributes:
   angle - rotation in degree
   Background:text/fontsize - font size in relative points of the seat plan, automatically scaled
   Background:text/content - textual content
-  Background:image/image - link to an Image tag
+  Background:image/content - link to an Image tag
   Image/Data - contains the actual image data base64 encoded
   Image/name - link name of the image, usually derived from the original file name
 
index d9f9358..91f578d 100644 (file)
@@ -7,7 +7,7 @@
 
 The web user interface is constructed with templates with just a few dynamic values filled in. Those templates are found in the <tt>template/*</tt> directories. These templates are normal HTML or text with some special constructs to fill in the blanks.<p>
 
-Please see the <a href="http://www.twig-project.org/documentation">Twig</a> template engine documentation for syntax details.
+Please see the <a href="twig/index.html">Twig</a> template engine documentation for syntax details.
 
 <h2>Template Files</h2>
 
@@ -34,5 +34,6 @@ Allowing the web server write access to a directory opens a potential security h
 <li>comment out the "setAdminPassCode" line in <tt>config.php</tt></li>
 </ol>
 
+<!-- TODO: move most of this to web/*.html -->
 
-</html>
\ No newline at end of file
+</html>
diff --git a/doc/web/config.html b/doc/web/config.html
new file mode 100644 (file)
index 0000000..1131aeb
--- /dev/null
@@ -0,0 +1,21 @@
+<html>
+<head>
+<title>Web Configuration</title>
+</head>
+<body>
+<h1>Web Configuration</h1>
+
+<p>This chapter explains how to configure the web interface of MagicSmoke.</p>
+
+<h2>Main Configuration: config.php</h2>
+
+
+<h2>Language Configuration: template/*/format.cfg</h2>
+
+template/format.cfg
+template/LANG/format.cfg
+template/LANG/lang.po
+
+
+</body>
+</html>
diff --git a/doc/web/flow.html b/doc/web/flow.html
new file mode 100644 (file)
index 0000000..3da39d7
--- /dev/null
@@ -0,0 +1,197 @@
+<html>
+<head>
+<title>Web Function Flow</title>
+</head>
+<body>
+<h1>Web Function Flow</h1>
+
+<p>This chapter deals with the functionality implemented in the Web Interface for customers and how it uses web templates. Each template is then documented in the <a href="variables.html">Template Reference</a>.</p>
+
+<p>The following diagram shows the flow of HTTP-calls and display pages in MagicSmoke:</p>
+<p><img src="flow.svg" width="1200"/></p>
+
+<p>Each box refers to one call to <tt>index.php?mode=<i>label</i></tt> with the label of the box being the value of the mode parameter. The following conventions are used:
+<ul>
+<li>dark green circle: starting point. This is called if/when no mode parameter is present. It behaves as if mode was set to the configured starting mode.<ul>
+  <li>(*) At the moment the system always starts at <tt>mode=tickets</tt>, this will be configurable in later versions.</li>
+  </ul></li>
+<li>light blue box: This is a starting mode, i.e. it can be linked from the main layout and will display fine without any other parameters or session state.<ul>
+  <li>(-) the shop mode is currently not implemented and redirects to the starting point instead.</li>
+  </ul></li>
+<li>light green box: this mode needs session state to display correctly.</li>
+<li>yellow box: this mode is transitory, i.e. it redirects immediately to the next green box, unless there is an error.</li>
+<li>dark green box: this mode can be called from the main layout, but redirects immediately.</li>
+<li>red box: an admin mode, this can only be called by manipulating the URL bar and needs to be configured to work.</li>
+<li>dark blue box: called externally with a code - e.g. from an email.</li>
+<li>dark grey box: to be implemented...</li>
+<li>black arrow: web call - either by click or redirection.</li>
+<li>green arrow: internal redirection, no round trip through the browser.</li>
+</ul></p>
+
+<h2>Modes/Functions</h2>
+
+<table frame="1" border="1">
+<tr>
+ <td><b>Mode</b></td>
+ <td><b>Templates</b></td>
+ <td><b>Description</b></td></tr>
+
+<tr>
+ <td>addcoupon</td>
+ <td>-</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>cart</td>
+ <td>cart.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>changeDeliveryAddress</td>
+ <td>*.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>changeInvoiceAddress</td>
+ <td>*.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>checkout</td>
+ <td>checkout.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>compile</td>
+ <td>-</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>customerAddressEdit*</td>
+ <td>*.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>customerAddresses*</td>
+ <td>*.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>customerData*</td>
+ <td>*.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>customerLogin*</td>
+ <td>cart.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>customerLoginOrder</td>
+ <td>-</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>customerRegistrationOrder</td>
+ <td>-</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>customerReset*</td>
+ <td>*</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>customerResetLogin</td>
+ <td>resetlogin.html<br/>reseterror.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>customerResetOrder</td>
+ <td>-</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>eventDetails</td>
+ <td>eventdetails.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>eventOrder</td>
+ <td>-</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>index</td>
+ <td>index.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>mycart</td>
+ <td>-</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>orderDetail*</td>
+ <td>*.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>orderDownload*</td>
+ <td>*</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>orderList*</td>
+ <td>*.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>orderLogin</td>
+ <td>*.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>payvoucher*</td>
+ <td>*</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>placeorder</td>
+ <td>*.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>removeItem</td>
+ <td>-</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>setlanguage</td>
+ <td>-</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>shop*</td>
+ <td>*.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>tickets</td>
+ <td>tickets.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>vouchers</td>
+ <td>vouchers.html</td>
+ <td>...</td></tr>
+
+<tr>
+ <td>voucherOrder</td>
+ <td>-</td>
+ <td>...</td></tr>
+
+</table>
+
+</body>
+</html>
diff --git a/doc/web/flow.odg b/doc/web/flow.odg
new file mode 100644 (file)
index 0000000..367977b
Binary files /dev/null and b/doc/web/flow.odg differ
diff --git a/doc/web/flow.svg b/doc/web/flow.svg
new file mode 100644 (file)
index 0000000..736cf06
--- /dev/null
@@ -0,0 +1,825 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<svg version="1.2" baseProfile="tiny" width="450mm" height="300mm" viewBox="0 0 45000 30000" preserveAspectRatio="xMidYMid" fill-rule="evenodd" clip-path="url(#presentation_clip_path)" stroke-width="28.222" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve">
+ <defs class="ClipPathGroup">
+  <clipPath id="presentation_clip_path" clipPathUnits="userSpaceOnUse">
+   <rect x="0" y="0" width="45000" height="30000"/>
+  </clipPath>
+ </defs>
+ <defs>
+  <font id="EmbeddedFont_1" horiz-adv-x="2048">
+   <font-face font-family="Liberation Sans embedded" units-per-em="2048" font-weight="normal" font-style="normal" ascent="1852" descent="423"/>
+   <missing-glyph horiz-adv-x="2048" d="M 0,0 L 2047,0 2047,2047 0,2047 0,0 Z"/>
+   <glyph unicode="y" horiz-adv-x="1059" d="M 604,1 C 579,-64 553,-123 527,-175 500,-227 471,-272 438,-309 405,-346 369,-374 329,-394 289,-413 243,-423 191,-423 168,-423 147,-423 128,-423 109,-423 88,-420 67,-414 L 67,-279 C 80,-282 94,-284 110,-284 126,-284 140,-284 151,-284 204,-284 253,-264 298,-225 343,-186 383,-123 417,-37 L 434,6 5,1082 197,1082 425,484 C 432,466 440,442 451,412 461,382 471,352 482,322 492,292 501,265 509,241 517,217 522,202 523,196 525,203 530,218 538,240 545,261 554,285 564,312 573,339 583,366 593,393 603,420 611,444 618,464 L 830,1082 1020,1082 604,1 Z"/>
+   <glyph unicode="x" horiz-adv-x="1033" d="M 801,0 L 510,444 217,0 23,0 408,556 41,1082 240,1082 510,661 778,1082 979,1082 612,558 1002,0 801,0 Z"/>
+   <glyph unicode="w" horiz-adv-x="1535" d="M 1174,0 L 965,0 792,698 C 787,716 781,738 776,765 770,792 764,818 759,843 752,872 746,903 740,934 734,904 728,874 721,845 716,820 710,793 704,766 697,739 691,715 686,694 L 508,0 300,0 -3,1082 175,1082 358,347 C 363,332 367,313 372,291 377,268 381,246 386,225 391,200 396,175 401,149 406,174 412,199 418,223 423,244 429,265 434,286 439,307 444,325 448,339 L 644,1082 837,1082 1026,339 C 1031,322 1036,302 1041,280 1046,258 1051,237 1056,218 1061,195 1067,172 1072,149 1077,174 1083,199 1088,223 1093,244 1098,265 1103,288 1108,310 1112,330 1117,347 L 1308,1082 1484,1082 1174,0 Z"/>
+   <glyph unicode="v" horiz-adv-x="1059" d="M 613,0 L 400,0 7,1082 199,1082 437,378 C 442,363 447,346 454,325 460,304 466,282 473,259 480,236 486,215 492,194 497,173 502,155 506,141 510,155 515,173 522,194 528,215 534,236 541,258 548,280 555,302 562,323 569,344 575,361 580,376 L 826,1082 1017,1082 613,0 Z"/>
+   <glyph unicode="u" horiz-adv-x="901" d="M 314,1082 L 314,396 C 314,343 318,299 326,264 333,229 346,200 363,179 380,157 403,142 432,133 460,124 495,119 537,119 580,119 618,127 653,142 687,157 716,178 741,207 765,235 784,270 797,312 810,353 817,401 817,455 L 817,1082 997,1082 997,231 C 997,208 997,185 998,160 998,135 998,111 999,89 1000,66 1000,47 1001,31 1002,15 1002,5 1003,0 L 833,0 C 832,3 832,12 831,27 830,42 830,59 829,78 828,97 827,116 826,136 825,155 825,172 825,185 L 822,185 C 805,154 786,125 765,100 744,75 720,53 693,36 666,18 634,4 599,-6 564,-15 523,-20 476,-20 416,-20 364,-13 321,2 278,17 242,39 214,70 186,101 166,140 153,188 140,236 133,294 133,361 L 133,1082 314,1082 Z"/>
+   <glyph unicode="t" horiz-adv-x="531" d="M 554,8 C 527,1 499,-5 471,-10 442,-14 409,-16 372,-16 228,-16 156,66 156,229 L 156,951 31,951 31,1082 163,1082 216,1324 336,1324 336,1082 536,1082 536,951 336,951 336,268 C 336,216 345,180 362,159 379,138 408,127 450,127 467,127 484,128 501,131 517,134 535,137 554,141 L 554,8 Z"/>
+   <glyph unicode="s" horiz-adv-x="927" d="M 950,299 C 950,248 940,203 921,164 901,124 872,91 835,64 798,37 752,16 698,2 643,-13 581,-20 511,-20 448,-20 392,-15 342,-6 291,4 247,20 209,41 171,62 139,91 114,126 88,161 69,203 57,254 L 216,285 C 231,227 263,185 311,158 359,131 426,117 511,117 550,117 585,120 618,125 650,130 678,140 701,153 724,166 743,183 756,205 769,226 775,253 775,285 775,318 767,345 752,366 737,387 715,404 688,418 661,432 628,444 589,455 550,465 507,476 460,489 417,500 374,513 331,527 288,541 250,560 216,583 181,606 153,634 132,668 111,702 100,745 100,796 100,895 135,970 206,1022 276,1073 378,1099 513,1099 632,1099 727,1078 798,1036 868,994 912,927 931,834 L 769,814 C 763,842 752,866 736,885 720,904 701,919 678,931 655,942 630,951 602,956 573,961 544,963 513,963 432,963 372,951 333,926 294,901 275,864 275,814 275,785 282,761 297,742 311,723 331,707 357,694 382,681 413,669 449,660 485,650 525,640 568,629 597,622 626,614 656,606 686,597 715,587 744,576 772,564 799,550 824,535 849,519 870,500 889,478 908,456 923,430 934,401 945,372 950,338 950,299 Z"/>
+   <glyph unicode="r" horiz-adv-x="556" d="M 142,0 L 142,830 C 142,853 142,876 142,900 141,923 141,946 140,968 139,990 139,1011 138,1030 137,1049 137,1067 136,1082 L 306,1082 C 307,1067 308,1049 309,1030 310,1010 311,990 312,969 313,948 313,929 314,910 314,891 314,874 314,861 L 318,861 C 331,902 344,938 359,969 373,999 390,1024 409,1044 428,1063 451,1078 478,1088 505,1097 537,1102 575,1102 590,1102 604,1101 617,1099 630,1096 641,1094 648,1092 L 648,927 C 636,930 622,933 606,935 590,936 572,937 552,937 511,937 476,928 447,909 418,890 394,865 376,832 357,799 344,759 335,714 326,668 322,618 322,564 L 322,0 142,0 Z"/>
+   <glyph unicode="p" horiz-adv-x="953" d="M 1053,546 C 1053,464 1046,388 1033,319 1020,250 998,190 967,140 936,90 895,51 844,23 793,-6 730,-20 655,-20 578,-20 510,-5 452,24 394,53 350,101 319,168 L 314,168 C 315,167 315,161 316,150 316,139 316,126 317,110 317,94 317,76 318,57 318,37 318,17 318,-2 L 318,-425 138,-425 138,861 C 138,887 138,912 138,936 137,960 137,982 136,1002 135,1021 135,1038 134,1052 133,1066 133,1076 132,1082 L 306,1082 C 307,1080 308,1073 309,1061 310,1049 311,1035 312,1018 313,1001 314,982 315,963 316,944 316,925 316,908 L 320,908 C 337,943 356,972 377,997 398,1021 423,1041 450,1057 477,1072 508,1084 542,1091 575,1098 613,1101 655,1101 730,1101 793,1088 844,1061 895,1034 936,997 967,949 998,900 1020,842 1033,774 1046,705 1053,629 1053,546 Z M 864,542 C 864,609 860,668 852,720 844,772 830,816 811,852 791,888 765,915 732,934 699,953 658,962 609,962 569,962 531,956 496,945 461,934 430,912 404,880 377,848 356,804 341,748 326,691 318,618 318,528 318,451 324,387 337,334 350,281 368,238 393,205 417,172 447,149 483,135 519,120 560,113 607,113 657,113 699,123 732,142 765,161 791,189 811,226 830,263 844,308 852,361 860,414 864,474 864,542 Z"/>
+   <glyph unicode="o" horiz-adv-x="980" d="M 1053,542 C 1053,353 1011,212 928,119 845,26 724,-20 565,-20 490,-20 422,-9 363,14 304,37 254,71 213,118 172,165 140,223 119,294 97,364 86,447 86,542 86,915 248,1102 571,1102 655,1102 728,1090 789,1067 850,1044 900,1009 939,962 978,915 1006,857 1025,787 1044,717 1053,635 1053,542 Z M 864,542 C 864,626 858,695 845,750 832,805 813,848 788,881 763,914 732,937 696,950 660,963 619,969 574,969 528,969 487,962 450,949 413,935 381,912 355,879 329,846 309,802 296,747 282,692 275,624 275,542 275,458 282,389 297,334 312,279 332,235 358,202 383,169 414,146 449,133 484,120 522,113 563,113 609,113 651,120 688,133 725,146 757,168 783,201 809,234 829,278 843,333 857,388 864,458 864,542 Z"/>
+   <glyph unicode="n" horiz-adv-x="900" d="M 825,0 L 825,686 C 825,739 821,783 814,818 806,853 793,882 776,904 759,925 736,941 708,950 679,959 644,963 602,963 559,963 521,956 487,941 452,926 423,904 399,876 374,847 355,812 342,771 329,729 322,681 322,627 L 322,0 142,0 142,851 C 142,874 142,898 142,923 141,948 141,971 140,994 139,1016 139,1035 138,1051 137,1067 137,1077 136,1082 L 306,1082 C 307,1079 307,1070 308,1055 309,1040 310,1024 311,1005 312,986 312,966 313,947 314,927 314,910 314,897 L 317,897 C 334,928 353,957 374,982 395,1007 419,1029 446,1047 473,1064 505,1078 540,1088 575,1097 616,1102 663,1102 723,1102 775,1095 818,1080 861,1065 897,1043 925,1012 953,981 974,942 987,894 1000,845 1006,788 1006,721 L 1006,0 825,0 Z"/>
+   <glyph unicode="m" horiz-adv-x="1456" d="M 768,0 L 768,686 C 768,739 765,783 758,818 751,853 740,882 725,904 709,925 688,941 663,950 638,959 607,963 570,963 532,963 498,956 467,941 436,926 410,904 389,876 367,847 350,812 339,771 327,729 321,681 321,627 L 321,0 142,0 142,851 C 142,874 142,898 142,923 141,948 141,971 140,994 139,1016 139,1035 138,1051 137,1067 137,1077 136,1082 L 306,1082 C 307,1079 307,1070 308,1055 309,1040 310,1024 311,1005 312,986 312,966 313,947 314,927 314,910 314,897 L 317,897 C 333,928 350,957 369,982 388,1007 410,1029 435,1047 460,1064 488,1078 521,1088 553,1097 590,1102 633,1102 715,1102 780,1086 828,1053 875,1020 908,968 927,897 L 930,897 C 946,928 964,957 984,982 1004,1007 1027,1029 1054,1047 1081,1064 1111,1078 1144,1088 1177,1097 1215,1102 1258,1102 1313,1102 1360,1095 1400,1080 1439,1065 1472,1043 1497,1012 1522,981 1541,942 1553,894 1565,845 1571,788 1571,721 L 1571,0 1393,0 1393,686 C 1393,739 1390,783 1383,818 1376,853 1365,882 1350,904 1334,925 1313,941 1288,950 1263,959 1232,963 1195,963 1157,963 1123,956 1092,942 1061,927 1035,906 1014,878 992,850 975,815 964,773 952,731 946,682 946,627 L 946,0 768,0 Z"/>
+   <glyph unicode="l" horiz-adv-x="187" d="M 138,0 L 138,1484 318,1484 318,0 138,0 Z"/>
+   <glyph unicode="k" horiz-adv-x="927" d="M 816,0 L 450,494 318,385 318,0 138,0 138,1484 318,1484 318,557 793,1082 1004,1082 565,617 1027,0 816,0 Z"/>
+   <glyph unicode="i" horiz-adv-x="187" d="M 137,1312 L 137,1484 317,1484 317,1312 137,1312 Z M 137,0 L 137,1082 317,1082 317,0 137,0 Z"/>
+   <glyph unicode="h" horiz-adv-x="874" d="M 317,897 C 337,934 359,965 382,991 405,1016 431,1037 459,1054 487,1071 518,1083 551,1091 584,1098 622,1102 663,1102 732,1102 789,1093 834,1074 878,1055 913,1029 939,996 964,962 982,922 992,875 1001,828 1006,777 1006,721 L 1006,0 825,0 825,686 C 825,732 822,772 817,807 811,842 800,871 784,894 768,917 745,934 716,946 687,957 649,963 602,963 559,963 521,955 487,940 452,925 423,903 399,875 374,847 355,813 342,773 329,733 322,688 322,638 L 322,0 142,0 142,1484 322,1484 322,1098 C 322,1076 322,1054 321,1032 320,1010 320,990 319,971 318,952 317,937 316,924 315,911 315,902 314,897 L 317,897 Z"/>
+   <glyph unicode="g" horiz-adv-x="954" d="M 548,-425 C 486,-425 431,-419 383,-406 335,-393 294,-375 260,-352 226,-328 198,-300 177,-267 156,-234 140,-198 131,-158 L 312,-132 C 324,-182 351,-220 392,-248 433,-274 486,-288 553,-288 594,-288 631,-282 664,-271 697,-260 726,-241 749,-217 772,-191 790,-159 803,-119 816,-79 822,-30 822,27 L 822,201 820,201 C 807,174 790,148 771,123 751,98 727,75 699,56 670,37 637,21 600,10 563,-2 520,-8 472,-8 403,-8 345,4 296,27 247,50 207,84 176,130 145,176 122,233 108,302 93,370 86,449 86,539 86,626 93,704 108,773 122,842 145,901 178,950 210,998 252,1035 304,1061 355,1086 418,1099 492,1099 569,1099 635,1082 692,1047 748,1012 791,962 822,897 L 824,897 C 824,914 825,932 826,953 827,974 828,993 829,1012 830,1030 831,1046 832,1059 833,1072 835,1080 836,1082 L 1007,1082 C 1006,1076 1006,1066 1005,1052 1004,1037 1004,1020 1003,1000 1002,980 1002,958 1002,934 1001,909 1001,884 1001,858 L 1001,31 C 1001,-120 964,-234 890,-311 815,-387 701,-425 548,-425 Z M 822,541 C 822,616 814,681 798,735 781,788 760,832 733,866 706,900 676,925 642,941 607,957 572,965 536,965 490,965 451,957 418,941 385,925 357,900 336,866 314,831 298,787 288,734 277,680 272,616 272,541 272,463 277,398 288,345 298,292 314,249 335,216 356,183 383,160 416,146 449,132 488,125 533,125 569,125 604,133 639,148 673,163 704,188 731,221 758,254 780,297 797,350 814,403 822,466 822,541 Z"/>
+   <glyph unicode="e" horiz-adv-x="980" d="M 276,503 C 276,446 282,394 294,347 305,299 323,258 348,224 372,189 403,163 441,144 479,125 525,115 578,115 656,115 719,131 766,162 813,193 844,233 861,281 L 1019,236 C 1008,206 992,176 972,146 951,115 924,88 890,64 856,39 814,19 763,4 712,-12 650,-20 578,-20 418,-20 296,28 213,123 129,218 87,360 87,548 87,649 100,735 125,806 150,876 185,933 229,977 273,1021 324,1053 383,1073 442,1092 504,1102 571,1102 662,1102 738,1087 799,1058 860,1029 909,988 946,937 983,885 1009,824 1025,754 1040,684 1048,608 1048,527 L 1048,503 276,503 Z M 862,641 C 852,755 823,838 775,891 727,943 658,969 568,969 538,969 507,964 474,955 441,945 410,928 382,903 354,878 330,845 311,803 292,760 281,706 278,641 L 862,641 Z"/>
+   <glyph unicode="d" horiz-adv-x="954" d="M 821,174 C 788,105 744,55 689,25 634,-5 565,-20 484,-20 347,-20 247,26 183,118 118,210 86,349 86,536 86,913 219,1102 484,1102 566,1102 634,1087 689,1057 744,1027 788,979 821,914 L 823,914 C 823,921 823,931 823,946 822,960 822,975 822,991 821,1006 821,1021 821,1035 821,1049 821,1059 821,1065 L 821,1484 1001,1484 1001,223 C 1001,197 1001,172 1002,148 1002,124 1002,102 1003,82 1004,62 1004,45 1005,31 1006,16 1006,6 1007,0 L 835,0 C 834,7 833,16 832,29 831,41 830,55 829,71 828,87 827,104 826,122 825,139 825,157 825,174 L 821,174 Z M 275,542 C 275,467 280,403 289,350 298,297 313,253 334,219 355,184 381,159 413,143 445,127 484,119 530,119 577,119 619,127 656,142 692,157 722,182 747,217 771,251 789,296 802,351 815,406 821,474 821,554 821,631 815,696 802,749 789,802 771,844 746,877 721,910 691,933 656,948 620,962 579,969 532,969 488,969 450,961 418,946 386,931 359,906 338,872 317,838 301,794 291,740 280,685 275,619 275,542 Z"/>
+   <glyph unicode="c" horiz-adv-x="875" d="M 275,546 C 275,484 280,427 289,375 298,323 313,278 334,241 355,203 384,174 419,153 454,132 497,122 548,122 612,122 666,139 709,173 752,206 778,258 788,328 L 970,328 C 964,283 951,239 931,197 911,155 884,118 850,86 815,54 773,28 724,9 675,-10 618,-20 553,-20 468,-20 396,-6 337,23 278,52 230,91 193,142 156,192 129,251 112,320 95,388 87,462 87,542 87,615 93,679 105,735 117,790 134,839 156,881 177,922 203,957 232,986 261,1014 293,1037 328,1054 362,1071 398,1083 436,1091 474,1098 512,1102 551,1102 612,1102 666,1094 713,1077 760,1060 801,1038 836,1009 870,980 898,945 919,906 940,867 955,824 964,779 L 779,765 C 770,825 746,873 708,908 670,943 616,961 546,961 495,961 452,953 418,936 383,919 355,893 334,859 313,824 298,781 289,729 280,677 275,616 275,546 Z"/>
+   <glyph unicode="a" horiz-adv-x="1060" d="M 414,-20 C 305,-20 224,9 169,66 114,124 87,203 87,303 87,375 101,434 128,480 155,526 190,562 234,588 277,614 327,632 383,642 439,652 496,657 554,657 L 797,657 797,717 C 797,762 792,800 783,832 774,863 759,889 740,908 721,928 697,942 668,951 639,960 604,965 565,965 530,965 499,963 471,958 443,953 419,944 398,931 377,918 361,900 348,878 335,855 327,827 323,793 L 135,810 C 142,853 154,892 173,928 192,963 218,994 253,1020 287,1046 330,1066 382,1081 433,1095 496,1102 569,1102 705,1102 807,1071 876,1009 945,946 979,856 979,738 L 979,272 C 979,219 986,179 1000,152 1014,125 1041,111 1080,111 1090,111 1100,112 1110,113 1120,114 1130,116 1139,118 L 1139,6 C 1116,1 1094,-3 1072,-6 1049,-9 1025,-10 1000,-10 966,-10 937,-5 913,4 888,13 868,26 853,45 838,63 826,86 818,113 810,140 805,171 803,207 L 797,207 C 778,172 757,141 734,113 711,85 684,61 653,42 622,22 588,7 549,-4 510,-15 465,-20 414,-20 Z M 455,115 C 512,115 563,125 606,146 649,167 684,194 713,226 741,259 762,294 776,332 790,371 797,408 797,443 L 797,531 600,531 C 556,531 514,528 475,522 435,517 400,506 370,489 340,472 316,449 299,418 281,388 272,349 272,300 272,241 288,195 320,163 351,131 396,115 455,115 Z"/>
+   <glyph unicode="V" horiz-adv-x="1350" d="M 782,0 L 584,0 9,1409 210,1409 600,417 C 610,387 620,357 630,328 640,298 649,271 657,248 666,221 675,194 684,168 692,193 701,219 710,246 718,269 727,296 737,325 746,354 757,385 768,417 L 1156,1409 1357,1409 782,0 Z"/>
+   <glyph unicode="R" horiz-adv-x="1218" d="M 1164,0 L 798,585 359,585 359,0 168,0 168,1409 831,1409 C 911,1409 982,1400 1044,1382 1105,1363 1157,1337 1199,1302 1241,1267 1273,1225 1295,1175 1317,1125 1328,1069 1328,1006 1328,961 1322,917 1309,874 1296,831 1275,791 1247,755 1219,719 1183,688 1140,662 1097,636 1045,618 984,607 L 1384,0 1164,0 Z M 1136,1004 C 1136,1047 1129,1084 1114,1115 1099,1146 1078,1173 1050,1194 1022,1215 988,1230 948,1241 908,1251 863,1256 812,1256 L 359,1256 359,736 820,736 C 875,736 922,743 962,757 1002,770 1035,789 1061,813 1086,837 1105,865 1118,898 1130,931 1136,966 1136,1004 Z"/>
+   <glyph unicode="O" horiz-adv-x="1377" d="M 1495,711 C 1495,601 1479,501 1448,411 1416,321 1370,244 1310,180 1250,116 1177,67 1090,32 1003,-3 905,-20 795,-20 679,-20 577,-2 490,35 403,71 330,122 272,187 214,252 170,329 141,418 112,507 97,605 97,711 97,821 112,920 143,1009 174,1098 219,1173 278,1236 337,1298 411,1346 498,1380 585,1413 684,1430 797,1430 909,1430 1009,1413 1096,1379 1183,1345 1256,1297 1315,1234 1374,1171 1418,1096 1449,1007 1480,918 1495,820 1495,711 Z M 1300,711 C 1300,796 1289,873 1268,942 1246,1011 1214,1071 1172,1120 1129,1169 1077,1207 1014,1234 951,1261 879,1274 797,1274 713,1274 639,1261 576,1234 513,1207 460,1169 418,1120 375,1071 344,1011 323,942 302,873 291,796 291,711 291,626 302,549 324,479 345,408 377,348 420,297 462,246 515,206 578,178 641,149 713,135 795,135 883,135 959,149 1023,178 1086,207 1139,247 1180,298 1221,349 1251,409 1271,480 1290,551 1300,628 1300,711 Z"/>
+   <glyph unicode="L" horiz-adv-x="900" d="M 168,0 L 168,1409 359,1409 359,156 1071,156 1071,0 168,0 Z"/>
+   <glyph unicode="I" horiz-adv-x="186" d="M 189,0 L 189,1409 380,1409 380,0 189,0 Z"/>
+   <glyph unicode="E" horiz-adv-x="1112" d="M 168,0 L 168,1409 1237,1409 1237,1253 359,1253 359,801 1177,801 1177,647 359,647 359,156 1278,156 1278,0 168,0 Z"/>
+   <glyph unicode="D" horiz-adv-x="1218" d="M 1381,719 C 1381,602 1363,498 1328,409 1293,319 1244,244 1183,184 1122,123 1049,78 966,47 882,16 792,0 695,0 L 168,0 168,1409 634,1409 C 743,1409 843,1396 935,1369 1026,1342 1105,1300 1171,1244 1237,1187 1289,1116 1326,1029 1363,942 1381,839 1381,719 Z M 1189,719 C 1189,814 1175,896 1148,964 1121,1031 1082,1087 1033,1130 984,1173 925,1205 856,1226 787,1246 712,1256 630,1256 L 359,1256 359,153 673,153 C 747,153 816,165 879,189 942,213 996,249 1042,296 1088,343 1124,402 1150,473 1176,544 1189,626 1189,719 Z"/>
+   <glyph unicode="A" horiz-adv-x="1350" d="M 1167,0 L 1006,412 364,412 202,0 4,0 579,1409 796,1409 1362,0 1167,0 Z M 768,1026 C 757,1053 747,1080 738,1107 728,1134 719,1159 712,1182 705,1204 699,1223 694,1238 689,1253 686,1262 685,1265 684,1262 681,1252 676,1237 671,1222 665,1203 658,1180 650,1157 641,1132 632,1105 622,1078 612,1051 602,1024 L 422,561 949,561 768,1026 Z"/>
+   <glyph unicode="*" horiz-adv-x="715" d="M 456,1114 L 720,1217 765,1085 483,1012 668,762 549,690 399,948 243,692 124,764 313,1012 33,1085 78,1219 345,1112 333,1409 469,1409 456,1114 Z"/>
+   <glyph unicode=")" horiz-adv-x="557" d="M 555,528 C 555,435 548,346 534,262 520,177 498,96 468,18 438,-60 400,-136 353,-209 306,-282 251,-354 186,-424 L 12,-424 C 75,-354 129,-282 175,-209 220,-136 258,-60 287,19 316,98 338,179 353,264 367,349 374,437 374,530 374,623 367,711 353,796 338,881 316,962 287,1041 258,1119 220,1195 175,1269 129,1342 75,1414 12,1484 L 186,1484 C 251,1414 306,1342 353,1269 400,1196 438,1120 468,1042 498,964 520,883 534,798 548,713 555,625 555,532 L 555,528 Z"/>
+   <glyph unicode="(" horiz-adv-x="557" d="M 127,532 C 127,625 134,713 148,798 162,883 184,964 214,1042 244,1120 282,1196 329,1269 376,1342 431,1414 496,1484 L 670,1484 C 607,1414 553,1342 508,1269 462,1195 424,1119 395,1041 366,962 344,881 330,796 315,711 308,623 308,530 308,437 315,349 330,264 344,179 366,98 395,19 424,-60 462,-136 508,-209 553,-282 607,-354 670,-424 L 496,-424 C 431,-354 376,-282 329,-209 282,-136 244,-60 214,18 184,96 162,177 148,262 134,346 127,435 127,528 L 127,532 Z"/>
+   <glyph unicode=" " horiz-adv-x="556"/>
+  </font>
+ </defs>
+ <defs class="TextShapeIndex">
+  <g ooo:slide="id1" ooo:id-list="id3 id4 id5 id6 id7 id8 id9 id10 id11 id12 id13 id14 id15 id16 id17 id18 id19 id20 id21 id22 id23 id24 id25 id26 id27 id28 id29 id30 id31 id32 id33 id34 id35 id36 id37 id38 id39 id40 id41 id42 id43 id44 id45 id46 id47 id48 id49 id50 id51 id52 id53 id54 id55 id56 id57 id58 id59 id60 id61 id62 id63 id64 id65 id66 id67 id68 id69 id70 id71 id72 id73 id74 id75 id76 id77 id78 id79 id80 id81"/>
+ </defs>
+ <defs class="EmbeddedBulletChars">
+  <g id="bullet-char-template(57356)" transform="scale(0.00048828125,-0.00048828125)">
+   <path d="M 580,1141 L 1163,571 580,0 -4,571 580,1141 Z"/>
+  </g>
+  <g id="bullet-char-template(57354)" transform="scale(0.00048828125,-0.00048828125)">
+   <path d="M 8,1128 L 1137,1128 1137,0 8,0 8,1128 Z"/>
+  </g>
+  <g id="bullet-char-template(10146)" transform="scale(0.00048828125,-0.00048828125)">
+   <path d="M 174,0 L 602,739 174,1481 1456,739 174,0 Z M 1358,739 L 309,1346 659,739 1358,739 Z"/>
+  </g>
+  <g id="bullet-char-template(10132)" transform="scale(0.00048828125,-0.00048828125)">
+   <path d="M 2015,739 L 1276,0 717,0 1260,543 174,543 174,936 1260,936 717,1481 1274,1481 2015,739 Z"/>
+  </g>
+  <g id="bullet-char-template(10007)" transform="scale(0.00048828125,-0.00048828125)">
+   <path d="M 0,-2 C -7,14 -16,27 -25,37 L 356,567 C 262,823 215,952 215,954 215,979 228,992 255,992 264,992 276,990 289,987 310,991 331,999 354,1012 L 381,999 492,748 772,1049 836,1024 860,1049 C 881,1039 901,1025 922,1006 886,937 835,863 770,784 769,783 710,716 594,584 L 774,223 C 774,196 753,168 711,139 L 727,119 C 717,90 699,76 672,76 641,76 570,178 457,381 L 164,-76 C 142,-110 111,-127 72,-127 30,-127 9,-110 8,-76 1,-67 -2,-52 -2,-32 -2,-23 -1,-13 0,-2 Z"/>
+  </g>
+  <g id="bullet-char-template(10004)" transform="scale(0.00048828125,-0.00048828125)">
+   <path d="M 285,-33 C 182,-33 111,30 74,156 52,228 41,333 41,471 41,549 55,616 82,672 116,743 169,778 240,778 293,778 328,747 346,684 L 369,508 C 377,444 397,411 428,410 L 1163,1116 C 1174,1127 1196,1133 1229,1133 1271,1133 1292,1118 1292,1087 L 1292,965 C 1292,929 1282,901 1262,881 L 442,47 C 390,-6 338,-33 285,-33 Z"/>
+  </g>
+  <g id="bullet-char-template(9679)" transform="scale(0.00048828125,-0.00048828125)">
+   <path d="M 813,0 C 632,0 489,54 383,161 276,268 223,411 223,592 223,773 276,916 383,1023 489,1130 632,1184 813,1184 992,1184 1136,1130 1245,1023 1353,916 1407,772 1407,592 1407,412 1353,268 1245,161 1136,54 992,0 813,0 Z"/>
+  </g>
+  <g id="bullet-char-template(8226)" transform="scale(0.00048828125,-0.00048828125)">
+   <path d="M 346,457 C 273,457 209,483 155,535 101,586 74,649 74,723 74,796 101,859 155,911 209,963 273,989 346,989 419,989 480,963 531,910 582,859 608,796 608,723 608,648 583,586 532,535 482,483 420,457 346,457 Z"/>
+  </g>
+  <g id="bullet-char-template(8211)" transform="scale(0.00048828125,-0.00048828125)">
+   <path d="M -4,459 L 1135,459 1135,606 -4,606 -4,459 Z"/>
+  </g>
+ </defs>
+ <defs class="TextEmbeddedBitmaps"/>
+ <g>
+  <g id="id2" class="Master_Slide">
+   <g id="bg-id2" class="Background"/>
+   <g id="bo-id2" class="BackgroundObjects"/>
+  </g>
+ </g>
+ <g class="SlideGroup">
+  <g>
+   <g id="id1" class="Slide" clip-path="url(#presentation_clip_path)">
+    <g class="Page">
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id3">
+       <path fill="rgb(53,94,0)" stroke="none" d="M 5072,1386 C 5454,1386 5746,1677 5746,2059 5746,2441 5454,2733 5072,2733 4690,2733 4399,2441 4399,2059 4399,1677 4690,1386 5072,1386 Z M 4399,1386 L 4399,1386 Z M 5747,2734 L 5747,2734 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 5072,1386 C 5454,1386 5746,1677 5746,2059 5746,2441 5454,2733 5072,2733 4690,2733 4399,2441 4399,2059 4399,1677 4690,1386 5072,1386 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 4399,1386 L 4399,1386 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 5747,2734 L 5747,2734 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="4668" y="2280"><tspan fill="rgb(0,0,0)" stroke="none">init</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id4">
+       <path fill="rgb(114,159,207)" stroke="none" d="M 8787,1860 C 8724,1860 8661,1923 8661,1986 L 8661,2493 C 8661,2556 8724,2620 8787,2620 L 10814,2620 C 10877,2620 10941,2556 10941,2493 L 10941,1986 C 10941,1923 10877,1860 10814,1860 L 8787,1860 Z M 8661,1860 L 8661,1860 Z M 10941,2620 L 10941,2620 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 8787,1860 C 8724,1860 8661,1923 8661,1986 L 8661,2493 C 8661,2556 8724,2620 8787,2620 L 10814,2620 C 10877,2620 10941,2556 10941,2493 L 10941,1986 C 10941,1923 10877,1860 10814,1860 L 8787,1860 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 8661,1860 L 8661,1860 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 10941,2620 L 10941,2620 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="8761" y="2411"><tspan fill="rgb(0,0,0)" stroke="none">tickets (*)</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id5">
+       <path fill="none" stroke="rgb(0,128,0)" d="M 5074,2734 L 5074,3101 6301,3101 6301,1122 9801,1122 9801,1431"/>
+       <path fill="rgb(0,128,0)" stroke="none" d="M 9801,1861 L 9951,1411 9651,1411 9801,1861 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id6">
+       <path fill="rgb(114,159,207)" stroke="none" d="M 3814,5178 C 3751,5178 3688,5241 3688,5304 L 3688,5811 C 3688,5874 3751,5938 3814,5938 L 5841,5938 C 5904,5938 5968,5874 5968,5811 L 5968,5304 C 5968,5241 5904,5178 5841,5178 L 3814,5178 Z M 3688,5178 L 3688,5178 Z M 5968,5938 L 5968,5938 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 3814,5178 C 3751,5178 3688,5241 3688,5304 L 3688,5811 C 3688,5874 3751,5938 3814,5938 L 5841,5938 C 5904,5938 5968,5874 5968,5811 L 5968,5304 C 5968,5241 5904,5178 5841,5178 L 3814,5178 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 3688,5178 L 3688,5178 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 5968,5938 L 5968,5938 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="4239" y="5729"><tspan fill="rgb(0,0,0)" stroke="none">index</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id7">
+       <path fill="rgb(114,159,207)" stroke="none" d="M 8707,3746 C 8644,3746 8581,3809 8581,3872 L 8581,4379 C 8581,4442 8644,4506 8707,4506 L 10734,4506 C 10797,4506 10861,4442 10861,4379 L 10861,3872 C 10861,3809 10797,3746 10734,3746 L 8707,3746 Z M 8581,3746 L 8581,3746 Z M 10861,4506 L 10861,4506 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 8707,3746 C 8644,3746 8581,3809 8581,3872 L 8581,4379 C 8581,4442 8644,4506 8707,4506 L 10734,4506 C 10797,4506 10861,4442 10861,4379 L 10861,3872 C 10861,3809 10797,3746 10734,3746 L 8707,3746 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 8581,3746 L 8581,3746 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 10861,4506 L 10861,4506 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="8717" y="4297"><tspan fill="rgb(0,0,0)" stroke="none">vouchers</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id8">
+       <path fill="rgb(76,76,76)" stroke="none" d="M 8682,5790 C 8619,5790 8556,5853 8556,5916 L 8556,6423 C 8556,6486 8619,6550 8682,6550 L 10709,6550 C 10772,6550 10836,6486 10836,6423 L 10836,5916 C 10836,5853 10772,5790 10709,5790 L 8682,5790 Z M 8556,5790 L 8556,5790 Z M 10836,6550 L 10836,6550 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 8682,5790 C 8619,5790 8556,5853 8556,5916 L 8556,6423 C 8556,6486 8619,6550 8682,6550 L 10709,6550 C 10772,6550 10836,6486 10836,6423 L 10836,5916 C 10836,5853 10772,5790 10709,5790 L 8682,5790 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 8556,5790 L 8556,5790 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 10836,6550 L 10836,6550 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="9158" y="6341"><tspan fill="rgb(255,255,255)" stroke="none">shop</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id9">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 5968,5558 L 7247,5558 7247,2240 8232,2240"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 8662,2240 L 8212,2090 8212,2390 8662,2240 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id10">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 5968,5558 L 7247,5558 7247,4126 8152,4126"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 8582,4126 L 8132,3976 8132,4276 8582,4126 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id11">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 5968,5558 L 7247,5558 7247,6170 8127,6170"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 8557,6170 L 8107,6020 8107,6320 8557,6170 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id12">
+       <path fill="rgb(53,94,0)" stroke="none" d="M 4071,8201 C 4008,8201 3945,8264 3945,8327 L 3945,8834 C 3945,8897 4008,8961 4071,8961 L 7040,8961 C 7103,8961 7166,8897 7166,8834 L 7166,8327 C 7166,8264 7103,8201 7040,8201 L 4071,8201 Z M 3945,8201 L 3945,8201 Z M 7167,8961 L 7167,8961 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 4071,8201 C 4008,8201 3945,8264 3945,8327 L 3945,8834 C 3945,8897 4008,8961 4071,8961 L 7040,8961 C 7103,8961 7166,8897 7166,8834 L 7166,8327 C 7166,8264 7103,8201 7040,8201 L 4071,8201 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 3945,8201 L 3945,8201 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 7167,8961 L 7167,8961 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="4205" y="8752"><tspan fill="rgb(255,255,255)" stroke="none">setlanguage</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id13">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 7167,8581 L 7668,8581 7668,7070 2861,7070 2861,5558 3259,5558"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 3689,5558 L 3239,5408 3239,5708 3689,5558 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id14">
+       <path fill="rgb(0,255,0)" stroke="none" d="M 13344,1782 C 13281,1782 13218,1845 13218,1908 L 13218,2415 C 13218,2478 13281,2542 13344,2542 L 16497,2542 C 16560,2542 16624,2478 16624,2415 L 16624,1908 C 16624,1845 16560,1782 16497,1782 L 13344,1782 Z M 13218,1782 L 13218,1782 Z M 16624,2542 L 16624,2542 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 13344,1782 C 13281,1782 13218,1845 13218,1908 L 13218,2415 C 13218,2478 13281,2542 13344,2542 L 16497,2542 C 16560,2542 16624,2478 16624,2415 L 16624,1908 C 16624,1845 16560,1782 16497,1782 L 13344,1782 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 13218,1782 L 13218,1782 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 16624,2542 L 16624,2542 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="13558" y="2333"><tspan fill="rgb(0,0,0)" stroke="none">eventDetails</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id15">
+       <path fill="rgb(255,255,0)" stroke="none" d="M 17613,1730 C 17550,1730 17487,1793 17487,1856 L 17487,2363 C 17487,2426 17550,2490 17613,2490 L 20766,2490 C 20829,2490 20893,2426 20893,2363 L 20893,1856 C 20893,1793 20829,1730 20766,1730 L 17613,1730 Z M 17487,1730 L 17487,1730 Z M 20893,2490 L 20893,2490 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 17613,1730 C 17550,1730 17487,1793 17487,1856 L 17487,2363 C 17487,2426 17550,2490 17613,2490 L 20766,2490 C 20829,2490 20893,2426 20893,2363 L 20893,1856 C 20893,1793 20829,1730 20766,1730 L 17613,1730 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 17487,1730 L 17487,1730 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 20893,2490 L 20893,2490 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="17954" y="2281"><tspan fill="rgb(0,0,0)" stroke="none">eventOrder</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id16">
+       <path fill="rgb(0,255,0)" stroke="none" d="M 39266,9253 C 39203,9253 39140,9316 39140,9379 L 39140,9886 C 39140,9949 39203,10013 39266,10013 L 42419,10013 C 42482,10013 42546,9949 42546,9886 L 42546,9379 C 42546,9316 42482,9253 42419,9253 L 39266,9253 Z M 39140,9253 L 39140,9253 Z M 42546,10013 L 42546,10013 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 39266,9253 C 39203,9253 39140,9316 39140,9379 L 39140,9886 C 39140,9949 39203,10013 39266,10013 L 42419,10013 C 42482,10013 42546,9949 42546,9886 L 42546,9379 C 42546,9316 42482,9253 42419,9253 L 39266,9253 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 39140,9253 L 39140,9253 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 42546,10013 L 42546,10013 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="39617" y="9804"><tspan fill="rgb(0,0,0)" stroke="none">placeOrder</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id17">
+       <path fill="rgb(53,94,0)" stroke="none" d="M 9505,9578 C 9442,9578 9379,9641 9379,9704 L 9379,10211 C 9379,10274 9442,10338 9505,10338 L 11532,10338 C 11595,10338 11659,10274 11659,10211 L 11659,9704 C 11659,9641 11595,9578 11532,9578 L 9505,9578 Z M 9379,9578 L 9379,9578 Z M 11659,10338 L 11659,10338 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 9505,9578 C 9442,9578 9379,9641 9379,9704 L 9379,10211 C 9379,10274 9442,10338 9505,10338 L 11532,10338 C 11595,10338 11659,10274 11659,10211 L 11659,9704 C 11659,9641 11595,9578 11532,9578 L 9505,9578 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 9379,9578 L 9379,9578 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 11659,10338 L 11659,10338 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="9776" y="10129"><tspan fill="rgb(255,255,255)" stroke="none">mycart</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id18">
+       <path fill="rgb(255,255,0)" stroke="none" d="M 19133,9326 C 19070,9326 19007,9389 19007,9452 L 19007,9959 C 19007,10022 19070,10086 19133,10086 L 22286,10086 C 22349,10086 22413,10022 22413,9959 L 22413,9452 C 22413,9389 22349,9326 22286,9326 L 19133,9326 Z M 19007,9326 L 19007,9326 Z M 22413,10086 L 22413,10086 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 19133,9326 C 19070,9326 19007,9389 19007,9452 L 19007,9959 C 19007,10022 19070,10086 19133,10086 L 22286,10086 C 22349,10086 22413,10022 22413,9959 L 22413,9452 C 22413,9389 22349,9326 22286,9326 L 19133,9326 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 19007,9326 L 19007,9326 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 22413,10086 L 22413,10086 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="19484" y="9877"><tspan fill="rgb(0,0,0)" stroke="none">addcoupon</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id19">
+       <path fill="rgb(255,255,0)" stroke="none" d="M 18950,7990 C 18887,7990 18824,8053 18824,8116 L 18824,8623 C 18824,8686 18887,8750 18950,8750 L 22103,8750 C 22166,8750 22230,8686 22230,8623 L 22230,8116 C 22230,8053 22166,7990 22103,7990 L 18950,7990 Z M 18824,7990 L 18824,7990 Z M 22230,8750 L 22230,8750 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 18950,7990 C 18887,7990 18824,8053 18824,8116 L 18824,8623 C 18824,8686 18887,8750 18950,8750 L 22103,8750 C 22166,8750 22230,8686 22230,8623 L 22230,8116 C 22230,8053 22166,7990 22103,7990 L 18950,7990 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 18824,7990 L 18824,7990 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 22230,8750 L 22230,8750 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="19219" y="8541"><tspan fill="rgb(0,0,0)" stroke="none">removeItem</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id20">
+       <path fill="rgb(0,255,0)" stroke="none" d="M 13449,9563 C 13386,9563 13323,9626 13323,9689 L 13323,10196 C 13323,10259 13386,10323 13449,10323 L 16602,10323 C 16665,10323 16729,10259 16729,10196 L 16729,9689 C 16729,9626 16665,9563 16602,9563 L 13449,9563 Z M 13323,9563 L 13323,9563 Z M 16729,10323 L 16729,10323 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 13449,9563 C 13386,9563 13323,9626 13323,9689 L 13323,10196 C 13323,10259 13386,10323 13449,10323 L 16602,10323 C 16665,10323 16729,10259 16729,10196 L 16729,9689 C 16729,9626 16665,9563 16602,9563 L 13449,9563 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 13323,9563 L 13323,9563 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 16729,10323 L 16729,10323 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="14611" y="10114"><tspan fill="rgb(0,0,0)" stroke="none">cart</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id21">
+       <path fill="rgb(255,255,0)" stroke="none" d="M 12968,3724 C 12905,3724 12842,3787 12842,3850 L 12842,4357 C 12842,4420 12905,4484 12968,4484 L 16121,4484 C 16184,4484 16248,4420 16248,4357 L 16248,3850 C 16248,3787 16184,3724 16121,3724 L 12968,3724 Z M 12842,3724 L 12842,3724 Z M 16248,4484 L 16248,4484 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 12968,3724 C 12905,3724 12842,3787 12842,3850 L 12842,4357 C 12842,4420 12905,4484 12968,4484 L 16121,4484 C 16184,4484 16248,4420 16248,4357 L 16248,3850 C 16248,3787 16184,3724 16121,3724 L 12968,3724 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 12842,3724 L 12842,3724 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 16248,4484 L 16248,4484 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="13033" y="4275"><tspan fill="rgb(0,0,0)" stroke="none">voucherOrder</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id22">
+       <path fill="rgb(0,255,0)" stroke="none" d="M 27129,7269 C 27066,7269 27003,7332 27003,7395 L 27003,7902 C 27003,7965 27066,8029 27129,8029 L 30282,8029 C 30345,8029 30409,7965 30409,7902 L 30409,7395 C 30409,7332 30345,7269 30282,7269 L 27129,7269 Z M 27003,7269 L 27003,7269 Z M 30409,8029 L 30409,8029 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 27129,7269 C 27066,7269 27003,7332 27003,7395 L 27003,7902 C 27003,7965 27066,8029 27129,8029 L 30282,8029 C 30345,8029 30409,7965 30409,7902 L 30409,7395 C 30409,7332 30345,7269 30282,7269 L 27129,7269 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 27003,7269 L 27003,7269 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 30409,8029 L 30409,8029 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="27711" y="7820"><tspan fill="rgb(0,0,0)" stroke="none">checkout</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id23">
+       <path fill="rgb(0,255,0)" stroke="none" d="M 18828,10965 C 18765,10965 18702,11028 18702,11091 L 18702,11598 C 18702,11661 18765,11725 18828,11725 L 21981,11725 C 22044,11725 22108,11661 22108,11598 L 22108,11091 C 22108,11028 22044,10965 21981,10965 L 18828,10965 Z M 18702,10965 L 18702,10965 Z M 22108,11725 L 22108,11725 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 18828,10965 C 18765,10965 18702,11028 18702,11091 L 18702,11598 C 18702,11661 18765,11725 18828,11725 L 21981,11725 C 22044,11725 22108,11661 22108,11598 L 22108,11091 C 22108,11028 22044,10965 21981,10965 L 18828,10965 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 18702,10965 L 18702,10965 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 22108,11725 L 22108,11725 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="19222" y="11516"><tspan fill="rgb(0,0,0)" stroke="none">orderLogin</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id24">
+       <path fill="rgb(255,255,0)" stroke="none" d="M 24093,11109 C 24030,11109 23967,11172 23967,11235 L 23967,11742 C 23967,11805 24030,11869 24093,11869 L 28967,11869 C 29030,11869 29094,11805 29094,11742 L 29094,11235 C 29094,11172 29030,11109 28967,11109 L 24093,11109 Z M 23967,11109 L 23967,11109 Z M 29094,11869 L 29094,11869 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 24093,11109 C 24030,11109 23967,11172 23967,11235 L 23967,11742 C 23967,11805 24030,11869 24093,11869 L 28967,11869 C 29030,11869 29094,11805 29094,11742 L 29094,11235 C 29094,11172 29030,11109 28967,11109 L 24093,11109 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 23967,11109 L 23967,11109 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 29094,11869 L 29094,11869 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="24270" y="11660"><tspan fill="rgb(0,0,0)" stroke="none">customerLoginOrder</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id25">
+       <path fill="rgb(255,255,0)" stroke="none" d="M 23467,12392 C 23404,12392 23341,12455 23341,12518 L 23341,13025 C 23341,13088 23404,13152 23467,13152 L 29403,13152 C 29466,13152 29529,13088 29529,13025 L 29529,12518 C 29529,12455 29466,12392 29403,12392 L 23467,12392 Z M 23341,12392 L 23341,12392 Z M 29530,13152 L 29530,13152 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 23467,12392 C 23404,12392 23341,12455 23341,12518 L 23341,13025 C 23341,13088 23404,13152 23467,13152 L 29403,13152 C 29466,13152 29529,13088 29529,13025 L 29529,12518 C 29529,12455 29466,12392 29403,12392 L 23467,12392 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 23341,12392 L 23341,12392 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 29530,13152 L 29530,13152 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="23454" y="12943"><tspan fill="rgb(0,0,0)" stroke="none">customerRegistrationOrder</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id26">
+       <path fill="rgb(255,255,0)" stroke="none" d="M 23455,13544 C 23392,13544 23329,13607 23329,13670 L 23329,14177 C 23329,14240 23392,14304 23455,14304 L 29054,14304 C 29117,14304 29180,14240 29180,14177 L 29180,13670 C 29180,13607 29117,13544 29054,13544 L 23455,13544 Z M 23329,13544 L 23329,13544 Z M 29181,14304 L 29181,14304 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 23455,13544 C 23392,13544 23329,13607 23329,13670 L 23329,14177 C 23329,14240 23392,14304 23455,14304 L 29054,14304 C 29117,14304 29180,14240 29180,14177 L 29180,13670 C 29180,13607 29117,13544 29054,13544 L 23455,13544 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 23329,13544 L 23329,13544 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 29181,14304 L 29181,14304 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="23950" y="14095"><tspan fill="rgb(0,0,0)" stroke="none">customerResetOrder</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id27">
+       <path fill="rgb(0,255,0)" stroke="none" d="M 31753,7438 C 31690,7438 31627,7501 31627,7564 L 31627,8071 C 31627,8134 31690,8198 31753,8198 L 36774,8198 C 36837,8198 36901,8134 36901,8071 L 36901,7564 C 36901,7501 36837,7438 36774,7438 L 31753,7438 Z M 31627,7438 L 31627,7438 Z M 36901,8198 L 36901,8198 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 31753,7438 C 31690,7438 31627,7501 31627,7564 L 31627,8071 C 31627,8134 31690,8198 31753,8198 L 36774,8198 C 36837,8198 36901,8134 36901,8071 L 36901,7564 C 36901,7501 36837,7438 36774,7438 L 31753,7438 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 31627,7438 L 31627,7438 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 36901,8198 L 36901,8198 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="31734" y="7989"><tspan fill="rgb(0,0,0)" stroke="none">changeDeliveyAddress</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id28">
+       <path fill="rgb(0,255,0)" stroke="none" d="M 31688,6143 C 31625,6143 31562,6206 31562,6269 L 31562,6776 C 31562,6839 31625,6903 31688,6903 L 37136,6903 C 37199,6903 37263,6839 37263,6776 L 37263,6269 C 37263,6206 37199,6143 37136,6143 L 31688,6143 Z M 31562,6143 L 31562,6143 Z M 37263,6903 L 37263,6903 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 31688,6143 C 31625,6143 31562,6206 31562,6269 L 31562,6776 C 31562,6839 31625,6903 31688,6903 L 37136,6903 C 37199,6903 37263,6839 37263,6776 L 37263,6269 C 37263,6206 37199,6143 37136,6143 L 31688,6143 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 31562,6143 L 31562,6143 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 37263,6903 L 37263,6903 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="31906" y="6694"><tspan fill="rgb(0,0,0)" stroke="none">changeInvoiceAddress</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id29">
+       <path fill="rgb(255,51,51)" stroke="none" d="M 1828,13957 C 1765,13957 1702,14020 1702,14083 L 1702,14590 C 1702,14653 1765,14717 1828,14717 L 4981,14717 C 5044,14717 5108,14653 5108,14590 L 5108,14083 C 5108,14020 5044,13957 4981,13957 L 1828,13957 Z M 1702,13957 L 1702,13957 Z M 5108,14717 L 5108,14717 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 1828,13957 C 1765,13957 1702,14020 1702,14083 L 1702,14590 C 1702,14653 1765,14717 1828,14717 L 4981,14717 C 5044,14717 5108,14653 5108,14590 L 5108,14083 C 5108,14020 5044,13957 4981,13957 L 1828,13957 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 1702,13957 L 1702,13957 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 5108,14717 L 5108,14717 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="2550" y="14508"><tspan fill="rgb(0,0,0)" stroke="none">compile</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id30">
+       <path fill="rgb(35,35,220)" stroke="none" d="M 1426,11656 C 1363,11656 1300,11719 1300,11782 L 1300,12289 C 1300,12352 1363,12416 1426,12416 L 6400,12416 C 6463,12416 6527,12352 6527,12289 L 6527,11782 C 6527,11719 6463,11656 6400,11656 L 1426,11656 Z M 1300,11656 L 1300,11656 Z M 6527,12416 L 6527,12416 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 1426,11656 C 1363,11656 1300,11719 1300,11782 L 1300,12289 C 1300,12352 1363,12416 1426,12416 L 6400,12416 C 6463,12416 6527,12352 6527,12289 L 6527,11782 C 6527,11719 6463,11656 6400,11656 L 1426,11656 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 1300,11656 L 1300,11656 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 6527,12416 L 6527,12416 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="1636" y="12207"><tspan fill="rgb(255,255,255)" stroke="none">customerResetLogin</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id31">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 10941,2240 L 12080,2240 12080,2162 12789,2162"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 13219,2162 L 12769,2012 12769,2312 13219,2162 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id32">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 16624,2162 L 17056,2162 17056,2110 17058,2110"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 17488,2110 L 17032,1979 17045,2279 17488,2110 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id33">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 20893,2110 L 21394,2110 21394,6027 15026,6027 15026,9134"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 15026,9564 L 15176,9114 14876,9114 15026,9564 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id34">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 10861,4126 L 11852,4126 11852,4104 12413,4104"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 12843,4104 L 12393,3954 12393,4254 12843,4104 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id35">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 16248,4104 L 16749,4104 16749,6037 15026,6037 15026,9134"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 15026,9564 L 15176,9114 14876,9114 15026,9564 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id36">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 16729,9943 L 17777,9943 17777,8370 18395,8370"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 18825,8370 L 18375,8220 18375,8520 18825,8370 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id37">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 22230,8370 L 22731,8370 22731,7489 15026,7489 15026,9134"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 15026,9564 L 15176,9114 14876,9114 15026,9564 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id38">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 16729,9943 L 17868,9943 17868,9706 18578,9706"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 19008,9706 L 18558,9556 18558,9856 19008,9706 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id39">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 22413,9706 L 22914,9706 22914,7493 15026,7493 15026,9134"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 15026,9564 L 15176,9114 14876,9114 15026,9564 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id40">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 16729,9943 L 17716,9943 17716,11345 18273,11345"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 18703,11345 L 18253,11195 18253,11495 18703,11345 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id41">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 22108,11345 L 23038,11345 23038,11489 23537,11489"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 23967,11489 L 23517,11339 23517,11639 23967,11489 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id42">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 22108,11345 L 22725,11345 22725,12772 22911,12772"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 23341,12772 L 22891,12622 22891,12922 23341,12772 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id43">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 22108,11345 L 22719,11345 22719,13924 22900,13924"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 23330,13924 L 22880,13774 22880,14074 23330,13924 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id44">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29093,11489 L 30000,11489 30000,9699 25957,9699 25957,7649 26574,7649"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 27004,7649 L 26554,7499 26554,7799 27004,7649 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id45">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29529,12772 L 30031,12772 30031,9699 26009,9699 26009,7649 26574,7649"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 27004,7649 L 26554,7499 26554,7799 27004,7649 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id46">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29181,13924 L 30000,13924 30000,9699 25983,9699 25983,7649 26574,7649"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 27004,7649 L 26554,7499 26554,7799 27004,7649 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id47">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 30409,7649 L 30986,7649 30986,6523 31132,6523"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 31562,6523 L 31112,6373 31112,6673 31562,6523 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id48">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 30409,7649 L 31018,7649 31018,7818 31198,7818"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 31628,7818 L 31178,7668 31178,7968 31628,7818 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id49">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 37262,6523 L 37764,6523 37764,5642 34412,5642 34412,5714"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 34412,6144 L 34562,5694 34262,5694 34412,6144 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id50">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 36901,7818 L 37402,7818 37402,8699 34264,8699 34264,8628"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 34264,8198 L 34114,8648 34414,8648 34264,8198 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id51">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 37262,6523 L 38086,6523 38086,5330 26350,5330 26350,7649 26574,7649"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 27004,7649 L 26554,7499 26554,7799 27004,7649 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id52">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 36901,7818 L 38112,7818 38112,5330 26350,5330 26350,7649 26574,7649"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 27004,7649 L 26554,7499 26554,7799 27004,7649 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id53">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 30409,7649 L 31065,7649 31065,9633 38711,9633"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 39141,9633 L 38691,9483 38691,9783 39141,9633 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id54">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 42546,9633 L 43047,9633 43047,349 5074,349 5074,957"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 5074,1387 L 5224,937 4924,937 5074,1387 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id55">
+       <path fill="none" stroke="rgb(0,128,0)" d="M 11659,9958 L 12491,9958 12491,9943 12894,9943"/>
+       <path fill="rgb(0,128,0)" stroke="none" d="M 13324,9943 L 12874,9793 12874,10093 13324,9943 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id56">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 6526,12036 L 7028,12036 7028,10807 2525,10807 2525,2061 3970,2061"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 4400,2061 L 3950,1911 3950,2211 4400,2061 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id57">
+       <path fill="none" stroke="rgb(0,128,0)" d="M 5074,2734 L 5074,3101 9721,3101 9721,3317"/>
+       <path fill="rgb(0,128,0)" stroke="none" d="M 9721,3747 L 9871,3297 9571,3297 9721,3747 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id58">
+       <path fill="none" stroke="rgb(0,128,0)" d="M 5074,2734 L 5074,4847 9696,4847 9696,5361"/>
+       <path fill="rgb(0,128,0)" stroke="none" d="M 9696,5791 L 9846,5341 9546,5341 9696,5791 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id59">
+       <path fill="none" stroke="rgb(0,128,0)" d="M 5074,2734 L 5074,3956 4828,3956 4828,4749"/>
+       <path fill="rgb(0,128,0)" stroke="none" d="M 4828,5179 L 4978,4729 4678,4729 4828,5179 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id60">
+       <path fill="rgb(76,76,76)" stroke="none" d="M 2649,19058 C 2586,19058 2523,19121 2523,19184 L 2523,19691 C 2523,19754 2586,19818 2649,19818 L 6247,19818 C 6310,19818 6374,19754 6374,19691 L 6374,19184 C 6374,19121 6310,19058 6247,19058 L 2649,19058 Z M 2523,19058 L 2523,19058 Z M 6374,19818 L 6374,19818 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 2649,19058 C 2586,19058 2523,19121 2523,19184 L 2523,19691 C 2523,19754 2586,19818 2649,19818 L 6247,19818 C 6310,19818 6374,19754 6374,19691 L 6374,19184 C 6374,19121 6310,19058 6247,19058 L 2649,19058 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 2523,19058 L 2523,19058 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 6374,19818 L 6374,19818 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="2901" y="19609"><tspan fill="rgb(255,255,255)" stroke="none">customerData</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id61">
+       <path fill="rgb(76,76,76)" stroke="none" d="M 14500,17974 C 14437,17974 14374,18037 14374,18100 L 14374,18607 C 14374,18670 14437,18734 14500,18734 L 19550,18734 C 19613,18734 19677,18670 19677,18607 L 19677,18100 C 19677,18037 19613,17974 19550,17974 L 14500,17974 Z M 14374,17974 L 14374,17974 Z M 19677,18734 L 19677,18734 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 14500,17974 C 14437,17974 14374,18037 14374,18100 L 14374,18607 C 14374,18670 14437,18734 14500,18734 L 19550,18734 C 19613,18734 19677,18670 19677,18607 L 19677,18100 C 19677,18037 19613,17974 19550,17974 L 14500,17974 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 14374,17974 L 14374,17974 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 19677,18734 L 19677,18734 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="14830" y="18525"><tspan fill="rgb(255,255,255)" stroke="none">customerAddresses</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id62">
+       <path fill="rgb(76,76,76)" stroke="none" d="M 20464,17974 C 20401,17974 20338,18037 20338,18100 L 20338,18607 C 20338,18670 20401,18734 20464,18734 L 25514,18734 C 25577,18734 25641,18670 25641,18607 L 25641,18100 C 25641,18037 25577,17974 25514,17974 L 20464,17974 Z M 20338,17974 L 20338,17974 Z M 25641,18734 L 25641,18734 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 20464,17974 C 20401,17974 20338,18037 20338,18100 L 20338,18607 C 20338,18670 20401,18734 20464,18734 L 25514,18734 C 25577,18734 25641,18670 25641,18607 L 25641,18100 C 25641,18037 25577,17974 25514,17974 L 20464,17974 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 20338,17974 L 20338,17974 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 25641,18734 L 25641,18734 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="20629" y="18525"><tspan fill="rgb(255,255,255)" stroke="none">customerAddressEdit</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id63">
+       <path fill="rgb(76,76,76)" stroke="none" d="M 14650,21586 C 14587,21586 14524,21649 14524,21712 L 14524,22219 C 14524,22282 14587,22346 14650,22346 L 19700,22346 C 19763,22346 19827,22282 19827,22219 L 19827,21712 C 19827,21649 19763,21586 19700,21586 L 14650,21586 Z M 14524,21586 L 14524,21586 Z M 19827,22346 L 19827,22346 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 14650,21586 C 14587,21586 14524,21649 14524,21712 L 14524,22219 C 14524,22282 14587,22346 14650,22346 L 19700,22346 C 19763,22346 19827,22282 19827,22219 L 19827,21712 C 19827,21649 19763,21586 19700,21586 L 14650,21586 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 14524,21586 L 14524,21586 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 19827,22346 L 19827,22346 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="16210" y="22137"><tspan fill="rgb(255,255,255)" stroke="none">orderList</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id64">
+       <path fill="rgb(76,76,76)" stroke="none" d="M 21097,21587 C 21034,21587 20971,21650 20971,21713 L 20971,22220 C 20971,22283 21034,22347 21097,22347 L 26147,22347 C 26210,22347 26274,22283 26274,22220 L 26274,21713 C 26274,21650 26210,21587 26147,21587 L 21097,21587 Z M 20971,21587 L 20971,21587 Z M 26274,22347 L 26274,22347 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 21097,21587 C 21034,21587 20971,21650 20971,21713 L 20971,22220 C 20971,22283 21034,22347 21097,22347 L 26147,22347 C 26210,22347 26274,22283 26274,22220 L 26274,21713 C 26274,21650 26210,21587 26147,21587 L 21097,21587 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 20971,21587 L 20971,21587 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 26274,22347 L 26274,22347 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="22409" y="22138"><tspan fill="rgb(255,255,255)" stroke="none">orderDetail</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id65">
+       <path fill="rgb(76,76,76)" stroke="none" d="M 29220,21586 C 29157,21586 29094,21649 29094,21712 L 29094,22219 C 29094,22282 29157,22346 29220,22346 L 34270,22346 C 34333,22346 34397,22282 34397,22219 L 34397,21712 C 34397,21649 34333,21586 34270,21586 L 29220,21586 Z M 29094,21586 L 29094,21586 Z M 34397,22346 L 34397,22346 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 29220,21586 C 29157,21586 29094,21649 29094,21712 L 29094,22219 C 29094,22282 29157,22346 29220,22346 L 34270,22346 C 34333,22346 34397,22282 34397,22219 L 34397,21712 C 34397,21649 34333,21586 34270,21586 L 29220,21586 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 29094,21586 L 29094,21586 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 34397,22346 L 34397,22346 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="30441" y="22137"><tspan fill="rgb(255,255,255)" stroke="none">payVoucher</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id66">
+       <path fill="rgb(76,76,76)" stroke="none" d="M 4737,23476 C 4674,23476 4611,23539 4611,23602 L 4611,24109 C 4611,24172 4674,24236 4737,24236 L 9787,24236 C 9850,24236 9914,24172 9914,24109 L 9914,23602 C 9914,23539 9850,23476 9787,23476 L 4737,23476 Z M 4611,23476 L 4611,23476 Z M 9914,24236 L 9914,24236 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 4737,23476 C 4674,23476 4611,23539 4611,23602 L 4611,24109 C 4611,24172 4674,24236 4737,24236 L 9787,24236 C 9850,24236 9914,24172 9914,24109 L 9914,23602 C 9914,23539 9850,23476 9787,23476 L 4737,23476 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 4611,23476 L 4611,23476 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 9914,24236 L 9914,24236 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="5635" y="24027"><tspan fill="rgb(255,255,255)" stroke="none">customerLogin</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id67">
+       <path fill="rgb(76,76,76)" stroke="none" d="M 10997,25263 C 10934,25263 10871,25326 10871,25389 L 10871,25896 C 10871,25959 10934,26023 10997,26023 L 16047,26023 C 16110,26023 16174,25959 16174,25896 L 16174,25389 C 16174,25326 16110,25263 16047,25263 L 10997,25263 Z M 10871,25263 L 10871,25263 Z M 16174,26023 L 16174,26023 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 10997,25263 C 10934,25263 10871,25326 10871,25389 L 10871,25896 C 10871,25959 10934,26023 10997,26023 L 16047,26023 C 16110,26023 16174,25959 16174,25896 L 16174,25389 C 16174,25326 16110,25263 16047,25263 L 10997,25263 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 10871,25263 L 10871,25263 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 16174,26023 L 16174,26023 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="11850" y="25814"><tspan fill="rgb(255,255,255)" stroke="none">customerReset</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id68">
+       <path fill="none" stroke="rgb(0,128,0)" d="M 4448,19818 L 4448,21647 4110,21647 4110,23856 4181,23856"/>
+       <path fill="rgb(0,128,0)" stroke="none" d="M 4611,23856 L 4161,23706 4161,24006 4611,23856 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id69">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 6373,19438 L 10374,19438 10374,18354 13944,18354"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 14374,18354 L 13924,18204 13924,18504 14374,18354 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id70">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 9913,23856 L 10415,23856 10415,25601 1565,25601 1565,19438 2093,19438"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 2523,19438 L 2073,19288 2073,19588 2523,19438 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id71">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 9913,23856 L 13522,23856 13522,24834"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 13522,25264 L 13672,24814 13372,24814 13522,25264 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id72">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 19676,18354 L 19908,18354"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 20338,18354 L 19888,18204 19888,18504 20338,18354 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id73">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 6373,19438 L 10449,19438 10449,21966 14094,21966"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 14524,21966 L 14074,21816 14074,22116 14524,21966 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id74">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 19826,21966 L 20399,21966 20399,21967 20541,21967"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 20971,21967 L 20521,21817 20521,22117 20971,21967 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id75">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 26273,21967 L 27684,21967 27684,21966 28664,21966"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 29094,21966 L 28644,21816 28644,22116 29094,21966 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id76">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34396,21966 L 34898,21966 34898,23524 23622,23524 23622,22777"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 23622,22347 L 23472,22797 23772,22797 23622,22347 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id77">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 25640,18354 L 26142,18354 26142,17004 17025,17004 17025,17545"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 17025,17975 L 17175,17525 16875,17525 17025,17975 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id78">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 6373,19438 L 7877,19438 7877,9958 8950,9958"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 9380,9958 L 8930,9808 8930,10108 9380,9958 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id79">
+       <path fill="rgb(76,76,76)" stroke="none" d="M 28859,19947 C 28796,19947 28733,20010 28733,20073 L 28733,20580 C 28733,20643 28796,20707 28859,20707 L 33909,20707 C 33972,20707 34036,20643 34036,20580 L 34036,20073 C 34036,20010 33972,19947 33909,19947 L 28859,19947 Z M 28733,19947 L 28733,19947 Z M 34036,20707 L 34036,20707 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 28859,19947 C 28796,19947 28733,20010 28733,20073 L 28733,20580 C 28733,20643 28796,20707 28859,20707 L 33909,20707 C 33972,20707 34036,20643 34036,20580 L 34036,20073 C 34036,20010 33972,19947 33909,19947 L 28859,19947 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 28733,19947 L 28733,19947 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 34036,20707 L 34036,20707 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="29708" y="20498"><tspan fill="rgb(255,255,255)" stroke="none">orderDownload</tspan></tspan></tspan></text>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id80">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 26273,21967 L 27504,21967 27504,20327 28303,20327"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 28733,20327 L 28283,20177 28283,20477 28733,20327 Z"/>
+      </g>
+     </g>
+     <g class="com.sun.star.drawing.ConnectorShape">
+      <g id="id81">
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34035,20327 L 34088,20327"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34122,20327 L 34175,20327"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34210,20327 L 34263,20327"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34297,20327 L 34350,20327"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34384,20327 L 34437,20327"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34472,20327 L 34525,20327"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34537,20305 L 34537,20252"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34537,20218 L 34537,20165"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34537,20130 L 34537,20077"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34537,20043 L 34537,19990"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34537,19956 L 34537,19903"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34537,19869 L 34537,19815"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34537,19781 L 34537,19728"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34537,19694 L 34537,19641"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34537,19607 L 34537,19553"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34537,19519 L 34537,19466"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34523,19446 L 34470,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34436,19446 L 34383,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34348,19446 L 34295,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34261,19446 L 34208,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34174,19446 L 34121,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 34086,19446 L 34033,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 33999,19446 L 33946,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 33912,19446 L 33859,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 33824,19446 L 33771,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 33737,19446 L 33684,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 33650,19446 L 33597,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 33562,19446 L 33509,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 33475,19446 L 33422,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 33388,19446 L 33335,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 33300,19446 L 33247,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 33213,19446 L 33160,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 33126,19446 L 33073,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 33039,19446 L 32985,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 32951,19446 L 32898,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 32864,19446 L 32811,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 32777,19446 L 32723,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 32689,19446 L 32636,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 32602,19446 L 32549,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 32515,19446 L 32462,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 32427,19446 L 32374,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 32340,19446 L 32287,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 32253,19446 L 32200,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 32165,19446 L 32112,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 32078,19446 L 32025,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 31991,19446 L 31938,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 31903,19446 L 31850,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 31816,19446 L 31763,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 31729,19446 L 31676,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 31641,19446 L 31588,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 31554,19446 L 31501,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 31467,19446 L 31414,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 31379,19446 L 31326,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 31292,19446 L 31239,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 31205,19446 L 31152,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 31118,19446 L 31064,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 31030,19446 L 30977,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 30943,19446 L 30890,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 30856,19446 L 30802,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 30768,19446 L 30715,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 30681,19446 L 30628,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 30594,19446 L 30541,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 30506,19446 L 30453,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 30419,19446 L 30366,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 30332,19446 L 30279,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 30244,19446 L 30191,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 30157,19446 L 30104,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 30070,19446 L 30017,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29982,19446 L 29929,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29895,19446 L 29842,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29808,19446 L 29755,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29720,19446 L 29667,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29633,19446 L 29580,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29546,19446 L 29493,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29458,19446 L 29405,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29371,19446 L 29318,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29284,19446 L 29231,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29197,19446 L 29143,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29109,19446 L 29056,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 29022,19446 L 28969,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 28935,19446 L 28881,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 28847,19446 L 28794,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 28760,19446 L 28707,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 28673,19446 L 28620,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 28585,19446 L 28532,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 28498,19446 L 28445,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 28411,19446 L 28358,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 28323,19446 L 28270,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 28236,19446 L 28183,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 28149,19446 L 28096,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 28061,19446 L 28008,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 27974,19446 L 27921,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 27887,19446 L 27834,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 27799,19446 L 27746,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 27712,19446 L 27659,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 27625,19446 L 27572,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 27537,19446 L 27484,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 27450,19446 L 27397,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 27363,19446 L 27310,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 27276,19446 L 27222,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 27188,19446 L 27135,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 27101,19446 L 27048,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 27014,19446 L 26960,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 26926,19446 L 26873,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 26839,19446 L 26786,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 26752,19446 L 26699,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 26664,19446 L 26611,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 26577,19446 L 26524,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 26490,19446 L 26437,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 26402,19446 L 26349,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 26315,19446 L 26262,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 26228,19446 L 26175,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 26140,19446 L 26087,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 26053,19446 L 26000,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 25966,19446 L 25913,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 25878,19446 L 25825,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 25791,19446 L 25738,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 25704,19446 L 25651,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 25616,19446 L 25563,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 25529,19446 L 25476,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 25442,19446 L 25389,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 25355,19446 L 25301,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 25267,19446 L 25214,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 25180,19446 L 25127,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 25093,19446 L 25039,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 25005,19446 L 24952,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 24918,19446 L 24865,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 24831,19446 L 24778,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 24743,19446 L 24690,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 24656,19446 L 24603,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 24569,19446 L 24516,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 24481,19446 L 24428,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 24394,19446 L 24341,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 24307,19446 L 24254,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 24219,19446 L 24166,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 24132,19446 L 24079,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 24045,19446 L 23992,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23957,19446 L 23904,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23870,19446 L 23817,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23783,19446 L 23730,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23695,19446 L 23642,19446"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,19460 L 23622,19513"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,19547 L 23622,19600"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,19634 L 23622,19688"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,19722 L 23622,19775"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,19809 L 23622,19862"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,19896 L 23622,19950"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,19984 L 23622,20037"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,20071 L 23622,20124"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,20158 L 23622,20211"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,20246 L 23622,20299"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,20333 L 23622,20386"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,20420 L 23622,20473"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,20508 L 23622,20561"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,20595 L 23622,20648"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,20682 L 23622,20735"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,20770 L 23622,20823"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,20857 L 23622,20910"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,20944 L 23622,20997"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,21032 L 23622,21085"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 23622,21119 L 23622,21158"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 23622,21588 L 23772,21138 23472,21138 23622,21588 Z"/>
+      </g>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+</svg>
\ No newline at end of file
diff --git a/doc/web/variables.html b/doc/web/variables.html
new file mode 100644 (file)
index 0000000..559586d
--- /dev/null
@@ -0,0 +1,172 @@
+<html>
+<head>
+<title>Web Template Variable Reference</title>
+</head>
+<body>
+<h1>Web Template Variable Reference</h1>
+
+<p>This chapter contains a reference for all templates and their available variables.</p>
+
+<h2>Global Variables</h2>
+
+<p>The following variables are available to all templates:</p>
+
+/** \page templates Templates
+\section tpl_base Base Variables
+
+There are some variables available for all templates.<p>
+
+\param script.* variables contain URLs for different modes of the web site:<br>
+<table frame="1" border="1">
+<tr><td><tt>script.root</tt></td><td>root URL for the index.php script</td></tr>
+<tr><td><tt>script.this</tt></td><td>the URL of the currently called script mode</td></tr>
+<tr><td><tt>script.index</tt></td><td>URL of the list index</td></tr>
+<tr><td><tt>script.eventDetails</tt></td><td>URL for event detail pages, append the event ID to it to complete it</td></tr>
+<tr><td><tt>script.eventOrder</tt></td><td>URL for ordering tickets for a specific event, arguments are expected as POST or GET parameters</td></tr>
+<tr><td><tt>script.vouchers</tt></td><td>URL for listing vouchers</td></tr>
+<tr><td><tt>script.voucherOrder</tt></td><td>URL for ordering vouchers, arguments are expected as POST or GET parameters</td></tr>
+<tr><td><tt>script.removeItem</tt></td><td>URL for removing tickets/vouchers/items from the cart, arguments are expected as POST or GET parameters</td></tr>
+<tr><td><tt>script.shop</tt></td><td>URL for listing shop items</td></tr>
+<tr><td><tt>script.cart</tt></td><td>URL of the cart, the cart must exist when calling it, otherwise a cookie error will be displayed</td></tr>
+<tr><td><tt>script.mycart</tt></td><td>URL of the cart that transparently creates the cart if it does not exist yet</td></tr>
+<tr><td><tt>script.checkout</tt></td><td>URL to check out the cart</td></tr>
+<tr><td><tt>script.setlanguage</tt></td><td>URL for setting the language cookie, add the language code to it to complete it</td></tr>
+</table><p>
+\param inputnames.* variables contain names for specific form input elements:<br>
+<table frame="1" border="1">
+<tr><td><tt>inputnames.amountTickets</tt></td><td>amount of tickets to be ordered</td></tr>
+<tr><td><tt>inputnames.event</tt></td><td>contains the event ID</td></tr>
+<tr><td><tt>inputnames.mode</tt></td><td>contains the display mode</td></tr>
+<tr><td><tt>inputnames.cartid</tt></td><td>ID of the cart of the current customer, usually the cart cookie is used instead</td></tr>
+</table><p>
+\param cartcookie variable contains the name of the cookie that contains the cart ID.<p>
+\param lang variable is an object of type LanguageManager - it represents translations done for the language the user has chosen.<p>
+
+\param sessionid contains the ID of the current session as it is stored in a cookie and the session table.
+
+\param user.* contains basic data about the web user.
+<table frame="1" border="1">
+<tr><td><tt>user.name</tt></td><td>the (family) name of the user</td></tr>
+<tr><td><tt>user.firstname</tt></td><td>the first name of the user</td></tr>
+<tr><td><tt>user.title</tt></td><td>the title of the user</td></tr>
+<tr><td><tt>user.email</tt></td><td>the e-mail and login name of the user</td></tr>
+</table>
+
+\section tpl_error error.html
+
+This template is used whenever an error occurs during processing.
+
+\param ErrorText the text to be shown for an error
+\param ErrorTrace a full ASCII version of an exception trace. This is only filled if the <tt>$WebShowErrors</tt> option is set to <tt>true</tt> in the config.php file.
+**/
+
+
+<h2>Global Web Layouts</h2>
+
+<h3>layout.html</h3>
+
+<h3>error.html</h3>
+
+
+
+<h2>Web Layouts</h2>
+
+<h3>cart.html</h3>
+
+<p>The cart.html template is used to render the current cart of the customer.</p>
+
+\param cart an object of the web type <a href="../wob/class-WebCart.html">WebCart</a> (PHP: WOWebCart) that represents the entire cart of the user.
+\param shipping and array of web objects of type <a href="../wob/class-Shipping.html">Shipping</a> (PHP: WOShipping) which represent all available shipping types that customers can chose from.
+\param forceshipping a boolean that contains whether customers must chose a shipping type.
+
+\subsection tpl_cartext Cart Extensions
+
+Some of the sub-objects of cart have extended attributes in addition to those generated by Wob:
+
+\param cart.isempty true if the cart is empty
+\param cart.totalsum the complete sum of all prices in the cart
+\param cart.tickets[...].eventprice.*:
+\param *.amountInputField name of the input field of a form that should contain the amount of tickets for ordering, see the example on how to use it
+\param *.categoryIdWeb part of the URL query that represents this category, used for removing tickets from the cart, see the example on how to use it
+
+\section tpl_voucher Voucher Variables
+
+The voucher.html template is used to render the voucher selection form.
+
+\param voucherprices contains an array of valid voucher prices.
+
+<h3>carterror.html</h3>
+
+\section tpl_carterror Cart Error Variables
+
+The carterror.html template is used to when the cart expired or the customers browser lost the cookie.
+
+Just the \ref tpl_base Base Variables
+are available.
+**/
+
+<h3>changeaddress.html</h3>
+
+<h3>checkout.html</h3>
+
+The checkout.html template is used to render the current cart of the customer.
+
+\param cart an object of the web type <a href="../wob/class-WebCart.html">WebCart</a> (PHP: WOWebCart) that represents the entire cart of the user.
+*/
+
+<h3>eventdetails.html</h3>
+
+The eventdetails.html template is used to render a single event and to offer the user to buy tickets for it.
+
+\param event the event being rendered; the event is of web object type <a href="../wob/class-Event.html">Event</a> (PHP: WOEvent)
+*/
+
+<h3>index.html</h3>
+
+The index.html template is used to render the list of events available to customers.
+
+\param events an array of the events available, starting at the current time, ordered by time; the events are of web object type <a href="../wob/class-Event.html">Event</a> (PHP: WOEvent)
+
+
+<h3>login.html</h3>
+
+The login.html template is used to render the customer login and registration page.
+
+\param script.customerLogin the page to call for logging in
+\param script.customerRegistration the page to call for registering a new customer
+\param customer_name the name (mail) of the customer (or an empty string if unknown)
+
+
+<h3>loginerror.html</h3>
+
+       /** \page templates Templates
+       \section tpl_logerr Login Error
+
+       The loginerror.html template is used to render customer login and registering errors.
+
+       \param errorType the type of error: "login" - the login failed (wrong mail or password), "exist" - an account with the same mail already exists, "mismatch" - the new passwords do no match, "create" for unspecified errors during creation of the new account (e.g. missing or invalid parameters)
+       \param backUrl the URL to call back to the login page
+       */
+
+<h3>placeorder.html</h3>
+
+<h3>reseterror.html</h3>
+
+<h3>resetlogin.html</h3>
+
+<h3>tickets.html</h3>
+
+<h3>vouchers.html</h3>
+
+
+
+
+<h2>Mail Layouts</h2>
+
+<h3>ordermail.txt</h3>
+
+<h3>resetlogin.txt</h3>
+
+
+</body>
+</html>
index ababa62..3ba457f 100644 (file)
 #define MAGICSMOKE_MOSEATPLANOBJ2_H
 
 #include "MOSeatPlanAbstract"
+#include <QSize>
 
 class MSIFACE_EXPORT MOSeatPlan:public MOSeatPlanAbstract
 {
        Q_GADGET
        WOBJECT(MOSeatPlan)
        public:
-               void f(){}
+               bool isGraphical()const{return !size().isNull() && size().data().trimmed()!="";}
+               QSize qSize()const{QStringList sz=size().data().trimmed().split(' ');if(sz.size()==2)return QSize(sz[0].toInt(),sz[1].toInt());else return QSize();}
 };
 
 Q_DECLARE_METATYPE(MOSeatPlan)
index 2169454..ed3dbd6 100644 (file)
@@ -8,7 +8,7 @@
           release: 2.11.33 (2-major, 11-minor, 33- patch)
           hint: "-" is ASCII code 0x2d, "." is 0x2e
         -->
-        <CurrentVersion version="2.1 beta" mrv="2.01~{ENV:GITDATE}-{NOWUTC}"/>
+        <CurrentVersion version="2.2" mrv="2.02~{ENV:GITDATE}-{NOWUTC}"/>
         <!-- in the build/meta file this is a template for config, it is copied to the installation -->
         <Settings baseurl="https://www.daszauberschloss.de/shopclient" indexfile="magicsmoke.xml" pollinterval="1800" fulltargetdir="dist-*"/>
         
diff --git a/pack b/pack
index fd67824..ea368b8 160000 (submodule)
--- a/pack
+++ b/pack
@@ -1 +1 @@
-Subproject commit fd67824a15e5e6732291c519c0db523afa92c8c8
+Subproject commit ea368b8d4490835ee46b1043d4b0fce403a18f01
diff --git a/seatplangui/seatplangui.pro b/seatplangui/seatplangui.pro
new file mode 100644 (file)
index 0000000..08df9a4
--- /dev/null
@@ -0,0 +1,17 @@
+TEMPLATE = app
+TARGET = seatplangui
+
+include(../basics.pri)
+include(../iface/iface.pri)
+include(../commonlib/commonlib.pri)
+
+#sources
+SOURCES += spgui.cpp
+HEADERS += spgui.h
+
+#pathes
+INCLUDEPATH += .
+DEPENDPATH += $$INCLUDEPATH
+
+#make sure the correct Qt DLLs are used
+QT += gui widgets
diff --git a/seatplangui/spgui.cpp b/seatplangui/spgui.cpp
new file mode 100644 (file)
index 0000000..c8f5290
--- /dev/null
@@ -0,0 +1,121 @@
+//
+// C++ Implementation: seatplan viewer exe
+//
+// Description: simple executable that can view seat plans
+//
+//
+// Author: Konrad Rosenbaum <konrad@silmor.de>, (C) 2017-18
+//
+// Copyright: See README/COPYING.GPL files that come with this distribution
+//
+//
+
+#include <QApplication>
+#include <QBoxLayout>
+#include <QDebug>
+#include <QDialog>
+#include <QDomDocument>
+#include <QFile>
+#include <QFileDialog>
+#include <QLineEdit>
+#include <QMessageBox>
+#include <QPointer>
+#include <QPushButton>
+#include <QTextBrowser>
+
+#include "seatplanview.h"
+#include "spgui.h"
+
+#if defined(Q_OS_UNIX) || defined(Q_OS_LINUX) || defined(Q_OS_MACOS)
+#define DOPRINTF 1
+#include <stdio.h>
+#else
+#define DOPRINTF 0
+#endif
+
+
+SPGUI::SPGUI()
+{
+    setWindowTitle("Seat Plan Viewer");
+    setSizeGripEnabled(true);
+    
+    QVBoxLayout*vl;
+    QHBoxLayout*hl;
+    setLayout(vl=new QVBoxLayout);
+    vl->addLayout(hl=new QHBoxLayout,0);
+    hl->addWidget(fname=new QLineEdit,10);
+    QPushButton*p;
+    hl->addWidget(p=new QPushButton("..."),0);
+    connect(p,SIGNAL(clicked()),this,SLOT(openfile()));
+    hl->addWidget(p=new QPushButton("Reload"),0);
+    connect(p,SIGNAL(clicked()),this,SLOT(reload()));
+    vl->addWidget(view=new MSeatPlanView(MOSeatPlan()),10);
+    view->setRightIsBlock(true);
+}
+
+void SPGUI::openfile()
+{
+    fname->setText(QFileDialog::getOpenFileName(this,"Open SeatPlan"));
+    reload();
+}
+
+void SPGUI::reload()
+{
+    //load file
+    QFile fd(fname->text());
+    QDomDocument doc;
+    if(fd.open(QIODevice::ReadOnly)){
+        qDebug()<<"Loading XML...";
+        doc.setContent(&fd);
+        fd.close();
+    }else
+        QMessageBox::warning(this,"Warning","Unable to open file.");
+    
+    //interpret
+    view->resetPlan(MOSeatPlan::fromXml(doc.documentElement()));
+}
+
+class DGUI:public QDialog
+{
+    static QPointer<DGUI>instance;
+    static void myMessageOutput(QtMsgType, const QMessageLogContext &, const QString &msg)
+    {
+#if DOPRINTF
+        fprintf(stderr,"%s\n",msg.toUtf8().data());
+#endif
+        if(instance.isNull())return;
+        instance->view->append(msg);
+        instance->view->moveCursor(QTextCursor::End);
+    }
+    QTextBrowser *view;
+public:
+    DGUI(QDialog*parent):QDialog(parent)
+    {
+        setWindowTitle("Debug Output");
+        setSizeGripEnabled(true);
+        instance=this;
+        view=new QTextBrowser;
+        QHBoxLayout*hl;
+        QVBoxLayout*vl;
+        setLayout(vl=new QVBoxLayout);
+        vl->addWidget(view,1);
+        vl->addLayout(hl=new QHBoxLayout,0);
+        hl->addStretch(1);
+        QPushButton*p;
+        hl->addWidget(p=new QPushButton("Clear"),0);
+        connect(p,&QPushButton::clicked,this,[=](){this->view->clear();});
+        setAttribute(Qt::WA_DeleteOnClose);
+        qInstallMessageHandler(myMessageOutput);
+    }
+};
+QPointer<DGUI>DGUI::instance;
+
+int main(int ac,char**av)
+{
+    QApplication app(ac,av);
+    SPGUI g;
+    g.show();
+    DGUI d(&g);
+    d.show();
+    return app.exec();
+}
diff --git a/seatplangui/spgui.h b/seatplangui/spgui.h
new file mode 100644 (file)
index 0000000..a0d4aec
--- /dev/null
@@ -0,0 +1,39 @@
+//
+// C++ Interface: seatplan viewer exe
+//
+// Description: simple executable that can view seat plans
+//
+//
+// Author: Konrad Rosenbaum <konrad@silmor.de>, (C) 2017-18
+//
+// Copyright: See README/COPYING.GPL files that come with this distribution
+//
+//
+
+#ifndef SEATPLANGUI_H
+#define SEATPLANGUI_H
+
+#include <QDialog>
+
+class MSeatPlanView;
+class QLineEdit;
+
+///GUI main window
+class SPGUI:public QDialog
+{
+    Q_OBJECT
+public:
+    SPGUI();
+public slots:
+    ///open new seat plan file
+    void openfile();
+    ///reload and redisplay current file
+    void reload();
+private:
+    ///file name of seat plan file
+    QLineEdit*fname;
+    ///viewer
+    MSeatPlanView*view;
+};
+
+#endif
index f26f312..c121466 100644 (file)
@@ -4,7 +4,7 @@
 // Description: 
 //
 //
-// Author: Konrad Rosenbaum <konrad@silmor.de>, (C) 2007-2013
+// Author: Konrad Rosenbaum <konrad@silmor.de>, (C) 2007-2017
 //
 // Copyright: See README/COPYING.GPL files that come with this distribution
 //
@@ -447,7 +447,7 @@ void MEventEditor::selectSeatPlan()
        qDebug()<<"plans:"<<rlst.size();
        for(int i=0;i<rlst.size();i++){
                qDebug()<<"plan"<<rlst[i].name().data();
-               const QModelIndex idx=model.index(0,i);
+               const QModelIndex idx=model.index(i,0);
                model.setData(idx,rlst[i].name().data());
                model.setData(idx,rlst[i].seatplanid().data(),Qt::UserRole);
        }
index 688186e..a89af1e 100644 (file)
@@ -129,6 +129,7 @@ MPCDEdit::MPCDEdit(QWidget*par,const MOPriceCategory&c)
        vl->addLayout(fl=new QFormLayout,1);
        fl->addRow(tr("Category Name:"),name=new QLineEdit(cat.name()));
        fl->addRow(tr("Category Abbreviation:"),abbr=new QLineEdit(cat.abbreviation()));
+    abbr->setMaxLength(10);//limited in DB
        fl->addRow(tr("Formula:"),form=new QLineEdit(cat.formula()));
        fl->addRow(tr("Flags:"),hl=new QHBoxLayout);
        hl->addWidget(flags=new QLabel(cat.flags()),1);
diff --git a/taurus b/taurus
index 57aebfd..12f3c87 160000 (submodule)
--- a/taurus
+++ b/taurus
@@ -1 +1 @@
-Subproject commit 57aebfda0d3ec0fc2d614c8c2d4ccb5263ef3028
+Subproject commit 12f3c8701cfc7a78be3f2ee2df46e7a11df3c00e
index fa57f52..8a292cf 100644 (file)
@@ -4,6 +4,6 @@ RUN apt-get update
 RUN apt-get install -y wget git
 RUN useradd -d /jenkins -m -s /bin/bash -u 12001 -U jenkins
 COPY start.sh /jenkins
-RUN apt-get install -y libfontconfig1 libfreetype6 libx11-6 libxext6 libxfixes3 libxi6 libsm6 libice6 libdbus-1-3 libxrender1 libxcb1 libx11-xcb1 libxcb-glx0 libglib2.0-0 libstdc++6 zlib1g-dev libgcc1 libpcre3 libegl1-mesa libgl1-mesa-glx libgl1-mesa-dev libuuid1 libxau6 libxdmcp6 libexpat1 libpng12-0 libgbm1 libdrm2 libglapi-mesa libffi6 libudev-dev g++ gcc make doxygen qtchooser chrpath patchelf zip autoconf automake gettext
+RUN apt-get install -y libfontconfig1 libfreetype6 libx11-6 libxext6 libxfixes3 libxi6 libsm6 libice6 libdbus-1-3 libxrender1 libxcb1 libx11-xcb1 libxcb-glx0 libglib2.0-0 libstdc++6 zlib1g-dev libgcc1 libpcre3 libegl1-mesa libgl1-mesa-glx libgl1-mesa-dev libuuid1 libxau6 libxdmcp6 libexpat1 libpng12-0 libgbm1 libdrm2 libglapi-mesa libffi6 libudev-dev g++ gcc make doxygen qtchooser chrpath patchelf zip autoconf automake gettext graphviz python-sphinx
 RUN echo deb http://ftp.de.debian.org/debian jessie-backports main contrib >>/etc/apt/sources.list ; apt-get update ; apt-get install -y -t jessie-backports openjdk-8-jre-headless
 CMD /bin/bash
diff --git a/tzone b/tzone
index d944922..6528fd2 160000 (submodule)
--- a/tzone
+++ b/tzone
@@ -1 +1 @@
-Subproject commit d94492246f5b98e0936f5a184e9533496d240a63
+Subproject commit 6528fd26d09b68b51e8d2edba8e71192a71244da
index 89a1d91..df55097 100644 (file)
@@ -8,16 +8,31 @@
   -->
 <Wolf>
        <!-- NON-Wire Helper Classes for seat plans, see event.wolf for wire classes -->
+        <Class name="SeatPlanSeat">
+                <Doc>This is a helper for parsing seat plans: it defines a single seat</Doc>
+                <Property name="id" type="int">the number of the seat</Property>
+                <Property name="geo" type="astring">GUI: geometry information for the row</Property>
+                <Property name="angle" type="int">GUI: rotation of the row rectangle</Property>
+        </Class>
         <Class name="SeatPlanRow">
                <!-- Abstract lang="qt"/>
                <Abstract lang="php"/ -->
                 <Doc>This is a helper for parsing seat plans: it defines a row of seats</Doc>
                 <Property name="id" type="astring">the ID of this group, if multiple row elements with the same ID exist, they refer to different sections of the same row</Property>
-                <Property name="capacity" type="int">amount of seats in this (part of the) row</Property>
+                <Property name="name" type="astring">human readable name of the row</Property>
+                <Property name="capacity" type="int">amount of seats in this (part of the) row; if missing: Seat children are expected</Property>
                 <Property name="geo" type="astring">GUI: geometry information for the row</Property>
                 <Property name="bgcolor" type="astring">GUI: background color for seats</Property>
                 <Property name="fgcolor" type="astring">GUI: foreground color, the one the seat number is rendered in</Property>
+                <Property name="tkcolor" type="astring">GUI: background color for taken seats</Property>
+                <Property name="wcolor" type="astring">GUI: background color for wanted seats</Property>
+                <Property name="tkfgcolor" type="astring">GUI: foreground color, the one the group name is rendered in</Property>
+                <Property name="wfgcolor" type="astring">GUI: foreground color, the one the group name is rendered in</Property>
+                <Property name="ufgcolor" type="astring">GUI: foreground color, the one the seat ID is rendered in</Property>
+                <Property name="ucolor" type="astring">GUI: background color for unavailable seats</Property>
                 <Property name="first" type="int">number of the first seat in this row</Property>
+                <Property name="angle" type="int">GUI: rotation of the row rectangle</Property>
+                <Property name="Seat" type="List:SeatPlanSeat">GUI: seat geometries, if used capacity must be empty</Property>
         </Class>
         <Class name="SeatPlanGroup">
                <Abstract lang="qt"/>
                 <Property name="capacity" type="astring">amount of seats in this (part of the) group</Property>
                 <Property name="name" type="astring">human readable name of the group</Property>
                 <Property name="numbered" type="bool">defines whether the group contains numbered seats</Property>
-                <Property name="geo" type="astring">GUI: geometry information for the group</Property>
+                <Property name="geo" type="astring">GUI: geometry information for the group; if missing: uses plan coordinates</Property>
                 <Property name="bgcolor" type="astring">GUI: background color</Property>
                 <Property name="fgcolor" type="astring">GUI: foreground color, the one the group name is rendered in</Property>
+                <Property name="tkcolor" type="astring">GUI: background color for taken seats</Property>
+                <Property name="wcolor" type="astring">GUI: background color for wanted seats</Property>
+                <Property name="tkfgcolor" type="astring">GUI: foreground color, the one the group name is rendered in</Property>
+                <Property name="wfgcolor" type="astring">GUI: foreground color, the one the group name is rendered in</Property>
+                <Property name="ufgcolor" type="astring">GUI: foreground color, the one the seat ID is rendered in</Property>
+                <Property name="ucolor" type="astring">GUI: background color for unavailable seats</Property>
                 <Property name="angle" type="int">GUI: rotation of the group rectangle</Property>
                 <Property name="Row" type="List:SeatPlanRow">definition of rows in this group</Property>
                <Property name="price" type="astring">The price categories in this group.</Property>
@@ -53,6 +74,7 @@
                 <Property name="bgcolor" type="astring">GUI: background or fill color</Property>
                 <Property name="fgcolor" type="astring">GUI: foreground, outline or text color</Property>
                 <Property name="angle" type="int">GUI: rotation of the group rectangle</Property>
+                <Property name="font" type="astring">GUI: font family for the text element</Property>
                 <Property name="fontsize" type="int">GUI: font size for text elements</Property>
                 <Property name="content" type="astring">GUI: textual content</Property>
         </Class>
                over the wire, since it is just a helper class.</Doc>
                <Property name="version" type="int">Version of the SeatPlan spec that was implemented.</Property>
                <Property name="exclusive" type="bool">If true: only categories listed can be sold, if false: unlisted categories are not restricted</Property>
+                <Property name="size" type="astring">Width/Height information.</Property>
                 <Property name="Group" type="List:SeatPlanGroup"/>
                <Property name="VGroup" type="List:SeatPlanVGroup"/>
                 <Property name="Background" type="List:SeatPlanBackground"/>
                <Property name="Image" type="List:SeatPlanImage"/>
                <Property name="DefPrice" type="List:SeatPlanDefPrice"/>
+                <Property name="bgcolor" type="astring">GUI: background color</Property>
+                <Property name="fgcolor" type="astring">GUI: foreground color, the one the seat ID is rendered in</Property>
+                <Property name="tkcolor" type="astring">GUI: background color for taken seats</Property>
+                <Property name="wcolor" type="astring">GUI: background color for wanted seats</Property>
+                <Property name="tkfgcolor" type="astring">GUI: foreground color, the one the seat ID is rendered in</Property>
+                <Property name="wfgcolor" type="astring">GUI: foreground color, the one the seatID is rendered in</Property>
+                <Property name="ufgcolor" type="astring">GUI: foreground color, the one the seat ID is rendered in</Property>
+                <Property name="ucolor" type="astring">GUI: background color for unavailable seats</Property>
         </Class>
 </Wolf>
index 201ecdf..ab936a2 100644 (file)
@@ -7,48 +7,50 @@
   - see COPYING.AGPL for details
   -->
 <Wolf>
-       <Doc>These files describe the database schema and communication protocol of MagicSmoke.</Doc>
-       <Doc>&amp;copy; Konrad Rosenbaum, 2009-2017
-       &lt;br/>these files are protected under the GNU AGPLv3 or at your option any newer
-       </Doc>
-       <!-- generic settings -->
-       <Project baseDir=".." wobDir="wob" name="MagicSmoke" xml-namespace="http://silmor.de/MagicSmoke" auth="session" encoding="wob"/>
-       <Version comm="0103" needcomm="0100" humanReadable="2.1 beta" target="." system="git"/>
-       <Include file="db/db.wolf"/>
-       
-       <!-- configure output -->
-       <QtClientOutput sourceDir="iface" subDir="wob" priInclude="wob.pri" classPrefix="M" clean="yes" transactionBase="MTransaction" enableExport="yes"/>
-       <PHPServerOutput sourceDir="www" subDir="inc/wob" extension=".php" clean="yes" transactionBase="MSmokeTransaction"/>
-       <HtmlOutput sourceDir="doc" subDir="wob" clean="yes"/>
-       <!-- SchemaOutput sourceDir="wob" filename="test.xsd" compound="cmp.xsd"/ -->
-       <!-- SoapOutput sourceDir="soap" clean="yes" fileprefix="smoke_soap" noerror="yes"/ -->
-       
-       <!-- load and parse database definitions -->
-       <Include file="db/basics.wolf"/>
-       <Include file="db/user.wolf"/>
-       <Include file="db/customer.wolf"/>
-       <Include file="db/event.wolf"/>
-       <Include file="db/order.wolf"/>
-       <Include file="db/cart.wolf"/>
-       <Include file="db/template.wolf"/>
-       <Include file="db/audit.wolf"/>
-       <!-- load and parse class definitions -->
-       <Include file="classes/basics.wolf"/>
-       <Include file="classes/user.wolf"/>
-       <Include file="classes/customer.wolf"/>
-       <Include file="classes/event.wolf"/>
-       <Include file="classes/order.wolf"/>
-       <Include file="classes/cart.wolf"/>
-       <Include file="classes/template.wolf"/>
-        <Include file="classes/seatplan.wolf"/>
-       <!-- load and parse transaction definitions -->
-       <Include file="transact/basics.wolf"/>
-       <Include file="transact/backup.wolf"/>
-       <Include file="transact/user.wolf"/>
-       <Include file="transact/customer.wolf"/>
-       <Include file="transact/event.wolf"/>
-       <Include file="transact/order.wolf"/>
-       <Include file="transact/audit.wolf"/>
-       <Include file="transact/cart.wolf"/>
-       <Include file="transact/template.wolf"/>
+    <Doc>These files describe the database schema and communication protocol of MagicSmoke.</Doc>
+    <Doc>&amp;copy; Konrad Rosenbaum, 2009-2017
+    &lt;br/>these files are protected under the GNU AGPLv3 or at your option any newer
+    </Doc>
+    <!-- generic settings -->
+    <Project baseDir=".." wobDir="wob" name="MagicSmoke" xml-namespace="http://silmor.de/MagicSmoke" auth="session" encoding="wob"/>
+    <Version comm="0103" needcomm="0100" humanReadable="2.1 beta" target="." system="git"/>
+    <Include file="db/db.wolf"/>
+
+    <!-- configure output -->
+    <QtClientOutput sourceDir="iface" subDir="wob" priInclude="wob.pri" classPrefix="M" clean="yes" transactionBase="MTransaction" enableExport="yes"/>
+    <Qt5ClientOutput sourceDir="iface" subDir="wob5" priInclude="wob.pri" allClassPrefix="M" classPrefix="O" transactionPrefix="T" clean="yes" transactionBase="MTransaction" enableExport="yes"/>
+    <PHPServerOutput sourceDir="www" subDir="inc/wob" extension=".php" clean="yes" transactionBase="MSmokeTransaction"/>
+    <HtmlOutput sourceDir="doc" subDir="wob" clean="yes"/>
+    <HtmlOutput_ sourceDir="doc" subDir="wob_" clean="yes"/>
+    <!-- SchemaOutput sourceDir="wob" filename="test.xsd" compound="cmp.xsd"/ -->
+    <!-- SoapOutput sourceDir="soap" clean="yes" fileprefix="smoke_soap" noerror="yes"/ -->
+
+    <!-- load and parse database definitions -->
+    <Include file="db/basics.wolf"/>
+    <Include file="db/user.wolf"/>
+    <Include file="db/customer.wolf"/>
+    <Include file="db/event.wolf"/>
+    <Include file="db/order.wolf"/>
+    <Include file="db/cart.wolf"/>
+    <Include file="db/template.wolf"/>
+    <Include file="db/audit.wolf"/>
+    <!-- load and parse class definitions -->
+    <Include file="classes/basics.wolf"/>
+    <Include file="classes/user.wolf"/>
+    <Include file="classes/customer.wolf"/>
+    <Include file="classes/event.wolf"/>
+    <Include file="classes/order.wolf"/>
+    <Include file="classes/cart.wolf"/>
+    <Include file="classes/template.wolf"/>
+    <Include file="classes/seatplan.wolf"/>
+    <!-- load and parse transaction definitions -->
+    <Include file="transact/basics.wolf"/>
+    <Include file="transact/backup.wolf"/>
+    <Include file="transact/user.wolf"/>
+    <Include file="transact/customer.wolf"/>
+    <Include file="transact/event.wolf"/>
+    <Include file="transact/order.wolf"/>
+    <Include file="transact/audit.wolf"/>
+    <Include file="transact/cart.wolf"/>
+    <Include file="transact/template.wolf"/>
 </Wolf>
index 4abed0d..657b01c 100644 (file)
@@ -3,55 +3,7 @@
 // protected under the GNU AGPL version 3 or at your option any newer
 // see COPYING.AGPL
 
-/** \page templates Templates
-\section tpl_base Base Variables
-
-There are some variables available for all templates.<p>
-
-\param script.* variables contain URLs for different modes of the web site:<br>
-<table frame="1" border="1">
-<tr><td><tt>script.root</tt></td><td>root URL for the index.php script</td></tr>
-<tr><td><tt>script.this</tt></td><td>the URL of the currently called script mode</td></tr>
-<tr><td><tt>script.index</tt></td><td>URL of the list index</td></tr>
-<tr><td><tt>script.eventDetails</tt></td><td>URL for event detail pages, append the event ID to it to complete it</td></tr>
-<tr><td><tt>script.eventOrder</tt></td><td>URL for ordering tickets for a specific event, arguments are expected as POST or GET parameters</td></tr>
-<tr><td><tt>script.vouchers</tt></td><td>URL for listing vouchers</td></tr>
-<tr><td><tt>script.voucherOrder</tt></td><td>URL for ordering vouchers, arguments are expected as POST or GET parameters</td></tr>
-<tr><td><tt>script.removeItem</tt></td><td>URL for removing tickets/vouchers/items from the cart, arguments are expected as POST or GET parameters</td></tr>
-<tr><td><tt>script.shop</tt></td><td>URL for listing shop items</td></tr>
-<tr><td><tt>script.cart</tt></td><td>URL of the cart, the cart must exist when calling it, otherwise a cookie error will be displayed</td></tr>
-<tr><td><tt>script.mycart</tt></td><td>URL of the cart that transparently creates the cart if it does not exist yet</td></tr>
-<tr><td><tt>script.checkout</tt></td><td>URL to check out the cart</td></tr>
-<tr><td><tt>script.setlanguage</tt></td><td>URL for setting the language cookie, add the language code to it to complete it</td></tr>
-</table><p>
-\param inputnames.* variables contain names for specific form input elements:<br>
-<table frame="1" border="1">
-<tr><td><tt>inputnames.amountTickets</tt></td><td>amount of tickets to be ordered</td></tr>
-<tr><td><tt>inputnames.event</tt></td><td>contains the event ID</td></tr>
-<tr><td><tt>inputnames.mode</tt></td><td>contains the display mode</td></tr>
-<tr><td><tt>inputnames.cartid</tt></td><td>ID of the cart of the current customer, usually the cart cookie is used instead</td></tr>
-</table><p>
-\param cartcookie variable contains the name of the cookie that contains the cart ID.<p>
-\param lang variable is an object of type LanguageManager - it represents translations done for the language the user has chosen.<p>
-
-\param sessionid contains the ID of the current session as it is stored in a cookie and the session table.
-
-\param user.* contains basic data about the web user.
-<table frame="1" border="1">
-<tr><td><tt>user.name</tt></td><td>the (family) name of the user</td></tr>
-<tr><td><tt>user.firstname</tt></td><td>the first name of the user</td></tr>
-<tr><td><tt>user.title</tt></td><td>the title of the user</td></tr>
-<tr><td><tt>user.email</tt></td><td>the e-mail and login name of the user</td></tr>
-</table>
-
-\section tpl_error error.html
-
-This template is used whenever an error occurs during processing.
-
-\param ErrorText the text to be shown for an error
-\param ErrorTrace a full ASCII version of an exception trace. This is only filled if the <tt>$WebShowErrors</tt> option is set to <tt>true</tt> in the config.php file.
-**/
-
+///helper class to populate template basevars array
 class BaseVars{
 
 ///if Twig is not yet initialized: initialize it, sets the $twig variable to the interpreter
@@ -106,6 +58,7 @@ public static function initPriv(){
        $basevars['script']['orderLogin']=$BaseUrl."?mode=orderLogin";
        $basevars['script']['placeOrder']=$BaseUrl."?mode=placeOrder";
        $basevars['script']['customerLoginOrder']=$BaseUrl."?mode=customerLoginOrder";
+       $basevars['script']['customerResetOrder']=$BaseUrl."?mode=customerResetOrder";
        $basevars['script']['customerRegistrationOrder']=$BaseUrl."?mode=customerRegistrationOrder";
        $basevars['script']['changeInvoiceAddress']=$BaseUrl."?mode=changeInvoiceAddress";
        $basevars['script']['changeDeliveryAddress']=$BaseUrl."?mode=changeDeliveryAddress";
index 09fce8a..4134acd 100644 (file)
@@ -212,40 +212,6 @@ static public function getNewCartId(){
 }
 
 
-/** \page templates Templates
-\section tpl_cart Cart Variables
-
-The cart.html template is used to render the current cart of the customer.
-
-\param cart an object of the web type <a href="../wob/class-WebCart.html">WebCart</a> (PHP: WOWebCart) that represents the entire cart of the user.
-\param shipping and array of web objects of type <a href="../wob/class-Shipping.html">Shipping</a> (PHP: WOShipping) which represent all available shipping types that customers can chose from.
-\param forceshipping a boolean that contains whether customers must chose a shipping type.
-
-\subsection tpl_cartext Cart Extensions
-
-Some of the sub-objects of cart have extended attributes in addition to those generated by Wob:
-
-\param cart.isempty true if the cart is empty
-\param cart.totalsum the complete sum of all prices in the cart
-\param cart.tickets[...].eventprice.*:
-\param *.amountInputField name of the input field of a form that should contain the amount of tickets for ordering, see the example on how to use it
-\param *.categoryIdWeb part of the URL query that represents this category, used for removing tickets from the cart, see the example on how to use it
-
-\section tpl_voucher Voucher Variables
-
-The voucher.html template is used to render the voucher selection form.
-
-\param voucherprices contains an array of valid voucher prices.
-
-\section tpl_carterror Cart Error Variables
-
-The carterror.html template is used to when the cart expired or the customers browser lost the cookie.
-
-Just the \ref tpl_base Base Variables
-are available.
-**/
-
-
 /** creates the cart overview 
 
 for templating info see \ref tpl_cart Cart Variables
@@ -304,14 +270,6 @@ static public function createVoucherOverview()
        return $p->render($list);
 }
 
-/** \page templates Templates
-\section tpl_cout Checkout Variables
-
-The checkout.html template is used to render the current cart of the customer.
-
-\param cart an object of the web type <a href="../wob/class-WebCart.html">WebCart</a> (PHP: WOWebCart) that represents the entire cart of the user.
-*/
-
 /**renders the checkout page
 
 see the \ref tpl_cout Checkout Template
index 09906a9..0972b5e 100644 (file)
@@ -5,21 +5,6 @@
 // see COPYING.AGPL
 
 
-/**
-\page templates Templates
-\section tpl_index Event List
-
-The index.html template is used to render the list of events available to customers.
-
-\param events an array of the events available, starting at the current time, ordered by time; the events are of web object type <a href="../wob/class-Event.html">Event</a> (PHP: WOEvent)
-
-\section tpl_eventdetail Event Details
-
-The eventdetails.html template is used to render a single event and to offer the user to buy tickets for it.
-
-\param event the event being rendered; the event is of web object type <a href="../wob/class-Event.html">Event</a> (PHP: WOEvent)
-*/
-
 /** wrapper arount event (list) rendering for the web UI*/
 class EventRender {
 
index 5d8d106..408f0f2 100644 (file)
@@ -372,16 +372,6 @@ class WOCustomer extends WOCustomerAbstract
                return $p->render($vars);
        }
        
-       /** \page templates Templates
-       \section tpl_login Login Page
-
-       The login.html template is used to render the customer login and registration page.
-
-       \param script.customerLogin the page to call for logging in
-       \param script.customerRegistration the page to call for registering a new customer
-       \param customer_name the name (mail) of the customer (or an empty string if unknown)
-       */
-
        /** creates a login page
 
        For templating info see \ref tpl_login Login Variables
@@ -408,6 +398,7 @@ class WOCustomer extends WOCustomerAbstract
                $list["cart"]=$cart;
                $list["customer_name"]="";
                $list['script']['customerLogin']=$basevars['script']['customerLogin'.$extension];
+               $list['script']['customerReset']=$basevars['script']['customerReset'.$extension];
                $list['script']['customerRegistration']=$basevars['script']['customerRegistration'.$extension];
                $list["customer_name"]="";
                if(isset($HTTPARGS["customer_name"]))
@@ -438,15 +429,6 @@ class WOCustomer extends WOCustomerAbstract
        }
 
 
-       /** \page templates Templates
-       \section tpl_logerr Login Error
-
-       The loginerror.html template is used to render customer login and registering errors.
-
-       \param errorType the type of error: "login" - the login failed (wrong mail or password), "exist" - an account with the same mail already exists, "mismatch" - the new passwords do no match, "create" for unspecified errors during creation of the new account (e.g. missing or invalid parameters)
-       \param backUrl the URL to call back to the login page
-       */
-
        ///renders a login error page, see \ref tpl_logerr Login Error Template
        static private function loginError($errorType)
        {
index 133cab2..ca343a0 100644 (file)
@@ -49,6 +49,7 @@ $page="(internal error: no page text yet, probably no template defined)";
 
 try{
        //get page template and process it
+       //NOTE: if you alter the meaning of any mode or add modes do not forget to change doc/web/flow.html!
        switch($mode){
                case "eventDetails": // show details of an event
                        $page=EventRender::createEventDetails();
@@ -76,7 +77,8 @@ try{
                case "voucherOrder": // add selected voucher to cart, then redirect to cart
                        WebCart::addVoucher();
                        break;
-               case "shop": // redirect to main page - anchor for flow resets
+               case "shop": // Merchandising Shop
+                       // redirect to main page - anchor for flow resets
                        redirectHome();
                        break;
                case "checkout": // redirection target during checkout from login/register pages
@@ -91,6 +93,9 @@ try{
                case "customerRegistrationOrder": // log in with new customer data
                        $page=WOCustomer::registerCustomer("checkout",true);
                        break;
+               case "customerResetOrder": // reset password from order login page
+                       //TODO
+                       break;
                case "changeDeliveryAddress":
                case "changeInvoiceAddress": // change addresses
                        $page=WebCart::changeAddressPage($mode);
@@ -111,9 +116,11 @@ try{
                        $page=$twig->loadTemplate("index.html")->render($basevars);
                        break;
                default: // if in doubt: show the event page, customers will probably like it ;-)
+                       //TODO: make this configurable
                        $page=EventRender::createEventList();
                        break;
        }
+       //NOTE: if you alter the meaning of any mode or add modes do not forget to change doc/web/flow.html!
 }catch(Exception $ex){
        //log to (Apache) log file
        error_log($ex->getMessage());
index c781a17..a0e84bf 100644 (file)
   </form>
 </div>
 
+<input type="radio" name="loginselect" value="forgot" onClick="toggledisplay()" id="forgotselect"/>I forgot my password:<p/>
+
+{# the login dialog #}
+<div id="forgotdiv">
+  <form action="{{script.customerReset}}" method="POST">
+    Please enter your login (email address) and click the reset button. You will receive an email with instructions how to reset your password.<br/>
+    <table>
+    <tr><td>E-mail address:</td><td><input type="text" name="{{inputnames.login.name}}" value="{{customer_name}}" /></td></tr>
+    </table><p/>
+    <input type="submit" value="Reset Password"/>
+  </form><p/>
+</div>
+
 <p/><hr/>
 {# in any case: allow the user to shop some more... #}
 <p><a href="{{script.root}}">Abort and Continue Shopping</a></p>
 <script type="text/javascript">
 <!-- // Hide script from old browsers
 //makes the two main divs visible or invisible, used by toggledisplay
-function showDiv(use,creat)
+function showDiv(use,creat,forgot)
 {
   document.getElementById("usediv").style.display = use;
   document.getElementById("creatediv").style.display = creat;
+  document.getElementById("forgotdiv").style.display = forgot;
 }
 //called when one of the outer radio buttons is clicked:
 //finds out which div should be visible
 function toggledisplay()
 {
   var sel=document.getElementById("loginselect");
+  var fgt=document.getElementById("forgotselect");
   if(sel.checked)
-         showDiv("block","none");
+         showDiv("block","none","none");
+  else if(fgt.checked)
+         showDiv("none","none","block");
   else
-         showDiv("none","block");
+         showDiv("none","block","none");
 }
 //initial view
 toggledisplay();