Compare commits

..

1651 Commits

Author SHA1 Message Date
a3bde81378 Tower: unpublish cx_web_refresh_from_backend — remove source from 16.0 branch 2026-05-02 11:16:28 +00:00
86d79da36b Tower: unpublish web_notify — remove source from 16.0 branch 2026-05-02 11:16:21 +00:00
425b6ee820 Tower: unpublish queue_job — remove source from 16.0 branch 2026-05-02 11:15:18 +00:00
310c606270 Tower: unpublish cetmix_tower_yaml — remove source from 16.0 branch 2026-05-02 11:14:57 +00:00
2b70b8beb7 Tower: unpublish cetmix_tower_webhook — remove source from 16.0 branch 2026-05-02 11:14:50 +00:00
25daae9eef Tower: unpublish cetmix_tower_server_queue — remove source from 16.0 branch 2026-05-02 11:14:40 +00:00
10ee25b1ac Tower: unpublish cetmix_tower_server — remove source from 16.0 branch 2026-05-02 11:14:31 +00:00
ea03d56c8e Tower: unpublish cetmix_tower_git — remove source from 16.0 branch 2026-05-02 11:14:23 +00:00
96a2438b13 Tower: unpublish rpc_helper — remove source from 16.0 branch 2026-05-02 11:14:16 +00:00
46b73edadf Tower: unpublish cetmix_tower — remove source from 16.0 branch 2026-05-02 11:14:02 +00:00
7d35b4a377 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:50 +00:00
bd4df2fc3e Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:49 +00:00
6991e4956c Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:49 +00:00
807c474af4 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:48 +00:00
62e3b75c64 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:47 +00:00
a875de6ab9 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:47 +00:00
adf867464e Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:46 +00:00
9ed6dddba1 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:45 +00:00
45bacfa973 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:44 +00:00
ebade46d0a Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:44 +00:00
f63282ef6d Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:43 +00:00
9fe857ebd7 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:42 +00:00
f37d7240fc Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:42 +00:00
6376ea081d Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:41 +00:00
1ff139ba75 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:41 +00:00
6d40e0caa6 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:40 +00:00
be10c7bdd8 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:39 +00:00
8b0af310fc Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:38 +00:00
a1145a7773 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:38 +00:00
773a390bed Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:37 +00:00
5c61e3dfad Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:36 +00:00
f7a44ace9e Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:36 +00:00
c688b17afb Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:35 +00:00
d7337681f6 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:34 +00:00
44f11fa3ab Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:34 +00:00
204c353b16 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:33 +00:00
b0e561d572 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:32 +00:00
f2423bd49d Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:32 +00:00
5520ca5d4f Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:31 +00:00
e5f4d4483e Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:30 +00:00
dcc929a326 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:29 +00:00
87828837c6 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:28 +00:00
71cf5380ff Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:28 +00:00
a592f6cc70 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:27 +00:00
4c8d4f5f7d Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:26 +00:00
ac1a9b8cdc Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:26 +00:00
ce13daaa58 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:25 +00:00
20540056fa Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:24 +00:00
3f481c75d4 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:24 +00:00
5b59a07033 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:23 +00:00
8b1fb96368 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:22 +00:00
5c8f90ff77 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:21 +00:00
0667f24bd7 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:21 +00:00
54ac099597 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:20 +00:00
7341099882 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:19 +00:00
cc78bca1dc Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:19 +00:00
734b356286 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:18 +00:00
4dd14c3fa0 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:18 +00:00
b29092491b Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:17 +00:00
255ec20637 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:16 +00:00
b70114419a Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:16 +00:00
4e5ceb11fb Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:15 +00:00
ab4ea51bff Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:14 +00:00
02fc2bbc84 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:14 +00:00
7aa2cf424a Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:13 +00:00
5e6726ee08 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:12 +00:00
f6f43fbca2 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:11 +00:00
e161f17642 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:11 +00:00
c661356c1f Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:10 +00:00
2001a64180 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:10 +00:00
99d1daa1e8 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:09 +00:00
fa1a7d42e1 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:08 +00:00
6d90045065 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:07 +00:00
88f656b55c Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:07 +00:00
a0b28de2bf Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:06 +00:00
f810819876 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:06 +00:00
739fb53837 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:05 +00:00
6f8ed82b4c Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:04 +00:00
9309fb6768 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:03 +00:00
8da7e5a08b Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:03 +00:00
b15f459f58 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:02 +00:00
0a657d2f43 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:02 +00:00
31fea6f015 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:01 +00:00
601b399d65 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 10:44:00 +00:00
Tower Deploy
7cef9f1a32 Wipe cetmix_tower_yaml (polluted by overlapping uploads) 2026-04-27 13:43:58 +03:00
18dd9c7a1f Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:29 +00:00
1c6d6b1dcc Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:29 +00:00
b3d78f3f06 Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:28 +00:00
5d5fbb835e Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:28 +00:00
f259d7da1b Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:27 +00:00
433f68b5a4 Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:27 +00:00
3729ee8cd6 Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:26 +00:00
261e8aea62 Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:25 +00:00
a1dd66ec6a Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:25 +00:00
f579fbc83f Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:24 +00:00
bd2cfbcc3d Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:24 +00:00
9c009dddb5 Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:23 +00:00
fd94630e79 Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:22 +00:00
c8274bd0a6 Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:22 +00:00
4bea3edbeb Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:21 +00:00
3aa73a29a5 Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:20 +00:00
5934b7cf4d Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:20 +00:00
39f0b6d406 Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:19 +00:00
1c1a16a55a Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:18 +00:00
991507c29a Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:18 +00:00
553f5fa25f Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:17 +00:00
8c5ef8bfd2 Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:17 +00:00
4e0580a2b4 Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:16 +00:00
451e109b7f Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:15 +00:00
fa79d8c15d Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:15 +00:00
55800608ec Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:14 +00:00
63e66334af Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:14 +00:00
4b7d2f2efc Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:13 +00:00
a7b02a742a Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:12 +00:00
825ad03236 Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:12 +00:00
484763b809 Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:11 +00:00
b0d2c5668c Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:11 +00:00
444278accb Tower: upload web_notify 16.0.3.2.0 (via marketplace) 2026-04-27 08:47:10 +00:00
c8b19a8c62 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:09 +00:00
1a3285cdc4 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:08 +00:00
cd55fd9f19 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:08 +00:00
d75d397e6a Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:07 +00:00
4e95aa47de Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:06 +00:00
0911b0d951 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:06 +00:00
1ea59d44f0 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:05 +00:00
b4fcbfdf2a Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:04 +00:00
cca99e065a Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:04 +00:00
ec6e3c8fd2 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:03 +00:00
2c1d9c3ef2 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:03 +00:00
583dd0dd15 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:02 +00:00
66ae014a38 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:01 +00:00
b2f175536a Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:01 +00:00
6794a1b842 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:47:00 +00:00
191f857aff Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:46:59 +00:00
bf6065aeb7 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:46:59 +00:00
00e6ff7e78 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:46:58 +00:00
1f5b011fce Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:46:58 +00:00
61db219e01 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:46:57 +00:00
771994f944 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:46:56 +00:00
def74bd656 Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:46:56 +00:00
6e4be30e3a Tower: upload rpc_helper 16.0.1.0.0 (via marketplace) 2026-04-27 08:46:55 +00:00
96a2eeda3a Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:54 +00:00
a6209db573 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:53 +00:00
bfc350252a Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:53 +00:00
64efc9b0b4 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:52 +00:00
8d4ddfb7d2 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:51 +00:00
447b8431e6 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:51 +00:00
007783c1e2 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:50 +00:00
72a4524aed Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:50 +00:00
7e37a29bee Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:49 +00:00
1f0cf23801 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:48 +00:00
999a996df8 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:48 +00:00
8966de83af Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:47 +00:00
403368df7a Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:47 +00:00
fef59e7a73 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:46 +00:00
c2285f865e Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:45 +00:00
34d8248b79 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:45 +00:00
f64852997f Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:44 +00:00
fcf45b130e Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:43 +00:00
fd4665364d Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:43 +00:00
91a344cbc2 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:43 +00:00
7b8f5090db Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:42 +00:00
e2039f54f4 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:41 +00:00
445b34f452 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:40 +00:00
c3a4151359 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:40 +00:00
c05ba71bcd Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:39 +00:00
389a32d760 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:39 +00:00
609ef99c44 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:38 +00:00
71e98f5b3f Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:37 +00:00
25052f2e2d Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:37 +00:00
a5c0f76f89 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:36 +00:00
81d2547e9d Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:36 +00:00
a0c172c649 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:35 +00:00
8a65785c52 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:34 +00:00
85fff4657e Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:34 +00:00
114449be53 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:33 +00:00
df1dabb253 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:33 +00:00
65094d2031 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:32 +00:00
9d8a226283 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:31 +00:00
7bff54cb58 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:31 +00:00
4f9f60b121 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:30 +00:00
f0cee69a24 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:30 +00:00
0d6e910d3e Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:29 +00:00
64f515e11b Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:28 +00:00
ef22709eb7 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:28 +00:00
65c6df9940 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:27 +00:00
cbc12f44b8 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:27 +00:00
45eba87eda Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:26 +00:00
510be1ffcb Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:25 +00:00
9ceb54d29c Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:25 +00:00
942da80b9c Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:24 +00:00
3da4cc2dec Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:23 +00:00
b4572fa6f1 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:23 +00:00
01f5ee1c46 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:22 +00:00
952b235888 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:22 +00:00
f98c11412d Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:21 +00:00
a8e27776d3 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:20 +00:00
6038b70592 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:20 +00:00
e259a897fe Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:19 +00:00
05027ef13c Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:19 +00:00
d65b12bc80 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:18 +00:00
905d4a6c04 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:17 +00:00
a213ef10a8 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:17 +00:00
f2b16e50a7 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:16 +00:00
4d25cf4ade Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:16 +00:00
82b2acd792 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:15 +00:00
7522999082 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:14 +00:00
f8e694b71a Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:14 +00:00
83cbdf54e9 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:13 +00:00
7744f3212d Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:13 +00:00
b55049d482 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:12 +00:00
54f981fd25 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:11 +00:00
7d753b772a Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:11 +00:00
cd8e63eb08 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:10 +00:00
29f5780312 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:10 +00:00
6dd6679e9a Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:09 +00:00
26c795216e Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:08 +00:00
5b40d83c0c Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:08 +00:00
22279e8c98 Tower: upload queue_job 16.0.2.12.0 (via marketplace) 2026-04-27 08:46:07 +00:00
09bc143899 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:46:06 +00:00
d29af3f5ad Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:46:05 +00:00
7441874199 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:46:05 +00:00
068638b20a Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:46:04 +00:00
5c65820935 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:46:03 +00:00
748b61b2f6 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:46:03 +00:00
70d359dd8d Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:46:02 +00:00
c4d093c497 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:46:01 +00:00
39ccc6bde5 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:46:01 +00:00
8df4722e8b Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:46:00 +00:00
fe3a822173 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:59 +00:00
7d9a1eefbb Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:59 +00:00
c74f5414af Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:58 +00:00
98387bc517 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:58 +00:00
a6e739601e Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:57 +00:00
e3b372f3d0 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:56 +00:00
8f8e41943a Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:56 +00:00
7af8e80303 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:55 +00:00
9f86d4807c Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:55 +00:00
1a082b425c Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:54 +00:00
48fcec14c5 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:54 +00:00
d54a6b9d08 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:53 +00:00
26e1be3a4f Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:53 +00:00
10cd0f3bc1 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:52 +00:00
d2ec4529cc Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:51 +00:00
a1bf9980cb Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:50 +00:00
42292618bb Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:50 +00:00
07d598c857 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:49 +00:00
757ec36790 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:49 +00:00
7441e29889 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:48 +00:00
c48a8ddc63 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:47 +00:00
c31ba607e5 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:46 +00:00
97eafd2fcf Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:45 +00:00
b3e06b7bbd Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:44 +00:00
ddc65dc558 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:44 +00:00
8dc88a671f Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:43 +00:00
928a2661bb Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:43 +00:00
7f9278fc8f Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:41 +00:00
bc99107f8e Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:41 +00:00
db6cbffd60 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:40 +00:00
55df443de3 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:39 +00:00
e28e930732 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:38 +00:00
2ffa038703 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:38 +00:00
5c6a987442 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:37 +00:00
5f26a8f675 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:36 +00:00
0f25bd4d77 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:35 +00:00
41a6368228 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:34 +00:00
20ec0b6fd6 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:34 +00:00
71655a3923 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:33 +00:00
06103e090a Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:32 +00:00
f78d7b8d35 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:32 +00:00
b87a626ee7 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:31 +00:00
5c587f8e7d Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:30 +00:00
14645156c6 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:29 +00:00
9af897fa59 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:29 +00:00
6b447e3364 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:28 +00:00
162e2aa3e8 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:27 +00:00
68fa068d8b Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:26 +00:00
d481df1702 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:26 +00:00
2f6ce319ba Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:25 +00:00
8093696ec8 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:24 +00:00
53d1657954 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:24 +00:00
87eae8f9c1 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:23 +00:00
1b5655d1aa Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:23 +00:00
01ec5954bb Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:22 +00:00
0d853abbc3 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:21 +00:00
fada6f30ff Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:20 +00:00
c10bbc8f8a Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:20 +00:00
492d828ca3 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:19 +00:00
343a0700b6 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:19 +00:00
c582038d23 Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:18 +00:00
4c70b26e1d Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:17 +00:00
56b120ae6f Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:16 +00:00
3ef03aea6e Tower: upload cetmix_tower_yaml 16.0.2.0.3 (via marketplace) 2026-04-27 08:45:15 +00:00
9897dcfa04 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:14 +00:00
01b7ffd8d3 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:13 +00:00
0ed1b40384 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:13 +00:00
0a1b6e156a Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:12 +00:00
f09ad65b7a Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:12 +00:00
92b30574c7 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:11 +00:00
f5eb897143 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:10 +00:00
8ed74a3aed Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:10 +00:00
7158e9210f Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:09 +00:00
9444f8805a Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:09 +00:00
2095fde1f4 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:08 +00:00
922c8a49d5 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:07 +00:00
7acf00fc4d Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:07 +00:00
86b416cb47 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:06 +00:00
09ed1d8731 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:05 +00:00
022f0cb891 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:05 +00:00
8e4a3d8d4a Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:04 +00:00
97f60c2aa5 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:03 +00:00
7fb3d0a77d Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:03 +00:00
82d2d1eff6 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:02 +00:00
1ed5e88c7c Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:01 +00:00
a1f473b8a3 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:01 +00:00
0ed968a17b Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:45:00 +00:00
1a3e7389fa Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:59 +00:00
8199d0022d Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:59 +00:00
8eb03de70b Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:58 +00:00
1a43c797c3 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:58 +00:00
668ff3da60 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:57 +00:00
a3d8b01582 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:56 +00:00
380afede5e Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:56 +00:00
bf85022852 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:55 +00:00
76f3b5cd0d Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:54 +00:00
818c86a758 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:54 +00:00
a718da84af Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:53 +00:00
c7b7860fd6 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:53 +00:00
31da31ec45 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:52 +00:00
2fd5aa0787 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:51 +00:00
d47e45ae64 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:51 +00:00
1fea3621f5 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 08:44:50 +00:00
6855e3711a Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:49 +00:00
26f2040905 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:48 +00:00
a52b141017 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:48 +00:00
5d988b1cb8 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:47 +00:00
4fc18d865b Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:46 +00:00
262a6e4b84 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:46 +00:00
e450738fd7 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:45 +00:00
83ec459ca5 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:44 +00:00
4de853d788 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:44 +00:00
ad6cbac1f8 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:43 +00:00
2fcd451339 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:43 +00:00
762547c1f5 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:42 +00:00
25cc185aee Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:41 +00:00
0fc6a1d6f3 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:41 +00:00
76991aecae Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:40 +00:00
f7c03a7122 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:39 +00:00
dc0fa2dff7 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:39 +00:00
99043f1c52 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:38 +00:00
73a89f15e6 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:38 +00:00
b4a3b13ee0 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:37 +00:00
3d30491875 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:36 +00:00
dda64246c5 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:36 +00:00
a0d1d19687 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:35 +00:00
66c81b2a91 Tower: upload cetmix_tower_server_queue 16.0.1.2.2 (via marketplace) 2026-04-27 08:44:35 +00:00
c945b52671 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:34 +00:00
146d71319e Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:33 +00:00
d6d2136df6 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:33 +00:00
9c9cc898a4 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:32 +00:00
be07a3b18d Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:31 +00:00
9f312687b1 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:31 +00:00
eadb83779e Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:30 +00:00
e244e8279b Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:30 +00:00
47fe5ea7a5 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:29 +00:00
05724afff0 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:28 +00:00
5578fb365a Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:28 +00:00
30a3b0dc4e Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:27 +00:00
51c5cb3bdb Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:27 +00:00
0849ae6161 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:26 +00:00
81ee76ce21 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:26 +00:00
dc76af271e Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:25 +00:00
5f868f7610 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:24 +00:00
cf31963487 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:24 +00:00
f1b923ae7f Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:23 +00:00
0484142dd5 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:23 +00:00
806c7ce8b8 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:22 +00:00
424742714d Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:21 +00:00
87b5247726 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:21 +00:00
e225e7b2a2 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:20 +00:00
1877e3c1ae Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:20 +00:00
3ea304cb45 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:19 +00:00
d49b02938a Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:18 +00:00
8db12c649f Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:18 +00:00
9c16569b69 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:17 +00:00
c2813bc9b3 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:17 +00:00
5111caa738 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:16 +00:00
2f302772e3 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:16 +00:00
0deb721477 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:15 +00:00
178f8e137e Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:14 +00:00
0769cb0756 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:14 +00:00
95485e2558 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:13 +00:00
ab144b1350 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:13 +00:00
4c6fd5e470 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:12 +00:00
05e045267a Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:11 +00:00
f5a9261856 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:11 +00:00
764642fbf1 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:10 +00:00
9170934142 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:10 +00:00
a0877d3ba4 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:09 +00:00
d236c96001 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:08 +00:00
5f76fc4ad5 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:08 +00:00
db4e11225b Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:07 +00:00
28987afc7d Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:07 +00:00
eff6288a42 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:06 +00:00
af344b5014 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:05 +00:00
e97a22516c Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:05 +00:00
d99c2f23a9 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:04 +00:00
49b0220cc1 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:04 +00:00
8f87c713f3 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:03 +00:00
eb2ad30e64 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:03 +00:00
1ebf77f1aa Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:02 +00:00
32e517b5ec Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:01 +00:00
fe243328a0 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:00 +00:00
070314632d Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:44:00 +00:00
b9c4a621dc Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:59 +00:00
5f9fb1597b Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:58 +00:00
62edb14057 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:58 +00:00
2b1c121be9 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:57 +00:00
51efac175a Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:57 +00:00
7e737b5877 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:56 +00:00
2beb85437a Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:56 +00:00
cfdd00e264 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:55 +00:00
034ea5c0bd Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:54 +00:00
8621fac655 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:54 +00:00
8a5b68926c Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:53 +00:00
22885f7fdd Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:53 +00:00
e3e51b8367 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:52 +00:00
019224ba4c Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:51 +00:00
833346a1a8 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:51 +00:00
c501af7d45 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:50 +00:00
aa1b8801ce Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:49 +00:00
b48081c8e2 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:49 +00:00
a366d1b52c Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:48 +00:00
5cb28ea01a Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:48 +00:00
30f1f2df49 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:47 +00:00
c416aabc44 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:47 +00:00
17d150a45f Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:46 +00:00
6211de488b Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:46 +00:00
5fd192356f Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:45 +00:00
929448f1ca Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:44 +00:00
8733b3cb61 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:44 +00:00
c5fa399627 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:43 +00:00
4ce9f94318 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:43 +00:00
281c0167b1 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:42 +00:00
96d4ad7ef7 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:42 +00:00
6ce7c48b2d Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:41 +00:00
c3bdb2c14d Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:40 +00:00
898b423feb Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:40 +00:00
7264942e8d Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:39 +00:00
3f23cfecf3 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:39 +00:00
23e386b526 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:38 +00:00
f0193a9307 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:38 +00:00
bbddf942a2 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:37 +00:00
f7d3a429a5 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:36 +00:00
89bba86349 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:36 +00:00
0a2076df37 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:35 +00:00
7da0bc5c93 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:34 +00:00
2c7bea7e69 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:34 +00:00
cc4bde613b Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:33 +00:00
a3e7e80ffb Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:33 +00:00
3d2174b4e8 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:32 +00:00
436bc160e3 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:31 +00:00
693821eb53 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:31 +00:00
495bb536f1 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:30 +00:00
a81ee9d711 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:30 +00:00
13f88ed1ed Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:29 +00:00
9c92bd8a2d Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:28 +00:00
9815bfd407 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:28 +00:00
42256b6283 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:27 +00:00
4d4b874ee0 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:27 +00:00
e741fd3d1c Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:26 +00:00
23db6fae45 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:26 +00:00
0cac17c395 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:25 +00:00
9bea4833ca Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:24 +00:00
d70d24cb7a Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:24 +00:00
ab129128b3 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:23 +00:00
8c292c2217 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:23 +00:00
0b504afdca Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:22 +00:00
fa76207199 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:22 +00:00
a6d3222ffc Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:21 +00:00
e7b8c1fc11 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:21 +00:00
226ecfa11e Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:20 +00:00
92a34a2292 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:19 +00:00
19b6b2caca Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:19 +00:00
448f814aae Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:18 +00:00
2537f4e58c Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:18 +00:00
d0059616aa Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:17 +00:00
8c8199abbd Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:17 +00:00
64825c8e84 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:16 +00:00
62cd370099 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:16 +00:00
9b528e38fc Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:15 +00:00
c45450ed87 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:14 +00:00
cc53a55c96 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:14 +00:00
9573216bfd Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:13 +00:00
2839e110fe Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:13 +00:00
ba9ce2ad88 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:12 +00:00
eb4d7a5477 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:11 +00:00
42d21b989a Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:11 +00:00
23cf3ad81b Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:10 +00:00
cce324dbfb Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:10 +00:00
9e1dcd02dd Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:09 +00:00
bfbe68ff88 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:09 +00:00
e07234573c Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:08 +00:00
5b2f53b33a Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:08 +00:00
14e7468ca7 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:07 +00:00
7df06465a8 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:07 +00:00
cb2eb054eb Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:06 +00:00
3ef2cc50fe Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:05 +00:00
d12d454c70 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:05 +00:00
9a17bcd25e Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:04 +00:00
73ebe069f6 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:03 +00:00
2755e373fd Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:03 +00:00
9e43910cc8 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:02 +00:00
1646ace09b Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:02 +00:00
c6c6570800 Tower: upload cetmix_tower_server 16.0.2.2.9 (via marketplace) 2026-04-27 08:43:01 +00:00
21576ec28f Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:43:00 +00:00
a5b60a5d3b Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:59 +00:00
abcb71d469 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:58 +00:00
4fdf6333f2 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:58 +00:00
c18aba668b Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:57 +00:00
0a8333e1e2 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:57 +00:00
3d19db5049 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:56 +00:00
62e7767925 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:56 +00:00
070c89e75e Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:55 +00:00
cf0d897dfa Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:54 +00:00
9fc1c6bd65 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:54 +00:00
342e616963 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:53 +00:00
a4c6f5c561 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:53 +00:00
811d32c5be Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:52 +00:00
135074c040 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:51 +00:00
af55099d83 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:51 +00:00
2d9f32fc2f Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:50 +00:00
d361711043 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:50 +00:00
426c0e0792 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:49 +00:00
ae451e5911 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:48 +00:00
31bcb48704 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:48 +00:00
25703173fb Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:47 +00:00
eab2080115 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:47 +00:00
5f99227e6c Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:46 +00:00
4a547632ac Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:45 +00:00
8cd9bae8ea Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:45 +00:00
ddadefa9a6 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:44 +00:00
7276688114 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:43 +00:00
66450d4d02 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:43 +00:00
2d0bda98b1 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:42 +00:00
89943c26eb Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:42 +00:00
0ac25c7405 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:41 +00:00
b54c955847 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:41 +00:00
857ec4fceb Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:40 +00:00
83ff1a0ec5 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:39 +00:00
ef85be3808 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:39 +00:00
25b80d98ce Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:38 +00:00
1871e1ffe9 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:38 +00:00
4440daa0a4 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:37 +00:00
6e018447b2 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:37 +00:00
5c4949bf5b Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:36 +00:00
90cb176847 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:36 +00:00
bdf8278b7f Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:35 +00:00
da1f2fd426 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:34 +00:00
4b1cbbc86b Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:34 +00:00
0957e4d55b Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:33 +00:00
6509c2136f Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:33 +00:00
52877f9b2c Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:32 +00:00
6176d27861 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:31 +00:00
37a160148d Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:31 +00:00
ee1501034b Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:30 +00:00
92e62ae21b Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:30 +00:00
7a5d6aa254 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:29 +00:00
42a4abb176 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:29 +00:00
440324c078 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:28 +00:00
7e9e92a179 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:27 +00:00
ad62d49f3d Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:27 +00:00
a562808d99 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:26 +00:00
7f6a00a8f7 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:26 +00:00
f04db1b076 Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace) 2026-04-27 08:42:25 +00:00
236b4a6227 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:15 +00:00
93be36fb52 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:14 +00:00
412f99f6a1 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:14 +00:00
a00f32e12f Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:13 +00:00
155436e103 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:12 +00:00
c43c7035a7 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:12 +00:00
a68656e1d5 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:11 +00:00
65a7419e30 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:11 +00:00
d334b0c87b Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:10 +00:00
4826cd422e Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:10 +00:00
0f8a0bddba Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:09 +00:00
155faf8f8b Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:08 +00:00
b8e8b0d989 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:08 +00:00
8f8eec47a9 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:07 +00:00
c0767d1041 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:07 +00:00
4bb470d291 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:06 +00:00
7f4f78e750 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:05 +00:00
6640a61437 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:05 +00:00
0e7e46d0bb Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:04 +00:00
367f45a9b3 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:04 +00:00
1d4e56cbd9 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:03 +00:00
4e07525d10 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:03 +00:00
f5d6ad46c4 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:02 +00:00
cc8804103b Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:01 +00:00
f7f24085cd Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:01 +00:00
097cf223ec Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:00 +00:00
8c3381f41b Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:42:00 +00:00
05a553a8fb Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:59 +00:00
e71e1e04f4 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:58 +00:00
cc614c3ecf Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:58 +00:00
49feadbeb9 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:57 +00:00
66d1bf5e47 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:57 +00:00
7d39b690ec Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:56 +00:00
48c79615fe Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:56 +00:00
55dac4ca23 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:55 +00:00
a861002926 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:54 +00:00
462f134278 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:54 +00:00
1a42ca3cb1 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:53 +00:00
f5574ed238 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:53 +00:00
3f00653bb2 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:52 +00:00
505f69fb27 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:52 +00:00
85ff0c5741 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:51 +00:00
b91b95bccd Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:41:51 +00:00
984be00635 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:33:05 +00:00
01fd85aec0 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:33:05 +00:00
6aa60f1bc3 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:33:04 +00:00
55bad508da Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:33:04 +00:00
99ec962ca3 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:33:03 +00:00
d4b094937a Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:33:02 +00:00
19e36c1a35 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:33:02 +00:00
ce15caaa45 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:33:01 +00:00
315e1bd1e7 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:33:01 +00:00
ff8d274a38 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:33:00 +00:00
ab2c9cddae Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:33:00 +00:00
16dc380c53 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:59 +00:00
4b5170e8b7 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:58 +00:00
c7912ec5a6 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:58 +00:00
090f0099c0 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:58 +00:00
ed7a1d93ba Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:57 +00:00
cbf850a987 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:56 +00:00
877cbcdd6b Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:56 +00:00
44e10c9212 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:55 +00:00
a2742e95ec Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:55 +00:00
9105818e3a Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:54 +00:00
f06a374569 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:54 +00:00
1c38931430 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:53 +00:00
fa92ab9ba8 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:53 +00:00
4b56acc480 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:52 +00:00
f3cb0587f5 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 08:32:52 +00:00
3e756c774f Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:44 +00:00
e8fe926dbb Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:43 +00:00
b2a168bd06 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:43 +00:00
4628821451 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:42 +00:00
ab108c0437 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:42 +00:00
5d9fe7b1f3 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:41 +00:00
1b3bf2d301 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:41 +00:00
017d7883d3 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:40 +00:00
00439eac6e Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:39 +00:00
d5b31de87e Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:39 +00:00
f9a6b56c81 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:38 +00:00
123239031f Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:38 +00:00
7f65dc9a92 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:38 +00:00
25c345f665 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:37 +00:00
2c2058e07b Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:36 +00:00
f628de0c15 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:36 +00:00
998d97da45 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:35 +00:00
7a6f12082b Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 08:32:35 +00:00
Tower Deploy
9bb80002c8 Wipe addons/: full reset for clean re-upload 2026-04-27 11:20:53 +03:00
2cf3b5185d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:40 +00:00
9214b650ae Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:39 +00:00
e6027c710b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:39 +00:00
7a40f423d4 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:38 +00:00
9966aa4ffa Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:38 +00:00
7c90e7bee2 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:37 +00:00
be3a699471 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:37 +00:00
a68f5ed5da Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:36 +00:00
3a4d546c10 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:36 +00:00
386893e751 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:35 +00:00
e8cd94cc98 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:34 +00:00
bbf383a59f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:34 +00:00
eb41cf2557 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:33 +00:00
7d71cd87fe Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:33 +00:00
886affc442 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:32 +00:00
236c25028c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:32 +00:00
ca0996089d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:31 +00:00
326bbe4eb1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:31 +00:00
bd2de68a13 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:30 +00:00
241485ada6 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:30 +00:00
93925e7edb Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:29 +00:00
8be03b6213 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:28 +00:00
f8be9708f2 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:28 +00:00
43f1d3a460 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:27 +00:00
95ab9b7b07 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:27 +00:00
c4dec5820f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:26 +00:00
cf8020a374 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:26 +00:00
8b2b00309b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:25 +00:00
43c386dd0f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:24 +00:00
94e68bf101 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:24 +00:00
c6fcbd4e88 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:24 +00:00
95ec10c4cd Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:23 +00:00
8cde5f5b85 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:22 +00:00
92daedbcfe Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:22 +00:00
59af83f001 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:21 +00:00
68ca5feaec Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:21 +00:00
d379066f8d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:20 +00:00
50f45a25f6 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:20 +00:00
4f1b44f859 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:19 +00:00
63cb075ebe Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:18 +00:00
3bc89980fb Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:18 +00:00
a30f10f463 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:18 +00:00
a3f387f59d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:17 +00:00
0496b94742 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:16 +00:00
eeea0bde1d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:16 +00:00
19a63eac0c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:15 +00:00
ff42b73982 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:15 +00:00
ac9207b0c6 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:14 +00:00
7dadc5938a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:14 +00:00
88fb907a24 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:13 +00:00
a349d97184 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:12 +00:00
2eee80609f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:12 +00:00
fcb747f2c9 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:11 +00:00
826194b88f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:11 +00:00
303d179c1a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:10 +00:00
b309b6f244 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:09 +00:00
ee0ef6b69d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:09 +00:00
121fcd2639 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:08 +00:00
5cecb3364e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:08 +00:00
1e2909808a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:07 +00:00
b8658d0fed Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:06 +00:00
ea586f0019 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:06 +00:00
4219a55576 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:05 +00:00
2d6197c181 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:05 +00:00
049d8dc461 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:04 +00:00
8f7afa25fc Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:04 +00:00
7c0c8cf62a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:03 +00:00
e0c9e3817f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:02 +00:00
95894e0965 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:02 +00:00
0fd426db38 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:01 +00:00
7f38305cda Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:01 +00:00
9eb03938ba Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:00 +00:00
38b16543da Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:18:00 +00:00
3a6e036b1d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:59 +00:00
c28baccca8 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:58 +00:00
2352fdfaab Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:58 +00:00
fd93d95ef0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:57 +00:00
1ad508d029 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:57 +00:00
80e2953742 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:56 +00:00
8f2214eb37 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:55 +00:00
105434392b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:55 +00:00
d77c0ec323 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:54 +00:00
ebc9c2da81 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:54 +00:00
b706079a96 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:54 +00:00
1a3fb88ff0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:53 +00:00
fe73ec564d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:52 +00:00
38becb2347 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:52 +00:00
9cc237dfcd Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:51 +00:00
59a0a18068 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:51 +00:00
3cdcbd70c3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:50 +00:00
36f48cb3ef Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:49 +00:00
6e40ceba46 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:48 +00:00
9ed9312f52 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:48 +00:00
3bf88a3db2 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:47 +00:00
cd835868a4 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:47 +00:00
3adbefa88a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:46 +00:00
6192b3aff5 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:45 +00:00
b504a42afc Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:45 +00:00
60532fda2e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:44 +00:00
4604622231 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:43 +00:00
f4e43a2f84 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:43 +00:00
c5c3887d97 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:42 +00:00
8ce3697a6e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:41 +00:00
bbe37b34d9 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:41 +00:00
ae8c208c59 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:40 +00:00
3811a9d7cd Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:39 +00:00
3eed4a9224 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:38 +00:00
68b713a69a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:37 +00:00
af1be38c68 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:37 +00:00
3780eaf1f2 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:36 +00:00
1f23472908 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:35 +00:00
5e71e0a98a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:35 +00:00
5e665079f3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:34 +00:00
b67d86ef4b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:33 +00:00
cf83815785 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:33 +00:00
255a06a789 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:32 +00:00
3153e06601 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:31 +00:00
7e4c9dcd99 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:31 +00:00
8e92de0c4e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:30 +00:00
eb58ac434c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:29 +00:00
5aed68117b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:29 +00:00
b6c3a855a4 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:28 +00:00
cd4b7cd2e6 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:27 +00:00
cb1e060ebb Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:27 +00:00
ccc9ef0644 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:26 +00:00
03b1d2bd59 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:25 +00:00
565ef8f0cc Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:25 +00:00
ae52efe220 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:24 +00:00
09576d37b4 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:23 +00:00
3b556e385d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:23 +00:00
d24677fc8e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:22 +00:00
bc9c9bf125 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:21 +00:00
953db1c18e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:21 +00:00
bb6408e1bb Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:20 +00:00
f5ee80a075 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:19 +00:00
e2a1ef97cf Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:19 +00:00
f7aa151993 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:18 +00:00
c8461e648d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:17 +00:00
78f57a52e8 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:17 +00:00
645bbb9e1f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:16 +00:00
1c5b8f78e8 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:15 +00:00
b06be61868 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:15 +00:00
22635fd1db Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:14 +00:00
502f3c276f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:13 +00:00
a29e7d3701 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:12 +00:00
90a6de998c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:12 +00:00
309834e218 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:11 +00:00
36548b07b3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:11 +00:00
a647db524a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:10 +00:00
96392d7cab Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:09 +00:00
3c73cf7286 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:08 +00:00
5128d56863 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:08 +00:00
ec366ca548 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:07 +00:00
eaaf033cd5 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:06 +00:00
899eefb2b1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:06 +00:00
35c152c073 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:05 +00:00
4db61b7221 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:04 +00:00
56faad93d6 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:03 +00:00
b02021eeab Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:03 +00:00
0f8d4c52be Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:02 +00:00
f6b23b2697 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:01 +00:00
9c162c8c40 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:01 +00:00
9ee9d2dc06 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:17:00 +00:00
f88873226d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:59 +00:00
e6ef101e11 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:58 +00:00
ace82b83f0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:58 +00:00
c3b5ebd7bc Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:57 +00:00
f52001bffa Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:56 +00:00
8289f0ec93 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:56 +00:00
4c85b5da81 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:55 +00:00
7bddb74ba7 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:54 +00:00
b088c69c2b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:54 +00:00
ffc66cfaa1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:53 +00:00
50705d8a20 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:52 +00:00
eb85e1f034 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:52 +00:00
c104fc8c43 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:51 +00:00
12aaeebb69 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:50 +00:00
b8accd5199 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:50 +00:00
36e718ae36 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:49 +00:00
fc67cb263f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:48 +00:00
d6bec900fe Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:48 +00:00
db967ff6e3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:47 +00:00
9d6d07b2e1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:46 +00:00
1444a3064e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:46 +00:00
0a2e334aee Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:45 +00:00
15d21d3ab5 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:45 +00:00
a4f565087c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:44 +00:00
6a11883c7c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:43 +00:00
1202892973 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:42 +00:00
d3e1cc28bc Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:42 +00:00
151246c614 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:41 +00:00
5049ba6907 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:40 +00:00
f8b593bec4 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:35 +00:00
682e48bb2b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:34 +00:00
c4ddcb8e92 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:34 +00:00
d992b45cdd Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:33 +00:00
f89637d6e8 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:33 +00:00
a493701b6e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:32 +00:00
77b6a4b2fc Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:32 +00:00
9d595b2565 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:31 +00:00
812b64b18d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:31 +00:00
a6d4d64192 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:30 +00:00
0f52520ee3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:30 +00:00
8a996f5083 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:29 +00:00
b4e0d93c28 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:29 +00:00
f54217e713 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:28 +00:00
ebb1399951 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:28 +00:00
f9d33713ab Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:27 +00:00
4af3a1e647 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:26 +00:00
af44da007b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:26 +00:00
1d5a2ceed0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:25 +00:00
4f9d558cf4 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:25 +00:00
8bdd6064ab Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:24 +00:00
76b43e0b65 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:24 +00:00
3b80e2101c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:23 +00:00
42653be822 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:23 +00:00
717ce4756a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:22 +00:00
5ac0c18619 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:22 +00:00
79dd86e13f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:21 +00:00
05b6f98a82 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:21 +00:00
098ce63b26 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:20 +00:00
254f6312b4 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:20 +00:00
5dc4447ff3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:19 +00:00
d77978d0c9 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:19 +00:00
c4df067894 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:18 +00:00
c210efa9a2 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:18 +00:00
3dbf0baeb2 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:17 +00:00
5903af189c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:17 +00:00
507eab7847 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:16 +00:00
0f5b16febc Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:16 +00:00
1b5342da13 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:15 +00:00
9d2776f6ce Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:15 +00:00
716a6d735c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:14 +00:00
5362b526e7 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:14 +00:00
0586c40667 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:13 +00:00
9e48c4e0dc Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:12 +00:00
569a853b3a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:12 +00:00
74a3f434a4 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:12 +00:00
a6af9583df Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:11 +00:00
326900b3a7 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:10 +00:00
c4dfb0a886 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:09 +00:00
a5efdebe15 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:09 +00:00
cb84ce69be Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:08 +00:00
7e5354d5ad Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:07 +00:00
521d765b35 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:06 +00:00
7fbaaf189b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:06 +00:00
6a9182c820 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:05 +00:00
90f7afa720 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:05 +00:00
90c893ae66 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:04 +00:00
8d55a7ee70 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:04 +00:00
f6e32ece58 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:03 +00:00
162ad41852 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:02 +00:00
8b89083a51 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:02 +00:00
68c5b015e0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:01 +00:00
61e360ae9e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:00 +00:00
50663c7700 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:16:00 +00:00
4da1291a50 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:59 +00:00
94df75a9bf Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:59 +00:00
5ea3184c5e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:58 +00:00
099bb0dfd5 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:58 +00:00
e318c89788 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:57 +00:00
1174604b05 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:57 +00:00
364f37aa5a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:56 +00:00
bbb71840c1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:56 +00:00
c2923e01e6 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:55 +00:00
4131ae0adb Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:54 +00:00
f16e0abf03 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:54 +00:00
07adc2628c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:53 +00:00
a682b818d3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:53 +00:00
b2a8c2dcde Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:52 +00:00
2314a8f6c2 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:52 +00:00
f2033e0408 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:51 +00:00
38d4a641f1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:51 +00:00
8ca3561c1a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:50 +00:00
bf7158a6e8 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:50 +00:00
6a92d586a4 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:49 +00:00
2a93942be1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:48 +00:00
e81e6f4ff1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:48 +00:00
5e4cf9723b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:48 +00:00
a6fb93b231 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:47 +00:00
a3022f8332 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:47 +00:00
af0b27d762 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:46 +00:00
d2a8d537f6 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:45 +00:00
52d65dabba Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:44 +00:00
cbd499b88f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:44 +00:00
d59aa0179a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:43 +00:00
bf61f4eb4f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:43 +00:00
97352ac44d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:42 +00:00
eb0687da36 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:42 +00:00
ceea23aaaf Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:41 +00:00
802a5a8a1c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:40 +00:00
2d24db2b08 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:40 +00:00
bfb1edac54 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:39 +00:00
b12ac35b65 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:39 +00:00
8b881eba5b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:38 +00:00
b2317325e2 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:38 +00:00
a8e845cb8b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:37 +00:00
14bd70a67c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 08:15:36 +00:00
82cfb22c03 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:27 +00:00
50cd192fd8 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:26 +00:00
62a0a9b1bd Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:26 +00:00
88b9f087a1 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:25 +00:00
55b5ad56c8 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:25 +00:00
00d5145aa0 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:24 +00:00
6161522a04 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:24 +00:00
abaabc4cc0 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:23 +00:00
2686884335 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:23 +00:00
f41c8d4c6f Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:22 +00:00
a9496bdbd2 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:21 +00:00
5e634580c2 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:21 +00:00
37b4590851 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:20 +00:00
81e565fdec Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:20 +00:00
b912c85da7 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:19 +00:00
7ef63fa72d Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:18 +00:00
627c3e9ffa Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:18 +00:00
876b3f4a7d Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:17 +00:00
f323562bbd Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:17 +00:00
f98711ec66 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:16 +00:00
8db97cf776 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:16 +00:00
f38452a52a Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:15 +00:00
03d392803f Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:15 +00:00
8b40cf2659 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 08:15:14 +00:00
86cf1847f4 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:15:00 +00:00
45d7ed8b73 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:59 +00:00
0b7b196159 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:59 +00:00
33ad700d61 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:58 +00:00
7f8552981b Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:57 +00:00
5cc9d2512b Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:57 +00:00
6ab789e36d Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:56 +00:00
f8109af6ce Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:56 +00:00
1bfc6ac3af Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:55 +00:00
548817116a Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:55 +00:00
b2f712e6b6 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:54 +00:00
93739ddaff Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:54 +00:00
1373305638 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:53 +00:00
70a54d0787 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:53 +00:00
40a164b1b0 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:52 +00:00
bc966d56b0 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:51 +00:00
61e7953827 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:51 +00:00
192e1a9dbc Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:50 +00:00
2fe3c98c53 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:49 +00:00
5f3cca665d Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 08:14:48 +00:00
88d5b049ff Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:40 +00:00
4614cb31fb Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:40 +00:00
44d76bc4a1 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:39 +00:00
353350476d Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:39 +00:00
76d63a2fe8 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:38 +00:00
cce75a5895 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:37 +00:00
2409adec5e Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:37 +00:00
f75a5247b5 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:36 +00:00
8cfa1310d1 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:36 +00:00
086b96cc39 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:35 +00:00
908aa7e1da Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:35 +00:00
b6218e6b07 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:34 +00:00
3d868855ca Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:34 +00:00
7e7213f67b Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:33 +00:00
f5afc7d31c Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:33 +00:00
72737afb61 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:32 +00:00
b39e81512e Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:32 +00:00
62fad98a12 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:31 +00:00
98c4aa7358 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:30 +00:00
1a3ee1d4de Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:30 +00:00
be2facb1f1 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:29 +00:00
97b4731ca6 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:29 +00:00
83326bcaed Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:28 +00:00
09eda63698 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:28 +00:00
d0aaff2135 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:27 +00:00
7bd0bd0989 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:26 +00:00
94bd98ab65 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:26 +00:00
25fa4c853b Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:26 +00:00
4b4581ff2e Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:25 +00:00
e1ea01e59e Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:24 +00:00
da4d5c2494 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:24 +00:00
3713992eb3 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:23 +00:00
e1c8337464 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:23 +00:00
6c81ab18c8 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:22 +00:00
f0085588b9 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:22 +00:00
8fdb330a6c Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:21 +00:00
fb7a94f8ae Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:21 +00:00
e71e3822e0 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:20 +00:00
e289fb9145 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:19 +00:00
bf2a8c4010 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:19 +00:00
5cc34775f3 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:18 +00:00
7f75afbdba Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:18 +00:00
1390ec0c15 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:17 +00:00
4e84600e7e Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:17 +00:00
c0ea49872c Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:16 +00:00
0685e4cabe Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:16 +00:00
875a590978 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:15 +00:00
98d8aeb011 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:14 +00:00
2f9905210a Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:14 +00:00
41d56a304a Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:13 +00:00
55da1da7f3 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:13 +00:00
a65d315cda Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:12 +00:00
16e6c57a3f Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:12 +00:00
638a2df7c6 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:11 +00:00
9b53282444 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:11 +00:00
89d02b353b Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:10 +00:00
c968cca4de Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:10 +00:00
e163b0d99b Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:09 +00:00
4426a5abb6 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:09 +00:00
8c8e527249 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 08:14:08 +00:00
f50c1865d5 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:07:03 +00:00
f5257dc7ab Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:07:02 +00:00
14315e0035 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:07:01 +00:00
e2fe62b379 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:07:01 +00:00
1f9bea1264 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:07:00 +00:00
08f1a4d3cb Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:07:00 +00:00
be8a0ac9c3 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:59 +00:00
a383f11d2a Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:58 +00:00
91618edeec Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:58 +00:00
b64f6da230 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:57 +00:00
ba4b26b175 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:57 +00:00
525c919b3a Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:56 +00:00
d7f6de08e9 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:56 +00:00
0d20ab7aa8 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:55 +00:00
231d59da7f Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:54 +00:00
4fef277751 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:54 +00:00
7032e64dcb Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:53 +00:00
15481c11c0 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:53 +00:00
5930f771e5 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:52 +00:00
2290c90089 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:51 +00:00
eb28ba0f78 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:51 +00:00
7df203efe8 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:50 +00:00
766b1dd779 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:50 +00:00
e992a8ea3f Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:49 +00:00
e3863de129 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:48 +00:00
bfed6bdcf4 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:48 +00:00
f4834218ce Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:47 +00:00
e3e001ac5b Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:47 +00:00
afc1985114 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:46 +00:00
f0c0fa15ac Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:45 +00:00
3bb17aa74a Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:45 +00:00
3887d3afd3 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:44 +00:00
ccf1ac8e77 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:44 +00:00
df84150f14 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:43 +00:00
fd4f3c89cf Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:43 +00:00
46fa14692c Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:42 +00:00
2d26b672bf Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:42 +00:00
f908dd5acd Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:41 +00:00
f50135b5c6 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:40 +00:00
2be8fc95b7 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:40 +00:00
736d4b40e0 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:39 +00:00
7fa0a4c79a Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:39 +00:00
8881aeb2ca Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 08:06:38 +00:00
8fa1c29c59 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:32 +00:00
318ef00817 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:31 +00:00
3fcdf69f56 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:31 +00:00
e2785fff55 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:30 +00:00
e5adc46d44 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:29 +00:00
6052fcbe7e Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:29 +00:00
268e7e9b23 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:28 +00:00
53f93fe01b Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:28 +00:00
202cb09e2b Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:27 +00:00
c29df047d2 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:27 +00:00
8dc8a3d39b Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:26 +00:00
34a4c17e9b Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:26 +00:00
ccb61bd1d9 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:25 +00:00
be89574d27 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:25 +00:00
e8a12c08d8 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:24 +00:00
16a5812db0 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:23 +00:00
366eeab65d Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:23 +00:00
ce185f92e3 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:22 +00:00
276dccf5fd Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:22 +00:00
4fc6c80352 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:21 +00:00
016afe19f8 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:21 +00:00
7295ad401c Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:20 +00:00
1eed0fbda0 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:19 +00:00
da449b9852 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 08:06:19 +00:00
Tower Deploy
9a499aced7 Wipe addons/: corrupt source from old double-base64 upload bug + test artifacts; ready for clean re-upload 2026-04-27 10:59:54 +03:00
c3f2c4f522 Tower: upload probe_addon 16.0.1.0.0 (via marketplace) 2026-04-27 07:53:52 +00:00
a356f71745 Tower: upload probe_addon 16.0.1.0.0 (via marketplace) 2026-04-27 07:53:51 +00:00
0a76509365 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:23 +00:00
9083833444 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:22 +00:00
ed9dc11c4b Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:22 +00:00
1c2d483a46 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:21 +00:00
1f073938d7 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:21 +00:00
e12133fff0 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:20 +00:00
61d95f53d6 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:20 +00:00
ebd9d7c16f Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:19 +00:00
455a7192d3 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:18 +00:00
4c8ec8ffa3 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:18 +00:00
2beca515ca Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:17 +00:00
e1c3544f09 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:17 +00:00
242fc36fd0 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:16 +00:00
4754df89b7 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:16 +00:00
e050040bae Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:15 +00:00
30deb10c27 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:14 +00:00
f2791efa4f Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:14 +00:00
acc9748aa2 Tower: upload cx_web_refresh_from_backend 16.0.1.0.0 (via marketplace) 2026-04-27 06:59:13 +00:00
b36fe277c0 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:53 +00:00
0b07e80ecb Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:53 +00:00
b448019f93 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:52 +00:00
a108daebd0 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:52 +00:00
2c950b5a0a Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:51 +00:00
0ded373257 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:51 +00:00
4ad6ffce26 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:50 +00:00
265f8092e5 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:49 +00:00
6735056551 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:49 +00:00
a70aae6404 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:48 +00:00
f7c2027d17 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:48 +00:00
8f9c4f4ed9 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:47 +00:00
cd4fa9df4d Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:47 +00:00
b776dea93e Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:46 +00:00
2d655e9822 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:46 +00:00
f1aef07115 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:45 +00:00
ceac54f2a8 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:45 +00:00
8cd2d73dd1 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:44 +00:00
4c8a85091e Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:44 +00:00
1d8e306a5b Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:43 +00:00
ff76148774 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:42 +00:00
263616cf66 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:42 +00:00
5d8563cf5e Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:41 +00:00
3a8e7bb486 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:41 +00:00
dac924d260 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:40 +00:00
2fec9bae57 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:40 +00:00
a3a0e7f1a9 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:39 +00:00
57e4922aa4 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:39 +00:00
5a86e951c9 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:38 +00:00
07a2292b98 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:38 +00:00
498ebf5b5e Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:37 +00:00
0c0a53fb80 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:37 +00:00
f13d08283f Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:36 +00:00
6776b72adf Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:36 +00:00
fc0111f9af Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:35 +00:00
58ecb0871a Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:34 +00:00
5ab36dc181 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:34 +00:00
9eb4e7eb59 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:33 +00:00
b73d178751 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:33 +00:00
aeb5997303 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:32 +00:00
b6be8f1f51 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:32 +00:00
6e4ec0f188 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:31 +00:00
d84a9d95e3 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:31 +00:00
e85ead856e Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:30 +00:00
d640f69b64 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:30 +00:00
3a855c6905 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:29 +00:00
e5bc9f79bc Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:29 +00:00
e4a9a645a1 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:28 +00:00
7be7fc0d06 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:28 +00:00
639c21ee64 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:27 +00:00
83463f08fd Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:27 +00:00
d62c41a4c0 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:26 +00:00
5bc32a7b39 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:26 +00:00
b87f9f2f0f Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:25 +00:00
ecb8f48fc7 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:25 +00:00
453e861eb1 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:24 +00:00
9d9ba90f65 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:24 +00:00
c0ec43dc15 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:23 +00:00
8bf0f53a1f Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:23 +00:00
b9935804d8 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:22 +00:00
e3cd173cae Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:22 +00:00
0b171536bd Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:21 +00:00
4df5459abb Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:21 +00:00
99c360c739 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:20 +00:00
238f3a123f Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:19 +00:00
7635f192bc Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:19 +00:00
4be4c95126 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:19 +00:00
c7174e1aa0 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:18 +00:00
038f113176 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:18 +00:00
e640b7dc00 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:17 +00:00
69ee0e8a79 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:16 +00:00
44f9bf1d9d Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:16 +00:00
528d049505 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:16 +00:00
d38fff270d Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:15 +00:00
f47e6d77df Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:14 +00:00
bcdb9f7100 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:14 +00:00
79c3511ced Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:13 +00:00
77163b4017 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:13 +00:00
52512ff961 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:12 +00:00
8e37d624ff Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:11 +00:00
2b845fa110 Tower: upload cetmix_tower_yaml 16.0.3.1.0 (via marketplace) 2026-04-27 06:58:11 +00:00
09c730c852 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:56 +00:00
9ea0b5ca1e Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:55 +00:00
3f7c12c4cb Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:55 +00:00
52212a4234 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:54 +00:00
aad83a6e45 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:54 +00:00
b15249a7cc Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:53 +00:00
971c0b6bb1 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:53 +00:00
c8259d3fae Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:52 +00:00
c1c1591ffd Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:52 +00:00
1ceae80007 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:51 +00:00
711c240058 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:51 +00:00
ed906caf54 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:50 +00:00
fa316c0948 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:50 +00:00
64da73b835 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:49 +00:00
51d27b362c Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:49 +00:00
11bf6134ec Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:48 +00:00
e6fd3d1594 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:48 +00:00
6c440b46d0 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:47 +00:00
6f5049ff54 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:46 +00:00
785da91996 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:46 +00:00
a59be21d5c Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:45 +00:00
dcd8d31c0b Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:45 +00:00
bbff9cd347 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:44 +00:00
c5433c7b44 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:44 +00:00
52e3ae85ef Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:43 +00:00
6ee8d34a08 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:43 +00:00
fc845bf79a Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:42 +00:00
aa3ea16a1b Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:42 +00:00
5d72ad53fb Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:41 +00:00
d5a16b3baa Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:41 +00:00
4300c11cb1 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:40 +00:00
611bf9a530 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:40 +00:00
f665a077cb Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:39 +00:00
62c2411818 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:39 +00:00
1aeff8903c Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:38 +00:00
7a0fe4f363 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:38 +00:00
6ebe68c8fc Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:37 +00:00
075a340056 Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:37 +00:00
d764da736d Tower: upload cetmix_tower_webhook 16.0.1.0.5 (via marketplace) 2026-04-27 06:57:36 +00:00
b9ee75209a Tower: upload cetmix_dup_test 16.0.1.0.0 (via marketplace) (force-overwrite) 2026-04-27 06:56:35 +00:00
389ffcbadb Tower: upload cetmix_dup_test 16.0.1.0.0 (via marketplace) (force-overwrite) 2026-04-27 06:56:35 +00:00
37ec61eab2 Tower: upload cetmix_dup_test 16.0.1.0.0 (via marketplace) 2026-04-27 06:56:34 +00:00
a901150981 Tower: upload cetmix_dup_test 16.0.1.0.0 (via marketplace) 2026-04-27 06:56:33 +00:00
d7e623d816 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:12 +00:00
45e7dd2c6c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:11 +00:00
25ca66a86b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:11 +00:00
a78cbd6583 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:10 +00:00
09283bba61 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:10 +00:00
e738070b24 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:09 +00:00
0c67e0d798 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:09 +00:00
9e7f379923 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:08 +00:00
93426fbae5 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:08 +00:00
f1b9101b13 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:07 +00:00
33d3b02763 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:06 +00:00
2a169afa62 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:06 +00:00
a2fc7b47c1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:05 +00:00
c717460cea Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:04 +00:00
a8f57858d8 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:04 +00:00
3ab0e79386 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:03 +00:00
236b78c33b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:02 +00:00
18138fd178 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:02 +00:00
fa34dcb44e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:01 +00:00
f8a7e22755 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:00 +00:00
5e7a05b949 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:54:00 +00:00
676d1fd8c1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:59 +00:00
9a569b9af1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:59 +00:00
bfda22756e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:58 +00:00
237d692cd1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:58 +00:00
31b57b24f5 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:57 +00:00
ff8cc52e41 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:56 +00:00
f6d8bab742 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:56 +00:00
1bd0a301dd Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:55 +00:00
d7ac3f27e0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:55 +00:00
adf18c04a9 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:54 +00:00
150023c203 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:54 +00:00
21bf17da38 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:53 +00:00
54c3d037a0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:53 +00:00
cc7c59f4fa Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:52 +00:00
491c5fa696 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:52 +00:00
cb1c08a52d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:51 +00:00
7c414a48de Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:51 +00:00
0d03d8d956 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:50 +00:00
ee974eb8d1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:50 +00:00
5e17847c10 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:49 +00:00
753ee2e4e3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:49 +00:00
2c73095fd6 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:48 +00:00
c31875dc95 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:48 +00:00
39ac32de74 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:47 +00:00
3a6f76212d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:47 +00:00
89c5d6195a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:46 +00:00
a6c0f93af0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:46 +00:00
f52cdfe12d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:45 +00:00
fe91357505 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:44 +00:00
e4c578f20a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:44 +00:00
d9734e17fb Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:43 +00:00
4cc3f94635 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:43 +00:00
8ff4dd5b3c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:42 +00:00
423b6acfde Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:42 +00:00
ccf2ec0804 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:41 +00:00
002f0bda6f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:41 +00:00
753aee7fc5 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:40 +00:00
c96b8b5c64 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:40 +00:00
821e088b8e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:39 +00:00
3ea5965a99 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:38 +00:00
5ce2821634 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:38 +00:00
5d4b6ee4fc Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:37 +00:00
7399e63d70 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:37 +00:00
fc27945b4e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:36 +00:00
2b98a8ca57 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:36 +00:00
d50103ca24 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:35 +00:00
52a3aaec81 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:35 +00:00
48d9f3af80 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:34 +00:00
7575ca93ad Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:33 +00:00
dcf7f0daa9 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:33 +00:00
ffe3f45168 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:32 +00:00
bd17bdabf9 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:32 +00:00
118c993e31 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:31 +00:00
33707afaaf Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:31 +00:00
5fc79cb304 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:30 +00:00
b595872bb3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:29 +00:00
e50e55444c Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:29 +00:00
0f68d7e8f9 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:28 +00:00
f161ba7728 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:28 +00:00
fb2479c6fe Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:27 +00:00
f8f75587c3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:27 +00:00
3cbf6b5144 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:26 +00:00
48cf579779 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:26 +00:00
5c5edd2106 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:25 +00:00
4a4b2f7206 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:25 +00:00
e84cdd1a54 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:24 +00:00
410eaab039 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:24 +00:00
8b8dd4758f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:23 +00:00
16dfa61d3d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:23 +00:00
cd0dcdb06b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:22 +00:00
0bc76ebcfb Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:22 +00:00
b86383444b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:21 +00:00
e788902689 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:21 +00:00
2d0d90ba7e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:20 +00:00
c56cba7257 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:19 +00:00
63623d0dc3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:19 +00:00
1a409eab82 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:18 +00:00
135242d577 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:18 +00:00
aec96c5193 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:17 +00:00
a68eef6627 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:17 +00:00
0ed1ee7bb0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:16 +00:00
ccdde704c7 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:16 +00:00
f2803833a6 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:15 +00:00
884df448f0 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:14 +00:00
a1cba28258 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:14 +00:00
eddb6db49e Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:13 +00:00
67267c20a3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:13 +00:00
547da816ad Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:12 +00:00
ecf57118ba Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:12 +00:00
3681255837 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:11 +00:00
f97595108f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:11 +00:00
7bf6c0aa4b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:10 +00:00
9fb24cad21 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:10 +00:00
b036b9f480 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:09 +00:00
2d677619f3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:08 +00:00
576e6edecc Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:08 +00:00
0819ee5593 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:08 +00:00
7ca45462cf Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:07 +00:00
0e8399ae71 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:07 +00:00
cf42f5455d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:06 +00:00
50536e5867 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:05 +00:00
e3c584c560 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:05 +00:00
c48e67db97 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:04 +00:00
fd8c6f50f2 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:04 +00:00
e09e6074c8 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:03 +00:00
c470e9603f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:03 +00:00
faf0882b3a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:02 +00:00
e96209ad14 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:02 +00:00
1912047142 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:01 +00:00
8011416ceb Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:01 +00:00
2d3f527e24 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:53:00 +00:00
aed221fa34 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:59 +00:00
425d46b0ef Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:59 +00:00
b3d43ad682 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:58 +00:00
65af6a8437 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:58 +00:00
ac07f2e7df Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:57 +00:00
4d1c88b43b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:57 +00:00
465720ccdd Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:56 +00:00
21fe8ed322 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:56 +00:00
01d440de88 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:55 +00:00
aba0ce3a6d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:55 +00:00
906217822f Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:54 +00:00
9e81d94e5d Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:54 +00:00
092f3b1026 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:53 +00:00
6739cac57b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:53 +00:00
2d69ab84ce Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:52 +00:00
af3a8d4dbc Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:52 +00:00
0792585612 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:51 +00:00
ee798802e6 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:51 +00:00
3f44bf0577 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:50 +00:00
eaedae0565 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:50 +00:00
9c068d07c9 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:49 +00:00
8abe88b2d3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:49 +00:00
ece70df8fe Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:48 +00:00
ecc375cf63 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:48 +00:00
d89a5b2e4b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:47 +00:00
d041586baf Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:47 +00:00
49472d32a1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:46 +00:00
aa83b5c270 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:46 +00:00
24bd37cd38 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:45 +00:00
a4e24baeb5 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:45 +00:00
f0512fdce3 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:44 +00:00
101b6c9b74 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:44 +00:00
9db3f91c28 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:43 +00:00
94de4c07da Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:43 +00:00
67eedfddc4 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:42 +00:00
829ec15b5b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:42 +00:00
e8bc314cfb Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:41 +00:00
85328a6e96 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:41 +00:00
3af743ed1b Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:40 +00:00
b3b67e7abf Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:39 +00:00
f2d4464209 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:39 +00:00
3fa52b6f32 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:38 +00:00
01ad3e8a8a Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:38 +00:00
fc4bbe2568 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:37 +00:00
d1a407c6b8 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:37 +00:00
a210ca3e17 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:36 +00:00
276f4a5aa4 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:36 +00:00
56b5e117f1 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:35 +00:00
00c5630072 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:35 +00:00
f3a4594386 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:34 +00:00
ed335e5010 Tower: upload cetmix_tower_server 16.0.3.0.1 (via marketplace) 2026-04-27 06:52:34 +00:00
cdd5dbb5ea Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:24 +00:00
0e51ca5bce Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:24 +00:00
0f24587641 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:23 +00:00
5b1f74e263 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:23 +00:00
0a2171ae91 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:22 +00:00
09573a7cfc Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:22 +00:00
686c4f2698 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:21 +00:00
9273950afc Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:21 +00:00
add6fe3994 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:20 +00:00
581efc0235 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:20 +00:00
b1d9b4810f Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:19 +00:00
a868059124 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:18 +00:00
2ceb788c2e Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:18 +00:00
3ca93dfc54 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:18 +00:00
e8315b207d Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:17 +00:00
3090536fc7 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:17 +00:00
c5034b43ab Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:16 +00:00
6b4b7939b0 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:16 +00:00
99be7c765a Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:15 +00:00
a018275ebf Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:14 +00:00
fb9777247a Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:14 +00:00
1e8239c7e2 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:13 +00:00
81b127648b Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:13 +00:00
4c5e3f2f28 Tower: upload cetmix_tower_server_queue1 16.0.2.0.0 (via marketplace) 2026-04-27 06:47:12 +00:00
9fb7d3ff42 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:56 +00:00
ac3093b5dc Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:55 +00:00
975d29fa31 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:55 +00:00
94adb5f348 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:54 +00:00
fba8cc9acd Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:54 +00:00
0fb75fa95f Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:53 +00:00
840c4ac3a9 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:52 +00:00
16613c86a7 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:52 +00:00
0c43591378 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:51 +00:00
9ea6ac8d24 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:51 +00:00
394210c99b Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:50 +00:00
0a7c8c70b0 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:50 +00:00
50cfffdb19 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:49 +00:00
262f2ceef5 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:49 +00:00
5377ca3d57 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:48 +00:00
2fc48951c8 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:48 +00:00
b5308c583c Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:47 +00:00
ffc4690cf5 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:47 +00:00
aace3488c5 Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:46 +00:00
9782ca679d Tower: upload cetmix_tower_aws 16.0.1.1.1 (via marketplace) 2026-04-27 06:46:46 +00:00
258500d3f7 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:37 +00:00
20a3a2d33d Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:37 +00:00
09b6d24303 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:36 +00:00
244569004b Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:36 +00:00
773928cf47 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:35 +00:00
0b60b46a40 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:35 +00:00
4a4797e49d Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:34 +00:00
a26a507d31 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:34 +00:00
151578461e Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:33 +00:00
c219e1c5e6 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:33 +00:00
701190a853 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:32 +00:00
4a5d224e26 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:32 +00:00
c948ed897f Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:31 +00:00
9f83c4003a Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:31 +00:00
60ad89af8d Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:30 +00:00
f59c3ac6e4 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:30 +00:00
25aae80175 Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:29 +00:00
8a784023df Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:29 +00:00
d105b3086e Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:28 +00:00
e68734af4d Tower: upload cetmix_tower_ovh 16.0.1.0.1 (via marketplace) 2026-04-27 06:46:28 +00:00
80aca5c42e Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:35 +00:00
91cc351b9f Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:34 +00:00
3727eff0a1 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:34 +00:00
98e8f2c77f Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:33 +00:00
d9cc0ef9d3 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:33 +00:00
20e5e555f1 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:32 +00:00
156a6a6cb6 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:32 +00:00
2c57c4598c Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:31 +00:00
130678682c Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:31 +00:00
ca706b0281 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:30 +00:00
9ff2b454fb Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:30 +00:00
5362042060 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:29 +00:00
59c05047e6 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:29 +00:00
dabc32defa Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:28 +00:00
d0ba4497b8 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:28 +00:00
cbdbb2cb4f Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:27 +00:00
8090db41fd Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:27 +00:00
e4b8bf49c6 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:26 +00:00
f91e4f7f47 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:26 +00:00
2185ab4d96 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:25 +00:00
8b55326dbd Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:25 +00:00
29de3846b7 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:24 +00:00
781f6703f2 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:24 +00:00
7901b11a6d Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:23 +00:00
136351e574 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:22 +00:00
004fe34221 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:22 +00:00
dc15afe84c Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:21 +00:00
298b4baeae Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:21 +00:00
efa72f8d96 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:21 +00:00
d5d8cca96e Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:20 +00:00
34676028f9 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:20 +00:00
6639a57225 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:19 +00:00
e084da09e7 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:18 +00:00
8afc6b5c10 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:18 +00:00
28b558e0eb Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:18 +00:00
18d55d8ef9 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:17 +00:00
ded62cb3f1 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:17 +00:00
da00ab06c2 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:16 +00:00
4021aeef49 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:15 +00:00
3cf5653f0d Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:15 +00:00
779e44f63a Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:14 +00:00
17f8d7bb98 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:14 +00:00
47e0d157a2 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:13 +00:00
bcfaf764a4 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:13 +00:00
cd38fe180c Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:12 +00:00
51b54d0dc6 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:12 +00:00
a452163d96 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:11 +00:00
1457492697 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:11 +00:00
c7ce387900 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:10 +00:00
7131dbd052 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:10 +00:00
1a2c8df31e Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:09 +00:00
d2d280c2e3 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:09 +00:00
7480c912b5 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:08 +00:00
307fb2c8a3 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:08 +00:00
85dcab4226 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:07 +00:00
da7bb49726 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:07 +00:00
17c5b9b811 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:06 +00:00
458ca8b40c Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:06 +00:00
9bf906a371 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:05 +00:00
b1e7ce7277 Tower: upload cetmix_tower_git 16.0.2.0.4 (via marketplace) 2026-04-27 06:45:05 +00:00
0fb461e3df Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:43 +00:00
fdb9083e95 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:42 +00:00
ab645f0fe9 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:42 +00:00
290ce48514 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:41 +00:00
b6c35b9f76 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:41 +00:00
5c90e911b0 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:40 +00:00
b63181ae6b Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:39 +00:00
bc72822fe4 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:39 +00:00
29d6e2157c Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:38 +00:00
6b851b5033 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:38 +00:00
cad2a32394 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:38 +00:00
b251ba9709 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:37 +00:00
812fb1ff32 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:36 +00:00
0e299769bb Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:36 +00:00
956fed6616 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:35 +00:00
ef982e5d22 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:35 +00:00
fe589090d7 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:34 +00:00
6100570511 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:34 +00:00
c25370304e Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:33 +00:00
203d561a5d Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:33 +00:00
987367d1ca Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:32 +00:00
f7523e073f Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:32 +00:00
f42fd8a333 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:31 +00:00
bf39b6c79e Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:30 +00:00
33dbbb5178 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:30 +00:00
db79948886 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:29 +00:00
cf09b40b4a Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:29 +00:00
fbc5aedf35 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:28 +00:00
31c0f1566b Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:28 +00:00
16786404e1 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:27 +00:00
050d68c0d1 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:27 +00:00
9f807e8e1d Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:26 +00:00
851c2d0239 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:26 +00:00
f9ab417fdf Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:25 +00:00
6702e0714f Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:25 +00:00
fa16558cda Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:24 +00:00
5328e0be5d Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:24 +00:00
1bd02406d4 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:23 +00:00
a4c34fb326 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:23 +00:00
80a70b758d Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:22 +00:00
0a333efddb Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:22 +00:00
a4cf1a2957 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:21 +00:00
59e5709f28 Tower: upload cetmix_tower 16.0.2.1.0 (via marketplace) 2026-04-27 06:44:21 +00:00
1195eb23b1 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:13 +00:00
69f00977ae Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:12 +00:00
fc8b8b8a9a Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:12 +00:00
07a3160ed5 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:11 +00:00
1496fbfa53 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:11 +00:00
780593c0b6 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:10 +00:00
db891f43ce Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:10 +00:00
3357d9a86b Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:09 +00:00
43a7ca4b5e Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:09 +00:00
c764a356ce Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:08 +00:00
4a881b9eaf Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:08 +00:00
76d70ea861 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:07 +00:00
959a04e1cc Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:07 +00:00
bf8fbcc9e3 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:06 +00:00
f9fe46154a Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:06 +00:00
c97921b2ea Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:05 +00:00
95967f2f45 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:05 +00:00
552c05599f Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:04 +00:00
837d110796 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:04 +00:00
fcc7e84300 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:03 +00:00
9080bc85f2 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:03 +00:00
512f1a8f4d Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:02 +00:00
4faa6b9af4 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:02 +00:00
019ee02912 Tower: upload cetmix_tower_server_queue 16.0.2.0.0 (via marketplace) 2026-04-27 06:44:01 +00:00
536 changed files with 0 additions and 74203 deletions

