implemented event cancelling
authorkonrad <konrad@6e3c4bff-ac9f-4ac1-96c5-d2ea494d3e33>
Sun, 30 Mar 2008 15:11:44 +0000 (15:11 +0000)
committerkonrad <konrad@6e3c4bff-ac9f-4ac1-96c5-d2ea494d3e33>
Sun, 30 Mar 2008 15:11:44 +0000 (15:11 +0000)
git-svn-id: https://silmor.de/svn/softmagic/smoke/trunk@150 6e3c4bff-ac9f-4ac1-96c5-d2ea494d3e33

doc/prog_protocol.html
src/event.cpp
src/event.h
src/eventedit.cpp
src/overview.cpp
src/overview.h
www/inc/classes/event.php
www/machine.php

index 5c8705c..e5ea315 100644 (file)
@@ -203,7 +203,9 @@ The <tt>seteventdata</tt> transaction creates/changes an event. The request data
 
 Attributes and tags are the same as for the <tt>geteventdata</tt> response. Except that the <tt>id</tt> attribute may contain the value <tt>"new"</tt> to create a new event, a negative integer is not allowed.<p>
 
-The response contains the ID of the new/changed event if the status is "Ok". In the case of failure the status will be "Error" and an optional reason for the failure may be in the body.
+The response contains the ID of the new/changed event if the status is "Ok". In the case of failure the status will be "Error" and an optional reason for the failure may be in the body.<p>
+
+The request must not change the cancellation status of an event - the attribute "cancelled" is ignored and the element "CancelReason" may be ignored if it violates the current status.<p>
 
 <h3>Getting a Ticket Summary of an Event</h3>
 
@@ -219,6 +221,11 @@ The <tt>eventsummary</tt> transaction returns summary data for an event. The req
 </pre>
 
 
+<h3>Cancelling an Event</h3>
+
+The <tt>cancelevent</tt> transaction can be used to cancel an event. This transaction is not reversible. The request contains the event-ID and the cancel reason separated by a newline, the response is empty.
+
+
 <!-- ************************************************************************************
      ************************************************************************************
      ************************************************************************************ -->
index fbbadcd..cfafa97 100644 (file)
@@ -265,3 +265,10 @@ QString MEvent::endTimeString()const
 {
         return QDateTime::fromTime_t(m_endtime).toString(QCoreApplication::translate("MEvent","yyyy-MM-dd hh:mm ap","date/time format"));
 }
+
+bool MEvent::cancelEvent(QString cr)
+{
+       QByteArray rq=QByteArray::number(eventid)+"\n"+cr.toUtf8();
+       if(!req->request("cancelevent",rq))return false;
+       return req->responseStatus()==MWebRequest::Ok;
+}
index 9d96c3f..aec7360 100644 (file)
@@ -94,6 +94,9 @@ class MEvent
                bool isComplete()const{return m_complete;}
                /**forces the event to believe it is valid and complete; used for saving new events*/
                void makeValid(){m_valid=true;m_complete=true;}
+               
+               /**requests to cancel the event from the DB; expects reason as argument; returns true on success*/
+               bool cancelEvent(QString);
        private:
                //used by both constructors:
                void initFromElement(QDomElement&);
index 682c89a..47c0783 100644 (file)
@@ -100,8 +100,9 @@ MEventEditor::MEventEditor(QWidget*w,MWebRequest*r,qint32 id)
        price->setValidator(new QRegExpValidator(event.priceRegExp(),this));
        price->setText(event.priceString());
        
-       gl->addWidget(cancelcheck=new QCheckBox(tr("Cancel Event:")),++lctr,0);
+       gl->addWidget(cancelcheck=new QCheckBox(tr("Event Cancelled:")),++lctr,0);
        cancelcheck->setChecked(event.isCancelled());
+       cancelcheck->setEnabled(false);
        gl->addWidget(cancelreason=new QLineEdit,lctr,1);
        cancelreason->setEnabled(event.isCancelled());
        cancelreason->setText(event.cancelReason());
index 9d31860..c9e63c6 100644 (file)
@@ -110,6 +110,10 @@ MOverview::MOverview(MWebRequest*mw,QString pk)
        vl->addWidget(p=new QPushButton(tr("Ticket Summary...")),0);
        connect(p,SIGNAL(clicked()),this,SLOT(eventSummary()));
        p->setEnabled(req->hasRole("eventsummary"));
+       vl->addSpacing(15);
+       vl->addWidget(p=new QPushButton(tr("Cancel Event...")),0);
+       p->setEnabled(req->hasRole("cancelevent"));
+       connect(p,SIGNAL(clicked()),this,SLOT(eventCancel()));
        vl->addStretch(10);
        
        //Shopping Cart Tab
@@ -357,6 +361,26 @@ void MOverview::eventSummary()
        ed.exec();
 }
 
+void MOverview::eventCancel()
+{
+       int id;
+       QModelIndexList ilst=eventtable->selectionModel()->selectedIndexes();
+       if(ilst.size()<1)return;
+       QModelIndex idx=eventmodel->index(ilst[0].row(),0);
+       id=eventmodel->data(idx,Qt::UserRole).toInt();
+       if(id<0)return;
+       MEvent ev(req,id);
+       if(ev.isValid()){
+               bool ok;
+               QString r=QInputDialog::getText(this,tr("Cancel Event"),tr("Please enter a reason to cancel event \"%1\" or abort:").arg(ev.title()),QLineEdit::Normal,"",&ok);
+               if(!ok)return;
+               if(ev.cancelEvent(r))
+                       QMessageBox::information(this,tr("Event Cancelled"),tr("The event \"%1\" has been cancelled. Please inform everybody who bought a ticket.").arg(ev.title()));
+               else
+                       QMessageBox::warning(this,tr("Warning"),tr("Unable to cancel event \"%1\".").arg(ev.title()));
+       }
+}
+
 void MOverview::updateUsers()
 {
        QList<MUser>usl=req->getAllUsers();
index 372c6d9..99b4971 100644 (file)
@@ -55,6 +55,8 @@ class MOverview:public QMainWindow
                void eventOrderTicket();
                /**open event summary*/
                void eventSummary();
+               /**cancel the event*/
+               void eventCancel();
                
                /**get all orders, update list*/
                void updateOrders();
index ded9731..463b94d 100644 (file)
@@ -210,7 +210,6 @@ function setEventXml($xmldata)
        $end=trim($doc->getAttribute("end"))+0;
        $capacity=trim($doc->getAttribute("capacity"))+0;
        $defaultprice=trim($doc->getAttribute("defaultprice"))+0;
-       $cancelled=trim($doc->getAttribute("cancelled"));
        $title=$artist=$description=$room=$cancelreason="";
        foreach($doc->getElementsByTagName("Title") as $el)
                foreach($el->childNodes as $cn)
@@ -238,11 +237,6 @@ function setEventXml($xmldata)
                echo "Invalid Event ID, must be positive integer or 'new'.";
                return;
        }
-       if($cancelled!="true" && $cancelled!="false"){
-               header("X-MagicSmoke-Status: Error");
-               echo "Event neither cancelled, nor non-cancelled.";
-               return;
-       }
        if($title==""){
                header("X-MagicSmoke-Status: Error");
                echo "Empty Title.";
@@ -273,10 +267,6 @@ function setEventXml($xmldata)
        $data["roomid"]=$room;
        $data["capacity"]=$capacity;
        $data["defaultprice"]=$defaultprice;
-       if($cancelled=="true")
-               $data["cancelreason"]=$cancelreason." ";
-       else
-               $data["cancelreason"]=false;
        if($eventid=="new"){
                //create event
                $eventid=$db->insert("event",$data);
@@ -288,13 +278,15 @@ function setEventXml($xmldata)
        }else{
                //check ID
                $eventid=$eventid+0;
-               $res=$db->select("event","eventid","eventid=".$eventid);
+               $res=$db->select("event","eventid,cancelreason","eventid=".$eventid);
                if(count($res)==0){
                        header("X-MagicSmoke-Status: Error");
                        echo "Invalid Event: eventid does not exist in database.";
                        $db->rollbackTransaction();
                        return;
                }
+               if($res[0]["cancelreason"]!==NULL && $res[0]["cancelreason"]!="")
+                       $data["cancelreason"]=$cancelreason." ";
                $db->update("event",$data,"eventid=".$eventid);
        }
        $db->commitTransaction();
@@ -374,4 +366,38 @@ function getEventSummaryXml($evid)
        print($xml->saveXml());
 }
 
+function cancelEventXml($data)
+{
+       $lst=explode("\n",$data);
+       if(count($lst)!=2){
+               header("X-MagicSmoke-Status: Error");
+               die(tr("Malformed request."));
+       }
+       $eid=trim($lst[0]);
+       if(!is_numeric($eid)){
+               header("X-MagicSmoke-Status: Error");
+               die(tr("The event id must be numeric."));
+       }
+       $eid=$eid+0;
+       if($eid<0){
+               header("X-MagicSmoke-Status: Error");
+               die(tr("Invalid event id."));
+       }
+       //check event id
+       global $db;
+       $db->beginTransaction();
+       $res=$db->select("event","eventid,cancelreason","eventid=".$db->escapeInt($eid));
+       if(count($res)<1){
+               header("X-MagicSmoke-Status: Error");
+               $db->rollbackTransaction();
+               die(tr("Invalid event id."));
+       }
+       //update cancelreason
+       $db->update("event",array("cancelreason"=>(trim($lst[1])." ")),"eventid=".$db->escapeInt($eid));
+       //propagate to tickets (does not hurt to do this multiple times)
+       $db->update("ticket",array("status"=>TICKET_CANCELLED),"eventid=".$db->escapeInt($eid)." AND status!=".$db->escapeInt(TICKET_USED));
+       $db->commitTransaction();
+       header("X-MagicSmoke-Status: Ok");
+}
+
 ?>
\ No newline at end of file
index a210415..cd8cb2a 100644 (file)
@@ -20,7 +20,7 @@ $ALLOWEDREQUESTS=array(
        //all requests below here need a role entry in the DB
        tr("getusers"),tr("setuserdescription"),tr("getuseracl"),tr("setuseracl"),tr("getuserhosts"),tr("setuserhosts"),tr("adduser"),tr("deleteuser"),tr("setmypasswd"),tr("setpasswd"),//user management
        tr("gethosts"),tr("sethost"),tr("addhost"),tr("deletehost"), //host management
-       tr("geteventlist"),tr("geteventdata"),tr("seteventdata"),tr("eventsummary"), //event infos
+       tr("geteventlist"),tr("geteventdata"),tr("seteventdata"),tr("eventsummary"),tr("cancelevent"),//event infos
        tr("getroomdata"),tr("setroomdata"),//room infos
        tr("getcustomerlist"),tr("getcustomer"),tr("setcustomer"), //customer info
        tr("checkorder"),tr("createorder"),tr("createsale"),tr("getorderlist"),tr("getorder"),tr("orderpay"),tr("orderrefund"), //sell/order stuff
@@ -140,6 +140,12 @@ if($SMOKEREQUEST=="eventsummary"){
        exit();
 }
 
+//cancel an event
+if($SMOKEREQUEST=="cancelevent"){
+       cancelEventXml(trim($REQUESTDATA));
+       exit();
+}
+
 //get room
 if($SMOKEREQUEST=="getroomdata"){
        getRoomsXml($REQUESTDATA);