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.

upload.php ➔ checkItemUpdateStatus()   B
last analyzed

Complexity

Conditions 5
Paths 5

Size

Total Lines 27
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

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