View File

@@ -1,46 +0,0 @@
====================================
Odoo 19 Accounting Financial Reports
====================================
This Module will provide all the financial reports for odoo 19
community edition
Installation
============
To install this module, you need to:
Download the module and add it to your Odoo addons folder. Afterward, log on to
your Odoo server and go to the Apps menu. Trigger the debug mode and update the
list by clicking on the "Update Apps List" link. Now install the module by
clicking on the install button.
Upgrade
============
To upgrade this module, you need to:
Download the module and add it to your Odoo addons folder. Restart the server
and log on to your Odoo server. Select the Apps menu and upgrade the module by
clicking on the upgrade button.
Configuration
=============
There is Nothing to Configure
Credits
=======
Contributors
------------
* Odoo Mates <odoomates@gmail.com>
Author & Maintainer
-------------------
This module is maintained by the Odoo Mates

View File

@@ -1,7 +0,0 @@
from . import wizard
from . import models
from . import report
def _pre_init_clean_m2m_models(env):
env.cr.execute("""DROP TABLE IF EXISTS account_journal_account_report_partner_ledger_rel""")

View File

@@ -1,45 +0,0 @@
{
'name': 'Odoo 19 Accounting Financial Reports',
'version': '19.0.1.0.2', # __odoosky_original_version__: '1.0.2'
'category': 'Invoicing Management',
'description': 'Accounting Reports For Odoo 19, Accounting Financial Reports, '
'Odoo 19 Financial Reports',
'summary': 'Accounting Reports For Odoo 19',
'sequence': '1',
'author': 'Odoo Mates, Odoo SA',
'license': 'LGPL-3',
'company': 'Odoo Mates',
'maintainer': 'Odoo Mates',
'support': 'odoomates@gmail.com',
'website': 'https://www.youtube.com/watch?v=yA4NLwOLZms',
'depends': ['account'],
'live_test_url': 'https://www.youtube.com/watch?v=yA4NLwOLZms',
'data': [
'security/ir.model.access.csv',
'data/account_account_type.xml',
'views/menu.xml',
'views/ledger_menu.xml',
'views/financial_report.xml',
'views/settings.xml',
'wizard/account_report_common_view.xml',
'wizard/partner_ledger.xml',
'wizard/general_ledger.xml',
'wizard/trial_balance.xml',
'wizard/balance_sheet.xml',
'wizard/profit_and_loss.xml',
'wizard/tax_report.xml',
'wizard/aged_partner.xml',
'wizard/journal_audit.xml',
'report/report.xml',
'report/report_partner_ledger.xml',
'report/report_general_ledger.xml',
'report/report_trial_balance.xml',
'report/report_financial.xml',
'report/report_tax.xml',
'report/report_aged_partner.xml',
'report/report_journal_audit.xml',
'report/report_journal_entries.xml',
],
'pre_init_hook': '_pre_init_clean_m2m_models',
'images': ['static/description/banner.gif'],
}

