+++ /dev/null
-<?php
-
-// Bauvertrag-Klasse
-class WorksContract extends BaseFrameworkSystem {
- // 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 () {
- // Eltern-Konstruktor aufrufen
- parent::constructor(__CLASS__);
-
- // Debug message
- if (((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) && (defined('DEBUG_CONSTRUCT'))) {
- $this->getDebugInstance()->output(sprintf("[%s:%d] Konstruktor erreicht.<br />\n",
- __CLASS__,
- __LINE__
- ));
- }
-
- // Beschreibung setzen
- $this->setPartDescr("Bauvertrag");
-
- // Unique-ID generieren
- $this->createUniqueID();
-
- // Clean up a little
- $this->removeSystemArray();
- }
-
- // Neuen Bauvertrag generieren
- public 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);
- }
-
- // Instanz holen
- $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 <strong>%s</strong> mit der <strong>%s</strong> <strong>%s</strong> erstellt.<br />\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: <pre><em>%s</em></pre><br />\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 function setShipInstance (ConstructableShip $shipInstance) {
- if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Das Schiff <strong>%s</strong> wird in den Bauvertrag aufgenommen.<br />\n",
- __CLASS__,
- __LINE__,
- $shipInstance->getShipName()
- ));
- $this->shipInstance = $shipInstance;
- }
-
- // Setter for ship name
- private function setShipName ($shipName) {
- if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Das neue Schiff wird <strong>%s</strong> heissen.<br />\n",
- __CLASS__,
- __LINE__,
- $shipName
- ));
- $this->shipName = (string) $shipName;
- }
-
- // Getter for ship name
- public function getShipName () {
- if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Schiffsname <strong>%s</strong> angefordert.<br />\n",
- __CLASS__,
- __LINE__,
- $this->shipName
- ));
- return $this->shipName;
- }
-
- // Getter for ship instance
- public function getShipInstance () {
- if ((defined('DEBUG_CONTRACT')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Schiff-Instanz angefordert.<br />\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 <strong>%s</strong> wird zusammen mit dem Konstruktionsteil <strong>%s</strong> in den Bauvertrag aufgenommen.<br />\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 <strong>%s</strong> konnte nicht vervollständigt werden. Grund: <strong>%s</strong><br />\\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: <pre><em>%s</em></pre><br />\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.<br />\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 <strong>%s</strong> 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] <strong>%s</strong> kostet <strong>%s</strong>.<br />\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] <strong>%s</strong> wurde in den Bauvertrag aufgenommen.<br />\n",
- __CLASS__,
- __LINE__,
- $instance->getPartDescr()
- ));
- }
-
- // Setter for contract partner
- public function setContractPartner (ContractPartner $partnerInstance) {
- $this->contractPartner = $partnerInstance;
- }
-
- // Getter for contract partner
- public function getContractPartner () {
- return $this->contractPartner;
- }
-
- // Setter for contract party
- public function setContractParty (ContractPartner $partyInstance) {
- $this->contractParty = $partyInstance;
- }
-
- // Getter for contract party
- public function getContractParty () {
- return $this->contractParty;
- }
-
- // Setter for signature
- public 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 <strong>%s</strong> <em><strong>%s</strong></em> stimmt einem Bauvertrag über das <strong>%s</strong> <em><strong>%s</strong></em> zu.<br />\n",
- __CLASS__,
- __LINE__,
- $partnerInstance->getPartDescr(),
- $partnerInstance->getCompanyName(),
- $this->getShipInstance()->getPartDescr(),
- $this->getShipInstance()->getShipName()
- ));
- } else {
- // Other contract party
- $this->getDebugInstance()->output(sprintf("[%s:%d] Die <strong>%s</strong> <em><strong>%s</strong></em> geht mit der <strong>%s</strong> <em><strong>%s</strong></em> einen Bauvertrag über das <strong>%s</strong> <em><strong>%s</strong></em> ein.<br />\n",
- __CLASS__,
- __LINE__,
- $partnerInstance->getPartDescr(),
- $partnerInstance->getCompanyName(),
- $partyInstance->getPartDescr(),
- $partyInstance->getCompanyName(),
- $this->getShipInstance()->getPartDescr(),
- $this->getShipInstance()->getShipName()
- ));
- }
- }
- }
-
- // Setter for merchant instance
- public function setMerchantInstance (Merchant $merchantInstance) {
- $this->merchantInstance = $merchantInstance;
- }
-
- // Getter for merchant instance
- public function getMerchantInstance () {
- return $this->merchantInstance;
- }
-
- // Getter for total price
- public 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 <strong>%s</strong> erreicht.",
- $this->__toString(),
- __FUNCTION__
- ));
- }
-}
-
-// [EOF]
-?>