GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — develop ( 64c0c8...2d0c86 )
by Luis Ramón
05:14
created

upload.php ➔ parseVariables()   C

Complexity

Conditions 7
Paths 1

Size

Total Lines 33
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 7
eloc 24
c 3
b 0
f 0
nc 1
nop 4
dl 0
loc 33
rs 6.7272
1
<?php
2
3
/*  ATICA - Web application for supporting Quality Management Systems
4
  Copyright (C) 2009-2015: Luis-Ramón López López
5
6
  This program is free software: you can redistribute it and/or modify
7
  it under the terms of the GNU Affero General Public License as published by
8
  the Free Software Foundation, either version 3 of the License, or
9
  (at your option) any later version.
10
11
  This program is distributed in the hope that it will be useful,
12
  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
  GNU Affero General Public License for more details.
15
16
  You should have received a copy of the GNU Affero General Public License
17
  along with this program.  If not, see [http://www.gnu.org/licenses/]. */
18
19
$app->get('/enviar/:id(/:return/:data1(/:data2(/:data3)))', function ($id, $return=0, $data1=null, $data2=null, $data3=null)
20
    use ($app, $user, $config, $organization) {
21
22
    if ((!$user) || ($return < 0) || ($return > 1)) {
23
        $app->redirect($app->urlFor('login'));
24
    }
25
26
    $data = array();
27
    $parent = array();
28
29
    $folder = getFolder($organization['id'], $id);
30
    if (!$folder) {
31
        $app->redirect($app->urlFor('login'));
32
    }
33
34
    $restrictedProfiles = parseArray(getPermissionProfiles($id, 2));
35
    $uploadProfiles = parseArray(getPermissionProfiles($id, 1));
36
    $managerProfiles = parseArray(getPermissionProfiles($id, 0));
37
    $userProfiles = parseArray(getUserProfiles($user['id'], $organization['id'], true));
38
39
    $isManager = $user['is_admin'];
40
    foreach ($managerProfiles as $upload) {
41
        if (isset($userProfiles[$upload['id']])) {
42
            $isManager = true;
43
            break;
44
        }
45
    }
46
47
    $uploadAs = array();
48
    if (!$isManager) {
49
        $realUserProfiles = parseArray(getUserProfiles($user['id'], $organization['id'], false));
50
        foreach ($realUserProfiles as $item) {
51
            if (isset($uploadProfiles[$item['id']]) || isset($uploadProfiles[$item['profile_group_id']])) {
52
                $uploadAs[$item['id']] = $item;
53
            }
54
        }
55
    }
56
    else {
57
        foreach ($uploadProfiles as $item) {
58
            if (null == $item['display_name']) {
59
                $data = parseArray(getSubprofiles($item['id']));
60
                if (count($data)>1) {
61
                    foreach($data as $subItem) {
62
                        if (null != $subItem['display_name']) {
63
                            $uploadAs[$subItem['id']] = $subItem;
64
                        }
65
                    }
66
                }
67
                else {
68
                    $uploadAs[$item['id']] = $item;
69
                }
70
            }
71
            else {
72
                $uploadAs[$item['id']] = $item;
73
            }
74
        }
75
    }
76
77
    $category = getCategoryObjectById($organization['id'], $folder['category_id']);
78
79
    if (!$category) {
80
        $app->redirect($app->urlFor('login'));
81
    }
82
83
    $breadcrumb = array();
84
    $lastUrl = $app->request()->getPathInfo();
85
    switch ($return) {
86
        case 0:
87
            $breadcrumb = array(
88
                array('display_name' => 'Árbol', 'target' => $app->urlFor('tree'))
89
            );
90
            $parents = getCategoryParentsById($category['id']);
91
            foreach($parents as $parent) {
92
                $breadcrumb[] = array('display_name' => $parent['display_name'], 'target' => $app->urlFor('tree'));
93
            }
94
            $breadcrumb[] = array('display_name' => $category['display_name'], 'target' => $app->urlFor('tree', array('id' => $category['id'])));
95
            $breadcrumb[] = array('display_name' => 'Enviar documento');
96
            $lastUrl = $app->urlFor('tree', array('id' => $data1));
97
            break;
98
        case 1:
99
            $event = getEventByIdObject($organization['id'], $data3);
100
            $activityevent = getActivityEvent($data3, $data2, $user);
101
            $profile = getProfileById($organization['id'], $data1);
102
            if ((!$event) || (!$activityevent) || (!$profile) || ($event['folder_id'] != $id)) {
103
                $app->redirect($app->urlFor('login'));
104
            }
105
            $lastUrl = $app->urlFor('event', array('pid' => $data1, 'aid' => $data2, 'id' => $data3));
106
107
            $breadcrumb = array(
108
                array('display_name' => 'Actividades', 'target' => $app->urlFor('activities')),
109
                array('display_name' => getProfileFullDisplayName($profile, $user), 'target' => $app->urlFor('activities', array('id' => $data1))),
110
                array('display_name' => $activityevent['activity_display_name'], 'target' => $app->urlFor('activities', array('id' => $data1))),
111
                array('display_name' => $event['display_name'], 'target' => $app->urlFor('event', array('pid' => $data1, 'aid' => $data2, 'id' => $data3))),
112
                array('display_name' => 'Enviar documento')
113
            );
114
            break;
115
    }
116
117
    if ($isManager) {
118
        $stats = getFolderProfileDeliveryStats($id);
119
    }
120
    else {
121
        $stats = array();
122
    }
123
124
    $items = parseVariablesArray(getFolderItemsByUser($user['id'], $id, $organization['id']), $organization, $user, 'profile_id', $userProfiles);
125
126
    $localStats = getArrayGroups($items, 'event_id', 'profile_id');
127
    $now = getdate();
128
    $currentWeek = ($now['mon']-1)*4 + min(floor(($now['mday']-1)/7), 3);
129
130
    $app->render('upload.html.twig', array(
131
        'navigation' => $breadcrumb, 'search' => false,
132
        'select2' => true,
133
        'category' => $category,
134
        'folder' => $folder,
135
        'upload_profiles' => $uploadProfiles,
136
        'manager_profiles' => $managerProfiles,
137
        'restricted_profiles' => $restrictedProfiles,
138
        'user_profiles' => $userProfiles,
139
        'is_manager' => $isManager,
140
        'upload_as' => $uploadAs,
141
        'base' => $config['calendar.base_week'],
142
        'current' => $currentWeek,
143
        'stats' => $stats,
144
        'local_stats' => $localStats,
145
        'url' => $app->request()->getPathInfo(),
146
        'back_url' => array('return' => $return, 'data1' => $data1, 'data2' => $data2, 'data3' => $data3),
147
        'last_url' => $lastUrl,
148
        'data' => $data));
149
})->name('upload');
150
151
$app->post('/enviar/:id(/:return/:data1(/:data2(/:data3)))', function ($id, $return=0, $data1=null, $data2=null, $data3=null)
152
    use ($app, $user, $config, $organization, $preferences) {
153
    if (!$user) {
154
        $app->redirect($app->urlFor('login'));
155
    }
156
157
    if (isset($_POST['localupload'])) {
158
        $folder = getFolder($organization['id'], $id);
159
        if (!$folder) {
160
            $app->redirect($app->urlFor('login'));
161
        }
162
        $userProfiles = parseArray(getUserProfiles($user['id'], $organization['id'], true));
163
164
        $items = parseVariablesArray(getFolderItemsByUser($user['id'], $id, $organization['id']), $organization, $user, 'profile_id', $userProfiles);
165
        $failed = 0;
166
        $success = 0;
167
168
        // comprobar ítem a ítem si se ha recibido un documento
169
        foreach ($items as $item) {
170
            $profile = getProfile($item['profile_id']);
171
            $ref = 'localdocument_' . $item['id'];
172
            if (($item['c'] == 0) && (isset($_FILES[$ref]['name'])) && (strlen($_FILES[$ref]['name']) > 0) && (is_uploaded_file($_FILES[$ref]['tmp_name']))) {
173
                // recibido
174
                $hash = sha1_file($_FILES[$ref]['tmp_name']);
175
                $filesize = filesize($_FILES[$ref]['tmp_name']);
176
177
                $message = "";
178
                $documentDestination = createDocumentFolder($preferences['upload.folder'], $hash);
179
                if (move_uploaded_file($_FILES[$ref]['tmp_name'], $preferences['upload.folder'] . $documentDestination)) {
180
                    $ext = pathinfo($_FILES[$ref]['name'], PATHINFO_EXTENSION);
181
                    if ($ext) {
182
                        $ext = '.' . $ext;
183
                    }
184
                    $name = $item['document_name'] ? $item['document_name'] : $item['display_name'];
185
                    $filename = parseVariables($name, $organization, $user, $profile) . $ext;
186
                    $description = parseVariables($item['display_name'], $organization, $user, $profile);
187
188 View Code Duplication
                    if (false === createDelivery($id, $user['id'], $item['profile_id'], $filename, $description, null, $item['id'], $documentDestination, $hash, $filesize)) {
189
                        $type = 'danger';
190
                        $message = 'cannot register';
191
                    }
192
                    else {
193
                        $type = 'ok';
194
                    }
195
                }
196
                else {
197
                    $type = 'danger';
198
                    $message = 'cannot move';
199
                }
200
201 View Code Duplication
                if ($type == 'danger') {
202
                    $app->flash('upload_status_' . $failed, $type);
203
                    $app->flash('upload_name_' . $failed, $_FILES[$ref]['name']);
204
                    $app->flash('upload_error_' . $failed, $message);
205
                    $failed++;
206
                }
207
                else {
208
                    $success++;
209
                }
210
            }
211
        }
212
213
        $app->flash('upload', $failed);
214
        if ($success>0) {
215
            $app->flash('upload_ok', $success);
216
        }
217
        $app->redirect($app->request()->getPathInfo());
218
    }
219
    else {
220
        if ((! isset($_FILES['document']['name'][0])) || (strlen($_FILES['document']['name'][0]) == 0)) {
221
            // no hay archivos enviados
222
            $app->redirect($app->request()->getPathInfo());
223
        }
224
225
        $items = array();
226
227
        // TODO: Comprobar si la carpeta es válida
228
        $folder = getFolder($organization['id'], $id);
229
230
        // TODO: Comprobar perfil
231
        $profileIsSet = $folder['is_divided'];
232
        $profileId = $profileIsSet ? $_POST['profile'] : null;
233
        $profile = $profileIsSet ? getProfile($profileId) : array();
234
235
        // buscar si hay una lista de entrega
236
        $list = $profileIsSet ?
237
                parseArray(getFolderProfileDeliveryItems($profileId, $id)) :
238
                array();
239
240
        $list = parseVariablesArray($list, $organization, $user, $profile);
241
242
        // si es falso, mostrar revisión de los documentos enviados
243
        $finished = false;
244
245
        $loop = 0;
246
        $failed = 0;
247
        $success = 0;
248
        while (isset($_FILES['document']['name'][$loop])) {
249
            $type = "";
250
            $message = "";
251
            if ( is_uploaded_file($_FILES['document']['tmp_name'][$loop]) ) {
252
                $hash = sha1_file($_FILES['document']['tmp_name'][$loop]);
253
                $filesize = filesize($_FILES['document']['tmp_name'][$loop]);
254
255
                if (!$list) {
256
                    // Entregar directamente pues no hay lista de entrega
257
                    $documentDestination = createDocumentFolder($preferences['upload.folder'], $hash);
258
                    if (move_uploaded_file($_FILES['document']['tmp_name'][$loop], $preferences['upload.folder'] . $documentDestination)) {
259
                        $filename = $_FILES['document']['name'][$loop];
260
                        $info = pathinfo( $filename );
261
                        $description = str_replace ('_', ' ', $info['filename']);
262
263 View Code Duplication
                        if (false === createDelivery($id, $user['id'], $profileId, $_FILES['document']['name'][$loop], $description, null, null, $documentDestination, $hash, $filesize)) {
264
                            $type = 'danger';
265
                            $message = 'cannot register';
266
                        }
267
                        else {
268
                            $type = 'ok';
269
                        }
270
                    }
271
                    else {
272
                        $type = 'danger';
273
                        $message = 'cannot register';
274
                    }
275
                }
276
                else {
277
                    // Mover a una carpeta temporal
278
                    $tempFolder = $preferences['upload.folder'] . "temp/";
279
                    if (!is_dir($tempFolder)) {
280
                        mkdir($tempFolder, 0770, true);
281
                    }
282
                    $tempDestination = $tempFolder . $hash;
283
                    move_uploaded_file($_FILES['document']['tmp_name'][$loop], $tempDestination);
284
285
                    $filename = $_FILES['document']['name'][$loop];
286
                    $info = pathinfo( $filename );
287
                    $description = $info['filename'];
288
                    $items[] = array(
289
                        'name' => $filename,
290
                        'description' => $description,
291
                        'hash' => $hash,
292
                        'filesize' => $filesize
293
                    );
294
                }
295
            }
296
            else {
297
                $type = 'danger';
298
                $message = 'cannot move';
299
            }
300
            if ($type) {
301 View Code Duplication
                if ($type == 'danger') {
302
                    $app->flash('upload_status_' . $failed, $type);
303
                    $app->flash('upload_name_' . $failed, $_FILES['document']['name'][$loop]);
304
                    $app->flash('upload_error_' . $failed, $message);
305
                    $failed++;
306
                }
307
                else {
308
                    $success++;
309
                }
310
                $finished = true;
311
            }
312
            $loop++;
313
        }
314
315
        if ($finished) {
316
            $app->flash('upload', $failed);
317
            if ($success>0) {
318
                $app->flash('upload_ok', $success);
319
            }
320
            $url = isset($_SESSION['slim.flash']['last_url']) ?
321
                $_SESSION['slim.flash']['last_url'] :
322
                $app->urlFor('tree', array( 'id' => $folder['category_id']));
323
324
            $app->redirect($url);
325
        }
326
327
        $category = array();
328
        $parent = array();
329
330
        getTree($organization['id'], $app, $folder['category_id'], $category, $parent);
331
332
        $breadcrumb = array(
333
            array('display_name' => 'Árbol', 'target' => $app->urlFor('tree')),
334
            array('display_name' => $parent['display_name'], 'target' => $app->urlFor('tree')),
335
            array('display_name' => $category['display_name'], 'target' => $app->urlFor('tree', array('id' => $category['id']))),
336
            array('display_name' => 'Revisar documento')
337
        );
338
339
        $deliveries = $profileIsSet ?
340
                getFolderProfileDeliveredItems($profileId, $id, $organization['id']) :
341
                array();
342
        $deliveries = parseVariablesArray($deliveries, $organization, $user, $profile);
343
344
        $now = getdate();
345
        $currentWeek = ($now['mon']-1)*4 + min(floor(($now['mday']-1)/7), 3);
346
347
        $app->flashKeep();
348
349
        $app->render('upload_review.html.twig', array(
350
            'navigation' => $breadcrumb, 'search' => false,
351
            'base' => $config['calendar.base_week'],
352
            'current' => $currentWeek,
353
            'select2' => true,
354
            'category' => $category,
355
            'folder' => $folder,
356
            'items' => $list,
357
            'profile' => $profile,
358
            'deliveries' => $deliveries,
359
            'data' => $items));
360
    }
361
});
362
363
$app->post('/confirmar/:id', function ($id) use ($app, $user, $preferences, $organization) {
364
    if (!$user) {
365
        $app->redirect($app->urlFor('login'));
366
    }
367
368
    // TODO: Comprobar si la carpeta es válida
369
    $folder = getFolder($organization['id'], $id);
370
371
    if (isset($_POST['discard'])) {
372
        // descartar envío: borrar archivos temporales
373
        $loop = 1;
374
        while (isset($_POST['hash' . $loop])) {
375
            $tempDestination = $preferences['upload.folder'] . "temp/" . $_POST['hash' . $loop];
376
            unlink($tempDestination);
377
            $loop++;
378
        }
379
        $app->redirect($app->urlFor('tree', array('id' => $folder['category_id'])));
380
    }
381
382
    // TODO: Comprobar perfil
383
    $profileIsSet = $folder['is_divided'];
384
    $profileId = $profileIsSet ? $_POST['profile'] : null;
385
386
    // buscar si hay una lista de entrega
387
    $list = $profileIsSet ?
388
            parseArray(getFolderProfileDeliveryItems($profileId, $id)) :
389
            array();
390
391
    $loop = 1;
392
    $success = 0;
393
    $failed = 0;
394
395
    if (! isset($_POST['hash' . $loop])) {
396
        // no hay archivos enviados
397
        $app->redirect($app->urlFor('upload', array('id' => $id)));
398
    }
399
    // TODO: comprobar que $hash es realmente un hash
400
    // TODO: comprobar que 'profile' es correcto
401
402
    while (isset($_POST['hash' . $loop])) {
403
        $ok = true;
404
        $hash = $_POST['hash' . $loop];
405
        $filename = $_POST['filename'. $loop];
406
        $description = isset($_POST['description'. $loop]) ? $_POST['description'. $loop] : $_POST['filename'. $loop];
407
408
        $tempDestination = $preferences['upload.folder'] . "temp/" . $hash;
409
410
        $itemId = null;
411
412
        if (file_exists($tempDestination)) {
413
            $message = "";
414
            $type = "";
415
416
            // si es un ítem, hacer comprobaciones adicionales
417
            if (count($list) > 0) {
418
                // ¿se ha elegido ignorar el documento?
419
                if (0 == $_POST['element' . $loop]) {
420
                    $ok = false;
421
                    $type = 'warning';
422
                    $message = 'ignored';
423
                }
424
                else {
425
                    // ¿pertenece el elemento a la lista?
426
                    if (isset($list[$_POST['element' . $loop]])) {
427
                        // sí
428
                        if ($profileId && (getDeliveryItemCount($profileId, $id, $_POST['element' . $loop]) > 0)) {
429
                            // error, ya existe un ítem de ese tipo
430
                            $ok = false;
431
                            $type = 'danger';
432
                            $message = 'already exists';
433
                        }
434
                        else {
435
                            // correcto
436
                            $itemId = $_POST['element' . $loop];
437
                            $profile = getProfile($profileId);
438
                            $description = parseVariables($list[$itemId]['display_name'], $organization, $user, $profile);
439
                            if ($list[$itemId]['document_name']) {
440
                                $ext = pathinfo($filename, PATHINFO_EXTENSION);
441
                                if ($ext) {
442
                                    $ext = '.' . $ext;
443
                                }
444
                                $filename = parseVariables($list[$itemId]['document_name'], $organization, $user, $profile) . $ext;
445
                            }
446
                        }
447
                    }
448
                    else {
449
                        // error, el elemento no se aplica a este perfil/carpeta
450
                        $ok = false;
451
                        $type = 'danger';
452
                        $message = 'invalid item';
453
                    }
454
                }
455
            }
456
            else {
457
                // ¿se ha elegido ignorar el documento?
458
                if (false === isset($_POST['confirm' . $loop])) {
459
                    $ok = false;
460
                    $type = 'warning';
461
                    $message = 'ignored';
462
                }
463
            }
464
465
            if ($ok) {
466
                $filesize = filesize($tempDestination);
467
                $documentDestination = createDocumentFolder($preferences['upload.folder'], $hash);
468
                if (rename($tempDestination, $preferences['upload.folder'] . $documentDestination)) {
469
                    if (false === createDelivery($id, $user['id'], $profileId, $filename, $description, null, $itemId, $documentDestination, $hash, $filesize)) {
470
                        $ok = false;
471
                        $type = 'danger';
472
                        $message = 'cannot register';
473
                        // TODO: Borrar documento movido *si no existe en la base de datos*
474
                        //unlink($preferences['upload.folder'] . $documentDestination);
475
                    }
476
                }
477
                else {
478
                    $ok = false;
479
                    $type = 'danger';
480
                    $message = 'cannot move';
481
                }
482
            }
483
        }
484
        else {
485
            $ok = false;
486
            $type = 'danger';
487
            $message = 'not_found';
488
        }
489
        if (false === $ok) {
490
            $app->flash('upload_status_' . $failed, $type);
491
            $app->flash('upload_name_' . $failed, $_POST['filename' . $loop]);
492
            $app->flash('upload_error_' . $failed, $message);
493
            $failed++;
494
            unlink($tempDestination);
495
        }
496
        else {
497
            $success++;
498
        }
499
        $loop++;
500
    }
501
    $app->flash('upload', $failed);
502
    if ($success>0) {
503
        $app->flash('upload_ok', $success);
504
    }
505
    $app->redirect($app->urlFor('tree', array( 'id' => $folder['category_id'])));
506
507
})->name('confirm');
508
509
$app->get('/estadisticas/:id(/:return/:data1(/:data2(/:data3)))', function ($id, $return=0, $data1=null, $data2=null, $data3=null)
510
        use ($app, $user, $organization, $config) {
511
    if (!$user) {
512
        $app->redirect($app->urlFor('login'));
513
    }
514
515
    $folder = getFolderById($organization['id'], $id);
516
517
    $restrictedProfiles = parseArray(getPermissionProfiles($id, 2));
518
    $uploadProfiles = parseArray(getPermissionProfiles($id, 1));
519
    $managerProfiles = parseArray(getPermissionProfiles($id, 0));
520
    $userProfiles = parseArray(getUserProfiles($user['id'], $organization['id'], true));
521
    $allProfiles = parseArray(getProfilesByOrganization($organization['id'], false));
522
523
    $isManager = $user['is_admin'];
524
    foreach ($managerProfiles as $upload) {
525
        if (isset($userProfiles[$upload['id']])) {
526
            $isManager = true;
527
            break;
528
        }
529
    }
530
531
    $breadcrumb = array();
532
    $lastUrl = $app->request()->getPathInfo();
533
534 View Code Duplication
    switch ($return) {
535
        case 0:
536
            $breadcrumb = array(
537
                array('display_name' => 'Árbol', 'target' => $app->urlFor('tree'))
538
            );
539
            $category = getCategoryObjectById($organization['id'], $folder['category_id']);
540
            $parents = getCategoryParentsById($category['id']);
541
            foreach($parents as $parent) {
542
                $breadcrumb[] = array('display_name' => $parent['display_name'], 'target' => $app->urlFor('tree'));
543
            }
544
            $breadcrumb[] = array('display_name' => $category['display_name'], 'target' => $app->urlFor('tree', array('id' => $category['id'])));
545
            $breadcrumb[] = array('display_name' => 'Estadísticas');
546
            $lastUrl = $app->urlFor('tree', array('id' => $data1));
547
            break;
548
        case 1:
549
            $event = getEventByIdObject($organization['id'], $data3);
550
            $activityevent = getActivityEvent($data3, $data2, $user);
551
            $profile = getProfileById($organization['id'], $data1);
552
            if ((!$event) || (!$activityevent) || (!$profile) || ($event['folder_id'] != $id)) {
553
                $app->redirect($app->urlFor('login'));
554
            }
555
            $lastUrl = $app->urlFor('event', array('pid' => $data1, 'aid' => $data2, 'id' => $data3));
556
557
            $breadcrumb = array(
558
                array('display_name' => 'Actividades', 'target' => $app->urlFor('activities')),
559
                array('display_name' => getProfileFullDisplayName($profile, $user), 'target' => $app->urlFor('activities', array('id' => $data1))),
560
                array('display_name' => $activityevent['activity_display_name'], 'target' => $app->urlFor('activities', array('id' => $data1))),
561
                array('display_name' => $event['display_name'], 'target' => $app->urlFor('event', array('pid' => $data1, 'aid' => $data2, 'id' => $data3))),
562
                array('display_name' => 'Estadísticas')
563
            );
564
            break;
565
    }
566
567
    $stats = getFolderProfileDeliveryStats($id);
568
569
    $data = getFolderItems($id, $organization['id'])->find_array();
570
    $items = parseVariablesArray($data, $organization, $user, 'profile_id', $allProfiles);
571
572
    $localStats = getArrayGroups($items,'event_id', 'profile_id');
573
    $now = getdate();
574
    $currentWeek = ($now['mon']-1)*4 + min(floor(($now['mday']-1)/7), 3);
575
576
    $app->render('folder_stats.html.twig', array(
577
        'navigation' => $breadcrumb,
578
        'search' => true,
579
        'url' => $app->request()->getPathInfo(),
580
        'back_url' => array('return' => $return, 'data1' => $data1, 'data2' => $data2, 'data3' => $data3),
581
        'last_url' => $lastUrl,
582
        'stats' => $stats,
583
        'local_stats' => $localStats,
584
        'base' => $config['calendar.base_week'],
585
        'current' => $currentWeek,
586
        'is_manager' => $isManager,
587
        'restricted_profiles' => $restrictedProfiles,
588
        'upload_profiles' => $uploadProfiles,
589
        'manager_profiles' => $managerProfiles,
590
        'user_profiles' => $userProfiles,
591
        'all_profiles' => $allProfiles,
592
        'folder' => $folder));
593
594
})->name('folderstats');
595
596 View Code Duplication
function getDelivery($deliveryId) {
597
    return ORM::for_table('delivery')->
598
            select('document.download_filename')->
599
            select('file_extension.mime')->
600
            select('document_data.download_path')->
601
            select('document_data.download_filesize')->
602
            inner_join('revision', array('delivery.current_revision_id', '=', 'revision.id'))->
603
            inner_join('document', array('document.id', '=', 'revision.original_document_id'))->
604
            inner_join('file_extension', array('file_extension.id', '=', 'document.extension_id'))->
605
            inner_join('document_data', array('document_data.id', '=', 'document.document_data_id'))->
606
            where('delivery.id', $deliveryId)->
607
            find_one();
608
}
609
610 View Code Duplication
function getDeliveryWithRevision($deliveryId, $revId) {
611
    return ORM::for_table('delivery')->
612
        select('document.download_filename')->
613
        select('file_extension.mime')->
614
        select('document_data.download_path')->
615
        select('document_data.download_filesize')->
616
        inner_join('revision', array('delivery.id', '=', 'revision.delivery_id'))->
617
        inner_join('document', array('document.id', '=', 'revision.original_document_id'))->
618
        inner_join('file_extension', array('file_extension.id', '=', 'document.extension_id'))->
619
        inner_join('document_data', array('document_data.id', '=', 'document.document_data_id'))->
620
        where('delivery.id', $deliveryId)->
621
        where('revision.id', $revId)->
622
        find_one();
623
}
624
625
function getPermissionProfiles($folderId, $permission) {
626
    return ORM::for_table('profile')->
627
            select('profile.*')->
628
            select('profile_group.display_name_male')->
629
            select('profile_group.display_name_female')->
630
            select('profile_group.display_name_neutral')->
631
            inner_join('folder_permission', array('folder_permission.profile_id', '=', 'profile.id'))->
632
            inner_join('profile_group', array('profile_group.id', '=', 'profile.profile_group_id'))->
633
            where('folder_permission.folder_id', $folderId)->
634
            where('folder_permission.permission', $permission)->
635
            find_array();
636
}
637
638
function getSubprofiles($profileGroupId) {
639
    return ORM::for_table('profile')->
640
            select('profile.*')->
641
            select('profile_group.display_name_male')->
642
            select('profile_group.display_name_female')->
643
            select('profile_group.display_name_neutral')->
644
            inner_join('profile_group', array('profile_group.id', '=', 'profile.profile_group_id'))->
645
            where('profile.profile_group_id', $profileGroupId)->
646
            order_by_asc('profile.order_nr')->
647
            find_array();
648
}
649
650
function createDocumentFolder($prefix, $hash) {
651
    $path = substr($hash,0,2) . "/" . substr($hash,2,2);
652
    if (!is_dir($prefix . $path)) {
653
        mkdir($prefix . $path, 0770, true);
654
    }
655
    return $path . "/" . $hash;
656
}
657
658
function getFolderProfileDeliveryItems($profileId, $folderId) {
659
    $data = ORM::for_table('event_profile_delivery_item')->
660
            select('event_profile_delivery_item.*')->
661
            select('event.display_name', 'event_display_name')->
662
            select('event.from_week')->
663
            select('event.to_week')->
664
            select('event.force_period')->
665
            select('event.grace_period')->
666
            inner_join('event', array('event.id', '=', 'event_profile_delivery_item.event_id'))->
667
            where('event.folder_id', $folderId)->
668
            where('profile_id', $profileId)->
669
            where('is_visible', 1)->
670
            order_by_asc('event.id')->
671
            order_by_asc('order_nr')->
672
            find_many();
673
    return $data;
674
}
675
676
function getFolderProfileDeliveryStatsBase($folderId) {
677
    $data = ORM::for_table('event_profile_delivery_item')->
678
            select('event_profile_delivery_item.id')->
679
            select('event_profile_delivery_item.profile_id')->
680
            select('profile.display_name')->
681
            select('profile_group.display_name_neutral')->
682
            select('folder_delivery.snapshot_id')->
683
            select_expr('COUNT(DISTINCT event_profile_delivery_item.id)', 'total')->
684
            select_expr('SUM(folder_delivery.delivery_id IS NOT NULL AND (folder_delivery.snapshot_id IS NULL))', 'c')->
685
            inner_join('profile', array('profile.id', '=', 'event_profile_delivery_item.profile_id'))->
686
            inner_join('profile_group', array('profile_group.id', '=', 'profile.profile_group_id'))->
687
            inner_join('event', array('event.id', '=', 'event_profile_delivery_item.event_id'))->
688
            left_outer_join('delivery', array('delivery.item_id', '=', 'event_profile_delivery_item.id'))->
689
            left_outer_join('folder_delivery', 'folder_delivery.delivery_id=delivery.id AND folder_delivery.folder_id=event.folder_id')->
690
            where('event.folder_id', $folderId)->
691
            where('event_profile_delivery_item.is_visible', 1)->
692
            group_by('event_profile_delivery_item.profile_id')->
693
            group_by('event_profile_delivery_item.id')->
694
            group_by('folder_delivery.snapshot_id')->
695
            order_by_asc('profile_group.display_name_neutral')->
696
            order_by_asc('profile.display_name')->
697
            order_by_asc('event_profile_delivery_item.order_nr')->
698
            order_by_asc('event_profile_delivery_item.display_name');
699
700
    return $data;
701
}
702
703
function getFolderProfileDeliveryStats($folderId) {
704
    $data = getFolderProfileDeliveryStatsBase($folderId)->
705
            find_array();
706
    return $data;
707
}
708
709
function getFolderProfileDeliveryStatsByProfile($folderId, $profileId) {
710
    $data = getFolderProfileDeliveryStatsBase($folderId)->
711
            where('profile.id', $profileId)->
712
            find_array();
713
    return $data;
714
}
715
716
function getFolderProfileDeliveredItems($profileId, $folderId, $orgId) {
717
    $data = ORM::for_table('event_profile_delivery_item')->
718
            inner_join('event', array('event.id', '=', 'event_id'))->
719
            select('event_profile_delivery_item.id')->
720
            select('event_profile_delivery_item.display_name')->
721
            select('event_profile_delivery_item.profile_id')->
722
            select('delivery.creation_date')->
723
            select_expr('SUM(folder_delivery.delivery_id IS NOT NULL AND (folder_delivery.snapshot_id IS NULL))', 'c')->
724
            left_outer_join('delivery', array('delivery.item_id', '=', 'event_profile_delivery_item.id'))->
725
            left_outer_join('folder_delivery', 'folder_delivery.delivery_id=delivery.id AND folder_delivery.folder_id=event.folder_id')->
726
            where('event.folder_id', $folderId)->
727
            where('event_profile_delivery_item.profile_id', $profileId)->
728
            where('event_profile_delivery_item.is_visible', 1)->
729
            where('event.organization_id', $orgId)->
730
            group_by('event_profile_delivery_item.id')->
731
            order_by_asc('event_profile_delivery_item.order_nr')->
732
            find_array();
733
734
    return $data;
735
}
736
737
function getArrayGroups($data, $key, $key2 = null) {
738
    $lastgroup = null;
739
    $return = array();
740
    $partial = array();
741
    foreach ($data as $item) {
742
        if ($lastgroup != $item[$key]) {
743
            if ($lastgroup !== null) {
744
                $return[$lastgroup] = $partial;
745
            }
746
            $partial = array();
747
            $lastgroup = $item[$key];
748
        }
749
        $partial[] = $item;
750
    }
751
    if ($lastgroup !== null) {
752
        $return[$lastgroup] = $partial;
753
    }
754
    if ($key2 !== null) {
755
        $return2 = array();
756
        foreach ($return as $key => $item) {
757
            $return2[$key] = getArrayGroups($item, $key2);
758
        }
759
        return $return2;
760
    }
761
    return $return;
762
}
763
764
function getFolderItemsBase($folderId, $orgId) {
765
    $data = ORM::for_table('event_profile_delivery_item')->
766
            inner_join('event', array('event.id', '=', 'event_id'))->
767
            select('event_profile_delivery_item.id')->
768
            select('event_profile_delivery_item.event_id')->
769
            select('event_profile_delivery_item.display_name')->
770
            select('event_profile_delivery_item.document_name')->
771
            select('event_profile_delivery_item.profile_id')->
772
            select('event.display_name', 'event_display_name')->
773
            select('event.from_week')->
774
            select('event.to_week')->
775
            select('event.grace_period')->
776
            select('event.force_period')->
777
            select('delivery.creation_date')->
778
            select('delivery.id', 'delivery_id')->
779
            select('event.folder_id')->
780
            select_expr('SUM(folder_delivery.delivery_id IS NOT NULL AND (folder_delivery.snapshot_id IS NULL))', 'c')->
781
            left_outer_join('delivery', array('delivery.item_id', '=', 'event_profile_delivery_item.id'))->
782
            left_outer_join('folder_delivery', 'folder_delivery.delivery_id=delivery.id AND folder_delivery.folder_id=event.folder_id')->
783
            where('event.folder_id', $folderId)->
784
            where('event.organization_id', $orgId)->
785
            where('event_profile_delivery_item.is_visible', 1)->
786
            group_by('event_profile_delivery_item.id')->
787
            group_by('delivery.id')->
788
            group_by('delivery.creation_date');
789
790
    return $data;
791
}
792
793
function getFolderItems($folderId, $orgId) {
794
    $data = getFolderItemsBase($folderId, $orgId)->
795
            order_by_asc('event_profile_delivery_item.profile_id')->
796
            order_by_asc('event_profile_delivery_item.order_nr');
797
798
    return $data;
799
}
800
801
function getFolderItemsInSnapshot($folderId, $orgId, $snapshotId = null) {
802
        $data = ORM::for_table('event_profile_delivery_item')->
803
            inner_join('event', array('event.id', '=', 'event_id'))->
804
            select('event_profile_delivery_item.id')->
805
            select('event_profile_delivery_item.event_id')->
806
            select('event_profile_delivery_item.display_name')->
807
            select('event_profile_delivery_item.document_name')->
808
            select('event_profile_delivery_item.profile_id')->
809
            select('event.display_name', 'event_display_name')->
810
            select('event.from_week')->
811
            select('event.to_week')->
812
            select('event.grace_period')->
813
            select('event.force_period')->
814
            select('delivery.creation_date')->
815
            select('delivery.id', 'delivery_id')->
816
            select('event.folder_id')->
817
            select_expr('SUM(folder_delivery.delivery_id IS NOT NULL AND (folder_delivery.snapshot_id IS NULL))', 'c')->
818
            left_outer_join('delivery', array('delivery.item_id', '=', 'event_profile_delivery_item.id'))->
819
            left_outer_join('folder_delivery', 'folder_delivery.delivery_id=delivery.id AND folder_delivery.folder_id=event.folder_id')->
820
            where('event.folder_id', $folderId)->
821
            where('event.organization_id', $orgId)->
822
            where('event_profile_delivery_item.is_visible', 1)->
823
            group_by('event_profile_delivery_item.id');
824
825
    if ($snapshotId) {
826
        $data = $data->where('folder_delivery.snapshot_id', $snapshotId);
827
    }
828
    else {
829
        $data = $data->where_not_null('folder_delivery.snapshot_id')->
830
                order_by_asc('folder_delivery.snapshot_id');
831
    }
832
    
833
    return $data;
834
}
835
836
function getFolderItemsByUser($userId, $folderId, $orgId) {
837
    $data = getFolderItems($folderId, $orgId)->
838
            left_outer_join('person_profile', array('person_profile.profile_id', '=', 'event_profile_delivery_item.profile_id'))->
839
            where('person_profile.person_id', $userId)->
840
            find_array();
841
842
    return $data;
843
}
844
845
function getProfile($profileId) {
846
    return ORM::for_table('profile')->
847
            select('profile.id')->
848
            select('profile.display_name')->
849
            select('profile.profile_group_id')->
850
            select('profile.initials')->
851
            select('profile_group.display_name_neutral')->
852
            select('profile_group.display_name_male')->
853
            select('profile_group.display_name_female')->
854
            inner_join('profile_group', array('profile_group.id', '=', 'profile.profile_group_id'))->
855
            find_one($profileId);
856
}
857
858
function getDeliveryItemCount($profileId, $folderId, $itemId) {
859
    return ORM::for_table('delivery')->
860
            inner_join('folder_delivery', array('folder_delivery.delivery_id', '=', 'delivery.id'))->
861
            where('folder_delivery.folder_id', $folderId)->
862
            where('delivery.profile_id', $profileId)->
863
            where('delivery.item_id', $itemId)->
864
            where_null('folder_delivery.snapshot_id')->
865
            count();
866
}
867
868
function getDocumentDataByHash($hash) {
869
    return ORM::for_table('document_data')->
870
            where('data_hash', $hash)->
871
            find_one();
872
}
873
874
function getDocumentByHash($hash) {
875
    return ORM::for_table('document')->
876
            select('document.*')->
877
            inner_join('document_data', array('document_data.id', '=', 'document.document_data_id'))->
878
            where('document_data.data_hash', $hash)->
879
            find_one();
880
}
881
882
function getExtension($ext) {
883
    return ORM::for_table('file_extension')->
884
            find_one($ext);
885
}
886
887
function getPersonsWithEventByFolderAndProfile($folderId, $profileId) {
888
    return ORM::for_table('person')->distinct()->
889
            select('person.id')->
890
            select('event.id', 'event_id')->
891
            inner_join('person_profile', array('person_profile.person_id', '=', 'person.id'))->
892
            inner_join('event_profile_delivery_item', array('event_profile_delivery_item.profile_id', '=', 'person_profile.profile_id'))->
893
            inner_join('event', array('event.id', '=', 'event_profile_delivery_item.event_id'))->
894
            inner_join('folder', array('folder.id', '=', 'event.folder_id'))->
895
            where('event.folder_id', $folderId)->
896
            where('event_profile_delivery_item.profile_id', $profileId)->
897
            where('event.is_automatic', 1)->
898
            find_array();
899
}
900
901
function checkItemUpdateStatus($folderId, $profileId) {
902
    $data = getFolderProfileDeliveryStatsByProfile($folderId, $profileId);
903
904
    // para cada perfil que tiene ítems, comprobamos si están todos los
905
    // elementos
906
    foreach ($data as $item) {
907
908
        // obtener usuarios asociados a esta carpeta y perfil
909
        $persons = getPersonsWithEventByFolderAndProfile($folderId, $profileId);
910
911
        if ($item['total'] == $item['c']) {
912
            // están todos los elementos: marcar como completados los eventos
913
            // de todos los usuarios
914
            foreach($persons as $person) {
915
                removeCompletedEvent($person['event_id'], $person['id']);
916
                addCompletedEvent($person['event_id'], $person['id']);
917
            }
918
        }
919
        else {
920
            // no están todos los elementos: marcar como incompletos los eventos
921
            // de todos los usuarios
922
            foreach($persons as $person) {
923
                removeCompletedEvent($person['event_id'], $person['id']);
924
            }
925
        }
926
    }
927
}
928
929
function checkItemUpdateStatusByProfile($profile) {
930
    // revisar los eventos de completado automático
931
    $profileData = getProfile($profile);
932
    $events = ORM::for_table('event_profile')->
933
    select('event.*')->
934
    inner_join('event', array('event.id', '=', 'event_id'))->
935
    where_in('profile_id', array($profile, $profileData['profile_group_id']))->
936
    find_array();
937
938
    foreach($events as $event) {
939
        if ($event['folder_id']) {
940
            checkItemUpdateStatus($event['folder_id'], $profile);
941
        }
942
    }
943
}
944
945
function checkItemUpdateStatusByFolder($folderId) {
946
    // revisar los eventos de completado automático
947
    $profiles = ORM::for_table('event_profile')->
948
        select('profile_id')->
949
        distinct()->
950
        inner_join('event', array('event.id', '=', 'event_id'))->
951
        where('event.folder_id', $folderId)->
952
        find_array();
953
954
    $profiles = array_column($profiles, 'profile_id');
955
956
    if (empty($profiles)) {
957
        $allProfiles = array();
958
    }
959
    else {
960
        $allProfiles = ORM::for_table('profile')->
961
            select('id')->
962
            distinct()->
963
            where_in('profile_group_id', $profiles)->
964
            find_array();
965
        $allProfiles = array_column($allProfiles, 'id');
966
    }
967
968
    $allProfiles = array_merge($profiles, $allProfiles);
969
970
    foreach($allProfiles as $profile) {
971
        checkItemUpdateStatus($folderId, $profile);
972
    }
973
}
974
975
function createDelivery($folderId, $userId, $profileId, $fileName, $deliveryName, $description, $itemId, $dataPath, $dataHash, $filesize, $revisionNr = 0) {
976
977
    $order = ORM::for_table('folder_delivery')->
978
            where('folder_id', $folderId)->
979
            max('order_nr');
980
981
    ORM::get_db()->beginTransaction();
982
983
    if (!trim($profileId)) {
984
        $profileId = null;
985
    }
986
    $delivery = ORM::for_table('delivery')->create();
987
    $delivery->set('profile_id', $profileId);
988
    $delivery->set('item_id', $itemId);
989
    $delivery->set('display_name', $deliveryName);
990
    $delivery->set('description', $description);
991
    $delivery->set('creation_date', date('Y-m-d H:s'));
992
    $delivery->save();
993
994
    $folderDelivery = ORM::for_table('folder_delivery')->create();
995
    $folderDelivery->set('folder_id', $folderId);
996
    $folderDelivery->set('delivery_id', $delivery['id']);
997
    $folderDelivery->set('order_nr', $order + 1000);
998
    $folderDelivery->save();
999
1000
    $revision = createRevision($delivery['id'], $userId, $fileName, $dataPath, $dataHash, $filesize, $revisionNr);
1001
1002
    $delivery->set('current_revision_id', $revision['id']);
1003
    $delivery->save();
1004
1005
    checkItemUpdateStatus($folderId, $profileId);
1006
1007
    return ORM::get_db()->commit();
1008
}
1009
1010
function createRevision($deliveryId, $userId, $fileName, $dataPath, $dataHash, $filesize, $revisionNr, $uploadComment = null) {
1011
1012
    $revision = ORM::for_table('revision')->create();
1013
    $revision->set('delivery_id', $deliveryId);
1014
    $revision->set('uploader_person_id', $userId);
1015
    $revision->set('upload_date', date('Y-m-d H:i:s'));
1016
    $revision->set('revision_nr', $revisionNr);
1017
    if ($uploadComment) {
1018
        $revision->set('upload_comment', $uploadComment);
1019
    }
1020
    $revision->save();
1021
1022
    $document = createDocument($revision['id'], $fileName, $dataHash, $dataPath, $filesize);
1023
1024
    $revision->set('original_document_id', $document['id']);
1025
    $revision->save();
1026
1027
    return $revision;
1028
}
1029
1030
function createDocument($revisionId, $fileName, $dataHash, $dataPath, $filesize) {
1031
1032
    $documentData = getDocumentDataByHash($dataHash);
1033
1034
    if (false === $documentData) {
1035
        $documentData = ORM::for_table('document_data')->create();
1036
        $documentData->set('download_path', $dataPath);
1037
        $documentData->set('data_hash', $dataHash);
1038
        $documentData->set('download_filesize', $filesize);
1039
        $documentData->save();
1040
    }
1041
1042
    $ext = pathinfo($fileName, PATHINFO_EXTENSION);
1043
1044
    $extension = getExtension($ext);
1045
    if (false === $extension) {
1046
        $extension = ORM::for_table('file_extension')->create();
1047
        $extension->set('id', $ext);
1048
        $extension->set('mime', 'application/octet-stream');
1049
        $extension->set('display_name', 'Documento .' . $ext);
1050
        $extension->set('icon', 'icon-none.png');
1051
        $extension->save();
1052
    }
1053
1054
    $document = ORM::for_table('document')->create();
1055
    $document->set('document_data_id', $documentData['id']);
1056
    $document->set('download_filename', $fileName);
1057
    $document->set('extension_id', $extension['id']);
1058
    $document->set('revision_id', $revisionId);
1059
    $document->save();
1060
1061
    return $document;
1062
}
1063
1064
function parseVariables($string, $organization, $user, $profile) {
1065
    return preg_replace_callback('~(\\{[^}]+\\})~',
1066
            function($token_array) use ($organization, $user, $profile) {
1067
                $token = trim($token_array[0], '{}');
1068
                switch ($token) {
1069
                    case 'user.initials':
1070
                        return $user['initials'];
1071
                    case 'user.name':
1072
                        return $user['display_name'];
1073
                    case 'profile.initials':
1074
                        return $profile['initials'];
1075
                    case 'profile.name':
1076
                        return $profile['display_name'];
1077
                }
1078
1079
                // probar con las variables de la tabla 'variables'
1080
                // específico para esta organización
1081
                $data = ORM::for_table('variable')->
1082
                        where('name', $token)->
1083
                        where('organization_id', $organization['id'])->
1084
                        find_one();
1085
1086
                // probar con las variables de la tabla 'variables'
1087
                // en genérico si no hay nada específico
1088
                if (!$data) {
1089
                    $data = ORM::for_table('variable')->
1090
                        where('name', $token)->
1091
                        where_null('organization_id')->
1092
                        find_one();
1093
                }
1094
                return $data ? $data['content'] : NULL;
1095
        }, $string);
1096
}
1097
1098
function parseVariablesArray($data, $organization, $user, $profile, $profiles = null) {
1099
    foreach ($data as $k => $item) {
1100
        $data[$k]['display_name'] = parseVariables($data[$k]['display_name'], $organization, $user, $profiles ? $profiles[$data[$k][$profile]] : $profile);
1101
    }
1102
    return $data;
1103
}
1104