Skip to content
Code-Schnipsel Gruppen Projekte
Commit 4d1a5312 erstellt von Henning Leutz's avatar Henning Leutz :martial_arts_uniform:
Dateien durchsuchen

feat: Bestellprozess -> Die einzelnen Steps sind erledigt, Fehler nur noch Bestellung absenden

Übergeordneter 6abf47cd
Keine zugehörigen Branchen gefunden
Keine zugehörigen Tags gefunden
Keine zugehörigen Merge Requests gefunden
werden angezeigt mit 824 Ergänzungen und 113 Löschungen
......@@ -37,7 +37,7 @@
<index>hash</index>
</table>
<table name="ordersProcess">
<table name="orders_process">
<field type="BIGINT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY">id</field>
<field type="BIGINT(10) NOT NULL">parent_order</field> <!-- Für aufgesplittete Bestellungen -->
<field type="INT NOT NULL">invoice_id</field> <!-- nur setzen wenn invoice gebucht ist -->
......
......@@ -16,7 +16,7 @@
<en><![CDATA[Orders]]></en>
</locale>
<locale name="cutomerData">
<locale name="customerData">
<de><![CDATA[Kundendaten]]></de>
<en><![CDATA[Customer data]]></en>
</locale>
......@@ -78,6 +78,10 @@
<de><![CDATA[Die Bestellung wurde noch nicht zu ende geführt.]]></de>
<en><![CDATA[The order has not yet been completed.]]></en>
</locale>
<locale name="exception.missing.payment">
<de><![CDATA[Bitte wählen Sie eine Bezahlmethode aus, um mit der Bestellung fortzuführen.]]></de>
<en><![CDATA[Please select a payment method to proceed the order.]]></en>
</locale>
<locale name="message.select.customer">
<de><![CDATA[Bitte wählen Sie einen Kunden aus.]]></de>
......@@ -160,6 +164,14 @@
<de><![CDATA[Fertig!]]></de>
<en><![CDATA[Done!]]></en>
</locale>
<locale name="ordering.btn.next">
<de><![CDATA[Übernehmen und weiter]]></de>
<en><![CDATA[Apply and continue]]></en>
</locale>
<locale name="ordering.btn.previous">
<de><![CDATA[Zurück]]></de>
<en><![CDATA[Back]]></en>
</locale>
<locale name="ordering.step.title.Address.description">
<de><![CDATA[
......@@ -175,6 +187,72 @@
<de><![CDATA[Neue Adresse hinzufügen]]></de>
<en><![CDATA[Add new address]]></en>
</locale>
<locale name="ordering.step.title.Address.invoiceAddress.title">
<de><![CDATA[Rechnungsadresse]]></de>
<en><![CDATA[Invoice address]]></en>
</locale>
<locale name="ordering.step.title.Address.editButton">
<de><![CDATA[Ändern]]></de>
<en><![CDATA[Edit]]></en>
</locale>
<locale name="ordering.step.title.Address.deleteButton">
<de><![CDATA[Löschen]]></de>
<en><![CDATA[Delete]]></en>
</locale>
<locale name="ordering.step.title.Address.edit">
<de><![CDATA[Adresse bearbeiten]]></de>
<en><![CDATA[Edit address]]></en>
</locale>
<locale name="ordering.step.title.Address.edit.btn">
<de><![CDATA[Adresse speichern]]></de>
<en><![CDATA[Save address]]></en>
</locale>
<locale name="ordering.step.title.Address.delete">
<de><![CDATA[Adresse löschen]]></de>
<en><![CDATA[Delete address]]></en>
</locale>
<locale name="ordering.step.title.Address.delete.message">
<de><![CDATA[Möchten Sie die Adresse wirklich löschen?]]></de>
<en><![CDATA[Are you sure you want to delete the address?]]></en>
</locale>
<locale name="ordering.step.title.Address.delete.btn">
<de><![CDATA[Adresse löschen]]></de>
<en><![CDATA[Delete address]]></en>
</locale>
<locale name="salutation">
<de><![CDATA[Anrede]]></de>
<en><![CDATA[Salutation]]></en>
</locale>
<locale name="firstname">
<de><![CDATA[Vorname]]></de>
<en><![CDATA[Firstname]]></en>
</locale>
<locale name="lastname">
<de><![CDATA[Nachname]]></de>
<en><![CDATA[Lastname]]></en>
</locale>
<locale name="company">
<de><![CDATA[Firma]]></de>
<en><![CDATA[Company]]></en>
</locale>
<locale name="street_no">
<de><![CDATA[Strasse und Hausnummer]]></de>
<en><![CDATA[Street and house number]]></en>
</locale>
<locale name="zip">
<de><![CDATA[PLZ]]></de>
<en><![CDATA[Zip]]></en>
</locale>
<locale name="city">
<de><![CDATA[Stadt]]></de>
<en><![CDATA[City]]></en>
</locale>
<locale name="country">
<de><![CDATA[Land]]></de>
<en><![CDATA[Country]]></en>
</locale>
</groups>
<groups name="quiqqer/order" datatype="js">
......
......@@ -478,6 +478,7 @@ public function setInvoiceAddress($address)
protected function parseAddressData(array $address)
{
$fields = array_flip(array(
'id',
'salutation',
'firstname',
'lastname',
......@@ -560,6 +561,8 @@ public function setCustomer($User)
*
* @param string|integer $paymentId
* @throws Exception
*
* @todo Payment->canBeUsed() noch implementieren
*/
public function setPayment($paymentId)
{
......
......@@ -51,10 +51,21 @@ public function isValid()
{
try {
$this->validate();
} catch (QUI\ERP\Order\Exception $exception) {
} catch (QUI\ERP\Order\Exception $Exception) {
return false;
}
return true;
}
/**
* It can be overwritten and can be implemented its own functionality
* eq: Thus it is possible to display settings without the next button
*
* @return bool
*/
public function showNext()
{
return true;
}
}
<section class="quiqqer-order-step-address-delete">
<header>
<h1>{locale group="quiqqer/order" var="ordering.step.title.Address.delete"}</h1>
</header>
<div class="quiqqer-order-step-address-delete-container">
{locale group="quiqqer/order" var="ordering.step.title.Address.delete.message"}
{$Address->render()}
<button type="submit" name="step" value="{$this->getName()}"
class="quiqqer-order-step-address-delete-container-deleteBtn"
>
{locale group="quiqqer/order" var="ordering.step.title.Address.delete.btn"}
</button>
<input type="hidden" name="addressId" value="{$Address->getId()}"/>
<input type="hidden" name="executeDeletion" value="1"/>
</div>
</section>
\ No newline at end of file
<section class="quiqqer-order-step-address-edit">
<header>
<h1>{locale group="quiqqer/order" var="ordering.step.title.Address.edit"}</h1>
</header>
<label>
<span>{locale group="quiqqer/order" var="company"}</span>
<input type="text"
name="company"
value="{$Address->getAttribute('company')|escape:'html'}"
/>
</label>
<label>
<span>{locale group="quiqqer/order" var="salutation"}</span>
<input type="text"
name="salutation"
value="{$Address->getAttribute('salutation')|escape:'html'}"
/>
</label>
<label>
<span>{locale group="quiqqer/order" var="firstname"}</span>
<input type="text"
name="firstname"
value="{$Address->getAttribute('firstname')|escape:'html'}"
/>
</label>
<label>
<span>{locale group="quiqqer/order" var="lastname"}</span>
<input type="text"
name="lastname"
value="{$Address->getAttribute('lastname')|escape:'html'}"
/>
</label>
<label>
<span>{locale group="quiqqer/order" var="street_no"}</span>
<input type="text"
name="street_no"
value="{$Address->getAttribute('street_no')|escape:'html'}"
/>
</label>
<label>
<span>{locale group="quiqqer/order" var="zip"}</span>
<input type="text"
name="zip"
value="{$Address->getAttribute('zip')|escape:'html'}"
/>
</label>
<label>
<span>{locale group="quiqqer/order" var="city"}</span>
<input type="text"
name="city"
value="{$Address->getAttribute('city')|escape:'html'}"
/>
</label>
<label>
<span>{locale group="quiqqer/system" var="country"}</span>
{assign var=currentCountry value=$Address->getAttribute('country')}
<select name="country">
<option value=""></option>
{foreach from=$countries item=Country}
<option value="{$Country->getCode()|escape:'html'}"
{if $currentCountry== $Country->getCode()}selected="selected"{/if}
>
{$Country->getName()}
</option>
{/foreach}
</select>
</label>
<button type="submit" name="editSave" value="1" class="quiqqer-order-step-address-edit-button">
{locale group="quiqqer/order" var="ordering.step.title.Address.edit.btn"}
</button>
<input type="hidden" name="addressId" value="{$Address->getId()}"/>
<input type="hidden" name="step" value="{$this->getName()}"/>
</section>
\ No newline at end of file
......@@ -67,4 +67,60 @@
.quiqqer-order-step-address-list-entry-buttons button {
font-size: 12px !important;
padding: 0 10px !important;
}
/** Rechnungsadresse
================================================== */
.quiqqer-order-step-address-edit {
margin: 0 auto;
max-width: 600px;
width: 100%;
}
.quiqqer-order-step-address-edit header {
margin-bottom: 40px;
}
.quiqqer-order-step-address-edit label {
clear: both;
display: inline-block;
width: 100%;
}
.quiqqer-order-step-address-edit label span {
float: left;
width: 50%
}
.quiqqer-order-step-address-edit input,
.quiqqer-order-step-address-edit select {
float: left;
width: 50%
}
.quiqqer-order-step-address-edit-button {
margin-left: 50%;
width: 50%;
padding: 10px !important;
font-size: 14px !important;
}
/** Rechnungsadresse
================================================== */
.quiqqer-order-step-address-delete {
margin: 0 auto;
max-width: 600px;
width: 100%;
}
.quiqqer-order-step-address-delete-container-deleteBtn {
padding: 10px !important;
font-size: 14px !important;
}
.quiqqer-order-step-address-delete-container address {
margin: 20px auto;
}
\ No newline at end of file
......@@ -14,41 +14,47 @@
</button>
</div>
<form>
<div class="quiqqer-order-step-address-list">
{if $User->getId()}
{* Logged in user *}
<div class="quiqqer-order-step-address-list">
{if $User->getId()}
{* Logged in user *}
{foreach $addresses as $Address}
<div class="quiqqer-order-step-address-list-entry">
<header>
<label>
<span class="fa fa-address-card-o"></span>
Rechnungsadresse
<input type="radio" name="address_invoice" value="{$Address->getId()}">
</label>
</header>
<address>
{$UserAddress->render()}
</address>
<div class="quiqqer-order-step-address-list-entry-buttons">
<button>
<span class="fa fa-edit"></span>
<span>Ändern</span>
</button>
<button>
<span class="fa fa-trash"></span>
<span>Löschen</span>
</button>
</div>
{foreach $addresses as $Address}
<div class="quiqqer-order-step-address-list-entry">
<header>
<label>
<span class="fa fa-address-card-o"></span>
{locale group="quiqqer/order" var="ordering.step.title.Address.invoiceAddress.title"}
<input type="radio"
name="address_invoice"
value="{$Address->getId()}"
{if $selectedAddressId == $Address->getId()}checked="checked"{/if}
>
</label>
</header>
<address>
{$Address->render()}
</address>
<div class="quiqqer-order-step-address-list-entry-buttons">
<button type="submit" name="edit" value="{$Address->getId()}">
<span class="fa fa-edit"></span>
<span>
{locale group="quiqqer/order" var="ordering.step.title.Address.editButton"}
</span>
</button>
<button type="submit" name="delete" value="{$Address->getId()}">
<span class="fa fa-trash"></span>
<span>
{locale group="quiqqer/order" var="ordering.step.title.Address.deleteButton"}
</span>
</button>
</div>
{/foreach}
</div>
{/foreach}
{else}
{* Unregistered user*}
{else}
{* Unregistered user*}
{/if}
{/if}
</div>
</form>
</div>
</section>
\ No newline at end of file
......@@ -30,25 +30,65 @@ public function __construct($attributes = array())
$this->addCSSFile(dirname(__FILE__) . '/Address.css');
}
/**
* @return string
*/
public function getName()
{
return 'address';
}
/**
* @return string
*/
public function getBody()
{
/* @var $User QUI\Users\User */
$User = QUI::getUserBySession();
$Engine = QUI::getTemplateManager()->getEngine();
if (isset($_REQUEST['edit'])) {
try {
return $this->getBodyForEdit();
} catch (QUI\Exception $Exception) {
}
}
if (isset($_REQUEST['editSave'])) {
try {
$this->edit();
} catch (QUI\Exception $Exception) {
}
}
if (isset($_REQUEST['delete'])) {
try {
return $this->getBodyForDelete();
} catch (QUI\Exception $Exception) {
}
}
if (isset($_REQUEST['executeDeletion'])) {
try {
$this->delete();
} catch (QUI\Exception $Exception) {
}
}
$Orders = Handler::getInstance();
$Order = $Orders->getOrderInProcess($this->getAttribute('orderId'));
$Customer = $Order->getCustomer();
$Address = $Customer->getAddress();
/* @var $User QUI\Users\User */
$User = QUI::getUserBySession();
$UserAddress = null;
$addresses = array();
$selectedAddressId = '';
try {
$UserAddress = $User->getStandardAddress();
$UserAddress = $User->getStandardAddress();
$selectedAddressId = $UserAddress->getId();
} catch (QUI\Exception $Exception) {
}
......@@ -57,24 +97,213 @@ public function getBody()
} catch (QUI\Exception $Exception) {
}
// current order address, is a address was already selected
$CurrentAddress = $Order->getInvoiceAddress();
if ($CurrentAddress->getId()) {
$selectedAddressId = $CurrentAddress->getId();
}
if (!empty($selectedAddressId) && !empty($addresses)) {
// Look that the address really still exists
$found = array_filter($addresses, function ($Address) use ($selectedAddressId) {
/* @var $Address QUI\Users\Address */
return $Address->getId() == $selectedAddressId;
});
if (empty($found)) {
$selectedAddressId = $addresses[0]->getId();
}
}
$Engine->assign(array(
'this' => $this,
'User' => $User,
'UserAddress' => $UserAddress,
'addresses' => $addresses,
'Customer' => $Customer,
'Address' => $Address,
'Customer' => $Customer,
'Address' => $Address
'selectedAddressId' => $selectedAddressId
));
return $Engine->fetch(dirname(__FILE__) . '/Address.html');
}
/**
* Return the body for a address edit
*
* @return string
*/
protected function getBodyForEdit()
{
$User = QUI::getUserBySession();
$Engine = QUI::getTemplateManager()->getEngine();
$Address = $User->getAddress((int)$_REQUEST['edit']);
$Engine->assign(array(
'this' => $this,
'Address' => $Address,
'countries' => QUI\Countries\Manager::getList()
));
return $Engine->fetch(dirname(__FILE__) . '/Address.Edit.html');
}
/**
* Return the body for a address deletion
*
* @return string
*/
protected function getBodyForDelete()
{
$User = QUI::getUserBySession();
$Engine = QUI::getTemplateManager()->getEngine();
$Address = $User->getAddress((int)$_REQUEST['delete']);
$Engine->assign(array(
'this' => $this,
'Address' => $Address
));
return $Engine->fetch(dirname(__FILE__) . '/Address.Delete.html');
}
/**
* Edit an address
*/
protected function edit()
{
if (!isset($_REQUEST['addressId']) || !isset($_REQUEST['editSave'])) {
return;
}
$User = QUI::getUserBySession();
$Address = $User->getAddress($_REQUEST['addressId']);
$fields = array(
'company',
'salutation',
'firstname',
'lastname',
'street_no',
'zip',
'city',
'country'
);
foreach ($fields as $field) {
if (isset($_REQUEST[$field])) {
$Address->setAttribute($field, $_REQUEST[$field]);
}
}
$Address->save();
}
/**
* Delete an address
*/
protected function delete()
{
if (!isset($_REQUEST['addressId']) || !isset($_REQUEST['executeDeletion'])) {
return;
}
$User = QUI::getUserBySession();
$Address = $User->getAddress($_REQUEST['addressId']);
$Address->delete();
}
/**
* Validate if the order has an invoice address
*
* @throws QUI\ERP\Order\Exception
*/
public function validate()
{
$User = QUI::getUserBySession();
$Order = $this->getOrder();
$Address = $Order->getInvoiceAddress();
$exception = array(
'quiqqer/order',
'exception.missing.address.field'
);
$firstName = $Address->getAttribute('firstname');
$lastName = $Address->getAttribute('lastname');
$street_no = $Address->getAttribute('street_no');
$zip = $Address->getAttribute('zip');
$city = $Address->getAttribute('city');
$country = $Address->getAttribute('country');
if (empty($firstName)) {
throw new QUI\ERP\Order\Exception($exception);
}
if (empty($lastName)) {
throw new QUI\ERP\Order\Exception($exception);
}
if (empty($street_no)) {
throw new QUI\ERP\Order\Exception($exception);
}
if (empty($zip)) {
throw new QUI\ERP\Order\Exception($exception);
}
if (empty($city)) {
throw new QUI\ERP\Order\Exception($exception);
}
if (empty($country)) {
throw new QUI\ERP\Order\Exception($exception);
}
}
/**
* Saves the selected address to the order
*/
public function save()
{
if (!isset($_REQUEST['address_invoice'])) {
return;
}
$addressId = (int)$_REQUEST['address_invoice'];
$User = QUI::getUserBySession();
$Order = $this->getOrder();
try {
$Address = $User->getAddress($addressId);
$Order->setInvoiceAddress(
json_decode($Address->toJSON(), true)
);
} catch (QUI\Exception $Exception) {
return;
}
$Order->save();
}
/**
* Should the next button be displayed?
*
* @return bool
*/
public function showNext()
{
if (isset($_REQUEST['edit'])) {
return false;
}
if (isset($_REQUEST['delete'])) {
return false;
}
return true;
}
}
......@@ -41,6 +41,14 @@ public function __construct($attributes = array())
$this->addCSSFile(dirname(__FILE__) . '/Basket.css');
}
/**
* @return string
*/
public function getName()
{
return 'basket';
}
/**
* @return QUI\ERP\Order\Basket\Basket
*/
......@@ -79,4 +87,10 @@ public function getBody()
return $Engine->fetch(dirname(__FILE__) . '/Basket.html');
}
public function save()
{
// TODO: Implement save() method.
}
}
......@@ -33,8 +33,20 @@ public function getBody()
return $Engine->fetch(dirname(__FILE__) . '/Checkout.html');
}
/**
* @return string
*/
public function getName()
{
return 'checkout';
}
public function validate()
{
// TODO: Implement validate() method.
}
public function save()
{
}
}
......@@ -32,8 +32,22 @@ public function getBody()
return $Engine->fetch(dirname(__FILE__) . '/Delivery.html');
}
/**
* @return string
*/
public function getName()
{
return 'delivery';
}
public function validate()
{
// TODO: Implement validate() method.
}
public function save()
{
// TODO: Implement save() method.
}
}
......@@ -32,6 +32,15 @@ public function getBody()
return $Engine->fetch(dirname(__FILE__) . '/Finish.html');
}
/**
* @return string
*/
public function getName()
{
return 'finish';
}
/**
* @throws QUI\ERP\Order\Exception
*/
......@@ -46,4 +55,9 @@ public function validate()
));
}
}
public function save()
{
// TODO: Implement save() method.
}
}
......@@ -3,6 +3,15 @@
width: 100%;
}
.quiqqer-order-ordering-error {
background: #F2D4CE;
border-color: #AE432E;
clear: both;
display: block;
padding: 10px;
width: 100%;
}
/** processing / time line
============================================*/
......
<div class="quiqqer-order-ordering-timeline">
<ul>
{assign var=cssClass value="active"}
{foreach $steps as $step => $Step}
<form name="order" action="{url site=$Site}" method="post">
<div class="quiqqer-order-ordering-timeline">
<ul>
{assign var=cssClass value="active"}
{foreach $steps as $step => $Step}
{if $CurrentStep == $Step}
{assign var=cssClass value="current"}
{assign var=cssClass value="current"}
{/if}
<li class="{$cssClass}">
<a href="{url site=$Site step=$step}">
......@@ -12,32 +13,40 @@
</a>
</li>
{if $CurrentStep == $Step}
{assign var=cssClass value=""}
{assign var=cssClass value=""}
{/if}
{/foreach}
</ul>
</div>
{/foreach}
</ul>
</div>
<div class="quiqqer-order-ordering-step">
{$CurrentStep->create()}
</div>
{if $error}
<div class="quiqqer-order-ordering-error">
{$error}
</div>
{/if}
<div class="quiqqer-order-ordering-buttons">
<a href="{url id=1}" class="button">Zurück zum Shop</a>
<div class="quiqqer-order-ordering-step">
{$CurrentStep->create()}
</div>
{if $previous}
<a href="{url site=$Site step=$previous}"
class="button quiqqer-order-ordering-buttons-previous"
>
Zurück
</a>
{/if}
<div class="quiqqer-order-ordering-buttons">
<a href="{url id=1}" class="button">Zurück zum Shop</a>
{if $next}
<a href="{url site=$Site step=$next}"
class="button quiqqer-order-ordering-buttons-next"
>
Weiter
</a>
{/if}
</div>
\ No newline at end of file
{if $previous}
<a href="{url site=$Site step=$previous pre=$CurrentStep->getName()}"
class="button quiqqer-order-ordering-buttons-previous"
>
{locale group="quiqqer/order" var="ordering.btn.previous"}
</a>
{/if}
{if $next}
<button name="step" value="{$next}" class="button quiqqer-order-ordering-buttons-next">
{locale group="quiqqer/order" var="ordering.btn.next"}
</button>
{/if}
</div>
<input type="hidden" name="pre" value="{$previous}"/>
<input type="hidden" name="current" value="{$CurrentStep->getName()}"/>
</form>
\ No newline at end of file
......@@ -46,12 +46,46 @@ public function __construct($attributes = array())
$this->setAttribute('step', $step);
}
if (!$step && isset($_REQUEST['current'])) {
$step = $_REQUEST['current'];
$this->setAttribute('step', $step);
}
if (!$step && isset($_REQUEST['current'])) {
$step = $_REQUEST['current'];
$this->setAttribute('step', $step);
}
if (!$step || !isset($steps[$step])) {
reset($steps);
$this->setAttribute('step', key($steps));
}
}
/**
* Checks the submit status
* Must the previous step be saved?
*/
protected function checkSubmission()
{
if (!isset($_REQUEST['current'])) {
return;
}
$preStep = $_REQUEST['current'];
$PreStep = $this->getNextStepByName($preStep);
if (!$PreStep) {
return;
}
try {
$PreStep->save();
} catch (QUI\Exception $Exception) {
}
}
/**
* @return string
*/
......@@ -59,15 +93,41 @@ public function getBody()
{
$Engine = QUI::getTemplateManager()->getEngine();
$Current = $this->getCurrentStep();
$next = $this->getNextStepName();
$steps = $this->getSteps();
$this->checkSubmission();
// check all previous steps
// is one is invalid, go to them
foreach ($steps as $name => $Step) {
if ($name === $Current->getName()) {
break;
}
/* @var $Step AbstractOrderingStep */
if ($Step->isValid() === false) {
$Current = $Step;
break;
}
}
$next = $this->getNextStepName($Current);
// @todo check all previous steps
if ($Current->isValid() === false) {
if ($Current->showNext() === false) {
$next = false;
}
$error = false;
try {
$Current->validate();
} catch (QUI\ERP\Order\Exception $Exception) {
$error = $Exception->getMessage();
}
$Engine->assign(array(
'this' => $this,
'error' => $error,
'CurrentStep' => $Current,
'Site' => $this->getSite(),
'next' => $next,
......@@ -81,13 +141,31 @@ public function getBody()
/**
* Return the current Step
*
* @return OrderingStepInterface
* @return AbstractOrderingStep
*/
public function getCurrentStep()
{
$steps = $this->getSteps();
$Current = $steps[$this->getCurrentStepName()];
return $Current;
}
/**
* Return the next step
*
* @param string $name - Name of the step
* @return bool|AbstractOrderingStep
*/
protected function getNextStepByName($name)
{
$steps = $this->getSteps();
return $steps[$this->getCurrentStepName()];
if (isset($steps[$name])) {
return $steps[$name];
}
return false;
}
/**
......@@ -111,11 +189,17 @@ protected function getCurrentStepName()
/**
* Return the next step
*
* @param null|AbstractOrderingStep $StartStep
* @return bool|string
*/
protected function getNextStepName()
protected function getNextStepName($StartStep = null)
{
$step = $this->getCurrentStepName();
if ($StartStep === null) {
$step = $this->getCurrentStepName();
} else {
$step = $StartStep->getName();
}
$steps = $this->getSteps();
$keys = array_keys($steps);
......@@ -162,7 +246,8 @@ public function getSite()
}
$Project = QUI::getRewrite()->getProject();
$sites = $Project->getSitesIds(array(
$sites = $Project->getSitesIds(array(
'where' => array(
'type' => 'quiqqer/order:types/orderingProcess',
'active' => 1
......@@ -225,13 +310,20 @@ protected function getSteps()
'Order' => $this->getOrder()
);
$Basket = new Basket($params);
$Address = new Address($params);
$Delivery = new Delivery($params);
$Payment = new Payment($params);
$Checkout = new Checkout($params);
$Finish = new Finish($params);
return array(
'basket' => new Basket($params),
'address' => new Address($params),
'delivery' => new Delivery($params),
'payment' => new Payment($params),
'checkout' => new Checkout($params),
'finish' => new Finish($params)
$Basket->getName() => $Basket,
$Address->getName() => $Address,
$Delivery->getName() => $Delivery,
$Payment->getName() => $Payment,
$Checkout->getName() => $Checkout,
$Finish->getName() => $Finish
);
}
}
......@@ -10,12 +10,20 @@
*/
interface OrderingStepInterface
{
/**
* Return the step name
*
* @return string
*/
public function getName();
/**
* @param null $Locale
* @return mixed
*/
public function getTitle($Locale = null);
/**
* @throws Exception
*/
......@@ -25,4 +33,11 @@ public function validate();
* @return bool
*/
public function isValid();
/**
* Save the values from the step into the processing order
*
* @return mixed
*/
public function save();
}
......@@ -3,30 +3,32 @@
<h1>{locale group="quiqqer/order" var="ordering.step.title.Payment"}</h1>
</header>
<form>
<div class="quiqqer-order-step-payments-list">
{foreach $payments as $Payment}
<div class="quiqqer-order-step-payments-list-entry">
<div class="quiqqer-order-step-payments-list-entry-select">
<input id="payment-{$Payment->getId()}"
type="radio"
name="payment"
value="{$Payment->getId()}"
/>
</div>
<div class="quiqqer-order-step-payments-list-entry-icon">
<img src="{$Payment->getPaymentType()->getIcon()}"/>
</div>
<div class="quiqqer-order-step-payments-list-entry-text">
<label for="payment-{$Payment->getId()}">
{$Payment->getTitle()}
</label>
<div class="quiqqer-order-step-payments-list-entry-text-description">
{$Payment->getDescription()}
</div>
<div class="quiqqer-order-step-payments-list">
{foreach $payments as $Payment}
<div class="quiqqer-order-step-payments-list-entry">
<div class="quiqqer-order-step-payments-list-entry-select">
<input id="payment-{$Payment->getId()}"
type="radio"
name="payment"
value="{$Payment->getId()}"
{if $SelectedPayment && $Payment->getId() === $SelectedPayment->getId()}
checked="checked"
{/if}
/>
</div>
<div class="quiqqer-order-step-payments-list-entry-icon">
<img src="{$Payment->getPaymentType()->getIcon()}"/>
</div>
<div class="quiqqer-order-step-payments-list-entry-text">
<label for="payment-{$Payment->getId()}">
{$Payment->getTitle()}
</label>
<div class="quiqqer-order-step-payments-list-entry-text-description">
{$Payment->getDescription()}
</div>
</div>
{/foreach}
</div>
</form>
{/foreach}
</div>
</section>
\ No newline at end of file
......@@ -28,6 +28,14 @@ public function __construct($attributes = array())
$this->addCSSFile(dirname(__FILE__) . '/Payment.css');
}
/**
* @return string
*/
public function getName()
{
return 'payment';
}
/**
* @return string
*/
......@@ -42,19 +50,55 @@ public function getBody()
$Payments = QUI\ERP\Accounting\Payments\Payments::getInstance();
$payments = $Payments->getUserPayments($User);
$Payment = $Order->getPayment();
$Engine->assign(array(
'User' => $User,
'Customer' => $Customer,
'payments' => $payments
'User' => $User,
'Customer' => $Customer,
'SelectedPayment' => $Payment,
'payments' => $payments
));
return $Engine->fetch(dirname(__FILE__) . '/Payment.html');
}
/**
* @throws QUI\ERP\Order\Exception
*/
public function validate()
{
// TODO: Implement validate() method.
$Order = $this->getOrder();
$Payment = $Order->getPayment();
if ($Payment === null) {
throw new QUI\ERP\Order\Exception(array(
'quiqqer/order',
'exception.missing.payment'
));
}
}
/**
* Save the payment to the order
*/
public function save()
{
if (!isset($_REQUEST['payment'])) {
return;
}
$User = QUI::getUserBySession();
$Order = $this->getOrder();
try {
$Payments = QUI\ERP\Accounting\Payments\Payments::getInstance();
$Payment = $Payments->getPayment($_REQUEST['payment']);
$Payment->canUsedBy($User);
} catch (QUI\ERP\Accounting\Payments\Exception $Payments) {
return;
}
$Order->setPayment($Payment->getId());
$Order->save();
}
}
......@@ -86,7 +86,7 @@ public function getOrderData($orderId)
*/
public function tableOrderProcess()
{
return QUI::getDBTableName('ordersProcess');
return QUI::getDBTableName('orders_process');
}
/**
......
0% Lade oder .
You are about to add 0 people to the discussion. Proceed with caution.
Bearbeitung dieser Nachricht zuerst beenden!
Bitte registrieren oder zum Kommentieren