More conventions than code added:
[shipsimu.git] / application / ship-simu / main / class_Merchant.php
1 <?php
2 /**
3  * A class for merchants which can trade items
4  *
5  * @author              Roland Haeder <webmaster@ship-simu.org>
6  * @version             0.0.0
7  * @copyright   Copyright (c) 2007, 2008 Roland Haeder, this is free software
8  * @license             GNU GPL 3.0 or any newer version
9  * @link                http://www.ship-simu.org
10  *
11  * This program is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation, either version 3 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program. If not, see <http://www.gnu.org/licenses/>.
23  */
24 class Merchant extends BaseFrameworkSystem {
25         // Name des Haendlers
26         private $merchantName   = "Namenloser H&auml;ndler";
27
28         // Preislite (Objekte wiedermal!)
29         private $priceList      = null;
30
31         // Zugewiesener Hafen
32         private $harborInstance = null;
33
34         // Konstruktor
35         protected function __construct () {
36                 // Call parent constructor
37                 parent::__construct(__CLASS__);
38
39                 // Set description
40                 $this->setObjectDescription("H&auml;ndler");
41
42                 // Generate unique ID number
43                 $this->generateUniqueId();
44
45                 // Clean up a little
46                 $this->removeSystemArray();
47         }
48
49         // Haendler mit Namen erzeugen
50         public final static function createMerchant ($merchantName, Harbor $harborInstance) {
51                 // String absichern
52                 $merchantName = (string) $merchantName;
53
54                 // Get new instance
55                 $merchantInstance = new Merchant();
56
57                 // Debug message
58                 if ((defined('DEBUG_MERCHANT')) || (defined('DEBUG_ALL'))) {
59                         $merchantInstance->getDebugInstance()->output(sprintf("[%s:%d] Ein H&auml;ndler <strong>%s</strong> wird angelegt und soll sich am <strong>%s</strong> niederlassen.",
60                                 __CLASS__,
61                                 __LINE__,
62                                 $merchantName,
63                                 $harborInstance->getHarborName()
64                         ));
65                 }
66
67                 // Haendlernamen setzen
68                 $merchantInstance->setMerchantName($merchantName);
69
70                 // In dem angegebenen Hafen den Haendler ansiedeln
71                 $merchantInstance->setHarborInstance($harborInstance);
72
73                 // Preisliste initialisieren
74                 $merchantInstance->createPriceList();
75
76                 // Instanz zurueckliefern
77                 return $merchantInstance;
78         }
79
80         // Initialize pricing list
81         private function createPriceList () {
82                 $this->priceList = new FrameworkArrayObject("FakedPriceList");
83         }
84
85         // Setter for merchant name
86         public final function setMerchantName ($merchantName) {
87                 // Debug message
88                 $this->merchantName = (string) $merchantName;
89         }
90
91         // Getter for merchant name
92         public final function getMerchantName () {
93                 return $this->merchantName;
94         }
95
96         // Setter for harbor instance
97         public final function setHarborInstance (Harbor $harborInstance) {
98                 $this->harborInstance = $harborInstance;
99         }
100
101         // Getter for harbor instance
102         public final function getHarborInstance () {
103                 return $this->harborInstance;
104         }
105
106         // Add new item to merchant's price list
107         public function addItemToPriceList (TradeableItem $itemInstance, $price) {
108                 // Secure pricing
109                 $price = (float) $price;
110
111                 // Debug message
112                 if ((defined('DEBUG_MERCHANT')) || (defined('DEBUG_ALL'))) $this->getDebugInstance()->output(sprintf("[%s:%d] Der H&auml;ndler <strong>%s</strong> kann nun das Schiffsteil <strong>%s</strong> &quot;<strong>%s</strong>&quot; zu <strong>%s</strong> verkaufen.",
113                         __CLASS__,
114                         __LINE__,
115                         $this->getMerchantName(),
116                         $itemInstance->__toString(),
117                         $itemInstance->getObjectDescription(),
118                         $this->formatCurrency($price)
119                 ));
120
121                 // Construct pricing item and add it to the list
122                 $this->priceList->append(array(
123                         'item'  => $itemInstance,
124                         'price' => $price
125                 ));
126
127                 // Remove price attribute
128                 $itemInstance->removePrice();
129         }
130
131         // Get a price from the merchant's list
132         public final function getPriceFromList (TradeableItem $itemInstance) {
133                 $price = 0;
134
135                 // Iterate throw whole list
136                 for ($iter = $this->priceList->getIterator(); $iter->valid(); $iter->next()) {
137                         // Get current item
138                         $item = $iter->current();
139
140                         // Does this item match? The unique ID may not work...
141                         if ($item['item']->itemMatches($itemInstance)) {
142                                 // Extract price and stop searching
143                                 $price = $item['price'];
144                                 break;
145                         }
146                 }
147
148                 // Was the item found?
149                 if ($price === 0) {
150                         // Throw exception
151                         throw new ItemNotInPriceListException($itemInstance, self::EXCEPTION_ITEM_NOT_IN_PRICE_LIST);
152                 }
153
154                 // Return price
155                 return $price;
156         }
157 }
158
159 // [EOF]
160 ?>