View File

@@ -1,96 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record model="account.account.type" id="data_account_type_receivable">
<field name="name">Receivable</field>
<field name="type">asset_receivable</field>
</record>
<record model="account.account.type" id="data_account_type_payable">
<field name="name">Payable</field>
<field name="type">liability_payable</field>
</record>
<record model="account.account.type" id="data_account_type_liquidity">
<field name="name">Bank and Cash</field>
<field name="type">asset_cash</field>
</record>
<record model="account.account.type" id="data_account_type_credit_card">
<field name="name">Credit Card</field>
<field name="type">liability_credit_card</field>
</record>
<record model="account.account.type" id="data_account_type_current_assets">
<field name="name">Current Assets</field>
<field name="type">asset_current</field>
</record>
<record model="account.account.type" id="data_account_type_non_current_assets">
<field name="name">Non-current Assets</field>
<field name="type">asset_non_current</field>
</record>
<record model="account.account.type" id="data_account_type_prepayments">
<field name="name">Prepayments</field>
<field name="type">asset_prepayments</field>
</record>
<record model="account.account.type" id="data_account_type_fixed_assets">
<field name="name">Fixed Assets</field>
<field name="type">asset_fixed</field>
</record>
<record model="account.account.type" id="data_account_type_current_liabilities">
<field name="name">Current Liabilities</field>
<field name="type">liability_current</field>
</record>
<record model="account.account.type" id="data_account_type_non_current_liabilities">
<field name="name">Non-current Liabilities</field>
<field name="type">liability_non_current</field>
</record>
<record model="account.account.type" id="data_account_type_equity">
<field name="name">Equity</field>
<field name="type">equity</field>
</record>
<record model="account.account.type" id="data_unaffected_earnings">
<field name="name">Current Year Earnings</field>
<field name="type">equity_unaffected</field>
</record>
<record model="account.account.type" id="data_account_type_revenue">
<field name="name">Income</field>
<field name="type">income</field>
</record>
<record model="account.account.type" id="data_account_type_other_income">
<field name="name">Other Income</field>
<field name="type">income_other</field>
</record>
<record model="account.account.type" id="data_account_type_expenses">
<field name="name">Expenses</field>
<field name="type">expense</field>
</record>
<record model="account.account.type" id="data_account_type_depreciation">
<field name="name">Depreciation</field>
<field name="type">expense_depreciation</field>
</record>
<record model="account.account.type" id="data_account_type_direct_costs">
<field name="name">Cost of Revenue</field>
<field name="type">expense_direct_cost</field>
</record>
<record model="account.account.type" id="data_account_off_sheet">
<field name="name">Off-Balance Sheet</field>
<field name="type">off_balance</field>
</record>
</data>
</odoo>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +0,0 @@
from . import account_account_type
from . import account_financial_report
from . import account_move_line

View File

@@ -1,34 +0,0 @@
from odoo import api, models, fields
class AccountAccountType(models.Model):
_name = "account.account.type"
_description = "Account Account Type"
name = fields.Char('Name', required=True, translate=True)
type = fields.Selection(
selection=[
("asset_receivable", "Receivable"),
("asset_cash", "Bank and Cash"),
("asset_current", "Current Assets"),
("asset_non_current", "Non-current Assets"),
("asset_prepayments", "Prepayments"),
("asset_fixed", "Fixed Assets"),
("liability_payable", "Payable"),
("liability_credit_card", "Credit Card"),
("liability_current", "Current Liabilities"),
("liability_non_current", "Non-current Liabilities"),
("equity", "Equity"),
("equity_unaffected", "Current Year Earnings"),
("income", "Income"),
("income_other", "Other Income"),
("expense", "Expenses"),
("expense_depreciation", "Depreciation"),
("expense_direct_cost", "Cost of Revenue"),
("off_balance", "Off-Balance Sheet"),
],
string="Type",
help="These types are defined according to your country. The type contains more information " \
"about the account and its specificities."
)

View File

@@ -1,74 +0,0 @@
from odoo import api, models, fields
class AccountFinancialReport(models.Model):
_name = "account.financial.report"
_description = "Account Report"
@api.depends('parent_id', 'parent_id.level')
def _get_level(self):
'''Returns a dictionary with key=the ID of a record and value = the level of this
record in the tree structure.'''
for report in self:
level = 0
if report.parent_id:
level = report.parent_id.level + 1
report.level = level
def _get_children_by_order(self):
res = self
children = self.search([('parent_id', 'in', self.ids)], order='sequence ASC')
if children:
for child in children:
res += child._get_children_by_order()
return res
name = fields.Char('Report Name', required=True, translate=True)
parent_id = fields.Many2one('account.financial.report', 'Parent')
children_ids = fields.One2many('account.financial.report', 'parent_id', 'Account Report')
sequence = fields.Integer('Sequence')
level = fields.Integer(compute='_get_level', string='Level', store=True, recursive=True)
type = fields.Selection([
('sum', 'View'),
('accounts', 'Accounts'),
('account_type', 'Account Type'),
('account_report', 'Report Value'),
], 'Type', default='sum')
account_ids = fields.Many2many(
'account.account', 'account_account_financial_report',
'report_line_id', 'account_id', 'Accounts'
)
account_report_id = fields.Many2one('account.financial.report', 'Report Value')
account_type_ids = fields.Many2many(
'account.account.type', 'account_account_financial_report_type',
'report_id', 'account_type_id', 'Account Types'
)
report_domain = fields.Char(string="Report Domain")
sign = fields.Selection(
[('-1', 'Reverse balance sign'), ('1', 'Preserve balance sign')], 'Sign on Reports',
required=True, default='1',
help='For accounts that are typically more debited than credited and that you would '
'like to print as negative amounts in your reports, you should reverse the sign '
'of the balance; e.g.: Expense account. The same applies for accounts that are '
'typically more credited than debited and that you would like to print as positive '
'amounts in your reports; e.g.: Income account.'
)
display_detail = fields.Selection([
('no_detail', 'No detail'),
('detail_flat', 'Display children flat'),
('detail_with_hierarchy', 'Display children with hierarchy')
], 'Display details', default='detail_flat')
style_overwrite = fields.Selection([
('0', 'Automatic formatting'),
('1', 'Main Title 1 (bold, underlined)'),
('2', 'Title 2 (bold)'),
('3', 'Title 3 (bold, smaller)'),
('4', 'Normal Text'),
('5', 'Italic Text (smaller)'),
('6', 'Smallest Text'),
], 'Financial Report Style', default='0',
help="You can set up here the format you want this record to be displayed. "
"If you leave the automatic formatting, it will be computed based on the "
"financial reports hierarchy (auto-computed field 'level').")
children_ids = fields.One2many('account.financial.report', 'parent_id', string='Children')

View File

@@ -1,117 +0,0 @@
import ast
from odoo.osv import expression
from odoo import api, models, fields
class AccountMoveLine(models.Model):
_inherit = "account.move.line"
@api.model
def _where_calc(self, domain, active_test=True):
"""Computes the WHERE clause needed to implement an OpenERP domain.
:param list domain: the domain to compute
:param bool active_test: whether the default filtering of records with
``active`` field set to ``False`` should be applied.
:return: the query expressing the given domain as provided in domain
:rtype: Query
"""
# if the object has an active field ('active', 'x_active'), filter out all
# inactive records unless they were explicitly asked for
if self._active_name and active_test and self.env.context.get('active_test', True):
# the item[0] trick below works for domain items and '&'/'|'/'!'
# operators too
if not any(item[0] == self._active_name for item in domain):
domain = [(self._active_name, '=', 1)] + domain
if domain:
return expression.expression(domain, self).query
else:
return Query(self.env, self._table, self._table_sql)
@api.model
def _apply_ir_rules(self, query, mode='read'):
"""Add what's missing in ``query`` to implement all appropriate ir.rules
(using the ``model_name``'s rules or the current model's rules if ``model_name`` is None)
:param query: the current query object
"""
if self.env.su:
return
# apply main rules on the object
Rule = self.env['ir.rule']
domain = Rule._compute_domain(self._name, mode)
if domain:
expression.expression(domain, self.sudo(), self._table, query)
@api.model
def _query_get(self, domain=None):
self.check_access('read')
context = dict(self.env.context or {})
domain = domain or []
if not isinstance(domain, (list, tuple)):
domain = ast.literal_eval(domain)
date_field = 'date'
if context.get('aged_balance'):
date_field = 'date_maturity'
if context.get('date_to'):
domain += [(date_field, '<=', context['date_to'])]
if context.get('date_from'):
if not context.get('strict_range'):
domain += ['|', (date_field, '>=', context['date_from']), ('account_id.include_initial_balance', '=', True)]
elif context.get('initial_bal'):
domain += [(date_field, '<', context['date_from'])]
else:
domain += [(date_field, '>=', context['date_from'])]
if context.get('journal_ids'):
domain += [('journal_id', 'in', context['journal_ids'])]
state = context.get('state')
if state and state.lower() != 'all':
domain += [('parent_state', '=', state)]
if context.get('company_id'):
domain += [('company_id', '=', context['company_id'])]
elif context.get('allowed_company_ids'):
domain += [('company_id', 'in', self.env.companies.ids)]
else:
domain += [('company_id', '=', self.env.company.id)]
if context.get('reconcile_date'):
domain += ['|', ('reconciled', '=', False), '|', ('matched_debit_ids.max_date', '>', context['reconcile_date']), ('matched_credit_ids.max_date', '>', context['reconcile_date'])]
if context.get('account_tag_ids'):
domain += [('account_id.tag_ids', 'in', context['account_tag_ids'].ids)]
if context.get('account_ids'):
domain += [('account_id', 'in', context['account_ids'].ids)]
if context.get('analytic_tag_ids'):
domain += [('analytic_tag_ids', 'in', context['analytic_tag_ids'].ids)]
if context.get('analytic_account_ids'):
domain += [('analytic_distribution', 'in', context['analytic_account_ids'].ids)]
if context.get('partner_ids'):
domain += [('partner_id', 'in', context['partner_ids'].ids)]
if context.get('partner_categories'):
domain += [('partner_id.category_id', 'in', context['partner_categories'].ids)]
where_clause = ""
where_clause_params = []
tables = ''
if domain:
domain.append(('display_type', 'not in', ('line_section', 'line_note')))
domain.append(('parent_state', '!=', 'cancel'))
query = self._where_calc(domain)
self._apply_ir_rules(query)
from_string, from_params = query.from_clause
where_string, where_params = query.where_clause
tables, where_clause, where_clause_params = from_string, where_string, from_params + where_params
return tables, where_clause, where_clause_params

View File

@@ -1,12 +0,0 @@
from . import report_partner_ledger
from . import report_general_ledger
from . import report_trial_balance
from . import report_tax
from . import report_aged_partner
from . import report_journal
from . import report_financial

View File

@@ -1,71 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="action_report_general_ledger" model="ir.actions.report">
<field name="name">General Ledger</field>
<field name="model">account.report.general.ledger</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_general_ledger</field>
<field name="report_file">accounting_pdf_reports.report_general_ledger</field>
</record>
<record id="action_report_partnerledger" model="ir.actions.report">
<field name="name">Partner Ledger</field>
<field name="model">account.report.partner.ledger</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_partnerledger</field>
<field name="report_file">accounting_pdf_reports.report_partnerledger</field>
</record>
<record id="action_report_trial_balance" model="ir.actions.report">
<field name="name">Trial Balance</field>
<field name="model">account.balance.report</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_trialbalance</field>
<field name="report_file">accounting_pdf_reports.report_trialbalance</field>
</record>
<record id="action_report_financial" model="ir.actions.report">
<field name="name">Financial Report</field>
<field name="model">account.financial.report</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_financial</field>
<field name="report_file">accounting_pdf_reports.report_financial</field>
</record>
<record id="action_report_account_tax" model="ir.actions.report">
<field name="name">Tax Report</field>
<field name="model">account.tax.report.wizard</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_tax</field>
<field name="report_file">accounting_pdf_reports.report_tax</field>
</record>
<record id="action_report_aged_partner_balance" model="ir.actions.report">
<field name="name">Aged Partner Balance</field>
<field name="model">res.partner</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_agedpartnerbalance</field>
<field name="report_file">accounting_pdf_reports.report_agedpartnerbalance</field>
</record>
<record id="action_report_journal" model="ir.actions.report">
<field name="name">Journals Audit</field>
<field name="model">account.common.journal.report</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_journal</field>
<field name="report_file">accounting_pdf_reports.report_journal</field>
</record>
<record id="action_report_journal_entries" model="ir.actions.report">
<field name="name">Journals Entries</field>
<field name="model">account.move</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">accounting_pdf_reports.report_journal_entries</field>
<field name="report_file">accounting_pdf_reports.report_journal_entries</field>
<field name="binding_model_id" ref="account.model_account_move"/>
<field name="binding_type">report</field>
</record>
</odoo>

View File

@@ -1,263 +0,0 @@
import time
from odoo import api, models, fields, _
from odoo.exceptions import UserError
from odoo.tools import float_is_zero
from datetime import datetime
from dateutil.relativedelta import relativedelta
class ReportAgedPartnerBalance(models.AbstractModel):
_name = 'report.accounting_pdf_reports.report_agedpartnerbalance'
_description = 'Aged Partner Balance Report'
def _get_partner_move_lines(self, account_type, partner_ids,
date_from, target_move, period_length):
# This method can receive the context key 'include_nullified_amount' {Boolean}
# Do an invoice and a payment and unreconcile. The amount will be nullified
# By default, the partner wouldn't appear in this report.
# The context key allow it to appear
# In case of a period_length of 30 days as of 2019-02-08, we want the following periods:
# Name Stop Start
# 1 - 30 : 2019-02-07 - 2019-01-09
# 31 - 60 : 2019-01-08 - 2018-12-10
# 61 - 90 : 2018-12-09 - 2018-11-10
# 91 - 120 : 2018-11-09 - 2018-10-11
# +120 : 2018-10-10
periods = {}
start = datetime.strptime(str(date_from), "%Y-%m-%d")
date_from = datetime.strptime(str(date_from), "%Y-%m-%d").date()
for i in range(5)[::-1]:
stop = start - relativedelta(days=period_length)
period_name = str((5-(i+1)) * period_length + 1) + '-' + str((5-i) * period_length)
period_stop = (start - relativedelta(days=1)).strftime('%Y-%m-%d')
if i == 0:
period_name = '+' + str(4 * period_length)
periods[str(i)] = {
'name': period_name,
'stop': period_stop,
'start': (i!=0 and stop.strftime('%Y-%m-%d') or False),
}
start = stop
res = []
total = []
cr = self.env.cr
user_company = self.env.user.company_id
user_currency = user_company.currency_id
company_ids = self.env.context.get('company_ids') or [user_company.id]
move_state = ['draft', 'posted']
date = self.env.context.get('date') or fields.Date.today()
company = self.env['res.company'].browse(self.env.context.get('company_id')) or self.env.company
if target_move == 'posted':
move_state = ['posted']
arg_list = (tuple(move_state), tuple(account_type))
reconciliation_clause = '(l.reconciled IS FALSE)'
cr.execute('SELECT debit_move_id, credit_move_id FROM account_partial_reconcile where max_date > %s', (date_from,))
reconciled_after_date = []
for row in cr.fetchall():
reconciled_after_date += [row[0], row[1]]
if reconciled_after_date:
reconciliation_clause = '(l.reconciled IS FALSE OR l.id IN %s)'
arg_list += (tuple(reconciled_after_date),)
arg_list += (date_from, tuple(company_ids))
query = '''
SELECT DISTINCT l.partner_id, UPPER(res_partner.name)
FROM account_move_line AS l left join res_partner on l.partner_id = res_partner.id, account_account, account_move am
WHERE (l.account_id = account_account.id)
AND (l.move_id = am.id)
AND (am.state IN %s)
AND (account_account.account_type IN %s)
AND ''' + reconciliation_clause + '''
AND (l.date <= %s)
AND l.company_id IN %s
ORDER BY UPPER(res_partner.name)'''
cr.execute(query, arg_list)
partners = cr.dictfetchall()
# put a total of 0
for i in range(7):
total.append(0)
# Build a string like (1,2,3) for easy use in SQL query
if not partner_ids:
partner_ids = [partner['partner_id'] for partner in partners if partner['partner_id']]
lines = dict((partner['partner_id'] or False, []) for partner in partners)
if not partner_ids:
return [], [], {}
# This dictionary will store the not due amount of all partners
undue_amounts = {}
query = '''SELECT l.id
FROM account_move_line AS l, account_account, account_move am
WHERE (l.account_id = account_account.id) AND (l.move_id = am.id)
AND (am.state IN %s)
AND (account_account.account_type IN %s)
AND (COALESCE(l.date_maturity,l.date) >= %s)\
AND ((l.partner_id IN %s) OR (l.partner_id IS NULL))
AND (l.date <= %s)
AND l.company_id IN %s'''
cr.execute(query, (tuple(move_state), tuple(account_type), date_from,
tuple(partner_ids), date_from, tuple(company_ids)))
aml_ids = cr.fetchall()
aml_ids = aml_ids and [x[0] for x in aml_ids] or []
for line in self.env['account.move.line'].browse(aml_ids):
partner_id = line.partner_id.id or False
if partner_id not in undue_amounts:
undue_amounts[partner_id] = 0.0
line_amount = line.company_id.currency_id._convert(line.balance,
user_currency,
company, date)
if user_currency.is_zero(line_amount):
continue
for partial_line in line.matched_debit_ids:
if partial_line.max_date <= date_from:
line_currency = partial_line.company_id.currency_id
line_amount += line_currency._convert(partial_line.amount,
user_currency,
company, date)
for partial_line in line.matched_credit_ids:
if partial_line.max_date <= date_from:
line_currency = partial_line.company_id.currency_id
line_amount -= line_currency._convert(partial_line.amount,
user_currency,
company, date)
if not self.env.user.company_id.currency_id.is_zero(line_amount):
undue_amounts[partner_id] += line_amount
lines[partner_id].append({
'line': line,
'amount': line_amount,
'period': 6,
})
# Use one query per period and store results in history (a list variable)
# Each history will contain: history[1] = {'<partner_id>': <partner_debit-credit>}
history = []
for i in range(5):
args_list = (tuple(move_state), tuple(account_type), tuple(partner_ids),)
dates_query = '(COALESCE(l.date_maturity,l.date)'
if periods[str(i)]['start'] and periods[str(i)]['stop']:
dates_query += ' BETWEEN %s AND %s)'
args_list += (periods[str(i)]['start'], periods[str(i)]['stop'])
elif periods[str(i)]['start']:
dates_query += ' >= %s)'
args_list += (periods[str(i)]['start'],)
else:
dates_query += ' <= %s)'
args_list += (periods[str(i)]['stop'],)
args_list += (date_from, tuple(company_ids))
query = '''SELECT l.id
FROM account_move_line AS l, account_account, account_move am
WHERE (l.account_id = account_account.id) AND (l.move_id = am.id)
AND (am.state IN %s)
AND (account_account.account_type IN %s)
AND ((l.partner_id IN %s) OR (l.partner_id IS NULL))
AND ''' + dates_query + '''
AND (l.date <= %s)
AND l.company_id IN %s'''
cr.execute(query, args_list)
partners_amount = {}
aml_ids = cr.fetchall()
aml_ids = aml_ids and [x[0] for x in aml_ids] or []
for line in self.env['account.move.line'].browse(aml_ids):
partner_id = line.partner_id.id or False
if partner_id not in partners_amount:
partners_amount[partner_id] = 0.0
line_currency_id = line.company_id.currency_id
line_amount = line_currency_id._convert(line.balance, user_currency, company, date)
if user_currency.is_zero(line_amount):
continue
for partial_line in line.matched_debit_ids:
if partial_line.max_date <= date_from:
line_currency_id = partial_line.company_id.currency_id
line_amount += line_currency_id._convert(
partial_line.amount, user_currency, company, date)
for partial_line in line.matched_credit_ids:
if partial_line.max_date <= date_from:
line_currency_id = partial_line.company_id.currency_id
line_amount -= line_currency_id._convert(
partial_line.amount, user_currency, company, date)
if not self.env.user.company_id.currency_id.is_zero(line_amount):
partners_amount[partner_id] += line_amount
lines[partner_id].append({
'line': line,
'amount': line_amount,
'period': i + 1,
})
history.append(partners_amount)
for partner in partners:
if partner['partner_id'] is None:
partner['partner_id'] = False
at_least_one_amount = False
values = {}
undue_amt = 0.0
if partner['partner_id'] in undue_amounts: # Making sure this partner actually was found by the query
undue_amt = undue_amounts[partner['partner_id']]
total[6] = total[6] + undue_amt
values['direction'] = undue_amt
if not float_is_zero(values['direction'], precision_rounding=self.env.user.company_id.currency_id.rounding):
at_least_one_amount = True
for i in range(5):
during = False
if partner['partner_id'] in history[i]:
during = [history[i][partner['partner_id']]]
# Adding counter
total[(i)] = total[(i)] + (during and during[0] or 0)
values[str(i)] = during and during[0] or 0.0
if not float_is_zero(values[str(i)],
precision_rounding=self.env.user.company_id.currency_id.rounding):
at_least_one_amount = True
values['total'] = sum([values['direction']] + [values[str(i)] for i in range(5)])
## Add for total
total[(i + 1)] += values['total']
values['partner_id'] = partner['partner_id']
if partner['partner_id']:
browsed_partner = self.env['res.partner'].browse(partner['partner_id'])
values['name'] = browsed_partner.name and len(
browsed_partner.name) >= 45 and browsed_partner.name[
0:40] + '...' or browsed_partner.name
values['trust'] = browsed_partner.trust
else:
values['name'] = _('Unknown Partner')
values['trust'] = False
if at_least_one_amount or (self.env.context.get('include_nullified_amount') and lines[partner['partner_id']]):
res.append(values)
return res, total, lines
@api.model
def _get_report_values(self, docids, data=None):
if not data.get('form') or not self.env.context.get('active_model') or not self.env.context.get('active_id'):
raise UserError(_("Form content is missing, this report cannot be printed."))
model = self.env.context.get('active_model')
docs = self.env[model].browse(self.env.context.get('active_id'))
target_move = data['form'].get('target_move', 'all')
date_from = data['form'].get('date_from', time.strftime('%Y-%m-%d'))
if data['form']['result_selection'] == 'customer':
account_type = ['asset_receivable']
elif data['form']['result_selection'] == 'supplier':
account_type = ['liability_payable']
else:
account_type = ['asset_receivable', 'liability_payable']
partner_ids = data['form']['partner_ids']
movelines, total, dummy = self._get_partner_move_lines(
account_type, partner_ids, date_from, target_move, data['form']['period_length']
)
return {
'doc_ids': self.ids,
'doc_model': model,
'data': data['form'],
'docs': docs,
'time': time,
'get_partner_lines': movelines,
'get_direction': total,
}

View File

@@ -1,100 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_agedpartnerbalance">
<t t-call="web.html_container">
<t t-set="data_report_margin_top" t-value="12"/>
<t t-set="data_report_header_spacing" t-value="9"/>
<t t-set="data_report_dpi" t-value="110"/>
<t t-call="web.internal_layout">
<div class="page">
<h2>Aged Partner Balance</h2>
<div class="row mt32">
<div class="col-3">
<strong>Start Date:</strong>
<p t-esc="data['date_from']"/>
</div>
<div class="col-3">
<strong>Period Length (days)</strong>
<p t-esc="data['period_length']"/>
</div>
</div>
<div class="row mb32">
<div class="col-3">
<strong>Partner's:</strong>
<p>
<span t-if="data['result_selection'] == 'customer'">Receivable Accounts</span>
<span t-if="data['result_selection'] == 'supplier'">Payable Accounts</span>
<span t-if="data['result_selection'] == 'customer_supplier'">Receivable and Payable Accounts</span>
</p>
</div>
<div class="col-3">
<strong>Target Moves:</strong>
<p>
<span t-if="data['target_move'] == 'all'">All Entries</span>
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
</p>
</div>
</div>
<table class="table table-sm table-reports">
<thead>
<tr>
<th>Partners</th>
<th class="text-end">
<span>Not due</span>
</th>
<th class="text-end"><span t-esc="data['4']['name']"/></th>
<th class="text-end"><span t-esc="data['3']['name']"/></th>
<th class="text-end"><span t-esc="data['2']['name']"/></th>
<th class="text-end"><span t-esc="data['1']['name']"/></th>
<th class="text-end"><span t-esc="data['0']['name']"/></th>
<th class="text-end">Total</th>
</tr>
<tr t-if="get_partner_lines">
<th>Account Total</th>
<th class="text-end"><span t-esc="get_direction[6]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
<th class="text-end"><span t-esc="get_direction[4]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
<th class="text-end"><span t-esc="get_direction[3]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
<th class="text-end"><span t-esc="get_direction[2]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
<th class="text-end"><span t-esc="get_direction[1]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
<th class="text-end"><span t-esc="get_direction[0]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
<th class="text-end"><span t-esc="get_direction[5]" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></th>
</tr>
</thead>
<tbody>
<tr t-foreach="get_partner_lines" t-as="partner">
<td>
<span t-esc="partner['name']"/>
</td>
<td class="text-end">
<span t-esc="partner['direction']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="partner['4']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="partner['3']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="partner['2']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="partner['1']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="partner['0']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="partner['total']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
</tr>
</tbody>
</table>
</div>
</t>
</t>
</template>
</odoo>

View File

@@ -1,163 +0,0 @@
import time
from odoo import api, models, _
from odoo.exceptions import UserError
class ReportFinancial(models.AbstractModel):
_name = 'report.accounting_pdf_reports.report_financial'
_description = 'Financial Reports'
def _compute_account_balance(self, accounts):
""" compute the balance, debit and credit for the provided accounts
"""
mapping = {
'balance': "COALESCE(SUM(debit),0) - COALESCE(SUM(credit), 0) as balance",
'debit': "COALESCE(SUM(debit), 0) as debit",
'credit': "COALESCE(SUM(credit), 0) as credit",
}
res = {}
for account in accounts:
res[account.id] = dict.fromkeys(mapping, 0.0)
if accounts:
tables, where_clause, where_params = self.env['account.move.line']._query_get()
tables = tables.replace('"', '') if tables else "account_move_line"
wheres = [""]
if where_clause.strip():
wheres.append(where_clause.strip())
filters = " AND ".join(wheres)
request = "SELECT account_id as id, " + ', '.join(mapping.values()) + \
" FROM " + tables + \
" WHERE account_id IN %s " \
+ filters + \
" GROUP BY account_id"
params = (tuple(accounts._ids),) + tuple(where_params)
self.env.cr.execute(request, params)
for row in self.env.cr.dictfetchall():
res[row['id']] = row
return res
def _compute_report_balance(self, reports):
'''returns a dictionary with key=the ID of a record and value=the credit, debit and balance amount
computed for this record. If the record is of type :
'accounts' : it's the sum of the linked accounts
'account_type' : it's the sum of leaf accoutns with such an account_type
'account_report' : it's the amount of the related report
'sum' : it's the sum of the children of this record (aka a 'view' record)'''
res = {}
fields = ['credit', 'debit', 'balance']
for report in reports:
if report.id in res:
continue
res[report.id] = dict((fn, 0.0) for fn in fields)
if report.type == 'accounts':
# it's the sum of the linked accounts
res[report.id]['account'] = self._compute_account_balance(report.account_ids)
for value in res[report.id]['account'].values():
for field in fields:
res[report.id][field] += value.get(field)
elif report.type == 'account_type':
# it's the sum the leaf accounts with such an account type
accounts = self.env['account.account'].search(
[('account_type', 'in', report.account_type_ids.mapped('type'))])
res[report.id]['account'] = self._compute_account_balance(accounts)
for value in res[report.id]['account'].values():
for field in fields:
res[report.id][field] += value.get(field)
elif report.type == 'account_report' and report.account_report_id:
# it's the amount of the linked report
res2 = self._compute_report_balance(report.account_report_id)
for key, value in res2.items():
for field in fields:
res[report.id][field] += value[field]
elif report.type == 'sum':
# it's the sum of the children of this account.report
res2 = self._compute_report_balance(report.children_ids)
for key, value in res2.items():
for field in fields:
res[report.id][field] += value[field]
return res
def get_account_lines(self, data):
lines = []
account_report = self.env['account.financial.report'].search(
[('id', '=', data['account_report_id'][0])])
child_reports = account_report._get_children_by_order()
res = self.with_context(data.get('used_context'))._compute_report_balance(child_reports)
if data['enable_filter']:
comparison_res = self.with_context(
data.get('comparison_context'))._compute_report_balance(
child_reports)
for report_id, value in comparison_res.items():
res[report_id]['comp_bal'] = value['balance']
report_acc = res[report_id].get('account')
if report_acc:
for account_id, val in comparison_res[report_id].get('account').items():
report_acc[account_id]['comp_bal'] = val['balance']
for report in child_reports:
vals = {
'name': report.name,
'balance': res[report.id]['balance'] * float(report.sign),
'type': 'report',
'level': bool(report.style_overwrite) and report.style_overwrite or report.level,
'account_type': report.type or False, #used to underline the financial report balances
}
if data['debit_credit']:
vals['debit'] = res[report.id]['debit']
vals['credit'] = res[report.id]['credit']
if data['enable_filter']:
vals['balance_cmp'] = res[report.id]['comp_bal'] * float(report.sign)
lines.append(vals)
if report.display_detail == 'no_detail':
#the rest of the loop is used to display the details of the financial report, so it's not needed here.
continue
if res[report.id].get('account'):
sub_lines = []
for account_id, value in res[report.id]['account'].items():
#if there are accounts to display, we add them to the lines with a level equals to their level in
#the COA + 1 (to avoid having them with a too low level that would conflicts with the level of data
#financial reports for Assets, liabilities...)
flag = False
account = self.env['account.account'].browse(account_id)
vals = {
'name': account.code + ' ' + account.name,
'balance': value['balance'] * float(report.sign) or 0.0,
'type': 'account',
'level': report.display_detail == 'detail_with_hierarchy' and 4,
'account_type': account.account_type,
}
if data['debit_credit']:
vals['debit'] = value['debit']
vals['credit'] = value['credit']
if not self.env.company.currency_id.is_zero(vals['debit']) or not self.env.company.currency_id.is_zero(vals['credit']):
flag = True
if not self.env.company.currency_id.is_zero(vals['balance']):
flag = True
if data['enable_filter']:
vals['balance_cmp'] = value['comp_bal'] * float(report.sign)
if not self.env.company.currency_id.is_zero(vals['balance_cmp']):
flag = True
if flag:
sub_lines.append(vals)
lines += sorted(sub_lines, key=lambda sub_line: sub_line['name'])
return lines
@api.model
def _get_report_values(self, docids, data=None):
if not data.get('form') or not self.env.context.get('active_model') or not self.env.context.get('active_id'):
raise UserError(_("Form content is missing, this report cannot be printed."))
model = self.env.context.get('active_model')
docs = self.env[model].browse(self.env.context.get('active_id'))
report_lines = self.get_account_lines(data.get('form'))
return {
'doc_ids': self.ids,
'doc_model': model,
'data': data['form'],
'docs': docs,
'time': time,
'get_account_lines': report_lines,
}

View File

@@ -1,116 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_financial">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-call="web.internal_layout">
<div class="page">
<h2 t-esc="data['account_report_id'][1]"/>
<div class="row mt32 mb32">
<div class="col-4">
<strong>Target Moves:</strong>
<p>
<span t-if="data['target_move'] == 'all'">All Entries</span>
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
</p>
</div>
<div class="col-4">
<p>
<t t-if="data['date_from']"><strong>Date from :</strong> <span t-esc="data['date_from']"/><br/></t>
<t t-if="data['date_to']"><strong>Date to :</strong> <span t-esc="data['date_to']"/></t>
</p>
</div>
</div>
<table class="table table-sm table-reports" t-if="data['debit_credit'] == 1">
<thead>
<tr>
<th>Name</th>
<th class="text-end">Debit</th>
<th class="text-end">Credit</th>
<th class="text-end">Balance</th>
</tr>
</thead>
<tbody>
<tr t-foreach="get_account_lines" t-as="a">
<t t-if="a['level'] != 0">
<t t-if="int(a.get('level')) &gt; 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
<t t-if="not int(a.get('level')) &gt; 3"><t t-set="style" t-value="'font-weight: bold;'"/></t>
<td>
<span style="color: white;" t-esc="'..' * int(a.get('level', 0))"/>
<span t-att-style="style" t-esc="a.get('name')"/>
</td>
<td class="text-end" style="white-space: text-nowrap;">
<span t-att-style="style" t-esc="a.get('debit')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end" style="white-space: text-nowrap;">
<span t-att-style="style" t-esc="a.get('credit')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end" style="white-space: text-nowrap;">
<span t-att-style="style" t-esc="a.get('balance')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
</t>
</tr>
</tbody>
</table>
<table class="table table-sm table-reports" t-if="not data['enable_filter'] and not data['debit_credit']">
<thead>
<tr>
<th>Name</th>
<th class="text-end">Balance</th>
</tr>
</thead>
<tbody>
<tr t-foreach="get_account_lines" t-as="a">
<t t-if="a['level'] != 0">
<t t-if="int(a.get('level')) &gt; 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
<t t-if="not int(a.get('level')) &gt; 3"><t t-set="style" t-value="'font-weight: bold;'"/></t>
<td>
<span style="color: white;" t-esc="'..' * int(a.get('level', 0))"/>
<span t-att-style="style" t-esc="a.get('name')"/>
</td>
<td class="text-end"><span t-att-style="style" t-esc="a.get('balance')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
</t>
</tr>
</tbody>
</table>
<table class="table table-sm table-reports" t-if="data['enable_filter'] == 1 and not data['debit_credit']">
<thead>
<tr>
<th>Name</th>
<th class="text-end">Balance</th>
<th class="text-end"><span t-esc="data['label_filter']"/></th>
</tr>
</thead>
<tbody>
<tr t-foreach="get_account_lines" t-as="a">
<t t-if="a['level'] != 0">
<t t-if="int(a.get('level')) &gt; 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
<t t-if="not int(a.get('level')) &gt; 3"><t t-set="style" t-value="'font-weight: bold;'"/></t>
<td>
<span style="color: white;" t-esc="'..'"/>
<span t-att-style="style" t-esc="a.get('name')"/>
</td>
<td class="text-end">
<span t-att-style="style" t-esc="a.get('balance')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-att-style="style" t-esc="a.get('balance_cmp')" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
</t>
</tr>
</tbody>
</table>
</div>
</t>
</t>
</t>
</template>
</odoo>

View File

@@ -1,184 +0,0 @@
import time
from odoo import api, models, _
from odoo.exceptions import UserError
class ReportGeneralLedger(models.AbstractModel):
_name = 'report.accounting_pdf_reports.report_general_ledger'
_description = 'General Ledger Report'
def _get_account_move_entry(self, accounts, analytic_account_ids,
partner_ids, init_balance,
sortby, display_account):
"""
:param:
accounts: the recordset of accounts
analytic_account_ids: the recordset of analytic accounts
init_balance: boolean value of initial_balance
sortby: sorting by date or partner and journal
display_account: type of account(receivable, payable and both)
Returns a dictionary of accounts with following key and value {
'code': account code,
'name': account name,
'debit': sum of total debit amount,
'credit': sum of total credit amount,
'balance': total balance,
'amount_currency': sum of amount_currency,
'move_lines': list of move line
}
"""
cr = self.env.cr
MoveLine = self.env['account.move.line']
move_lines = {x: [] for x in accounts.ids}
# Prepare initial sql query and Get the initial move lines
if init_balance:
context = dict(self.env.context)
context['date_from'] = self.env.context.get('date_from')
context['date_to'] = False
context['initial_bal'] = True
if analytic_account_ids:
context['analytic_account_ids'] = analytic_account_ids
if partner_ids:
context['partner_ids'] = partner_ids
init_tables, init_where_clause, init_where_params = MoveLine.with_context(context)._query_get()
init_wheres = [""]
if init_where_clause.strip():
init_wheres.append(init_where_clause.strip())
init_filters = " AND ".join(init_wheres)
filters = init_filters.replace('account_move_line__move_id', 'm').replace('account_move_line', 'l')
sql = ("""SELECT 0 AS lid, l.account_id AS account_id, '' AS ldate,
'' AS lcode, 0.0 AS amount_currency,
'' AS analytic_account_id, '' AS lref,
'Initial Balance' AS lname, COALESCE(SUM(l.debit),0.0) AS debit,
COALESCE(SUM(l.credit),0.0) AS credit,
COALESCE(SUM(l.debit),0) - COALESCE(SUM(l.credit), 0) as balance,
'' AS lpartner_id,\
'' AS move_name, '' AS move_id, '' AS currency_code,\
NULL AS currency_id,\
'' AS invoice_id, '' AS invoice_type, '' AS invoice_number,\
'' AS partner_name\
FROM account_move_line l\
LEFT JOIN account_move m ON (l.move_id=m.id)\
LEFT JOIN res_currency c ON (l.currency_id=c.id)\
LEFT JOIN res_partner p ON (l.partner_id=p.id)\
JOIN account_journal j ON (l.journal_id=j.id)\
WHERE l.account_id IN %s""" + filters + ' GROUP BY l.account_id')
params = (tuple(accounts.ids),) + tuple(init_where_params)
cr.execute(sql, params)
for row in cr.dictfetchall():
move_lines[row.pop('account_id')].append(row)
sql_sort = 'l.date, l.move_id'
if sortby == 'sort_journal_partner':
sql_sort = 'j.code, p.name, l.move_id'
# Prepare sql query base on selected parameters from wizard
context = dict(self.env.context)
if analytic_account_ids:
context['analytic_account_ids'] = analytic_account_ids
if partner_ids:
context['partner_ids'] = partner_ids
tables, where_clause, where_params = MoveLine.with_context(context)._query_get()
wheres = [""]
if where_clause.strip():
wheres.append(where_clause.strip())
filters = " AND ".join(wheres)
filters = filters.replace('account_move_line__move_id', 'm').replace('account_move_line', 'l')
# Get move lines base on sql query and Calculate the total balance of move lines
sql = ('''SELECT l.id AS lid, l.account_id AS account_id,
l.date AS ldate, j.code AS lcode, l.currency_id,
l.amount_currency, '' AS analytic_account_id,
l.ref AS lref, l.name AS lname, COALESCE(l.debit,0) AS debit,
COALESCE(l.credit,0) AS credit,
COALESCE(SUM(l.debit),0) - COALESCE(SUM(l.credit), 0) AS balance,\
m.name AS move_name, c.symbol AS currency_code,
p.name AS partner_name\
FROM account_move_line l\
JOIN account_move m ON (l.move_id=m.id)\
LEFT JOIN res_currency c ON (l.currency_id=c.id)\
LEFT JOIN res_partner p ON (l.partner_id=p.id)\
JOIN account_journal j ON (l.journal_id=j.id)\
JOIN account_account acc ON (l.account_id = acc.id) \
WHERE l.account_id IN %s ''' + filters + ''' GROUP BY l.id,
l.account_id, l.date, j.code, l.currency_id, l.amount_currency,
l.ref, l.name, m.name, c.symbol, p.name ORDER BY ''' + sql_sort)
params = (tuple(accounts.ids),) + tuple(where_params)
cr.execute(sql, params)
for row in cr.dictfetchall():
balance = 0
for line in move_lines.get(row['account_id']):
balance += line['debit'] - line['credit']
row['balance'] += balance
move_lines[row.pop('account_id')].append(row)
# Calculate the debit, credit and balance for Accounts
account_res = []
for account in accounts:
currency = account.currency_id and account.currency_id or self.env.company.currency_id
res = dict((fn, 0.0) for fn in ['credit', 'debit', 'balance'])
res['code'] = account.code
res['name'] = account.name
res['move_lines'] = move_lines[account.id]
for line in res.get('move_lines'):
res['debit'] += line['debit']
res['credit'] += line['credit']
res['balance'] = line['balance']
if display_account == 'all':
account_res.append(res)
if display_account == 'movement' and res.get('move_lines'):
account_res.append(res)
if display_account == 'not_zero' and not currency.is_zero(res['balance']):
account_res.append(res)
return account_res
@api.model
def _get_report_values(self, docids, data=None):
if not data.get('form') or not self.env.context.get('active_model'):
raise UserError(_("Form content is missing, this report cannot be printed."))
model = self.env.context.get('active_model')
docs = self.env[model].browse(self.env.context.get('active_ids', []))
init_balance = data['form'].get('initial_balance', True)
sortby = data['form'].get('sortby', 'sort_date')
display_account = data['form']['display_account']
codes = []
if data['form'].get('journal_ids', False):
codes = [journal.code for journal in
self.env['account.journal'].search(
[('id', 'in', data['form']['journal_ids'])])]
analytic_account_ids = False
if data['form'].get('analytic_account_ids', False):
analytic_account_ids = self.env['account.analytic.account'].search(
[('id', 'in', data['form']['analytic_account_ids'])])
partner_ids = False
if data['form'].get('partner_ids', False):
partner_ids = self.env['res.partner'].search(
[('id', 'in', data['form']['partner_ids'])])
if model == 'account.account':
accounts = docs
else:
domain = []
if data['form'].get('account_ids', False):
domain.append(('id', 'in', data['form']['account_ids']))
accounts = self.env['account.account'].search(domain)
accounts_res = self.with_context(
data['form'].get('used_context', {}))._get_account_move_entry(
accounts,
analytic_account_ids,
partner_ids,
init_balance, sortby, display_account)
return {
'doc_ids': docids,
'doc_model': model,
'data': data['form'],
'docs': docs,
'time': time,
'Accounts': accounts_res,
'print_journal': codes,
'accounts': accounts,
'partner_ids': partner_ids,
'analytic_account_ids': analytic_account_ids,
}

View File

