1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 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: 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:
36: private $database;
37:
38:
39: private $move;
40:
41:
42: private $query = array();
43:
44:
45: private $states;
46:
47:
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: 58: 59: 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:
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: 86: 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: 100: 101: 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: 113: 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: 126: 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: 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: 154: 155: 156:
157: private function getMove($id) {
158: return $this->move->findById($id);
159: }
160:
161: 162: 163: 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: 172: 173: 174: 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: 183: 184: 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: 203: 204: 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: 223: 224: 225: 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: