-
Notifications
You must be signed in to change notification settings - Fork 0
/
Machine.php
249 lines (239 loc) · 6.53 KB
/
Machine.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
<?php
/**
* Cinnebar.
*
* @package Cinnebar
* @subpackage Model
* @author $Author$
* @version $Id$
*/
/**
* Machine model.
*
* @package Cinnebar
* @subpackage Model
* @version $Id$
*/
class Model_Machine extends Model
{
/**
* Returns an array with attributes for lists.
*
* @param string (optional) $layout
* @return array
*/
public function getAttributes($layout = 'table')
{
return [
[
'name' => 'name',
'sort' => [
'name' => 'machine.name'
],
'filter' => [
'tag' => 'text'
],
'width' => '12rem'
],
[
'name' => 'machinebrand.name',
'sort' => [
'name' => 'machinebrand.name'
],
'callback' => [
'name' => 'machinebrandName'
],
'filter' => [
'tag' => 'text'
],
'width' => '12rem'
],
[
'name' => 'serialnumber',
'sort' => [
'name' => 'machine.serialnumber'
],
'filter' => [
'tag' => 'text'
]
],
[
'name' => 'person.name',
'sort' => [
'name' => 'person.name'
],
'callback' => [
'name' => 'personName'
],
'filter' => [
'tag' => 'text'
]
],
[
'name' => 'lastservice',
'sort' => [
'name' => 'machine.lastservice'
],
'filter' => [
'tag' => 'date'
],
'callback' => [
'name' => 'localizedDate'
],
'width' => '8rem'
]
];
}
/**
* Return the machinebrand bean.
*
* @return object
*/
public function getMachinebrand()
{
if (! $this->bean->machinebrand) {
$this->bean->machinebrand = R::dispense('machinebrand');
}
return $this->bean->machinebrand;
}
/**
* Returns the name of the machinebrand.
*
* @return string
*/
public function machinebrandName()
{
return $this->bean->getMachinebrand()->name;
}
/**
* Return the person (customer) bean via contract.
*
* @return object
*/
public function getPerson()
{
if (! $contract = R::findOne('contract', "machine_id = ? LIMIT 1", [$this->bean->getId()])) {
$contract = R::dispense('contract');
}
return $contract->getPerson();
}
/**
* Returns the name of the person (customer).
*
* @return string
*/
public function personName()
{
return $this->bean->getPerson()->name;
}
/**
* Returns a string with styling information of a scaffold table row.
*
* @return string
*/
public function scaffoldStyle()
{
if (! $this->bean->appointmenttype) {
return "style=\"border-left: 3px solid inherit;\"";
}
return "style=\"border-left: 3px solid {$this->bean->appointmenttype->color};\"";
//return "style=\"box-shadow: inset 0 0 0 4px coral;;\"";
}
/**
* Returns SQL string.
*
* @param string (optional) $fields to select
* @param string (optional) $where
* @param string (optional) $order
* @param int (optional) $offset
* @param int (optional) $limit
* @return string $sql
*/
public function getSql($fields = 'id', $where = '1', $order = null, $offset = null, $limit = null)
{
$sql = <<<SQL
SELECT
{$fields}
FROM
{$this->bean->getMeta('type')}
LEFT JOIN
machinebrand ON machinebrand.id = machine.machinebrand_id
LEFT JOIN
contract ON contract.machine_id = machine.id
LEFT JOIN
person ON person.id = contract.person_id
WHERE
{$where}
SQL;
//add optional order by
if ($order) {
$sql .= " ORDER BY {$order}";
}
//add optional limit
if ($offset || $limit) {
$sql .= " LIMIT {$offset}, {$limit}";
}
return $sql;
}
/**
* Lookup a searchterm and return the resultset as an array.
*
* @param string $searchtext
* @param string (optional) $query The prepared query or SQL to use for search
* @return array
*/
public function clairvoyant($searchtext, $query = 'default', $limit = 10)
{
switch ($query) {
default:
$sql = <<<SQL
SELECT
machine.id AS id,
CONCAT(machine.name, ' ', machine.serialnumber) AS label,
machine.name AS value
FROM
machine
WHERE
machine.name LIKE :searchtext OR
machine.serialnumber LIKE :searchtext
ORDER BY
machine.name
LIMIT {$limit}
SQL;
}
$result = R::getAll($sql, array(':searchtext' => $searchtext . '%' ));
return $result;
}
/**
* Dispense.
*/
public function dispense()
{
$this->addValidator('name', [
new Validator_HasValue(),
new Validator_IsUnique(['bean' => $this->bean, 'attribute' => 'name'])
]);
$this->addConverter(
'lastservice',
new Converter_Mysqldate()
);
}
/**
* Update.
*
* @todo When a machine entry is edited in the frontend a blank installedpart is
* added when there are not any installedparts yet. Because RB tries to relate
* the installedpart beans it will fail, if no article was selected as installedpart.
* For this reason we check if there art empty article records and if there are any, we
* unset them.
*/
public function update()
{
foreach ($this->bean->ownInstalledpart as $id => $installedpart) {
if (!$installedpart->getId() && !$installedpart->clairvoyant) {
unset($this->bean->ownInstalledpart[$id]); // this is most likely a blank article, just nill
}
}
parent::update();
}
}