@@ -1,124 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_general_ledger">
<t t-call="web.html_container">
<t t-set="data_report_margin_top" t-value="12"/>
<t t-set="data_report_header_spacing" t-value="9"/>
<t t-set="data_report_dpi" t-value="110"/>
<t t-call="web.internal_layout">
<div class="page">
<h2><span t-esc="res_company.name"/>: General ledger</h2>
<div class="row mt32">
<div class="col-4">
<strong>Journals:</strong>
<p t-esc="', '.join([ lt or '' for lt in print_journal ])"/>
</div>
<t groups="analytic.group_analytic_accounting">
<t t-if="analytic_account_ids">
<div class="col-4">
<strong>Analytic Accounts:</strong>
<p t-esc="', '.join([aa.name or '' for aa in analytic_account_ids ])"/>
</div>
</t>
</t>
<div class="col-4">
<strong>Display Account</strong>
<p>
<span t-if="data['display_account'] == 'all'">All accounts'</span>
<span t-if="data['display_account'] == 'movement'">With movements</span>
<span t-if="data['display_account'] == 'not_zero'">With balance not equal to zero</span>
</p>
</div>
<div class="col-4">
<strong>Target Moves:</strong>
<p t-if="data['target_move'] == 'all'">All Entries</p>
<p t-if="data['target_move'] == 'posted'">All Posted Entries</p>
</div>
</div>
<div class="row mb32">
<div class="col-4">
<strong>Sorted By:</strong>
<p t-if="data['sortby'] == 'sort_date'">Date</p>
<p t-if="data['sortby'] == 'sort_journal_partner'">Journal and Partner</p>
</div>
<div class="col-4">
<t t-if="data['date_from']"><strong>Date from :</strong> <span t-esc="data['date_from']"/><br/></t>
<t t-if="data['date_to']"><strong>Date to :</strong> <span t-esc="data['date_to']"/></t>
</div>
</div>
<table class="table table-sm table-reports">
<thead>
<tr class="text-center">
<th>Date</th>
<th>JRNL</th>
<th>Partner</th>
<th>Ref</th>
<th>Move</th>
<t groups="analytic.group_analytic_accounting">
<th>Analytic Account</th>
</t>
<th>Entry Label</th>
<th>Debit</th>
<th>Credit</th>
<th>Balance</th>
<th groups="base.group_multi_currency">Currency</th>
</tr>
</thead>
<tbody>
<t t-foreach="Accounts" t-as="account">
<tr style="font-weight: bold;">
<td colspan="6">
<span style="color: white;" t-esc="'..'"/>
<span t-esc="account['code']"/>
<span t-esc="account['name']"/>
</td>
<t groups="analytic.group_analytic_accounting">
<td></td>
</t>
<td class="text-end">
<span t-esc="account['debit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="account['credit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="account['balance']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td groups="base.group_multi_currency"/>
</tr>
<tr t-foreach="account['move_lines']" t-as="line">
<td><span t-esc="line['ldate']"/></td>
<td><span t-esc="line['lcode']"/></td>
<td><span t-esc="line['partner_name']"/></td>
<td><span t-if="line['lref']" t-esc="line['lref']"/></td>
<td><span t-esc="line['move_name']"/></td>
<t groups="analytic.group_analytic_accounting">
<td><span t-esc="line['analytic_account_id']"/></td>
</t>
<td><span t-esc="line['lname']"/></td>
<td class="text-end">
<span t-esc="line['debit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="line['credit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="line['balance']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end" groups="base.group_multi_currency">
<span t-esc="line['amount_currency'] if line['amount_currency'] and line['amount_currency'] > 0.00 else ''"/>
<span t-esc="line['currency_code'] if line['amount_currency'] and line['amount_currency'] > 0.00 else ''"/>
</td>
</tr>
</t>
</tbody>
</table>
</div>
</t>
</t>
</template>
</odoo>

View File

@@ -1,117 +0,0 @@
import time
from odoo import api, models, _
from odoo.exceptions import UserError
class ReportJournal(models.AbstractModel):
_name = 'report.accounting_pdf_reports.report_journal'
_description = 'Journal Audit Report'
def lines(self, target_move, journal_ids, sort_selection, data):
if isinstance(journal_ids, int):
journal_ids = [journal_ids]
move_state = ['draft', 'posted']
if target_move == 'posted':
move_state = ['posted']
query_get_clause = self._get_query_get_clause(data)
params = [tuple(move_state), tuple(journal_ids)] + query_get_clause[2]
query = 'SELECT "account_move_line".id FROM ' + query_get_clause[0] + ', account_move am, account_account acc WHERE "account_move_line".account_id = acc.id AND "account_move_line".move_id=am.id AND am.state IN %s AND "account_move_line".journal_id IN %s AND ' + query_get_clause[1] + ' ORDER BY '
if sort_selection == 'date':
query += '"account_move_line".date'
else:
query += 'am.name'
query += ', "account_move_line".move_id'
self.env.cr.execute(query, tuple(params))
ids = (x[0] for x in self.env.cr.fetchall())
return self.env['account.move.line'].browse(ids)
def _sum_debit(self, data, journal_id):
move_state = ['draft', 'posted']
if data['form'].get('target_move', 'all') == 'posted':
move_state = ['posted']
query_get_clause = self._get_query_get_clause(data)
params = [tuple(move_state), tuple(journal_id.ids)] + query_get_clause[2]
self.env.cr.execute('SELECT SUM(debit) FROM ' + query_get_clause[0] + ', account_move am '
'WHERE "account_move_line".move_id=am.id AND am.state IN %s AND "account_move_line".journal_id IN %s AND ' + query_get_clause[1] + ' ',
tuple(params))
return self.env.cr.fetchone()[0] or 0.0
def _sum_credit(self, data, journal_id):
move_state = ['draft', 'posted']
if data['form'].get('target_move', 'all') == 'posted':
move_state = ['posted']
query_get_clause = self._get_query_get_clause(data)
params = [tuple(move_state), tuple(journal_id.ids)] + query_get_clause[2]
self.env.cr.execute('SELECT SUM(credit) FROM ' + query_get_clause[0] + ', account_move am '
'WHERE "account_move_line".move_id=am.id AND am.state IN %s AND "account_move_line".journal_id IN %s AND ' + query_get_clause[1] + ' ',
tuple(params))
return self.env.cr.fetchone()[0] or 0.0
def _get_taxes(self, data, journal_id):
move_state = ['draft', 'posted']
if data['form'].get('target_move', 'all') == 'posted':
move_state = ['posted']
query_get_clause = self._get_query_get_clause(data)
params = [tuple(move_state), tuple(journal_id.ids)] + query_get_clause[2]
query = """
SELECT rel.account_tax_id, SUM("account_move_line".balance) AS base_amount
FROM account_move_line_account_tax_rel rel, """ + query_get_clause[0] + """
LEFT JOIN account_move am ON "account_move_line".move_id = am.id
WHERE "account_move_line".id = rel.account_move_line_id
AND am.state IN %s
AND "account_move_line".journal_id IN %s
AND """ + query_get_clause[1] + """
GROUP BY rel.account_tax_id"""
self.env.cr.execute(query, tuple(params))
ids = []
base_amounts = {}
for row in self.env.cr.fetchall():
ids.append(row[0])
base_amounts[row[0]] = row[1]
res = {}
for tax in self.env['account.tax'].browse(ids):
self.env.cr.execute('SELECT sum(debit - credit) FROM ' + query_get_clause[0] + ', account_move am '
'WHERE "account_move_line".move_id=am.id AND am.state IN %s AND "account_move_line".journal_id IN %s AND ' + query_get_clause[1] + ' AND tax_line_id = %s',
tuple(params + [tax.id]))
res[tax] = {
'base_amount': base_amounts[tax.id],
'tax_amount': self.env.cr.fetchone()[0] or 0.0,
}
if journal_id.type == 'sale':
#sales operation are credits
res[tax]['base_amount'] = res[tax]['base_amount'] * -1
res[tax]['tax_amount'] = res[tax]['tax_amount'] * -1
return res
def _get_query_get_clause(self, data):
return self.env['account.move.line'].with_context(data['form'].get('used_context', {}))._query_get()
@api.model
def _get_report_values(self, docids, data=None):
if not data.get('form'):
raise UserError(_("Form content is missing, this report cannot be printed."))
target_move = data['form'].get('target_move', 'all')
sort_selection = data['form'].get('sort_selection', 'date')
res = {}
for journal in data['form']['journal_ids']:
res[journal] = self.with_context(data['form'].get('used_context', {})).lines(target_move, journal, sort_selection, data)
return {
'doc_ids': data['form']['journal_ids'],
'doc_model': self.env['account.journal'],
'data': data,
'docs': self.env['account.journal'].browse(data['form']['journal_ids']),
'time': time,
'lines': res,
'sum_credit': self._sum_credit,
'sum_debit': self._sum_debit,
'get_taxes': self._get_taxes,
}

View File

@@ -1,105 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_journal">
<t t-call="web.html_container">
<t t-set="data_report_margin_top" t-value="12"/>
<t t-set="data_report_header_spacing" t-value="9"/>
<t t-set="data_report_dpi" t-value="110"/>
<t t-foreach="docs" t-as="o">
<t t-call="web.internal_layout">
<div class="page">
<h2><t t-esc="o.name"/> Journal</h2>
<div class="row mt32">
<div class="col-3">
<strong>Company:</strong>
<p t-esc="res_company.name"/>
</div>
<div class="col-3">
<strong>Journal:</strong>
<p t-esc="o.name"/>
</div>
<div class="col-3">
<strong>Entries Sorted By:</strong>
<p t-if="data['form'].get('sort_selection') != 'l.date'">Journal Entry Number</p>
<p t-if="data['form'].get('sort_selection') == 'l.date'">Date</p>
</div>
<div class="col-3">
<strong>Target Moves:</strong>
<p t-if="data['form']['target_move'] == 'all'">All Entries</p>
<p t-if="data['form']['target_move'] == 'posted'">All Posted Entries</p>
</div>
</div>
<table class="table table-sm table-reports">
<thead>
<tr>
<th>Move</th>
<th>Date</th>
<th>Account</th>
<th>Partner</th>
<th>Label</th>
<th>Debit</th>
<th>Credit</th>
<th t-if="data['form']['amount_currency']">Currency</th>
</tr>
</thead>
<tbody>
<tr t-foreach="lines[o.id]" t-as="aml">
<td><span t-esc="aml.move_id.name != '/' and aml.move_id.name or ('*'+str(aml.move_id.id))"/></td>
<td><span t-field="aml.date"/></td>
<td><span t-field="aml.account_id.code"/></td>
<td><span t-esc="aml.sudo().partner_id and aml.sudo().partner_id.name and aml.sudo().partner_id.name[:23] or ''"/></td>
<td><span t-esc="aml.name and aml.name[:35]"/></td>
<td><span t-esc="aml.debit" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
<td><span t-esc="aml.credit" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
<td t-if="data['form']['amount_currency'] and aml.amount_currency">
<span t-esc="aml.amount_currency" t-options="{'widget': 'monetary', 'display_currency': aml.currency_id}"/>
</td>
</tr>
</tbody>
</table>
<div class="row">
<div class="col-4 pull-right">
<table>
<tr>
<td><strong>Total</strong></td>
<td><span t-esc="sum_debit(data, o)" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
<td><span t-esc="sum_credit(data, o)" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
</tr>
</table>
</div>
</div>
<div class="row">
<div class="col-4">
<table class="table table-sm table-reports">
<thead>
<tr><th colspan="3">Tax Declaration</th></tr>
<tr>
<th>Name</th>
<th>Base Amount</th>
<th>Tax Amount</th>
</tr>
</thead>
<tbody>
<t t-set="taxes" t-value="get_taxes(data, o)"/>
<tr t-foreach="taxes" t-as="tax">
<td><span t-esc="tax.name"/></td>
<td><span t-esc="taxes[tax]['base_amount']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
<td><span t-esc="taxes[tax]['tax_amount']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</t>
</t>
</t>
</template>
</odoo>

View File

@@ -1,108 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_journal_entries">
<t t-call="web.html_container">
<t t-call="web.external_layout">
<t t-foreach="docs" t-as="o">
<div class="page" style="font-size:15px;">
<div>
<h3>
<span t-field="o.name"/>
</h3>
</div>
<br></br>
<div class="row">
<table width="100%" class="table-bordered">
<tr>
<td>Journal:
<span t-field="o.journal_id.name"/>
</td>
<td>
Date:
<span t-field="o.date" t-options="{'widget': 'date'}"/>
</td>
</tr>
<tr>
<td>
Partner:
<span t-field="o.partner_id.display_name"/>
</td>
<td>
Reference:
<span t-field="o.ref"/>
</td>
</tr>
</table>
</div>
<div class="row">
<br></br>
<table width="100%" class="table-bordered">
<thead>
<tr>
<th>Account</th>
<th>Date</th>
<th>Partner</th>
<th>Label</th>
<th>Analytic Account</th>
<th>Debit</th>
<th>Credit</th>
</tr>
</thead>
<tbody>
<t t-set="total_credit" t-value="0"/>
<t t-set="total_debit" t-value="0"/>
<t t-foreach="o.line_ids" t-as="line">
<tr>
<td>
<span t-field="line.account_id.name"/>
</td>
<td>
<span t-field="line.date" t-options="{'widget': 'date'}"/>
</td>
<td>
<span t-field="line.partner_id.display_name"/>
</td>
<td>
<span t-field="line.name"/>
</td>
<td>
<span t-field="line.analytic_account_id.display_name"/>
</td>
<td class="text-end">
<span t-field="line.debit"
t-options="{'widget': 'monetary', 'display_currency': line.currency_id}"/>
</td>
<td class="text-end">
<span t-field="line.credit"
t-options="{'widget': 'monetary', 'display_currency': line.currency_id}"/>
</td>
<t t-set="total_credit" t-value="total_credit + line.credit"/>
<t t-set="total_debit" t-value="total_debit + line.debit"/>
</tr>
</t>
</tbody>
<tfooter>
<tr>
<td colspan="5"></td>
<td class="text-end">
<span t-esc="total_debit"
t-options="{'widget': 'monetary', 'display_currency': o.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="total_credit"
t-options="{'widget': 'monetary', 'display_currency': o.currency_id}"/>
</td>
</tr>
</tfooter>
</table>
</div>
</div>
</t>
</t>
</t>
</template>
</odoo>

View File

@@ -1,122 +0,0 @@
import time
from odoo import api, models, _
from odoo.exceptions import UserError
class ReportPartnerLedger(models.AbstractModel):
_name = 'report.accounting_pdf_reports.report_partnerledger'
_description = 'Partner Ledger Report'
def _lines(self, data, partner):
full_account = []
currency = self.env['res.currency']
query_get_data = self.env['account.move.line'].with_context(data['form'].get('used_context', {}))._query_get()
reconcile_clause = "" if data['form']['reconciled'] else ' AND "account_move_line".full_reconcile_id IS NULL '
params = [partner.id, tuple(data['computed']['move_state']), tuple(data['computed']['account_ids'])] + query_get_data[2]
query = """
SELECT "account_move_line".id, "account_move_line".date, j.code, acc.name->>'en_US' as a_name, "account_move_line".ref, m.name as move_name, "account_move_line".name, "account_move_line".debit, "account_move_line".credit, "account_move_line".amount_currency,"account_move_line".currency_id, c.symbol AS currency_code
FROM """ + query_get_data[0] + """
LEFT JOIN account_journal j ON ("account_move_line".journal_id = j.id)
LEFT JOIN account_account acc ON ("account_move_line".account_id = acc.id)
LEFT JOIN res_currency c ON ("account_move_line".currency_id=c.id)
LEFT JOIN account_move m ON (m.id="account_move_line".move_id)
WHERE "account_move_line".partner_id = %s
AND m.state IN %s
AND "account_move_line".account_id IN %s AND """ + query_get_data[1] + reconcile_clause + """
ORDER BY "account_move_line".date"""
self.env.cr.execute(query, tuple(params))
res = self.env.cr.dictfetchall()
sum = 0.0
lang_code = self.env.context.get('lang') or 'en_US'
lang = self.env['res.lang']
lang_id = lang._lang_get(lang_code)
date_format = lang_id.date_format
for r in res:
r['date'] = r['date']
r['displayed_name'] = '-'.join(
r[field_name] for field_name in ('move_name', 'ref', 'name')
if r[field_name] not in (None, '', '/')
)
sum += r['debit'] - r['credit']
r['progress'] = sum
r['currency_id'] = currency.browse(r.get('currency_id'))
full_account.append(r)
return full_account
def _sum_partner(self, data, partner, field):
if field not in ['debit', 'credit', 'debit - credit']:
return
result = 0.0
query_get_data = self.env['account.move.line'].with_context(data['form'].get('used_context', {}))._query_get()
reconcile_clause = "" if data['form']['reconciled'] else ' AND "account_move_line".full_reconcile_id IS NULL '
params = [partner.id, tuple(data['computed']['move_state']), tuple(data['computed']['account_ids'])] + query_get_data[2]
query = """SELECT sum(""" + field + """)
FROM """ + query_get_data[0] + """, account_move AS m
WHERE "account_move_line".partner_id = %s
AND m.id = "account_move_line".move_id
AND m.state IN %s
AND account_id IN %s
AND """ + query_get_data[1] + reconcile_clause
self.env.cr.execute(query, tuple(params))
contemp = self.env.cr.fetchone()
if contemp is not None:
result = contemp[0] or 0.0
return result
@api.model
def _get_report_values(self, docids, data=None):
if not data.get('form'):
raise UserError(_("Form content is missing, this report cannot be printed."))
data['computed'] = {}
obj_partner = self.env['res.partner']
query_get_data = self.env['account.move.line'].with_context(data['form'].get('used_context', {}))._query_get()
data['computed']['move_state'] = ['draft', 'posted']
if data['form'].get('target_move', 'all') == 'posted':
data['computed']['move_state'] = ['posted']
result_selection = data['form'].get('result_selection', 'customer')
if result_selection == 'supplier':
data['computed']['ACCOUNT_TYPE'] = ['liability_payable']
elif result_selection == 'customer':
data['computed']['ACCOUNT_TYPE'] = ['asset_receivable']
else:
data['computed']['ACCOUNT_TYPE'] = ['asset_receivable', 'liability_payable']
self.env.cr.execute("""
SELECT a.id
FROM account_account a
WHERE a.account_type IN %s
AND a.active""", (tuple(data['computed']['ACCOUNT_TYPE']),))
data['computed']['account_ids'] = [a for (a,) in self.env.cr.fetchall()]
params = [tuple(data['computed']['move_state']), tuple(data['computed']['account_ids'])] + query_get_data[2]
reconcile_clause = "" if data['form']['reconciled'] else ' AND "account_move_line".full_reconcile_id IS NULL '
query = """
SELECT DISTINCT "account_move_line".partner_id
FROM """ + query_get_data[0] + """, account_account AS account, account_move AS am
WHERE "account_move_line".partner_id IS NOT NULL
AND "account_move_line".account_id = account.id
AND am.id = "account_move_line".move_id
AND am.state IN %s
AND "account_move_line".account_id IN %s
AND account.active
AND """ + query_get_data[1] + reconcile_clause
self.env.cr.execute(query, tuple(params))
if data['form']['partner_ids']:
partner_ids = data['form']['partner_ids']
else:
partner_ids = [res['partner_id'] for res in
self.env.cr.dictfetchall()]
partners = obj_partner.browse(partner_ids)
partners = sorted(partners, key=lambda x: (x.ref or '', x.name or ''))
return {
'doc_ids': partner_ids,
'doc_model': self.env['res.partner'],
'data': data,
'docs': partners,
'time': time,
'lines': self._lines,
'sum_partner': self._sum_partner,
}

View File

@@ -1,109 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_partnerledger">
<t t-call="web.html_container">
<t t-call="web.internal_layout">
<t t-set="data_report_margin_top" t-value="12"/>
<t t-set="data_report_header_spacing" t-value="9"/>
<t t-set="data_report_dpi" t-value="110"/>
<div class="page">
<h2>Partner Ledger</h2>
<div class="row">
<div class="col-3">
<strong>Company:</strong>
<p t-esc="res_company.name"/>
</div>
<div class="col-3">
<t t-if="data['form']['date_from']">
<strong>Date from :</strong>
<span t-esc="data['form']['date_from']"/>
<br/>
</t>
<t t-if="data['form']['date_to']">
<strong>Date to :</strong>
<span t-esc="data['form']['date_to']"/>
</t>
</div>
<div class="col-3">
<strong>Target Moves:</strong>
<p t-if="data['form']['target_move'] == 'all'">All Entries</p>
<p t-if="data['form']['target_move'] == 'posted'">All Posted Entries</p>
</div>
</div>
<table class="table table-sm table-reports">
<thead>
<tr>
<th>Date</th>
<th>JRNL</th>
<th>Account</th>
<th>Ref</th>
<th>Debit</th>
<th>Credit</th>
<th>Balance</th>
<th t-if="data['form']['amount_currency']">Currency</th>
</tr>
</thead>
<t t-foreach="docs" t-as="o">
<tbody>
<tr>
<td colspan="4">
<strong t-esc="o.ref"/>
-
<strong t-esc="o.name"/>
</td>
<td class="text-end">
<strong t-esc="sum_partner(data, o, 'debit')"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<strong t-esc="sum_partner(data, o, 'credit')"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<strong t-esc="sum_partner(data, o, 'debit - credit')"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
</tr>
<tr t-foreach="lines(data, o)" t-as="line">
<td>
<span t-esc="line['date']"/>
</td>
<td>
<span t-esc="line['code']"/>
</td>
<td>
<span t-esc="line['a_name']"/>
</td>
<td>
<span t-esc="line['displayed_name']"/>
</td>
<td class="text-end">
<span t-esc="line['debit']"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="line['credit']"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-esc="line['progress']"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end" t-if="data['form']['amount_currency']">
<t t-if="line['currency_id']">
<span t-esc="line['amount_currency']"
t-options="{'widget': 'monetary', 'display_currency': line['currency_id']}"/>
</t>
</td>
</tr>
</tbody>
</t>
</table>
</div>
</t>
</t>
</template>
</odoo>

View File

@@ -1,70 +0,0 @@
from odoo import api, models, _
from odoo.exceptions import UserError
class ReportTax(models.AbstractModel):
_name = 'report.accounting_pdf_reports.report_tax'
_description = 'Tax Report'
@api.model
def _get_report_values(self, docids, data=None):
if not data.get('form'):
raise UserError(_("Form content is missing, this report cannot be printed."))
return {
'data': data['form'],
'lines': self.get_lines(data.get('form')),
}
def _sql_from_amls_one(self):
sql = """SELECT "account_move_line".tax_line_id, COALESCE(SUM("account_move_line".debit-"account_move_line".credit), 0)
FROM %s
WHERE %s GROUP BY "account_move_line".tax_line_id"""
return sql
def _sql_from_amls_two(self):
sql = """SELECT r.account_tax_id, COALESCE(SUM("account_move_line".debit-"account_move_line".credit), 0)
FROM %s
INNER JOIN account_move_line_account_tax_rel r ON ("account_move_line".id = r.account_move_line_id)
INNER JOIN account_tax t ON (r.account_tax_id = t.id)
WHERE %s GROUP BY r.account_tax_id"""
return sql
def _compute_from_amls(self, options, taxes):
#compute the tax amount
sql = self._sql_from_amls_one()
tables, where_clause, where_params = self.env['account.move.line']._query_get()
query = sql % (tables, where_clause)
self.env.cr.execute(query, where_params)
results = self.env.cr.fetchall()
for result in results:
if result[0] in taxes:
taxes[result[0]]['tax'] = abs(result[1])
#compute the net amount
sql2 = self._sql_from_amls_two()
query = sql2 % (tables, where_clause)
self.env.cr.execute(query, where_params)
results = self.env.cr.fetchall()
for result in results:
if result[0] in taxes:
taxes[result[0]]['net'] = abs(result[1])
@api.model
def get_lines(self, options):
taxes = {}
for tax in self.env['account.tax'].search([('type_tax_use', '!=', 'none')]):
if tax.children_tax_ids:
for child in tax.children_tax_ids:
if child.type_tax_use != 'none':
continue
taxes[child.id] = {'tax': 0, 'net': 0, 'name': child.name, 'type': tax.type_tax_use}
else:
taxes[tax.id] = {'tax': 0, 'net': 0, 'name': tax.name, 'type': tax.type_tax_use}
self.with_context(date_from=options['date_from'], date_to=options['date_to'],
state=options['target_move'],
strict_range=True)._compute_from_amls(options, taxes)
groups = dict((tp, []) for tp in ['sale', 'purchase'])
for tax in taxes.values():
if tax['tax']:
groups[tax['type']].append(tax)
return groups

View File

@@ -1,85 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_tax">
<t t-call="web.html_container">
<t t-set="data_report_margin_top" t-value="12"/>
<t t-set="data_report_header_spacing" t-value="9"/>
<t t-set="data_report_dpi" t-value="110"/>
<t t-call="web.internal_layout">
<div class="page">
<h3>Tax Report</h3>
<div class="row">
<div class="col-4">
<strong>Company:</strong>
<p t-esc="res_company.name"/>
</div>
<div class="col-4">
<t>
<strong>Date from :</strong>
<span t-esc="data['date_from']"/>
</t>
<br/>
<t>
<strong>Date to :</strong>
<span t-esc="data['date_to']"/>
</t>
</div>
<div class="col-4">
<strong>Target Moves:</strong>
<p>
<span t-if="data['target_move'] == 'all'">All Entries</span>
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
</p>
</div>
</div>
<table class="table table-sm table-reports">
<thead>
<tr align="left">
<th>Sale</th>
<th>Net</th>
<th>Tax</th>
</tr>
</thead>
<tr align="left" t-foreach="lines['sale']" t-as="line">
<td>
<span t-esc="line.get('name')"/>
</td>
<td>
<span t-att-style="style" t-esc="line.get('net')"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td>
<span t-att-style="style" t-esc="line.get('tax')"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
</tr>
<br/>
<tr align="left">
<td>
<strong>Purchase</strong>
</td>
<td></td>
<td></td>
</tr>
<tr align="left" t-foreach="lines['purchase']" t-as="line">
<td>
<span t-esc="line.get('name')"/>
</td>
<td>
<span t-att-style="style" t-esc="line.get('net')"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td>
<span t-att-style="style" t-esc="line.get('tax')"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
</tr>
</table>
</div>
</t>
</t>
</template>
</odoo>

View File

@@ -1,90 +0,0 @@
import time
from odoo import api, models, _
from odoo.exceptions import UserError
class ReportTrialBalance(models.AbstractModel):
_name = 'report.accounting_pdf_reports.report_trialbalance'
_description = 'Trial Balance Report'
def _get_accounts(self, accounts, display_account):
""" compute the balance, debit and credit for the provided accounts
:Arguments:
`accounts`: list of accounts record,
`display_account`: it's used to display either all accounts or those accounts which balance is > 0
:Returns a list of dictionary of Accounts with following key and value
`name`: Account name,
`code`: Account code,
`credit`: total amount of credit,
`debit`: total amount of debit,
`balance`: total amount of balance,
"""
account_result = {}
# Prepare sql query base on selected parameters from wizard
tables, where_clause, where_params = self.env['account.move.line']._query_get()
tables = tables.replace('"','')
if not tables:
tables = 'account_move_line'
wheres = [""]
if where_clause.strip():
wheres.append(where_clause.strip())
filters = " AND ".join(wheres)
# compute the balance, debit and credit for the provided accounts
request = ("SELECT account_id AS id, SUM(debit) AS debit, SUM(credit) AS credit, "
"(SUM(debit) - SUM(credit)) AS balance" +\
" FROM " + tables + " WHERE account_id IN %s " + filters + " GROUP BY account_id")
params = (tuple(accounts.ids),) + tuple(where_params)
self.env.cr.execute(request, params)
for row in self.env.cr.dictfetchall():
account_result[row.pop('id')] = row
account_res = []
for account in accounts:
res = dict((fn, 0.0) for fn in ['credit', 'debit', 'balance'])
currency = account.currency_id and account.currency_id or self.env.company.currency_id
res['code'] = account.code
res['name'] = account.name
if account.id in account_result:
res['debit'] = account_result[account.id].get('debit')
res['credit'] = account_result[account.id].get('credit')
res['balance'] = account_result[account.id].get('balance')
if display_account == 'all':
account_res.append(res)
if display_account == 'not_zero' and not currency.is_zero(res['balance']):
account_res.append(res)
if display_account == 'movement' and (not currency.is_zero(res['debit']) or not currency.is_zero(res['credit'])):
account_res.append(res)
return account_res
@api.model
def _get_report_values(self, docids, data=None):
if not data.get('form') or not self.env.context.get('active_model'):
raise UserError(_("Form content is missing, this report cannot be printed."))
model = self.env.context.get('active_model')
docs = self.env[model].browse(self.env.context.get('active_ids', []))
display_account = data['form'].get('display_account')
accounts = docs if model == 'account.account' else self.env['account.account'].search([])
context = data['form'].get('used_context')
analytic_accounts = []
if data['form'].get('analytic_account_ids'):
analytic_account_ids = self.env['account.analytic.account'].browse(data['form'].get('analytic_account_ids'))
context['analytic_account_ids'] = analytic_account_ids
analytic_accounts = [account.name for account in analytic_account_ids]
account_res = self.with_context(context)._get_accounts(accounts, display_account)
codes = []
if data['form'].get('journal_ids', False):
codes = [journal.code for journal in
self.env['account.journal'].search(
[('id', 'in', data['form']['journal_ids'])])]
return {
'doc_ids': self.ids,
'doc_model': model,
'data': data['form'],
'docs': docs,
'print_journal': codes,
'analytic_accounts': analytic_accounts,
'time': time,
'Accounts': account_res,
}

View File

@@ -1,85 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_trialbalance">
<t t-call="web.html_container">
<t t-set="data_report_margin_top" t-value="12"/>
<t t-set="data_report_header_spacing" t-value="9"/>
<t t-set="data_report_dpi" t-value="110"/>
<t t-call="web.internal_layout">
<div class="page">
<h2><span t-esc="res_company.name"/>: Trial Balance</h2>
<div class="row mt32">
<div class="col-4">
<strong>Display Account:</strong>
<p>
<span t-if="data['display_account'] == 'all'">All accounts</span>
<span t-if="data['display_account'] == 'movement'">With movements</span>
<span t-if="data['display_account'] == 'not_zero'">With balance not equal to zero</span>
</p>
</div>
<div class="col-4">
<p>
<t t-if="data['date_from']"><strong>Date from :</strong> <span t-esc="data['date_from']"/><br/></t>
<t t-if="data['date_to']"><strong>Date to :</strong> <span t-esc="data['date_to']"/></t>
</p>
</div>
<div class="col-4">
<strong>Target Moves:</strong>
<p>
<span t-if="data['target_move'] == 'all'">All Entries</span>
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
</p>
</div>
</div>
<div class="row mt32">
<div class="col-6">
<strong>Journals:</strong>
<p t-esc="', '.join([ lt or '' for lt in print_journal ])"/>
</div>
<div class="col-6">
<t t-if="analytic_accounts">
<strong>Analytic Accounts:</strong>
<p t-esc="', '.join([ analytic_account or '' for analytic_account in analytic_accounts ])"/>
</t>
</div>
</div>
<table class="table table-sm table-reports">
<thead>
<tr>
<th>Code</th>
<th>Account</th>
<th class="text-end">Debit</th>
<th class="text-end">Credit</th>
<th class="text-end">Balance</th>
</tr>
</thead>
<tbody>
<tr t-foreach="Accounts" t-as="account">
<td>
<span t-att-style="style" t-esc="account['code']"/>
</td>
<td>
<span style="color: white;" t-esc="'..'"/>
<span t-att-style="style" t-esc="account['name']"/>
</td>
<td class="text-end">
<span t-att-style="style" t-esc="account['debit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-att-style="style" t-esc="account['credit']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
<td class="text-end">
<span t-att-style="style" t-esc="account['balance']" t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"/>
</td>
</tr>
</tbody>
</table>
</div>
</t>
</t>
</template>
</odoo>

View File

@@ -1,25 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_account_financial_report_accountant,access.account.financial.report.manager,model_account_financial_report,account.group_account_user,1,1,1,1
access_account_report_general_ledger,access.account.report.general.ledger,model_account_report_general_ledger,account.group_account_user,1,1,1,1
access_account_balance_report,access.account.balance.report,model_account_balance_report,account.group_account_user,1,1,1,1
access_account_report_partner_ledger,access.account.report.partner.ledger,model_account_report_partner_ledger,account.group_account_invoice,1,1,1,1
access_accounting_report,access.accounting.report,model_accounting_report,account.group_account_user,1,1,1,1
access_account_aged_trial_balance,access.account.aged.trial.balance,model_account_aged_trial_balance,account.group_account_user,1,1,1,1
access_account_tax_report,access.account.tax.report.wizard,model_account_tax_report_wizard,account.group_account_user,1,1,1,1
access_account_financial_report_accountant_bm,access.account.financial.report.bmanager,model_account_financial_report,account.group_account_manager,1,1,1,1
access_account_report_general_ledger_bm,access.account.report.general.ledger.bmanager,model_account_report_general_ledger,account.group_account_manager,1,1,1,1
access_account_balance_report_bm,access.account.balance.report.bmanager,model_account_balance_report,account.group_account_manager,1,1,1,1
access_account_report_partner_ledger_bm,access.account.report.partner.ledger.bmanager,model_account_report_partner_ledger,account.group_account_manager,1,1,1,1
access_accounting_report_bm,access.accounting.report.bmanager,model_accounting_report,account.group_account_manager,1,1,1,1
access_account_aged_trial_balance_bm,access.account.aged.trial.balance.bmanager,model_account_aged_trial_balance,account.group_account_manager,1,1,1,1
access_account_tax_report_bm,access.account.tax.report.wizard.bmanager,model_account_tax_report_wizard,account.group_account_manager,1,1,1,1
access_account_print_journal_bm,access.account.account.print.journal.bmanager,model_account_print_journal,account.group_account_manager,1,1,1,1
access_account_common_journal_report,access.account.common.journal.report,model_account_common_journal_report,account.group_account_user,1,1,1,0
access_account_print_journal,access.account.print.journal,model_account_print_journal,account.group_account_user,1,1,1,0
access_account_common_account_report,access_account_common_account_report,model_account_common_account_report,base.group_user,1,0,0,0
access_account_common_partner_report,access_account_common_partner_report,model_account_common_partner_report,base.group_user,1,0,0,0
access_account_common_report,access_account_common_report,accounting_pdf_reports.model_account_common_report,base.group_user,1,0,0,0
access_account_account_type,access_account_account_type,accounting_pdf_reports.model_account_account_type,base.group_user,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_account_financial_report_accountant access.account.financial.report.manager model_account_financial_report account.group_account_user 1 1 1 1
3 access_account_report_general_ledger access.account.report.general.ledger model_account_report_general_ledger account.group_account_user 1 1 1 1
4 access_account_balance_report access.account.balance.report model_account_balance_report account.group_account_user 1 1 1 1
5 access_account_report_partner_ledger access.account.report.partner.ledger model_account_report_partner_ledger account.group_account_invoice 1 1 1 1
6 access_accounting_report access.accounting.report model_accounting_report account.group_account_user 1 1 1 1
7 access_account_aged_trial_balance access.account.aged.trial.balance model_account_aged_trial_balance account.group_account_user 1 1 1 1
8 access_account_tax_report access.account.tax.report.wizard model_account_tax_report_wizard account.group_account_user 1 1 1 1
9 access_account_financial_report_accountant_bm access.account.financial.report.bmanager model_account_financial_report account.group_account_manager 1 1 1 1
10 access_account_report_general_ledger_bm access.account.report.general.ledger.bmanager model_account_report_general_ledger account.group_account_manager 1 1 1 1
11 access_account_balance_report_bm access.account.balance.report.bmanager model_account_balance_report account.group_account_manager 1 1 1 1
12 access_account_report_partner_ledger_bm access.account.report.partner.ledger.bmanager model_account_report_partner_ledger account.group_account_manager 1 1 1 1
13 access_accounting_report_bm access.accounting.report.bmanager model_accounting_report account.group_account_manager 1 1 1 1
14 access_account_aged_trial_balance_bm access.account.aged.trial.balance.bmanager model_account_aged_trial_balance account.group_account_manager 1 1 1 1
15 access_account_tax_report_bm access.account.tax.report.wizard.bmanager model_account_tax_report_wizard account.group_account_manager 1 1 1 1
16 access_account_print_journal_bm access.account.account.print.journal.bmanager model_account_print_journal account.group_account_manager 1 1 1 1
17 access_account_common_journal_report access.account.common.journal.report model_account_common_journal_report account.group_account_user 1 1 1 0
18 access_account_print_journal access.account.print.journal model_account_print_journal account.group_account_user 1 1 1 0
19 access_account_common_account_report access_account_common_account_report model_account_common_account_report base.group_user 1 0 0 0
20 access_account_common_partner_report access_account_common_partner_report model_account_common_partner_report base.group_user 1 0 0 0
21 access_account_common_report access_account_common_report accounting_pdf_reports.model_account_common_report base.group_user 1 0 0 0
22 access_account_account_type access_account_account_type accounting_pdf_reports.model_account_account_type base.group_user 1 0 0 0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 911 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -1,155 +0,0 @@
<section class="oe_container oe_dark">
<div class="col-md-12">
<h2 class="oe_slogan" style="font-size: 35px;color:#2C0091"><b>Accounting Reports Odoo 18</b></h2>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div style="align:center;">
<h1 style="text-align: center;">
<span align="center" style="color:#148963;">
<span class="fa fa-star fa-spin">
</span>
Added Financial Reports:</span>
</h1>
<div class="row" style="margin-top: 2rem;">
<div class="col-lg-12">
<div class="mt-3">
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">Partner Ledger Report.</span>
</p><br/>
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">Journals Audit.</span>
</p><br/>
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">General Ledger.</span>
</p><br/>
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">Trial Balance.</span>
</p><br/>
</div>
</div>
<div class="col-lg-12">
<div class="mt-3">
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">Aged Partner Balance.</span>
</p><br/>
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">Profit and Loss.</span>
</p><br/>
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">Balance Sheet.</span>
</p><br/>
<p class="fa fa-check" style="color:green;font-size: 15px;">
<span style="color:#000000;font-size: 15px;">Tax Report.</span>
</p><br/>
</div>
</div>
</div>
</div>
<br/>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_centeralign oe_websiteonly">
<h4 class="oe_slogan"><a href="https://www.youtube.com/watch?v=yA4NLwOLZms" target="_blank" style="color: #FFFFFF !important; border-radius: 0; background-color: #9c676e; border-color: #005ca7; padding: 15px; font-weight: bold;">
<i class="fa fa-youtube">
Watch on YouTube
</i>
</a></h4>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="color:olive;">Accounting Reports</h2>
<h3 class="oe_slogan" style="color:#000066;font-size: 24px;">All in one financial reports for odoo community edition</h3>
<div class="oe_demo oe_picture oe_screenshot">
<img src="account_reports.png" style="height:400px;">
</div>
<br/>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan" style="color:#332c3c;font-size: 28px;">General Ledger</h3>
<h3 class="oe_slogan" style="color:#000066;font-size: 24px;">General ledger report with accounts, partners and analytic account filter</h3>
<div class="oe_demo oe_picture oe_screenshot">
<img src="general_ledger_filter.png" style="height:400px;">
</div>
<br/>
<h4 class="oe_slogan" style="color:#332c3c;font-size: 28px;">Report</h4>
<div class="oe_demo oe_picture oe_screenshot">
<img src="general_ledger_report.png" style="height:400px;">
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan" style="color:#1b1d26;">Partner Ledger</h3>
<h3 class="oe_slogan" style="color:#000066;font-size: 24px;">Partner ledger report with partner filter.</h3>
<div class="oe_demo oe_picture oe_screenshot">
<img src="partner_ledger_filter.png" style="height:400px;">
</div>
<br/>
<h4 class="oe_slogan" style="color:#332c3c;font-size: 28px;">Report</h4>
<div class="oe_demo oe_picture oe_screenshot">
<img src="partner_ledger_report.png" style="height:400px;">
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan" style="color:#1b1d26;">Aged Partner Balance</h3>
<div class="oe_demo oe_picture oe_screenshot">
<img src="aged_partner_balance_filter.png" style="height:400px;">
</div>
<br/>
<h4 class="oe_slogan" style="color:#332c3c;font-size: 28px;">Report</h4>
<div class="oe_demo oe_picture oe_screenshot">
<img src="aged_partner_balance_report.png" style="height:400px;">
</div>
</div>
</section>
<br/>
<hr style="width: 100%;height: 4px;background: #2C0091;margin: 0px 0px;">
<hr style="width: 100%;height: 4px;background: #148963;margin: 0px 0px;">
<section class="oe_container oe_dark">
<div class="oe_row ">
<div class="oe_slogan text-center">
<img src="odoo_mates.png"/>
<div style="color:#269900;">
<h3 style="color:#2C0091;font-size: 25px;">If you need any support or want more features, just contact us:</h3><br>
<h3 style="color:#2C0091;font-size: 20px;">Email: <a href="odoomates@gmail.com">odoomates@gmail.com</a> <br></h3>
</div>
<div class="oe_slogan">
<h2>
<a target="_blank" href="https://www.facebook.com/odoomate/" target="new">
<i class="fa fa-facebook-square" style="font-size:38px;"></i>
</a>
<a target="_blank" href="https://twitter.com/odoomates/" target="new">
<i class="fa fa-twitter" style="font-size:38px;"></i>
</a>
<a href="#" target="_blank">
<i class="fa fa-linkedin" style="font-size:38px;"></i>
</a>
<a target="_blank" href="https://www.youtube.com/channel/UCVKlUZP7HAhdQgs-9iTJklQ">
<i class="fa fa-youtube-play" style="font-size:38px;"></i>
</a>
</h2>
</div>
</div>
</div>
</section>
<hr style="width: 100%;height: 4px;background: #148963;margin: 0px 0px;">
<hr style="width: 100%;height: 4px;background: #2C0091;margin: 0px 0px;">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

View File

@@ -1,98 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_account_financial_report_form" model="ir.ui.view">
<field name="name">account.financial.report.form</field>
<field name="model">account.financial.report</field>
<field name="arch" type="xml">
<form string="Account Report">
<sheet>
<group>
<group>
<field name="name"/>
<field name="parent_id"/>
<field name="sequence"/>
</group>
<group>
<field name="type"/>
<field name="sign"/>
<field name="style_overwrite"/>
</group>
</group>
<notebook>
<page string="Report"
invisible="type not in ['accounts', 'account_type', 'account_report']">
<group>
<field name="display_detail"
invisible="type not in ['accounts', 'account_type', 'account_report']"/>
<field name="account_report_id"
invisible="type != 'account_report'"/>
</group>
<field name="account_ids" invisible="type != 'accounts'"/>
<field name="account_type_ids" invisible="type != 'account_type'"/>
</page>
<page string="Childrens">
<field name="children_ids" nolabel="1">
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="view_account_financial_report_tree" model="ir.ui.view">
<field name="name">account.financial.report.list</field>
<field name="model">account.financial.report</field>
<field name="arch" type="xml">
<list string="Account Report">
<field name="name"/>
<field name="parent_id" invisible="1"/>
<field name="type"/>
<field name="account_report_id"/>
</list>
</field>
</record>
<record id="view_account_financial_report_search" model="ir.ui.view">
<field name="name">account.financial.report.search</field>
<field name="model">account.financial.report</field>
<field name="arch" type="xml">
<search string="Account Report">
<field name="name" string="Account Report"/>
<field name="type"/>
<field name="account_report_id"/>
<filter string="Reports" name="filter_parent_id" domain="[('parent_id','=', False)]"/>
<group>
<filter name="parent_report" string="Parent Report"
context="{'group_by':'parent_id'}"/>
<filter name="report_type" string="Report Type" context="{'group_by':'type'}"/>
</group>
</search>
</field>
</record>
<record id="action_account_financial_report_tree" model="ir.actions.act_window">
<field name="name">Financial Reports</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.financial.report</field>
<field name="view_mode">list,form</field>
<field name="context">{'search_default_filter_parent_id': True}</field>
<field name="search_view_id" ref="view_account_financial_report_search"/>
<field name="view_id" ref="view_account_financial_report_tree"/>
</record>
<menuitem id="menu_finance_reports_settings"
name="Financial Reports"
sequence="9"
groups="account.group_account_user,account.group_account_manager"
parent="account.menu_finance_configuration"/>
<menuitem id="menu_account_reports"
name="Account Reports"
action="action_account_financial_report_tree"
groups="account.group_account_user,account.group_account_manager"
parent="menu_finance_reports_settings"/>
</odoo>

View File

@@ -1,36 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="action_account_moves_ledger_general" model="ir.actions.act_window">
<field name="context">{'journal_type':'general', 'search_default_group_by_account': 1, 'search_default_posted':1}</field>
<field name="name">General Ledger</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="account.view_move_line_tree_grouped_general"/>
<field name="search_view_id" ref="account.view_account_move_line_filter"/>
<field name="view_mode">list,pivot,graph</field>
</record>
<record id="action_account_moves_ledger_partner" model="ir.actions.act_window">
<field name="context">{'journal_type':'general', 'search_default_group_by_partner': 1,
'search_default_posted':1, 'search_default_payable':1, 'search_default_receivable':1,
'search_default_unreconciled':1}
</field>
<field name="name">Partner Ledger</field>
<field name="res_model">account.move.line</field>
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
<field name="view_id" ref="account.view_move_line_tree_grouped_partner"/>
<field name="search_view_id" ref="account.view_account_move_line_filter"/>
<field name="view_mode">list,pivot,graph</field>
</record>
<menuitem id="menu_finance_entries_accounting_ledgers" name="Ledgers" parent="account.menu_finance_entries"
sequence="3">
<menuitem id="menu_action_account_moves_ledger_general" action="action_account_moves_ledger_general"
groups="account.group_account_readonly" sequence="1"/>
<menuitem id="menu_action_account_moves_ledger_partner" action="action_account_moves_ledger_partner"
groups="account.group_account_readonly" sequence="2"/>
</menuitem>
</odoo>

View File

@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<menuitem id="menu_finance_legal_statement"
name="Financial Reports"
sequence="10"
parent="account.menu_finance_reports"/>
<menuitem id="menu_finance_partner_reports"
name="Partner Reports"
sequence="20"
parent="account.menu_finance_reports"/>
<menuitem id="menu_finance_audit_reports"
name="Audit Reports"
sequence="30"
parent="account.menu_finance_reports"/>
<record id="account.account_reports_management_menu" model="ir.ui.menu">
<field name="sequence" eval="40"/>
</record>
</odoo>

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.accountant</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="account.res_config_settings_view_form"/>
<field name="arch" type="xml">
<app name="account" position="inside">
<h2>Enhanced Financial Reports</h2>
<div>
<div class="row mt16 o_settings_container" name="report_setting_container">
<div class="col-6 col-lg-6 o_setting_box" id="enhanced_reports">
<div>
Preview financial reports without downloading
</div>
<div class="content-group">
<a target="_blank" href="https://apps.odoo.com/apps/modules/19.0/om_accounting_reports/"
style="text-decoration: underline;">Enhanced Financial Reports</a>
</div>
</div>
<div class="col-6 col-lg-6 o_setting_box" id="excel_reports">
<div>
Financial Reports in Excel
</div>
<div class="content-group">
<a target="_blank" href="https://apps.odoo.com/apps/modules/19.0/accounting_excel_reports/"
style="text-decoration: underline;">Excel Reports</a>
</div>
</div>
</div>
</div>
</app>
</field>
</record>
</odoo>

View File

@@ -1,12 +0,0 @@
from . import account_report_common
from . import account_report_common_journal
from . import account_report_print_journal
from . import account_report
from . import account_report_common_partner
from . import account_report_common_account
from . import account_partner_ledger
from . import account_general_ledger
from . import account_trial_balance
from . import account_tax_report
from . import aged_partner
from . import account_journal_audit

View File

@@ -1,35 +0,0 @@
from odoo import fields, models, api, _
from odoo.exceptions import UserError
class AccountReportGeneralLedger(models.TransientModel):
_name = "account.report.general.ledger"
_inherit = "account.common.account.report"
_description = "General Ledger Report"
initial_balance = fields.Boolean(
string='Include Initial Balances',
help='If you selected date, this field allow you to add a row '
'to display the amount of debit/credit/balance that precedes '
'the filter you have set.'
)
sortby = fields.Selection(
[('sort_date', 'Date'), ('sort_journal_partner', 'Journal & Partner')],
string='Sort by', required=True, default='sort_date'
)
journal_ids = fields.Many2many(
'account.journal', 'account_report_general_ledger_journal_rel',
'account_id', 'journal_id', string='Journals', required=True
)
def _get_report_data(self, data):
data = self.pre_print_report(data)
data['form'].update(self.read(['initial_balance', 'sortby'])[0])
if data['form'].get('initial_balance') and not data['form'].get('date_from'):
raise UserError(_("You must define a Start Date"))
records = self.env[data['model']].browse(data.get('ids', []))
return records, data
def _print_report(self, data):
records, data = self._get_report_data(data)
return self.env.ref('accounting_pdf_reports.action_report_general_ledger').with_context(landscape=True).report_action(records, data=data)

View File

@@ -1,21 +0,0 @@
from odoo import fields, models, api
class AccountPrintJournal(models.TransientModel):
_name = "account.print.journal"
_inherit = "account.common.journal.report"
_description = "Account Print Journal"
sort_selection = fields.Selection([('date', 'Date'), ('move_name', 'Journal Entry Number')],
'Entries Sorted by', required=True, default='move_name')
journal_ids = fields.Many2many('account.journal', string='Journals', required=True,
default=lambda self: self.env['account.journal'].search([('type', 'in', ['sale', 'purchase'])]))
def _get_report_data(self, data):
data = self.pre_print_report(data)
data['form'].update({'sort_selection': self.sort_selection})
return data
def _print_report(self, data):
data = self._get_report_data(data)
return self.env.ref('accounting_pdf_reports.action_report_journal').with_context(landscape=True).report_action(self, data=data)

View File

@@ -1,24 +0,0 @@
from odoo import fields, models, api, _
class AccountPartnerLedger(models.TransientModel):
_name = "account.report.partner.ledger"
_inherit = "account.common.partner.report"
_description = "Account Partner Ledger"
amount_currency = fields.Boolean("With Currency",
help="It adds the currency column on "
"report if the currency differs from "
"the company currency.")
reconciled = fields.Boolean('Reconciled Entries')
def _get_report_data(self, data):
data = self.pre_print_report(data)
data['form'].update({'reconciled': self.reconciled,
'amount_currency': self.amount_currency})
return data
def _print_report(self, data):
data = self._get_report_data(data)
return self.env.ref('accounting_pdf_reports.action_report_partnerledger').with_context(landscape=True).\
report_action(self, data=data)

View File

@@ -1,55 +0,0 @@
from odoo import api, fields, models
class AccountingReport(models.TransientModel):
_name = "accounting.report"
_inherit = "account.common.report"
_description = "Accounting Report"
@api.model
def _get_account_report(self):
reports = []
if self.env.context.get('active_id'):
menu = self.env['ir.ui.menu'].browse(self.env.context.get('active_id')).name
reports = self.env['account.financial.report'].search([('name', 'ilike', menu)])
return reports and reports[0] or False
enable_filter = fields.Boolean(string='Enable Comparison')
account_report_id = fields.Many2one('account.financial.report', string='Account Reports',
required=True, default=_get_account_report)
label_filter = fields.Char(string='Column Label', help="This label will be displayed on report to "
"show the balance computed for the given comparison filter.")
filter_cmp = fields.Selection([('filter_no', 'No Filters'), ('filter_date', 'Date')],
string='Filter by', required=True, default='filter_no')
date_from_cmp = fields.Date(string='Date From')
date_to_cmp = fields.Date(string='Date To')
debit_credit = fields.Boolean(string='Display Debit/Credit Columns',
help="This option allows you to get more details about "
"the way your balances are computed."
" Because it is space consuming, we do not allow to"
" use it while doing a comparison.")
def _build_comparison_context(self, data):
result = {}
result['journal_ids'] = 'journal_ids' in data['form'] and data['form']['journal_ids'] or False
result['state'] = 'target_move' in data['form'] and data['form']['target_move'] or ''
if data['form']['filter_cmp'] == 'filter_date':
result['date_from'] = data['form']['date_from_cmp']
result['date_to'] = data['form']['date_to_cmp']
result['strict_range'] = True
return result
def check_report(self):
res = super(AccountingReport, self).check_report()
data = {}
data['form'] = self.read(['account_report_id', 'date_from_cmp', 'date_to_cmp', 'journal_ids', 'filter_cmp', 'target_move'])[0]
for field in ['account_report_id']:
if isinstance(data['form'][field], tuple):
data['form'][field] = data['form'][field][0]
comparison_context = self._build_comparison_context(data)
res['data']['form']['comparison_context'] = comparison_context
return res
def _print_report(self, data):
data['form'].update(self.read(['date_from_cmp', 'debit_credit', 'date_to_cmp', 'filter_cmp', 'account_report_id', 'enable_filter', 'label_filter', 'target_move'])[0])
return self.env.ref('accounting_pdf_reports.action_report_financial').report_action(self, data=data, config=False)

View File

@@ -1,52 +0,0 @@
from odoo import api, fields, models, _
from odoo.tools.misc import get_lang
class AccountCommonReport(models.TransientModel):
_name = "account.common.report"
_description = "Account Common Report"
company_id = fields.Many2one('res.company', string='Company', required=True, readonly=True, default=lambda self: self.env.company)
journal_ids = fields.Many2many(
comodel_name='account.journal',
string='Journals',
required=True,
default=lambda self: self.env['account.journal'].search([('company_id', '=', self.company_id.id)]),
domain="[('company_id', '=', company_id)]",
)
date_from = fields.Date(string='Start Date')
date_to = fields.Date(string='End Date')
target_move = fields.Selection([('posted', 'All Posted Entries'),
('all', 'All Entries'),
], string='Target Moves', required=True, default='posted')
@api.onchange('company_id')
def _onchange_company_id(self):
if self.company_id:
self.journal_ids = self.env['account.journal'].search(
[('company_id', '=', self.company_id.id)])
else:
self.journal_ids = self.env['account.journal'].search([])
def _build_contexts(self, data):
result = {}
result['journal_ids'] = 'journal_ids' in data['form'] and data['form']['journal_ids'] or False
result['state'] = 'target_move' in data['form'] and data['form']['target_move'] or ''
result['date_from'] = data['form']['date_from'] or False
result['date_to'] = data['form']['date_to'] or False
result['strict_range'] = True if result['date_from'] else False
result['company_id'] = data['form']['company_id'][0] or False
return result
def _print_report(self, data):
raise NotImplementedError()
def check_report(self):
self.ensure_one()
data = {}
data['ids'] = self.env.context.get('active_ids', [])
data['model'] = self.env.context.get('active_model', 'ir.ui.menu')
data['form'] = self.read(['date_from', 'date_to', 'journal_ids', 'target_move', 'company_id'])[0]
used_context = self._build_contexts(data)
data['form']['used_context'] = dict(used_context, lang=get_lang(self.env).code)
return self.with_context(discard_logo_check=True)._print_report(data)

View File

@@ -1,26 +0,0 @@
from odoo import api, fields, models
class AccountCommonAccountReport(models.TransientModel):
_name = 'account.common.account.report'
_inherit = "account.common.report"
_description = 'Account Common Account Report'
display_account = fields.Selection([('all', 'All'),
('movement', 'With movements'),
('not_zero', 'With balance is not equal to 0'), ],
string='Display Accounts',
required=True, default='movement')
analytic_account_ids = fields.Many2many('account.analytic.account',
string='Analytic Accounts')
account_ids = fields.Many2many('account.account', string='Accounts')
partner_ids = fields.Many2many('res.partner', string='Partners')
def pre_print_report(self, data):
data['form'].update(self.read(['display_account'])[0])
data['form'].update({
'analytic_account_ids': self.analytic_account_ids.ids,
'partner_ids': self.partner_ids.ids,
'account_ids': self.account_ids.ids,
})
return data

View File

@@ -1,13 +0,0 @@
from odoo import api, fields, models
class AccountCommonJournalReport(models.TransientModel):
_name = 'account.common.journal.report'
_description = 'Common Journal Report'
_inherit = "account.common.report"
amount_currency = fields.Boolean('With Currency', help="Print Report with the currency column if the currency differs from the company currency.")
def pre_print_report(self, data):
data['form'].update({'amount_currency': self.amount_currency})
return data

View File

@@ -1,18 +0,0 @@
from odoo import fields, models
class AccountingCommonPartnerReport(models.TransientModel):
_name = 'account.common.partner.report'
_inherit = "account.common.report"
_description = 'Account Common Partner Report'
result_selection = fields.Selection([('customer', 'Receivable Accounts'),
('supplier', 'Payable Accounts'),
('customer_supplier', 'Receivable and Payable Accounts')
], string="Partner's", required=True, default='customer')
partner_ids = fields.Many2many('res.partner', string='Partners')
def pre_print_report(self, data):
data['form'].update(self.read(['result_selection'])[0])
data['form'].update({'partner_ids': self.partner_ids.ids})
return data

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_common_report_view" model="ir.ui.view">
<field name="name">Common Report</field>
<field name="model">account.common.report</field>
<field name="arch" type="xml">
<form string="Report Options">
<group col="4">
<field name="target_move" widget="radio"/>
<field name="date_from"/>
<field name="date_to"/>
</group>
<group>
<field name="journal_ids" widget="many2many_tags" options="{'no_create': True}"/>
<field name="company_id" invisible="1"/>
</group>
<footer>
<button name="check_report" string="Print" type="object" default_focus="1" class="oe_highlight" data-hotkey="q"/>
<button string="Cancel" class="btn btn-secondary" special="cancel" data-hotkey="z" />
</footer>
</form>
</field>
</record>
</odoo>

View File

@@ -1,21 +0,0 @@
from odoo import fields, models
class AccountPrintJournal(models.TransientModel):
_inherit = "account.common.journal.report"
_name = "account.print.journal"
_description = "Account Print Journal"
sort_selection = fields.Selection(
[('date', 'Date'), ('move_name', 'Journal Entry Number')],
'Entries Sorted by', required=True, default='move_name'
)
journal_ids = fields.Many2many(
'account.journal', string='Journals', required=True,
default=lambda self: self.env['account.journal'].search([('type', 'in', ['sale', 'purchase'])])
)
def _print_report(self, data):
data = self.pre_print_report(data)
data['form'].update({'sort_selection': self.sort_selection})
return self.env.ref('account.action_report_journal').with_context(landscape=True).report_action(self, data=data)

View File

@@ -1,20 +0,0 @@
from odoo import models, api, fields
from datetime import date
class AccountTaxReport(models.TransientModel):
_name = 'account.tax.report.wizard'
_inherit = "account.common.report"
_description = 'Tax Report'
date_from = fields.Date(
string='Date From', required=True,
default=lambda self: fields.Date.to_string(date.today().replace(day=1))
)
date_to = fields.Date(
string='Date To', required=True,
default=lambda self: fields.Date.to_string(date.today())
)
def _print_report(self, data):
return self.env.ref('accounting_pdf_reports.action_report_account_tax').report_action(self, data=data)

View File

@@ -1,26 +0,0 @@
from odoo import fields, models, api
class AccountBalanceReport(models.TransientModel):
_name = 'account.balance.report'
_inherit = "account.common.account.report"
_description = 'Trial Balance Report'
journal_ids = fields.Many2many(
'account.journal', 'account_balance_report_journal_rel',
'account_id', 'journal_id',
string='Journals', required=True, default=[]
)
analytic_account_ids = fields.Many2many(
'account.analytic.account',
'account_trial_balance_analytic_rel', string='Analytic Accounts'
)
def _get_report_data(self, data):
data = self.pre_print_report(data)
records = self.env[data['model']].browse(data.get('ids', []))
return records, data
def _print_report(self, data):
records, data = self._get_report_data(data)
return self.env.ref('accounting_pdf_reports.action_report_trial_balance').report_action(records, data=data)

View File

@@ -1,41 +0,0 @@
import time
from dateutil.relativedelta import relativedelta
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class AccountAgedTrialBalance(models.TransientModel):
_name = 'account.aged.trial.balance'
_inherit = 'account.common.partner.report'
_description = 'Account Aged Trial balance Report'
period_length = fields.Integer(string='Period Length (days)', required=True, default=30)
journal_ids = fields.Many2many('account.journal', string='Journals', required=True)
date_from = fields.Date(default=lambda *a: time.strftime('%Y-%m-%d'))
def _get_report_data(self, data):
res = {}
data = self.pre_print_report(data)
data['form'].update(self.read(['period_length'])[0])
period_length = data['form']['period_length']
if period_length <= 0:
raise UserError(_('You must set a period length greater than 0.'))
if not data['form']['date_from']:
raise UserError(_('You must set a start date.'))
start = data['form']['date_from']
for i in range(5)[::-1]:
stop = start - relativedelta(days=period_length - 1)
res[str(i)] = {
'name': (i != 0 and (str((5 - (i + 1)) * period_length) + '-' + str((5 - i) * period_length)) or (
'+' + str(4 * period_length))),
'stop': start.strftime('%Y-%m-%d'),
'start': (i != 0 and stop.strftime('%Y-%m-%d') or False),
}
start = stop - relativedelta(days=1)
data['form'].update(res)
return data
def _print_report(self, data):
data = self._get_report_data(data)
return self.env.ref('accounting_pdf_reports.action_report_aged_partner_balance').\
with_context(landscape=True).report_action(self, data=data)

View File

@@ -1,85 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_aged_balance_view" model="ir.ui.view">
<field name="name">Aged Partner Balance</field>
<field name="model">account.aged.trial.balance</field>
<field name="arch" type="xml">
<form string="Report Options">
<group col="4">
<field name="date_from"/>
<field name="period_length"/>
<field name="company_id" invisible="1"/>
<newline/>
<field name="result_selection" widget="radio"
invisible="context.get('hide_result_selection')"/>
<field name="target_move" widget="radio"/>
</group>
<field name="journal_ids" required="0" invisible="1"/>
<xpath expr="//field[@name='journal_ids']" position="before">
<group>
<field name="partner_ids" widget="many2many_tags"
options="{'no_open': True, 'no_create': True}"/>
</group>
</xpath>
<footer>
<button name="check_report" class="oe_highlight"
string="Print" type="object"/>
<button string="Cancel" class="btn btn-default" special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="action_account_aged_balance_view" model="ir.actions.act_window">
<field name="name">Aged Partner Balance</field>
<field name="res_model">account.aged.trial.balance</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">list,form</field>
<field name="view_id" ref="account_aged_balance_view"/>
<field name="context"></field>
<field name="target">new</field>
</record>
<menuitem id="menu_aged_trial_balance"
name="Aged Partner Balance"
sequence="10"
action="action_account_aged_balance_view"
parent="menu_finance_partner_reports"/>
<record id="action_account_aged_receivable" model="ir.actions.act_window">
<field name="name">Aged Receivable</field>
<field name="res_model">account.aged.trial.balance</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">list,form</field>
<field name="view_id" ref="account_aged_balance_view"/>
<field name="context">{'default_result_selection': 'customer',
'hide_result_selection': 1}</field>
<field name="target">new</field>
</record>
<menuitem id="menu_aged_receivable"
name="Aged Receivable"
sequence="20"
action="action_account_aged_receivable"
parent="menu_finance_partner_reports"/>
<record id="action_account_aged_payable" model="ir.actions.act_window">
<field name="name">Aged Payable</field>
<field name="res_model">account.aged.trial.balance</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">list,form</field>
<field name="view_id" ref="account_aged_balance_view"/>
<field name="context">{'default_result_selection': 'supplier',
'hide_result_selection': 1}</field>
<field name="target">new</field>
</record>
<menuitem id="menu_aged_payable"
name="Aged Payable"
sequence="30"
action="action_account_aged_payable"
parent="menu_finance_partner_reports"/>
</odoo>

View File

@@ -1,116 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_financial_report_profitandloss0" model="account.financial.report">
<field name="name">Profit and Loss</field>
<field name="sign">-1</field>
<field name="type">sum</field>
</record>
<record id="account_financial_report_income0" model="account.financial.report">
<field name="name">Income</field>
<field name="sign">-1</field>
<field name="parent_id" ref="account_financial_report_profitandloss0"/>
<field name="display_detail">detail_with_hierarchy</field>
<field name="type">account_type</field>
<field name="account_type_ids" eval="[(4,ref('accounting_pdf_reports.data_account_type_other_income')), (4,ref('accounting_pdf_reports.data_account_type_revenue'))]"/>
</record>
<record id="account_financial_report_expense0" model="account.financial.report">
<field name="name">Expense</field>
<field name="sign">-1</field>
<field name="parent_id" ref="account_financial_report_profitandloss0"/>
<field name="display_detail">detail_with_hierarchy</field>
<field name="type">account_type</field>
<field name="account_type_ids" eval="[(4,ref('accounting_pdf_reports.data_account_type_expenses')),(4,ref('accounting_pdf_reports.data_account_type_direct_costs')), (4,ref('accounting_pdf_reports.data_account_type_depreciation'))]"/>
</record>
<record id="account_financial_report_balancesheet0" model="account.financial.report">
<field name="name">Balance Sheet</field>
<field name="type">sum</field>
</record>
<record id="account_financial_report_assets0" model="account.financial.report">
<field name="name">Assets</field>
<field name="parent_id" ref="account_financial_report_balancesheet0"/>
<field name="display_detail">detail_with_hierarchy</field>
<field name="type">account_type</field>
<field name="account_type_ids" eval="[(4,ref('accounting_pdf_reports.data_account_type_receivable')),
(4,ref('accounting_pdf_reports.data_account_type_liquidity')), (4,ref('accounting_pdf_reports.data_account_type_current_assets')),
(4,ref('accounting_pdf_reports.data_account_type_non_current_assets'), (4,ref('accounting_pdf_reports.data_account_type_prepayments'))),
(4,ref('accounting_pdf_reports.data_account_type_fixed_assets'))]"/>
</record>
<record id="account_financial_report_liabilitysum0" model="account.financial.report">
<field name="name">Liability</field>
<field name="parent_id" ref="account_financial_report_balancesheet0"/>
<field name="display_detail">no_detail</field>
<field name="type">sum</field>
</record>
<record id="account_financial_report_liability0" model="account.financial.report">
<field name="name">Liability</field>
<field name="parent_id" ref="account_financial_report_liabilitysum0"/>
<field name="display_detail">detail_with_hierarchy</field>
<field name="type">account_type</field>
<field name="account_type_ids" eval="[(4,ref('accounting_pdf_reports.data_account_type_payable')),
(4,ref('accounting_pdf_reports.data_account_type_equity')), (4,ref('accounting_pdf_reports.data_account_type_current_liabilities')),
(4,ref('accounting_pdf_reports.data_account_type_non_current_liabilities'))]"/>
</record>
<record id="account_financial_report_profitloss_toreport0" model="account.financial.report">
<field name="name">Profit (Loss) to report</field>
<field name="parent_id" ref="account_financial_report_liabilitysum0"/>
<field name="display_detail">no_detail</field>
<field name="type">account_report</field>
<field name="account_report_id" ref="account_financial_report_profitandloss0"/>
</record>
<record id="accounting_report_view" model="ir.ui.view">
<field name="name">Accounting Report</field>
<field name="model">accounting.report</field>
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
<field name="arch" type="xml">
<field name="target_move" position="before">
<field name="account_report_id" domain="[('parent_id','=',False)]"/>
</field>
<field name="target_move" position="after">
<field name="enable_filter"/>
<field name="debit_credit" invisible="enable_filter == True"/>
</field>
<field name="journal_ids" position="after">
<notebook tabpos="up" colspan="4">
<page string="Comparison" name="comparison" invisible="enable_filter == False">
<group>
<field name="label_filter" required="enable_filter == True"/>
<field name="filter_cmp"/>
</group>
<group string="Dates" invisible="filter_cmp != 'filter_date'">
<field name="date_from_cmp" required="filter_cmp == 'filter_date'"/>
<field name="date_to_cmp" required="filter_cmp == 'filter_date'"/>
</group>
</page>
</notebook>
</field>
</field>
</record>
<record id="action_account_report_bs" model="ir.actions.act_window">
<field name="name">Balance Sheet</field>
<field name="res_model">accounting.report</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">form</field>
<field name="view_id" ref="accounting_report_view"/>
<field name="target">new</field>
<field name="context" eval="{'default_account_report_id':ref('accounting_pdf_reports.account_financial_report_balancesheet0')}"/>
</record>
<menuitem id="menu_account_report_bs"
name="Balance Sheet"
sequence="5"
action="action_account_report_bs"
parent="menu_finance_legal_statement"
groups="account.group_account_user,account.group_account_manager"/>
</odoo>

