mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-31 02:36:28 +00:00 
			
		
		
		
	Compare commits
	
		
			1020 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | abd34ba1dc | ||
|  | 89b7596caf | ||
|  | 3543548ba0 | ||
|  | a932965908 | ||
|  | 9056126328 | ||
|  | 0e85a5123d | ||
|  | d3f19db42d | ||
|  | 9894d16d26 | ||
|  | 0b069bcb58 | ||
|  | 36d54c3fac | ||
|  | 530e48f16e | ||
|  | 9763f9f922 | ||
|  | bbd4d7a8ef | ||
|  | bafe2ece8c | ||
|  | b2449eb726 | ||
|  | 353c345d9a | ||
|  | e2461ba839 | ||
|  | e199fdd2b6 | ||
|  | 592a89d6a5 | ||
|  | 7a7b629225 | ||
|  | 21a4774561 | ||
|  | 5be97bb18f | ||
|  | a12ff10550 | ||
|  | c808294ca1 | ||
|  | 9dcf264658 | ||
|  | e0bbd3a810 | ||
|  | 2886a22f4e | ||
|  | 6f783f7662 | ||
|  | 992fdc9e27 | ||
|  | 73529c31e0 | ||
|  | d9fc91a432 | ||
|  | 6a432e7931 | ||
|  | 26f7575ba2 | ||
|  | b1c1bbd6c0 | ||
|  | d40643af54 | ||
|  | 11cfefd908 | ||
|  | ff2b2eec9b | ||
|  | 4f1187bf6e | ||
|  | 642539e410 | ||
|  | 1f774e0d71 | ||
|  | 1da19cde6f | ||
|  | ac5973833e | ||
|  | 40b0e31d27 | ||
|  | f56f8d72df | ||
|  | b47bb13558 | ||
|  | b4133b6512 | ||
|  | fb20095502 | ||
|  | cfc23c4cb9 | ||
|  | 44701f1633 | ||
|  | fadf799b9c | ||
|  | c22a9784ee | ||
|  | a6512d3d74 | ||
|  | cea2ca7532 | ||
|  | e322069bb4 | ||
|  | da7a976c4e | ||
|  | 300dba7257 | ||
|  | ec59f80fe3 | ||
|  | 37aa5bcc60 | ||
|  | e50d2cb481 | ||
|  | 468709c092 | ||
|  | 11ced9216c | ||
|  | cfa9151f45 | ||
|  | 6577224a55 | ||
|  | b4209f2e72 | ||
|  | f045e4ea69 | ||
|  | 4a37152aea | ||
|  | 2907db1380 | ||
|  | 80a35692c5 | ||
|  | 1a6fe5ca3c | ||
|  | 13ec3493bd | ||
|  | bf55e8df72 | ||
|  | 775504d812 | ||
|  | 8d6c45b68e | ||
|  | db9094956e | ||
|  | 25d02e92f4 | ||
|  | 81cb0a38f3 | ||
|  | e07a9d6162 | ||
|  | 2ccbc16dfa | ||
|  | e00addc0b0 | ||
|  | da7a2cf0c0 | ||
|  | 2368788405 | ||
|  | f603415931 | ||
|  | 523fa42998 | ||
|  | e449395f3f | ||
|  | d8d8002f1e | ||
|  | 2570ca9573 | ||
|  | e5fdc2cbfd | ||
|  | 0349cdbc1b | ||
|  | 122f0309a6 | ||
|  | 09bff5ea4e | ||
|  | 7ea112c5e7 | ||
|  | 44df07a5f5 | ||
|  | 66b0d9d309 | ||
|  | 6ac3d3e62c | ||
|  | 925450f84c | ||
|  | 62f59c6a19 | ||
|  | 7db21612a0 | ||
|  | 2c0da2cf26 | ||
|  | 79484cc194 | ||
|  | 6f18748c72 | ||
|  | 577824930f | ||
|  | d614519ee7 | ||
|  | ae31041f7f | ||
|  | 62c4d0cf86 | ||
|  | c2ddabbad2 | ||
|  | 458402aaff | ||
|  | 5c81e98218 | ||
|  | 37a46b02f4 | ||
|  | b3e1ecdd02 | ||
|  | 1780e6dc61 | ||
|  | 50f346d092 | ||
|  | ccc851090a | ||
|  | 4605d84cc8 | ||
|  | 8c7ab50325 | ||
|  | 908539836b | ||
|  | 9f71cf966c | ||
|  | 02ed47c578 | ||
|  | 1ddbaf0884 | ||
|  | d3ed8c6f0f | ||
|  | 4f1ac2ac6f | ||
|  | 1e733f4c8b | ||
|  | 8e2546da9d | ||
|  | 3a8162d3c5 | ||
|  | f7ceb75316 | ||
|  | 744e193faa | ||
|  | 12b0e11592 | ||
|  | 717f3a9e3d | ||
|  | b9f0682f04 | ||
|  | 8792465fd5 | ||
|  | 6fbf9a119d | ||
|  | 0dfa21a92e | ||
|  | 136fe8e8eb | ||
|  | d510c4e31d | ||
|  | c066bcc4ce | ||
|  | c9e7ae1f08 | ||
|  | 6a9b4f4d55 | ||
|  | 2b5054b905 | ||
|  | 0a45a2485b | ||
|  | fcc0294d07 | ||
|  | ad981c2bf0 | ||
|  | 75a32b2f94 | ||
|  | 70b60f756b | ||
|  | 0d2ae8ae23 | ||
|  | 8043c86942 | ||
|  | 4c30a7bc55 | ||
|  | f615b9c252 | ||
|  | c19b36a391 | ||
|  | 935634e487 | ||
|  | 2c3f032a2b | ||
|  | 7e62b75b12 | ||
|  | de57ab0874 | ||
|  | 6fb4aaecd3 | ||
|  | 45fdbf5a11 | ||
|  | c6615a7b17 | ||
|  | 0efb3d2dcf | ||
|  | b8a58f83ee | ||
|  | 110228e65e | ||
|  | 8ad27e0eda | ||
|  | 2e0d90c685 | ||
|  | bd2ecb13b8 | ||
|  | 5725570dbb | ||
|  | 11f77685e4 | ||
|  | 0521c46d27 | ||
|  | 50d6225590 | ||
|  | df55f7de79 | ||
|  | 5152ae9622 | ||
|  | 075d0da63d | ||
|  | d804df2a2f | ||
|  | ff0f8beb81 | ||
|  | c00be92f97 | ||
|  | 88f6221424 | ||
|  | f9463e02a2 | ||
|  | 25a23801be | ||
|  | fe7bb02dc5 | ||
|  | 68edcfc4e8 | ||
|  | 5f8a24a684 | ||
|  | 0a5d62605a | ||
|  | 1873be8d95 | ||
|  | 01892c3828 | ||
|  | b87e60c72f | ||
|  | 3a083f88b5 | ||
|  | 566bb2f097 | ||
|  | 1ba7847d84 | ||
|  | c32044a8eb | ||
|  | 72a2d417af | ||
|  | 09c18d6d44 | ||
|  | 84ae6a633e | ||
|  | 82749cea07 | ||
|  | 23aa0e3ba3 | ||
|  | 8be27a2201 | ||
|  | ff98f3cc3e | ||
|  | 01c4d25646 | ||
|  | 292b9ac9d0 | ||
|  | 6bdae03961 | ||
|  | 7426c6aac3 | ||
|  | 211526c032 | ||
|  | e6fe08dd61 | ||
|  | 7bba67130a | ||
|  | 7186d8ddfd | ||
|  | 1a6bc6decd | ||
|  | 5b11c86113 | ||
|  | 98b95ab891 | ||
|  | c3068d10bf | ||
|  | fa1a1b084b | ||
|  | 387e44b8b9 | ||
|  | 6dafa89a15 | ||
|  | 5b5b8008b0 | ||
|  | 38a955e663 | ||
|  | 62921df702 | ||
|  | c7c2b85882 | ||
|  | bc26ee5cde | ||
|  | 9eca31529c | ||
|  | 25e3abeeb8 | ||
|  | 53d6281ba4 | ||
|  | 4b9fd949ad | ||
|  | 786b4c18a1 | ||
|  | 97b65ac44c | ||
|  | 102da7b21e | ||
|  | 85bde79fd1 | ||
|  | 09a25957d0 | ||
|  | fd7a2181a4 | ||
|  | 2ede3b420b | ||
|  | 4bed30347d | ||
|  | ffdcab3220 | ||
|  | 956108399b | ||
|  | 61c38f2a99 | ||
|  | f3773ebfc2 | ||
|  | f963ac63f1 | ||
|  | 1368aafe5f | ||
|  | 657262f179 | ||
|  | 8b9dce70bb | ||
|  | 30bbd0b3a4 | ||
|  | d4488f041b | ||
|  | fa8dc1ae4b | ||
|  | c2b60edca3 | ||
|  | 949ca4f79e | ||
|  | ab0b03dd14 | ||
|  | 5b41e58025 | ||
|  | 88bf76fa27 | ||
|  | 3ad155882a | ||
|  | 4747e28621 | ||
|  | 5664695a92 | ||
|  | fdcd31652a | ||
|  | e5397b6659 | ||
|  | 51e5b9a994 | ||
|  | dc95632834 | ||
|  | 3e888382c9 | ||
|  | de8d6f8439 | ||
|  | 60543b8f1d | ||
|  | 268cec6d08 | ||
|  | 94aea91927 | ||
|  | 135a6993aa | ||
|  | 16079f496a | ||
|  | e318e8e9cf | ||
|  | 51ca8277bb | ||
|  | a49cf1fd3d | ||
|  | 81a11ee5b4 | ||
|  | b778424b7e | ||
|  | d408d7cc20 | ||
|  | 228870ceac | ||
|  | ae1939cd1b | ||
|  | f7a4bd5d12 | ||
|  | eec1888f87 | ||
|  | a42470e5b4 | ||
|  | 098f1fe0f6 | ||
|  | 2e5bc750d1 | ||
|  | d777a1f2b8 | ||
|  | 5178e19cea | ||
|  | be8aaa68af | ||
|  | 1e31a1184a | ||
|  | c269be7f07 | ||
|  | 6bf42ba237 | ||
|  | 1901648a05 | ||
|  | 789a6cebcd | ||
|  | 4230349c07 | ||
|  | 33b95b9371 | ||
|  | e47110607c | ||
|  | 1e3665e54f | ||
|  | 47147066d2 | ||
|  | 5b8f67e992 | ||
|  | fb1a66d872 | ||
|  | e594b9304a | ||
|  | 0d7fd36c38 | ||
|  | bdba786322 | ||
|  | 507e0fb54c | ||
|  | e4d91aa337 | ||
|  | 4e6fc8e2a2 | ||
|  | 244ffb2450 | ||
|  | 7aa3aef508 | ||
|  | c16f7d214f | ||
|  | c08d44ea48 | ||
|  | 6381d04e2b | ||
|  | ec43d10e35 | ||
|  | b32d9aab34 | ||
|  | de5cb4c165 | ||
|  | 609edb9dff | ||
|  | 636b3921fa | ||
|  | a391d731ff | ||
|  | c743b0c66b | ||
|  | ef09f88816 | ||
|  | ffeada037d | ||
|  | 4723d9dd30 | ||
|  | b84604a4db | ||
|  | 1bd1a9cba3 | ||
|  | d0c830c560 | ||
|  | 06d3cc3506 | ||
|  | 2b90c20db8 | ||
|  | ebe1fd6142 | ||
|  | ca8f153c6a | ||
|  | 581e5d7330 | ||
|  | 067d160c13 | ||
|  | e8890ada7c | ||
|  | c5fbf6ec55 | ||
|  | 5cd9793edf | ||
|  | c60b5e5c21 | ||
|  | b2bd9301b6 | ||
|  | 4864ecc0c7 | ||
|  | 58dea55d38 | ||
|  | 34e22e0747 | ||
|  | 7c9f74f550 | ||
|  | f0517aee53 | ||
|  | f69072d293 | ||
|  | 669aedeea3 | ||
|  | 8a4985261a | ||
|  | 337d14e71e | ||
|  | ebf4b00288 | ||
|  | a445bc53cd | ||
|  | 1f7ceb6df6 | ||
|  | 135b9fc010 | ||
|  | 655d03bec4 | ||
|  | bc50d25468 | ||
|  | e40bb81d80 | ||
|  | 53e972fbba | ||
|  | 51d244cfe6 | ||
|  | 3842552256 | ||
|  | c9d5d74662 | ||
|  | 4961b1f715 | ||
|  | 680012056b | ||
|  | 64ec0cf62e | ||
|  | c4f6366642 | ||
|  | 28021aa711 | ||
|  | bf5a15077d | ||
|  | 9506b37200 | ||
|  | ee41eadcd9 | ||
|  | 5ecc1929f9 | ||
|  | 1186359898 | ||
|  | aabf73d3e9 | ||
|  | da4e813d9a | ||
|  | cbcadb6706 | ||
|  | 9f0b4564cf | ||
|  | 327b0b4a37 | ||
|  | 77695409f6 | ||
|  | 92cdec2877 | ||
|  | 4804f419ef | ||
|  | 0c52c85e25 | ||
|  | 5ca1367a7c | ||
|  | 68acd52c86 | ||
|  | bd221a59d6 | ||
|  | b91a938a60 | ||
|  | 698c1f6c7e | ||
|  | 2f110ab9a8 | ||
|  | a1dfb3a99e | ||
|  | b2a301bf94 | ||
|  | 3b3f9ee497 | ||
|  | 0b22b056bc | ||
|  | ce239a5bb1 | ||
|  | ce023f2580 | ||
|  | 46e130fdfe | ||
|  | c2b22a2bac | ||
|  | 9a807fc215 | ||
|  | 8ef74e9fd2 | ||
|  | abd123b1c8 | ||
|  | 7e72003984 | ||
|  | 69f653d0c9 | ||
|  | e6e9535509 | ||
|  | 45787a30de | ||
|  | 18e4c2ab33 | ||
|  | c063bcf80d | ||
|  | eb8b7af7aa | ||
|  | c60fb0c68c | ||
|  | 84e99a065f | ||
|  | 369e980466 | ||
|  | 963d4b7345 | ||
|  | eaf6bd3fa0 | ||
|  | 9b4a30565c | ||
|  | c37a877f34 | ||
|  | d2a895ddda | ||
|  | 2660dc5bf7 | ||
|  | 40083bf2b4 | ||
|  | 3136bccb24 | ||
|  | a5c370c70e | ||
|  | 01a897b5e1 | ||
|  | 722ae91c02 | ||
|  | 6df7f1f762 | ||
|  | 7aacd1f945 | ||
|  | b02a61dfbd | ||
|  | 2b0a3ec818 | ||
|  | 00410c8486 | ||
|  | 8e0f0b03d8 | ||
|  | 7c3f2dd83a | ||
|  | d2f0eab4c4 | ||
|  | a8ade914ac | ||
|  | ef08b7eb93 | ||
|  | 726ed3292a | ||
|  | 5883dfbed8 | ||
|  | 271e4271eb | ||
|  | 627db2c2df | ||
|  | b9feb0aa71 | ||
|  | 155084084d | ||
|  | 1c3cb85a46 | ||
|  | b0a39c00ba | ||
|  | 7cb919e9c2 | ||
|  | cbecacd652 | ||
|  | 14e9d73768 | ||
|  | 8604b05d07 | ||
|  | b66bac497e | ||
|  | 6ad38b38b8 | ||
|  | 53f31f17d2 | ||
|  | a7bfdbe31f | ||
|  | 72ead65d9c | ||
|  | 846c60fb85 | ||
|  | 938446ede3 | ||
|  | 68f01d932e | ||
|  | a6c355c7b8 | ||
|  | 5e49e149b1 | ||
|  | 06fd8dc5e0 | ||
|  | 43c79af293 | ||
|  | 3355645cb4 | ||
|  | bac0710a9c | ||
|  | 47d8ab685d | ||
|  | 9fd4d29fda | ||
|  | 0126669fa8 | ||
|  | 1e01eb7bc2 | ||
|  | ed28102aff | ||
|  | 6c91ca5463 | ||
|  | 9ab926f9ab | ||
|  | 29132b18ab | ||
|  | 28307edf81 | ||
|  | 7310e7a3e5 | ||
|  | ff7219a955 | ||
|  | 97d739e254 | ||
|  | 8f26bbdaa0 | ||
|  | 67ef185a72 | ||
|  | 76954f4a13 | ||
|  | afb9e6ef71 | ||
|  | 28112a2283 | ||
|  | c5db6c9201 | ||
|  | 64813d4ba7 | ||
|  | 67e2c061ab | ||
|  | d149cf01bd | ||
|  | 590c3cf6f8 | ||
|  | 93b25842e2 | ||
|  | fa240c0e00 | ||
|  | 1b489385b2 | ||
|  | bac0f99b9b | ||
|  | 8a66249b3d | ||
|  | 77bbe1e213 | ||
|  | 9973fd2970 | ||
|  | 64ea59e4ec | ||
|  | 80b8e676d0 | ||
|  | 867d932e59 | ||
|  | 57fb0d7f3b | ||
|  | 97cc2405a9 | ||
|  | 0022201c4f | ||
|  | 6f6b8d9b3e | ||
|  | 1d2e95f5af | ||
|  | a0564751d6 | ||
|  | 4edd9fe3da | ||
|  | 5b05fb07ae | ||
|  | 998fed7782 | ||
|  | c0cc896102 | ||
|  | 2d5790c417 | ||
|  | 1b978d41e0 | ||
|  | 9002365e6d | ||
|  | c1cc71f85c | ||
|  | ff599795d3 | ||
|  | 688f50ee3f | ||
|  | e51fef3037 | ||
|  | 0f6f4e1a50 | ||
|  | fe0a205a05 | ||
|  | 1059da8a2a | ||
|  | e41236495f | ||
|  | 7436f94feb | ||
|  | bcf1e4dc13 | ||
|  | ba0843d0bb | ||
|  | 5a35960434 | ||
|  | 6eabe5fa8c | ||
|  | 8cb72d8d7d | ||
|  | f81b5bea9d | ||
|  | fa45076e48 | ||
|  | 08c07352ae | ||
|  | 94b0028254 | ||
|  | b77b3e3fc8 | ||
|  | 4db6933c17 | ||
|  | 88160df2e8 | ||
|  | 0220cf9784 | ||
|  | ef428a0226 | ||
|  | dc45131f73 | ||
|  | 633d84449a | ||
|  | c3a779df12 | ||
|  | 280c941899 | ||
|  | d653bb24cb | ||
|  | 9879378566 | ||
|  | 7b4eb9f1df | ||
|  | 101bcc250e | ||
|  | dedc1e8131 | ||
|  | 3b4b074bae | ||
|  | 4ee3c7d83e | ||
|  | d36feebb71 | ||
|  | 6790c318e2 | ||
|  | e9ef7d4144 | ||
|  | a3a412d553 | ||
|  | d0d7a0befc | ||
|  | 6b2e3dcb2a | ||
|  | ab6d05cac3 | ||
|  | c46962306e | ||
|  | 821bf6d657 | ||
|  | f3df1d0a04 | ||
|  | d7ff7c633d | ||
|  | 06629b0b89 | ||
|  | ee9ab3d548 | ||
|  | feb171171d | ||
|  | 21fede0dd0 | ||
|  | 12675dd950 | ||
|  | 5e32878d01 | ||
|  | 9a17a11b37 | ||
|  | 4f2159b54d | ||
|  | 075d459b7c | ||
|  | e65d0eef6e | ||
|  | 91b7d20f9b | ||
|  | 59d96f2893 | ||
|  | aa1a521cf0 | ||
|  | 4bb171128e | ||
|  | a28f561e0c | ||
|  | 3b6c727916 | ||
|  | 447ec63299 | ||
|  | f1a8d3cc81 | ||
|  | 4d7909e23d | ||
|  | 6f13600fb5 | ||
|  | c9fefcd8f4 | ||
|  | fa31483b02 | ||
|  | e7be0eae8a | ||
|  | 86c70cf232 | ||
|  | a3490e97c0 | ||
|  | 85b1768908 | ||
|  | 6ab462a795 | ||
|  | 70f46338db | ||
|  | 461b5ad859 | ||
|  | 6af62c6be0 | ||
|  | 78153c2aa4 | ||
|  | 62458885ce | ||
|  | 83d64262c8 | ||
|  | 0133a7c5db | ||
|  | fa920fed4e | ||
|  | 1d138eed8d | ||
|  | 9e94b9e57e | ||
|  | c4c690f44f | ||
|  | 902cc21ff0 | ||
|  | 106471877f | ||
|  | ccaace707e | ||
|  | cc14a4ac57 | ||
|  | 3ca1e6d197 | ||
|  | 531a6c17de | ||
|  | 4b7e1fcdb0 | ||
|  | 5f35bc5ee6 | ||
|  | 8100f68020 | ||
|  | 32a36bbb12 | ||
|  | 64b9234207 | ||
|  | a9d490263b | ||
|  | 8c5a3c9b3e | ||
|  | dd2f8d4404 | ||
|  | ea82cff0ce | ||
|  | 66ef9a919a | ||
|  | 73b912ee8b | ||
|  | 5960258a89 | ||
|  | ea7d1f481a | ||
|  | d81a0ebba4 | ||
|  | e90fb98613 | ||
|  | 2c34bd36a5 | ||
|  | a86a582d0f | ||
|  | c7778ce8cb | ||
|  | 5eaf1f4438 | ||
|  | 691682bc0c | ||
|  | 8627ee391a | ||
|  | 41089a0a0a | ||
|  | 2072a3dd94 | ||
|  | 8eec325e0a | ||
|  | 7ae88b42cf | ||
|  | 24e0839c34 | ||
|  | c3398d4d51 | ||
|  | 80237d8bc3 | ||
|  | 4cec0a9f97 | ||
|  | a810eb2cb5 | ||
|  | 7feb4b4aaf | ||
|  | 840fd61b04 | ||
|  | 5425dac180 | ||
|  | 0d65e396d4 | ||
|  | 704fc24d20 | ||
|  | 9b22c16f14 | ||
|  | 2923d1b449 | ||
|  | 9d5b028a5f | ||
|  | 97dfdd5c5d | ||
|  | eb5ee4d147 | ||
|  | d97581325d | ||
|  | 2a1e53f32a | ||
|  | b5e4ac0038 | ||
|  | b032210a33 | ||
|  | 24a1d61560 | ||
|  | d632c1c7fc | ||
|  | 9c5b3fc030 | ||
|  | 90e407b9d0 | ||
|  | dc0a2a2a10 | ||
|  | b6aa76477e | ||
|  | 068191e08c | ||
|  | 533cd1dbed | ||
|  | 028ef63f6e | ||
|  | 127b6ea515 | ||
|  | ab546865a8 | ||
|  | d6a2f2959d | ||
|  | 58848caf30 | ||
|  | c1107fe854 | ||
|  | c3debb1a17 | ||
|  | 0c841a12d2 | ||
|  | 64ed9376fe | ||
|  | 1966e12703 | ||
|  | 289ccc7d89 | ||
|  | 590c33c0af | ||
|  | 4e7236a338 | ||
|  | 63b7626aab | ||
|  | 78b88949d8 | ||
|  | 40a7abf9e8 | ||
|  | cd62dfd8f4 | ||
|  | 4445ad8fe5 | ||
|  | ed29721677 | ||
|  | e587f6ec37 | ||
|  | f98f4b00ba | ||
|  | 78bbcb324b | ||
|  | d646ab0232 | ||
|  | 1fe36044f1 | ||
|  | 2ea9369f99 | ||
|  | 802e1dbf2d | ||
|  | b6aca26d8c | ||
|  | ef653f7b00 | ||
|  | 8e183d8cad | ||
|  | 0ce34048cd | ||
|  | d46041f22e | ||
|  | 94cf424bbd | ||
|  | 778d700ba8 | ||
|  | 8c1cbd77dd | ||
|  | 954bf779eb | ||
|  | 7fbed452bb | ||
|  | e32023bb97 | ||
|  | 664a08d42f | ||
|  | 854c7f090b | ||
|  | a29d056a9b | ||
|  | 7d3ee9f0c4 | ||
|  | e26d39ab63 | ||
|  | ecf465958f | ||
|  | 8fa6030341 | ||
|  | 1f6f6dadfa | ||
|  | ed81eb4edf | ||
|  | 06ff4b808a | ||
|  | fe5999d5b8 | ||
|  | 9331796dc3 | ||
|  | 0a18c948bc | ||
|  | 595a1fbe34 | ||
|  | f12db3b8d9 | ||
|  | 2c1da7af31 | ||
|  | 0f9535bfd5 | ||
|  | 961d3c26fc | ||
|  | bd8e003db8 | ||
|  | 619eb60dd1 | ||
|  | 15948303ec | ||
|  | ccec203910 | ||
|  | 78122a7d4b | ||
|  | 272c73054e | ||
|  | aa629523a0 | ||
|  | 3e6aca4cd1 | ||
|  | 891883c8c2 | ||
|  | 98ba392016 | ||
|  | d49ee83748 | ||
|  | 88cdb1811f | ||
|  | 94c190668c | ||
|  | eef0f4bd4e | ||
|  | dad58fa362 | ||
|  | 40585469f2 | ||
|  | d06035071a | ||
|  | e81565d36a | ||
|  | f66dd259f0 | ||
|  | e003dcd596 | ||
|  | d4ecf44b08 | ||
|  | f4426eb830 | ||
|  | 7c86ce3977 | ||
|  | 1665335525 | ||
|  | 14bce014a3 | ||
|  | 75e5115aa3 | ||
|  | de7638c502 | ||
|  | 126e378399 | ||
|  | 45e9c999b8 | ||
|  | 62bba0d33b | ||
|  | 0b220f3288 | ||
|  | 7dbdf0c4ff | ||
|  | 417b7c3f86 | ||
|  | 724a16944a | ||
|  | c3bc1af7b5 | ||
|  | 38b7daf3b6 | ||
|  | 7bf7bb529e | ||
|  | 6b5774a66d | ||
|  | 0e3ebb9f1a | ||
|  | 1c41b6753d | ||
|  | 549f3c038a | ||
|  | edbac66576 | ||
|  | c788395508 | ||
|  | 35b0c20f88 | ||
|  | 518712d9e8 | ||
|  | 241ad25e2f | ||
|  | 7cf7c5fcef | ||
|  | fbb9de64c3 | ||
|  | 88c145ac3e | ||
|  | 4aba842624 | ||
|  | 936c2b8888 | ||
|  | c3e971c419 | ||
|  | 19fee6a8fb | ||
|  | 477eebdbe7 | ||
|  | 093bff750c | ||
|  | 92e679a9ea | ||
|  | 43232ae45c | ||
|  | 1fb13d8697 | ||
|  | 9ac28b93ca | ||
|  | 067c01ca06 | ||
|  | 82040c2a5d | ||
|  | 62502c746c | ||
|  | 6ab79a87fe | ||
|  | 04ee3b4dc1 | ||
|  | 9c9af79ad5 | ||
|  | dd794e409f | ||
|  | 67d29b8416 | ||
|  | 5ee80dd046 | ||
|  | f62e93b487 | ||
|  | a7cc70b975 | ||
|  | 60f0d8074a | ||
|  | ed1fdf9382 | ||
|  | 9ea3c4224e | ||
|  | 71325de44e | ||
|  | cdb041e647 | ||
|  | b9d750bf59 | ||
|  | 461249737e | ||
|  | 1aeaa8b77d | ||
|  | a59d7ccdc2 | ||
|  | 2c1ca428db | ||
|  | 224970f3bd | ||
|  | 742d934ddb | ||
|  | 1699513023 | ||
|  | 488a8a7e86 | ||
|  | dd571d6221 | ||
|  | 4cc5128b4c | ||
|  | 2636a6557a | ||
|  | 0bf97ccf22 | ||
|  | 592fc71b4e | ||
|  | 0e7712d3b8 | ||
|  | 80f21d2a4f | ||
|  | 5513ec068e | ||
|  | 14a46a6197 | ||
|  | b93ee5efd8 | ||
|  | cdd4dc6065 | ||
|  | 0d8b2ae799 | ||
|  | 77dc79b638 | ||
|  | f48723db40 | ||
|  | ebf91078c5 | ||
|  | 90d0d85dd6 | ||
|  | 0c5b4f7f64 | ||
|  | 9c4bb08ed1 | ||
|  | 1d3bbde4b0 | ||
|  | b6faee033d | ||
|  | 05e0f88d11 | ||
|  | ae9a151140 | ||
|  | da633e3c62 | ||
|  | 8cb384d3cf | ||
|  | de2a34c3ec | ||
|  | b7c65446a8 | ||
|  | bc648b187c | ||
|  | 4de0828b5d | ||
|  | b2364d26ec | ||
|  | 83d94cb792 | ||
|  | 66cc3f48bc | ||
|  | 63297c43b7 | ||
|  | 5b0637558f | ||
|  | e9a8e104be | ||
|  | 0f524e7800 | ||
|  | 969e0bccc9 | ||
|  | ba3e026927 | ||
|  | 0c6868d477 | ||
|  | 7f70cf47ec | ||
|  | fa4492287d | ||
|  | 60809c688e | ||
|  | 2404f5299c | ||
|  | 21a394eaf5 | ||
|  | 419d7846c9 | ||
|  | 0827accc39 | ||
|  | 2e53f7d0b7 | ||
|  | bdfcf8ec95 | ||
|  | 6a20170e00 | ||
|  | 0c974f1ff7 | ||
|  | 9c098d45c5 | ||
|  | cfdf9aa8dc | ||
|  | 2ea74542e6 | ||
|  | 7fcaa2b5fb | ||
|  | e9e905e495 | ||
|  | f67ff98d78 | ||
|  | e3c4dde4ff | ||
|  | 9787561000 | ||
|  | cd041b4c75 | ||
|  | 60ee70c926 | ||
|  | 00de78b6f1 | ||
|  | 33a841b831 | ||
|  | df66dcf102 | ||
|  | 086a7a0b1e | ||
|  | ec0ba3d212 | ||
|  | b0ab06b7eb | ||
|  | 965acd6d45 | ||
|  | 4d156870ef | ||
|  | 499720df46 | ||
|  | 610bc108e7 | ||
|  | 53f1b0218c | ||
|  | 0a7a099796 | ||
|  | ed90ebc896 | ||
|  | 87fe518d45 | ||
|  | 5cb0891a27 | ||
|  | b4bd66bd58 | ||
|  | 64d95fe845 | ||
|  | a2d6d7a92c | ||
|  | 1d8a784586 | ||
|  | 3c8bfae8ff | ||
|  | f65eccfe4c | ||
|  | 7ce6dc9f16 | ||
|  | 4a73caf4c3 | ||
|  | 1b9d8dd3c3 | ||
|  | b11bfb0aae | ||
|  | 024e16bf4b | ||
|  | daf753d76e | ||
|  | 4c90f66578 | ||
|  | db94f18d46 | ||
|  | a9bd0f551d | ||
|  | e1ba2d9ad9 | ||
|  | 939c636a74 | ||
|  | 2b829cb645 | ||
|  | 4bbc898639 | ||
|  | 27d07d5807 | ||
|  | f010ffefc1 | ||
|  | fc0fee161e | ||
|  | 72c99d3834 | ||
|  | a2984f299b | ||
|  | 3925077223 | ||
|  | deb51bd8de | ||
|  | 03f39f53d8 | ||
|  | e72314778c | ||
|  | ced3e9387a | ||
|  | 02c906afe6 | ||
|  | 7a2d4c9bd2 | ||
|  | dffddfda18 | ||
|  | 9bb62c865a | ||
|  | a97ebf2b97 | ||
|  | 9a62a6c514 | ||
|  | 04dc162270 | ||
|  | 75d5a50328 | ||
|  | eadb7d5dcb | ||
|  | 8dc07f1148 | ||
|  | 217ce85a9b | ||
|  | ef88b25dbd | ||
|  | 4c2e2a3a5a | ||
|  | 1e8e1c6e51 | ||
|  | a92944786c | ||
|  | 8ce760a0bf | ||
|  | 8d8e047d2c | ||
|  | 06a923db94 | ||
|  | 551408b801 | ||
|  | e1915e365a | ||
|  | e8c4eec536 | ||
|  | e3f4e75561 | ||
|  | fd640f9698 | ||
|  | ffd8aef35f | ||
|  | 46412bdc66 | ||
|  | d73c3476c8 | ||
|  | ff737ae05e | ||
|  | 171ec0c630 | ||
|  | b4a6c6fcbe | ||
|  | 4886084296 | ||
|  | 1a3dfbdef6 | ||
|  | 0c087f33c2 | ||
|  | 5f9f621fa6 | ||
|  | cd3de7b545 | ||
|  | 8aeb513d54 | ||
|  | bfc5c5d154 | ||
|  | 7c9f7f04b7 | ||
|  | 3352c2cf3c | ||
|  | e61a433999 | ||
|  | 3517452ea1 | ||
|  | 8a1190b9ee | ||
|  | fc78c9a1d6 | ||
|  | 8d55f7f2e5 | ||
|  | 8162b22d43 | ||
|  | 8504d55f17 | ||
|  | 75ae1bbde1 | ||
|  | a20668e91b | ||
|  | eb559bbb03 | ||
|  | 2eae96a895 | ||
|  | 4bbf35bca4 | ||
|  | f1b5e45488 | ||
|  | 57ed1581ec | ||
|  | c668381ab0 | ||
|  | 44f99991fc | ||
|  | 696c76102b | ||
|  | fe4e00dc5c | ||
|  | 1a1b0ee27d | ||
|  | 298c4ec654 | ||
|  | c6e3fa2cc6 | ||
|  | 61484dcfee | ||
|  | 99009cff88 | ||
|  | 673f68b07c | ||
|  | d1232192ce | ||
|  | b2084a94e5 | ||
|  | ddcb246955 | ||
|  | 8796168580 | ||
|  | dde7bcfc4c | ||
|  | a6503fda39 | ||
|  | 455e311661 | ||
|  | a4a919d7b7 | ||
|  | a90ce3c944 | ||
|  | a6d179b883 | ||
|  | 1b29e5e628 | ||
|  | e8fd496bca | ||
|  | 3d61e27a47 | ||
|  | f9a55ce3d8 | ||
|  | c432757942 | ||
|  | da740ccbef | ||
|  | f1173263b6 | ||
|  | 68da1a7039 | ||
|  | 64414edf58 | ||
|  | 6b136d2c8c | ||
|  | 752a877b91 | ||
|  | d11c36e476 | ||
|  | b13232f06b | ||
|  | cf6ed5af32 | ||
|  | be531d777e | ||
|  | 190508fa54 | ||
|  | 2c2dddc071 | ||
|  | c60858de5c | ||
|  | 6ab332e4fb | ||
|  | 9df43cc710 | ||
|  | 79d1b15d86 | ||
|  | 923debb299 | ||
|  | f5fef8c036 | ||
|  | 982134c077 | ||
|  | 07aeb6cd20 | ||
|  | 30cca355ba | ||
|  | d17cc15037 | ||
|  | efade857bb | ||
|  | 15ac6a1195 | ||
|  | a45a050e7d | ||
|  | e435ff8b1c | ||
|  | 788dae1477 | ||
|  | 2bb4cc7954 | ||
|  | ecead8a27b | ||
|  | 4a2681df14 | ||
|  | 5761d82635 | ||
|  | 36fce9db4e | ||
|  | 1227574bc1 | ||
|  | 47c2a66e1d | ||
|  | c59e52bbbf | ||
|  | 81961fd632 | ||
|  | b557805eeb | ||
|  | e58da3c41d | ||
|  | f43b539470 | ||
|  | ab3dbf9218 | ||
|  | d943a5ae9b | ||
|  | 449058dad7 | ||
|  | b9cf8b3ef2 | ||
|  | 27037c2fbb | ||
|  | 10646099a0 | ||
|  | 43ad63fac6 | ||
|  | 221c59437c | ||
|  | 1a94ec5bbe | ||
|  | f57c554c56 | ||
|  | 334aec58a4 | ||
|  | 7035da4d75 | ||
|  | 29a40ce8dd | ||
|  | c6c98c4df5 | ||
|  | 277d7e6650 | ||
|  | 130c539006 | ||
|  | 2bdb2e12f0 | ||
|  | 25779206a1 | ||
|  | 92f72a5ad7 | ||
|  | 4e041248ac | ||
|  | 8cc5aa8aba | ||
|  | 4ba712b24e | ||
|  | 7af9169763 | ||
|  | 775504acb6 | ||
|  | 7840e37e1a | ||
|  | 720fff4595 | ||
|  | 551c1f4cda | ||
|  | 7f0db0de04 | ||
|  | 6ac3cc384b | ||
|  | 563879c218 | ||
|  | dbb7ed3d5d | ||
|  | 4e3c2ba72c | ||
|  | 8e911491f6 | ||
|  | 03c5f3cc2d | ||
|  | 484565d600 | ||
|  | 163a979227 | ||
|  | ed105fee1d | ||
|  | 3b82cfa486 | ||
|  | 834e52eb2e | ||
|  | 7eb938fe23 | ||
|  | 8db7a4c47d | ||
|  | b055a5d6af | ||
|  | ad0a1b9a24 | ||
|  | 05d190659a | ||
|  | 9c6eaffba6 | ||
|  | 3ee5e9aa04 | ||
|  | 93a544fe53 | 
| @@ -301,7 +301,6 @@ PUSHER_ID= | ||||
| DEMO_USERNAME= | ||||
| DEMO_PASSWORD= | ||||
| USE_ENCRYPTION=false | ||||
| IS_HEROKU=false | ||||
| FIREFLY_III_LAYOUT=v1 | ||||
|  | ||||
| # | ||||
|   | ||||
							
								
								
									
										27
									
								
								.ci/all.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										27
									
								
								.ci/all.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| # | ||||
