Overview

Namespaces

  • App
    • Components
    • Interfaces
    • Lib
      • Files
      • Forms
        • Controls
      • Html
      • Repair
      • Statics
    • Model
    • Modules
      • BaseModule
        • Presenters
      • PartnersModule
        • Presenters
      • ProductModule
        • Presenters
      • SaleModule
        • Model
        • Presenters
      • SettingsModule
        • Model
        • Presenters
      • StoreModule
        • Model
        • Presenters
    • Presenters
    • Router
  • PHP

Classes

  • DateTime
  • SplFileInfo

Interfaces

  • ArrayAccess
  • Countable
  • Exception
  • Iterator
  • Traversable
  • Overview
  • Namespace
  • Class
  • Tree
  • Deprecated
  • Download
  1: <?php
  2: 
  3: /**
  4:  * Project sberp
  5:  *
  6:  * @file Move 
  7:  * @author Jaromír Polášek
  8:  * verze: 0.9.1.AFTERMATCH
  9:  * Encoding UTF-8
 10:  */
 11: 
 12: namespace App\Modules\StoreModule\Model;
 13: 
 14: use Nette\Object,
 15:     Nette\Database\Table\ActiveRow,
 16:     App\Model\Database,
 17:     App\Lib\Table,
 18:     App\Lib\Statics\Cons;
 19: 
 20: class Move extends Object {
 21: 
 22:     /**
 23:      * Deginice konstatnt produkt a sklad
 24:      */
 25:     const PRODUCT = 'product_id',
 26:         SOURCE = 'stock_source_id',
 27:         TARGET = 'stock_target_id',
 28:         STOCK = 'stock_id',
 29:         STORAGE = 'stock_storage',
 30:         MOVE = 'stock_move',
 31:         MASTER = 'master',
 32:         STATE = 'state',
 33:         QTY = 'qty';
 34: 
 35:     /** @var App\Model\Database */
 36:     private $database;
 37: 
 38:     /** @var \Nette\Database\Table */
 39:     private $move;
 40: 
 41:     /** @var array */
 42:     private $query = array();
 43: 
 44:     /** @var \Nette\Database\Table */
 45:     private $states;
 46: 
 47:     /** @var string pokud je někdo master? a kdo */
 48:     private $master;
 49: 
 50:     public function __construct(Database $database) {
 51:     $this->database = $database;
 52:     $this->move = new Table(self::MOVE, $database);
 53:     $this->states = new Table(self::STORAGE, $database);
 54:     }
 55: 
 56:     /**
 57:      * Získá data z přesunu pro další operace
 58:      * @param type $data
 59:      * @return boolean
 60:      */
 61:     public function prepareMove($data) {
 62:     if ($data[self::SOURCE] !== $data[self::TARGET]) {
 63:         $master = $this->getMaster();
 64:         if ($master[Cons::COLUMN_ID] === $data[self::TARGET]){
 65:         $this->master =$data[self::TARGET];
 66:         }else if ($master[Cons::COLUMN_ID] === $data[self::SOURCE]){
 67:         $this->master = $data[self::SOURCE];
 68:         }else{
 69:         $this->master = NULL;
 70:         }
 71:         
 72:         //$this->master = ($master[Cons::COLUMN_ID] === $data[self::TARGET]) ? $data[self::TARGET] : ($master[Cons::COLUMN_ID] === $data[self::SOURCE]) ? $data[self::SOURCE] : NULL;
 73:         $this->query = array(self::PRODUCT => $data[self::PRODUCT],
 74:         self::SOURCE => $data[self::SOURCE],
 75:         self::TARGET => $data[self::TARGET],
 76:         self::QTY => $data[self::QTY]
 77:         );
 78:         return TRUE;
 79:     } else {
 80:         return FALSE;
 81:     }
 82:     }
 83: 
 84:     /**
 85:      * Upraví stavy v pozměneých skladech
 86:      * @param integer $id ID pohybu zásob
 87:      */
 88:     public function processMove($id) {
 89:     $move = $this->getMove($id);
 90:     if ($move) {
 91:         $this->updateQty($this->query[self::QTY]);
 92:         if ($this->master !== NULL) {
 93:         $this->updateStockQty($this->query[self::PRODUCT], ($this->master === $this->query[self::TARGET]) ? $this->query[self::QTY] : -$this->query[self::QTY]);
 94:         }
 95:     }
 96:     }
 97: 
 98:     /**
 99:      * Ovšří zda se uživatel pokouří nastavit nový Hlavní sklad
100:      * @param arrayHash $data
101:      * @return \Nette\Database\TAble\ActiveRow|NULL
102:      */
103:     public function isNewMaster($data) {
104:     if (isset($data[self::MASTER]) && $data[self::MASTER] = TRUE) {
105:         return $this->getMaster();
106:     } else {
107:         return NULL;
108:     }
109:     }
110: 
111:     /**
112:      * Vrací hlavní sklad
113:      * @return boolean|ActiveRow
114:      */
115:     public function getMaster() {
116:     $master = (new Table(rtrim(self::STOCK, '_id'), $this->database))->data->where(self::MASTER . ' =?', '1')->fetch();
117:     if ($master instanceof ActiveRow) {
118:         return $master;
119:     } else {
120:         return FALSE;
121:     }
122:     }
123: 
124:     /**
125:      * Odtraní starého mastera
126:      * @return boolean odstaněno nebo neostraněno
127:      */
128:     public function removeMaster($master = NULL) {
129:     if ($master === NULL) {
130:         $master = $this->getMaster();
131:     }
132:     if ($master) {
133:         return $master->update(array(self::MASTER => FALSE));
134:     } else {
135:         return TRUE;
136:     }
137:     }
138:     
139:     /**
140:      * Přepíše množství při přesunu hlavního skladu
141:      */
142:     public function redirectMaster(){
143:     $master = $this->getMaster();
144:     $product = (new Table('product', $this->databases));
145:     $product->update(array(self::QTY => 0));
146:     foreach ($this->states as $item){
147:         if ($item[self::STOCK] == $master[Cons::COLUMN_ID]){
148:         $product->update($item[self::PRODUCT], array(self::QTY => $item[self::QTY]));
149:         } 
150:     }
151:     }
152:     /**
153:      * Získá řádek pohybu nebo vrátí false
154:      * @param type $id
155:      * @return Nette\Database\Table\IRow or FALSE
156:      */
157:     private function getMove($id) {
158:     return $this->move->findById($id);
159:     }
160: 
161:     /**
162:      * aktualizuje sklady
163:      * @param int $qty
164:      */
165:     private function updateQty($qty) {
166:     $this->addQty($this->query[self::SOURCE], -$qty);
167:     $this->addQty($this->query[self::TARGET], $qty);
168:     }
169: 
170:     /**
171:      * Aktualizuje množství produktu
172:      * @param int $id ID produktu
173:      * @param int $qty Množství produktu
174:      * @return boolean
175:      */
176:     private function updateStockQty($id, $qty) {
177:     $product = new Table('product', $this->database);
178:     return ($product->findById($id)->update(array('qty' => $qty)));
179:     }
180: 
181:     /**
182:      * Vrátí záznam požadovaného výrobeku v požadovaném skladu
183:      * @param int $stock id skladu
184:      * @return \Nette\Database\Table\ActiveRow
185:      */
186:     private function getStock($stock) {
187:     $source = $this->states->copy->where(self::PRODUCT . '  ?', $this->query[self::PRODUCT])
188:         ->where($stock . '  ?', $this->query[self::TARGET]);
189:     if (count($source) > 1) {
190:         $source = $this->merge($source);
191:     } else {
192:         $source->fetch();
193:     }
194:     if ($source instanceof \Nette\Database\Table\ActiveRow) {
195:         return $source;
196:     } else {
197:         return FALSE;
198:     }
199:     }
200: 
201:     /**
202:      * Sloučí (nemožné) duplikace v tabulce, tím že je sečte
203:      * @param \Nette\Database\Table\Selection $source
204:      * @return \Nette\Database\Table\ActiveRow
205:      */
206:     private function merge(\Nette\Database\Table\Selection $source) {
207:     $qty = 0;
208:     foreach ($source as $item) {
209:         $product = $item[self::PRODUCT];
210:         $stock = $item[self::STOCK];
211:         $qty += $item[self::QTY];
212:         $item->delete($item[Cons::COLUMN_ID]);
213:     }
214:     return $this->states->insert(array(
215:             self::PRODUCT => $product,
216:             self::STOCK => $stock,
217:             self::QTY => $qty
218:     ));
219:     }
220: 
221:     /**
222:      * Aktualizuje stav skladu
223:      * @param type $stock
224:      * @param type $qty
225:      * @return type
226:      */
227:     private function addQty($stock, $qty) {
228:     $source = $this->getStock($stock);
229:     if ($qty < 0 && $stock['Virtuální']){
230:         $qty = -$qty;
231:     }
232:     if ($source) {
233:         $source->update(array(
234:         self::QTY => $source[self::QTY] + $qty
235:         ));
236:     } else {
237:         return $this->states->insert(array(
238:             self::PRODUCT => $this->query[self::PRODUCT],
239:             self::STOCK => $stock,
240:             self::QTY => $qty
241:         ));
242:     }
243:     }
244: 
245: }
246: 
sberp API API documentation generated by ApiGen