View File

@@ -1,48 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_report_general_ledger_view" model="ir.ui.view">
<field name="name">General Ledger</field>
<field name="model">account.report.general.ledger</field>
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
<field name="arch" type="xml">
<data>
<xpath expr="//field[@name='journal_ids']" position="after">
<field name="analytic_account_ids" widget="many2many_tags"
options="{'no_open': True, 'no_create': True}"
invisible="1"
groups="analytic.group_analytic_accounting"/>
<field name="account_ids" widget="many2many_tags"
options="{'no_open': True, 'no_create': True}"/>
<field name="partner_ids" widget="many2many_tags"
options="{'no_open': True, 'no_create': True}"/>
</xpath>
<xpath expr="//field[@name='target_move']" position="after">
<field name="sortby" widget="radio"/>
<field name="display_account" widget="radio"/>
<field name="initial_balance"/>
<newline/>
</xpath>
</data>
</field>
</record>
<record id="action_account_general_ledger_menu" model="ir.actions.act_window">
<field name="name">General Ledger</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.report.general.ledger</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_report_general_ledger_view"/>
<field name="target">new</field>
<field name="binding_model_id" ref="account.model_account_account" />
<field name="binding_type">report</field>
</record>
<menuitem id="menu_general_ledger"
name="General Ledger"
sequence="10"
parent="menu_finance_audit_reports"
action="action_account_general_ledger_menu"
groups="account.group_account_user,account.group_account_manager"/>
</odoo>

View File

@@ -1,35 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_report_print_journal_view" model="ir.ui.view">
<field name="name">Journals Audit</field>
<field name="model">account.print.journal</field>
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
<field name="arch" type="xml">
<data>
<xpath expr="//field[@name='target_move']" position="after">
<field name="amount_currency" groups="base.group_multi_currency"/>
<field name="sort_selection" widget="radio"/>
<newline/>
</xpath>
</data>
</field>
</record>
<record id="action_account_print_journal_menu" model="ir.actions.act_window">
<field name="name">Journals Audit</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.print.journal</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_report_print_journal_view"/>
<field name="target">new</field>
</record>
<menuitem id="menu_print_journal"
name="Journals Audit"
sequence="40"
parent="menu_finance_audit_reports"
action="action_account_print_journal_menu"
groups="account.group_account_manager,account.group_account_user"/>
</odoo>

View File

@@ -1,62 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_report_partner_ledger_view" model="ir.ui.view">
<field name="name">Partner Ledger</field>
<field name="model">account.report.partner.ledger</field>
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
<field name="arch" type="xml">
<data>
<xpath expr="//field[@name='journal_ids']" position="before">
<field name="partner_ids" widget="many2many_tags"
options="{'no_open': True, 'no_create': True}"/>
</xpath>
<xpath expr="//field[@name='target_move']" position="after">
<field name="result_selection"/>
<field name="amount_currency" groups="base.group_multi_currency"/>
<newline/>
<field name="reconciled"/>
<newline/>
</xpath>
</data>
</field>
</record>
<record id="action_account_partner_ledger_menu" model="ir.actions.act_window">
<field name="name">Partner Ledger</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.report.partner.ledger</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_report_partner_ledger_view"/>
<field name="target">new</field>
<field name="binding_model_id" ref="account.model_account_account" />
<field name="binding_type">report</field>
</record>
<menuitem id="menu_partner_ledger"
name="Partner Ledger"
sequence="5"
parent="menu_finance_partner_reports"
action="action_account_partner_ledger_menu"
groups="account.group_account_invoice"/>
<!-- Add to Partner Print button -->
<record id="action_partner_report_partnerledger" model="ir.actions.act_window">
<field name="name">Balance Statement (Partner Ledger)</field>
<field name="res_model">account.report.partner.ledger</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_report_partner_ledger_view" />
<field name="target">new</field>
<field name="binding_model_id" ref="base.model_res_partner" />
<field name="binding_type">report</field>
<field name="context">{
'default_partner_ids':active_ids,
'default_target_move': 'posted',
'default_result_selection': 'customer_supplier',
'default_reconciled': True,
'hide_partner':1,
}</field>
<field name="group_ids" eval="[(4, ref('account.group_account_invoice'))]"/>
</record>
</odoo>

View File

@@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="action_account_report_pl" model="ir.actions.act_window">
<field name="name">Profit and Loss</field>
<field name="res_model">accounting.report</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">form</field>
<field name="view_id" ref="accounting_report_view"/>
<field name="target">new</field>
<field name="context" eval="{'default_account_report_id':ref('accounting_pdf_reports.account_financial_report_profitandloss0')}"/>
</record>
<menuitem id="menu_account_report_pl"
name="Profit and Loss"
sequence="6"
action="action_account_report_pl"
parent="accounting_pdf_reports.menu_finance_legal_statement"
groups="account.group_account_user,account.group_account_manager"/>
</odoo>

View File

@@ -1,45 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="accounting_tax_report_view" model="ir.ui.view">
<field name="name">Tax Reports</field>
<field name="model">account.tax.report.wizard</field>
<field name="inherit_id" eval="False"/>
<field name="arch" type="xml">
<form string="Report Options">
<group>
<group>
<field name="target_move" widget="radio"/>
<field name="date_from"/>
</group>
<group>
<field name="company_id" invisible="1"/>
<field name="date_to" />
</group>
</group>
<footer>
<button name="check_report" string="Print" type="object" default_focus="1" class="oe_highlight" data-hotkey="q"/>
<button string="Cancel" class="btn btn-secondary" special="cancel" data-hotkey="z"/>
</footer>
</form>
</field>
</record>
<record id="action_account_tax_report" model="ir.actions.act_window">
<field name="name">Tax Reports</field>
<field name="res_model">account.tax.report.wizard</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">form</field>
<field name="view_id" ref="accounting_tax_report_view"/>
<field name="context">{}</field>
<field name="target">new</field>
</record>
<menuitem id="menu_account_report"
name="Tax Report"
sequence="30"
action="action_account_tax_report"
parent="menu_finance_audit_reports"
groups="account.group_account_manager,account.group_account_user"/>
</odoo>

View File

@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_report_balance_view" model="ir.ui.view">
<field name="name">Trial Balance</field>
<field name="model">account.balance.report</field>
<field name="inherit_id" ref="accounting_pdf_reports.account_common_report_view"/>
<field name="arch" type="xml">
<data>
<xpath expr="//field[@name='target_move']" position="after">
<field name="display_account" widget="radio"/>
<newline/>
</xpath>
<xpath expr="//field[@name='journal_ids']" position="after">
<field name="analytic_account_ids" widget="many2many_tags"
invisible="1"
options="{'no_open': True, 'no_create': True}"/>
</xpath>
</data>
</field>
</record>
<record id="action_account_balance_menu" model="ir.actions.act_window">
<field name="name">Trial Balance</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.balance.report</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_report_balance_view"/>
<field name="target">new</field>
<field name="binding_model_id" ref="account.model_account_account" />
<field name="binding_type">report</field>
</record>
<menuitem id="menu_general_balance_report"
name="Trial Balance"
sequence="20"
parent="menu_finance_audit_reports"
action="action_account_balance_menu"
groups="account.group_account_user,account.group_account_manager"/>
</odoo>

View File

@@ -1,2 +0,0 @@
from . import models
from . import wizard

View File

@@ -1,151 +0,0 @@
{
'name': 'Laundry Management',
'version': '19.0.19.0.4',
'summary': 'Laundry Management',
'description': 'Laundry Management',
'author': 'Laundry Management',
'category': 'Services',
'license': 'LGPL-3',
'depends': [
'base',
'mail',
'sale', # sale.order (legacy refs in commission/dashboard)
'account', # account.move, account.payment (legacy refs)
'product', # product.template, product.product
'base_setup', # res.config.settings integration
'sales_team', # group_sale_salesman, group_sale_manager
'point_of_sale', # pos.order ??? source of truth
],
'data': [
# 1. Security ??? groups must load before ACLs and rules
'security/res_groups.xml',
'security/ir_rule.xml',
'security/ir.model.access.csv',
# 2. Sequences
'data/sequence.xml',
# 3. Master data
'data/laundry_data.xml',
'data/service_catalog_data.xml',
# 4. Reports ??? must load before views that reference report actions
'report/laundry_order_report.xml',
'report/laundry_thermal_report.xml',
'report/laundry_work_order_report.xml',
# 5. Action-defining views ??? must load before menus + reporting,
# because both reference these actions by xml id.
'views/product_template_views.xml',
'views/laundry_order_type_views.xml',
'views/laundry_order_attribute_views.xml',
'views/laundry_order_views.xml',
'views/pos_order_views.xml',
'views/laundry_commission_views.xml',
# 6. Configuration views
'views/laundry_payment_method_views.xml',
'views/laundry_settings_views.xml',
'views/pos_config_views.xml',
# 7. Wizards (their actions are referenced from menus / forms)
'views/laundry_print_wizard_views.xml',
'wizard/laundry_order_unlock_wizard_views.xml',
# 8. MENUS ??? must load BEFORE any file that adds a child menu
# under menu_laundry_root (e.g. laundry_reporting_views.xml).
'views/laundry_menus.xml',
# 9. Reporting ??? adds child menus under menu_laundry_root
# (defined in the file above) and under core
# sale.menu_sale_report / account.menu_finance_reports.
'views/laundry_reporting_views.xml',
],
'assets': {
# ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
# POS asset bundle ??? EXPLICIT FILE LIST (no broad globs).
# ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
# Lists only the production-required POS workflow files.
# Suspect / experimental files are commented OUT individually
# rather than disabling the whole bundle. Toggle a single line
# to add or remove a feature.
#
# The defensive guard for the `doHaveConflictWith` crash lives
# in pos_store_patch.js ??? that crash is fixed without removing
# any feature.
# ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
'point_of_sale._assets_pos': [
# ?????? Styling (shared with backend kanban) ??????????????????????????????????????????????????????
'laundry_management/static/src/scss/laundry_pos.scss',
# ?????? Reactive store (must load first; other patches use it)
'laundry_management/static/src/js/laundry_context_store.js',
# ?????? Model + screen patches (workflow core) ????????????????????????????????????????????????
'laundry_management/static/src/js/pos_order_patch.js',
'laundry_management/static/src/js/pos_store_patch.js',
'laundry_management/static/src/js/payment_screen_patch.js',
'laundry_management/static/src/js/order_payment_validation.js',
# ?????? Settle-Due (production-required) ??????????????????????????????????????????????????????????????????
'laundry_management/static/src/js/settle_dues.js',
'laundry_management/static/src/js/settlement_receipt.js',
'laundry_management/static/src/js/laundry_settle_banner.js',
'laundry_management/static/src/js/closing_popup_patch.js',
# ?????? Customer Laundry Orders popup (production-required) ??????
'laundry_management/static/src/js/view_laundry_orders.js',
'laundry_management/static/src/js/quick_create_partner.js',
# ?????? Legacy order-type / attribute / delivery flow ???????????????????????????
'laundry_management/static/src/js/laundry_order_context_panel.js',
'laundry_management/static/src/js/popups/laundry_delivery_details_popup.js',
'laundry_management/static/src/js/popups/laundry_order_attribute_popup.js',
'laundry_management/static/src/js/popups/laundry_order_type_popup.js',
# ?????? Cashier UI helpers ????????????????????????????????????????????????????????????????????????????????????????????????????????????
'laundry_management/static/src/js/control_buttons_patch.js',
'laundry_management/static/src/js/navbar_patch.js',
'laundry_management/static/src/js/order_summary_patch.js',
'laundry_management/static/src/js/order_tabs_patch.js',
'laundry_management/static/src/js/ticket_screen_patch.js',
'laundry_management/static/src/js/order_receipt_patch.js',
'laundry_management/static/src/js/laundry_receipt_details.js',
'laundry_management/static/src/js/laundry_pricing_hook.js',
# ?????? XML templates for the JS files above ??????????????????????????????????????????????????????
'laundry_management/static/src/xml/closing_popup_ext.xml',
'laundry_management/static/src/xml/control_buttons.xml',
'laundry_management/static/src/xml/laundry_order_context_panel.xml',
'laundry_management/static/src/xml/laundry_settle_banner.xml',
'laundry_management/static/src/xml/order_summary_patch.xml',
'laundry_management/static/src/xml/partner_line.xml',
'laundry_management/static/src/xml/popups/laundry_delivery_details_popup.xml',
'laundry_management/static/src/xml/popups/laundry_order_attribute_popup.xml',
'laundry_management/static/src/xml/popups/laundry_order_type_popup.xml',
'laundry_management/static/src/xml/quick_create_partner.xml',
'laundry_management/static/src/xml/receipt.xml',
'laundry_management/static/src/xml/settle_dues.xml',
'laundry_management/static/src/xml/settlement_receipt.xml',
'laundry_management/static/src/xml/view_laundry_orders.xml',
# ?????? Improved laundry configurator UX (XML-only) ?????????????????????????????????
# Pure XML inheritance on Odoo's ProductConfiguratorPopup
# that adds two CSS classes to the Dialog's contentClass so
# the existing SCSS in laundry_pos.scss enhances the popup
# for laundry-flagged products only. NO JS override, NO
# logic change. The defensive doHaveConflictWith guard in
# pos_store_patch.js handles the data-shape edge case
# independently ??? re-enabling this is safe.
'laundry_management/static/src/xml/product_configurator_popup.xml',
# ?????? STILL EXCLUDED ??? recent / experimental ????????????????????????????????????????????????
# Thermal-receipt component is kept off until an explicit
# printer-side validation. PDF fallback remains the path.
# 'laundry_management/static/src/js/laundry_thermal_receipt.js',
# 'laundry_management/static/src/xml/laundry_thermal_receipt.xml',
],
'web.assets_backend': [
# SCSS shared with backend kanban / dashboard styling.
'laundry_management/static/src/scss/laundry_pos.scss',
],
},
'demo': [
'demo/demo.xml',
],
'installable': True,
'application': True,
'auto_install': False,
}

View File

@@ -1,349 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<!-- ═══════════════════════════════════════════════════════════════
SETTLEMENT PRODUCT — used for collecting outstanding laundry dues.
Service type, no tax, NOT a laundry service (no laundry.order created).
The income account override happens in pos.order.line Python code
to use the partner's receivable account → no revenue recognised.
═══════════════════════════════════════════════════════════════ -->
<record id="product_laundry_settlement" model="product.product">
<field name="name">Laundry Settlement</field>
<field name="type">service</field>
<field name="lst_price">0.00</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
<field name="available_in_pos">True</field>
<field name="is_laundry_settlement">True</field>
<field name="is_laundry_service">False</field>
<field name="taxes_id" eval="[(5, 0, 0)]"/>
<field name="description_sale">Settlement of outstanding laundry dues.</field>
</record>
<!-- ═══════════════════════════════════════════════════════════════
PRODUCT CATEGORIES (Laundry Services tree)
═══════════════════════════════════════════════════════════════ -->
<record id="product_categ_laundry_root" model="product.category">
<field name="name">Laundry Services</field>
</record>
<record id="product_categ_washing" model="product.category">
<field name="name">Washing</field>
<field name="parent_id" ref="product_categ_laundry_root"/>
</record>
<record id="product_categ_dry_cleaning" model="product.category">
<field name="name">Dry Cleaning</field>
<field name="parent_id" ref="product_categ_laundry_root"/>
</record>
<record id="product_categ_ironing" model="product.category">
<field name="name">Ironing &amp; Pressing</field>
<field name="parent_id" ref="product_categ_laundry_root"/>
</record>
<record id="product_categ_special_care" model="product.category">
<field name="name">Special Care</field>
<field name="parent_id" ref="product_categ_laundry_root"/>
</record>
<record id="product_categ_express" model="product.category">
<field name="name">Express Service</field>
<field name="parent_id" ref="product_categ_laundry_root"/>
</record>
<!-- ═══════════════════════════════════════════════════════════════
LAUNDRY SERVICE PRODUCTS — WASHING
Using product.product so XML IDs are directly referenceable.
Template fields (name, categ_id, type, lst_price) are set via
product.product's delegation inheritance to product.template.
═══════════════════════════════════════════════════════════════ -->
<record id="svc_wash_shirt" model="product.product">
<field name="name">Shirt — Wash &amp; Iron</field>
<field name="type">service</field>
<field name="lst_price">5.00</field>
<field name="categ_id" ref="product_categ_washing"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
<field name="description_sale">Standard wash and press for dress shirts and casual shirts.</field>
</record>
<record id="svc_wash_trousers" model="product.product">
<field name="name">Trousers — Wash &amp; Iron</field>
<field name="type">service</field>
<field name="lst_price">6.00</field>
<field name="categ_id" ref="product_categ_washing"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_wash_tshirt" model="product.product">
<field name="name">T-Shirt / Polo — Wash</field>
<field name="type">service</field>
<field name="lst_price">4.00</field>
<field name="categ_id" ref="product_categ_washing"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_wash_jeans" model="product.product">
<field name="name">Jeans — Wash</field>
<field name="type">service</field>
<field name="lst_price">7.00</field>
<field name="categ_id" ref="product_categ_washing"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_wash_abaya" model="product.product">
<field name="name">Abaya — Wash &amp; Press</field>
<field name="type">service</field>
<field name="lst_price">10.00</field>
<field name="categ_id" ref="product_categ_washing"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_wash_thobe" model="product.product">
<field name="name">Thobe / Dishdasha — Wash &amp; Iron</field>
<field name="type">service</field>
<field name="lst_price">9.00</field>
<field name="categ_id" ref="product_categ_washing"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_wash_blanket" model="product.product">
<field name="name">Blanket / Duvet — Wash</field>
<field name="type">service</field>
<field name="lst_price">18.00</field>
<field name="categ_id" ref="product_categ_washing"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<!-- ═══════════════════════════════════════════════════════════════
LAUNDRY SERVICE PRODUCTS — DRY CLEANING
═══════════════════════════════════════════════════════════════ -->
<record id="svc_dc_suit" model="product.product">
<field name="name">Suit (2-Piece) — Dry Clean</field>
<field name="type">service</field>
<field name="lst_price">25.00</field>
<field name="categ_id" ref="product_categ_dry_cleaning"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
<field name="description_sale">Full dry cleaning for 2-piece suits.</field>
</record>
<record id="svc_dc_jacket" model="product.product">
<field name="name">Jacket / Blazer — Dry Clean</field>
<field name="type">service</field>
<field name="lst_price">15.00</field>
<field name="categ_id" ref="product_categ_dry_cleaning"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_dc_dress" model="product.product">
<field name="name">Dress / Gown — Dry Clean</field>
<field name="type">service</field>
<field name="lst_price">20.00</field>
<field name="categ_id" ref="product_categ_dry_cleaning"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_dc_abaya" model="product.product">
<field name="name">Abaya — Dry Clean &amp; Press</field>
<field name="type">service</field>
<field name="lst_price">18.00</field>
<field name="categ_id" ref="product_categ_dry_cleaning"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_dc_thobe" model="product.product">
<field name="name">Thobe / Dishdasha — Dry Clean</field>
<field name="type">service</field>
<field name="lst_price">16.00</field>
<field name="categ_id" ref="product_categ_dry_cleaning"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_dc_wedding_dress" model="product.product">
<field name="name">Wedding Dress — Dry Clean &amp; Preserve</field>
<field name="type">service</field>
<field name="lst_price">60.00</field>
<field name="categ_id" ref="product_categ_dry_cleaning"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
<field name="description_sale">Premium dry cleaning and preservation for wedding dresses.</field>
</record>
<!-- ═══════════════════════════════════════════════════════════════
LAUNDRY SERVICE PRODUCTS — IRONING & PRESSING
═══════════════════════════════════════════════════════════════ -->
<record id="svc_iron_shirt" model="product.product">
<field name="name">Shirt — Iron &amp; Press</field>
<field name="type">service</field>
<field name="lst_price">3.00</field>
<field name="categ_id" ref="product_categ_ironing"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_iron_trousers" model="product.product">
<field name="name">Trousers — Iron &amp; Press</field>
<field name="type">service</field>
<field name="lst_price">4.00</field>
<field name="categ_id" ref="product_categ_ironing"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_iron_thobe" model="product.product">
<field name="name">Thobe / Dishdasha — Iron &amp; Press</field>
<field name="type">service</field>
<field name="lst_price">5.00</field>
<field name="categ_id" ref="product_categ_ironing"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_iron_suit" model="product.product">
<field name="name">Suit — Iron &amp; Press</field>
<field name="type">service</field>
<field name="lst_price">8.00</field>
<field name="categ_id" ref="product_categ_ironing"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_iron_dress" model="product.product">
<field name="name">Dress / Gown — Iron &amp; Press</field>
<field name="type">service</field>
<field name="lst_price">7.00</field>
<field name="categ_id" ref="product_categ_ironing"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<!-- ═══════════════════════════════════════════════════════════════
LAUNDRY SERVICE PRODUCTS — SPECIAL CARE
═══════════════════════════════════════════════════════════════ -->
<record id="svc_special_carpet" model="product.product">
<field name="name">Carpet / Rug — Deep Clean</field>
<field name="type">service</field>
<field name="lst_price">35.00</field>
<field name="categ_id" ref="product_categ_special_care"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
<field name="description_sale">Deep steam cleaning for carpets and rugs.</field>
</record>
<record id="svc_special_curtain" model="product.product">
<field name="name">Curtain — Wash &amp; Press</field>
<field name="type">service</field>
<field name="lst_price">25.00</field>
<field name="categ_id" ref="product_categ_special_care"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_special_leather" model="product.product">
<field name="name">Leather Jacket — Clean &amp; Condition</field>
<field name="type">service</field>
<field name="lst_price">40.00</field>
<field name="categ_id" ref="product_categ_special_care"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
</record>
<record id="svc_special_stain" model="product.product">
<field name="name">Stain Treatment (per item)</field>
<field name="type">service</field>
<field name="lst_price">12.00</field>
<field name="categ_id" ref="product_categ_special_care"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
<field name="description_sale">Targeted stain removal treatment applied before washing.</field>
</record>
<!-- ═══════════════════════════════════════════════════════════════
LAUNDRY SERVICE PRODUCTS — EXPRESS SERVICE
═══════════════════════════════════════════════════════════════ -->
<record id="svc_express_4hr" model="product.product">
<field name="name">Express Turnaround (4-Hour)</field>
<field name="type">service</field>
<field name="lst_price">10.00</field>
<field name="categ_id" ref="product_categ_express"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
<field name="description_sale">Priority processing — ready within 4 hours.</field>
</record>
<record id="svc_express_sameday" model="product.product">
<field name="name">Same-Day Delivery Surcharge</field>
<field name="type">service</field>
<field name="lst_price">8.00</field>
<field name="categ_id" ref="product_categ_express"/>
<field name="is_laundry_service">True</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
<field name="description_sale">Add-on fee for same-day home delivery.</field>
</record>
<!-- ═══════════════════════════════════════════════════════════════
POLISHED EXAMPLE — Service Speed variant.
Demonstrates the cleanest workflow: ONE template, two timing
variants (Normal / Express). Cashier picks variant in POS.
Uses native product.attribute machinery.
═══════════════════════════════════════════════════════════════ -->
<record id="lm_attr_service_speed" model="product.attribute">
<field name="name">Service Speed</field>
<field name="display_type">radio</field>
<field name="create_variant">always</field>
</record>
<record id="lm_attr_speed_normal" model="product.attribute.value">
<field name="name">Normal</field>
<field name="attribute_id" ref="lm_attr_service_speed"/>
<field name="sequence">1</field>
<field name="default_extra_price">0.00</field>
</record>
<record id="lm_attr_speed_express" model="product.attribute.value">
<field name="name">Express</field>
<field name="attribute_id" ref="lm_attr_service_speed"/>
<field name="sequence">2</field>
<field name="default_extra_price">3.00</field>
</record>
<!-- Demo product removed; canonical catalog lives in
data/service_catalog_data.xml (Abaya / Thobe / T-Shirt). -->
</odoo>

View File

@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Laundry Order sequence: LND/2025/04/0001 -->
<record id="seq_laundry_order" model="ir.sequence">
<field name="name">Laundry Order</field>
<field name="code">laundry.order</field>
<field name="prefix">LND/%(year)s/%(month)s/</field>
<field name="padding">4</field>
<field name="number_increment">1</field>
<field name="number_next">1</field>
<field name="use_date_range" eval="False"/>
<field name="company_id" eval="False"/>
</record>
<!-- Laundry Session sequence (kept for backward compat) -->
<record id="seq_laundry_session" model="ir.sequence">
<field name="name">Laundry Session</field>
<field name="code">laundry.session</field>
<field name="prefix">LS/%(year)s/%(month)s/</field>
<field name="padding">4</field>
<field name="number_increment">1</field>
<field name="number_next">1</field>
<field name="use_date_range" eval="False"/>
<field name="company_id" eval="False"/>
</record>
<!-- Per-item tracking code: LI-000001 (6-digit pad, no date).
Used as the scannable barcode on each laundry.order.line. -->
<record id="seq_laundry_order_line_tracking" model="ir.sequence">
<field name="name">Laundry Item Tracking Code</field>
<field name="code">laundry.order.line.tracking</field>
<field name="prefix">LI-</field>
<field name="padding">6</field>
<field name="number_increment">1</field>
<field name="number_next">1</field>
<field name="use_date_range" eval="False"/>
<field name="company_id" eval="False"/>
</record>
</odoo>

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Placeholder to satisfy __manifest__.py.
Add service catalog seed data here later if needed. -->
</odoo>

View File

@@ -1,52 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<!-- Laundry orders themselves are created automatically from POS
(pos_order_id is required), so we don't seed laundry.order rows.
Below: a realistic demo service product with Normal / Express
variants so cashiers see something cleaner than a blank catalog. -->
<!-- ── Product attribute: Service Speed ─────────────────────────── -->
<record id="demo_attr_service_speed" model="product.attribute">
<field name="name">Service Speed</field>
<field name="display_type">radio</field>
<field name="create_variant">always</field>
<field name="sequence">10</field>
</record>
<record id="demo_attr_value_normal" model="product.attribute.value">
<field name="name">Normal</field>
<field name="attribute_id" ref="demo_attr_service_speed"/>
<field name="sequence">10</field>
</record>
<record id="demo_attr_value_express" model="product.attribute.value">
<field name="name">Express</field>
<field name="attribute_id" ref="demo_attr_service_speed"/>
<field name="default_extra_price">3.0</field>
<field name="sequence">20</field>
</record>
<!-- ── Demo product: T-Shirt / Polo Wash ───────────────────────── -->
<record id="demo_product_tshirt_wash" model="product.template">
<field name="name">T-Shirt / Polo Wash</field>
<field name="type">service</field>
<field name="sale_ok">True</field>
<field name="purchase_ok">False</field>
<field name="available_in_pos">True</field>
<field name="is_laundry_service">True</field>
<field name="list_price">8.0</field>
<field name="taxes_id" eval="[(5,)]"/>
<field name="description_sale">Wash + iron for tops. Express adds 3 SAR.</field>
</record>
<record id="demo_product_tshirt_wash_attr_line" model="product.template.attribute.line">
<field name="product_tmpl_id" ref="demo_product_tshirt_wash"/>
<field name="attribute_id" ref="demo_attr_service_speed"/>
<field name="value_ids" eval="[(6, 0, [
ref('demo_attr_value_normal'),
ref('demo_attr_value_express'),
])]"/>
</record>
</odoo>

View File

@@ -1,7 +0,0 @@
## Module <laundry_management>
#### 26.01.2026
#### Version 19.0.1.0.0
#### ADD
- Initial commit for Laundry Management

View File