| # all.sh | ||||
| # Copyright (c) 2024 james@firefly-iii.org | ||||
| # | ||||
| # This file is part of Firefly III (https://github.com/firefly-iii). | ||||
| # | ||||
| # This program is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU Affero General Public License as | ||||
| # published by the Free Software Foundation, either version 3 of the | ||||
| # License, or (at your option) any later version. | ||||
| # | ||||
| # This program is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU Affero General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU Affero General Public License | ||||
| # along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
| # | ||||
|  | ||||
| SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" | ||||
|  | ||||
| $SCRIPT_DIR/phpcs.sh | ||||
| $SCRIPT_DIR/phpstan.sh | ||||
| $SCRIPT_DIR/phpmd.sh | ||||
| @@ -36,9 +36,35 @@ $finder = PhpCsFixer\Finder::create() | ||||
| 
 | ||||
| $config = new PhpCsFixer\Config(); | ||||
| return $config->setRules([ | ||||
|                              '@PSR12'               => true, | ||||
|                              'declare_strict_types' => true, | ||||
|                              'strict_param'         => true, | ||||
|                              'array_syntax'         => ['syntax' => 'short'], | ||||
|                              'no_unused_imports'             => true, | ||||
|                              '@PhpCsFixer'                   => true, | ||||
|                              '@PHP83Migration'               => true, | ||||
|                              '@PhpCsFixer:risky'             => true, | ||||
|                              '@PSR12:risky'                  => true, | ||||
|                              'declare_strict_types'          => true, | ||||
|                              'strict_param'                  => true, | ||||
|                              'comment_to_phpdoc'             => false, // breaks phpstan lines in combination with PHPStorm.
 | ||||
|                              'array_syntax'                  => ['syntax' => 'short'], | ||||
|                              'native_function_invocation'    => false, // annoying
 | ||||
|                              'php_unit_data_provider_name'   => false, // bloody annoying long test names
 | ||||
|                              'static_lambda'                 => false, // breaks the Response macro for API's.
 | ||||
|                              'phpdoc_summary'                => false, // annoying.
 | ||||
|                              'single_space_around_construct' => [ | ||||
|                                  'constructs_followed_by_a_single_space' => [ | ||||
|                                      'protected', | ||||
|                                  ], | ||||
|                              ], | ||||
|                              'statement_indentation'         => true, | ||||
|                              'type_declaration_spaces'       => false, | ||||
|                              'cast_spaces'                   => false, | ||||
|                              'binary_operator_spaces'        => [ | ||||
|                                  'default' => 'at_least_single_space', | ||||
|                                  'operators' => [ | ||||
|                                      '=>' => 'align_single_space_by_scope', | ||||
|                                      '='  => 'align_single_space_minimal_by_scope', | ||||
|                                      '??='  => 'align_single_space_minimal_by_scope', | ||||
|                                  ], | ||||
|                              ], | ||||
|                              'void_return'                   => true, | ||||
|                          ]) | ||||
|               ->setFinder($finder); | ||||
|   | ||||
							
								
								
									
										570
									
								
								.ci/php-cs-fixer/composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										570
									
								
								.ci/php-cs-fixer/composer.lock
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										22
									
								
								.ci/phpcs.sh
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								.ci/phpcs.sh
									
									
									
									
									
								
							| @@ -28,11 +28,29 @@ SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) | ||||
| # enable test .env file. | ||||
| # cp .ci/.env.ci .env | ||||
|  | ||||
| OUTPUT_FORMAT=txt | ||||
| EXTRA_PARAMS="" | ||||
|  | ||||
| if [[ $GITHUB_ACTIONS = "true" ]] | ||||
| then | ||||
|     OUTPUT_FORMAT=txt | ||||
|     EXTRA_PARAMS="" | ||||
| fi | ||||
|  | ||||
| # clean up php code | ||||
| cd $SCRIPT_DIR/php-cs-fixer | ||||
| composer update --quiet | ||||
| rm -f .php-cs-fixer.cache | ||||
| PHP_CS_FIXER_IGNORE_ENV=true ./vendor/bin/php-cs-fixer fix --config $SCRIPT_DIR/php-cs-fixer/.php-cs-fixer.php --allow-risky=yes | ||||
| PHP_CS_FIXER_IGNORE_ENV=true | ||||
| ./vendor/bin/php-cs-fixer fix \ | ||||
|     --config $SCRIPT_DIR/php-cs-fixer/.php-cs-fixer.php \ | ||||
|     --format=$OUTPUT_FORMAT \ | ||||
|     --allow-risky=yes $EXTRA_PARAMS | ||||
|  | ||||
| EXIT_CODE=$? | ||||
|  | ||||
| echo "Exit code for CS fixer is $EXIT_CODE." | ||||
|  | ||||
| cd $SCRIPT_DIR/.. | ||||
|  | ||||
| exit 0 | ||||
| exit $EXIT_CODE | ||||
|   | ||||
							
								
								
									
										19
									
								
								.ci/phpmd.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										19
									
								
								.ci/phpmd.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -22,16 +22,29 @@ | ||||
