* @version 0.0.0
* @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
* @license GNU GPL 3.0 or any newer version
* @link http://www.ship-simu.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
class WorksContract extends BaseFrameworkSystem implements SignableContract {
// Zukuenftiger Schiffsname
private $shipName = "";
// Instanz zum Schiffstypen
private $shipInstance = null;
// Contract partner
private $contractPartner = null;
// Other contract partner
private $contractParty = null;
// Is the contract signed?
private $signed = false;
// Merchant instance
private $merchantInstance = null;
// Konstruktor
private function __construct () {
// Call parent constructor
parent::constructor(__CLASS__);
// Debug message
if (((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) && (defined('DEBUG_CONSTRUCT'))) {
$this->getDebugInstance()->output(sprintf("[%s:%d] Konstruktor erreicht.
\n",
__CLASS__,
__LINE__
));
}
// Set description
$this->setPartDescr("Bauvertrag");
// Unique-ID generieren
$this->createUniqueID();
// Clean up a little
$this->removeSystemArray();
}
// Neuen Bauvertrag generieren
public final static function createWorksContract ($shipType, $shipName, ContractPartner $partnerInstance) {
// Strings absichern
$shipType = (string) $shipType;
$shipName = (string) $shipName;
// Is the other one a contract partner?
if (is_null($partnerInstance)) {
// Opps! Empty partner instance?
throw new NullPointerException($partnerInstance, self::EXCEPTION_IS_NULL_POINTER);
} elseif (!is_object($partnerInstance)) {
// Not an object! ;-(
throw new NoObjectException($partnerInstance, self::EXCEPTION_IS_NO_OBJECT);
} elseif (!method_exists($partnerInstance, 'isContractPartner')) {
// Does not have the required feature (method)
throw new MissingMethodException(array($partnerInstance, 'isContractPartner'), self::EXCEPTION_MISSING_METHOD);
}
// Get new instance
$contractInstance = new WorksContract();
// Debug-Meldung ausgeben
if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) $contractInstance->getDebugInstance()->output(sprintf("[%s:%d] Neuer Bauvertrag wird für das Schiff %s mit der %s %s erstellt.
\n",
__CLASS__,
__LINE__,
$shipName,
$partnerInstance->getPartDescr(),
$partnerInstance->getCompanyName()
));
// Schiffsnamen setzen
$contractInstance->setShipName($shipName);
// Existiert die Klasse ueberhaupt?
if (!class_exists($shipType)) {
// Klasse nicht gefunden
throw new ClassNotFoundException ($shipType, 0);
}
// Schiff-Instanz temporaer erzeugen und in den Bauvertrag einfuegen
$eval = sprintf("\$contractInstance->setShipInstance(%s::create%s(\"%s\"));",
$shipType,
$shipType,
$shipName
);
// Debug message
if ((defined('DEBUG_EVAL')) || (defined('DEBUG_ALL'))) $contractInstance->getDebugInstance()->output(sprintf("[%s:%d] Konstruierte PHP-Anweisung:
%s
\n",
__CLASS__,
__LINE__,
htmlentities($eval)
));
// Execute constructed command
@eval($eval);
// Set itself as contract partner
$contractInstance->setContractPartner($partnerInstance);
// Instanz zurueckgeben
return $contractInstance;
}
// Setter for ship instance
private final function setShipInstance (ConstructableShip $shipInstance) {
if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Das Schiff %s wird in den Bauvertrag aufgenommen.
\n",
__CLASS__,
__LINE__,
$shipInstance->getShipName()
));
$this->shipInstance = $shipInstance;
}
// Setter for ship name
private final function setShipName ($shipName) {
if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Das neue Schiff wird %s heissen.
\n",
__CLASS__,
__LINE__,
$shipName
));
$this->shipName = (string) $shipName;
}
// Getter for ship name
public final function getShipName () {
if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Schiffsname %s angefordert.
\n",
__CLASS__,
__LINE__,
$this->shipName
));
return $this->shipName;
}
// Getter for ship instance
public final function getShipInstance () {
if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Schiff-Instanz angefordert.
\n",
__CLASS__,
__LINE__
));
return $this->shipInstance;
}
// Add detail to the contract
public function addContractDetails ($shipPart, $parentPart, array $dataArray) {
// Secure strings
$shipPart = (string) $shipPart;
$parentPart = (string) $parentPart;
// Debug message
if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Das Schiffsteil %s wird zusammen mit dem Konstruktionsteil %s in den Bauvertrag aufgenommen.
\n",
__CLASS__,
__LINE__,
$shipPart,
$parentPart
));
// Initialize the instance (shall not be done within dynamic part)
$instance = null;
// Prepare the big command for everthing
$eval = "try {
\$instance = ".$shipPart."::create".$shipPart."(";
foreach ($dataArray as $pIdx => $parts) {
if (is_string($parts)) {
// String einbauen
$eval .= "\"".$parts."\", ";
} elseif (is_array($parts)) {
// Ist ein weiteres Array!
$eval .= "array(";
foreach ($parts as $idx2 => $sub) {
$eval .= "'".$idx2."' => ";
if (is_string($sub)) {
// Ist erneut ein String
$eval .= "\"".$sub."\"";
} elseif (is_array($sub)) {
// Wird nicht mehr unterstuetzt!
ApplicationEntryPoint::app_die("No more arrays!");
} else {
// Direkt anhaengen
$eval .= $sub;
}
$eval .= ", ";
}
// Letztes Komma entfernen
$eval = substr($eval, 0, -2);
$eval .= "), ";
} else {
// Etwas anderes direkt!
$eval .= $parts.", ";
}
}
// Letztes Komma abhaengen
$eval = substr($eval, 0, -2);
$eval .= ");
} catch (DimNotFoundInArrayException \$e) {
\$this->getDebugInstance()->output(sprintf(\"[main:] Die %s konnte nicht vervollständigt werden. Grund: %s
\\n\",
\$this->getShipInstance()->getShipName(),
\$e->getMessage()
));
\$instance = null;
}";
// Debug message
if ((defined('DEBUG_EVAL')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[Ship:] Konstruierte PHP-Anweisung: %s
\n",
htmlentities($eval)
));
// Code ausfuhren
@eval($eval);
// Try to add the ship part to the contract
try {
if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Versuche ein Schiffsteil in den Bauvertrag aufzunehmen.
\n",
__CLASS__,
__LINE__
));
if (!$instance instanceof ConstructableShipPart) {
// Ship part not constructable!
throw new ShipPartNotConstructableException(array($shipPart), self::EXCEPTION_NOT_CONSTRUCTABLE);
} elseif (!$this->getShipInstance()->createShipPart($instance, $parentPart)) {
// Schiff konnte nicht gebaut werden!
throw new ShipNotConstructedException(sprintf("Das Schiff %s konnte wegen eines Fehlers nicht gebaut werden. Siehe obere Meldungen.",
$this->getShipInstance()->getShipName()
));
}
} catch(ClassNotFoundException $e) {
// Throw it again...
throw new ClassNotFoundException($e->getMessage(), $e->getCode());
}
// Get price for this item
$price = $this->getMerchantInstance()->getPriceFromList($instance);
// Final debug message
if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] %s kostet %s.
\n",
__CLASS__,
__LINE__,
$instance->getPartDescr(),
$this->getMerchantInstance()->formatCurrency($price)
));
// Add price
$instance->setPrice($price);
// Final debug message
if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] %s wurde in den Bauvertrag aufgenommen.
\n",
__CLASS__,
__LINE__,
$instance->getPartDescr()
));
}
// Setter for contract partner
public final function setContractPartner (ContractPartner $partnerInstance) {
$this->contractPartner = $partnerInstance;
}
// Getter for contract partner
public final function getContractPartner () {
return $this->contractPartner;
}
// Setter for contract party
public final function setContractParty (ContractPartner $partyInstance) {
$this->contractParty = $partyInstance;
}
// Getter for contract party
public final function getContractParty () {
return $this->contractParty;
}
// Setter for signature
public final function setSigned ($signed) {
$this->signed = (boolean) $signed;
}
// Getter for signature
public function isSigned () {
return $this->signed;
}
// Sign the contract
public function signContract (ContractPartner $partnerInstance, ContractPartner $partyInstance) {
// Is this contract already signed?
if ($this->isSigned()) {
// Throw an exception
throw new ContractAllreadySignedException(array($this, $this->getContractPartner(), $this->getContractParty()), self::EXCEPTION_CONTRACT_ALREADY_SIGNED);
}
// Is the first contract partner still the same?
if ($partnerInstance->equals($this->getContractPartner())) {
// Set contract party (other partner is already set)
$this->setContractParty($partyInstance);
// Finally sign it
$this->setSigned(true);
} else {
// Throw an exception
throw new ContractPartnerMismatchException(array($this, $this->getContractPartner(), $partyInstance), self::EXCEPTION_CONTRACT_PARTNER_MISMATCH);
}
// Debug message
if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) {
if ($partnerInstance->equals($partyInstance)) {
// With itself
$this->getDebugInstance()->output(sprintf("[%s:%d] Die %s %s stimmt einem Bauvertrag über das %s %s zu.
\n",
__CLASS__,
__LINE__,
$partnerInstance->getPartDescr(),
$partnerInstance->getCompanyName(),
$this->getShipInstance()->getPartDescr(),
$this->getShipInstance()->getShipName()
));
} else {
// Other contract party
$this->getDebugInstance()->output(sprintf("[%s:%d] Die %s %s geht mit der %s %s einen Bauvertrag über das %s %s ein.
\n",
__CLASS__,
__LINE__,
$partnerInstance->getPartDescr(),
$partnerInstance->getCompanyName(),
$partyInstance->getPartDescr(),
$partyInstance->getCompanyName(),
$this->getShipInstance()->getPartDescr(),
$this->getShipInstance()->getShipName()
));
}
}
}
// Setter for merchant instance
public final function setMerchantInstance (Merchant $merchantInstance) {
$this->merchantInstance = $merchantInstance;
}
// Getter for merchant instance
public final function getMerchantInstance () {
return $this->merchantInstance;
}
// Getter for total price
public final function getTotalPrice () {
// Get ship instance
$shipInstance = $this->getShipInstance();
// Is this a ship?
if (is_null($shipInstance)) {
// Opps! Empty partner instance?
throw new NullPointerException($shipInstance, self::EXCEPTION_IS_NULL_POINTER);
} elseif (!is_object($shipInstance)) {
// Not an object! ;-(
throw new NoObjectException($shipInstance, self::EXCEPTION_IS_NO_OBJECT);
} elseif (!$shipInstance instanceof ConstructableShip) {
// Does not have the required feature (method)
throw new ShipIsInvalidException(array($shipInstance), self::EXCEPTION_INVALID_SHIP_INSTANCE);
}
// Get the structure array
$struct = $shipInstance->getStructuresArray();
// Is this a ship?
if (is_null($struct)) {
// Opps! Empty partner instance?
throw new EmptyStructuresListException($this, self::EXCEPTION_EMPTY_STRUCTURES_ARRAY);
}
// Init total price
$totalPrice = 0;
// Iterate through the list
for ($iter = $struct->getIterator(); $iter->valid(); $iter->next()) {
// Get item
$item = $iter->current();
// Is this a ship?
if (is_null($item)) {
// Opps! Empty partner instance?
throw new NullPointerException($item, self::EXCEPTION_IS_NULL_POINTER);
} elseif (!is_object($item)) {
// Not an object! ;-(
throw new NoObjectException($item, self::EXCEPTION_IS_NO_OBJECT);
} elseif (!method_exists($item, 'getPartInstance')) {
// Does not have the required feature (method)
throw new MissingMethodException(array($item, 'getPartInstance'), self::EXCEPTION_MISSING_METHOD);
}
// Get part instance
$part = $item->getPartInstance();
// Is this a ship?
if (is_null($part)) {
// Opps! Empty partner instance?
throw new NullPointerException($part, self::EXCEPTION_IS_NULL_POINTER);
} elseif (!is_object($part)) {
// Not an object! ;-(
throw new NoObjectException($part, self::EXCEPTION_IS_NO_OBJECT);
} elseif (!method_exists($part, 'getPrice')) {
// Does not have the required feature (method)
throw new MissingMethodException(array($part, 'getPrice'), self::EXCEPTION_MISSING_METHOD);
}
// Get price for one item
$price = $part->getPrice();
// Is there numCabin() available?
if (method_exists($item, 'getNumCabin')) {
// Get total cabin and multiply it with the price
$price = $price * $item->getNumCabin();
}
// Add price to total price
$totalPrice += $price;
}
// Total price calculated?
if ($totalPrice === 0) {
// Throw exception
throw new TotalPriceNotCalculatedException($this, self::EXCEPTION_TOTAL_PRICE_NOT_CALCULATED);
}
// Return total price
return $totalPrice;
}
/**
* Stub!
*/
public function saveObjectToDatabase () {
$this->getDebugInstance()->output(sprintf("[%s:] Stub %s erreicht.",
$this->__toString(),
__FUNCTION__
));
}
}
// [EOF]
?>