@@ -1,413 +0,0 @@
# Arabic translation for laundry_management
# Copyright (C) 2026
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 19.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-04-01 00:00+0000\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#. module: laundry_management
msgid "Laundry"
msgstr "المغسلة"
#. module: laundry_management
msgid "Laundry Management"
msgstr "إدارة المغسلة"
#. module: laundry_management
msgid "Laundry Order"
msgstr "طلب مغسلة"
#. module: laundry_management
msgid "Laundry Orders"
msgstr "طلبات المغسلة"
#. module: laundry_management
msgid "Orders"
msgstr "الطلبات"
#. module: laundry_management
msgid "All Orders"
msgstr "جميع الطلبات"
#. module: laundry_management
msgid "Operations Pipeline"
msgstr "خط سير العمليات"
#. module: laundry_management
msgid "Ready for Pickup"
msgstr "جاهز للاستلام"
#. module: laundry_management
msgid "Configuration"
msgstr "الإعدادات"
#. module: laundry_management
msgid "Service Categories"
msgstr "تصنيفات الخدمات"
#. module: laundry_management
msgid "Item Types"
msgstr "أنواع القطع"
#. module: laundry_management
msgid "Order No."
msgstr "رقم الطلب"
#. module: laundry_management
msgid "Customer"
msgstr "العميل"
#. module: laundry_management
msgid "Mobile"
msgstr "الجوال"
#. module: laundry_management
msgid "Order Date"
msgstr "تاريخ الطلب"
#. module: laundry_management
msgid "Expected Delivery"
msgstr "موعد التسليم المتوقع"
#. module: laundry_management
msgid "Order Type"
msgstr "نوع الطلب"
#. module: laundry_management
msgid "Walk-In / Drop-Off"
msgstr "مراجعة مباشرة"
#. module: laundry_management
msgid "We Pick Up"
msgstr "نستلم من عندك"
#. module: laundry_management
msgid "Home Delivery"
msgstr "توصيل للمنزل"
#. module: laundry_management
msgid "Priority"
msgstr "الأولوية"
#. module: laundry_management
msgid "Normal"
msgstr "عادي"
#. module: laundry_management
msgid "Urgent"
msgstr "عاجل"
#. module: laundry_management
msgid "Express"
msgstr "سريع جداً"
#. module: laundry_management
msgid "Status"
msgstr "الحالة"
#. module: laundry_management
msgid "Draft"
msgstr "مسودة"
#. module: laundry_management
msgid "Received"
msgstr "مستلم"
#. module: laundry_management
msgid "In Process"
msgstr "تحت المعالجة"
#. module: laundry_management
msgid "Ready"
msgstr "جاهز"
#. module: laundry_management
msgid "Handed Over"
msgstr "تم التسليم"
#. module: laundry_management
msgid "Cancelled"
msgstr "ملغي"
#. module: laundry_management
msgid "Confirm Receipt"
msgstr "تأكيد الاستلام"
#. module: laundry_management
msgid "Start Processing"
msgstr "بدء المعالجة"
#. module: laundry_management
msgid "Ready for Pickup"
msgstr "جاهز للاستلام"
#. module: laundry_management
msgid "Hand Over to Customer"
msgstr "تسليم للعميل"
#. module: laundry_management
msgid "Cancel Order"
msgstr "إلغاء الطلب"
#. module: laundry_management
msgid "Reopen"
msgstr "إعادة فتح"
#. module: laundry_management
msgid "Items & Services"
msgstr "القطع والخدمات"
#. module: laundry_management
msgid "Item"
msgstr "القطعة"
#. module: laundry_management
msgid "Item Type"
msgstr "نوع القطعة"
#. module: laundry_management
msgid "Service"
msgstr "الخدمة"
#. module: laundry_management
msgid "Category"
msgstr "التصنيف"
#. module: laundry_management
msgid "Color / Description"
msgstr "اللون / الوصف"
#. module: laundry_management
msgid "Stain / Damage"
msgstr "بقعة / ضرر"
#. module: laundry_management
msgid "Special Instructions"
msgstr "تعليمات خاصة"
#. module: laundry_management
msgid "Qty"
msgstr "الكمية"
#. module: laundry_management
msgid "Unit Price"
msgstr "سعر الوحدة"
#. module: laundry_management
msgid "Subtotal"
msgstr "المجموع الجزئي"
#. module: laundry_management
msgid "Total"
msgstr "الإجمالي"
#. module: laundry_management
msgid "Total Amount"
msgstr "المبلغ الإجمالي"
#. module: laundry_management
msgid "Items"
msgstr "القطع"
#. module: laundry_management
msgid "Payment"
msgstr "الدفع"
#. module: laundry_management
msgid "Unpaid"
msgstr "غير مدفوع"
#. module: laundry_management
msgid "Partial"
msgstr "مدفوع جزئياً"
#. module: laundry_management
msgid "Paid"
msgstr "مدفوع"
#. module: laundry_management
msgid "Invoice"
msgstr "الفاتورة"
#. module: laundry_management
msgid "Received By"
msgstr "استُلم بواسطة"
#. module: laundry_management
msgid "Handed Over By"
msgstr "سُلّم بواسطة"
#. module: laundry_management
msgid "Customer Notes"
msgstr "ملاحظات العميل"
#. module: laundry_management
msgid "Internal Notes"
msgstr "ملاحظات داخلية"
#. module: laundry_management
msgid "Processing Info"
msgstr "معلومات المعالجة"
#. module: laundry_management
msgid "Notes"
msgstr "الملاحظات"
#. module: laundry_management
msgid "Washing"
msgstr "غسيل"
#. module: laundry_management
msgid "Dry Cleaning"
msgstr "تنظيف جاف"
#. module: laundry_management
msgid "Ironing & Pressing"
msgstr "كوي وضغط"
#. module: laundry_management
msgid "Special Care"
msgstr "عناية خاصة"
#. module: laundry_management
msgid "Express Service"
msgstr "خدمة سريعة"
#. module: laundry_management
msgid "Shirt"
msgstr "قميص"
#. module: laundry_management
msgid "Trousers / Pants"
msgstr "بنطلون"
#. module: laundry_management
msgid "Suit (2-Piece)"
msgstr "بدلة (قطعتان)"
#. module: laundry_management
msgid "Abaya"
msgstr "عباية"
#. module: laundry_management
msgid "Thobe / Dishdasha"
msgstr "ثوب / دشداشة"
#. module: laundry_management
msgid "Dress / Gown"
msgstr "فستان / ثوب سهرة"
#. module: laundry_management
msgid "Jacket / Blazer"
msgstr "جاكيت / بليزر"
#. module: laundry_management
msgid "T-Shirt / Polo"
msgstr "تيشيرت / بولو"
#. module: laundry_management
msgid "Jeans"
msgstr "جينز"
#. module: laundry_management
msgid "Blanket / Duvet"
msgstr "بطانية / لحاف"
#. module: laundry_management
msgid "Carpet / Rug"
msgstr "سجادة / موكيت"
#. module: laundry_management
msgid "Curtain"
msgstr "ستارة"
#. module: laundry_management
msgid "Uniform / Workwear"
msgstr "يونيفورم / ملابس عمل"
#. module: laundry_management
msgid "Wedding Dress"
msgstr "فستان زفاف"
#. module: laundry_management
msgid "Other / Custom Item"
msgstr "أخرى / قطعة مخصصة"
#. module: laundry_management
msgid "Laundry Order Receipt"
msgstr "إيصال طلب المغسلة"
#. module: laundry_management
msgid "Search Orders"
msgstr "البحث في الطلبات"
#. module: laundry_management
msgid "Today"
msgstr "اليوم"
#. module: laundry_management
msgid "Pending"
msgstr "قيد التنفيذ"
#. module: laundry_management
msgid "Delivered"
msgstr "مسلّم"
#. module: laundry_management
msgid "Laundry Service Category"
msgstr "تصنيف خدمة المغسلة"
#. module: laundry_management
msgid "Laundry Item Type"
msgstr "نوع قطعة المغسلة"
#. module: laundry_management
msgid "Laundry Order Line"
msgstr "سطر طلب المغسلة"
#. module: laundry_management
msgid "Default Service"
msgstr "الخدمة الافتراضية"
#. module: laundry_management
msgid "Default Unit Price"
msgstr "السعر الافتراضي للوحدة"
#. module: laundry_management
msgid "Active"
msgstr "نشط"
# ── Reporting menus integrated into Sales/Accounting dashboards ──────
#. module: laundry_management
msgid "Laundry Orders Analysis"
msgstr "تحليل طلبات المغسلة"
#. module: laundry_management
msgid "Laundry Operations (Live)"
msgstr "عمليات المغسلة (مباشر)"
#. module: laundry_management
msgid "Laundry Invoices"
msgstr "فواتير المغسلة"
#. module: laundry_management
msgid "Reports"
msgstr "التقارير"
#. module: laundry_management
msgid "Orders Analysis"
msgstr "تحليل الطلبات"
#. module: laundry_management
msgid "Operations (Live)"
msgstr "العمليات (مباشر)"
#. module: laundry_management
msgid "Invoices Analysis"
msgstr "تحليل الفواتير"

View File

@@ -1,228 +0,0 @@
"""
Pre-migration script for laundry_management 19.0.11.0.0
Architecture change: standalone laundry.order / laundry.order.line / laundry.payment
models are replaced by _inherit = 'sale.order' / 'sale.order.line'.
This script runs BEFORE Odoo's model sync so that:
1. FK constraints from old wizard tables referencing laundry_order are dropped
2. Old wizard transient records are purged (they reference non-existent rows)
3. Stale ir.model.fields records pointing to old models are removed
4. Old ir.model entries are deleted (unblocking the ORM delete check)
5. Old physical tables are dropped
Without this, the ORM raises:
"Another model is using the record you are trying to delete.
Blocking model: Laundry Print Wizard (laundry.print.wizard),
Blocking field: order_id"
"""
import logging
_logger = logging.getLogger(__name__)
# Old standalone models being removed in this version
_OLD_MODELS = [
'laundry.order',
'laundry.order.line',
'laundry.payment',
'laundry.order.line.addon',
'laundry.register.payment.wizard',
'laundry.product.wizard',
'laundry.product.wizard.line',
'laundry.category',
'laundry.item.type',
]
# Physical tables that correspond to the old models
_OLD_TABLES = [
'laundry_order',
'laundry_order_line',
'laundry_payment',
'laundry_order_line_addon',
'laundry_register_payment_wizard',
'laundry_product_wizard',
'laundry_product_wizard_line',
'laundry_category',
'laundry_item_type',
]
# Transient/wizard tables that may hold rows with FK refs to laundry_order
_WIZARD_TABLES = [
'laundry_print_wizard',
'laundry_session_wizard',
'laundry_whatsapp_wizard',
'laundry_register_payment_wizard',
'laundry_product_wizard',
'laundry_product_wizard_line',
]
def _table_exists(cr, table):
cr.execute(
"SELECT 1 FROM information_schema.tables "
"WHERE table_schema = 'public' AND table_name = %s",
(table,),
)
return bool(cr.fetchone())
def _column_exists(cr, table, column):
cr.execute(
"SELECT 1 FROM information_schema.columns "
"WHERE table_schema = 'public' AND table_name = %s AND column_name = %s",
(table, column),
)
return bool(cr.fetchone())
def _drop_fk_constraints_referencing(cr, referenced_table):
"""Drop all FK constraints in the DB that point at referenced_table."""
cr.execute(
"""
SELECT tc.table_name, tc.constraint_name
FROM information_schema.table_constraints tc
JOIN information_schema.referential_constraints rc
ON tc.constraint_name = rc.constraint_name
AND tc.table_schema = rc.constraint_schema
JOIN information_schema.table_constraints tc2
ON rc.unique_constraint_name = tc2.constraint_name
AND rc.unique_constraint_schema = tc2.table_schema
WHERE tc.constraint_type = 'FOREIGN KEY'
AND tc2.table_name = %s
AND tc.table_schema = 'public'
""",
(referenced_table,),
)
rows = cr.fetchall()
for src_table, constraint_name in rows:
_logger.info(
'pre_migrate: dropping FK constraint %s on %s (referenced %s)',
constraint_name, src_table, referenced_table,
)
cr.execute(
'ALTER TABLE "%s" DROP CONSTRAINT IF EXISTS "%s"' %
(src_table, constraint_name)
)
def migrate(cr, version):
if not version:
# Fresh install — nothing to clean up
return
_logger.info('pre_migrate laundry_management %s → 19.0.11.0.0 : start', version)
# ── Step 1: Purge all transient wizard records ────────────────────────────
# TransientModel rows expire naturally but DB rows persist during upgrade;
# they hold FK refs that block constraint drops and table drops.
for tbl in _WIZARD_TABLES:
if _table_exists(cr, tbl):
_logger.info('pre_migrate: truncating wizard table %s', tbl)
cr.execute('TRUNCATE TABLE "%s" CASCADE' % tbl)
# ── Step 2: Drop FK constraints pointing at old tables ────────────────────
for tbl in _OLD_TABLES:
if _table_exists(cr, tbl):
_drop_fk_constraints_referencing(cr, tbl)
# Also drop FKs on wizard tables that point at laundry_order (the primary blocker)
# Example: laundry_print_wizard.order_id -> laundry_order.id
for wizard_tbl in _WIZARD_TABLES:
if not _table_exists(cr, wizard_tbl):
continue
# Find and drop any FK on this wizard table that references an old table
cr.execute(
"""
SELECT kcu.column_name, ccu.table_name AS foreign_table_name, tc.constraint_name
FROM information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
AND tc.table_schema = kcu.table_schema
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
AND ccu.table_schema = tc.table_schema
WHERE tc.constraint_type = 'FOREIGN KEY'
AND tc.table_schema = 'public'
AND tc.table_name = %s
AND ccu.table_name = ANY(%s)
""",
(wizard_tbl, _OLD_TABLES),
)
for col, ref_tbl, constraint_name in cr.fetchall():
_logger.info(
'pre_migrate: dropping FK %s on %s.%s -> %s',
constraint_name, wizard_tbl, col, ref_tbl,
)
cr.execute(
'ALTER TABLE "%s" DROP CONSTRAINT IF EXISTS "%s"' %
(wizard_tbl, constraint_name)
)
# ── Step 3: Remove stale ir.model.fields that ref old models ─────────────
# These are the records that cause "Blocking model: laundry.print.wizard,
# Blocking field: order_id" — the field record itself still has
# relation = 'laundry.order', which makes the ORM think laundry.print.wizard
# still depends on laundry.order.
cr.execute(
"""
DELETE FROM ir_model_fields
WHERE relation = ANY(%s)
""",
(_OLD_MODELS,),
)
deleted = cr.rowcount
_logger.info('pre_migrate: deleted %d stale ir.model.fields rows', deleted)
# Also remove fields whose model itself is one of the old models
cr.execute(
"""
DELETE FROM ir_model_fields
WHERE model IN %s
""",
(tuple(_OLD_MODELS),),
)
_logger.info('pre_migrate: deleted %d ir.model.fields for old models', cr.rowcount)
# ── Step 4: Remove stale ir.model.fields_by_name cache ───────────────────
# In some Odoo versions there is a separate constraint/index table.
# Safe to attempt; ignore if table doesn't exist.
if _table_exists(cr, 'ir_model_constraint'):
cr.execute(
"""
DELETE FROM ir_model_constraint imc
USING ir_model im
WHERE imc.model = im.id
AND im.model = ANY(%s)
""",
(_OLD_MODELS,),
)
_logger.info('pre_migrate: removed %d ir.model.constraint rows', cr.rowcount)
if _table_exists(cr, 'ir_model_relation'):
cr.execute(
"""
DELETE FROM ir_model_relation imr
USING ir_model im
WHERE imr.model = im.id
AND im.model = ANY(%s)
""",
(_OLD_MODELS,),
)
_logger.info('pre_migrate: removed %d ir.model.relation rows', cr.rowcount)
# ── Step 5: Remove ir.model entries for the old models ───────────────────
cr.execute(
"DELETE FROM ir_model WHERE model = ANY(%s)",
(_OLD_MODELS,),
)
_logger.info('pre_migrate: deleted %d ir.model rows', cr.rowcount)
# ── Step 6: Drop old physical tables ─────────────────────────────────────
for tbl in reversed(_OLD_TABLES): # reverse to respect FK order
if _table_exists(cr, tbl):
_logger.info('pre_migrate: dropping table %s', tbl)
cr.execute('DROP TABLE IF EXISTS "%s" CASCADE' % tbl)
_logger.info('pre_migrate laundry_management: complete')

View File

@@ -1,48 +0,0 @@
"""
Pre-migration for laundry_management 19.0.12.0.0
Changes handled:
1. Commission states: 'paid' only → now 'pending', 'confirmed', 'paid'
Existing 'paid' rows remain 'paid'. Existing 'pending' rows remain 'pending'.
'confirmed' is a new state — no existing rows use it, so no data migration needed.
2. New model: laundry.payment.wizard — just a new table, nothing to clean.
3. New groups: group_laundry_operator, group_laundry_cashier added to hierarchy.
Existing users with group_laundry_user keep all their permissions (implied).
4. Access control: new CSV entries for payment wizard and new groups.
Handled automatically by Odoo on upgrade.
No destructive operations needed in this migration.
The pre_migrate script from 19.0.11.0.0 already cleaned the legacy tables.
"""
import logging
_logger = logging.getLogger(__name__)
def migrate(cr, version):
if not version:
return # Fresh install
_logger.info('pre_migrate laundry_management 19.0.12.0.0: checking commission states')
# Ensure commission state column allows new 'confirmed' value.
# In Odoo, Selection fields are stored as VARCHAR — no schema change needed.
# Just verify the column exists and log the existing state distribution.
cr.execute("""
SELECT state, COUNT(*) FROM laundry_commission
GROUP BY state
ORDER BY state
""")
rows = cr.fetchall()
if rows:
_logger.info(
'pre_migrate: commission state distribution: %s',
{state: count for state, count in rows}
)
else:
_logger.info('pre_migrate: laundry_commission table is empty — fresh data')
_logger.info('pre_migrate laundry_management 19.0.12.0.0: complete')

View File

@@ -1,103 +0,0 @@
"""Pre-migration: 19.0.12.0.0 → 19.0.13.0.0
Removes three models that are being retired in this version:
- laundry.product.wizard (replaced by native sale.order.line product selection)
- laundry.product.wizard.line (child of above)
- laundry.whatsapp.wizard (replaced by one-click wa.me URL action)
If these ir.model records are left in the DB while the Python classes no longer
exist, Odoo will log warnings or fail on field-level checks during upgrade.
We clean them here, before the ORM loads.
"""
import logging
_logger = logging.getLogger(__name__)
_REMOVED_MODELS = [
'laundry.product.wizard',
'laundry.product.wizard.line',
'laundry.whatsapp.wizard',
]
_REMOVED_TABLES = [
'laundry_product_wizard',
'laundry_product_wizard_line',
'laundry_whatsapp_wizard',
]
def migrate(cr, version):
if not version:
return
_logger.info('pre_migrate 19.0.13.0.0: cleaning retired wizard models %s', _REMOVED_MODELS)
# 1. Drop physical tables (TransientModels do have real tables in Odoo)
for tbl in _REMOVED_TABLES:
cr.execute(f'DROP TABLE IF EXISTS "{tbl}" CASCADE')
_logger.info(' dropped table: %s', tbl)
# 2. Remove ir.model.access entries for these models
cr.execute("""
DELETE FROM ir_model_access
WHERE model_id IN (
SELECT id FROM ir_model WHERE model = ANY(%s)
)
""", (_REMOVED_MODELS,))
_logger.info(' deleted %d ir.model.access rows', cr.rowcount)
# 3. Remove ir.rule entries
cr.execute("""
DELETE FROM ir_rule
WHERE model_id IN (
SELECT id FROM ir_model WHERE model = ANY(%s)
)
""", (_REMOVED_MODELS,))
# 4. Remove ir.model.fields for these models
cr.execute("""
DELETE FROM ir_model_fields
WHERE model_id IN (
SELECT id FROM ir_model WHERE model = ANY(%s)
)
""", (_REMOVED_MODELS,))
_logger.info(' deleted ir.model.fields rows')
# 5. Remove ir.model.constraint
cr.execute("""
DELETE FROM ir_model_constraint
WHERE model_id IN (
SELECT id FROM ir_model WHERE model = ANY(%s)
)
""", (_REMOVED_MODELS,))
# 6. Remove ir.model.relation
cr.execute("""
DELETE FROM ir_model_relation
WHERE model_id IN (
SELECT id FROM ir_model WHERE model = ANY(%s)
)
""", (_REMOVED_MODELS,))
# 7. Remove ir.model.data (XML IDs) for these models
cr.execute("""
DELETE FROM ir_model_data
WHERE model = 'ir.model' AND name IN (
SELECT REPLACE(model, '.', '_') || '_' || id::text
FROM ir_model WHERE model = ANY(%s)
)
""", (_REMOVED_MODELS,))
# Also delete by res_id
cr.execute("""
DELETE FROM ir_model_data
WHERE model = 'ir.model'
AND res_id IN (SELECT id FROM ir_model WHERE model = ANY(%s))
""", (_REMOVED_MODELS,))
# 8. Finally remove ir.model entries themselves
cr.execute("""
DELETE FROM ir_model WHERE model = ANY(%s)
""", (_REMOVED_MODELS,))
_logger.info(' deleted ir.model entries for retired wizards')
_logger.info('pre_migrate 19.0.13.0.0: complete')

View File

@@ -1,75 +0,0 @@
"""Phase 1 financial model migration.
Before: laundry_order.amount_paid was blindly copied from pos_order.amount_paid,
which includes Customer Account / pay-later payments. Every deferred sale
appeared fully paid → amount_due was always 0 → Settle Dues was non-functional.
After: amount_paid_cash + amount_deferred are computed from pos_payment rows,
classified by pos_payment_method.split_transactions. amount_due is recomputed
as amount_deferred - amount_settled.
This script rebuilds the split for every existing laundry.order by replaying
its linked pos_order's payment history.
"""
import logging
_logger = logging.getLogger(__name__)
def migrate(cr, version):
if not version:
return
_logger.info('laundry_management: rebuilding financial split for existing orders')
# Ensure the new columns exist (ORM will have added them, but be defensive)
cr.execute("""
ALTER TABLE laundry_order
ADD COLUMN IF NOT EXISTS amount_paid_cash numeric DEFAULT 0,
ADD COLUMN IF NOT EXISTS amount_deferred numeric DEFAULT 0;
""")
# Rebuild amount_paid_cash / amount_deferred per laundry order
# from pos_payment rows classified by pos_payment_method.split_transactions.
cr.execute("""
WITH classified AS (
SELECT
lo.id AS lo_id,
COALESCE(SUM(CASE WHEN pm.split_transactions = FALSE THEN pp.amount ELSE 0 END), 0) AS cash,
COALESCE(SUM(CASE WHEN pm.split_transactions = TRUE THEN pp.amount ELSE 0 END), 0) AS deferred
FROM laundry_order lo
LEFT JOIN pos_payment pp ON pp.pos_order_id = lo.pos_order_id
LEFT JOIN pos_payment_method pm ON pm.id = pp.payment_method_id
GROUP BY lo.id
)
UPDATE laundry_order lo
SET amount_paid_cash = c.cash,
amount_deferred = c.deferred,
amount_settled = COALESCE(lo.amount_settled, 0)
FROM classified c
WHERE c.lo_id = lo.id;
""")
# amount_due is a stored compute (amount_deferred - amount_settled).
# Populate it directly here so the values are correct before the ORM
# recomputes (ORM recompute on install will overwrite with same result).
cr.execute("""
UPDATE laundry_order
SET amount_due = GREATEST(
COALESCE(amount_deferred, 0) - COALESCE(amount_settled, 0),
0
);
""")
cr.execute("""
SELECT COUNT(*),
SUM(amount_paid_cash),
SUM(amount_deferred),
SUM(amount_due)
FROM laundry_order
""")
row = cr.fetchone()
_logger.info(
'laundry_management migration: %s orders — cash=%.2f, deferred=%.2f, due=%.2f',
row[0] or 0, row[1] or 0.0, row[2] or 0.0, row[3] or 0.0,
)

View File

@@ -1,16 +0,0 @@
from . import product_template_ext # adds is_laundry_service to product.template
from . import laundry_order_type # standalone: laundry.order.type
from . import laundry_order_attribute # standalone: laundry.order.attribute
from . import laundry_order # standalone: laundry.order
from . import laundry_order_line # standalone: laundry.order.line
from . import pos_order # extends pos.order with sync_from_ui hook
from . import pos_config_ext # extends pos.config with laundry-pos settings
from . import res_partner # extends res.partner with laundry unpaid count
from . import laundry_order_line_addon # add-on services per order line
from . import laundry_commission # standalone: commission tracking
# NOTE: laundry_dashboard removed — depends on laundry.session (POS-owned)
from . import laundry_payment_method # standalone: configurable payment methods
from . import laundry_settings # extends res.config.settings
from . import account_payment_ext # stamps pos_session_id on settlement payments
from . import pos_session_ext # ships new POS models to the client
# NOTE: laundry_session and account_move removed — session/accounting is POS-owned

View File

@@ -1,21 +0,0 @@
from odoo import models, fields, api
class AccountMoveLaundryExt(models.Model):
"""Flag invoices originating from laundry orders."""
_inherit = 'account.move'
is_laundry_invoice = fields.Boolean(
string='Laundry Invoice',
compute='_compute_is_laundry_invoice',
store=True,
)
@api.depends('invoice_line_ids.sale_line_ids.order_id.is_laundry_order')
def _compute_is_laundry_invoice(self):
for move in self:
move.is_laundry_invoice = any(
sol.order_id.is_laundry_order
for line in move.invoice_line_ids
for sol in line.sale_line_ids
)

View File

@@ -1,22 +0,0 @@
from odoo import models, fields
class AccountPaymentLaundryExt(models.Model):
"""Informational stamp — links settlement payments to the POS session
that was open when the cashier collected the money.
This field is purely for visibility (closing-screen summary). It does
NOT inject settlement totals into POS cash-control math.
"""
_inherit = 'account.payment'
pos_session_id = fields.Many2one(
'pos.session', string='POS Session',
readonly=True, copy=False, index=True,
help='POS session that was open when this settlement was created.',
)
settlement_pos_pm_id = fields.Many2one(
'pos.payment.method', string='Settlement Payment Method',
readonly=True, copy=False, index=True,
help='Original POS payment method chosen by the cashier during settlement.',
)

View File

@@ -1,125 +0,0 @@
from odoo import models, fields, api
from odoo.exceptions import UserError
class LaundryCommission(models.Model):
"""Staff commission tracking (PART 3).
States:
pending — auto-created when order progresses; awaiting manager review
confirmed — manager has verified and approved the commission
paid — commission has been settled/paid to the staff member
The commission_account_id (from settings) is informational for now.
Managers can bulk-confirm and bulk-mark-paid from the list view.
"""
_name = 'laundry.commission'
_description = 'Laundry Staff Commission'
_inherit = ['mail.thread']
_order = 'date desc, id desc'
name = fields.Char(
string='Reference',
compute='_compute_name', store=True, readonly=True,
)
order_id = fields.Many2one(
'sale.order', string='Order',
required=True, ondelete='cascade', index=True,
)
company_id = fields.Many2one(
'res.company',
related='order_id.company_id', store=True, index=True,
)
employee_id = fields.Many2one(
'res.users', string='Staff Member',
required=True, domain=[('share', '=', False)],
tracking=True,
)
role = fields.Selection([
('reception', 'Reception / Intake'),
('processing', 'Processing / Cleaning'),
('delivery', 'Delivery / Handover'),
], string='Role', required=True, tracking=True)
commission_type = fields.Selection([
('percentage', 'Percentage (%)'),
('fixed', 'Fixed Amount'),
], string='Type', required=True, default='percentage')
rate = fields.Float(string='Rate / Amount', digits=(10, 2))
base_amount = fields.Float(string='Order Total', digits=(10, 2))
commission_amount = fields.Float(
string='Commission',
compute='_compute_commission_amount', store=True, digits=(10, 2),
)
date = fields.Date(string='Date', required=True, default=fields.Date.today)
state = fields.Selection([
('pending', 'Pending'),
('confirmed', 'Confirmed'),
('paid', 'Paid'),
], default='pending', required=True, tracking=True, copy=False, index=True)
notes = fields.Text(string='Notes')
_ROLE_LABELS = {
'reception': 'Reception',
'processing': 'Processing',
'delivery': 'Delivery',
}
@api.depends('order_id', 'order_id.name', 'role')
def _compute_name(self):
for rec in self:
order = rec.order_id.name or 'NEW'
role = self._ROLE_LABELS.get(rec.role, rec.role or '')
rec.name = f'COM/{order}/{role}'
@api.depends('commission_type', 'rate', 'base_amount')
def _compute_commission_amount(self):
for rec in self:
if rec.commission_type == 'percentage':
rec.commission_amount = rec.base_amount * rec.rate / 100.0
else:
rec.commission_amount = rec.rate
# ── State transitions ─────────────────────────────────────────────
def action_confirm(self):
"""Manager confirms commission is valid and approved."""
for rec in self:
if rec.state != 'pending':
raise UserError(
f'"{rec.name}" cannot be confirmed — current state: {rec.state}.'
)
rec.write({'state': 'confirmed'})
rec.message_post(
body=f'Commission confirmed by {self.env.user.name}. '
f'Amount: {rec.commission_amount:.2f}'
)
def action_mark_paid(self):
"""Mark commission as settled/paid to staff."""
for rec in self:
if rec.state == 'paid':
raise UserError(f'"{rec.name}" is already paid.')
if rec.state == 'pending':
# Allow paying directly from pending (manager shortcut)
rec.write({'state': 'paid'})
else:
rec.write({'state': 'paid'})
rec.message_post(
body=f'Marked as paid by {self.env.user.name}.'
)
def action_reset_pending(self):
"""Reset commission back to pending (manager only)."""
for rec in self:
if rec.state == 'paid':
raise UserError(
f'Cannot reset "{rec.name}" — it has already been paid.'
)
rec.write({'state': 'pending'})
rec.message_post(
body=f'Reset to pending by {self.env.user.name}.'
)

View File

@@ -1,180 +0,0 @@
from odoo import models, fields, api
class LaundryDashboard(models.TransientModel):
"""Live KPI dashboard — queries sale.order with is_laundry_order = True."""
_name = 'laundry.dashboard'
_description = 'Laundry Dashboard'
today_orders = fields.Integer(string="Today's Orders")
today_revenue = fields.Monetary(string="Today's Revenue", currency_field='currency_id')
today_collected = fields.Monetary(string='Collected Today', currency_field='currency_id')
today_outstanding = fields.Monetary(string='Outstanding Today', currency_field='currency_id')
pending_count = fields.Integer(string='Pending Orders')
ready_count = fields.Integer(string='Ready for Pickup')
in_progress_count = fields.Integer(string='In Processing')
draft_count = fields.Integer(string='Quotes / Draft')
session_is_open = fields.Boolean(string='Session Open')
session_name = fields.Char(string='Session')
session_opening_cash = fields.Monetary(string='Opening Float', currency_field='currency_id')
session_sales = fields.Monetary(string='Session Sales', currency_field='currency_id')
session_cash = fields.Monetary(string='Session Cash', currency_field='currency_id')
session_bank = fields.Monetary(string='Session Bank', currency_field='currency_id')
session_id = fields.Many2one('laundry.session', string='Session Link')
month_orders = fields.Integer(string='Orders This Month')
month_revenue = fields.Monetary(string='Revenue This Month', currency_field='currency_id')
month_paid = fields.Monetary(string='Collected This Month', currency_field='currency_id')
currency_id = fields.Many2one(
'res.currency',
default=lambda self: self.env.company.currency_id,
)
@api.model
def _build(self):
today = fields.Date.today()
month_start = today.replace(day=1)
company = self.env.company
Order = self.env['sale.order']
Payment = self.env['account.payment']
_base_domain = [
('is_laundry_order', '=', True),
('company_id', '=', company.id),
]
# ── Today ──────────────────────────────────────────────────────
today_orders = Order.search(_base_domain + [
('date_order', '>=', fields.Datetime.to_datetime(today)),
('state', 'not in', ['cancel', 'draft']),
])
today_invoices = today_orders.mapped('invoice_ids').filtered(
lambda i: i.state == 'posted' and i.move_type == 'out_invoice'
)
today_revenue = sum(today_orders.mapped('amount_total'))
today_outstanding = sum(
max(i.amount_residual, 0.0) for i in today_invoices
)
today_collected = today_revenue - today_outstanding
# ── Pipeline (all active laundry orders) ──────────────────────
pipeline = Order.search(_base_domain + [
('state', '=', 'sale'),
])
pending_count = len(pipeline)
ready_count = len(pipeline.filtered(lambda o: o.laundry_state == 'ready'))
in_progress_count = len(pipeline.filtered(lambda o: o.laundry_state == 'processing'))
draft_count = len(Order.search(_base_domain + [('state', '=', 'draft')]))
# ── Session ────────────────────────────────────────────────────
session = self.env['laundry.session'].search([
('state', '=', 'opened'),
('company_id', '=', company.id),
], limit=1)
# ── Month ──────────────────────────────────────────────────────
month_orders = Order.search(_base_domain + [
('date_order', '>=', fields.Datetime.to_datetime(month_start)),
('state', 'not in', ['cancel', 'draft']),
])
month_invoices = month_orders.mapped('invoice_ids').filtered(
lambda i: i.state == 'posted' and i.move_type == 'out_invoice'
)
month_revenue = sum(month_orders.mapped('amount_total'))
month_outstanding = sum(max(i.amount_residual, 0.0) for i in month_invoices)
month_paid = month_revenue - month_outstanding
return self.create({
'today_orders' : len(today_orders),
'today_revenue' : today_revenue,
'today_collected' : max(today_collected, 0.0),
'today_outstanding' : today_outstanding,
'pending_count' : pending_count,
'ready_count' : ready_count,
'in_progress_count' : in_progress_count,
'draft_count' : draft_count,
'session_is_open' : bool(session),
'session_name' : session.name if session else '',
'session_opening_cash' : session.opening_cash if session else 0.0,
'session_sales' : session.total_sales if session else 0.0,
'session_cash' : session.total_cash if session else 0.0,
'session_bank' : session.total_bank if session else 0.0,
'session_id' : session.id if session else False,
'month_orders' : len(month_orders),
'month_revenue' : month_revenue,
'month_paid' : max(month_paid, 0.0),
})
@api.model
def action_open_dashboard(self):
rec = self._build()
return {
'type': 'ir.actions.act_window',
'name': 'Dashboard',
'res_model': 'laundry.dashboard',
'res_id': rec.id,
'view_mode': 'form',
'target': 'main',
'flags': {'mode': 'readonly'},
}
def action_refresh(self):
return self.action_open_dashboard()
def action_new_order(self):
return {
'type': 'ir.actions.act_window',
'name': 'New Laundry Order',
'res_model': 'sale.order',
'view_mode': 'form',
'target': 'current',
'context': {
'default_is_laundry_order': True,
},
}
def action_open_session(self):
if self.session_id:
return {
'type': 'ir.actions.act_window',
'name': 'Session',
'res_model': 'laundry.session',
'res_id': self.session_id.id,
'view_mode': 'form',
}
return {
'type': 'ir.actions.act_window',
'name': 'Sessions',
'res_model': 'laundry.session',
'view_mode': 'list,form',
}
def action_new_session(self):
return {
'type': 'ir.actions.act_window',
'name': 'New Session',
'res_model': 'laundry.session',
'view_mode': 'form',
}
def action_view_ready_orders(self):
return {
'type': 'ir.actions.act_window',
'name': 'Ready for Pickup',
'res_model': 'sale.order',
'view_mode': 'list,form',
'domain': [('is_laundry_order', '=', True), ('laundry_state', '=', 'ready')],
}
def action_view_pending_orders(self):
return {
'type': 'ir.actions.act_window',
'name': 'Pending Orders',
'res_model': 'sale.order',
'view_mode': 'list,form',
'domain': [('is_laundry_order', '=', True), ('state', '=', 'sale'),
('laundry_state', 'not in', ['delivered'])],
}

