<?php
// odwołaj się do biblioteki PEAR o nazwie Mail (obsługa poczty)
require_once 'Mail.php';
// Główna klasa, wykorzystywana do uzyskiwania informacji o zamówieniach,
// wykonywania poszczególnych etapów tunelu, kontrolowania stanu realizacji zamówi
eń, itd.
class OrderProcessor
{
public $mOrderId;
public $mOrderStatus;
public $mConnection;
public $mConfiguration;
public $mContinueNow;
private $mCurrentCustomer;
private $mCurrentOrderDetails;
private $mOrderManager;
private $mReference;
private $mAuthCode;
// konstruktor tworzy egzemplarz klasy DoOrderManager
function __construct()
{
$this->mOrderManager = new DoOrderManager();
}
// Funkcja Process wywoływana jest ze stron checkout.php i orders_admin.php
// w celu przetworzenia zamówienia. Jej pierwszym parametrem jest ID zamówienia,
// a drugim egzemplarz klasy OrderProcessorConfiguration.
public function Process($newOrderId, $newConfiguration)
{
// ustaw ID zamówienia
$this->mOrderId = $newOrderId;
// skonfiguruj klasę koordynującą
$this->mConfiguration = $newConfiguration;
$this->mContinueNow = true;
// zapamiętaj rozpoczęcie przetwarzania
$this->AddAudit("Uruchomiono klasę koordynującą.", 10000);
// sprawdĽ stan zamówienia
$this->mOrderStatus = $this->mOrderManager->GetOrderStatus($this->mOrderId);
// przetwórz odcinek tunelu
try
{
while ($this->mContinueNow)
{
$this->mContinueNow = false;
$cps = $this->GetCurrentPipelineSection();
$cps->Process($this);
}
}
catch(Exception $e)
{
$e->getFile() . " w wierszu " . $e->getLine());
$this->MailAdmin("Przy przetwarzaniu zamówienia wystąpił błąd.", $e->getMessage());
$this->AddAudit("Przy przetwarzaniu zamówienia wystąpił błąd.", 10002);
throw new Exception("błąd klasy koordynującej");
}
$this->AddAudit("Klasa koordynująca zakończyła działanie.", 10001);
}
// pobiera aktualny odcinek tunelu
private function GetCurrentPipelineSection()
{
switch ($this->mOrderStatus)
{
case 0:
$this->mCurrentPipelineSection = new PsInitialNotification(); break;
case 1:
$this->mCurrentPipelineSection = new PsCheckFunds(); break;
case 2:
$this->mCurrentPipelineSection = new PsCheckStock(); break;
case 3:
$this->mCurrentPipelineSection = new PsStockOk(); break;
case 4:
$this->mCurrentPipelineSection = new PsTakePayment(); break;
case 5:
$this->mCurrentPipelineSection = new PsShipGoods(); break;
case 6:
$this->mCurrentPipelineSection = new PsShipOK(); break;
case 7:
$this->mCurrentPipelineSection = new PsFinalNotification(); break;
case 8:
throw new Exception("Zamówienie zostało już zrealizowane."); break;
default:
throw new Exception("Nieznany etap przetwarzania zamówienia.");
}
}
// wysyła wiadomośści e-mail
public function Mail($params, $to, $headers, $message) {
// Utwórz obiekt obsługi poczty za pomocą metody Mail::factory
$mail_object = Mail::factory('smtp', $params); // SprawdĽź, czy obiekt obsługi poczty jest poprawny
if (PEAR::isError($mail_object))
throw new Exception($mail_object->getMessage());
// wysyła e-mail
$result = $mail_object->send($to, $headers, $message);
// SprawdĽ, czy wysłanie wiadomości się powiodło
if (PEAR::isError($result))
throw new Exception("Nie można wysłać wiadomośści do $to. " .
$result->getMessage());
}
// tworzy wiadomość
public function MailAdmin($subject, $message)
{
// zazwyczaj nie można ustawić własnego nagłówka 'From'
$headers['From'] = $this->mConfiguration->mOrderProcessorEmail;
$headers['Subject'] = $subject;
$headers['To'] = $this->mConfiguration->mAdminEmail;
$this->Mail($this->mConfiguration->mOrderProcessorEmailParams,
$this->mConfiguration->mAdminEmail,
$headers,
$message);
}
// pobiera klienta, który złożył zamówienie
public function GetCurrentCustomer()
{
if (empty($this->mCurrentCustomer)) {
$this->mCurrentCustomer = new
Customer($this->mOrderManager->GetCustomerByOrderId($this->mOrderId));
if (empty($this->mCurrentCustomer)) throw new Exception($this->mOrderId . " zamówienie nie jest skojarzone z żadnym klientem");
}
return $this->mCurrentCustomer;
}
// pobiera szczegółowe informacje na temat bieżącego zamówienia
public function GetCurrentOrderDetails()
{
if (empty($this->mCurrentOrderDetails)) {
$this->mCurrentOrderDetails = new
OrderDetails($this->mOrderManager->GetOrderDetails($this->mOrderId));
if (empty($this->mCurrentOrderDetails)) throw new Exception($this->mOrderId .
" nie ma wpisu ze szczegółowymi danymi zamówienia");
}
return $this->mCurrentOrderDetails;
}
// dodaje komunikat kontrolny
public function AddAudit($message, $messageNumber)
{
$this->mOrderManager->AddAudit($this->mOrderId, $message, $messageNumber);
}
// uaktualnia stan zamówienia
public function UpdateOrderStatus($newStatus)
{
$this->mOrderManager->UpdateOrderStatus($this->mOrderId, $newStatus);
$this->mOrderStatus = $newStatus;
}
// ustaw kod autoryzacyjny i referencyjny zamówienia
public function SetOrderAuthCodeAndReference($newAuthCode, $newReference)
{
$this->mOrderManager->SetOrderAuthCodeAndReference($this->mOrderId,
$newAuthCode,
$newReference);
$this->mAuthCode = $newAuthCode;
$this->mReference = $newReference;
}
// pobiera kod autoryzacyjny i referencyjny zamówienia
private function GetOrderAuthCodeAndReference()
{
$result = $this->mOrderManager->GetOrderAuthCodeAndReference(
$this->mOrderId);
if (empty($result)) throw Exception
($this->mOrderId." nie istnieje"); $this->mAuthCode = $result['auth_code'];
$this->mReference = $result['reference'];
}
// pobiera kod autoryzacyjny zamówienia
public function GetAuthCode()
{
if (empty($this->mAuthCode)) $this->GetOrderAuthCodeAndReference(); return $this->mAuthCode;
}
// pobiera kod referencyjny zamówienia
public function GetReference()
{
if (empty($this->mReference)) $this->GetOrderAuthCodeAndReference(); return $this->mReference;
}
// ustaw datę wysyłki
public function SetDateShipped()
{
$this->mOrderManager->SetDateShipped($this->mOrderId);
}
}
?>