Commit d653b27fef7fd3ed9aacc6309a977edf58044efb
1 parent
a3751795
Exists in
master
and in
3 other branches
Correction de fautes de français, correction de bugs, màj de la base de données,…
… les noms des maériels sont maintenant en rouge dans la liste lorsque la date de garantie est dépassée et la date elle même est rouge dans la fiche détaillées du matériel
Showing
50 changed files
with
2115 additions
and
343 deletions
Show diff stats
composer.json
composer.lock
... | ... | @@ -4,8 +4,8 @@ |
4 | 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", |
5 | 5 | "This file is @generated automatically" |
6 | 6 | ], |
7 | - "hash": "f3c40c441166c950fe8099531a9d5970", | |
8 | - "content-hash": "5701970d465c36d8bd0d3846ff00efec", | |
7 | + "hash": "89645e7a585f3dc620817a0408eb0ede", | |
8 | + "content-hash": "ab13ce1b88067ed3a8ee3bb1578dac09", | |
9 | 9 | "packages": [ |
10 | 10 | { |
11 | 11 | "name": "aura/installer-default", |
... | ... | @@ -825,16 +825,16 @@ |
825 | 825 | }, |
826 | 826 | { |
827 | 827 | "name": "symfony/yaml", |
828 | - "version": "v3.2.7", | |
828 | + "version": "v3.2.8", | |
829 | 829 | "source": { |
830 | 830 | "type": "git", |
831 | 831 | "url": "https://github.com/symfony/yaml.git", |
832 | - "reference": "62b4cdb99d52cb1ff253c465eb1532a80cebb621" | |
832 | + "reference": "acec26fcf7f3031e094e910b94b002fa53d4e4d6" | |
833 | 833 | }, |
834 | 834 | "dist": { |
835 | 835 | "type": "zip", |
836 | - "url": "https://api.github.com/repos/symfony/yaml/zipball/62b4cdb99d52cb1ff253c465eb1532a80cebb621", | |
837 | - "reference": "62b4cdb99d52cb1ff253c465eb1532a80cebb621", | |
836 | + "url": "https://api.github.com/repos/symfony/yaml/zipball/acec26fcf7f3031e094e910b94b002fa53d4e4d6", | |
837 | + "reference": "acec26fcf7f3031e094e910b94b002fa53d4e4d6", | |
838 | 838 | "shasum": "" |
839 | 839 | }, |
840 | 840 | "require": { |
... | ... | @@ -876,7 +876,7 @@ |
876 | 876 | ], |
877 | 877 | "description": "Symfony Yaml Component", |
878 | 878 | "homepage": "https://symfony.com", |
879 | - "time": "2017-03-20 09:45:15" | |
879 | + "time": "2017-05-01 14:55:58" | |
880 | 880 | } |
881 | 881 | ], |
882 | 882 | "packages-dev": [ |
... | ... | @@ -1101,6 +1101,48 @@ |
1101 | 1101 | "time": "2015-04-20 18:58:01" |
1102 | 1102 | }, |
1103 | 1103 | { |
1104 | + "name": "myclabs/deep-copy", | |
1105 | + "version": "1.6.1", | |
1106 | + "source": { | |
1107 | + "type": "git", | |
1108 | + "url": "https://github.com/myclabs/DeepCopy.git", | |
1109 | + "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102" | |
1110 | + }, | |
1111 | + "dist": { | |
1112 | + "type": "zip", | |
1113 | + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102", | |
1114 | + "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102", | |
1115 | + "shasum": "" | |
1116 | + }, | |
1117 | + "require": { | |
1118 | + "php": ">=5.4.0" | |
1119 | + }, | |
1120 | + "require-dev": { | |
1121 | + "doctrine/collections": "1.*", | |
1122 | + "phpunit/phpunit": "~4.1" | |
1123 | + }, | |
1124 | + "type": "library", | |
1125 | + "autoload": { | |
1126 | + "psr-4": { | |
1127 | + "DeepCopy\\": "src/DeepCopy/" | |
1128 | + } | |
1129 | + }, | |
1130 | + "notification-url": "https://packagist.org/downloads/", | |
1131 | + "license": [ | |
1132 | + "MIT" | |
1133 | + ], | |
1134 | + "description": "Create deep copies (clones) of your objects", | |
1135 | + "homepage": "https://github.com/myclabs/DeepCopy", | |
1136 | + "keywords": [ | |
1137 | + "clone", | |
1138 | + "copy", | |
1139 | + "duplicate", | |
1140 | + "object", | |
1141 | + "object graph" | |
1142 | + ], | |
1143 | + "time": "2017-04-12 18:52:22" | |
1144 | + }, | |
1145 | + { | |
1104 | 1146 | "name": "nikic/php-parser", |
1105 | 1147 | "version": "v2.1.0", |
1106 | 1148 | "source": { |
... | ... | @@ -1362,39 +1404,40 @@ |
1362 | 1404 | }, |
1363 | 1405 | { |
1364 | 1406 | "name": "phpunit/php-code-coverage", |
1365 | - "version": "2.2.4", | |
1407 | + "version": "4.0.8", | |
1366 | 1408 | "source": { |
1367 | 1409 | "type": "git", |
1368 | 1410 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", |
1369 | - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" | |
1411 | + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" | |
1370 | 1412 | }, |
1371 | 1413 | "dist": { |
1372 | 1414 | "type": "zip", |
1373 | - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", | |
1374 | - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", | |
1415 | + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", | |
1416 | + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", | |
1375 | 1417 | "shasum": "" |
1376 | 1418 | }, |
1377 | 1419 | "require": { |
1378 | - "php": ">=5.3.3", | |
1379 | - "phpunit/php-file-iterator": "~1.3", | |
1380 | - "phpunit/php-text-template": "~1.2", | |
1381 | - "phpunit/php-token-stream": "~1.3", | |
1382 | - "sebastian/environment": "^1.3.2", | |
1383 | - "sebastian/version": "~1.0" | |
1420 | + "ext-dom": "*", | |
1421 | + "ext-xmlwriter": "*", | |
1422 | + "php": "^5.6 || ^7.0", | |
1423 | + "phpunit/php-file-iterator": "^1.3", | |
1424 | + "phpunit/php-text-template": "^1.2", | |
1425 | + "phpunit/php-token-stream": "^1.4.2 || ^2.0", | |
1426 | + "sebastian/code-unit-reverse-lookup": "^1.0", | |
1427 | + "sebastian/environment": "^1.3.2 || ^2.0", | |
1428 | + "sebastian/version": "^1.0 || ^2.0" | |
1384 | 1429 | }, |
1385 | 1430 | "require-dev": { |
1386 | - "ext-xdebug": ">=2.1.4", | |
1387 | - "phpunit/phpunit": "~4" | |
1431 | + "ext-xdebug": "^2.1.4", | |
1432 | + "phpunit/phpunit": "^5.7" | |
1388 | 1433 | }, |
1389 | 1434 | "suggest": { |
1390 | - "ext-dom": "*", | |
1391 | - "ext-xdebug": ">=2.2.1", | |
1392 | - "ext-xmlwriter": "*" | |
1435 | + "ext-xdebug": "^2.5.1" | |
1393 | 1436 | }, |
1394 | 1437 | "type": "library", |
1395 | 1438 | "extra": { |
1396 | 1439 | "branch-alias": { |
1397 | - "dev-master": "2.2.x-dev" | |
1440 | + "dev-master": "4.0.x-dev" | |
1398 | 1441 | } |
1399 | 1442 | }, |
1400 | 1443 | "autoload": { |
... | ... | @@ -1420,7 +1463,7 @@ |
1420 | 1463 | "testing", |
1421 | 1464 | "xunit" |
1422 | 1465 | ], |
1423 | - "time": "2015-10-06 15:47:00" | |
1466 | + "time": "2017-04-02 07:44:40" | |
1424 | 1467 | }, |
1425 | 1468 | { |
1426 | 1469 | "name": "phpunit/php-file-iterator", |
... | ... | @@ -1610,40 +1653,50 @@ |
1610 | 1653 | }, |
1611 | 1654 | { |
1612 | 1655 | "name": "phpunit/phpunit", |
1613 | - "version": "4.8.35", | |
1656 | + "version": "5.7.19", | |
1614 | 1657 | "source": { |
1615 | 1658 | "type": "git", |
1616 | 1659 | "url": "https://github.com/sebastianbergmann/phpunit.git", |
1617 | - "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87" | |
1660 | + "reference": "69c4f49ff376af2692bad9cebd883d17ebaa98a1" | |
1618 | 1661 | }, |
1619 | 1662 | "dist": { |
1620 | 1663 | "type": "zip", |
1621 | - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/791b1a67c25af50e230f841ee7a9c6eba507dc87", | |
1622 | - "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87", | |
1664 | + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/69c4f49ff376af2692bad9cebd883d17ebaa98a1", | |
1665 | + "reference": "69c4f49ff376af2692bad9cebd883d17ebaa98a1", | |
1623 | 1666 | "shasum": "" |
1624 | 1667 | }, |
1625 | 1668 | "require": { |
1626 | 1669 | "ext-dom": "*", |
1627 | 1670 | "ext-json": "*", |
1628 | - "ext-pcre": "*", | |
1629 | - "ext-reflection": "*", | |
1630 | - "ext-spl": "*", | |
1631 | - "php": ">=5.3.3", | |
1632 | - "phpspec/prophecy": "^1.3.1", | |
1633 | - "phpunit/php-code-coverage": "~2.1", | |
1671 | + "ext-libxml": "*", | |
1672 | + "ext-mbstring": "*", | |
1673 | + "ext-xml": "*", | |
1674 | + "myclabs/deep-copy": "~1.3", | |
1675 | + "php": "^5.6 || ^7.0", | |
1676 | + "phpspec/prophecy": "^1.6.2", | |
1677 | + "phpunit/php-code-coverage": "^4.0.4", | |
1634 | 1678 | "phpunit/php-file-iterator": "~1.4", |
1635 | 1679 | "phpunit/php-text-template": "~1.2", |
1636 | 1680 | "phpunit/php-timer": "^1.0.6", |
1637 | - "phpunit/phpunit-mock-objects": "~2.3", | |
1638 | - "sebastian/comparator": "~1.2.2", | |
1681 | + "phpunit/phpunit-mock-objects": "^3.2", | |
1682 | + "sebastian/comparator": "^1.2.4", | |
1639 | 1683 | "sebastian/diff": "~1.2", |
1640 | - "sebastian/environment": "~1.3", | |
1641 | - "sebastian/exporter": "~1.2", | |
1642 | - "sebastian/global-state": "~1.0", | |
1643 | - "sebastian/version": "~1.0", | |
1684 | + "sebastian/environment": "^1.3.4 || ^2.0", | |
1685 | + "sebastian/exporter": "~2.0", | |
1686 | + "sebastian/global-state": "^1.1", | |
1687 | + "sebastian/object-enumerator": "~2.0", | |
1688 | + "sebastian/resource-operations": "~1.0", | |
1689 | + "sebastian/version": "~1.0.3|~2.0", | |
1644 | 1690 | "symfony/yaml": "~2.1|~3.0" |
1645 | 1691 | }, |
1692 | + "conflict": { | |
1693 | + "phpdocumentor/reflection-docblock": "3.0.2" | |
1694 | + }, | |
1695 | + "require-dev": { | |
1696 | + "ext-pdo": "*" | |
1697 | + }, | |
1646 | 1698 | "suggest": { |
1699 | + "ext-xdebug": "*", | |
1647 | 1700 | "phpunit/php-invoker": "~1.1" |
1648 | 1701 | }, |
1649 | 1702 | "bin": [ |
... | ... | @@ -1652,7 +1705,7 @@ |
1652 | 1705 | "type": "library", |
1653 | 1706 | "extra": { |
1654 | 1707 | "branch-alias": { |
1655 | - "dev-master": "4.8.x-dev" | |
1708 | + "dev-master": "5.7.x-dev" | |
1656 | 1709 | } |
1657 | 1710 | }, |
1658 | 1711 | "autoload": { |
... | ... | @@ -1678,30 +1731,33 @@ |
1678 | 1731 | "testing", |
1679 | 1732 | "xunit" |
1680 | 1733 | ], |
1681 | - "time": "2017-02-06 05:18:07" | |
1734 | + "time": "2017-04-03 02:22:27" | |
1682 | 1735 | }, |
1683 | 1736 | { |
1684 | 1737 | "name": "phpunit/phpunit-mock-objects", |
1685 | - "version": "2.3.8", | |
1738 | + "version": "3.4.3", | |
1686 | 1739 | "source": { |
1687 | 1740 | "type": "git", |
1688 | 1741 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", |
1689 | - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" | |
1742 | + "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24" | |
1690 | 1743 | }, |
1691 | 1744 | "dist": { |
1692 | 1745 | "type": "zip", |
1693 | - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", | |
1694 | - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", | |
1746 | + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", | |
1747 | + "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", | |
1695 | 1748 | "shasum": "" |
1696 | 1749 | }, |
1697 | 1750 | "require": { |
1698 | 1751 | "doctrine/instantiator": "^1.0.2", |
1699 | - "php": ">=5.3.3", | |
1700 | - "phpunit/php-text-template": "~1.2", | |
1701 | - "sebastian/exporter": "~1.2" | |
1752 | + "php": "^5.6 || ^7.0", | |
1753 | + "phpunit/php-text-template": "^1.2", | |
1754 | + "sebastian/exporter": "^1.2 || ^2.0" | |
1755 | + }, | |
1756 | + "conflict": { | |
1757 | + "phpunit/phpunit": "<5.4.0" | |
1702 | 1758 | }, |
1703 | 1759 | "require-dev": { |
1704 | - "phpunit/phpunit": "~4.4" | |
1760 | + "phpunit/phpunit": "^5.4" | |
1705 | 1761 | }, |
1706 | 1762 | "suggest": { |
1707 | 1763 | "ext-soap": "*" |
... | ... | @@ -1709,7 +1765,7 @@ |
1709 | 1765 | "type": "library", |
1710 | 1766 | "extra": { |
1711 | 1767 | "branch-alias": { |
1712 | - "dev-master": "2.3.x-dev" | |
1768 | + "dev-master": "3.2.x-dev" | |
1713 | 1769 | } |
1714 | 1770 | }, |
1715 | 1771 | "autoload": { |
... | ... | @@ -1734,7 +1790,7 @@ |
1734 | 1790 | "mock", |
1735 | 1791 | "xunit" |
1736 | 1792 | ], |
1737 | - "time": "2015-10-02 06:51:40" | |
1793 | + "time": "2016-12-08 20:27:08" | |
1738 | 1794 | }, |
1739 | 1795 | { |
1740 | 1796 | "name": "psy/psysh", |
... | ... | @@ -1809,6 +1865,51 @@ |
1809 | 1865 | "time": "2016-03-09 05:03:14" |
1810 | 1866 | }, |
1811 | 1867 | { |
1868 | + "name": "sebastian/code-unit-reverse-lookup", | |
1869 | + "version": "1.0.1", | |
1870 | + "source": { | |
1871 | + "type": "git", | |
1872 | + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", | |
1873 | + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" | |
1874 | + }, | |
1875 | + "dist": { | |
1876 | + "type": "zip", | |
1877 | + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", | |
1878 | + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", | |
1879 | + "shasum": "" | |
1880 | + }, | |
1881 | + "require": { | |
1882 | + "php": "^5.6 || ^7.0" | |
1883 | + }, | |
1884 | + "require-dev": { | |
1885 | + "phpunit/phpunit": "^5.7 || ^6.0" | |
1886 | + }, | |
1887 | + "type": "library", | |
1888 | + "extra": { | |
1889 | + "branch-alias": { | |
1890 | + "dev-master": "1.0.x-dev" | |
1891 | + } | |
1892 | + }, | |
1893 | + "autoload": { | |
1894 | + "classmap": [ | |
1895 | + "src/" | |
1896 | + ] | |
1897 | + }, | |
1898 | + "notification-url": "https://packagist.org/downloads/", | |
1899 | + "license": [ | |
1900 | + "BSD-3-Clause" | |
1901 | + ], | |
1902 | + "authors": [ | |
1903 | + { | |
1904 | + "name": "Sebastian Bergmann", | |
1905 | + "email": "sebastian@phpunit.de" | |
1906 | + } | |
1907 | + ], | |
1908 | + "description": "Looks up which function or method a line of code belongs to", | |
1909 | + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", | |
1910 | + "time": "2017-03-04 06:30:41" | |
1911 | + }, | |
1912 | + { | |
1812 | 1913 | "name": "sebastian/comparator", |
1813 | 1914 | "version": "1.2.4", |
1814 | 1915 | "source": { |
... | ... | @@ -1926,28 +2027,28 @@ |
1926 | 2027 | }, |
1927 | 2028 | { |
1928 | 2029 | "name": "sebastian/environment", |
1929 | - "version": "1.3.8", | |
2030 | + "version": "2.0.0", | |
1930 | 2031 | "source": { |
1931 | 2032 | "type": "git", |
1932 | 2033 | "url": "https://github.com/sebastianbergmann/environment.git", |
1933 | - "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea" | |
2034 | + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" | |
1934 | 2035 | }, |
1935 | 2036 | "dist": { |
1936 | 2037 | "type": "zip", |
1937 | - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea", | |
1938 | - "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea", | |
2038 | + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", | |
2039 | + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", | |
1939 | 2040 | "shasum": "" |
1940 | 2041 | }, |
1941 | 2042 | "require": { |
1942 | - "php": "^5.3.3 || ^7.0" | |
2043 | + "php": "^5.6 || ^7.0" | |
1943 | 2044 | }, |
1944 | 2045 | "require-dev": { |
1945 | - "phpunit/phpunit": "^4.8 || ^5.0" | |
2046 | + "phpunit/phpunit": "^5.0" | |
1946 | 2047 | }, |
1947 | 2048 | "type": "library", |
1948 | 2049 | "extra": { |
1949 | 2050 | "branch-alias": { |
1950 | - "dev-master": "1.3.x-dev" | |
2051 | + "dev-master": "2.0.x-dev" | |
1951 | 2052 | } |
1952 | 2053 | }, |
1953 | 2054 | "autoload": { |
... | ... | @@ -1972,25 +2073,25 @@ |
1972 | 2073 | "environment", |
1973 | 2074 | "hhvm" |
1974 | 2075 | ], |
1975 | - "time": "2016-08-18 05:49:44" | |
2076 | + "time": "2016-11-26 07:53:53" | |
1976 | 2077 | }, |
1977 | 2078 | { |
1978 | 2079 | "name": "sebastian/exporter", |
1979 | - "version": "1.2.2", | |
2080 | + "version": "2.0.0", | |
1980 | 2081 | "source": { |
1981 | 2082 | "type": "git", |
1982 | 2083 | "url": "https://github.com/sebastianbergmann/exporter.git", |
1983 | - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" | |
2084 | + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" | |
1984 | 2085 | }, |
1985 | 2086 | "dist": { |
1986 | 2087 | "type": "zip", |
1987 | - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", | |
1988 | - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", | |
2088 | + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", | |
2089 | + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", | |
1989 | 2090 | "shasum": "" |
1990 | 2091 | }, |
1991 | 2092 | "require": { |
1992 | 2093 | "php": ">=5.3.3", |
1993 | - "sebastian/recursion-context": "~1.0" | |
2094 | + "sebastian/recursion-context": "~2.0" | |
1994 | 2095 | }, |
1995 | 2096 | "require-dev": { |
1996 | 2097 | "ext-mbstring": "*", |
... | ... | @@ -1999,7 +2100,7 @@ |
1999 | 2100 | "type": "library", |
2000 | 2101 | "extra": { |
2001 | 2102 | "branch-alias": { |
2002 | - "dev-master": "1.3.x-dev" | |
2103 | + "dev-master": "2.0.x-dev" | |
2003 | 2104 | } |
2004 | 2105 | }, |
2005 | 2106 | "autoload": { |
... | ... | @@ -2039,7 +2140,7 @@ |
2039 | 2140 | "export", |
2040 | 2141 | "exporter" |
2041 | 2142 | ], |
2042 | - "time": "2016-06-17 09:04:28" | |
2143 | + "time": "2016-11-19 08:54:04" | |
2043 | 2144 | }, |
2044 | 2145 | { |
2045 | 2146 | "name": "sebastian/global-state", |
... | ... | @@ -2093,17 +2194,63 @@ |
2093 | 2194 | "time": "2015-10-12 03:26:01" |
2094 | 2195 | }, |
2095 | 2196 | { |
2197 | + "name": "sebastian/object-enumerator", | |
2198 | + "version": "2.0.1", | |
2199 | + "source": { | |
2200 | + "type": "git", | |
2201 | + "url": "https://github.com/sebastianbergmann/object-enumerator.git", | |
2202 | + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" | |
2203 | + }, | |
2204 | + "dist": { | |
2205 | + "type": "zip", | |
2206 | + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", | |
2207 | + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", | |
2208 | + "shasum": "" | |
2209 | + }, | |
2210 | + "require": { | |
2211 | + "php": ">=5.6", | |
2212 | + "sebastian/recursion-context": "~2.0" | |
2213 | + }, | |
2214 | + "require-dev": { | |
2215 | + "phpunit/phpunit": "~5" | |
2216 | + }, | |
2217 | + "type": "library", | |
2218 | + "extra": { | |
2219 | + "branch-alias": { | |
2220 | + "dev-master": "2.0.x-dev" | |
2221 | + } | |
2222 | + }, | |
2223 | + "autoload": { | |
2224 | + "classmap": [ | |
2225 | + "src/" | |
2226 | + ] | |
2227 | + }, | |
2228 | + "notification-url": "https://packagist.org/downloads/", | |
2229 | + "license": [ | |
2230 | + "BSD-3-Clause" | |
2231 | + ], | |
2232 | + "authors": [ | |
2233 | + { | |
2234 | + "name": "Sebastian Bergmann", | |
2235 | + "email": "sebastian@phpunit.de" | |
2236 | + } | |
2237 | + ], | |
2238 | + "description": "Traverses array structures and object graphs to enumerate all referenced objects", | |
2239 | + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", | |
2240 | + "time": "2017-02-18 15:18:39" | |
2241 | + }, | |
2242 | + { | |
2096 | 2243 | "name": "sebastian/recursion-context", |
2097 | - "version": "1.0.5", | |
2244 | + "version": "2.0.0", | |
2098 | 2245 | "source": { |
2099 | 2246 | "type": "git", |
2100 | 2247 | "url": "https://github.com/sebastianbergmann/recursion-context.git", |
2101 | - "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7" | |
2248 | + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" | |
2102 | 2249 | }, |
2103 | 2250 | "dist": { |
2104 | 2251 | "type": "zip", |
2105 | - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7", | |
2106 | - "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7", | |
2252 | + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", | |
2253 | + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", | |
2107 | 2254 | "shasum": "" |
2108 | 2255 | }, |
2109 | 2256 | "require": { |
... | ... | @@ -2115,7 +2262,7 @@ |
2115 | 2262 | "type": "library", |
2116 | 2263 | "extra": { |
2117 | 2264 | "branch-alias": { |
2118 | - "dev-master": "1.0.x-dev" | |
2265 | + "dev-master": "2.0.x-dev" | |
2119 | 2266 | } |
2120 | 2267 | }, |
2121 | 2268 | "autoload": { |
... | ... | @@ -2143,23 +2290,73 @@ |
2143 | 2290 | ], |
2144 | 2291 | "description": "Provides functionality to recursively process PHP variables", |
2145 | 2292 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", |
2146 | - "time": "2016-10-03 07:41:43" | |
2293 | + "time": "2016-11-19 07:33:16" | |
2294 | + }, | |
2295 | + { | |
2296 | + "name": "sebastian/resource-operations", | |
2297 | + "version": "1.0.0", | |
2298 | + "source": { | |
2299 | + "type": "git", | |
2300 | + "url": "https://github.com/sebastianbergmann/resource-operations.git", | |
2301 | + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" | |
2302 | + }, | |
2303 | + "dist": { | |
2304 | + "type": "zip", | |
2305 | + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", | |
2306 | + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", | |
2307 | + "shasum": "" | |
2308 | + }, | |
2309 | + "require": { | |
2310 | + "php": ">=5.6.0" | |
2311 | + }, | |
2312 | + "type": "library", | |
2313 | + "extra": { | |
2314 | + "branch-alias": { | |
2315 | + "dev-master": "1.0.x-dev" | |
2316 | + } | |
2317 | + }, | |
2318 | + "autoload": { | |
2319 | + "classmap": [ | |
2320 | + "src/" | |
2321 | + ] | |
2322 | + }, | |
2323 | + "notification-url": "https://packagist.org/downloads/", | |
2324 | + "license": [ | |
2325 | + "BSD-3-Clause" | |
2326 | + ], | |
2327 | + "authors": [ | |
2328 | + { | |
2329 | + "name": "Sebastian Bergmann", | |
2330 | + "email": "sebastian@phpunit.de" | |
2331 | + } | |
2332 | + ], | |
2333 | + "description": "Provides a list of PHP built-in functions that operate on resources", | |
2334 | + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", | |
2335 | + "time": "2015-07-28 20:34:47" | |
2147 | 2336 | }, |
2148 | 2337 | { |
2149 | 2338 | "name": "sebastian/version", |
2150 | - "version": "1.0.6", | |
2339 | + "version": "2.0.1", | |
2151 | 2340 | "source": { |
2152 | 2341 | "type": "git", |
2153 | 2342 | "url": "https://github.com/sebastianbergmann/version.git", |
2154 | - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" | |
2343 | + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" | |
2155 | 2344 | }, |
2156 | 2345 | "dist": { |
2157 | 2346 | "type": "zip", |
2158 | - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", | |
2159 | - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", | |
2347 | + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", | |
2348 | + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", | |
2160 | 2349 | "shasum": "" |
2161 | 2350 | }, |
2351 | + "require": { | |
2352 | + "php": ">=5.6" | |
2353 | + }, | |
2162 | 2354 | "type": "library", |
2355 | + "extra": { | |
2356 | + "branch-alias": { | |
2357 | + "dev-master": "2.0.x-dev" | |
2358 | + } | |
2359 | + }, | |
2163 | 2360 | "autoload": { |
2164 | 2361 | "classmap": [ |
2165 | 2362 | "src/" |
... | ... | @@ -2178,7 +2375,7 @@ |
2178 | 2375 | ], |
2179 | 2376 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", |
2180 | 2377 | "homepage": "https://github.com/sebastianbergmann/version", |
2181 | - "time": "2015-06-21 13:59:46" | |
2378 | + "time": "2016-10-03 07:35:21" | |
2182 | 2379 | }, |
2183 | 2380 | { |
2184 | 2381 | "name": "symfony/var-dumper", | ... | ... |
database/labinvent_2.1_12-05-16.sql
... | ... | @@ -362,6 +362,7 @@ CREATE TABLE IF NOT EXISTS `configurations` ( |
362 | 362 | `numero_labo_sans_annee` tinyint(1) DEFAULT NULL, |
363 | 363 | `date_commande_facultative` tinyint(1) DEFAULT NULL, |
364 | 364 | `taille_max_doc` int (15) DEFAULT '8000000', |
365 | + `aff_par_defaut` smallint(6) NOT NULL DEFAULT 20, | |
365 | 366 | PRIMARY KEY (`id`), |
366 | 367 | UNIQUE KEY `nom_UNIQUE` (`nom`) |
367 | 368 | ); |
... | ... | @@ -446,10 +447,47 @@ Insert into type_documents(nom) values ('Certificat de conformité'); |
446 | 447 | Insert into type_documents(nom) values ('Manuel d\'utilisation'); |
447 | 448 | |
448 | 449 | -- Insertion par défaut pour la table configuration |
449 | -Insert into `configurations`(`nom`, `mode_install`, `mode_debug`, `use_ldap`, `host_ldap`, `port_ldap`, `authentificationType_ldap`, `baseDn_ldap`, `filter_ldap`, `labName`, `labNameShort`, `labPresent`, `labUmr`, `hasPrinter`, `emailGuest1`, `emailGuest2`, `emailGuest3`) values ('default', '1', '0', '0', '', '', 'xxx', '', '', 'LABONAME', 'LABO', 'du ', '', '0', '', '', ''); | |
450 | +Insert into `configurations`( | |
451 | +`nom`, | |
452 | +`mode_install`, | |
453 | +`mode_debug`, | |
454 | +`use_ldap`, | |
455 | +`host_ldap`, | |
456 | +`port_ldap`, | |
457 | +`authentificationType_ldap`, | |
458 | +`baseDn_ldap`, | |
459 | +`filter_ldap`, | |
460 | +`labName`, | |
461 | +`labNameShort`, | |
462 | +`labPresent`, | |
463 | +`labUmr`, | |
464 | +`hasPrinter`, | |
465 | +`envoi_mail_management_dev` | |
466 | +`emailGuest1`, | |
467 | +`emailGuest2`, | |
468 | +`emailGuest3`) | |
469 | +values ( | |
470 | +'default', | |
471 | +'1', | |
472 | +'0', | |
473 | +'0', | |
474 | +'', | |
475 | +'', | |
476 | +'xxx', | |
477 | +'', | |
478 | +'', | |
479 | +'LABONAME', | |
480 | +'LABO', | |
481 | +'du ', | |
482 | +'', | |
483 | +'0', | |
484 | +'0', | |
485 | +'', | |
486 | +'', | |
487 | +''); | |
450 | 488 | |
451 | 489 | |
452 | 490 | |
453 | 491 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; |
454 | 492 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; |
455 | 493 | -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; |
494 | +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; | |
456 | 495 | \ No newline at end of file | ... | ... |
database/update/script_sql/db-update-2017-04-25.sql
src/Controller/AppController.php
... | ... | @@ -180,9 +180,11 @@ class AppController extends Controller |
180 | 180 | $this->set('idGmNa', TableRegistry::get('GroupesMetiers')->find()->where(['nom =' => 'N/A'])->first()['id']); |
181 | 181 | $this->set('idGtNa', TableRegistry::get('GroupesThematiques')->find()->where(['nom =' => 'N/A'])->first()['id']); |
182 | 182 | |
183 | - $displayElement = function ($nom, $valeur) { | |
183 | + $displayElement = function ($nom, $valeur, $params="") { | |
184 | + $balise = ($params != "") ? '<td '.$params.'>' : '<td>'; | |
185 | + // Ca c'est parce que sinon y'a au moins deux tests qui passent pas, a cause de l'espace dans la balise ... | |
184 | 186 | if ($valeur != "") |
185 | - echo '<tr><td><strong>'.$nom.' </strong></td><td>'.$valeur.'</td></tr>'; | |
187 | + echo '<tr><td><strong>'.$nom.' </strong></td>'.$balise.$valeur.'</td></tr>'; | |
186 | 188 | }; |
187 | 189 | $this->set('displayElement', $displayElement); |
188 | 190 | ... | ... |
src/Controller/MaterielsController.php
... | ... | @@ -2,6 +2,7 @@ |
2 | 2 | namespace App\Controller; |
3 | 3 | |
4 | 4 | use App\Controller\AppController; |
5 | +use Cake\Core\Configure; | |
5 | 6 | use Cake\ORM\TableRegistry; |
6 | 7 | use Cake\Mailer\Email; |
7 | 8 | |
... | ... | @@ -171,10 +172,12 @@ class MaterielsController extends AppController |
171 | 172 | */ |
172 | 173 | public function index() |
173 | 174 | { |
175 | + // Remplacement de $this->passedArgs[0] (deprecated) | |
176 | + // Par $this->request->params['pass'][0] | |
174 | 177 | $condition = ''; |
175 | - if (isset($this->passedArgs[0])) { | |
176 | - $condition = ['Materiels.status =' => $this->passedArgs[0]]; | |
177 | - $this->set('STATUS', $this->passedArgs[0]); | |
178 | + if (isset($this->request->params['pass'][0])) { | |
179 | + $condition = ['Materiels.status =' => $this->request->params['pass'][0]]; | |
180 | + $this->set('STATUS', $this->request->params['pass'][0]); | |
178 | 181 | } |
179 | 182 | |
180 | 183 | $GM = $this->request->query('GM'); |
... | ... | @@ -315,7 +318,7 @@ class MaterielsController extends AppController |
315 | 318 | } |
316 | 319 | |
317 | 320 | |
318 | - //return $this->redirect(['action' => 'view', $materiel->id]); | |
321 | + return $this->redirect(['action' => 'view', $materiel->id]); | |
319 | 322 | } else { |
320 | 323 | $this->Flash->error(__('Le matériel n\'a pas pu être ajouté.')); |
321 | 324 | } |
... | ... | @@ -339,8 +342,8 @@ class MaterielsController extends AppController |
339 | 342 | |
340 | 343 | $mail_responsable = TableRegistry::get('Users')->find()->select('email')->where(['username =' => $this->LdapAuth->user($this->request->session()->read('authType'))[0]])->first()['email']; |
341 | 344 | |
342 | - if(isset($this->request->params[0])) { | |
343 | - $cpMateriel = $this->Materiels->get($this->request->params[0]); | |
345 | + if(isset($this->request->params['pass'][0])) { | |
346 | + $cpMateriel = $this->Materiels->get($this->request->params['pass'][0]); | |
344 | 347 | $this->set('cpMateriel', $cpMateriel); |
345 | 348 | } |
346 | 349 | |
... | ... | @@ -892,10 +895,10 @@ class MaterielsController extends AppController |
892 | 895 | } |
893 | 896 | |
894 | 897 | |
895 | - else if (isset($this->passedArgs[0])) { | |
898 | + else if (isset($this->request->params['pass'][0])) { | |
896 | 899 | |
897 | 900 | $this->myDebug("OTHER CASE 3"); |
898 | - $what = $this->passedArgs[0]; | |
901 | + $what = $this->request->params['pass'][0]; | |
899 | 902 | if ($what == 'search') { |
900 | 903 | $materiels = $this->request->session()->read("result"); |
901 | 904 | } | ... | ... |
... | ... | @@ -0,0 +1,1453 @@ |
1 | +<?php | |
2 | +namespace App\Controller; | |
3 | + | |
4 | +use App\Controller\AppController; | |
5 | +use Cake\Core\Configure; | |
6 | +use Cake\ORM\TableRegistry; | |
7 | +use Cake\Mailer\Email; | |
8 | + | |
9 | +/** | |
10 | + * Materiels Controller | |
11 | + * | |
12 | + * @property \App\Model\Table\MaterielsTable $Materiels | |
13 | + */ | |
14 | +class MaterielsController extends AppController | |
15 | +{ | |
16 | + | |
17 | + private $NOTARCHIVED = ['CREATED', 'VALIDATED', 'TOBEARCHIVED']; | |
18 | + public $role; | |
19 | + | |
20 | + /** | |
21 | + * @param $user | |
22 | + * | |
23 | + * Give authorization for materiels | |
24 | + * | |
25 | + * @return boolean | |
26 | + */ | |
27 | + public function isAuthorized($user) | |
28 | + { | |
29 | + $configuration = TableRegistry::get('Configurations')->find()->where(['id =' => 1])->first(); | |
30 | + $role = TableRegistry::get('Users')->find()->where(['username' => $user[$configuration->authentificationType_ldap][0]])->first()['role']; | |
31 | + $this->role = $role; | |
32 | + $action = $this->request->params['action']; | |
33 | + | |
34 | + | |
35 | + if ($action == 'edit') { | |
36 | + $id = (int)$this->passedArgs[0]; | |
37 | + | |
38 | + if($this->isCreated($id) || $this->isValidated($id)) { | |
39 | + if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0].' '.$user['givenname'][0])) { | |
40 | + return true; | |
41 | + } | |
42 | + else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { | |
43 | + return true; | |
44 | + } | |
45 | + else if ($this->userHasRole('Administration')) { | |
46 | + return true; | |
47 | + } | |
48 | + } | |
49 | + if($this->userHasRole('Administration Plus')) { | |
50 | + return true; | |
51 | + } | |
52 | + } | |
53 | + | |
54 | + if ($action == 'delete') { | |
55 | + $id = (int)$this->passedArgs[0]; | |
56 | + | |
57 | + if($this->isCreated($id)) { | |
58 | + if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0].' '.$user['givenname'][0])) { | |
59 | + return true; | |
60 | + } | |
61 | + else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { | |
62 | + return true; | |
63 | + } | |
64 | + else if ($this->userHasRole('Administration')) { | |
65 | + return true; | |
66 | + } | |
67 | + } | |
68 | + } | |
69 | + | |
70 | + if ($action == 'statusValidated') { | |
71 | + $id = (int)$this->passedArgs[0]; | |
72 | + if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { | |
73 | + if($this->isCreated($id)) { | |
74 | + return true; | |
75 | + } | |
76 | + } | |
77 | + else if ($this->userHasRole('Administration')) { | |
78 | + if($this->isCreated($id)) { | |
79 | + return true; | |
80 | + } | |
81 | + } | |
82 | + } | |
83 | + | |
84 | + if ($action == 'statusToBeArchived') { | |
85 | + $id = (int)$this->passedArgs[0]; | |
86 | + if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { | |
87 | + if($this->isValidated($id)) { | |
88 | + return true; | |
89 | + } | |
90 | + } | |
91 | + else if ($this->userHasRole('Administration')) { | |
92 | + if($this->isValidated($id)) { | |
93 | + return true; | |
94 | + } | |
95 | + } | |
96 | + } | |
97 | + | |
98 | + if ($action == 'statusArchived') { | |
99 | + $id = (int)$this->passedArgs[0]; | |
100 | + if ($this->userHasRole('Administration')) { | |
101 | + if($this->isToBeArchived($id)) { | |
102 | + if($role == 'Super Administrateur') { | |
103 | + return false; | |
104 | + } | |
105 | + else { | |
106 | + return true; | |
107 | + } | |
108 | + } | |
109 | + } | |
110 | + } | |
111 | + | |
112 | + if ($action == 'export') { | |
113 | + if ($this->userHasRole('Responsable')) { | |
114 | + return true; | |
115 | + } | |
116 | + } | |
117 | + | |
118 | + if (in_array($action, ['execActions', 'setLabelIsPlaced', 'setLabelIsPlacedOrNotPlaced', 'setLabelIsNotPlaced', 'printLabelRuban'])) { | |
119 | + if ($this->userHasRole('Administration')) { | |
120 | + return true; | |
121 | + } | |
122 | + } | |
123 | + | |
124 | + | |
125 | + | |
126 | + return parent::isAuthorized($user); | |
127 | + } | |
128 | + | |
129 | + public function isOwnedBy($id, $nomCreateur) | |
130 | + { | |
131 | + return ($this->Materiels->exists(['id' => $id, 'nom_createur' => $nomCreateur]) || $this->Materiels->exists(['id' => $id, 'nom_responsable' => $nomCreateur])); | |
132 | + } | |
133 | + | |
134 | + public function isRespGroup($id, $loginResponsable) | |
135 | + { | |
136 | + $u = TableRegistry::get('Users')->find()->where(['username' => $loginResponsable])->first(); | |
137 | + | |
138 | + if(isset($u['groupes_metier_id']) && $u['groupes_metier_id'] != TableRegistry::get('GroupesMetiers')->find()->where(['nom =' => 'N/A'])->first()['id']) { | |
139 | + return ($this->Materiels->exists(['id' => $id, 'groupes_metier_id' => $u['groupes_metier_id']])); | |
140 | + } | |
141 | + else if (isset($u['groupe_thematique_id']) && $u['groupe_thematique_id'] != TableRegistry::get('GroupesThematiques')->find()->where(['nom =' => 'N/A'])->first()['id']) { | |
142 | + return ($this->Materiels->exists(['id' => $id, 'groupes_thematique_id' => $u['groupe_thematique_id']])); | |
143 | + } | |
144 | + else { | |
145 | + return false; | |
146 | + } | |
147 | + } | |
148 | + | |
149 | + public function isCreated($id) | |
150 | + { | |
151 | + return $this->Materiels->exists(['id' => $id, 'status' => 'CREATED']); | |
152 | + } | |
153 | + public function isValidated($id) | |
154 | + { | |
155 | + return $this->Materiels->exists(['id' => $id, 'status' => 'VALIDATED']); | |
156 | + } | |
157 | + public function isToBeArchived($id) | |
158 | + { | |
159 | + return $this->Materiels->exists(['id' => $id, 'status' => 'TOBEARCHIVED']); | |
160 | + } | |
161 | + public function isArchived($id) | |
162 | + { | |
163 | + return $this->Materiels->exists(['id' => $id, 'status' => 'ARCHIVED']); | |
164 | + } | |
165 | + | |
166 | + | |
167 | + | |
168 | + /** | |
169 | + * Index method | |
170 | + * | |
171 | + * @return \Cake\Network\Response|null | |
172 | + */ | |
173 | + public function index() | |
174 | + { | |
175 | + // Remplacement de $this->passedArgs[0] (deprecated) | |
176 | + // Par $this->passedArgs[0] | |
177 | + $condition = ''; | |
178 | + if (isset($this->passedArgs[0])) { | |
179 | + $condition = ['Materiels.status =' => $this->passedArgs[0]]; | |
180 | + $this->set('STATUS', $this->passedArgs[0]); | |
181 | + } | |
182 | + | |
183 | + $GM = $this->request->query('GM'); | |
184 | + $GT = $this->request->query('GT'); | |
185 | + if(isset($GM) || isset($GT)) { | |
186 | + if(isset($GM) && $GM != TableRegistry::get('GroupesMetiers')->find()->where(['nom =' => 'N/A'])->first()['id']) { | |
187 | + $condition = ['Materiels.groupes_metier_id =' => $GM, 'Materiels.status !=' => 'ARCHIVED']; | |
188 | + } | |
189 | + else if (isset($GT) && $GT != TableRegistry::get('GroupesThematiques')->find()->where(['nom =' => 'N/A'])->first()['id']) { | |
190 | + $condition = ['Materiels.groupes_thematique_id =' => $GT, 'Materiels.status !=' => 'ARCHIVED']; | |
191 | + } | |
192 | + else { | |
193 | + $condition = ['Materiels.id =' => 0]; | |
194 | + } | |
195 | + } | |
196 | + | |
197 | + $GMV = $this->request->query('GMV'); | |
198 | + $GTV = $this->request->query('GTV'); | |
199 | + if(isset($GMV) || isset($GTV)) { | |
200 | + if(isset($GMV) && $GMV != TableRegistry::get('GroupesMetiers')->find()->where(['nom =' => 'N/A'])->first()['id']) { | |
201 | + $condition = ['Materiels.groupes_metier_id =' => $GMV, 'Materiels.status =' => 'CREATED', 'Materiels.status !=' => 'ARCHIVED']; | |
202 | + } | |
203 | + else if (isset($GTV) && $GTV != TableRegistry::get('GroupesThematiques')->find()->where(['nom =' => 'N/A'])->first()['id']) { | |
204 | + $condition = ['Materiels.groupes_metier_id =' => $GTV, 'Materiels.status =' => 'CREATED', 'Materiels.status !=' => 'ARCHIVED']; | |
205 | + } | |
206 | + else { | |
207 | + $condition = ['Materiels.id =' => 0]; | |
208 | + } | |
209 | + } | |
210 | + | |
211 | + | |
212 | + $MY = $this->request->query('MY'); | |
213 | + if(isset($MY)) { | |
214 | + if(in_array($this->role, ['Utilisateur', 'Responsable'])) { | |
215 | + $condition = ['Materiels.nom_responsable =' => $this->request->query('MY'), 'Materiels.status !=' => 'ARCHIVED']; | |
216 | + } else { | |
217 | + $condition = ['Materiels.nom_responsable =' => $this->request->query('MY')]; | |
218 | + } | |
219 | + | |
220 | + } | |
221 | + | |
222 | + | |
223 | + if(in_array($this->role, ['Utilisateur', 'Responsable']) && $condition == '') { | |
224 | + $condition = ['Materiels.status !=' => 'ARCHIVED']; | |
225 | + } | |
226 | + | |
227 | + $config = TableRegistry::get('Configurations')->find()->where(['id =' => 1])->first(); | |
228 | + $limit = $config['aff_par_defaut']; | |
229 | + | |
230 | + $this->paginate = [ | |
231 | + 'limit' => $limit, | |
232 | + 'contain' => ['SurCategories', 'Categories', 'SousCategories', 'GroupesThematiques', 'GroupesMetiers', 'Organismes', 'Sites'], | |
233 | + 'order' => ['Materiels.numero_laboratoire' => 'desc'] | |
234 | + ]; | |
235 | + | |
236 | + $materiels = $this->paginate($this->Materiels->find('all', ['conditions' => $condition])); | |
237 | + | |
238 | + $this->set('nbMateriels', $this->Materiels->find('all', ['conditions' => $condition])->count()); | |
239 | + | |
240 | + | |
241 | + $this->set(compact('materiels')); | |
242 | + $this->set('_serialize', ['materiels']); | |
243 | + } | |
244 | + | |
245 | + /** | |
246 | + * View method | |
247 | + * | |
248 | + * @param string|null $id Materiel id. | |
249 | + * @return \Cake\Network\Response|null | |
250 | + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. | |
251 | + */ | |
252 | + public function view($id = null) | |
253 | + { | |
254 | + $materiel = $this->Materiels->get($id, [ | |
255 | + 'contain' => ['SurCategories', 'Categories', 'SousCategories', 'GroupesThematiques', 'GroupesMetiers', 'Organismes', 'Sites', 'Documents', 'Emprunts', 'Suivis'] | |
256 | + ]); | |
257 | + | |
258 | + $sites = TableRegistry::get('Sites'); | |
259 | + $typeSuivis = TableRegistry::get('TypeSuivis'); | |
260 | + $typeDocuments = TableRegistry::get('TypeDocuments'); | |
261 | + | |
262 | + if($materiel->photo_id != null) { | |
263 | + $imgMateriel = $materiel->photo_id.'.'.TableRegistry::get('Documents')->get($materiel->photo_id)->get('type_doc'); | |
264 | + $this->set('imgMateriel', $imgMateriel); | |
265 | + } | |
266 | + | |
267 | + $this->set('sites', $sites); | |
268 | + $this->set('typeSuivis', $typeSuivis); | |
269 | + $this->set('typeDocuments', $typeDocuments); | |
270 | + | |
271 | + $this->set('materiel', $materiel); | |
272 | + $this->set('_serialize', ['materiel']); | |
273 | + } | |
274 | + | |
275 | + /** | |
276 | + * Add method | |
277 | + * | |
278 | + * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise. | |
279 | + */ | |
280 | + public function add() | |
281 | + { | |
282 | + $materiel = $this->Materiels->newEntity(); | |
283 | + if ($this->request->is('post')) { | |
284 | + $materiel = $this->Materiels->patchEntity($materiel, $this->request->data); | |
285 | + if ($this->Materiels->save($materiel)) { | |
286 | + $this->Flash->success(__('Le matériel a bien été ajouté.')); | |
287 | + | |
288 | + $this->sendEmailToManagement($materiel->id); | |
289 | + | |
290 | + if($materiel->nom_createur != $materiel->nom_responsable) { | |
291 | + $this->sendEmailToCreate($materiel->id); | |
292 | + } | |
293 | + | |
294 | + $message = $materiel->get('nom_createur').' a ajouté le matériel "'.$materiel->get('designation').'" ('.$materiel->numero_laboratoire.')'; | |
295 | + | |
296 | + //Envoi mail responsable | |
297 | + $mailsResp = TableRegistry::get('Users')->find()->select('email')->where(['role =' => 'Responsable', 'groupes_metier_id =' => $materiel->get('groupes_metier_id')])->orWhere(['role =' => 'Responsable', 'groupe_thematique_id =' => $materiel->get('groupes_thematique_id')])->toArray(); | |
298 | + $mails = []; | |
299 | + for($i = 0; $i < sizeof($mailsResp); $i++) { | |
300 | + $mails[$i] = $mailsResp[$i]['email']; | |
301 | + } | |
302 | + $this->sendEmailTo('Ajout d\'un matériel', $message, $mails); | |
303 | + | |
304 | + //Envoi mail administratif | |
305 | + //$mailsResp = TableRegistry::get('Users')->find()->select('email')->where(['role =' => 'Administration Plus'])->orWhere(['role =' => 'Administration'])->toArray(); | |
306 | + $mailsResp = TableRegistry::get('Users')->find()->select('email')->where(['role =' => 'Administration Plus'])->toArray(); | |
307 | + $mails = []; | |
308 | + for($i = 0; $i < sizeof($mailsResp); $i++) { | |
309 | + $mails[$i] = $mailsResp[$i]['email']; | |
310 | + } | |
311 | + | |
312 | + | |
313 | + // Rajout condition d'envoi de mail ou pas | |
314 | + $configuration = TableRegistry::get('Configurations')->find()->where(['id =' => 1])->first(); | |
315 | + | |
316 | + if(!$configuration['envoi_mail_management_dev']){ // Si false, on envoie les mails, sinon on les envoie pas | |
317 | + $this->sendEmailTo('Ajout d\'un matériel', $message, $mails); | |
318 | + } | |
319 | + | |
320 | + | |
321 | + return $this->redirect(['action' => 'view', $materiel->id]); | |
322 | + } else { | |
323 | + $this->Flash->error(__('Le matériel n\'a pas pu être ajouté.')); | |
324 | + } | |
325 | + } | |
326 | + | |
327 | + $surCategories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SurCategories.nom']); | |
328 | + $categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Categories.nom']); | |
329 | + $sousCategories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SousCategories.nom']); | |
330 | + $groupesThematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom']); | |
331 | + $groupesMetiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom']); | |
332 | + $organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Organismes.nom']); | |
333 | + $sites = $this->Materiels->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Sites.nom']); | |
334 | + | |
335 | + $users = TableRegistry::get('LdapConnections')->getListUsers(); | |
336 | + //tri des utilisateurs par nom | |
337 | + sort($users); | |
338 | + $utilisateurs = []; | |
339 | + for($i = 0; $i < sizeof($users); $i++) { | |
340 | + $utilisateurs[$users[$i]] = $users[$i]; | |
341 | + } | |
342 | + | |
343 | + $mail_responsable = TableRegistry::get('Users')->find()->select('email')->where(['username =' => $this->LdapAuth->user($this->request->session()->read('authType'))[0]])->first()['email']; | |
344 | + | |
345 | + if(isset($this->passedArgs[0])) { | |
346 | + $cpMateriel = $this->Materiels->get($this->passedArgs[0]); | |
347 | + $this->set('cpMateriel', $cpMateriel); | |
348 | + } | |
349 | + | |
350 | + $this->set(compact('materiel', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'utilisateurs', 'mail_responsable')); | |
351 | + $this->set('_serialize', ['materiel']); | |
352 | + | |
353 | + } | |
354 | + | |
355 | + /** | |
356 | + * Edit method | |
357 | + * | |
358 | + * @param string|null $id Materiel id. | |
359 | + * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise. | |
360 | + * @throws \Cake\Network\Exception\NotFoundException When record not found. | |
361 | + */ | |
362 | + public function edit($id = null) | |
363 | + { | |
364 | + $materiel = $this->Materiels->get($id, [ | |
365 | + 'contain' => [] | |
366 | + ]); | |
367 | + if ($this->request->is(['patch', 'post', 'put'])) { | |
368 | + $materiel = $this->Materiels->patchEntity($materiel, $this->request->data); | |
369 | + if ($this->Materiels->save($materiel)) { | |
370 | + $this->Flash->success(__('Le matériel a bien été édité.')); | |
371 | + $this->sendEmailToManagement($id); | |
372 | + if($materiel->nom_modificateur != $materiel->nom_responsable) { | |
373 | + $message = $materiel->get('nom_modificateur').' a édité le matériel "'.$materiel->get('designation').'" ('.$materiel->numero_laboratoire.')'; | |
374 | + $this->sendEmailTo('Modification d\'un matériel', $message, [$materiel->get('email_responsable')]); | |
375 | + } | |
376 | + return $this->redirect(['action' => 'view', $id]); | |
377 | + } else { | |
378 | + $this->Flash->error(__('Le matériel n\'a pas pu être édité.')); | |
379 | + } | |
380 | + } | |
381 | + $surCategories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SurCategories.nom']); | |
382 | + $categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Categories.nom']); | |
383 | + $sousCategories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SousCategories.nom']); | |
384 | + $groupesThematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom']); | |
385 | + $groupesMetiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom']); | |
386 | + $organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Organismes.nom']); | |
387 | + $sites = $this->Materiels->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Sites.nom']); | |
388 | + | |
389 | + $users = TableRegistry::get('LdapConnections')->getListUsers(); | |
390 | + //tri des utilisateurs par nom | |
391 | + sort($users); | |
392 | + $utilisateurs = []; | |
393 | + for($i = 0; $i < sizeof($users); $i++) { | |
394 | + $utilisateurs[$users[$i]] = $users[$i]; | |
395 | + } | |
396 | + | |
397 | + if(!empty($materiel->get('nom_responsable'))){ | |
398 | + if(!in_array($materiel->get('nom_responsable'), $utilisateurs)){ | |
399 | + $nom_ancien_responsable = $materiel->get('nom_responsable'); | |
400 | + $this->set(compact('nom_ancien_responsable')); | |
401 | + } | |
402 | + } | |
403 | + $mail_responsable = TableRegistry::get('Users')->find()->select('email')->where(['username =' => $this->LdapAuth->user($this->request->session()->read('authType'))[0]])->first()['email']; | |
404 | + | |
405 | + //Fonction utilisé dans la vue, déclaré ici pour éviter les problèmes de tests | |
406 | + $isReadonlyField = function ($fieldName, $myReadonlyFields) { | |
407 | + if (! empty ( $myReadonlyFields ) && $myReadonlyFields [0] == '*') { | |
408 | + $modifiableFields = $myReadonlyFields; | |
409 | + array_shift ( $modifiableFields ); | |
410 | + return ! in_array ( $fieldName, $modifiableFields ); | |
411 | + } | |
412 | + return in_array ( $fieldName, $myReadonlyFields ); | |
413 | + }; | |
414 | + $this->set('isReadonlyField', $isReadonlyField); | |
415 | + | |
416 | + $this->set('IS_CREATED', $materiel->status == 'CREATED'); | |
417 | + $this->set('IS_VALIDATED', $materiel->status == 'VALIDATED'); | |
418 | + $this->set('IS_ARCHIVED_OR_TOBE', in_array ( $materiel->status, ['TOBEARCHIVED','ARCHIVED'])); | |
419 | + | |
420 | + $this->set(compact('materiel', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'utilisateurs', 'mail_responsable')); | |
421 | + $this->set('_serialize', ['materiel']); | |
422 | + } | |
423 | + | |
424 | + | |
425 | + /** | |
426 | + * Administrer method | |
427 | + * | |
428 | + * @param string|null $id Materiel id. | |
429 | + * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise. | |
430 | + * @throws \Cake\Network\Exception\NotFoundException When record not found. | |
431 | + */ | |
432 | + public function administrer($id = null) | |
433 | + { | |
434 | + $materiel = $this->Materiels->get($id, [ | |
435 | + 'contain' => [] | |
436 | + ]); | |
437 | + if ($this->request->is(['patch', 'post', 'put'])) { | |
438 | + $materiel = $this->Materiels->patchEntity($materiel, $this->request->data); | |
439 | + if ($this->Materiels->save($materiel, ['checkRules' => false])) { | |
440 | + $this->Flash->success(__('Le matériel a bien été édité.')); | |
441 | + return $this->redirect(['action' => 'view', $id]); | |
442 | + } else { | |
443 | + $this->Flash->error(__('Le matériel n\'a pas pu être édité.')); | |
444 | + } | |
445 | + } | |
446 | + $surCategories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SurCategories.nom']); | |
447 | + $categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Categories.nom']); | |
448 | + $sousCategories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SousCategories.nom']); | |
449 | + $groupesThematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom']); | |
450 | + $groupesMetiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom']); | |
451 | + $organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Organismes.nom']); | |
452 | + $sites = $this->Materiels->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Sites.nom']); | |
453 | + | |
454 | + $users = TableRegistry::get('LdapConnections')->getListUsers(); | |
455 | + //tri des utilisateurs par nom | |
456 | + sort($users); | |
457 | + $utilisateurs = []; | |
458 | + for($i = 0; $i < sizeof($users); $i++) { | |
459 | + $utilisateurs[$users[$i]] = $users[$i]; | |
460 | + } | |
461 | + | |
462 | + if(!empty($materiel->get('nom_responsable'))){ | |
463 | + if(!in_array($materiel->get('nom_responsable'), $utilisateurs)){ | |
464 | + $nom_ancien_responsable = $materiel->get('nom_responsable'); | |
465 | + $this->set(compact('nom_ancien_responsable')); | |
466 | + } | |
467 | + } | |
468 | + $mail_responsable = TableRegistry::get('Users')->find()->select('email')->where(['username =' => $this->LdapAuth->user($this->request->session()->read('authType'))[0]])->first()['email']; | |
469 | + | |
470 | + $this->set('IS_CREATED', $materiel->status == 'CREATED'); | |
471 | + $this->set('IS_VALIDATED', $materiel->status == 'VALIDATED'); | |
472 | + $this->set('IS_ARCHIVED_OR_TOBE', in_array ( $materiel->status, ['TOBEARCHIVED','ARCHIVED'])); | |
473 | + | |
474 | + $this->set(compact('materiel', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'utilisateurs', 'mail_responsable')); | |
475 | + $this->set('_serialize', ['materiel']); | |
476 | + } | |
477 | + | |
478 | + | |
479 | + /** | |
480 | + * Delete method | |
481 | + * | |
482 | + * @param string|null $id Materiel id. | |
483 | + * @return \Cake\Network\Response|null Redirects to index. | |
484 | + * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. | |
485 | + */ | |
486 | + public function delete($id = null) | |
487 | + { | |
488 | + //$this->request->allowMethod(['post', 'delete']); | |
489 | + $materiel = $this->Materiels->get($id); | |
490 | + if ($this->Materiels->delete($materiel)) { | |
491 | + $this->Flash->success(__('Le matériel a bien été supprimé.')); | |
492 | + $this->sendEmailToManagement($id); | |
493 | + } else { | |
494 | + $this->Flash->error(__('Le matériel n\'a pas pu être supprimé.')); | |
495 | + } | |
496 | + return $this->redirect(['action' => 'index']); | |
497 | + } | |
498 | + | |
499 | + /** | |
500 | + * StatusSetTo method | |
501 | + * | |
502 | + * @param string $newStatus | |
503 | + * @param string $message | |
504 | + * @param string $id | |
505 | + * @param string $from | |
506 | + * @return \Cake\Network\Response|NULL | |
507 | + */ | |
508 | + private function statusSetTo($newStatus, $message, $id = null, $from = 'index') { | |
509 | + $materiel = $this->Materiels->get($id)->set('status', $newStatus); | |
510 | + | |
511 | + if($newStatus == 'ARCHIVED') { | |
512 | + $materiel->set('date_archivage', date('Y-m-d')); | |
513 | + } | |
514 | + | |
515 | + if($newStatus == 'VALIDATED') { | |
516 | + if(!isset($materiel->nom_responsable) || !isset($materiel->fournisseur) || !isset($materiel->numero_commande) || !isset($materiel->organisme_id) || !isset($materiel->date_reception) || !isset($materiel->prix_ht)) { | |
517 | + $this->Flash->error('Pour valider un matériel, les champs suivants ne doivent pas être vide : Nom propriétaire, Fournisseur, Numéro de commande, Organisme, prix et date de reception'); | |
518 | + return $this->redirect(['action' => 'edit', $id]); | |
519 | + } | |
520 | + $message = 'Le matériel "'.$materiel->get('designation').'" ('.$materiel->numero_laboratoire.') a été validé.'; | |
521 | + $this->sendEmailTo('Validation d\'un matériel', $message, [$materiel->get('email_responsable')]); | |
522 | + } | |
523 | + | |
524 | + if ($this->Materiels->save($materiel, ['checkRules' => false, 'checkExisting' => false])) { | |
525 | + $this->Flash->success(__($message)); | |
526 | + $this->sendEmailToManagement($id); | |
527 | + } | |
528 | + else { | |
529 | + $this->Flash->error(__('Le statut n\'a pas pu être édité.')); | |
530 | + } | |
531 | + | |
532 | + if($from == 'index') return $this->redirect(['action'=>$from]); | |
533 | + else return $this->redirect(['action'=>$from, $id]); | |
534 | + } | |
535 | + | |
536 | + /** | |
537 | + * StatusValidated method | |
538 | + * | |
539 | + * @param string $id | |
540 | + * @param string $from | |
541 | + */ | |
542 | + public function statusValidated($id = null, $from = 'index') { | |
543 | + $this->statusSetTo('VALIDATED', 'Le matériel a bien été validé', $id, $from); | |
544 | + } | |
545 | + | |
546 | + /** | |
547 | + * StatusToBeArchived method | |
548 | + * | |
549 | + * @param string $id | |
550 | + * @param string $from | |
551 | + */ | |
552 | + public function statusToBeArchived($id = null, $from = 'index') { | |
553 | + $this->statusSetTo('TOBEARCHIVED', 'La sortie d\'inventaire a bien été demandée', $id, $from); | |
554 | + } | |
555 | + | |
556 | + /** | |
557 | + * StatusArchived method | |
558 | + * | |
559 | + * @param string $id | |
560 | + * @param string $from | |
561 | + */ | |
562 | + public function statusArchived($id = null, $from = 'index') { | |
563 | + $this->statusSetTo('ARCHIVED', 'Le matériel a bien été sorti de l\'inventaire', $id, $from); | |
564 | + } | |
565 | + | |
566 | + /** | |
567 | + * GetConditionForField method | |
568 | + * | |
569 | + * @param unknown $fieldName | |
570 | + * @return string[]|NULL | |
571 | + */ | |
572 | + private function getConditionForField($fieldName) { | |
573 | + $searchFieldName = 's_' . $fieldName; | |
574 | + if ( isset($this->request->data[$searchFieldName]) && ($this->request->data[$searchFieldName] != '')) return ["Materiels.$fieldName LIKE" => '%'.$this->request->data[$searchFieldName].'%']; | |
575 | + return NULL; | |
576 | + } | |
577 | + | |
578 | + /** | |
579 | + * GetConditionForFieldNumber method | |
580 | + * | |
581 | + * @param unknown $fieldName | |
582 | + * @return $string[]|NULL | |
583 | + */ | |
584 | + private function getConditionForFieldNumber($fieldName) { | |
585 | + $searchFieldName = 's_' . $fieldName; | |
586 | + if ( isset($this->request->data[$searchFieldName]) && ($this->request->data[$searchFieldName] != '')) return ["Materiels.$fieldName =" => $this->request->data[$searchFieldName]]; | |
587 | + return NULL; | |
588 | + } | |
589 | + | |
590 | + /** | |
591 | + * Find method | |
592 | + */ | |
593 | + public function find() { | |
594 | + | |
595 | + $s_sur_categories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SurCategories.nom']); | |
596 | + $s_categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Categories.nom']); | |
597 | + $s_sous_categories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'SousCategories.nom']); | |
598 | + $s_groupes_thematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesThematiques.nom']); | |
599 | + $s_groupes_metiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'GroupesMetiers.nom']); | |
600 | + $s_organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom', 'order' => 'Organismes.nom']); | |
601 | + | |
602 | + $categories = $this->Materiels->Categories; | |
603 | + | |
604 | + $this->set(compact('s_sur_categories', 's_categories', 's_sous_categories', 's_groupes_thematiques', 's_groupes_metiers', 's_organismes', 'categories')); | |
605 | + | |
606 | + $resultTri = $this->request->session()->read("resultTri"); | |
607 | + | |
608 | + if(!(in_array($this->role, ['Administration', 'Administration Plus', 'Super Administrateur']))) { | |
609 | + $conditionNotArchived = ['Materiels.status !=' => 'ARCHIVED']; | |
610 | + }else { | |
611 | + $conditionNotArchived = ''; | |
612 | + } | |
613 | + | |
614 | + // some data POSTED (au moins le champ de recherche generale) ? | |
615 | + if ( isset($this->request->data['s_all']) || isset($this->request->data['s_all_2']) || isset($this->request->data['s_designation'])) { | |
616 | + $generalFieldConditions = NULL; | |
617 | + // if general field set (s_all), then set general request for it | |
618 | + if (isset($this->request->data['s_all'])) { | |
619 | + $all = $this->request->data['s_all']; | |
620 | + $generalFieldConditions = ['OR' => [ | |
621 | + 'Materiels.designation LIKE' => '%'.$all.'%', | |
622 | + 'Materiels.numero_laboratoire LIKE' => '%'.$all.'%', | |
623 | + 'Materiels.numero_inventaire_organisme LIKE' => '%'.$all.'%', | |
624 | + 'Materiels.numero_inventaire_old LIKE' => '%'.$all.'%', | |
625 | + 'Materiels.numero_commande LIKE' => '%'.$all.'%', | |
626 | + 'Materiels.description LIKE' => '%'.$all.'%', | |
627 | + 'Materiels.fournisseur LIKE' => '%'.$all.'%', | |
628 | + 'Materiels.nom_responsable LIKE' => '%'.$all.'%', | |
629 | + 'Materiels.email_responsable LIKE' => '%'.$all.'%', | |
630 | + 'Materiels.code_comptable LIKE' => '%'.$all.'%', | |
631 | + 'Materiels.numero_serie LIKE' => '%'.$all.'%', | |
632 | + 'Materiels.date_acquisition LIKE' => '%'.$all.'%', | |
633 | + 'Materiels.date_reception LIKE' => '%'.$all.'%', | |
634 | + ]]; | |
635 | + } | |
636 | + if (isset($this->request->data['s_all_2'])) { | |
637 | + $all = $this->request->data['s_all_2']; | |
638 | + $generalFieldConditions = ['OR' => [ | |
639 | + 'Materiels.designation LIKE' => '%'.$all.'%', | |
640 | + 'Materiels.numero_laboratoire LIKE' => '%'.$all.'%', | |
641 | + 'Materiels.numero_inventaire_organisme LIKE' => '%'.$all.'%', | |
642 | + 'Materiels.numero_inventaire_old LIKE' => '%'.$all.'%', | |
643 | + 'Materiels.numero_commande LIKE' => '%'.$all.'%', | |
644 | + 'Materiels.description LIKE' => '%'.$all.'%', | |
645 | + 'Materiels.fournisseur LIKE' => '%'.$all.'%', | |
646 | + 'Materiels.nom_responsable LIKE' => '%'.$all.'%', | |
647 | + 'Materiels.email_responsable LIKE' => '%'.$all.'%', | |
648 | + 'Materiels.code_comptable LIKE' => '%'.$all.'%', | |
649 | + 'Materiels.numero_serie LIKE' => '%'.$all.'%', | |
650 | + 'Materiels.date_acquisition LIKE' => '%'.$all.'%', | |
651 | + 'Materiels.date_reception LIKE' => '%'.$all.'%', | |
652 | + ]]; | |
653 | + } | |
654 | + $specificFieldsConditions = NULL; | |
655 | + // au moins un champ specifique rempli ? | |
656 | + if ( isset($this->request->data['s_designation']) ) { | |
657 | + // Materiel type | |
658 | + $matostype = $this->request->data['s_matostype']; | |
659 | + $matostypeRequest = NULL; | |
660 | + | |
661 | + switch ($matostype) { | |
662 | + // Administratif | |
663 | + case 'A': | |
664 | + $matostypeRequest['Materiels.materiel_administratif ='] = '1'; | |
665 | + break; | |
666 | + // Technique | |
667 | + case 'T': | |
668 | + $matostypeRequest['Materiels.materiel_technique ='] = '1'; | |
669 | + break; | |
670 | + // Admin et Tech | |
671 | + case 'AT': | |
672 | + $matostypeRequest['Materiels.materiel_administratif ='] = '1'; | |
673 | + $matostypeRequest['Materiels.materiel_technique ='] = '1'; | |
674 | + break; | |
675 | + // Admin ONLY | |
676 | + case 'AO': | |
677 | + $matostypeRequest['Materiels.materiel_administratif ='] = '1'; | |
678 | + $matostypeRequest['Materiels.materiel_technique ='] = '0'; | |
679 | + break; | |
680 | + // Tech ONLY | |
681 | + case 'TO': | |
682 | + $matostypeRequest['Materiels.materiel_administratif ='] = '0'; | |
683 | + $matostypeRequest['Materiels.materiel_technique ='] = '1'; | |
684 | + break; | |
685 | + } | |
686 | + | |
687 | + $periode_acquisitionRequest = NULL; | |
688 | + $date_acquisition = NULL; | |
689 | + if ($this->request->data['s_periode_acquisition1'] != '') | |
690 | + $periode_acquisitionRequest['Materiels.date_acquisition >='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->data['s_periode_acquisition1']))); | |
691 | + if ($this->request->data['s_periode_acquisition2'] != '') | |
692 | + $periode_acquisitionRequest['Materiels.date_acquisition <='] = date('Y-m-d', strtotime(str_replace('/', '-', $this->request->data['s_periode_acquisition2']))); | |
693 | + if ($this->request->data['s_date_acquisition'] != '') | |
694 | + $date_acquisition['Materiels.date_acquisition LIKE'] = '%'.date('Y-m-d', strtotime(str_replace('/', '-', $this->request->data['s_date_acquisition']))).'%'; | |
695 | + | |
696 | + $montantRequest = []; | |
697 | + if ($this->request->data['s_prix_ht_inf'] != '') | |
698 | + $montantRequest['Materiels.prix_ht <='] = $this->request->data['s_prix_ht_inf']; | |
699 | + if ($this->request->data['s_prix_ht_sup'] != '') | |
700 | + $montantRequest['Materiels.prix_ht >='] = $this->request->data['s_prix_ht_sup']; | |
701 | + | |
702 | + $specificFieldsConditions = [ | |
703 | + 'Materiels.designation LIKE' => '%'.$this->request->data['s_designation'].'%', | |
704 | + 'Materiels.numero_laboratoire LIKE' => '%'.$this->request->data['s_numero_laboratoire'].'%', | |
705 | + $this->getConditionForField('numero_commande'), | |
706 | + $date_acquisition, | |
707 | + $periode_acquisitionRequest, | |
708 | + $this->getConditionForFieldNumber('prix_ht'), | |
709 | + $montantRequest, | |
710 | + $this->getConditionForFieldNumber('sur_categorie_id'), | |
711 | + $this->getConditionForFieldNumber('categorie_id'), | |
712 | + $this->getConditionForFieldNumber('sous_categorie_id'), | |
713 | + $this->getConditionForField('nom_responsable'), | |
714 | + $this->getConditionForField('numero_inventaire_organisme'), | |
715 | + $this->getConditionForField('numero_inventaire_old'), | |
716 | + $this->getConditionForFieldNumber('groupes_metier_id'), | |
717 | + $this->getConditionForFieldNumber('groupes_thematique_id'), | |
718 | + | |
719 | + $this->getConditionForFieldNumber('organisme_id'), | |
720 | + $matostypeRequest, | |
721 | + ]; | |
722 | + if($this->request->data['s_status'] != '') { | |
723 | + array_push($specificFieldsConditions, ['Materiels.status =' => $this->request->data['s_status']]); | |
724 | + } | |
725 | + } | |
726 | + | |
727 | + // CONSTRUCTION DE LA REQUETE SQL COMPLETE = $specificFieldsConditions OR $generalFieldConditions (mais entre chaque champ, c'est un AND) | |
728 | + // by default, no sort | |
729 | + | |
730 | + if (isset($this->request->data['s_all_2']) && $this->request->data['s_all_2'] != '') { | |
731 | + $conditions = [$generalFieldConditions, $conditionNotArchived]; | |
732 | + } | |
733 | + else if (isset($this->request->data['s_all']) && $this->request->data['s_all'] != '') { | |
734 | + $conditions = [$generalFieldConditions, $conditionNotArchived]; | |
735 | + } | |
736 | + else { | |
737 | + $conditions = [$specificFieldsConditions, $conditionNotArchived]; | |
738 | + } | |
739 | + | |
740 | + $lastResults = $this->Materiels->find('all', ['limit' => 1000, 'conditions' => $conditions]); | |
741 | + | |
742 | + $this->paginate = ['limit' => 1000]; | |
743 | + $_results = $this->paginate($lastResults); | |
744 | + $this->set(compact('_results')); | |
745 | + | |
746 | + //pour l'export | |
747 | + $this->request->session()->write("result", $lastResults->toArray()); | |
748 | + | |
749 | + } // end if() | |
750 | + else if (isset($resultTri) && strstr($this->request->here(), 'sort') != false && strstr($this->request->here(), 'direction') != false) { | |
751 | + $findedMateriel = []; | |
752 | + | |
753 | + foreach($resultTri as $r) { | |
754 | + array_push($findedMateriel, $r->id); | |
755 | + } | |
756 | + $res = $this->Materiels->find('all', ['limit' => 1000]); | |
757 | + for($i = 0; $i < sizeof($findedMateriel); $i++) { | |
758 | + $res->orWhere(['id =' => $findedMateriel[$i]]); | |
759 | + } | |
760 | + | |
761 | + $this->paginate = ['limit' => 1000]; | |
762 | + $_results = $this->paginate($res); | |
763 | + $this->set(compact('_results')); | |
764 | + | |
765 | + //pour l'export | |
766 | + $this->request->session()->write("result", $res->toArray()); | |
767 | + } | |
768 | + } | |
769 | + | |
770 | + /** | |
771 | + group update status + exportAll | |
772 | + */ | |
773 | + public function execActions() { | |
774 | + if (isset($this->request->data['updateSelectedStatus'])) { | |
775 | + $this->updateSelectedStatus(); | |
776 | + } | |
777 | + else { | |
778 | + $this->export(); | |
779 | + } | |
780 | + } | |
781 | + | |
782 | + | |
783 | + /** | |
784 | + * group update status (selected from materiels/index) | |
785 | + */ | |
786 | + private function updateSelectedStatus() { | |
787 | + | |
788 | + if (isset($this->request->data) && sizeof($this->request->data) > 0) { | |
789 | + $this->myDebug("IN UPDATE"); | |
790 | + $this->myDebug($this->request->data); | |
791 | + $what = $this->request->data['what']; | |
792 | + $nb = 0; | |
793 | + | |
794 | + if ( in_array($what,$this->NOTARCHIVED) ) { | |
795 | + foreach ($this->request->data as $id => $value) : if ($value == 1) { | |
796 | + switch ($what) { | |
797 | + case 'CREATED': $new = 'VALIDATED'; break; | |
798 | + case 'VALIDATED': $new = 'TOBEARCHIVED'; break; | |
799 | + case 'TOBEARCHIVED': $new = 'ARCHIVED'; | |
800 | + break; | |
801 | + } | |
802 | + //if mode_debug desactivate | |
803 | + if (!$this->isLabinventDebugMode()) { | |
804 | + $materiel = $this->Materiels->get($id)->set('status', $new); | |
805 | + $this->Materiels->save($materiel, ['checkRules' => false, 'checkExisting' => false]); | |
806 | + } | |
807 | + $nb++; | |
808 | + } endforeach; | |
809 | + if ($nb != 0) $this->Flash->success(__($nb.' matériel(s) mis à jour')); | |
810 | + $this->myDebug("Nb matos = ".$nb); | |
811 | + | |
812 | + if(!$this->isLabinventDebugMode()) return $this->redirect(['action' => 'index', $what]); | |
813 | + } | |
814 | + } | |
815 | + } | |
816 | + | |
817 | + /** | |
818 | + * | |
819 | + * Export method | |
820 | + * | |
821 | + * Generation d'un fichier .csv comportant la date du jour | |
822 | + * | |
823 | + * CSV export of the list of materiels | |
824 | + * This action is called from 3 different sources : | |
825 | + * - tools | |
826 | + * - materiels/find | |
827 | + * - materiels/index (from the 2 submit green buttons named "Exporter la liste...") | |
828 | + * | |
829 | + * Optional parameter "what:value" may be passed when calling this action, and is read from $this->params['named']['what'] | |
830 | + * ex : materiels/export/what:toValidate | |
831 | + * | |
832 | + */ | |
833 | + public function export() { | |
834 | + | |
835 | + $materiels = NULL; | |
836 | + $surCategories = $this->Materiels->SurCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom'])->toArray(); | |
837 | + $categories = $this->Materiels->Categories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom'])->toArray(); | |
838 | + $sousCategories = $this->Materiels->SousCategories->find('list', [ 'keyField' => 'id', 'valueField' => 'nom'])->toArray(); | |
839 | + $groupesThematiques = $this->Materiels->GroupesThematiques->find('list', [ 'keyField' => 'id', 'valueField' => 'nom'])->toArray(); | |
840 | + $groupesMetiers = $this->Materiels->GroupesMetiers->find('list', [ 'keyField' => 'id', 'valueField' => 'nom'])->toArray(); | |
841 | + $organismes = $this->Materiels->Organismes->find('list', [ 'keyField' => 'id', 'valueField' => 'nom'])->toArray(); | |
842 | + $sites = $this->Materiels->Sites->find('list', [ 'keyField' => 'id', 'valueField' => 'nom'])->toArray(); | |
843 | + | |
844 | + $what = ''; | |
845 | + | |
846 | + $this->myDebug($this->request->data); | |
847 | + | |
848 | + if ( isset($this->request->data['export'])) { | |
849 | + $this->myDebug("IN EXPORT"); | |
850 | + $what = $this->request->data['what']; | |
851 | + | |
852 | + $selectedMateriels = []; | |
853 | + $i = 0; | |
854 | + $data = $this->request->data; | |
855 | + foreach ($data as $val) { | |
856 | + if ($val == 1) { | |
857 | + $selectedMateriels[$i] = key($data); | |
858 | + $i++; | |
859 | + } | |
860 | + next($data); | |
861 | + } | |
862 | + | |
863 | + $this->myDebug($selectedMateriels); | |
864 | + | |
865 | + if (sizeof($selectedMateriels) > 0) { | |
866 | + | |
867 | + $materiels = $this->Materiels->find('all')->where(['Materiels.id' => $selectedMateriels[0]]); | |
868 | + | |
869 | + for ($j = 0; $j < sizeof($selectedMateriels); $j++) { | |
870 | + $materiels->orWhere(['Materiels.id' => $selectedMateriels[$j]]); | |
871 | + } | |
872 | + | |
873 | + $this->myDebug($materiels); | |
874 | + } | |
875 | + | |
876 | + } | |
877 | + | |
878 | + else if (isset($this->request->data['exportAll'])) { | |
879 | + $this->myDebug("IN EXPORTALL"); | |
880 | + | |
881 | + if (isset($this->request->data['what'])) { | |
882 | + $what=$this->request->data['what']; | |
883 | + $status=$what; | |
884 | + $materiels = $this->Materiels->find('all', ['conditions' => ['Materiels.status =' => $status]]); | |
885 | + } | |
886 | + else { | |
887 | + $status = 'ARCHIVED'; | |
888 | + $materiels = $this->Materiels->find('all', ['conditions' => ['Materiels.status !=' => $status]]); | |
889 | + } | |
890 | + | |
891 | + $this->myDebug("what is ".$what); | |
892 | + $this->myDebug("statut is ".$status); | |
893 | + | |
894 | + | |
895 | + } | |
896 | + | |
897 | + | |
898 | + else if (isset($this->passedArgs[0])) { | |
899 | + | |
900 | + $this->myDebug("OTHER CASE 3"); | |
901 | + $what = $this->passedArgs[0]; | |
902 | + if ($what == 'search') { | |
903 | + $materiels = $this->request->session()->read("result"); | |
904 | + } | |
905 | + | |
906 | + } | |
907 | + | |
908 | + else { | |
909 | + $this->myDebug("OTHER CASE 4"); | |
910 | + $materiels = $this->Materiels->find('all', ['conditions' => ['Materiels.status !=' => 'ARCHIVED']]); | |
911 | + } | |
912 | + | |
913 | + $this->myDebug("Nb matos = ".count($materiels)); | |
914 | + $this->myDebug($materiels, true); | |
915 | + | |
916 | + | |
917 | + | |
918 | + ini_set('max_execution_time', 600); | |
919 | + | |
920 | + $filename = 'export_'.date("Y-m-d") . '.csv'; | |
921 | + $csv_file = fopen('php://output', 'w'); | |
922 | + | |
923 | + $this->response->header(['Content-type: application/csv', 'Content-Disposition: attachment; filename="'.$filename.'"']); | |
924 | + $this->response->sendHeaders(); | |
925 | + | |
926 | + $header_row = [ | |
927 | + "id", "Designation", "Sur-categorie", "Categorie", "Sous-categorie", "Numero interne", "Description", "Organisme", | |
928 | + "Mat. administratif", "Mat. technique", "Statut", "Date d'acquisition", "Date de reception", "Fournisseur", "Prix HT", | |
929 | + "EOTP", "Numero de commande", "Code comptable", "Numero de serie", "Grp. thematique", "Grp. metier", | |
930 | + "Numero inventaire organisme", "Ancien Numero inventaire", "Site stockage", "Nom responsable", "Email responsable"]; | |
931 | + | |
932 | + fputcsv($csv_file, $header_row, ';'); | |
933 | + | |
934 | + foreach($materiels as $result) { | |
935 | + $row = [ | |
936 | + utf8_encode($result->id), | |
937 | + $result->designation, | |
938 | + ]; | |
939 | + | |
940 | + if(isset($surCategories[$result->sur_categorie_id])) { | |
941 | + array_push($row, $surCategories[$result->sur_categorie_id]); | |
942 | + } | |
943 | + else { | |
944 | + array_push($row, ""); | |
945 | + } | |
946 | + | |
947 | + if(isset($categories[$result->categorie_id])) { | |
948 | + array_push($row, $categories[$result->categorie_id]); | |
949 | + } | |
950 | + else { | |
951 | + array_push($row, ""); | |
952 | + } | |
953 | + | |
954 | + if(isset($sousCategories[$result->sous_categorie_id])) { | |
955 | + array_push($row, $sousCategories[$result->sous_categorie_id]); | |
956 | + } | |
957 | + else { | |
958 | + array_push($row, ""); | |
959 | + } | |
960 | + | |
961 | + array_push($row, $result->numero_laboratoire); | |
962 | + array_push($row, $result->description); | |
963 | + | |
964 | + if(isset($organismes[$result->organisme_id])) { | |
965 | + array_push($row, $organismes[$result->organisme_id]); | |
966 | + } | |
967 | + else { | |
968 | + array_push($row, ""); | |
969 | + } | |
970 | + | |
971 | + array_push($row, $result->materiel_administratif); | |
972 | + array_push($row, $result->materiel_technique); | |
973 | + array_push($row, $result->status); | |
974 | + array_push($row, $result->date_acquisition); | |
975 | + array_push($row, $result->date_reception); | |
976 | + array_push($row, $result->fournisseur); | |
977 | + array_push($row, $result->prix_ht); | |
978 | + array_push($row, $result->eotp); | |
979 | + array_push($row, $result->numero_commande); | |
980 | + array_push($row, $result->code_comptable); | |
981 | + array_push($row, $result->numero_serie); | |
982 | + | |
983 | + if(isset($groupesThematiques[$result->groupes_thematique_id])) { | |
984 | + array_push($row, $groupesThematiques[$result->groupes_thematique_id]); | |
985 | + } | |
986 | + else { | |
987 | + array_push($row, ""); | |
988 | + } | |
989 | + if(isset($groupesMetiers[$result->groupes_metier_id])) { | |
990 | + array_push($row, $groupesMetiers[$result->groupes_metier_id]); | |
991 | + } | |
992 | + else { | |
993 | + array_push($row, ""); | |
994 | + } | |
995 | + | |
996 | + array_push($row, $result->numero_inventaire_organisme); | |
997 | + array_push($row, $result->numero_inventaire_old); | |
998 | + | |
999 | + if(isset($sites[$result->site_id])) { | |
1000 | + array_push($row, $sites[$result->site_id].'-'.$result->lieu_detail); | |
1001 | + } | |
1002 | + else { | |
1003 | + array_push($row, ""); | |
1004 | + } | |
1005 | + | |
1006 | + array_push($row, $result->nom_responsable); | |
1007 | + array_push($row, $result->email_responsable); | |
1008 | + | |
1009 | + fputcsv($csv_file,$row,';','"'); | |
1010 | + | |
1011 | + } | |
1012 | + sleep(3); | |
1013 | + fclose($csv_file); | |
1014 | + | |
1015 | + exit(); | |
1016 | + //Sans le exit() ca ne fonctionne pas pour de petite liste, et dans tous les cas une ligne en javascript est écris si il n'y a pas exit() | |
1017 | + | |
1018 | + //La redirection suivante fonctionne parfaitement, mais inutile à cause du exit() | |
1019 | + /* | |
1020 | + if ($what != '' && $what != 'search') return $this->redirect(['action' => 'index', $what]); | |
1021 | + else if ($what == 'search') return $this->redirect('javascript:window.history.go(-3)'); | |
1022 | + else return $this->redirect(['action' => 'index']); | |
1023 | + */ | |
1024 | + | |
1025 | + | |
1026 | + } | |
1027 | + | |
1028 | + | |
1029 | + /** | |
1030 | + * SetLabelIsPlacedOrNotPlaced method | |
1031 | + * | |
1032 | + * @param string $id | |
1033 | + * @param string $from | |
1034 | + * @param string $printed | |
1035 | + * @return \Cake\Network\Response|NULL | |
1036 | + */ | |
1037 | + public function setLabelIsPlacedOrNotPlaced($id,$from,$printed=TRUE) { | |
1038 | + $materiel = $this->Materiels->get($id)->set('etiquette', $printed); | |
1039 | + | |
1040 | + if ($this->Materiels->save($materiel, ['checkRules' => false, 'checkExisting' => false])) { | |
1041 | + $this->Flash->success(__('L\'étiquette a bien été éditer.')); | |
1042 | + // Envoi email seulement si etiquette posée | |
1043 | + if ($printed) { | |
1044 | + $this->sendEmailToManagement($id); | |
1045 | + } | |
1046 | + } | |
1047 | + else { | |
1048 | + $this->Flash->error(__('L\'étiquette n\'a pas pu être édité.')); | |
1049 | + } | |
1050 | + | |
1051 | + return $this->redirect($this->referer()); | |
1052 | + } | |
1053 | + | |
1054 | + /** | |
1055 | + * SetLabelIsPlaced method | |
1056 | + * | |
1057 | + * @param string $id | |
1058 | + * @param string $from | |
1059 | + */ | |
1060 | + public function setLabelIsPlaced($id,$from) { | |
1061 | + $this->setLabelIsPlacedOrNotPlaced($id, $from, TRUE); | |
1062 | + } | |
1063 | + | |
1064 | + /** | |
1065 | + * SetLabelIsNotPlaced method | |
1066 | + * | |
1067 | + * @param string $id | |
1068 | + * @param string $from | |
1069 | + */ | |
1070 | + public function setLabelIsNotPlaced($id,$from) { | |
1071 | + $this->setLabelIsPlacedOrNotPlaced($id, $from, FALSE); | |
1072 | + } | |
1073 | + | |
1074 | + | |
1075 | + /** | |
1076 | + * PrintLabelRuban method | |
1077 | + * | |
1078 | + * @param string $id | |
1079 | + * @param string $from | |
1080 | + */ | |
1081 | + public function printLabelRuban($id, $from='view') { | |
1082 | + $this->printLabel('ruban', $id, $from); | |
1083 | + } | |
1084 | + | |
1085 | + /** | |
1086 | + * PrintLabelEtiquette method | |
1087 | + * | |
1088 | + * @param string $id | |
1089 | + * @param string $from | |
1090 | + * | |
1091 | + public function printLabelEtiquette($id, $from='view') { | |
1092 | + $this->printLabel('etiquette', $id, $from); | |
1093 | + }*/ | |
1094 | + | |
1095 | + | |
1096 | + /** | |
1097 | + * PrintLabel method | |
1098 | + * | |
1099 | + * @param string $type | |
1100 | + * @param string $id | |
1101 | + * @param string $from | |
1102 | + */ | |
1103 | + private function printLabel($type='etiquette', $id, $from='view') { | |
1104 | + | |
1105 | + $materiel = $this->Materiels->get($id); | |
1106 | + | |
1107 | + $numeroLab = $materiel->numero_laboratoire; | |
1108 | + | |
1109 | + $organisme = $materiel->organisme_id; | |
1110 | + | |
1111 | + $numeroInventaireOrganisme = $materiel->numero_inventaire_organisme; | |
1112 | + $dateAcquisition = $materiel->date_acquisition; | |
1113 | + | |
1114 | + $filename = 'inventirap_label.label'; | |
1115 | + $file = fopen('php://output', 'w'); | |
1116 | + $this->response->header(['Content-type: application/xml', 'Content-Disposition: attachment; filename="'.$filename.'"']); | |
1117 | + $this->response->sendHeaders(); | |
1118 | + | |
1119 | + | |
1120 | + /* | |
1121 | + * SIMPLE LABEL FOR PRINTER DYMO LabelWriter 450 : NO LOGO | |
1122 | + */ | |
1123 | + /* | |
1124 | + '<?xml version="1.0" encoding="utf-8"?> | |
1125 | + <DieCutLabel Version="8.0" Units="twips"> | |
1126 | + <PaperOrientation>Landscape</PaperOrientation> | |
1127 | + <Id>MultiPurpose11355</Id> | |
1128 | + <PaperName>11355 Multi-Purpose</PaperName> | |
1129 | + <DrawCommands> | |
1130 | + <RoundRectangle X="0" Y="0" Width="1080" Height="2880" Rx="180" Ry="180"/> | |
1131 | + </DrawCommands> | |
1132 | + <ObjectInfo> | |
1133 | + <TextObject> | |
1134 | + <Name>TEXTE</Name> | |
1135 | + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1136 | + <BackColor Alpha="0" Red="255" Green="255" Blue="255"/> | |
1137 | + <LinkedObjectName></LinkedObjectName> | |
1138 | + <Rotation>Rotation0</Rotation> | |
1139 | + <IsMirrored>False</IsMirrored> | |
1140 | + <IsVariable>False</IsVariable> | |
1141 | + <HorizontalAlignment>Left</HorizontalAlignment> | |
1142 | + <VerticalAlignment>Middle</VerticalAlignment> | |
1143 | + <TextFitMode>None</TextFitMode> | |
1144 | + <UseFullFontHeight>True</UseFullFontHeight> | |
1145 | + <Verticalized>False</Verticalized> | |
1146 | + <StyledText> | |
1147 | + <Element> | |
1148 | + <String>' | |
1149 | + ."$numeroLab"."\n" | |
1150 | + ."$dateAcquisition"."\n" | |
1151 | + ."$organisme"."\n" | |
1152 | + .'</String> | |
1153 | + <Attributes> | |
1154 | + <Font Family="Lucida Grande" Size="10" Bold="False" Italic="False" Underline="False" Strikeout="False"/> | |
1155 | + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1156 | + </Attributes> | |
1157 | + </Element> | |
1158 | + </StyledText> | |
1159 | + </TextObject> | |
1160 | + <Bounds X="326.4" Y="57.59995" Width="2467.2" Height="940.8"/> | |
1161 | + </ObjectInfo> | |
1162 | + </DieCutLabel>' | |
1163 | + ."\n" | |
1164 | + */ | |
1165 | + | |
1166 | + /* | |
1167 | + * ETIQUETTE (19x51 mm) | |
1168 | + * | |
1169 | + * LABEL FOR PRINTER DYMO LabelWriter 450 : WITH LOGO | |
1170 | + */ | |
1171 | + if ($type == 'etiquette') fputs($file, | |
1172 | + | |
1173 | + '<?xml version="1.0" encoding="utf-8"?> | |
1174 | + <DieCutLabel Version="8.0" Units="twips"> | |
1175 | + <PaperOrientation>Landscape</PaperOrientation> | |
1176 | + <Id>MultiPurpose11355</Id> | |
1177 | + <PaperName>11355 Multi-Purpose</PaperName> | |
1178 | + <DrawCommands> | |
1179 | + <RoundRectangle X="0" Y="0" Width="1080" Height="2880" Rx="180" Ry="180"/> | |
1180 | + </DrawCommands> | |
1181 | + <ObjectInfo> | |
1182 | + <TextObject> | |
1183 | + <Name>TEXTE</Name> | |
1184 | + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1185 | + <BackColor Alpha="0" Red="255" Green="255" Blue="255"/> | |
1186 | + <LinkedObjectName></LinkedObjectName> | |
1187 | + <Rotation>Rotation0</Rotation> | |
1188 | + <IsMirrored>False</IsMirrored> | |
1189 | + <IsVariable>False</IsVariable> | |
1190 | + <HorizontalAlignment>Left</HorizontalAlignment> | |
1191 | + <VerticalAlignment>Middle</VerticalAlignment> | |
1192 | + <TextFitMode>ShrinkToFit</TextFitMode> | |
1193 | + <UseFullFontHeight>True</UseFullFontHeight> | |
1194 | + <Verticalized>False</Verticalized> | |
1195 | + <StyledText> | |
1196 | + <Element> | |
1197 | + <String>' | |
1198 | + | |
1199 | + ."$numeroLab"."\n" | |
1200 | + ."$dateAcquisition"."\n" | |
1201 | + ."$organisme".($numeroInventaireOrganisme?'-'."$numeroInventaireOrganisme":'') | |
1202 | + .'</String> | |
1203 | + <Attributes>' | |
1204 | + .'<Font Family="Arial" Size="48" Bold="False" Italic="False" Underline="False" Strikeout="False"/> | |
1205 | + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1206 | + </Attributes> | |
1207 | + </Element> | |
1208 | + </StyledText> | |
1209 | + </TextObject>' | |
1210 | + .'<Bounds X="326.4" Y="120.6717" Width="1596.468" Height="844.4843"/> | |
1211 | + </ObjectInfo> | |
1212 | + <ObjectInfo> | |
1213 | + <ImageObject> | |
1214 | + <Name>GRAPHISME</Name> | |
1215 | + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1216 | + <BackColor Alpha="0" Red="255" Green="255" Blue="255"/> | |
1217 | + <LinkedObjectName></LinkedObjectName> | |
1218 | + <Rotation>Rotation0</Rotation> | |
1219 | + <IsMirrored>False</IsMirrored> | |
1220 | + <IsVariable>False</IsVariable>' | |
1221 | + .'<Image>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</Image> | |
1222 | + <ScaleMode>Uniform</ScaleMode> | |
1223 | + <BorderWidth>0</BorderWidth> | |
1224 | + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1225 | + <HorizontalAlignment>Right</HorizontalAlignment>' | |
1226 | + .'<VerticalAlignment>Center</VerticalAlignment> | |
1227 | + </ImageObject>' | |
1228 | + .'<Bounds X="2146.378" Y="267.5423" Width="544.0805" Height="629.0975"/> | |
1229 | + </ObjectInfo> | |
1230 | + </DieCutLabel>' | |
1231 | + ."\n" | |
1232 | + | |
1233 | + ); // fputs (etiquette) | |
1234 | + | |
1235 | + | |
1236 | + /* | |
1237 | + * RUBAN (12mm) | |
1238 | + * | |
1239 | + * LABEL FOR PRINTER DYMO LabelManager PnP : 2 lines WITH LOGO | |
1240 | + */ | |
1241 | + if ($type == 'ruban') fputs($file, | |
1242 | + | |
1243 | + '<?xml version="1.0" encoding="utf-8"?> | |
1244 | + <ContinuousLabel Version="8.0" Units="twips"> | |
1245 | + <PaperOrientation>Landscape</PaperOrientation> | |
1246 | + <Id>Tape12mm</Id> | |
1247 | + <PaperName>12mm</PaperName> | |
1248 | + <LengthMode>Auto</LengthMode> | |
1249 | + <LabelLength>0</LabelLength> | |
1250 | + <RootCell> | |
1251 | + <Length>0</Length> | |
1252 | + <LengthMode>Auto</LengthMode> | |
1253 | + <BorderWidth>0</BorderWidth> | |
1254 | + <BorderStyle>Solid</BorderStyle> | |
1255 | + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1256 | + <SubcellsOrientation>Horizontal</SubcellsOrientation> | |
1257 | + <Subcells> | |
1258 | + <Cell> | |
1259 | + <TextObject> | |
1260 | + <Name>TEXTE_1</Name> | |
1261 | + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1262 | + <BackColor Alpha="0" Red="255" Green="255" Blue="255"/> | |
1263 | + <LinkedObjectName></LinkedObjectName> | |
1264 | + <Rotation>Rotation0</Rotation> | |
1265 | + <IsMirrored>False</IsMirrored> | |
1266 | + <IsVariable>False</IsVariable> | |
1267 | + <HorizontalAlignment>Left</HorizontalAlignment> | |
1268 | + <VerticalAlignment>Middle</VerticalAlignment> | |
1269 | + <TextFitMode>ShrinkToFit</TextFitMode> | |
1270 | + <UseFullFontHeight>True</UseFullFontHeight> | |
1271 | + <Verticalized>False</Verticalized> | |
1272 | + <StyledText> | |
1273 | + <Element> | |
1274 | + <String>' | |
1275 | + .trim("$numeroLab / "."$organisme")."\n" | |
1276 | + ."$dateAcquisition " .trim($numeroInventaireOrganisme?'/ '."$numeroInventaireOrganisme":'') | |
1277 | + .'</String> | |
1278 | + <Attributes> | |
1279 | + <Font Family="Arial" Size="24" Bold="True" Italic="False" Underline="False" Strikeout="False"/> | |
1280 | + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1281 | + </Attributes> | |
1282 | + </Element> | |
1283 | + </StyledText> | |
1284 | + </TextObject> | |
1285 | + <ObjectMargin Left="200" Right="200" Top="0" Bottom="0"/> | |
1286 | + <Length>2606.94</Length> | |
1287 | + <LengthMode>Fixed</LengthMode> | |
1288 | + <BorderWidth>0</BorderWidth> | |
1289 | + <BorderStyle>Solid</BorderStyle> | |
1290 | + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1291 | + </Cell> | |
1292 | + <Cell> | |
1293 | + <ImageObject> | |
1294 | + <Name>GRAPHISME</Name> | |
1295 | + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1296 | + <BackColor Alpha="0" Red="255" Green="255" Blue="255"/> | |
1297 | + <LinkedObjectName></LinkedObjectName> | |
1298 | + <Rotation>Rotation0</Rotation> | |
1299 | + <IsMirrored>False</IsMirrored> | |
1300 | + <IsVariable>False</IsVariable> | |
1301 | + <Image>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</Image>' | |
1302 | + .'<ScaleMode>Uniform</ScaleMode> | |
1303 | + <BorderWidth>0</BorderWidth> | |
1304 | + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1305 | + <HorizontalAlignment>Right</HorizontalAlignment> | |
1306 | + <VerticalAlignment>Center</VerticalAlignment> | |
1307 | + </ImageObject> | |
1308 | + <ObjectMargin Left="200" Right="200" Top="0" Bottom="0"/> | |
1309 | + <Length>863.9999</Length> | |
1310 | + <LengthMode>Auto</LengthMode> | |
1311 | + <BorderWidth>0</BorderWidth> | |
1312 | + <BorderStyle>Solid</BorderStyle> | |
1313 | + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1314 | + </Cell> | |
1315 | + </Subcells> | |
1316 | + </RootCell> | |
1317 | + </ContinuousLabel>' | |
1318 | + ."\n" | |
1319 | + | |
1320 | + ); // fputs (ruban 2 lines) | |
1321 | + | |
1322 | + | |
1323 | + | |
1324 | + /* | |
1325 | + * RUBAN | |
1326 | + * | |
1327 | + * LABEL FOR PRINTER DYMO LabelMznzhrt PnP : 3 lines WITH LOGO | |
1328 | + */ | |
1329 | + if ($type == 'ruban3lines') fputs($file, | |
1330 | + | |
1331 | + '<?xml version="1.0" encoding="utf-8"?> | |
1332 | + <ContinuousLabel Version="8.0" Units="twips"> | |
1333 | + <PaperOrientation>Landscape</PaperOrientation>' | |
1334 | + /* | |
1335 | + // 9mm | |
1336 | + <Id>Tape9mm</Id> | |
1337 | + <PaperName>9mm</PaperName> | |
1338 | + */ | |
1339 | + // 12mm | |
1340 | + .'<Id>Tape12mm</Id> | |
1341 | + <PaperName>12mm</PaperName> | |
1342 | + <LengthMode>Auto</LengthMode> | |
1343 | + <LabelLength>0</LabelLength> | |
1344 | + <RootCell> | |
1345 | + <Length>0</Length> | |
1346 | + <LengthMode>Auto</LengthMode> | |
1347 | + <BorderWidth>0</BorderWidth> | |
1348 | + <BorderStyle>Solid</BorderStyle> | |
1349 | + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1350 | + <SubcellsOrientation>Horizontal</SubcellsOrientation> | |
1351 | + <Subcells> | |
1352 | + <Cell> | |
1353 | + <TextObject> | |
1354 | + <Name>TEXTE</Name> | |
1355 | + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1356 | + <BackColor Alpha="0" Red="255" Green="255" Blue="255"/> | |
1357 | + <LinkedObjectName></LinkedObjectName> | |
1358 | + <Rotation>Rotation0</Rotation> | |
1359 | + <IsMirrored>False</IsMirrored> | |
1360 | + <IsVariable>False</IsVariable> | |
1361 | + <HorizontalAlignment>Left</HorizontalAlignment> | |
1362 | + <VerticalAlignment>Middle</VerticalAlignment> | |
1363 | + <TextFitMode>AlwaysFit</TextFitMode> | |
1364 | + <UseFullFontHeight>True</UseFullFontHeight> | |
1365 | + <Verticalized>False</Verticalized> | |
1366 | + <StyledText> | |
1367 | + <Element> | |
1368 | + <String>' | |
1369 | + ."$numeroLab"."\n" | |
1370 | + ."$organisme".($numeroInventaireOrganisme?'-'."$numeroInventaireOrganisme":'')."\n" | |
1371 | + ."$dateAcquisition" | |
1372 | + .'</String> | |
1373 | + <Attributes> | |
1374 | + <Font Family="Arial" Size="11" Bold="True" Italic="False" Underline="False" Strikeout="False"/> | |
1375 | + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1376 | + </Attributes> | |
1377 | + </Element> | |
1378 | + </StyledText> | |
1379 | + </TextObject> | |
1380 | + <ObjectMargin Left="200" Right="200" Top="0" Bottom="0"/> | |
1381 | + <Length>1477.513</Length> | |
1382 | + <LengthMode>Fixed</LengthMode> | |
1383 | + <BorderWidth>0</BorderWidth> | |
1384 | + <BorderStyle>Solid</BorderStyle> | |
1385 | + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1386 | + </Cell> | |
1387 | + <Cell> | |
1388 | + <ImageObject> | |
1389 | + <Name>GRAPHISME</Name> | |
1390 | + <ForeColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1391 | + <BackColor Alpha="0" Red="255" Green="255" Blue="255"/> | |
1392 | + <LinkedObjectName></LinkedObjectName> | |
1393 | + <Rotation>Rotation0</Rotation> | |
1394 | + <IsMirrored>False</IsMirrored> | |
1395 | + <IsVariable>False</IsVariable> | |
1396 | + <Image>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</Image> | |
1397 | + <ScaleMode>Uniform</ScaleMode> | |
1398 | + <BorderWidth>0</BorderWidth> | |
1399 | + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1400 | + <HorizontalAlignment>Right</HorizontalAlignment> | |
1401 | + <VerticalAlignment>Center</VerticalAlignment> | |
1402 | + </ImageObject> | |
1403 | + <ObjectMargin Left="200" Right="200" Top="0" Bottom="0"/> | |
1404 | + <Length>800</Length> | |
1405 | + <LengthMode>Auto</LengthMode> | |
1406 | + <BorderWidth>0</BorderWidth> | |
1407 | + <BorderStyle>Solid</BorderStyle> | |
1408 | + <BorderColor Alpha="255" Red="0" Green="0" Blue="0"/> | |
1409 | + </Cell> | |
1410 | + </Subcells> | |
1411 | + </RootCell> | |
1412 | + </ContinuousLabel>' | |
1413 | + ."\n" | |
1414 | + | |
1415 | + ); // fputs (ruban 3 lines) | |
1416 | + | |
1417 | + sleep(3); | |
1418 | + fclose($file); | |
1419 | + exit(); | |
1420 | + | |
1421 | + | |
1422 | + } | |
1423 | + | |
1424 | + // called from Javascript (Ajax) | |
1425 | + public function getDateGarantie($dateORjour, $dureeORmois, $uniteORannee, $duree = null, $unite = null) { | |
1426 | + | |
1427 | + if($duree != null && $unite != null) { | |
1428 | + $date = $dateORjour.'-'.$dureeORmois.'-'.$uniteORannee; | |
1429 | + } else { | |
1430 | + $date = $dateORjour; | |
1431 | + $duree = $dureeORmois; | |
1432 | + $unite = $uniteORannee; | |
1433 | + } | |
1434 | + | |
1435 | + $date_next = date_create_from_format('d-m-Y', $date); | |
1436 | + | |
1437 | + switch($unite) { | |
1438 | + case "Mois": | |
1439 | + date_add($date_next, date_interval_create_from_date_string($duree.' months')); | |
1440 | + break; | |
1441 | + case "Ans": | |
1442 | + date_add($date_next, date_interval_create_from_date_string($duree.' years')); | |
1443 | + break; | |
1444 | + } | |
1445 | + | |
1446 | + $this->set ('date', date_format($date_next, 'd-m-Y')); | |
1447 | + | |
1448 | + | |
1449 | + $this->viewBuilder()->layout = 'ajax'; | |
1450 | + } | |
1451 | + | |
1452 | + | |
1453 | +} | ... | ... |
src/Model/Table/CategoriesTable.php
src/Model/Table/ConfigurationsTable.php
src/Model/Table/DocumentsTable.php
src/Model/Table/EmpruntsTable.php
... | ... | @@ -2,12 +2,11 @@ |
2 | 2 | namespace App\Model\Table; |
3 | 3 | |
4 | 4 | use App\Model\Entity\Emprunt; |
5 | -use Cake\ORM\Query; | |
6 | 5 | use Cake\ORM\RulesChecker; |
7 | 6 | use Cake\ORM\Table; |
8 | -use Cake\Validation\Validator; | |
9 | 7 | use Cake\ORM\toArray; |
10 | 8 | use Cake\Validation\Validation; |
9 | +use Cake\Validation\Validator; | |
11 | 10 | |
12 | 11 | |
13 | 12 | /** | ... | ... |
src/Model/Table/GroupesMetiersTable.php
src/Model/Table/GroupesThematiquesTable.php
src/Model/Table/MaterielsTable.php
1 | 1 | <?php |
2 | 2 | namespace App\Model\Table; |
3 | 3 | |
4 | -use App\Model\Entity\Materiel; | |
5 | -use Cake\ORM\Query; | |
6 | 4 | use Cake\ORM\RulesChecker; |
7 | 5 | use Cake\ORM\Table; |
8 | 6 | use Cake\Validation\Validator; |
9 | 7 | use Cake\ORM\TableRegistry; |
8 | +use Cake\I18n\Time; | |
9 | +use Cake\I18n\Date; | |
10 | 10 | |
11 | 11 | /** |
12 | 12 | * Materiels Model |
... | ... | @@ -84,6 +84,14 @@ class MaterielsTable extends AppTable |
84 | 84 | */ |
85 | 85 | public function validationDefault(Validator $validator) |
86 | 86 | { |
87 | + $dateValide = function($entity) { | |
88 | + $time = Time::now(); // On récupère la date et l'heure actuelles | |
89 | + $today = (new date("$time->year-$time->month-$time->day"))->format('Ymd'); // On extrait la date on la formatte en un format comparable de type 20171231 | |
90 | + $timeEntity = new time($entity); | |
91 | + $dateEntity = (new date("$timeEntity->year-$timeEntity->month-$timeEntity->day"))->format('Ymd'); | |
92 | + return ($today >= $dateEntity); | |
93 | + }; | |
94 | + | |
87 | 95 | $validator |
88 | 96 | ->integer('id') |
89 | 97 | ->allowEmpty('id', 'create'); |
... | ... | @@ -120,12 +128,19 @@ class MaterielsTable extends AppTable |
120 | 128 | $configuration = TableRegistry::get('Configurations')->find()->where(['id =' => 1])->first(); |
121 | 129 | if($configuration->date_commande_facultative) { |
122 | 130 | $validator |
123 | - ->allowEmpty('date_acquisition'); | |
131 | + ->allowEmpty('date_acquisition') | |
132 | + ->add('date_acquisition', 'custom', [ // Ajouté par Thibault Ajas, le 28/04/2017 | |
133 | + 'rule' => $dateValide, | |
134 | + 'message' => 'La date n\'est pas valide' | |
135 | + ]); | |
124 | 136 | } |
125 | 137 | else { |
126 | 138 | $validator |
127 | - ->notEmpty('date_acquisition', 'Ce champ doit être rempli') | |
128 | - ->date('date_acquisition', 'dmy', null); | |
139 | + ->notEmpty('date_acquisition', 'Ce champ doit être rempli') | |
140 | + ->add('date_acquisition', 'custom', [ // Ajouté par Thibault Ajas, le 28/04/2017 | |
141 | + 'rule' => $dateValide, | |
142 | + 'message' => 'La date n\'est pas valide' | |
143 | + ]); | |
129 | 144 | } |
130 | 145 | |
131 | 146 | ... | ... |
src/Model/Table/OrganismesTable.php
src/Model/Table/SitesTable.php
src/Model/Table/SousCategoriesTable.php
src/Model/Table/SuivisTable.php
src/Model/Table/SurCategoriesTable.php
src/Model/Table/TypeDocumentsTable.php
src/Model/Table/TypeSuivisTable.php
src/Model/Table/UsersTable.php
src/Template/Categories/index.ctp
src/Template/Documents/index.ctp
src/Template/Emprunts/index.ctp
1 | 1 | |
2 | 2 | <div class="emprunts index"> |
3 | 3 | <?php echo '<h2><i class="icon-list"></i> Liste des emprunts ('.$nbEmprunts.')</h2>'; ?> |
4 | - <table cellpadding="0" cellspacing="0"> | |
4 | + <table style="border-collapse: separate; border-spacing: 0;"> | |
5 | 5 | <thead> |
6 | 6 | <tr> |
7 | 7 | <th class="actions"><?= __('') ?></th> | ... | ... |
src/Template/GroupesMetiers/index.ctp
1 | 1 | |
2 | 2 | <div class="groupesMetiers index"> |
3 | 3 | <?php echo '<h2><i class="icon-list"></i> Liste des '.$configuration->nom_groupe_metier.'</h2>'; ?> |
4 | - <table cellpadding="0" cellspacing="0"> | |
4 | + <table style="border-collapse: separate; border-spacing: 0;"> | |
5 | 5 | <thead> |
6 | 6 | <tr> |
7 | 7 | <th class="actions"><?= __('') ?></th> | ... | ... |
src/Template/GroupesThematiques/index.ctp
1 | 1 | |
2 | 2 | <div class="groupesThematiques index"> |
3 | 3 | <?php echo '<h2><i class="icon-list"></i> Liste des '.$configuration->nom_groupe_thematique.'s</h2>'; ?> |
4 | - <table cellpadding="0" cellspacing="0"> | |
4 | + <table style="border-collapse: separate; border-spacing: 0;"> | |
5 | 5 | <thead> |
6 | 6 | <tr> |
7 | 7 | <th class="actions"><?= __('') ?></th> | ... | ... |
src/Template/Materiels/find.ctp
... | ... | @@ -3,23 +3,23 @@ |
3 | 3 | <h2> |
4 | 4 | <i class="icon-search"></i> Recherche de matériel |
5 | 5 | </h2> |
6 | -<?php | |
7 | -$r = isset ($_results); | |
8 | - | |
9 | -if ($r) { | |
10 | - echo '<div class="actions" style="margin-bottom: 20px; width: 100%; float: none; padding: 10px 0;">'; | |
11 | - echo $this->Html->link ( '<i class="icon-file"></i> Exporter la liste', [ | |
12 | - 'controller' => 'Materiels', | |
13 | - 'action' => 'export', | |
14 | - 'search' | |
15 | - ], [ | |
16 | - 'title' => 'Editer le résultat de la recherche', | |
17 | - 'style' => 'margin-right: 15px', | |
18 | - 'escape' => false | |
19 | - ]); | |
20 | - echo '</div>'; | |
21 | -} | |
22 | -?> | |
6 | + <?php | |
7 | + $r = isset ($_results); | |
8 | + | |
9 | + if ($r) { | |
10 | + echo '<div class="actions" style="margin-bottom: 20px; width: 100%; float: none; padding: 10px 0;">'; | |
11 | + echo $this->Html->link ( '<i class="icon-file"></i> Exporter la liste', [ | |
12 | + 'controller' => 'Materiels', | |
13 | + 'action' => 'export', | |
14 | + 'search' | |
15 | + ], [ | |
16 | + 'title' => 'Editer le résultat de la recherche', | |
17 | + 'style' => 'margin-right: 15px', | |
18 | + 'escape' => false | |
19 | + ]); | |
20 | + echo '</div>'; | |
21 | + } | |
22 | + ?> | |
23 | 23 | |
24 | 24 | <h3 id="t_filter" style="cursor: pointer;"> |
25 | 25 | <i |
... | ... | @@ -28,170 +28,171 @@ if ($r) { |
28 | 28 | style="text-decoration: underline;">Filtres</span> |
29 | 29 | </h3> |
30 | 30 | |
31 | - <div id="filter" <?php if ($r) echo 'style="display: none;"'; ?>><?php | |
32 | - if (isset ( $_results )) | |
33 | - $selected = []; | |
34 | - else | |
35 | - $selected = [ | |
36 | - 'selected' => '' | |
37 | - ]; | |
38 | - | |
39 | - | |
40 | - // FORMULAIRE DE RECHERCHE | |
41 | - echo $this->Form->create(); | |
42 | - | |
43 | - // -------Bouton recherche Haut--------- | |
44 | - echo $this->Form->submit ( 'Rechercher', ['style' => 'width: 20%']); | |
45 | - | |
46 | - // Designation | |
47 | - echo $this->Form->input ( 's_designation', ['label' => 'Désignation']); | |
48 | - | |
49 | - // Matériel administratif et/ou technique | |
50 | - $typeOptions = []; | |
51 | - echo $this->Form->input ( 's_matostype', [ | |
52 | - 'label' => 'Type', | |
53 | - 'empty' => 'Tous', | |
54 | - 'options' => [ | |
55 | - 'A' => 'Administratif', | |
56 | - 'T' => 'Technique', | |
57 | - 'AT' => 'Administratif et Technique', | |
58 | - 'AO' => 'Administratif seulement', | |
59 | - 'TO' => 'Technique seulement' | |
60 | - ], | |
61 | - 'style' => 'width: 280px' | |
62 | - ]); | |
63 | - | |
64 | - // DOMAINE | |
65 | - echo $this->Form->input ( 's_sur_categorie_id', [ | |
66 | - 'label' => 'Domaine', | |
67 | - 'empty' => 'Tous', | |
68 | - $selected, | |
69 | - 'options' => $s_sur_categories, | |
70 | - 'style' => 'width: 200px' | |
71 | - ]); | |
72 | - | |
73 | - // CATEGORIES | |
74 | - // by default, ALL categs | |
75 | - $categs = $s_categories; | |
76 | - | |
77 | - // if a domaine is selected, reduce the categories list to this domaine | |
78 | - if (isset ( $this->request->data['s_sur_categorie_id'] ) && ($this->request->data['s_sur_categorie_id'] != '')) { | |
79 | - $categs = $categs->where(['sur_categorie_id =' => $this->request->data['s_sur_categorie_id']]); | |
80 | - } | |
81 | - | |
82 | - echo $this->Form->input ( 's_categorie_id', [ | |
83 | - 'label' => 'Catégorie', | |
84 | - 'empty' => 'Toutes', | |
85 | - 'style' => 'width: 200px', | |
86 | - 'options' => $categs | |
87 | - ]); | |
88 | - | |
89 | - // SOUS-CATEGORIES | |
90 | - // by default, list is empty | |
91 | - $souscategs = []; | |
92 | - // if a categ is selected, update sous-categs list for this categ (only) | |
93 | - if (isset ( $this->request->data['s_categorie_id'] ) && ($this->request->data['s_categorie_id'] != '')) { | |
94 | - $souscategs = $s_sous_categories; | |
95 | - $souscategs = $souscategs->where(['categorie_id' => $this->request->data['s_categorie_id']]); | |
96 | - } | |
97 | - | |
98 | - echo $this->Form->input ( 's_sous_categorie_id', [ | |
99 | - 'label' => 'Sous-catégorie', | |
100 | - 'empty' => 'Toutes', | |
101 | - 'style' => 'width: 200px', | |
102 | - 'options' => $souscategs | |
103 | - ]); | |
104 | - | |
105 | - $options = [ | |
106 | - 'CREATED' => 'Créé', | |
107 | - 'VALIDATED' => 'Validé', | |
108 | - 'TOBEARCHIVED' => 'À archiver', | |
109 | - ]; | |
110 | - if(in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur'])) { | |
111 | - $options['ARCHIVED'] = 'Archivé'; | |
112 | - } | |
113 | - // STATUT | |
114 | - echo $this->Form->input ( 's_status', [ | |
115 | - 'label' => 'Statut', | |
116 | - 'empty' => 'Tous', | |
117 | - $selected, | |
118 | - 'options' => $options, | |
119 | - 'style' => 'width: 200px' | |
120 | - ]); | |
121 | - | |
122 | - // Groupe metier et thematique | |
123 | - echo $this->Form->input ( 's_groupes_metier_id', [ | |
124 | - 'label' => $configuration->nom_groupe_metier, | |
125 | - 'empty' => 'Tous', | |
126 | - $selected, | |
127 | - 'options' => $s_groupes_metiers, | |
128 | - 'style' => 'width: 200px' | |
129 | - ]); | |
130 | - echo $this->Form->input ( 's_groupes_thematique_id', [ | |
131 | - 'label' => $configuration->nom_groupe_thematique, | |
132 | - 'empty' => 'Tous', | |
133 | - $selected, | |
134 | - 'options' => $s_groupes_thematiques, | |
135 | - 'style' => 'width: 200px' | |
136 | - ]); | |
137 | - | |
138 | - // Autres champs | |
139 | - echo $this->Form->input ( 's_numero_commande', [ | |
140 | - 'label' => 'N° BC' | |
141 | - ]); | |
142 | - echo $this->Form->input ( 's_numero_laboratoire', [ | |
143 | - 'label' => 'N° interne (labo)' | |
144 | - ]); | |
145 | - | |
146 | - //ORGANISME | |
147 | - $orgas = $s_organismes; | |
148 | - echo $this->Form->input ( 's_organisme_id', [ | |
149 | - 'label' => 'Organisme', | |
150 | - 'empty' => 'Toutes', | |
151 | - 'style' => 'width: 200px', | |
152 | - 'options' => $orgas | |
153 | - ]); | |
154 | - | |
155 | - echo $this->Form->input ( 's_nom_responsable', [ | |
156 | - 'label' => 'Nom du propriétaire' | |
157 | - ]); | |
158 | - echo $this->Form->input ( 's_numero_inventaire_organisme', [ | |
159 | - 'label' => 'N° inventaire organisme' | |
160 | - ]); | |
161 | - echo $this->Form->input ( 's_numero_inventaire_old', [ | |
162 | - 'label' => 'N° inventaire (ancien)' | |
163 | - ]); | |
31 | + <div id="filter" <?php if ($r) echo 'style="display: none;"'; ?>> | |
32 | + <?php | |
33 | + if (isset ( $_results )) | |
34 | + $selected = []; | |
35 | + else | |
36 | + $selected = [ | |
37 | + 'selected' => '' | |
38 | + ]; | |
164 | 39 | |
165 | - // Date acquisition | |
166 | - echo "<u>DATE d'achat:</u>"; | |
167 | - echo $this->Form->input ( 's_date_acquisition', [ | |
168 | - 'placeholder' => 'Cliquez pour selectionner une date', | |
169 | - 'label' => '- Date exacte', | |
170 | - 'class' => 'datepicker' | |
171 | - ]); | |
172 | - echo $this->Form->input ( 's_periode_acquisition1', [ | |
173 | - 'placeholder' => 'Cliquez pour selectionner une date', | |
174 | - 'label' => '- Date Début', | |
175 | - 'class' => 'datepicker' | |
176 | - ]); | |
177 | - echo $this->Form->input ( 's_periode_acquisition2', [ | |
178 | - 'placeholder' => 'Cliquez pour selectionner une date', | |
179 | - 'label' => '- Date Fin', | |
180 | - 'class' => 'datepicker' | |
181 | - ]); | |
182 | - | |
183 | - echo "<u>MONTANT :</u>"; | |
184 | - echo $this->Form->input ( 's_prix_ht', ['label' => '- Montant exact']); | |
185 | - echo $this->Form->input ( 's_prix_ht_sup', ['label' => '- Montant sup. ou égal à']); | |
186 | - echo $this->Form->input ( 's_prix_ht_inf', ['label' => '- Montant inf. ou égal à']); | |
40 | + | |
41 | + // FORMULAIRE DE RECHERCHE | |
42 | + echo $this->Form->create(); | |
43 | + | |
44 | + // -------Bouton recherche Haut--------- | |
45 | + echo $this->Form->submit ( 'Rechercher', ['style' => 'width: 20%']); | |
46 | + | |
47 | + // Designation | |
48 | + echo $this->Form->input ( 's_designation', ['label' => 'Désignation']); | |
49 | + | |
50 | + // Matériel administratif et/ou technique | |
51 | + $typeOptions = []; | |
52 | + echo $this->Form->input ( 's_matostype', [ | |
53 | + 'label' => 'Type', | |
54 | + 'empty' => 'Tous', | |
55 | + 'options' => [ | |
56 | + 'A' => 'Administratif', | |
57 | + 'T' => 'Technique', | |
58 | + 'AT' => 'Administratif et Technique', | |
59 | + 'AO' => 'Administratif seulement', | |
60 | + 'TO' => 'Technique seulement' | |
61 | + ], | |
62 | + 'style' => 'width: 280px' | |
63 | + ]); | |
64 | + | |
65 | + // DOMAINE | |
66 | + echo $this->Form->input ( 's_sur_categorie_id', [ | |
67 | + 'label' => 'Domaine', | |
68 | + 'empty' => 'Tous', | |
69 | + $selected, | |
70 | + 'options' => $s_sur_categories, | |
71 | + 'style' => 'width: 200px' | |
72 | + ]); | |
73 | + | |
74 | + // CATEGORIES | |
75 | + // by default, ALL categs | |
76 | + $categs = $s_categories; | |
77 | + | |
78 | + // if a domaine is selected, reduce the categories list to this domaine | |
79 | + if (isset ( $this->request->data['s_sur_categorie_id'] ) && ($this->request->data['s_sur_categorie_id'] != '')) { | |
80 | + $categs = $categs->where(['sur_categorie_id =' => $this->request->data['s_sur_categorie_id']]); | |
81 | + } | |
82 | + | |
83 | + echo $this->Form->input ( 's_categorie_id', [ | |
84 | + 'label' => 'Catégorie', | |
85 | + 'empty' => 'Toutes', | |
86 | + 'style' => 'width: 200px', | |
87 | + 'options' => $categs | |
88 | + ]); | |
89 | + | |
90 | + // SOUS-CATEGORIES | |
91 | + // by default, list is empty | |
92 | + $souscategs = []; | |
93 | + // if a categ is selected, update sous-categs list for this categ (only) | |
94 | + if (isset ( $this->request->data['s_categorie_id'] ) && ($this->request->data['s_categorie_id'] != '')) { | |
95 | + $souscategs = $s_sous_categories; | |
96 | + $souscategs = $souscategs->where(['categorie_id' => $this->request->data['s_categorie_id']]); | |
97 | + } | |
98 | + | |
99 | + echo $this->Form->input ( 's_sous_categorie_id', [ | |
100 | + 'label' => 'Sous-catégorie', | |
101 | + 'empty' => 'Toutes', | |
102 | + 'style' => 'width: 200px', | |
103 | + 'options' => $souscategs | |
104 | + ]); | |
105 | + | |
106 | + $options = [ | |
107 | + 'CREATED' => 'Créé', | |
108 | + 'VALIDATED' => 'Validé', | |
109 | + 'TOBEARCHIVED' => 'À archiver', | |
110 | + ]; | |
111 | + if(in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur'])) { | |
112 | + $options['ARCHIVED'] = 'Archivé'; | |
113 | + } | |
114 | + // STATUT | |
115 | + echo $this->Form->input ( 's_status', [ | |
116 | + 'label' => 'Statut', | |
117 | + 'empty' => 'Tous', | |
118 | + $selected, | |
119 | + 'options' => $options, | |
120 | + 'style' => 'width: 200px' | |
121 | + ]); | |
122 | + | |
123 | + // Groupe metier et thematique | |
124 | + echo $this->Form->input ( 's_groupes_metier_id', [ | |
125 | + 'label' => $configuration->nom_groupe_metier, | |
126 | + 'empty' => 'Tous', | |
127 | + $selected, | |
128 | + 'options' => $s_groupes_metiers, | |
129 | + 'style' => 'width: 200px' | |
130 | + ]); | |
131 | + echo $this->Form->input ( 's_groupes_thematique_id', [ | |
132 | + 'label' => $configuration->nom_groupe_thematique, | |
133 | + 'empty' => 'Tous', | |
134 | + $selected, | |
135 | + 'options' => $s_groupes_thematiques, | |
136 | + 'style' => 'width: 200px' | |
137 | + ]); | |
138 | + | |
139 | + // Autres champs | |
140 | + echo $this->Form->input ( 's_numero_commande', [ | |
141 | + 'label' => 'N° BC' | |
142 | + ]); | |
143 | + echo $this->Form->input ( 's_numero_laboratoire', [ | |
144 | + 'label' => 'N° interne (labo)' | |
145 | + ]); | |
187 | 146 | |
188 | - // CHAMP DE RECHERCHE GENERIQUE | |
189 | - echo $this->Form->input ( 's_all', ['label' => 'TOUS LES CHAMPS' ]); | |
147 | + //ORGANISME | |
148 | + $orgas = $s_organismes; | |
149 | + echo $this->Form->input ( 's_organisme_id', [ | |
150 | + 'label' => 'Organisme', | |
151 | + 'empty' => 'Toutes', | |
152 | + 'style' => 'width: 200px', | |
153 | + 'options' => $orgas | |
154 | + ]); | |
190 | 155 | |
191 | - // -------Bouton recherche Bas--------- | |
192 | - echo $this->Form->submit('Rechercher', ['style' => 'width: 20%']); | |
193 | - echo '<br/><br/><br/>'; | |
194 | - ?> | |
156 | + echo $this->Form->input ( 's_nom_responsable', [ | |
157 | + 'label' => 'Nom du propriétaire' | |
158 | + ]); | |
159 | + echo $this->Form->input ( 's_numero_inventaire_organisme', [ | |
160 | + 'label' => 'N° inventaire organisme' | |
161 | + ]); | |
162 | + echo $this->Form->input ( 's_numero_inventaire_old', [ | |
163 | + 'label' => 'N° inventaire (ancien)' | |
164 | + ]); | |
165 | + | |
166 | + // Date acquisition | |
167 | + echo "<u>DATE d'achat:</u>"; | |
168 | + echo $this->Form->input ( 's_date_acquisition', [ | |
169 | + 'placeholder' => 'Cliquez pour selectionner une date', | |
170 | + 'label' => '- Date exacte', | |
171 | + 'class' => 'datepicker' | |
172 | + ]); | |
173 | + echo $this->Form->input ( 's_periode_acquisition1', [ | |
174 | + 'placeholder' => 'Cliquez pour selectionner une date', | |
175 | + 'label' => '- Date Début', | |
176 | + 'class' => 'datepicker' | |
177 | + ]); | |
178 | + echo $this->Form->input ( 's_periode_acquisition2', [ | |
179 | + 'placeholder' => 'Cliquez pour selectionner une date', | |
180 | + 'label' => '- Date Fin', | |
181 | + 'class' => 'datepicker' | |
182 | + ]); | |
183 | + | |
184 | + echo "<u>MONTANT :</u>"; | |
185 | + echo $this->Form->input ( 's_prix_ht', ['label' => '- Montant exact']); | |
186 | + echo $this->Form->input ( 's_prix_ht_sup', ['label' => '- Montant sup. ou égal à']); | |
187 | + echo $this->Form->input ( 's_prix_ht_inf', ['label' => '- Montant inf. ou égal à']); | |
188 | + | |
189 | + // CHAMP DE RECHERCHE GENERIQUE | |
190 | + echo $this->Form->input ( 's_all', ['label' => 'TOUS LES CHAMPS' ]); | |
191 | + | |
192 | + // -------Bouton recherche Bas--------- | |
193 | + echo $this->Form->submit('Rechercher', ['style' => 'width: 20%']); | |
194 | + echo '<br/><br/><br/>'; | |
195 | + ?> | |
195 | 196 | </div> |
196 | 197 | <!-- RESULT DISPLAY --> |
197 | 198 | <h3 id="t_result" style="cursor: pointer;"> |
... | ... | @@ -206,7 +207,7 @@ if ($r) { |
206 | 207 | $this->request->session()->write("resultTri", $_results); |
207 | 208 | |
208 | 209 | ?> |
209 | - <table cellpadding="0" cellspacing="0"> | |
210 | + <table style="border-collapse: separate; border-spacing: 0;"> | |
210 | 211 | <thead> |
211 | 212 | <tr> |
212 | 213 | <th class="actions"><?= __('') ?></th> | ... | ... |
src/Template/Materiels/index.ctp
1 | +<?php | |
2 | +use Cake\I18n\Time; | |
3 | +use Cake\I18n\Date; | |
4 | +?> | |
5 | + | |
6 | + | |
1 | 7 | <div class="materiels index"> |
2 | 8 | <?php echo '<h2><i class="icon-list"></i> Liste des matériels ('.$nbMateriels.')</h2>'; ?> |
3 | 9 | |
... | ... | @@ -114,7 +120,7 @@ if (isset ( $STATUS )) { |
114 | 120 | } |
115 | 121 | ?> |
116 | 122 | |
117 | - <table cellpadding="0" cellspacing="0"> | |
123 | + <table style="border-collapse: separate; border-spacing: 0;"> | |
118 | 124 | <thead> |
119 | 125 | <tr> |
120 | 126 | <?php if (isset($STATUS)) { echo '<th></th>'; }?> |
... | ... | @@ -131,7 +137,26 @@ if (isset ( $STATUS )) { |
131 | 137 | </tr> |
132 | 138 | </thead> |
133 | 139 | <tbody> |
140 | + | |
141 | + <?php | |
142 | + // Pour changer la couleur du nom du matos si la garantie est passée - Ajout par Thibault Ajas le 28/04/2017 | |
143 | + $time = Time::now(); // On récupère la date et l'heure actuelles | |
144 | + $today = new date("$time->year-$time->month-$time->day"); // On extrait la date pour la vérification de fin de garantie | |
145 | + $today = $today->format('Ydm'); // On formatte la date initialement en 31-12-2000 (par exemple) en un format qui pourra etre comparé : 20001231 | |
146 | + ?> | |
147 | + | |
134 | 148 | <?php foreach ($materiels as $materiel): ?> |
149 | + | |
150 | + <?php | |
151 | + if ($materiel->date_fin_garantie !== NULL) { | |
152 | + $timeFin = new time($materiel->date_fin_garantie); | |
153 | + $dateFin = new date("$timeFin->year-$timeFin->month-$timeFin->day"); | |
154 | + $dateFin = $dateFin->format('Ydm'); | |
155 | + } | |
156 | + if($materiel->date_fin_garantie !== NULL) $styleLien = ($today >= $dateFin) ? 'style="color: #FF0000"' : '' ; else $styleLien = ''; | |
157 | + // Fin ajout - Utilisation de la variable $styleLien ligne 213 | |
158 | + ?> | |
159 | + | |
135 | 160 | <tr> |
136 | 161 | <?php if (isset($STATUS)) { |
137 | 162 | echo '<td class="smallText">'.$this->Form->checkbox($materiel->id, ['style' => 'margin: 3px','id' => $materiel->id]).'</td>' ; |
... | ... | @@ -188,7 +213,7 @@ if (isset ( $STATUS )) { |
188 | 213 | } |
189 | 214 | ?> |
190 | 215 | </td> |
191 | - <td class="smallText"><?= $materiel->has('designation') ? $this->Html->link($materiel->designation, ['controller' => 'Materiels', 'action' => 'view', $materiel->id]) : '' ?></td> | |
216 | + <td class="smallText"><?= $materiel->has('designation') ? $this->Html->link($materiel->designation, ['controller' => 'Materiels', 'action' => 'view', $materiel->id],[$styleLien]) : '' ?></td> | |
192 | 217 | <td class="smallText"><?= h($materiel->numero_laboratoire) ?></td> |
193 | 218 | <td class="smallText"><?= $materiel->has('category') ? h($materiel->category->nom) : '' ?></td> |
194 | 219 | <td class="smallText"><?= $materiel->has('organisme') ? h($materiel->organisme->nom) : '' ?></td> |
... | ... | @@ -294,7 +319,9 @@ if (isset ( $STATUS )) { |
294 | 319 | 'singularHumanName' => 'Matériel' ]) ?> |
295 | 320 | </div> |
296 | 321 | |
297 | - | |
322 | + | |
323 | + | |
324 | + | |
298 | 325 | <script type="text/javascript"> |
299 | 326 | function changeNbrMateriels(nbr) { |
300 | 327 | var urlDeBase = window.location.href.split("?"); | ... | ... |
src/Template/Materiels/view.ctp
1 | - | |
1 | +<?php | |
2 | +use Cake\I18n\Time; | |
3 | +use Cake\I18n\Date; | |
4 | +?> | |
2 | 5 | <div class="materiels view"> |
3 | 6 | |
4 | 7 | <h2> |
... | ... | @@ -18,7 +21,7 @@ if (h ( $materiel->status ) == 'ARCHIVED') |
18 | 21 | <?php if (h($materiel->status) == 'ARCHIVED') echo ' (Archivé)'; ?> |
19 | 22 | </span> |
20 | 23 | </h2> |
21 | - </br> | |
24 | + <br> | |
22 | 25 | <div style="text-align: center;"> |
23 | 26 | <?php |
24 | 27 | |
... | ... | @@ -39,7 +42,7 @@ if (h ( $materiel->status ) == 'ARCHIVED') |
39 | 42 | ] ); |
40 | 43 | echo '</div>'; |
41 | 44 | ?> |
42 | - </br> | |
45 | + <br> | |
43 | 46 | |
44 | 47 | <div class="actions" |
45 | 48 | style="margin-bottom: 20px; width: 100%; float: none; padding: 10px 0;"> |
... | ... | @@ -301,6 +304,21 @@ if (h ( $materiel->status ) == 'ARCHIVED') |
301 | 304 | <th></th> |
302 | 305 | </tr> |
303 | 306 | |
307 | + | |
308 | + <?php | |
309 | + // Pour changer la couleur de la date de garantie si elle est passée - Ajout par Thibault Ajas le 02/05/2017 | |
310 | + $time = Time::now(); // On récupère la date et l'heure actuelles | |
311 | + $today = new date("$time->year-$time->month-$time->day"); // On extrait la date pour la vérification de fin de garantie | |
312 | + $today = $today->format('Ydm'); // On formatte la date initialement en 31-12-2000 en un format qui pourra etre comparé : 20001231 | |
313 | + if ($materiel->date_fin_garantie !== NULL) { | |
314 | + $timeFin = new time($materiel->date_fin_garantie); | |
315 | + $dateFin = new date("$timeFin->year-$timeFin->month-$timeFin->day"); | |
316 | + $dateFin = $dateFin->format('Ydm'); | |
317 | + } | |
318 | + if($materiel->date_fin_garantie !== NULL) $style = ($today >= $dateFin) ? 'style="color: #FF0000"' : '' ; else $style = ''; | |
319 | + ?> | |
320 | + | |
321 | + | |
304 | 322 | <?php |
305 | 323 | $type = ""; |
306 | 324 | if (h ( $materiel->materiel_administratif ) == 1 && h ( $materiel->materiel_technique ) == 1) { |
... | ... | @@ -312,7 +330,9 @@ if (h ( $materiel->status ) == 'ARCHIVED') |
312 | 330 | } |
313 | 331 | |
314 | 332 | echo '<tr><td><strong>'.__('Description').' </strong></td><td>'.nl2br($materiel->description).'</td></tr>'; |
315 | - | |
333 | + | |
334 | + // La variable-fonction $displayElement est définie dans le fichier src/Controller/AppController.php | |
335 | + | |
316 | 336 | $displayElement ( __ ( 'Materiel inventorié' ), $type ); |
317 | 337 | $displayElement ( __ ( 'Organisme' ), $materiel->has ( 'organisme' ) ? h ( $materiel->organisme->nom ) : '' ); |
318 | 338 | $displayElement ( __ ( 'Domaine' ), $materiel->has ( 'sur_category' ) ? h ( $materiel->sur_category->nom ) : '' ); |
... | ... | @@ -341,8 +361,8 @@ if (h ( $materiel->status ) == 'ARCHIVED') |
341 | 361 | if (! empty ( h ( $materiel->duree_garntie ) )) { |
342 | 362 | $displayElement ( __ ( 'Duree garantie' ), h ( $materiel->duree_garantie ) . ' ' . h ( $materiel->unite_duree_garantie ) ); |
343 | 363 | } |
344 | - $displayElement ( __ ( 'Date fin de garantie' ), h ( $materiel->date_fin_garantie ) ); | |
345 | - | |
364 | + $displayElement ( __ ( 'Date fin de garantie' ), h ( $materiel->date_fin_garantie ), $style ); | |
365 | + | |
346 | 366 | $displayElement ( __ ( 'Statut' ), h ( $materiel->status ) ); |
347 | 367 | if ($materiel->status == 'ARCHIVED') { |
348 | 368 | $displayElement ( __ ( 'Date d\'archivage' ), h ( $materiel->date_archivage ) ); | ... | ... |
src/Template/Organismes/index.ctp
src/Template/Pages/acls.ctp
... | ... | @@ -114,7 +114,7 @@ |
114 | 114 | .WW8Num8z0 { font-family:Symbol; font-size:9pt; font-weight:normal; } |
115 | 115 | <!-- ODF styles with no properties representable as CSS --> |
116 | 116 | .Tableau2.13 .T10 .T11 .T12 .T19 .T2 .T20 .T21 .T22 .T23 .T24 .T3 .T8 .T9 .WW8Num8z1 .WW8Num8z2 .WW8Num8z3 .WW8Num8z4 .WW8Num8z5 .WW8Num8z6 .WW8Num8z7 .WW8Num8z8 .WW8Num9z0 .WW8Num9z1 .WW8Num9z2 .WW8Num9z3 .WW8Num9z4 .WW8Num9z5 .WW8Num9z6 .WW8Num9z7 .WW8Num9z8 { } |
117 | - </style></head><body dir="ltr" style="max-width:29.7cm;margin-top:1cm; margin-bottom:1cm; margin-left:1cm; margin-right:1.45cm; writing-mode:lr-tb; "><p class="P46">ACL (Access Control List)</p><p class="P11">(Etienne Pallier – 24/<span class="T22">06</span>/201<span class="T23">6</span>)</p><p class="P1"> </p><p class="P1"> </p><p class="P1"> </p><p class="P1">I – Cycle de vie du statut du matériel</p><p class="P1"> </p><p class="Standard"><span class="T5">Créer</span><span class="T2"> un matériel ==</span><span class="T9">> passe alors en statut </span><span class="T7">CREATED ==> </span><span class="T1">peut alors être éventuellement supprimé (mais ne pourra plus être supprimé ensuite)</span></p><p class="Standard"><span class="T7">Valider</span><span class="T9"> un matériel CREATED ==> passe alors en statut </span><span class="T7">VALIDATED </span><span class="T9">(</span><span class="T11">resp et </span><span class="T9">admin only)</span></p><p class="P4"><span class="T7">Demander l'Archivage</span><span class="T9"> d'un materiel VALIDATED ==> passe alors en statut </span><span class="T7">TOBEARCHIVED</span><span class="T9"> (resp et admin only)</span></p><p class="P4"><span class="T7">Sortir</span><span class="T9"> de l'inventaire (Valider une demande d'archivage d'un matériel TOBEARCHIVED) ==> statut </span><span class="T7">ARCHIVED</span><span class="T9"> (admin only)</span></p><p class="P4"><span class="T7">Désarchiver</span><span class="T9"> un matériel ==> repasse de TOBEARCHIVED ou ARCHIVED à </span><span class="T7">VALIDATED</span><span class="T9"> (admin only) </span></p><p class="P4"> </p><p class="P5">En résumé : </p><p class="P4"> </p><p class="P3">CREATED ==> VALIDATED ==> TOBEARCHIVED ==> ARCHIVED</p><p class="P2"><span class="T12"> </span><span class="T8">I /\ I I</span></p><p class="P2"><span class="T12"> </span><span class="T8">V I ------------------------ I --------------------------------- I (adminplus only)</span></p><p class="P3">DELETED</p><p class="P2"> </p><p class="P2"> </p><p class="P2"> </p><p class="P1">II - Droits des utilisateurs selon leur profil</p><p class="P1"> </p><p class="P1">A – Globalement (principes généraux)</p><p class="P1"> </p><p class="P6">Un utilisateur non logué ne doit RIEN pouvoir faire. Seulement se loguer, c'est tout. Il n'a accès qu'à la page d'accueil (de login).</p><p class="P6">Une fois logué, un utilisateur a des droits différents selon son profil, globalement :</p><p class="P14"><span class="T2">- un </span><span class="T5">USER</span><span class="T2"> ne peut que créer un matériel, un suivi, ou un emprunt, consulter, et modifier (uniquement ce qu'il a créé lui-même)</span></p><p class="P18"><span class="T2">- un </span><span class="T5">RESPONSABLE</span><span class="T2"> a tous les droits sauf accès à certains champs et certaines vues réservées à l'administration (ADMIN). Il ne peut pas non plus archiver un matériel, mais seulement demander l'archivage (comme un USER)(uniquement ce </span><span class="T3">lié à son groupe métier ou thématiques</span><span class="T2">)</span></p><p class="P14"><span class="T2">- un </span><span class="T5">ADMIN</span><span class="T2">(istratif) a tous les droits (y-compris champs réservés à l'administration)</span></p><p class="P14"><span class="T2">- un </span><span class="T5">ADMINPLUS</span><span class="T2"> (administratif Plus) a tous les droits de ADMIN et en plus il peut modifier un matériel quelque soit son statut (y-compris TOBEARCHIVED et ARCHIVED), notamment il peut modifier le statut du matériel (pour le rétrograder)</span></p><p class="P14"><span class="T2">- un </span><span class="T5">SUPERADMIN</span><span class="T2"> a tous les droits : ceux d'ADMINPLUS et certains droits supplémentaires pour lui permettre des corrections d'erreur et la configuration de l'application (notamment l'administration des utilisateurs...)</span></p><p class="P15"> </p><p class="Standard"><span class="T2">Concernant les informations internes permettant de savoir </span><span class="T5">qui a fait quoi</span><span class="T2"> (mises en place en février 2014), elles ne sont bien sûr pas modifiables puisque gérées automatiquement par le système, mais sont visibles par tous excepté le profil USER.</span></p><p class="P1"/><p class="P7">B - sur la table MATERIEL</p><table border="0" cellspacing="0" cellpadding="0" class="Tableau2"><colgroup><col width="170"/><col width="170"/><col width="170"/><col width="170"/><col width="170"/><col width="170"/><col width="170"/></colgroup><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="Table_20_Contents"> </p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P41">ALL (TOUS)</p><p class="P43">(droits par defaut)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P40"><span class="T5">U</span><span class="T6">tilisateur </span><span class="T5"> </span><span class="T2">(quelconque)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P42">Responsable</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P42">Administration</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P42">Administration Plus</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_G1"><p class="P42">Super-Administrateur</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Read (un seul ou une liste)</p><p class="P45">(view ou index)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P25">Y</p><p class="Table_20_Contents"><span class="T14">champs caches:</span><span class="T13"> donnees admin</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P36">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P36">idem ALL</p></td><td rowspan="3" style="text-align:left;width:3.893cm; " class="Tableau2_E4"><p class="P23"><span class="T16">(idem Responsable </span><span class="T15">+ donnees admin</span><span class="T16">)</span></p><p class="P37"> </p><p class="P23"><span class="T13">En mode edit (update), si VALIDATED, on ajoute aux donnees </span><span class="T14">readonly</span><span class="T13"> les </span><span class="T14">donnees admin</span></p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_F3"><p class="P37">idem Admin</p></td><td rowspan="11" style="text-align:left;width:3.893cm; " class="Tableau2_G12"><p class="P37">idem Adminplus</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Create (1)</p><p class="P45">(add)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">Y</p><p class="P39"><span class="T14">champs caches</span><span class="T13">:</span></p><p class="P34">donnees admin + statut + etiquette </p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P36">Idem ALL</p><p class="P39"><span class="T14">champs readonly </span><span class="T13">:</span></p><p class="P34">nom_responsable</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_D4"><p class="P36">idem ALL</p><p class="P36">(+ etiquette)</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Update (1)</p><p class="P45">(edit)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">Y</p><p class="P33">ssi</p><p class="P39"><span class="T15">CREATED</span><span class="T16"> (tous les champs) </span></p><p class="P39"><span class="T13">ou </span><span class="T14">VALIDATED</span><span class="T13"> (quelques champs visibles sont </span><span class="T14">readonly</span><span class="T13">) (1)</span></p><p class="P34"> </p><p class="P39"><span class="T14">champs caches</span><span class="T13">:</span></p><p class="P34">donnees admin + statut + etiquette</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_C5"><p class="P36">idem ALL</p><p class="P22"><span class="T16">ssi </span><span class="T15">createur</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">idem Admin</p><p class="P23"><span class="T16">(</span><span class="T15">tous les statuts</span><span class="T16">)</span></p><p class="P23"><span class="T16">(+ champ </span><span class="T15">statut</span><span class="T16">)</span></p><p class="P23"> </p><p class="P23"><span class="T16">TOBEARCHIVED ou ARCHIVED: </span><span class="T15">seulement le statut</span></p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Delete</p><p class="P45">(delete)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">Y</p><p class="P29">ssi CREATED</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">idem ALL</p></td><td rowspan="3" style="text-align:left;width:3.893cm; " class="Tableau2_E7"><p class="P37">idem Responsable</p></td><td rowspan="4" style="text-align:left;width:3.893cm; " class="Tableau2_F8"><p class="P37">idem Admin</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Valider</p><p class="P45">(statusValidated)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P25">N</p><p class="P28">(resp+)</p></td><td rowspan="7" style="text-align:left;width:3.893cm; " class="Tableau2_C12"><p class="P36">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p><p class="P30">ssi</p><p class="P30">CREATED</p><p class="P37"> </p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Demander archivage</p><p class="P45">(statusToBeArchived)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P25">N</p><p class="P28">(resp+)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p><p class="P30">ssi</p><p class="P30">VALIDATED</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Sortir de l'inventaire</p><p class="P45"><span class="T12"> </span>(statusArchived)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(admin+)</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_D9"><p class="P37">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P35">Y</p><p class="P28">ssi</p><p class="P28">TOBEARCHIVED</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Desarchiver (2)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(adminplus+)</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_E10"><p class="P37">idem Responsable</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p><p class="P30">ssi</p><p class="P30">ARCHIVED ou</p><p class="P30">TOBEARCHIVED</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Exporter</p><p class="P45">(csv)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(resp+)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p></td><td rowspan="3" style="text-align:left;width:3.893cm; " class="Tableau2_F12"><p class="P37">idem Admin</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Montee de statut group<span class="T24">é</span>e</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(admin+)</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_D12"><p class="P37">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P38">Y</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Edition (4)</p><p class="P44">DOCUMENTS</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E12"><p class="P26">N</p><p class="P29">(admin+)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E12"><p class="P37">Y</p><p class="P31">- admission : ssi VALIDATED</p><p class="P31">- sortie : ssi TOBEARCHIVED ou ARCHIVED</p></td></tr><tr class="Tableau213"><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P68">Fiche Matériel </p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E13"><p class="P62">Y <span class="T25">(sans partie admin)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_C13"><p class="P49">Y <span class="T25">(sans partie admin)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_D13"><p class="P49">Y <span class="T25">(sans partie admin)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E13"><p class="P62">Y</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_F13"><p class="P49">Y</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_G13"><p class="P49">Y <span class="T25">(sans partie admin)</span></p></td></tr></table><p class="P7"> </p><p class="P7"> </p><p class="P6"> </p><p class="P10">Par défaut, le superadmin a TOUS les droits</p><p class="P10"> </p><p class="Standard"><span class="T15">Conventions d'écriture </span><span class="T16">: </span></p><p class="P14"><span class="T16">- r</span><span class="T15">esp+</span><span class="T16"> = possible pour un </span><span class="T15">Responsable et plus </span><span class="T16">(responsable, admin, adminplus, et superadmin)</span></p><p class="P14"><span class="T16">- </span><span class="T15">admin+</span><span class="T16"> = possible pour un </span><span class="T15">Admin</span><span class="T16"> </span><span class="T15">et plus </span><span class="T16">(admin, adminplus, et superadmin)</span></p><p class="P16">- ...</p><p class="P16"> </p><p class="Standard"><span class="T15">Notes </span><span class="T16">:</span></p><p class="P9"> </p><ol><li><p class="P47" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(1)</span><span class="T15">Droits en modification (edit) </span><span class="T16">:</span><span class="odfLiEnd"/> </p></li></ol><p class="P16">- Un simple « user » ne doit pas pouvoir modifier le responsable, ni le statut, ni l'étiquette, ni les données admin d'un matériel (en mode Création comme Modification)</p><p class="P16">- Un «responsable » ne doit pas pouvoir modifier le statut, ni les données admin d'un matériel (en mode Création comme Modification)</p><p class="P16">- Les données admin ne sont accessibles qu'aux profils admin+</p><p class="P14"><span class="T16">- Le champ "</span><span class="T15">status</span><span class="T16">" n'est modifiable que par les profils adminplus+</span></p><p class="P14"><span class="T16">- Tout le monde peut modifier un matériel </span><span class="T15">VALIDATED </span><span class="T16">(</span><span class="T15">user </span><span class="T16">ne peut modifier que </span><span class="T15">ses</span><span class="T16"> matériels, </span><span class="T17">resp ne peut modifier que les matériels de son groupe thématique ou métier</span><span class="T16">),</span></p><p class="P14"><span class="T16">MAIS PAS</span><span class="T15"> certains champs</span><span class="T16"> qui sont </span><span class="T15">readonly</span><span class="T16"> (</span><span class="T18">sur_categorie_id', 'categorie_id', 'materiel_administratif', 'materiel_technique', 'date_acquisition', 'nom_responsable', 'fournisseur', 'organisme', 'prix_ht')</span></p><p class="P14"><span class="T16">Les seuls champs qu'on peut éditer sont donc : (</span><span class="T18">designation, sous_categorie, materiel_administratif, materiel_technique, description, etiquette, lieu_stockage, lieu_detail, numero_serie, groupes_thematique, groupes_metier),</span><span class="T16"><br/>- Seuls les profils </span><span class="T15">adminplus+</span><span class="T16"> peuvent modifier un matériel </span><span class="T15">TOBEARCHIVED, ou ARCHIVED </span><span class="T16">mais </span><span class="T15">UNIQUEMENT le champ "status" </span><span class="T16">(pour pouvoir rétrograder à CREATED ou VALIDATED)</span></p><p class="P14"><span class="T16">- Le seul moyen de modifier COMPLÈTEMENT un matériel VALIDATED, TOBEARCHIVED, ou ARCHIVED, <br/>c'est de </span><span class="T15">changer son statut</span><span class="T16">, en le rétrogradant à CREATED (seuls les profils adminplus+ peuvent le faire)</span></p><p class="P16"> </p><ol><li><p class="P47" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(2)</span><span class="T15">Désarchiver </span><span class="T16">: consiste à rétrograder un matériel ARCHIVED ou TOBEARCHIVED dans le statut VALIDATED ou CREATED (adminplus+ only) ; utile en cas d'erreur</span><span class="odfLiEnd"/> </p></li></ol><p class="P8"> </p><ol><li><p class="P47" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(3)</span><span class="T15">Montée de statut groupée : </span><span class="T16">seul ADMIN peut (exporter tout ou partie de la liste des matériels, et) </span><span class="T15">augmenter (+1) le statut d'un groupe de matériels</span><span class="T16">, depuis la vue « index » (vue spéciale pour ADMIN, avec des cases à cocher et boutons pour exporter ou faire évoluer le statut)</span><span class="odfLiEnd"/> </p></li></ol><p class="P8"> </p><ol><li><p class="P48" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(4)</span>Edition des documents :<span class="odfLiEnd"/> </p></li></ol><p class="P16">Admission : quand on "VALIDE" un matériel "CREATED", le statut passe en VALIDATED et le document d'admission est automatiquement édité</p><p class="P16">Sortie : quand on "ARCHIVE" un document "TOBEARCHIVED", le statut passe en ARCHIVED et le document de sortie est automatiquement édité</p><p class="P16">De plus :</p><p class="P16">- Bouton "Doc admission" affiché à partir du statut "VALIDATED"</p><p class="P16">- Bouton "Doc Sortie" affiché à partir du statut TOBEARCHIVED (et donc aussi pour ARCHIVED)</p><p class="P16">Enfin, Le doc de sortie doit être couplée avec la liste des matériels a archiver (TOBEARCHIVED) quand il y a une demande de sortie.</p><p class="P16"> </p><p class="P17"> </p><p class="P1">C - sur les différentes VUES liées au matériel</p><p class="Standard"> </p><p class="P6"><span class="T4">Page accueil </span>:</p><p class="P6"><span> Administration <span class="T20">& Administration Plus </span>voit un menu avec 2 options :</span></p><ul><li><ul><li><ul><li><p class="P51" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels à valider »<span class="odfLiEnd"/> </p></li><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels à sortir de l'inventaire »<span class="odfLiEnd"/> </p></li></ul></li></ul><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0cm"><!-- --></span><span class="T21">Responsable </span>voit un menu avec <span class="T21">3</span> options :<span class="odfLiEnd"/> </p><ul><li><ul><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels <span class="T21">de mon groupe métier</span> »<span class="odfLiEnd"/> </p></li><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels <span class="T21">de mon groupe métier à valider</span> »<span class="odfLiEnd"/> </p></li><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« <span class="T21">Voir les suivis des matériels donc je suis responsable »</span><span class="odfLiEnd"/> </p></li></ul></li></ul></li></ul><p class="P1">Page Outils :</p><p class="P6">User n'a pas accès à cette page</p><p class="P6">Les autres ont quelques options</p><p class="P6">superadmin a ces options en plus :</p><ul><li><p class="P53" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Configuration générale de l'application<span class="odfLiEnd"/> </p></li><li><p class="P53" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Gérer les utilisateurs <span class="T20">privilégiés</span><span class="odfLiEnd"/> </p></li><li><p class="P53" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Passer en mode debug<span class="odfLiEnd"/> </p></li><li><p class="P54" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Passer en mode install<span class="odfLiEnd"/> </p></li></ul><p class="P6"> </p><p class="Standard"><span class="T5">Vue materiel/index (liste) </span><span class="T2">: limiter aux </span><span class="T5">matériels actifs</span><span class="T2"> (non archivés)</span></p><ul><li><ul><li><p class="P55" style="margin-left:0cm;"><span class="WW8Num1z0" style="display:block;float:left;min-width:0,635cm;">.</span>Admin<span class="T20">+ </span>voit des boutons pour filtrer par « tous », « à valider », « validés », « à sortir », « archivés »<span class="odfLiEnd"/> </p></li></ul></li></ul><p class="P6"> </p><p class="Standard"><span class="T5">Vue materiel/find </span><span class="T2">: limiter aux </span><span class="T5">matériels actifs</span><span class="T2"> (non archivés)</span></p><p class="P6"><span> Seul le<span class="T20">s</span> profil<span class="T20">s</span> Admin<span class="T20">+ </span>voit TOUS les matériels (y-compris archivés)</span></p><p class="P6"> </p><p class="P6"><span class="T4">Vue materiel/view </span>:</p><p class="P6"><span> boutons « Imprimer Etiquettes » : <span class="T20">resp+</span></span></p><p class="P6"> </p><p class="P6"><span class="T4">Vue materiel/edit </span>:</p><ul><li><p class="P56" style="margin-left:0cm;"><span class="WW8Num5z0" style="display:block;float:left;min-width:0,635cm;">.</span>Etiquette O/N (admin<span class="T20">+)</span><span class="odfLiEnd"/> </p></li><li><p class="P56" style="margin-left:0cm;"><span class="WW8Num5z0" style="display:block;float:left;min-width:0,635cm;">.</span>Statut (<span class="T20">superadmin+)</span><span class="odfLiEnd"/> </p></li><li><p class="P56" style="margin-left:0cm;"><span class="WW8Num5z0" style="display:block;float:left;min-width:0,635cm;">.</span>Informations administratives (admin<span class="T20">+)</span><span class="odfLiEnd"/> </p></li></ul><p class="P6"> </p><p class="P6"> </p><p class="P1"> </p><p class="P19">D - sur un SUIVI et un EMPRUNT</p><p class="P1"> </p><ul><li><p class="P57" style="margin-left:0cm;"><span class="WW8Num3z0" style="display:block;float:left;min-width:0,635cm;">.</span>Dans tous les cas, on ne doit pas pouvoir emprunter ou suivre un materiel non validé (CREATED)<span class="odfLiEnd"/> </p></li><li><p class="P57" style="margin-left:0cm;"><span class="WW8Num3z0" style="display:block;float:left;min-width:0,635cm;">.</span>User a les droits C, R, U (si créateur), D (si créateur)<span class="odfLiEnd"/> </p></li><li><p class="P57" style="margin-left:0cm;"><span class="WW8Num3z0" style="display:block;float:left;min-width:0,635cm;">.</span>Resp+ a les droits C, R, U, D<span class="odfLiEnd"/> </p></li></ul><p class="P4"><span class="T9">Un USER peut modifier/supprimer un emprunt dont il est soit le créateur soit l'emprunteur</span><span class="T19">.</span></p><p class="P12">Un USER qui créé un emprunt ne doit pas pouvoir changer le nom de l'emprunteur (par défaut, c'est lui). Ainsi, il pourra modifier/supprimer cette fiche au besoin plus tard. Par défaut donc, pour un user, emprunt.emprunteur=creator, materiel.responsable=creator</p><p class="P13">Tout le monde peut rechercher un suivi,</p><p class="P5"> </p><p class="P5"> </p><p class="P3">E - sur les UTILISATEURS</p><p class="P4"><span class="T9">Par défaut, superadmin a tous les droits, et les autres profils n'ont que le droit de lecture (</span><span class="T7">view </span><span class="T9">et </span><span class="T7">index</span><span class="T9">)</span></p><p class="P5"> </p><p class="P5"> </p><p class="P3">F - sur tous les autres objets métiers</p><p class="P5">Voici la liste des autres objets métiers :</p><ul><li><p class="P58" style="margin-left:0cm;"><span class="WW8Num7z0" style="display:block;float:left;min-width:0,635cm;">.</span>Catégories (et domaines et sous-catégories)<span class="odfLiEnd"/> </p></li></ul><ul><li><p class="P59" style="margin-left:0cm;"><span class="WW8Num6z0" style="display:block;float:left;min-width:0,635cm;">.</span>Groupes thématiques<span class="odfLiEnd"/> </p></li><li><p class="P59" style="margin-left:0cm;"><span class="WW8Num6z0" style="display:block;float:left;min-width:0,635cm;">.</span>Groupes métiers<span class="odfLiEnd"/> </p></li></ul><p class="P4"><span class="T9">Par défaut, pour tous ces objets, superadmin a tous les droits, admin</span><span class="T10">plus</span><span class="T9"> a tous les droits sauf « delete », et les autres profils n'ont que le droit de lecture (</span><span class="T7">view </span><span class="T9">et </span><span class="T7">index</span><span class="T9">)</span></p> | |
117 | + </style></head><body dir="ltr" style="max-width:29.7cm;margin-top:1cm; margin-bottom:1cm; margin-left:1cm; margin-right:1.45cm; writing-mode:lr-tb; "><p class="P46">ACL (Access Control List)</p><p class="P11">(Etienne Pallier – 24/<span class="T22">06</span>/201<span class="T23">6</span>)</p><p class="P1"> </p><p class="P1"> </p><p class="P1"> </p><p class="P1">I – Cycle de vie du statut du matériel</p><p class="P1"> </p><p class="Standard"><span class="T5">Créer</span><span class="T2"> un matériel ==</span><span class="T9">> passe alors en statut </span><span class="T7">CREATED ==> </span><span class="T1">peut alors être éventuellement supprimé (mais ne pourra plus être supprimé ensuite)</span></p><p class="Standard"><span class="T7">Valider</span><span class="T9"> un matériel CREATED ==> passe alors en statut </span><span class="T7">VALIDATED </span><span class="T9">(</span><span class="T11">resp et </span><span class="T9">admin only)</span></p><p class="P4"><span class="T7">Demander l'Archivage</span><span class="T9"> d'un materiel VALIDATED ==> passe alors en statut </span><span class="T7">TOBEARCHIVED</span><span class="T9"> (resp et admin only)</span></p><p class="P4"><span class="T7">Sortir</span><span class="T9"> de l'inventaire (Valider une demande d'archivage d'un matériel TOBEARCHIVED) ==> statut </span><span class="T7">ARCHIVED</span><span class="T9"> (admin only)</span></p><p class="P4"><span class="T7">Désarchiver</span><span class="T9"> un matériel ==> repasse de TOBEARCHIVED ou ARCHIVED à </span><span class="T7">VALIDATED</span><span class="T9"> (admin only) </span></p><p class="P4"> </p><p class="P5">En résumé : </p><p class="P4"> </p><p class="P3">CREATED ==> VALIDATED ==> TOBEARCHIVED ==> ARCHIVED</p><p class="P2"><span class="T12"> </span><span class="T8">I /\ I I</span></p><p class="P2"><span class="T12"> </span><span class="T8">V I ------------------------ I --------------------------------- I (adminplus only)</span></p><p class="P3">DELETED</p><p class="P2"> </p><p class="P2"> </p><p class="P2"> </p><p class="P1">II - Droits des utilisateurs selon leur profil</p><p class="P1"> </p><p class="P1">A – Globalement (principes généraux)</p><p class="P1"> </p><p class="P6">Un utilisateur non logué ne doit RIEN pouvoir faire. Seulement se loguer, c'est tout. Il n'a accès qu'à la page d'accueil (de login).</p><p class="P6">Une fois logué, un utilisateur a des droits différents selon son profil, globalement :</p><p class="P14"><span class="T2">- un </span><span class="T5">USER</span><span class="T2"> ne peut que créer un matériel, un suivi, ou un emprunt, consulter, et modifier (uniquement ce qu'il a créé lui-même)</span></p><p class="P18"><span class="T2">- un </span><span class="T5">RESPONSABLE</span><span class="T2"> a tous les droits sauf accès à certains champs et certaines vues réservées à l'administration (ADMIN). Il ne peut pas non plus archiver un matériel, mais seulement demander l'archivage (comme un USER)(uniquement ce </span><span class="T3">lié à son groupe métier ou thématiques</span><span class="T2">)</span></p><p class="P14"><span class="T2">- un </span><span class="T5">ADMIN</span><span class="T2">(istratif) a tous les droits (y-compris champs réservés à l'administration)</span></p><p class="P14"><span class="T2">- un </span><span class="T5">ADMINPLUS</span><span class="T2"> (administratif Plus) a tous les droits de ADMIN et en plus il peut modifier un matériel quelque soit son statut (y-compris TOBEARCHIVED et ARCHIVED), notamment il peut modifier le statut du matériel (pour le rétrograder)</span></p><p class="P14"><span class="T2">- un </span><span class="T5">SUPERADMIN</span><span class="T2"> a tous les droits : ceux d'ADMINPLUS et certains droits supplémentaires pour lui permettre des corrections d'erreur et la configuration de l'application (notamment l'administration des utilisateurs...)</span></p><p class="P15"> </p><p class="Standard"><span class="T2">Concernant les informations internes permettant de savoir </span><span class="T5">qui a fait quoi</span><span class="T2"> (mises en place en février 2014), elles ne sont bien sûr pas modifiables puisque gérées automatiquement par le système, mais sont visibles par tous excepté le profil USER.</span></p><p class="P1"/><p class="P7">B - sur la table MATERIEL</p><table border="0" cellspacing="0" cellpadding="0" class="Tableau2"><colgroup><col width="170"/><col width="170"/><col width="170"/><col width="170"/><col width="170"/><col width="170"/><col width="170"/></colgroup><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="Table_20_Contents"> </p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P41">ALL (TOUS)</p><p class="P43">(droits par defaut)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P40"><span class="T5">U</span><span class="T6">tilisateur </span><span class="T5"> </span><span class="T2">(quelconque)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P42">Responsable</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P42">Administration</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_A1"><p class="P42">Administration Plus</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_G1"><p class="P42">Super-Administrateur</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Read (un seul ou une liste)</p><p class="P45">(view ou index)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P25">Y</p><p class="Table_20_Contents"><span class="T14">champs caches:</span><span class="T13"> donnees admin</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P36">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P36">idem ALL</p></td><td rowspan="3" style="text-align:left;width:3.893cm; " class="Tableau2_E4"><p class="P23"><span class="T16">(idem Responsable </span><span class="T15">+ donnees admin</span><span class="T16">)</span></p><p class="P37"> </p><p class="P23"><span class="T13">En mode edit (update), si VALIDATED, on ajoute aux donnees </span><span class="T14">readonly</span><span class="T13"> les </span><span class="T14">donnees admin</span></p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_F3"><p class="P37">idem Admin</p></td><td rowspan="11" style="text-align:left;width:3.893cm; " class="Tableau2_G12"><p class="P37">idem Adminplus</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Create (1)</p><p class="P45">(add)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">Y</p><p class="P39"><span class="T14">champs caches</span><span class="T13">:</span></p><p class="P34">donnees admin + statut + etiquette </p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P36">Idem ALL</p><p class="P39"><span class="T14">champs readonly </span><span class="T13">:</span></p><p class="P34">nom_responsable</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_D4"><p class="P36">idem ALL</p><p class="P36">(+ etiquette)</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Update (1)</p><p class="P45">(edit)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">Y</p><p class="P33">ssi</p><p class="P39"><span class="T15">CREATED</span><span class="T16"> (tous les champs) </span></p><p class="P39"><span class="T13">ou </span><span class="T14">VALIDATED</span><span class="T13"> (quelques champs visibles sont </span><span class="T14">readonly</span><span class="T13">) (1)</span></p><p class="P34"> </p><p class="P39"><span class="T14">champs caches</span><span class="T13">:</span></p><p class="P34">donnees admin + statut + etiquette</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_C5"><p class="P36">idem ALL</p><p class="P22"><span class="T16">ssi </span><span class="T15">createur</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">idem Admin</p><p class="P23"><span class="T16">(</span><span class="T15">tous les statuts</span><span class="T16">)</span></p><p class="P23"><span class="T16">(+ champ </span><span class="T15">statut</span><span class="T16">)</span></p><p class="P23"> </p><p class="P23"><span class="T16">TOBEARCHIVED ou ARCHIVED: </span><span class="T15">seulement le statut</span></p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Delete</p><p class="P45">(delete)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">Y</p><p class="P29">ssi CREATED</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">idem ALL</p></td><td rowspan="3" style="text-align:left;width:3.893cm; " class="Tableau2_E7"><p class="P37">idem Responsable</p></td><td rowspan="4" style="text-align:left;width:3.893cm; " class="Tableau2_F8"><p class="P37">idem Admin</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Valider</p><p class="P45">(statusValidated)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P25">N</p><p class="P28">(resp+)</p></td><td rowspan="7" style="text-align:left;width:3.893cm; " class="Tableau2_C12"><p class="P36">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p><p class="P30">ssi</p><p class="P30">CREATED</p><p class="P37"> </p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Demander archivage</p><p class="P45">(statusToBeArchived)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P25">N</p><p class="P28">(resp+)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p><p class="P30">ssi</p><p class="P30">VALIDATED</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Sortir de l'inventaire</p><p class="P45"><span class="T12"> </span>(statusArchived)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(admin+)</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_D9"><p class="P37">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P35">Y</p><p class="P28">ssi</p><p class="P28">TOBEARCHIVED</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Desarchiver (2)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(adminplus+)</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_E10"><p class="P37">idem Responsable</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p><p class="P30">ssi</p><p class="P30">ARCHIVED ou</p><p class="P30">TOBEARCHIVED</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Exporter</p><p class="P45">(csv)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(resp+)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P37">Y</p></td><td rowspan="3" style="text-align:left;width:3.893cm; " class="Tableau2_F12"><p class="P37">idem Admin</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Montee de statut group<span class="T24">é</span>e</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P26">N</p><p class="P29">(admin+)</p></td><td rowspan="2" style="text-align:left;width:3.893cm; " class="Tableau2_D12"><p class="P37">idem ALL</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E11"><p class="P38">Y</p></td></tr><tr><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P44">Edition (4)</p><p class="P44">DOCUMENTS</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E12"><p class="P26">N</p><p class="P29">(admin+)</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E12"><p class="P37">Y</p><p class="P31">- admission : ssi VALIDATED</p><p class="P31">- sortie : ssi TOBEARCHIVED ou ARCHIVED</p></td></tr><tr class="Tableau213"><td style="text-align:left;width:3.893cm; " class="Tableau2_A2"><p class="P68">Fiche Matériel </p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E13"><p class="P62">Y <span class="T25">(sans partie admin)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_C13"><p class="P49">Y <span class="T25">(sans partie admin)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_D13"><p class="P49">Y <span class="T25">(sans partie admin)</span></p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_E13"><p class="P62">Y</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_F13"><p class="P49">Y</p></td><td style="text-align:left;width:3.893cm; " class="Tableau2_G13"><p class="P49">Y <span class="T25">(sans partie admin)</span></p></td></tr></table><p class="P7"> </p><p class="P7"> </p><p class="P6"> </p><p class="P10">Par défaut, le superadmin a TOUS les droits</p><p class="P10"> </p><p class="Standard"><span class="T15">Conventions d'écriture </span><span class="T16">: </span></p><p class="P14"><span class="T16">- r</span><span class="T15">esp+</span><span class="T16"> = possible pour un </span><span class="T15">Responsable et plus </span><span class="T16">(responsable, admin, adminplus, et superadmin)</span></p><p class="P14"><span class="T16">- </span><span class="T15">admin+</span><span class="T16"> = possible pour un </span><span class="T15">Admin</span><span class="T16"> </span><span class="T15">et plus </span><span class="T16">(admin, adminplus, et superadmin)</span></p><p class="P16">- ...</p><p class="P16"> </p><p class="Standard"><span class="T15">Notes </span><span class="T16">:</span></p><p class="P9"> </p><ol><li><p class="P47" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(1)</span><span class="T15">Droits en modification (edit) </span><span class="T16">:</span><span class="odfLiEnd"></span> </p></li></ol><p class="P16">- Un simple « user » ne doit pas pouvoir modifier le responsable, ni le statut, ni l'étiquette, ni les données admin d'un matériel (en mode Création comme Modification)</p><p class="P16">- Un «responsable » ne doit pas pouvoir modifier le statut, ni les données admin d'un matériel (en mode Création comme Modification)</p><p class="P16">- Les données admin ne sont accessibles qu'aux profils admin+</p><p class="P14"><span class="T16">- Le champ "</span><span class="T15">status</span><span class="T16">" n'est modifiable que par les profils adminplus+</span></p><p class="P14"><span class="T16">- Tout le monde peut modifier un matériel </span><span class="T15">VALIDATED </span><span class="T16">(</span><span class="T15">user </span><span class="T16">ne peut modifier que </span><span class="T15">ses</span><span class="T16"> matériels, </span><span class="T17">resp ne peut modifier que les matériels de son groupe thématique ou métier</span><span class="T16">),</span></p><p class="P14"><span class="T16">MAIS PAS</span><span class="T15"> certains champs</span><span class="T16"> qui sont </span><span class="T15">readonly</span><span class="T16"> (</span><span class="T18">sur_categorie_id', 'categorie_id', 'materiel_administratif', 'materiel_technique', 'date_acquisition', 'nom_responsable', 'fournisseur', 'organisme', 'prix_ht')</span></p><p class="P14"><span class="T16">Les seuls champs qu'on peut éditer sont donc : (</span><span class="T18">designation, sous_categorie, materiel_administratif, materiel_technique, description, etiquette, lieu_stockage, lieu_detail, numero_serie, groupes_thematique, groupes_metier),</span><span class="T16"><br/>- Seuls les profils </span><span class="T15">adminplus+</span><span class="T16"> peuvent modifier un matériel </span><span class="T15">TOBEARCHIVED, ou ARCHIVED </span><span class="T16">mais </span><span class="T15">UNIQUEMENT le champ "status" </span><span class="T16">(pour pouvoir rétrograder à CREATED ou VALIDATED)</span></p><p class="P14"><span class="T16">- Le seul moyen de modifier COMPLÈTEMENT un matériel VALIDATED, TOBEARCHIVED, ou ARCHIVED, <br/>c'est de </span><span class="T15">changer son statut</span><span class="T16">, en le rétrogradant à CREATED (seuls les profils adminplus+ peuvent le faire)</span></p><p class="P16"> </p><ol><li><p class="P47" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(2)</span><span class="T15">Désarchiver </span><span class="T16">: consiste à rétrograder un matériel ARCHIVED ou TOBEARCHIVED dans le statut VALIDATED ou CREATED (adminplus+ only) ; utile en cas d'erreur</span><span class="odfLiEnd"></span> </p></li></ol><p class="P8"> </p><ol><li><p class="P47" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(3)</span><span class="T15">Montée de statut groupée : </span><span class="T16">seul ADMIN peut (exporter tout ou partie de la liste des matériels, et) </span><span class="T15">augmenter (+1) le statut d'un groupe de matériels</span><span class="T16">, depuis la vue « index » (vue spéciale pour ADMIN, avec des cases à cocher et boutons pour exporter ou faire évoluer le statut)</span><span class="odfLiEnd"></span> </p></li></ol><p class="P8"> </p><ol><li><p class="P48" style="margin-left:0cm;"><span class="WW8Num8z0" style="display:block;float:left;min-width:0,635cm;">(4)</span>Edition des documents :<span class="odfLiEnd"/> </p></li></ol><p class="P16">Admission : quand on "VALIDE" un matériel "CREATED", le statut passe en VALIDATED et le document d'admission est automatiquement édité</p><p class="P16">Sortie : quand on "ARCHIVE" un document "TOBEARCHIVED", le statut passe en ARCHIVED et le document de sortie est automatiquement édité</p><p class="P16">De plus :</p><p class="P16">- Bouton "Doc admission" affiché à partir du statut "VALIDATED"</p><p class="P16">- Bouton "Doc Sortie" affiché à partir du statut TOBEARCHIVED (et donc aussi pour ARCHIVED)</p><p class="P16">Enfin, Le doc de sortie doit être couplée avec la liste des matériels a archiver (TOBEARCHIVED) quand il y a une demande de sortie.</p><p class="P16"> </p><p class="P17"> </p><p class="P1">C - sur les différentes VUES liées au matériel</p><p class="Standard"> </p><p class="P6"><span class="T4">Page accueil </span>:</p><p class="P6"><span> Administration <span class="T20">& Administration Plus </span>voit un menu avec 2 options :</span></p><ul><li><ul><li><ul><li><p class="P51" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels à valider »<span class="odfLiEnd"/> </p></li><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels à sortir de l'inventaire »<span class="odfLiEnd"/> </p></li></ul></li></ul><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0cm"><!-- --></span><span class="T21">Responsable </span>voit un menu avec <span class="T21">3</span> options :<span class="odfLiEnd"/> </p><ul><li><ul><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels <span class="T21">de mon groupe métier</span> »<span class="odfLiEnd"/> </p></li><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« Voir les matériels <span class="T21">de mon groupe métier à valider</span> »<span class="odfLiEnd"/> </p></li><li><p class="P52" style="margin-left:0cm;"><span class="WW8Num2z0" style="display:block;float:left;min-width:0,635cm;">.</span>« <span class="T21">Voir les suivis des matériels donc je suis responsable »</span><span class="odfLiEnd"/> </p></li></ul></li></ul></li></ul><p class="P1">Page Outils :</p><p class="P6">User n'a pas accès à cette page</p><p class="P6">Les autres ont quelques options</p><p class="P6">superadmin a ces options en plus :</p><ul><li><p class="P53" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Configuration générale de l'application<span class="odfLiEnd"></span> </p></li><li><p class="P53" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Gérer les utilisateurs <span class="T20">privilégiés</span><span class="odfLiEnd"/> </p></li><li><p class="P53" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Passer en mode debug<span class="odfLiEnd"/> </p></li><li><p class="P54" style="margin-left:0cm;"><span class="WW8Num4z0" style="display:block;float:left;min-width:0,635cm;">.</span>Passer en mode install<span class="odfLiEnd"/> </p></li></ul><p class="P6"> </p><p class="Standard"><span class="T5">Vue materiel/index (liste) </span><span class="T2">: limiter aux </span><span class="T5">matériels actifs</span><span class="T2"> (non archivés)</span></p><ul><li><ul><li><p class="P55" style="margin-left:0cm;"><span class="WW8Num1z0" style="display:block;float:left;min-width:0,635cm;">.</span>Admin<span class="T20">+ </span>voit des boutons pour filtrer par « tous », « à valider », « validés », « à sortir », « archivés »<span class="odfLiEnd"/> </p></li></ul></li></ul><p class="P6"> </p><p class="Standard"><span class="T5">Vue materiel/find </span><span class="T2">: limiter aux </span><span class="T5">matériels actifs</span><span class="T2"> (non archivés)</span></p><p class="P6"><span> Seul le<span class="T20">s</span> profil<span class="T20">s</span> Admin<span class="T20">+ </span>voit TOUS les matériels (y-compris archivés)</span></p><p class="P6"> </p><p class="P6"><span class="T4">Vue materiel/view </span>:</p><p class="P6"><span> boutons « Imprimer Etiquettes » : <span class="T20">resp+</span></span></p><p class="P6"> </p><p class="P6"><span class="T4">Vue materiel/edit </span>:</p><ul><li><p class="P56" style="margin-left:0cm;"><span class="WW8Num5z0" style="display:block;float:left;min-width:0,635cm;">.</span>Etiquette O/N (admin<span class="T20">+)</span><span class="odfLiEnd"/> </p></li><li><p class="P56" style="margin-left:0cm;"><span class="WW8Num5z0" style="display:block;float:left;min-width:0,635cm;">.</span>Statut (<span class="T20">superadmin+)</span><span class="odfLiEnd"/> </p></li><li><p class="P56" style="margin-left:0cm;"><span class="WW8Num5z0" style="display:block;float:left;min-width:0,635cm;">.</span>Informations administratives (admin<span class="T20">+)</span><span class="odfLiEnd"/> </p></li></ul><p class="P6"> </p><p class="P6"> </p><p class="P1"> </p><p class="P19">D - sur un SUIVI et un EMPRUNT</p><p class="P1"> </p><ul><li><p class="P57" style="margin-left:0cm;"><span class="WW8Num3z0" style="display:block;float:left;min-width:0,635cm;">.</span>Dans tous les cas, on ne doit pas pouvoir emprunter ou suivre un materiel non validé (CREATED)<span class="odfLiEnd"/> </p></li><li><p class="P57" style="margin-left:0cm;"><span class="WW8Num3z0" style="display:block;float:left;min-width:0,635cm;">.</span>User a les droits C, R, U (si créateur), D (si créateur)<span class="odfLiEnd"/> </p></li><li><p class="P57" style="margin-left:0cm;"><span class="WW8Num3z0" style="display:block;float:left;min-width:0,635cm;">.</span>Resp+ a les droits C, R, U, D<span class="odfLiEnd"/> </p></li></ul><p class="P4"><span class="T9">Un USER peut modifier/supprimer un emprunt dont il est soit le créateur soit l'emprunteur</span><span class="T19">.</span></p><p class="P12">Un USER qui créé un emprunt ne doit pas pouvoir changer le nom de l'emprunteur (par défaut, c'est lui). Ainsi, il pourra modifier/supprimer cette fiche au besoin plus tard. Par défaut donc, pour un user, emprunt.emprunteur=creator, materiel.responsable=creator</p><p class="P13">Tout le monde peut rechercher un suivi,</p><p class="P5"> </p><p class="P5"> </p><p class="P3">E - sur les UTILISATEURS</p><p class="P4"><span class="T9">Par défaut, superadmin a tous les droits, et les autres profils n'ont que le droit de lecture (</span><span class="T7">view </span><span class="T9">et </span><span class="T7">index</span><span class="T9">)</span></p><p class="P5"> </p><p class="P5"> </p><p class="P3">F - sur tous les autres objets métiers</p><p class="P5">Voici la liste des autres objets métiers :</p><ul><li><p class="P58" style="margin-left:0cm;"><span class="WW8Num7z0" style="display:block;float:left;min-width:0,635cm;">.</span>Catégories (et domaines et sous-catégories)<span class="odfLiEnd"/> </p></li></ul><ul><li><p class="P59" style="margin-left:0cm;"><span class="WW8Num6z0" style="display:block;float:left;min-width:0,635cm;">.</span>Groupes thématiques<span class="odfLiEnd"/> </p></li><li><p class="P59" style="margin-left:0cm;"><span class="WW8Num6z0" style="display:block;float:left;min-width:0,635cm;">.</span>Groupes métiers<span class="odfLiEnd"/> </p></li></ul><p class="P4"><span class="T9">Par défaut, pour tous ces objets, superadmin a tous les droits, admin</span><span class="T10">plus</span><span class="T9"> a tous les droits sauf « delete », et les autres profils n'ont que le droit de lecture (</span><span class="T7">view </span><span class="T9">et </span><span class="T7">index</span><span class="T9">)</span></p> | |
118 | 118 | |
119 | 119 | <div class="actions"> |
120 | 120 | <?php echo $this->element('menu') ?> | ... | ... |
src/Template/Pages/home.ctp
src/Template/Pages/home_install.ctp
... | ... | @@ -13,7 +13,6 @@ |
13 | 13 | * @license http://www.opensource.org/licenses/mit-license.php MIT License |
14 | 14 | */ |
15 | 15 | use Cake\Cache\Cache; |
16 | -use Cake\Core\Configure; | |
17 | 16 | use Cake\Datasource\ConnectionManager; |
18 | 17 | use Cake\Error\Debugger; |
19 | 18 | |
... | ... | @@ -39,7 +38,7 @@ $this->layout = false; |
39 | 38 | </header> |
40 | 39 | <div id="content"> |
41 | 40 | <div class="row"> |
42 | - <div class="columns large-12 ctp-warning checks", style="text-align: center"> | |
41 | + <div class="columns large-12 ctp-warning checks" style="text-align: center"> | |
43 | 42 | <?php echo $this->Form->postLink("Stopper le mode installation", ['controller' => 'configurations', 'action'=>'installOff'], ['confirm' => __('Êtes-vous sur ?')]); ?> |
44 | 43 | </div> |
45 | 44 | <?php Debugger::checkSecurityKeys(); ?> | ... | ... |
src/Template/Pages/tools.ctp
src/Template/Pages/tools_cat.ctp
src/Template/Pages/tools_menu_cat.ctp
src/Template/Pages/tools_menu_sm.ctp
src/Template/Pages/tools_sm.ctp
src/Template/Sites/index.ctp
src/Template/SousCategories/index.ctp
1 | 1 | |
2 | 2 | <div class="sousCategories index"> |
3 | 3 | <?php echo '<h2><i class="icon-list"></i> Liste des sous-catégories</h2>'; ?> |
4 | - <table cellpadding="0" cellspacing="0"> | |
4 | + <table style="border-collapse: separate; border-spacing: 0;"> | |
5 | 5 | <thead> |
6 | 6 | <tr> |
7 | 7 | <th class="actions"><?= __('') ?></th> | ... | ... |
src/Template/Suivis/index.ctp
1 | 1 | |
2 | 2 | <div class="suivis index"> |
3 | 3 | <?php echo '<h2><i class="icon-list"></i> Liste des suivis ('.$nbSuivis.')</h2>'; ?> |
4 | - <table cellpadding="0" cellspacing="0"> | |
4 | + <table style="border-collapse: separate; border-spacing: 0;"> | |
5 | 5 | <thead> |
6 | 6 | <tr> |
7 | 7 | <th class="actions"><?= __('') ?></th> | ... | ... |
src/Template/SurCategories/index.ctp
src/Template/TypeDocuments/index.ctp
1 | 1 | |
2 | 2 | <div class="typeDocuments index"> |
3 | 3 | <?php echo '<h2><i class="icon-list"></i> Liste des types de documents</h2>'; ?> |
4 | - <table cellpadding="0" cellspacing="0"> | |
4 | + <table style="border-collapse: separate; border-spacing: 0;"> | |
5 | 5 | <thead> |
6 | 6 | <tr> |
7 | 7 | <th class="actions"><?= __('') ?></th> | ... | ... |
src/Template/TypeSuivis/index.ctp
1 | 1 | |
2 | 2 | <div class="typeSuivis index"> |
3 | 3 | <?php echo '<h2><i class="icon-list"></i> Liste des types de suivis</h2>'; ?> |
4 | - <table cellpadding="0" cellspacing="0"> | |
4 | + <table style="border-collapse: separate; border-spacing: 0;"> | |
5 | 5 | <thead> |
6 | 6 | <tr> |
7 | 7 | <th class="actions"><?= __('') ?></th> | ... | ... |
src/Template/Users/index.ctp
1 | 1 | |
2 | 2 | <div class="users index"> |
3 | 3 | <?php echo '<h2><i class="icon-list"></i> Liste des utilisateurs privilégiés ('.$nbUsers.')</h2>'; ?> |
4 | - <table cellpadding="0" cellspacing="0"> | |
4 | + <table style="border-collapse: separate; border-spacing: 0;"> | |
5 | 5 | <thead> |
6 | 6 | <tr> |
7 | 7 | <th class="actions"><?= __('') ?></th> | ... | ... |
tests/Fixture/ConfigurationsFixture.php
... | ... | @@ -51,6 +51,7 @@ class ConfigurationsFixture extends TestFixture |
51 | 51 | 'numero_labo_sans_annee' => ['type' => 'boolean', 'length' => null, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null], |
52 | 52 | 'prix_inventaire_administratif' => ['type' => 'integer', 'length' => 10, 'null' => true, 'default' => 800, 'comment' => '', 'precision' => null], |
53 | 53 | 'taille_max_doc' => ['type' => 'integer', 'length' => 15, 'null' => true, 'default' => 8000000, 'comment' => '', 'precision' => null], |
54 | + 'aff_par_defaut' => ['type' => 'integer', 'length' => 6, 'null' => false, 'default' => 20, 'comment' => '', 'precision' => null], | |
54 | 55 | '_constraints' => [ |
55 | 56 | 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], |
56 | 57 | 'nom_UNIQUE' => ['type' => 'unique', 'columns' => ['nom'], 'length' => []], | ... | ... |
tests/TestCase/Controller/MaterielsControllerTest.php
... | ... | @@ -296,7 +296,7 @@ class MaterielsControllerTest extends IntegrationTestCase |
296 | 296 | ]; |
297 | 297 | $this->post('/materiels/edit/2', $data); |
298 | 298 | $this->get('/materiels/index'); |
299 | - $this->assertResponseContains("Test 6", "Le matériel n'a pas était édité correctement"); | |
299 | + $this->assertResponseContains("Test 6", "Le matériel n'a pas été édité correctement"); | |
300 | 300 | // $this->assertResponseNotContains("Test 2", "Le matériel n'a pas était édité correctement"); |
301 | 301 | |
302 | 302 | $data2 = [ |
... | ... | @@ -560,7 +560,8 @@ class MaterielsControllerTest extends IntegrationTestCase |
560 | 560 | $this->assertResponseContains("TEST COPIE MATERIEL", "La copie du materiel ne se fait pas correctement."); |
561 | 561 | |
562 | 562 | } |
563 | - | |
563 | + */ | |
564 | + | |
564 | 565 | /** |
565 | 566 | * |
566 | 567 | * Test updateStatutCreated | ... | ... |
... | ... | @@ -0,0 +1,40 @@ |
1 | +build: false | |
2 | +platform: x86 | |
3 | +clone_folder: c:\projects\webmozart\assert | |
4 | + | |
5 | +branches: | |
6 | + only: | |
7 | + - master | |
8 | + | |
9 | +cache: | |
10 | + - c:\php -> appveyor.yml | |
11 | + | |
12 | +init: | |
13 | + - SET PATH=c:\php;%PATH% | |
14 | + - SET COMPOSER_NO_INTERACTION=1 | |
15 | + - SET PHP=1 | |
16 | + | |
17 | +install: | |
18 | + - IF EXIST c:\php (SET PHP=0) ELSE (mkdir c:\php) | |
19 | + - cd c:\php | |
20 | + - IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-7.0.0-nts-Win32-VC14-x86.zip | |
21 | + - IF %PHP%==1 7z x php-7.0.0-nts-Win32-VC14-x86.zip -y >nul | |
22 | + - IF %PHP%==1 del /Q *.zip | |
23 | + - IF %PHP%==1 echo @php %%~dp0composer.phar %%* > composer.bat | |
24 | + - IF %PHP%==1 copy /Y php.ini-development php.ini | |
25 | + - IF %PHP%==1 echo max_execution_time=1200 >> php.ini | |
26 | + - IF %PHP%==1 echo date.timezone="UTC" >> php.ini | |
27 | + - IF %PHP%==1 echo extension_dir=ext >> php.ini | |
28 | + - IF %PHP%==1 echo extension=php_curl.dll >> php.ini | |
29 | + - IF %PHP%==1 echo extension=php_openssl.dll >> php.ini | |
30 | + - IF %PHP%==1 echo extension=php_mbstring.dll >> php.ini | |
31 | + - IF %PHP%==1 echo extension=php_fileinfo.dll >> php.ini | |
32 | + - appveyor DownloadFile https://getcomposer.org/composer.phar | |
33 | + - cd c:\projects\webmozart\assert | |
34 | + - mkdir %APPDATA%\Composer | |
35 | + - IF %APPVEYOR_REPO_NAME%==webmozart/assert copy /Y .composer-auth.json %APPDATA%\Composer\auth.json | |
36 | + - composer update --prefer-dist --no-progress --ansi | |
37 | + | |
38 | +test_script: | |
39 | + - cd c:\projects\webmozart\assert | |
40 | + - vendor\bin\phpunit.bat --verbose | ... | ... |