|  | ||||
|  | ||||
| SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" | ||||
| OUTPUT_FORMAT=text | ||||
|  | ||||
| if [[ $GITHUB_ACTIONS = "true" ]] | ||||
| then | ||||
|     OUTPUT_FORMAT=github | ||||
| fi | ||||
|  | ||||
|  | ||||
| cd $SCRIPT_DIR/phpmd | ||||
| composer update --quiet | ||||
| ./vendor/bin/phpmd \ | ||||
|   $SCRIPT_DIR/../app text phpmd.xml \ | ||||
|   $SCRIPT_DIR/../app,$SCRIPT_DIR/../database,$SCRIPT_DIR/../routes,$SCRIPT_DIR/../config \ | ||||
|    $OUTPUT_FORMAT phpmd.xml \ | ||||
|   --exclude $SCRIPT_DIR/../app/resources/** \ | ||||
|   --exclude $SCRIPT_DIR/../app/frontend/** \ | ||||
|   --exclude $SCRIPT_DIR/../app/public/** \ | ||||
|   --exclude $SCRIPT_DIR/../app/vendor/** \ | ||||
|   --exclude $SCRIPT_DIR/../app/vendor/** | ||||
|  | ||||
| EXIT_CODE=$? | ||||
|  | ||||
| cd $SCRIPT_DIR/.. | ||||
|  | ||||
| exit 0 | ||||
| echo "Exit code is $EXIT_CODE." | ||||
|  | ||||
| # for the time being, exit 0 | ||||
| exit $EXIT_CODE | ||||
|   | ||||
							
								
								
									
										185
									
								
								.ci/phpmd/composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										185
									
								
								.ci/phpmd/composer.lock
									
									
									
										generated
									
									
									
								
							| @@ -9,16 +9,16 @@ | ||||
|     "packages-dev": [ | ||||
|         { | ||||
|             "name": "composer/pcre", | ||||
|             "version": "3.1.0", | ||||
|             "version": "3.1.1", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/composer/pcre.git", | ||||
|                 "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" | ||||
|                 "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", | ||||
|                 "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", | ||||
|                 "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", | ||||
|                 "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
| @@ -60,7 +60,7 @@ | ||||
|             ], | ||||
|             "support": { | ||||
|                 "issues": "https://github.com/composer/pcre/issues", | ||||
|                 "source": "https://github.com/composer/pcre/tree/3.1.0" | ||||
|                 "source": "https://github.com/composer/pcre/tree/3.1.1" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -76,7 +76,7 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2022-11-17T09:50:14+00:00" | ||||
|             "time": "2023-10-11T07:11:09+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "composer/xdebug-handler", | ||||
| @@ -146,28 +146,28 @@ | ||||
|         }, | ||||
|         { | ||||
|             "name": "pdepend/pdepend", | ||||
|             "version": "2.14.0", | ||||
|             "version": "2.16.2", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/pdepend/pdepend.git", | ||||
|                 "reference": "1121d4b04af06e33e9659bac3a6741b91cab1de1" | ||||
|                 "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/pdepend/pdepend/zipball/1121d4b04af06e33e9659bac3a6741b91cab1de1", | ||||
|                 "reference": "1121d4b04af06e33e9659bac3a6741b91cab1de1", | ||||
|                 "url": "https://api.github.com/repos/pdepend/pdepend/zipball/f942b208dc2a0868454d01b29f0c75bbcfc6ed58", | ||||
|                 "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
|                 "php": ">=5.3.7", | ||||
|                 "symfony/config": "^2.3.0|^3|^4|^5|^6.0", | ||||
|                 "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0", | ||||
|                 "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0" | ||||
|                 "symfony/config": "^2.3.0|^3|^4|^5|^6.0|^7.0", | ||||
|                 "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0|^7.0", | ||||
|                 "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0|^7.0", | ||||
|                 "symfony/polyfill-mbstring": "^1.19" | ||||
|             }, | ||||
|             "require-dev": { | ||||
|                 "easy-doc/easy-doc": "0.0.0|^1.2.3", | ||||
|                 "gregwar/rst": "^1.0", | ||||
|                 "phpunit/phpunit": "^4.8.36|^5.7.27", | ||||
|                 "squizlabs/php_codesniffer": "^2.0.0" | ||||
|             }, | ||||
|             "bin": [ | ||||
| @@ -197,7 +197,7 @@ | ||||
|             ], | ||||
|             "support": { | ||||
|                 "issues": "https://github.com/pdepend/pdepend/issues", | ||||
|                 "source": "https://github.com/pdepend/pdepend/tree/2.14.0" | ||||
|                 "source": "https://github.com/pdepend/pdepend/tree/2.16.2" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -205,26 +205,26 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2023-05-26T13:15:18+00:00" | ||||
|             "time": "2023-12-17T18:09:59+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "phpmd/phpmd", | ||||
|             "version": "2.13.0", | ||||
|             "version": "2.15.0", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/phpmd/phpmd.git", | ||||
|                 "reference": "dad0228156856b3ad959992f9748514fa943f3e3" | ||||
|                 "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/phpmd/phpmd/zipball/dad0228156856b3ad959992f9748514fa943f3e3", | ||||
|                 "reference": "dad0228156856b3ad959992f9748514fa943f3e3", | ||||
|                 "url": "https://api.github.com/repos/phpmd/phpmd/zipball/74a1f56e33afad4128b886e334093e98e1b5e7c0", | ||||
|                 "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
|                 "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", | ||||
|                 "ext-xml": "*", | ||||
|                 "pdepend/pdepend": "^2.12.1", | ||||
|                 "pdepend/pdepend": "^2.16.1", | ||||
|                 "php": ">=5.3.9" | ||||
|             }, | ||||
|             "require-dev": { | ||||
| @@ -233,8 +233,7 @@ | ||||
|                 "ext-simplexml": "*", | ||||
|                 "gregwar/rst": "^1.0", | ||||
|                 "mikey179/vfsstream": "^1.6.8", | ||||
|                 "phpunit/phpunit": "^4.8.36 || ^5.7.27", | ||||
|                 "squizlabs/php_codesniffer": "^2.0" | ||||
|                 "squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2" | ||||
|             }, | ||||
|             "bin": [ | ||||
|                 "src/bin/phpmd" | ||||
| @@ -271,6 +270,7 @@ | ||||
|             "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", | ||||
|             "homepage": "https://phpmd.org/", | ||||
|             "keywords": [ | ||||
|                 "dev", | ||||
|                 "mess detection", | ||||
|                 "mess detector", | ||||
|                 "pdepend", | ||||
| @@ -280,7 +280,7 @@ | ||||
|             "support": { | ||||
|                 "irc": "irc://irc.freenode.org/phpmd", | ||||
|                 "issues": "https://github.com/phpmd/phpmd/issues", | ||||
|                 "source": "https://github.com/phpmd/phpmd/tree/2.13.0" | ||||
|                 "source": "https://github.com/phpmd/phpmd/tree/2.15.0" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -288,7 +288,7 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2022-09-10T08:44:15+00:00" | ||||
|             "time": "2023-12-11T08:22:20+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "psr/container", | ||||
| @@ -395,34 +395,34 @@ | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/config", | ||||
|             "version": "v6.3.0", | ||||
|             "version": "v7.0.3", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/symfony/config.git", | ||||
|                 "reference": "a5e00dec161b08c946a2c16eed02adbeedf827ae" | ||||
|                 "reference": "86a5027869ca3d6bdecae6d5d6c2f77c8f2c1d16" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/symfony/config/zipball/a5e00dec161b08c946a2c16eed02adbeedf827ae", | ||||
|                 "reference": "a5e00dec161b08c946a2c16eed02adbeedf827ae", | ||||
|                 "url": "https://api.github.com/repos/symfony/config/zipball/86a5027869ca3d6bdecae6d5d6c2f77c8f2c1d16", | ||||
|                 "reference": "86a5027869ca3d6bdecae6d5d6c2f77c8f2c1d16", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
|                 "php": ">=8.1", | ||||
|                 "php": ">=8.2", | ||||
|                 "symfony/deprecation-contracts": "^2.5|^3", | ||||
|                 "symfony/filesystem": "^5.4|^6.0", | ||||
|                 "symfony/filesystem": "^6.4|^7.0", | ||||
|                 "symfony/polyfill-ctype": "~1.8" | ||||
|             }, | ||||
|             "conflict": { | ||||
|                 "symfony/finder": "<5.4", | ||||
|                 "symfony/finder": "<6.4", | ||||
|                 "symfony/service-contracts": "<2.5" | ||||
|             }, | ||||
|             "require-dev": { | ||||
|                 "symfony/event-dispatcher": "^5.4|^6.0", | ||||
|                 "symfony/finder": "^5.4|^6.0", | ||||
|                 "symfony/messenger": "^5.4|^6.0", | ||||
|                 "symfony/event-dispatcher": "^6.4|^7.0", | ||||
|                 "symfony/finder": "^6.4|^7.0", | ||||
|                 "symfony/messenger": "^6.4|^7.0", | ||||
|                 "symfony/service-contracts": "^2.5|^3", | ||||
|                 "symfony/yaml": "^5.4|^6.0" | ||||
|                 "symfony/yaml": "^6.4|^7.0" | ||||
|             }, | ||||
|             "type": "library", | ||||
|             "autoload": { | ||||
| @@ -450,7 +450,7 @@ | ||||
|             "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", | ||||
|             "homepage": "https://symfony.com", | ||||
|             "support": { | ||||
|                 "source": "https://github.com/symfony/config/tree/v6.3.0" | ||||
|                 "source": "https://github.com/symfony/config/tree/v7.0.3" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -466,44 +466,43 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2023-04-25T10:46:17+00:00" | ||||
|             "time": "2024-01-30T08:34:29+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/dependency-injection", | ||||
|             "version": "v6.3.1", | ||||
|             "version": "v7.0.3", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/symfony/dependency-injection.git", | ||||
|                 "reference": "7abf242af21f196b65f20ab00ff251fdf3889b8d" | ||||
|                 "reference": "e915c6684b8e3ae90a4441f6823ebbb40edf0b92" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/7abf242af21f196b65f20ab00ff251fdf3889b8d", | ||||
|                 "reference": "7abf242af21f196b65f20ab00ff251fdf3889b8d", | ||||
|                 "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e915c6684b8e3ae90a4441f6823ebbb40edf0b92", | ||||
|                 "reference": "e915c6684b8e3ae90a4441f6823ebbb40edf0b92", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
|                 "php": ">=8.1", | ||||
|                 "php": ">=8.2", | ||||
|                 "psr/container": "^1.1|^2.0", | ||||
|                 "symfony/deprecation-contracts": "^2.5|^3", | ||||
|                 "symfony/service-contracts": "^2.5|^3.0", | ||||
|                 "symfony/var-exporter": "^6.2.10" | ||||
|                 "symfony/service-contracts": "^3.3", | ||||
|                 "symfony/var-exporter": "^6.4|^7.0" | ||||
|             }, | ||||
|             "conflict": { | ||||
|                 "ext-psr": "<1.1|>=2", | ||||
|                 "symfony/config": "<6.1", | ||||
|                 "symfony/finder": "<5.4", | ||||
|                 "symfony/proxy-manager-bridge": "<6.3", | ||||
|                 "symfony/yaml": "<5.4" | ||||
|                 "symfony/config": "<6.4", | ||||
|                 "symfony/finder": "<6.4", | ||||
|                 "symfony/yaml": "<6.4" | ||||
|             }, | ||||
|             "provide": { | ||||
|                 "psr/container-implementation": "1.1|2.0", | ||||
|                 "symfony/service-implementation": "1.1|2.0|3.0" | ||||
|             }, | ||||
|             "require-dev": { | ||||
|                 "symfony/config": "^6.1", | ||||
|                 "symfony/expression-language": "^5.4|^6.0", | ||||
|                 "symfony/yaml": "^5.4|^6.0" | ||||
|                 "symfony/config": "^6.4|^7.0", | ||||
|                 "symfony/expression-language": "^6.4|^7.0", | ||||
|                 "symfony/yaml": "^6.4|^7.0" | ||||
|             }, | ||||
|             "type": "library", | ||||
|             "autoload": { | ||||
| @@ -531,7 +530,7 @@ | ||||
|             "description": "Allows you to standardize and centralize the way objects are constructed in your application", | ||||
|             "homepage": "https://symfony.com", | ||||
|             "support": { | ||||
|                 "source": "https://github.com/symfony/dependency-injection/tree/v6.3.1" | ||||
|                 "source": "https://github.com/symfony/dependency-injection/tree/v7.0.3" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -547,11 +546,11 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2023-06-24T11:51:27+00:00" | ||||
|             "time": "2024-01-30T08:34:29+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/deprecation-contracts", | ||||
|             "version": "v3.3.0", | ||||
|             "version": "v3.4.0", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/symfony/deprecation-contracts.git", | ||||
| @@ -598,7 +597,7 @@ | ||||
|             "description": "A generic function and convention to trigger deprecation notices", | ||||
|             "homepage": "https://symfony.com", | ||||
|             "support": { | ||||
|                 "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" | ||||
|                 "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -618,20 +617,20 @@ | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/filesystem", | ||||
|             "version": "v6.3.1", | ||||
|             "version": "v7.0.3", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/symfony/filesystem.git", | ||||
|                 "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" | ||||
|                 "reference": "2890e3a825bc0c0558526c04499c13f83e1b6b12" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", | ||||
|                 "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", | ||||
|                 "url": "https://api.github.com/repos/symfony/filesystem/zipball/2890e3a825bc0c0558526c04499c13f83e1b6b12", | ||||
|                 "reference": "2890e3a825bc0c0558526c04499c13f83e1b6b12", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
|                 "php": ">=8.1", | ||||
|                 "php": ">=8.2", | ||||
|                 "symfony/polyfill-ctype": "~1.8", | ||||
|                 "symfony/polyfill-mbstring": "~1.8" | ||||
|             }, | ||||
| @@ -661,7 +660,7 @@ | ||||
|             "description": "Provides basic utilities for the filesystem", | ||||
|             "homepage": "https://symfony.com", | ||||
|             "support": { | ||||
|                 "source": "https://github.com/symfony/filesystem/tree/v6.3.1" | ||||
|                 "source": "https://github.com/symfony/filesystem/tree/v7.0.3" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -677,20 +676,20 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2023-06-01T08:30:39+00:00" | ||||
|             "time": "2024-01-23T15:02:46+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/polyfill-ctype", | ||||
|             "version": "v1.27.0", | ||||
|             "version": "v1.28.0", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/symfony/polyfill-ctype.git", | ||||
|                 "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" | ||||
|                 "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", | ||||
|                 "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", | ||||
|                 "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", | ||||
|                 "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
| @@ -705,7 +704,7 @@ | ||||
|             "type": "library", | ||||
|             "extra": { | ||||
|                 "branch-alias": { | ||||
|                     "dev-main": "1.27-dev" | ||||
|                     "dev-main": "1.28-dev" | ||||
|                 }, | ||||
|                 "thanks": { | ||||
|                     "name": "symfony/polyfill", | ||||
| @@ -743,7 +742,7 @@ | ||||
|                 "portable" | ||||
|             ], | ||||
|             "support": { | ||||
|                 "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" | ||||
|                 "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -759,20 +758,20 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2022-11-03T14:55:06+00:00" | ||||
|             "time": "2023-01-26T09:26:14+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/polyfill-mbstring", | ||||
|             "version": "v1.27.0", | ||||
|             "version": "v1.28.0", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/symfony/polyfill-mbstring.git", | ||||
|                 "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" | ||||
|                 "reference": "42292d99c55abe617799667f454222c54c60e229" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", | ||||
|                 "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", | ||||
|                 "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", | ||||
|                 "reference": "42292d99c55abe617799667f454222c54c60e229", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
| @@ -787,7 +786,7 @@ | ||||
|             "type": "library", | ||||
|             "extra": { | ||||
|                 "branch-alias": { | ||||
|                     "dev-main": "1.27-dev" | ||||
|                     "dev-main": "1.28-dev" | ||||
|                 }, | ||||
|                 "thanks": { | ||||
|                     "name": "symfony/polyfill", | ||||
| @@ -826,7 +825,7 @@ | ||||
|                 "shim" | ||||
|             ], | ||||
|             "support": { | ||||
|                 "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" | ||||
|                 "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -842,25 +841,25 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2022-11-03T14:55:06+00:00" | ||||
|             "time": "2023-07-28T09:04:16+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/service-contracts", | ||||
|             "version": "v3.3.0", | ||||
|             "version": "v3.4.1", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/symfony/service-contracts.git", | ||||
|                 "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" | ||||
|                 "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", | ||||
|                 "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", | ||||
|                 "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", | ||||
|                 "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
|                 "php": ">=8.1", | ||||
|                 "psr/container": "^2.0" | ||||
|                 "psr/container": "^1.1|^2.0" | ||||
|             }, | ||||
|             "conflict": { | ||||
|                 "ext-psr": "<1.1|>=2" | ||||
| @@ -908,7 +907,7 @@ | ||||
|                 "standards" | ||||
|             ], | ||||
|             "support": { | ||||
|                 "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" | ||||
|                 "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -924,27 +923,27 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2023-05-23T14:45:45+00:00" | ||||
|             "time": "2023-12-26T14:02:43+00:00" | ||||
|         }, | ||||
|         { | ||||
|             "name": "symfony/var-exporter", | ||||
|             "version": "v6.3.0", | ||||
|             "version": "v7.0.3", | ||||
|             "source": { | ||||
|                 "type": "git", | ||||
|                 "url": "https://github.com/symfony/var-exporter.git", | ||||
|                 "reference": "db5416d04269f2827d8c54331ba4cfa42620d350" | ||||
|                 "reference": "1fb79308cb5fc2b44bff6e8af10a5af6812e05b8" | ||||
|             }, | ||||
|             "dist": { | ||||
|                 "type": "zip", | ||||
|                 "url": "https://api.github.com/repos/symfony/var-exporter/zipball/db5416d04269f2827d8c54331ba4cfa42620d350", | ||||
|                 "reference": "db5416d04269f2827d8c54331ba4cfa42620d350", | ||||
|                 "url": "https://api.github.com/repos/symfony/var-exporter/zipball/1fb79308cb5fc2b44bff6e8af10a5af6812e05b8", | ||||
|                 "reference": "1fb79308cb5fc2b44bff6e8af10a5af6812e05b8", | ||||
|                 "shasum": "" | ||||
|             }, | ||||
|             "require": { | ||||
|                 "php": ">=8.1" | ||||
|                 "php": ">=8.2" | ||||
|             }, | ||||
|             "require-dev": { | ||||
|                 "symfony/var-dumper": "^5.4|^6.0" | ||||
|                 "symfony/var-dumper": "^6.4|^7.0" | ||||
|             }, | ||||
|             "type": "library", | ||||
|             "autoload": { | ||||
| @@ -982,7 +981,7 @@ | ||||
|                 "serialize" | ||||
|             ], | ||||
|             "support": { | ||||
|                 "source": "https://github.com/symfony/var-exporter/tree/v6.3.0" | ||||
|                 "source": "https://github.com/symfony/var-exporter/tree/v7.0.3" | ||||
|             }, | ||||
|             "funding": [ | ||||
|                 { | ||||
| @@ -998,7 +997,7 @@ | ||||
|                     "type": "tidelift" | ||||
|                 } | ||||
|             ], | ||||
|             "time": "2023-04-21T08:48:44+00:00" | ||||
|             "time": "2024-01-23T15:02:46+00:00" | ||||
|         } | ||||
|     ], | ||||
|     "aliases": [], | ||||
| @@ -1008,5 +1007,5 @@ | ||||
|     "prefer-lowest": false, | ||||
|     "platform": [], | ||||
|     "platform-dev": [], | ||||
|     "plugin-api-version": "2.3.0" | ||||
|     "plugin-api-version": "2.6.0" | ||||
| } | ||||
|   | ||||
| @@ -1,52 +1,94 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ruleset name="pcsg-generated-ruleset"  | ||||
|     xmlns="http://pmd.sf.net/ruleset/1.0.0"  | ||||
|     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  | ||||
|     xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" | ||||
|     xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"> | ||||
| 	<description>Bla bla</description> | ||||
| <!-- | ||||
|   ~ phpmd.xml | ||||
|   ~ Copyright (c) 2023 james@firefly-iii.org | ||||
|   ~ | ||||
|   ~ This file is part of Firefly III (https://github.com/firefly-iii). | ||||
|   ~ | ||||
|   ~ This program is free software: you can redistribute it and/or modify | ||||
|   ~ it under the terms of the GNU Affero General Public License as | ||||
|   ~ published by the Free Software Foundation, either version 3 of the | ||||
|   ~ License, or (at your option) any later version. | ||||
|   ~ | ||||
|   ~ This program is distributed in the hope that it will be useful, | ||||
|   ~ but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|   ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|   ~ GNU Affero General Public License for more details. | ||||
|   ~ | ||||
|   ~ You should have received a copy of the GNU Affero General Public License | ||||
|   ~ along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
|   --> | ||||
|  | ||||
| 	<!--  | ||||
| Commando vanuit firefly directory:  | ||||
| phpmd database,app,tests html /gdrive-all/development/phpmd/phpmd.xml > public/report.html | ||||
| 	--> | ||||
| <ruleset name="pcsg-generated-ruleset" | ||||
|          xmlns="http://pmd.sf.net/ruleset/1.0.0" | ||||
|          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|          xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" | ||||
|          xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"> | ||||
|     <description>Firefly III ruleset.</description> | ||||
|     <!-- Import the entire controversial code rule set --> | ||||
|     <rule ref="rulesets/controversial.xml"> | ||||
|         <exclude name="CamelCasePropertyName"/> | ||||
|     </rule> | ||||
|  | ||||
| 	<!-- Import the entire controversial code rule set --> | ||||
| 	<rule ref="rulesets/controversial.xml"> | ||||
| 		<exclude name="CamelCasePropertyName" /> | ||||
| 	</rule> | ||||
| 	 | ||||
| 	<!-- clean code --> | ||||
| 	<rule ref="rulesets/codesize.xml" /> | ||||
| 	<rule ref="rulesets/design.xml" /> | ||||
| 	<rule ref="rulesets/naming.xml" /> | ||||
| 	<rule ref="rulesets/unusedcode.xml" /> | ||||
|     <!-- clean code --> | ||||
|     <!-- <rule ref="rulesets/codesize.xml" /> --> | ||||
|     <rule ref="rulesets/unusedcode.xml"/> | ||||
|  | ||||
| 	<rule ref="rulesets/codesize.xml/CyclomaticComplexity"> | ||||
| 		<properties> | ||||
| 			<property name="reportLevel" value="5"/> | ||||
| 		</properties> | ||||
| 	</rule> | ||||
| 	<rule ref="rulesets/codesize.xml/NPathComplexity"> | ||||
| 		<properties> | ||||
| 			<property name="minimum" value="128"/> | ||||
| 		</properties> | ||||
| 	</rule> | ||||
| 	<rule ref="rulesets/codesize.xml/ExcessiveMethodLength"> | ||||
| 		<properties> | ||||
| 			<property name="minimum" value="40"/> | ||||
| 		</properties> | ||||
| 	</rule> | ||||
| 	<rule ref="rulesets/codesize.xml/ExcessiveParameterList"> | ||||
| 		<properties> | ||||
| 			<property name="minimum" value="5"/> | ||||
| 		</properties> | ||||
| 	</rule> | ||||
|  | ||||
| 	<!-- include clean code manually --> | ||||
| 	<rule ref="rulesets/cleancode.xml/BooleanArgumentFlag" /> | ||||
| 	<rule ref="rulesets/cleancode.xml/ElseExpression" /> | ||||
|     <rule ref="rulesets/design.xml/NumberOfChildren"> | ||||
|         <properties> | ||||
|             <!-- This is now at 32, which excludes the controllers but should prevent more monoliths. --> | ||||
|             <property name="minimum" value="32"/> | ||||
|         </properties> | ||||
|     </rule> | ||||
|     <rule ref="rulesets/design.xml/CouplingBetweenObjects"> | ||||
|         <properties> | ||||
|             <!-- Leaving this at 28 excuses most current code but it can't get worse than that. --> | ||||
|             <property name="maximum" value="28"/> | ||||
|         </properties> | ||||
|     </rule> | ||||
|  | ||||
| 	<!-- no this one --> | ||||
| 	<!--<rule ref="rulesets/cleancode.xml/StaticAccess" />--> | ||||
| </ruleset> | ||||
|  | ||||
|     <rule ref="rulesets/naming.xml/ShortMethodName"> | ||||
|         <properties> | ||||
|             <property name="minimum" value="3"/> | ||||
|         </properties> | ||||
|     </rule> | ||||
|  | ||||
|     <!-- code size --> | ||||
|     <rule ref="rulesets/codesize.xml/CyclomaticComplexity"> | ||||
|         <properties> | ||||
|             <!-- Leave at 20. This means methods will be pretty complex before the system starts complaining. --> | ||||
|             <property name="reportLevel" value="20"/> | ||||
|         </properties> | ||||
|     </rule> | ||||
|     <rule ref="rulesets/codesize.xml/NPathComplexity"> | ||||
|         <properties> | ||||
|             <!-- 2000 results in some pretty complex methods, but it's OK. --> | ||||
|             <!-- They should not be much more complex than that though --> | ||||
|             <property name="minimum" value="2000"/> | ||||
|         </properties> | ||||
|     </rule> | ||||
|     <rule ref="rulesets/codesize.xml/ExcessiveMethodLength"> | ||||
|         <properties> | ||||
|             <!-- 75 seems like a nice number. Shorter isn't always feasible and there are a few exceptions already --> | ||||
|             <property name="minimum" value="75"/> | ||||
|             <property name="ignore-whitespace" value="true"/> | ||||
|         </properties> | ||||
|     </rule> | ||||
|     <rule ref="rulesets/codesize.xml/ExcessiveParameterList"> | ||||
|         <properties> | ||||
|             <!-- 5 is fine. 6 is excessive, but I have just one of those. At the end of the day, I still need all params. --> | ||||
|             <property name="minimum" value="5"/> | ||||
|         </properties> | ||||
|     </rule> | ||||
|  | ||||
|     <!-- include clean code manually --> | ||||
|     <rule ref="rulesets/cleancode.xml/BooleanArgumentFlag"/> | ||||
|     <rule ref="rulesets/cleancode.xml/ElseExpression"/> | ||||
|     <rule ref="rulesets/cleancode.xml/MissingImport"/> | ||||
|     <rule ref="rulesets/cleancode.xml/UndefinedVariable"/> | ||||
|     <rule ref="rulesets/cleancode.xml/IfStatementAssignment"/> | ||||
|     <rule ref="rulesets/cleancode.xml/DuplicatedArrayKey"/> | ||||
|     <rule ref="rulesets/cleancode.xml/ErrorControlOperator"/> | ||||
| </ruleset> | ||||
|   | ||||
| @@ -1,42 +1,33 @@ | ||||
| includes: | ||||
|   - ../vendor/nunomaduro/larastan/extension.neon | ||||
|   - ../vendor/ergebnis/phpstan-rules/rules.neon | ||||
|   - ../vendor/phpstan/phpstan-deprecation-rules/rules.neon | ||||
|   - ../vendor/thecodingmachine/phpstan-strict-rules/phpstan-strict-rules.neon | ||||
|  | ||||
| parameters: | ||||
|   universalObjectCratesClasses: | ||||
|     - Illuminate\Database\Eloquent\Model | ||||
|   # TODO: slowly remove these parameters and fix the issues found. | ||||
|   reportUnmatchedIgnoredErrors: false | ||||
|   checkGenericClassInNonGenericObjectType: false  # remove this rule when all other issues are solved. | ||||
|   ignoreErrors: | ||||
|   # TODO: slowly remove these exceptions and fix the issues found. | ||||
|     - '#Dynamic call to static method#' # all the Laravel ORM things depend on this. | ||||
|     - '#Control structures using switch should not be used.#' # switch is fine in some cases. | ||||
|     - '#with no value type specified in iterable type array#' # remove this rule when all other issues are solved. | ||||
|     - '#has no value type specified in iterable type array#' # remove this rule when all other issues are solved. | ||||
|     - '#is not allowed to extend#' | ||||
|     - '#switch is forbidden to use#' | ||||
|     - '#is neither abstract nor final#' | ||||
|     - '#has a nullable return type declaration#' | ||||
|     - '#with a nullable type declaration#' | ||||
|     - '#on left side of \?\?\= always exists and is not nullable#' | ||||
|     - '#has a nullable return type declaration#' # perhaps throw errors instead? | ||||
|     - '#with a nullable type declaration#' # decide what action should be if param is null. | ||||
|     - '#with null as default value#' | ||||
|     - '#is not covariant with PHPDoc type array#' | ||||
|     - | ||||
|         message: '#Constructor in [a-zA-Z0-9\\_]+ has parameter \$[a-zA-Z0-9\\_]+ with default value#' | ||||
|         paths: | ||||
|             - ../app/Exceptions/IntervalException.php | ||||
|             - ../app/Support/Navigation.php | ||||
|     - | ||||
|         message: '#but containers should not be injected#' | ||||
|         paths: | ||||
|             - ../app/Support/Authentication/RemoteUserGuard.php | ||||
|     - | ||||
|         message: '#Control structures using switch should not be used.#' | ||||
|         paths: | ||||
|             - ../app/Api/V1/Controllers/Data/DestroyController.php | ||||
|             - ../app/Console/Commands/Correction/FixAccountTypes.php | ||||
|             - ../app/Console/Commands/Upgrade/OtherCurrenciesCorrections.php | ||||
|             - ../app/Exceptions/GracefulNotFoundHandler.php | ||||
|             - ../app/Generator/Webhook/StandardMessageGenerator.php | ||||
|             - ../app/Support/Amount.php | ||||
|             - ../app/Support/Navigation.php | ||||
|             - ../app/Support/ParseDateString.php | ||||
|             - ../app/Support/Search/AccountSearch.php | ||||
|             - ../app/Support/Search/OperatorQuerySearch.php | ||||
|             - ../app/Support/Twig/General.php | ||||
|             - ../app/Transformers/RecurrenceTransformer.php | ||||
|             - ../app/Validation/AccountValidator.php | ||||
|             - ../app/Validation/RecurrenceValidation.php | ||||
|             - ../app/Validation/TransactionValidation.php | ||||
|  | ||||
|     - | ||||
|         message: '#Function compact\(\) should not be used#' | ||||
|         message: '#Function compact\(\) should not be used#' # too useful in template rendering. | ||||
|         paths: | ||||
|             - ../app/Generator/Report/Account/MonthReportGenerator.php | ||||
|             - ../app/Generator/Report/Audit/MonthReportGenerator.php | ||||
| @@ -57,7 +48,6 @@ parameters: | ||||
|         message: '#Either catch a more specific exception#' | ||||
|         paths: | ||||
|             - ../app/Support/Form/FormSupport.php | ||||
|  | ||||
|   paths: | ||||
|     - ../app | ||||
|     - ../database | ||||
| @@ -66,5 +56,6 @@ parameters: | ||||
|     - ../bootstrap/app.php | ||||
|  | ||||
|   # The level 8 is the highest level. original was 5 | ||||
|   level: 4 | ||||
|   # 7 is more than enough, higher just leaves NULL things. | ||||
|   level: 7 | ||||
|  | ||||
|   | ||||
| @@ -29,7 +29,20 @@ SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) | ||||
| # cp .ci/.env.ci .env | ||||
|  | ||||
| # Do static code analysis. | ||||
| # ./vendor/bin/phpstan analyse -c .ci/phpstan.neon --no-progress | ||||
| ./vendor/bin/phpstan analyse -c .ci/phpstan.neon --xdebug --error-format=table > phpstan-report.txt | ||||
| if [[ $GITHUB_ACTIONS = "" ]] | ||||
| then | ||||
|     ./vendor/bin/phpstan analyse -c .ci/phpstan.neon --error-format=table > phpstan-report.txt | ||||
|     EXIT_CODE=$? | ||||
|     echo "The PHPstan report can be found in phpstan-report.txt. Exit code is $EXIT_CODE." | ||||
| fi | ||||
|  | ||||
| echo 'The PHPstan report can be found in phpstan-report.txt' | ||||
| if [[ $GITHUB_ACTIONS = "true" ]] | ||||
| then | ||||
|     ./vendor/bin/phpstan analyse -c .ci/phpstan.neon --no-progress --error-format=github | ||||
|     EXIT_CODE=$? | ||||
|  | ||||
|     # temporary exit code 0 | ||||
|     # EXIT_CODE=0 | ||||
| fi | ||||
|  | ||||
| exit $EXIT_CODE | ||||
|   | ||||
| @@ -1,63 +0,0 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| # | ||||
| # phpunit.sh | ||||
| # Copyright (c) 2021 james@firefly-iii.org | ||||
| # | ||||
| # This file is part of Firefly III (https://github.com/firefly-iii). | ||||
| # | ||||
| # This program is free software: you can redistribute it and/or modify | ||||
| # it under the terms of the GNU Affero General Public License as | ||||
| # published by the Free Software Foundation, either version 3 of the | ||||
| # License, or (at your option) any later version. | ||||
| # | ||||
| # This program is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU Affero General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU Affero General Public License | ||||
| # along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
| # | ||||
| SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" | ||||
| # enable test .env file. | ||||
| cp $SCRIPT_DIR/../.env $SCRIPT_DIR/../.env.backup | ||||
| cp $SCRIPT_DIR/.env.ci $SCRIPT_DIR/../.env | ||||
|  | ||||
| COVERAGE=false | ||||
| RESET=false | ||||
| FILE=storage/database/database.sqlite | ||||
|  | ||||
| while getopts "cr" o; do | ||||
|     case "${o}" in | ||||
|         c) COVERAGE=true;; | ||||
|         r) RESET=true;; | ||||
|     esac | ||||
| done | ||||
|  | ||||
| # reset if necessary. | ||||
| if [ $RESET = "true" ] ; then | ||||
|     rm -f $FILE | ||||
| fi | ||||
|  | ||||
| # download test database | ||||
| if [ -f "$FILE" ]; then | ||||
|   echo 'DB exists, will use it' | ||||
| else | ||||
|   echo 'Download new DB' | ||||
|   wget --quiet https://github.com/firefly-iii/test-fixtures/raw/main/test-database.sqlite -O $FILE | ||||
| fi | ||||
|  | ||||
| # run phpunit | ||||
| if [ $COVERAGE = "true" ] ; then | ||||
|   echo 'Run with coverage' | ||||
|   XDEBUG_MODE=coverage ./vendor/bin/phpunit --configuration phpunit.xml --coverage-html $SCRIPT_DIR/coverage | ||||
| else | ||||
|   echo 'Run without coverage' | ||||
|   ./vendor/bin/phpunit --configuration phpunit.xml | ||||
| fi | ||||
|  | ||||
| # restore .env file | ||||
| mv $SCRIPT_DIR/../.env.backup $SCRIPT_DIR/../.env | ||||
|  | ||||
| cd $SCRIPT_DIR/.. | ||||
| @@ -1,321 +0,0 @@ | ||||
| # You can leave this on "local". If you change it to production most console commands will ask for extra confirmation. | ||||
| # Never set it to "testing". | ||||
| APP_ENV=heroku | ||||
|  | ||||
| # Set to true if you want to see debug information in error screens. | ||||
| APP_DEBUG=false | ||||
|  | ||||
| # This should be your email address. | ||||
| # If you use Docker or similar, you can set this variable from a file by using SITE_OWNER_FILE | ||||
| SITE_OWNER=heroku@example.com | ||||
|  | ||||
| # The encryption key for your sessions. Keep this very secure. | ||||
| # If you generate a new one all existing attachments must be considered LOST. | ||||
| # Change it to a string of exactly 32 chars or use something like `php artisan key:generate` to generate it. | ||||
| # If you use Docker or similar, you can set this variable from a file by using APP_KEY_FILE | ||||
| APP_KEY=7ahyYVPVsmxjdhsweWCauGeJfwc92NP2 | ||||
|  | ||||
| # | ||||
| # Firefly III will launch using this language (for new users and unauthenticated visitors) | ||||
| # For a list of available languages: https://github.com/firefly-iii/firefly-iii/tree/main/resources/lang | ||||
| # | ||||
| # If text is still in English, remember that not everything may have been translated. | ||||
| DEFAULT_LANGUAGE=en_US | ||||
|  | ||||
| # The locale defines how numbers are formatted. | ||||
| # by default this value is the same as whatever the language is. | ||||
| DEFAULT_LOCALE=equal | ||||
|  | ||||
| # Change this value to your preferred time zone. | ||||
| # Example: Europe/Amsterdam | ||||
| # For a list of supported time zones, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones | ||||
| TZ=UTC | ||||
|  | ||||
| # TRUSTED_PROXIES is a useful variable when using Docker and/or a reverse proxy. | ||||
| # Set it to ** and reverse proxies work just fine. | ||||
| TRUSTED_PROXIES=** | ||||
|  | ||||
| # The log channel defines where your log entries go to. | ||||
| # Several other options exist. You can use 'single' for one big fat error log (not recommended). | ||||
| # Also available are 'syslog', 'errorlog' and 'stdout' which will log to the system itself. | ||||
| # A rotating log option is 'daily', creates 5 files that (surprise) rotate. | ||||
| # Default setting 'stack' will log to 'daily' and to 'stdout' at the same time. | ||||
|  | ||||
| # - Docker + versions <= 4.8.1.8 and before: use "stdout" | ||||
| # - Docker + versions >  4.8.1.8           : use "docker_out" | ||||
| # - Docker + versions >=  5.1.1            : use "stack" | ||||
| # - For everything else (als not Docker)   : use 'stack' | ||||
|  | ||||
| LOG_CHANNEL=stdout | ||||
|  | ||||
| # Log level. You can set this from least severe to most severe: | ||||
| # debug, info, notice, warning, error, critical, alert, emergency | ||||
| # If you set it to debug your logs will grow large, and fast. If you set it to emergency probably | ||||
| # nothing will get logged, ever. | ||||
| APP_LOG_LEVEL=notice | ||||
|  | ||||
| # Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III | ||||
| # For other database types, please see the FAQ: https://docs.firefly-iii.org/support/faq | ||||
| # If you use Docker or similar, you can set these variables from a file by appending them with _FILE | ||||
| # Use "pgsql" for PostgreSQL | ||||
| # Use "mysql" for MySQL and MariaDB. | ||||
| # Use "sqlite" for SQLite. | ||||
| DB_CONNECTION=pgsql | ||||
|  | ||||
|  | ||||
| # MySQL supports SSL. You can configure it here. | ||||
| # If you use Docker or similar, you can set these variables from a file by appending them with _FILE | ||||
| MYSQL_USE_SSL=false | ||||
| MYSQL_SSL_VERIFY_SERVER_CERT=true | ||||
| # You need to set at least of these options | ||||
| MYSQL_SSL_CAPATH=/etc/ssl/certs/ | ||||
| MYSQL_SSL_CA= | ||||
| MYSQL_SSL_CERT= | ||||
| MYSQL_SSL_KEY= | ||||
| MYSQL_SSL_CIPHER= | ||||
|  | ||||
| # PostgreSQL supports SSL. You can configure it here. | ||||
| # If you use Docker or similar, you can set these variables from a file by appending them with _FILE | ||||
| PGSQL_SSL_MODE=prefer | ||||
| PGSQL_SSL_ROOT_CERT=null | ||||
| PGSQL_SSL_CERT=null | ||||
| PGSQL_SSL_KEY=null | ||||
| PGSQL_SSL_CRL_FILE=null | ||||
|  | ||||
| # If you're looking for performance improvements, you could install memcached. | ||||
| CACHE_DRIVER=file | ||||
| SESSION_DRIVER=file | ||||
|  | ||||
| # If you set either of these to 'redis', you might want to update these settings too | ||||
| # If you use Docker or similar, you can set REDIS_HOST_FILE, REDIS_PASSWORD_FILE or | ||||
| # REDIS_PORT_FILE to set the value from a file instead of from an environment variable | ||||
|  | ||||
| # can be tcp, unix or http | ||||
| REDIS_SCHEME=tcp | ||||
|  | ||||
| # use only when using 'unix' for REDIS_SCHEME. Leave empty otherwise. | ||||
| REDIS_PATH= | ||||
|  | ||||
| # use only when using 'tcp' or 'http' for REDIS_SCHEME. Leave empty otherwise. | ||||
| REDIS_HOST=127.0.0.1 | ||||
| REDIS_PORT=6379 | ||||
|  | ||||
| REDIS_PASSWORD=null | ||||
| # always use quotes and make sure redis db "0" and "1" exists. Otherwise change accordingly. | ||||
| REDIS_DB="0" | ||||
| REDIS_CACHE_DB="1" | ||||
|  | ||||
| # Cookie settings. Should not be necessary to change these. | ||||
| # If you use Docker or similar, you can set COOKIE_DOMAIN_FILE to set | ||||
| # the value from a file instead of from an environment variable | ||||
| COOKIE_PATH="/" | ||||
| COOKIE_DOMAIN= | ||||
| COOKIE_SECURE=false | ||||
|  | ||||
| # If you want Firefly III to mail you, update these settings | ||||
| # For instructions, see: https://docs.firefly-iii.org/advanced-installation/email | ||||
| # If you use Docker or similar, you can set these variables from a file by appending them with _FILE | ||||
| MAIL_MAILER=log | ||||
| MAIL_HOST=null | ||||
| MAIL_PORT=2525 | ||||
| MAIL_FROM=changeme@example.com | ||||
| MAIL_USERNAME=null | ||||
| MAIL_PASSWORD=null | ||||
| MAIL_ENCRYPTION=null | ||||
|  | ||||
| # Other mail drivers: | ||||
| # If you use Docker or similar, you can set these variables from a file by appending them with _FILE | ||||
| MAILGUN_DOMAIN= | ||||
| MAILGUN_SECRET= | ||||
|  | ||||
|  | ||||
| # If you are on EU region in mailgun, use api.eu.mailgun.net, otherwise use api.mailgun.net | ||||
| # If you use Docker or similar, you can set this variable from a file by appending it with _FILE | ||||
| MAILGUN_ENDPOINT=api.mailgun.net | ||||
|  | ||||
| # If you use Docker or similar, you can set these variables from a file by appending them with _FILE | ||||
| MANDRILL_SECRET= | ||||
| SPARKPOST_SECRET= | ||||
|  | ||||
|  | ||||
| # Firefly III can send you the following messages | ||||
| SEND_REGISTRATION_MAIL=true | ||||
| SEND_ERROR_MESSAGE=true | ||||
|  | ||||
| # These messages contain (sensitive) transaction information: | ||||
| SEND_REPORT_JOURNALS=true | ||||
|  | ||||
| # Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places. | ||||
| # If you use Docker or similar, you can set this variable from a file by appending it with _FILE | ||||
| MAPBOX_API_KEY= | ||||
|  | ||||
| # The map will default to this location: | ||||
| MAP_DEFAULT_LAT=51.983333 | ||||
| MAP_DEFAULT_LONG=5.916667 | ||||
| MAP_DEFAULT_ZOOM=6 | ||||
|  | ||||
| # Firefly III currently supports two provider for live Currency Exchange Rates: | ||||
| # "fixer", and "ratesapi". | ||||
| # RatesApi.IO (see https://ratesapi.io) is a FREE and OPEN SOURCE live currency exchange rates, | ||||
| # built compatible with Fixer.IO, based on data published by European Central Bank, and doesn't require API key. | ||||
| CER_PROVIDER=ratesapi | ||||
|  | ||||
| # If you have select "fixer" as default currency exchange rates, | ||||
| # set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. | ||||
| # Please note that this WILL ONLY WORK FOR PAID fixer.io accounts because they severely limited | ||||
| # the free API up to the point where you might as well offer nothing. | ||||
| # If you use Docker or similar, you can set this variable from a file by appending it with _FILE | ||||
| FIXER_API_KEY= | ||||
|  | ||||
| # Firefly III has two options for user authentication. "eloquent" is the default, | ||||
| # and "ldap" for LDAP servers. | ||||
| # For full instructions on these settings please visit: | ||||
| # https://docs.firefly-iii.org/advanced-installation/authentication | ||||
| # If you use Docker or similar, you can set this variable from a file by appending it with _FILE | ||||
| LOGIN_PROVIDER=eloquent | ||||
|  | ||||
| # | ||||
| # It's also possible to change the way users are authenticated. You could use Authelia for example. | ||||
| # Authentication via the REMOTE_USER header is supported. Change the value below to "remote_user_guard". | ||||
| # | ||||
| # If you do this please read the documentation for instructions and warnings: | ||||
| # https://docs.firefly-iii.org/advanced-installation/authentication | ||||
| # | ||||
| # This function is available in Firefly III v5.3.0 and higher. | ||||
| AUTHENTICATION_GUARD=web | ||||
|  | ||||
| # | ||||
| # Likewise, it's impossible to log out users who's authentication is handled by an external system. | ||||
| # Enter a custom URL here that will force a logout (your authentication provider can tell you). | ||||
| # Setting this variable only works when AUTHENTICATION_GUARD != web | ||||
| # | ||||
| CUSTOM_LOGOUT_URL= | ||||
|  | ||||
| # LDAP connection configuration | ||||
| # OpenLDAP, FreeIPA or ActiveDirectory | ||||
| # # If you use Docker or similar, you can set this variable from a file by appending it with _FILE | ||||
| ADLDAP_CONNECTION_SCHEME=OpenLDAP | ||||
| ADLDAP_AUTO_CONNECT=true | ||||
|  | ||||
| # LDAP connection settings | ||||
| # You can set the following variables from a file by appending them with _FILE: | ||||
| # ADLDAP_CONTROLLERS, ADLDAP_PORT, ADLDAP_BASEDN | ||||
| ADLDAP_CONTROLLERS= | ||||
| ADLDAP_PORT=389 | ||||
| ADLDAP_TIMEOUT=5 | ||||
| ADLDAP_BASEDN="" | ||||
| ADLDAP_FOLLOW_REFFERALS=false | ||||
|  | ||||
| # SSL/TLS settings | ||||
| ADLDAP_USE_SSL=false | ||||
| ADLDAP_USE_TLS=false | ||||
| ADLDAP_SSL_CACERTDIR= | ||||
| ADLDAP_SSL_CACERTFILE= | ||||
| ADLDAP_SSL_CERTFILE= | ||||
| ADLDAP_SSL_KEYFILE= | ||||
| ADLDAP_SSL_CIPHER_SUITE= | ||||
| ADLDAP_SSL_REQUIRE_CERT= | ||||
|  | ||||
| # You can set the following variables from a file by appending them with _FILE: | ||||
| ADLDAP_ADMIN_USERNAME= | ||||
| ADLDAP_ADMIN_PASSWORD= | ||||
|  | ||||
| # You can set the following variables from a file by appending them with _FILE: | ||||
| ADLDAP_ACCOUNT_PREFIX= | ||||
| ADLDAP_ACCOUNT_SUFFIX= | ||||
|  | ||||
|  | ||||
| # LDAP authentication settings. | ||||
| ADLDAP_PASSWORD_SYNC=false | ||||
| ADLDAP_LOGIN_FALLBACK=false | ||||
|  | ||||
| ADLDAP_DISCOVER_FIELD=distinguishedname | ||||
| ADLDAP_AUTH_FIELD=distinguishedname | ||||
|  | ||||
| # Will allow SSO if your server provides an AUTH_USER field. | ||||
| # You can set the following variables from a file by appending them with _FILE: | ||||
| WINDOWS_SSO_ENABLED=false | ||||
| WINDOWS_SSO_DISCOVER=samaccountname | ||||
| WINDOWS_SSO_KEY=AUTH_USER | ||||
|  | ||||
| # field to sync as local username. | ||||
| # You can set the following variable from a file by appending it with _FILE: | ||||
| ADLDAP_SYNC_FIELD=userprincipalname | ||||
|  | ||||
| # You can disable the X-Frame-Options header if it interferes with tools like | ||||
| # Organizr. This is at your own risk. Applications running in frames run the risk | ||||
| # of leaking information to their parent frame. | ||||
| DISABLE_FRAME_HEADER=false | ||||
|  | ||||
| # You can disable the Content Security Policy header when you're using an ancient browser | ||||
| # or any version of Microsoft Edge / Internet Explorer (which amounts to the same thing really) | ||||
| # This leaves you with the risk of not being able to stop XSS bugs should they ever surface. | ||||
| # This is at your own risk. | ||||
| DISABLE_CSP_HEADER=false | ||||
|  | ||||
| # If you wish to track your own behavior over Firefly III, set valid analytics tracker information here. | ||||
| # Nobody uses this except for me on the demo site. But hey, feel free to use this if you want to. | ||||
| # Do not prepend the TRACKER_URL with http:// or https:// | ||||
| # The only tracker supported is Matomo. | ||||
| # You can set the following variables from a file by appending them with _FILE: | ||||
| TRACKER_SITE_ID= | ||||
| TRACKER_URL= | ||||
|  | ||||
| # You can fine tune the start-up of a Docker container by editing these environment variables. | ||||
| # Use this at your own risk. Disabling certain checks and features may result in lost of inconsistent data. | ||||
| # However if you know what you're doing you can significantly speed up container start times. | ||||
| # Set each value to true to enable, or false to disable. | ||||
|  | ||||
| # Check if the SQLite database exists. Can be skipped if you're not using SQLite. | ||||
| # Won't significantly speed up things. | ||||
| DKR_CHECK_SQLITE=true | ||||
|  | ||||
| # Run database creation and migration commands. Disable this only if you're 100% sure the DB exists | ||||
| # and is up to date. | ||||
| DKR_RUN_MIGRATION=true | ||||
|  | ||||
| # Run database upgrade commands. Disable this only when you're 100% sure your DB is up-to-date | ||||
| # with the latest fixes (outside of migrations!) | ||||
| DKR_RUN_UPGRADE=true | ||||
|  | ||||
| # Verify database integrity. Includes all data checks and verifications. | ||||
| # Disabling this makes Firefly III assume your DB is intact. | ||||
| DKR_RUN_VERIFY=true | ||||
|  | ||||
| # Run database reporting commands. When disabled, Firefly III won't go over your data to report current state. | ||||
| # Disabling this should have no impact on data integrity or safety but it won't warn you of possible issues. | ||||
| DKR_RUN_REPORT=true | ||||
|  | ||||
| # Generate OAuth2 keys. | ||||
| # When disabled, Firefly III won't attempt to generate OAuth2 Passport keys. This won't be an issue, IFF (if and only if) | ||||
| # you had previously generated keys already and they're stored in your database for restoration. | ||||
| DKR_RUN_PASSPORT_INSTALL=true | ||||
|  | ||||
| # Leave the following configuration vars as is. | ||||
| # Unless you like to tinker and know what you're doing. | ||||
| APP_NAME=FireflyIII | ||||
| ADLDAP_CONNECTION=default | ||||
| BROADCAST_DRIVER=log | ||||
| QUEUE_DRIVER=sync | ||||
| CACHE_PREFIX=firefly | ||||
| SEARCH_RESULT_LIMIT=50 | ||||
| PUSHER_KEY= | ||||
| PUSHER_SECRET= | ||||
| PUSHER_ID= | ||||
| DEMO_USERNAME= | ||||
| DEMO_PASSWORD= | ||||
| USE_ENCRYPTION=false | ||||
| IS_HEROKU=false | ||||
| FIREFLY_III_LAYOUT=v1 | ||||
|  | ||||
| # | ||||
| # If you have trouble configuring your Firefly III installation, DON'T BOTHER setting this variable. | ||||
| # It won't work. It doesn't do ANYTHING. Don't believe the lies you read online. I'm not joking. | ||||
| # This configuration value WILL NOT HELP. | ||||
| # | ||||
| # This variable is ONLY used in some of the emails Firefly III sends around. Nowhere else. | ||||
| # So when configuring anything WEB related this variable doesn't do anything. Nothing | ||||
| # | ||||
| # If you're stuck I understand you get desperate but look SOMEWHERE ELSE. | ||||
| # | ||||
| APP_URL=http://localhost | ||||
| @@ -1,32 +0,0 @@ | ||||
| bg_BG | ||||
| ca_ES | ||||
| cs_CZ | ||||
| da_DK | ||||
| de_DE | ||||
| el_GR | ||||
| en_GB | ||||
| en_US | ||||
| es_ES | ||||
| fi_FI | ||||
| fr_FR | ||||
| hu_HU | ||||
| id_ID | ||||
| it_IT | ||||
| ja_JP | ||||
| ko_KR | ||||
| nb_NO | ||||
| nl_NL | ||||
| nn_NO | ||||
| pl_PL | ||||
| pt_BR | ||||
| pt_PT | ||||
| ro_RO | ||||
| ru_RU | ||||
| sk_SK | ||||
| sl_SI | ||||
| sv_SE | ||||
| tr_TR | ||||
| uk_UA | ||||
| vi_VN | ||||
| zh-hans_CN | ||||
| zh-hant_CN | ||||
| @@ -2,8 +2,17 @@ root = true | ||||
| 
 | ||||
| [*] | ||||
| charset = utf-8 | ||||
| indent_style = space | ||||
| indent_size = 2 | ||||
| end_of_line = lf | ||||
| indent_size = 4 | ||||
| indent_style = space | ||||
| insert_final_newline = true | ||||
| trim_trailing_whitespace = true | ||||
| 
 | ||||
| [*.md] | ||||
| trim_trailing_whitespace = false | ||||
| 
 | ||||
| [*.{yml,yaml}] | ||||
| indent_size = 2 | ||||
| 
 | ||||
| [docker-compose.yml] | ||||
| indent_size = 4 | ||||
							
								
								
									
										60
									
								
								.env.example
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								.env.example
									
									
									
									
									
								
							| @@ -45,12 +45,6 @@ TRUSTED_PROXIES= | ||||
| # Default setting 'stack' will log to 'daily' and to 'stdout' at the same time. | ||||
| LOG_CHANNEL=stack | ||||
|  | ||||
| # | ||||
| # Used when logging to papertrail: | ||||
| # | ||||
| PAPERTRAIL_HOST= | ||||
| PAPERTRAIL_PORT= | ||||
|  | ||||
| # Log level. You can set this from least severe to most severe: | ||||
| # debug, info, notice, warning, error, critical, alert, emergency | ||||
| # If you set it to debug your logs will grow large, and fast. If you set it to emergency probably | ||||
| @@ -58,11 +52,33 @@ PAPERTRAIL_PORT= | ||||
| APP_LOG_LEVEL=notice | ||||
|  | ||||
| # Audit log level. | ||||
| # Set this to "emergency" if you dont want to store audit logs, leave on info otherwise. | ||||
| AUDIT_LOG_LEVEL=info | ||||
| # The audit log is used to log notable Firefly III events on a separate channel. | ||||
| # These log entries may contain sensitive financial information. | ||||
| # The audit log is disabled by default. | ||||
| # | ||||
| # To enable it, set AUDIT_LOG_LEVEL to "info" | ||||
| # To disable it, set AUDIT_LOG_LEVEL to "emergency" | ||||
| AUDIT_LOG_LEVEL=emergency | ||||
|  | ||||
| # | ||||
| # If you want, you can redirect the audit logs to another channel. | ||||
| # Set 'audit_stdout', 'audit_syslog', 'audit_errorlog' to log to the system itself. | ||||
| # Use audit_daily to log to a rotating file. | ||||
| # Use audit_papertrail to log to papertrail. | ||||
| # | ||||
| # If you do this, the audit logs may be mixed with normal logs because the settings for these channels | ||||
| # are often the same as the settings for the normal logs. | ||||
| AUDIT_LOG_CHANNEL= | ||||
|  | ||||
| # | ||||
| # Used when logging to papertrail: | ||||
| # Also used when audit logs log to papertrail: | ||||
| # | ||||
| PAPERTRAIL_HOST= | ||||
| PAPERTRAIL_PORT= | ||||
|  | ||||
| # Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III | ||||
| # For other database types, please see the FAQ: https://docs.firefly-iii.org/firefly-iii/faq/self-hosted/#i-want-to-use-sqlite | ||||
| # For other database types, please see the FAQ: https://docs.firefly-iii.org/references/faq/install/#i-want-to-use-sqlite | ||||
| # If you use Docker or similar, you can set these variables from a file by appending them with _FILE | ||||
| # Use "pgsql" for PostgreSQL | ||||
| # Use "mysql" for MySQL and MariaDB. | ||||
| @@ -106,7 +122,7 @@ SESSION_DRIVER=file | ||||
| # If you use Docker or similar, you can set REDIS_HOST_FILE, REDIS_PASSWORD_FILE or | ||||
| # REDIS_PORT_FILE to set the value from a file instead of from an environment variable | ||||
|  | ||||
| # can be tcp, unix or http | ||||
| # can be tcp or unix. http is not supported | ||||
| REDIS_SCHEME=tcp | ||||
|  | ||||
| # use only when using 'unix' for REDIS_SCHEME. Leave empty otherwise. | ||||
| @@ -134,7 +150,7 @@ COOKIE_SECURE=false | ||||
| COOKIE_SAMESITE=lax | ||||
|  | ||||
| # If you want Firefly III to email you, update these settings | ||||
| # For instructions, see: https://docs.firefly-iii.org/firefly-iii/advanced-installation/email/#email | ||||
| # For instructions, see: https://docs.firefly-iii.org/how-to/firefly-iii/advanced/notifications/#email | ||||
| # If you use Docker or similar, you can set these variables from a file by appending them with _FILE | ||||
| MAIL_MAILER=log | ||||
| MAIL_HOST=null | ||||
| @@ -179,6 +195,16 @@ MAP_DEFAULT_LAT=51.983333 | ||||
| MAP_DEFAULT_LONG=5.916667 | ||||
| MAP_DEFAULT_ZOOM=6 | ||||
|  | ||||
| # | ||||
| # Some objects have room for an URL, like transactions and webhooks. | ||||
| # By default, the following protocols are allowed: | ||||
| # http, https, ftp, ftps, mailto | ||||
| # | ||||
| # To change this, set your preferred comma separated set below. | ||||
| # Be sure to include http, https and other default ones if you need to. | ||||
| # | ||||
| VALID_URL_PROTOCOLS= | ||||
|  | ||||
| # | ||||
| # Firefly III authentication settings | ||||
| # | ||||
| @@ -188,7 +214,7 @@ MAP_DEFAULT_ZOOM=6 | ||||
| # - 'web' (default, uses built in DB) | ||||
| # - 'remote_user_guard' for Authelia etc | ||||
| # Read more about these settings in the documentation. | ||||
| # https://docs.firefly-iii.org/firefly-iii/advanced-installation/authentication | ||||
| # https://docs.firefly-iii.org/how-to/firefly-iii/advanced/authentication/ | ||||
| # | ||||
| # LDAP is no longer supported :( | ||||
| # | ||||
| @@ -241,9 +267,9 @@ ALLOW_WEBHOOKS=false | ||||
| # | ||||
| # The static cron job token can be useful when you use Docker and wish to manage cron jobs. | ||||
| # 1. Set this token to any 32-character value (this is important!). | ||||
| # 2. Use this token in the cron URL instead of a user's command line token. | ||||
| # 2. Use this token in the cron URL instead of a user's command line token that you can find in /profile | ||||
| # | ||||
| # For more info: https://docs.firefly-iii.org/firefly-iii/advanced-installation/cron/ | ||||
| # For more info: https://docs.firefly-iii.org/how-to/firefly-iii/advanced/cron/ | ||||
| # | ||||
| # You can set this variable from a file by appending it with _FILE | ||||
| # | ||||
| @@ -298,7 +324,11 @@ PUSHER_SECRET= | ||||
| PUSHER_ID= | ||||
| DEMO_USERNAME= | ||||
| DEMO_PASSWORD= | ||||
| IS_HEROKU=false | ||||
|  | ||||
| # | ||||
| # The v2 layout is very experimental. If it breaks you get to keep both parts. | ||||
| # Be wary of data loss. | ||||
| # | ||||
| FIREFLY_III_LAYOUT=v1 | ||||
|  | ||||
| # | ||||
|   | ||||
							
								
								
									
										26
									
								
								.env.testing
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								.env.testing
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| APP_ENV=testing | ||||
| APP_DEBUG=true | ||||
| SITE_OWNER=mail@example.com | ||||
| APP_KEY=TestTestTestTestTestTestTestTest | ||||
| DEFAULT_LANGUAGE=en_US | ||||
| DEFAULT_LOCALE=equal | ||||
| TZ=Europe/Amsterdam | ||||
| LOG_CHANNEL=stdout | ||||
| APP_LOG_LEVEL=debug | ||||
| AUDIT_LOG_LEVEL=info | ||||
| AUDIT_LOG_CHANNEL=audit_stdout | ||||
| DB_CONNECTION=sqlite | ||||
| CACHE_DRIVER=array | ||||
| SESSION_DRIVER=array | ||||
| MAIL_MAILER=log | ||||
| SEND_ERROR_MESSAGE=true | ||||
| ENABLE_EXTERNAL_MAP=false | ||||
| ENABLE_EXTERNAL_RATES=true | ||||
| AUTHENTICATION_GUARD=web | ||||
| ALLOW_WEBHOOKS=true | ||||
| APP_NAME=FireflyIII | ||||
| BROADCAST_DRIVER=log | ||||
| QUEUE_DRIVER=sync | ||||
| CACHE_PREFIX=firefly | ||||
| FIREFLY_III_LAYOUT=v1 | ||||
| APP_URL=http://localhost | ||||
							
								
								
									
										17
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							| @@ -1,8 +1,11 @@ | ||||
| * text=auto | ||||
| *.css linguist-vendored | ||||
| *.scss linguist-vendored | ||||
| *.js linguist-vendored | ||||
| * text=auto eol=lf | ||||
|  | ||||
| *.blade.php diff=html | ||||
| *.css diff=css | ||||
| *.html diff=html | ||||
| *.md diff=markdown | ||||
| *.php diff=php | ||||
|  | ||||
| /.github export-ignore | ||||
| CHANGELOG.md export-ignore | ||||
| /tests       export-ignore | ||||
| /phpunit.xml export-ignore | ||||
| /.ci export-ignore | ||||
| .styleci.yml export-ignore | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/ISSUE_TEMPLATE/fr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/ISSUE_TEMPLATE/fr.yml
									
									
									
									
										vendored
									
									
								
							| @@ -8,7 +8,7 @@ body: | ||||
|       options: | ||||
|         - label: I've read the [support guidelines](https://github.com/firefly-iii/firefly-iii/blob/main/.github/support.md) | ||||
|           required: true | ||||
|         - label: My request is not listed as [a very good idea, but unfortunately...](https://docs.firefly-iii.org/firefly-iii/more-information/what-its-not/) | ||||
|         - label: My request is not listed as [a very good idea, but unfortunately...](https://docs.firefly-iii.org/explanation/more-information/what-its-not/) | ||||
|           required: true | ||||
|         - label: I've used [the search](https://github.com/firefly-iii/firefly-iii/issues?q=is%3Aissue) and this has not been requested before. | ||||
|           required: true | ||||
|   | ||||
							
								
								
									
										4
									
								
								.github/contributing.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/contributing.md
									
									
									
									
										vendored
									
									
								
							| @@ -1,3 +1,3 @@ | ||||
| # [Contributing guidelines](https://docs.firefly-iii.org/firefly-iii/support/#contributing-code) | ||||
| # [Contributing guidelines](https://docs.firefly-iii.org/explanation/support/#contributing-code) | ||||
| 
 | ||||
| [Contributing guidelines](https://docs.firefly-iii.org/firefly-iii/support/#contributing-code) | ||||
| [Contributing guidelines](https://docs.firefly-iii.org/explanation/support/#contributing-code) | ||||
|   | ||||
							
								
								
									
										16
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,11 +1,16 @@ | ||||
| version: 2 | ||||
| updates: | ||||
|  | ||||
|   # Check for updates to GitHub Actions every week | ||||
|   - package-ecosystem: "github-actions" | ||||
|     directory: "/" | ||||
|     schedule: | ||||
|       interval: "weekly" | ||||
|  | ||||
|   # composer updates | ||||
|   - package-ecosystem: "composer" | ||||
|     directory: "/" # Location of package manifests | ||||
|     target-branch: develop | ||||
|     labels: [ "bug" ] | ||||
|     versioning-strategy: increase | ||||
|     schedule: | ||||
|       interval: "weekly" | ||||
| @@ -14,15 +19,6 @@ updates: | ||||
|   - package-ecosystem: "npm" | ||||
|     directory: "/" | ||||
|     target-branch: develop | ||||
|     labels: [ "bug" ] | ||||
|     versioning-strategy: increase | ||||
|     schedule: | ||||
|       interval: "weekly" | ||||
|  | ||||
|   - package-ecosystem: "github-actions" | ||||
|     directory: "/" | ||||
|     target-branch: develop | ||||
|     labels: [ "bug" ] | ||||
|     versioning-strategy: increase | ||||
|     schedule: | ||||
|       interval: "weekly" | ||||
|   | ||||
							
								
								
									
										111
									
								
								.github/label-actions.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								.github/label-actions.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,111 @@ | ||||
| # Configuration for Label Actions - https://github.com/dessant/label-actions | ||||
|  | ||||
| # The `feature` label is added to issues | ||||
| feature: | ||||
|   issues: | ||||
|     # Post a comment, `{issue-author}` is an optional placeholder | ||||
|     comment: | | ||||
|       Hi there!  | ||||
|  | ||||
|       This is an automatic reply. `Share and enjoy` | ||||
|  | ||||
|       This issue has been marked as a feature request. The requested (new) feature will become a part of Firefly III or the data importer in due course. | ||||
|  | ||||
|       If you come across this issue, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates. | ||||
|  | ||||
|       Thank you for your contributions. | ||||
|  | ||||
| epic: | ||||
|   issues: | ||||
|     # Post a comment, `{issue-author}` is an optional placeholder | ||||
|     comment: | | ||||
|       Hi there!  | ||||
|  | ||||
|       This is an automatic reply. `Share and enjoy` | ||||
|  | ||||
|       This issue has been marked as an epic. In epics, large amounts of works are collected that will be part of a major new feature. If you have more ideas that could be a part of this epic, feel free to reply. | ||||
|  | ||||
|       *However*, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted.  | ||||
|  | ||||
|       If you are merely interested in this epic's progress, you can subscribe to this issue to get updates. | ||||
|  | ||||
|       Thank you for your contributions. | ||||
|  | ||||
| enhancement: | ||||
|   issues: | ||||
|     # Post a comment, `{issue-author}` is an optional placeholder | ||||
|     comment: | | ||||
|       Hi there!  | ||||
|  | ||||
|       This is an automatic reply. `Share and enjoy` | ||||
|  | ||||
|       This issue has been marked as an enhancement. The requested enhancement to an existing feature will become a part of Firefly III or the data importer in due course. | ||||
|  | ||||
|       If you come across this issue, please be aware there is NO need to reply with "+1" or "me too" or "I need this too" or whatever. Such comments are not helpful, and do not influence [the roadmap](https://roadmap.firefly-iii.org/). Your comment may be :skull: deleted. You can subscribe to this issue to get updates. | ||||
|  | ||||
|       Thank you for your contributions. | ||||
|  | ||||
| triage: | ||||
|   issues: | ||||
|     # Post a comment, `{issue-author}` is an optional placeholder | ||||
|     comment: | | ||||
|       Hi there!  | ||||
|  | ||||
|       This is an automatic reply. `Share and enjoy` | ||||
|  | ||||
|       This issue has been marked as being in triage. The root cause is not known yet, or the issue needs more investigation. You can help by sharing debug information (from `/debug`) if you also have this issue or when you haven't already done so. | ||||
|  | ||||
|       Thank you for your contributions. | ||||
|  | ||||
| needs-moar-debug: | ||||
|   issues: | ||||
|     comment: | | ||||
|       Hi there!  | ||||
|  | ||||
|       This is an automatic reply. `Share and enjoy` | ||||
|  | ||||
|       To learn more about this issue, please make sure you share at least: | ||||
|  | ||||
|       1. The table you can find on the `/debug` page | ||||
|       2. Firefly III version | ||||
|       2. Docker, self-hosted, or hosted by a third party? | ||||
|       3. Operating system and browser | ||||
|  | ||||
|       Thank you for your contributions. | ||||
|     unlabel: needs-moar-debug | ||||
|  | ||||
|  | ||||
| needs-moar-logs: | ||||
|   issues: | ||||
|     comment: | | ||||
|       Hi there!  | ||||
|  | ||||
|       This is an automatic reply. `Share and enjoy` | ||||
|  | ||||
|       To learn more about this issue, please share the relevant log files from your Firefly III or data importer installation. | ||||
|  | ||||
|       The relevant instructions can be found in the documentation: [How to debug Firefly III?](https://docs.firefly-iii.org/how-to/general/debug/) Once debug mode is activated per these instructions, you can repeat your action and find the logs, depending on your method of installation. All is explained on the page. | ||||
|  | ||||
|       Please share the relevant log lines in your issue, either inline or as an attachment. If you feel the logs contain sensitive information, you may also send them to [james@firefly-iii.org](mailto:james@firefly-iii.org). Without these logs, it may not be possible to properly investigate this issue. | ||||
|  | ||||
|       Thank you for your contributions. | ||||
|     unlabel: needs-moar-logs | ||||
|  | ||||
| v2-layout-issue: | ||||
|   issues: | ||||
|     comment: | | ||||
|       Hi there!  | ||||
|  | ||||
|       This is an automatic reply. `Share and enjoy` | ||||
|  | ||||
|       It seems your issue is about the new v2-layout that is currently in development for Firefly III. | ||||
|  | ||||
|       These issues are collected in [a GitHub discussion](https://github.com/firefly-iii/firefly-iii/issues/8361). | ||||
|  | ||||
|       Please note that the v2 layout is still very much in development. | ||||
|  | ||||
|       Thank you for your contributions. | ||||
|     close: true | ||||
|     close-reason: completed | ||||
|     lock: false | ||||
|     unlabel: v2-layout-issue | ||||
							
								
								
									
										2
									
								
								.github/support.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/support.md
									
									
									
									
										vendored
									
									
								
							| @@ -27,7 +27,7 @@ Only then [create a new issue](https://github.com/firefly-iii/firefly-iii/issues | ||||
| 
 | ||||
| - Issues can be converted into discussions if it's not a bug or feature request. | ||||
| - Features that won't be implemented will be labelled " | ||||
|   wontfix". [This isn't personal](https://docs.firefly-iii.org/firefly-iii/about-firefly-iii/what-its-not/). | ||||
|   wontfix". [This isn't personal](https://docs.firefly-iii.org/explanation/more-information/what-its-not/). | ||||
| - Issues can be closed if they're duplicates of other issues. | ||||
| - Issues can be closed if the answer is in the FAQ. | ||||
| - Issues will be closed automatically after 14 days. | ||||
|   | ||||
							
								
								
									
										30
									
								
								.github/workflows/cleanup.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								.github/workflows/cleanup.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| # This workflow prunes old workflow runs for an entire repository. | ||||
|  | ||||
| name: Prune old builds | ||||
| name: "Chore - Prune old builds" | ||||
|  | ||||
| on: | ||||
|   schedule: | ||||
| @@ -12,7 +12,7 @@ jobs: | ||||
|     timeout-minutes: 10 | ||||
|     steps: | ||||
|       - name: Prune cancelled/skipped runs | ||||
|         uses: actions/github-script@v6 | ||||
|         uses: actions/github-script@v7 | ||||
|         with: | ||||
|           github-token: ${{ secrets.GH_ACTIONS_PERSONAL_ACCESS_TOKEN }} | ||||
|           script: | | ||||
| @@ -22,14 +22,14 @@ jobs: | ||||
|               repo: context.repo.repo, | ||||
|               status: 'cancelled', | ||||
|             }); | ||||
|              | ||||
|  | ||||
|             const skipped = await github.rest.actions.listWorkflowRunsForRepo({ | ||||
|               owner: context.repo.owner, | ||||
|               per_page: 100, | ||||
|               repo: context.repo.repo, | ||||
|               status: 'skipped', | ||||
|             }); | ||||
|              | ||||
|  | ||||
|             for (const response of [cancelled, skipped]) { | ||||
|               for (const run of response.data.workflow_runs) { | ||||
|                 console.log(`Run id ${run.id} of '${run.name}' is a cancelled/skipped run. Deleting...`); | ||||
| @@ -42,7 +42,7 @@ jobs: | ||||
|             } | ||||
|  | ||||
|       - name: Prune runs older than 3 days | ||||
|         uses: actions/github-script@v6 | ||||
|         uses: actions/github-script@v7 | ||||
|         with: | ||||
|           github-token: ${{ secrets.GH_ACTIONS_PERSONAL_ACCESS_TOKEN }} | ||||
|           script: | | ||||
| @@ -50,23 +50,25 @@ jobs: | ||||
|             const ms_in_day = 86400000; | ||||
|             const now = Date.now(); | ||||
|             const pages = 5; | ||||
|              | ||||
|  | ||||
|             // we don't want to prune old runs from test.yml | ||||
|             // because we track the duration of runs over time | ||||
|              | ||||
|  | ||||
|             const workflows = [ | ||||
|               'cleanup.yml', | ||||
|               'close-duplicates.yml', | ||||
|               'closed-issues.yml', | ||||
|               'depsreview.yaml', | ||||
|               'laravel.yml', | ||||
|               'debug-info-actions.yml', | ||||
|               'depsreview.yml', | ||||
|               'label-actions.yml', | ||||
|               'lock.yml', | ||||
|               'qodana.yml', | ||||
|               'release.yml', | ||||
|               'sonarcloud.yml', | ||||
|               'stale.yml' | ||||
|             ] | ||||
|              | ||||
|  | ||||
|             let runs_to_delete = []; | ||||
|              | ||||
|  | ||||
|             for (const workflow of workflows) { | ||||
|               for (let page = 0; page < pages; page += 1) { | ||||
|                 let response = await github.rest.actions.listWorkflowRuns({ | ||||
| @@ -76,7 +78,7 @@ jobs: | ||||
|                   repo: context.repo.repo, | ||||
|                   workflow_id: workflow | ||||
|                 }); | ||||
|              | ||||
|  | ||||
|                 if (response.data.workflow_runs.length > 0) { | ||||
|                   for (const run of response.data.workflow_runs) { | ||||
|                     if (now - Date.parse(run.created_at) > ms_in_day * days_to_expiration) { | ||||
| @@ -86,7 +88,7 @@ jobs: | ||||
|                 } | ||||
|               } | ||||
|             } | ||||
|              | ||||
|  | ||||
|             for (const run of runs_to_delete) { | ||||
|               console.log(`Run id ${run[0]} of '${run[1]}' is older than ${days_to_expiration} days. Deleting...`); | ||||
|               try { | ||||
|   | ||||
							
								
								
									
										39
									
								
								.github/workflows/close-duplicates.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								.github/workflows/close-duplicates.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| name: "Issues - Command to close duplicate issues" | ||||
|  | ||||
| # the workflow to execute on is comments that are newly created | ||||
| on: | ||||
|   issue_comment: | ||||
|     types: [created] | ||||
|  | ||||
| permissions: | ||||
|   issues: write | ||||
|   checks: read | ||||
|  | ||||
| jobs: | ||||
|   close_duplicates: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: github/command@v1.1.0 | ||||
|         id: command | ||||
|         with: | ||||
|           allowed_contexts: "issue" | ||||
|           command: ".duplicate" | ||||
|       - name: reply | ||||
|         if: ${{ steps.command.outputs.continue == 'true' }} | ||||
|         run: | | ||||
|  | ||||
|           ISSUE_TITLE=$(gh issue view ${{ steps.command.outputs.params }} --json title --jq '.title') | ||||
|  | ||||
|           gh issue comment "$NUMBER" --body "Hi there! | ||||
|  | ||||
|           This is an automatic reply. \`Share and enjoy\`. | ||||
|  | ||||
|           Your issue is probably a duplicate of issue <span>#</span>${{ steps.command.outputs.params }}: [$ISSUE_TITLE](https://github.com/firefly-iii/firefly-iii/issues/${{ steps.command.outputs.params }}). Please refer to issue #${{ steps.command.outputs.params }} for support. | ||||
|  | ||||
|           You can close this issue now. If you believe this is not in fact a duplicate, please reply and let us know. Otherwise, this issue will be automatically closed in a few days time. | ||||
|  | ||||
|           Thank you for your contributions." | ||||
|         env: | ||||
|           GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||
|           GH_REPO: ${{ github.repository }} | ||||
|           NUMBER: ${{ github.event.issue.number }} | ||||
							
								
								
									
										21
									
								
								.github/workflows/closed-issues.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								.github/workflows/closed-issues.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,22 +1,25 @@ | ||||
| name: "Reply to closed issue" | ||||
| --- | ||||
| name: Issues - Reply to closed issue | ||||
| on: | ||||
|   issues: | ||||
|     types: | ||||
|       - closed | ||||
| jobs: | ||||
|   auto_comment: | ||||
|   command_and_close: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: aws-actions/closed-issue-message@v1 | ||||
|         with: | ||||
|           message: | | ||||
|             Hi there! This is an automatic reply. `Share and enjoy` | ||||
|              | ||||
|             This issue is now 🔒 closed. Please be aware that closed issues are **not** watched. | ||||
|              | ||||
|             - If the original bug is not actually fixed, please feel free to open [a new issue](https://github.com/firefly-iii/firefly-iii/issues/new/choose). Please refer to this issue for clarity. | ||||
|  | ||||
|             This issue is now 🔒 closed. Please be aware that closed issues are not monitored by the developer of Firefly III. | ||||
|  | ||||
|             - If the original bug is not actually fixed, please open [a new issue](https://github.com/firefly-iii/firefly-iii/issues/new/choose). Refer to this issue for clarity. | ||||
|             - Follow-up questions must be posted in a new [discussion](https://github.com/firefly-iii/firefly-iii/discussions/) | ||||
|             - Further replies to this issue will get **no response**. | ||||
|              | ||||
|             - Further replies to this issue may get no response. | ||||
|  | ||||
|             If there is more to discuss, please open [a new issue](https://github.com/firefly-iii/firefly-iii/issues/new/choose) or [discussion](https://github.com/firefly-iii/firefly-iii/discussions/). | ||||
|  | ||||
|             Thank you for your contributions. | ||||
|           repo-token: "${{ secrets.GITHUB_TOKEN }}" | ||||
|           repo-token: ${{ secrets.GITHUB_TOKEN }} | ||||
|   | ||||
							
								
								
									
										32
									
								
								.github/workflows/debug-info-actions.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								.github/workflows/debug-info-actions.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| name: 'Issues - Respond to hidden commands' | ||||
|  | ||||
| # the workflow to execute on is comments that are newly created | ||||
| on: | ||||
|   issues: | ||||
|     types: [opened, edited] | ||||
|   issue_comment: | ||||
|     types: [created] | ||||
|  | ||||
| # permissions needed for reacting to IssueOps commands on issues and PRs | ||||
| permissions: | ||||
|   contents: read | ||||
|   pull-requests: write | ||||
|   issues: write | ||||
|   checks: read | ||||
|  | ||||
| jobs: | ||||
|   respond: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - run: | | ||||
|           ISSUE_BODY=$(gh issue view $NUMBER --json body) | ||||
|           if [[ $ISSUE_BODY == *".eOxNZAmyGz6CXMyf"* ]]; then | ||||
|             gh issue comment "$NUMBER" --body "$V2_ISSUE_REPLY_BODY" | ||||
|             gh issue close "$NUMBER" --reason completed | ||||
|           fi | ||||
|         env: | ||||
|           GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||
|           GH_REPO: ${{ github.repository }} | ||||
|           NUMBER: ${{ github.event.issue.number }} | ||||
|           V2_ISSUE_REPLY_BODY: ${{ secrets.V2_ISSUE_REPLY_BODY }} | ||||
|           LABELS: v2-layout-issue | ||||
							
								
								
									
										14
									
								
								.github/workflows/depsreview.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								.github/workflows/depsreview.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -1,14 +0,0 @@ | ||||
| name: 'Dependency Review' | ||||
| on: [ pull_request ] | ||||
|  | ||||
| permissions: | ||||
|   contents: read | ||||
|  | ||||
| jobs: | ||||
|   dependency-review: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: 'Checkout Repository' | ||||
|         uses: actions/checkout@v3 | ||||
|       - name: 'Dependency Review' | ||||
|         uses: actions/dependency-review-action@v3 | ||||
							
								
								
									
										16
									
								
								.github/workflows/depsreview.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								.github/workflows/depsreview.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| name: 'Code - Dependency review' | ||||
| on: [ pull_request ] | ||||
|  | ||||
| permissions: | ||||
|   contents: read | ||||
|  | ||||
| jobs: | ||||
|   dependency-review: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: 'Checkout repository' | ||||
|         uses: actions/checkout@v4 | ||||
|         with: | ||||
|           fetch-depth: 0 | ||||
|       - name: 'Dependency review' | ||||
|         uses: actions/dependency-review-action@v4 | ||||
							
								
								
									
										21
									
								
								.github/workflows/label-actions.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								.github/workflows/label-actions.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| name: 'Issues - Reply to specific labels' | ||||
|  | ||||
| on: | ||||
|   issues: | ||||
|     types: [labeled, unlabeled] | ||||
|   pull_request_target: | ||||
|     types: [labeled, unlabeled] | ||||
|   discussion: | ||||
|     types: [labeled, unlabeled] | ||||
|  | ||||
| permissions: | ||||
|   contents: read | ||||
|   issues: write | ||||
|   pull-requests: write | ||||
|   discussions: write | ||||
|  | ||||
| jobs: | ||||
|   action: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: dessant/label-actions@v4 | ||||
							
								
								
									
										146
									
								
								.github/workflows/laravel.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										146
									
								
								.github/workflows/laravel.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,146 +0,0 @@ | ||||
| name: Firefly III | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches-ignore: | ||||
|       - '**' | ||||
|  | ||||
| jobs: | ||||
|   prepare: | ||||
|  | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     steps: | ||||
|       - uses: actions/checkout@v3 | ||||
|       - name: Copy .env | ||||
|         run: test -f .env || cp .ci/.env.ci .env | ||||
|       - name: Prepare dependencies | ||||
|         run: | | ||||
|           set -euxo pipefail | ||||
|           export PATH=$PATH:$HOME/.composer/vendor/bin/ | ||||
|           composer global require hirak/prestissimo --no-plugins --no-scripts | ||||
|           composer install --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist --no-suggest | ||||
|  | ||||
|           touch ./storage/database/database.sqlite | ||||
|       - name: Prepare Firefly III | ||||
|         run: | | ||||
|           chmod -R 777 storage bootstrap/cache | ||||
|           php artisan migrate --seed | ||||
|           php artisan firefly-iii:upgrade-database | ||||
|       - name: Upload database | ||||
|         uses: actions/upload-artifact@v2 | ||||
|         with: | ||||
|           name: database | ||||
|           path: storage/database/database.sqlite | ||||
|       - name: Upload cache | ||||
|         uses: actions/upload-artifact@v2 | ||||
|         with: | ||||
|           name: cache | ||||
|           path: bootstrap/cache/ | ||||
|       - name: Upload composer cache | ||||
|         uses: actions/upload-artifact@v2 | ||||
|         with: | ||||
|           name: composer | ||||
|           path: ~/.composer | ||||
|  | ||||
|   laravel-tests: | ||||
|  | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     needs: | ||||
|       - prepare | ||||
|  | ||||
|     steps: | ||||
|       - uses: actions/checkout@v3 | ||||
|       - name: Copy .env | ||||
|         run: test -f .env || cp .ci/.env.ci .env | ||||
|       - name: Download database | ||||
|         uses: actions/download-artifact@v2 | ||||
|         with: | ||||
|           name: database | ||||
|           path: storage/database/database.sqlite | ||||
|       - name: Download cache | ||||
|         uses: actions/download-artifact@v2 | ||||
|         with: | ||||
|           name: cache | ||||
|           path: bootstrap/cache/ | ||||
|       - name: Download vendor | ||||
|         uses: actions/download-artifact@v2 | ||||
|         with: | ||||
|           name: composer | ||||
|           path: ~/.composer | ||||
|       - name: Install composer | ||||
|         run: composer install --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist --no-suggest | ||||
|  | ||||
|       - name: PHPUnit tests | ||||
|         uses: php-actions/phpunit@v1 | ||||
|         with: | ||||
|           config: phpunit.xml | ||||
|           memory: 512M | ||||
|  | ||||
|   coding-standards: | ||||
|  | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     needs: | ||||
|       - prepare | ||||
|  | ||||
|     steps: | ||||
|       - uses: actions/checkout@v3 | ||||
|       - name: Copy .env | ||||
|         run: test -f .env || cp .ci/.env.ci .env | ||||
|       - name: Download database | ||||
|         uses: actions/download-artifact@v2 | ||||
|         with: | ||||
|           name: database | ||||
|           path: storage/database/database.sqlite | ||||
|       - name: Download cache | ||||
|         uses: actions/download-artifact@v2 | ||||
|         with: | ||||
|           name: cache | ||||
|           path: bootstrap/cache/ | ||||
|       - name: Download vendor | ||||
|         uses: actions/download-artifact@v2 | ||||
|         with: | ||||
|           name: composer | ||||
|           path: ~/.composer | ||||
|       - name: install depenencies | ||||
|         run: | | ||||
|           composer global require nette/coding-standard | ||||
|           composer install --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist --no-suggest | ||||
|  | ||||
|       - name: Execute code standard | ||||
|         run: /home/runner/.composer/vendor/bin/ecs check app tests --config ./.ci/firefly-iii-standard.yml | ||||
|  | ||||
|   phpstan: | ||||
|  | ||||
|     runs-on: ubuntu-latest | ||||
|  | ||||
|     needs: | ||||
|       - prepare | ||||
|  | ||||
|     steps: | ||||
|       - uses: actions/checkout@v3 | ||||
|       - name: Copy .env | ||||
|         run: test -f .env || cp .ci/.env.ci .env | ||||
|       - name: Download database | ||||
|         uses: actions/download-artifact@v2 | ||||
|         with: | ||||
|           name: database | ||||
|           path: storage/database/database.sqlite | ||||
|       - name: Download cache | ||||
|         uses: actions/download-artifact@v2 | ||||
|         with: | ||||
|           name: cache | ||||
|           path: bootstrap/cache/ | ||||
|       - name: Download vendor | ||||
|         uses: actions/download-artifact@v2 | ||||
|         with: | ||||
|           name: composer | ||||
|           path: ~/.composer | ||||
|       - name: Install depenencies | ||||
|         run: | | ||||
|           composer install --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist --no-suggest | ||||
|  | ||||
|       - name: Execute PHPStan | ||||
|         run: vendor/bin/phpstan analyse -c .ci/phpstan.neon | ||||
							
								
								
									
										6
									
								
								.github/workflows/lock.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/lock.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| name: Lock old issues | ||||
| name: 'Issues - Lock old issues' | ||||
|  | ||||
| on: | ||||
|   workflow_dispatch: | ||||
| @@ -15,5 +15,5 @@ jobs: | ||||
|       - uses: JC5/lock-threads@main | ||||
|         with: | ||||
|           github-token: ${{ github.token }} | ||||
|           issue-inactive-days: 90 | ||||
|           pr-inactive-days: 90 | ||||
|           issue-inactive-days: 7 | ||||
|           pr-inactive-days: 7 | ||||
|   | ||||
							
								
								
									
										35
									
								
								.github/workflows/qodana.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								.github/workflows/qodana.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,35 +0,0 @@ | ||||
| name: Qodana | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   push: | ||||
|     branches: | ||||
|       - main | ||||
|       - develop | ||||
| jobs: | ||||
|   qodana: | ||||
|     runs-on: ubuntu-latest | ||||
|     name: 'Qodana Scan' | ||||
|     steps: | ||||
|       - name: Setup PHP with no coverage driver | ||||
|         uses: shivammathur/setup-php@v2 | ||||
|         with: | ||||
|           php-version: '8.2' | ||||
|           coverage: none | ||||
|           extensions: bcmath, intl | ||||
|         env: | ||||
|           update: true | ||||
|       - uses: actions/checkout@v3 | ||||
|         with: | ||||
|           fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis | ||||
|       - name: Install dependencies | ||||
|         run: | | ||||
|           composer install --no-scripts | ||||
|           cp .env.example .env | ||||
|           php artisan key:generate | ||||
|           php artisan clear-compiled | ||||
|           php artisan ide-helper:generate; | ||||
|  | ||||
|       - name: 'Qodana Scan' | ||||
|         uses: JetBrains/qodana-action@main | ||||
|         env: | ||||
|           QODANA_TOKEN: ${{ secrets.QODANA_TOKEN }} | ||||
							
								
								
									
										163
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,163 @@ | ||||
| name: 'Code - Create new release' | ||||
|  | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|     inputs: | ||||
|       version: | ||||
|         description: 'Version to release' | ||||
|         required: true | ||||
|         default: 'develop' | ||||
|   schedule: | ||||
|     - cron:  '15 0 * * MON,THU' | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v4 | ||||
|         with: | ||||
|           fetch-depth: 0 | ||||
|       - name: Switch branch | ||||
|         run: | | ||||
|           if [[ "develop" == "$version" ]]; then | ||||
|             git checkout --track origin/develop | ||||
|             git pull | ||||
|           else | ||||
|             git config user.name github-actions | ||||
|             git config user.email 41898282+github-actions[bot]@users.noreply.github.com | ||||
|             git checkout --track origin/develop | ||||
|             git pull | ||||
|             git checkout main | ||||
|             git merge develop | ||||
|           fi | ||||
|         env: | ||||
|           version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }} | ||||
|       - name: Setup PHP | ||||
|         uses: shivammathur/setup-php@v2 | ||||
|         with: | ||||
|           php-version: '8.3' | ||||
|           extensions: mbstring, intl, zip, bcmath | ||||
|       - name: crowdin action | ||||
|         uses: crowdin/github-action@v1 | ||||
|         with: | ||||
|           upload_sources: true | ||||
|           download_translations: true | ||||
|           push_translations: false | ||||
|           push_sources: false | ||||
|         env: | ||||
|           GITHUB_TOKEN: ${{ github.token }} | ||||
|           CROWDIN_PROJECT_NR: ${{ secrets.CROWDIN_PROJECT_NR }} | ||||
|           CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }} | ||||
|       - name: Cleanup translations | ||||
|         id: cleanup-transactions | ||||
|         uses: JC5/firefly-iii-dev@v30 | ||||
|         with: | ||||
|           action: 'ff3:crowdin-warning' | ||||
|           output: '' | ||||
|         env: | ||||
|           FIREFLY_III_ROOT: /github/workspace | ||||
|           GH_TOKEN: '' | ||||
|       - name: Cleanup changelog | ||||
|         id: cleanup-changelog | ||||
|         uses: JC5/firefly-iii-dev@v30 | ||||
|         with: | ||||
|           action: 'ff3:changelog' | ||||
|           output: '' | ||||
|         env: | ||||
|           FIREFLY_III_ROOT: /github/workspace | ||||
|           GH_TOKEN: ${{ secrets.CHANGELOG_TOKEN }} | ||||
|       - name: Extract changelog | ||||
|         id: extract-changelog | ||||
|         uses: JC5/firefly-iii-dev@v30 | ||||
|         with: | ||||
|           action: 'ff3:extract-changelog' | ||||
|           output: 'output' | ||||
|         env: | ||||
|           FIREFLY_III_ROOT: /github/workspace | ||||
|           GH_TOKEN: "" | ||||
|       - name: Generate JSON v1 | ||||
|         id: json-v1 | ||||
|         uses: JC5/firefly-iii-dev@v30 | ||||
|         with: | ||||
|           action: 'ff3:json-translations v1' | ||||
|           output: '' | ||||
|         env: | ||||
|           FIREFLY_III_ROOT: /github/workspace | ||||
|           GH_TOKEN: '' | ||||
|       - name: Generate JSON v2 | ||||
|         id: json-v2 | ||||
|         uses: JC5/firefly-iii-dev@v30 | ||||
|         with: | ||||
|           action: 'ff3:json-translations v2' | ||||
|           output: '' | ||||
|         env: | ||||
|           FIREFLY_III_ROOT: /github/workspace | ||||
|           GH_TOKEN: '' | ||||
|       - name: Code cleanup | ||||
|         id: code-cleanup | ||||
|         uses: JC5/firefly-iii-dev@v30 | ||||
|         with: | ||||
|           action: 'ff3:code' | ||||
|           output: '' | ||||
|         env: | ||||
|           FIREFLY_III_ROOT: /github/workspace | ||||
|           GH_TOKEN: '' | ||||
|       - name: Build new JS | ||||
|         run: | | ||||
|           npm upgrade | ||||
|           npm run build | ||||
|       - name: Build old JS | ||||
|         id: old-js | ||||
|         uses: JC5/firefly-iii-dev@v30 | ||||
|         with: | ||||
|           action: 'ff3:old-js' | ||||
|           output: '' | ||||
|         env: | ||||
|           FIREFLY_III_ROOT: /github/workspace | ||||
|           GH_TOKEN: '' | ||||
|       - name: Run CI | ||||
|         run: | | ||||
|           rm -rf vendor composer.lock | ||||
|           composer validate --strict | ||||
|           composer update --no-dev --no-scripts --no-plugins -q | ||||
|           sudo chown -R runner:docker resources/lang | ||||
|           .ci/phpcs.sh | ||||
|       - name: Release | ||||
|         run: | | ||||
|           sudo timedatectl set-timezone Europe/Amsterdam | ||||
|           git config user.name github-actions | ||||
|           git config user.email 41898282+github-actions[bot]@users.noreply.github.com | ||||
|           git config advice.addIgnoredFile false | ||||
|  | ||||
|           if [[ "develop" == "$version" ]]; then | ||||
|             [[ -z $(git status --untracked-files=normal --porcelain) ]] && echo "this branch is clean, no need to push..." && exit 0; | ||||
|           fi | ||||
|  | ||||
|           git add -A | ||||
|           if test -f "output.txt"; then | ||||
|             git reset output.txt | ||||
|           fi | ||||
|           git commit -m "Auto commit for release '$version' on $(date +'%Y-%m-%d')" || true | ||||
|           git push | ||||
|  | ||||
|           if [[ "develop" == "$version" ]]; then | ||||
|             echo "Create nightly release." | ||||
|             git tag -a $version-$(date +'%Y%m%d') -m "Nightly development release '$version' on $(date +'%Y-%m-%d')" | ||||
|             git push origin $version-$(date +'%Y%m%d') | ||||
|             gh release create $version-$(date +'%Y%m%d') -p --verify-tag \ | ||||
|               -t "Development release for $(date +'%Y-%m-%d')" \ | ||||
|               -n "Bi-weekly development release of Firefly III with the latest fixes, translations and features. This release was created on **$(date +'%Y-%m-%d')** and may contain bugs. Use at your own risk. Docker users can find this release under the \`develop\` tag." | ||||
|           else | ||||
|             echo "Create default release." | ||||
|             git tag -a $version -m "Here be changelog" | ||||
|             git push origin $version | ||||
|             gh release create $version -F output.txt -t "$version" --verify-tag | ||||
|             rm output.txt | ||||
|             git checkout develop | ||||
|             git merge main | ||||
|             git push | ||||
|           fi | ||||
|         env: | ||||
|           GH_TOKEN: ${{ github.token }} | ||||
|           version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }} | ||||
							
								
								
									
										63
									
								
								.github/workflows/sonarcloud.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										63
									
								
								.github/workflows/sonarcloud.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,17 +1,74 @@ | ||||
| name: Sonarcloud | ||||
| name: 'Code - Run Sonarcloud' | ||||
| on: | ||||
|   pull_request: | ||||
|   workflow_dispatch: | ||||
|   push: | ||||
|     branches: | ||||
|       - main | ||||
|       - develop | ||||
| env: | ||||
|   DB_CONNECTION: sqlite | ||||
|   APP_KEY: UfpBqqeXx7zpNodsC6yjYQcRfDdm4Bxh | ||||
| jobs: | ||||
|   sonarcloud: | ||||
|     name: SonarCloud | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@v3 | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v4 | ||||
|       - name: Setup PHP with Xdebug | ||||
|         uses: shivammathur/setup-php@v2 | ||||
|         with: | ||||
|           fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis | ||||
|           php-version: '8.3' | ||||
|           coverage: xdebug | ||||
|           extensions: >- | ||||
|             bcmath | ||||
|             curl | ||||
|             fileinfo | ||||
|             iconv | ||||
|             intl | ||||
|             json | ||||
|             sqlite3 | ||||
|             mbstring | ||||
|             openssl | ||||
|             pdo | ||||
|             session | ||||
|             simplexml | ||||
|             sodium | ||||
|             tokenizer | ||||
|             xml | ||||
|             xmlwriter | ||||
|  | ||||
|       - name: Copy standard configuration | ||||
|         run: cp .env.testing .env | ||||
|  | ||||
|       - name: Install Composer dependencies | ||||
|         run: composer install --prefer-dist --no-interaction --no-progress --no-scripts | ||||
|  | ||||
|       - name: PHPStan | ||||
|         run: .ci/phpstan.sh | ||||
|  | ||||
|       - name: PHPMD | ||||
|         run: .ci/phpmd.sh | ||||
|  | ||||
|       - name: PHP CS Fixer | ||||
|         run: .ci/phpcs.sh | ||||
|  | ||||
|       - name: "Create database file" | ||||
|         run: touch storage/database/database.sqlite | ||||
|  | ||||
|       - name: "Upgrades the database to the latest version" | ||||
|         run: php artisan firefly-iii:upgrade-database | ||||
|  | ||||
|       - name: "Integrity Database Report" | ||||
|         run: php artisan firefly-iii:report-integrity | ||||
|  | ||||
|       - name: "Run tests with coverage" | ||||
|         run: composer coverage | ||||
|  | ||||
|       - name: Fix code coverage paths | ||||
|         run: sed -i 's@'$GITHUB_WORKSPACE'@/github/workspace/@g' coverage.xml | ||||
|  | ||||
|       - name: SonarCloud Scan | ||||
|         uses: SonarSource/sonarcloud-github-action@master | ||||
|         env: | ||||
|   | ||||
							
								
								
									
										20
									
								
								.github/workflows/stale.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								.github/workflows/stale.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| name: "Close stale issues" | ||||
| name: "Issues - Mark and close stale issues" | ||||
| on: | ||||
|   schedule: | ||||
|     - cron: "30 1 * * *" | ||||
| @@ -14,21 +14,25 @@ jobs: | ||||
|       pull-requests: write  # for actions/stale to close stale PRs | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/stale@v6 | ||||
|       - uses: actions/stale@v9 | ||||
|         with: | ||||
|           repo-token: ${{ secrets.GITHUB_TOKEN }} | ||||
|           stale-issue-message: > | ||||
|             Hi there! This is an automatic reply. `Share and enjoy` | ||||
|  | ||||
|             This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs.  | ||||
|             Hi there!  | ||||
|              | ||||
|             This is an automatic reply. `Share and enjoy` | ||||
|  | ||||
|             This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. | ||||
|  | ||||
|             Thank you for your contributions. | ||||
|           stale-pr-message: > | ||||
|             Hi there! This is an automatic reply. `Share and enjoy` | ||||
|             Hi there!  | ||||
|              | ||||
|             This is an automatic reply. `Share and enjoy` | ||||
|  | ||||
|             This PR has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs.  | ||||
|             This PR has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. | ||||
|  | ||||
|             Thank you for your contributions. | ||||
|           days-before-stale: 14 | ||||
|           days-before-close: 7 | ||||
|           exempt-issue-labels: 'enhancement,feature,bug,announcement,epic' | ||||
|           exempt-issue-labels: 'enhancement,feature,bug,announcement,epic,triage' | ||||
|   | ||||
							
								
								
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,10 +1,9 @@ | ||||
| /node_modules | ||||
| /frontend/node_modules | ||||
| /storage/*.key | ||||
| /vendor | ||||
| /.vagrant | ||||
| public/hot | ||||
| npm-debug.log | ||||
| yarn-error.log | ||||
| .env | ||||
| /.ci/php-cs-fixer/vendor | ||||
| /.ci/coverage | ||||
| coverage.xml | ||||
|   | ||||
| @@ -8,7 +8,5 @@ | ||||
| # To hide directory listing | ||||
| Options All -Indexes | ||||
|  | ||||
| # To prevent access to .env and other files | ||||
| <Files .*> | ||||
|     Deny from all | ||||
| </Files> | ||||
| # To prevent access any file | ||||
| Deny from all | ||||
|   | ||||
							
								
								
									
										65
									
								
								app.json
									
									
									
									
									
								
							
							
						
						
									
										65
									
								
								app.json
									
									
									
									
									
								
							| @@ -1,65 +0,0 @@ | ||||
| { | ||||
|   "name": "Firefly III", | ||||
|   "description": "A free and open source personal finances manager", | ||||
|   "repository": "https://github.com/firefly-iii/firefly-iii", | ||||
|   "website": "https://firefly-iii.org/", | ||||
|   "logo": "https://raw.githubusercontent.com/firefly-iii/firefly-iii/main/public/mstile-150x150.png", | ||||
|   "keywords": [ | ||||
|     "finance", | ||||
|     "finances", | ||||
|     "manager", | ||||
|     "management", | ||||
|     "euro", | ||||
|     "dollar", | ||||
|     "laravel", | ||||
|     "money", | ||||
|     "currency", | ||||
|     "financials", | ||||
|     "financial", | ||||
|     "budgets", | ||||
|     "administration", | ||||
|     "tool", | ||||
|     "tooling", | ||||
|     "help", | ||||
|     "helper", | ||||
|     "assistant", | ||||
|     "planning", | ||||
|     "organizing", | ||||
|     "bills", | ||||
|     "personal finance", | ||||
|     "budgets", | ||||
|     "budgeting", | ||||
|     "budgeting tool", | ||||
|     "budgeting application", | ||||
|     "transactions", | ||||
|     "self hosted", | ||||
|     "self-hosted", | ||||
|     "transfers", | ||||
|     "management" | ||||
|   ], | ||||
|   "addons": [ | ||||
|     { | ||||
|       "plan": "heroku-postgresql", | ||||
|       "options": { | ||||
|         "version": "12" | ||||
|       } | ||||
|     } | ||||
|   ], | ||||
|   "scripts": { | ||||
|     "postdeploy": "php artisan migrate:refresh --seed;php artisan firefly:instructions install" | ||||
|   }, | ||||
|   "buildpacks": [ | ||||
|     { | ||||
|       "url": "heroku/php" | ||||
|     }, | ||||
|     { | ||||
|       "url": "https://github.com/heroku/heroku-buildpack-locale" | ||||
|     } | ||||
|   ], | ||||
|   "env": { | ||||
|     "APP_KEY": { | ||||
|       "description": "This key is used to create app cookies en secure attachments.", | ||||
|       "value": "base64:If1gJN4pyycXTq+WS5TjneDympKuu+8SKvTl6RZnhJg=" | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -32,7 +32,6 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\AccountFilter; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use JsonException; | ||||
| 
 | ||||
| /** | ||||
|  * Class AccountController | ||||
| @@ -41,6 +40,7 @@ class AccountController extends Controller | ||||
| { | ||||
|     use AccountFilter; | ||||
| 
 | ||||
|     /** @var array<int, string> */ | ||||
|     private array                      $balanceTypes; | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
| @@ -60,29 +60,25 @@ class AccountController extends Controller | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|         $this->balanceTypes = [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE,]; | ||||
|         $this->balanceTypes = [AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE]; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Documentation for this endpoint: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getAccountsAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws JsonException | ||||
|      * @throws FireflyException | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function accounts(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data  = $request->getData(); | ||||
|         $types = $data['types']; | ||||
|         $query = $data['query']; | ||||
|         $date  = $data['date'] ?? today(config('app.timezone')); | ||||
|         $data            = $request->getData(); | ||||
|         $types           = $data['types']; | ||||
|         $query           = $data['query']; | ||||
|         $date            = $data['date'] ?? today(config('app.timezone')); | ||||
|         $return          = []; | ||||
|         $result          = $this->repository->searchAccount((string) $query, $types, $this->parameters->get('limit')); | ||||
| 
 | ||||
|         $return = []; | ||||
|         $result = $this->repository->searchAccount((string)$query, $types, $data['limit']); | ||||
|         // TODO this code is duplicated in the V2 Autocomplete controller, which means this code is due to be deprecated.
 | ||||
|         $defaultCurrency = app('amount')->getDefaultCurrency(); | ||||
| 
 | ||||
| @@ -100,12 +96,12 @@ class AccountController extends Controller | ||||
|                 ); | ||||
|             } | ||||
| 
 | ||||
