mirror of
				https://gitlab.com/Chill-Projet/chill-bundles.git
				synced 2025-11-04 03:08:25 +00:00 
			
		
		
		
	Compare commits
	
		
			1223 Commits
		
	
	
		
			workflow/i
			...
			issue471_a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 246ee58d8b | |||
| c2061110dd | |||
| b2fb86111d | |||
| db6c4f15f8 | |||
| 12231912d6 | |||
| 7b0c8d21ee | |||
| f713b1ddc8 | |||
| faf1559770 | |||
| 5a1ce399f6 | |||
| 505384c2a0 | |||
| a7654edefa | |||
| 81689e3507 | |||
| b891ba842d | |||
| 3ceae0473d | |||
| 795a8e9daf | |||
| 
						 | 
					81edaef062 | ||
| 
						 | 
					dc48b4b9c7 | ||
| e72a2004d7 | |||
| 329fb05db0 | |||
| 75250402c8 | |||
| e5209ca6d9 | |||
| 4512b94293 | |||
| 217f95472b | |||
| b7abf6b6bf | |||
| c39fa1c49b | |||
| 81c8d0ec77 | |||
| 72012a70d9 | |||
| 916560c522 | |||
| 57d6240cd1 | |||
| 2d460adc4d | |||
| d155c76013 | |||
| 529a9e5f58 | |||
| 2b837e0445 | |||
| 4279acc2f8 | |||
| 8fb3870ca0 | |||
| ff72b28861 | |||
| 1f2638626c | |||
| 41ff21ee23 | |||
| 30bb2e8393 | |||
| ca166655da | |||
| 8f69f852b9 | |||
| 6747cad210 | |||
| 0cbcd91c3f | |||
| d757e07dfc | |||
| 83dd8f810c | |||
| bd0b45b4dd | |||
| 6dbe8068ae | |||
| 19561c63cb | |||
| 354f130e9e | |||
| 2d9af8f8c0 | |||
| f7d9551dc1 | |||
| abc3caee00 | |||
| 33f93d484d | |||
| 8470604b8f | |||
| b85e6aae3f | |||
| a4baf89a6a | |||
| 0a05dcd753 | |||
| c6be7955fd | |||
| e246ccbcd9 | |||
| 44b537f05e | |||
| 0fd23c61a1 | |||
| 6cad0be181 | |||
| 9a0eb1c74c | |||
| a70c561596 | |||
| daa3eabd43 | |||
| b24de76d77 | |||
| 92d394b669 | |||
| c17d20f945 | |||
| be77c3729b | |||
| ad1e7b576c | |||
| bf0578b6d7 | |||
| 0ce23230da | |||
| 8b7404e531 | |||
| bc550ea42a | |||
| 65e6471a02 | |||
| de9d2aa885 | |||
| 66ab38c60f | |||
| 8882c99f5a | |||
| 8512a5e1bc | |||
| 7f97215fe9 | |||
| 6427fc64cd | |||
| 26d5bf03bd | |||
| 
						 | 
					7048f670ed | ||
| c757fa068a | |||
| ebc4ec0d7c | |||
| 617473f6a5 | |||
| 124a6a58fc | |||
| afa38e9dd5 | |||
| a52f29bb78 | |||
| b95ff337b6 | |||
| 92a169be1e | |||
| e6d59bc837 | |||
| 31731c6f44 | |||
| 86ec020f80 | |||
| 07351e2946 | |||
| 405694a0b4 | |||
| bad39364c2 | |||
| c0b39e4e7c | |||
| f98b35f009 | |||
| 8770188d54 | |||
| 35c7d55b8c | |||
| 2a53fb9341 | |||
| e7f0cd50c9 | |||
| a41d6cf744 | |||
| 24d28b0a52 | |||
| 4425f2ad49 | |||
| a8db07a383 | |||
| ef9fd80ad5 | |||
| e6169ddffa | |||
| ccf7c885bb | |||
| 01c571ab06 | |||
| 69b2dce7ee | |||
| 910245f855 | |||
| 7fbb3dfd07 | |||
| 9765bc5663 | |||
| bb65909bfa | |||
| 03b0a8766e | |||
| 5eea202586 | |||
| a78c62789c | |||
| 68671e297c | |||
| 4257a918f3 | |||
| 7ffb3dc74f | |||
| 0f926e9dfe | |||
| fc55567a64 | |||
| 009030b5fb | |||
| 6e1cabc8fc | |||
| 572c602387 | |||
| 26a4577420 | |||
| f09870931c | |||
| ea21f2d9c4 | |||
| d81a41bb17 | |||
| 7851d9956e | |||
| f35479e4d2 | |||
| 432b105be5 | |||
| 988b67bd4b | |||
| f64409e5e6 | |||
| a1baf99294 | |||
| d9bb18e042 | |||
| 00a6ef0598 | |||
| 
						 | 
					c03e38f4ff | ||
| 
						 | 
					f9bcc5b1e9 | ||
| 934a066910 | |||
| 095afb90c7 | |||
| 645549ae34 | |||
| 
						 | 
					d34462d849 | ||
| 
						 | 
					c65a73604d | ||
| 
						 | 
					6a4edd000f | ||
| 
						 | 
					017b7bca87 | ||
| 612d053892 | |||
| 8edc68859e | |||
| a4afe73efe | |||
| 2b67f105f7 | |||
| 95b114a144 | |||
| 5477a70c84 | |||
| 7d69ec6d6b | |||
| 17594b58ab | |||
| cddd3c20c8 | |||
| 25a37974e5 | |||
| 066afc07a8 | |||
| 56c3f05ec9 | |||
| 1907beaf6e | |||
| 37c04d3f12 | |||
| a7fbce0add | |||
| e663bae5c4 | |||
| ad6a68487c | |||
| 
						 | 
					88f377778c | ||
| 
						 | 
					d6deaeb324 | ||
| 
						 | 
					f2744fba43 | ||
| 72a62a3a1b | |||
| bcde4497cc | |||
| 
						 | 
					ddce7603ad | ||
| 
						 | 
					3a3eb68288 | ||
| a4ece21f2b | |||
| c7762dd6d2 | |||
| f47fb17b8d | |||
| 51dc255be5 | |||
| 6ddbb79157 | |||
| dcddf4b3f1 | |||
| e027958c63 | |||
| 034a416612 | |||
| 63cdc97c47 | |||
| ae10a8bd1c | |||
| eb2bad0f47 | |||
| bc43d8bae5 | |||
| 83dfe530e9 | |||
| c477996acf | |||
| 36b1f05524 | |||
| dae9d48574 | |||
| 9812710cd0 | |||
| 3b083c31e7 | |||
| 1b567327b7 | |||
| 
						 | 
					1d6d8dc002 | ||
| 38e92ee981 | |||
| e433b6a42b | |||
| df24d085ca | |||
| 
						 | 
					f29ead4961 | ||
| 
						 | 
					b361ab2d74 | ||
| de4f65fede | |||
| 
						 | 
					10fcd4f732 | ||
| 
						 | 
					bc8709f9a1 | ||
| 3d6745e535 | |||
| 961c0a867c | |||
| f5327fe8ab | |||
| 6f270188f7 | |||
| 5895334244 | |||
| 1812592d43 | |||
| 3babbe5e84 | |||
| 632ea710c8 | |||
| bdcb135adb | |||
| 3b93d2c0a5 | |||
| f24b2931dd | |||
| c1e972963f | |||
| ce2e05464f | |||
| dbe0c9097f | |||
| e68c12e0e7 | |||
| c99a967fb9 | |||
| d11eebefae | |||
| b423821ae9 | |||
| 7a0234adb2 | |||
| 
						 | 
					f36fc0ba60 | ||
| 
						 | 
					cff126953e | ||
| 
						 | 
					89064f55a1 | ||
| f69dab5ca5 | |||
| 259cdd34c4 | |||
| 
						 | 
					9dca42e242 | ||
| 
						 | 
					248e4e93ed | ||
| 
						 | 
					db2bf1e98e | ||
| ea66db07a4 | |||
| 5f35a42fe3 | |||
| e82b2bd10a | |||
| ad4f400262 | |||
| 866bcec114 | |||
| 367188b03d | |||
| dd4d463c42 | |||
| 1031f0d40e | |||
| 5d7943f871 | |||
| d0c34c0206 | |||
| 726b8f0e3c | |||
| 5d4149db35 | |||
| f04474c82f | |||
| 156398caba | |||
| ae3091f620 | |||
| 84f9fdba28 | |||
| 531f940b65 | |||
| d907f3f11b | |||
| 02409d4992 | |||
| 771b6a59a5 | |||
| 2e336ac874 | |||
| a61c9553e1 | |||
| 3243a7e0a2 | |||
| 06cc84a21f | |||
| 688914906d | |||
| f9d87876f2 | |||
| 7df70cab98 | |||
| 287ea80be9 | |||
| dc3d88a1ef | |||
| cba6394823 | |||
| eea0711a04 | |||
| 949bdfd993 | |||
| 3067da5d24 | |||
| 546c925224 | |||
| d7b5944c5f | |||
| aa234e0749 | |||
| 506118b3f1 | |||
| 52a78902f7 | |||
| e89489fde9 | |||
| a7be9c0a83 | |||
| 6331d8fd3e | |||
| 
						 | 
					eb6790b17d | ||
| 61f010f5ad | |||
| 30fd36b741 | |||
| 91aacb91cc | |||
| 73c17febd9 | |||
| 99dc9dd4a8 | |||
| c5ffca22ff | |||
| 89e7eb85ff | |||
| 98d5de29b0 | |||
| 4939c8c8e4 | |||
| 8d5c66dc40 | |||
| 02571bf727 | |||
| 2c6cbeb8ca | |||
| 13a7d791a1 | |||
| ae555fed00 | |||
| 6d65009987 | |||
| 386e88387d | |||
| 22473d6547 | |||
| e7b4f1a54f | |||
| 1f6565d2ef | |||
| e838a82556 | |||
| eebca7b0f1 | |||
| 169d4dc41c | |||
| 9e063180bf | |||
| 5b0b15f395 | |||
| 736d43e756 | |||
| b4add2de95 | |||
| 37a8928e41 | |||
| 0a0243eb85 | |||
| a6c7c1d997 | |||
| c7caa2ba76 | |||
| 2ce8b1110d | |||
| 11d57094e8 | |||
| 704392a729 | |||
| efeda81e05 | |||
| ae5940eb48 | |||
| 638ae3315f | |||
| ac9e55e2fc | |||
| 293efc03b4 | |||
| f084078cf2 | |||
| c8a66f008e | |||
| b6b6c25b3b | |||
| cb35aed202 | |||
| eebe1d669a | |||
| 8f462da627 | |||
| 3aaecc8630 | |||
| 9b97b03d42 | |||
| bdb07a3a05 | |||
| 2fda5b751b | |||
| ddb048daca | |||
| ac42de7863 | |||
| 2c55cfe1dc | |||
| 3ba3498892 | |||
| 99276dc41c | |||
| fced8ef4b7 | |||
| 247f1879e3 | |||
| a06a0788c1 | |||
| 5a8291dc87 | |||
| 15af0203ff | |||
| 7006196691 | |||
| 5cbe14464d | |||
| 2463a492c8 | |||
| 72f69f0f82 | |||
| a2daeff384 | |||
| caaa25ef8e | |||
| ff5aeaae17 | |||
| 184a664bf9 | |||
| 
						 | 
					dbc604d84a | ||
| 
						 | 
					9c353669ea | ||
| 8d92cc0ba7 | |||
| 
						 | 
					215b859725 | ||
| da67fa4c4f | |||
| 5b4c3ae9b3 | |||
| fdb36ab047 | |||
| a1b1e6bb17 | |||
| 
						 | 
					73dd97f7d3 | ||
| bfd51c6615 | |||
| 
						 | 
					b84e161399 | ||
| 
						 | 
					3b8c329ff6 | ||
| 
						 | 
					e7299bac4a | ||
| 
						 | 
					80d518e4af | ||
| 
						 | 
					730762d1c6 | ||
| 
						 | 
					288f0dbf69 | ||
| 
						 | 
					2c02150b1a | ||
| 
						 | 
					5e0a693108 | ||
| 72ba2c6bca | |||
| 6adb647ccc | |||
| 97731b0a9b | |||
| 
						 | 
					1e63d00767 | ||
| 6151d0ce54 | |||
| 9551e10d2b | |||
| 387b7c2fbd | |||
| 39ba21f308 | |||
| 
						 | 
					22755de1dd | ||
| 
						 | 
					3d7fcd99a8 | ||
| 
						 | 
					35d723e5fb | ||
| 
						 | 
					62af980ea5 | ||
| 
						 | 
					8abed67e1c | ||
| 
						 | 
					b8992b8eeb | ||
| 
						 | 
					6ddbf35a7b | ||
| 
						 | 
					325ab0daf3 | ||
| 1a783e1881 | |||
| d04f5a527b | |||
| f51279e83e | |||
| 90bebbad7d | |||
| 
						 | 
					82052f5d70 | ||
| 
						 | 
					369397bf4f | ||
| c61577edda | |||
| 
						 | 
					1beae4d713 | ||
| 352302b7aa | |||
| 01b60f334a | |||
| 0546a43d63 | |||
| 5c68879509 | |||
| 9d844f6692 | |||
| 28509f651d | |||
| b590444375 | |||
| 873258fc84 | |||
| 7988becc45 | |||
| 45c4a7ae64 | |||
| 05803787a9 | |||
| 33acc645ea | |||
| 0ce787701f | |||
| e9cacbb74a | |||
| a2f8f7ae43 | |||
| a49c53772e | |||
| 1adccdb06e | |||
| 22d593fc12 | |||
| de7ec6fa54 | |||
| 90948e5513 | |||
| bd79391efc | |||
| 4ea72f7d9d | |||
| 96e38a8a6d | |||
| 09e6872724 | |||
| f44f9d356b | |||
| 
						 | 
					9f0ab5aee7 | ||
| 
						 | 
					6eac6044cd | ||
| a24cd693e3 | |||
| f63aab327d | |||
| 0c9499dd58 | |||
| 00787adf2b | |||
| 
						 | 
					dbe186547f | ||
| 
						 | 
					13f0b8610c | ||
| 
						 | 
					f9e8bf4f2d | ||
| 
						 | 
					44e93dd5f8 | ||
| 
						 | 
					ee8f331de4 | ||
| 
						 | 
					99f8aeb6cd | ||
| 
						 | 
					fc1fe7c277 | ||
| 
						 | 
					a8b6609dbf | ||
| 
						 | 
					ded2ac7d48 | ||
| 
						 | 
					16a0dc4621 | ||
| 
						 | 
					ba668d3b9d | ||
| 
						 | 
					690a443bdb | ||
| 
						 | 
					137eb184d0 | ||
| 0a2730540e | |||
| 9284a4bc29 | |||
| 
						 | 
					f2edc1ef0c | ||
| bf2d9acc5a | |||
| 2628e58ea0 | |||
| 
						 | 
					da650fa1f2 | ||
| 
						 | 
					55a65ee6e9 | ||
| 
						 | 
					492c22d1b7 | ||
| e153fa34e9 | |||
| d272e1398c | |||
| 9457926a35 | |||
| 8ff80ac65e | |||
| 3d1ded8b1c | |||
| c611f35cd6 | |||
| f79cfda74a | |||
| ff4b90835e | |||
| d5501bcfbd | |||
| fb1552f6b7 | |||
| e28da7e99b | |||
| 4b899d337a | |||
| d6933fce35 | |||
| aefd09693b | |||
| 8555277827 | |||
| 6f58a9a8bb | |||
| b02739cc3c | |||
| b8d9d59d76 | |||
| 
						 | 
					ba52e95253 | ||
| 
						 | 
					2e69dbb7c9 | ||
| 13d579dc33 | |||
| 
						 | 
					efcc602d53 | ||
| ee82bd2867 | |||
| 
						 | 
					fcc5d3d349 | ||
| af3b761208 | |||
| 23e61ac6a7 | |||
| e4ae495a3f | |||
| ec99bc95fa | |||
| 
						 | 
					b68b43118b | ||
| 
						 | 
					db95e935d9 | ||
| 
						 | 
					dc5ff53a57 | ||
| 
						 | 
					50a2de1559 | ||
| d18ab5cf49 | |||
| 1860478aea | |||
| 
						 | 
					17e83deb55 | ||
| 16be28681a | |||
| 388b666b5d | |||
| 
						 | 
					9b06ccc3e6 | ||
| efbd9b0185 | |||
| b2a61071bf | |||
| f0849eeef5 | |||
| c7f2eedd4b | |||
| ab74478afc | |||
| f88d0ee19e | |||
| 727480d6d1 | |||
| af79ffd544 | |||
| 80aee185a7 | |||
| 7afada5dad | |||
| 739c7e9a77 | |||
| 03471a74fe | |||
| 44ed2e44e0 | |||
| 68aa80269f | |||
| 2012df512c | |||
| 1c21b80703 | |||
| 25fe105590 | |||
| b6e530fec6 | |||
| 4ef2274803 | |||
| 3352999862 | |||
| 5605813826 | |||
| 72795240b9 | |||
| d0772fc306 | |||
| 
						 | 
					def90893de | ||
| 
						 | 
					4b692edd7d | ||
| 
						 | 
					6472c554ed | ||
| 
						 | 
					f04118218d | ||
| 
						 | 
					cde6e8f368 | ||
| 474fffcbb5 | |||
| 0333e79b0a | |||
| 7c043e9d85 | |||
| 
						 | 
					6d46efa610 | ||
| 
						 | 
					84f2e1c72a | ||
| 
						 | 
					1c1dec1f5b | ||
| 
						 | 
					3ff9291580 | ||
| 9265a15427 | |||
| 6d3b88aee9 | |||
| 827c85ac56 | |||
| 
						 | 
					7b52a10943 | ||
| 
						 | 
					187c9d82b6 | ||
| 214ef09fe7 | |||
| 892be42580 | |||
| 18694a34cf | |||
| e9236875d2 | |||
| db4b0b104b | |||
| 4ad65b616d | |||
| 
						 | 
					c5eac09478 | ||
| 
						 | 
					a88e052eb6 | ||
| 
						 | 
					568a1d95f4 | ||
| 9769aa1386 | |||
| bf4a3a2c91 | |||
| 3df2335cf4 | |||
| 1c7c217d1c | |||
| f0e41f839f | |||
| 
						 | 
					349db2142d | ||
| 34b3c6fa32 | |||
| b1c0e18e51 | |||
| 6edf0bcb3b | |||
| 6171b3411f | |||
| 86bf0115dd | |||
| 19cad9a7a4 | |||
| a736c2a67e | |||
| 636f92b168 | |||
| 
						 | 
					1b66941746 | ||
| 
						 | 
					dca17c409b | ||
| 7f5a91fc49 | |||
| 3ab71c8a2e | |||
| fdf1911c15 | |||
| ba24abf788 | |||
| 076728bf5f | |||
| 0833bb49ca | |||
| 
						 | 
					23fd4be2e5 | ||
| 
						 | 
					4406016f82 | ||
| ac12e75714 | |||
| d50d68aa86 | |||
| fccac80222 | |||
| bf70d344bf | |||
| d0591d0351 | |||
| c83d6d392f | |||
| 09ca1ec6bb | |||
| 970431197f | |||
| 9fdd9da486 | |||
| b9eee51de6 | |||
| c0ec64e4be | |||
| 74a84e42a6 | |||
| 595ddf5b6f | |||
| abe183fd10 | |||
| 9a0883eb5f | |||
| 663295d436 | |||
| 9f9986d367 | |||
| db37527f72 | |||
| 6171a221b2 | |||
| 1312fd0941 | |||
| c1832d39f1 | |||
| 3756631595 | |||
| 969f0b8aeb | |||
| 8b37f008e6 | |||
| a7a933c7a7 | |||
| 15bc3e62d3 | |||
| 5ce62f5458 | |||
| 283b378291 | |||
| 3e30684198 | |||
| c2e284682f | |||
| 5407dbfc98 | |||
| fa23bfd7d5 | |||
| 09de7cbf7d | |||
| 6a3c8017f0 | |||
| 9bb149fb02 | |||
| eb6ec8a4af | |||
| c8c2c4c859 | |||
| 7bd93e53c2 | |||
| 5d6f3de694 | |||
| 3eb826d422 | |||
| e9ffdb1f03 | |||
| f4f488dad1 | |||
| 2a9f1dc238 | |||
| 8482c8ffa7 | |||
| 54ad7a4b8f | |||
| ed4cf67e79 | |||
| 550168fd7c | |||
| 8470430c57 | |||
| 5dc117037d | |||
| 7f1083aa40 | |||
| 900adc7105 | |||
| 0648154ba1 | |||
| 86de8137e4 | |||
| a9415488dd | |||
| 8945703785 | |||
| 9f90cc8fe1 | |||
| 
						 | 
					d6d7edf25d | ||
| 7b17dc692e | |||
| e5f7120733 | |||
| 1a05ffab96 | |||
| aad7a21bc3 | |||
| ae0bf7bfd7 | |||
| d2ecc5d3a3 | |||
| 22aefca5c9 | |||
| cce790f2f8 | |||
| 
						 | 
					84478c651e | ||
| 
						 | 
					88e9a96e0e | ||
| cefa304fb5 | |||
| 
						 | 
					a187bac7b0 | ||
| 83760cc980 | |||
| 2b108d0d70 | |||
| f5accb827c | |||
| 
						 | 
					4543c411e7 | ||
| 
						 | 
					7aefa5014c | ||
| 
						 | 
					d163783ed3 | ||
| 4536f30da2 | |||
| 8764aacd92 | |||
| 8b8f6027cc | |||
| 6769752c26 | |||
| 
						 | 
					5695bb0e9e | ||
| 
						 | 
					48a32f2403 | ||
| 695b9d5bea | |||
| f38cfb4b28 | |||
| 
						 | 
					a7240e8cc6 | ||
| 67948f7f3a | |||
| 52d8776fbb | |||
| 0d38cae217 | |||
| d6bad9e030 | |||
| 
						 | 
					b146f17d2f | ||
| df675cd757 | |||
| ecc2e390f7 | |||
| c3e0b3b708 | |||
| 449a6a1b4e | |||
| eb874a15a6 | |||
| 3b26466a6c | |||
| a6ac6ee6d8 | |||
| a59994355b | |||
| 06c279627a | |||
| 1e146f542e | |||
| cdd21c94c6 | |||
| 
						 | 
					30cdcb0836 | ||
| 
						 | 
					29308110ea | ||
| 
						 | 
					18c57d532c | ||
| 
						 | 
					b814e812b6 | ||
| 
						 | 
					dbbbd99788 | ||
| 
						 | 
					47676c67ff | ||
| 
						 | 
					7ad78fbce1 | ||
| 
						 | 
					37e38436a8 | ||
| 
						 | 
					e1b3719746 | ||
| 
						 | 
					68a64aa67f | ||
| 
						 | 
					d780d95157 | ||
| 
						 | 
					4822acb6fb | ||
| 260ce8ba17 | |||
| 822f0aa737 | |||
| e10a6b4bf2 | |||
| 8e1f3a5cc0 | |||
| 31ec6c70ef | |||
| cd84700400 | |||
| 08fa1edbee | |||
| 15d9593d0f | |||
| 010afded18 | |||
| c12f633829 | |||
| fb6f0c316e | |||
| b1ed263c4e | |||
| 846e487e27 | |||
| 72a9183ca8 | |||
| fe89704672 | |||
| 93d023007e | |||
| 8bf179934d | |||
| 24c79cc4b1 | |||
| f93282d657 | |||
| 18c0e6a6bf | |||
| 3a602385cc | |||
| 26373e5d23 | |||
| cb4c3b46b9 | |||
| abb81bf45f | |||
| a9694da557 | |||
| 
						 | 
					d205939361 | ||
| deadeb341e | |||
| 274c6115cc | |||
| 416665f209 | |||
| f60f927549 | |||
| 2e59c1415b | |||
| d852477c51 | |||
| f8d5f13a88 | |||
| af0d7765ff | |||
| c1f5730c4d | |||
| da019a146a | |||
| 
						 | 
					4bd50d0148 | ||
| 
						 | 
					1826b20b40 | ||
| 356d1a7133 | |||
| 
						 | 
					2cc7473276 | ||
| 
						 | 
					2ea5c4b0c7 | ||
| 432cce280b | |||
| 530297bc67 | |||
| c416f1ef6d | |||
| 3a5e956e49 | |||
| 5cf4013a99 | |||
| 16cca07e12 | |||
| 
						 | 
					aae360d6ab | ||
| bf25740098 | |||
| 18836f312a | |||
| 2b257cc402 | |||
| 
						 | 
					289d79e011 | ||
| b7d6d69101 | |||
| 
						 | 
					15487cd84c | ||
| fc5a893b00 | |||
| 92a6fed521 | |||
| 051ed19f97 | |||
| 1479e2ae9a | |||
| 
						 | 
					1ab4f997ba | ||
| 
						 | 
					24b11f609d | ||
| c4e0b68ebe | |||
| f8ec0f85e5 | |||
| ed33514aee | |||
| 0d96c1f12d | |||
| 0fcf21bd35 | |||
| 9065ec40b1 | |||
| 8f6ab15621 | |||
| fd69ae3d4a | |||
| 81b42ef99a | |||
| c546d23421 | |||
| 
						 | 
					0661eb8701 | ||
| 
						 | 
					c073ec14c8 | ||
| 
						 | 
					bf26092764 | ||
| 
						 | 
					e035a6fd94 | ||
| ff1ff8f5bb | |||
| 
						 | 
					3f43574371 | ||
| 
						 | 
					b1390f4e9b | ||
| 
						 | 
					fd29a4ce65 | ||
| 
						 | 
					4655892815 | ||
| e46220ff72 | |||
| 
						 | 
					f19a090549 | ||
| 08f9819453 | |||
| 7067d4b5bd | |||
| de0be15fff | |||
| b56d8c2956 | |||
| 
						 | 
					5f71b46bb7 | ||
| fd16222c51 | |||
| 185d1dbf49 | |||
| 576f46f845 | |||
| 
						 | 
					154f976762 | ||
| d5477e94b1 | |||
| 67ae506bb5 | |||
| 5a514cf2db | |||
| 1fdc994c0a | |||
| 35aa05fb97 | |||
| 70c7b1385e | |||
| d486f2ddfc | |||
| fc5ca30df0 | |||
| 0601fa0142 | |||
| fffed6e3f6 | |||
| ffe4dd4a98 | |||
| cc4dfdb042 | |||
| fd0ca3b29d | |||
| daab42109b | |||
| ab5bb3963b | |||
| 262bb13b6c | |||
| 5d530aaae9 | |||
| 
						 | 
					f0e6bfc6c6 | ||
| 
						 | 
					d4283a0b94 | ||
| 
						 | 
					568c4b60ef | ||
| 
						 | 
					736ca2272b | ||
| 
						 | 
					88059884ec | ||
| 
						 | 
					ce1d213082 | ||
| 
						 | 
					71f3a3403c | ||
| 
						 | 
					fbeda163f0 | ||
| 
						 | 
					08c1bb7992 | ||
| 
						 | 
					2f7b237c4c | ||
| 
						 | 
					665027085d | ||
| 
						 | 
					2618003177 | ||
| 8f597eb254 | |||
| 775d223be2 | |||
| 3849776511 | |||
| cb3301bcef | |||
| 8d74566eac | |||
| 4a03c2aa43 | |||
| 292d56cfbe | |||
| b41e016a6d | |||
| 0a2e2301a9 | |||
| 874c90e0e0 | |||
| bb8898a4ec | |||
| 213da59b0b | |||
| 4e9879ba92 | |||
| 0690704391 | |||
| 610b861345 | |||
| b7f8ba4385 | |||
| a923a1f135 | |||
| 0d804dd817 | |||
| 4f4b1bfbaa | |||
| caa63ea97a | |||
| 8675bb65c1 | |||
| 104af6d9b5 | |||
| 2f2d4493ae | |||
| 2d23068354 | |||
| b65dacca72 | |||
| 265c8b776b | |||
| 4920c8b28b | |||
| 4f9acf3174 | |||
| 962957409b | |||
| 0b4d79fd5e | |||
| 0efd3d2af3 | |||
| 
						 | 
					02e5a1158d | ||
| cfe32828a4 | |||
| 
						 | 
					ca6bfea51f | ||
| 
						 | 
					8c7da5f80c | ||
| 
						 | 
					57175e1c0b | ||
| 
						 | 
					c5d2953ecb | ||
| ee8044b857 | |||
| 1fda56b5f7 | |||
| ca79da2f9b | |||
| c90e6231f9 | |||
| e86fa41180 | |||
| ebea4b7008 | |||
| 9565464489 | |||
| 05f83bf566 | |||
| 673d0c1e53 | |||
| fe35a29fb8 | |||
| 53d51fea2f | |||
| caaebd593b | |||
| 672fa48140 | |||
| a9aeea234c | |||
| 1683685f6b | |||
| e4aac56f2d | |||
| d6990349d8 | |||
| 9ac2f7e359 | |||
| f86c0353a2 | |||
| 0a289e1edd | |||
| c2c5bec0e5 | |||
| 68bfca8a1f | |||
| 
						 | 
					6e1b95aa60 | ||
| 
						 | 
					baf9b6e1ae | ||
| 5ff47050ff | |||
| 
						 | 
					c302f2dcf9 | ||
| 
						 | 
					24fc7a216b | ||
| 
						 | 
					2926965400 | ||
| 
						 | 
					341177aa5e | ||
| 56923aa1b8 | |||
| 62f54a3c27 | |||
| 64e9461586 | |||
| 5e01eebd25 | |||
| bae2a385aa | |||
| 9861e3fe1c | |||
| 95b2fcead7 | |||
| 45beb27f83 | |||
| 
						 | 
					b992bde41d | ||
| aebb21935b | |||
| 20104f1b3b | |||
| 25264447bc | |||
| c1036a3627 | |||
| f1a9a872bb | |||
| df322d7ebb | |||
| 
						 | 
					56a4fd3fa0 | ||
| 
						 | 
					02716a6a93 | ||
| d4534b56a0 | |||
| 
						 | 
					81b7b49170 | ||
| c8922a6a82 | |||
| cdf0bb30c9 | |||
| e4793e1a77 | |||
| 8347ddd5be | |||
| 12412e05a7 | |||
| 
						 | 
					dd99c35e35 | ||
| 
						 | 
					9d651a70e9 | ||
| b0d50d315c | |||
| 41bddf2db6 | |||
| 769700fe83 | |||
| 433ccb1fc4 | |||
| 145c1d59e9 | |||
| ae8cc0f700 | |||
| a764da3e99 | |||
| 8f92f79f85 | |||
| f093765d03 | |||
| c44d962ba8 | |||
| 20d22b726c | |||
| 8fa2f0e7ad | |||
| 604c7f385e | |||
| 1a07c9d71a | |||
| f7e287d415 | |||
| b16cc2dc27 | |||
| 188447fc10 | |||
| b920bf6d22 | |||
| 32ff54e130 | |||
| 02c09687a4 | |||
| 3b1fc4aacb | |||
| bf9469d538 | |||
| c2dec360b1 | |||
| dc7422bf56 | |||
| 89edf508f5 | |||
| 
						 | 
					50410d190f | ||
| 
						 | 
					b54e076ca0 | ||
| 2ab7556ac3 | |||
| 3d38da7b37 | |||
| 056d5a3f98 | |||
| 17612afd87 | |||
| 0a4913f341 | |||
| 
						 | 
					3aa12d2e8c | ||
| a6504366b4 | |||
| 4e83e7905a | |||
| 
						 | 
					96b1854fef | ||
| 
						 | 
					489473806f | ||
| 
						 | 
					f5bc8dca5e | ||
| 
						 | 
					bc99c85802 | ||
| 385664e2bc | |||
| 1658fee090 | |||
| b9dbb1916a | |||
| 
						 | 
					99afd2e830 | ||
| 861f461bc5 | |||
| b6c118a0c8 | |||
| 89d3ab38f0 | |||
| 441704dc29 | |||
| 8ee451c6e0 | |||
| 
						 | 
					785e690404 | ||
| 
						 | 
					2fcd7a21a4 | ||
| f2221565c5 | |||
| 
						 | 
					d5c1591205 | ||
| 
						 | 
					7895699ef3 | ||
| 
						 | 
					bd9963e65f | ||
| df61fbff12 | |||
| 9ead38ee22 | |||
| 6402962990 | |||
| 9e9fa5039f | |||
| e6d503a1e2 | |||
| 844650b685 | |||
| 4920142540 | |||
| 
						 | 
					a7a1f699bb | ||
| 61cf838458 | |||
| 
						 | 
					229a91ddf0 | ||
| 68d0c66402 | |||
| c2a132a40b | |||
| 
						 | 
					94729a66ca | ||
| bd05315de3 | |||
| d254a9e14a | |||
| e028c1ca2b | |||
| 
						 | 
					1c3f6c7c1e | ||
| 
						 | 
					f8888462f1 | ||
| 
						 | 
					4e2be091cd | ||
| 
						 | 
					40a1726ca7 | ||
| 
						 | 
					fc9deb8ba8 | ||
| 
						 | 
					b1993dbf22 | ||
| 7dd6cd04ba | |||
| 1072f539dc | |||
| 9bcf4cce9f | |||
| 9223beac47 | |||
| 62c78e650f | |||
| e7d0c1cac6 | |||
| b859283766 | |||
| 973644c62d | |||
| b9af54892b | |||
| f9154233e4 | |||
| e595500cb8 | |||
| 
						 | 
					aa7da2559c | ||
| 753a007172 | |||
| f34847f9f6 | |||
| 0fa119c984 | |||
| 270d00c1e8 | |||
| 983c5f3c6a | |||
| c6141e473f | |||
| c30cb5879d | |||
| 29e384ada5 | |||
| c8e5ba4738 | |||
| bf0b7f1bb2 | |||
| d6cc69b919 | |||
| ac33c6aad8 | |||
| 89383a5ec4 | |||
| 0fd26da299 | |||
| 6fa99655b2 | |||
| a387305ef8 | |||
| e0c7daf3fd | |||
| 4304baeca5 | |||
| d2a567c79e | |||
| 3c04ced1a3 | |||
| a28d8a7287 | |||
| 1c055e842e | |||
| dea283d655 | |||
| 
						 | 
					01a3af694a | ||
| 58c8373c81 | |||
| a1ccfadac1 | |||
| 632b1262f9 | |||
| e157624479 | |||
| 3a2370d536 | |||
| 
						 | 
					eee38e9577 | ||
| 50b7df1f4a | |||
| 981c94906d | |||
| adce90c151 | |||
| 83f8402081 | |||
| 22417ee9f9 | |||
| 3c5d269ece | |||
| 42579b5752 | |||
| 15023d348a | |||
| fbf777e134 | |||
| 450277f32a | |||
| 
						 | 
					1f5d529d33 | ||
| 93128cb61b | |||
| 
						 | 
					c19099e76c | ||
| d3d655293e | |||
| 
						 | 
					692343aae4 | ||
| 0592601aa6 | |||
| a17f5948fb | |||
| 
						 | 
					4dd9bc1123 | ||
| 6578f66fec | |||
| 3f2a19a6f0 | |||
| d5160ead4c | |||
| a6e9cbdece | |||
| 657bf7075b | |||
| f1c3e8dc1b | |||
| a9624b36f7 | |||
| db4aec9a18 | |||
| c34ce48a53 | |||
| 93345c09a1 | |||
| b5a1985fa1 | |||
| 9b4c350213 | |||
| 199a441593 | |||
| f42d106e3c | |||
| 13eddbfc5b | |||
| 7c30126fed | |||
| e3c5f6f95f | |||
| a86f1a05ac | |||
| 9ba0cb0c2a | |||
| add8588767 | |||
| a083a320ae | |||
| 64fa7f2e00 | |||
| c7a830ee28 | |||
| 9aa51406fa | |||
| 344981cf99 | |||
| 28c4d6b92f | |||
| ef2ab5faf6 | |||
| 54dbf711f9 | |||
| bb93cb23a7 | |||
| 60951231c4 | |||
| ece30b63c3 | |||
| 94503505f7 | |||
| 48589f3368 | |||
| 1e04c178dc | |||
| 37ed703abe | |||
| 7ed20d2fc5 | |||
| 5fe2a8e737 | |||
| 
						 | 
					861abe708b | ||
| 57a88845dc | |||
| 
						 | 
					f43e216e13 | ||
| 5210e7985f | |||
| ddabdff206 | |||
| 5a692db30f | |||
| 659983fef1 | |||
| aca5a3c731 | |||
| 406cfc86cd | |||
| 90da067fbd | |||
| 3532e9dd8c | |||
| fddb74f107 | |||
| e7a6742964 | |||
| ee817b1d62 | |||
| 3ffeaf419a | |||
| a399804094 | |||
| 05e9f118d7 | |||
| ce2f64acd0 | |||
| 7aad5be29f | |||
| 41b0dd50bd | |||
| 08f544f6ea | |||
| 4e862cc585 | |||
| 05d2c3b2e8 | |||
| 513207e510 | |||
| dee6ed6707 | |||
| d60095987c | |||
| b4f9be0d92 | |||
| a2a0f6af44 | |||
| 7fa0353d8c | |||
| 9256c71715 | |||
| 5520f3df50 | |||
| a6c0d8b219 | |||
| f6e667700e | |||
| f94ef0798a | |||
| 7bd7476200 | |||
| a2752765af | |||
| 4de2cbe807 | |||
| 1e81256404 | |||
| 6b571e87b4 | |||
| 4314823a70 | |||
| dc08ced6c9 | |||
| 9d660311f0 | |||
| b3e65f0733 | |||
| 03007370bc | |||
| f9b514c869 | |||
| bc2d4c1066 | |||
| 298b597dd0 | |||
| 
						 | 
					91ba08dfa1 | ||
| 481456a038 | |||
| 
						 | 
					06142797c3 | ||
| 
						 | 
					4185b660cc | ||
| ad46776164 | |||
| 2343a4a334 | |||
| 3f83c323be | |||
| 9a9ed64298 | |||
| 
						 | 
					a0cadb46db | ||
| 
						 | 
					f139af8b6f | ||
| 
						 | 
					1f0ef6e187 | ||
| 
						 | 
					4afea55465 | ||
| 
						 | 
					3d5723facb | ||
| 211ecf1c3e | |||
| 796b4ff76b | |||
| 9553e18d83 | |||
| 02d9a713de | |||
| 6cc4fa582e | |||
| b8d43f36eb | |||
| 06b3d63133 | |||
| 232e71f46c | |||
| 0b5a0e65a8 | |||
| ef42227e6c | |||
| 2af3de4f61 | |||
| 8bafa37fe1 | |||
| 
						 | 
					a83b0326d7 | ||
| 53e03395f2 | |||
| 5fef4048a4 | |||
| d8929a6222 | |||
| 33af7f36a0 | |||
| 3f2454cead | |||
| 0ac9f2df8c | |||
| 333224a9d5 | |||
| 496e5f0259 | |||
| f2a62822a4 | |||
| 7879a99197 | |||
| 72d8cc297f | |||
| 1a0674a20b | |||
| 572aa2c14e | |||
| bc4b2c4e86 | |||
| a227e88e79 | |||
| d9e9f472fb | |||
| fcff4bf863 | |||
| 79b82e09e1 | |||
| 
						 | 
					a78f29cffc | ||
| e98b1b049b | |||
| 99efa51794 | |||
| 76932e6e8c | |||
| 97d2e3d5b5 | |||
| 
						 | 
					2c94811c8f | ||
| a2063ab13b | |||
| 
						 | 
					eb32b13bcc | ||
| 2bb718f3ea | |||
| c6373a075d | |||
| 46337ef25d | |||
| 2f5fecf414 | |||
| 5d2cb8c712 | |||
| 460502a1f2 | |||
| cdd7a16d18 | |||
| ec29758547 | |||
| c5cbdd97ff | |||
| 05fc5a1829 | |||
| c3de3c6c39 | |||
| 1530e9d13a | |||
| a986b4ae98 | |||
| 0854b7fc6a | |||
| 730199cca4 | |||
| de1dddbb85 | |||
| a612d7dd9f | |||
| 50e722e637 | |||
| e4d5e40a8b | |||
| 479ec25d99 | |||
| 930b6ff77e | |||
| 7d8bd089a2 | |||
| 
						 | 
					ebdcc5a07d | ||
| 
						 | 
					0f31a49890 | ||
| 2c566bb21c | |||
| a0bc6c7604 | |||
| a4457664d4 | |||
| b42ae76bdf | |||
| 2eb1ebd263 | |||
| b79885cd21 | |||
| 69dd920fd6 | |||
| 0689ca366d | |||
| af1c268784 | |||
| 1162c436c1 | |||
| 571a8a0edc | |||
| bdbb83ab85 | |||
| 434d672d8a | |||
| e21ff588ae | |||
| 0383571a9e | |||
| f358e78734 | |||
| 43ef31b93f | |||
| 15393d9da9 | |||
| 695d22adba | |||
| bc1a63354c | |||
| faebb0fe30 | |||
| 68d99050bc | |||
| 4fa1bb4341 | |||
| 739540af64 | |||
| b87f14255d | |||
| 0f2cbbe553 | |||
| 256c5688a0 | |||
| 6460007aa1 | |||
| f84e088e7b | |||
| b8e16d2929 | |||
| 88fc5e94fa | |||
| 4431428c26 | |||
| 724ce8c9af | |||
| a31b74e0e5 | |||
| 47615e2e5d | |||
| 475585c5e7 | |||
| a2e086be75 | |||
| e6cf1994b0 | |||
| bea0b69858 | |||
| 95547e961e | |||
| c4a859f2d2 | |||
| a39bd79930 | |||
| 424d0533b8 | |||
| 5a7d187a10 | |||
| dc8dd6a423 | |||
| 006e8cdc27 | |||
| cf4f6f06e9 | |||
| e467820345 | |||
| 416a1c4e4d | |||
| 1febfc11e5 | |||
| a288fdf12d | |||
| 6a3f17962b | |||
| 3860adc435 | |||
| 65daf2d0cf | |||
| 9bf41bbd34 | |||
| de7de22492 | |||
| ea66fb4c37 | |||
| c1232037a9 | |||
| 75eb6414ce | |||
| 5e7445a4fe | |||
| c527b1b3cf | |||
| acacef936c | |||
| f971dc05eb | |||
| 9aba4ea8f6 | 
							
								
								
									
										64
									
								
								.env
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								.env
									
									
									
									
									
								
							@@ -1,64 +0,0 @@
 | 
			
		||||
##
 | 
			
		||||
##  Manually dump .env files in .env.local.php with
 | 
			
		||||
## `$ composer symfony:dump-env prod`
 | 
			
		||||
##
 | 
			
		||||
 | 
			
		||||
## Project environment
 | 
			
		||||
APP_ENV=dev
 | 
			
		||||
 | 
			
		||||
## Enable debug
 | 
			
		||||
APP_DEBUG=true
 | 
			
		||||
 | 
			
		||||
## Locale
 | 
			
		||||
LOCALE=fr
 | 
			
		||||
 | 
			
		||||
## Framework secret
 | 
			
		||||
APP_SECRET=ThisTokenIsNotSoSecretChangeIt
 | 
			
		||||
 | 
			
		||||
## Symfony/swiftmailer
 | 
			
		||||
MAILER_TRANSPORT=smtp
 | 
			
		||||
MAILER_HOST=smtp
 | 
			
		||||
MAILER_PORT=1025
 | 
			
		||||
MAILER_CRYPT=
 | 
			
		||||
MAILER_AUTH=
 | 
			
		||||
MAILER_USER=
 | 
			
		||||
MAILER_PASSWORD=
 | 
			
		||||
MAILER_URL=${MAILER_TRANSPORT}://${MAILER_HOST}:${MAILER_PORT}?encryption=${MAILER_CRYPT}&auth_mode=${MAILER_AUTH}&username=${MAILER_USER}&password=${MAILER_PASSWORD}
 | 
			
		||||
 | 
			
		||||
## Notifications
 | 
			
		||||
NOTIFICATION_HOST=localhost:8001
 | 
			
		||||
NOTIFICATION_FROM_EMAIL=admin@chill.social
 | 
			
		||||
NOTIFICATION_FROM_NAME=Chill
 | 
			
		||||
 | 
			
		||||
## Gelf
 | 
			
		||||
GELF_HOST=gelf
 | 
			
		||||
GELF_PORT=12201
 | 
			
		||||
 | 
			
		||||
## OVH OpenStack Storage User/Role
 | 
			
		||||
OS_USERNAME=
 | 
			
		||||
OS_PASSWORD=
 | 
			
		||||
OS_TENANT_ID=
 | 
			
		||||
OS_REGION_NAME=GRA
 | 
			
		||||
OS_AUTH_URL=https://auth.cloud.ovh.net/v2.0/
 | 
			
		||||
 | 
			
		||||
## OVH OpenStack Storage Container
 | 
			
		||||
ASYNC_UPLOAD_TEMP_URL_KEY=
 | 
			
		||||
ASYNC_UPLOAD_TEMP_URL_BASE_PATH=
 | 
			
		||||
ASYNC_UPLOAD_TEMP_URL_CONTAINER=
 | 
			
		||||
 | 
			
		||||
## Redis Cache
 | 
			
		||||
REDIS_HOST=redis
 | 
			
		||||
REDIS_PORT=6379
 | 
			
		||||
REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}
 | 
			
		||||
 | 
			
		||||
## Twilio
 | 
			
		||||
TWILIO_SID=~
 | 
			
		||||
TWILIO_SECRET=~
 | 
			
		||||
 | 
			
		||||
## DOCKER IMAGES REGISTRY
 | 
			
		||||
#IMAGE_PHP=
 | 
			
		||||
#IMAGE_NGINX=
 | 
			
		||||
 | 
			
		||||
## DOCKER IMAGES VERSION
 | 
			
		||||
#VERSION=test
 | 
			
		||||
VERSION=prod
 | 
			
		||||
@@ -29,6 +29,7 @@ variables:
 | 
			
		||||
    REDIS_URL: redis://redis:6379
 | 
			
		||||
    # change vendor dir to make the app install into tests/apps
 | 
			
		||||
    COMPOSER_VENDOR_DIR: tests/app/vendor
 | 
			
		||||
    DEFAULT_CARRIER_CODE: BE
 | 
			
		||||
 | 
			
		||||
stages:
 | 
			
		||||
    - Composer install
 | 
			
		||||
@@ -78,6 +79,7 @@ psalm_tests:
 | 
			
		||||
    image: registry.gitlab.com/chill-projet/chill-app/php-base-image:7.4
 | 
			
		||||
    script:
 | 
			
		||||
        - bin/grumphp run --tasks=psalm
 | 
			
		||||
    allow_failure: true
 | 
			
		||||
    artifacts:
 | 
			
		||||
        expire_in: 30 min
 | 
			
		||||
        paths:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										216
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										216
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -11,16 +11,218 @@ and this project adheres to
 | 
			
		||||
## Unreleased
 | 
			
		||||
 | 
			
		||||
<!-- write down unreleased development here -->
 | 
			
		||||
* renommer "dossier numéro" en "parcours numéro" dans les résultats de recherche
 | 
			
		||||
* renomme date de début en date d'ouverture dans le formulaire parcours
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Test releases
 | 
			
		||||
 | 
			
		||||
### 2021-04-26
 | 
			
		||||
 | 
			
		||||
* [Datepickers] datepickers fixed when using keyboard to enter date (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/545)
 | 
			
		||||
* [social_action] Display 'agents traitants' in parcours resumé and social action list (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/568)
 | 
			
		||||
* [Person_search] Closed parcours shown within an accordeon that can be opened/closed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/574)
 | 
			
		||||
 | 
			
		||||
### 2021-04-24
 | 
			
		||||
 | 
			
		||||
* [notification email on course designation] allow raw string in email content generation
 | 
			
		||||
* [Accompanying period work] list evaluations associated to a work by startDate, and then by id, from the most recent to older
 | 
			
		||||
* [Documents] Change wording 'créer' to 'enregistrer' (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/634)
 | 
			
		||||
* [Parcours]: The number of 'mes parcours' displayed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/572)
 | 
			
		||||
* [Hompage_widget]: Renaming of tabs and removal of social actions tab (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/570)
 | 
			
		||||
* [activity]: Ignore thirdparties when creating a social action via an activity (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/573)
 | 
			
		||||
* [parcours]: change wording of warning message and button when user is not associated to a household yet (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/590#note_918370943)
 | 
			
		||||
* [Accompanying period work evaluations] list documents associated to a work by creation date, and then by id, from the most recent to older
 | 
			
		||||
* [Course comment] add validationConstraint NotNull and NotBlank on comment content, to avoid sql error
 | 
			
		||||
* [Notifications] delay the sending of notificaiton to kernel.terminate
 | 
			
		||||
* [Notifications / Period user change] fix the sending of notification when user changes 
 | 
			
		||||
* [Activity form] invert 'incoming' and 'receiving' in Activity form
 | 
			
		||||
* [Activity form] keep the same order for 'attendee' field in new and edit form
 | 
			
		||||
* [list with period] use "sameas" test operator to introduce requestor in list
 | 
			
		||||
* [notification email on course designation] allow raw string in email content generation
 | 
			
		||||
* [Accompanying period work] list evaluations associated to a work by startDate, and then by id, from the most recent to older
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### 2021-04-13
 | 
			
		||||
 | 
			
		||||
* [person] household address: add a form for editing the validFrom date (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/541)
 | 
			
		||||
* [person] householdmemberseditor: fix composition type bug in select form (vuejs) (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/543)
 | 
			
		||||
* [docgen] add more persons choices in docgen for course: amongst requestor (if person), resources of course (if person), and PersonResource (if person);
 | 
			
		||||
* [docgen] add a new context with a list of activities in course
 | 
			
		||||
* [docgen] add a comment in budget lines
 | 
			
		||||
* [notifications] allow to send a notification to an email address. The address receive an access link
 | 
			
		||||
* [adresses] add constraints in database to avoid errors later: postcode not null, and validfrom <= validto
 | 
			
		||||
* [accompanying work editor] add a label on document title input
 | 
			
		||||
 | 
			
		||||
### 2021-04-07
 | 
			
		||||
 | 
			
		||||
* notification list: move action buttons outside of the toggle
 | 
			
		||||
* fix detecting of non-read notification
 | 
			
		||||
* filter users which are disabled in search user api
 | 
			
		||||
* order query for location and add pagination in list
 | 
			
		||||
* allow every person which has part for a workflow  to see the workflow page
 | 
			
		||||
* able to see the workflow if the evaluation document has been deleted
 | 
			
		||||
* hardcode the list of supported mime types for edition with collabora
 | 
			
		||||
* list of accompanying course: allow to see the pinned comment in list_item
 | 
			
		||||
 | 
			
		||||
### 2021-04-06
 | 
			
		||||
 | 
			
		||||
* [main] notification toggle read: correct js syntax for compilation in production (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/548)
 | 
			
		||||
* [parcours] Display of interlocuteurs changed to flex-table in parcours edit page to prevent cut-off of information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/535)
 | 
			
		||||
* [activity] espace entre les boutons pour supprimer les documents
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### continuous release in February and March
 | 
			
		||||
 | 
			
		||||
* Creation of PickCivilityType, and implementation in PersonType and ThirdpartyType
 | 
			
		||||
* [person] Accompanying course evaluation documents: disable the WOPI edit link if mimetype not supported and if no keyInfos
 | 
			
		||||
(https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/585)
 | 
			
		||||
* [activity] display error messages above the form in creating a new location (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/481)
 | 
			
		||||
* [activity] show required field in activity edit/new by an asterix in the vuejs fields (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/494)
 | 
			
		||||
* [ACL] fix allow to see the course, event if the scope'course does not contains the scope's user
 | 
			
		||||
* [search] enforce limit of results for fetching rsults by search api https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/576
 | 
			
		||||
* [activity] Fix delete button for document (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/554)
 | 
			
		||||
* [activity] Add return path the document generation (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/553)
 | 
			
		||||
* [person] add person ressource to person docgen normaliser (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/517)
 | 
			
		||||
* [person] AccompanyingCourseWorkEdit: fix deleting evaluation documents (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/546)
 | 
			
		||||
* [person] AccompanyingCourseWorkEdit: download existing documents (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/512)
 | 
			
		||||
* [person] AccompanyingCourseWorkEdit: replace document by a new one (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/511)
 | 
			
		||||
* [person] AccompanyingPeriodWork: add referrers to work, add doctrine event listener to add logged user to referrers collection and display a referrers list in work list (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/502)
 | 
			
		||||
* [person] AccompanyingPeriodWorkEvaluation: fix circular reference when serialising (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/495)
 | 
			
		||||
* [person] order accompanying period by opening date in search persons, person and household period lists (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/493)
 | 
			
		||||
* [parcours] autosave of the pinned comment for draft accompanying course (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/477)
 | 
			
		||||
* [main] filter user job in undispatch acc period to assign (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/472)
 | 
			
		||||
* [main] filter user job in undispatch acc period to assign (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/472)
 | 
			
		||||
* [person] Add url in accompanying period work evaluations entity and form (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/476)
 | 
			
		||||
* [person] Add document generation in admin and in person/{id}/document (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/464)
 | 
			
		||||
* [activity] do not override location if already exist (when validating new activity) (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/470)
 | 
			
		||||
* [parcours] Toggle emergency/intensity only by referrer (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/442)
 | 
			
		||||
* [docstore] Add an API entrypoint for StoredObject (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/466)
 | 
			
		||||
* [person] Add the possibility of uploading existing documents to AccPeriodWorkEvaluationDocument (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/466)
 | 
			
		||||
* [person] Add title to AccPeriodWorkEvaluationDocument (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/466)
 | 
			
		||||
* [person] Order social issues by the field "ordering" (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/388)
 | 
			
		||||
* [Person/Household list] when listing other simultaneous members of an household, exclude the members on person, not on members (avoid to show two membersship with the same person)
 | 
			
		||||
* [draft periods] add a delete button (if acl granted) on each draft period listed on draft period page (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/463)
 | 
			
		||||
* [Person] Display suffixText in RenderPerson, PersonText.vue, RenderPersonBox.vue (was made for displaying "enfant confie") (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/441)
 | 
			
		||||
* [budget]: budget enabled for persons and households (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/469)
 | 
			
		||||
*  [person] residential address: show residential address or info in PersonRenderBox, refactor Residential Address (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/439)
 | 
			
		||||
* [thirdparty] Add a contact to a thirdparty from within onTheFly (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/345)
 | 
			
		||||
* [documents] Improve flex-table item-col placement when long buttons and long metadata
 | 
			
		||||
* [thirdparty] Fix display of multiple contact badges so they wrap onto next line (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/482)
 | 
			
		||||
* [confidential] Fix position of toggle button so it does not cover text nor fall outside of box (no issue)
 | 
			
		||||
* [parcours] Fix edit of both thirdparty and contact name (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/474)
 | 
			
		||||
* [template] do not list inactive templates (for doc generator)
 | 
			
		||||
* [household] bugfix if position of member is null, renderbox no longer throws an error (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/480)
 | 
			
		||||
* [parcours] location cannot be removed if linked to a user (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/478)
 | 
			
		||||
* [person] email added to twig personRenderbox (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/490)
 | 
			
		||||
* [activity] Only youngest descendant is kept for social issues and actions (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/471)
 | 
			
		||||
* [person] Add link to current household in person banner (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/484)
 | 
			
		||||
* [address] person badge in address history changed to open OnTheFly with all person info (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/489)
 | 
			
		||||
* [person] Change 'personne' with 'usager' and '&' with 'ET' (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/499)
 | 
			
		||||
* [thirdparty] Add parameter condition to display centers or not (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/500)
 | 
			
		||||
* [phonenumber] Remove placeholder in phonenumber field (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/496)
 | 
			
		||||
* [person_resource] separate create page created to avoid confusion (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/504)
 | 
			
		||||
* [contact] add contact button color changed plus the pipe at the side removed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/506)
 | 
			
		||||
* [thirdparty] For contacts show current civility/profession in edit form + fix saving of edited information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/491)
 | 
			
		||||
* [household] create-edit household composition placed in separate page to avoid confusion (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/505)
 | 
			
		||||
* [blur] Improved positioning of toggle icon (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/486)
 | 
			
		||||
* [thirdparty] add firstname field to thirdparty 'child' or 'contact' types (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/508)
 | 
			
		||||
* [household] create-edit household composition placed in separate page to avoid confusion (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/505)
 | 
			
		||||
* [blur] Improved positioning of toggle icon (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/486)
 | 
			
		||||
* [parcours] List of parcours for a specific user so they can be reassigned in case of absence (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/509)
 | 
			
		||||
* [thirdparty] Thirdparty view page, english text translated (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/534)
 | 
			
		||||
* [social_action] Translation changed in evaluation section (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/512)
 | 
			
		||||
* [filiation] Possible to add person (or create onthefly) to add to filiation graph + add relation (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/519)
 | 
			
		||||
* [household] Within parcours listing page of household add create button (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/560)
 | 
			
		||||
* [person_resource] bugfix when adding thirdparty or freetext resource + prevent personOwner themselves to be added. (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/526)
 | 
			
		||||
* [aside_activity] style correction + sticky-form create button (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/529)
 | 
			
		||||
* [budget] order within the menu adjusted (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/592)
 | 
			
		||||
* [onthefly] fix create person. Bug was noticed in filiation (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/591)
 | 
			
		||||
* [parcours] Create document buttons made sticky (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/532)
 | 
			
		||||
* [person] Trailing guillemet removed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/530)
 | 
			
		||||
* [notification] Display of social action within workflow notification set to display block (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/537)
 | 
			
		||||
* [onthefly] trim trailing whitespace in email of person and thirdparty (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/542)
 | 
			
		||||
 | 
			
		||||
* [action] Only youngest descendant is kept for social issues and actions (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/471)
 | 
			
		||||
## Test releases
 | 
			
		||||
 | 
			
		||||
### test release 2022-02-21
 | 
			
		||||
 | 
			
		||||
* [notifications] Word 'un' changed to number '1' for notifications in user menu (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/483)
 | 
			
		||||
* [documents] 'gabarit' changed to 'modèle' (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/405)
 | 
			
		||||
* [person_resources] Menu name and order changed (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/460)
 | 
			
		||||
* workflow: fix sending notifications
 | 
			
		||||
* [thirdparty] Extend the thirdparty search to thirdparty children (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/448)
 | 
			
		||||
* [person]: AddPersons: allow creation of person or thirdparty only (no users) (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/422)
 | 
			
		||||
* [person]: AddPersons: allow creation of person or thirdparty depending on allowed types (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/422)
 | 
			
		||||
* [person]: AddPersons: add suggestion of name when creating new person or thirdparty (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/422)
 | 
			
		||||
* [main] Address: fix small bug: when modifying an address without street (isNoAddress), also check errors if street is an empty string as back-end change null value to empty string for street (and streetNumber)
 | 
			
		||||
* [main] Address: stronger client-side validation of addresses (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/449)
 | 
			
		||||
* [person] accompanying course: filter suggested entities by open participations (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/415)
 | 
			
		||||
[activity] can click through the cross icon for removing person in concerned group (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/476)
 | 
			
		||||
[activity] correct associated persons by considering only open participations (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/476)
 | 
			
		||||
* [person_resources]: Renderboxes used to display person/thirdparty info (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/465)
 | 
			
		||||
* [Household]: Add end date in HouseholdMember form for 'enfant hors menage' (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/434)
 | 
			
		||||
* [homepage_widget]: If no sender then display as 'notification automatique' (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/435)
 | 
			
		||||
* [parcours]: Order social activities and only display most recent three in parcours resumé (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/481)
 | 
			
		||||
* [3party]: 3party: redirect to parent when contact (child) is opened in view page
 | 
			
		||||
* [parcours / addresses]: launch an event when a person change address (either through changing household or because the household is associated to a new address). If the person is localising a course, the course location go back to a temporarily address.
 | 
			
		||||
* [thirdparty]: address/phonenumber/email/fonction displayed in thirdpartyrenderbox (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/401)
 | 
			
		||||
* [thirdparty_contact]: in search results the 'qualité' is displayed (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/465)
 | 
			
		||||
* [bug]: fix confidential toggle of address in thirdpartyrenderbox (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/460)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### test release 2022-02-14
 | 
			
		||||
 | 
			
		||||
* AddPersons: remove ul-li html tags from AddPersons (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/419)
 | 
			
		||||
* [doc-generator] do not set required fields for mainPerson, person1, person2 (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement#456)
 | 
			
		||||
* [doc-generation] add age and obele in the mainPerson, person1 and person2 list + add obele in person renderString if addAge (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/370)
 | 
			
		||||
* [person] accompanying course work: fix on-the-fly update of thirdParty
 | 
			
		||||
* fix normalisation of accompanying course requestor api (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/378)
 | 
			
		||||
* [person] add a returnPath when clicking on some Person or ThirdParty badge (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/427)
 | 
			
		||||
* [person] accompanying course work: fix on-the-fly update of thirdParty
 | 
			
		||||
* [on-the-fly] close modal only after validation
 | 
			
		||||
* [person] correct thirdparty PATCH url + add email and altnames in AddPerson and serializer (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/433)
 | 
			
		||||
* change order for accompanying course work list
 | 
			
		||||
* [parcours]: Mes parcours brouillon added to user menu (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/440)
 | 
			
		||||
* [Documents]: List view adapted to display more information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/414)
 | 
			
		||||
* [person]: style fix in parcours listing per person. (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/432)
 | 
			
		||||
* [parcours]: Only the referrer can toggle the intensity of the parcours (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/442)
 | 
			
		||||
* [household]: display address of current household (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/415)
 | 
			
		||||
* ajoute un ordre dans les localisation (api)
 | 
			
		||||
* [pick entity]: fix translations in modal (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/419)
 | 
			
		||||
* [homepage_widget]: fix translation on emergency badge (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/440)
 | 
			
		||||
* [person]: create person and household added to button dropdown (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/454)
 | 
			
		||||
* display full address in address.text in normalization. Adapt AddressRenderBox
 | 
			
		||||
* [address]: Correction residential address 'depuis le' (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/459)
 | 
			
		||||
* [Documents]: List view adapted to display more information (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/414)
 | 
			
		||||
* [Thirdparty_contact]: address blurred if confidential in view page (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/450)
 | 
			
		||||
* [thirdparty] Add a contact to a thirdparty from within onTheFly (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/345)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### test release 2021-02-01
 | 
			
		||||
 | 
			
		||||
* renommer "dossier numéro" en "parcours numéro" dans les résultats de recherche
 | 
			
		||||
* renomme date de début en date d'ouverture dans le formulaire parcours
 | 
			
		||||
* [homepage widget] improve content tables, improve counter pluralization with style on number
 | 
			
		||||
* [notification lists] add comments counter information
 | 
			
		||||
* [workflows] fix popover header with previous transition
 | 
			
		||||
* [parcours]: validation + message for closing parcours adjusted.
 | 
			
		||||
* [household]: household composition double edit button replaced by a delete action (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/426)
 | 
			
		||||
[fast_actions] improve fast-actions buttons override mechanism, fix https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/413
 | 
			
		||||
[homepage widget] add vue homepage_widget with asynchone loading, give a global view resume of the user concerned actions, notifications, etc.
 | 
			
		||||
* [person]: Comment on marital status is possible even if marital status is not defined (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/421)
 | 
			
		||||
* [parcours]: In the list of person results the requestor is not displayed if defined as anonymous (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/424)
 | 
			
		||||
* [bugfix]: modal closes and newly created person/thirdparty is selected when multiple persons/thirdparties are created through the modal (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/429)
 | 
			
		||||
* [person_resource]: Onthefly button added to view person/thirdparty and badge differentiation for a contact-thirdparty (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/428)
 | 
			
		||||
* [workflow][notification] improve how notifications and workflows are 'attached' to entities: contextual list, counter, buttons and vue modal
 | 
			
		||||
* [AddAddress] disable multiselect search, and rely only on most pertinent Cities and Street computed backend
 | 
			
		||||
* [fast_actions] improve fast-actions buttons override mechanism, fix https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/413
 | 
			
		||||
* [homepage widget] add vue homepage_widget with asynchone loading, give a global view resume of the user concerned actions, notifications, etc.
 | 
			
		||||
* [thirdparty] Add a contact to a thirdparty from within onTheFly (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/345)
 | 
			
		||||
* [homepage widget] add vue homepage_widget with asynchone loading, give a global view resume of the user concerned actions, notifications, etc.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### test release 2021-01-31
 | 
			
		||||
 | 
			
		||||
[fast_actions] improve fast-actions buttons override mechanism, fix https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/413
 | 
			
		||||
[homepage widget] add vue homepage_widget with asynchone loading, give a global view resume of the user concerned actions, notifications, etc.  
 | 
			
		||||
* [person] accompanying course: optimisation: do not fetch some resources for the banner (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/409)
 | 
			
		||||
* [person] accompanying course: close modal when edit participation (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/420)
 | 
			
		||||
* [person] accompanying course: treat validation error when editing on-the-fly entities (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/420)
 | 
			
		||||
@@ -31,7 +233,6 @@ and this project adheres to
 | 
			
		||||
* [user]: page with accompanying periods to which is user is referent (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/408)
 | 
			
		||||
* [person] age added to renderstring + renderbox/ vue component created to display person text (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/389)
 | 
			
		||||
* [household member editor] allow to push to existing household
 | 
			
		||||
* [workflow][notification] improve how notifications and workflows are 'attached' to entities: contextual list, counter, buttons and vue modal
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### test release 2021-01-28
 | 
			
		||||
@@ -67,7 +268,7 @@ and this project adheres to
 | 
			
		||||
* [popover] add popover html popup mechanism (used by workflow breadcrumb)
 | 
			
		||||
* [templates] improve updatedBy macro in item metadatas
 | 
			
		||||
* [parcours]: bug fix when comment is pinned all other comments remain in the collection (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/385)
 | 
			
		||||
* [workflow] 
 | 
			
		||||
* [workflow]
 | 
			
		||||
  * add My workflow section with my opened subscriptions
 | 
			
		||||
  * apply workflow on documents, accompanyingCourseWork and Evaluations
 | 
			
		||||
* [wopi-link] a new vue component allow to open wopi link in a fullscreen chill-themed modal
 | 
			
		||||
@@ -225,6 +426,7 @@ and this project adheres to
 | 
			
		||||
* add an endpoint for checking permissions. See https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/232
 | 
			
		||||
* [activity] for a new activity: suggest and create on-the-fly locations based on the accompanying course location + location of the suggested parties
 | 
			
		||||
* [calendar] for a new rdv: suggest and create on-the-fly locations based on the accompanying course location + location of the suggested parties
 | 
			
		||||
* [period] Validation added when period is confidential and confirmed -> user cannot be null.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Test releases
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,8 @@
 | 
			
		||||
        "knplabs/knp-time-bundle": "^1.12",
 | 
			
		||||
        "league/csv": "^9.7.1",
 | 
			
		||||
        "nyholm/psr7": "^1.4",
 | 
			
		||||
        "ocramius/package-versions": "^1.10",
 | 
			
		||||
        "ocramius/package-versions": "^1.10 || ^2",
 | 
			
		||||
        "odolbeau/phone-number-bundle": "^3.6",
 | 
			
		||||
        "phpoffice/phpspreadsheet": "^1.16",
 | 
			
		||||
        "ramsey/uuid-doctrine": "^1.7",
 | 
			
		||||
        "sensio/framework-extra-bundle": "^5.5",
 | 
			
		||||
@@ -32,6 +33,7 @@
 | 
			
		||||
        "symfony/expression-language": "^4.4",
 | 
			
		||||
        "symfony/form": "^4.4",
 | 
			
		||||
        "symfony/framework-bundle": "^4.4",
 | 
			
		||||
        "symfony/http-foundation": "^4.4",
 | 
			
		||||
        "symfony/intl": "^4.4",
 | 
			
		||||
        "symfony/mailer": "^5.4",
 | 
			
		||||
        "symfony/mime": "^5.4",
 | 
			
		||||
@@ -102,7 +104,8 @@
 | 
			
		||||
            "ergebnis/composer-normalize": true,
 | 
			
		||||
            "ocramius/package-versions": true,
 | 
			
		||||
            "phpro/grumphp": true,
 | 
			
		||||
            "phpstan/extension-installer": true
 | 
			
		||||
            "phpstan/extension-installer": true,
 | 
			
		||||
            "roave/you-are-using-it-wrong": true
 | 
			
		||||
        },
 | 
			
		||||
        "bin-dir": "bin",
 | 
			
		||||
        "optimize-autoloader": true,
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ Then, render the pagination using the dedicated twig function.
 | 
			
		||||
 | 
			
		||||
   {% block title 'Item list'|trans %}
 | 
			
		||||
 | 
			
		||||
   {% block personcontent %}
 | 
			
		||||
   {% block content %}
 | 
			
		||||
 | 
			
		||||
   <table>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -156,7 +156,7 @@ This layout extend `ChillMainBundle::layoutWithVerticalMenu.html.twig` add the p
 | 
			
		||||
 | 
			
		||||
It proposes 1 new block :
 | 
			
		||||
 | 
			
		||||
* personcontent
 | 
			
		||||
* content
 | 
			
		||||
 | 
			
		||||
  * where to display the information of the person
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,11 +25,6 @@ parameters:
 | 
			
		||||
            count: 1
 | 
			
		||||
            path: src/Bundle/ChillActivityBundle/Repository/ActivityACLAwareRepository.php
 | 
			
		||||
 | 
			
		||||
        -
 | 
			
		||||
            message: "#^Access to an undefined property Chill\\\\PersonBundle\\\\Household\\\\MembersEditorFactory\\:\\:\\$validator\\.$#"
 | 
			
		||||
            count: 2
 | 
			
		||||
            path: src/Bundle/ChillPersonBundle/Household/MembersEditorFactory.php
 | 
			
		||||
 | 
			
		||||
        -
 | 
			
		||||
            message: "#^Variable variables are not allowed\\.$#"
 | 
			
		||||
            count: 4
 | 
			
		||||
 
 | 
			
		||||
@@ -105,15 +105,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillActivityBundle/Export/Export/ListActivity.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\ActivityBundle\\\\Export\\\\Export\\\\ListActivity\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillActivityBundle/Export/Export/ListActivity.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -141,15 +132,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillActivityBundle/Export/Export/StatActivityDuration.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\ActivityBundle\\\\Export\\\\Filter\\\\ActivityDateFilter\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillActivityBundle/Export/Filter/ActivityDateFilter.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -195,15 +177,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\ActivityBundle\\\\Export\\\\Filter\\\\PersonHavingActivityBetweenDateFilter\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillActivityBundle/Export/Filter/PersonHavingActivityBetweenDateFilter.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -213,15 +186,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillActivityBundle/Export/Filter/PersonHavingActivityBetweenDateFilter.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\ActivityBundle\\\\Menu\\\\PersonMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillActivityBundle/Menu/PersonMenuBuilder.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -258,78 +222,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillActivityBundle/Timeline/TimelineActivityProvider.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\AsideActivityBundle\\\\Menu\\\\UserMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillAsideActivityBundle/src/Menu/UserMenuBuilder.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Class Chill\\\\AMLI\\\\BudgetBundle\\\\Controller\\\\AbstractElementController extends deprecated class Symfony\\\\Bundle\\\\FrameworkBundle\\\\Controller\\\\Controller\\:
 | 
			
		||||
					since Symfony 4\\.2, use "Symfony\\\\Bundle\\\\FrameworkBundle\\\\Controller\\\\AbstractController" instead\\.$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillBudgetBundle/Controller/AbstractElementController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\AMLI\\\\BudgetBundle\\\\Controller\\\\AbstractElementController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillBudgetBundle/Controller/AbstractElementController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Class Chill\\\\AMLI\\\\BudgetBundle\\\\Controller\\\\ElementController extends deprecated class Symfony\\\\Bundle\\\\FrameworkBundle\\\\Controller\\\\Controller\\:
 | 
			
		||||
					since Symfony 4\\.2, use "Symfony\\\\Bundle\\\\FrameworkBundle\\\\Controller\\\\AbstractController" instead\\.$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillBudgetBundle/Controller/ElementController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\AMLI\\\\BudgetBundle\\\\Controller\\\\ElementController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillBudgetBundle/Controller/ElementController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\AMLI\\\\BudgetBundle\\\\Menu\\\\UserMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillBudgetBundle/Menu/UserMenuBuilder.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Instantiation of deprecated class Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role\\:
 | 
			
		||||
					since Symfony 4\\.3, to be removed in 5\\.0\\. Use strings as roles instead\\.$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillBudgetBundle/Security/Authorization/BudgetElementVoter.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\CalendarBundle\\\\Menu\\\\UserMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillCalendarBundle/Menu/UserMenuBuilder.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -399,33 +291,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillCustomFieldsBundle/Entity/CustomFieldsGroup.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\CustomFieldsBundle\\\\Form\\\\CustomFieldsGroupType\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillCustomFieldsBundle/Form/CustomFieldsGroupType.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Call to deprecated method getReachableScopes\\(\\) of class Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelper\\:
 | 
			
		||||
					Use getReachableCircles$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillDocStoreBundle/Controller/DocumentPersonController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\DocStoreBundle\\\\Controller\\\\DocumentPersonController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillDocStoreBundle/Controller/DocumentPersonController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -435,15 +300,6 @@ parameters:
 | 
			
		||||
			count: 6
 | 
			
		||||
			path: src/Bundle/ChillEventBundle/Controller/EventController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\EventBundle\\\\Controller\\\\EventController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillEventBundle/Controller/EventController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -462,42 +318,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillEventBundle/Form/Type/PickEventType.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\EventBundle\\\\Form\\\\Type\\\\PickEventType\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillEventBundle/Form/Type/PickEventType.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\EventBundle\\\\Form\\\\Type\\\\PickRoleType\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillEventBundle/Form/Type/PickRoleType.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\EventBundle\\\\Form\\\\Type\\\\PickStatusType\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillEventBundle/Form/Type/PickStatusType.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\EventBundle\\\\Menu\\\\PersonMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillEventBundle/Menu/PersonMenuBuilder.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -507,24 +327,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillEventBundle/Search/EventSearch.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\AMLI\\\\FamilyMembersBundle\\\\Controller\\\\FamilyMemberController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillFamilyMembersBundle/Controller/FamilyMemberController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\AMLI\\\\FamilyMembersBundle\\\\Menu\\\\UserMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillFamilyMembersBundle/Menu/UserMenuBuilder.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -534,24 +336,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillFamilyMembersBundle/Security/Voter/FamilyMemberVoter.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Fetching class constant class of deprecated class Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/CRUD/Controller/AbstractCRUDController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Fetching class constant class of deprecated class Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -561,15 +345,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Return type of method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\CRUDController\\:\\:getTranslator\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -588,24 +363,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Command/LoadCountriesCommand.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\MainBundle\\\\Controller\\\\ExportController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Controller/ExportController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\MainBundle\\\\Controller\\\\PasswordController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Controller/PasswordController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -678,42 +435,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Export/ExportManager.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translatorInterface of method Chill\\\\MainBundle\\\\Export\\\\Formatter\\\\CSVListFormatter\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Export/Formatter/CSVListFormatter.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translatorInterface of method Chill\\\\MainBundle\\\\Export\\\\Formatter\\\\CSVPivotedListFormatter\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Export/Formatter/CSVPivotedListFormatter.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translatorInterface of method Chill\\\\MainBundle\\\\Export\\\\Formatter\\\\SpreadSheetFormatter\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translatorInterface of method Chill\\\\MainBundle\\\\Export\\\\Formatter\\\\SpreadsheetListFormatter\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Export/Formatter/SpreadsheetListFormatter.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -732,15 +453,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Form/Event/CustomizeFormEvent.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\MainBundle\\\\Form\\\\Type\\\\PostalCodeType\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Form/Type/PostalCodeType.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -764,38 +476,11 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Form/UserType.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\MainBundle\\\\Notification\\\\Mailer\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Notification/Mailer.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message: "#^Only booleans are allowed in an if condition, mixed given\\.$#"
 | 
			
		||||
			count: 2
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Repository/NotificationRepository.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\MainBundle\\\\Routing\\\\MenuBuilder\\\\SectionMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Routing/MenuBuilder/SectionMenuBuilder.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\MainBundle\\\\Routing\\\\MenuComposer\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Routing/MenuComposer.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -882,15 +567,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Templating/Events/DelegatedBlockRenderingEvent.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\MainBundle\\\\Validation\\\\Validator\\\\RoleScopeScopePresence\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Validation/Validator/RoleScopeScopePresence.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -927,15 +603,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$trans of method Chill\\\\PersonBundle\\\\Controller\\\\AccompanyingCourseWorkController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseWorkController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -945,33 +612,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Controller\\\\HouseholdController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Controller/HouseholdController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Controller\\\\HouseholdMemberController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Controller\\\\PersonController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Controller/PersonController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -981,15 +621,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Controller/PersonDuplicateController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Controller\\\\PersonDuplicateController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Controller/PersonDuplicateController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message: "#^Access to deprecated property \\$proxyAccompanyingPeriodOpenState of class Chill\\\\PersonBundle\\\\Entity\\\\Person\\.$#"
 | 
			
		||||
			count: 2
 | 
			
		||||
@@ -1004,15 +635,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Export/Aggregator/AgeAggregator.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Export\\\\Aggregator\\\\CountryOfBirthAggregator\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Export/Aggregator/CountryOfBirthAggregator.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -1022,15 +644,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Export/Aggregator/CountryOfBirthAggregator.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Export\\\\Aggregator\\\\GenderAggregator\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Export/Aggregator/GenderAggregator.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -1040,15 +653,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Export/Aggregator/GenderAggregator.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Export\\\\Aggregator\\\\NationalityAggregator\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Export/Aggregator/NationalityAggregator.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -1085,15 +689,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Export/Export/ListPerson.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Export\\\\Export\\\\ListPerson\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Export/Export/ListPerson.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -1121,15 +716,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Export/Export/ListPersonDuplicate.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Export\\\\Export\\\\ListPersonDuplicate\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Export/Export/ListPersonDuplicate.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -1175,15 +761,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Export/Filter/BirthdateFilter.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Export\\\\Filter\\\\GenderFilter\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Export/Filter/GenderFilter.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -1225,24 +802,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Form/Type/PickPersonType.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Form\\\\Type\\\\PickPersonType\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Form/Type/PickPersonType.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\PersonBundle\\\\Menu\\\\SectionMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Menu/SectionMenuBuilder.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -1306,15 +865,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillReportBundle/Export/Export/ReportList.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\ReportBundle\\\\Export\\\\Export\\\\ReportList\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillReportBundle/Export/Export/ReportList.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -1324,15 +874,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillReportBundle/Export/Export/ReportList.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\ReportBundle\\\\Export\\\\Export\\\\ReportListProvider\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillReportBundle/Export/Export/ReportListProvider.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -1414,15 +955,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\TaskBundle\\\\Controller\\\\TaskController\\:\\:applyTransitionAction\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillTaskBundle/Controller/TaskController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -1468,33 +1000,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillTaskBundle/Form/SingleTaskType.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\TaskBundle\\\\Menu\\\\MenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillTaskBundle/Menu/MenuBuilder.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\TaskBundle\\\\Menu\\\\SectionMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillTaskBundle/Menu/SectionMenuBuilder.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\TaskBundle\\\\Menu\\\\UserMenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillTaskBundle/Menu/UserMenuBuilder.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
@@ -1531,33 +1036,6 @@ parameters:
 | 
			
		||||
			count: 3
 | 
			
		||||
			path: src/Bundle/ChillTaskBundle/Timeline/TaskLifeCycleEventTimelineProvider.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\ThirdPartyBundle\\\\Controller\\\\ThirdPartyController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillThirdPartyBundle/Controller/ThirdPartyController.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\ThirdPartyBundle\\\\Form\\\\Type\\\\PickThirdPartyType\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillThirdPartyBundle/Form/Type/PickThirdPartyType.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
					#^Parameter \\$translator of method Chill\\\\ThirdPartyBundle\\\\Menu\\\\MenuBuilder\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
 | 
			
		||||
					since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
 | 
			
		||||
				"""
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillThirdPartyBundle/Menu/MenuBuilder.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message:
 | 
			
		||||
				"""
 | 
			
		||||
 
 | 
			
		||||
@@ -250,11 +250,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Entity/Address.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Entity/Embeddable/CommentEmbeddable.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
 | 
			
		||||
			count: 1
 | 
			
		||||
@@ -295,11 +290,6 @@ parameters:
 | 
			
		||||
			count: 3
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Form/Type/DataTransformer/DateIntervalTransformer.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message: "#^Only booleans are allowed in a negated boolean, mixed given\\.$#"
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Form/Type/DataTransformer/ObjectToIdTransformer.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
 | 
			
		||||
			count: 2
 | 
			
		||||
@@ -325,11 +315,6 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Timeline/TimelineBuilder.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillMainBundle/Validation/Validator/ValidPhonenumber.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
 | 
			
		||||
			count: 1
 | 
			
		||||
@@ -360,11 +345,6 @@ parameters:
 | 
			
		||||
			count: 6
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Command/ImportPeopleFromCSVCommand.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
 | 
			
		||||
			count: 2
 | 
			
		||||
			path: src/Bundle/ChillPersonBundle/Entity/PersonPhone.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
 | 
			
		||||
			count: 1
 | 
			
		||||
@@ -470,18 +450,8 @@ parameters:
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillThirdPartyBundle/Repository/ThirdPartyRepository.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message: "#^Method Chill\\\\ThirdPartyBundle\\\\Search\\\\ThirdPartySearch\\:\\:renderResult\\(\\) should return string but return statement is missing\\.$#"
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillThirdPartyBundle/Search/ThirdPartySearch.php
 | 
			
		||||
 | 
			
		||||
		-
 | 
			
		||||
			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
 | 
			
		||||
			count: 1
 | 
			
		||||
			path: src/Bundle/ChillThirdPartyBundle/Templating/Entity/ThirdPartyRender.php
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<files psalm-version="v4.15.0@a1b5e489e6fcebe40cb804793d964e99fc347820">
 | 
			
		||||
<files psalm-version="4.18.0.0">
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Controller/ActivityReasonCategoryController.php">
 | 
			
		||||
    <UndefinedClass occurrences="4">
 | 
			
		||||
      <code>'ChillActivityBundle:ActivityReasonCategory'</code>
 | 
			
		||||
@@ -47,6 +47,11 @@
 | 
			
		||||
      <code>Activity[]|array</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Resources/test/Fixtures/App/app/AppKernel.php">
 | 
			
		||||
    <DuplicateClass occurrences="1">
 | 
			
		||||
      <code>AppKernel</code>
 | 
			
		||||
    </DuplicateClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Resources/test/Fixtures/App/app/autoload.php">
 | 
			
		||||
    <MissingFile occurrences="1">
 | 
			
		||||
      <code>require __DIR__ . '/../../../../../vendor/autoload.php'</code>
 | 
			
		||||
@@ -164,72 +169,18 @@
 | 
			
		||||
      <code>type</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Tests/Export/Aggregator/ActivityReasonAggregatorTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Tests/Export/Aggregator/ActivityTypeAggregatorTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Tests/Export/Aggregator/ActivityUserAggregatorTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Tests/Export/Export/CountActivityTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Tests/Export/Export/ListActivityTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Tests/Export/Export/StatActivityDurationSumTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Tests/Export/Filter/ActivityReasonFilterTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Tests/Export/Filter/PersonHavingActivityBetweenDateFilterTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedDocblockClass occurrences="1">
 | 
			
		||||
      <code>\Chill\PersonBundle\Export\Filter\PersonHavingActivityBetweenDateFilter</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Tests/Form/ActivityTypeTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Tests/Form/Type/TranslatableActivityReasonTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <TooFewArguments occurrences="2"/>
 | 
			
		||||
    <UndefinedDocblockClass occurrences="1">
 | 
			
		||||
      <code>Prophecy\Prophet</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Tests/Form/Type/TranslatableActivityTypeTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillActivityBundle/Tests/Security/Authorization/ActivityVoterTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedDocblockClass occurrences="1">
 | 
			
		||||
      <code>type</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
@@ -254,11 +205,6 @@
 | 
			
		||||
      <code>$asideActivityCategory</code>
 | 
			
		||||
    </ParamNameMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillAsideActivityBundle/src/Tests/Controller/AsideActivityControllerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillBudgetBundle/Calculator/CalculatorManager.php">
 | 
			
		||||
    <InvalidStaticInvocation occurrences="3">
 | 
			
		||||
      <code>$calculator::getAlias()</code>
 | 
			
		||||
@@ -288,11 +234,6 @@
 | 
			
		||||
      <code>'ChillCalendarBundle:Calendar'</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillCalendarBundle/Tests/Controller/CalendarControllerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillCustomFieldsBundle/Command/CreateFieldsOnGroupCommand.php">
 | 
			
		||||
    <UndefinedClass occurrences="1">
 | 
			
		||||
      <code>'ChillCustomFieldsBundle:CustomFieldsGroup'</code>
 | 
			
		||||
@@ -397,10 +338,6 @@
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillCustomFieldsBundle/Tests/CustomFields/CustomFieldsChoiceTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="2">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
      <code>public function tearDown()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedDocblockClass occurrences="4">
 | 
			
		||||
      <code>type</code>
 | 
			
		||||
      <code>type</code>
 | 
			
		||||
@@ -408,61 +345,6 @@
 | 
			
		||||
      <code>type</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillCustomFieldsBundle/Tests/CustomFields/CustomFieldsNumberTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillCustomFieldsBundle/Tests/CustomFields/CustomFieldsTextTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillCustomFieldsBundle/Tests/Form/Extension/PostTextIntegerExtensionTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillCustomFieldsBundle/Tests/Form/Extension/PostTextNumberExtensionTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillCustomFieldsBundle/Tests/Service/CustomFieldsHelperTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillCustomFieldsBundle/Tests/Templating/Twig/CustomFieldRenderingTwigTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillCustomFieldsBundle/Tests/Templating/Twig/CustomFieldsGroupRenderingTwigTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillDocGeneratorBundle/tests/Serializer/Encoder/DocGenEncoderTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillDocGeneratorBundle/tests/Serializer/Normalizer/DocGenObjectNormalizerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillDocGeneratorBundle/tests/Service/Context/BaseContextDataTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillDocStoreBundle/Controller/DocumentAccompanyingCourseController.php">
 | 
			
		||||
    <UndefinedClass occurrences="1">
 | 
			
		||||
      <code>'ChillDocStoreBundle:AccompanyingCourseDocument'</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillDocStoreBundle/Controller/DocumentCategoryController.php">
 | 
			
		||||
    <UndefinedClass occurrences="3">
 | 
			
		||||
      <code>'ChillDocStoreBundle:DocumentCategory'</code>
 | 
			
		||||
@@ -470,11 +352,6 @@
 | 
			
		||||
      <code>'ChillDocStoreBundle:DocumentCategory'</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillDocStoreBundle/Controller/DocumentPersonController.php">
 | 
			
		||||
    <UndefinedClass occurrences="1">
 | 
			
		||||
      <code>'ChillDocStoreBundle:PersonDocument'</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillDocStoreBundle/Entity/Document.php">
 | 
			
		||||
    <UndefinedDocblockClass occurrences="1">
 | 
			
		||||
      <code>\Chill\PersonBundle\Entity\user</code>
 | 
			
		||||
@@ -570,9 +447,6 @@
 | 
			
		||||
    <InvalidParamDefault occurrences="1">
 | 
			
		||||
      <code>type</code>
 | 
			
		||||
    </InvalidParamDefault>
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedClass occurrences="8">
 | 
			
		||||
      <code>'ChillEventBundle:Event'</code>
 | 
			
		||||
      <code>'ChillEventBundle:Event'</code>
 | 
			
		||||
@@ -588,10 +462,6 @@
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillEventBundle/Tests/Search/EventSearchTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="2">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
      <code>public function tearDown()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedClass occurrences="1">
 | 
			
		||||
      <code>'ChillMainBundle:Scope'</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
@@ -891,11 +761,6 @@
 | 
			
		||||
      <code>OptionsResolverInterface</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Notification/Mailer.php">
 | 
			
		||||
    <UndefinedDocblockClass occurrences="1">
 | 
			
		||||
      <code>\Symfony\Component\Mailer\Exception\TransportExceptionInterface</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Pagination/PageGenerator.php">
 | 
			
		||||
    <UndefinedVariable occurrences="1">
 | 
			
		||||
      <code>$current</code>
 | 
			
		||||
@@ -924,11 +789,6 @@
 | 
			
		||||
      <code>$onlyEnabled</code>
 | 
			
		||||
    </ParamNameMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Resources/test/Fixtures/App/app/AppKernel.php">
 | 
			
		||||
    <DuplicateClass occurrences="1">
 | 
			
		||||
      <code>AppKernel</code>
 | 
			
		||||
    </DuplicateClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Resources/test/Fixtures/App/app/autoload.php">
 | 
			
		||||
    <MissingFile occurrences="1">
 | 
			
		||||
      <code>require __DIR__ . '/../../../../../vendor/autoload.php'</code>
 | 
			
		||||
@@ -1056,158 +916,15 @@
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Test/Export/AbstractFilterTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedDocblockClass occurrences="1">
 | 
			
		||||
      <code>type</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Authorization/ParentRoleHelperTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Controller/AddressControllerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Controller/UserControllerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="2">
 | 
			
		||||
      <code>protected function tearDown()</code>
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Export/ExportManagerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="2">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
      <code>public function tearDown()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedDocblockClass occurrences="40">
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>$this->prophet</code>
 | 
			
		||||
      <code>Prophecy\Prophet</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Form/Type/PickCenterTypeTest.php">
 | 
			
		||||
    <UndefinedClass occurrences="1">
 | 
			
		||||
      <code>CenterType</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
    <UndefinedDocblockClass occurrences="1">
 | 
			
		||||
      <code>CenterType</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Pagination/PageTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Pagination/PaginatorTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Routing/Loader/RouteLoaderTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Search/AbstractSearchTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Search/SearchProviderTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedDocblockClass occurrences="1">
 | 
			
		||||
      <code>unknown</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Security/Authorization/AuthorizationHelperTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Security/PasswordRecover/TokenManagerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Security/Resolver/CenterResolverDispatcherTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Security/Resolver/DefaultScopeResolverTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Security/Resolver/ScopeResolverDispatcherTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Serializer/Normalizer/DateNormalizerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Serializer/Normalizer/DoctrineExistingEntityNormalizerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Services/MenuComposerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Tests/Templating/Entity/AddressRenderTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillMainBundle/Timeline/TimelineBuilder.php">
 | 
			
		||||
    <UndefinedDocblockClass occurrences="1">
 | 
			
		||||
      <code>unknown</code>
 | 
			
		||||
@@ -1412,20 +1129,6 @@
 | 
			
		||||
      <code>OptionsResolverInterface</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkRepository.php">
 | 
			
		||||
    <UndefinedClass occurrences="6">
 | 
			
		||||
      <code>$qb</code>
 | 
			
		||||
      <code>$qb</code>
 | 
			
		||||
      <code>$qb</code>
 | 
			
		||||
      <code>QueryBuilder</code>
 | 
			
		||||
      <code>SocialAction</code>
 | 
			
		||||
      <code>SocialAction</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
    <UndefinedVariable occurrences="2">
 | 
			
		||||
      <code>$action</code>
 | 
			
		||||
      <code>$orderBy</code>
 | 
			
		||||
    </UndefinedVariable>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Resources/test/Fixtures/App/app/AppKernel.php">
 | 
			
		||||
    <DuplicateClass occurrences="1">
 | 
			
		||||
      <code>AppKernel</code>
 | 
			
		||||
@@ -1505,33 +1208,13 @@
 | 
			
		||||
    </ParamNameMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/AccompanyingPeriod/AccompanyingPeriodConfidentialTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="2">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
      <code>public static function setUpBeforeClass()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedClass occurrences="2">
 | 
			
		||||
      <code>AccompanyingPeriodRepository</code>
 | 
			
		||||
      <code>stdClass</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingCourseApiControllerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="2">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
      <code>public static function setUpBeforeClass()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingCourseControllerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Controller/AccompanyingPeriodControllerTest.php">
 | 
			
		||||
    <InvalidThrow occurrences="1"/>
 | 
			
		||||
    <MethodSignatureMismatch occurrences="3">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
      <code>public function tearDown()</code>
 | 
			
		||||
      <code>public static function setUpBeforeClass()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedClass occurrences="3">
 | 
			
		||||
      <code>'ChillMainBundle:Center'</code>
 | 
			
		||||
      <code>'ChillPersonBundle:AccompanyingPeriod\ClosingMotive'</code>
 | 
			
		||||
@@ -1543,40 +1226,19 @@
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdApiControllerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function tearDown()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedClass occurrences="1">
 | 
			
		||||
      <code>User</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdControllerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Controller/PersonAddressControllerTest.php">
 | 
			
		||||
    <InvalidScope occurrences="1">
 | 
			
		||||
      <code>$this</code>
 | 
			
		||||
    </InvalidScope>
 | 
			
		||||
    <MethodSignatureMismatch occurrences="2">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
      <code>public static function setUpBeforeClass()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedClass occurrences="1">
 | 
			
		||||
      <code>'ChillPersonBundle:Person'</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerCreateTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public static function tearDownAfterClass()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerUpdateTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="2">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
      <code>public function tearDown()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedClass occurrences="2">
 | 
			
		||||
      <code>'ChillMainBundle:Country'</code>
 | 
			
		||||
      <code>'ChillPersonBundle:Person'</code>
 | 
			
		||||
@@ -1586,140 +1248,25 @@
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerUpdateWithHiddenFieldsTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="2">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
      <code>public function tearDown()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedClass occurrences="2">
 | 
			
		||||
      <code>'ChillMainBundle:Country'</code>
 | 
			
		||||
      <code>'ChillPersonBundle:Person'</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerViewTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="2">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
      <code>public function tearDown()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedClass occurrences="1">
 | 
			
		||||
      <code>'ChillPersonBundle:Person'</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Controller/PersonControllerViewWithHiddenFieldsTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="2">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
      <code>public function tearDown()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedClass occurrences="1">
 | 
			
		||||
      <code>'ChillPersonBundle:Person'</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Controller/PersonDuplicateControllerViewTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Controller/RelationshipApiControllerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Controller/SocialIssueApiControllerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriodTest.php">
 | 
			
		||||
    <AssignmentToVoid occurrences="1">
 | 
			
		||||
      <code>$participationL</code>
 | 
			
		||||
    </AssignmentToVoid>
 | 
			
		||||
    <NullReference occurrences="1">
 | 
			
		||||
      <code>getEndDate</code>
 | 
			
		||||
    </NullReference>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/AgeAggregatorTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/GenderAggregatorTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/NationalityAggregatorTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Export/Export/CountPersonTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Export/Export/ListPersonTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Export/Filter/AccompanyingPeriodFilterTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Export/Filter/BirthdayFilterTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Export/Filter/GenderFilterTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Form/Type/PickPersonTypeTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Household/MembersEditorTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Security/Authorization/PersonVoterTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/AccompanyingPeriodWorkDocGenNormalizerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/HouseholdNormalizerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/PersonDocGenNormalizerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Serializer/Normalizer/PersonJsonNormalizerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Validator/Person/PersonValidationTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Tests/Workflows/AccompanyingPeriodLifecycle.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillPersonBundle/Timeline/AbstractTimelineAccompanyingPeriod.php">
 | 
			
		||||
    <UndefinedClass occurrences="1">
 | 
			
		||||
@@ -1820,20 +1367,13 @@
 | 
			
		||||
      <code>require __DIR__ . '/../../../../../vendor/autoload.php'</code>
 | 
			
		||||
    </MissingFile>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillReportBundle/Tests/Controller/ReportControllerNextTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillReportBundle/Tests/Controller/ReportControllerTest.php">
 | 
			
		||||
    <InvalidParamDefault occurrences="1">
 | 
			
		||||
      <code>type</code>
 | 
			
		||||
    </InvalidParamDefault>
 | 
			
		||||
    <MethodSignatureMismatch occurrences="2">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
      <code>public static function setUpBeforeClass()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedDocblockClass occurrences="29">
 | 
			
		||||
    <UndefinedDocblockClass occurrences="31">
 | 
			
		||||
      <code>$client</code>
 | 
			
		||||
      <code>$client</code>
 | 
			
		||||
      <code>$client</code>
 | 
			
		||||
      <code>$client</code>
 | 
			
		||||
      <code>$client</code>
 | 
			
		||||
@@ -1865,16 +1405,7 @@
 | 
			
		||||
      <code>type</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillReportBundle/Tests/DependencyInjection/ChillReportExtensionTest.php">
 | 
			
		||||
    <UndefinedClass occurrences="1">
 | 
			
		||||
      <code>Exception</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillReportBundle/Tests/Security/Authorization/ReportVoterTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="2">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
      <code>public static function setUpBeforeClass()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedDocblockClass occurrences="3">
 | 
			
		||||
      <code>type</code>
 | 
			
		||||
      <code>type</code>
 | 
			
		||||
@@ -1882,10 +1413,6 @@
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillReportBundle/Tests/Timeline/TimelineProviderTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="2">
 | 
			
		||||
      <code>public function setUp()</code>
 | 
			
		||||
      <code>public function tearDown()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
    <UndefinedClass occurrences="1">
 | 
			
		||||
      <code>'ChillCustomFieldsBundle:CustomFieldsGroup'</code>
 | 
			
		||||
    </UndefinedClass>
 | 
			
		||||
@@ -1958,11 +1485,6 @@
 | 
			
		||||
      <code>CacheItempPoolInterface</code>
 | 
			
		||||
    </UndefinedDocblockClass>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillTaskBundle/Tests/Controller/SingleTaskControllerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillThirdPartyBundle/DependencyInjection/CompilerPass/ThirdPartyTypeCompilerPass.php">
 | 
			
		||||
    <UndefinedClass occurrences="1">
 | 
			
		||||
      <code>$taggedService->getClass()::getKey()</code>
 | 
			
		||||
@@ -1988,11 +1510,6 @@
 | 
			
		||||
      <code>$thirdParty</code>
 | 
			
		||||
    </ParamNameMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillThirdPartyBundle/Tests/Serializer/Normalizer/ThirdPartyJsonDenormalizerTest.php">
 | 
			
		||||
    <MethodSignatureMismatch occurrences="1">
 | 
			
		||||
      <code>protected function setUp()</code>
 | 
			
		||||
    </MethodSignatureMismatch>
 | 
			
		||||
  </file>
 | 
			
		||||
  <file src="src/Bundle/ChillWopiBundle/src/Service/Wopi/ChillDocumentManager.php">
 | 
			
		||||
    <UndefinedDocblockClass occurrences="6">
 | 
			
		||||
      <code>$object</code>
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,7 @@ use Psr\Log\LoggerInterface;
 | 
			
		||||
use RuntimeException;
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | 
			
		||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
 | 
			
		||||