View File

@@ -1,765 +0,0 @@
import logging
from odoo import models, fields, api, _
from odoo.exceptions import UserError
_logger = logging.getLogger(__name__)
STATES = [
('intake', 'Intake'),
('processing', 'Processing'),
('ready', 'Ready for Pickup'),
('delivered', 'Delivered'),
('cancelled', 'Cancelled'),
]
STATE_KEYS = [s[0] for s in STATES]
FINAL_STATES = {'delivered', 'cancelled'}
SOURCE_TYPES = [
('pos', 'Point of Sale'),
('manual', 'Manual / Backoffice'),
]
# Header fields the lock protects. NOT included on purpose:
# - state (workflow advance is always allowed via dedicated actions)
# - amount_settled (settlement engine writes after lock)
# - notes (managerial commentary always allowed)
# - manager_unlocked_* (the unlock wizard writes these)
# - tracking_enabled (Phase-4 prep, manager configuration)
LOCKED_HEADER_FIELDS = frozenset({
'partner_id',
'amount_total', 'amount_paid_cash', 'amount_deferred',
'order_type_id', 'attribute_ids',
'is_delivery', 'delivery_address', 'delivery_scheduled_at',
'priority_level',
'pos_order_id', 'pos_reference',
'source_type', 'name', 'company_id',
})
# Sentinel context flag set by the POS sync hook (and any other automated
# server-side path) to allow the create + write that bring a fresh
# laundry.order to life. Without this flag, locked orders refuse mutations.
POS_SYNC_CTX = 'laundry_pos_sync'
class LaundryOrder(models.Model):
"""Standalone laundry order — created from POS.
POS owns payments/sessions/accounting. This model handles operational
workflow only: intake -> processing -> ready -> delivered.
Financial model (Phase 1 fix):
amount_total = mirror of pos.order.amount_total
amount_paid_cash = real money collected at origin (cash/card)
amount_deferred = Customer Account / pay-later amount at origin
amount_settled = money collected later via settlement engine
amount_due = amount_deferred - amount_settled
`amount_due > 0` means the customer still owes real money.
"""
_name = 'laundry.order'
_description = 'Laundry Order'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'create_date desc, id desc'
name = fields.Char(
string='Order No.',
required=True, copy=False, readonly=True,
default='New', tracking=True,
)
# -- POS link --
# Optional: manual/backoffice orders have no POS origin. The uniqueness
# constraint below still enforces "one laundry order per pos.order" for
# POS-sourced rows.
pos_order_id = fields.Many2one(
'pos.order', string='POS Order',
index=True, readonly=True, copy=False,
ondelete='restrict',
)
pos_reference = fields.Char(
string='POS Reference',
readonly=True, copy=False, index=True,
)
# -- Customer --
partner_id = fields.Many2one(
'res.partner', string='Customer',
required=True, index=True, tracking=True,
)
partner_phone = fields.Char(
related='partner_id.phone', string='Phone', readonly=True,
)
# -- Company / Currency --
company_id = fields.Many2one(
'res.company', string='Company',
required=True, default=lambda self: self.env.company,
index=True,
)
currency_id = fields.Many2one(
related='company_id.currency_id', store=True,
)
# -- Workflow --
state = fields.Selection(
STATES,
string='Status',
default='intake',
required=True,
tracking=True,
copy=False,
index=True,
)
# -- Lines --
line_ids = fields.One2many(
'laundry.order.line', 'order_id', string='Order Lines',
)
# -- Financial snapshot --
amount_total = fields.Monetary(
string='Total',
currency_field='currency_id',
readonly=True, copy=False, store=True,
)
amount_paid_cash = fields.Monetary(
string='Paid (Cash/Card)',
currency_field='currency_id',
readonly=True, copy=False, store=True,
default=0.0,
help='Amount collected at origin via non-deferred payment methods '
'(cash, card — any pos.payment.method with split_transactions=False).',
)
amount_deferred = fields.Monetary(
string='Deferred',
currency_field='currency_id',
readonly=True, copy=False, store=True,
default=0.0,
help='Amount deferred at origin via Customer Account / pay-later '
'(any pos.payment.method with split_transactions=True).',
)
amount_settled = fields.Monetary(
string='Settled',
currency_field='currency_id',
readonly=True, copy=False, store=True,
default=0.0,
help='Amount collected later via the settlement engine '
'(account.payment + reconciliation).',
)
amount_due = fields.Monetary(
string='Due',
currency_field='currency_id',
compute='_compute_amount_due',
store=True,
help='Remaining balance the customer owes: amount_deferred - amount_settled.',
)
# Back-compat alias — views/reports still reference `amount_paid`.
# Computed, non-stored; reflects real cash collected at origin.
amount_paid = fields.Monetary(
string='Paid',
currency_field='currency_id',
compute='_compute_amount_paid_alias',
)
# -- Computed --
item_count = fields.Integer(
string='Items',
compute='_compute_item_count',
store=True,
)
# -- Order type / attributes / delivery --
order_type_id = fields.Many2one(
'laundry.order.type', string='Order Type',
index=True, tracking=True,
)
attribute_ids = fields.Many2many(
'laundry.order.attribute',
'laundry_order_attribute_rel',
'order_id', 'attribute_id',
string='Attributes',
)
is_delivery = fields.Boolean(string='Delivery', tracking=True, index=True)
delivery_address = fields.Text(string='Delivery Address')
delivery_scheduled_at = fields.Datetime(string='Scheduled At')
priority_level = fields.Selection([
('normal', 'Normal'),
('urgent', 'Urgent'),
], string='Priority', default='normal', tracking=True, index=True)
# -- Notes --
notes = fields.Text(string='Notes')
# ── Source / locking (Phase 3) ────────────────────────────────────
# source_type is the truth-bearing identity. is_from_pos is a stored
# mirror used in domains, list filters, and rule conditions where a
# selection field would be awkward.
source_type = fields.Selection(
SOURCE_TYPES,
string='Source',
required=True,
default='manual',
readonly=True,
copy=False,
index=True,
tracking=True,
help='POS-sourced orders are hard-locked: lines, prices and the '
'customer cannot be edited unless a manager grants a '
'temporary unlock window. Manual orders are editable until '
'they reach a final state (delivered / cancelled).',
)
is_from_pos = fields.Boolean(
string='From POS',
compute='_compute_is_from_pos',
store=True, index=True,
)
# Phase-4 prep — flag only, no logic wired yet.
tracking_enabled = fields.Boolean(
string='Per-Item Tracking',
default=False,
copy=False,
help='When enabled, each laundry.order.line will be advanced '
'through its own state machine. Phase 4 wires the '
'synchronization between order state and item state.',
)
# Computed: True when the order refuses mutation of LOCKED_HEADER_FIELDS
# and any line write/create/unlink. Not stored — cheap to recompute and
# depends on a Datetime that ages out without a write.
locked = fields.Boolean(
string='Locked',
compute='_compute_locked',
help='Order is read-only when True. POS-sourced orders are '
'always locked. Final-state orders (delivered, cancelled) '
'are always locked. Managers can grant a temporary unlock '
'window via the "Unlock for Editing" action.',
)
manager_unlocked_until = fields.Datetime(
string='Unlock Window Expires',
copy=False, readonly=True,
help='When set in the future, the lock guard is suspended. '
'Auto-expires; no manual re-lock required.',
)
manager_unlocked_by = fields.Many2one(
'res.users', string='Last Unlocked By',
copy=False, readonly=True,
)
manager_unlock_reason = fields.Char(
string='Last Unlock Reason',
copy=False, readonly=True,
)
# Stamped when the order moves to delivered. Powers the avg-processing
# and on-time KPIs on the Operations Dashboard. Outside
# LOCKED_HEADER_FIELDS so action_deliver can write it on POS-locked
# orders without needing the bypass context.
delivered_at = fields.Datetime(
string='Delivered At',
readonly=True, copy=False, index=True,
help='Timestamp set automatically when the order moves to '
'Delivered. Used by the analytics dashboard to compute '
'processing time and on-time delivery percentage.',
)
# -- Constraints --
_pos_order_uniq = models.Constraint(
'UNIQUE(pos_order_id)',
'A laundry order already exists for this POS order.',
)
@api.constrains('source_type', 'pos_order_id')
def _check_source_type_consistency(self):
for order in self:
if order.source_type == 'pos' and not order.pos_order_id:
raise UserError(_(
'Order "%s" is marked as POS-sourced but has no '
'linked POS order.', order.name or order.id,
))
if order.source_type == 'manual' and order.pos_order_id:
raise UserError(_(
'Order "%s" is marked as manual but has a linked '
'POS order. Set source_type="pos" to keep them '
'consistent.', order.name or order.id,
))
# -- Computed --
@api.depends('amount_deferred', 'amount_settled')
def _compute_amount_due(self):
for order in self:
order.amount_due = max(
(order.amount_deferred or 0.0) - (order.amount_settled or 0.0),
0.0,
)
@api.depends('amount_paid_cash')
def _compute_amount_paid_alias(self):
for order in self:
order.amount_paid = order.amount_paid_cash or 0.0
@api.depends('source_type')
def _compute_is_from_pos(self):
for order in self:
order.is_from_pos = order.source_type == 'pos'
@api.depends('source_type', 'state', 'manager_unlocked_until')
def _compute_locked(self):
now = fields.Datetime.now()
for order in self:
unlock_active = bool(
order.manager_unlocked_until
and order.manager_unlocked_until > now
)
base_locked = (
order.source_type == 'pos'
or order.state in FINAL_STATES
)
order.locked = base_locked and not unlock_active
# ── Lock enforcement helpers ──────────────────────────────────────
def _is_pos_sync(self):
"""True when the call originates from the POS sync hook (or any
explicit server path that opts in via the context flag).
Both create() and write() honour this so the bridge from
pos.order can build / refresh the laundry.order without fighting
its own lock guard. This is checked BEFORE anything else in
write() so indirect POS writes (stored-compute flushes, cascades)
can never raise from the guard.
"""
return bool(self.env.context.get(POS_SYNC_CTX))
def _check_lock_for_write(self, vals):
"""Raise UserError when `vals` would mutate a protected header
field on a currently-locked order. Workflow advances (state,
amount_settled, notes, manager_unlocked_*) are excluded by
whitelist (LOCKED_HEADER_FIELDS).
Note: the POS-sync bypass is already applied at the top of
`write()` — this helper is only invoked for non-bypassed paths.
"""
protected = LOCKED_HEADER_FIELDS.intersection(vals.keys())
if not protected:
return
for order in self:
if order.locked:
raise UserError(_(
'Order "%(name)s" is locked. Editable fields: state '
'transitions, internal notes, settlement amount.\n'
'To edit %(fields)s, ask a manager to use '
'"Unlock for Editing" first.',
name=order.name,
fields=', '.join(sorted(protected)),
))
def _check_lock_for_unlink(self):
"""POS-sourced and final-state orders cannot be unlinked. The
manager unlock wizard is intentionally NOT honored here — deletion
requires a stronger affordance (cancellation + audit trail), not
a temporary edit window.
"""
for order in self:
if order.source_type == 'pos':
raise UserError(_(
'Order "%(name)s" was created from POS and cannot '
'be deleted. Cancel the underlying POS order instead.',
name=order.name,
))
if order.state in FINAL_STATES:
raise UserError(_(
'Order "%(name)s" is in a final state (%(state)s) '
'and cannot be deleted.',
name=order.name,
state=dict(STATES).get(order.state, order.state),
))
@api.depends('line_ids.qty')
def _compute_item_count(self):
for order in self:
order.item_count = int(sum(order.line_ids.mapped('qty')))
# -- ORM --
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if vals.get('name', 'New') == 'New':
vals['name'] = (
self.env['ir.sequence'].next_by_code('laundry.order')
or 'New'
)
self._apply_type_attribute_inference(vals)
return super().create(vals_list)
def write(self, vals):
# STEP 1 — POS sync bypass.
# Must be the very first thing we do. Any code path that opts
# into the context flag (POS create/sync, settlement engine,
# stored-compute flushes triggered from inside a bypassed write)
# MUST sail through unconditionally. No locking check, no
# side-effects, no iteration over self — just delegate to super.
# This guarantee is what makes POS payment/settlement flows
# immune to this model's lock guard.
if self._is_pos_sync():
if _logger.isEnabledFor(logging.DEBUG):
_logger.debug(
'laundry.order.write BYPASS ids=%s keys=%s',
self.ids, list(vals.keys()),
)
return super().write(vals)
# STEP 2 — Forensic trace (DEBUG-level; off by default in prod,
# enable with `--log-level=debug` or `--log-handler=odoo.addons
# .laundry_management.models.laundry_order:DEBUG`).
if _logger.isEnabledFor(logging.DEBUG):
keys = list(vals.keys())
for order in self:
_logger.debug(
'laundry.order.write id=%s source=%s state=%s '
'locked=%s ctx_keys=%s vals_keys=%s',
order.id, order.source_type, order.state, order.locked,
sorted(self.env.context.keys()), keys,
)
# STEP 3 — Lock guard for non-POS callers.
self._check_lock_for_write(vals)
return super().write(vals)
def unlink(self):
# Explicit: even with POS-sync context, refuse to delete a locked
# order. Deletion is not a mutation the sync path ever issues.
self._check_lock_for_unlink()
return super().unlink()
@api.model
def _apply_type_attribute_inference(self, vals):
"""Fill in priority_level / is_delivery from the selected order
type and attributes when the caller did not explicitly set them.
Rules:
- type.priority='urgent' OR any attribute with
is_priority_related=True → priority_level='urgent'
- type.is_delivery=True OR any attribute with
is_delivery_related=True → is_delivery=True
- Do NOT overwrite explicit incoming delivery_address /
delivery_scheduled_at with blank values.
"""
type_id = vals.get('order_type_id')
order_type = (
self.env['laundry.order.type'].browse(type_id) if type_id else None
)
attribute_ids = []
raw_attrs = vals.get('attribute_ids') or []
for cmd in raw_attrs:
if isinstance(cmd, (list, tuple)) and len(cmd) >= 3:
# Odoo x2m commands: (6,0,[ids]), (4,id), etc.
if cmd[0] == 6 and isinstance(cmd[2], (list, tuple)):
attribute_ids.extend(cmd[2])
elif cmd[0] == 4 and cmd[1]:
attribute_ids.append(cmd[1])
elif isinstance(cmd, int):
attribute_ids.append(cmd)
attributes = (
self.env['laundry.order.attribute'].browse(attribute_ids)
if attribute_ids else self.env['laundry.order.attribute']
)
# Priority
if 'priority_level' not in vals:
urgent = (
(order_type and order_type.priority == 'urgent')
or any(a.is_priority_related for a in attributes)
)
vals['priority_level'] = 'urgent' if urgent else 'normal'
# Delivery
if 'is_delivery' not in vals:
delivery = (
(order_type and order_type.is_delivery)
or any(a.is_delivery_related for a in attributes)
)
vals['is_delivery'] = bool(delivery)
# -- Workflow actions --
def action_process(self):
for order in self:
if order.state != 'intake':
raise UserError(_(
'Order "%(name)s" is not in Intake state.',
name=order.name,
))
order.state = 'processing'
def action_ready(self):
for order in self:
if order.state != 'processing':
raise UserError(_(
'Order "%(name)s" is not in Processing state.',
name=order.name,
))
order.state = 'ready'
def action_deliver(self):
"""Guards: must be Ready + fully paid (amount_due == 0).
Also stamps `delivered_at` so the dashboard KPIs (avg processing
time, on-time delivery %) can be computed from real data instead
of the heuristic on `write_date`.
"""
for order in self:
if order.state != 'ready':
raise UserError(_(
'Order "%(name)s" must be Ready before delivery.',
name=order.name,
))
if order.amount_due > 0:
raise UserError(_(
'Order "%(name)s" has %(due).2f outstanding. '
'Collect payment in POS before delivery.',
name=order.name,
due=order.amount_due,
))
order.write({
'state': 'delivered',
'delivered_at': fields.Datetime.now(),
})
def action_cancel(self):
"""Cancel an order. Allowed for manual orders only — POS-sourced
orders must be voided through the POS workflow to keep the sale
and the operational record in sync.
"""
for order in self:
if order.source_type == 'pos':
raise UserError(_(
'Order "%(name)s" was created from POS and cannot '
'be cancelled here. Cancel the underlying POS order '
'instead.',
name=order.name,
))
if order.state in FINAL_STATES:
raise UserError(_(
'Order "%(name)s" is already %(state)s.',
name=order.name,
state=dict(STATES).get(order.state, order.state),
))
order.state = 'cancelled'
# -- Smart button --
def action_open_pos_order(self):
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'res_model': 'pos.order',
'res_id': self.pos_order_id.id,
'view_mode': 'form',
'target': 'current',
}
# ═════════════════════════════════════════════════════════════════
# POS "Laundry Orders" popup — server-side RPCs
# ---------------------------------------------------------------
# These methods are the ONLY way the POS popup interacts with the
# model. Each action delegates to the corresponding workflow method
# (`action_process` / `action_ready` / `action_deliver`) which already
# enforces state + amount_due guards server-side. Direct writes to
# LOCKED_HEADER_FIELDS are NOT exposed here — the Phase 3 lock
# remains the sole authority for business-edit protection.
# ═════════════════════════════════════════════════════════════════
def _pos_allowed_actions(self):
"""Return the list of action keys the popup may render for this
order. Pure function of state + amount_due. Final states only
allow printing.
"""
self.ensure_one()
actions = ['print_work_order']
if self.state in FINAL_STATES:
return actions
if self.state == 'intake':
actions.append('start_processing')
elif self.state == 'processing':
actions.append('mark_ready')
elif self.state == 'ready':
if self.amount_due <= 0:
actions.append('deliver')
else:
actions.append('collect_payment')
return actions
def _pos_payment_state(self):
self.ensure_one()
if self.amount_due > 0:
return 'due'
if self.amount_deferred > 0 and self.amount_settled >= self.amount_deferred:
return 'settled'
if self.amount_deferred > 0:
return 'deferred'
return 'paid'
def _pos_payload(self):
"""Compact, UI-ready dict. Single source of truth for the popup
shape — every RPC returns exactly this structure."""
self.ensure_one()
names = self.line_ids.mapped('product_id.name')
if not names:
names = self.line_ids.mapped('description')
state_selection = dict(self._fields['state'].selection)
return {
'id': self.id,
'name': self.name,
'state': self.state,
'state_label': state_selection.get(self.state) or self.state,
'pos_reference': self.pos_reference or '',
'is_from_pos': self.is_from_pos,
'create_date': fields.Datetime.to_string(self.create_date) if self.create_date else False,
'item_count': int(self.item_count or 0),
'service_summary': ', '.join(dict.fromkeys(names))[:80],
'amount_total': self.amount_total,
'amount_paid': self.amount_paid_cash,
'amount_deferred': self.amount_deferred,
'amount_settled': self.amount_settled,
'amount_due': self.amount_due,
'payment_state': self._pos_payment_state(),
'is_delivery': self.is_delivery,
'allowed_actions': self._pos_allowed_actions(),
}
@api.model
def pos_search_customer_orders(self, partner_id, search_query=False, limit=20):
"""Partner-scoped search for the POS popup.
• Always filters by partner_id (no global search in this phase).
• Optional search_query ilike-matches on name / pos_reference /
partner_phone.
• Hard-capped at 50 rows regardless of the caller's limit.
"""
if not partner_id:
return []
limit = max(1, min(int(limit or 20), 50))
q = (search_query or '').strip()
domain = [('partner_id', '=', partner_id)]
if q:
domain = [
'&',
('partner_id', '=', partner_id),
'|', '|',
('name', 'ilike', q),
('pos_reference', 'ilike', q),
('partner_phone', 'ilike', q),
]
orders = self.search(
domain, order='create_date desc, id desc', limit=limit,
)
return [o._pos_payload() for o in orders]
def pos_action_start_processing(self):
"""POS popup: advance intake → processing. Returns refreshed payload."""
self.ensure_one()
self.action_process()
return self._pos_payload()
def pos_action_mark_ready(self):
"""POS popup: advance processing → ready. Returns refreshed payload."""
self.ensure_one()
self.action_ready()
return self._pos_payload()
def pos_action_deliver(self):
"""POS popup: advance ready → delivered. Returns refreshed payload.
`action_deliver` raises UserError when amount_due > 0 — the popup
surfaces that error; no client-side duplication of the rule.
"""
self.ensure_one()
self.action_deliver()
return self._pos_payload()
@api.model
def pos_get_thermal_data(self, order_id):
"""Build a self-contained payload for the thermal Work-Order
receipt rendered by `laundry_management.LaundryWorkOrderThermal`.
Independent from `_pos_payload` — that one is for the popup list
(compact); this one carries every line + delivery meta the
cashier needs on the printed slip.
"""
order = self.browse(int(order_id))
if not order.exists():
return False
state_label = dict(order._fields['state'].selection).get(
order.state, order.state,
)
return {
'id': order.id,
'name': order.name,
'state': order.state,
'state_label': state_label,
'payment_state': order._pos_payment_state(),
'pos_reference': order.pos_reference or '',
'partner_name': order.partner_id.name or '',
# `mobile` is provided by the optional `phone` add-on; fall
# back gracefully when it isn't present in the install.
'partner_phone': (
order.partner_id.phone
or getattr(order.partner_id, 'mobile', '')
or ''
),
'company_name': order.company_id.name or '',
'create_date': fields.Datetime.to_string(order.create_date),
'lines': [{
'qty': line.qty,
'description': (
line.description
or (line.product_id.name if line.product_id else '')
),
'price_unit': line.price_unit,
'subtotal': line.subtotal,
'tracking_code': line.tracking_code or '',
} for line in order.line_ids],
'item_count': int(order.item_count or 0),
'amount_total': order.amount_total,
'amount_paid': order.amount_paid_cash,
'amount_deferred': order.amount_deferred,
'amount_settled': order.amount_settled,
'amount_due': order.amount_due,
'is_delivery': order.is_delivery,
'delivery_address': order.delivery_address or '',
'delivery_scheduled_at': (
fields.Datetime.to_string(order.delivery_scheduled_at)
if order.delivery_scheduled_at else ''
),
'currency_symbol': order.currency_id.symbol or '',
'currency_position': order.currency_id.position or 'after',
}
def action_open_unlock_wizard(self):
"""Open the manager unlock wizard pre-filled with this order.
Access is enforced inside the wizard's action method (group
check + reason required), but we also short-circuit here so
the button itself is silent for non-managers.
"""
self.ensure_one()
if not self.locked:
raise UserError(_(
'Order "%s" is already editable.', self.name,
))
return {
'type': 'ir.actions.act_window',
'res_model': 'laundry.order.unlock.wizard',
'view_mode': 'form',
'target': 'new',
'context': {
'default_order_id': self.id,
},
}

View File

@@ -1,62 +0,0 @@
from odoo import models, fields, api
class LaundryOrderAttribute(models.Model):
"""Optional per-order badge (Urgent / Hanger / Fold / Delicate / ...).
Multi-selectable on a laundry order. Semantic flags drive behavior
without name matching, so admins can rename freely.
"""
_name = 'laundry.order.attribute'
_inherit = ['pos.load.mixin']
_description = 'Laundry Order Attribute'
_order = 'sequence, id'
name = fields.Char(string='Name', required=True, translate=True)
code = fields.Char(string='Code')
sequence = fields.Integer(default=10)
active = fields.Boolean(default=True)
color = fields.Char(string='Color')
icon_image = fields.Binary(string='Icon')
description = fields.Text(string='Description', translate=True)
extra_price = fields.Float(
string='Extra Price',
help='Reserved for future pricing rules. Not applied automatically.',
)
pos_available = fields.Boolean(string='Available in POS', default=True)
company_id = fields.Many2one(
'res.company', string='Company',
default=lambda self: self.env.company, index=True,
)
is_delivery_related = fields.Boolean(
string='Delivery Related',
help='Selecting this attribute marks the order as delivery and '
'triggers the delivery-details prompt.',
)
is_priority_related = fields.Boolean(
string='Priority Related',
help='Selecting this attribute promotes the order to urgent priority.',
)
@api.model
def _load_pos_data_domain(self, data, config):
return [
('pos_available', '=', True),
('active', '=', True),
'|',
('company_id', '=', False),
('company_id', 'in', config.company_id.ids),
]
@api.model
def _load_pos_data_fields(self, config):
return [
'id', 'name', 'code', 'sequence',
'color', 'description',
'extra_price',
'is_delivery_related', 'is_priority_related',
]

View File

@@ -1,288 +0,0 @@
import logging
from odoo import models, fields, api, _
from odoo.exceptions import UserError
from .laundry_order import POS_SYNC_CTX
_logger = logging.getLogger(__name__)
LINE_STATES = [
('received', 'Received'),
('processing', 'Processing'),
('ready', 'Ready'),
('delivered', 'Delivered'),
]
# Line fields the lock protects. NOT included on purpose:
# - state (per-item workflow advance is always allowed)
# - customer_note (operator commentary)
# - tracking_code (auto-assigned; cannot change after create either way)
LOCKED_LINE_FIELDS = frozenset({
'product_id', 'description', 'qty', 'price_unit',
})
class LaundryOrderLine(models.Model):
"""Line item on a laundry order — maps from pos.order.line.
Each line carries a unique scannable tracking_code (barcode) and its
own per-item workflow state. The order-level state on laundry.order
remains the source of truth for financial gates; the per-line state
is an operational overlay that supports items moving through the
workflow at different speeds.
"""
_name = 'laundry.order.line'
_description = 'Laundry Order Line'
_order = 'order_id, id'
order_id = fields.Many2one(
'laundry.order', string='Order',
required=True, ondelete='cascade', index=True,
)
# Mirror order-level partner/state so list + kanban views can filter/group
# without costly cross-model joins.
order_partner_id = fields.Many2one(
related='order_id.partner_id', store=True, index=True, readonly=True,
)
order_state = fields.Selection(
related='order_id.state', store=True, index=True, readonly=True,
)
product_id = fields.Many2one(
'product.product', string='Product',
)
description = fields.Char(
string='Description',
)
qty = fields.Float(
string='Quantity',
default=1.0, digits=(10, 2),
)
price_unit = fields.Float(
string='Unit Price',
digits=(10, 2), readonly=True,
)
customer_note = fields.Char(
string='Customer Note',
)
subtotal = fields.Float(
string='Subtotal',
compute='_compute_subtotal',
store=True, digits=(10, 2),
)
# -- Per-item tracking --
tracking_code = fields.Char(
string='Tracking Code',
copy=False, readonly=True, index=True,
help='Unique scannable barcode for this item.',
)
state = fields.Selection(
LINE_STATES,
string='Item Status',
default='received',
required=True, copy=False, index=True,
)
_tracking_code_uniq = models.Constraint(
'UNIQUE(tracking_code)',
'Tracking code must be unique across all laundry items.',
)
@api.depends('qty', 'price_unit')
def _compute_subtotal(self):
for line in self:
line.subtotal = line.qty * line.price_unit
# Sequence code for the auto-generated tracking_code (barcode).
_TRACKING_SEQ_CODE = 'laundry.order.line.tracking'
@api.model
def _next_tracking_code(self):
"""Allocate a tracking_code that is GUARANTEED unique across the
existing laundry_order_line table.
Why this exists
───────────────
Postgres sequences are NON-transactional: a `nextval()` advances
the sequence even when the surrounding ORM transaction rolls
back. Repeated POS validates that fail (lock, missing partner,
anything) eat sequence values without consuming them in real
rows. Conversely, a partial reseed / data import that inserts
rows with manual tracking_codes leaves the sequence BEHIND the
table's MAX. Either way, `next_by_code()` can return a code
that already exists → UniqueViolation → POS sale silently
misses its laundry-order link (the savepoint in pos_order.py
catches the SQL error to protect the POS commit).
How this fixes it
─────────────────
On collision, repair the sequence to (max_tracking_num + 1)
using a direct SQL nextval-skip, then ask the sequence again.
Capped at a few attempts so a real bug (e.g. malformed schema)
still surfaces instead of looping forever.
"""
seq = self.env['ir.sequence']
for attempt in range(5):
code = seq.next_by_code(self._TRACKING_SEQ_CODE) or False
if not code:
return False
# Cheap collision check; the underlying UNIQUE constraint is
# the real safety net — this just avoids paying the round-trip.
existing = self.sudo().search_count([('tracking_code', '=', code)])
if not existing:
return code
# Collision — repair sequence past the current MAX, then retry.
self._repair_tracking_sequence()
_logger.warning(
"laundry.order.line tracking sequence collided on %s "
"(attempt %d); repaired and retrying.", code, attempt + 1,
)
# If we still can't get a unique code after 5 tries, surface the
# problem instead of writing an empty code.
raise UserError(_(
'Could not allocate a unique tracking code after 5 attempts. '
'Check the laundry_management sequence configuration.'
))
@api.model
def _repair_tracking_sequence(self):
"""Advance the tracking-code sequence past the actual MAX in the
table. Idempotent — safe to call repeatedly. SQL-level so it
works even when the ORM env context is unusual (sudo, sync hook).
"""
self.env.cr.execute("""
SELECT COALESCE(MAX(
CAST(NULLIF(REGEXP_REPLACE(tracking_code, '[^0-9]', '', 'g'), '')
AS INTEGER)
), 0)
FROM laundry_order_line
WHERE tracking_code IS NOT NULL;
""")
max_existing = self.env.cr.fetchone()[0] or 0
# `ir.sequence` writes update number_next; we use the API for
# safety (handles ranges, prefixes, padding).
seq = self.env['ir.sequence'].sudo().search(
[('code', '=', self._TRACKING_SEQ_CODE)], limit=1,
)
if seq:
seq.write({'number_next': max_existing + 1})
@api.model_create_multi
def create(self, vals_list):
# POS-sync bypass FIRST — POS creates the order and its lines in a
# single create_vals payload; both must sail through the guard.
pos_sync = bool(self.env.context.get(POS_SYNC_CTX))
if not pos_sync:
order_ids = {v.get('order_id') for v in vals_list if v.get('order_id')}
if order_ids:
orders = self.env['laundry.order'].browse(list(order_ids))
for order in orders:
if order.locked:
raise UserError(_(
'Cannot add a line to locked order "%s".',
order.name,
))
for vals in vals_list:
if not vals.get('tracking_code'):
vals['tracking_code'] = self._next_tracking_code()
if _logger.isEnabledFor(logging.DEBUG):
_logger.debug(
'laundry.order.line.create pos_sync=%s count=%d',
pos_sync, len(vals_list),
)
return super().create(vals_list)
def write(self, vals):
if self.env.context.get(POS_SYNC_CTX):
if _logger.isEnabledFor(logging.DEBUG):
_logger.debug(
'laundry.order.line.write BYPASS ids=%s keys=%s',
self.ids, list(vals.keys()),
)
return super().write(vals)
protected = LOCKED_LINE_FIELDS.intersection(vals.keys())
if protected:
for line in self:
if line.order_id.locked:
raise UserError(_(
'Line on locked order "%(order)s" cannot edit '
'%(fields)s. Ask a manager to use "Unlock for '
'Editing" first.',
order=line.order_id.name,
fields=', '.join(sorted(protected)),
))
return super().write(vals)
def unlink(self):
# No bypass: deletion is never issued by the POS sync path.
for line in self:
if line.order_id.locked:
raise UserError(_(
'Cannot delete a line from locked order "%s".',
line.order_id.name,
))
return super().unlink()
# -- Per-line workflow actions (1-click) --
def action_line_process(self):
for line in self:
if line.state != 'received':
raise UserError(_(
'Item %(code)s is not in Received state.',
code=line.tracking_code or line.id,
))
line.state = 'processing'
def action_line_ready(self):
for line in self:
if line.state != 'processing':
raise UserError(_(
'Item %(code)s is not in Processing state.',
code=line.tracking_code or line.id,
))
line.state = 'ready'
def action_line_deliver(self):
for line in self:
if line.state != 'ready':
raise UserError(_(
'Item %(code)s must be Ready before delivery.',
code=line.tracking_code or line.id,
))
line.state = 'delivered'
@api.model
def action_scan_advance(self, tracking_code):
"""Advance an item one stage by its scanned tracking code.
Intended for barcode scanner workflow: scanner types the code,
this method finds the line and bumps its state to the next stage.
Returns the new state or raises UserError if terminal / unknown.
"""
if not tracking_code:
raise UserError(_('Scan a tracking code.'))
line = self.search([('tracking_code', '=', tracking_code.strip())], limit=1)
if not line:
raise UserError(_('No item with tracking code %s.', tracking_code))
transitions = {
'received': line.action_line_process,
'processing': line.action_line_ready,
'ready': line.action_line_deliver,
}
action = transitions.get(line.state)
if not action:
raise UserError(_(
'Item %(code)s is already %(state)s.',
code=line.tracking_code, state=line.state,
))
action()
return {
'id': line.id,
'tracking_code': line.tracking_code,
'state': line.state,
'order_name': line.order_id.name,
'partner_name': line.order_partner_id.name,
'product_name': line.product_id.display_name,
}

View File

@@ -1,53 +0,0 @@
from odoo import models, fields, api
class LaundryOrderLineAddon(models.Model):
"""Optional add-on service attached to one sale.order.line.
Examples per item:
- Express handling (+10 SAR)
- Starch / تقطير (+3 SAR)
- Packaging (+2 SAR)
- Perfume scent (+5 SAR)
The parent line's subtotal does NOT automatically include add-on prices
(sale.order.line controls its own subtotal). Add-ons are tracked here for
printing and reporting purposes; staff can create a separate order line for
the add-on product if billing is required.
"""
_name = 'laundry.order.line.addon'
_description = 'Order Line Add-on'
_order = 'line_id, id'
line_id = fields.Many2one(
'sale.order.line', string='Order Line',
required=True, ondelete='cascade', index=True,
)
# Denormal for easy reporting — derived from sale.order.line.order_id
order_id = fields.Many2one(
'sale.order',
related='line_id.order_id', store=True, index=True,
)
name = fields.Char(
string='Add-on / الإضافة',
required=True,
help='Name of the additional service (e.g. Express, Starch, Packaging).',
)
price = fields.Float(
string='Price / السعر',
required=True, digits=(10, 2), default=0.0,
)
quantity = fields.Float(
string='Qty',
default=1.0, digits=(10, 2),
)
subtotal = fields.Float(
string='Subtotal',
compute='_compute_subtotal', store=True, digits=(10, 2),
)
@api.depends('price', 'quantity')
def _compute_subtotal(self):
for addon in self:
addon.subtotal = addon.price * addon.quantity

Some files were not shown because too many files have changed in this diff Show More