|             $return[] = [ | ||||
|                 'id'                      => (string)$account->id, | ||||
|             $return[]        = [ | ||||
|                 'id'                      => (string) $account->id, | ||||
|                 'name'                    => $account->name, | ||||
|                 'name_with_balance'       => $nameWithBalance, | ||||
|                 'type'                    => $account->accountType->type, | ||||
|                 'currency_id'             => $currency->id, | ||||
|                 'currency_id'             => (string) $currency->id, | ||||
|                 'currency_name'           => $currency->name, | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
| @@ -116,10 +112,10 @@ class AccountController extends Controller | ||||
|         // custom order.
 | ||||
|         usort( | ||||
|             $return, | ||||
|             function ($a, $b) { | ||||
|             static function (array $left, array $right) { | ||||
|                 $order = [AccountType::ASSET, AccountType::REVENUE, AccountType::EXPENSE]; | ||||
|                 $posA  = array_search($a['type'], $order, true); | ||||
|                 $posB  = array_search($b['type'], $order, true); | ||||
|                 $posA  = (int) array_search($left['type'], $order, true); | ||||
|                 $posB  = (int) array_search($right['type'], $order, true); | ||||
| 
 | ||||
|                 return $posA - $posB; | ||||
|             } | ||||
|   | ||||
| @@ -58,20 +58,15 @@ class BillController extends Controller | ||||
|     /** | ||||
|      * Documentation for this endpoint is at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getBillsAC
 | ||||
|      * TODO expand API to add active field. | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function bills(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $result   = $this->repository->searchBill($data['query'], $data['limit']); | ||||
|         $result   = $this->repository->searchBill($data['query'], $this->parameters->get('limit')); | ||||
|         $filtered = $result->map( | ||||
|             static function (Bill $item) { | ||||
|                 return [ | ||||
|                     'id'     => (string)$item->id, | ||||
|                     'id'     => (string) $item->id, | ||||
|                     'name'   => $item->name, | ||||
|                     'active' => $item->active, | ||||
|                 ]; | ||||
|   | ||||
| @@ -58,19 +58,15 @@ class BudgetController extends Controller | ||||
|     /** | ||||
|      * Documentation for this endpoint is at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getBudgetsAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function budgets(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $result   = $this->repository->searchBudget($data['query'], $data['limit']); | ||||
|         $result   = $this->repository->searchBudget($data['query'], $this->parameters->get('limit')); | ||||
|         $filtered = $result->map( | ||||
|             static function (Budget $item) { | ||||
|                 return [ | ||||
|                     'id'   => (string)$item->id, | ||||
|                     'id'   => (string) $item->id, | ||||
|                     'name' => $item->name, | ||||
|                 ]; | ||||
|             } | ||||
|   | ||||
| @@ -58,19 +58,15 @@ class CategoryController extends Controller | ||||
|     /** | ||||
|      * Documentation for this endpoint is at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCategoriesAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function categories(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $result   = $this->repository->searchCategory($data['query'], $data['limit']); | ||||
|         $result   = $this->repository->searchCategory($data['query'], $this->parameters->get('limit')); | ||||
|         $filtered = $result->map( | ||||
|             static function (Category $item) { | ||||
|                 return [ | ||||
|                     'id'   => (string)$item->id, | ||||
|                     'id'   => (string) $item->id, | ||||
|                     'name' => $item->name, | ||||
|                 ]; | ||||
|             } | ||||
|   | ||||
| @@ -26,7 +26,7 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete; | ||||
| use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Repositories\UserGroups\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| @@ -58,21 +58,17 @@ class CurrencyController extends Controller | ||||
|     /** | ||||
|      * Documentation for this endpoint is at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function currencies(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data       = $request->getData(); | ||||
|         $collection = $this->repository->searchCurrency($data['query'], $data['limit']); | ||||
|         $collection = $this->repository->searchCurrency($data['query'], $this->parameters->get('limit')); | ||||
|         $result     = []; | ||||
| 
 | ||||
|         /** @var TransactionCurrency $currency */ | ||||
|         foreach ($collection as $currency) { | ||||
|             $result[] = [ | ||||
|                 'id'             => (string)$currency->id, | ||||
|                 'id'             => (string) $currency->id, | ||||
|                 'name'           => $currency->name, | ||||
|                 'code'           => $currency->code, | ||||
|                 'symbol'         => $currency->symbol, | ||||
| @@ -87,21 +83,18 @@ class CurrencyController extends Controller | ||||
|      * Documentation for this endpoint is at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getCurrenciesCodeAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @deprecated | ||||
|      */ | ||||
|     public function currenciesWithCode(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data       = $request->getData(); | ||||
|         $collection = $this->repository->searchCurrency($data['query'], $data['limit']); | ||||
|         $collection = $this->repository->searchCurrency($data['query'], $this->parameters->get('limit')); | ||||
|         $result     = []; | ||||
| 
 | ||||
|         /** @var TransactionCurrency $currency */ | ||||
|         foreach ($collection as $currency) { | ||||
|             $result[] = [ | ||||
|                 'id'             => (string)$currency->id, | ||||
|                 'id'             => (string) $currency->id, | ||||
|                 'name'           => sprintf('%s (%s)', $currency->name, $currency->code), | ||||
|                 'code'           => $currency->code, | ||||
|                 'symbol'         => $currency->symbol, | ||||
|   | ||||
| @@ -58,21 +58,17 @@ class ObjectGroupController extends Controller | ||||
|     /** | ||||
|      * Documentation for this endpoint is at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getObjectGroupsAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function objectGroups(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data   = $request->getData(); | ||||
|         $return = []; | ||||
|         $result = $this->repository->search($data['query'], $data['limit']); | ||||
|         $result = $this->repository->search($data['query'], $this->parameters->get('limit')); | ||||
| 
 | ||||
|         /** @var ObjectGroup $objectGroup */ | ||||
|         foreach ($result as $objectGroup) { | ||||
|             $return[] = [ | ||||
|                 'id'    => (string)$objectGroup->id, | ||||
|                 'id'    => (string) $objectGroup->id, | ||||
|                 'name'  => $objectGroup->title, | ||||
|                 'title' => $objectGroup->title, | ||||
|             ]; | ||||
|   | ||||
| @@ -62,15 +62,11 @@ class PiggyBankController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getPiggiesAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function piggyBanks(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data            = $request->getData(); | ||||
|         $piggies         = $this->piggyRepository->searchPiggyBank($data['query'], $data['limit']); | ||||
|         $piggies         = $this->piggyRepository->searchPiggyBank($data['query'], $this->parameters->get('limit')); | ||||
|         $defaultCurrency = app('amount')->getDefaultCurrency(); | ||||
|         $response        = []; | ||||
| 
 | ||||
| @@ -79,14 +75,14 @@ class PiggyBankController extends Controller | ||||
|             $currency    = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency; | ||||
|             $objectGroup = $piggy->objectGroups()->first(); | ||||
|             $response[]  = [ | ||||
|                 'id'                      => (string)$piggy->id, | ||||
|                 'id'                      => (string) $piggy->id, | ||||
|                 'name'                    => $piggy->name, | ||||
|                 'currency_id'             => (string)$currency->id, | ||||
|                 'currency_id'             => (string) $currency->id, | ||||
|                 'currency_name'           => $currency->name, | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'object_group_id'         => null === $objectGroup ? null : (string)$objectGroup->id, | ||||
|                 'object_group_id'         => null === $objectGroup ? null : (string) $objectGroup->id, | ||||
|                 'object_group_title'      => $objectGroup?->title, | ||||
|             ]; | ||||
|         } | ||||
| @@ -97,24 +93,21 @@ class PiggyBankController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getPiggiesBalanceAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function piggyBanksWithBalance(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data            = $request->getData(); | ||||
|         $piggies         = $this->piggyRepository->searchPiggyBank($data['query'], $data['limit']); | ||||
|         $piggies         = $this->piggyRepository->searchPiggyBank($data['query'], $this->parameters->get('limit')); | ||||
|         $defaultCurrency = app('amount')->getDefaultCurrency(); | ||||
|         $response        = []; | ||||
| 
 | ||||
|         /** @var PiggyBank $piggy */ | ||||
|         foreach ($piggies as $piggy) { | ||||
|             $currency      = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency; | ||||
|             $currentAmount = $this->piggyRepository->getRepetition($piggy)->currentamount ?? '0'; | ||||
|             $objectGroup   = $piggy->objectGroups()->first(); | ||||
|             $response[]    = [ | ||||
|                 'id'                      => (string)$piggy->id, | ||||
|                 'id'                      => (string) $piggy->id, | ||||
|                 'name'                    => $piggy->name, | ||||
|                 'name_with_balance'       => sprintf( | ||||
|                     '%s (%s / %s)', | ||||
| @@ -122,12 +115,12 @@ class PiggyBankController extends Controller | ||||
|                     app('amount')->formatAnything($currency, $currentAmount, false), | ||||
|                     app('amount')->formatAnything($currency, $piggy->targetamount, false), | ||||
|                 ), | ||||
|                 'currency_id'             => (string)$currency->id, | ||||
|                 'currency_id'             => (string) $currency->id, | ||||
|                 'currency_name'           => $currency->name, | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
|                 'object_group_id'         => null === $objectGroup ? null : (string)$objectGroup->id, | ||||
|                 'object_group_id'         => null === $objectGroup ? null : (string) $objectGroup->id, | ||||
|                 'object_group_title'      => $objectGroup?->title, | ||||
|             ]; | ||||
|         } | ||||
|   | ||||
| @@ -56,21 +56,17 @@ class RecurrenceController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getRecurringAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function recurring(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data        = $request->getData(); | ||||
|         $recurrences = $this->repository->searchRecurrence($data['query'], $data['limit']); | ||||
|         $recurrences = $this->repository->searchRecurrence($data['query'], $this->parameters->get('limit')); | ||||
|         $response    = []; | ||||
| 
 | ||||
|         /** @var Recurrence $recurrence */ | ||||
|         foreach ($recurrences as $recurrence) { | ||||
|             $response[] = [ | ||||
|                 'id'          => (string)$recurrence->id, | ||||
|                 'id'          => (string) $recurrence->id, | ||||
|                 'name'        => $recurrence->title, | ||||
|                 'description' => $recurrence->description, | ||||
|             ]; | ||||
|   | ||||
| @@ -55,21 +55,17 @@ class RuleController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getRulesAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function rules(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $rules    = $this->repository->searchRule($data['query'], $data['limit']); | ||||
|         $rules    = $this->repository->searchRule($data['query'], $this->parameters->get('limit')); | ||||
|         $response = []; | ||||
| 
 | ||||
|         /** @var Rule $rule */ | ||||
|         foreach ($rules as $rule) { | ||||
|             $response[] = [ | ||||
|                 'id'          => (string)$rule->id, | ||||
|                 'id'          => (string) $rule->id, | ||||
|                 'name'        => $rule->title, | ||||
|                 'description' => $rule->description, | ||||
|             ]; | ||||
|   | ||||
| @@ -55,21 +55,17 @@ class RuleGroupController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getRuleGroupsAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function ruleGroups(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data     = $request->getData(); | ||||
|         $groups   = $this->repository->searchRuleGroup($data['query'], $data['limit']); | ||||
|         $groups   = $this->repository->searchRuleGroup($data['query'], $this->parameters->get('limit')); | ||||
|         $response = []; | ||||
| 
 | ||||
|         /** @var RuleGroup $group */ | ||||
|         foreach ($groups as $group) { | ||||
|             $response[] = [ | ||||
|                 'id'          => (string)$group->id, | ||||
|                 'id'          => (string) $group->id, | ||||
|                 'name'        => $group->title, | ||||
|                 'description' => $group->description, | ||||
|             ]; | ||||
|   | ||||
| @@ -58,21 +58,17 @@ class TagController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTagAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function tags(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data = $request->getData(); | ||||
| 
 | ||||
|         $result = $this->repository->searchTags($data['query'], $data['limit']); | ||||
|         $data   = $request->getData(); | ||||
|         $result = $this->repository->searchTags($data['query'], $this->parameters->get('limit')); | ||||
|         $array  = []; | ||||
| 
 | ||||
|         /** @var Tag $tag */ | ||||
|         foreach ($result as $tag) { | ||||
|             $array[] = [ | ||||
|                 'id'   => (string)$tag->id, | ||||
|                 'id'   => (string) $tag->id, | ||||
|                 'name' => $tag->tag, | ||||
|                 'tag'  => $tag->tag, | ||||
|             ]; | ||||
|   | ||||
| @@ -63,15 +63,11 @@ class TransactionController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTransactionsAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function transactions(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data   = $request->getData(); | ||||
|         $result = $this->repository->searchJournalDescriptions($data['query'], $data['limit']); | ||||
|         $data     = $request->getData(); | ||||
|         $result   = $this->repository->searchJournalDescriptions($data['query'], $this->parameters->get('limit')); | ||||
| 
 | ||||
|         // limit and unique
 | ||||
|         $filtered = $result->unique('description'); | ||||
| @@ -80,8 +76,8 @@ class TransactionController extends Controller | ||||
|         /** @var TransactionJournal $journal */ | ||||
|         foreach ($filtered as $journal) { | ||||
|             $array[] = [ | ||||
|                 'id'                   => (string)$journal->id, | ||||
|                 'transaction_group_id' => (string)$journal->transaction_group_id, | ||||
|                 'id'                   => (string) $journal->id, | ||||
|                 'transaction_group_id' => (string) $journal->transaction_group_id, | ||||
|                 'name'                 => $journal->description, | ||||
|                 'description'          => $journal->description, | ||||
|             ]; | ||||
| @@ -93,10 +89,6 @@ class TransactionController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTransactionsIDAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function transactionsWithID(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
| @@ -104,7 +96,7 @@ class TransactionController extends Controller | ||||
|         $result = new Collection(); | ||||
|         if (is_numeric($data['query'])) { | ||||
|             // search for group, not journal.
 | ||||
|             $firstResult = $this->groupRepository->find((int)$data['query']); | ||||
|             $firstResult = $this->groupRepository->find((int) $data['query']); | ||||
|             if (null !== $firstResult) { | ||||
|                 // group may contain multiple journals, each a result:
 | ||||
|                 foreach ($firstResult->transactionJournals as $journal) { | ||||
| @@ -113,17 +105,17 @@ class TransactionController extends Controller | ||||
|             } | ||||
|         } | ||||
|         if (!is_numeric($data['query'])) { | ||||
|             $result = $this->repository->searchJournalDescriptions($data['query'], $data['limit']); | ||||
|             $result = $this->repository->searchJournalDescriptions($data['query'], $this->parameters->get('limit')); | ||||
|         } | ||||
| 
 | ||||
|         // limit and unique
 | ||||
|         $array = []; | ||||
|         $array  = []; | ||||
| 
 | ||||
|         /** @var TransactionJournal $journal */ | ||||
|         foreach ($result as $journal) { | ||||
|             $array[] = [ | ||||
|                 'id'                   => (string)$journal->id, | ||||
|                 'transaction_group_id' => (string)$journal->transaction_group_id, | ||||
|                 'id'                   => (string) $journal->id, | ||||
|                 'transaction_group_id' => (string) $journal->transaction_group_id, | ||||
|                 'name'                 => sprintf('#%d: %s', $journal->transaction_group_id, $journal->description), | ||||
|                 'description'          => sprintf('#%d: %s', $journal->transaction_group_id, $journal->description), | ||||
|             ]; | ||||
|   | ||||
| @@ -54,22 +54,18 @@ class TransactionTypeController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at | ||||
|      * * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/autocomplete/getTransactionTypesAC
 | ||||
|      * | ||||
|      * @param AutocompleteRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function transactionTypes(AutocompleteRequest $request): JsonResponse | ||||
|     { | ||||
|         $data  = $request->getData(); | ||||
|         $types = $this->repository->searchTypes($data['query'], $data['limit']); | ||||
|         $types = $this->repository->searchTypes($data['query'], $this->parameters->get('limit')); | ||||
|         $array = []; | ||||
| 
 | ||||
|         /** @var TransactionType $type */ | ||||
|         foreach ($types as $type) { | ||||
|             // different key for consistency.
 | ||||
|             $array[] = [ | ||||
|                 'id'   => (string)$type->id, | ||||
|                 'id'   => (string) $type->id, | ||||
|                 'name' => $type->type, | ||||
|                 'type' => $type->type, | ||||
|             ]; | ||||
|   | ||||
| @@ -30,14 +30,11 @@ use FireflyIII\Api\V1\Requests\Data\DateRequest; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\AccountType; | ||||
| use FireflyIII\Models\Preference; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ApiSupport; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use JsonException; | ||||
| use Psr\Container\ContainerExceptionInterface; | ||||
| use Psr\Container\NotFoundExceptionInterface; | ||||
| 
 | ||||
| /** | ||||
|  * Class AccountController | ||||
| @@ -46,13 +43,10 @@ class AccountController extends Controller | ||||
| { | ||||
|     use ApiSupport; | ||||
| 
 | ||||
|     private CurrencyRepositoryInterface $currencyRepository; | ||||
|     private AccountRepositoryInterface  $repository; | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -64,9 +58,6 @@ class AccountController extends Controller | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
| 
 | ||||
|                 $this->currencyRepository = app(CurrencyRepositoryInterface::class); | ||||
|                 $this->currencyRepository->setUser($user); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
| @@ -76,25 +67,23 @@ class AccountController extends Controller | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/charts/getChartAccountOverview
 | ||||
|      * | ||||
|      * @param DateRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      * @throws JsonException | ||||
|      * @throws ContainerExceptionInterface | ||||
|      * @throws NotFoundExceptionInterface | ||||
|      */ | ||||
|     public function overview(DateRequest $request): JsonResponse | ||||
|     { | ||||
|         // parameters for chart:
 | ||||
|         $dates = $request->getAll(); | ||||
|         $dates      = $request->getAll(); | ||||
| 
 | ||||
|         /** @var Carbon $start */ | ||||
|         $start = $dates['start']; | ||||
|         $start      = $dates['start']; | ||||
| 
 | ||||
|         /** @var Carbon $end */ | ||||
|         $end = $dates['end']; | ||||
|         $end        = $dates['end']; | ||||
| 
 | ||||
|         // user's preferences
 | ||||
|         $defaultSet = $this->repository->getAccountsByType([AccountType::ASSET])->pluck('id')->toArray(); | ||||
| 
 | ||||
|         /** @var Preference $frontPage */ | ||||
|         $frontPage  = app('preferences')->get('frontPageAccounts', $defaultSet); | ||||
|         $default    = app('amount')->getDefaultCurrency(); | ||||
| 
 | ||||
| @@ -103,19 +92,19 @@ class AccountController extends Controller | ||||
|             $frontPage->save(); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         // get accounts:
 | ||||
|         $accounts  = $this->repository->getAccountsById($frontPage->data); | ||||
|         $chartData = []; | ||||
|         $accounts   = $this->repository->getAccountsById($frontPage->data); | ||||
|         $chartData  = []; | ||||
| 
 | ||||
|         /** @var Account $account */ | ||||
|         foreach ($accounts as $account) { | ||||
|             $currency = $this->repository->getAccountCurrency($account); | ||||
|             $currency     = $this->repository->getAccountCurrency($account); | ||||
|             if (null === $currency) { | ||||
|                 $currency = $default; | ||||
|             } | ||||
|             $currentSet = [ | ||||
|             $currentSet   = [ | ||||
|                 'label'                   => $account->name, | ||||
|                 'currency_id'             => (string)$currency->id, | ||||
|                 'currency_id'             => (string) $currency->id, | ||||
|                 'currency_code'           => $currency->code, | ||||
|                 'currency_symbol'         => $currency->symbol, | ||||
|                 'currency_decimal_places' => $currency->decimal_places, | ||||
| @@ -129,16 +118,16 @@ class AccountController extends Controller | ||||
|             $currentStart = clone $start; | ||||
|             $range        = app('steam')->balanceInRange($account, $start, clone $end); | ||||
|             // 2022-10-11 this method no longer converts to float.
 | ||||
|             $previous = array_values($range)[0]; | ||||
|             $previous     = array_values($range)[0]; | ||||
|             while ($currentStart <= $end) { | ||||
|                 $format   = $currentStart->format('Y-m-d'); | ||||
|                 $label    = $currentStart->toAtomString(); | ||||
|                 $balance  = array_key_exists($format, $range) ? $range[$format] : $previous; | ||||
|                 $previous = $balance; | ||||
|                 $format                        = $currentStart->format('Y-m-d'); | ||||
|                 $label                         = $currentStart->toAtomString(); | ||||
|                 $balance                       = array_key_exists($format, $range) ? $range[$format] : $previous; | ||||
|                 $previous                      = $balance; | ||||
|                 $currentStart->addDay(); | ||||
|                 $currentSet['entries'][$label] = $balance; | ||||
|             } | ||||
|             $chartData[] = $currentSet; | ||||
|             $chartData[]  = $currentSet; | ||||
|         } | ||||
| 
 | ||||
|         return response()->json($chartData); | ||||
|   | ||||
| @@ -27,22 +27,22 @@ namespace FireflyIII\Api\V1\Controllers; | ||||
| use Carbon\Carbon; | ||||
| use Carbon\Exceptions\InvalidDateException; | ||||
| use Carbon\Exceptions\InvalidFormatException; | ||||
| use FireflyIII\Models\Preference; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Foundation\Auth\Access\AuthorizesRequests; | ||||
| use Illuminate\Foundation\Bus\DispatchesJobs; | ||||
| use Illuminate\Foundation\Validation\ValidatesRequests; | ||||
| use Illuminate\Routing\Controller as BaseController; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use League\Fractal\Manager; | ||||
| use League\Fractal\Serializer\JsonApiSerializer; | ||||
| use Psr\Container\ContainerExceptionInterface; | ||||
| use Psr\Container\NotFoundExceptionInterface; | ||||
| use Symfony\Component\HttpFoundation\Exception\BadRequestException; | ||||
| use Symfony\Component\HttpFoundation\ParameterBag; | ||||
| 
 | ||||
| /** | ||||
|  * Class Controller. | ||||
|  * | ||||
| 
 | ||||
|  * @SuppressWarnings(PHPMD.CouplingBetweenObjects) | ||||
|  * @SuppressWarnings(PHPMD.NumberOfChildren) | ||||
|  */ | ||||
| abstract class Controller extends BaseController | ||||
| { | ||||
| @@ -50,7 +50,9 @@ abstract class Controller extends BaseController | ||||
|     use DispatchesJobs; | ||||
|     use ValidatesRequests; | ||||
| 
 | ||||
|     protected const CONTENT_TYPE = 'application/vnd.api+json'; | ||||
|     protected const string CONTENT_TYPE = 'application/vnd.api+json'; | ||||
| 
 | ||||
|     /** @var array<int, string> */ | ||||
|     protected array        $allowedSort; | ||||
|     protected ParameterBag $parameters; | ||||
| 
 | ||||
| @@ -61,9 +63,9 @@ abstract class Controller extends BaseController | ||||
|     { | ||||
|         // get global parameters
 | ||||
|         $this->allowedSort = config('firefly.allowed_sort_parameters'); | ||||
|         $this->parameters  = $this->getParameters(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $this->parameters = $this->getParameters(); | ||||
|                 if (auth()->check()) { | ||||
|                     $language = app('steam')->getLanguage(); | ||||
|                     app()->setLocale($language); | ||||
| @@ -74,46 +76,76 @@ abstract class Controller extends BaseController | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Method to help build URL's. | ||||
|      */ | ||||
|     final protected function buildParams(): string | ||||
|     { | ||||
|         $return = '?'; | ||||
|         $params = []; | ||||
|         foreach ($this->parameters as $key => $value) { | ||||
|             if ('page' === $key) { | ||||
|                 continue; | ||||
|             } | ||||
|             if ($value instanceof Carbon) { | ||||
|                 $params[$key] = $value->format('Y-m-d'); | ||||
| 
 | ||||
|                 continue; | ||||
|             } | ||||
|             $params[$key] = $value; | ||||
|         } | ||||
| 
 | ||||
|         return $return.http_build_query($params); | ||||
|     } | ||||
| 
 | ||||
|     final protected function getManager(): Manager | ||||
|     { | ||||
|         // create some objects:
 | ||||
|         $manager = new Manager(); | ||||
|         $baseUrl = request()->getSchemeAndHttpHost().'/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
| 
 | ||||
|         return $manager; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Method to grab all parameters from the URL. | ||||
|      * | ||||
|      * @return ParameterBag | ||||
|      * @throws ContainerExceptionInterface | ||||
|      * @throws NotFoundExceptionInterface | ||||
|      */ | ||||
|     private function getParameters(): ParameterBag | ||||
|     { | ||||
|         $bag  = new ParameterBag(); | ||||
|         $page = (int)request()->get('page'); | ||||
|         $bag      = new ParameterBag(); | ||||
|         $page     = (int)request()->get('page'); | ||||
|         if ($page < 1) { | ||||
|             $page = 1; | ||||
|         } | ||||
|         if ($page > pow(2, 16)) { | ||||
|             $page = pow(2, 16); | ||||
|         if ($page > 2 ** 16) { | ||||
|             $page = 2 ** 16; | ||||
|         } | ||||
|         $bag->set('page', $page); | ||||
| 
 | ||||
|         // some date fields:
 | ||||
|         $dates = ['start', 'end', 'date']; | ||||
|         $dates    = ['start', 'end', 'date']; | ||||
|         foreach ($dates as $field) { | ||||
|             $date = null; | ||||
| 
 | ||||
|             try { | ||||
|                 $date = request()->query->get($field); | ||||
|             } catch (BadRequestException $e) { | ||||
|                 Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $field)); | ||||
|                 Log::error($e->getMessage()); | ||||
|                 app('log')->error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $field)); | ||||
|                 app('log')->error($e->getMessage()); | ||||
|                 app('log')->error($e->getTraceAsString()); | ||||
|                 $value = null; | ||||
|             } | ||||
|             $obj = null; | ||||
|             $obj  = null; | ||||
|             if (null !== $date) { | ||||
|                 try { | ||||
|                     $obj = Carbon::parse($date); | ||||
|                 } catch (InvalidDateException | InvalidFormatException $e) { | ||||
|                     $obj = Carbon::parse((string)$date); | ||||
|                 } catch (InvalidDateException|InvalidFormatException $e) { | ||||
|                     // don't care
 | ||||
|                     app('log')->warning( | ||||
|                         sprintf( | ||||
|                             'Ignored invalid date "%s" in API controller parameter check: %s', | ||||
|                             substr($date, 0, 20), | ||||
|                             substr((string)$date, 0, 20), | ||||
|                             $e->getMessage() | ||||
|                         ) | ||||
|                     ); | ||||
| @@ -128,38 +160,47 @@ abstract class Controller extends BaseController | ||||
|             try { | ||||
|                 $value = request()->query->get($integer); | ||||
|             } catch (BadRequestException $e) { | ||||
|                 Log::error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $integer)); | ||||
|                 Log::error($e->getMessage()); | ||||
|                 app('log')->error(sprintf('Request field "%s" contains a non-scalar value. Value set to NULL.', $integer)); | ||||
|                 app('log')->error($e->getMessage()); | ||||
|                 app('log')->error($e->getTraceAsString()); | ||||
|                 $value = null; | ||||
|             } | ||||
|             if (null !== $value) { | ||||
|                 $bag->set($integer, (int)$value); | ||||
|             } | ||||
|             if (null === $value | ||||
|                 && 'limit' === $integer // @phpstan-ignore-line
 | ||||
|                 && auth()->check()) { | ||||
|                 // set default for user:
 | ||||
|                 /** @var User $user */ | ||||
|                 $user     = auth()->user(); | ||||
| 
 | ||||
|                 /** @var Preference $pageSize */ | ||||
|                 $pageSize = (int)app('preferences')->getForUser($user, 'listPageSize', 50)->data; | ||||
|                 $bag->set($integer, $pageSize); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // sort fields:
 | ||||
|         return $this->getSortParameters($bag); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @param ParameterBag $bag | ||||
|      * | ||||
|      * @return ParameterBag | ||||
|      */ | ||||
|     private function getSortParameters(ParameterBag $bag): ParameterBag | ||||
|     { | ||||
|         $sortParameters = []; | ||||
| 
 | ||||
|         try { | ||||
|             $param = (string)request()->query->get('sort'); | ||||
|         } catch (BadRequestException $e) { | ||||
|             Log::error('Request field "sort" contains a non-scalar value. Value set to NULL.'); | ||||
|             Log::error($e->getMessage()); | ||||
|             app('log')->error('Request field "sort" contains a non-scalar value. Value set to NULL.'); | ||||
|             app('log')->error($e->getMessage()); | ||||
|             app('log')->error($e->getTraceAsString()); | ||||
|             $param = ''; | ||||
|         } | ||||
|         if ('' === $param) { | ||||
|             return $bag; | ||||
|         } | ||||
|         $parts = explode(',', $param); | ||||
|         $parts          = explode(',', $param); | ||||
|         foreach ($parts as $part) { | ||||
|             $part      = trim($part); | ||||
|             $direction = 'asc'; | ||||
| @@ -175,40 +216,4 @@ abstract class Controller extends BaseController | ||||
| 
 | ||||
|         return $bag; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Method to help build URL's. | ||||
|      * | ||||
|      * @return string | ||||
|      */ | ||||
|     final protected function buildParams(): string | ||||
|     { | ||||
|         $return = '?'; | ||||
|         $params = []; | ||||
|         foreach ($this->parameters as $key => $value) { | ||||
|             if ('page' === $key) { | ||||
|                 continue; | ||||
|             } | ||||
|             if ($value instanceof Carbon) { | ||||
|                 $params[$key] = $value->format('Y-m-d'); | ||||
|                 continue; | ||||
|             } | ||||
|             $params[$key] = $value; | ||||
|         } | ||||
| 
 | ||||
|         return $return . http_build_query($params); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @return Manager | ||||
|      */ | ||||
|     final protected function getManager(): Manager | ||||
|     { | ||||
|         // create some objects:
 | ||||
|         $manager = new Manager(); | ||||
|         $baseUrl = request()->getSchemeAndHttpHost() . '/api/v1'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
| 
 | ||||
|         return $manager; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -44,9 +44,6 @@ class TransactionController extends Controller | ||||
| { | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
| @@ -63,10 +60,6 @@ class TransactionController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/bulkUpdateTransactions
 | ||||
|      * | ||||
|      * @param TransactionRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(TransactionRequest $request): JsonResponse | ||||
|     { | ||||
| @@ -76,12 +69,12 @@ class TransactionController extends Controller | ||||
|         // this deserves better code, but for now a loop of basic if-statements
 | ||||
|         // to respond to what is in the $query.
 | ||||
|         // this is OK because only one thing can be in the query at the moment.
 | ||||
|         if ($this->updatesTransactionAccount($params)) { | ||||
|             $original    = $this->repository->find((int)$params['where']['account_id']); | ||||
|             $destination = $this->repository->find((int)$params['update']['account_id']); | ||||
|         if ($this->isUpdateTransactionAccount($params)) { | ||||
|             $original    = $this->repository->find((int) $params['where']['account_id']); | ||||
|             $destination = $this->repository->find((int) $params['update']['account_id']); | ||||
| 
 | ||||
|             /** @var AccountDestroyService $service */ | ||||
|             $service = app(AccountDestroyService::class); | ||||
|             $service     = app(AccountDestroyService::class); | ||||
|             $service->moveTransactions($original, $destination); | ||||
|         } | ||||
| 
 | ||||
| @@ -89,11 +82,9 @@ class TransactionController extends Controller | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @param array $params | ||||
|      * | ||||
|      * @return bool | ||||
|      * @param array<string, array<string, string>> $params | ||||
|      */ | ||||
|     private function updatesTransactionAccount(array $params): bool | ||||
|     private function isUpdateTransactionAccount(array $params): bool | ||||
|     { | ||||
|         return array_key_exists('account_id', $params['where']) && array_key_exists('account_id', $params['update']); | ||||
|     } | ||||
|   | ||||
| @@ -58,160 +58,53 @@ class DestroyController extends Controller | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/destroyData
 | ||||
|      * | ||||
|      * @param DestroyRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function destroy(DestroyRequest $request): JsonResponse | ||||
|     { | ||||
|         $objects      = $request->getObjects(); | ||||
|         $this->unused = $request->boolean('unused', false); | ||||
|         switch ($objects) { | ||||
|             default: | ||||
|                 throw new FireflyException(sprintf('200033: This endpoint can\'t handle object "%s"', $objects)); | ||||
|             case 'budgets': | ||||
|                 $this->destroyBudgets(); | ||||
|                 break; | ||||
|             case 'bills': | ||||
|                 $this->destroyBills(); | ||||
|                 break; | ||||
|             case 'piggy_banks': | ||||
|                 $this->destroyPiggyBanks(); | ||||
|                 break; | ||||
|             case 'rules': | ||||
|                 $this->destroyRules(); | ||||
|                 break; | ||||
|             case 'recurring': | ||||
|                 $this->destroyRecurringTransactions(); | ||||
|                 break; | ||||
|             case 'categories': | ||||
|                 $this->destroyCategories(); | ||||
|                 break; | ||||
|             case 'tags': | ||||
|                 $this->destroyTags(); | ||||
|                 break; | ||||
|             case 'object_groups': | ||||
|                 $this->destroyObjectGroups(); | ||||
|                 break; | ||||
|             case 'not_assets_liabilities': | ||||
|                 $this->destroyAccounts( | ||||
|                     [ | ||||
|                         AccountType::BENEFICIARY, | ||||
|                         AccountType::CASH, | ||||
|                         AccountType::CREDITCARD, | ||||
|                         AccountType::DEFAULT, | ||||
|                         AccountType::EXPENSE, | ||||
|                         AccountType::IMPORT, | ||||
|                         AccountType::INITIAL_BALANCE, | ||||
|                         AccountType::LIABILITY_CREDIT, | ||||
|                         AccountType::RECONCILIATION, | ||||
|                         AccountType::REVENUE, | ||||
|                     ] | ||||
|                 ); | ||||
|                 break; | ||||
|             case 'accounts': | ||||
|                 $this->destroyAccounts( | ||||
|                     [ | ||||
|                         AccountType::ASSET, | ||||
|                         AccountType::BENEFICIARY, | ||||
|                         AccountType::CASH, | ||||
|                         AccountType::CREDITCARD, | ||||
|                         AccountType::DEBT, | ||||
|                         AccountType::DEFAULT, | ||||
|                         AccountType::EXPENSE, | ||||
|                         AccountType::IMPORT, | ||||
|                         AccountType::INITIAL_BALANCE, | ||||
|                         AccountType::LIABILITY_CREDIT, | ||||
|                         AccountType::LOAN, | ||||
|                         AccountType::MORTGAGE, | ||||
|                         AccountType::RECONCILIATION, | ||||
|                         AccountType::REVENUE, | ||||
|                     ] | ||||
|                 ); | ||||
|                 break; | ||||
|             case 'asset_accounts': | ||||
|                 $this->destroyAccounts( | ||||
|                     [ | ||||
|                         AccountType::ASSET, | ||||
|                         AccountType::DEFAULT, | ||||
|                     ] | ||||
|                 ); | ||||
|                 break; | ||||
|             case 'expense_accounts': | ||||
|                 $this->destroyAccounts( | ||||
|                     [ | ||||
|                         AccountType::BENEFICIARY, | ||||
|                         AccountType::EXPENSE, | ||||
|                     ] | ||||
|                 ); | ||||
|                 break; | ||||
|             case 'revenue_accounts': | ||||
|                 $this->destroyAccounts( | ||||
|                     [ | ||||
|                         AccountType::REVENUE, | ||||
|                     ] | ||||
|                 ); | ||||
|                 break; | ||||
|             case 'liabilities': | ||||
|                 $this->destroyAccounts( | ||||
|                     [ | ||||
|                         AccountType::DEBT, | ||||
|                         AccountType::LOAN, | ||||
|                         AccountType::MORTGAGE, | ||||
|                         AccountType::CREDITCARD, | ||||
|                     ] | ||||
|                 ); | ||||
|                 break; | ||||
|             case 'transactions': | ||||
|                 $this->destroyTransactions( | ||||
|                     [ | ||||
|                         TransactionType::WITHDRAWAL, | ||||
|                         TransactionType::DEPOSIT, | ||||
|                         TransactionType::TRANSFER, | ||||
|                         TransactionType::RECONCILIATION, | ||||
|                         TransactionType::OPENING_BALANCE, | ||||
|                     ] | ||||
|                 ); | ||||
|                 break; | ||||
|             case 'withdrawals': | ||||
|                 $this->destroyTransactions( | ||||
|                     [ | ||||
|                         TransactionType::WITHDRAWAL, | ||||
|                     ] | ||||
|                 ); | ||||
|                 break; | ||||
|             case 'deposits': | ||||
|                 $this->destroyTransactions( | ||||
|                     [ | ||||
|                         TransactionType::DEPOSIT, | ||||
|                     ] | ||||
|                 ); | ||||
|                 break; | ||||
|             case 'transfers': | ||||
|                 $this->destroyTransactions( | ||||
|                     [ | ||||
|                         TransactionType::TRANSFER, | ||||
|                     ] | ||||
|                 ); | ||||
|                 break; | ||||
|         } | ||||
|         $objects         = $request->getObjects(); | ||||
|         $this->unused    = $request->boolean('unused', false); | ||||
| 
 | ||||
|         $allExceptAssets = [AccountType::BENEFICIARY, AccountType::CASH, AccountType::CREDITCARD, AccountType::DEFAULT, AccountType::EXPENSE, AccountType::IMPORT, AccountType::INITIAL_BALANCE, AccountType::LIABILITY_CREDIT, AccountType::RECONCILIATION, AccountType::REVENUE]; | ||||
|         $all             = [AccountType::ASSET, AccountType::BENEFICIARY, AccountType::CASH, AccountType::CREDITCARD, AccountType::DEBT, AccountType::DEFAULT, AccountType::EXPENSE, AccountType::IMPORT, AccountType::INITIAL_BALANCE, AccountType::LIABILITY_CREDIT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::RECONCILIATION]; | ||||
|         $liabilities     = [AccountType::DEBT, AccountType::LOAN, AccountType::MORTGAGE, AccountType::CREDITCARD]; | ||||
|         $transactions    = [TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER, TransactionType::RECONCILIATION, TransactionType::OPENING_BALANCE]; | ||||
| 
 | ||||
|         match ($objects) { | ||||
|             'budgets'                => $this->destroyBudgets(), | ||||
|             'bills'                  => $this->destroyBills(), | ||||
|             'piggy_banks'            => $this->destroyPiggyBanks(), | ||||
|             'rules'                  => $this->destroyRules(), | ||||
|             'recurring'              => $this->destroyRecurringTransactions(), | ||||
|             'categories'             => $this->destroyCategories(), | ||||
|             'tags'                   => $this->destroyTags(), | ||||
|             'object_groups'          => $this->destroyObjectGroups(), | ||||
|             'not_assets_liabilities' => $this->destroyAccounts($allExceptAssets), | ||||
|             'accounts'               => $this->destroyAccounts($all), | ||||
|             'asset_accounts'         => $this->destroyAccounts([AccountType::ASSET, AccountType::DEFAULT]), | ||||
|             'expense_accounts'       => $this->destroyAccounts([AccountType::BENEFICIARY, AccountType::EXPENSE]), | ||||
|             'revenue_accounts'       => $this->destroyAccounts([AccountType::REVENUE]), | ||||
|             'liabilities'            => $this->destroyAccounts($liabilities), | ||||
|             'transactions'           => $this->destroyTransactions($transactions), | ||||
|             'withdrawals'            => $this->destroyTransactions([TransactionType::WITHDRAWAL]), | ||||
|             'deposits'               => $this->destroyTransactions([TransactionType::DEPOSIT]), | ||||
|             'transfers'              => $this->destroyTransactions([TransactionType::TRANSFER]), | ||||
|             default                  => throw new FireflyException(sprintf('200033: This endpoint can\'t handle object "%s"', $objects)), | ||||
|         }; | ||||
| 
 | ||||
|         app('preferences')->mark(); | ||||
| 
 | ||||
|         return response()->json([], 204); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     private function destroyBudgets(): void | ||||
|     { | ||||
|         /** @var AvailableBudgetRepositoryInterface $abRepository */ | ||||
|         $abRepository = app(AvailableBudgetRepositoryInterface::class); | ||||
|         $abRepository     = app(AvailableBudgetRepositoryInterface::class); | ||||
|         $abRepository->destroyAll(); | ||||
| 
 | ||||
|         /** @var BudgetLimitRepositoryInterface $blRepository */ | ||||
|         $blRepository = app(BudgetLimitRepositoryInterface::class); | ||||
|         $blRepository     = app(BudgetLimitRepositoryInterface::class); | ||||
|         $blRepository->destroyAll(); | ||||
| 
 | ||||
|         /** @var BudgetRepositoryInterface $budgetRepository */ | ||||
| @@ -219,9 +112,6 @@ class DestroyController extends Controller | ||||
|         $budgetRepository->destroyAll(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     private function destroyBills(): void | ||||
|     { | ||||
|         /** @var BillRepositoryInterface $repository */ | ||||
| @@ -229,9 +119,6 @@ class DestroyController extends Controller | ||||
|         $repository->destroyAll(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     private function destroyPiggyBanks(): void | ||||
|     { | ||||
|         /** @var PiggyBankRepositoryInterface $repository */ | ||||
| @@ -239,9 +126,6 @@ class DestroyController extends Controller | ||||
|         $repository->destroyAll(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     private function destroyRules(): void | ||||
|     { | ||||
|         /** @var RuleGroupRepositoryInterface $repository */ | ||||
| @@ -249,9 +133,6 @@ class DestroyController extends Controller | ||||
|         $repository->destroyAll(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     private function destroyRecurringTransactions(): void | ||||
|     { | ||||
|         /** @var RecurringRepositoryInterface $repository */ | ||||
| @@ -259,9 +140,6 @@ class DestroyController extends Controller | ||||
|         $repository->destroyAll(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     private function destroyCategories(): void | ||||
|     { | ||||
|         /** @var CategoryRepositoryInterface $categoryRepos */ | ||||
| @@ -269,9 +147,6 @@ class DestroyController extends Controller | ||||
|         $categoryRepos->destroyAll(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      */ | ||||
|     private function destroyTags(): void | ||||
|     { | ||||
|         /** @var TagRepositoryInterface $tagRepository */ | ||||
| @@ -287,7 +162,7 @@ class DestroyController extends Controller | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @param array $types | ||||
|      * @param array<int, string> $types | ||||
|      */ | ||||
|     private function destroyAccounts(array $types): void | ||||
|     { | ||||
| @@ -300,19 +175,22 @@ class DestroyController extends Controller | ||||
|         foreach ($collection as $account) { | ||||
|             $count = $account->transactions()->count(); | ||||
|             if (true === $this->unused && 0 === $count) { | ||||
|                 Log::info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name)); | ||||
|                 app('log')->info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name)); | ||||
|                 Log::channel('audit')->info(sprintf('Deleted unused account #%d "%s"', $account->id, $account->name)); | ||||
|                 $service->destroy($account, null); | ||||
| 
 | ||||
|                 continue; | ||||
|             } | ||||
|             if (false === $this->unused) { | ||||
|                 Log::info(sprintf('Deleting account #%d "%s"', $account->id, $account->name)); | ||||
|                 app('log')->info(sprintf('Deleting account #%d "%s"', $account->id, $account->name)); | ||||
|                 Log::channel('audit')->warning(sprintf('Deleted account #%d "%s"', $account->id, $account->name)); | ||||
|                 $service->destroy($account, null); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @param array $types | ||||
|      * @param array<int, string> $types | ||||
|      */ | ||||
|     private function destroyTransactions(array $types): void | ||||
|     { | ||||
| @@ -320,6 +198,7 @@ class DestroyController extends Controller | ||||
|         $repository = app(JournalRepositoryInterface::class); | ||||
|         $journals   = $repository->findByType($types); | ||||
|         $service    = app(JournalDestroyService::class); | ||||
| 
 | ||||
|         /** @var TransactionJournal $journal */ | ||||
|         foreach ($journals as $journal) { | ||||
|             $service->destroy($journal); | ||||
|   | ||||
| @@ -57,10 +57,9 @@ class ExportController extends Controller | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportAccounts
 | ||||
|      * | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings(PHPMD.UnusedFormalParameter) | ||||
|      */ | ||||
|     public function accounts(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
| @@ -70,9 +69,128 @@ class ExportController extends Controller | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @param string $key | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportBills
 | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings(PHPMD.UnusedFormalParameter) | ||||
|      */ | ||||
|     public function bills(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportBills(true); | ||||
| 
 | ||||
|         return $this->returnExport('bills'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportBudgets
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings(PHPMD.UnusedFormalParameter) | ||||
|      */ | ||||
|     public function budgets(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportBudgets(true); | ||||
| 
 | ||||
|         return $this->returnExport('budgets'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportCategories
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings(PHPMD.UnusedFormalParameter) | ||||
|      */ | ||||
|     public function categories(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportCategories(true); | ||||
| 
 | ||||
|         return $this->returnExport('categories'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportPiggies
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings(PHPMD.UnusedFormalParameter) | ||||
|      */ | ||||
|     public function piggyBanks(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportPiggies(true); | ||||
| 
 | ||||
|         return $this->returnExport('piggies'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportRecurring
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings(PHPMD.UnusedFormalParameter) | ||||
|      */ | ||||
|     public function recurring(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportRecurring(true); | ||||
| 
 | ||||
|         return $this->returnExport('recurrences'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportRules
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings(PHPMD.UnusedFormalParameter) | ||||
|      */ | ||||
|     public function rules(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportRules(true); | ||||
| 
 | ||||
|         return $this->returnExport('rules'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportTags
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      * @SuppressWarnings(PHPMD.UnusedFormalParameter) | ||||
|      */ | ||||
|     public function tags(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportTags(true); | ||||
| 
 | ||||
|         return $this->returnExport('tags'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportTransactions
 | ||||
|      * | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $params = $request->getAll(); | ||||
|         $this->exporter->setStart($params['start']); | ||||
|         $this->exporter->setEnd($params['end']); | ||||
|         $this->exporter->setAccounts($params['accounts']); | ||||
|         $this->exporter->setExportTransactions(true); | ||||
| 
 | ||||
|         return $this->returnExport('transactions'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     private function returnExport(string $key): LaravelResponse | ||||
| @@ -86,146 +204,15 @@ class ExportController extends Controller | ||||
|         $response | ||||
|             ->header('Content-Description', 'File Transfer') | ||||
|             ->header('Content-Type', 'application/octet-stream') | ||||
|             ->header('Content-Disposition', 'attachment; filename=' . $fileName) | ||||
|             ->header('Content-Disposition', 'attachment; filename='.$fileName) | ||||
|             ->header('Content-Transfer-Encoding', 'binary') | ||||
|             ->header('Connection', 'Keep-Alive') | ||||
|             ->header('Expires', '0') | ||||
|             ->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') | ||||
|             ->header('Pragma', 'public') | ||||
|             ->header('Content-Length', (string)strlen($data[$key])); | ||||
|             ->header('Content-Length', (string) strlen($data[$key])) | ||||
|         ; | ||||
| 
 | ||||
|         return $response; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportBills
 | ||||
|      * | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function bills(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportBills(true); | ||||
| 
 | ||||
|         return $this->returnExport('bills'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportBudgets
 | ||||
|      * | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function budgets(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportBudgets(true); | ||||
| 
 | ||||
|         return $this->returnExport('budgets'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportCategories
 | ||||
|      * | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function categories(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportCategories(true); | ||||
| 
 | ||||
|         return $this->returnExport('categories'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportPiggies
 | ||||
|      * | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function piggyBanks(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportPiggies(true); | ||||
| 
 | ||||
|         return $this->returnExport('piggies'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportRecurring
 | ||||
|      * | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function recurring(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportRecurring(true); | ||||
| 
 | ||||
|         return $this->returnExport('recurrences'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportRules
 | ||||
|      * | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function rules(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportRules(true); | ||||
| 
 | ||||
|         return $this->returnExport('rules'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportTags
 | ||||
|      * | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function tags(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $this->exporter->setExportTags(true); | ||||
| 
 | ||||
|         return $this->returnExport('tags'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/exportTransactions
 | ||||
|      * | ||||
|      * @param ExportRequest $request | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(ExportRequest $request): LaravelResponse | ||||
|     { | ||||
|         $params = $request->getAll(); | ||||
|         $this->exporter->setStart($params['start']); | ||||
|         $this->exporter->setEnd($params['end']); | ||||
|         $this->exporter->setAccounts($params['accounts']); | ||||
|         $this->exporter->setExportTransactions(true); | ||||
| 
 | ||||
|         return $this->returnExport('transactions'); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -35,19 +35,22 @@ use FireflyIII\Models\RuleGroup; | ||||
| use FireflyIII\Models\Tag; | ||||
| use FireflyIII\Models\TransactionGroup; | ||||
| use FireflyIII\Models\TransactionJournal; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * Class PurgeController | ||||
|  */ | ||||
| class PurgeController extends Controller | ||||
| { | ||||
|     /** | ||||
|      * TODO cleanup and use repositories. | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/data/purgeData
 | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function purge(): JsonResponse | ||||
|     { | ||||
|         /** @var User $user */ | ||||
|         $user = auth()->user(); | ||||
| 
 | ||||
|         // some manual code, too lazy to call all repositories.
 | ||||
| @@ -59,8 +62,10 @@ class PurgeController extends Controller | ||||
|         Bill::whereUserId($user->id)->onlyTrashed()->forceDelete(); | ||||
| 
 | ||||
|         // piggies
 | ||||
|         $set = PiggyBank::leftJoin('accounts', 'accounts.id', 'piggy_banks.account_id') | ||||
|                         ->where('accounts.user_id', $user->id)->onlyTrashed()->get(['piggy_banks.*']); | ||||
|         $set  = PiggyBank::leftJoin('accounts', 'accounts.id', 'piggy_banks.account_id') | ||||
|             ->where('accounts.user_id', $user->id)->onlyTrashed()->get(['piggy_banks.*']) | ||||
|         ; | ||||
| 
 | ||||
|         /** @var PiggyBank $piggy */ | ||||
|         foreach ($set as $piggy) { | ||||
|             $piggy->forceDelete(); | ||||
| @@ -81,7 +86,6 @@ class PurgeController extends Controller | ||||
|         // tags
 | ||||
|         Tag::whereUserId($user->id)->onlyTrashed()->forceDelete(); | ||||
| 
 | ||||
| 
 | ||||
|         // accounts
 | ||||
|         Account::whereUserId($user->id)->onlyTrashed()->forceDelete(); | ||||
| 
 | ||||
|   | ||||
| @@ -28,12 +28,10 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Account\OperationsRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ApiSupport; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * | ||||
|  * Class AccountController | ||||
|  * | ||||
|  * Shows expense information grouped or limited by date. | ||||
| @@ -43,27 +41,21 @@ class AccountController extends Controller | ||||
| { | ||||
|     use ApiSupport; | ||||
| 
 | ||||
|     private CurrencyRepositoryInterface   $currencyRepository; | ||||
|     private OperationsRepositoryInterface $opsRepository; | ||||
|     private AccountRepositoryInterface    $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $user                = auth()->user(); | ||||
|                 $this->repository    = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
| 
 | ||||
|                 $this->currencyRepository = app(CurrencyRepositoryInterface::class); | ||||
|                 $this->currencyRepository->setUser($user); | ||||
| 
 | ||||
|                 $this->opsRepository = app(OperationsRepositoryInterface::class); | ||||
|                 $this->opsRepository->setUser($user); | ||||
| 
 | ||||
| @@ -75,10 +67,6 @@ class AccountController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseAsset
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function asset(GenericRequest $request): JsonResponse | ||||
|     { | ||||
| @@ -106,10 +94,6 @@ class AccountController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseExpense
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function expense(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -60,18 +60,14 @@ class BillController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseBill
 | ||||
|      * | ||||
|      * Expenses per bill, possibly filtered by bill and account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function bill(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $bills    = $request->getBills(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|         $accounts   = $request->getAssetAccounts(); | ||||
|         $bills      = $request->getBills(); | ||||
|         $start      = $request->getStart(); | ||||
|         $end        = $request->getEnd(); | ||||
|         $response   = []; | ||||
| 
 | ||||
|         // get all bills:
 | ||||
|         if (0 === $bills->count()) { | ||||
| @@ -79,7 +75,7 @@ class BillController extends Controller | ||||
|         } | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector  = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); | ||||
|         $collector->setBills($bills); | ||||
| 
 | ||||
| @@ -92,7 +88,7 @@ class BillController extends Controller | ||||
|             $foreignKey        = sprintf('%d-%d', $billId, $foreignCurrencyId); | ||||
| 
 | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$key]                     = $response[$key] ?? [ | ||||
|                 $response[$key] ??= [ | ||||
|                     'id'               => (string)$billId, | ||||
|                     'name'             => $journal['bill_name'], | ||||
|                     'difference'       => '0', | ||||
| @@ -104,7 +100,7 @@ class BillController extends Controller | ||||
|                 $response[$key]['difference_float'] = (float)$response[$key]['difference']; // intentional float
 | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignKey]                     = $response[$foreignKey] ?? [ | ||||
|                 $response[$foreignKey] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$foreignCurrencyId, | ||||
| @@ -123,20 +119,16 @@ class BillController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseNoBill
 | ||||
|      * | ||||
|      * Expenses for no bill filtered by account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noBill(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|         $accounts   = $request->getAssetAccounts(); | ||||
|         $start      = $request->getStart(); | ||||
|         $end        = $request->getEnd(); | ||||
|         $response   = []; | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector  = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); | ||||
|         $collector->withoutBill(); | ||||
| 
 | ||||
| @@ -147,7 +139,7 @@ class BillController extends Controller | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
| 
 | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$currencyId]                     = $response[$currencyId] ?? [ | ||||
|                 $response[$currencyId] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$currencyId, | ||||
| @@ -157,7 +149,7 @@ class BillController extends Controller | ||||
|                 $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // intentional float
 | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignCurrencyId]                     = $response[$foreignCurrencyId] ?? [ | ||||
|                 $response[$foreignCurrencyId] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$foreignCurrencyId, | ||||
|   | ||||
| @@ -43,8 +43,6 @@ class BudgetController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -67,10 +65,6 @@ class BudgetController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseBudget
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function budget(GenericRequest $request): JsonResponse | ||||
|     { | ||||
| @@ -82,9 +76,11 @@ class BudgetController extends Controller | ||||
|         if (0 === $budgets->count()) { | ||||
|             $budgets = $this->repository->getActiveBudgets(); | ||||
|         } | ||||
| 
 | ||||
|         /** @var Budget $budget */ | ||||
|         foreach ($budgets as $budget) { | ||||
|             $expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, new Collection([$budget])); | ||||
| 
 | ||||
|             /** @var array $expense */ | ||||
|             foreach ($expenses as $expense) { | ||||
|                 $result[] = [ | ||||
| @@ -104,10 +100,6 @@ class BudgetController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseNoBudget
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noBudget(GenericRequest $request): JsonResponse | ||||
|     { | ||||
| @@ -116,6 +108,7 @@ class BudgetController extends Controller | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $result        = []; | ||||
|         $expenses      = $this->noRepository->sumExpenses($start, $end, $assetAccounts); | ||||
| 
 | ||||
|         /** @var array $expense */ | ||||
|         foreach ($expenses as $expense) { | ||||
|             $result[] = [ | ||||
|   | ||||
| @@ -44,8 +44,6 @@ class CategoryController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -68,10 +66,6 @@ class CategoryController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferCategory
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function category(GenericRequest $request): JsonResponse | ||||
|     { | ||||
| @@ -83,9 +77,11 @@ class CategoryController extends Controller | ||||
|         if (0 === $categories->count()) { | ||||
|             $categories = $this->repository->getCategories(); | ||||
|         } | ||||
| 
 | ||||
|         /** @var Category $category */ | ||||
|         foreach ($categories as $category) { | ||||
|             $expenses = $this->opsRepository->sumExpenses($start, $end, $assetAccounts, new Collection([$category])); | ||||
| 
 | ||||
|             /** @var array $expense */ | ||||
|             foreach ($expenses as $expense) { | ||||
|                 $result[] = [ | ||||
| @@ -105,10 +101,6 @@ class CategoryController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoCategory
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noCategory(GenericRequest $request): JsonResponse | ||||
|     { | ||||
| @@ -117,6 +109,7 @@ class CategoryController extends Controller | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $result        = []; | ||||
|         $expenses      = $this->noRepository->sumExpenses($start, $end, $assetAccounts); | ||||
| 
 | ||||
|         /** @var array $expense */ | ||||
|         foreach ($expenses as $expense) { | ||||
|             $result[] = [ | ||||
|   | ||||
| @@ -37,20 +37,16 @@ class PeriodController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseTotal
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function total(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|         $accounts   = $request->getAssetAccounts(); | ||||
|         $start      = $request->getStart(); | ||||
|         $end        = $request->getEnd(); | ||||
|         $response   = []; | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type)
 | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector  = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
|         foreach ($genericSet as $journal) { | ||||
| @@ -58,7 +54,7 @@ class PeriodController extends Controller | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
| 
 | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$currencyId]                     = $response[$currencyId] ?? [ | ||||
|                 $response[$currencyId] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$currencyId, | ||||
| @@ -68,7 +64,7 @@ class PeriodController extends Controller | ||||
|                 $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // intentional float
 | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignCurrencyId]                     = $response[$foreignCurrencyId] ?? [ | ||||
|                 $response[$foreignCurrencyId] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$foreignCurrencyId, | ||||
|   | ||||
| @@ -59,48 +59,44 @@ class TagController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseNoTag
 | ||||
|      * | ||||
|      * Expenses for no tag filtered by account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noTag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|         $accounts   = $request->getAssetAccounts(); | ||||
|         $start      = $request->getStart(); | ||||
|         $end        = $request->getEnd(); | ||||
|         $response   = []; | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector  = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); | ||||
|         $collector->withoutTags(); | ||||
| 
 | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
| 
 | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
|             $currencyId        = (int) $journal['currency_id']; | ||||
|             $foreignCurrencyId = (int) $journal['foreign_currency_id']; | ||||
| 
 | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$currencyId]                     = $response[$currencyId] ?? [ | ||||
|                 $response[$currencyId] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$currencyId, | ||||
|                     'currency_id'      => (string) $currencyId, | ||||
|                     'currency_code'    => $journal['currency_code'], | ||||
|                 ]; | ||||
|                 $response[$currencyId]['difference']       = bcadd($response[$currencyId]['difference'], $journal['amount']); | ||||
|                 $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // float but on purpose.
 | ||||
|                 $response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // float but on purpose.
 | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignCurrencyId]                     = $response[$foreignCurrencyId] ?? [ | ||||
|                 $response[$foreignCurrencyId] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$foreignCurrencyId, | ||||
|                     'currency_id'      => (string) $foreignCurrencyId, | ||||
|                     'currency_code'    => $journal['foreign_currency_code'], | ||||
|                 ]; | ||||
|                 $response[$foreignCurrencyId]['difference']       = bcadd($response[$foreignCurrencyId]['difference'], $journal['foreign_amount']); | ||||
|                 $response[$foreignCurrencyId]['difference_float'] = (float)$response[$foreignCurrencyId]['difference']; // float but on purpose.
 | ||||
|                 $response[$foreignCurrencyId]['difference_float'] = (float) $response[$foreignCurrencyId]['difference']; // float but on purpose.
 | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| @@ -112,18 +108,14 @@ class TagController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightExpenseTag
 | ||||
|      * | ||||
|      * Expenses per tag, possibly filtered by tag and account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function tag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $tags     = $request->getTags(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|         $accounts   = $request->getAssetAccounts(); | ||||
|         $tags       = $request->getTags(); | ||||
|         $start      = $request->getStart(); | ||||
|         $end        = $request->getEnd(); | ||||
|         $response   = []; | ||||
| 
 | ||||
|         // get all tags:
 | ||||
|         if (0 === $tags->count()) { | ||||
| @@ -131,14 +123,15 @@ class TagController extends Controller | ||||
|         } | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector  = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::WITHDRAWAL])->setRange($start, $end)->setSourceAccounts($accounts); | ||||
|         $collector->setTags($tags); | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
| 
 | ||||
|         /** @var array $journal */ | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
|             $currencyId        = (int) $journal['currency_id']; | ||||
|             $foreignCurrencyId = (int) $journal['foreign_currency_id']; | ||||
| 
 | ||||
|             /** @var array $tag */ | ||||
|             foreach ($journal['tags'] as $tag) { | ||||
| @@ -148,16 +141,16 @@ class TagController extends Controller | ||||
| 
 | ||||
|                 // on currency ID
 | ||||
|                 if (0 !== $currencyId) { | ||||
|                     $response[$key]                     = $response[$key] ?? [ | ||||
|                         'id'               => (string)$tagId, | ||||
|                     $response[$key] ??= [ | ||||
|                         'id'               => (string) $tagId, | ||||
|                         'name'             => $tag['name'], | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$currencyId, | ||||
|                         'currency_id'      => (string) $currencyId, | ||||
|                         'currency_code'    => $journal['currency_code'], | ||||
|                     ]; | ||||
|                     $response[$key]['difference']       = bcadd($response[$key]['difference'], $journal['amount']); | ||||
|                     $response[$key]['difference_float'] = (float)$response[$key]['difference']; // float but on purpose.
 | ||||
|                     $response[$key]['difference_float'] = (float) $response[$key]['difference']; // float but on purpose.
 | ||||
|                 } | ||||
| 
 | ||||
|                 // on foreign ID
 | ||||
| @@ -165,11 +158,11 @@ class TagController extends Controller | ||||
|                     $response[$foreignKey]                     = $journal[$foreignKey] ?? [ | ||||
|                         'difference'       => '0', | ||||
|                         'difference_float' => 0, | ||||
|                         'currency_id'      => (string)$foreignCurrencyId, | ||||
|                         'currency_id'      => (string) $foreignCurrencyId, | ||||
|                         'currency_code'    => $journal['foreign_currency_code'], | ||||
|                     ]; | ||||
|                     $response[$foreignKey]['difference']       = bcadd($response[$foreignKey]['difference'], $journal['foreign_amount']); | ||||
|                     $response[$foreignKey]['difference_float'] = (float)$response[$foreignKey]['difference']; // float but on purpose.
 | ||||
|                     $response[$foreignKey]['difference_float'] = (float) $response[$foreignKey]['difference']; // float but on purpose.
 | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -28,12 +28,10 @@ use FireflyIII\Api\V1\Controllers\Controller; | ||||
| use FireflyIII\Api\V1\Requests\Insight\GenericRequest; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Repositories\Account\OperationsRepositoryInterface; | ||||
| use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\ApiSupport; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| 
 | ||||
| /** | ||||
|  * | ||||
|  * Class AccountController | ||||
|  * | ||||
|  * Shows income information grouped or limited by date. | ||||
| @@ -43,27 +41,21 @@ class AccountController extends Controller | ||||
| { | ||||
|     use ApiSupport; | ||||
| 
 | ||||
|     private CurrencyRepositoryInterface   $currencyRepository; | ||||
|     private OperationsRepositoryInterface $opsRepository; | ||||
|     private AccountRepositoryInterface    $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 $user             = auth()->user(); | ||||
|                 $this->repository = app(AccountRepositoryInterface::class); | ||||
|                 $user                = auth()->user(); | ||||
|                 $this->repository    = app(AccountRepositoryInterface::class); | ||||
|                 $this->repository->setUser($user); | ||||
| 
 | ||||
|                 $this->currencyRepository = app(CurrencyRepositoryInterface::class); | ||||
|                 $this->currencyRepository->setUser($user); | ||||
| 
 | ||||
|                 $this->opsRepository = app(OperationsRepositoryInterface::class); | ||||
|                 $this->opsRepository->setUser($user); | ||||
| 
 | ||||
| @@ -75,10 +67,6 @@ class AccountController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeAsset
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function asset(GenericRequest $request): JsonResponse | ||||
|     { | ||||
| @@ -87,6 +75,7 @@ class AccountController extends Controller | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $income        = $this->opsRepository->sumIncomeByDestination($start, $end, $assetAccounts); | ||||
|         $result        = []; | ||||
| 
 | ||||
|         /** @var array $entry */ | ||||
|         foreach ($income as $entry) { | ||||
|             $result[] = [ | ||||
| @@ -105,10 +94,6 @@ class AccountController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeRevenue
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function revenue(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -44,8 +44,6 @@ class CategoryController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -68,10 +66,6 @@ class CategoryController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeCategory
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function category(GenericRequest $request): JsonResponse | ||||
|     { | ||||
| @@ -83,9 +77,11 @@ class CategoryController extends Controller | ||||
|         if (0 === $categories->count()) { | ||||
|             $categories = $this->repository->getCategories(); | ||||
|         } | ||||
| 
 | ||||
|         /** @var Category $category */ | ||||
|         foreach ($categories as $category) { | ||||
|             $expenses = $this->opsRepository->sumIncome($start, $end, $assetAccounts, new Collection([$category])); | ||||
| 
 | ||||
|             /** @var array $expense */ | ||||
|             foreach ($expenses as $expense) { | ||||
|                 $result[] = [ | ||||
| @@ -105,10 +101,6 @@ class CategoryController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeNoCategory
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noCategory(GenericRequest $request): JsonResponse | ||||
|     { | ||||
| @@ -117,6 +109,7 @@ class CategoryController extends Controller | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $result        = []; | ||||
|         $expenses      = $this->noRepository->sumIncome($start, $end, $assetAccounts); | ||||
| 
 | ||||
|         /** @var array $expense */ | ||||
|         foreach ($expenses as $expense) { | ||||
|             $result[] = [ | ||||
|   | ||||
| @@ -37,20 +37,16 @@ class PeriodController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeTotal
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function total(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|         $accounts   = $request->getAssetAccounts(); | ||||
|         $start      = $request->getStart(); | ||||
|         $end        = $request->getEnd(); | ||||
|         $response   = []; | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type)
 | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector  = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
|         foreach ($genericSet as $journal) { | ||||
| @@ -58,7 +54,7 @@ class PeriodController extends Controller | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
| 
 | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$currencyId]                     = $response[$currencyId] ?? [ | ||||
|                 $response[$currencyId] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$currencyId, | ||||
| @@ -68,7 +64,7 @@ class PeriodController extends Controller | ||||
|                 $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; // float but on purpose.
 | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignCurrencyId]                     = $response[$foreignCurrencyId] ?? [ | ||||
|                 $response[$foreignCurrencyId] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$foreignCurrencyId, | ||||
|   | ||||
| @@ -60,20 +60,16 @@ class TagController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeTag
 | ||||
|      * | ||||
|      * Expenses for no tag filtered by account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noTag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|         $accounts   = $request->getAssetAccounts(); | ||||
|         $start      = $request->getStart(); | ||||
|         $end        = $request->getEnd(); | ||||
|         $response   = []; | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector  = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $collector->withoutTags(); | ||||
| 
 | ||||
| @@ -84,7 +80,7 @@ class TagController extends Controller | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
| 
 | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$currencyId]                     = $response[$currencyId] ?? [ | ||||
|                 $response[$currencyId] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$currencyId, | ||||
| @@ -94,7 +90,7 @@ class TagController extends Controller | ||||
|                 $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignCurrencyId]                     = $response[$foreignCurrencyId] ?? [ | ||||
|                 $response[$foreignCurrencyId] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$foreignCurrencyId, | ||||
| @@ -116,18 +112,14 @@ class TagController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeNoTag
 | ||||
|      * | ||||
|      * Expenses per tag, possibly filtered by tag and account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function tag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $tags     = $request->getTags(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|         $accounts   = $request->getAssetAccounts(); | ||||
|         $tags       = $request->getTags(); | ||||
|         $start      = $request->getStart(); | ||||
|         $end        = $request->getEnd(); | ||||
|         $response   = []; | ||||
| 
 | ||||
|         // get all tags:
 | ||||
|         if (0 === $tags->count()) { | ||||
| @@ -135,10 +127,11 @@ class TagController extends Controller | ||||
|         } | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector  = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::DEPOSIT])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $collector->setTags($tags); | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
| 
 | ||||
|         /** @var array $journal */ | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
| @@ -152,7 +145,7 @@ class TagController extends Controller | ||||
| 
 | ||||
|                 // on currency ID
 | ||||
|                 if (0 !== $currencyId) { | ||||
|                     $response[$key]                     = $response[$key] ?? [ | ||||
|                     $response[$key] ??= [ | ||||
|                         'id'               => (string)$tagId, | ||||
|                         'name'             => $tag['name'], | ||||
|                         'difference'       => '0', | ||||
|   | ||||
| @@ -40,8 +40,6 @@ class AccountController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -60,10 +58,6 @@ class AccountController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransfers
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function asset(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -43,8 +43,6 @@ class CategoryController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -67,10 +65,6 @@ class CategoryController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferCategory
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function category(GenericRequest $request): JsonResponse | ||||
|     { | ||||
| @@ -82,9 +76,11 @@ class CategoryController extends Controller | ||||
|         if (0 === $categories->count()) { | ||||
|             $categories = $this->repository->getCategories(); | ||||
|         } | ||||
| 
 | ||||
|         /** @var Category $category */ | ||||
|         foreach ($categories as $category) { | ||||
|             $expenses = $this->opsRepository->sumTransfers($start, $end, $assetAccounts, new Collection([$category])); | ||||
| 
 | ||||
|             /** @var array $expense */ | ||||
|             foreach ($expenses as $expense) { | ||||
|                 $result[] = [ | ||||
| @@ -104,10 +100,6 @@ class CategoryController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoCategory
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noCategory(GenericRequest $request): JsonResponse | ||||
|     { | ||||
| @@ -116,6 +108,7 @@ class CategoryController extends Controller | ||||
|         $assetAccounts = $request->getAssetAccounts(); | ||||
|         $result        = []; | ||||
|         $expenses      = $this->noRepository->sumTransfers($start, $end, $assetAccounts); | ||||
| 
 | ||||
|         /** @var array $expense */ | ||||
|         foreach ($expenses as $expense) { | ||||
|             $result[] = [ | ||||
|   | ||||
| @@ -37,20 +37,16 @@ class PeriodController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferTotal
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function total(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|         $accounts   = $request->getAssetAccounts(); | ||||
|         $start      = $request->getStart(); | ||||
|         $end        = $request->getEnd(); | ||||
|         $response   = []; | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type)
 | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector  = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
|         foreach ($genericSet as $journal) { | ||||
| @@ -58,7 +54,7 @@ class PeriodController extends Controller | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
| 
 | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$currencyId]                     = $response[$currencyId] ?? [ | ||||
|                 $response[$currencyId] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$currencyId, | ||||
| @@ -68,7 +64,7 @@ class PeriodController extends Controller | ||||
|                 $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignCurrencyId]                     = $response[$foreignCurrencyId] ?? [ | ||||
|                 $response[$foreignCurrencyId] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$foreignCurrencyId, | ||||
|   | ||||
| @@ -57,20 +57,16 @@ class TagController extends Controller | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferNoTag
 | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function noTag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|         $accounts   = $request->getAssetAccounts(); | ||||
|         $start      = $request->getStart(); | ||||
|         $end        = $request->getEnd(); | ||||
|         $response   = []; | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector  = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $collector->withoutTags(); | ||||
| 
 | ||||
| @@ -81,7 +77,7 @@ class TagController extends Controller | ||||
|             $foreignCurrencyId = (int)$journal['foreign_currency_id']; | ||||
| 
 | ||||
|             if (0 !== $currencyId) { | ||||
|                 $response[$currencyId]                     = $response[$currencyId] ?? [ | ||||
|                 $response[$currencyId] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$currencyId, | ||||
| @@ -91,7 +87,7 @@ class TagController extends Controller | ||||
|                 $response[$currencyId]['difference_float'] = (float)$response[$currencyId]['difference']; | ||||
|             } | ||||
|             if (0 !== $foreignCurrencyId) { | ||||
|                 $response[$foreignCurrencyId]                     = $response[$foreignCurrencyId] ?? [ | ||||
|                 $response[$foreignCurrencyId] ??= [ | ||||
|                     'difference'       => '0', | ||||
|                     'difference_float' => 0, | ||||
|                     'currency_id'      => (string)$foreignCurrencyId, | ||||
| @@ -113,18 +109,14 @@ class TagController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightTransferTag
 | ||||
|      * | ||||
|      * Transfers per tag, possibly filtered by tag and account. | ||||
|      * | ||||
|      * @param GenericRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function tag(GenericRequest $request): JsonResponse | ||||
|     { | ||||
|         $accounts = $request->getAssetAccounts(); | ||||
|         $tags     = $request->getTags(); | ||||
|         $start    = $request->getStart(); | ||||
|         $end      = $request->getEnd(); | ||||
|         $response = []; | ||||
|         $accounts   = $request->getAssetAccounts(); | ||||
|         $tags       = $request->getTags(); | ||||
|         $start      = $request->getStart(); | ||||
|         $end        = $request->getEnd(); | ||||
|         $response   = []; | ||||
| 
 | ||||
|         // get all tags:
 | ||||
|         if (0 === $tags->count()) { | ||||
| @@ -132,10 +124,11 @@ class TagController extends Controller | ||||
|         } | ||||
| 
 | ||||
|         // collect all expenses in this period (regardless of type) by the given bills and accounts.
 | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector  = app(GroupCollectorInterface::class); | ||||
|         $collector->setTypes([TransactionType::TRANSFER])->setRange($start, $end)->setDestinationAccounts($accounts); | ||||
|         $collector->setTags($tags); | ||||
|         $genericSet = $collector->getExtractedJournals(); | ||||
| 
 | ||||
|         /** @var array $journal */ | ||||
|         foreach ($genericSet as $journal) { | ||||
|             $currencyId        = (int)$journal['currency_id']; | ||||
| @@ -149,7 +142,7 @@ class TagController extends Controller | ||||
| 
 | ||||
|                 // on currency ID
 | ||||
|                 if (0 !== $currencyId) { | ||||
|                     $response[$key]                     = $response[$key] ?? [ | ||||
|                     $response[$key] ??= [ | ||||
|                         'id'               => (string)$tagId, | ||||
|                         'name'             => $tag['name'], | ||||
|                         'difference'       => '0', | ||||
|   | ||||
| @@ -33,14 +33,12 @@ use Illuminate\Http\JsonResponse; | ||||
|  */ | ||||
| class DestroyController extends Controller | ||||
| { | ||||
|     public const RESOURCE_KEY = 'accounts'; | ||||
|     public const string RESOURCE_KEY = 'accounts'; | ||||
| 
 | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -60,10 +58,6 @@ class DestroyController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/deleteAccount
 | ||||
|      * | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Account $account | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function destroy(Account $account): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -47,14 +47,12 @@ class ListController extends Controller | ||||
| { | ||||
|     use TransactionFilter; | ||||
| 
 | ||||
|     public const RESOURCE_KEY = 'accounts'; | ||||
|     public const string RESOURCE_KEY = 'accounts'; | ||||
| 
 | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -73,29 +71,26 @@ class ListController extends Controller | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/listAttachmentByAccount
 | ||||
|      * | ||||
|      * @param Account $account | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function attachments(Account $account): JsonResponse | ||||
|     { | ||||
|         $manager    = $this->getManager(); | ||||
|         $pageSize   = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $collection = $this->repository->getAttachments($account); | ||||
|         $manager     = $this->getManager(); | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         $collection  = $this->repository->getAttachments($account); | ||||
| 
 | ||||
|         $count       = $collection->count(); | ||||
|         $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.accounts.attachments', [$account->id]) . $this->buildParams()); | ||||
|         $paginator   = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.accounts.attachments', [$account->id]).$this->buildParams()); | ||||
| 
 | ||||
|         /** @var AttachmentTransformer $transformer */ | ||||
|         $transformer = app(AttachmentTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($attachments, $transformer, 'attachments'); | ||||
|         $resource    = new FractalCollection($attachments, $transformer, 'attachments'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -105,33 +100,30 @@ class ListController extends Controller | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/listPiggyBankByAccount
 | ||||
|      * | ||||
|      * @param Account $account | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function piggyBanks(Account $account): JsonResponse | ||||
|     { | ||||
|         // create some objects:
 | ||||
|         $manager = $this->getManager(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
| 
 | ||||
|         // get list of budgets. Count it and split it.
 | ||||
|         $collection = $this->repository->getPiggyBanks($account); | ||||
|         $count      = $collection->count(); | ||||
|         $piggyBanks = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $collection  = $this->repository->getPiggyBanks($account); | ||||
|         $count       = $collection->count(); | ||||
|         $piggyBanks  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]) . $this->buildParams()); | ||||
|         $paginator   = new LengthAwarePaginator($piggyBanks, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.accounts.piggy-banks', [$account->id]).$this->buildParams()); | ||||
| 
 | ||||
|         /** @var PiggyBankTransformer $transformer */ | ||||
|         $transformer = app(PiggyBankTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); | ||||
|         $resource    = new FractalCollection($piggyBanks, $transformer, 'piggy_banks'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -143,48 +135,42 @@ class ListController extends Controller | ||||
|      * | ||||
|      * Show all transaction groups related to the account. | ||||
|      * | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * @param Account $account | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(Request $request, Account $account): JsonResponse | ||||
|     { | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $type     = $request->get('type') ?? 'default'; | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         $type        = $request->get('type') ?? 'default'; | ||||
|         $this->parameters->set('type', $type); | ||||
|         $types       = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // user can overrule page size with limit parameter.
 | ||||
|         $limit = $this->parameters->get('limit'); | ||||
|         if (null !== $limit && $limit > 0) { | ||||
|             $pageSize = $limit; | ||||
|         } | ||||
|         $types   = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager = $this->getManager(); | ||||
|         /** @var User $admin */ | ||||
|         $admin = auth()->user(); | ||||
|         $admin       = auth()->user(); | ||||
| 
 | ||||
|         // use new group collector:
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector   = app(GroupCollectorInterface::class); | ||||
|         $collector->setUser($admin)->setAccounts(new Collection([$account])) | ||||
|                   ->withAPIInformation()->setLimit($pageSize)->setPage($this->parameters->get('page'))->setTypes($types); | ||||
|             ->withAPIInformation()->setLimit($pageSize)->setPage($this->parameters->get('page'))->setTypes($types) | ||||
|         ; | ||||
| 
 | ||||
|         if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) { | ||||
|             $collector->setRange($this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         if (null !== $this->parameters->get('start')) { | ||||
|             $collector->setStart($this->parameters->get('start')); | ||||
|         } | ||||
|         if (null !== $this->parameters->get('end')) { | ||||
|             $collector->setEnd($this->parameters->get('end')); | ||||
|         } | ||||
| 
 | ||||
|         $paginator = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.accounts.transactions', [$account->id]) . $this->buildParams()); | ||||
|         $groups = $paginator->getCollection(); | ||||
|         $paginator   = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.accounts.transactions', [$account->id]).$this->buildParams()); | ||||
|         $groups      = $paginator->getCollection(); | ||||
| 
 | ||||
|         /** @var TransactionGroupTransformer $transformer */ | ||||
|         $transformer = app(TransactionGroupTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($groups, $transformer, 'transactions'); | ||||
|         $resource    = new FractalCollection($groups, $transformer, 'transactions'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|   | ||||
| @@ -43,14 +43,12 @@ class ShowController extends Controller | ||||
| { | ||||
|     use AccountFilter; | ||||
| 
 | ||||
|     public const RESOURCE_KEY = 'accounts'; | ||||
|     public const string RESOURCE_KEY = 'accounts'; | ||||
| 
 | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -71,40 +69,36 @@ class ShowController extends Controller | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(Request $request): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $type    = $request->get('type') ?? 'all'; | ||||
|         $manager     = $this->getManager(); | ||||
|         $type        = $request->get('type') ?? 'all'; | ||||
|         $this->parameters->set('type', $type); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $types    = $this->mapAccountTypes($this->parameters->get('type')); | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $types       = $this->mapAccountTypes($this->parameters->get('type')); | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
| 
 | ||||
|         // get list of accounts. Count it and split it.
 | ||||
|         $this->repository->resetAccountOrder(); | ||||
|         $collection = $this->repository->getAccountsByType($types, $this->parameters->get('sort') ?? []); | ||||
|         $count      = $collection->count(); | ||||
|         $collection  = $this->repository->getAccountsByType($types, $this->parameters->get('sort') ?? []); | ||||
|         $count       = $collection->count(); | ||||
| 
 | ||||
|         // continue sort:
 | ||||
| 
 | ||||
| 
 | ||||
|         $accounts = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $accounts    = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.accounts.index') . $this->buildParams()); | ||||
|         $paginator   = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.accounts.index').$this->buildParams()); | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($accounts, $transformer, self::RESOURCE_KEY); | ||||
|         $resource    = new FractalCollection($accounts, $transformer, self::RESOURCE_KEY); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -115,22 +109,18 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/getAccount
 | ||||
|      * | ||||
|      * Show single instance. | ||||
|      * | ||||
|      * @param Account $account | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Account $account): JsonResponse | ||||
|     { | ||||
|         // get list of accounts. Count it and split it.
 | ||||
|         $this->repository->resetAccountOrder(); | ||||
|         $account->refresh(); | ||||
|         $manager = $this->getManager(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
|         $resource    = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -35,14 +35,12 @@ use League\Fractal\Resource\Item; | ||||
|  */ | ||||
| class StoreController extends Controller | ||||
| { | ||||
|     public const RESOURCE_KEY = 'accounts'; | ||||
|     public const string RESOURCE_KEY = 'accounts'; | ||||
| 
 | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -62,23 +60,19 @@ class StoreController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/storeAccount
 | ||||
|      * | ||||
|      * Store a new instance. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $data = $request->getAllAccountData(); | ||||
|         $data        = $request->getAllAccountData(); | ||||
|         $this->repository->resetAccountOrder(); | ||||
|         $account = $this->repository->store($data); | ||||
|         $manager = $this->getManager(); | ||||
|         $account     = $this->repository->store($data); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
|         $resource    = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -29,23 +29,19 @@ use FireflyIII\Models\Account; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Transformers\AccountTransformer; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use League\Fractal\Resource\Item; | ||||
| use Preferences; | ||||
| 
 | ||||
| /** | ||||
|  * Class UpdateController | ||||
|  */ | ||||
| class UpdateController extends Controller | ||||
| { | ||||
|     public const RESOURCE_KEY = 'accounts'; | ||||
|     public const string RESOURCE_KEY = 'accounts'; | ||||
| 
 | ||||
|     private AccountRepositoryInterface $repository; | ||||
| 
 | ||||
|     /** | ||||
|      * AccountController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -65,26 +61,21 @@ class UpdateController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/accounts/updateAccount
 | ||||
|      * | ||||
|      * Update account. | ||||
|      * | ||||
|      * @param UpdateRequest $request | ||||
|      * @param Account       $account | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Account $account): JsonResponse | ||||
|     { | ||||
|         Log::debug(sprintf('Now in %s', __METHOD__)); | ||||
|         app('log')->debug(sprintf('Now in %s', __METHOD__)); | ||||
|         $data         = $request->getUpdateData(); | ||||
|         $data['type'] = config('firefly.shortNamesByFullName.' . $account->accountType->type); | ||||
|         $data['type'] = config('firefly.shortNamesByFullName.'.$account->accountType->type); | ||||
|         $account      = $this->repository->update($account, $data); | ||||
|         $manager      = $this->getManager(); | ||||
|         $account->refresh(); | ||||
|         Preferences::mark(); | ||||
|         app('preferences')->mark(); | ||||
| 
 | ||||
|         /** @var AccountTransformer $transformer */ | ||||
|         $transformer = app(AccountTransformer::class); | ||||
|         $transformer  = app(AccountTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
|         $resource     = new Item($account, $transformer, self::RESOURCE_KEY); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -29,6 +29,8 @@ use FireflyIII\Models\Attachment; | ||||
| use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | ||||
| 
 | ||||
| /** | ||||
|  * Class DestroyController | ||||
| @@ -39,8 +41,6 @@ class DestroyController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * DestroyController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -63,14 +63,15 @@ class DestroyController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/attachments/deleteAttachment
 | ||||
|      * | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * | ||||
|      * @param Attachment $attachment | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function destroy(Attachment $attachment): JsonResponse | ||||
|     { | ||||
|         if(true === auth()->user()->hasRole('demo')) { | ||||
|             Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__)); | ||||
| 
 | ||||
|             throw new NotFoundHttpException(); | ||||
|         } | ||||
| 
 | ||||
|         $this->repository->destroy($attachment); | ||||
|         app('preferences')->mark(); | ||||
| 
 | ||||
|   | ||||
| @@ -33,9 +33,11 @@ use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Response as LaravelResponse; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| use League\Fractal\Resource\Item; | ||||
| use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | ||||
| 
 | ||||
| /** | ||||
|  * Class ShowController | ||||
| @@ -46,8 +48,6 @@ class ShowController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * ShowController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -71,13 +71,15 @@ class ShowController extends Controller | ||||
|      * | ||||
|      * Download an attachment. | ||||
|      * | ||||
|      * @param Attachment $attachment | ||||
|      * | ||||
|      * @return LaravelResponse | ||||
|      * @throws   FireflyException | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function download(Attachment $attachment): LaravelResponse | ||||
|     { | ||||
|         if(true === auth()->user()->hasRole('demo')) { | ||||
|             Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__)); | ||||
| 
 | ||||
|             throw new NotFoundHttpException(); | ||||
|         } | ||||
|         if (false === $attachment->uploaded) { | ||||
|             throw new FireflyException('200000: File has not been uploaded (yet).'); | ||||
|         } | ||||
| @@ -85,27 +87,29 @@ class ShowController extends Controller | ||||
|             throw new FireflyException('200000: File has not been uploaded (yet).'); | ||||
|         } | ||||
|         if ($this->repository->exists($attachment)) { | ||||
|             $content = $this->repository->getContent($attachment); | ||||
|             $content  = $this->repository->getContent($attachment); | ||||
|             if ('' === $content) { | ||||
|                 throw new FireflyException('200002: File is empty (zero bytes).'); | ||||
|             } | ||||
|             $quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\')); | ||||
|             $quoted   = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\')); | ||||
| 
 | ||||
|             /** @var LaravelResponse $response */ | ||||
|             $response = response($content); | ||||
|             $response | ||||
|                 ->header('Content-Description', 'File Transfer') | ||||
|                 ->header('Content-Type', 'application/octet-stream') | ||||
|                 ->header('Content-Disposition', 'attachment; filename=' . $quoted) | ||||
|                 ->header('Content-Disposition', 'attachment; filename='.$quoted) | ||||
|                 ->header('Content-Transfer-Encoding', 'binary') | ||||
|                 ->header('Connection', 'Keep-Alive') | ||||
|                 ->header('Expires', '0') | ||||
|                 ->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') | ||||
|                 ->header('Pragma', 'public') | ||||
|                 ->header('Content-Length', (string)strlen($content)); | ||||
|                 ->header('Content-Length', (string)strlen($content)) | ||||
|             ; | ||||
| 
 | ||||
|             return $response; | ||||
|         } | ||||
| 
 | ||||
|         throw new FireflyException('200003: File does not exist.'); | ||||
|     } | ||||
| 
 | ||||
| @@ -115,15 +119,20 @@ class ShowController extends Controller | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         if(true === auth()->user()->hasRole('demo')) { | ||||
|             Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__)); | ||||
| 
 | ||||
|             throw new NotFoundHttpException(); | ||||
|         } | ||||
| 
 | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
| 
 | ||||
|         // get list of attachments. Count it and split it.
 | ||||
|         $collection  = $this->repository->get(); | ||||
| @@ -131,14 +140,14 @@ class ShowController extends Controller | ||||
|         $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.attachments.index') . $this->buildParams()); | ||||
|         $paginator   = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.attachments.index').$this->buildParams()); | ||||
| 
 | ||||
|         /** @var AttachmentTransformer $transformer */ | ||||
|         $transformer = app(AttachmentTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($attachments, $transformer, 'attachments'); | ||||
|         $resource    = new FractalCollection($attachments, $transformer, 'attachments'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -149,19 +158,21 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/attachments/getAttachment
 | ||||
|      * | ||||
|      * Display the specified resource. | ||||
|      * | ||||
|      * @param Attachment $attachment | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Attachment $attachment): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         if(true === auth()->user()->hasRole('demo')) { | ||||
|             Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__)); | ||||
| 
 | ||||
|             throw new NotFoundHttpException(); | ||||
|         } | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var AttachmentTransformer $transformer */ | ||||
|         $transformer = app(AttachmentTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($attachment, $transformer, 'attachments'); | ||||
|         $resource    = new Item($attachment, $transformer, 'attachments'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -36,6 +36,7 @@ use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use League\Fractal\Resource\Item; | ||||
| use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | ||||
| 
 | ||||
| /** | ||||
|  * Class StoreController | ||||
| @@ -46,8 +47,6 @@ class StoreController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * StoreController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -71,43 +70,45 @@ class StoreController extends Controller | ||||
|      * | ||||
|      * Store a newly created resource in storage. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         Log::debug(sprintf('Now in %s', __METHOD__)); | ||||
|         $data       = $request->getAll(); | ||||
|         $attachment = $this->repository->store($data); | ||||
|         $manager    = $this->getManager(); | ||||
|         if(true === auth()->user()->hasRole('demo')) { | ||||
|             Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__)); | ||||
| 
 | ||||
|             throw new NotFoundHttpException(); | ||||
|         } | ||||
|         app('log')->debug(sprintf('Now in %s', __METHOD__)); | ||||
|         $data        = $request->getAll(); | ||||
|         $attachment  = $this->repository->store($data); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var AttachmentTransformer $transformer */ | ||||
|         $transformer = app(AttachmentTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($attachment, $transformer, 'attachments'); | ||||
|         $resource    = new Item($attachment, $transformer, 'attachments'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Upload an attachment. | ||||
|      * | ||||
|      * | ||||
|      * @param Request    $request | ||||
|      * @param Attachment $attachment | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function upload(Request $request, Attachment $attachment): JsonResponse | ||||
|     { | ||||
|         if(true === auth()->user()->hasRole('demo')) { | ||||
|             Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__)); | ||||
| 
 | ||||
|             throw new NotFoundHttpException(); | ||||
|         } | ||||
| 
 | ||||
|         /** @var AttachmentHelperInterface $helper */ | ||||
|         $helper = app(AttachmentHelperInterface::class); | ||||
|         $body   = $request->getContent(); | ||||
|         if ('' === $body) { | ||||
|             Log::error('Body of attachment is empty.'); | ||||
|             app('log')->error('Body of attachment is empty.'); | ||||
| 
 | ||||
|             return response()->json([], 422); | ||||
|         } | ||||
|   | ||||
| @@ -31,7 +31,9 @@ use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; | ||||
| use FireflyIII\Transformers\AttachmentTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use League\Fractal\Resource\Item; | ||||
| use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | ||||
| 
 | ||||
| /** | ||||
|  * Class UpdateController | ||||
| @@ -42,8 +44,6 @@ class UpdateController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * UpdateController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -66,23 +66,23 @@ class UpdateController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/attachments/updateAttachment
 | ||||
|      * | ||||
|      * Update the specified resource in storage. | ||||
|      * | ||||
|      * @param UpdateRequest $request | ||||
|      * @param Attachment    $attachment | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Attachment $attachment): JsonResponse | ||||
|     { | ||||
|         $data = $request->getAll(); | ||||
|         if(true === auth()->user()->hasRole('demo')) { | ||||
|             Log::channel('audit')->warning(sprintf('Demo user tries to access attachment API in %s', __METHOD__)); | ||||
| 
 | ||||
|             throw new NotFoundHttpException(); | ||||
|         } | ||||
|         $data        = $request->getAll(); | ||||
|         $this->repository->update($attachment, $data); | ||||
|         $manager = $this->getManager(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var AttachmentTransformer $transformer */ | ||||
|         $transformer = app(AttachmentTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($attachment, $transformer, 'attachments'); | ||||
|         $resource    = new Item($attachment, $transformer, 'attachments'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -44,8 +44,6 @@ class ShowController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * AvailableBudgetController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -68,18 +66,17 @@ class ShowController extends Controller | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $manager          = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize         = $this->parameters->get('limit'); | ||||
| 
 | ||||
|         $start = $this->parameters->get('start'); | ||||
|         $end   = $this->parameters->get('end'); | ||||
|         $start            = $this->parameters->get('start'); | ||||
|         $end              = $this->parameters->get('end'); | ||||
| 
 | ||||
|         // get list of available budgets. Count it and split it.
 | ||||
|         $collection       = $this->abRepository->getAvailableBudgetsByDate($start, $end); | ||||
| @@ -87,14 +84,14 @@ class ShowController extends Controller | ||||
|         $availableBudgets = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.available-budgets.index') . $this->buildParams()); | ||||
|         $paginator        = new LengthAwarePaginator($availableBudgets, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.available-budgets.index').$this->buildParams()); | ||||
| 
 | ||||
|         /** @var AvailableBudgetTransformer $transformer */ | ||||
|         $transformer = app(AvailableBudgetTransformer::class); | ||||
|         $transformer      = app(AvailableBudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($availableBudgets, $transformer, 'available_budgets'); | ||||
|         $resource         = new FractalCollection($availableBudgets, $transformer, 'available_budgets'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -105,20 +102,16 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/available_budgets/getAvailableBudget
 | ||||
|      * | ||||
|      * Display the specified resource. | ||||
|      * | ||||
|      * @param AvailableBudget $availableBudget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(AvailableBudget $availableBudget): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var AvailableBudgetTransformer $transformer */ | ||||
|         $transformer = app(AvailableBudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($availableBudget, $transformer, 'available_budgets'); | ||||
|         $resource    = new Item($availableBudget, $transformer, 'available_budgets'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -37,8 +37,6 @@ class DestroyController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * BillController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -58,10 +56,6 @@ class DestroyController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/deleteBill
 | ||||
|      * | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Bill $bill | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function destroy(Bill $bill): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -50,8 +50,6 @@ class ListController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * BillController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -72,29 +70,26 @@ class ListController extends Controller | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @param Bill $bill | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function attachments(Bill $bill): JsonResponse | ||||
|     { | ||||
|         $manager    = $this->getManager(); | ||||
|         $pageSize   = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $collection = $this->repository->getAttachments($bill); | ||||
|         $manager     = $this->getManager(); | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         $collection  = $this->repository->getAttachments($bill); | ||||
| 
 | ||||
|         $count       = $collection->count(); | ||||
|         $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.bills.attachments', [$bill->id]) . $this->buildParams()); | ||||
|         $paginator   = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.bills.attachments', [$bill->id]).$this->buildParams()); | ||||
| 
 | ||||
|         /** @var AttachmentTransformer $transformer */ | ||||
|         $transformer = app(AttachmentTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($attachments, $transformer, 'attachments'); | ||||
|         $resource    = new FractalCollection($attachments, $transformer, 'attachments'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -106,31 +101,28 @@ class ListController extends Controller | ||||
|      * | ||||
|      * List all of them. | ||||
|      * | ||||
|      * @param Bill $bill | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function rules(Bill $bill): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
| 
 | ||||
|         // get list of budgets. Count it and split it.
 | ||||
|         $collection = $this->repository->getRulesForBill($bill); | ||||
|         $count      = $collection->count(); | ||||
|         $rules      = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $collection  = $this->repository->getRulesForBill($bill); | ||||
|         $count       = $collection->count(); | ||||
|         $rules       = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.bills.rules', [$bill->id]) . $this->buildParams()); | ||||
|         $paginator   = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.bills.rules', [$bill->id]).$this->buildParams()); | ||||
| 
 | ||||
|         /** @var RuleTransformer $transformer */ | ||||
|         $transformer = app(RuleTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new FractalCollection($rules, $transformer, 'rules'); | ||||
|         $resource    = new FractalCollection($rules, $transformer, 'rules'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -142,28 +134,23 @@ class ListController extends Controller | ||||
|      * | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @param Bill    $bill | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(Request $request, Bill $bill): JsonResponse | ||||
|     { | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $type     = $request->get('type') ?? 'default'; | ||||
|         $pageSize     = $this->parameters->get('limit'); | ||||
|         $type         = $request->get('type') ?? 'default'; | ||||
|         $this->parameters->set('type', $type); | ||||
| 
 | ||||
|         $types   = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager = $this->getManager(); | ||||
|         $types        = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager      = $this->getManager(); | ||||
| 
 | ||||
|         /** @var User $admin */ | ||||
|         $admin = auth()->user(); | ||||
|         $admin        = auth()->user(); | ||||
| 
 | ||||
|         // use new group collector:
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector    = app(GroupCollectorInterface::class); | ||||
|         $collector | ||||
|             ->setUser($admin) | ||||
|             // include source + destination account name and type.
 | ||||
| @@ -175,23 +162,26 @@ class ListController extends Controller | ||||
|             // set page to retrieve
 | ||||
|             ->setPage($this->parameters->get('page')) | ||||
|             // set types of transactions to return.
 | ||||
|             ->setTypes($types); | ||||
|             ->setTypes($types) | ||||
|         ; | ||||
| 
 | ||||
|         // do parameter stuff on new group collector.
 | ||||
|         if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) { | ||||
|             $collector->setRange($this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         if (null !== $this->parameters->get('start')) { | ||||
|             $collector->setStart($this->parameters->get('start')); | ||||
|         } | ||||
|         if (null !== $this->parameters->get('end')) { | ||||
|             $collector->setEnd($this->parameters->get('end')); | ||||
|         } | ||||
| 
 | ||||
|         // get paginator.
 | ||||
|         $paginator = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.bills.transactions', [$bill->id]) . $this->buildParams()); | ||||
|         $paginator    = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.bills.transactions', [$bill->id]).$this->buildParams()); | ||||
|         $transactions = $paginator->getCollection(); | ||||
| 
 | ||||
|         /** @var TransactionGroupTransformer $transformer */ | ||||
|         $transformer = app(TransactionGroupTransformer::class); | ||||
|         $transformer  = app(TransactionGroupTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource     = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|   | ||||
| @@ -43,8 +43,6 @@ class ShowController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * BillController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -65,24 +63,23 @@ class ShowController extends Controller | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $this->repository->correctOrder(); | ||||
|         $bills     = $this->repository->getBills(); | ||||
|         $manager   = $this->getManager(); | ||||
|         $pageSize  = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $count     = $bills->count(); | ||||
|         $bills     = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $bills       = $this->repository->getBills(); | ||||
|         $manager     = $this->getManager(); | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         $count       = $bills->count(); | ||||
|         $bills       = $bills->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator   = new LengthAwarePaginator($bills, $count, $pageSize, $this->parameters->get('page')); | ||||
| 
 | ||||
|         /** @var BillTransformer $transformer */ | ||||
|         $transformer = app(BillTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($bills, $transformer, 'bills'); | ||||
|         $resource    = new FractalCollection($bills, $transformer, 'bills'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -93,19 +90,16 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/getBill
 | ||||
|      * | ||||
|      * Show the specified bill. | ||||
|      * | ||||
|      * @param Bill $bill | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Bill $bill): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var BillTransformer $transformer */ | ||||
|         $transformer = app(BillTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($bill, $transformer, 'bills'); | ||||
|         $resource    = new Item($bill, $transformer, 'bills'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -43,8 +43,6 @@ class StoreController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * BillController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -65,22 +63,19 @@ class StoreController extends Controller | ||||
|      * | ||||
|      * Store a bill. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $data    = $request->getAll(); | ||||
|         $bill    = $this->repository->store($data); | ||||
|         $manager = $this->getManager(); | ||||
|         $data        = $request->getAll(); | ||||
|         $bill        = $this->repository->store($data); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var BillTransformer $transformer */ | ||||
|         $transformer = app(BillTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($bill, $transformer, 'bills'); | ||||
|         $resource    = new Item($bill, $transformer, 'bills'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -40,8 +40,6 @@ class UpdateController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * BillController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -61,23 +59,18 @@ class UpdateController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/bills/updateBill
 | ||||
|      * | ||||
|      * Update a bill. | ||||
|      * | ||||
|      * @param UpdateRequest $request | ||||
|      * @param Bill          $bill | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Bill $bill): JsonResponse | ||||
|     { | ||||
|         $data    = $request->getAll(); | ||||
|         $bill    = $this->repository->update($bill, $data); | ||||
|         $manager = $this->getManager(); | ||||
|         $data        = $request->getAll(); | ||||
|         $bill        = $this->repository->update($bill, $data); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var BillTransformer $transformer */ | ||||
|         $transformer = app(BillTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($bill, $transformer, 'bills'); | ||||
|         $resource    = new Item($bill, $transformer, 'bills'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -37,8 +37,6 @@ class DestroyController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * DestroyController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -58,10 +56,6 @@ class DestroyController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/deleteBudget
 | ||||
|      * | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Budget $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function destroy(Budget $budget): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -40,9 +40,7 @@ use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| 
 | ||||
| /*** | ||||
|  * Class ListController | ||||
|  */ | ||||
| // Class ListController
 | ||||
| class ListController extends Controller | ||||
| { | ||||
|     use TransactionFilter; | ||||
| @@ -52,8 +50,6 @@ class ListController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * ListController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -74,29 +70,26 @@ class ListController extends Controller | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listAttachmentByBudget
 | ||||
|      * | ||||
|      * @param Budget $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function attachments(Budget $budget): JsonResponse | ||||
|     { | ||||
|         $manager    = $this->getManager(); | ||||
|         $pageSize   = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $collection = $this->repository->getAttachments($budget); | ||||
|         $manager     = $this->getManager(); | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         $collection  = $this->repository->getAttachments($budget); | ||||
| 
 | ||||
|         $count       = $collection->count(); | ||||
|         $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.attachments', [$budget->id]) . $this->buildParams()); | ||||
|         $paginator   = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.attachments', [$budget->id]).$this->buildParams()); | ||||
| 
 | ||||
|         /** @var AttachmentTransformer $transformer */ | ||||
|         $transformer = app(AttachmentTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($attachments, $transformer, 'attachments'); | ||||
|         $resource    = new FractalCollection($attachments, $transformer, 'attachments'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -108,26 +101,23 @@ class ListController extends Controller | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @param Budget $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function budgetLimits(Budget $budget): JsonResponse | ||||
|     { | ||||
|         $manager  = $this->getManager(); | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $manager      = $this->getManager(); | ||||
|         $pageSize     = $this->parameters->get('limit'); | ||||
|         $this->parameters->set('budget_id', $budget->id); | ||||
|         $collection   = $this->blRepository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         $count        = $collection->count(); | ||||
|         $budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.budget-limits', [$budget->id]) . $this->buildParams()); | ||||
|         $paginator->setPath(route('api.v1.budgets.budget-limits', [$budget->id]).$this->buildParams()); | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer  = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits'); | ||||
|         $resource     = new FractalCollection($budgetLimits, $transformer, 'budget_limits'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -139,35 +129,24 @@ class ListController extends Controller | ||||
|      * | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @param Budget  $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(Request $request, Budget $budget): JsonResponse | ||||
|     { | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize     = $this->parameters->get('limit'); | ||||
| 
 | ||||
|         // user can overrule page size with limit parameter.
 | ||||
|         $limit = $this->parameters->get('limit'); | ||||
|         if (null !== $limit && $limit > 0) { | ||||
|             $pageSize = $limit; | ||||
|         } | ||||
| 
 | ||||
|         $type = $request->get('type') ?? 'default'; | ||||
|         $type         = $request->get('type') ?? 'default'; | ||||
|         $this->parameters->set('type', $type); | ||||
| 
 | ||||
|         $types   = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager = $this->getManager(); | ||||
|         $types        = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager      = $this->getManager(); | ||||
| 
 | ||||
|         /** @var User $admin */ | ||||
|         $admin = auth()->user(); | ||||
|         $admin        = auth()->user(); | ||||
| 
 | ||||
|         // use new group collector:
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector    = app(GroupCollectorInterface::class); | ||||
|         $collector | ||||
|             ->setUser($admin) | ||||
|             // filter on budget.
 | ||||
| @@ -179,20 +158,24 @@ class ListController extends Controller | ||||
|             // set page to retrieve
 | ||||
|             ->setPage($this->parameters->get('page')) | ||||
|             // set types of transactions to return.
 | ||||
|             ->setTypes($types); | ||||
|             ->setTypes($types) | ||||
|         ; | ||||
| 
 | ||||
|         if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) { | ||||
|             $collector->setRange($this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         if (null !== $this->parameters->get('start')) { | ||||
|             $collector->setStart($this->parameters->get('start')); | ||||
|         } | ||||
|         if (null !== $this->parameters->get('end')) { | ||||
|             $collector->setEnd($this->parameters->get('end')); | ||||
|         } | ||||
| 
 | ||||
|         $paginator = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.budgets.transactions', [$budget->id]) . $this->buildParams()); | ||||
|         $paginator    = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.budgets.transactions', [$budget->id]).$this->buildParams()); | ||||
|         $transactions = $paginator->getCollection(); | ||||
| 
 | ||||
|         /** @var TransactionGroupTransformer $transformer */ | ||||
|         $transformer = app(TransactionGroupTransformer::class); | ||||
|         $transformer  = app(TransactionGroupTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource     = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -204,33 +187,24 @@ class ListController extends Controller | ||||
|      * | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function withoutBudget(Request $request): JsonResponse | ||||
|     { | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize     = $this->parameters->get('limit'); | ||||
| 
 | ||||
|         // user can overrule page size with limit parameter.
 | ||||
|         $limit = $this->parameters->get('limit'); | ||||
|         if (null !== $limit && $limit > 0) { | ||||
|             $pageSize = $limit; | ||||
|         } | ||||
| 
 | ||||
|         $type = $request->get('type') ?? 'default'; | ||||
|         $type         = $request->get('type') ?? 'default'; | ||||
|         $this->parameters->set('type', $type); | ||||
| 
 | ||||
|         $types   = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager = $this->getManager(); | ||||
|         $types        = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager      = $this->getManager(); | ||||
| 
 | ||||
|         /** @var User $admin */ | ||||
|         $admin = auth()->user(); | ||||
|         $admin        = auth()->user(); | ||||
| 
 | ||||
|         // use new group collector:
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector    = app(GroupCollectorInterface::class); | ||||
|         $collector | ||||
|             ->setUser($admin) | ||||
|             // filter on budget.
 | ||||
| @@ -242,20 +216,24 @@ class ListController extends Controller | ||||
|             // set page to retrieve
 | ||||
|             ->setPage($this->parameters->get('page')) | ||||
|             // set types of transactions to return.
 | ||||
|             ->setTypes($types); | ||||
|             ->setTypes($types) | ||||
|         ; | ||||
| 
 | ||||
|         if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) { | ||||
|             $collector->setRange($this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         if (null !== $this->parameters->get('start')) { | ||||
|             $collector->setStart($this->parameters->get('start')); | ||||
|         } | ||||
|         if (null !== $this->parameters->get('end')) { | ||||
|             $collector->setEnd($this->parameters->get('end')); | ||||
|         } | ||||
| 
 | ||||
|         $paginator = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.budgets.without-budget') . $this->buildParams()); | ||||
|         $paginator    = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.budgets.without-budget').$this->buildParams()); | ||||
|         $transactions = $paginator->getCollection(); | ||||
| 
 | ||||
|         /** @var TransactionGroupTransformer $transformer */ | ||||
|         $transformer = app(TransactionGroupTransformer::class); | ||||
|         $transformer  = app(TransactionGroupTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource     = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|   | ||||
| @@ -45,8 +45,6 @@ class ShowController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * ListController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -69,30 +67,29 @@ class ShowController extends Controller | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
| 
 | ||||
|         // get list of budgets. Count it and split it.
 | ||||
|         $collection = $this->repository->getBudgets(); | ||||
|         $count      = $collection->count(); | ||||
|         $budgets    = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $collection  = $this->repository->getBudgets(); | ||||
|         $count       = $collection->count(); | ||||
|         $budgets     = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($budgets, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.index') . $this->buildParams()); | ||||
|         $paginator   = new LengthAwarePaginator($budgets, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.index').$this->buildParams()); | ||||
| 
 | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($budgets, $transformer, 'budgets'); | ||||
|         $resource    = new FractalCollection($budgets, $transformer, 'budgets'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -100,20 +97,16 @@ class ShowController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * Show a budget. | ||||
|      * | ||||
|      * @param Budget $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Budget $budget): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($budget, $transformer, 'budgets'); | ||||
|         $resource    = new Item($budget, $transformer, 'budgets'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -40,8 +40,6 @@ class StoreController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * StoreController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -62,23 +60,19 @@ class StoreController extends Controller | ||||
|      * | ||||
|      * Store a budget. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      * | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $budget = $this->repository->store($request->getAll()); | ||||
|         $budget      = $this->repository->store($request->getAll()); | ||||
|         $budget->refresh(); | ||||
|         $manager = $this->getManager(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($budget, $transformer, 'budgets'); | ||||
|         $resource    = new Item($budget, $transformer, 'budgets'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -40,8 +40,6 @@ class UpdateController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * UpdateController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -61,23 +59,18 @@ class UpdateController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/updateBudget
 | ||||
|      * | ||||
|      * Update a budget. | ||||
|      * | ||||
|      * @param UpdateRequest $request | ||||
|      * @param Budget        $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Budget $budget): JsonResponse | ||||
|     { | ||||
|         $data    = $request->getAll(); | ||||
|         $budget  = $this->repository->update($budget, $data); | ||||
|         $manager = $this->getManager(); | ||||
|         $data        = $request->getAll(); | ||||
|         $budget      = $this->repository->update($budget, $data); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var BudgetTransformer $transformer */ | ||||
|         $transformer = app(BudgetTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($budget, $transformer, 'budgets'); | ||||
|         $resource    = new Item($budget, $transformer, 'budgets'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -40,8 +40,6 @@ class DestroyController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * BudgetLimitController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -64,10 +62,6 @@ class DestroyController extends Controller | ||||
|      * | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Budget      $budget | ||||
|      * @param BudgetLimit $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function destroy(Budget $budget, BudgetLimit $budgetLimit): JsonResponse | ||||
|   | ||||
| @@ -28,7 +28,6 @@ use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Helpers\Collector\GroupCollectorInterface; | ||||
| use FireflyIII\Models\Budget; | ||||
| use FireflyIII\Models\BudgetLimit; | ||||
| use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; | ||||
| use FireflyIII\Support\Http\Api\TransactionFilter; | ||||
| use FireflyIII\Transformers\TransactionGroupTransformer; | ||||
| use FireflyIII\User; | ||||
| @@ -44,55 +43,28 @@ class ListController extends Controller | ||||
| { | ||||
|     use TransactionFilter; | ||||
| 
 | ||||
|     private BudgetLimitRepositoryInterface $blRepository; | ||||
| 
 | ||||
|     /** | ||||
|      * BudgetLimitController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
|         parent::__construct(); | ||||
|         $this->middleware( | ||||
|             function ($request, $next) { | ||||
|                 /** @var User $user */ | ||||
|                 $user               = auth()->user(); | ||||
|                 $this->blRepository = app(BudgetLimitRepositoryInterface::class); | ||||
|                 $this->blRepository->setUser($user); | ||||
| 
 | ||||
|                 return $next($request); | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listTransactionByBudgetLimit
 | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @param Request     $request | ||||
|      * @param Budget      $budget | ||||
|      * @param BudgetLimit $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(Request $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $type     = $request->get('type') ?? 'default'; | ||||
|         $pageSize     = $this->parameters->get('limit'); | ||||
|         $type         = $request->get('type') ?? 'default'; | ||||
|         $this->parameters->set('type', $type); | ||||
| 
 | ||||
|         $types   = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager = $this->getManager(); | ||||
|         $types        = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager      = $this->getManager(); | ||||
| 
 | ||||
|         /** @var User $admin */ | ||||
|         $admin = auth()->user(); | ||||
|         $admin        = auth()->user(); | ||||
| 
 | ||||
|         // use new group collector:
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector    = app(GroupCollectorInterface::class); | ||||
|         $collector | ||||
|             ->setUser($admin) | ||||
|             // filter on budget.
 | ||||
| @@ -104,19 +76,20 @@ class ListController extends Controller | ||||
|             // set page to retrieve
 | ||||
|             ->setPage($this->parameters->get('page')) | ||||
|             // set types of transactions to return.
 | ||||
|             ->setTypes($types); | ||||
|             ->setTypes($types) | ||||
|         ; | ||||
| 
 | ||||
|         $collector->setRange($budgetLimit->start_date, $budgetLimit->end_date); | ||||
|         $collector->setTypes($types); | ||||
|         $paginator = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.budgets.limits.transactions', [$budget->id, $budgetLimit->id]) . $this->buildParams()); | ||||
|         $paginator    = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.budgets.limits.transactions', [$budget->id, $budgetLimit->id]).$this->buildParams()); | ||||
|         $transactions = $paginator->getCollection(); | ||||
| 
 | ||||
|         /** @var TransactionGroupTransformer $transformer */ | ||||
|         $transformer = app(TransactionGroupTransformer::class); | ||||
|         $transformer  = app(TransactionGroupTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource     = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|   | ||||
| @@ -33,7 +33,6 @@ use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; | ||||
| use FireflyIII\Transformers\BudgetLimitTransformer; | ||||
| use FireflyIII\User; | ||||
| use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use League\Fractal\Pagination\IlluminatePaginatorAdapter; | ||||
| use League\Fractal\Resource\Collection as FractalCollection; | ||||
| @@ -49,8 +48,6 @@ class ShowController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * BudgetLimitController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -74,29 +71,23 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/listBudgetLimitByBudget
 | ||||
|      * | ||||
|      * Display a listing of the budget limits for this budget. | ||||
|      * | ||||
|      * @param Request $request | ||||
|      * @param Budget  $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(Request $request, Budget $budget): JsonResponse | ||||
|     public function index(Budget $budget): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $manager      = $this->getManager(); | ||||
|         $manager->parseIncludes('budget'); | ||||
|         $pageSize     = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize     = $this->parameters->get('limit'); | ||||
|         $collection   = $this->blRepository->getBudgetLimits($budget, $this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         $count        = $collection->count(); | ||||
|         $budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budgets.limits.index', [$budget->id]) . $this->buildParams()); | ||||
|         $paginator->setPath(route('api.v1.budgets.limits.index', [$budget->id]).$this->buildParams()); | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer  = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits'); | ||||
|         $resource     = new FractalCollection($budgetLimits, $transformer, 'budget_limits'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -108,27 +99,24 @@ class ShowController extends Controller | ||||
|      * | ||||
|      * Display a listing of the budget limits for this budget. | ||||
|      * | ||||
|      * @param SameDateRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      * @SuppressWarnings(PHPMD.UnusedFormalParameter) | ||||
|      */ | ||||
|     public function indexAll(SameDateRequest $request): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $manager      = $this->getManager(); | ||||
|         $manager->parseIncludes('budget'); | ||||
|         $pageSize     = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize     = $this->parameters->get('limit'); | ||||
|         $collection   = $this->blRepository->getAllBudgetLimits($this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         $count        = $collection->count(); | ||||
|         $budgetLimits = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $paginator    = new LengthAwarePaginator($budgetLimits, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.budget-limits.index') . $this->buildParams()); | ||||
|         $paginator->setPath(route('api.v1.budget-limits.index').$this->buildParams()); | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer  = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($budgetLimits, $transformer, 'budget_limits'); | ||||
|         $resource     = new FractalCollection($budgetLimits, $transformer, 'budget_limits'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -138,26 +126,21 @@ class ShowController extends Controller | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/getBudgetLimit
 | ||||
|      * | ||||
|      * @param Request     $request | ||||
|      * @param Budget      $budget | ||||
|      * @param BudgetLimit $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function show(Request $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse | ||||
|     public function show(Budget $budget, BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|         if ((int)$budget->id !== (int)$budgetLimit->budget_id) { | ||||
|         if ($budget->id !== $budgetLimit->budget_id) { | ||||
|             throw new FireflyException('20028: The budget limit does not belong to the budget.'); | ||||
|         } | ||||
|         // continue!
 | ||||
|         $manager = $this->getManager(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($budgetLimit, $transformer, 'budget_limits'); | ||||
|         $resource    = new Item($budgetLimit, $transformer, 'budget_limits'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -41,8 +41,6 @@ class StoreController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * BudgetLimitController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -64,11 +62,6 @@ class StoreController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/storeBudgetLimit
 | ||||
|      * | ||||
|      * Store a newly created resource in storage. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * @param Budget       $budget | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function store(StoreRequest $request, Budget $budget): JsonResponse | ||||
|     { | ||||
| @@ -77,13 +70,14 @@ class StoreController extends Controller | ||||
|         $data['end_date']   = $data['end']; | ||||
|         $data['budget_id']  = $budget->id; | ||||
| 
 | ||||
|         $budgetLimit = $this->blRepository->store($data); | ||||
|         $manager     = $this->getManager(); | ||||
|         $budgetLimit        = $this->blRepository->store($data); | ||||
|         $manager            = $this->getManager(); | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer        = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($budgetLimit, $transformer, 'budget_limits'); | ||||
|         $resource           = new Item($budgetLimit, $transformer, 'budget_limits'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -46,8 +46,6 @@ class UpdateController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/updateBudgetLimit
 | ||||
|      * | ||||
|      * BudgetLimitController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -69,16 +67,11 @@ class UpdateController extends Controller | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/budgets/updateBudgetLimit
 | ||||
|      * | ||||
|      * @param UpdateRequest $request | ||||
|      * @param Budget        $budget | ||||
|      * @param BudgetLimit   $budgetLimit | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function update(UpdateRequest $request, Budget $budget, BudgetLimit $budgetLimit): JsonResponse | ||||
|     { | ||||
|         if ((int)$budget->id !== (int)$budgetLimit->budget_id) { | ||||
|         if ($budget->id !== $budgetLimit->budget_id) { | ||||
|             throw new FireflyException('20028: The budget limit does not belong to the budget.'); | ||||
|         } | ||||
|         $data              = $request->getAll(); | ||||
| @@ -87,10 +80,10 @@ class UpdateController extends Controller | ||||
|         $manager           = $this->getManager(); | ||||
| 
 | ||||
|         /** @var BudgetLimitTransformer $transformer */ | ||||
|         $transformer = app(BudgetLimitTransformer::class); | ||||
|         $transformer       = app(BudgetLimitTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($budgetLimit, $transformer, 'budget_limits'); | ||||
|         $resource          = new Item($budgetLimit, $transformer, 'budget_limits'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -37,8 +37,6 @@ class DestroyController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * CategoryController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -58,10 +56,6 @@ class DestroyController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/categories/deleteCategory
 | ||||
|      * | ||||
|      * Remove the specified resource from storage. | ||||
|      * | ||||
|      * @param Category $category | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function destroy(Category $category): JsonResponse | ||||
|     { | ||||
|   | ||||
| @@ -49,8 +49,6 @@ class ListController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * CategoryController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -69,29 +67,26 @@ class ListController extends Controller | ||||
|      * This endpoint is documented at: | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/categories/listAttachmentByCategory
 | ||||
|      * | ||||
|      * @param Category $category | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function attachments(Category $category): JsonResponse | ||||
|     { | ||||
|         $manager    = $this->getManager(); | ||||
|         $pageSize   = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $collection = $this->repository->getAttachments($category); | ||||
|         $manager     = $this->getManager(); | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
|         $collection  = $this->repository->getAttachments($category); | ||||
| 
 | ||||
|         $count       = $collection->count(); | ||||
|         $attachments = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.categories.attachments', [$category->id]) . $this->buildParams()); | ||||
|         $paginator   = new LengthAwarePaginator($attachments, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.categories.attachments', [$category->id]).$this->buildParams()); | ||||
| 
 | ||||
|         /** @var AttachmentTransformer $transformer */ | ||||
|         $transformer = app(AttachmentTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($attachments, $transformer, 'attachments'); | ||||
|         $resource    = new FractalCollection($attachments, $transformer, 'attachments'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -103,28 +98,23 @@ class ListController extends Controller | ||||
|      * | ||||
|      * Show all transactions. | ||||
|      * | ||||
|      * @param Request  $request | ||||
|      * | ||||
|      * @param Category $category | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function transactions(Request $request, Category $category): JsonResponse | ||||
|     { | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $type     = $request->get('type') ?? 'default'; | ||||
|         $pageSize     = $this->parameters->get('limit'); | ||||
|         $type         = $request->get('type') ?? 'default'; | ||||
|         $this->parameters->set('type', $type); | ||||
| 
 | ||||
|         $types   = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager = $this->getManager(); | ||||
|         $types        = $this->mapTransactionTypes($this->parameters->get('type')); | ||||
|         $manager      = $this->getManager(); | ||||
| 
 | ||||
|         /** @var User $admin */ | ||||
|         $admin = auth()->user(); | ||||
|         $admin        = auth()->user(); | ||||
| 
 | ||||
|         // use new group collector:
 | ||||
|         /** @var GroupCollectorInterface $collector */ | ||||
|         $collector = app(GroupCollectorInterface::class); | ||||
|         $collector    = app(GroupCollectorInterface::class); | ||||
|         $collector | ||||
|             ->setUser($admin) | ||||
|             // filter on category.
 | ||||
| @@ -136,21 +126,25 @@ class ListController extends Controller | ||||
|             // set page to retrieve
 | ||||
|             ->setPage($this->parameters->get('page')) | ||||
|             // set types of transactions to return.
 | ||||
|             ->setTypes($types); | ||||
|             ->setTypes($types) | ||||
|         ; | ||||
| 
 | ||||
|         if (null !== $this->parameters->get('start') && null !== $this->parameters->get('end')) { | ||||
|             $collector->setRange($this->parameters->get('start'), $this->parameters->get('end')); | ||||
|         if (null !== $this->parameters->get('start')) { | ||||
|             $collector->setStart($this->parameters->get('start')); | ||||
|         } | ||||
|         if (null !== $this->parameters->get('end')) { | ||||
|             $collector->setEnd($this->parameters->get('end')); | ||||
|         } | ||||
| 
 | ||||
|         $paginator = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.categories.transactions', [$category->id]) . $this->buildParams()); | ||||
|         $paginator    = $collector->getPaginatedGroups(); | ||||
|         $paginator->setPath(route('api.v1.categories.transactions', [$category->id]).$this->buildParams()); | ||||
|         $transactions = $paginator->getCollection(); | ||||
| 
 | ||||
|         /** @var TransactionGroupTransformer $transformer */ | ||||
|         $transformer = app(TransactionGroupTransformer::class); | ||||
|         $transformer  = app(TransactionGroupTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource     = new FractalCollection($transactions, $transformer, 'transactions'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|   | ||||
| @@ -43,8 +43,6 @@ class ShowController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * CategoryController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -65,29 +63,28 @@ class ShowController extends Controller | ||||
|      * | ||||
|      * Display a listing of the resource. | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function index(): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         // types to get, page size:
 | ||||
|         $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data; | ||||
|         $pageSize    = $this->parameters->get('limit'); | ||||
| 
 | ||||
|         // get list of budgets. Count it and split it.
 | ||||
|         $collection = $this->repository->getCategories(); | ||||
|         $count      = $collection->count(); | ||||
|         $categories = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
|         $collection  = $this->repository->getCategories(); | ||||
|         $count       = $collection->count(); | ||||
|         $categories  = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $paginator = new LengthAwarePaginator($categories, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.categories.index') . $this->buildParams()); | ||||
|         $paginator   = new LengthAwarePaginator($categories, $count, $pageSize, $this->parameters->get('page')); | ||||
|         $paginator->setPath(route('api.v1.categories.index').$this->buildParams()); | ||||
| 
 | ||||
|         /** @var CategoryTransformer $transformer */ | ||||
|         $transformer = app(CategoryTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
|         $resource = new FractalCollection($categories, $transformer, 'categories'); | ||||
|         $resource    = new FractalCollection($categories, $transformer, 'categories'); | ||||
|         $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
| @@ -98,20 +95,16 @@ class ShowController extends Controller | ||||
|      * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/categories/getCategory
 | ||||
|      * | ||||
|      * Show the category. | ||||
|      * | ||||
|      * @param Category $category | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      */ | ||||
|     public function show(Category $category): JsonResponse | ||||
|     { | ||||
|         $manager = $this->getManager(); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var CategoryTransformer $transformer */ | ||||
|         $transformer = app(CategoryTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($category, $transformer, 'categories'); | ||||
|         $resource    = new Item($category, $transformer, 'categories'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
| @@ -40,8 +40,6 @@ class StoreController extends Controller | ||||
| 
 | ||||
|     /** | ||||
|      * CategoryController constructor. | ||||
|      * | ||||
| 
 | ||||
|      */ | ||||
|     public function __construct() | ||||
|     { | ||||
| @@ -62,21 +60,18 @@ class StoreController extends Controller | ||||
|      * | ||||
|      * Store new category. | ||||
|      * | ||||
|      * @param StoreRequest $request | ||||
|      * | ||||
|      * @return JsonResponse | ||||
|      * @throws FireflyException | ||||
|      */ | ||||
|     public function store(StoreRequest $request): JsonResponse | ||||
|     { | ||||
|         $category = $this->repository->store($request->getAll()); | ||||
|         $manager  = $this->getManager(); | ||||
|         $category    = $this->repository->store($request->getAll()); | ||||
|         $manager     = $this->getManager(); | ||||
| 
 | ||||
|         /** @var CategoryTransformer $transformer */ | ||||
|         $transformer = app(CategoryTransformer::class); | ||||
|         $transformer->setParameters($this->parameters); | ||||
| 
 | ||||
|         $resource = new Item($category, $transformer, 'categories'); | ||||
|         $resource    = new Item($category, $transformer, 'categories'); | ||||
| 
 | ||||
|         return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); | ||||
|     } | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user