use Symfony\Component\Form\FormInterface;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
@@ -178,14 +179,15 @@ final class ActivityController extends AbstractController
 | 
			
		||||
    {
 | 
			
		||||
        $view = null;
 | 
			
		||||
 | 
			
		||||
        [$person, $accompanyingPeriod] = $this->getEntity($request);
 | 
			
		||||
 | 
			
		||||
        $entity = $this->activityRepository->find($id);
 | 
			
		||||
 | 
			
		||||
        if (null === $entity) {
 | 
			
		||||
            throw $this->createNotFoundException('Unable to find Activity entity.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $accompanyingPeriod = $entity->getAccompanyingPeriod();
 | 
			
		||||
        $person = $entity->getPerson();
 | 
			
		||||
 | 
			
		||||
        if ($entity->getAccompanyingPeriod() instanceof AccompanyingPeriod) {
 | 
			
		||||
            $view = 'ChillActivityBundle:Activity:editAccompanyingCourse.html.twig';
 | 
			
		||||
            $accompanyingPeriod = $entity->getAccompanyingPeriod();
 | 
			
		||||
@@ -200,17 +202,42 @@ final class ActivityController extends AbstractController
 | 
			
		||||
            'role' => new Role('CHILL_ACTIVITY_UPDATE'),
 | 
			
		||||
            'activityType' => $entity->getActivityType(),
 | 
			
		||||
            'accompanyingPeriod' => $accompanyingPeriod,
 | 
			
		||||
        ])->handleRequest($request);
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        if ($form->has('documents')) {
 | 
			
		||||
            $form->add('gendocTemplateId', HiddenType::class, [
 | 
			
		||||
                'mapped' => false,
 | 
			
		||||
                'data' => null,
 | 
			
		||||
                'attr' => [
 | 
			
		||||
                    // required for js
 | 
			
		||||
                    'data-template-id' => 'data-template-id',
 | 
			
		||||
                ],
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $form->handleRequest($request);
 | 
			
		||||
 | 
			
		||||
        if ($form->isSubmitted() && $form->isValid()) {
 | 
			
		||||
            $this->entityManager->persist($entity);
 | 
			
		||||
            $this->entityManager->flush();
 | 
			
		||||
 | 
			
		||||
            $this->addFlash('success', $this->get('translator')->trans('Success : activity updated!'));
 | 
			
		||||
 | 
			
		||||
            $params = $this->buildParamsToUrl($person, $accompanyingPeriod);
 | 
			
		||||
            $params['id'] = $entity->getId();
 | 
			
		||||
 | 
			
		||||
            if ($form->has('gendocTemplateId') && null !== $form['gendocTemplateId']->getData()) {
 | 
			
		||||
                return $this->redirectToRoute(
 | 
			
		||||
                    'chill_docgenerator_generate_from_template',
 | 
			
		||||
                    [
 | 
			
		||||
                        'template' => $form->get('gendocTemplateId')->getData(),
 | 
			
		||||
                        'entityClassName' => Activity::class,
 | 
			
		||||
                        'entityId' => $entity->getId(),
 | 
			
		||||
                        'returnPath' => $this->generateUrl('chill_activity_activity_edit', $params),
 | 
			
		||||
                    ]
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $this->addFlash('success', $this->get('translator')->trans('Success : activity updated!'));
 | 
			
		||||
 | 
			
		||||
            return $this->redirectToRoute('chill_activity_activity_show', $params);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -393,12 +420,39 @@ final class ActivityController extends AbstractController
 | 
			
		||||
            'role' => new Role('CHILL_ACTIVITY_CREATE'),
 | 
			
		||||
            'activityType' => $entity->getActivityType(),
 | 
			
		||||
            'accompanyingPeriod' => $accompanyingPeriod,
 | 
			
		||||
        ])->handleRequest($request);
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        if ($form->has('documents')) {
 | 
			
		||||
            $form->add('gendocTemplateId', HiddenType::class, [
 | 
			
		||||
                'mapped' => false,
 | 
			
		||||
                'data' => null,
 | 
			
		||||
                'attr' => [
 | 
			
		||||
                    // required for js
 | 
			
		||||
                    'data-template-id' => 'data-template-id',
 | 
			
		||||
                ],
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $form->handleRequest($request);
 | 
			
		||||
 | 
			
		||||
        if ($form->isSubmitted() && $form->isValid()) {
 | 
			
		||||
            $this->entityManager->persist($entity);
 | 
			
		||||
            $this->entityManager->flush();
 | 
			
		||||
 | 
			
		||||
            if ($form->has('gendocTemplateId') && null !== $form['gendocTemplateId']->getData()) {
 | 
			
		||||
                return $this->redirectToRoute(
 | 
			
		||||
                    'chill_docgenerator_generate_from_template',
 | 
			
		||||
                    [
 | 
			
		||||
                        'template' => $form->get('gendocTemplateId')->getData(),
 | 
			
		||||
                        'entityClassName' => Activity::class,
 | 
			
		||||
                        'entityId' => $entity->getId(),
 | 
			
		||||
                        'returnPath' => $this->generateUrl('chill_activity_activity_edit', [
 | 
			
		||||
                            'id' => $entity->getId(),
 | 
			
		||||
                        ]),
 | 
			
		||||
                    ]
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $this->addFlash('success', $this->get('translator')->trans('Success : activity created!'));
 | 
			
		||||
 | 
			
		||||
            $params = $this->buildParamsToUrl($person, $accompanyingPeriod);
 | 
			
		||||
 
 | 
			
		||||
@@ -231,11 +231,22 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
 | 
			
		||||
    {
 | 
			
		||||
        if (!$this->socialActions->contains($socialAction)) {
 | 
			
		||||
            $this->socialActions[] = $socialAction;
 | 
			
		||||
            $this->ensureSocialActionConsistency();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Add a social issue.
 | 
			
		||||
     *
 | 
			
		||||
     * Note: the social issue consistency (the fact that only yougest social issues
 | 
			
		||||
     * are kept) is processed by an entity listener:
 | 
			
		||||
     *
 | 
			
		||||
     * @see{\Chill\PersonBundle\AccompanyingPeriod\SocialIssueConsistency\AccompanyingPeriodSocialIssueConsistencyEntityListener}
 | 
			
		||||
     *
 | 
			
		||||
     * @return $this
 | 
			
		||||
     */
 | 
			
		||||
    public function addSocialIssue(SocialIssue $socialIssue): self
 | 
			
		||||
    {
 | 
			
		||||
        if (!$this->socialIssues->contains($socialIssue)) {
 | 
			
		||||
@@ -357,7 +368,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
 | 
			
		||||
        if (null !== $this->accompanyingPeriod) {
 | 
			
		||||
            $personsAssociated = [];
 | 
			
		||||
 | 
			
		||||
            foreach ($this->accompanyingPeriod->getParticipations() as $participation) {
 | 
			
		||||
            foreach ($this->accompanyingPeriod->getOpenParticipations() as $participation) {
 | 
			
		||||
                if ($this->persons->contains($participation->getPerson())) {
 | 
			
		||||
                    $personsAssociated[] = $participation->getPerson();
 | 
			
		||||
                }
 | 
			
		||||
@@ -631,4 +642,13 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function ensureSocialActionConsistency(): void
 | 
			
		||||
    {
 | 
			
		||||
        $ancestors = SocialAction::findAncestorSocialActions($this->getSocialActions());
 | 
			
		||||
 | 
			
		||||
        foreach ($ancestors as $ancestor) {
 | 
			
		||||
            $this->removeSocialAction($ancestor);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -271,7 +271,7 @@ class ActivityType
 | 
			
		||||
    public function checkSocialActionsVisibility(ExecutionContextInterface $context, $payload)
 | 
			
		||||
    {
 | 
			
		||||
        if ($this->socialIssuesVisible !== $this->socialActionsVisible) {
 | 
			
		||||
            if (!($this->socialIssuesVisible === 2 && $this->socialActionsVisible === 1)) {
 | 
			
		||||
            if (!(2 === $this->socialIssuesVisible && 1 === $this->socialActionsVisible)) {
 | 
			
		||||
                $context
 | 
			
		||||
                    ->buildViolation('The socialActionsVisible value is not compatible with the socialIssuesVisible value')
 | 
			
		||||
                    ->atPath('socialActionsVisible')
 | 
			
		||||
 
 | 
			
		||||
@@ -66,9 +66,6 @@ class ActivityEntityListener
 | 
			
		||||
                    $newAction->addPerson($person);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                foreach ($associatedThirdparties as $thirdparty) {
 | 
			
		||||
                    $newAction->setHandlingThierparty($thirdparty);
 | 
			
		||||
                }
 | 
			
		||||
                $this->em->persist($newAction);
 | 
			
		||||
                $this->em->flush();
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -24,9 +24,9 @@ use Doctrine\ORM\Query;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Symfony\Component\Translation\TranslatorInterface;
 | 
			
		||||
use Symfony\Component\Validator\Constraints\Callback;
 | 
			
		||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
 | 
			
		||||
use Symfony\Contracts\Translation\TranslatorInterface;
 | 
			
		||||
 | 
			
		||||
use function array_key_exists;
 | 
			
		||||
use function count;
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\Form\FormError;
 | 
			
		||||
use Symfony\Component\Form\FormEvent;
 | 
			
		||||
use Symfony\Component\Form\FormEvents;
 | 
			
		||||
use Symfony\Component\Translation\TranslatorInterface;
 | 
			
		||||
use Symfony\Contracts\Translation\TranslatorInterface;
 | 
			
		||||
 | 
			
		||||
class ActivityDateFilter implements FilterInterface
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -29,8 +29,8 @@ use Symfony\Component\Form\FormError;
 | 
			
		||||
use Symfony\Component\Form\FormEvent;
 | 
			
		||||
use Symfony\Component\Form\FormEvents;
 | 
			
		||||
use Symfony\Component\Form\FormInterface;
 | 
			
		||||
use Symfony\Component\Translation\TranslatorInterface;
 | 
			
		||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
 | 
			
		||||
use Symfony\Contracts\Translation\TranslatorInterface;
 | 
			
		||||
 | 
			
		||||
use function count;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -125,7 +125,9 @@ class ActivityType extends AbstractType
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('socialIssues') && $accompanyingPeriod) {
 | 
			
		||||
            $builder->add('socialIssues', HiddenType::class);
 | 
			
		||||
            $builder->add('socialIssues', HiddenType::class, [
 | 
			
		||||
                'required' => $activityType->getSocialIssuesVisible() === 2,
 | 
			
		||||
            ]);
 | 
			
		||||
            $builder->get('socialIssues')
 | 
			
		||||
                ->addModelTransformer(new CallbackTransformer(
 | 
			
		||||
                    static function (iterable $socialIssuesAsIterable): string {
 | 
			
		||||
@@ -151,7 +153,9 @@ class ActivityType extends AbstractType
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('socialActions') && $accompanyingPeriod) {
 | 
			
		||||
            $builder->add('socialActions', HiddenType::class);
 | 
			
		||||
            $builder->add('socialActions', HiddenType::class, [
 | 
			
		||||
                'required' => $activityType->getSocialActionsVisible() === 2,
 | 
			
		||||
            ]);
 | 
			
		||||
            $builder->get('socialActions')
 | 
			
		||||
                ->addModelTransformer(new CallbackTransformer(
 | 
			
		||||
                    static function (iterable $socialActionsAsIterable): string {
 | 
			
		||||
@@ -305,6 +309,7 @@ class ActivityType extends AbstractType
 | 
			
		||||
                'label' => $activityType->getLabel('documents'),
 | 
			
		||||
                'required' => $activityType->isRequired('documents'),
 | 
			
		||||
                'allow_add' => true,
 | 
			
		||||
                'allow_delete' => true,
 | 
			
		||||
                'button_add_label' => 'activity.Insert a document',
 | 
			
		||||
                'button_remove_label' => 'activity.Remove a document',
 | 
			
		||||
                'empty_collection_explain' => 'No documents',
 | 
			
		||||
@@ -338,7 +343,9 @@ class ActivityType extends AbstractType
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($activityType->isVisible('location')) {
 | 
			
		||||
            $builder->add('location', HiddenType::class)
 | 
			
		||||
            $builder->add('location', HiddenType::class, [
 | 
			
		||||
                'required' => $activityType->getLocationVisible() === 2,
 | 
			
		||||
            ])
 | 
			
		||||
                ->get('location')
 | 
			
		||||
                ->addModelTransformer(new CallbackTransformer(
 | 
			
		||||
                    static function (?Location $location): string {
 | 
			
		||||
@@ -366,8 +373,8 @@ class ActivityType extends AbstractType
 | 
			
		||||
                'label' => $activityType->getLabel('sentReceived'),
 | 
			
		||||
                'required' => $activityType->isRequired('sentReceived'),
 | 
			
		||||
                'choices' => [
 | 
			
		||||
                    'Sent' => Activity::SENTRECEIVED_SENT,
 | 
			
		||||
                    'Received' => Activity::SENTRECEIVED_RECEIVED,
 | 
			
		||||
                    'Sent' => Activity::SENTRECEIVED_SENT,
 | 
			
		||||
                ],
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
 | 
			
		||||
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
 | 
			
		||||
use Knp\Menu\MenuItem;
 | 
			
		||||
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
 | 
			
		||||
use Symfony\Component\Translation\TranslatorInterface;
 | 
			
		||||
use Symfony\Contracts\Translation\TranslatorInterface;
 | 
			
		||||
 | 
			
		||||
class PersonMenuBuilder implements LocalMenuBuilderInterface
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -12,13 +12,20 @@ declare(strict_types=1);
 | 
			
		||||
namespace Chill\ActivityBundle\Repository;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\Activity;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityPresence;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityType;
 | 
			
		||||
use Chill\ActivityBundle\Security\Authorization\ActivityVoter;
 | 
			
		||||
use Chill\MainBundle\Entity\Location;
 | 
			
		||||
use Chill\MainBundle\Entity\LocationType;
 | 
			
		||||
use Chill\MainBundle\Entity\Scope;
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
 | 
			
		||||
use Chill\MainBundle\Security\Resolver\CenterResolverDispatcherInterface;
 | 
			
		||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use Doctrine\DBAL\Types\Types;
 | 
			
		||||
use Doctrine\ORM\AbstractQuery;
 | 
			
		||||
use Doctrine\ORM\EntityManagerInterface;
 | 
			
		||||
use Doctrine\ORM\Query\ResultSetMappingBuilder;
 | 
			
		||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Symfony\Component\Security\Core\Security;
 | 
			
		||||
@@ -72,6 +79,86 @@ final class ActivityACLAwareRepository implements ActivityACLAwareRepositoryInte
 | 
			
		||||
            ->findByAccompanyingPeriod($period, $scopes, true, $limit, $start, $orderBy);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function findByAccompanyingPeriodSimplified(AccompanyingPeriod $period, ?int $limit = 1000): array
 | 
			
		||||
    {
 | 
			
		||||
        $rsm = new ResultSetMappingBuilder($this->em);
 | 
			
		||||
 | 
			
		||||
        $sql = '
 | 
			
		||||
        SELECT
 | 
			
		||||
            a.id AS activity_id,
 | 
			
		||||
            date,
 | 
			
		||||
            CASE WHEN durationtime IS NOT NULL THEN (EXTRACT(EPOCH from durationtime) / 60)::int ELSE 0 END AS durationtimeminute,
 | 
			
		||||
            attendee_id,
 | 
			
		||||
            comment_comment,
 | 
			
		||||
            emergency,
 | 
			
		||||
            sentreceived,
 | 
			
		||||
            CASE WHEN traveltime IS NOT NULL THEN (EXTRACT(EPOCH from traveltime) / 60)::int ELSE 0 END AS traveltimeminute,
 | 
			
		||||
            t.id AS type_id, t.name as type_name,
 | 
			
		||||
            p.id AS presence_id, p.name AS presence_name,
 | 
			
		||||
            location.id AS location_id, location.address_id, location.name AS location_name, location.phonenumber1, location.phonenumber2, location.email,
 | 
			
		||||
            location.locationtype_id, locationtype.title AS locationtype_title,
 | 
			
		||||
            users.userids AS userids,
 | 
			
		||||
            thirdparties.thirdpartyids,
 | 
			
		||||
            persons.personids,
 | 
			
		||||
            actions.socialactionids,
 | 
			
		||||
            issues.socialissueids
 | 
			
		||||
 | 
			
		||||
        FROM activity a
 | 
			
		||||
        LEFT JOIN chill_main_location location ON a.location_id = location.id
 | 
			
		||||
        LEFT JOIN chill_main_location_type locationtype ON location.locationtype_id = locationtype.id
 | 
			
		||||
        LEFT JOIN activitytpresence p ON a.attendee_id = p.id
 | 
			
		||||
        LEFT JOIN activitytype t ON a.type_id = t.id
 | 
			
		||||
        LEFT JOIN LATERAL (SELECT jsonb_agg(user_id) userids, activity_id FROM activity_user AS au WHERE a.id = au.activity_id GROUP BY activity_id) AS users ON TRUE
 | 
			
		||||
        LEFT JOIN LATERAL (SELECT jsonb_agg(thirdparty_id) thirdpartyids, activity_id FROM activity_thirdparty AS au WHERE a.id = au.activity_id GROUP BY activity_id) AS thirdparties ON TRUE
 | 
			
		||||
        LEFT JOIN LATERAL (SELECT jsonb_agg(person_id) personids, activity_id FROM activity_person AS au WHERE a.id = au.activity_id GROUP BY activity_id) AS persons ON TRUE
 | 
			
		||||
        LEFT JOIN LATERAL (SELECT jsonb_agg(socialaction_id) socialactionids, activity_id FROM chill_activity_activity_chill_person_socialaction AS au WHERE a.id = au.activity_id GROUP BY activity_id) AS actions ON TRUE
 | 
			
		||||
        LEFT JOIN LATERAL (SELECT jsonb_agg(socialissue_id) socialissueids, activity_id FROM chill_activity_activity_chill_person_socialissue AS au WHERE a.id = au.activity_id GROUP BY activity_id) AS issues ON TRUE
 | 
			
		||||
 | 
			
		||||
        WHERE accompanyingperiod_id = ?
 | 
			
		||||
        ORDER BY a.date DESC, a.id DESC
 | 
			
		||||
        LIMIT ?
 | 
			
		||||
        ';
 | 
			
		||||
 | 
			
		||||
        $rsm
 | 
			
		||||
            ->addEntityResult(Activity::class, 'a')
 | 
			
		||||
            ->addFieldResult('a', 'activity_id', 'id')
 | 
			
		||||
            ->addFieldResult('a', 'date', 'date')
 | 
			
		||||
            ->addFieldResult('a', 'comment', 'comment')
 | 
			
		||||
            ->addFieldResult('a', 'sentreceived', 'sentReceived')
 | 
			
		||||
            ->addFieldResult('a', 'emergency', 'emergency')
 | 
			
		||||
            ->addJoinedEntityResult(Location::class, 'location', 'a', 'location')
 | 
			
		||||
            ->addFieldResult('location', 'location_id', 'id')
 | 
			
		||||
            ->addFieldResult('location', 'location_name', 'name')
 | 
			
		||||
            ->addFieldResult('location', 'phonenumber1', 'phonenumber1')
 | 
			
		||||
            ->addFieldResult('location', 'phonenumber2', 'phonenumber2')
 | 
			
		||||
            ->addFieldResult('location', 'email', 'email')
 | 
			
		||||
            ->addJoinedEntityResult(LocationType::class, 'locationType', 'location', 'locationType')
 | 
			
		||||
            ->addFieldResult('locationType', 'locationtype_id', 'id')
 | 
			
		||||
            ->addFieldResult('locationType', 'locationtype_title', 'title')
 | 
			
		||||
            ->addJoinedEntityResult(ActivityType::class, 'activityType', 'a', 'activityType')
 | 
			
		||||
            ->addFieldResult('activityType', 'type_id', 'id')
 | 
			
		||||
            ->addFieldResult('activityType', 'type_name', 'name')
 | 
			
		||||
            ->addJoinedEntityResult(ActivityPresence::class, 'activityPresence', 'a', 'attendee')
 | 
			
		||||
            ->addFieldResult('activityPresence', 'presence_id', 'id')
 | 
			
		||||
            ->addFieldResult('activityPresence', 'presence_name', 'name')
 | 
			
		||||
 | 
			
		||||
            // results which cannot be mapped into entity
 | 
			
		||||
            ->addScalarResult('comment_comment', 'comment', Types::TEXT)
 | 
			
		||||
            ->addScalarResult('userids', 'userIds', Types::JSON)
 | 
			
		||||
            ->addScalarResult('thirdpartyids', 'thirdPartyIds', Types::JSON)
 | 
			
		||||
            ->addScalarResult('personids', 'personIds', Types::JSON)
 | 
			
		||||
            ->addScalarResult('socialactionids', 'socialActionIds', Types::JSON)
 | 
			
		||||
            ->addScalarResult('socialissueids', 'socialIssueIds', Types::JSON)
 | 
			
		||||
            ->addScalarResult('durationtimeminute', 'durationTimeMinute', Types::INTEGER)
 | 
			
		||||
            ->addScalarResult('traveltimeminute', 'travelTimeMinute', Types::INTEGER);
 | 
			
		||||
 | 
			
		||||
        $nq = $this->em->createNativeQuery($sql, $rsm);
 | 
			
		||||
 | 
			
		||||
        $nq->setParameter(0, $period->getId())->setParameter(1, $limit);
 | 
			
		||||
 | 
			
		||||
        return $nq->getResult(AbstractQuery::HYDRATE_ARRAY);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param array $orderBy
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,15 @@ interface ActivityACLAwareRepositoryInterface
 | 
			
		||||
     */
 | 
			
		||||
    public function findByAccompanyingPeriod(AccompanyingPeriod $period, string $role, ?int $start = 0, ?int $limit = 1000, ?array $orderBy = []): array;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return a list of activities, simplified as array (not object).
 | 
			
		||||
     *
 | 
			
		||||
     * The aim of this method is to get a long list of activities and keep performance.
 | 
			
		||||
     *
 | 
			
		||||
     * @return array an array of array, each item representing an activity
 | 
			
		||||
     */
 | 
			
		||||
    public function findByAccompanyingPeriodSimplified(AccompanyingPeriod $period, ?int $limit = 1000): array;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return Activity[]|array
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,23 @@
 | 
			
		||||
div.chill-dropzone__below-zone {
 | 
			
		||||
    a.btn-delete {
 | 
			
		||||
        display: none;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ul[data-collection-name="documents"] {
 | 
			
		||||
    button.remove-entry {
 | 
			
		||||
        margin: 0.5rem 0!important;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// do it in js does not work
 | 
			
		||||
// document.addEventListener('DOMContentLoaded', e => {
 | 
			
		||||
//     const dropzoneBelow = document.querySelectorAll('div.chill-dropzone__below-zone');
 | 
			
		||||
//     dropzoneBelow.forEach(
 | 
			
		||||
//         d => {
 | 
			
		||||
//             const a = d.querySelector('a.btn-delete');
 | 
			
		||||
//             d.removeChild(a);
 | 
			
		||||
//         }
 | 
			
		||||
//     )
 | 
			
		||||
// });
 | 
			
		||||
@@ -19,14 +19,18 @@
 | 
			
		||||
         </ul>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <add-persons
 | 
			
		||||
         buttonTitle="activity.add_persons"
 | 
			
		||||
         modalTitle="activity.add_persons"
 | 
			
		||||
         v-bind:key="addPersons.key"
 | 
			
		||||
         v-bind:options="addPersonsOptions"
 | 
			
		||||
         @addNewPersons="addNewPersons"
 | 
			
		||||
         ref="addPersons">
 | 
			
		||||
      </add-persons>
 | 
			
		||||
      <ul class="record_actions">
 | 
			
		||||
         <li class="add-persons">
 | 
			
		||||
            <add-persons
 | 
			
		||||
               buttonTitle="activity.add_persons"
 | 
			
		||||
               modalTitle="activity.add_persons"
 | 
			
		||||
               v-bind:key="addPersons.key"
 | 
			
		||||
               v-bind:options="addPersonsOptions"
 | 
			
		||||
               @addNewPersons="addNewPersons"
 | 
			
		||||
               ref="addPersons">
 | 
			
		||||
            </add-persons>
 | 
			
		||||
         </li>
 | 
			
		||||
      </ul>
 | 
			
		||||
 | 
			
		||||
   </teleport>
 | 
			
		||||
</template>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
<template>
 | 
			
		||||
   <li>
 | 
			
		||||
      <span :title="person.text">
 | 
			
		||||
         <span class="chill_denomination" @click.prevent="$emit('remove', person)">
 | 
			
		||||
      <span :title="person.text" @click.prevent="$emit('remove', person)">
 | 
			
		||||
         <span class="chill_denomination">
 | 
			
		||||
            <person-text :person="person" :isCut="true"></person-text>
 | 
			
		||||
         </span>
 | 
			
		||||
      </span>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <teleport to="#location">
 | 
			
		||||
        <div class="mb-3 row">
 | 
			
		||||
            <label class="col-form-label col-sm-4">
 | 
			
		||||
            <label :class="locationClassList">
 | 
			
		||||
                {{ $t("activity.location") }}
 | 
			
		||||
            </label>
 | 
			
		||||
            <div class="col-sm-8">
 | 
			
		||||
@@ -41,6 +41,12 @@ export default {
 | 
			
		||||
        NewLocation,
 | 
			
		||||
        VueMultiselect,
 | 
			
		||||
    },
 | 
			
		||||
    data() {
 | 
			
		||||
        return {
 | 
			
		||||
            locationClassList:
 | 
			
		||||
               `col-form-label col-sm-4 ${document.querySelector('input#chill_activitybundle_activity_location').getAttribute('required') ? 'required' : ''}`,
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    computed: {
 | 
			
		||||
        ...mapState(["activity", "availableLocations"]),
 | 
			
		||||
        ...mapGetters(["suggestedEntities"]),
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,12 @@
 | 
			
		||||
                </template>
 | 
			
		||||
                <template v-slot:body>
 | 
			
		||||
                    <form>
 | 
			
		||||
                        <div class="alert alert-warning" v-if="errors.length">
 | 
			
		||||
                            <ul>
 | 
			
		||||
                                <li v-for="(e, i) in errors" :key="i">{{ e }}</li>
 | 
			
		||||
                            </ul>
 | 
			
		||||
                        </div>
 | 
			
		||||
 | 
			
		||||
                        <div class="form-floating mb-3">
 | 
			
		||||
                            <select class="form-select form-select-lg" id="type" required v-model="selectType">
 | 
			
		||||
                                <option selected disabled value="">{{ $t('activity.choose_location_type') }}</option>
 | 
			
		||||
@@ -54,11 +60,6 @@
 | 
			
		||||
                            <label for="email">{{ $t('activity.location_fields.email') }}</label>
 | 
			
		||||
                        </div>
 | 
			
		||||
 | 
			
		||||
                        <div class="alert alert-warning" v-if="errors.length">
 | 
			
		||||
                            <ul>
 | 
			
		||||
                                <li v-for="(e, i) in errors" :key="i">{{ e }}</li>
 | 
			
		||||
                            </ul>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </form>
 | 
			
		||||
                </template>
 | 
			
		||||
                <template v-slot:footer>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
 | 
			
		||||
      <div class="mb-3 row">
 | 
			
		||||
         <div class="col-4">
 | 
			
		||||
            <label class="col-form-label">{{ $t('activity.social_issues') }}</label>
 | 
			
		||||
            <label :class="socialIssuesClassList">{{ $t('activity.social_issues') }}</label>
 | 
			
		||||
         </div>
 | 
			
		||||
         <div class="col-8">
 | 
			
		||||
 | 
			
		||||
@@ -42,7 +42,7 @@
 | 
			
		||||
 | 
			
		||||
      <div class="mb-3 row">
 | 
			
		||||
         <div class="col-4">
 | 
			
		||||
            <label class="col-form-label">{{ $t('activity.social_actions') }}</label>
 | 
			
		||||
            <label :class="socialActionsClassList">{{ $t('activity.social_actions') }}</label>
 | 
			
		||||
         </div>
 | 
			
		||||
         <div class="col-8">
 | 
			
		||||
 | 
			
		||||
@@ -54,19 +54,19 @@
 | 
			
		||||
               {{ $t('activity.select_first_a_social_issue') }}
 | 
			
		||||
            </span>
 | 
			
		||||
 | 
			
		||||
             <template v-else-if="socialActionsList.length > 0">
 | 
			
		||||
                 <check-social-action
 | 
			
		||||
                     v-if="socialIssuesSelected.length || socialActionsSelected.length"
 | 
			
		||||
                     v-for="action in socialActionsList"
 | 
			
		||||
                     :key="action.id"
 | 
			
		||||
                     :action="action"
 | 
			
		||||
                     :selection="socialActionsSelected"
 | 
			
		||||
                     @updateSelected="updateActionsSelected">
 | 
			
		||||
                 </check-social-action>
 | 
			
		||||
             </template>
 | 
			
		||||
            <template v-else-if="socialActionsList.length > 0">
 | 
			
		||||
               <check-social-action
 | 
			
		||||
                  v-if="socialIssuesSelected.length || socialActionsSelected.length"
 | 
			
		||||
                  v-for="action in socialActionsList"
 | 
			
		||||
                  :key="action.id"
 | 
			
		||||
                  :action="action"
 | 
			
		||||
                  :selection="socialActionsSelected"
 | 
			
		||||
                  @updateSelected="updateActionsSelected">
 | 
			
		||||
               </check-social-action>
 | 
			
		||||
            </template>
 | 
			
		||||
 | 
			
		||||
            <span v-else-if="actionAreLoaded && socialActionsList.length === 0" class="inline-choice chill-no-data-statement mt-3">
 | 
			
		||||
                {{ $t('activity.social_action_list_empty') }}
 | 
			
		||||
               {{ $t('activity.social_action_list_empty') }}
 | 
			
		||||
            </span>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -94,6 +94,10 @@ export default {
 | 
			
		||||
         issueIsLoading: false,
 | 
			
		||||
         actionIsLoading: false,
 | 
			
		||||
         actionAreLoaded: false,
 | 
			
		||||
         socialIssuesClassList:
 | 
			
		||||
            `col-form-label ${document.querySelector('input#chill_activitybundle_activity_socialIssues').getAttribute('required') ? 'required' : ''}`,
 | 
			
		||||
         socialActionsClassList:
 | 
			
		||||
            `col-form-label ${document.querySelector('input#chill_activitybundle_activity_socialActions').getAttribute('required') ? 'required' : ''}`,
 | 
			
		||||
      }
 | 
			
		||||
   },
 | 
			
		||||
   computed: {
 | 
			
		||||
@@ -107,7 +111,7 @@ export default {
 | 
			
		||||
         return this.$store.state.socialIssuesOther;
 | 
			
		||||
      },
 | 
			
		||||
      socialActionsList() {
 | 
			
		||||
         return this.$store.state.socialActionsList;
 | 
			
		||||
         return this.$store.getters.socialActionsListSorted;
 | 
			
		||||
      },
 | 
			
		||||
      socialActionsSelected() {
 | 
			
		||||
         return this.$store.state.activity.socialActions;
 | 
			
		||||
 
 | 
			
		||||
@@ -2,11 +2,15 @@ import { createApp } from 'vue';
 | 
			
		||||
import { _createI18n } from 'ChillMainAssets/vuejs/_js/i18n'
 | 
			
		||||
import { activityMessages } from './i18n'
 | 
			
		||||
import store from './store'
 | 
			
		||||
import PickTemplate from 'ChillDocGeneratorAssets/vuejs/_components/PickTemplate.vue';
 | 
			
		||||
import {fetchTemplates} from 'ChillDocGeneratorAssets/api/pickTemplate.js';
 | 
			
		||||
 | 
			
		||||
import App from './App.vue';
 | 
			
		||||
 | 
			
		||||
const i18n = _createI18n(activityMessages);
 | 
			
		||||
 | 
			
		||||
// app for activity
 | 
			
		||||
 | 
			
		||||
const hasSocialIssues = document.querySelector('#social-issues-acc') !== null;
 | 
			
		||||
const hasLocation = document.querySelector('#location') !== null;
 | 
			
		||||
const hasPerson = document.querySelector('#add-persons') !== null;
 | 
			
		||||
@@ -29,3 +33,54 @@ const app = createApp({
 | 
			
		||||
.use(i18n)
 | 
			
		||||
.component('app', App)
 | 
			
		||||
.mount('#activity');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// app for picking template
 | 
			
		||||
 | 
			
		||||
const i18nGendoc = _createI18n({});
 | 
			
		||||
 | 
			
		||||
document.querySelectorAll('div[data-docgen-template-picker]').forEach(el => {
 | 
			
		||||
    fetchTemplates(el.dataset.entityClass).then(templates => {
 | 
			
		||||
        const picker = {
 | 
			
		||||
            template:
 | 
			
		||||
                '<pick-template :templates="this.templates" :preventDefaultMoveToGenerate="true" ' +
 | 
			
		||||
                    ':entityClass="faked" @go-to-generate-document="generateDoc"></pick-template>',
 | 
			
		||||
            components: {
 | 
			
		||||
                PickTemplate,
 | 
			
		||||
            },
 | 
			
		||||
            data() {
 | 
			
		||||
                return {
 | 
			
		||||
                    templates: templates,
 | 
			
		||||
                    entityId: el.dataset.entityId,
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            methods: {
 | 
			
		||||
                generateDoc({event, link, template}) {
 | 
			
		||||
                    console.log('generateDoc');
 | 
			
		||||
                    console.log('link', link);
 | 
			
		||||
                    console.log('template', template);
 | 
			
		||||
 | 
			
		||||
                    let hiddenInput = document.querySelector("input[data-template-id]");
 | 
			
		||||
 | 
			
		||||
                    if (hiddenInput === null) {
 | 
			
		||||
                        console.error('hidden input not found');
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    hiddenInput.value = template;
 | 
			
		||||
 | 
			
		||||
                    let form = document.querySelector('form[name="chill_activitybundle_activity"');
 | 
			
		||||
 | 
			
		||||
                    if (form === null) {
 | 
			
		||||
                        console.error('form not found');
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    form.submit();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        createApp(picker).use(i18nGendoc).mount(el);
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -101,6 +101,9 @@ const store = createStore({
 | 
			
		||||
                            state.activity.activityType.thirdPartiesVisible !== 0)
 | 
			
		||||
                );
 | 
			
		||||
        },
 | 
			
		||||
        socialActionsListSorted(state) {
 | 
			
		||||
            return [ ...state.socialActionsList].sort((a, b) => a.ordering - b.ordering);
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    mutations: {
 | 
			
		||||
        // SocialIssueAcc
 | 
			
		||||
@@ -131,7 +134,6 @@ const store = createStore({
 | 
			
		||||
            state.socialActionsList = [];
 | 
			
		||||
        },
 | 
			
		||||
        addActionInList(state, action) {
 | 
			
		||||
            //console.log('add action list', action.id);
 | 
			
		||||
            state.socialActionsList.push(action);
 | 
			
		||||
        },
 | 
			
		||||
        updateActionsSelected(state, actions) {
 | 
			
		||||
 
 | 
			
		||||
@@ -110,10 +110,8 @@ export default function prepareLocations(store) {
 | 
			
		||||
        console.log('default loation id', window.default_location_id);
 | 
			
		||||
        if (window.default_location_id) {
 | 
			
		||||
            for (let group of store.state.availableLocations) {
 | 
			
		||||
                console.log(group);
 | 
			
		||||
                let location = group.locations.find((l) => l.id === window.default_location_id);
 | 
			
		||||
                console.log(location);
 | 
			
		||||
                if (location !== undefined) {
 | 
			
		||||
                if (location !== undefined & store.state.activity.location === null) {
 | 
			
		||||
                    store.dispatch('updateLocation', location);
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -68,7 +68,7 @@
 | 
			
		||||
                    <div class="wl-col title"><h3>{{ 'Referrer'|trans }}</h3></div>
 | 
			
		||||
                    <div class="wl-col list">
 | 
			
		||||
                        <p class="wl-item">
 | 
			
		||||
                            {{ activity.user|chill_entity_render_string|capitalize }}
 | 
			
		||||
                            {{ activity.user|chill_entity_render_box }}
 | 
			
		||||
                        </p>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
 | 
			
		||||
{% block title  'Remove activity'|trans %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
{% block content %}
 | 
			
		||||
{{ include('@ChillMain/Util/confirmation_template.html.twig',
 | 
			
		||||
    {
 | 
			
		||||
        'title'             : 'Remove activity'|trans,
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,7 @@
 | 
			
		||||
    {{ form_row(edit_form.socialActions) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.socialIssues is defined or edit_form.socialIssues is defined -%}
 | 
			
		||||
{%- if edit_form.socialIssues is defined or edit_form.socialActions is defined -%}
 | 
			
		||||
<div id="social-issues-acc"></div>
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
@@ -89,9 +89,9 @@
 | 
			
		||||
 | 
			
		||||
{%- if edit_form.documents is defined -%}
 | 
			
		||||
    {{ form_row(edit_form.documents) }}
 | 
			
		||||
    <div data-docgen-template-picker="data-docgen-template-picker" data-entity-class="Chill\ActivityBundle\Entity\Activity" data-entity-id="{{ entity.id }}"></div>
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
<div data-docgen-template-picker="data-docgen-template-picker" data-entity-class="Chill\ActivityBundle\Entity\Activity" data-entity-id="{{ entity.id }}"></div>
 | 
			
		||||
 | 
			
		||||
{% set person_id = null %}
 | 
			
		||||
{% if entity.person %}
 | 
			
		||||
 
 | 
			
		||||
@@ -24,12 +24,11 @@
 | 
			
		||||
        window.activity = {{ activity_json|json_encode|raw }};
 | 
			
		||||
    </script>
 | 
			
		||||
    {{ encore_entry_script_tags('vue_activity') }}
 | 
			
		||||
    {{ encore_entry_script_tags('mod_docgen_picktemplate') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block css %}
 | 
			
		||||
    {{ parent() }}
 | 
			
		||||
    {{ encore_entry_link_tags('mod_async_upload') }}
 | 
			
		||||
    {{ encore_entry_link_tags('vue_activity') }}
 | 
			
		||||
    {{ encore_entry_link_tags('mod_docgen_picktemplate') }}
 | 
			
		||||
    {{ encore_entry_link_tags('page_edit_activity') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
 | 
			
		||||
{% block title  'Update activity'|trans %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
{% block content %}
 | 
			
		||||
<div class="activity-edit">
 | 
			
		||||
 | 
			
		||||
    <div id="activity"></div> {# <=== vue component #}
 | 
			
		||||
@@ -39,11 +39,9 @@
 | 
			
		||||
        window.activity = {{ activity_json|json_encode|raw }};
 | 
			
		||||
    </script>
 | 
			
		||||
    {{ encore_entry_script_tags('vue_activity') }}
 | 
			
		||||
    {{ encore_entry_script_tags('mod_docgen_picktemplate') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block css %}
 | 
			
		||||
    {{ encore_entry_link_tags('mod_async_upload') }}
 | 
			
		||||
    {{ encore_entry_link_tags('vue_activity') }}
 | 
			
		||||
    {{ encore_entry_link_tags('mod_docgen_picktemplate') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@
 | 
			
		||||
    {{ encore_entry_link_tags('mod_notification_toggle_read_status') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
{% block content %}
 | 
			
		||||
 | 
			
		||||
    {% set person_id = null %}
 | 
			
		||||
    {% if person %}
 | 
			
		||||
@@ -46,7 +46,7 @@
 | 
			
		||||
 | 
			
		||||
    {% include 'ChillActivityBundle:Activity:list.html.twig' with {'context': 'person'} %}
 | 
			
		||||
 | 
			
		||||
    {% if is_granted('CHILL_ACTIVITY_CREATE', person) %}
 | 
			
		||||
    {% if is_granted('CHILL_ACTIVITY_CREATE_PERSON', person) %}
 | 
			
		||||
    <ul class="record_actions sticky-form-buttons">
 | 
			
		||||
        <li>
 | 
			
		||||
            <a href="{{ path('chill_activity_activity_new', {'person_id': person_id, 'accompanying_period_id': accompanying_course_id}) }}"
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@
 | 
			
		||||
                        <p class="date-label">{{ activity.date|format_date('short') }}</p>
 | 
			
		||||
                    {%- endif -%}
 | 
			
		||||
 | 
			
		||||
                    <span class="like-h3">{{ activity.type.name | localize_translatable_string }}</span>
 | 
			
		||||
                    <span class="like-h3">{{ activity.type.name|localize_translatable_string }}</span>
 | 
			
		||||
 | 
			
		||||
                    {% if activity.emergency %}
 | 
			
		||||
                        <span class="badge bg-danger rounded-pill fs-6">{{ 'Emergency'|trans|upper }}</span>
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
                        {% if activity.user and t.userVisible %}
 | 
			
		||||
                            <li>
 | 
			
		||||
                                <span class="item-key">{{ 'Referrer'|trans ~ ': ' }}</span>
 | 
			
		||||
                                <b>{{ activity.user.usernameCanonical }}</b>
 | 
			
		||||
                                <b>{{ activity.user|chill_entity_render_box}}</b>
 | 
			
		||||
                            </li>
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,7 @@
 | 
			
		||||
    {{ form_row(form.socialActions) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if form.socialIssues is defined or form.socialIssues is defined -%}
 | 
			
		||||
{%- if form.socialIssues is defined or form.socialActions is defined -%}
 | 
			
		||||
    <div id="social-issues-acc"></div>
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
@@ -85,14 +85,15 @@
 | 
			
		||||
    {{ form_row(form.comment) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if form.documents is defined -%}
 | 
			
		||||
    {{ form_row(form.documents) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if form.attendee is defined -%}
 | 
			
		||||
    {{ form_row(form.attendee) }}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{%- if form.documents is defined -%}
 | 
			
		||||
    {{ form_row(form.documents) }}
 | 
			
		||||
    <div data-docgen-template-picker="data-docgen-template-picker" data-entity-class="Chill\ActivityBundle\Entity\Activity" data-entity-id="{{ entity.id }}"></div>
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{# TODO .. status #}
 | 
			
		||||
 | 
			
		||||
<ul class="record_actions sticky-form-buttons">
 | 
			
		||||
 
 | 
			
		||||
@@ -17,10 +17,6 @@
 | 
			
		||||
    {{ parent() }}
 | 
			
		||||
    {{ encore_entry_script_tags('mod_async_upload') }}
 | 
			
		||||
    <script type="text/javascript">
 | 
			
		||||
        window.addEventListener('DOMContentLoaded', function (e) {
 | 
			
		||||
            chill.displayAlertWhenLeavingUnsubmittedForm('form[name="{{ form.vars.form.vars.name }}"]',
 | 
			
		||||
            '{{ "You are going to leave a page with unsubmitted data. Are you sure you want to leave ?"|trans }}');
 | 
			
		||||
        });
 | 
			
		||||
        window.activity = {{ activity_json|json_encode|raw }};
 | 
			
		||||
        {% if default_location is not null %}window.default_location_id = {{ default_location.id }}{% endif %};
 | 
			
		||||
    </script>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
{% block title 'Activity creation' |trans %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
{% block content %}
 | 
			
		||||
<div class="activity-new">
 | 
			
		||||
 | 
			
		||||
    <div id="activity"></div> {# <=== vue component #}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,6 @@
 | 
			
		||||
 | 
			
		||||
{% block title 'Activity creation'|trans %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
{% block content %}
 | 
			
		||||
    {% include 'ChillActivityBundle:Activity:selectType.html.twig' %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 
 | 
			
		||||
@@ -18,11 +18,11 @@
 | 
			
		||||
 | 
			
		||||
{% import 'ChillActivityBundle:ActivityReason:macro.html.twig' as m %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent -%}
 | 
			
		||||
{% block content -%}
 | 
			
		||||
<div class="activity-show">
 | 
			
		||||
    {% include 'ChillActivityBundle:Activity:show.html.twig' with {'context': 'person'} %}
 | 
			
		||||
</div>
 | 
			
		||||
{% endblock personcontent %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block block_post_menu %}
 | 
			
		||||
    <div class="post-menu pt-4">
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block layout_wvm_content %}
 | 
			
		||||
    {% block admin_content %}<!-- block personcontent empty -->
 | 
			
		||||
    {% block admin_content %}<!-- block content empty -->
 | 
			
		||||
        <h1>{{ 'Activity configuration' |trans }}</h1>
 | 
			
		||||
    {% endblock %}
 | 
			
		||||
{% endblock  %}
 | 
			
		||||
@@ -17,13 +17,12 @@ use Chill\DocGeneratorBundle\Context\DocGeneratorContextWithPublicFormInterface;
 | 
			
		||||
use Chill\DocGeneratorBundle\Context\Exception\UnexpectedTypeException;
 | 
			
		||||
use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate;
 | 
			
		||||
use Chill\DocGeneratorBundle\Service\Context\BaseContextData;
 | 
			
		||||
use Chill\DocStoreBundle\Entity\Document;
 | 
			
		||||
use Chill\DocStoreBundle\Entity\StoredObject;
 | 
			
		||||
use Chill\DocStoreBundle\Repository\DocumentCategoryRepository;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
 | 
			
		||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use Chill\PersonBundle\Templating\Entity\PersonRender;
 | 
			
		||||
use Chill\PersonBundle\Templating\Entity\PersonRenderInterface;
 | 
			
		||||
use Doctrine\ORM\EntityManagerInterface;
 | 
			
		||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
 | 
			
		||||
@@ -44,7 +43,7 @@ class ActivityContext implements
 | 
			
		||||
 | 
			
		||||
    private NormalizerInterface $normalizer;
 | 
			
		||||
 | 
			
		||||
    private PersonRender $personRender;
 | 
			
		||||
    private PersonRenderInterface $personRender;
 | 
			
		||||
 | 
			
		||||
    private TranslatableStringHelperInterface $translatableStringHelper;
 | 
			
		||||
 | 
			
		||||
@@ -55,7 +54,7 @@ class ActivityContext implements
 | 
			
		||||
        NormalizerInterface $normalizer,
 | 
			
		||||
        TranslatableStringHelperInterface $translatableStringHelper,
 | 
			
		||||
        EntityManagerInterface $em,
 | 
			
		||||
        PersonRender $personRender,
 | 
			
		||||
        PersonRenderInterface $personRender,
 | 
			
		||||
        TranslatorInterface $translator,
 | 
			
		||||
        BaseContextData $baseContextData
 | 
			
		||||
    ) {
 | 
			
		||||
@@ -210,11 +209,8 @@ class ActivityContext implements
 | 
			
		||||
     */
 | 
			
		||||
    public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void
 | 
			
		||||
    {
 | 
			
		||||
        $doc = new StoredObject();
 | 
			
		||||
        // TODO push document to remote
 | 
			
		||||
        $entity->addDocument($storedObject);
 | 
			
		||||
 | 
			
		||||
        $this->em->persist($doc);
 | 
			
		||||
 | 
			
		||||
        $entity->addDocument($doc);
 | 
			
		||||
        $this->em->persist($storedObject);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,286 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Service\DocGenerator;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityPresence;
 | 
			
		||||
use Chill\ActivityBundle\Entity\ActivityType;
 | 
			
		||||
use Chill\ActivityBundle\Repository\ActivityACLAwareRepositoryInterface;
 | 
			
		||||
use Chill\DocGeneratorBundle\Context\DocGeneratorContextWithAdminFormInterface;
 | 
			
		||||
use Chill\DocGeneratorBundle\Context\DocGeneratorContextWithPublicFormInterface;
 | 
			
		||||
use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate;
 | 
			
		||||
use Chill\DocStoreBundle\Entity\StoredObject;
 | 
			
		||||
use Chill\MainBundle\Entity\Location;
 | 
			
		||||
use Chill\MainBundle\Entity\User;
 | 
			
		||||
use Chill\MainBundle\Repository\UserRepository;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
 | 
			
		||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use Chill\PersonBundle\Entity\SocialWork\SocialAction;
 | 
			
		||||
use Chill\PersonBundle\Entity\SocialWork\SocialIssue;
 | 
			
		||||
use Chill\PersonBundle\Repository\PersonRepository;
 | 
			
		||||
use Chill\PersonBundle\Repository\SocialWork\SocialActionRepository;
 | 
			
		||||
use Chill\PersonBundle\Repository\SocialWork\SocialIssueRepository;
 | 
			
		||||
use Chill\PersonBundle\Service\DocGenerator\AccompanyingPeriodContext;
 | 
			
		||||
use Chill\ThirdPartyBundle\Entity\ThirdParty;
 | 
			
		||||
use Chill\ThirdPartyBundle\Repository\ThirdPartyRepository;
 | 
			
		||||
use DateTime;
 | 
			
		||||
use libphonenumber\PhoneNumber;
 | 
			
		||||
use Symfony\Component\Form\FormBuilderInterface;
 | 
			
		||||
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
 | 
			
		||||
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
 | 
			
		||||
 | 
			
		||||
class ListActivitiesByAccompanyingPeriodContext implements
 | 
			
		||||
    DocGeneratorContextWithAdminFormInterface,
 | 
			
		||||
    DocGeneratorContextWithPublicFormInterface
 | 
			
		||||
{
 | 
			
		||||
    private AccompanyingPeriodContext $accompanyingPeriodContext;
 | 
			
		||||
 | 
			
		||||
    private ActivityACLAwareRepositoryInterface $activityACLAwareRepository;
 | 
			
		||||
 | 
			
		||||
    private NormalizerInterface $normalizer;
 | 
			
		||||
 | 
			
		||||
    private PersonRepository $personRepository;
 | 
			
		||||
 | 
			
		||||
    private SocialActionRepository $socialActionRepository;
 | 
			
		||||
 | 
			
		||||
    private SocialIssueRepository $socialIssueRepository;
 | 
			
		||||
 | 
			
		||||
    private ThirdPartyRepository $thirdPartyRepository;
 | 
			
		||||
 | 
			
		||||
    private TranslatableStringHelperInterface $translatableStringHelper;
 | 
			
		||||
 | 
			
		||||
    private UserRepository $userRepository;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        AccompanyingPeriodContext $accompanyingPeriodContext,
 | 
			
		||||
        ActivityACLAwareRepositoryInterface $activityACLAwareRepository,
 | 
			
		||||
        NormalizerInterface $normalizer,
 | 
			
		||||
        PersonRepository $personRepository,
 | 
			
		||||
        SocialActionRepository $socialActionRepository,
 | 
			
		||||
        SocialIssueRepository $socialIssueRepository,
 | 
			
		||||
        ThirdPartyRepository $thirdPartyRepository,
 | 
			
		||||
        TranslatableStringHelperInterface $translatableStringHelper,
 | 
			
		||||
        UserRepository $userRepository
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->accompanyingPeriodContext = $accompanyingPeriodContext;
 | 
			
		||||
        $this->activityACLAwareRepository = $activityACLAwareRepository;
 | 
			
		||||
        $this->normalizer = $normalizer;
 | 
			
		||||
        $this->personRepository = $personRepository;
 | 
			
		||||
        $this->socialActionRepository = $socialActionRepository;
 | 
			
		||||
        $this->socialIssueRepository = $socialIssueRepository;
 | 
			
		||||
        $this->thirdPartyRepository = $thirdPartyRepository;
 | 
			
		||||
        $this->translatableStringHelper = $translatableStringHelper;
 | 
			
		||||
        $this->userRepository = $userRepository;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function adminFormReverseTransform(array $data): array
 | 
			
		||||
    {
 | 
			
		||||
        return $this->accompanyingPeriodContext->adminFormReverseTransform($data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function adminFormTransform(array $data): array
 | 
			
		||||
    {
 | 
			
		||||
        return $this->accompanyingPeriodContext->adminFormTransform($data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function buildAdminForm(FormBuilderInterface $builder): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->accompanyingPeriodContext->buildAdminForm($builder);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->accompanyingPeriodContext->buildPublicForm($builder, $template, $entity);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array
 | 
			
		||||
    {
 | 
			
		||||
        $data = $this->accompanyingPeriodContext->getData($template, $entity, $contextGenerationData);
 | 
			
		||||
 | 
			
		||||
        $data['activities'] = $this->getActivitiesSimplified($entity);
 | 
			
		||||
 | 
			
		||||
        return $data;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getDescription(): string
 | 
			
		||||
    {
 | 
			
		||||
        return 'docgen.Accompanying period with a list of activities description';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getEntityClass(): string
 | 
			
		||||
    {
 | 
			
		||||
        return AccompanyingPeriod::class;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getFormData(DocGeneratorTemplate $template, $entity): array
 | 
			
		||||
    {
 | 
			
		||||
        return $this->accompanyingPeriodContext->getFormData($template, $entity);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static function getKey(): string
 | 
			
		||||
    {
 | 
			
		||||
        return self::class;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getName(): string
 | 
			
		||||
    {
 | 
			
		||||
        return 'docgen.Accompanying period with a list of activities';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function hasAdminForm(): bool
 | 
			
		||||
    {
 | 
			
		||||
        return $this->accompanyingPeriodContext->hasAdminForm();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function hasPublicForm(DocGeneratorTemplate $template, $entity): bool
 | 
			
		||||
    {
 | 
			
		||||
        return $this->accompanyingPeriodContext->hasPublicForm($template, $entity);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void
 | 
			
		||||
    {
 | 
			
		||||
        $this->accompanyingPeriodContext->storeGenerated($template, $storedObject, $entity, $contextGenerationData);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function getActivitiesSimplified(AccompanyingPeriod $period)
 | 
			
		||||
    {
 | 
			
		||||
        $activities =
 | 
			
		||||
            $this->activityACLAwareRepository->findByAccompanyingPeriodSimplified($period);
 | 
			
		||||
        $results = [];
 | 
			
		||||
 | 
			
		||||
        foreach ($activities as $row) {
 | 
			
		||||
            $activity = $row[0];
 | 
			
		||||
 | 
			
		||||
            $activity['date'] = $this->normalizer->normalize($activity['date'], 'docgen', [
 | 
			
		||||
                AbstractNormalizer::GROUPS => ['docgen:read'], 'docgen:expects' => DateTime::class,
 | 
			
		||||
            ]);
 | 
			
		||||
 | 
			
		||||
            if (null === $activity['location']) {
 | 
			
		||||
                $activity['location'] = $this->normalizer->normalize(null, 'docgen', [
 | 
			
		||||
                    AbstractNormalizer::GROUPS => ['docgen:read'], 'docgen:expects' => Location::class,
 | 
			
		||||
                ]);
 | 
			
		||||
                $activity['location']['type'] = 'location';
 | 
			
		||||
            } else {
 | 
			
		||||
                $activity['location']['isNull'] = false;
 | 
			
		||||
                $activity['location']['type'] = 'location';
 | 
			
		||||
 | 
			
		||||
                foreach (['1', '2'] as $key) {
 | 
			
		||||
                    $activity['location']['phonenumber' . $key] = $this->normalizer->normalize(
 | 
			
		||||
                        $activity['location']['phonenumber' . $key],
 | 
			
		||||
                        'docgen',
 | 
			
		||||
                        [AbstractNormalizer::GROUPS => ['docgen:read'], 'docgen:expects' => PhoneNumber::class]
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (is_numeric($activity['location']['locationType']['id'])) {
 | 
			
		||||
                $activity['location']['locationType']['title'] = $this->translatableStringHelper->localize(
 | 
			
		||||
                    $activity['location']['locationType']['title']
 | 
			
		||||
                );
 | 
			
		||||
                $activity['location']['locationType']['isNull'] = false;
 | 
			
		||||
                $activity['location']['locationType']['type'] = 'locationType';
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (null !== $activity['activityType']) {
 | 
			
		||||
                $activity['activityType']['name'] = $this->translatableStringHelper->localize(
 | 
			
		||||
                    $activity['activityType']['name']
 | 
			
		||||
                );
 | 
			
		||||
                $activity['activityType']['isNull'] = false;
 | 
			
		||||
                $activity['activityType']['type'] = 'activityType';
 | 
			
		||||
            } else {
 | 
			
		||||
                $activity['activityType'] = $this->normalizer->normalize(null, 'docgen', [
 | 
			
		||||
                    AbstractNormalizer::GROUPS => ['docgen:read'], 'docgen:expects' => ActivityType::class,
 | 
			
		||||
                ]);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (null !== $activity['attendee']) {
 | 
			
		||||
                $activity['attendee']['name'] = $this->translatableStringHelper->localize(
 | 
			
		||||
                    $activity['attendee']['name']
 | 
			
		||||
                );
 | 
			
		||||
                $activity['attendee']['isNull'] = false;
 | 
			
		||||
                $activity['attendee']['type'] = 'activityPresence';
 | 
			
		||||
            } else {
 | 
			
		||||
                $activity['attendee'] = $this->normalizer->normalize(null, 'docgen', [
 | 
			
		||||
                    AbstractNormalizer::GROUPS => ['docgen:read'], 'docgen:expects' => ActivityPresence::class,
 | 
			
		||||
                ]);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $activity['comment'] = (string) $row['comment'];
 | 
			
		||||
            $activity['travelTimeMinute'] = $row['travelTimeMinute'];
 | 
			
		||||
            $activity['durationTimeMinute'] = $row['durationTimeMinute'];
 | 
			
		||||
 | 
			
		||||
            if (null !== $row['userIds']) {
 | 
			
		||||
                foreach ($row['userIds'] as $id) {
 | 
			
		||||
                    $activity['users'][] = $this->normalizer->normalize(
 | 
			
		||||
                        $this->userRepository->find($id),
 | 
			
		||||
                        'docgen',
 | 
			
		||||
                        [AbstractNormalizer::GROUPS => ['docgen:read'], 'docgen:expects' => User::class]
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                $activity['users'] = [];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (null !== $row['personIds']) {
 | 
			
		||||
                foreach ($row['personIds'] as $id) {
 | 
			
		||||
                    $activity['persons'][] = $this->normalizer->normalize(
 | 
			
		||||
                        $this->personRepository->find($id),
 | 
			
		||||
                        'docgen',
 | 
			
		||||
                        [AbstractNormalizer::GROUPS => ['docgen:read'], 'docgen:expects' => Person::class]
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                $activity['persons'] = [];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (null !== $row['thirdPartyIds']) {
 | 
			
		||||
                foreach ($row['thirdPartyIds'] as $id) {
 | 
			
		||||
                    $activity['thirdParties'][] = $this->normalizer->normalize(
 | 
			
		||||
                        $this->thirdPartyRepository->find($id),
 | 
			
		||||
                        'docgen',
 | 
			
		||||
                        [AbstractNormalizer::GROUPS => ['docgen:read'], 'docgen:expects' => ThirdParty::class]
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                $activity['thirdParties'] = [];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (null !== $row['socialActionIds']) {
 | 
			
		||||
                foreach ($row['socialActionIds'] as $id) {
 | 
			
		||||
                    $activity['socialActions'][] = $this->normalizer->normalize(
 | 
			
		||||
                        $this->socialActionRepository->find($id),
 | 
			
		||||
                        'docgen',
 | 
			
		||||
                        [AbstractNormalizer::GROUPS => ['docgen:read'], 'docgen:expects' => SocialAction::class]
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                $activity['socialActions'] = [];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (null !== $row['socialIssueIds']) {
 | 
			
		||||
                foreach ($row['socialIssueIds'] as $id) {
 | 
			
		||||
                    $activity['socialIssues'][] = $this->normalizer->normalize(
 | 
			
		||||
                        $this->socialIssueRepository->find($id),
 | 
			
		||||
                        'docgen',
 | 
			
		||||
                        [AbstractNormalizer::GROUPS => ['docgen:read'], 'docgen:expects' => SocialIssue::class]
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                $activity['socialIssues'] = [];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $results[] = $activity;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $results;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										114
									
								
								src/Bundle/ChillActivityBundle/Tests/Entity/ActivityTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								src/Bundle/ChillActivityBundle/Tests/Entity/ActivityTest.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,114 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Tests\Entity;
 | 
			
		||||
 | 
			
		||||
use Chill\ActivityBundle\Entity\Activity;
 | 
			
		||||
use Chill\PersonBundle\AccompanyingPeriod\SocialIssueConsistency\AccompanyingPeriodSocialIssueConsistencyEntityListener;
 | 
			
		||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
 | 
			
		||||
use Chill\PersonBundle\Entity\SocialWork\SocialAction;
 | 
			
		||||
use Chill\PersonBundle\Entity\SocialWork\SocialIssue;
 | 
			
		||||
use Doctrine\ORM\Event\LifecycleEventArgs;
 | 
			
		||||
use PHPUnit\Framework\TestCase;
 | 
			
		||||
use Prophecy\PhpUnit\ProphecyTrait;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @internal
 | 
			
		||||
 * @coversNothing
 | 
			
		||||
 */
 | 
			
		||||
final class ActivityTest extends TestCase
 | 
			
		||||
{
 | 
			
		||||
    use ProphecyTrait;
 | 
			
		||||
 | 
			
		||||
    public function testHierarchySocialActions(): void
 | 
			
		||||
    {
 | 
			
		||||
        $parent = new SocialAction();
 | 
			
		||||
        $child = new SocialAction();
 | 
			
		||||
 | 
			
		||||
        $parent->addChild($child);
 | 
			
		||||
        $grandChild = new SocialAction();
 | 
			
		||||
        $child->addChild($grandChild);
 | 
			
		||||
 | 
			
		||||
        $activity = new Activity();
 | 
			
		||||
 | 
			
		||||
        $activity->addSocialAction($parent);
 | 
			
		||||
 | 
			
		||||
        $this->assertCount(1, $activity->getSocialActions());
 | 
			
		||||
        $this->assertContains($parent, $activity->getSocialActions());
 | 
			
		||||
 | 
			
		||||
        $activity->addSocialAction($grandChild);
 | 
			
		||||
 | 
			
		||||
        $this->assertCount(1, $activity->getSocialActions());
 | 
			
		||||
        $this->assertContains($grandChild, $activity->getSocialActions());
 | 
			
		||||
        $this->assertNotContains($parent, $activity->getSocialActions());
 | 
			
		||||
 | 
			
		||||
        $activity->addSocialAction($child);
 | 
			
		||||
 | 
			
		||||
        $this->assertCount(1, $activity->getSocialActions());
 | 
			
		||||
        $this->assertContains($grandChild, $activity->getSocialActions());
 | 
			
		||||
        $this->assertNotContains($parent, $activity->getSocialActions());
 | 
			
		||||
        $this->assertNotContains($child, $activity->getSocialActions());
 | 
			
		||||
 | 
			
		||||
        $activity->addSocialAction($another = new SocialAction());
 | 
			
		||||
 | 
			
		||||
        $this->assertCount(2, $activity->getSocialActions());
 | 
			
		||||
        $this->assertContains($grandChild, $activity->getSocialActions());
 | 
			
		||||
        $this->assertContains($another, $activity->getSocialActions());
 | 
			
		||||
        $this->assertNotContains($parent, $activity->getSocialActions());
 | 
			
		||||
        $this->assertNotContains($child, $activity->getSocialActions());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function testHierarchySocialIssues(): void
 | 
			
		||||
    {
 | 
			
		||||
        $listener = new AccompanyingPeriodSocialIssueConsistencyEntityListener();
 | 
			
		||||
        $event = $this->prophesize(LifecycleEventArgs::class)->reveal();
 | 
			
		||||
 | 
			
		||||
        $parent = new SocialIssue();
 | 
			
		||||
        $child = new SocialIssue();
 | 
			
		||||
 | 
			
		||||
        $parent->addChild($child);
 | 
			
		||||
        $grandChild = new SocialIssue();
 | 
			
		||||
        $child->addChild($grandChild);
 | 
			
		||||
 | 
			
		||||
        $activity = new Activity();
 | 
			
		||||
        $activity->setAccompanyingPeriod(new AccompanyingPeriod());
 | 
			
		||||
 | 
			
		||||
        $activity->addSocialIssue($parent);
 | 
			
		||||
        $listener->preUpdate($activity, $event);
 | 
			
		||||
 | 
			
		||||
        $this->assertCount(1, $activity->getSocialIssues());
 | 
			
		||||
        $this->assertContains($parent, $activity->getSocialIssues());
 | 
			
		||||
 | 
			
		||||
        $activity->addSocialIssue($grandChild);
 | 
			
		||||
        $listener->preUpdate($activity, $event);
 | 
			
		||||
 | 
			
		||||
        $this->assertCount(1, $activity->getSocialIssues());
 | 
			
		||||
        $this->assertContains($grandChild, $activity->getSocialIssues());
 | 
			
		||||
        $this->assertNotContains($parent, $activity->getSocialIssues());
 | 
			
		||||
 | 
			
		||||
        $activity->addSocialIssue($child);
 | 
			
		||||
        $listener->preUpdate($activity, $event);
 | 
			
		||||
 | 
			
		||||
        $this->assertCount(1, $activity->getSocialIssues());
 | 
			
		||||
        $this->assertContains($grandChild, $activity->getSocialIssues());
 | 
			
		||||
        $this->assertNotContains($parent, $activity->getSocialIssues());
 | 
			
		||||
        $this->assertNotContains($child, $activity->getSocialIssues());
 | 
			
		||||
 | 
			
		||||
        $activity->addSocialIssue($another = new SocialIssue());
 | 
			
		||||
        $listener->preUpdate($activity, $event);
 | 
			
		||||
 | 
			
		||||
        $this->assertCount(2, $activity->getSocialIssues());
 | 
			
		||||
        $this->assertContains($grandChild, $activity->getSocialIssues());
 | 
			
		||||
        $this->assertContains($another, $activity->getSocialIssues());
 | 
			
		||||
        $this->assertNotContains($parent, $activity->getSocialIssues());
 | 
			
		||||
        $this->assertNotContains($child, $activity->getSocialIssues());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Tests\Aggregator;
 | 
			
		||||
namespace Chill\ActivityBundle\Tests\Export\Aggregator;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Test\Export\AbstractAggregatorTest;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Tests\Aggregator;
 | 
			
		||||
namespace Chill\ActivityBundle\Tests\Export\Aggregator;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Test\Export\AbstractAggregatorTest;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Tests\Aggregator;
 | 
			
		||||
namespace Chill\ActivityBundle\Tests\Export\Aggregator;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Test\Export\AbstractAggregatorTest;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Tests\Filter;
 | 
			
		||||
namespace Chill\ActivityBundle\Tests\Export\Filter;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Test\Export\AbstractFilterTest;
 | 
			
		||||
use Doctrine\Common\Collections\ArrayCollection;
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\ActivityBundle\Tests\Filter;
 | 
			
		||||
namespace Chill\ActivityBundle\Tests\Export\Filter;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Test\Export\AbstractFilterTest;
 | 
			
		||||
use DateTime;
 | 
			
		||||
 
 | 
			
		||||
@@ -7,5 +7,7 @@ module.exports = function(encore, entries)
 | 
			
		||||
        ChillActivityAssets: __dirname + '/Resources/public'
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    encore.addEntry('page_edit_activity', __dirname + '/Resources/public/page/edit_activity/index.scss');
 | 
			
		||||
 | 
			
		||||
    encore.addEntry('vue_activity', __dirname + '/Resources/public/vuejs/Activity/index.js');
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -66,6 +66,14 @@ Choose a type: Choisir un type
 | 
			
		||||
1 hour 30: 1 heure 30
 | 
			
		||||
1 hour 45: 1 heure 45
 | 
			
		||||
2 hours: 2 heures
 | 
			
		||||
2 hours 15: 2 heures 15
 | 
			
		||||
2 hours 30: 2 heures 30
 | 
			
		||||
2 hours 45: 2 heures 45
 | 
			
		||||
3 hours: 3 heures
 | 
			
		||||
3 hours 30: 3 heures 30
 | 
			
		||||
4 hours: 4 heures
 | 
			
		||||
4 hours 30: 4 heures 30
 | 
			
		||||
5 hours: 5 heures
 | 
			
		||||
Concerned groups: Parties concernées
 | 
			
		||||
Persons in accompanying course: Usagers du parcours
 | 
			
		||||
Third persons: Tiers non-pro.
 | 
			
		||||
@@ -76,7 +84,7 @@ activity:
 | 
			
		||||
    Insert a document: Insérer un document
 | 
			
		||||
    Remove a document: Supprimer le document
 | 
			
		||||
    comment: Commentaire
 | 
			
		||||
No documents: Pas de documents
 | 
			
		||||
No documents: Aucun document
 | 
			
		||||
 | 
			
		||||
#timeline
 | 
			
		||||
'%user% has done an %activity_type%': '%user% a effectué une activité de type "%activity_type%"'
 | 
			
		||||
@@ -232,3 +240,5 @@ This is the minimal activity data: Activité n°
 | 
			
		||||
docgen:
 | 
			
		||||
    Activity basic: Echange
 | 
			
		||||
    A basic context for activity: Contexte pour les échanges
 | 
			
		||||
    Accompanying period with a list of activities: Parcours d'accompagnement avec liste des échanges
 | 
			
		||||
    Accompanying period with a list of activities description: Ce contexte reprend les informations du parcours, et tous les échanges pour un parcours. Les échanges ne sont pas filtrés.
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,10 @@ class Configuration implements ConfigurationInterface
 | 
			
		||||
            ->isRequired()
 | 
			
		||||
            ->defaultValue(
 | 
			
		||||
                [
 | 
			
		||||
                    ['label' => '1 minutes',  'seconds' => 60],
 | 
			
		||||
                    ['label' => '2 minutes',  'seconds' => 120],
 | 
			
		||||
                    ['label' => '3 minutes',  'seconds' => 180],
 | 
			
		||||
                    ['label' => '4 minutes',  'seconds' => 240],
 | 
			
		||||
                    ['label' => '5 minutes',  'seconds' => 300],
 | 
			
		||||
                    ['label' => '10 minutes', 'seconds' => 600],
 | 
			
		||||
                    ['label' => '15 minutes', 'seconds' => 900],
 | 
			
		||||
 
 | 
			
		||||
@@ -167,7 +167,6 @@ class AsideActivityCategory
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $this->parent = $parent;
 | 
			
		||||
        dump($this);
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ use Chill\TaskBundle\Templating\UI\CountNotificationTask;
 | 
			
		||||
use Knp\Menu\MenuItem;
 | 
			
		||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
 | 
			
		||||
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
 | 
			
		||||
use Symfony\Component\Translation\TranslatorInterface;
 | 
			
		||||
use Symfony\Contracts\Translation\TranslatorInterface;
 | 
			
		||||
 | 
			
		||||
class UserMenuBuilder implements LocalMenuBuilderInterface
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
 | 
			
		||||
{% block layout_wvm_content %}
 | 
			
		||||
	{% block admin_content %}
 | 
			
		||||
		<!-- block personcontent empty -->
 | 
			
		||||
		<!-- block content empty -->
 | 
			
		||||
		<h1>{{ 'Aside activity configuration'|trans }}</h1>
 | 
			
		||||
	{% endblock %}
 | 
			
		||||
{% endblock  %}
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@
 | 
			
		||||
									{% endif %}
 | 
			
		||||
								</div>
 | 
			
		||||
							</div>
 | 
			
		||||
							<div class="item-col">
 | 
			
		||||
							<div class="item-col" style="justify-content: flex-end;">
 | 
			
		||||
								<div class="box">
 | 
			
		||||
									<ul class="list-content fa-ul">
 | 
			
		||||
										<li>
 | 
			
		||||
@@ -79,7 +79,7 @@
 | 
			
		||||
 | 
			
		||||
			{{ chill_pagination(paginator) }}
 | 
			
		||||
 | 
			
		||||
			<ul class="record_actions">
 | 
			
		||||
			<ul class="record_actions sticky-form-buttons">
 | 
			
		||||
				<li>
 | 
			
		||||
					<a href="{{ chill_path_add_return_path('chill_crud_aside_activity_new') }}" class="btn btn-create">
 | 
			
		||||
						{{ 'Create'|trans }}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,9 +9,9 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Calculator;
 | 
			
		||||
namespace Chill\BudgetBundle\Calculator;
 | 
			
		||||
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Entity\AbstractElement;
 | 
			
		||||
use Chill\BudgetBundle\Entity\AbstractElement;
 | 
			
		||||
 | 
			
		||||
interface CalculatorInterface
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -9,9 +9,9 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Calculator;
 | 
			
		||||
namespace Chill\BudgetBundle\Calculator;
 | 
			
		||||
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Entity\AbstractElement;
 | 
			
		||||
use Chill\BudgetBundle\Entity\AbstractElement;
 | 
			
		||||
use OutOfBoundsException;
 | 
			
		||||
 | 
			
		||||
use function array_key_exists;
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Calculator;
 | 
			
		||||
namespace Chill\BudgetBundle\Calculator;
 | 
			
		||||
 | 
			
		||||
class CalculatorResult
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -9,12 +9,12 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle;
 | 
			
		||||
namespace Chill\BudgetBundle;
 | 
			
		||||
 | 
			
		||||
use Chill\AMLI\BudgetBundle\DependencyInjection\Compiler\CalculatorCompilerPass;
 | 
			
		||||
use Chill\BudgetBundle\DependencyInjection\Compiler\CalculatorCompilerPass;
 | 
			
		||||
use Symfony\Component\HttpKernel\Bundle\Bundle;
 | 
			
		||||
 | 
			
		||||
class ChillAMLIBudgetBundle extends Bundle
 | 
			
		||||
class ChillBudgetBundle extends Bundle
 | 
			
		||||
{
 | 
			
		||||
    public function build(\Symfony\Component\DependencyInjection\ContainerBuilder $container)
 | 
			
		||||
    {
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Config;
 | 
			
		||||
namespace Chill\BudgetBundle\Config;
 | 
			
		||||
 | 
			
		||||
class ConfigRepository
 | 
			
		||||
{
 | 
			
		||||
@@ -29,6 +29,11 @@ class ConfigRepository
 | 
			
		||||
        $this->charges = $charges;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getChargesKeys(): array
 | 
			
		||||
    {
 | 
			
		||||
        return array_map(static function ($element) { return $element['key']; }, $this->charges);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return array where keys are the resource'key and label the ressource label
 | 
			
		||||
     */
 | 
			
		||||
@@ -43,6 +48,11 @@ class ConfigRepository
 | 
			
		||||
        return $charges;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getResourcesKeys(): array
 | 
			
		||||
    {
 | 
			
		||||
        return array_map(static function ($element) { return $element['key']; }, $this->resources);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return array where keys are the resource'key and label the ressource label
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -9,37 +9,29 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Controller;
 | 
			
		||||
namespace Chill\BudgetBundle\Controller;
 | 
			
		||||
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Entity\AbstractElement;
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Security\Authorization\BudgetElementVoter;
 | 
			
		||||
use Chill\BudgetBundle\Entity\AbstractElement;
 | 
			
		||||
use Chill\BudgetBundle\Security\Authorization\BudgetElementVoter;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use Doctrine\ORM\EntityManagerInterface;
 | 
			
		||||
use Psr\Log\LoggerInterface;
 | 
			
		||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | 
			
		||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
 | 
			
		||||
use Symfony\Component\Form\Form;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
use Symfony\Component\Translation\TranslatorInterface;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Response;
 | 
			
		||||
use Symfony\Contracts\Translation\TranslatorInterface;
 | 
			
		||||
 | 
			
		||||
use function get_class;
 | 
			
		||||
 | 
			
		||||
abstract class AbstractElementController extends Controller
 | 
			
		||||
abstract class AbstractElementController extends AbstractController
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @var LoggerInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $chillMainLogger;
 | 
			
		||||
    protected LoggerInterface $chillMainLogger;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var EntityManagerInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $em;
 | 
			
		||||
    protected EntityManagerInterface $em;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var TranslatorInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $translator;
 | 
			
		||||
    protected TranslatorInterface $translator;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        EntityManagerInterface $em,
 | 
			
		||||
@@ -59,16 +51,22 @@ abstract class AbstractElementController extends Controller
 | 
			
		||||
     *
 | 
			
		||||
     * @param mixed $template
 | 
			
		||||
     * @param mixed $flashMessage
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\BrowserKit\Response
 | 
			
		||||
     */
 | 
			
		||||
    protected function _delete(AbstractElement $element, Request $request, $template, $flashMessage)
 | 
			
		||||
    protected function _delete(AbstractElement $element, Request $request, $template, $flashMessage): Response
 | 
			
		||||
    {
 | 
			
		||||
        $this->denyAccessUnlessGranted(BudgetElementVoter::DELETE, $element, 'You are not '
 | 
			
		||||
             . 'allowed to delete this family membership');
 | 
			
		||||
            . 'allowed to delete this item');
 | 
			
		||||
 | 
			
		||||
        $form = $this->createDeleteForm();
 | 
			
		||||
 | 
			
		||||
        if (null !== $element->getPerson()) {
 | 
			
		||||
            $entity = $element->getPerson();
 | 
			
		||||
            $indexPage = 'chill_budget_elements_index';
 | 
			
		||||
        } else {
 | 
			
		||||
            $entity = $element->getHousehold();
 | 
			
		||||
            $indexPage = 'chill_budget_elements_household_index';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($request->getMethod() === Request::METHOD_DELETE) {
 | 
			
		||||
            $form->handleRequest($request);
 | 
			
		||||
 | 
			
		||||
@@ -88,8 +86,8 @@ abstract class AbstractElementController extends Controller
 | 
			
		||||
                $this->addFlash('success', $this->translator
 | 
			
		||||
                    ->trans($flashMessage));
 | 
			
		||||
 | 
			
		||||
                return $this->redirectToRoute('chill_budget_elements_index', [
 | 
			
		||||
                    'id' => $element->getPerson()->getId(),
 | 
			
		||||
                return $this->redirectToRoute($indexPage, [
 | 
			
		||||
                    'id' => $entity->getId(),
 | 
			
		||||
                ]);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -103,13 +101,23 @@ abstract class AbstractElementController extends Controller
 | 
			
		||||
    /**
 | 
			
		||||
     * @param string $template
 | 
			
		||||
     * @param string $flashOnSuccess
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\HttpFoundation\Response
 | 
			
		||||
     */
 | 
			
		||||
    protected function _edit(AbstractElement $element, Request $request, $template, $flashOnSuccess)
 | 
			
		||||
    protected function _edit(AbstractElement $element, Request $request, $template, $flashOnSuccess): Response
 | 
			
		||||
    {
 | 
			
		||||
        $this->denyAccessUnlessGranted(BudgetElementVoter::UPDATE, $element);
 | 
			
		||||
 | 
			
		||||
        if (null !== $element->getPerson()) {
 | 
			
		||||
            $entity = $element->getPerson();
 | 
			
		||||
            $entityStr = 'person';
 | 
			
		||||
            $indexPage = 'chill_budget_elements_index';
 | 
			
		||||
        } else {
 | 
			
		||||
            $entity = $element->getHousehold();
 | 
			
		||||
            $entityStr = 'household';
 | 
			
		||||
            $indexPage = 'chill_budget_elements_household_index';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $entity = null !== $element->getPerson() ? $element->getPerson() : $element->getHousehold();
 | 
			
		||||
 | 
			
		||||
        $form = $this->createForm($this->getType(), $element);
 | 
			
		||||
        $form->add('submit', SubmitType::class);
 | 
			
		||||
 | 
			
		||||
@@ -121,29 +129,39 @@ abstract class AbstractElementController extends Controller
 | 
			
		||||
 | 
			
		||||
            $this->addFlash('success', $this->translator->trans($flashOnSuccess));
 | 
			
		||||
 | 
			
		||||
            return $this->redirectToRoute('chill_budget_elements_index', [
 | 
			
		||||
                'id' => $element->getPerson()->getId(),
 | 
			
		||||
            return $this->redirectToRoute($indexPage, [
 | 
			
		||||
                'id' => $entity->getId(),
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render($template, [
 | 
			
		||||
            'element' => $element,
 | 
			
		||||
            'form' => $form->createView(),
 | 
			
		||||
            'person' => $element->getPerson(),
 | 
			
		||||
            $entityStr => $entity,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param mixed $template
 | 
			
		||||
     * @param mixed $flashMessageOnSuccess
 | 
			
		||||
     * @param mixed $entity
 | 
			
		||||
     */
 | 
			
		||||
    protected function _new(Person $person, Request $request, $template, $flashMessageOnSuccess)
 | 
			
		||||
    protected function _new($entity, Request $request, $template, $flashMessageOnSuccess)
 | 
			
		||||
    {
 | 
			
		||||
        /** @var \Chill\AMLI\BudgetBundle\Entity\AbstractElement $element */
 | 
			
		||||
        $element = $this->createNewElement()
 | 
			
		||||
            ->setPerson($person);
 | 
			
		||||
        /** @var AbstractElement $element */
 | 
			
		||||
        $element = $this->createNewElement();
 | 
			
		||||
 | 
			
		||||
        $this->denyAccessUnlessGranted(BudgetElementVoter::CREATE, $element);
 | 
			
		||||
        if ($entity instanceof Person) {
 | 
			
		||||
            $element->setPerson($entity);
 | 
			
		||||
            $entityStr = 'person';
 | 
			
		||||
            $indexPage = 'chill_budget_elements_index';
 | 
			
		||||
        } else {
 | 
			
		||||
            $element->setHousehold($entity);
 | 
			
		||||
            $entityStr = 'household';
 | 
			
		||||
            $indexPage = 'chill_budget_elements_household_index';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // $this->denyAccessUnlessGranted(BudgetElementVoter::CREATE, $entity);
 | 
			
		||||
 | 
			
		||||
        $form = $this->createForm($this->getType(), $element);
 | 
			
		||||
        $form->add('submit', SubmitType::class);
 | 
			
		||||
@@ -157,8 +175,8 @@ abstract class AbstractElementController extends Controller
 | 
			
		||||
 | 
			
		||||
            $this->addFlash('success', $this->translator->trans($flashMessageOnSuccess));
 | 
			
		||||
 | 
			
		||||
            return $this->redirectToRoute('chill_budget_elements_index', [
 | 
			
		||||
                'id' => $person->getId(),
 | 
			
		||||
            return $this->redirectToRoute($indexPage, [
 | 
			
		||||
                'id' => $entity->getId(),
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -168,7 +186,7 @@ abstract class AbstractElementController extends Controller
 | 
			
		||||
 | 
			
		||||
        return $this->render($template, [
 | 
			
		||||
            'form' => $form->createView(),
 | 
			
		||||
            'person' => $person,
 | 
			
		||||
            $entityStr => $entity,
 | 
			
		||||
            'element' => $element,
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
@@ -183,7 +201,7 @@ abstract class AbstractElementController extends Controller
 | 
			
		||||
     */
 | 
			
		||||
    protected function _view(AbstractElement $element, $template)
 | 
			
		||||
    {
 | 
			
		||||
        $this->denyAccessUnlessGranted(BudgetElementVoter::SHOW, $element);
 | 
			
		||||
        $this->denyAccessUnlessGranted(BudgetElementVoter::SEE, $element);
 | 
			
		||||
 | 
			
		||||
        return $this->render($template, [
 | 
			
		||||
            'element' => $element,
 | 
			
		||||
@@ -199,10 +217,8 @@ abstract class AbstractElementController extends Controller
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a form to delete a help request entity by id.
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\Form\Form The form
 | 
			
		||||
     */
 | 
			
		||||
    private function createDeleteForm()
 | 
			
		||||
    private function createDeleteForm(): Form
 | 
			
		||||
    {
 | 
			
		||||
        return $this->createFormBuilder()
 | 
			
		||||
            ->setMethod(Request::METHOD_DELETE)
 | 
			
		||||
 
 | 
			
		||||
@@ -9,10 +9,11 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Controller;
 | 
			
		||||
namespace Chill\BudgetBundle\Controller;
 | 
			
		||||
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Entity\Charge;
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Form\ChargeType;
 | 
			
		||||
use Chill\BudgetBundle\Entity\Charge;
 | 
			
		||||
use Chill\BudgetBundle\Form\ChargeType;
 | 
			
		||||
use Chill\PersonBundle\Entity\Household\Household;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
@@ -32,7 +33,7 @@ class ChargeController extends AbstractElementController
 | 
			
		||||
        return $this->_delete(
 | 
			
		||||
            $charge,
 | 
			
		||||
            $request,
 | 
			
		||||
            '@ChillAMLIBudget/Charge/confirm_delete.html.twig',
 | 
			
		||||
            '@ChillBudget/Charge/confirm_delete.html.twig',
 | 
			
		||||
            'Charge deleted'
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
@@ -50,7 +51,7 @@ class ChargeController extends AbstractElementController
 | 
			
		||||
        return $this->_edit(
 | 
			
		||||
            $charge,
 | 
			
		||||
            $request,
 | 
			
		||||
            '@ChillAMLIBudget/Charge/edit.html.twig',
 | 
			
		||||
            '@ChillBudget/Charge/edit.html.twig',
 | 
			
		||||
            'Charge updated'
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
@@ -68,7 +69,25 @@ class ChargeController extends AbstractElementController
 | 
			
		||||
        return $this->_new(
 | 
			
		||||
            $person,
 | 
			
		||||
            $request,
 | 
			
		||||
            '@ChillAMLIBudget/Charge/new.html.twig',
 | 
			
		||||
            '@ChillBudget/Charge/new.html.twig',
 | 
			
		||||
            'Charge created'
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @Route(
 | 
			
		||||
     *     "{_locale}/budget/charge/by-household/{id}/new",
 | 
			
		||||
     *     name="chill_budget_charge_household_new"
 | 
			
		||||
     * )
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\HttpFoundation\Response
 | 
			
		||||
     */
 | 
			
		||||
    public function newHouseholdAction(Request $request, Household $household)
 | 
			
		||||
    {
 | 
			
		||||
        return $this->_new(
 | 
			
		||||
            $household,
 | 
			
		||||
            $request,
 | 
			
		||||
            '@ChillBudget/Charge/new.html.twig',
 | 
			
		||||
            'Charge created'
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
@@ -83,7 +102,7 @@ class ChargeController extends AbstractElementController
 | 
			
		||||
     */
 | 
			
		||||
    public function viewAction(Charge $charge)
 | 
			
		||||
    {
 | 
			
		||||
        return $this->_view($charge, '@ChillAMLIBudget/Charge/view.html.twig');
 | 
			
		||||
        return $this->_view($charge, '@ChillBudget/Charge/view.html.twig');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected function createNewElement()
 | 
			
		||||
 
 | 
			
		||||
@@ -9,44 +9,33 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Controller;
 | 
			
		||||
namespace Chill\BudgetBundle\Controller;
 | 
			
		||||
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Calculator\CalculatorManager;
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Entity\Charge;
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Entity\Resource;
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Security\Authorization\BudgetElementVoter;
 | 
			
		||||
use Chill\BudgetBundle\Calculator\CalculatorManager;
 | 
			
		||||
use Chill\BudgetBundle\Entity\Charge;
 | 
			
		||||
use Chill\BudgetBundle\Entity\Resource;
 | 
			
		||||
use Chill\BudgetBundle\Security\Authorization\BudgetElementVoter;
 | 
			
		||||
use Chill\PersonBundle\Entity\Household\Household;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use DateTime;
 | 
			
		||||
use Doctrine\ORM\EntityManagerInterface;
 | 
			
		||||
use Psr\Log\LoggerInterface;
 | 
			
		||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 | 
			
		||||
use Symfony\Component\Translation\TranslatorInterface;
 | 
			
		||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | 
			
		||||
use Symfony\Contracts\Translation\TranslatorInterface;
 | 
			
		||||
 | 
			
		||||
use function array_merge;
 | 
			
		||||
use function count;
 | 
			
		||||
 | 
			
		||||
class ElementController extends Controller
 | 
			
		||||
class ElementController extends AbstractController
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @var CalculatorManager
 | 
			
		||||
     */
 | 
			
		||||
    protected $calculator;
 | 
			
		||||
    protected CalculatorManager $calculator;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var LoggerInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $chillMainLogger;
 | 
			
		||||
    protected LoggerInterface $chillMainLogger;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var EntityManagerInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $em;
 | 
			
		||||
    protected EntityManagerInterface $em;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var TranslatorInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $translator;
 | 
			
		||||
    protected TranslatorInterface $translator;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        EntityManagerInterface $em,
 | 
			
		||||
@@ -68,11 +57,12 @@ class ElementController extends Controller
 | 
			
		||||
     */
 | 
			
		||||
    public function indexAction(Person $person)
 | 
			
		||||
    {
 | 
			
		||||
        $this->denyAccessUnlessGranted(BudgetElementVoter::SHOW, $person);
 | 
			
		||||
        $this->denyAccessUnlessGranted(BudgetElementVoter::SEE, $person);
 | 
			
		||||
 | 
			
		||||
        $charges = $this->em
 | 
			
		||||
            ->getRepository(Charge::class)
 | 
			
		||||
            ->findByPerson($person);
 | 
			
		||||
 | 
			
		||||
        $ressources = $this->em
 | 
			
		||||
            ->getRepository(Resource::class)
 | 
			
		||||
            ->findByPerson($person);
 | 
			
		||||
@@ -81,10 +71,10 @@ class ElementController extends Controller
 | 
			
		||||
 | 
			
		||||
        $actualCharges = $this->em
 | 
			
		||||
            ->getRepository(Charge::class)
 | 
			
		||||
            ->findByPersonAndDate($person, $now);
 | 
			
		||||
            ->findByEntityAndDate($person, $now);
 | 
			
		||||
        $actualResources = $this->em
 | 
			
		||||
            ->getRepository(Resource::class)
 | 
			
		||||
            ->findByPersonAndDate($person, $now);
 | 
			
		||||
            ->findByEntityAndDate($person, $now);
 | 
			
		||||
 | 
			
		||||
        $elements = array_merge($actualCharges, $actualResources);
 | 
			
		||||
 | 
			
		||||
@@ -92,11 +82,79 @@ class ElementController extends Controller
 | 
			
		||||
            $results = $this->calculator->calculateDefault($elements);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillAMLIBudgetBundle:Element:index.html.twig', [
 | 
			
		||||
        return $this->render('ChillBudgetBundle:Person:index.html.twig', [
 | 
			
		||||
            'person' => $person,
 | 
			
		||||
            'charges' => $charges,
 | 
			
		||||
            'resources' => $ressources,
 | 
			
		||||
            'results' => $results ?? [],
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @Route(
 | 
			
		||||
     *     "{_locale}/budget/elements/by-household/{id}",
 | 
			
		||||
     *     name="chill_budget_elements_household_index"
 | 
			
		||||
     * )
 | 
			
		||||
     */
 | 
			
		||||
    public function indexHouseholdAction(Household $household)
 | 
			
		||||
    {
 | 
			
		||||
        $this->denyAccessUnlessGranted(BudgetElementVoter::SEE, $household);
 | 
			
		||||
 | 
			
		||||
        $charges = $this->em
 | 
			
		||||
            ->getRepository(Charge::class)
 | 
			
		||||
            ->findByHousehold($household);
 | 
			
		||||
 | 
			
		||||
        $ressources = $this->em
 | 
			
		||||
            ->getRepository(Resource::class)
 | 
			
		||||
            ->findByHousehold($household);
 | 
			
		||||
 | 
			
		||||
        $now = new DateTime('now');
 | 
			
		||||
 | 
			
		||||
        $actualCharges = $this->em
 | 
			
		||||
            ->getRepository(Charge::class)
 | 
			
		||||
            ->findByEntityAndDate($household, $now);
 | 
			
		||||
        $actualResources = $this->em
 | 
			
		||||
            ->getRepository(Resource::class)
 | 
			
		||||
            ->findByEntityAndDate($household, $now);
 | 
			
		||||
 | 
			
		||||
        $elements = array_merge($actualCharges, $actualResources);
 | 
			
		||||
 | 
			
		||||
        if (count($elements) > 0) {
 | 
			
		||||
            $results = $this->calculator->calculateDefault($elements);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // quick solution to calculate the sum, difference and amount from
 | 
			
		||||
        // controller. This should be done from the calculators
 | 
			
		||||
        // TODO replace this by calculators
 | 
			
		||||
        $wholeCharges = $actualCharges;
 | 
			
		||||
        $wholeResources = $actualResources;
 | 
			
		||||
 | 
			
		||||
        foreach ($household->getCurrentPersons() as $person) {
 | 
			
		||||
            $wholeCharges = array_merge(
 | 
			
		||||
                $wholeCharges,
 | 
			
		||||
                $this->em
 | 
			
		||||
                    ->getRepository(Charge::class)
 | 
			
		||||
                    ->findByEntityAndDate($person, $now)
 | 
			
		||||
            );
 | 
			
		||||
            $wholeResources = array_merge(
 | 
			
		||||
                $wholeResources,
 | 
			
		||||
                $this->em
 | 
			
		||||
                    ->getRepository(Resource::class)
 | 
			
		||||
                    ->findByEntityAndDate($person, $now)
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->render('ChillBudgetBundle:Household:index.html.twig', [
 | 
			
		||||
            'household' => $household,
 | 
			
		||||
            'charges' => $charges,
 | 
			
		||||
            'resources' => $ressources,
 | 
			
		||||
            'wholeResources' => array_filter($wholeResources, static function (Resource $r) use ($now) {
 | 
			
		||||
                return $r->getStartDate() <= $now && ($r->getEndDate() === null || $r->getEndDate() >= $now);
 | 
			
		||||
            }),
 | 
			
		||||
            'wholeCharges' => array_filter($wholeCharges, static function (Charge $c) use ($now) {
 | 
			
		||||
                return $c->getStartDate() <= $now && ($c->getEndDate() === null || $c->getEndDate() >= $now);
 | 
			
		||||
            }),
 | 
			
		||||
            'results' => $results ?? [],
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,13 +9,15 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Controller;
 | 
			
		||||
namespace Chill\BudgetBundle\Controller;
 | 
			
		||||
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Entity\Resource;
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Form\ResourceType;
 | 
			
		||||
use Chill\BudgetBundle\Entity\Resource;
 | 
			
		||||
use Chill\BudgetBundle\Form\ResourceType;
 | 
			
		||||
use Chill\PersonBundle\Entity\Household\Household;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Request;
 | 
			
		||||
use Symfony\Component\HttpFoundation\Response;
 | 
			
		||||
 | 
			
		||||
class ResourceController extends AbstractElementController
 | 
			
		||||
{
 | 
			
		||||
@@ -24,15 +26,13 @@ class ResourceController extends AbstractElementController
 | 
			
		||||
     *     "{_locale}/budget/resource/{id}/delete",
 | 
			
		||||
     *     name="chill_budget_resource_delete"
 | 
			
		||||
     * )
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\HttpFoundation\Response
 | 
			
		||||
     */
 | 
			
		||||
    public function deleteAction(Request $request, Resource $resource)
 | 
			
		||||
    {
 | 
			
		||||
        return $this->_delete(
 | 
			
		||||
            $resource,
 | 
			
		||||
            $request,
 | 
			
		||||
            '@ChillAMLIBudget/Resource/confirm_delete.html.twig',
 | 
			
		||||
            '@ChillBudget/Resource/confirm_delete.html.twig',
 | 
			
		||||
            'Resource deleted'
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
@@ -42,33 +42,49 @@ class ResourceController extends AbstractElementController
 | 
			
		||||
     *     "{_locale}/budget/resource/{id}/edit",
 | 
			
		||||
     *     name="chill_budget_resource_edit"
 | 
			
		||||
     * )
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\HttpFoundation\Response
 | 
			
		||||
     */
 | 
			
		||||
    public function editAction(Request $request, Resource $resource)
 | 
			
		||||
    public function editAction(Request $request, Resource $resource): Response
 | 
			
		||||
    {
 | 
			
		||||
        return $this->_edit(
 | 
			
		||||
            $resource,
 | 
			
		||||
            $request,
 | 
			
		||||
            '@ChillAMLIBudget/Resource/edit.html.twig',
 | 
			
		||||
            '@ChillBudget/Resource/edit.html.twig',
 | 
			
		||||
            'Resource updated'
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create a new budget element for a person.
 | 
			
		||||
     *
 | 
			
		||||
     * @Route(
 | 
			
		||||
     *     "{_locale}/budget/resource/by-person/{id}/new",
 | 
			
		||||
     *     name="chill_budget_resource_new"
 | 
			
		||||
     * )
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\HttpFoundation\Response
 | 
			
		||||
     */
 | 
			
		||||
    public function newAction(Request $request, Person $person)
 | 
			
		||||
    public function newAction(Request $request, Person $person): Response
 | 
			
		||||
    {
 | 
			
		||||
        return $this->_new(
 | 
			
		||||
            $person,
 | 
			
		||||
            $request,
 | 
			
		||||
            '@ChillAMLIBudget/Resource/new.html.twig',
 | 
			
		||||
            '@ChillBudget/Resource/new.html.twig',
 | 
			
		||||
            'Resource created'
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create new budget element for a household.
 | 
			
		||||
     *
 | 
			
		||||
     * @Route(
 | 
			
		||||
     *     "{_locale}/budget/resource/by-household/{id}/new",
 | 
			
		||||
     *     name="chill_budget_resource_household_new"
 | 
			
		||||
     * )
 | 
			
		||||
     */
 | 
			
		||||
    public function newHouseholdAction(Request $request, Household $household): Response
 | 
			
		||||
    {
 | 
			
		||||
        return $this->_new(
 | 
			
		||||
            $household,
 | 
			
		||||
            $request,
 | 
			
		||||
            '@ChillBudget/Resource/new.html.twig',
 | 
			
		||||
            'Resource created'
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
@@ -78,12 +94,10 @@ class ResourceController extends AbstractElementController
 | 
			
		||||
     *     "{_locale}/budget/resource/{id}/view",
 | 
			
		||||
     *     name="chill_budget_resource_view"
 | 
			
		||||
     * )
 | 
			
		||||
     *
 | 
			
		||||
     * @return \Symfony\Component\HttpFoundation\Response
 | 
			
		||||
     */
 | 
			
		||||
    public function viewAction(Resource $resource)
 | 
			
		||||
    public function viewAction(Resource $resource): Response
 | 
			
		||||
    {
 | 
			
		||||
        return $this->_view($resource, '@ChillAMLIBudget/Resource/view.html.twig');
 | 
			
		||||
        return $this->_view($resource, '@ChillBudget/Resource/view.html.twig');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected function createNewElement()
 | 
			
		||||
 
 | 
			
		||||
@@ -9,9 +9,9 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\DependencyInjection;
 | 
			
		||||
namespace Chill\BudgetBundle\DependencyInjection;
 | 
			
		||||
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Security\Authorization\BudgetElementVoter;
 | 
			
		||||
use Chill\BudgetBundle\Security\Authorization\BudgetElementVoter;
 | 
			
		||||
use Symfony\Component\Config\FileLocator;
 | 
			
		||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
 | 
			
		||||
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
 | 
			
		||||
@@ -23,11 +23,11 @@ use Symfony\Component\HttpKernel\DependencyInjection\Extension;
 | 
			
		||||
 *
 | 
			
		||||
 * @see http://symfony.com/doc/current/cookbook/bundles/extension.html
 | 
			
		||||
 */
 | 
			
		||||
class ChillAMLIBudgetExtension extends Extension implements PrependExtensionInterface
 | 
			
		||||
class ChillBudgetExtension extends Extension implements PrependExtensionInterface
 | 
			
		||||
{
 | 
			
		||||
    public function load(array $configs, ContainerBuilder $container)
 | 
			
		||||
    {
 | 
			
		||||
        $configuration = new Configuration();
 | 
			
		||||
        $configuration = $this->getConfiguration($configs, $container);
 | 
			
		||||
        $config = $this->processConfiguration($configuration, $configs);
 | 
			
		||||
 | 
			
		||||
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../config'));
 | 
			
		||||
@@ -38,6 +38,7 @@ class ChillAMLIBudgetExtension extends Extension implements PrependExtensionInte
 | 
			
		||||
        $loader->load('services/templating.yaml');
 | 
			
		||||
        $loader->load('services/menu.yaml');
 | 
			
		||||
        $loader->load('services/calculator.yaml');
 | 
			
		||||
        $loader->load('services/services.yaml');
 | 
			
		||||
 | 
			
		||||
        $this->storeConfig('resources', $config, $container);
 | 
			
		||||
        $this->storeConfig('charges', $config, $container);
 | 
			
		||||
@@ -58,7 +59,7 @@ class ChillAMLIBudgetExtension extends Extension implements PrependExtensionInte
 | 
			
		||||
        $container->prependExtensionConfig('chill_main', [
 | 
			
		||||
            'routing' => [
 | 
			
		||||
                'resources' => [
 | 
			
		||||
                    '@ChillAMLIBudgetBundle/config/routing.yaml',
 | 
			
		||||
                    '@ChillBudgetBundle/config/routing.yaml',
 | 
			
		||||
                ],
 | 
			
		||||
            ],
 | 
			
		||||
        ]);
 | 
			
		||||
@@ -68,8 +69,8 @@ class ChillAMLIBudgetExtension extends Extension implements PrependExtensionInte
 | 
			
		||||
    {
 | 
			
		||||
        $container->prependExtensionConfig('security', [
 | 
			
		||||
            'role_hierarchy' => [
 | 
			
		||||
                BudgetElementVoter::UPDATE => [BudgetElementVoter::SHOW],
 | 
			
		||||
                BudgetElementVoter::CREATE => [BudgetElementVoter::SHOW],
 | 
			
		||||
                BudgetElementVoter::UPDATE => [BudgetElementVoter::SEE],
 | 
			
		||||
                BudgetElementVoter::CREATE => [BudgetElementVoter::SEE],
 | 
			
		||||
            ],
 | 
			
		||||
        ]);
 | 
			
		||||
    }
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\DependencyInjection\Compiler;
 | 
			
		||||
namespace Chill\BudgetBundle\DependencyInjection\Compiler;
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
 | 
			
		||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
 | 
			
		||||
@@ -19,7 +19,7 @@ class CalculatorCompilerPass implements CompilerPassInterface
 | 
			
		||||
{
 | 
			
		||||
    public function process(ContainerBuilder $container)
 | 
			
		||||
    {
 | 
			
		||||
        $manager = $container->getDefinition('Chill\AMLI\BudgetBundle\Calculator\CalculatorManager');
 | 
			
		||||
        $manager = $container->getDefinition('Chill\BudgetBundle\Calculator\CalculatorManager');
 | 
			
		||||
 | 
			
		||||
        foreach ($container->findTaggedServiceIds('chill_budget.calculator') as $id => $tags) {
 | 
			
		||||
            foreach ($tags as $tag) {
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\DependencyInjection;
 | 
			
		||||
namespace Chill\BudgetBundle\DependencyInjection;
 | 
			
		||||
 | 
			
		||||
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
 | 
			
		||||
use Symfony\Component\Config\Definition\ConfigurationInterface;
 | 
			
		||||
@@ -23,14 +23,14 @@ class Configuration implements ConfigurationInterface
 | 
			
		||||
{
 | 
			
		||||
    public function getConfigTreeBuilder()
 | 
			
		||||
    {
 | 
			
		||||
        $treeBuilder = new TreeBuilder('chill_amli_budget');
 | 
			
		||||
        $rootNode = $treeBuilder->getRootNode('chill_amli_budget');
 | 
			
		||||
        $treeBuilder = new TreeBuilder('chill_budget');
 | 
			
		||||
        $rootNode = $treeBuilder->getRootNode('chill_budget');
 | 
			
		||||
 | 
			
		||||
        $rootNode
 | 
			
		||||
            ->children()
 | 
			
		||||
 | 
			
		||||
                // ressources
 | 
			
		||||
            ->arrayNode('resources')->isRequired()->requiresAtLeastOneElement()
 | 
			
		||||
            ->arrayNode('resources')->defaultValue([])
 | 
			
		||||
            ->arrayPrototype()
 | 
			
		||||
            ->children()
 | 
			
		||||
            ->scalarNode('key')->isRequired()->cannotBeEmpty()
 | 
			
		||||
@@ -52,7 +52,7 @@ class Configuration implements ConfigurationInterface
 | 
			
		||||
            ->end()
 | 
			
		||||
            ->end()
 | 
			
		||||
            ->end()
 | 
			
		||||
            ->arrayNode('charges')->isRequired()->requiresAtLeastOneElement()
 | 
			
		||||
            ->arrayNode('charges')->defaultValue([])
 | 
			
		||||
            ->arrayPrototype()
 | 
			
		||||
            ->children()
 | 
			
		||||
            ->scalarNode('key')->isRequired()->cannotBeEmpty()
 | 
			
		||||
 
 | 
			
		||||
@@ -9,13 +9,15 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Entity;
 | 
			
		||||
namespace Chill\BudgetBundle\Entity;
 | 
			
		||||
 | 
			
		||||
use Chill\PersonBundle\Entity\Household\Household;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use DateTime;
 | 
			
		||||
use DateTimeImmutable;
 | 
			
		||||
use DateTimeInterface;
 | 
			
		||||
use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
use Ramsey\Uuid\Type\Decimal;
 | 
			
		||||
use Symfony\Component\Validator\Constraints as Assert;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -26,8 +28,6 @@ use Symfony\Component\Validator\Constraints as Assert;
 | 
			
		||||
abstract class AbstractElement
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @var decimal
 | 
			
		||||
     *
 | 
			
		||||
     * @ORM\Column(name="amount", type="decimal", precision=10, scale=2)
 | 
			
		||||
     * @Assert\GreaterThan(
 | 
			
		||||
     *     value=0
 | 
			
		||||
@@ -36,100 +36,80 @@ abstract class AbstractElement
 | 
			
		||||
     *     message="The amount cannot be empty"
 | 
			
		||||
     * )
 | 
			
		||||
     */
 | 
			
		||||
    private $amount;
 | 
			
		||||
    private string $amount;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var string|null
 | 
			
		||||
     *
 | 
			
		||||
     * @ORM\Column(name="comment", type="text", nullable=true)
 | 
			
		||||
     */
 | 
			
		||||
    private $comment;
 | 
			
		||||
    private ?string $comment;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var DateTimeImmutable|null
 | 
			
		||||
     *
 | 
			
		||||
     * @ORM\Column(name="endDate", type="datetime_immutable", nullable=true)
 | 
			
		||||
     * @Assert\GreaterThan(
 | 
			
		||||
     *     propertyPath="startDate",
 | 
			
		||||
     *     message="The budget element's end date must be after the start date"
 | 
			
		||||
     * )
 | 
			
		||||
     */
 | 
			
		||||
    private $endDate;
 | 
			
		||||
    private ?DateTimeImmutable $endDate;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @ORM\ManyToOne(
 | 
			
		||||
     *     targetEntity="\Chill\PersonBundle\Entity\Household\Household"
 | 
			
		||||
     * )
 | 
			
		||||
     */
 | 
			
		||||
    private ?Household $household = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var Person
 | 
			
		||||
     * @ORM\ManyToOne(
 | 
			
		||||
     *     targetEntity="\Chill\PersonBundle\Entity\Person"
 | 
			
		||||
     * )
 | 
			
		||||
     */
 | 
			
		||||
    private $person;
 | 
			
		||||
    private ?Person $person = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var DateTimeImmutable
 | 
			
		||||
     *
 | 
			
		||||
     * @ORM\Column(name="startDate", type="datetime_immutable")
 | 
			
		||||
     * @Assert\Date
 | 
			
		||||
     */
 | 
			
		||||
    private $startDate;
 | 
			
		||||
    private DateTimeImmutable $startDate;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var string
 | 
			
		||||
     *
 | 
			
		||||
     * @ORM\Column(name="type", type="string", length=255)
 | 
			
		||||
     */
 | 
			
		||||
    private $type;
 | 
			
		||||
    private string $type;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get amount.
 | 
			
		||||
     *
 | 
			
		||||
     * @return float
 | 
			
		||||
     */
 | 
			
		||||
    public function getAmount()
 | 
			
		||||
    /*Getters and Setters */
 | 
			
		||||
 | 
			
		||||
    public function getAmount(): float
 | 
			
		||||
    {
 | 
			
		||||
        return (float) $this->amount;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get comment.
 | 
			
		||||
     *
 | 
			
		||||
     * @return string|null
 | 
			
		||||
     */
 | 
			
		||||
    public function getComment()
 | 
			
		||||
    public function getComment(): ?string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->comment;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get endDate.
 | 
			
		||||
     *
 | 
			
		||||
     * @return DateTimeImmutable|null
 | 
			
		||||
     */
 | 
			
		||||
    public function getEndDate()
 | 
			
		||||
    public function getEndDate(): ?DateTimeImmutable
 | 
			
		||||
    {
 | 
			
		||||
        return $this->endDate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getPerson(): Person
 | 
			
		||||
    public function getHousehold(): ?Household
 | 
			
		||||
    {
 | 
			
		||||
        return $this->household;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getPerson(): ?Person
 | 
			
		||||
    {
 | 
			
		||||
        return $this->person;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get startDate.
 | 
			
		||||
     *
 | 
			
		||||
     * @return DateTimeImmutable
 | 
			
		||||
     */
 | 
			
		||||
    public function getStartDate()
 | 
			
		||||
    public function getStartDate(): DateTimeImmutable
 | 
			
		||||
    {
 | 
			
		||||
        return $this->startDate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get type.
 | 
			
		||||
     *
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    public function getType()
 | 
			
		||||
    public function getType(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->type;
 | 
			
		||||
    }
 | 
			
		||||
@@ -143,40 +123,21 @@ abstract class AbstractElement
 | 
			
		||||
 | 
			
		||||
    abstract public function isResource(): bool;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set amount.
 | 
			
		||||
     *
 | 
			
		||||
     * @param string $amount
 | 
			
		||||
     *
 | 
			
		||||
     * @return AbstractElement
 | 
			
		||||
     */
 | 
			
		||||
    public function setAmount($amount)
 | 
			
		||||
    public function setAmount(string $amount): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->amount = $amount;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set comment.
 | 
			
		||||
     *
 | 
			
		||||
     * @param string|null $comment
 | 
			
		||||
     *
 | 
			
		||||
     * @return AbstractElement
 | 
			
		||||
     */
 | 
			
		||||
    public function setComment($comment = null)
 | 
			
		||||
    public function setComment(?string $comment = null): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->comment = $comment;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set endDate.
 | 
			
		||||
     *
 | 
			
		||||
     * @return AbstractElement
 | 
			
		||||
     */
 | 
			
		||||
    public function setEndDate(?DateTimeInterface $endDate = null)
 | 
			
		||||
    public function setEndDate(?DateTimeInterface $endDate = null): self
 | 
			
		||||
    {
 | 
			
		||||
        if ($endDate instanceof DateTime) {
 | 
			
		||||
            $this->endDate = DateTimeImmutable::createFromMutable($endDate);
 | 
			
		||||
@@ -189,19 +150,21 @@ abstract class AbstractElement
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setPerson(Person $person)
 | 
			
		||||
    public function setHousehold(Household $household): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->household = $household;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function setPerson(Person $person): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->person = $person;
 | 
			
		||||
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set startDate.
 | 
			
		||||
     *
 | 
			
		||||
     * @return AbstractElement
 | 
			
		||||
     */
 | 
			
		||||
    public function setStartDate(DateTimeInterface $startDate)
 | 
			
		||||
    public function setStartDate(DateTimeInterface $startDate): self
 | 
			
		||||
    {
 | 
			
		||||
        if ($startDate instanceof DateTime) {
 | 
			
		||||
            $this->startDate = DateTimeImmutable::createFromMutable($startDate);
 | 
			
		||||
@@ -214,14 +177,7 @@ abstract class AbstractElement
 | 
			
		||||
        return $this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set type.
 | 
			
		||||
     *
 | 
			
		||||
     * @param string $type
 | 
			
		||||
     *
 | 
			
		||||
     * @return AbstractElement
 | 
			
		||||
     */
 | 
			
		||||
    public function setType($type)
 | 
			
		||||
    public function setType(string $type): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->type = $type;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,8 +9,9 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Entity;
 | 
			
		||||
namespace Chill\BudgetBundle\Entity;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Entity\Center;
 | 
			
		||||
use Chill\MainBundle\Entity\HasCenterInterface;
 | 
			
		||||
use DateTimeImmutable;
 | 
			
		||||
use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
@@ -19,7 +20,7 @@ use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
 * Charge.
 | 
			
		||||
 *
 | 
			
		||||
 * @ORM\Table(name="chill_budget.charge")
 | 
			
		||||
 * @ORM\Entity(repositoryClass="Chill\AMLI\BudgetBundle\Repository\ChargeRepository")
 | 
			
		||||
 * @ORM\Entity(repositoryClass="Chill\BudgetBundle\Repository\ChargeRepository")
 | 
			
		||||
 */
 | 
			
		||||
class Charge extends AbstractElement implements HasCenterInterface
 | 
			
		||||
{
 | 
			
		||||
@@ -58,7 +59,7 @@ class Charge extends AbstractElement implements HasCenterInterface
 | 
			
		||||
        $this->setStartDate(new DateTimeImmutable('today'));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getCenter(): \Chill\MainBundle\Entity\Center
 | 
			
		||||
    public function getCenter(): ?Center
 | 
			
		||||
    {
 | 
			
		||||
        return $this->getPerson()->getCenter();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -9,8 +9,9 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Entity;
 | 
			
		||||
namespace Chill\BudgetBundle\Entity;
 | 
			
		||||
 | 
			
		||||
use Chill\MainBundle\Entity\Center;
 | 
			
		||||
use Chill\MainBundle\Entity\HasCenterInterface;
 | 
			
		||||
use DateTimeImmutable;
 | 
			
		||||
use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
@@ -19,7 +20,7 @@ use Doctrine\ORM\Mapping as ORM;
 | 
			
		||||
 * Resource.
 | 
			
		||||
 *
 | 
			
		||||
 * @ORM\Table(name="chill_budget.resource")
 | 
			
		||||
 * @ORM\Entity(repositoryClass="Chill\AMLI\BudgetBundle\Repository\ResourceRepository")
 | 
			
		||||
 * @ORM\Entity(repositoryClass="Chill\BudgetBundle\Repository\ResourceRepository")
 | 
			
		||||
 */
 | 
			
		||||
class Resource extends AbstractElement implements HasCenterInterface
 | 
			
		||||
{
 | 
			
		||||
@@ -37,7 +38,7 @@ class Resource extends AbstractElement implements HasCenterInterface
 | 
			
		||||
        $this->setStartDate(new DateTimeImmutable('today'));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getCenter(): \Chill\MainBundle\Entity\Center
 | 
			
		||||
    public function getCenter(): ?Center
 | 
			
		||||
    {
 | 
			
		||||
        return $this->getPerson()->getCenter();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -9,10 +9,10 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Form;
 | 
			
		||||
namespace Chill\BudgetBundle\Form;
 | 
			
		||||
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Config\ConfigRepository;
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Entity\Charge;
 | 
			
		||||
use Chill\BudgetBundle\Config\ConfigRepository;
 | 
			
		||||
use Chill\BudgetBundle\Entity\Charge;
 | 
			
		||||
use Chill\MainBundle\Form\Type\ChillDateType;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
@@ -45,6 +45,7 @@ class ChargeType extends AbstractType
 | 
			
		||||
            ->add('type', ChoiceType::class, [
 | 
			
		||||
                'choices' => $this->getTypes(),
 | 
			
		||||
                'placeholder' => 'Choose a charge type',
 | 
			
		||||
                'attr' => ['class' => ' select2 '],
 | 
			
		||||
            ])
 | 
			
		||||
            ->add('amount', MoneyType::class)
 | 
			
		||||
            ->add('comment', TextareaType::class, [
 | 
			
		||||
@@ -96,7 +97,7 @@ class ChargeType extends AbstractType
 | 
			
		||||
 | 
			
		||||
    public function getBlockPrefix()
 | 
			
		||||
    {
 | 
			
		||||
        return 'chill_amli_budgetbundle_charge';
 | 
			
		||||
        return 'chill_budgetbundle_charge';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function getTypes()
 | 
			
		||||
 
 | 
			
		||||
@@ -9,10 +9,10 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Form;
 | 
			
		||||
namespace Chill\BudgetBundle\Form;
 | 
			
		||||
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Config\ConfigRepository;
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Entity\Resource;
 | 
			
		||||
use Chill\BudgetBundle\Config\ConfigRepository;
 | 
			
		||||
use Chill\BudgetBundle\Entity\Resource;
 | 
			
		||||
use Chill\MainBundle\Form\Type\ChillDateType;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
 | 
			
		||||
use Symfony\Component\Form\AbstractType;
 | 
			
		||||
@@ -45,6 +45,7 @@ class ResourceType extends AbstractType
 | 
			
		||||
                'choices' => $this->getTypes(),
 | 
			
		||||
                'placeholder' => 'Choose a resource type',
 | 
			
		||||
                'label' => 'Resource element type',
 | 
			
		||||
                'attr' => ['class' => ' select2 '],
 | 
			
		||||
            ])
 | 
			
		||||
            ->add('amount', MoneyType::class)
 | 
			
		||||
            ->add('comment', TextareaType::class, [
 | 
			
		||||
@@ -80,7 +81,7 @@ class ResourceType extends AbstractType
 | 
			
		||||
 | 
			
		||||
    public function getBlockPrefix()
 | 
			
		||||
    {
 | 
			
		||||
        return 'chill_amli_budgetbundle_resource';
 | 
			
		||||
        return 'chill_budgetbundle_resource';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function getTypes()
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										53
									
								
								src/Bundle/ChillBudgetBundle/Menu/HouseholdMenuBuilder.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/Bundle/ChillBudgetBundle/Menu/HouseholdMenuBuilder.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\BudgetBundle\Menu;
 | 
			
		||||
 | 
			
		||||
use Chill\BudgetBundle\Security\Authorization\BudgetElementVoter;
 | 
			
		||||
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
 | 
			
		||||
use Knp\Menu\MenuItem;
 | 
			
		||||
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
 | 
			
		||||
use Symfony\Contracts\Translation\TranslatorInterface;
 | 
			
		||||
 | 
			
		||||
class HouseholdMenuBuilder implements LocalMenuBuilderInterface
 | 
			
		||||
{
 | 
			
		||||
    protected AuthorizationCheckerInterface $authorizationChecker;
 | 
			
		||||
 | 
			
		||||
    protected TranslatorInterface $translator;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        AuthorizationCheckerInterface $authorizationChecker,
 | 
			
		||||
        TranslatorInterface $translator
 | 
			
		||||
    ) {
 | 
			
		||||
        $this->authorizationChecker = $authorizationChecker;
 | 
			
		||||
        $this->translator = $translator;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function buildMenu($menuId, MenuItem $menu, array $parameters)
 | 
			
		||||
    {
 | 
			
		||||
        /** @var Household $household */
 | 
			
		||||
        $household = $parameters['household'];
 | 
			
		||||
 | 
			
		||||
        // if ($this->authorizationChecker->isGranted(BudgetElementVoter::SHOW, $household)) {
 | 
			
		||||
        $menu->addChild($this->translator->trans('household.Budget'), [
 | 
			
		||||
            'route' => 'chill_budget_elements_household_index',
 | 
			
		||||
            'routeParameters' => [
 | 
			
		||||
                'id' => $household->getId(),
 | 
			
		||||
            ], ])
 | 
			
		||||
            ->setExtras(['order' => 19]);
 | 
			
		||||
        // }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static function getMenuIds(): array
 | 
			
		||||
    {
 | 
			
		||||
        return ['household'];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -9,25 +9,19 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Menu;
 | 
			
		||||
namespace Chill\BudgetBundle\Menu;
 | 
			
		||||
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Security\Authorization\BudgetElementVoter;
 | 
			
		||||
use Chill\BudgetBundle\Security\Authorization\BudgetElementVoter;
 | 
			
		||||
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
 | 
			
		||||
use Knp\Menu\MenuItem;
 | 
			
		||||
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
 | 
			
		||||
use Symfony\Component\Translation\TranslatorInterface;
 | 
			
		||||
use Symfony\Contracts\Translation\TranslatorInterface;
 | 
			
		||||
 | 
			
		||||
class UserMenuBuilder implements LocalMenuBuilderInterface
 | 
			
		||||
class PersonMenuBuilder implements LocalMenuBuilderInterface
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @var AuthorizationCheckerInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $authorizationChecker;
 | 
			
		||||
    protected AuthorizationCheckerInterface $authorizationChecker;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var TranslatorInterface
 | 
			
		||||
     */
 | 
			
		||||
    protected $translator;
 | 
			
		||||
    protected TranslatorInterface $translator;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        AuthorizationCheckerInterface $authorizationChecker,
 | 
			
		||||
@@ -39,10 +33,10 @@ class UserMenuBuilder implements LocalMenuBuilderInterface
 | 
			
		||||
 | 
			
		||||
    public function buildMenu($menuId, MenuItem $menu, array $parameters)
 | 
			
		||||
    {
 | 
			
		||||
        /** @var \Chill\PersonBundle\Entity\Person $person */
 | 
			
		||||
        /** @var Person $person */
 | 
			
		||||
        $person = $parameters['person'];
 | 
			
		||||
 | 
			
		||||
        if ($this->authorizationChecker->isGranted(BudgetElementVoter::SHOW, $person)) {
 | 
			
		||||
        if ($this->authorizationChecker->isGranted(BudgetElementVoter::SEE, $person)) {
 | 
			
		||||
            $menu->addChild(
 | 
			
		||||
                $this->translator->trans('Budget'),
 | 
			
		||||
                [
 | 
			
		||||
@@ -50,7 +44,7 @@ class UserMenuBuilder implements LocalMenuBuilderInterface
 | 
			
		||||
                    'routeParameters' => ['id' => $person->getId()],
 | 
			
		||||
                ]
 | 
			
		||||
            )
 | 
			
		||||
                ->setExtra('order', 460);
 | 
			
		||||
                ->setExtra('order', 59);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -9,10 +9,11 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Repository;
 | 
			
		||||
namespace Chill\BudgetBundle\Repository;
 | 
			
		||||
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use DateTime;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ChargeRepository.
 | 
			
		||||
@@ -20,13 +21,15 @@ use DateTime;
 | 
			
		||||
 * This class was generated by the Doctrine ORM. Add your own custom
 | 
			
		||||
 * repository methods below.
 | 
			
		||||
 */
 | 
			
		||||
class ChargeRepository extends \Doctrine\ORM\EntityRepository
 | 
			
		||||
class ChargeRepository extends EntityRepository
 | 
			
		||||
{
 | 
			
		||||
    public function findByPersonAndDate(Person $person, DateTime $date, $sort = null)
 | 
			
		||||
    public function findByEntityAndDate($entity, DateTime $date, $sort = null)
 | 
			
		||||
    {
 | 
			
		||||
        $qb = $this->createQueryBuilder('c');
 | 
			
		||||
 | 
			
		||||
        $qb->where('c.person = :person')
 | 
			
		||||
        $entityStr = $entity instanceof Person ? 'person' : 'household';
 | 
			
		||||
 | 
			
		||||
        $qb->where("c.{$entityStr} = :{$entityStr}")
 | 
			
		||||
            ->andWhere('c.startDate < :date')
 | 
			
		||||
            ->andWhere('c.startDate < :date OR c.startDate IS NULL');
 | 
			
		||||
 | 
			
		||||
@@ -35,7 +38,7 @@ class ChargeRepository extends \Doctrine\ORM\EntityRepository
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $qb->setParameters([
 | 
			
		||||
            'person' => $person,
 | 
			
		||||
            $entityStr => $entity,
 | 
			
		||||
            'date' => $date,
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,10 +9,11 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Repository;
 | 
			
		||||
namespace Chill\BudgetBundle\Repository;
 | 
			
		||||
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use DateTime;
 | 
			
		||||
use Doctrine\ORM\EntityRepository;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ResourceRepository.
 | 
			
		||||
@@ -20,23 +21,28 @@ use DateTime;
 | 
			
		||||
 * This class was generated by the Doctrine ORM. Add your own custom
 | 
			
		||||
 * repository methods below.
 | 
			
		||||
 */
 | 
			
		||||
class ResourceRepository extends \Doctrine\ORM\EntityRepository
 | 
			
		||||
class ResourceRepository extends EntityRepository
 | 
			
		||||
{
 | 
			
		||||
    public function findByPersonAndDate(Person $person, DateTime $date, $sort = null)
 | 
			
		||||
    public function findByEntityAndDate($entity, DateTime $date, $sort = null)
 | 
			
		||||
    {
 | 
			
		||||
        $qb = $this->createQueryBuilder('c');
 | 
			
		||||
 | 
			
		||||
        $qb->where('c.person = :person')
 | 
			
		||||
            ->andWhere('c.startDate < :date')
 | 
			
		||||
            ->andWhere('c.startDate < :date OR c.startDate IS NULL');
 | 
			
		||||
        $entityStr = $entity instanceof Person ? 'person' : 'household';
 | 
			
		||||
 | 
			
		||||
        $qb->where("c.{$entityStr} = :{$entityStr}")
 | 
			
		||||
            // TODO: in controller, the budget and charges asked are also for future and actual
 | 
			
		||||
            //->andWhere('c.startDate < :date')
 | 
			
		||||
            // TODO: there is a misconception here, the end date must be lower or null. startDate are never null
 | 
			
		||||
            //->andWhere('c.startDate < :date OR c.startDate IS NULL');
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
        if (null !== $sort) {
 | 
			
		||||
            $qb->orderBy($sort);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $qb->setParameters([
 | 
			
		||||
            'person' => $person,
 | 
			
		||||
            'date' => $date,
 | 
			
		||||
            $entityStr => $entity,
 | 
			
		||||
            //'date' => $date,
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        return $qb->getQuery()->getResult();
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,61 @@
 | 
			
		||||
.subtitle {
 | 
			
		||||
    margin-top: 1rem;
 | 
			
		||||
    margin-bottom: 1rem;
 | 
			
		||||
    padding: 1rem;
 | 
			
		||||
}
 | 
			
		||||
.family-title {
 | 
			
		||||
    margin-bottom: 1rem !important;
 | 
			
		||||
}
 | 
			
		||||
.budget-table th {
 | 
			
		||||
    th {
 | 
			
		||||
        color: white;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
.budget-table {
 | 
			
		||||
    th.charge {
 | 
			
		||||
        background-color: #e03851d7;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
.budget-table {
 | 
			
		||||
    th.resource {
 | 
			
		||||
        background-color: #6d9e63d8;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
.budget-table {
 | 
			
		||||
    th, td {
 | 
			
		||||
        padding: 10px;
 | 
			
		||||
        text-align: right;
 | 
			
		||||
    }
 | 
			
		||||
    td.column-wide {
 | 
			
		||||
        width: 20%;
 | 
			
		||||
    }
 | 
			
		||||
    td.column-small {
 | 
			
		||||
        width: 15%;
 | 
			
		||||
        &.right {
 | 
			
		||||
            align-items: right;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.btn-budget {
 | 
			
		||||
    margin-right: 1rem !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.el-type {
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    text-align: left !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.total {
 | 
			
		||||
    margin-top: 1rem;
 | 
			
		||||
    border-top: 1px dashed black;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.accordion-item {
 | 
			
		||||
    margin-bottom: 1rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
button[aria-expanded="true"] > span.folded,
 | 
			
		||||
button[aria-expanded="false"] > span.unfolded { display: none; }
 | 
			
		||||
button[aria-expanded="false"] > span.folded,
 | 
			
		||||
button[aria-expanded="true"] > span.unfolded { display: inline; }
 | 
			
		||||
@@ -0,0 +1 @@
 | 
			
		||||
require('./chillbudget.scss');
 | 
			
		||||
@@ -0,0 +1,74 @@
 | 
			
		||||
{% set entity = person is defined ? person :  household %}
 | 
			
		||||
 | 
			
		||||
{% set actualResources = [] %}
 | 
			
		||||
{% set futureResources = [] %}
 | 
			
		||||
{% set pastResources   = [] %}
 | 
			
		||||
 | 
			
		||||
{% for r in resources %}
 | 
			
		||||
    {% if r.startDate|date('U') <= 'now'|date('U') %}
 | 
			
		||||
        {% if r.endDate is null or r.endDate|date('U') >= 'now'|date('U') %}
 | 
			
		||||
            {% set actualResources = actualResources|merge([ r ]) %}
 | 
			
		||||
        {% else %}
 | 
			
		||||
            {% set pastResources = pastResources|merge([ r ]) %}
 | 
			
		||||
        {% endif %}
 | 
			
		||||
    {% else %}
 | 
			
		||||
        {% set futureResources = futureResources|merge([ r ]) %}
 | 
			
		||||
    {% endif %}
 | 
			
		||||
{% endfor %}
 | 
			
		||||
 | 
			
		||||
{% set actualCharges = [] %}
 | 
			
		||||
{% set futureCharges = [] %}
 | 
			
		||||
{% set pastCharges   = [] %}
 | 
			
		||||
 | 
			
		||||
{% for c in charges %}
 | 
			
		||||
    {% if c.startDate|date('U') <= 'now'|date('U') %}
 | 
			
		||||
        {% if c.endDate is null or c.endDate|date('U') >= 'now'|date('U') %}
 | 
			
		||||
            {% set actualCharges = actualCharges|merge([ c ]) %}
 | 
			
		||||
        {% else %}
 | 
			
		||||
            {% set pastCharges = pastCharges|merge([ c ]) %}
 | 
			
		||||
        {% endif %}
 | 
			
		||||
    {% else %}
 | 
			
		||||
        {% set futureCharges = futureCharges|merge([ c ]) %}
 | 
			
		||||
    {% endif %}
 | 
			
		||||
{% endfor %}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3 class="subtitle">{{ 'Actual budget'|trans }}</h3>
 | 
			
		||||
 | 
			
		||||
{% if actualCharges|length > 0 or actualResources|length > 0 %}
 | 
			
		||||
    {% include 'ChillBudgetBundle:Budget:_current_budget.html.twig' with {
 | 
			
		||||
        'actualResources': actualResources,
 | 
			
		||||
        'actualCharges': actualCharges,
 | 
			
		||||
        'results': results,
 | 
			
		||||
        'entity': entity
 | 
			
		||||
    } %}
 | 
			
		||||
{% else %}
 | 
			
		||||
    <div class="flex-table">
 | 
			
		||||
        <div class="item-bloc">
 | 
			
		||||
            <p><span class="chill-no-data-statement">{{ "There isn't any element recorded"|trans }}</span></p>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% if pastCharges|length > 0 or pastResources|length > 0 %}
 | 
			
		||||
    <h2 class="subtitle">{{ 'Past budget'|trans }}</h2>
 | 
			
		||||
 | 
			
		||||
    {% include 'ChillBudgetBundle:Budget:_past_budget.html.twig' with {
 | 
			
		||||
        'pastCharges': pastCharges,
 | 
			
		||||
        'pastResources': pastResources,
 | 
			
		||||
        'entity': entity
 | 
			
		||||
    } %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% if futureCharges|length > 0 or futureResources|length > 0 %}
 | 
			
		||||
    <h2 class="subtitle">{{ 'Future budget'|trans }}</h2>
 | 
			
		||||
 | 
			
		||||
    {% include 'ChillBudgetBundle:Budget:_future_budget.html.twig' with {
 | 
			
		||||
        'futureResources': futureResources,
 | 
			
		||||
        'futureCharges': futureCharges,
 | 
			
		||||
        'entity': entity
 | 
			
		||||
    } %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,30 @@
 | 
			
		||||
{% from 'ChillBudgetBundle:Budget:_macros.html.twig' import table_elements, table_results %}
 | 
			
		||||
 | 
			
		||||
{# <h2 class="subtitle">{{ 'Actual budget'|trans }}</h2> #}
 | 
			
		||||
 | 
			
		||||
<div class="flex-table">
 | 
			
		||||
    <h4 class="family-title">{{ 'Actual resources'|trans }}</h4>
 | 
			
		||||
 | 
			
		||||
    {% if actualResources|length > 0 %}
 | 
			
		||||
    <div class="item-bloc">
 | 
			
		||||
        {{ table_elements(actualResources, 'resource') }}
 | 
			
		||||
    </div>
 | 
			
		||||
    {% else %}
 | 
			
		||||
    <div class="item-bloc">
 | 
			
		||||
        <span class="chill-no-data-statement">{{ 'No resources registered'|trans }}</span>
 | 
			
		||||
    </div>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="flex-table">
 | 
			
		||||
    <h4 class="family-title">{{ 'Actual charges'|trans }}</h4>
 | 
			
		||||
    {% if actualCharges|length > 0 %}
 | 
			
		||||
    <div class="item-bloc">
 | 
			
		||||
        {{ table_elements(actualCharges, 'charge') }}
 | 
			
		||||
    </div>
 | 
			
		||||
    {% else %}
 | 
			
		||||
    <div class="item-bloc">
 | 
			
		||||
        <span class="chill-no-data-statement">{{ 'No charges registered'|trans }}</span>
 | 
			
		||||
    </div>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
</div>
 | 
			
		||||
@@ -0,0 +1,51 @@
 | 
			
		||||
{% from 'ChillBudgetBundle:Budget:_macros.html.twig' import table_elements, table_results %}
 | 
			
		||||
 | 
			
		||||
<div class="accordion" id="future_{{ entity.id }}">
 | 
			
		||||
    <div class="accordion-item">
 | 
			
		||||
        <h2 class="accordion-header" id="heading_future_{{ entity.id }}">
 | 
			
		||||
            <button
 | 
			
		||||
                class="accordion-button collapsed"
 | 
			
		||||
                type="button"
 | 
			
		||||
                data-bs-toggle="collapse"
 | 
			
		||||
                data-bs-target="#collapse_future_{{ entity.id }}"
 | 
			
		||||
                aria-expanded="false"
 | 
			
		||||
                aria-controls="collapse_future_{{ entity.id }}">
 | 
			
		||||
                <span class="folded">{{ 'Show future budget'|trans }}</span>
 | 
			
		||||
                <span class="unfolded text-secondary">{{ 'Hide budget'|trans }}</span>
 | 
			
		||||
            </button>
 | 
			
		||||
        </h2>
 | 
			
		||||
 | 
			
		||||
        <div id="collapse_future_{{ entity.id }}"
 | 
			
		||||
            class="accordion-collapse collapse"
 | 
			
		||||
            aria-labelledby="heading_future_{{ entity.id }}"
 | 
			
		||||
            data-bs-parent="#future_{{ entity.id }}">
 | 
			
		||||
 | 
			
		||||
            <div class="flex-table">
 | 
			
		||||
                <h3 class="family-title">{{ 'Future resources'|trans }}</h3>
 | 
			
		||||
 | 
			
		||||
                {% if futureResources|length > 0 %}
 | 
			
		||||
                    <div class="item-bloc">
 | 
			
		||||
                        {{ table_elements(futureResources, 'resource') }}
 | 
			
		||||
                    </div>
 | 
			
		||||
                {% else %}
 | 
			
		||||
                    <div class="item-bloc">
 | 
			
		||||
                        <span class="chill-no-data-statement">{{ 'No future resources registered'|trans }}</span>
 | 
			
		||||
                    </div>
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="flex-table">
 | 
			
		||||
                <h3 class="family-title">{{ 'Future charges'|trans }}</h3>
 | 
			
		||||
 | 
			
		||||
                {% if futureCharges|length > 0 %}
 | 
			
		||||
                    <div class="item-bloc">
 | 
			
		||||
                        {{ table_elements(futureCharges, 'charge') }}
 | 
			
		||||
                    </div>
 | 
			
		||||
                {% else %}
 | 
			
		||||
                    <div class="item-bloc">
 | 
			
		||||
                        <span class="chill-no-data-statement">{{ 'No future charges registered'|trans }}</span>
 | 
			
		||||
                    </div>
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -0,0 +1,97 @@
 | 
			
		||||
{% macro table_elements(elements, family) %}
 | 
			
		||||
<table class="budget-table">
 | 
			
		||||
    <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
            <th class="{{ family }} el-type">{{ 'Budget element type'|trans }}</th>
 | 
			
		||||
            <th class="{{ family }}">{{ 'Amount'|trans }}</th>
 | 
			
		||||
            <th class="{{ family }}">{{ 'Validity period'|trans }}</th>
 | 
			
		||||
            <th class="{{ family }}"> </th>
 | 
			
		||||
        </tr>
 | 
			
		||||
    </thead>
 | 
			
		||||
    <tbody>
 | 
			
		||||
        {% set total = 0 %}
 | 
			
		||||
        {% for f in elements %}
 | 
			
		||||
        {% set total = total + f.amount %}
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td class="column-wide el-type">
 | 
			
		||||
                <span class="badge-title">
 | 
			
		||||
                    <span class="title_label title_label_{{ family }}"></span>
 | 
			
		||||
                    <span class="title_action">{{ f.type|budget_element_type_display(family) }}<span>
 | 
			
		||||
                </span>
 | 
			
		||||
            </td>
 | 
			
		||||
            <td class="column-small">{{ f.amount|format_currency('EUR') }}</td>
 | 
			
		||||
            <td class="column-wide">
 | 
			
		||||
                {% if f.endDate is not null %}
 | 
			
		||||
                    {{ f.startDate|format_date('short') ~ ' - ' ~ f.endDate|format_date('short') }}
 | 
			
		||||
                {% else %}
 | 
			
		||||
                    {{ f.startDate|format_date('short') ~ ' - ...' }}
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            </td>
 | 
			
		||||
            <td class="column-small">
 | 
			
		||||
                <ul class="record_actions">
 | 
			
		||||
                    {% if is_granted('CHILL_BUDGET_ELEMENT_SEE', f) %}
 | 
			
		||||
                        <li>
 | 
			
		||||
                            <a href="{{ path('chill_budget_' ~ family ~ '_view', { 'id': f.id } ) }}" class="btn btn-sm btn-show"></a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
                    {% if is_granted('CHILL_BUDGET_ELEMENT_UPDATE', f) %}
 | 
			
		||||
                        <li>
 | 
			
		||||
                            <a href="{{ path('chill_budget_' ~ family ~'_edit', { 'id': f.id } ) }}" class="btn btn-sm btn-edit"></a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
                    {% if is_granted('CHILL_BUDGET_ELEMENT_DELETE', f) %}
 | 
			
		||||
                        <li>
 | 
			
		||||
                            <a href="{{ path('chill_budget_' ~ family ~ '_delete', { 'id': f.id } ) }}" class="btn btn-sm btn-delete"></a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
                </ul>
 | 
			
		||||
            </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
        <tr class="total">
 | 
			
		||||
            <td class="el-type">
 | 
			
		||||
                {{ 'Total'|trans }}
 | 
			
		||||
            </td>
 | 
			
		||||
            <td>
 | 
			
		||||
                {{ total|format_currency('EUR') }}
 | 
			
		||||
            </td>
 | 
			
		||||
            <td> </td>
 | 
			
		||||
            <td> </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
    </tbody>
 | 
			
		||||
</table>
 | 
			
		||||
{% endmacro %}
 | 
			
		||||
 | 
			
		||||
{% macro table_results(actualCharges, actualResources) %}
 | 
			
		||||
 | 
			
		||||
{% set totalCharges = 0 %}
 | 
			
		||||
{% for c in actualCharges %}
 | 
			
		||||
    {% set totalCharges = totalCharges + c.amount %}
 | 
			
		||||
{% endfor %}
 | 
			
		||||
 | 
			
		||||
{% set totalResources = 0 %}
 | 
			
		||||
{% for r in actualResources %}
 | 
			
		||||
    {% set totalResources = totalResources + r.amount %}
 | 
			
		||||
{% endfor %}
 | 
			
		||||
 | 
			
		||||
{% set result = (totalResources - totalCharges) %}
 | 
			
		||||
 | 
			
		||||
<table>
 | 
			
		||||
    <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
            <th> </th>
 | 
			
		||||
            <th> </th>
 | 
			
		||||
            <th>{{ 'Budget calculator result'|trans }}</th>
 | 
			
		||||
        </tr>
 | 
			
		||||
    </thead>
 | 
			
		||||
    <tbody>
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td>{{ 'The balance'|trans }}</td>
 | 
			
		||||
            <td> </td>
 | 
			
		||||
            <td>
 | 
			
		||||
                {{ result|format_currency('EUR') }}
 | 
			
		||||
            </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
    </tbody>
 | 
			
		||||
</table>
 | 
			
		||||
{% endmacro %}
 | 
			
		||||
@@ -0,0 +1,53 @@
 | 
			
		||||
{% from 'ChillBudgetBundle:Budget:_macros.html.twig' import table_elements, table_results %}
 | 
			
		||||
 | 
			
		||||
<div class="accordion" id="past_{{ entity.id }}">
 | 
			
		||||
    <div class="accordion-item">
 | 
			
		||||
        <h2 class="accordion-header" id="heading_past_{{ entity.id }}">
 | 
			
		||||
            <button
 | 
			
		||||
                class="accordion-button collapsed"
 | 
			
		||||
                type="button"
 | 
			
		||||
                data-bs-toggle="collapse"
 | 
			
		||||
                data-bs-target="#collapse_past_{{ entity.id }}"
 | 
			
		||||
                aria-expanded="false"
 | 
			
		||||
                aria-controls="collapse_past_{{ entity.id }}">
 | 
			
		||||
                <span class="folded">{{ 'Show past budget'|trans }}</span>
 | 
			
		||||
                <span class="unfolded text-secondary">{{ 'Hide budget'|trans }}</span>
 | 
			
		||||
            </button>
 | 
			
		||||
        </h2>
 | 
			
		||||
 | 
			
		||||
        <div id="collapse_past_{{ entity.id }}"
 | 
			
		||||
            class="accordion-collapse collapse"
 | 
			
		||||
            aria-labelledby="heading_past_{{ entity.id }}"
 | 
			
		||||
            data-bs-parent="#past_{{ entity.id }}">
 | 
			
		||||
 | 
			
		||||
            <div class="flex-table">
 | 
			
		||||
                <h3 class="family-title">{{ 'Past resources'|trans }}</h3>
 | 
			
		||||
 | 
			
		||||
                {% if pastResources|length > 0 %}
 | 
			
		||||
                    <div class="item-bloc">
 | 
			
		||||
                        {{ table_elements(pastResources, 'resource') }}
 | 
			
		||||
                    </div>
 | 
			
		||||
                {% else %}
 | 
			
		||||
                    <div class="item-bloc">
 | 
			
		||||
                        <span class="chill-no-data-statement">{{ 'No past resources registered'|trans }}</span>
 | 
			
		||||
                    </div>
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div class="flex-table">
 | 
			
		||||
                <h3 class="family-title">{{ 'Past charges'|trans }}</h3>
 | 
			
		||||
 | 
			
		||||
                {% if pastCharges|length > 0 %}
 | 
			
		||||
                    <div class="item-bloc">
 | 
			
		||||
                        {{ table_elements(pastCharges, 'charge') }}
 | 
			
		||||
                    </div>
 | 
			
		||||
                {% else %}
 | 
			
		||||
                    <div class="item-bloc">
 | 
			
		||||
                        <span class="chill-no-data-statement">{{ 'No past charges registered'|trans }}</span>
 | 
			
		||||
                    </div>
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -1,18 +1,29 @@
 | 
			
		||||
{% extends "@ChillPerson/Person/layout.html.twig"  %}
 | 
			
		||||
{% if element.person is not null %}
 | 
			
		||||
    {% set template = '@ChillPerson/Person/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set person = element.person %}
 | 
			
		||||
    {% set confirm_question = 'Are you sure you want to remove the charge "%type%" associated to "%name%" ?'|trans({ '%name%' : person.firstname ~ ' ' ~ person.lastname, '%type%': element.type|budget_element_type_display('charge') } ) %}
 | 
			
		||||
{% else %}
 | 
			
		||||
    {% set template = '@ChillPerson/Household/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_household_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set household = element.household %}
 | 
			
		||||
    {% set confirm_question = 'Are you sure you want to remove the charge "%type%" associated to household "%household%" ?'|trans({ '%household%' : household.id, '%type%': element.type|budget_element_type_display('charge') } ) %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = '' %}
 | 
			
		||||
{% set person = element.person %}
 | 
			
		||||
{% extends template %}
 | 
			
		||||
 | 
			
		||||
{% block title  'Remove resource'|trans %}
 | 
			
		||||
{% block title  'Remove charge'|trans %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
{% block content %}
 | 
			
		||||
 | 
			
		||||
{{ include('ChillMainBundle:Util:confirmation_template.html.twig',
 | 
			
		||||
    {
 | 
			
		||||
        'title'             : 'Remove charge'|trans,
 | 
			
		||||
        'confirm_question'  : 'Are you sure you want to remove the charge "%type%" associated to "%name%" ?'|trans({ '%name%' : person.firstname ~ ' ' ~ person.lastname, '%type%': element.type|budget_element_type_display('charge') } ),
 | 
			
		||||
        'cancel_route'      : 'chill_budget_elements_index',
 | 
			
		||||
        'cancel_parameters' : { 'id' : element.person.id },
 | 
			
		||||
        'confirm_question'  : confirm_question,
 | 
			
		||||
        'cancel_route'      : indexPage,
 | 
			
		||||
        'cancel_parameters' : { 'id': person is defined ? person.id : household.id },
 | 
			
		||||
        'form'              : delete_form
 | 
			
		||||
    } ) }}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,31 +1,43 @@
 | 
			
		||||
{% extends "@ChillPerson/Person/layout.html.twig" %}
 | 
			
		||||
{% if element.person is not null %}
 | 
			
		||||
    {% set template = '@ChillPerson/Person/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set person = element.person %}
 | 
			
		||||
{% else %}
 | 
			
		||||
    {% set template = '@ChillPerson/Household/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_household_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set household = element.household %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% set title = 'Edit charge'|trans %}
 | 
			
		||||
 | 
			
		||||
{% extends template %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = '' %}
 | 
			
		||||
{% set title = 'Edit Charge for %name%'|trans({ '%name%' : person.firstName ~ " " ~ person.lastName } ) %}
 | 
			
		||||
{% block title title %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
{% block content %}
 | 
			
		||||
<h1>{{ title }}</h1>
 | 
			
		||||
 | 
			
		||||
{{ form_start(form) }}
 | 
			
		||||
 | 
			
		||||
{{ form_row(form.type) }}
 | 
			
		||||
{{ form_row(form.amount) }}
 | 
			
		||||
{{ form_row(form.help) }} 
 | 
			
		||||
{{ form_row(form.help) }}
 | 
			
		||||
{{ form_row(form.comment) }}
 | 
			
		||||
{{ form_row(form.startDate) }}
 | 
			
		||||
{{ form_row(form.endDate) }}
 | 
			
		||||
 | 
			
		||||
<ul class="record_actions sticky-form-buttons">
 | 
			
		||||
    <li class="cancel">
 | 
			
		||||
        <a href="{{ path("chill_budget_elements_index", { 'id': person.id } ) }}" class="btn btn-cancel">
 | 
			
		||||
           {{ 'Back to the list'|trans }}
 | 
			
		||||
        <a href="{{ path(indexPage, { 'id': person is defined ? person.id : household.id } ) }}" class="btn btn-cancel">
 | 
			
		||||
            {{ 'Back to the list'|trans }}
 | 
			
		||||
        </a>
 | 
			
		||||
    </li>
 | 
			
		||||
    <li>
 | 
			
		||||
        {{ form_widget(form.submit, { 'attr' : { 'class': 'btn btn-create' }, 'label': 'Edit' } ) }}
 | 
			
		||||
        {{ form_widget(form.submit, { 'attr' : { 'class': 'btn btn-edit' }, 'label': 'Edit' } ) }}
 | 
			
		||||
    </li>
 | 
			
		||||
</ul>
 | 
			
		||||
       
 | 
			
		||||
 | 
			
		||||
{{ form_end(form) }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,31 +1,42 @@
 | 
			
		||||
{% extends "@ChillPerson/Person/layout.html.twig" %}
 | 
			
		||||
{% if element.person is not null %}
 | 
			
		||||
    {% set template = '@ChillPerson/Person/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set person = element.person %}
 | 
			
		||||
{% else %}
 | 
			
		||||
    {% set template = '@ChillPerson/Household/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_household_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set household = element.household %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = '' %}
 | 
			
		||||
{% set title = 'New Charge for %name%'|trans({ '%name%' : person.firstName ~ " " ~ person.lastName } ) %}
 | 
			
		||||
{% set title = 'New charge'|trans %}
 | 
			
		||||
 | 
			
		||||
{% extends template %}
 | 
			
		||||
{% block title title %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
{% block content %}
 | 
			
		||||
<h1>{{ title }}</h1>
 | 
			
		||||
 | 
			
		||||
{{ form_start(form) }}
 | 
			
		||||
 | 
			
		||||
{{ form_row(form.type) }}
 | 
			
		||||
{{ form_row(form.amount) }}
 | 
			
		||||
{{ form_row(form.help) }} 
 | 
			
		||||
{{ form_row(form.help) }}
 | 
			
		||||
{{ form_row(form.comment) }}
 | 
			
		||||
{{ form_row(form.startDate) }}
 | 
			
		||||
{{ form_row(form.endDate) }}
 | 
			
		||||
 | 
			
		||||
<ul class="record_actions sticky-form-buttons">
 | 
			
		||||
    <li class="cancel">
 | 
			
		||||
        <a href="{{ path("chill_budget_elements_index", { 'id': person.id } ) }}" class="btn btn-cancel">
 | 
			
		||||
           {{ 'Back to the list'|trans }}
 | 
			
		||||
        <a href="{{ path(indexPage, { 'id': person is defined ? person.id : household.id } ) }}" class="btn btn-cancel">
 | 
			
		||||
            {{ 'Back to the list'|trans }}
 | 
			
		||||
        </a>
 | 
			
		||||
    </li>
 | 
			
		||||
    <li>
 | 
			
		||||
        {{ form_widget(form.submit, { 'attr' : { 'class': 'btn btn-create' }, 'label': 'Create' } ) }}
 | 
			
		||||
    </li>
 | 
			
		||||
</ul>
 | 
			
		||||
       
 | 
			
		||||
 | 
			
		||||
{{ form_end(form) }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,49 +1,68 @@
 | 
			
		||||
{% extends "@ChillPerson/Person/layout.html.twig" %}
 | 
			
		||||
{% if element.person is not null %}
 | 
			
		||||
    {% set template = '@ChillPerson/Person/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set person = element.person %}
 | 
			
		||||
{% else %}
 | 
			
		||||
    {% set template = '@ChillPerson/Household/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_household_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set household = element.household %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = '' %}
 | 
			
		||||
{% set person = element.person %}
 | 
			
		||||
{% set title = 'Charge for %name%'|trans({ '%name%' : person.firstName ~ " " ~ person.lastName } ) %}
 | 
			
		||||
{% set title = 'Charge' %}
 | 
			
		||||
 | 
			
		||||
{% extends template %}
 | 
			
		||||
 | 
			
		||||
{% block title title %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
<h1>{{ title }}</h1>
 | 
			
		||||
{% block content %}
 | 
			
		||||
<div class="budget-show">
 | 
			
		||||
    <h1>{{ title }}</h1>
 | 
			
		||||
 | 
			
		||||
<dl class="chill_view_data">
 | 
			
		||||
    <dt>{{ 'Type'|trans }}</dt>
 | 
			
		||||
    <dd>{{ element.type|budget_element_type_display('charge') }}</dd>
 | 
			
		||||
 | 
			
		||||
    <dt>{{ 'Amount'|trans }}</dt>
 | 
			
		||||
    <dd>{{ element.amount|localizedcurrency('EUR') }}</dd>
 | 
			
		||||
 | 
			
		||||
    <dt>{{ 'Validity period'|trans }}</dt>
 | 
			
		||||
    <dd>
 | 
			
		||||
        {% if element.endDate is not null %}
 | 
			
		||||
            {{ 'Valid since %startDate% until %endDate%'|trans( { '%startDate%': element.startDate|localizeddate('long', 'none'), '%endDate%': familyMember.endDate|localizeddate('long', 'none') } ) }}
 | 
			
		||||
        {% else %}
 | 
			
		||||
            {{ 'Valid since %startDate%'|trans( { '%startDate%': element.startDate|localizeddate('long', 'none') } ) }}
 | 
			
		||||
        {% endif %}
 | 
			
		||||
    </dd>
 | 
			
		||||
 | 
			
		||||
    <dt>{{ 'Comment'|trans }}</dt>
 | 
			
		||||
    <dd>
 | 
			
		||||
        {%- if element.comment is not empty -%}
 | 
			
		||||
        <blockquote class="chill-user-quote">
 | 
			
		||||
            {{ element.comment }}
 | 
			
		||||
        </blockquote>
 | 
			
		||||
        {%- else -%}
 | 
			
		||||
        <span class="chill-no-data-statement">{{ 'Not given'|trans }}</span>
 | 
			
		||||
        {%- endif -%}
 | 
			
		||||
    </dd>
 | 
			
		||||
</dl>
 | 
			
		||||
    <div class="flex-table">
 | 
			
		||||
        <div class="item-bloc">
 | 
			
		||||
            <div class="item-row">
 | 
			
		||||
                <h2 class="badge-title">
 | 
			
		||||
                    <span class="title_label title_label_charge"></span>
 | 
			
		||||
                    <span class="title_action">{{ element.type|budget_element_type_display('charge') }}</span>
 | 
			
		||||
                </h2>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="item-row separator">
 | 
			
		||||
                <dl class="chill_view_data">
 | 
			
		||||
                    <dt>{{ 'Amount'|trans }}</dt>
 | 
			
		||||
                    <dd>{{ element.amount|format_currency('EUR') }}</dd>
 | 
			
		||||
                    <dt>{{ 'Validity period'|trans }}</dt>
 | 
			
		||||
                    <dd>
 | 
			
		||||
                        {% if element.endDate is not null %}
 | 
			
		||||
                            {{ 'Valid since %startDate% until %endDate%'|trans( { '%startDate%': element.startDate|format_date('long'), '%endDate%': element.endDate|format_date('long') } ) }}
 | 
			
		||||
                        {% else %}
 | 
			
		||||
                            {{ 'Valid since %startDate%'|trans( { '%startDate%': element.startDate|format_date('long') } ) }}
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
                    </dd>
 | 
			
		||||
                    <dt>{{ 'Comment'|trans }}</dt>
 | 
			
		||||
                    <dd>
 | 
			
		||||
                        {%- if element.comment is not empty -%}
 | 
			
		||||
                        <blockquote class="chill-user-quote">
 | 
			
		||||
                            {{ element.comment }}
 | 
			
		||||
                        </blockquote>
 | 
			
		||||
                        {%- else -%}
 | 
			
		||||
                        <span class="chill-no-data-statement">{{ 'Not given'|trans }}</span>
 | 
			
		||||
                        {%- endif -%}
 | 
			
		||||
                    </dd>
 | 
			
		||||
                </dl>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<ul class="record_actions sticky-form-buttons">
 | 
			
		||||
    <li class="cancel">
 | 
			
		||||
        <a href="{{ path("chill_budget_elements_index", { 'id': person.id } ) }}" class="btn btn-cancel">
 | 
			
		||||
           {{ 'Back to the list'|trans }}
 | 
			
		||||
        <a href="{{ path(indexPage, { 'id': person is defined ? person.id : household.id } ) }}" class="btn btn-cancel">
 | 
			
		||||
            {{ 'Back to the list'|trans }}
 | 
			
		||||
        </a>
 | 
			
		||||
    </li>
 | 
			
		||||
    {% if is_granted(constant('Chill\\AMLI\\BudgetBundle\\Security\\Authorization\\BudgetElementVoter::UPDATE'), element) %}
 | 
			
		||||
    {% if is_granted('CHILL_BUDGET_ELEMENT_UPDATE', element) %}
 | 
			
		||||
        <li>
 | 
			
		||||
            <a href="{{ path('chill_budget_charge_edit', { 'id': element.id } ) }}" class="btn btn-edit">{{ 'Edit'|trans }}</a>
 | 
			
		||||
        </li>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,228 +0,0 @@
 | 
			
		||||
{% extends "@ChillPerson/Person/layout.html.twig" %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = '' %}
 | 
			
		||||
{% set title = 'Budget for %name%'|trans({ '%name%' : person.firstName ~ " " ~ person.lastName } ) %}
 | 
			
		||||
{% block title title %}
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
{% set actualResources = [] %}
 | 
			
		||||
{% set futureResources = [] %}
 | 
			
		||||
{% set pastResources   = [] %}
 | 
			
		||||
 | 
			
		||||
{% for r in resources %}
 | 
			
		||||
    {% if r.startDate|date('U') <= 'now'|date('U') %}
 | 
			
		||||
        {% if r.endDate is null or r.endDate|date('U') >= 'now'|date('U') %}
 | 
			
		||||
            {% set actualResources = actualResources|merge([ r ]) %}
 | 
			
		||||
        {% else %}
 | 
			
		||||
            {% set pastResources = pastResources|merge([ r ]) %}
 | 
			
		||||
        {% endif %}
 | 
			
		||||
    {% else %}
 | 
			
		||||
        {% set futureResources = futureResources|merge([ r ]) %}
 | 
			
		||||
    {% endif %}
 | 
			
		||||
{% endfor %}
 | 
			
		||||
 | 
			
		||||
{% set actualCharges = [] %}
 | 
			
		||||
{% set futureCharges = [] %}
 | 
			
		||||
{% set pastCharges   = [] %}
 | 
			
		||||
 | 
			
		||||
{% for c in charges %}
 | 
			
		||||
    {% if c.startDate|date('U') <= 'now'|date('U') %}
 | 
			
		||||
        {% if c.endDate is null or c.endDate|date('U') >= 'now'|date('U') %}
 | 
			
		||||
            {% set actualCharges = actualCharges|merge([ c ]) %}
 | 
			
		||||
        {% else %}
 | 
			
		||||
            {% set pastCharges = pastCharges|merge([ c ]) %}
 | 
			
		||||
        {% endif %}
 | 
			
		||||
    {% else %}
 | 
			
		||||
        {% set futureCharges = futureCharges|merge([ c ]) %}
 | 
			
		||||
    {% endif %}
 | 
			
		||||
{% endfor %}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{% macro table_elements(elements, family) %}
 | 
			
		||||
<table>
 | 
			
		||||
    <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
            <th>{{ 'Budget element type'|trans }}</th>
 | 
			
		||||
            <th>{{ 'Amount'|trans }}</th>
 | 
			
		||||
            <th>{{ 'Validity period'|trans }}</th>
 | 
			
		||||
            <th> </th>
 | 
			
		||||
        </tr>
 | 
			
		||||
    </thead>
 | 
			
		||||
    <tbody>
 | 
			
		||||
        {% set total = 0 %}
 | 
			
		||||
        {% for f in elements %}
 | 
			
		||||
        {% set total = total + f.amount %}
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td>
 | 
			
		||||
                {{ f.type|budget_element_type_display(family) }}
 | 
			
		||||
            </td>
 | 
			
		||||
            <td>{{ f.amount|format_currency('EUR') }}</td>
 | 
			
		||||
            <td>
 | 
			
		||||
                {% if f.endDate is not null %}
 | 
			
		||||
                    {{ 'Valid since %startDate% until %endDate%'|trans( { '%startDate%': f.startDate|format_date('long'), '%endDate%': f.endDate|format_date('long') } ) }}
 | 
			
		||||
                {% else %}
 | 
			
		||||
                    {{ 'Valid since %startDate%'|trans( { '%startDate%': f.startDate|format_date('long') } ) }}
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            </td>
 | 
			
		||||
            <td>
 | 
			
		||||
                <ul class="record_actions">
 | 
			
		||||
                    {% if is_granted(constant('Chill\\AMLI\\BudgetBundle\\Security\\Authorization\\BudgetElementVoter::SHOW'), f) %}
 | 
			
		||||
                        <li>
 | 
			
		||||
                            <a href="{{ path('chill_budget_' ~ family ~ '_view', { 'id': f.id } ) }}" class="btn btn-show"></a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
                    {% if is_granted(constant('Chill\\AMLI\\BudgetBundle\\Security\\Authorization\\BudgetElementVoter::UPDATE'), f) %}
 | 
			
		||||
                        <li>
 | 
			
		||||
                            <a href="{{ path('chill_budget_' ~ family ~'_edit', { 'id': f.id } ) }}" class="btn btn-edit"></a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
                    {% if is_granted(constant('Chill\\AMLI\\BudgetBundle\\Security\\Authorization\\BudgetElementVoter::DELETE'), f) %}
 | 
			
		||||
                        <li>
 | 
			
		||||
                            <a href="{{ path('chill_budget_' ~ family ~ '_delete', { 'id': f.id } ) }}" class="btn btn-delete"></a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
                </ul>
 | 
			
		||||
            </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td>
 | 
			
		||||
                {{ 'Total'|trans }}
 | 
			
		||||
            </td>
 | 
			
		||||
            <td>
 | 
			
		||||
                {{ total|format_currency('EUR') }}
 | 
			
		||||
            </td>
 | 
			
		||||
            <td> </td>
 | 
			
		||||
            <td> </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
    </tbody>
 | 
			
		||||
</table>
 | 
			
		||||
{% endmacro %}
 | 
			
		||||
 | 
			
		||||
{% macro table_results(results) %}
 | 
			
		||||
<table>
 | 
			
		||||
    <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
            <th> </th>
 | 
			
		||||
            <th>{{ 'Budget calculator result'|trans }}</th>
 | 
			
		||||
        </tr>
 | 
			
		||||
    </thead>
 | 
			
		||||
    <tbody>
 | 
			
		||||
    {% for result in results %}
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td>{{ result.label }}</td>
 | 
			
		||||
            <td>
 | 
			
		||||
                {% if result.type == constant('CHILL\\AMLI\\BudgetBundle\\Calculator\\CalculatorResult::TYPE_CURRENCY') %}
 | 
			
		||||
                    {{ result.result|format_currency('EUR') }}
 | 
			
		||||
                {% elseif result.type == constant('CHILL\\AMLI\\BudgetBundle\\Calculator\\CalculatorResult::TYPE_PERCENTAGE') %}
 | 
			
		||||
                    {{ result.result|round(2, 'ceil') ~ '%' }}
 | 
			
		||||
                {% else %}
 | 
			
		||||
                    {{ result.result|round(2, 'common') }}
 | 
			
		||||
                {% endif %}
 | 
			
		||||
            </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
    </tbody>
 | 
			
		||||
</table>
 | 
			
		||||
{% endmacro %}
 | 
			
		||||
 | 
			
		||||
{% import _self as m %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
<h1>{{ title }}</h1>
 | 
			
		||||
 | 
			
		||||
<h2>{{ 'Actual budget'|trans }}</h2>
 | 
			
		||||
 | 
			
		||||
{% if resources|length == 0 and charges|length == 0 %}
 | 
			
		||||
    <p><span class="chill-no-data-statement">{{ "There isn't any element recorded"|trans }}</span></p>
 | 
			
		||||
{% else %}
 | 
			
		||||
    <h3>{{ 'Actual resources'|trans }}</h3>
 | 
			
		||||
        
 | 
			
		||||
    {% if actualResources|length > 0 %}
 | 
			
		||||
        {{ m.table_elements(actualResources, 'resource') }}
 | 
			
		||||
    {% else %}
 | 
			
		||||
        <span class="chill-no-data-statement">{{ 'No resources registered'|trans }}</span>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    
 | 
			
		||||
    <h3>{{ 'Actual charges'|trans }}</h3>
 | 
			
		||||
    
 | 
			
		||||
    {% if actualCharges|length > 0 %}
 | 
			
		||||
        {{ m.table_elements(actualCharges, 'charge') }}
 | 
			
		||||
    {% else %}
 | 
			
		||||
        <span class="chill-no-data-statement">{{ 'No charges registered'|trans }}</span>
 | 
			
		||||
    {% endif %} 
 | 
			
		||||
    
 | 
			
		||||
    {% if results|length > 0 %}
 | 
			
		||||
        <h2>{{ 'Budget calculator'|trans }}</h2>
 | 
			
		||||
        
 | 
			
		||||
        {{ m.table_results(results) }}
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    
 | 
			
		||||
    {% if is_granted(constant('Chill\\AMLI\\BudgetBundle\\Security\\Authorization\\BudgetElementVoter::CREATE'), person) %}
 | 
			
		||||
    <ul class="record_actions">
 | 
			
		||||
        <li>
 | 
			
		||||
            <a class="btn btn-create" href="{{ path('chill_budget_resource_new', { 'id': person.id} ) }}">{{ 'Create new resource'|trans }}</a>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li>
 | 
			
		||||
            <a class="btn btn-create" href="{{ path('chill_budget_charge_new', { 'id': person.id} ) }}">{{ 'Create new charge'|trans }}</a>
 | 
			
		||||
        </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% if pastCharges|length > 0 or pastResources|length > 0 %}
 | 
			
		||||
    <h2>{{ 'Past budget'|trans }}</h2>
 | 
			
		||||
    
 | 
			
		||||
    <h3>{{ 'Past resources'|trans }}</h3>
 | 
			
		||||
        
 | 
			
		||||
    {% if pastResources|length > 0 %}
 | 
			
		||||
        {{ m.table_elements(pastResources, 'resource') }}
 | 
			
		||||
    {% else %}
 | 
			
		||||
        <span class="chill-no-data-statement">{{ 'No past resources registered'|trans }}</span>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    
 | 
			
		||||
    <h3>{{ 'Past charges'|trans }}</h3>
 | 
			
		||||
    
 | 
			
		||||
    {% if pastCharges|length > 0 %}
 | 
			
		||||
        {{ m.table_elements(pastCharges, 'charge') }}
 | 
			
		||||
    {% else %}
 | 
			
		||||
        <span class="chill-no-data-statement">{{ 'No past charges registered'|trans }}</span>
 | 
			
		||||
    {% endif %} 
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% if futureCharges|length > 0 or futureResources|length > 0 %}
 | 
			
		||||
    <h2>{{ 'Future budget'|trans }}</h2>
 | 
			
		||||
    
 | 
			
		||||
    <h3>{{ 'Future resources'|trans }}</h3>
 | 
			
		||||
        
 | 
			
		||||
    {% if futureResources|length > 0 %}
 | 
			
		||||
        {{ m.table_elements(futureResources, 'resource') }}
 | 
			
		||||
    {% else %}
 | 
			
		||||
        <span class="chill-no-data-statement">{{ 'No future resources registered'|trans }}</span>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    
 | 
			
		||||
    <h3>{{ 'Future charges'|trans }}</h3>
 | 
			
		||||
    
 | 
			
		||||
    {% if futureCharges|length > 0 %}
 | 
			
		||||
        {{ m.table_elements(futureCharges, 'charge') }}
 | 
			
		||||
    {% else %}
 | 
			
		||||
        <span class="chill-no-data-statement">{{ 'No future charges registered'|trans }}</span>
 | 
			
		||||
    {% endif %} 
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% if (resources|length + charges|length) == 0 or futureCharges|length > 0 or futureResources|length > 0 or pastCharges|length > 0 or pastResources|length > 0 %}
 | 
			
		||||
    {% if is_granted(constant('Chill\\AMLI\\BudgetBundle\\Security\\Authorization\\BudgetElementVoter::CREATE'), person) %}
 | 
			
		||||
        <ul class="record_actions">
 | 
			
		||||
            <li>
 | 
			
		||||
                <a class="btn btn-create" href="{{ path('chill_budget_resource_new', { 'id': person.id} ) }}">{{ 'Create new resource'|trans }}</a>
 | 
			
		||||
            </li>
 | 
			
		||||
            <li>
 | 
			
		||||
                <a class="btn btn-create" href="{{ path('chill_budget_charge_new', { 'id': person.id} ) }}">{{ 'Create new charge'|trans }}</a>
 | 
			
		||||
            </li>
 | 
			
		||||
        </ul>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,92 @@
 | 
			
		||||
{% extends "@ChillPerson/Household/layout.html.twig" %}
 | 
			
		||||
 | 
			
		||||
{% from 'ChillBudgetBundle:Budget:_macros.html.twig' import table_elements, table_results %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = '' %}
 | 
			
		||||
{% set title = 'Budget for household %household%'|trans({ '%household%' : household.id } ) %}
 | 
			
		||||
{% block title title %}
 | 
			
		||||
 | 
			
		||||
{% block js %}
 | 
			
		||||
{{ encore_entry_script_tags('page_budget') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block css %}
 | 
			
		||||
    {{ encore_entry_link_tags('page_budget') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
<h1>{{ title }}</h1>
 | 
			
		||||
 | 
			
		||||
{% include 'ChillBudgetBundle:Budget:_budget.html.twig' with {
 | 
			
		||||
    'resources': resources,
 | 
			
		||||
    'charges': charges,
 | 
			
		||||
    'household': household
 | 
			
		||||
} %}
 | 
			
		||||
 | 
			
		||||
    {#
 | 
			
		||||
<div class="flex-table">
 | 
			
		||||
    <h3 class="family-title">{{ 'Budget calculator'|trans }}</h3>
 | 
			
		||||
    <div class="item-bloc">
 | 
			
		||||
        {{ table_results(wholeCharges, wholeResources) }}
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
{% if household.getCurrentMembers|length > 0 %}
 | 
			
		||||
    <h2 class="subtitle">{{ 'Current budget household members'|trans }}</h2>
 | 
			
		||||
 | 
			
		||||
    {% for hm in household.getCurrentMembers %}
 | 
			
		||||
        {% set member = hm.person %}
 | 
			
		||||
        <div class="accordion" id="member_{{ member.id }}">
 | 
			
		||||
            <div class="accordion-item">
 | 
			
		||||
                <h2 class="accordion-header" id="heading_{{ member.id }}">
 | 
			
		||||
                    <button
 | 
			
		||||
                        class="accordion-button collapsed"
 | 
			
		||||
                        type="button"
 | 
			
		||||
                        data-bs-toggle="collapse"
 | 
			
		||||
                        data-bs-target="#collapse_{{ member.id }}"
 | 
			
		||||
                        aria-expanded="false"
 | 
			
		||||
                        aria-controls="collapse_{{ member.id }}">
 | 
			
		||||
                        <span class="folded">{{ 'Show budget of %name%'|trans({'%name%': member.firstName ~ " " ~ member.lastName }) }} ({{ 'budget.number of elements'|trans({ 'nb_items': member.getBudgetResources|length + member.getBudgetResources|length }) }})</span>
 | 
			
		||||
                        <span class="unfolded text-secondary">{{ 'Hide budget of %name%'|trans({'%name%': member.firstName ~ " " ~ member.lastName }) }}</span>
 | 
			
		||||
                    </button>
 | 
			
		||||
                </h2>
 | 
			
		||||
 | 
			
		||||
                <div id="collapse_{{ member.id }}"
 | 
			
		||||
                    class="accordion-collapse collapse"
 | 
			
		||||
                    aria-labelledby="heading_{{ member.id }}"
 | 
			
		||||
                    data-bs-parent="#nonCurrent">
 | 
			
		||||
 | 
			
		||||
                        {% include 'ChillBudgetBundle:Budget:_budget.html.twig' with {
 | 
			
		||||
                            'resources': member.getBudgetResources,
 | 
			
		||||
                            'charges': member.getBudgetCharges,
 | 
			
		||||
                            'person': member
 | 
			
		||||
                        } %}
 | 
			
		||||
 | 
			
		||||
                    <ul class="record_actions">
 | 
			
		||||
                        {% if is_granted('CHILL_BUDGET_ELEMENT_SEE', member) %}
 | 
			
		||||
                            <li class="btn-budget">
 | 
			
		||||
                                <a class="btn btn-edit" title={{ 'Edit budget'|trans }} href="{{ path('chill_budget_elements_index', { 'id': member.id } ) }}"></a>
 | 
			
		||||
                            </li>
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
                    </ul>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% if is_granted('CHILL_BUDGET_ELEMENT_CREATE', household) %}
 | 
			
		||||
    <ul class="record_actions sticky-form-buttons">
 | 
			
		||||
        <li>
 | 
			
		||||
            <a class="btn btn-create" href="{{ path('chill_budget_resource_household_new', { 'id': household.id} ) }}">{{ 'Create new resource'|trans }}</a>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li>
 | 
			
		||||
            <a class="btn btn-create" href="{{ path('chill_budget_charge_household_new', { 'id': household.id} ) }}">{{ 'Create new charge'|trans }}</a>
 | 
			
		||||
        </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,46 @@
 | 
			
		||||
{% extends "@ChillPerson/Person/layout.html.twig" %}
 | 
			
		||||
 | 
			
		||||
{% from 'ChillBudgetBundle:Budget:_macros.html.twig' import table_results %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = '' %}
 | 
			
		||||
{% set title = 'Budget for %name%'|trans({ '%name%' : person.firstName ~ " " ~ person.lastName } ) %}
 | 
			
		||||
{% block title title %}
 | 
			
		||||
 | 
			
		||||
{% block js %}
 | 
			
		||||
{{ encore_entry_script_tags('page_budget') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block css %}
 | 
			
		||||
    {{ encore_entry_link_tags('page_budget') }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
<h1>{{ title }}</h1>
 | 
			
		||||
 | 
			
		||||
{% include 'ChillBudgetBundle:Budget:_budget.html.twig' with {
 | 
			
		||||
    'resources': resources,
 | 
			
		||||
    'charges': charges,
 | 
			
		||||
    'person': person
 | 
			
		||||
} %}
 | 
			
		||||
 | 
			
		||||
<div class="flex-table">
 | 
			
		||||
    <h3 class="family-title">{{ 'Budget calculator'|trans }}</h2>
 | 
			
		||||
    <div class="item-bloc">
 | 
			
		||||
        {{ table_results(charges, resources) }}
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
{% if is_granted('CHILL_BUDGET_ELEMENT_CREATE', person) %}
 | 
			
		||||
    <ul class="record_actions sticky-form-buttons">
 | 
			
		||||
        <li>
 | 
			
		||||
            <a class="btn btn-create" href="{{ path('chill_budget_resource_new', { 'id': person.id} ) }}">{{ 'Create new resource'|trans }}</a>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li>
 | 
			
		||||
            <a class="btn btn-create" href="{{ path('chill_budget_charge_new', { 'id': person.id} ) }}">{{ 'Create new charge'|trans }}</a>
 | 
			
		||||
        </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
@@ -1,18 +1,29 @@
 | 
			
		||||
{% extends "@ChillPerson/Person/layout.html.twig"  %}
 | 
			
		||||
{% if element.person is not null %}
 | 
			
		||||
    {% set template = '@ChillPerson/Person/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set person = element.person %}
 | 
			
		||||
    {% set confirm_question = 'Are you sure you want to remove the ressource "%type%" associated to "%name%" ?'|trans({ '%name%' : person.firstname ~ ' ' ~ person.lastname, '%type%': element.type|budget_element_type_display('resource') } ) %}
 | 
			
		||||
{% else %}
 | 
			
		||||
    {% set template = '@ChillPerson/Household/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_household_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set household = element.household %}
 | 
			
		||||
    {% set confirm_question = 'Are you sure you want to remove the ressource "%type%" associated to household "%household%" ?'|trans({ '%household%' : household.id, '%type%': element.type|budget_element_type_display('resource') } ) %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = '' %}
 | 
			
		||||
{% set person = element.person %}
 | 
			
		||||
{% extends template %}
 | 
			
		||||
 | 
			
		||||
{% block title  'Remove resource'|trans %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
{% block content %}
 | 
			
		||||
 | 
			
		||||
{{ include('ChillMainBundle:Util:confirmation_template.html.twig',
 | 
			
		||||
    {
 | 
			
		||||
        'title'             : 'Remove resource'|trans,
 | 
			
		||||
        'confirm_question'  : 'Are you sure you want to remove the ressource "%type%" associated to "%name%" ?'|trans({ '%name%' : person.firstname ~ ' ' ~ person.lastname, '%type%': element.type|budget_element_type_display('resource') } ),
 | 
			
		||||
        'cancel_route'      : 'chill_budget_elements_index',
 | 
			
		||||
        'cancel_parameters' : { 'id' : element.person.id },
 | 
			
		||||
        'confirm_question'  : confirm_question,
 | 
			
		||||
        'cancel_route'      : indexPage,
 | 
			
		||||
        'cancel_parameters' : { 'id': person is defined ? person.id : household.id },
 | 
			
		||||
        'form'              : delete_form
 | 
			
		||||
    } ) }}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,24 @@
 | 
			
		||||
{% extends "@ChillPerson/Person/layout.html.twig" %}
 | 
			
		||||
{% if element.person is not null %}
 | 
			
		||||
    {% set template = '@ChillPerson/Person/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set person = element.person %}
 | 
			
		||||
    {% set title = 'Edit resource for %name%'|trans({ '%name%' : person.firstName ~ " " ~ person.lastName } ) %}
 | 
			
		||||
{% else %}
 | 
			
		||||
    {% set template = '@ChillPerson/Household/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_household_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set household = element.household %}
 | 
			
		||||
    {% set title = 'Edit resource for household %household%'|trans({ '%household%' : household.id } ) %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% set title = 'Edit resource'|trans %}
 | 
			
		||||
 | 
			
		||||
{% extends template %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = '' %}
 | 
			
		||||
{% set title = 'Edit Resource for %name%'|trans({ '%name%' : person.firstName ~ " " ~ person.lastName } ) %}
 | 
			
		||||
{% block title title %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
{% block content %}
 | 
			
		||||
<h1>{{ title }}</h1>
 | 
			
		||||
 | 
			
		||||
{{ form_start(form) }}
 | 
			
		||||
@@ -17,14 +31,14 @@
 | 
			
		||||
 | 
			
		||||
<ul class="record_actions sticky-form-buttons">
 | 
			
		||||
    <li class="cancel">
 | 
			
		||||
        <a href="{{ path("chill_budget_elements_index", { 'id': person.id } ) }}" class="btn btn-cancel">
 | 
			
		||||
           {{ 'Back to the list'|trans }}
 | 
			
		||||
        <a href="{{ path(indexPage, { 'id': person is defined ? person.id : household.id } ) }}" class="btn btn-cancel">
 | 
			
		||||
            {{ 'Back to the list'|trans }}
 | 
			
		||||
        </a>
 | 
			
		||||
    </li>
 | 
			
		||||
    <li>
 | 
			
		||||
        {{ form_widget(form.submit, { 'attr' : { 'class': 'btn btn-create' }, 'label': 'Edit' } ) }}
 | 
			
		||||
        {{ form_widget(form.submit, { 'attr' : { 'class': 'btn btn-edit' }, 'label': 'Edit' } ) }}
 | 
			
		||||
    </li>
 | 
			
		||||
</ul>
 | 
			
		||||
       
 | 
			
		||||
 | 
			
		||||
{{ form_end(form) }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,24 @@
 | 
			
		||||
{% extends "@ChillPerson/Person/layout.html.twig" %}
 | 
			
		||||
{% if element.person is not null %}
 | 
			
		||||
    {% set template = '@ChillPerson/Person/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set person = element.person %}
 | 
			
		||||
    {% set title = 'New Resource for %name%'|trans({ '%name%' : person.firstName ~ " " ~ person.lastName } ) %}
 | 
			
		||||
{% else %}
 | 
			
		||||
    {% set template = '@ChillPerson/Household/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_household_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set household = element.household %}
 | 
			
		||||
    {% set title = 'New Resource for household %household%'|trans({ '%household%' : household.id } ) %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% set title = 'New resource'|trans %}
 | 
			
		||||
 | 
			
		||||
{% extends template %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = '' %}
 | 
			
		||||
{% set title = 'New Resource for %name%'|trans({ '%name%' : person.firstName ~ " " ~ person.lastName } ) %}
 | 
			
		||||
{% block title title %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
{% block content %}
 | 
			
		||||
<h1>{{ title }}</h1>
 | 
			
		||||
 | 
			
		||||
{{ form_start(form) }}
 | 
			
		||||
@@ -17,14 +31,14 @@
 | 
			
		||||
 | 
			
		||||
<ul class="record_actions sticky-form-buttons">
 | 
			
		||||
    <li class="cancel">
 | 
			
		||||
        <a href="{{ path("chill_budget_elements_index", { 'id': person.id } ) }}" class="btn btn-cancel">
 | 
			
		||||
           {{ 'Back to the list'|trans }}
 | 
			
		||||
        <a href="{{ path(indexPage, { 'id': person is defined ? person.id : household.id } ) }}" class="btn btn-cancel">
 | 
			
		||||
            {{ 'Back to the list'|trans }}
 | 
			
		||||
        </a>
 | 
			
		||||
    </li>
 | 
			
		||||
    <li>
 | 
			
		||||
        {{ form_widget(form.submit, { 'attr' : { 'class': 'btn btn-create' }, 'label': 'Create' } ) }}
 | 
			
		||||
    </li>
 | 
			
		||||
</ul>
 | 
			
		||||
       
 | 
			
		||||
 | 
			
		||||
{{ form_end(form) }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,49 +1,68 @@
 | 
			
		||||
{% extends "@ChillPerson/Person/layout.html.twig" %}
 | 
			
		||||
{% if element.person is not null %}
 | 
			
		||||
    {% set template = '@ChillPerson/Person/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set person = element.person %}
 | 
			
		||||
{% else %}
 | 
			
		||||
    {% set template = '@ChillPerson/Household/layout.html.twig' %}
 | 
			
		||||
    {% set indexPage = 'chill_budget_elements_household_index' %}
 | 
			
		||||
    {% set activeRouteKey = '' %}
 | 
			
		||||
    {% set household = element.household %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% set activeRouteKey = '' %}
 | 
			
		||||
{% set person = element.person %}
 | 
			
		||||
{% set title = 'Resource for %name%'|trans({ '%name%' : person.firstName ~ " " ~ person.lastName } ) %}
 | 
			
		||||
{% set title = 'Resource' %}
 | 
			
		||||
 | 
			
		||||
{% extends template %}
 | 
			
		||||
 | 
			
		||||
{% block title title %}
 | 
			
		||||
 | 
			
		||||
{% block personcontent %}
 | 
			
		||||
<h1>{{ title }}</h1>
 | 
			
		||||
{% block content %}
 | 
			
		||||
<div class="budget-show">
 | 
			
		||||
    <h1>{{ title }}</h1>
 | 
			
		||||
 | 
			
		||||
<dl class="chill_view_data">
 | 
			
		||||
    <dt>{{ 'Type'|trans }}</dt>
 | 
			
		||||
    <dd>{{ element.type|budget_element_type_display('resource') }}</dd>
 | 
			
		||||
 | 
			
		||||
    <dt>{{ 'Amount'|trans }}</dt>
 | 
			
		||||
    <dd>{{ element.amount|format_currency('EUR') }}</dd>
 | 
			
		||||
 | 
			
		||||
    <dt>{{ 'Validity period'|trans }}</dt>
 | 
			
		||||
    <dd>
 | 
			
		||||
        {% if element.endDate is not null %}
 | 
			
		||||
            {{ 'Valid since %startDate% until %endDate%'|trans( { '%startDate%': element.startDate|format_date('long'), '%endDate%': familyMember.endDate|format_date('long') } ) }}
 | 
			
		||||
        {% else %}
 | 
			
		||||
            {{ 'Valid since %startDate%'|trans( { '%startDate%': element.startDate|format_date('long') } ) }}
 | 
			
		||||
        {% endif %}
 | 
			
		||||
    </dd>
 | 
			
		||||
 | 
			
		||||
    <dt>{{ 'Comment'|trans }}</dt>
 | 
			
		||||
    <dd>
 | 
			
		||||
        {%- if element.comment is not empty -%}
 | 
			
		||||
        <blockquote class="chill-user-quote">
 | 
			
		||||
            {{ element.comment }}
 | 
			
		||||
        </blockquote>
 | 
			
		||||
        {%- else -%}
 | 
			
		||||
        <span class="chill-no-data-statement">{{ 'Not given'|trans }}</span>
 | 
			
		||||
        {%- endif -%}
 | 
			
		||||
    </dd>
 | 
			
		||||
</dl>
 | 
			
		||||
    <div class="flex-table">
 | 
			
		||||
        <div class="item-bloc">
 | 
			
		||||
            <div class="item-row">
 | 
			
		||||
                <h2 class="badge-title">
 | 
			
		||||
                    <span class="title_label title_label_resource"></span>
 | 
			
		||||
                    <span class="title_action title_action">{{ element.type|budget_element_type_display('resource') }}</span>
 | 
			
		||||
                </h2>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="item-row separator">
 | 
			
		||||
                <dl class="chill_view_data">
 | 
			
		||||
                        <dt class="inline">{{ 'Amount'|trans }}</dt>
 | 
			
		||||
                        <dd>{{ element.amount|format_currency('EUR') }}</dd>
 | 
			
		||||
                        <dt class="inline">{{ 'Validity period'|trans }}</dt>
 | 
			
		||||
                        <dd>
 | 
			
		||||
                            {% if element.endDate is not null %}
 | 
			
		||||
                                {{ 'Valid since %startDate% until %endDate%'|trans( { '%startDate%': element.startDate|format_date('long'), '%endDate%': element.endDate|format_date('long') } ) }}
 | 
			
		||||
                            {% else %}
 | 
			
		||||
                                {{ 'Valid since %startDate%'|trans( { '%startDate%': element.startDate|format_date('long') } ) }}
 | 
			
		||||
                            {% endif %}
 | 
			
		||||
                        </dd>
 | 
			
		||||
                        <dt class="inline">{{ 'Comment'|trans }}</dt>
 | 
			
		||||
                        <dd>
 | 
			
		||||
                            {%- if element.comment is not empty -%}
 | 
			
		||||
                            <blockquote class="chill-user-quote">
 | 
			
		||||
                                {{ element.comment }}
 | 
			
		||||
                            </blockquote>
 | 
			
		||||
                            {%- else -%}
 | 
			
		||||
                            <span class="chill-no-data-statement">{{ 'Not given'|trans }}</span>
 | 
			
		||||
                            {%- endif -%}
 | 
			
		||||
                        </dd>
 | 
			
		||||
                </dl>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<ul class="record_actions sticky-form-buttons">
 | 
			
		||||
    <li class="cancel">
 | 
			
		||||
        <a href="{{ path("chill_budget_elements_index", { 'id': person.id } ) }}" class="btn btn-cancel">
 | 
			
		||||
           {{ 'Back to the list'|trans }}
 | 
			
		||||
        <a href="{{ path(indexPage, { 'id': person is defined ? person.id : household.id } ) }}" class="btn btn-cancel">
 | 
			
		||||
            {{ 'Back to the list'|trans }}
 | 
			
		||||
        </a>
 | 
			
		||||
    </li>
 | 
			
		||||
    {% if is_granted(constant('Chill\\AMLI\\BudgetBundle\\Security\\Authorization\\BudgetElementVoter::UPDATE'), element) %}
 | 
			
		||||
    {% if is_granted('CHILL_BUDGET_ELEMENT_UPDATE', element) %}
 | 
			
		||||
        <li>
 | 
			
		||||
            <a href="{{ path('chill_budget_resource_edit', { 'id': element.id } ) }}" class="btn btn-edit">{{ 'Edit'|trans }}</a>
 | 
			
		||||
        </li>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,15 +9,16 @@
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\AMLI\BudgetBundle\Security\Authorization;
 | 
			
		||||
namespace Chill\BudgetBundle\Security\Authorization;
 | 
			
		||||
 | 
			
		||||
use Chill\AMLI\BudgetBundle\Entity\AbstractElement;
 | 
			
		||||
use Chill\MainBundle\Entity\User;
 | 
			
		||||
use Chill\BudgetBundle\Entity\AbstractElement;
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\AbstractChillVoter;
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\VoterHelperFactoryInterface;
 | 
			
		||||
use Chill\MainBundle\Security\Authorization\VoterHelperInterface;
 | 
			
		||||
use Chill\MainBundle\Security\ProvideRoleHierarchyInterface;
 | 
			
		||||
use Chill\PersonBundle\Entity\Household\Household;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use Symfony\Component\Security\Core\Role\Role;
 | 
			
		||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
 | 
			
		||||
 | 
			
		||||
use function in_array;
 | 
			
		||||
 | 
			
		||||
@@ -30,22 +31,24 @@ class BudgetElementVoter extends AbstractChillVoter implements ProvideRoleHierar
 | 
			
		||||
    public const ROLES = [
 | 
			
		||||
        self::CREATE,
 | 
			
		||||
        self::DELETE,
 | 
			
		||||
        self::SHOW,
 | 
			
		||||
        self::SEE,
 | 
			
		||||
        self::UPDATE,
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    public const SHOW = 'CHILL_BUDGET_ELEMENT_SHOW';
 | 
			
		||||
    public const SEE = 'CHILL_BUDGET_ELEMENT_SEE';
 | 
			
		||||
 | 
			
		||||
    public const UPDATE = 'CHILL_BUDGET_ELEMENT_UPDATE';
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @var AuthorizationHelper
 | 
			
		||||
     */
 | 
			
		||||
    protected $authorizationHelper;
 | 
			
		||||
    protected VoterHelperInterface $voter;
 | 
			
		||||
 | 
			
		||||
    public function __construct(AuthorizationHelper $authorizationHelper)
 | 
			
		||||
    public function __construct(VoterHelperFactoryInterface $voterFactory)
 | 
			
		||||
    {
 | 
			
		||||
        $this->authorizationHelper = $authorizationHelper;
 | 
			
		||||
        $this->voter = $voterFactory
 | 
			
		||||
            ->generate(self::class)
 | 
			
		||||
            ->addCheckFor(AbstractElement::class, self::ROLES)
 | 
			
		||||
            ->addCheckFor(Person::class, [self::CREATE, self::SEE])
 | 
			
		||||
            ->addCheckFor(Household::class, [self::CREATE, self::SEE])
 | 
			
		||||
            ->build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getRoles(): array
 | 
			
		||||
@@ -66,18 +69,11 @@ class BudgetElementVoter extends AbstractChillVoter implements ProvideRoleHierar
 | 
			
		||||
    protected function supports($attribute, $subject)
 | 
			
		||||
    {
 | 
			
		||||
        return (in_array($attribute, self::ROLES, true) && $subject instanceof AbstractElement)
 | 
			
		||||
                || ($subject instanceof Person && in_array($attribute, [self::SHOW, self::CREATE], true));
 | 
			
		||||
                || (($subject instanceof Person || $subject instanceof Household) && in_array($attribute, [self::SEE, self::CREATE], true));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected function voteOnAttribute($attribute, $subject, \Symfony\Component\Security\Core\Authentication\Token\TokenInterface $token)
 | 
			
		||||
    protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
 | 
			
		||||
    {
 | 
			
		||||
        $user = $token->getUser();
 | 
			
		||||
 | 
			
		||||
        if (false === $user instanceof User) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->authorizationHelper
 | 
			
		||||
            ->userHasAccess($user, $subject, new Role($attribute));
 | 
			
		||||
        return $this->voter->voteOnAttribute($attribute, $subject, $token);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										168
									
								
								src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudget.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudget.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,168 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Chill is a software for social workers
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view
 | 
			
		||||
 * the LICENSE file that was distributed with this source code.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
declare(strict_types=1);
 | 
			
		||||
 | 
			
		||||
namespace Chill\BudgetBundle\Service\Summary;
 | 
			
		||||
 | 
			
		||||
use Chill\BudgetBundle\Config\ConfigRepository;
 | 
			
		||||
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
 | 
			
		||||
use Chill\PersonBundle\Entity\Household\Household;
 | 
			
		||||
use Chill\PersonBundle\Entity\Person;
 | 
			
		||||
use Doctrine\ORM\EntityManagerInterface;
 | 
			
		||||
use Doctrine\ORM\Query\ResultSetMapping;
 | 
			
		||||
use LogicException;
 | 
			
		||||
use function count;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helps to find a summary of the budget: the sum of resources and charges.
 | 
			
		||||
 */
 | 
			
		||||
class SummaryBudget implements SummaryBudgetInterface
 | 
			
		||||
{
 | 
			
		||||
    private const QUERY_CHARGE_BY_HOUSEHOLD = 'select SUM(amount) AS sum, string_agg(comment, \'|\') AS comment, type FROM chill_budget.charge WHERE (person_id IN (_ids_) OR household_id = ?) AND NOW() BETWEEN startdate AND COALESCE(enddate, \'infinity\'::timestamp) GROUP BY type';
 | 
			
		||||
 | 
			
		||||
    private const QUERY_CHARGE_BY_PERSON = 'select SUM(amount) AS sum, string_agg(comment, \'|\') AS comment, type FROM chill_budget.charge WHERE person_id = ? AND NOW() BETWEEN startdate AND COALESCE(enddate, \'infinity\'::timestamp) GROUP BY type';
 | 
			
		||||
 | 
			
		||||
    private const QUERY_RESOURCE_BY_HOUSEHOLD = 'select SUM(amount) AS sum, string_agg(comment, \'|\') AS comment, type FROM chill_budget.resource WHERE (person_id IN (_ids_) OR household_id = ?) AND NOW() BETWEEN startdate AND COALESCE(enddate, \'infinity\'::timestamp) GROUP BY type';
 | 
			
		||||
 | 
			
		||||
    private const QUERY_RESOURCE_BY_PERSON = 'select SUM(amount) AS sum, string_agg(comment, \'|\') AS comment, type FROM chill_budget.resource WHERE person_id = ? AND NOW() BETWEEN startdate AND COALESCE(enddate, \'infinity\'::timestamp) GROUP BY type';
 | 
			
		||||
 | 
			
		||||
    private array $chargeLabels;
 | 
			
		||||
 | 
			
		||||
    private ConfigRepository $configRepository;
 | 
			
		||||
 | 
			
		||||
    private EntityManagerInterface $em;
 | 
			
		||||
 | 
			
		||||
    private array $resourcesLabels;
 | 
			
		||||
 | 
			
		||||
    private TranslatableStringHelperInterface $translatableStringHelper;
 | 
			
		||||
 | 
			
		||||
    public function __construct(EntityManagerInterface $em, ConfigRepository $configRepository, TranslatableStringHelperInterface $translatableStringHelper)
 | 
			
		||||
    {
 | 
			
		||||
        $this->em = $em;
 | 
			
		||||
        $this->configRepository = $configRepository;
 | 
			
		||||
        $this->chargeLabels = $configRepository->getChargesLabels();
 | 
			
		||||
        $this->resourcesLabels = $configRepository->getResourcesLabels();
 | 
			
		||||
        $this->translatableStringHelper = $translatableStringHelper;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getSummaryForHousehold(?Household $household): array
 | 
			
		||||
    {
 | 
			
		||||
        if (null === $household) {
 | 
			
		||||
            return [
 | 
			
		||||
                'resources' => $this->getEmptyResourceArray(),
 | 
			
		||||
                'charges' => $this->getEmptyChargeArray(),
 | 
			
		||||
            ];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $personIds = $household->getCurrentPersons()->map(static function (Person $p) { return $p->getId(); });
 | 
			
		||||
        $ids = implode(', ', array_fill(0, count($personIds), '?'));
 | 
			
		||||
 | 
			
		||||
        $parameters = [...$personIds, $household->getId()];
 | 
			
		||||
 | 
			
		||||
        $rsm = $this->buildRsm();
 | 
			
		||||
 | 
			
		||||
        $resources = $this->em->createNativeQuery(strtr(self::QUERY_RESOURCE_BY_HOUSEHOLD, ['_ids_' => $ids]), $rsm)
 | 
			
		||||
            ->setParameters($parameters)
 | 
			
		||||
            ->getResult();
 | 
			
		||||
        $charges = $this->em->createNativeQuery(strtr(self::QUERY_CHARGE_BY_HOUSEHOLD, ['_ids_' => $ids]), $rsm)
 | 
			
		||||
            ->setParameters($parameters)
 | 
			
		||||
            ->getResult();
 | 
			
		||||
 | 
			
		||||
        return [
 | 
			
		||||
            'resources' => array_merge($this->getEmptyResourceArray(), $this->rowToArray($resources, 'resource')),
 | 
			
		||||
            'charges' => array_merge($this->getEmptyChargeArray(), $this->rowToArray($charges, 'charge')),
 | 
			
		||||
        ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getSummaryForPerson(?Person $person): array
 | 
			
		||||
    {
 | 
			
		||||
        if (null === $person) {
 | 
			
		||||
            return [
 | 
			
		||||
                'resources' => $this->getEmptyResourceArray(),
 | 
			
		||||
                'charges' => $this->getEmptyChargeArray(),
 | 
			
		||||
            ];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $rsm = $this->buildRsm();
 | 
			
		||||
 | 
			
		||||
        $resources = $this->em->createNativeQuery(self::QUERY_RESOURCE_BY_PERSON, $rsm)
 | 
			
		||||
            ->setParameters([$person->getId()])
 | 
			
		||||
            ->getResult();
 | 
			
		||||
        $charges = $this->em->createNativeQuery(self::QUERY_CHARGE_BY_PERSON, $rsm)
 | 
			
		||||
            ->setParameters([$person->getId()])
 | 
			
		||||
            ->getResult();
 | 
			
		||||
 | 
			
		||||
        return [
 | 
			
		||||
            'resources' => array_merge($this->getEmptyResourceArray(), $this->rowToArray($resources, 'resource')),
 | 
			
		||||
            'charges' => array_merge($this->getEmptyChargeArray(), $this->rowToArray($charges, 'charge')),
 | 
			
		||||
        ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function buildRsm(): ResultSetMapping
 | 
			
		||||
    {
 | 
			
		||||
        $rsm = new ResultSetMapping();
 | 
			
		||||
        $rsm
 | 
			
		||||
            ->addScalarResult('sum', 'sum')
 | 
			
		||||
            ->addScalarResult('type', 'type')
 | 
			
		||||
            ->addScalarResult('comment', 'comment');
 | 
			
		||||
 | 
			
		||||
        return $rsm;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function getEmptyChargeArray(): array
 | 
			
		||||
    {
 | 
			
		||||
        $keys = $this->configRepository->getChargesKeys();
 | 
			
		||||
        $labels = $this->chargeLabels;
 | 
			
		||||
 | 
			
		||||
        return array_combine($keys, array_map(function ($i) use ($labels) {
 | 
			
		||||
            return ['sum' => 0.0, 'label' => $this->translatableStringHelper->localize($labels[$i]), 'comment' => ''];
 | 
			
		||||
        }, $keys));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function getEmptyResourceArray(): array
 | 
			
		||||
    {
 | 
			
		||||
        $keys = $this->configRepository->getResourcesKeys();
 | 
			
		||||
        $labels = $this->resourcesLabels;
 | 
			
		||||
 | 
			
		||||
        return array_combine($keys, array_map(function ($i) use ($labels) {
 | 
			
		||||
            return ['sum' => 0.0, 'label' => $this->translatableStringHelper->localize($labels[$i]), 'comment' => ''];
 | 
			
		||||
        }, $keys));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function rowToArray(array $rows, string $kind): array
 | 
			
		||||
    {
 | 
			
		||||
        switch ($kind) {
 | 
			
		||||
            case 'charge':
 | 
			
		||||
                $label = $this->chargeLabels;
 | 
			
		||||
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case 'resource':
 | 
			
		||||
                $label = $this->resourcesLabels;
 | 
			
		||||
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                throw new LogicException();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $result = [];
 | 
			
		||||
 | 
			
		||||
        foreach ($rows as $row) {
 | 
			
		||||
            $result[$row['type']] = [
 | 
			
		||||
                'sum' => (float) $row['sum'],
 | 
			
		||||
                'label' => $this->translatableStringHelper->localize($label[$row['type']]),
 | 
			
		||||
                'comment' => (string) $row['comment'],
 | 
			
		||||
            ];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user