1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace App\Modules\SaleModule\Model;
13:
14: use Nette\Object,
15: App\Model\Database,
16: App\Model\Counter,
17: App\Lib\Table,
18: App\Lib\Statics\Cons,
19: App\Modules\StoreModule\Model\Move;
20:
21: class Sale extends Object {
22:
23: const START = 'Koncept',
24: PROGRESS = 'Objednávka',
25: READY = 'Připraveno',
26: DONE = 'Dokončeno',
27: CANCEL = 'Zrušeno';
28: const SALE = 'sale',
29: LINE = 'sale_line',
30: COUNTER = 'sale_counter';
31:
32:
33: private $database;
34:
35:
36: private $line;
37:
38:
39: private $counter;
40:
41:
42: private $edit;
43:
44:
45: private $master;
46:
47: public function __construct(Database $database, Counter $counter, Move $move) {
48: $this->master = $move->getMaster();
49: $this->database = $database;
50: $this->counter = $counter;
51: $this->refresh();
52: }
53:
54: 55: 56: 57:
58: public function prepareSale($value) {
59: if (isset($value[Cons::COLUMN_NAME]) && $value[Cons::COLUMN_NAME] !== '') {
60: $this->edit = TRUE;
61: $this->sounter->setCounters(self::SALE, $value[Cons::COLUMN_NAME]);
62: } else {
63: $this->edit = FALSE;
64: $this->counter->setCounters(self::SALE);
65: $value[Cons::COLUMN_NAME] = $this->counter->getName($this->counter[0]);
66: }
67: }
68:
69: 70: 71:
72: public function processSale() {
73: if ($this->edit === FALSE) {
74: $this->counter->save(TRUE);
75: }
76: }
77:
78: 79: 80: 81:
82: public function prepareLine($value) {
83: $saleRow = (new Table(self::SALE, $this->database))->data->where(Cons::COLUMN_ID . ' =?', $value['sale_id'])->fetch();
84: if (isset($value[Cons::COLUMN_NAME]) && $value[Cons::COLUMN_NAME] !== '') {
85: $this->edit = TRUE;
86: $this->counter->setCounters(self::SALE, $value[Cons::COLUMN_NAME]);
87: } else {
88: $this->edit = FALSE;
89: $saleName = $saleRow[Cons::COLUMN_NAME];
90: $this->counter->setCounters(self::SALE, $saleName);
91: $value[Cons::COLUMN_NAME] = $this->counter->getSubName($this->counter[1]);
92: $value['partner_id'] = $saleRow['partner_id'];
93: }
94: $this->line = array(
95: Cons::COLUMN_NAME => $value[Cons::COLUMN_NAME],
96: 'sale_line_id' => NULL,
97: 'date' => $saleRow['date_end'],
98: 'partner_id' => $saleRow['partner_id'],
99: 'qty' => $value['qty'],
100: 'product_id' => $value['product_id']
101: );
102: }
103:
104: 105: 106:
107: public function processLine($id) {
108:
109: if ($this->edit === FALSE) {
110: $this->counter->save();
111: }
112: $process = $this->getProcess($id);
113: $this->getMove($process);
114: }
115:
116: 117: 118:
119: private function refresh(){
120: $sales = new Table(self::SALE,$this->database);
121: $sales->data->where('state NOT',self::DONE);
122: foreach ($sales as $sale){
123: $state = $this->checkSale($sale);
124: if ($state === TRUE){
125: $sale->update(array('state'=>self::READY));
126: }
127: }
128: }
129:
130: 131: 132: 133: 134:
135: private function checkSale($sale){
136: $all = TRUE;
137: $lines = $sale->related(self::LINE);
138: foreach ($lines as $line){
139: $state = $this->checkLine($line);
140: if ($state === TRUE){
141: $line->update(array('state'=>self::DONE));
142: }else{
143: $all = FALSE;
144: }
145: }
146: return $all;
147: }
148:
149: 150: 151: 152: 153:
154: private function checkLine($line){
155: $process = $line->related('stock_picking.sale_line_id')->fetch();
156: $move = $process->related('stock_move.stock_picking_id')->where('product_id =?',$line['product_id'])->fetch();
157: if ($move instanceof \Nette\Database\Table\ActiveRow && $move['state'] === self::DONE) {
158: return TRUE;
159: } else {
160: return FALSE;
161: }
162: }
163:
164: 165: 166: 167: 168:
169: private function getProcess($id = NULL) {
170: $process = new Table('stock_picking', $this->database);
171: $partial = $process->data->where('sale_line_id' . ' =?', $id)->fetch();
172: if ($partial instanceof \Nette\Database\Table\ActiveRow) {
173: return $partial;
174: } else {
175: $this->line['sale_line_id'] = $id;
176: return $process->insert(array( Cons::COLUMN_NAME => $this->line[Cons::COLUMN_NAME],
177: 'sale_line_id' => $this->line['sale_line_id'],
178: 'date' => $this->line['date'],
179: 'partner_id' => $this->line['partner_id']
180: ));
181: }
182: }
183:
184: 185: 186:
187: private function getMove($process, $need = FALSE) {
188: $move = new Table('stock_move', $this->database);
189: $partial = $move->data->where('product_id =?', $this->line['product_id'])
190: ->where('stock_picking_id =?', $process[Cons::COLUMN_ID])
191: ->fetch();
192: if ($partial instanceof \Nette\Database\Table\ActiveRow) {
193: return $move;
194: } elseif($need === FALSE) {
195: return $move->insert(array(
196: 'name' => $this->line[Cons::COLUMN_NAME],
197: 'product_id' => $this->line['product_id'],
198: 'stock_picking_id' => $process[Cons::COLUMN_ID],
199: 'stock_source_id' => $this->getMasterId(),
200: 'stock_target_id' => $this->getMasterId(),
201: 'qty' => $this->line['qty'],
202: 'state' => 'Připraveno',
203: 'date' => $this->line['date']
204: ));
205: }else {
206: return FALSE;
207: }
208: }
209:
210: 211: 212: 213:
214: private function getMasterId() {
215: return $this->master->id;
216: }
217: }
218: