* @version 0.0.0
* @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Ship-Simu Developer Team
* @license GNU GPL 3.0 or any newer version
* @link http://www.shipsimu.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
protected function __construct () {
// Call parent constructor
parent::__construct(__CLASS__);
}
// Neuen Bauvertrag generieren
public static final function createWorksContract ($shipType, $shipName, ContractPartner $partnerInstance) {
// Strings absichern
$shipType = (string) $shipType;
$shipName = (string) $shipName;
// Get new instance
$contractInstance = new WorksContract();
// Schiffsnamen setzen
$contractInstance->setShipName($shipName);
// Existiert die Klasse ueberhaupt?
if (!class_exists($shipType)) {
// Klasse nicht gefunden
throw new NoClassException ($shipType, self::EXCEPTION_CLASS_NOT_FOUND);
}
// Schiff-Instanz temporaer erzeugen und in den Bauvertrag einfuegen
$shipInstance = ObjectFactory::createObjectByName($shipType, array($shipName));
$contractInstance->setShipInstance($shipInstance);
// Remove the ship instance
unset($shipInstance);
// Set itself as contract partner
$contractInstance->setContractPartner($partnerInstance);
// Instanz zurueckgeben
return $contractInstance;
}
// Setter for ship instance
private final function setShipInstance (ConstructableShip $shipInstance) {
$this->shipInstance = $shipInstance;
}
// Setter for ship name
private final function setShipName ($shipName) {
$this->shipName = (string) $shipName;
}
// Getter for ship name
public final function getShipName () {
return $this->shipName;
}
// Getter for ship instance
public final function getShipInstance () {
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->debugOutput(sprintf("[%s:%d] Das Schiffsteil %s wird zusammen mit dem Konstruktionsteil %s in den Bauvertrag aufgenommen.",
__CLASS__,
__LINE__,
$shipPart,
$parentPart
));
// Initialize the instance (shall not be done within dynamic part)
$partInstance = null;
// Try to get an instance for this ship part
try {
$partInstance = ObjectFactory::createObjectByName($shipPart, $dataArray);
} catch (DimNotFoundInArrayException $e) {
$this->debugOutput(sprintf("[main:] Die %s konnte nicht vervollständigt werden. Grund: %s
",
$this->getShipInstance()->getShipName(),
$e->getMessage()
));
// Debug message
if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) $this->debugOutput(sprintf("[%s:%d] Versuche ein Schiffsteil in den Bauvertrag aufzunehmen.",
__CLASS__,
__LINE__
));
// Is this ship part constructable?
if (!$partInstance instanceof ConstructableShipPart) {
// Ship part not constructable!
throw new ShipPartNotConstructableException(array($shipPart), self::EXCEPTION_NOT_CONSTRUCTABLE);
} elseif ($this->getShipInstance()->createShipPart($partInstance, $parentPart) === false) {
// 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 (NoClassException $e) {
// Throw it again...
throw new NoClassException($e->getMessage(), $e->getCode());
}
// Get price for this item
$price = $this->getMerchantInstance()->getPriceFromList($partInstance);
// Add price
$partInstance->setPrice($price);
}
// 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->debugOutput(sprintf("[%s:%d] Die %s %s stimmt einem Bauvertrag über das %s %s zu.",
__CLASS__,
__LINE__,
$partnerInstance->getObjectDescription(),
$partnerInstance->getCompanyName(),
$this->getShipInstance()->getObjectDescription(),
$this->getShipInstance()->getShipName()
));
} else {
// Other contract party
$this->debugOutput(sprintf("[%s:%d] Die %s %s geht mit der %s %s einen Bauvertrag über das %s %s ein.",
__CLASS__,
__LINE__,
$partnerInstance->getObjectDescription(),
$partnerInstance->getCompanyName(),
$partyInstance->getObjectDescription(),
$partyInstance->getCompanyName(),
$this->getShipInstance()->getObjectDescription(),
$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 InvalidObjectException($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 InvalidObjectException($item, self::EXCEPTION_IS_NO_OBJECT);
} elseif (!$item instanceof BaseSimulator) {
// 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 InvalidObjectException($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;
}
}
// [EOF]
?>