1: <?php
2: namespace Budovy;
3:
4: class PeriodicTaskRealizationRepository extends Repository {
5: 6: 7: 8: 9: 10:
11: public function findById($id) {
12: return $this->getTable()->select('periodictask_realization.*, :periodictask_realization_contact.contact.id AS id_contact')->get($id);
13: }
14:
15: 16: 17: 18: 19: 20: 21: 22: 23:
24: function getGridSelection($filter, $order, $page, $limit) {
25: $selection = $this->getTable()->select('periodictask_realization.*, periodictask.name, :periodictask_realization_contact.contact.id AS id_contact, CONCAT(:periodictask_realization_contact.contact.firstname, \' \', :periodictask_realization_contact.contact.lastname) AS contact');
26:
27: if (isset($order[0]))
28: $selection->order(implode(' ', $order));
29:
30: $selection->page($page, $limit);
31:
32: return $this->addGridFilter($selection, $filter);
33: }
34:
35: 36: 37: 38: 39: 40:
41: function getGridCount($filter) {
42: $selection = $this->getTable()->select('COUNT(*) AS cnt');
43:
44: $result = $this->addGridFilter($selection, $filter)->fetch();
45:
46: return $result->cnt;
47: }
48:
49: 50: 51: 52: 53: 54: 55:
56: private function addGridFilter(\Nette\Database\Table\Selection $selection, $filter) {
57: $filters = array();
58:
59: foreach ($filter as $k => $v) {
60: if ($k == 'contact')
61: $filters[':periodictask_realization_contact.contact.id=?'] = $v;
62: else if ($k == 'name')
63: $filters['id_periodictask=?'] = $v;
64: else if ($k == 'date')
65: $filters['`periodictask_realization`.date=?'] = $v;
66: else
67: $filters['`periodictask_realization`.' . $k . ' LIKE ?'] = "%$v%";
68: }
69:
70: return $selection->where($filters);
71: }
72:
73: 74: 75: 76: 77: 78:
79: function getAssignedDocuments($id_periodictask_realization) {
80: return $this->getTable()->select(':periodictask_realization_document.document.id')->where('periodictask_realization.id', $id_periodictask_realization)->where(':periodictask_realization_document.document.id IS NOT NULL');
81: }
82:
83: 84: 85: 86: 87: 88:
89: function assignDocument($id_periodictask_realization, $id_document) {
90: $this->connection->table('periodictask_realization_document')->insert(array('id_periodictask_realization' => $id_periodictask_realization, 'id_document' => $id_document));
91: }
92:
93: 94: 95: 96: 97: 98:
99: function removeAssignedDocument($id_periodictask_realization, $id_document) {
100: $this->connection->table('periodictask_realization_document')->where(array('id_periodictask_realization' => $id_periodictask_realization, 'id_document' => $id_document))->delete();
101: }
102:
103: 104: 105: 106: 107: 108:
109: function getAssignedContact($id_periodictask_realization) {
110: return $this->getTable()->select(':periodictask_realization_contact.contact.*')->where(array('periodictask_realization.id' => $id_periodictask_realization))->where(':periodictask_realization_contact.contact.id IS NOT NULL')->fetch();
111: }
112:
113: 114: 115: 116: 117: 118: 119:
120: function assignContact($id_periodictask_realization, $id_contact) {
121: try {
122: $this->connection->table('periodictask_realization_contact')->insert(array('id_periodictask_realization' => $id_periodictask_realization, 'id_contact' => $id_contact));
123: } catch (\PDOException $e) {
124: if ($e->getCode() == '23000')
125: $this->connection->table('periodictask_realization_contact')->where(array('id_periodictask_realization' => $id_periodictask_realization))->update(array('id_contact' => $id_contact));
126: else
127: throw $e;
128: }
129: }
130:
131: 132: 133: 134: 135:
136: function removeAssignedContact($id_periodictask_realization) {
137: $this->connection->table('periodictask_realization_contact')->where(array('id_periodictask_realization' => $id_periodictask_realization))->delete();
138: }
139:
140: 141: 142: 143: 144: 145: 146:
147: function getPriceStatistic($start, $end, $id_place) {
148: $selection = $this->getTable()
149: ->select('SUM(periodictask_realization.price) AS price, MONTH(`date`) AS `month`, YEAR(`date`) AS `year`')
150: ->where('`date` BETWEEN ? AND ?', $start, $end)
151: ->group('MONTH(`date`), YEAR(`date`)')
152: ->order('`year` ASC, `month` ASC');
153:
154: if ($id_place > 0)
155: $selection->where('periodictask.unit.place.id', $id_place);
156:
157: return $selection;
158: }
159:
160: 161: 162: 163: 164: 165: 166:
167: function getUnitStatistic($start, $end, $id_place) {
168: $selection = $this->getTable()
169: ->select('SUM(periodictask_realization.price) AS price, periodictask.unit.name')
170: ->where('`date` BETWEEN ? AND ?', $start, $end)
171: ->group('periodictask.id_unit')
172: ->order('name');
173:
174: if ($id_place > 0)
175: $selection->where('periodictask.unit.place.id', $id_place);
176:
177: return $selection;
178: }
179:
180: 181: 182: 183: 184: 185: 186:
187: function getOperationStatistic($start, $end, $id_place) {
188: $selection = $this->getTable()
189: ->select('SUM(periodictask_realization.price) AS price, periodictask.operation.name')
190: ->where('`date` BETWEEN ? AND ?', $start, $end)
191: ->group('periodictask.id_operation')
192: ->order('name');
193:
194: if ($id_place > 0)
195: $selection->where('periodictask.unit.place.id', $id_place);
196:
197: return $selection;
198: }
199:
200: 201: 202: 203: 204: 205: 206:
207: function getContactStatistic($start, $end, $id_place) {
208: $selection = $this->getTable()
209: ->select('SUM(periodictask_realization.price) AS price, :periodictask_realization_contact.contact.*')
210: ->where('`date` BETWEEN ? AND ?', $start, $end)
211: ->group(':periodictask_realization_contact.id_contact')
212: ->order(':periodictask_realization_contact.contact.lastname, :periodictask_realization_contact.contact.firstname');
213:
214: if ($id_place > 0)
215: $selection->where('periodictask.unit.place.id', $id_place);
216:
217: return $selection;
218: }
219:
220: 221: 222: 223: 224: 225:
226: function getTasksByDocument($id_document) {
227: return $this->getTable()->select('periodictask.name, periodictask_realization.date, periodictask_realization.id')->where(':periodictask_realization_document.id_document=?', $id_document);
228: }
229: }