Compare commits
1030 Commits
8.0-purcha
...
16.0_witho
| Author | SHA1 | Date | |
|---|---|---|---|
| ec55472d79 | |||
|
|
864340850f | ||
|
|
1b80dd5957 | ||
|
|
6897acd3df | ||
|
|
74b2917875 | ||
|
|
93ca6631e0 | ||
|
|
b73a34e3d7 | ||
|
|
ce3f10b8ca | ||
|
|
8f4f4dafdf | ||
|
|
7033f8650f | ||
|
|
a9a205a08f | ||
|
|
1843e19e5f | ||
|
|
c18791fb60 | ||
|
|
cf694a5f85 | ||
|
|
e25785baf4 | ||
|
|
7b0b738510 | ||
|
|
9769393759 | ||
|
|
dc00366d80 | ||
|
|
ffb031de12 | ||
|
|
f600057b1b | ||
|
|
13756ec6c3 | ||
|
|
69baec2c43 | ||
|
|
e864e383ec | ||
|
|
dbd79c0ed0 | ||
|
|
934d1b8b02 | ||
|
|
e4504fae0e | ||
|
|
e05102d807 | ||
|
|
6567d6ad29 | ||
|
|
0c97c7e1b2 | ||
|
|
c82efba0af | ||
|
|
47b029c2d2 | ||
|
|
70647387d1 | ||
|
|
03d3f30df6 | ||
|
|
bd58dcf351 | ||
|
|
dd915b906b | ||
|
|
8cc20fa84f | ||
|
|
1b469946c0 | ||
|
|
89b27a4cab | ||
|
|
b9230b2cf5 | ||
|
|
af01ae8ff3 | ||
|
|
cb632c1fc5 | ||
|
|
f6071b8324 | ||
|
|
5a9bdcfd84 | ||
|
|
4503d3f89d | ||
|
|
287a2ab0fd | ||
|
|
90fc4c3562 | ||
|
|
61a2205539 | ||
|
|
195a0203ab | ||
|
|
26abf1c8d6 | ||
|
|
66f617e797 | ||
|
|
0aa31956e0 | ||
|
|
ebd6003f08 | ||
|
|
8200eb2dea | ||
|
|
e35ce49ee2 | ||
|
|
9f4392b6bd | ||
|
|
d84b4bc8ac | ||
|
|
2ca1279cb5 | ||
|
|
699ebd5893 | ||
|
|
d973ca6740 | ||
|
|
e009106e12 | ||
|
|
9ff6e15b45 | ||
|
|
33da5cd370 | ||
|
|
a7b8401cd7 | ||
|
|
96b4c9b094 | ||
|
|
2f6491be4a | ||
|
|
e8caa77d88 | ||
|
|
95b92d4027 | ||
|
|
bec65a009f | ||
|
|
3757b12f39 | ||
|
|
9913924202 | ||
|
|
cc29d1d29f | ||
|
|
7b55172537 | ||
|
|
5f227f9b72 | ||
|
|
c6fb47c1e2 | ||
|
|
c0edd6fa57 | ||
|
|
9ea7a79d21 | ||
|
|
d9b43df0f1 | ||
|
|
ba7406290b | ||
|
|
5af6c895d0 | ||
|
|
7bdd579b1c | ||
|
|
c9f0569516 | ||
|
|
c37b607f97 | ||
|
|
5f4929f819 | ||
|
|
59c7084159 | ||
|
|
a2952ca6b2 | ||
|
|
f5b8f1674a | ||
|
|
e22badc605 | ||
|
|
f93f17b27b | ||
|
|
74586cff13 | ||
|
|
48c0e02e94 | ||
|
|
a035748c2d | ||
|
|
594c3fb0ed | ||
|
|
02c082f966 | ||
|
|
97cf376e90 | ||
|
|
c3f007e716 | ||
|
|
a333bc4e84 | ||
|
|
9e5670934e | ||
|
|
c74a647945 | ||
|
|
fca7209056 | ||
|
|
6d9b4c92eb | ||
|
|
68327c28b6 | ||
|
|
592e40637a | ||
|
|
b6624f2491 | ||
|
|
3a11c99ccb | ||
|
|
36f277940c | ||
|
|
c09e3a1108 | ||
|
|
3b5b64349b | ||
|
|
efddeb3a3c | ||
|
|
c126a286c4 | ||
|
|
670ba212d9 | ||
|
|
c26ed6cdfb | ||
|
|
dd0841385f | ||
|
|
b91abe54a5 | ||
|
|
210af49098 | ||
|
|
19158d9309 | ||
|
|
4577524f0e | ||
|
|
8fd0cb5601 | ||
|
|
8d584871d6 | ||
|
|
a7fd6a1361 | ||
|
|
2b2293593c | ||
|
|
f1614afda2 | ||
|
|
227a7ec18d | ||
|
|
827557689f | ||
|
|
67ff087f6e | ||
|
|
9507be2943 | ||
|
|
740d167331 | ||
|
|
d07e38e1f3 | ||
|
|
55b84a170e | ||
|
|
252da11a30 | ||
|
|
4ee69f3bff | ||
|
|
46fcf5c0ef | ||
|
|
2c794033b0 | ||
|
|
2f784eb1a0 | ||
|
|
b019baed6e | ||
|
|
5532a8e165 | ||
|
|
a4c2a43cf7 | ||
|
|
f9246c6988 | ||
|
|
8364b42930 | ||
|
|
df370f4948 | ||
|
|
282f48db3e | ||
|
|
73c3c1a664 | ||
|
|
ac0afd6e2b | ||
|
|
a61d1458d8 | ||
|
|
0756beb8f5 | ||
|
|
0656d319ce | ||
|
|
a517fe67a8 | ||
|
|
2953baba22 | ||
|
|
5ea3f5adfd | ||
|
|
92a1b511c1 | ||
|
|
5ad925cee1 | ||
|
|
b8e335fb10 | ||
|
|
c693ccc62c | ||
|
|
983a25367f | ||
|
|
e36f88e23a | ||
|
|
18e9ed99ff | ||
|
|
dea732e270 | ||
|
|
150916200d | ||
|
|
48247b6d06 | ||
|
|
1971808c7d | ||
|
|
5724d31ac1 | ||
|
|
3ecfde15f0 | ||
|
|
44fedbf72e | ||
|
|
5f731d18f1 | ||
|
|
7477deeae3 | ||
|
|
2905b5f426 | ||
|
|
42287c674a | ||
|
|
01eff33bcb | ||
|
|
14bb6c5834 | ||
|
|
695eaed6b9 | ||
|
|
2a862a96d5 | ||
|
|
e435a250f3 | ||
|
|
facd3adf74 | ||
|
|
e5393eb88d | ||
|
|
2764390d40 | ||
|
|
d87ff61f2f | ||
|
|
a1f8185549 | ||
|
|
2997154c49 | ||
|
|
db24e73175 | ||
|
|
1e19fc906c | ||
|
|
b954772126 | ||
|
|
3f16203ffc | ||
|
|
21f5b53f8b | ||
|
|
02970847f4 | ||
|
|
16f5c9e955 | ||
|
|
875eadc516 | ||
|
|
f9f5d2e1b9 | ||
|
|
795e9a1737 | ||
|
|
492a7275c2 | ||
|
|
16c4b1cebe | ||
|
|
aad5fa4ff0 | ||
|
|
a0c1d5f55f | ||
|
|
a63c35fcbf | ||
|
|
03d045be1c | ||
|
|
a86f90b382 | ||
|
|
4aaee98c43 | ||
|
|
62627a63a6 | ||
|
|
6d69bc659e | ||
|
|
767c6a7fd9 | ||
|
|
fbdf814cb0 | ||
|
|
5c14e3199e | ||
|
|
70957e8404 | ||
|
|
6025575ae4 | ||
|
|
8486c75f90 | ||
|
|
a7a1eefb15 | ||
|
|
fe6a332ba9 | ||
|
|
bbb0cb17f7 | ||
|
|
71ebe2adea | ||
|
|
367cb1af93 | ||
|
|
a9292506ae | ||
|
|
15c77b3e8a | ||
|
|
4f13432bdc | ||
|
|
9aac933dcb | ||
|
|
deb37a1688 | ||
|
|
6d3e4d83c7 | ||
|
|
58afed17e5 | ||
|
|
b1b4620cdc | ||
|
|
164397fbac | ||
|
|
3ae427c5de | ||
|
|
db2cd72d04 | ||
|
|
44a92bde2d | ||
|
|
da8849e745 | ||
|
|
23222e997b | ||
|
|
3259a667eb | ||
|
|
9aa65925a9 | ||
|
|
f23aa52b08 | ||
|
|
f4687b886c | ||
|
|
daddd6c17c | ||
|
|
b790aac9d8 | ||
|
|
ca61dbce3f | ||
|
|
6242dec047 | ||
|
|
7b0e4bcb55 | ||
|
|
6c04b2dd5a | ||
|
|
01e209ed43 | ||
|
|
a69556bad0 | ||
|
|
82da5e1afb | ||
|
|
fd5e620373 | ||
|
|
9589db3abe | ||
|
|
c51a847f80 | ||
|
|
a800657f54 | ||
|
|
5fbe6d340a | ||
|
|
f3874a5903 | ||
|
|
f0faa58830 | ||
|
|
b38fc99978 | ||
|
|
372a18365c | ||
|
|
27d86cf151 | ||
|
|
d67141e128 | ||
|
|
02450832cb | ||
|
|
627c5980c9 | ||
|
|
6f27b13bf9 | ||
|
|
1de8676d4e | ||
|
|
9139955fac | ||
|
|
a5b5dd83a2 | ||
|
|
5f704d34a7 | ||
|
|
9087296a54 | ||
|
|
4ac5c23b30 | ||
|
|
403b24ffc1 | ||
|
|
85f8fe5b30 | ||
|
|
fde3dfae10 | ||
|
|
4f90a7fd91 | ||
|
|
1fd25be02f | ||
|
|
174fac6d88 | ||
|
|
9507d1fbd8 | ||
|
|
a89f1a9ae7 | ||
|
|
abb36545d9 | ||
|
|
296746ce6e | ||
|
|
d0a9ec27ef | ||
|
|
d3989e96d7 | ||
|
|
f1a0aa6253 | ||
|
|
c7bd3319a9 | ||
|
|
fe96425d84 | ||
|
|
a59c2e774a | ||
|
|
cad0654983 | ||
|
|
55622ec6a9 | ||
|
|
f166fe93be | ||
|
|
b8a6cbcfea | ||
|
|
f6b10a7caa | ||
|
|
371229e9e5 | ||
|
|
1dbfd23524 | ||
|
|
9a9459f013 | ||
|
|
5a58ae0d9a | ||
|
|
b162227645 | ||
|
|
3c24e94122 | ||
|
|
400f316c7f | ||
|
|
86af01667a | ||
|
|
8967bf289a | ||
|
|
1fdaf52787 | ||
|
|
6907302f8e | ||
|
|
a3e23ab5e7 | ||
|
|
686c6f3900 | ||
|
|
a850586716 | ||
|
|
fdef51ea57 | ||
|
|
806389e04b | ||
|
|
c12b496004 | ||
|
|
447b0107be | ||
|
|
f9a7983d71 | ||
|
|
870746b965 | ||
|
|
f22c6522d5 | ||
|
|
1ef97629b7 | ||
|
|
77a372b3ca | ||
|
|
221b090cc8 | ||
|
|
e4a2ff5bd4 | ||
|
|
c1d334b109 | ||
|
|
c7c9b2d341 | ||
|
|
eddab6020a | ||
|
|
d1181ca91d | ||
|
|
df673718e5 | ||
|
|
bb83765ee2 | ||
|
|
88615a0774 | ||
|
|
05e649fa86 | ||
|
|
08118ec4f5 | ||
|
|
6d496ba302 | ||
|
|
40b79890fe | ||
|
|
58b8d300b8 | ||
|
|
cdcf4eb406 | ||
|
|
a22f79ef44 | ||
|
|
99dd4de4f7 | ||
|
|
f3d6b67043 | ||
|
|
1963af114b | ||
|
|
1da4c40927 | ||
|
|
edc9db5839 | ||
|
|
882d068f1a | ||
|
|
878db1d0a1 | ||
|
|
600acd2f26 | ||
|
|
059c3b4a09 | ||
|
|
895e1d9dd0 | ||
|
|
0b3ffc804f | ||
|
|
c0a03dbb0e | ||
|
|
6e5f263283 | ||
|
|
d4ebbb28d9 | ||
|
|
7dd204e57e | ||
|
|
e1a84973da | ||
|
|
13e68ac0f5 | ||
|
|
3b17c2e5fb | ||
|
|
0be112dc84 | ||
|
|
ce2255623d | ||
|
|
2854d4fdda | ||
|
|
6c51a92acc | ||
|
|
f3910ab528 | ||
|
|
05374c4b4a | ||
|
|
279dc7c6c0 | ||
|
|
f6ddbb48ac | ||
|
|
d3bddf5fda | ||
|
|
6f3a468a7c | ||
|
|
0bfa960153 | ||
|
|
a520ccff51 | ||
|
|
fa7611eb08 | ||
|
|
b2eda2a23b | ||
|
|
74ff1b5cb5 | ||
|
|
a7b4ed65eb | ||
|
|
7dfb32c2d6 | ||
|
|
d081bb0fd2 | ||
|
|
f3fdbec140 | ||
|
|
ac54c5cc75 | ||
|
|
78c11411c3 | ||
|
|
28ce11b216 | ||
|
|
00e034dacf | ||
|
|
8510b9518a | ||
|
|
15ef5df155 | ||
|
|
45500f5bd8 | ||
|
|
a28a853f45 | ||
|
|
82b9a1e502 | ||
|
|
b05abba064 | ||
|
|
75e3463a76 | ||
|
|
3066c0545d | ||
|
|
62a84469c8 | ||
|
|
00339e44b6 | ||
|
|
d1ae620079 | ||
|
|
3db9f0f096 | ||
|
|
732ee2c55b | ||
|
|
e08d658b25 | ||
|
|
2a7ec92a37 | ||
|
|
dc30ce4e69 | ||
|
|
32d45d228b | ||
|
|
939de0c9bd | ||
|
|
48a19b8f97 | ||
|
|
8a2e662d43 | ||
|
|
de2e5f2121 | ||
|
|
42e014bcb1 | ||
|
|
e70e3b23cf | ||
|
|
50b4944c8b | ||
|
|
96bfda6e1b | ||
|
|
cfb58ed80f | ||
|
|
91e9c1fe33 | ||
|
|
dff4e47cf5 | ||
|
|
452cc399c5 | ||
|
|
f4c22501a7 | ||
|
|
9e8874eb4b | ||
|
|
fc6c0384ed | ||
|
|
96bd915c4f | ||
|
|
f61296cafc | ||
|
|
b585d06489 | ||
|
|
cef81ad749 | ||
|
|
7c1a2fabd3 | ||
|
|
c3f72a9b68 | ||
|
|
a0d73834ad | ||
|
|
66ebc5c6ad | ||
|
|
5c06d79b69 | ||
|
|
034c89b399 | ||
|
|
6356171619 | ||
|
|
771001ca2e | ||
|
|
45d734badf | ||
|
|
0d4ff37786 | ||
|
|
9c30d4ef53 | ||
|
|
b2ce8f0aca | ||
|
|
183bba3752 | ||
|
|
92742dfc9d | ||
|
|
f30bf4791a | ||
|
|
ca6de3adf6 | ||
|
|
5e2d25f7c4 | ||
|
|
d64262099b | ||
|
|
6ad589d4bd | ||
|
|
5496aa38f8 | ||
|
|
b7c0b4720c | ||
|
|
bd25fe4866 | ||
|
|
c3da933e62 | ||
|
|
1d8a72828c | ||
|
|
20af679569 | ||
|
|
48dc98d08b | ||
|
|
835a7e3c35 | ||
|
|
a3cac9e82d | ||
|
|
a90965109d | ||
|
|
6682c9e048 | ||
|
|
5a9476422c | ||
|
|
bf27beadae | ||
|
|
3b67f46b4c | ||
|
|
dd00d34d43 | ||
|
|
94ca97d3f0 | ||
|
|
3d4354cd67 | ||
|
|
cb625d4e1a | ||
|
|
ee0dfb29d6 | ||
|
|
78ef2a0ebe | ||
|
|
977dae3eae | ||
|
|
210ac987a0 | ||
|
|
ad362a11ce | ||
|
|
c268e28b3d | ||
|
|
9aa4613dd7 | ||
|
|
4d177801c5 | ||
|
|
937a4e612f | ||
|
|
7e461670dd | ||
|
|
87341b2cf3 | ||
|
|
dc45655441 | ||
|
|
25df0f8837 | ||
|
|
0acc4a3439 | ||
|
|
dbc0f07caa | ||
|
|
aeaa699638 | ||
|
|
40dc5485a9 | ||
|
|
eb91ae6a48 | ||
|
|
82f5f56438 | ||
|
|
e8e2ccd1c2 | ||
|
|
6711001019 | ||
|
|
acb0c88ce1 | ||
|
|
444786c971 | ||
|
|
1783ceb26a | ||
|
|
4feb258814 | ||
|
|
75b8bef3c4 | ||
|
|
17549ca457 | ||
|
|
d72872eb90 | ||
|
|
86ec56b610 | ||
|
|
7110f5afcc | ||
|
|
92cf447add | ||
|
|
e060de7efc | ||
|
|
f818bb5895 | ||
|
|
44a4f795d0 | ||
|
|
e505e7e07f | ||
|
|
f3782cfa2b | ||
|
|
9592097487 | ||
|
|
03a57798b6 | ||
|
|
22e9234d23 | ||
|
|
ac89271d5b | ||
|
|
261442d903 | ||
|
|
d63c4b2433 | ||
|
|
4dadc8047e | ||
|
|
34ec0dfa27 | ||
|
|
7a6600431c | ||
|
|
341717b75d | ||
|
|
1061111f9b | ||
|
|
d28a40e035 | ||
|
|
3f06231c22 | ||
|
|
67d31f9658 | ||
|
|
1b931d066b | ||
|
|
f605b56a5e | ||
|
|
58f01d9673 | ||
|
|
8878ab5bd1 | ||
|
|
80f5341da0 | ||
|
|
a4ca584e90 | ||
|
|
4d81dee7b4 | ||
|
|
140217da6e | ||
|
|
a9a0a2a999 | ||
|
|
d7f3a70d48 | ||
|
|
1074fcba21 | ||
|
|
0ae76be885 | ||
|
|
59cdcbd173 | ||
|
|
7cf224cf23 | ||
|
|
d0d65ebbca | ||
|
|
ca10381be8 | ||
|
|
44b19dfe60 | ||
|
|
c082baa340 | ||
|
|
15ee1b2f59 | ||
|
|
b080dd11ab | ||
|
|
568e6b41ac | ||
|
|
0dee23aeba | ||
|
|
c7d1e13d0d | ||
|
|
e7fae291ee | ||
|
|
bdfe0ce20a | ||
|
|
32eafedf04 | ||
|
|
ba78791ab1 | ||
|
|
946d169665 | ||
|
|
cd51a6784f | ||
|
|
c01942b1a8 | ||
|
|
e11b29deab | ||
|
|
28be3e4e6a | ||
|
|
5c7985a15c | ||
|
|
9b6c34a860 | ||
|
|
f735f8a34d | ||
|
|
74665bb2e8 | ||
|
|
d1deeeac31 | ||
|
|
e96c3d72eb | ||
|
|
a545c8dbb6 | ||
|
|
07824a0570 | ||
|
|
12bd157ad4 | ||
|
|
53f6ab5d0f | ||
|
|
cc88dd994b | ||
|
|
b99659dcc9 | ||
|
|
581bfe78d8 | ||
|
|
9a174c257d | ||
|
|
941c610c96 | ||
|
|
34a4c573b1 | ||
|
|
f64d190ac3 | ||
|
|
c633660e73 | ||
|
|
0dfe8df8e4 | ||
|
|
0e4a562263 | ||
|
|
253a5ebebe | ||
|
|
73c622956f | ||
|
|
38db0da20a | ||
|
|
361f5d3aae | ||
|
|
499d363daf | ||
|
|
035a3dfd1e | ||
|
|
83fec9264f | ||
|
|
9762b5392b | ||
|
|
fc4ea217e0 | ||
|
|
1812c7f5af | ||
|
|
92a4b0d6ac | ||
|
|
33f67279fb | ||
|
|
66c845f3cf | ||
|
|
8a9c75790a | ||
|
|
0de8425cfa | ||
|
|
f8563c1667 | ||
|
|
60cda426a9 | ||
|
|
fe7f2c00c5 | ||
|
|
76b113ed28 | ||
|
|
5140094633 | ||
|
|
e220da006f | ||
|
|
c5ffe375a5 | ||
|
|
dd8487bf0f | ||
|
|
a62d1e01f4 | ||
|
|
e397f3908e | ||
|
|
7b51c993ec | ||
|
|
f480332d3a | ||
|
|
2f875867c5 | ||
|
|
e9049570ee | ||
|
|
52eff801b6 | ||
|
|
d84ef2e8c5 | ||
|
|
9298378e62 | ||
|
|
a7f5e10be4 | ||
|
|
ea5f679a59 | ||
|
|
d63706f764 | ||
|
|
d9b8da5799 | ||
|
|
4896075c7d | ||
|
|
78b0e416fa | ||
|
|
beb0a27ad6 | ||
|
|
5b620a6c5f | ||
|
|
8c1089e138 | ||
|
|
765be077cd | ||
|
|
4f6dc99319 | ||
|
|
59b0a5ac10 | ||
|
|
2d755be1d7 | ||
|
|
61768a34e9 | ||
|
|
140f2d54ee | ||
|
|
e4d4bcd7ca | ||
|
|
e193df7def | ||
|
|
cadbd840d9 | ||
|
|
3052d7c905 | ||
|
|
f59f2ad8ec | ||
|
|
fa22c63176 | ||
|
|
4437afb7d5 | ||
|
|
b762af222d | ||
|
|
f258bf6fdb | ||
|
|
43c60dcb30 | ||
|
|
f4f99647d2 | ||
|
|
a75e14dc8d | ||
|
|
dbd600bcd9 | ||
|
|
4b442bd11b | ||
|
|
d2978475b8 | ||
|
|
c57d2a0564 | ||
|
|
7e0c438ae8 | ||
|
|
7d7a42ba8e | ||
|
|
a21ec776c1 | ||
|
|
62d0af15ac | ||
|
|
24c4dd0225 | ||
|
|
16c2833252 | ||
|
|
f9552e7271 | ||
|
|
19ad0eff78 | ||
|
|
9f28bc6703 | ||
|
|
11ae6e1297 | ||
|
|
b2bf902a78 | ||
|
|
790c55e607 | ||
|
|
694a0d4d29 | ||
|
|
c2ed859534 | ||
|
|
a4765c6cb2 | ||
|
|
9cb99db2b3 | ||
|
|
8b0e59b22f | ||
|
|
dccfead879 | ||
|
|
9cae5e00b6 | ||
|
|
620b459415 | ||
|
|
2062a1f307 | ||
|
|
79172fcc45 | ||
|
|
d937d954ab | ||
|
|
3bb11966dd | ||
|
|
0bd3b0412c | ||
|
|
5a72d2b1b9 | ||
|
|
682f85b2d7 | ||
|
|
087e4d6333 | ||
|
|
d5bf1f1a24 | ||
|
|
317d4fdd42 | ||
|
|
9657f1bcfd | ||
|
|
dc95c30f60 | ||
|
|
2fb715905a | ||
|
|
60a5fa7a33 | ||
|
|
06e0617026 | ||
|
|
fa3e483026 | ||
|
|
1957018a14 | ||
|
|
cfebb6c99c | ||
|
|
cd745c74a9 | ||
|
|
e1f9f2ea92 | ||
|
|
ce08af35bf | ||
|
|
475993422e | ||
|
|
ce4fac8a10 | ||
|
|
a848181bee | ||
|
|
13b9109fc0 | ||
|
|
ec0e3c1868 | ||
|
|
b42474a3c2 | ||
|
|
e5323fb968 | ||
|
|
d806fa48f4 | ||
|
|
c38d533557 | ||
|
|
4c145c12af | ||
|
|
0a2f129ed8 | ||
|
|
4d75ef9fb5 | ||
|
|
bebc328a7b | ||
|
|
08fde42217 | ||
|
|
a3f4f94109 | ||
|
|
4e1b285204 | ||
|
|
71e30f2872 | ||
|
|
8e4798dbfc | ||
|
|
0ffa8b19ea | ||
|
|
0422c16c97 | ||
|
|
67f0690659 | ||
|
|
2e2aff229e | ||
|
|
8aa2f60763 | ||
|
|
55b9b1a619 | ||
|
|
7165d113b6 | ||
|
|
ea471c2e01 | ||
|
|
7997f267b7 | ||
|
|
8dc9fdcfa0 | ||
|
|
3bd50e49eb | ||
|
|
4733b6b903 | ||
|
|
c0ca9eeab0 | ||
|
|
8e29f5a396 | ||
|
|
29c41d9dea | ||
|
|
953ca6d01e | ||
|
|
e57122de31 | ||
|
|
82bc47905b | ||
|
|
730a3e99bf | ||
|
|
e5072cbb63 | ||
|
|
5378ad8ee6 | ||
|
|
66174e1cb0 | ||
|
|
2db41cfd6f | ||
|
|
5d440b3c61 | ||
|
|
41882b3529 | ||
|
|
eab4cdf17f | ||
|
|
120a1b8c16 | ||
|
|
ba19c3c76f | ||
|
|
3e26d60503 | ||
|
|
92ef5170e0 | ||
|
|
8eb0f8b6a2 | ||
|
|
b29c938044 | ||
|
|
7f0ff6e36e | ||
|
|
119bb936fa | ||
|
|
31c67cb923 | ||
|
|
e7638c239f | ||
|
|
528438586c | ||
|
|
f07d416034 | ||
|
|
905437e026 | ||
|
|
9f1cf7af1e | ||
|
|
1a193dcbec | ||
|
|
92a175ea97 | ||
|
|
80843719a6 | ||
|
|
ee3b872e66 | ||
|
|
c199853d4e | ||
|
|
1491cbd2d0 | ||
|
|
f8c1ba6c28 | ||
|
|
51b49249f0 | ||
|
|
66532aec75 | ||
|
|
813c123517 | ||
|
|
90271a7ffe | ||
|
|
5ad4c6fb4a | ||
|
|
12d9393279 | ||
|
|
30e62353e6 | ||
|
|
1070c68c55 | ||
|
|
49e9cd0d06 | ||
|
|
441df56422 | ||
|
|
94959f459a | ||
|
|
ec40108896 | ||
|
|
f651126f25 | ||
|
|
edf701d79c | ||
|
|
b31082377d | ||
|
|
6e0907dabe | ||
|
|
ab7c61b796 | ||
|
|
400a633753 | ||
|
|
2a97ffb6d9 | ||
|
|
c5548caee4 | ||
|
|
f880c02038 | ||
|
|
af4c5a20cc | ||
|
|
d722727918 | ||
|
|
51eb9c4a58 | ||
|
|
fbb05fe4c6 | ||
|
|
0767469cd6 | ||
|
|
924f332702 | ||
|
|
02c0fbdf4e | ||
|
|
6100e65a8a | ||
|
|
0dd436a2c8 | ||
|
|
faabfe2659 | ||
|
|
76538eecd5 | ||
|
|
9a48f7d3b8 | ||
|
|
1e5024d02e | ||
|
|
ae632f3cf9 | ||
|
|
55929f4b26 | ||
|
|
fbbd1beb08 | ||
|
|
400a084d9b | ||
|
|
532e2637dc | ||
|
|
dd8bae81be | ||
|
|
30d92b40f2 | ||
|
|
fcf5081531 | ||
|
|
6f75c06889 | ||
|
|
ec9b7ee02d | ||
|
|
d9df99789d | ||
|
|
5fd36697c4 | ||
|
|
224fb7c189 | ||
|
|
2e601e75fd | ||
|
|
19f7f8c74a | ||
|
|
5955d15934 | ||
|
|
5ca272565e | ||
|
|
6f702d8b70 | ||
|
|
4b0d3f9796 | ||
|
|
d30c0f9b37 | ||
|
|
fe727a92bc | ||
|
|
034f01287b | ||
|
|
54bd62d2d9 | ||
|
|
0ca880add4 | ||
|
|
618ced700a | ||
|
|
7b6fae6247 | ||
|
|
760ba7877e | ||
|
|
17d8964db8 | ||
|
|
2107b52fe6 | ||
|
|
ecf4634601 | ||
|
|
e0f627c48b | ||
|
|
d850162da8 | ||
|
|
bda4fccb32 | ||
|
|
29741ebd68 | ||
|
|
6eeaffa8c4 | ||
|
|
7fd2d26336 | ||
|
|
fe21c5f8af | ||
|
|
f3172cd715 | ||
|
|
07d2f238d1 | ||
|
|
90f439e045 | ||
|
|
0a8e3c4452 | ||
|
|
91d4a8c767 | ||
|
|
67bbee61a0 | ||
|
|
1748663a42 | ||
|
|
ba821dbd06 | ||
|
|
a5bd385e45 | ||
|
|
b6accd6edd | ||
|
|
b0be02ea48 | ||
|
|
274bca281a | ||
|
|
9aa723bf06 | ||
|
|
dc90787030 | ||
|
|
a138418518 | ||
|
|
354c8d7b34 | ||
|
|
c831a25c92 | ||
|
|
68f4c183e2 | ||
|
|
414b939623 | ||
|
|
1c523cfdcb | ||
|
|
da93011a07 | ||
|
|
4cb0c3e77c | ||
|
|
b656c9b930 | ||
|
|
37252b1e6a | ||
|
|
6d62bcce06 | ||
|
|
990855baaa | ||
|
|
e0df8d1763 | ||
|
|
e3ed65d296 | ||
|
|
eaa64ce5f2 | ||
|
|
c64f09f830 | ||
|
|
54c762ebaf | ||
|
|
b7b42f12fe | ||
|
|
83acc2822d | ||
|
|
fdce87925b | ||
|
|
0d54c5c91f | ||
|
|
4d892552b0 | ||
|
|
36716f063f | ||
|
|
2eda6328c9 | ||
|
|
582b1c4275 | ||
|
|
27e876e0c8 | ||
|
|
4c12fd0b29 | ||
|
|
91320397e3 | ||
|
|
7cb3b37766 | ||
|
|
21fce89b15 | ||
|
|
6b01a881b0 | ||
|
|
64b340e585 | ||
|
|
a7bcc3eaf5 | ||
|
|
ef5779cedb | ||
|
|
74c399009a | ||
|
|
8c19bd1b25 | ||
|
|
e786204d06 | ||
|
|
0e60089010 | ||
|
|
f69c634c71 | ||
|
|
17948ce2ef | ||
|
|
b90bda2aab | ||
|
|
e98249f016 | ||
|
|
29d84c5e2b | ||
|
|
af4a7798b2 | ||
|
|
4f7abe3354 | ||
|
|
5707feeb42 | ||
|
|
a3475adc83 | ||
|
|
3bc744f143 | ||
|
|
f1ad1dd547 | ||
|
|
7f239bdc87 | ||
|
|
53da0d37a2 | ||
|
|
da85c222e9 | ||
|
|
53a1f50f10 | ||
|
|
d7085dad70 | ||
|
|
8b361d54e1 | ||
|
|
0bf83bab19 | ||
|
|
7d51c25430 | ||
|
|
786f005b65 | ||
|
|
458bb3f5a3 | ||
|
|
5f6a0a1bdf | ||
|
|
324580ec79 | ||
|
|
21ab3fb466 | ||
|
|
9b4566a9ec | ||
|
|
f585405498 | ||
|
|
ca34cd2f09 | ||
|
|
17ba157e67 | ||
|
|
7bb0a8649f | ||
|
|
402b503a4e | ||
|
|
dde9b5b767 | ||
|
|
41c31f9207 | ||
|
|
23c9b085e6 | ||
|
|
631ea737b0 | ||
|
|
ceb8adafc3 | ||
|
|
fa68b2b22a | ||
|
|
b098150580 | ||
|
|
d699052b6a | ||
|
|
ccd7df2f3b | ||
|
|
7a3f9f8a3b | ||
|
|
20c43fbb49 | ||
|
|
c1d3ccc2cb | ||
|
|
db75a2529f | ||
|
|
9035ebc5a3 | ||
|
|
b6fb8bb2e4 | ||
|
|
a34d47a13b | ||
|
|
72b1333bb2 | ||
|
|
5e28829325 | ||
|
|
d20c3bebed | ||
|
|
6bcd620f0e | ||
|
|
02e5a23fec | ||
|
|
d0c50c7319 | ||
|
|
d34adc04ae | ||
|
|
d48af14e10 | ||
|
|
91dad14704 | ||
|
|
3d56951504 | ||
|
|
bfaf7658df | ||
|
|
da36d22946 | ||
|
|
5415322302 | ||
|
|
fa30eefc4e | ||
|
|
6ec6b8ae38 | ||
|
|
288749e585 | ||
|
|
929021b0c0 | ||
|
|
2a3d944078 | ||
|
|
71aa26efcf | ||
|
|
025ed0860e | ||
|
|
56a01d3056 | ||
|
|
92f68df6c9 | ||
|
|
c15be9ebb9 | ||
|
|
1c2865f34c | ||
|
|
c5a0aa82ad | ||
|
|
97ddaeedd8 | ||
|
|
79826ab525 | ||
|
|
e4fb2c8363 | ||
|
|
1dbc339176 | ||
|
|
e4dae53dba | ||
|
|
ae17f5752e | ||
|
|
3cdc1c1dd4 | ||
|
|
c2fe917ad0 | ||
|
|
ac84bf6468 | ||
|
|
fdde407c9d | ||
|
|
72e355e17c | ||
|
|
1e4d119076 | ||
|
|
d71b1fe7b8 | ||
|
|
8abc01fac6 | ||
|
|
c54da74e1f | ||
|
|
54db503a65 | ||
|
|
bb7ecae874 | ||
|
|
241041f863 | ||
|
|
21b6b7c694 | ||
|
|
dfc3457358 | ||
|
|
e3c0050755 | ||
|
|
00160a48d6 | ||
|
|
5e854b1b1f | ||
|
|
6dab81a65b | ||
|
|
155b5c205c | ||
|
|
21a32bf6c6 | ||
|
|
b9e0e55764 | ||
|
|
783a979232 | ||
|
|
74cad7f48e | ||
|
|
9fe71ae92e | ||
|
|
981f2ad858 | ||
|
|
94f2858c68 | ||
|
|
7a1528d93d | ||
|
|
2df224cb0a | ||
|
|
bf6123e10f | ||
|
|
b0086cf8e0 | ||
|
|
f50a10c637 | ||
|
|
79a093e250 | ||
|
|
3cc1104b27 | ||
|
|
b1bb108585 | ||
|
|
7c7ea430cb | ||
|
|
e79dd8323e | ||
|
|
3337b344ce | ||
|
|
4ad2ede42b | ||
|
|
686dca00d8 | ||
|
|
c9cd2f2726 | ||
|
|
e2b86ff11c | ||
|
|
d3c5d59bf0 | ||
|
|
8a34472576 | ||
|
|
f2f3a11e1e | ||
|
|
aa7ce9cd59 | ||
|
|
4c678fd3a6 | ||
|
|
2ee7de451d | ||
|
|
d59c38e42f | ||
|
|
4611a8b215 | ||
|
|
cd0c760086 | ||
|
|
ae9a73488e | ||
|
|
fc29b2b480 | ||
|
|
41bfd4fc6c | ||
|
|
8b8dc00512 | ||
|
|
a2690bb146 | ||
|
|
5919d9b3c3 | ||
|
|
2c53f60000 | ||
|
|
8598673530 | ||
|
|
1bd86ce02a | ||
|
|
8cc2fe66f4 | ||
|
|
4be79484b0 | ||
|
|
ac90fe57ae | ||
|
|
e1c35e0455 | ||
|
|
0869d2d1d9 | ||
|
|
929cce16bf | ||
|
|
d7ddbf7cd7 | ||
|
|
333afdff00 | ||
|
|
405c8508e9 | ||
|
|
0119e40a76 | ||
|
|
7ef94252a7 | ||
|
|
d85a0cfc10 | ||
|
|
683e698db7 | ||
|
|
0ea0110fea | ||
|
|
11d113449a | ||
|
|
b78e1f50dc | ||
|
|
04b91380a4 | ||
|
|
851193eb5a | ||
|
|
da7c38701c | ||
|
|
7532676cf9 | ||
|
|
e34323ec99 | ||
|
|
7d51bdbcd3 | ||
|
|
6b16063692 | ||
|
|
78915ccf95 | ||
|
|
dc287c243b | ||
|
|
bd9979a87d | ||
|
|
5e907bf979 | ||
|
|
9bbb908761 | ||
|
|
3479535356 | ||
|
|
f91738176a | ||
|
|
d0b02c6ae2 | ||
|
|
c1d1260542 | ||
|
|
b50c167b40 | ||
|
|
b5d7f5e5f7 | ||
|
|
d1813a0f42 | ||
|
|
2db13433c3 | ||
|
|
f62f7121db | ||
|
|
b8d98a80ad | ||
|
|
187a531fce | ||
|
|
58b83c2844 | ||
|
|
0bd84171e2 | ||
|
|
88fd24faa9 | ||
|
|
f36904552d | ||
|
|
19d2dba6cb | ||
|
|
54059a3918 | ||
|
|
250b749b23 | ||
|
|
6d887f79cf | ||
|
|
3bde97db3f | ||
|
|
d0204a6a30 | ||
|
|
b559f2258e | ||
|
|
7206f30c57 | ||
|
|
b1f978408e | ||
|
|
3401f972ad | ||
|
|
aeb987eca7 | ||
|
|
c74f82d232 | ||
|
|
8bf7cf0218 | ||
|
|
cb2dc352af | ||
|
|
5416fc1219 | ||
|
|
9a42d93013 | ||
|
|
43a1f7e027 | ||
|
|
70f393822d | ||
|
|
121261630d | ||
|
|
a5420e85c4 | ||
|
|
8d3097de2a | ||
|
|
0c6e8ac3d8 | ||
|
|
fa5c5fc511 | ||
|
|
f8ae3c9bf0 | ||
|
|
c3919e438a | ||
|
|
1607dd6597 | ||
|
|
fe06c37cd5 | ||
|
|
79d8f6edc5 |
56
.gitignore
vendored
Normal file
56
.gitignore
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
env/
|
||||
bin/
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.coverage
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
|
||||
# Pycharm
|
||||
.idea
|
||||
|
||||
# Mr Developer
|
||||
.mr.developer.cfg
|
||||
.project
|
||||
.pydevproject
|
||||
|
||||
# Rope
|
||||
.ropeproject
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# Backup files
|
||||
*~
|
||||
*.swp
|
||||
1
account_invoice_margin/__init__.py
Normal file
1
account_invoice_margin/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import models
|
||||
26
account_invoice_margin/__manifest__.py
Normal file
26
account_invoice_margin/__manifest__.py
Normal file
@@ -0,0 +1,26 @@
|
||||
# Copyright 2015-2025 Akretion France (https://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
{
|
||||
'name': 'Account Invoice Margin',
|
||||
'version': '16.0.1.0.0',
|
||||
'category': 'Invoicing Management',
|
||||
'license': 'AGPL-3',
|
||||
'summary': 'Copy standard price on invoice line and compute margins',
|
||||
'description': """
|
||||
This module copies the field *standard_price* of the product on the invoice line when the invoice line is created. The allows the computation of the margin of the invoice.
|
||||
|
||||
A new measure *Margin* is available in the Invoice Analysis.
|
||||
|
||||
This module has been written by Alexis de Lattre from Akretion
|
||||
<alexis.delattre@akretion.com>.
|
||||
""",
|
||||
'author': 'Akretion',
|
||||
'website': 'https://github.com/akretion/odoo-usability',
|
||||
'depends': ['account'],
|
||||
'data': [
|
||||
'views/account_move.xml',
|
||||
],
|
||||
'installable': True,
|
||||
}
|
||||
98
account_invoice_margin/i18n/fr.po
Normal file
98
account_invoice_margin/i18n/fr.po
Normal file
@@ -0,0 +1,98 @@
|
||||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_invoice_margin
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-01-16 16:24+0000\n"
|
||||
"PO-Revision-Date: 2025-01-16 16:24+0000\n"
|
||||
"Last-Translator: Alexis de Lattre <alexis.delattre@akretion.com>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: account_invoice_margin
|
||||
#: model:ir.model,name:account_invoice_margin.model_account_invoice_report
|
||||
msgid "Invoices Statistics"
|
||||
msgstr "Statistiques des factures"
|
||||
|
||||
#. module: account_invoice_margin
|
||||
#: model:ir.model,name:account_invoice_margin.model_account_move
|
||||
msgid "Journal Entry"
|
||||
msgstr "Pièce comptable"
|
||||
|
||||
#. module: account_invoice_margin
|
||||
#: model:ir.model,name:account_invoice_margin.model_account_move_line
|
||||
msgid "Journal Item"
|
||||
msgstr "Écriture comptable"
|
||||
|
||||
#. module: account_invoice_margin
|
||||
#: model:ir.model.fields,field_description:account_invoice_margin.field_account_invoice_report__margin
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_margin.view_invoice_tree
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_margin.view_move_form
|
||||
msgid "Margin"
|
||||
msgstr "Marge"
|
||||
|
||||
#. module: account_invoice_margin
|
||||
#: model_terms:ir.ui.view,arch_db:account_invoice_margin.view_move_form
|
||||
msgid "Margin %"
|
||||
msgstr "Marge %"
|
||||
|
||||
#. module: account_invoice_margin
|
||||
#: model:ir.model.fields,field_description:account_invoice_margin.field_account_move_line__margin_rate
|
||||
msgid "Margin Rate"
|
||||
msgstr "Taux de marge"
|
||||
|
||||
#. module: account_invoice_margin
|
||||
#: model:ir.model.fields,field_description:account_invoice_margin.field_account_bank_statement_line__margin_company_currency
|
||||
#: model:ir.model.fields,field_description:account_invoice_margin.field_account_move__margin_company_currency
|
||||
#: model:ir.model.fields,field_description:account_invoice_margin.field_account_move_line__margin_company_currency
|
||||
#: model:ir.model.fields,field_description:account_invoice_margin.field_account_payment__margin_company_currency
|
||||
msgid "Margin in Company Currency"
|
||||
msgstr "Marge dans la devise de la société"
|
||||
|
||||
#. module: account_invoice_margin
|
||||
#: model:ir.model.fields,field_description:account_invoice_margin.field_account_bank_statement_line__margin_invoice_currency
|
||||
#: model:ir.model.fields,field_description:account_invoice_margin.field_account_move__margin_invoice_currency
|
||||
#: model:ir.model.fields,field_description:account_invoice_margin.field_account_move_line__margin_invoice_currency
|
||||
#: model:ir.model.fields,field_description:account_invoice_margin.field_account_payment__margin_invoice_currency
|
||||
msgid "Margin in Invoice Currency"
|
||||
msgstr "Marge dans la devise de la facture"
|
||||
|
||||
#. module: account_invoice_margin
|
||||
#: model:ir.model.fields,help:account_invoice_margin.field_account_move_line__margin_rate
|
||||
msgid "Margin rate in percentage of the sale price"
|
||||
msgstr "Taux de marge en pourcentage du prix de vente"
|
||||
|
||||
#. module: account_invoice_margin
|
||||
#: model:ir.model.fields,field_description:account_invoice_margin.field_account_move_line__standard_price_company_currency
|
||||
msgid "Unit Cost in Company Currency"
|
||||
msgstr "Coût unitaire dans la devise de la société"
|
||||
|
||||
#. module: account_invoice_margin
|
||||
#: model:ir.model.fields,field_description:account_invoice_margin.field_account_move_line__standard_price_invoice_currency
|
||||
msgid "Unit Cost in Invoice Currency"
|
||||
msgstr "Coût unitaire dans la devise de la facture"
|
||||
|
||||
#. module: account_invoice_margin
|
||||
#: model:ir.model.fields,help:account_invoice_margin.field_account_move_line__standard_price_company_currency
|
||||
msgid ""
|
||||
"Unit Cost in company currency in the unit of measure of the invoice line "
|
||||
"(which may be different from the unit of measure of the product)."
|
||||
msgstr ""
|
||||
"Coût unitaire dans la devise de la société dans l'unité de mesure de la "
|
||||
"ligne de facture (qui peut être différente de l'unité de mesure du produit)."
|
||||
|
||||
#. module: account_invoice_margin
|
||||
#: model:ir.model.fields,help:account_invoice_margin.field_account_move_line__standard_price_invoice_currency
|
||||
msgid ""
|
||||
"Unit Cost in invoice currency in the unit of measure of the invoice line "
|
||||
"(which may be different from the unit of measure of the product)."
|
||||
msgstr ""
|
||||
"Coût unitaire dans la devise de la facture dans l'unité de mesure "
|
||||
"de la ligne de la facture (qui peut être différente de l'unité de mesure du produit)."
|
||||
2
account_invoice_margin/models/__init__.py
Normal file
2
account_invoice_margin/models/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from . import account_move
|
||||
from . import account_invoice_report
|
||||
17
account_invoice_margin/models/account_invoice_report.py
Normal file
17
account_invoice_margin/models/account_invoice_report.py
Normal file
@@ -0,0 +1,17 @@
|
||||
# Copyright 2018-2025 Akretion France (https://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class AccountInvoiceReport(models.Model):
|
||||
_inherit = 'account.invoice.report'
|
||||
|
||||
margin = fields.Float(string='Margin', readonly=True)
|
||||
|
||||
@api.model
|
||||
def _select(self):
|
||||
select_str = super()._select()
|
||||
select_str += ", line.margin_company_currency * currency_table.rate AS margin"
|
||||
return select_str
|
||||
109
account_invoice_margin/models/account_move.py
Normal file
109
account_invoice_margin/models/account_move.py
Normal file
@@ -0,0 +1,109 @@
|
||||
# Copyright 2015-2025 Akretion France (https://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class AccountMoveLine(models.Model):
|
||||
_inherit = 'account.move.line'
|
||||
|
||||
standard_price_company_currency = fields.Float(
|
||||
compute='_compute_margin', store=True, digits='Product Price',
|
||||
string='Unit Cost in Company Currency',
|
||||
help="Unit Cost in company currency in the unit of measure "
|
||||
"of the invoice line (which may be different from the unit "
|
||||
"of measure of the product).")
|
||||
standard_price_invoice_currency = fields.Float(
|
||||
compute='_compute_margin', store=True, digits='Product Price',
|
||||
string='Unit Cost in Invoice Currency',
|
||||
help="Unit Cost in invoice currency in the unit of measure "
|
||||
"of the invoice line (which may be different from the unit "
|
||||
"of measure of the product).")
|
||||
margin_invoice_currency = fields.Monetary(
|
||||
compute='_compute_margin', store=True,
|
||||
string='Margin in Invoice Currency', currency_field='currency_id')
|
||||
margin_company_currency = fields.Monetary(
|
||||
compute='_compute_margin', store=True,
|
||||
string='Margin in Company Currency',
|
||||
currency_field='company_currency_id')
|
||||
margin_rate = fields.Float(
|
||||
string="Margin Rate", readonly=True, store=True,
|
||||
compute='_compute_margin',
|
||||
digits=(16, 2), help="Margin rate in percentage of the sale price")
|
||||
|
||||
@api.depends(
|
||||
'product_id', 'product_uom_id', 'display_type', 'quantity', 'price_subtotal',
|
||||
'move_id.currency_id', 'move_id.move_type', 'move_id.company_id', 'move_id.date')
|
||||
def _compute_margin(self):
|
||||
for ml in self:
|
||||
standard_price_comp_cur = 0.0
|
||||
standard_price_inv_cur = 0.0
|
||||
margin_inv_cur = 0.0
|
||||
margin_comp_cur = 0.0
|
||||
margin_rate = 0.0
|
||||
if (
|
||||
ml.display_type == 'product' and
|
||||
ml.product_id and
|
||||
ml.move_type in ('out_invoice', 'out_refund')):
|
||||
move = ml.move_id
|
||||
date = move.date
|
||||
company = move.company_id
|
||||
company_currency = company.currency_id
|
||||
move_currency = move.currency_id
|
||||
standard_price_comp_cur = ml.product_id.with_company(company.id).standard_price
|
||||
if ml.product_uom_id and ml.product_uom_id != ml.product_id.uom_id:
|
||||
standard_price_comp_cur = ml.product_id.uom_id._compute_price(
|
||||
standard_price_comp_cur, ml.product_uom_id)
|
||||
standard_price_inv_cur = company_currency._convert(
|
||||
standard_price_comp_cur, move_currency, company, date)
|
||||
margin_inv_cur =\
|
||||
ml.price_subtotal - (ml.quantity * standard_price_inv_cur)
|
||||
margin_comp_cur = move_currency._convert(
|
||||
margin_inv_cur, company_currency, company, date)
|
||||
if ml.price_subtotal:
|
||||
margin_rate = 100 * margin_inv_cur / ml.price_subtotal
|
||||
# for a refund, margin should be negative
|
||||
# but margin rate should stay positive
|
||||
if ml.move_type == 'out_refund':
|
||||
margin_inv_cur *= -1
|
||||
margin_comp_cur *= -1
|
||||
ml.standard_price_company_currency = standard_price_comp_cur
|
||||
ml.standard_price_invoice_currency = standard_price_inv_cur
|
||||
ml.margin_invoice_currency = margin_inv_cur
|
||||
ml.margin_company_currency = margin_comp_cur
|
||||
ml.margin_rate = margin_rate
|
||||
|
||||
|
||||
class AccountMove(models.Model):
|
||||
_inherit = 'account.move'
|
||||
|
||||
margin_invoice_currency = fields.Monetary(
|
||||
string='Margin in Invoice Currency',
|
||||
compute='_compute_margin', store=True,
|
||||
currency_field='currency_id')
|
||||
margin_company_currency = fields.Monetary(
|
||||
string='Margin in Company Currency',
|
||||
compute='_compute_margin', store=True,
|
||||
currency_field='company_currency_id')
|
||||
|
||||
@api.depends(
|
||||
'move_type',
|
||||
'invoice_line_ids.margin_invoice_currency',
|
||||
'invoice_line_ids.margin_company_currency')
|
||||
def _compute_margin(self):
|
||||
rg_res = self.env['account.move.line'].read_group(
|
||||
[
|
||||
('move_id', 'in', self.ids),
|
||||
('display_type', '=', 'product'),
|
||||
('move_id.move_type', 'in', ('out_invoice', 'out_refund')),
|
||||
],
|
||||
['move_id', 'margin_invoice_currency:sum', 'margin_company_currency:sum'],
|
||||
['move_id'])
|
||||
mapped_data = dict([(x['move_id'][0], {
|
||||
'margin_invoice_currency': x['margin_invoice_currency'],
|
||||
'margin_company_currency': x['margin_company_currency'],
|
||||
}) for x in rg_res])
|
||||
for move in self:
|
||||
move.margin_invoice_currency = mapped_data.get(move.id, {}).get('margin_invoice_currency')
|
||||
move.margin_company_currency = mapped_data.get(move.id, {}).get('margin_company_currency')
|
||||
55
account_invoice_margin/views/account_move.xml
Normal file
55
account_invoice_margin/views/account_move.xml
Normal file
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2015-2025 Akretion (https://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="view_move_form" model="ir.ui.view">
|
||||
<field name="name">margin.account.move.form</field>
|
||||
<field name="model">account.move</field>
|
||||
<field name="inherit_id" ref="account.view_move_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<group name="sale_info_group" position="inside">
|
||||
<field name="margin_invoice_currency"
|
||||
groups="base.group_no_one"
|
||||
attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
|
||||
<field name="margin_company_currency"
|
||||
groups="base.group_no_one"
|
||||
attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
|
||||
</group>
|
||||
<xpath expr="//field[@name='invoice_line_ids']/tree/field[@name='price_total']" position="after">
|
||||
<field name="standard_price_invoice_currency" optional="hide" attrs="{'column_invisible': [('parent.move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
|
||||
<field name="margin_invoice_currency" optional="hide" attrs="{'column_invisible': [('parent.move_type', 'not in', ('out_invoice', 'out_refund'))]}" string="Margin"/>
|
||||
<field name="margin_rate" optional="hide" string="Margin %" attrs="{'column_invisible': [('parent.move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='invoice_line_ids']/form//field[@name='price_total']/.." position="inside">
|
||||
<field name="standard_price_company_currency"
|
||||
groups="base.group_no_one" attrs="{'invisible': [('parent.move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
|
||||
<field name="standard_price_invoice_currency"
|
||||
groups="base.group_no_one" attrs="{'invisible': [('parent.move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
|
||||
<field name="margin_invoice_currency"
|
||||
groups="base.group_no_one" attrs="{'invisible': [('parent.move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
|
||||
<field name="margin_company_currency"
|
||||
groups="base.group_no_one" attrs="{'invisible': [('parent.move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
|
||||
<label for="margin_rate" groups="base.group_no_one" attrs="{'invisible': [('parent.move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
|
||||
<div name="margin_rate" groups="base.group_no_one" attrs="{'invisible': [('parent.move_type', 'not in', ('out_invoice', 'out_refund'))]}">
|
||||
<field name="margin_rate" class="oe_inline"/> %
|
||||
</div>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_invoice_tree" model="ir.ui.view">
|
||||
<field name="model">account.move</field>
|
||||
<field name="inherit_id" ref="account.view_invoice_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="amount_residual_signed" position="after">
|
||||
<field name="margin_company_currency" optional="hide" sum="1" invisible="context.get('default_move_type') not in ('out_invoice', 'out_refund')" string="Margin"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
@@ -1,23 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Account Invoice Partner Bank Usability module for OpenERP
|
||||
# Copyright (C) 2013 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from . import account_invoice
|
||||
@@ -1,45 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Account Invoice Partner Bank Usability module for OpenERP
|
||||
# Copyright (C) 2013 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
|
||||
{
|
||||
'name': 'Account Invoice Partner Bank Usability',
|
||||
'version': '0.1',
|
||||
'category': 'Accounting & Finance',
|
||||
'license': 'AGPL-3',
|
||||
'summary': 'If the company has a single bank account, get the first one on the customer invoice',
|
||||
'description': """
|
||||
Account Invoice Partner Bank Usability
|
||||
======================================
|
||||
|
||||
If the company has a single bank account, we get set this bank account by default on the customer invoice.
|
||||
|
||||
Please contact Alexis de Lattre from Akretion <alexis.delattre@akretion.com> for any help or question about this module.
|
||||
""",
|
||||
'author': 'Akretion',
|
||||
'website': 'http://www.akretion.com',
|
||||
'depends': ['account'],
|
||||
'data': [],
|
||||
'images': [],
|
||||
'installable': True,
|
||||
'active': False,
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Account Invoice Partner Bank Usability module for OpenERP
|
||||
# Copyright (C) 2013 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp.osv import orm
|
||||
|
||||
|
||||
class account_invoice(orm.Model):
|
||||
_inherit = "account.invoice"
|
||||
|
||||
def invoice_out_get_first_partner_bank(self, cr, uid, context=None):
|
||||
'''Get the first bank account of your company on customer invoice
|
||||
if your company only has one bank account'''
|
||||
if context is None:
|
||||
context = {}
|
||||
res_partner_bank_id = False
|
||||
if context.get('type') == 'out_invoice' or \
|
||||
context.get('inv_type') == 'out_invoice':
|
||||
cur_user = self.pool['res.users'].browse(
|
||||
cr, uid, uid, context=context)
|
||||
partner_banks = cur_user.company_id.partner_id.bank_ids
|
||||
if partner_banks and len(partner_banks) == 1:
|
||||
res_partner_bank_id = partner_banks[0].id
|
||||
return res_partner_bank_id
|
||||
|
||||
_defaults = {
|
||||
'partner_bank_id': invoice_out_get_first_partner_bank,
|
||||
}
|
||||
39
account_invoice_update_wizard/README.rst
Normal file
39
account_invoice_update_wizard/README.rst
Normal file
@@ -0,0 +1,39 @@
|
||||
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
|
||||
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||
:alt: License: AGPL-3
|
||||
|
||||
Account Invoice Update Wizard
|
||||
=============================
|
||||
|
||||
This module adds a button *Update Invoice* on Customer and Supplier invoices in
|
||||
Open or Paid state. This button starts a wizard which allows the user to update
|
||||
non-legal fields of the invoice:
|
||||
|
||||
* Source Document
|
||||
* Reference/Description
|
||||
* Payment terms (update allowed only to a payment term with same number of terms
|
||||
of the same amount and on invoices without any payment)
|
||||
* Bank Account
|
||||
* Salesman
|
||||
* Notes
|
||||
* Description of invoice lines
|
||||
* Analytic account
|
||||
* Analytic tags
|
||||
|
||||
Bug Tracker
|
||||
===========
|
||||
|
||||
Bugs are tracked on `GitHub Issues
|
||||
<https://github.com/akretion/odoo-usability/issues>`_. In case of trouble, please
|
||||
check there if your issue has already been reported. If you spotted it first,
|
||||
help us smash it by providing detailed and welcomed feedback.
|
||||
|
||||
Contributors
|
||||
------------
|
||||
|
||||
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
* Florian da Costa <florian.dacosta@akretion.com>
|
||||
* Matthieu Dietrich <matthieu.dietrich@camptocamp.com>
|
||||
* Yannick Vaucher <yannick.vaucher@camptocamp.com>
|
||||
* Mykhailo Panarin <m.panarin@mobilunity.com>
|
||||
* Artem Kostyuk <a.kostyuk@mobilunity.com>
|
||||
2
account_invoice_update_wizard/__init__.py
Normal file
2
account_invoice_update_wizard/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from . import models
|
||||
from . import wizard
|
||||
22
account_invoice_update_wizard/__manifest__.py
Normal file
22
account_invoice_update_wizard/__manifest__.py
Normal file
@@ -0,0 +1,22 @@
|
||||
# Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||
# Copyright 2018-2019 Camptocamp
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
{
|
||||
'name': 'Account Invoice Update Wizard',
|
||||
'version': '14.0.1.0.0',
|
||||
'category': 'Accounting & Finance',
|
||||
'license': 'AGPL-3',
|
||||
'summary': 'Wizard to update non-legal fields of an open/paid invoice',
|
||||
'author': 'Akretion',
|
||||
'website': 'https://github.com/akretion/odoo-usability',
|
||||
'depends': [
|
||||
'account',
|
||||
],
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'wizard/account_move_update_view.xml',
|
||||
'views/account_move.xml',
|
||||
],
|
||||
'installable': False,
|
||||
}
|
||||
1
account_invoice_update_wizard/models/__init__.py
Normal file
1
account_invoice_update_wizard/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import account_move
|
||||
18
account_invoice_update_wizard/models/account_move.py
Normal file
18
account_invoice_update_wizard/models/account_move.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Copyright 2019-2022 Camptocamp
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import models
|
||||
|
||||
|
||||
class AccountMove(models.Model):
|
||||
_inherit = 'account.move'
|
||||
|
||||
def prepare_update_wizard(self):
|
||||
self.ensure_one()
|
||||
wizard = self.env['account.move.update']
|
||||
res = wizard._prepare_default_get(self)
|
||||
action = self.env["ir.actions.actions"]._for_xml_id(
|
||||
'account_invoice_update_wizard.account_invoice_update_action')
|
||||
action['name'] = "Update Wizard"
|
||||
action['res_id'] = wizard.create(res).id
|
||||
return action
|
||||
@@ -0,0 +1,3 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_account_move_update,account.move.update.user,model_account_move_update,account.group_account_invoice,1,1,1,1
|
||||
access_account_move_line_update,account.move.line.update.user,model_account_move_line_update,account.group_account_invoice,1,1,1,1
|
||||
|
1
account_invoice_update_wizard/tests/__init__.py
Normal file
1
account_invoice_update_wizard/tests/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import test_account_move_update_wizard
|
||||
@@ -0,0 +1,173 @@
|
||||
# Copyright 2018-2022 Camptocamp
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo.tests.common import SavepointCase
|
||||
|
||||
|
||||
class TestAccountInvoiceUpdateWizard(SavepointCase):
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
cls.customer12 = cls.env.ref('base.res_partner_12')
|
||||
cls.product16 = cls.env.ref('product.product_product_16')
|
||||
uom_unit = cls.env.ref('uom.product_uom_categ_unit')
|
||||
|
||||
cls.move1 = cls.env['account.move'].create({
|
||||
'name': 'Test invoice',
|
||||
'partner_id': cls.customer12.id,
|
||||
'move_type': 'out_invoice',
|
||||
'invoice_line_ids': [
|
||||
[0, None, {
|
||||
'name': 'Line1',
|
||||
'product_id': cls.product16.id,
|
||||
'product_uom_id': uom_unit.id,
|
||||
'quantity': 1,
|
||||
'price_unit': 42.0,
|
||||
'credit': 42.0,
|
||||
'debit': 0
|
||||
}],
|
||||
],
|
||||
})
|
||||
|
||||
cls.aa1 = cls.env.ref('analytic.analytic_partners_camp_to_camp')
|
||||
cls.aa2 = cls.env.ref('analytic.analytic_nebula')
|
||||
cls.atag1 = cls.env.ref('analytic.tag_contract')
|
||||
cls.atag2 = cls.env['account.analytic.tag'].create({
|
||||
'name': 'の',
|
||||
})
|
||||
|
||||
def create_wizard(self, move):
|
||||
res = move.prepare_update_wizard()
|
||||
self.wiz = self.env['account.move.update'].browse(res['res_id'])
|
||||
|
||||
def test_add_analytic_account_line1(self):
|
||||
""" Add analytic account on a move line
|
||||
after the move has been approved.
|
||||
|
||||
This will:
|
||||
- update the move line
|
||||
- create a new analytic line.
|
||||
"""
|
||||
self.move1._post()
|
||||
self.create_wizard(self.move1)
|
||||
|
||||
wiz_line = self.wiz.line_ids.filtered(
|
||||
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
|
||||
wiz_line.analytic_account_id = self.aa1
|
||||
self.wiz.run()
|
||||
|
||||
related_ml = self.move1.invoice_line_ids.filtered(
|
||||
lambda rec: rec.product_id == self.product16)
|
||||
self.assertEqual(related_ml.analytic_account_id, self.aa1)
|
||||
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
|
||||
|
||||
def test_change_analytic_account_line1(self):
|
||||
""" Change analytic account on a move line
|
||||
after the move has been approved.
|
||||
|
||||
This will:
|
||||
- update the move line
|
||||
- update the existing analytic line."""
|
||||
move_line1 = self.move1.invoice_line_ids.filtered(lambda rec: rec.product_id == self.product16)
|
||||
move_line1.analytic_account_id = self.aa2
|
||||
|
||||
self.move1._post()
|
||||
self.create_wizard(self.move1)
|
||||
|
||||
wiz_line = self.wiz.line_ids.filtered(
|
||||
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
|
||||
wiz_line.analytic_account_id = self.aa1
|
||||
self.wiz.run()
|
||||
|
||||
related_ml = self.move1.invoice_line_ids.filtered(
|
||||
lambda rec: rec.product_id == self.product16)
|
||||
self.assertEqual(related_ml.analytic_account_id, self.aa1)
|
||||
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
|
||||
|
||||
def test_add_analytic_tags_line1(self):
|
||||
""" Add analytic tags on a move line
|
||||
after the move has been approved.
|
||||
|
||||
This will update move line.
|
||||
"""
|
||||
self.move1._post()
|
||||
self.create_wizard(self.move1)
|
||||
|
||||
wiz_line = self.wiz.line_ids.filtered(
|
||||
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
|
||||
wiz_line.analytic_tag_ids = self.atag2
|
||||
self.wiz.run()
|
||||
|
||||
related_ml = self.move1.invoice_line_ids.filtered(
|
||||
lambda rec: rec.product_id == self.product16)
|
||||
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
|
||||
self.assertFalse(related_ml.analytic_line_ids)
|
||||
|
||||
def test_change_analytic_tags_line1(self):
|
||||
""" Change analytic tags on a move line
|
||||
after the move has been approved.
|
||||
|
||||
It will update move line and analytic line
|
||||
"""
|
||||
move_line1 = self.move1.invoice_line_ids.filtered(lambda rec: rec.product_id == self.product16)
|
||||
move_line1.analytic_account_id = self.aa2
|
||||
move_line1.analytic_tag_ids = self.atag1
|
||||
|
||||
self.move1._post()
|
||||
self.create_wizard(self.move1)
|
||||
|
||||
wiz_line = self.wiz.line_ids.filtered(
|
||||
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
|
||||
wiz_line.analytic_tag_ids = self.atag2
|
||||
self.wiz.run()
|
||||
|
||||
related_ml = self.move1.invoice_line_ids.filtered(
|
||||
lambda rec: rec.product_id == self.product16)
|
||||
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
|
||||
self.assertEqual(related_ml.analytic_line_ids.tag_ids, self.atag2)
|
||||
|
||||
def test_add_analytic_info_line1(self):
|
||||
""" Add analytic account and tags on a move line
|
||||
after the move has been approved.
|
||||
|
||||
This will:
|
||||
- update move line
|
||||
- create an analytic line
|
||||
"""
|
||||
self.move1._post()
|
||||
self.create_wizard(self.move1)
|
||||
|
||||
wiz_line = self.wiz.line_ids.filtered(
|
||||
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
|
||||
wiz_line.analytic_account_id = self.aa1
|
||||
wiz_line.analytic_tag_ids = self.atag2
|
||||
self.wiz.run()
|
||||
|
||||
related_ml = self.move1.invoice_line_ids.filtered(
|
||||
lambda rec: rec.product_id == self.product16)
|
||||
self.assertEqual(related_ml.analytic_account_id, self.aa1)
|
||||
self.assertEqual(related_ml.analytic_tag_ids, self.atag2)
|
||||
self.assertEqual(related_ml.analytic_line_ids.account_id, self.aa1)
|
||||
self.assertEqual(related_ml.analytic_line_ids.tag_ids, self.atag2)
|
||||
|
||||
def test_empty_analytic_account_line1(self):
|
||||
""" Remove analytic account
|
||||
after the move has been approved.
|
||||
|
||||
This will raise an error as it is not implemented.
|
||||
"""
|
||||
move_line1 = self.move1.invoice_line_ids.filtered(lambda rec: rec.product_id == self.product16)
|
||||
move_line1.analytic_account_id = self.aa2
|
||||
|
||||
self.move1._post()
|
||||
self.create_wizard(self.move1)
|
||||
|
||||
wiz_line = self.wiz.line_ids.filtered(
|
||||
lambda rec: rec.invoice_line_id.product_id.id == self.product16.id)
|
||||
wiz_line.analytic_account_id = False
|
||||
self.wiz.run()
|
||||
related_ml = self.move1.invoice_line_ids.filtered(
|
||||
lambda rec: rec.product_id == self.product16)
|
||||
self.assertFalse(related_ml.analytic_account_id)
|
||||
self.assertFalse(related_ml.analytic_line_ids)
|
||||
19
account_invoice_update_wizard/views/account_move.xml
Normal file
19
account_invoice_update_wizard/views/account_move.xml
Normal file
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="view_move_form_inherit" model="ir.ui.view">
|
||||
<field name="model">account.move</field>
|
||||
<field name="inherit_id" ref="account.view_move_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<button name="button_draft" position="before">
|
||||
<button name="prepare_update_wizard" type="object" string="Update Invoice" states="posted" groups="account.group_account_invoice"/>
|
||||
</button>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
1
account_invoice_update_wizard/wizard/__init__.py
Normal file
1
account_invoice_update_wizard/wizard/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import account_move_update
|
||||
251
account_invoice_update_wizard/wizard/account_move_update.py
Normal file
251
account_invoice_update_wizard/wizard/account_move_update.py
Normal file
@@ -0,0 +1,251 @@
|
||||
# Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||
# Copyright 2018-2022 Camptocamp
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import UserError
|
||||
import odoo.addons.decimal_precision as dp
|
||||
|
||||
|
||||
class AccountMoveUpdate(models.TransientModel):
|
||||
_name = 'account.move.update'
|
||||
_description = 'Wizard to update non-legal fields of invoice'
|
||||
|
||||
invoice_id = fields.Many2one(
|
||||
'account.move', string='Invoice', required=True,
|
||||
readonly=True)
|
||||
move_type = fields.Selection(related='invoice_id.move_type')
|
||||
company_id = fields.Many2one(related='invoice_id.company_id')
|
||||
partner_id = fields.Many2one(related='invoice_id.partner_id')
|
||||
user_id = fields.Many2one('res.users', string='Salesperson')
|
||||
invoice_payment_term_id = fields.Many2one(
|
||||
'account.payment.term', string='Payment Term')
|
||||
ref = fields.Char(string='Reference') # field label is customized in the view
|
||||
invoice_origin = fields.Char(string='Source Document')
|
||||
partner_bank_id = fields.Many2one(
|
||||
'res.partner.bank', string='Bank Account')
|
||||
line_ids = fields.One2many(
|
||||
'account.move.line.update', 'parent_id', string='Invoice Lines')
|
||||
|
||||
@api.model
|
||||
def _simple_fields2update(self):
|
||||
'''List boolean, date, datetime, char, text fields'''
|
||||
return ['ref', 'invoice_origin']
|
||||
|
||||
@api.model
|
||||
def _m2o_fields2update(self):
|
||||
return ['invoice_payment_term_id', 'user_id', 'partner_bank_id']
|
||||
|
||||
@api.model
|
||||
def _prepare_default_get(self, invoice):
|
||||
res = {'invoice_id': invoice.id, 'line_ids': []}
|
||||
for sfield in self._simple_fields2update():
|
||||
res[sfield] = invoice[sfield]
|
||||
for m2ofield in self._m2o_fields2update():
|
||||
res[m2ofield] = invoice[m2ofield].id or False
|
||||
for line in invoice.invoice_line_ids:
|
||||
aa_tags = line.analytic_tag_ids
|
||||
aa_tags = [(6, 0, aa_tags.ids)] if aa_tags else False
|
||||
res['line_ids'].append([0, 0, {
|
||||
'invoice_line_id': line.id,
|
||||
'name': line.name,
|
||||
'quantity': line.quantity,
|
||||
'price_subtotal': line.price_subtotal,
|
||||
'analytic_account_id': line.analytic_account_id.id,
|
||||
'currency_id': line.currency_id.id,
|
||||
'analytic_tag_ids': aa_tags,
|
||||
'display_type': line.display_type,
|
||||
}])
|
||||
return res
|
||||
|
||||
@api.onchange('move_type')
|
||||
def move_type_on_change(self):
|
||||
res = {'domain': {}}
|
||||
if self.move_type in ('out_invoice', 'out_refund'):
|
||||
res['domain']['partner_bank_id'] =\
|
||||
"[('partner_id.ref_company_ids', 'in', [company_id])]"
|
||||
else:
|
||||
res['domain']['partner_bank_id'] =\
|
||||
"[('partner_id', '=', partner_id)]"
|
||||
return res
|
||||
|
||||
def _prepare_invoice(self):
|
||||
vals = {}
|
||||
inv = self.invoice_id
|
||||
for sfield in self._simple_fields2update():
|
||||
if self[sfield] != inv[sfield]:
|
||||
vals[sfield] = self[sfield]
|
||||
for m2ofield in self._m2o_fields2update():
|
||||
if self[m2ofield] != inv[m2ofield]:
|
||||
vals[m2ofield] = self[m2ofield].id or False
|
||||
if 'invoice_payment_term_id' in vals:
|
||||
pterm_list = self.invoice_payment_term_id.compute(
|
||||
value=1, date_ref=inv.date_invoice)[0]
|
||||
if pterm_list:
|
||||
vals['date_due'] = max(line[0] for line in pterm_list)
|
||||
return vals
|
||||
|
||||
@api.model
|
||||
def _line_simple_fields2update(self):
|
||||
return ["name"]
|
||||
|
||||
@api.model
|
||||
def _line_m2o_fields2update(self):
|
||||
return ["analytic_account_id"]
|
||||
|
||||
@api.model
|
||||
def _line_m2m_fields2update(self):
|
||||
return ["analytic_tag_ids"]
|
||||
|
||||
@api.model
|
||||
def _prepare_invoice_line(self, line):
|
||||
vals = {}
|
||||
for field in self._line_simple_fields2update():
|
||||
if line[field] != line.invoice_line_id[field]:
|
||||
vals[field] = line[field]
|
||||
for field in self._line_m2o_fields2update():
|
||||
if line[field] != line.invoice_line_id[field]:
|
||||
vals[field] = line[field].id
|
||||
for field in self._line_m2m_fields2update():
|
||||
if line[field] != line.invoice_line_id[field]:
|
||||
vals[field] = [(6, 0, line[field].ids)]
|
||||
return vals
|
||||
|
||||
def _prepare_move_line_and_analytic_line(self, inv_line):
|
||||
mlvals = {}
|
||||
alvals = {}
|
||||
inv_line_upd = self.line_ids.filtered(
|
||||
lambda rec: rec.invoice_line_id == inv_line)
|
||||
|
||||
ini_aa = inv_line.analytic_account_id
|
||||
new_aa = inv_line_upd.analytic_account_id
|
||||
|
||||
if ini_aa != new_aa:
|
||||
mlvals['analytic_account_id'] = new_aa.id
|
||||
alvals['account_id'] = new_aa.id
|
||||
|
||||
ini_aa_tags = inv_line.analytic_tag_ids
|
||||
new_aa_tags = inv_line_upd.analytic_tag_ids
|
||||
|
||||
if ini_aa_tags != new_aa_tags:
|
||||
mlvals['analytic_tag_ids'] = [(6, None, new_aa_tags.ids)]
|
||||
alvals['tag_ids'] = [(6, None, new_aa_tags.ids)]
|
||||
return mlvals, alvals
|
||||
|
||||
def _update_payment_term_move(self):
|
||||
self.ensure_one()
|
||||
inv = self.invoice_id
|
||||
if (
|
||||
self.invoice_payment_term_id and
|
||||
self.invoice_payment_term_id != inv.invoice_payment_term_id):
|
||||
# I don't update pay term when the invoice is partially (or fully)
|
||||
# paid because if you have a payment term with several lines
|
||||
# of the same amount, you would also have to take into account
|
||||
# the reconcile marks to put the new maturity date on the right
|
||||
# lines
|
||||
if inv.payment_id:
|
||||
raise UserError(_(
|
||||
"This wizard doesn't support the update of payment "
|
||||
"terms on an invoice which is partially or fully "
|
||||
"paid."))
|
||||
prec = self.env['decimal.precision'].precision_get('Account')
|
||||
term_res = self.invoice_payment_term_id.compute(
|
||||
inv.amount_total, inv.date_invoice)[0]
|
||||
new_pterm = {} # key = int(amount * 100), value = [date1, date2]
|
||||
for entry in term_res:
|
||||
amount = int(entry[1] * 10 * prec)
|
||||
if amount in new_pterm:
|
||||
new_pterm[amount].append(entry[0])
|
||||
else:
|
||||
new_pterm[amount] = [entry[0]]
|
||||
mlines = {} # key = int(amount * 100), value : [line1, line2]
|
||||
for line in inv.move_id.line_ids:
|
||||
if line.account_id == inv.account_id:
|
||||
amount = int(abs(line.credit - line.debit) * 10 * prec)
|
||||
if amount in mlines:
|
||||
mlines[amount].append(line)
|
||||
else:
|
||||
mlines[amount] = [line]
|
||||
for iamount, lines in mlines.items():
|
||||
if len(lines) != len(new_pterm.get(iamount, [])):
|
||||
raise UserError(_(
|
||||
"The original payment term '%s' doesn't have the "
|
||||
"same terms (number of terms and/or amount) as the "
|
||||
"new payment term '%s'. You can only switch to a "
|
||||
"payment term that has the same number of terms "
|
||||
"with the same amount.") % (
|
||||
inv.invoice_payment_term_id.name, self.invoice_payment_term_id.name))
|
||||
for line in lines:
|
||||
line.date_maturity = new_pterm[iamount].pop()
|
||||
|
||||
def run(self):
|
||||
self.ensure_one()
|
||||
inv = self.invoice_id
|
||||
updated = False
|
||||
# re-write date_maturity on move line
|
||||
self._update_payment_term_move()
|
||||
ivals = self._prepare_invoice()
|
||||
if ivals:
|
||||
updated = True
|
||||
inv.write(ivals)
|
||||
if inv:
|
||||
for ml in inv.line_ids.filtered(
|
||||
# we are only interested in invoice lines, not tax lines
|
||||
lambda rec: bool(rec.product_id)
|
||||
):
|
||||
if ml.credit == 0.0:
|
||||
continue
|
||||
analytic_account = ml.analytic_account_id
|
||||
mlvals, alvals = self._prepare_move_line_and_analytic_line(ml)
|
||||
if mlvals:
|
||||
updated = True
|
||||
ml.write(mlvals)
|
||||
aalines = ml.analytic_line_ids
|
||||
if aalines and alvals:
|
||||
updated = True
|
||||
if ('account_id' in alvals and
|
||||
alvals['account_id'] is False):
|
||||
former_aa = analytic_account
|
||||
to_remove_aalines = aalines.filtered(
|
||||
lambda rec: rec.account_id == former_aa)
|
||||
# remove existing analytic line
|
||||
to_remove_aalines.unlink()
|
||||
else:
|
||||
aalines.write(alvals)
|
||||
elif 'account_id' in alvals:
|
||||
# Create analytic lines if analytic account
|
||||
# is added later
|
||||
ml.create_analytic_lines()
|
||||
for line in self.line_ids:
|
||||
ilvals = self._prepare_invoice_line(line)
|
||||
if ilvals:
|
||||
updated = True
|
||||
line.invoice_line_id.write(ilvals)
|
||||
if updated:
|
||||
inv.message_post(body=_(
|
||||
'Non-legal fields of invoice updated via the Invoice Update '
|
||||
'wizard.'))
|
||||
return True
|
||||
|
||||
|
||||
class AccountMoveLineUpdate(models.TransientModel):
|
||||
_name = 'account.move.line.update'
|
||||
_description = 'Update non-legal fields of invoice lines'
|
||||
|
||||
parent_id = fields.Many2one(
|
||||
'account.move.update', string='Wizard', ondelete='cascade')
|
||||
invoice_line_id = fields.Many2one(
|
||||
'account.move.line', string='Invoice Line', readonly=True)
|
||||
name = fields.Text(string='Description', required=True)
|
||||
display_type = fields.Selection([
|
||||
('line_section', "Section"),
|
||||
('line_note', "Note")], default=False, help="Technical field for UX purpose.")
|
||||
quantity = fields.Float(
|
||||
string='Quantity', digits='Product Unit of Measure', readonly=True)
|
||||
price_subtotal = fields.Monetary(
|
||||
string='Amount', readonly=True)
|
||||
analytic_account_id = fields.Many2one(
|
||||
'account.analytic.account', string='Analytic Account')
|
||||
analytic_tag_ids = fields.Many2many(
|
||||
'account.analytic.tag', string='Analytic Tags')
|
||||
currency_id = fields.Many2one('res.currency', readonly=True)
|
||||
@@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
© 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="account_invoice_update_form" model="ir.ui.view">
|
||||
<field name="model">account.move.update</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Update Invoice Wizard">
|
||||
<group name="main">
|
||||
<field name="invoice_id" invisible="1"/>
|
||||
<field name="move_type" invisible="1"/>
|
||||
<field name="company_id" invisible="1"/>
|
||||
<field name="partner_id" invisible="1"/>
|
||||
<field string="Bill Reference" attrs="{'invisible': [('move_type', 'not in', ('in_invoice', 'in_refund'))]}" name="ref"/>
|
||||
<field string="Customer Reference" attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'out_refund'))]}" name="ref"/>
|
||||
<field name="invoice_origin"/>
|
||||
<field name="invoice_payment_term_id" widget="selection"/>
|
||||
<field name="partner_bank_id"/>
|
||||
<field name="user_id" options="{'no_open': True, 'no_create': True, 'no_create_edit': True}"/>
|
||||
</group>
|
||||
<group name="lines">
|
||||
<field name="line_ids" nolabel="1">
|
||||
<tree editable="bottom" create="false" delete="false" edit="true">
|
||||
<field name="invoice_line_id" invisible="1"/>
|
||||
<field name="display_type" invisible="1"/>
|
||||
<field name="currency_id" invisible="1"/>
|
||||
<field name="name"/>
|
||||
<field name="quantity" attrs="{'invisible': [('display_type', '!=', False)]}"/>
|
||||
<field name="price_subtotal" attrs="{'invisible': [('display_type', '!=', False)]}"/>
|
||||
<field name="analytic_account_id" attrs="{'invisible': [('display_type', '!=', False)]}" groups="analytic.group_analytic_accounting"/>
|
||||
<field name="analytic_tag_ids" attrs="{'invisible': [('display_type', '!=', False)]}" groups="analytic.group_analytic_tags" widget="many2many_tags"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
<footer>
|
||||
<button name="run" type="object" class="oe_highlight" string="Update"/>
|
||||
<button special="cancel" string="Cancel" class="oe_link"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="account_invoice_update_action" model="ir.actions.act_window">
|
||||
<field name="name">Invoice Update Wizard</field>
|
||||
<field name="res_model">account.move.update</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
39
account_invoice_update_wizard_payment_mode/README.rst
Normal file
39
account_invoice_update_wizard_payment_mode/README.rst
Normal file
@@ -0,0 +1,39 @@
|
||||
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
|
||||
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||
:alt: License: AGPL-3
|
||||
|
||||
Account Invoice Update Wizard
|
||||
=============================
|
||||
|
||||
This module adds a button *Update Invoice* on Customer and Supplier invoices in
|
||||
Open or Paid state. This button starts a wizard which allows the user to update
|
||||
non-legal fields of the invoice:
|
||||
|
||||
* Source Document
|
||||
* Reference/Description
|
||||
* Payment terms (update allowed only to a payment term with same number of terms
|
||||
of the same amount and on invoices without any payment)
|
||||
* Bank Account
|
||||
* Salesman
|
||||
* Notes
|
||||
* Description of invoice lines
|
||||
* Analytic account
|
||||
* Analytic tags
|
||||
|
||||
Bug Tracker
|
||||
===========
|
||||
|
||||
Bugs are tracked on `GitHub Issues
|
||||
<https://github.com/akretion/odoo-usability/issues>`_. In case of trouble, please
|
||||
check there if your issue has already been reported. If you spotted it first,
|
||||
help us smash it by providing detailed and welcomed feedback.
|
||||
|
||||
Contributors
|
||||
------------
|
||||
|
||||
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
* Florian da Costa <florian.dacosta@akretion.com>
|
||||
* Matthieu Dietrich <matthieu.dietrich@camptocamp.com>
|
||||
* Yannick Vaucher <yannick.vaucher@camptocamp.com>
|
||||
* Mykhailo Panarin <m.panarin@mobilunity.com>
|
||||
* Artem Kostyuk <a.kostyuk@mobilunity.com>
|
||||
1
account_invoice_update_wizard_payment_mode/__init__.py
Normal file
1
account_invoice_update_wizard_payment_mode/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import wizard
|
||||
17
account_invoice_update_wizard_payment_mode/__manifest__.py
Normal file
17
account_invoice_update_wizard_payment_mode/__manifest__.py
Normal file
@@ -0,0 +1,17 @@
|
||||
# Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
{
|
||||
'name': 'Account Invoice Update Wizard Payment Mode',
|
||||
'version': '14.0.1.0.0',
|
||||
'category': 'Accounting & Finance',
|
||||
'license': 'AGPL-3',
|
||||
'summary': 'Add Payment Mode to Invoice Update Wizard',
|
||||
'author': 'Akretion',
|
||||
'website': 'https://github.com/akretion/odoo-usability',
|
||||
'depends': ['account_invoice_update_wizard', 'account_payment_partner'],
|
||||
'data': ['wizard/account_move_update_view.xml'],
|
||||
'installable': False,
|
||||
'auto_install': True,
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2017 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="view_move_form_inherit" model="ir.ui.view">
|
||||
<field name="model">account.move</field>
|
||||
<field name="inherit_id" ref="account.view_move_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<button name="button_draft" position="before">
|
||||
<button name="prepare_update_wizard" type="object" string="Update Invoice" states="posted" groups="account.group_account_invoice"/>
|
||||
</button>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
@@ -0,0 +1 @@
|
||||
from . import account_move_update
|
||||
@@ -0,0 +1,24 @@
|
||||
# Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
|
||||
|
||||
class AccountMoveUpdate(models.TransientModel):
|
||||
_inherit = 'account.move.update'
|
||||
|
||||
payment_mode_filter_type_domain = fields.Char(
|
||||
related='invoice_id.payment_mode_filter_type_domain')
|
||||
partner_bank_filter_type_domain = fields.Many2one(
|
||||
related='invoice_id.partner_bank_filter_type_domain')
|
||||
bank_account_required = fields.Boolean(
|
||||
related='invoice_id.bank_account_required')
|
||||
payment_mode_id = fields.Many2one("account.payment.mode")
|
||||
|
||||
@api.model
|
||||
def _m2o_fields2update(self):
|
||||
m2o_list = super()._m2o_fields2update()
|
||||
m2o_list.append('payment_mode_id')
|
||||
return m2o_list
|
||||
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
|
||||
<record id="account_invoice_update_form" model="ir.ui.view">
|
||||
<field name="model">account.move.update</field>
|
||||
<field name="inherit_id" ref="account_invoice_update_wizard.account_invoice_update_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="invoice_payment_term_id" position="after">
|
||||
<field name="payment_mode_filter_type_domain" invisible="1"/>
|
||||
<field name="partner_bank_filter_type_domain" invisible="1"/>
|
||||
<field name="bank_account_required" invisible="1"/>
|
||||
<field name="payment_mode_id" domain="[('payment_type', '=', payment_mode_filter_type_domain), ('company_id', '=', company_id)]"/>
|
||||
</field>
|
||||
<field name="partner_bank_id" position="attributes">
|
||||
<attribute name="domain">
|
||||
[('partner_id', '=', partner_bank_filter_type_domain),
|
||||
'|',('company_id', '=', company_id),('company_id', '=', False)]
|
||||
</attribute>
|
||||
<attribute name="attrs">{'required': [('bank_account_required', '=', True),('move_type', 'in', ('in_invoice', 'in_refund'))]}</attribute>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
</odoo>
|
||||
0
account_menu_usability/__init__.py
Normal file
0
account_menu_usability/__init__.py
Normal file
18
account_menu_usability/__manifest__.py
Normal file
18
account_menu_usability/__manifest__.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Copyright 2022 Akretion France (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
{
|
||||
'name': 'Account Menu Usability',
|
||||
'version': '14.0.1.0.0',
|
||||
'category': 'Accounting & Finance',
|
||||
'license': 'AGPL-3',
|
||||
'summary': 'Small usability enhancements in account_menu module',
|
||||
'author': 'Akretion',
|
||||
'website': 'https://github.com/akretion/odoo-usability',
|
||||
'depends': ['account_menu'],
|
||||
'data': [
|
||||
'views/account_menu.xml',
|
||||
],
|
||||
'installable': False,
|
||||
}
|
||||
20
account_menu_usability/views/account_menu.xml
Normal file
20
account_menu_usability/views/account_menu.xml
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
|
||||
<!-- Accounting Templates are useful only when creating a new company/loading
|
||||
a chart of accounts, so we put it under 'Settings > Technical' and not
|
||||
under 'Invoicing > Configuration' which already has a lot of menu entries -->
|
||||
<record id="account_menu.menu_account_coa_settings" model="ir.ui.menu">
|
||||
<field name="name">Accounting Templates</field>
|
||||
<field name="parent_id" ref="base.menu_custom"/>
|
||||
</record>
|
||||
|
||||
|
||||
</odoo>
|
||||
1
account_move_label_copy/__init__.py
Normal file
1
account_move_label_copy/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import models
|
||||
29
account_move_label_copy/__manifest__.py
Normal file
29
account_move_label_copy/__manifest__.py
Normal file
@@ -0,0 +1,29 @@
|
||||
# Copyright 2022 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
{
|
||||
'name': 'Account Move Label Copy',
|
||||
'version': '14.0.1.0.0',
|
||||
'category': 'Accounting & Finance',
|
||||
'license': 'AGPL-3',
|
||||
'summary': 'When creating a Journal Entry manually, copy label from line to line',
|
||||
'description': """
|
||||
Account Move Label Copy
|
||||
=======================
|
||||
|
||||
This module is ONLY for users who don't accept to use the 'Reference' (ref) to store the description of the journal entry (the recommended method), but want to use the label on the lines for that purpose (name field of account.move.line). With this module, the label of the first line will be copied by default to the other lines upon creation of each line.
|
||||
|
||||
I don't recommend the use of this module.
|
||||
""",
|
||||
'author': 'Akretion',
|
||||
'website': 'http://www.akretion.com',
|
||||
'depends': [
|
||||
'account',
|
||||
'base_view_inheritance_extension',
|
||||
],
|
||||
'data': [
|
||||
'views/account_move.xml',
|
||||
],
|
||||
'installable': False,
|
||||
}
|
||||
1
account_move_label_copy/models/__init__.py
Normal file
1
account_move_label_copy/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import account_move
|
||||
13
account_move_label_copy/models/account_move.py
Normal file
13
account_move_label_copy/models/account_move.py
Normal file
@@ -0,0 +1,13 @@
|
||||
# Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class AccountMove(models.Model):
|
||||
_inherit = "account.move"
|
||||
|
||||
default_move_line_name = fields.Char(
|
||||
related='line_ids.name',
|
||||
string='Default Journal Item Label')
|
||||
23
account_move_label_copy/views/account_move.xml
Normal file
23
account_move_label_copy/views/account_move.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="view_move_form" model="ir.ui.view">
|
||||
<field name="model">account.move</field>
|
||||
<field name="inherit_id" ref="account.view_move_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="narration" position="after">
|
||||
<field name="default_move_line_name" invisible="1"/>
|
||||
</field>
|
||||
<xpath expr="//page[@id='aml_tab']/field[@name='line_ids']" position="attributes">
|
||||
<attribute name="context" operation="python_dict" key="default_name">default_move_line_name</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
@@ -0,0 +1 @@
|
||||
from . import report
|
||||
@@ -0,0 +1,32 @@
|
||||
# Copyright 2023 Akretion France (http://www.akretion.com/)
|
||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
{
|
||||
'name': 'Account Product Fiscal Classification - Sale',
|
||||
'version': '16.0.1.0.0',
|
||||
'category': 'Sales',
|
||||
'license': 'AGPL-3',
|
||||
'summary': 'Glue module between account_product_fiscal_classification and sale',
|
||||
'description': """
|
||||
This module adds a **Start Date** and **End Date** field on invoice
|
||||
lines. For example, if you have an insurance contrat for your company
|
||||
that run from April 1st 2013 to March 31st 2014, you will enter these
|
||||
dates as start and end dates on the supplier invoice line. If your
|
||||
fiscal year ends on December 31st 2013, 3 months of expenses are part of
|
||||
the 2014 fiscal year and should not be part of the 2013 fiscal year. So,
|
||||
thanks to this module, you will create a *Prepaid Expense* on December
|
||||
31st 2013 and OpenERP will identify this expense with the 3 months that
|
||||
are after the cut-off date and propose to generate the appropriate
|
||||
cut-off journal entry.
|
||||
|
||||
This module has been written by Alexis de Lattre from Akretion
|
||||
<alexis.delattre@akretion.com>.
|
||||
""",
|
||||
'author': 'Akretion',
|
||||
'maintainers': ['alexis-via'],
|
||||
'website': 'https://github.com/akretion/odoo-usability',
|
||||
'depends': ['pos_sale', 'account_product_fiscal_classification'],
|
||||
"data": ['report/sale_report_view.xml'],
|
||||
'auto_install': True,
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
from . import sale_report
|
||||
@@ -0,0 +1,35 @@
|
||||
# Copyright 2023 Akretion France (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class SaleReport(models.Model):
|
||||
_inherit = "sale.report"
|
||||
|
||||
fiscal_classification_id = fields.Many2one(
|
||||
"account.product.fiscal.classification",
|
||||
string="Product Fiscal Classification",
|
||||
readonly=True,
|
||||
)
|
||||
|
||||
def _select_additional_fields(self):
|
||||
res = super()._select_additional_fields()
|
||||
res["fiscal_classification_id"] = "t.fiscal_classification_id"
|
||||
return res
|
||||
|
||||
def _group_by_sale(self):
|
||||
res = super()._group_by_sale()
|
||||
res += ", t.fiscal_classification_id"
|
||||
return res
|
||||
|
||||
def _fill_pos_fields(self, additional_fields):
|
||||
res = super()._fill_pos_fields(additional_fields)
|
||||
res['fiscal_classification_id'] = "t.fiscal_classification_id"
|
||||
return res
|
||||
|
||||
def _group_by_pos(self):
|
||||
res = super()._group_by_pos()
|
||||
res += ", t.fiscal_classification_id"
|
||||
return res
|
||||
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2023 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="view_order_product_search" model="ir.ui.view">
|
||||
<field name="model">sale.report</field>
|
||||
<field name="inherit_id" ref="sale.view_order_product_search"/>
|
||||
<field name="arch" type="xml">
|
||||
<filter name="Category" position="after">
|
||||
<filter name="fiscal_classification_groupby" string="Product Fiscal Classification" context="{'group_by': 'fiscal_classification_id'}"/>
|
||||
</filter>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
97
account_usability_akretion/README.rst
Normal file
97
account_usability_akretion/README.rst
Normal file
@@ -0,0 +1,97 @@
|
||||
=================
|
||||
Account Usability
|
||||
=================
|
||||
|
||||
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! This file is generated by oca-gen-addon-readme !!
|
||||
!! changes will be overwritten. !!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
||||
:target: https://odoo-community.org/page/development-status
|
||||
:alt: Beta
|
||||
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
|
||||
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||
:alt: License: AGPL-3
|
||||
.. |badge3| image:: https://img.shields.io/badge/github-akretion%2Fodoo--usability-lightgray.png?logo=github
|
||||
:target: https://github.com/akretion/odoo-usability/tree/12.0/account_usability
|
||||
:alt: akretion/odoo-usability
|
||||
|
||||
|badge1| |badge2| |badge3|
|
||||
|
||||
This modules adds the following functions:
|
||||
|
||||
* Add an *Overdue* filter on invoice search view (this feature was previously
|
||||
located in te module *account_invoice_overdue_filter*)
|
||||
* Increase the default limit of 80 lines in journal entries and journal items views.
|
||||
* disable reconciliation "guessing"
|
||||
* fast search on *Reconcile Ref* for journal items.
|
||||
* add sale dates to invoice report to be compliant with
|
||||
https://www.service-public.fr/professionnels-entreprises/vosdroits/F31808
|
||||
* Sale date on qweb invoices
|
||||
* A wizard to mark several invoices as sent at once (forward from v8)
|
||||
* Default date for reversal journal entry is now D+1 instead of today
|
||||
* Track more fields on invoice (see details in account.py)
|
||||
* Add boolean fields `has_discount` and `has_attachment` on invoice
|
||||
* Add button "Delete line qty = 0" on supplier invoice
|
||||
* Cut name_get() of invoice if too long
|
||||
* A script for if Odoo screws up invoice attachment filename
|
||||
* help functions for py3o reports
|
||||
* Show code on name_get of journal
|
||||
* add direct search of journal using code
|
||||
* add copy=False on some fields
|
||||
* Add unicity constraint on analytic codes per company
|
||||
* Better default values on journal entry
|
||||
* Add link from journal items to to invoice
|
||||
* Add start_date and end_date on bank statements
|
||||
* Add transfer_account_id to invoicing config page
|
||||
* Improve domain reconciliation widget
|
||||
* account.reconcile.model don't copy name to label via onchange
|
||||
* Add method to get fiscal position without partner_id
|
||||
* Restore drill-through on sale and invoice reports
|
||||
* don't attach PDF upon invoice report generation on supplier invoices/refunds
|
||||
* Add filter on debit and credit amount for Move Lines
|
||||
* Add supplier invoice number in invoice tree view
|
||||
* Add date in outstanding payment widget on invoice form view (requires `odoo PR 84180 <https://github.com/odoo/odoo/pull/84180>`_)
|
||||
|
||||
Together with this module, I recommend the use of the following modules:
|
||||
|
||||
* account_invoice_supplier_ref_unique (OCA project account-invoicing)
|
||||
* account_move_line_no_default_search (OCA project account-financial-tools)
|
||||
* invoice_fiscal_position_update (OCA project account-invoicing)
|
||||
|
||||
**Table of contents**
|
||||
|
||||
.. contents::
|
||||
:local:
|
||||
|
||||
Bug Tracker
|
||||
===========
|
||||
|
||||
Bugs are tracked on `GitHub Issues <https://github.com/akretion/odoo-usability/issues>`_.
|
||||
In case of trouble, please check there if your issue has already been reported.
|
||||
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||
`feedback <https://github.com/akretion/odoo-usability/issues/new?body=module:%20account_usability%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||
|
||||
Do not contact contributors directly about support or help with technical issues.
|
||||
|
||||
Credits
|
||||
=======
|
||||
|
||||
Authors
|
||||
~~~~~~~
|
||||
|
||||
* Akretion
|
||||
|
||||
Contributors
|
||||
~~~~~~~~~~~~
|
||||
|
||||
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
* David Beal <david.beal@akretion.com>
|
||||
|
||||
Maintainers
|
||||
~~~~~~~~~~~
|
||||
|
||||
This module is part of the `akretion/odoo-usability <https://github.com/akretion/odoo-usability/tree/12.0/account_usability>`_ project on GitHub.
|
||||
|
||||
You are welcome to contribute.
|
||||
3
account_usability_akretion/__init__.py
Normal file
3
account_usability_akretion/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from . import models
|
||||
from . import wizard
|
||||
from .hooks import post_init_hook
|
||||
41
account_usability_akretion/__manifest__.py
Normal file
41
account_usability_akretion/__manifest__.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# Copyright 2015-2022 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
{
|
||||
'name': 'Account Usability',
|
||||
'version': '16.0.1.0.0',
|
||||
'category': 'Accounting & Finance',
|
||||
'license': 'AGPL-3',
|
||||
'summary': 'Small usability enhancements in account module',
|
||||
'author': 'Akretion',
|
||||
'website': 'https://github.com/akretion/odoo-usability',
|
||||
'depends': [
|
||||
'account',
|
||||
'base_usability', # needed only to access base_usability.group_nobody
|
||||
],
|
||||
'data': [
|
||||
'views/account_account.xml',
|
||||
'views/account_group.xml',
|
||||
# 'views/account_bank_statement.xml',
|
||||
'views/account_invoice_report.xml',
|
||||
'views/account_journal.xml',
|
||||
'views/account_move.xml',
|
||||
'views/account_analytic_line.xml',
|
||||
'views/account_menu.xml',
|
||||
'views/account_tax.xml',
|
||||
# 'views/product.xml', # TODO
|
||||
'views/res_company.xml',
|
||||
'views/account_report.xml',
|
||||
'wizard/account_invoice_mark_sent_view.xml',
|
||||
'wizard/account_group_generate_view.xml',
|
||||
'wizard/account_payment_register_views.xml',
|
||||
'wizard/account_move_reversal.xml',
|
||||
'security/ir.model.access.csv',
|
||||
# 'report/invoice_report.xml', # TODO
|
||||
"views/res_partner.xml",
|
||||
],
|
||||
# 'qweb': ['static/src/xml/account_payment.xml'],
|
||||
'installable': True,
|
||||
# "post_init_hook": "post_init_hook",
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
diff --git a/addons/account/models/account_journal_dashboard.py b/addons/account/models/account_journal_dashboard.py
|
||||
index 49e166e5823..5e352c03d7a 100644
|
||||
--- a/addons/account/models/account_journal_dashboard.py
|
||||
+++ b/addons/account/models/account_journal_dashboard.py
|
||||
@@ -309,6 +309,7 @@ class account_journal(models.Model):
|
||||
'has_at_least_one_statement': has_at_least_one_statement,
|
||||
'nb_lines_bank_account_balance': nb_lines_bank_account_balance,
|
||||
'outstanding_pay_account_balance': formatLang(self.env, currency.round(outstanding_pay_account_balance), currency_obj=currency),
|
||||
+ 'account_balance_plus_outstanding': formatLang(self.env, currency.round(bank_account_balance + outstanding_pay_account_balance), currency_obj=currency),
|
||||
'nb_lines_outstanding_pay_account_balance': nb_lines_outstanding_pay_account_balance,
|
||||
'last_balance': formatLang(self.env, currency.round(last_balance) + 0.0, currency_obj=currency),
|
||||
'number_draft': number_draft,
|
||||
diff --git a/addons/account/views/account_journal_dashboard_view.xml b/addons/account/views/account_journal_dashboard_view.xml
|
||||
index 347a36c265e..fd7fb7b67ca 100644
|
||||
--- a/addons/account/views/account_journal_dashboard_view.xml
|
||||
+++ b/addons/account/views/account_journal_dashboard_view.xml
|
||||
@@ -278,6 +278,15 @@
|
||||
<span><t t-esc="dashboard.outstanding_pay_account_balance"/></span>
|
||||
</div>
|
||||
</div>
|
||||
+ <div class="row" t-if="dashboard.nb_lines_outstanding_pay_account_balance > 0">
|
||||
+ <div id="dashboard_account_balance_plus_outstanding" class="col overflow-hidden text-left">
|
||||
+ <span title="Balance + Outstanding">Balance + Outstanding</span>
|
||||
+ </div>
|
||||
+ <div class="col-auto text-right">
|
||||
+ <span><t t-esc="dashboard.account_balance_plus_outstanding"/></span>
|
||||
+ </div>
|
||||
+ </div>
|
||||
+
|
||||
<t t-if="dashboard.has_at_least_one_statement and dashboard.account_balance != dashboard.last_balance">
|
||||
<div class="row" name="latest_statement">
|
||||
<div class="col overflow-hidden text-left">
|
||||
9
account_usability_akretion/hooks.py
Normal file
9
account_usability_akretion/hooks.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# Copyright 2022 Akretion (https://www.akretion.com).
|
||||
# @author Sébastien BEAU <sebastien.beau@akretion.com>
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import SUPERUSER_ID, api
|
||||
|
||||
def post_init_hook(cr, registry):
|
||||
env = api.Environment(cr, SUPERUSER_ID, {})
|
||||
env["account.move.line"].update_matching_number()
|
||||
610
account_usability_akretion/i18n/fr.po
Normal file
610
account_usability_akretion/i18n/fr.po
Normal file
@@ -0,0 +1,610 @@
|
||||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_usability_akretion
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-07-07 14:47+0000\n"
|
||||
"PO-Revision-Date: 2024-07-07 14:47+0000\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#. odoo-python
|
||||
#: code:addons/account_usability_akretion/wizard/account_group_generate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"%d account groups already exists in company '%s'. This wizard is designed to"
|
||||
" generate account groups from scratch."
|
||||
msgstr ""
|
||||
"%d groupes de comptes existent déjà dans la société '%s'. Cet assistant "
|
||||
"est conçu pour créer des groupes de comptes à partir de zéro."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#. odoo-python
|
||||
#: code:addons/account_usability_akretion/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"A reverse journal entry <a href=# data-oe-model=account.move data-oe-"
|
||||
"id=%d>%s</a> has been generated."
|
||||
msgstr ""
|
||||
"Une extourne <a href=# data-oe-model=account.move data-oe-"
|
||||
"id=%d>%s</a> a été générée."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#. odoo-python
|
||||
#: code:addons/account_usability_akretion/wizard/account_move_reversal.py:0
|
||||
#, python-format
|
||||
msgid "%s reversed by %s"
|
||||
msgstr "%s extourné par %s"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_move_reversal
|
||||
msgid ""
|
||||
"You are about to reverse entries that have already been reversed or partially reversed (refund). Make sure it is intented.\n"
|
||||
" Already reversed entries are the following :"
|
||||
msgstr "Vous êtes sur le point d'extourner une pièce comptable déjà extournée, ou partiellement extournée (avoir). Vérifiez que c'est bien ce que vous souhaitez faire.\n"
|
||||
" Les pièces comptables déjà extournées sont les suivantes :"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model,name:account_usability_akretion.model_account_account
|
||||
msgid "Account"
|
||||
msgstr "Compte"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#. odoo-python
|
||||
#: code:addons/account_usability_akretion/wizard/account_group_generate.py:0
|
||||
#, python-format
|
||||
msgid "Account Groups"
|
||||
msgstr "Groupes de comptes"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model,name:account_usability_akretion.model_account_move_reversal
|
||||
msgid "Account Move Reversal"
|
||||
msgstr "Extourne de l'écriture comptable"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move_line__account_reconcile
|
||||
msgid "Allow Reconciliation"
|
||||
msgstr "Autoriser le lettrage"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.constraint,message:account_usability_akretion.constraint_account_analytic_account_code_company_unique
|
||||
msgid ""
|
||||
"An analytic account with the same code already exists in the same company!"
|
||||
msgstr ""
|
||||
"Un compte analytique avec le même code existe déjà dans la même société !"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model,name:account_usability_akretion.model_account_analytic_account
|
||||
msgid "Analytic Account"
|
||||
msgstr "Compte analytique"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_move_form
|
||||
msgid "Are you sure you want to cancel this invoice?"
|
||||
msgstr "Êtes-vous sûr de vouloir annuler cette facture ?"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_move_form
|
||||
msgid "Are you sure you want to cancel this journal entry?"
|
||||
msgstr "Êtes-vous sûr de vouloir annuler cette pièce comptable ?"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model,name:account_usability_akretion.model_res_partner_bank
|
||||
#: model:ir.ui.menu,name:account_usability_akretion.res_partner_bank_account_config_menu
|
||||
msgid "Bank Accounts"
|
||||
msgstr "Comptes bancaires"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.ui.menu,name:account_usability_akretion.res_bank_account_config_menu
|
||||
msgid "Banks"
|
||||
msgstr "Banques"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.account_group_generate_form
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.account_invoice_mark_sent_form
|
||||
msgid "Cancel"
|
||||
msgstr "Annuler"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_account_move_line__account_reconcile
|
||||
msgid ""
|
||||
"Check this box if this account allows invoices & payments matching of "
|
||||
"journal items."
|
||||
msgstr ""
|
||||
"Cochez cette case si ce compte permet de faire du lettrage entre "
|
||||
"factures et paiements."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_search
|
||||
msgid "Code"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_invoice_filter
|
||||
msgid "Commercial Partner"
|
||||
msgstr "Partenaire commercial"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model,name:account_usability_akretion.model_res_company
|
||||
msgid "Companies"
|
||||
msgstr "Sociétés"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__company_id
|
||||
msgid "Company"
|
||||
msgstr "Société"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model,name:account_usability_akretion.model_res_partner
|
||||
msgid "Contact"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__create_uid
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_mark_sent__create_uid
|
||||
msgid "Created by"
|
||||
msgstr "Créé par"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__create_date
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_mark_sent__create_date
|
||||
msgid "Created on"
|
||||
msgstr "Créé le"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_account_move_line__matched_credit_ids
|
||||
msgid "Credit journal items that are matched with this journal item."
|
||||
msgstr ""
|
||||
"Écritures comptables au crédit qui sont lettrées avec cette écriture comptable."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_account_move_line__matched_debit_ids
|
||||
msgid "Debit journal items that are matched with this journal item."
|
||||
msgstr ""
|
||||
"Écritures comptables au débit qui sont lettrées avec cette écriture comptable."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_move_line_filter
|
||||
msgid "Debit or Credit"
|
||||
msgstr "Débit ou crédit"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__display_name
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_mark_sent__display_name
|
||||
msgid "Display Name"
|
||||
msgstr "Nom affiché"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__blocked
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__blocked
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__blocked
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_invoice_filter
|
||||
msgid "Dispute"
|
||||
msgstr "Litige"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__invoice_date_due
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__invoice_date_due
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__invoice_date_due
|
||||
msgid "Due Date"
|
||||
msgstr "Date d'échéance"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__fiscal_position_id
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__fiscal_position_id
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__fiscal_position_id
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_res_partner__property_account_position_id
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_res_users__property_account_position_id
|
||||
msgid "Fiscal Position"
|
||||
msgstr "Position fiscale"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_account_bank_statement_line__fiscal_position_id
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_account_move__fiscal_position_id
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_account_payment__fiscal_position_id
|
||||
msgid ""
|
||||
"Fiscal positions are used to adapt taxes and accounts for particular "
|
||||
"customers or sales orders/invoices. The default value comes from the "
|
||||
"customer."
|
||||
msgstr ""
|
||||
"Les positions fiscales sont utilisées pour adapter les taxes et les comptes "
|
||||
"à des clients spécifiques ou à des bons de commande/factures. La valeur par"
|
||||
" défaut provient de la fiche client."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move_line__full_reconcile_id
|
||||
msgid "Full Reconcile"
|
||||
msgstr "Lettrage total"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_move_line_filter
|
||||
msgid "Fully Reconciled"
|
||||
msgstr "Lettré totalement"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.account_group_generate_form
|
||||
msgid "Generate"
|
||||
msgstr "Générer"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.actions.act_window,name:account_usability_akretion.account_group_generate_action
|
||||
#: model:ir.model,name:account_usability_akretion.model_account_group_generate
|
||||
#: model:ir.ui.menu,name:account_usability_akretion.account_group_generate_menu
|
||||
msgid "Generate Account Groups"
|
||||
msgstr "Générer les groupes de comptes"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_search
|
||||
msgid "Group"
|
||||
msgstr "Groupe"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_journal_search
|
||||
msgid "Group By"
|
||||
msgstr "Regrouper par"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__has_attachment
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__has_attachment
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__has_attachment
|
||||
msgid "Has Attachment"
|
||||
msgstr "Possède une pièce jointe"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__has_discount
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__has_discount
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__has_discount
|
||||
msgid "Has Discount"
|
||||
msgstr "A une remise"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_journal__hide_bank_statement_balance
|
||||
msgid "Hide and Disable Bank Statement Balance"
|
||||
msgstr "Masquer et désactiver le solde du relevé de compte"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__id
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_mark_sent__id
|
||||
msgid "ID"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model,name:account_usability_akretion.model_account_incoterms
|
||||
msgid "Incoterms"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_account_move_line__product_barcode
|
||||
msgid "International Article Number used for product identification."
|
||||
msgstr ""
|
||||
"Numéro d'article international utilisé pour identifier cet article."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_res_partner__invoice_warn
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_res_users__invoice_warn
|
||||
msgid "Invoice"
|
||||
msgstr "Facture"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_company_form
|
||||
msgid "Invoice Legal Terms"
|
||||
msgstr "Mentions légales sur les factures"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model,name:account_usability_akretion.model_account_invoice_report
|
||||
msgid "Invoices Statistics"
|
||||
msgstr "Statistiques de facturation"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model,name:account_usability_akretion.model_account_journal
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__journal_id
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__journal_id
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__journal_id
|
||||
msgid "Journal"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model,name:account_usability_akretion.model_account_move
|
||||
msgid "Journal Entry"
|
||||
msgstr "Pièce comptable"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model,name:account_usability_akretion.model_account_move_line
|
||||
msgid "Journal Item"
|
||||
msgstr "Écriture comptable"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_move_line_filter
|
||||
msgid "Label, Reference, Account or Partner"
|
||||
msgstr "Libellé, Référence, Compte ou Partenaire"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate____last_update
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_mark_sent____last_update
|
||||
msgid "Last Modified on"
|
||||
msgstr "Dernière modification le"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__write_uid
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_mark_sent__write_uid
|
||||
msgid "Last Updated by"
|
||||
msgstr "Mis à jour par"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__write_date
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_mark_sent__write_date
|
||||
msgid "Last Updated on"
|
||||
msgstr "Mis à jour le"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_company_form
|
||||
msgid "Legal Terms"
|
||||
msgstr "Mentions légales"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_res_company__static_invoice_terms
|
||||
msgid "Legal Terms on Invoice"
|
||||
msgstr "Mentions légales sur les factures"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__level
|
||||
msgid "Level"
|
||||
msgstr "Niveau"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.actions.act_window,name:account_usability_akretion.account_invoice_mark_sent_action
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.account_invoice_mark_sent_form
|
||||
msgid "Mark as Sent"
|
||||
msgstr "Marquer comme envoyé"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model,name:account_usability_akretion.model_account_invoice_mark_sent
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.account_invoice_mark_sent_form
|
||||
msgid "Mark invoices as sent"
|
||||
msgstr "Marquer les factures comme envoyées"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_journal_form
|
||||
msgid "Misc"
|
||||
msgstr "Divers"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_invoice_filter
|
||||
msgid "Missing Attachment"
|
||||
msgstr "Pièce jointe manquante"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model,name:account_usability_akretion.model_account_partial_reconcile
|
||||
msgid "Partial Reconcile"
|
||||
msgstr "Lettrage partiel"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move_line__matched_credit_ids
|
||||
msgid "Partial Reconcile Credit"
|
||||
msgstr "Crédit de lettrage partiel"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move_line__matched_debit_ids
|
||||
msgid "Partial Reconcile Debit"
|
||||
msgstr "Débit de lettrage partiel"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_invoice_report__industry_id
|
||||
msgid "Partner Industry"
|
||||
msgstr "Secteur d’activité du partenaire"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_invoice_filter
|
||||
msgid "Payment Status"
|
||||
msgstr "État de paiement"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__invoice_payment_term_id
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__invoice_payment_term_id
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__invoice_payment_term_id
|
||||
msgid "Payment Terms"
|
||||
msgstr "Conditions de paiement"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#. odoo-python
|
||||
#: code:addons/account_usability_akretion/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid "Please post the following entries before reconciliation :"
|
||||
msgstr "Veuillez comptabiliser les pièces suivantes avant le lettrage :"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_group_generate__name_prefix
|
||||
msgid "Prefix"
|
||||
msgstr "Préfixe"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_move_form
|
||||
msgid "Print"
|
||||
msgstr "Imprimer"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_invoice_report_search
|
||||
msgid "Product"
|
||||
msgstr "Produit"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move_line__product_barcode
|
||||
msgid "Product Barcode"
|
||||
msgstr "Code barre du produit"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__ref
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__ref
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__ref
|
||||
msgid "Reference"
|
||||
msgstr "Référence"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__sale_dates
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__sale_dates
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__sale_dates
|
||||
msgid "Sale Dates"
|
||||
msgstr "Dates de vente"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_res_partner__invoice_warn
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_res_users__invoice_warn
|
||||
msgid ""
|
||||
"Selecting the \"Warning\" option will notify user with the message, "
|
||||
"Selecting \"Blocking Message\" will throw an exception with the message and "
|
||||
"block the flow. The Message has to be written in the next field."
|
||||
msgstr ""
|
||||
"Sélectionner l'option 'Avertissement' notifiera l'utilisateur avec le "
|
||||
"message. Sélectionner 'Message Bloquant' lancera une exception avec le "
|
||||
"message et bloquera le flux. Le Message doit être encodé dans le champ "
|
||||
"suivant."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_invoice_filter
|
||||
msgid "Sent"
|
||||
msgstr "Envoyé"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#. odoo-python
|
||||
#: code:addons/account_usability_akretion/models/product.py:0
|
||||
#, python-format
|
||||
msgid "Tax excl."
|
||||
msgstr "HT"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#. odoo-python
|
||||
#: code:addons/account_usability_akretion/models/product.py:0
|
||||
#, python-format
|
||||
msgid "Tax incl."
|
||||
msgstr "TTC"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#. odoo-python
|
||||
#: code:addons/account_usability_akretion/wizard/account_group_generate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"The code of account '%s' is %d caracters. It cannot be inferior to level "
|
||||
"(%d)."
|
||||
msgstr ""
|
||||
"Le code du compte '%s' fait %d caractères. Il ne peut pas être "
|
||||
"inférieur au niveau (%d)."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_res_partner__property_account_position_id
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_res_users__property_account_position_id
|
||||
msgid ""
|
||||
"The fiscal position determines the taxes/accounts used for this contact."
|
||||
msgstr ""
|
||||
"La position fiscale détermine les taxes / comptes utilisés pour ce contact."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#. odoo-python
|
||||
#: code:addons/account_usability_akretion/wizard/account_group_generate.py:0
|
||||
#, python-format
|
||||
msgid "The level must be >= 1."
|
||||
msgstr "Le niveau doit être >= 1."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_move_form
|
||||
msgid "This"
|
||||
msgstr "Ce"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.constraint,message:account_usability_akretion.constraint_account_incoterms_code_unique
|
||||
msgid "This incoterm code already exists."
|
||||
msgstr "Ce code incoterm existe déjà."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_account_bank_statement_line__sale_dates
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_account_move__sale_dates
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_account_payment__sale_dates
|
||||
msgid ""
|
||||
"This information appear on invoice qweb report (you may use it for your own "
|
||||
"report)"
|
||||
msgstr ""
|
||||
"Cette information apparait sur le rapport qweb de la facture (vous pouvez "
|
||||
"les utiliser pour votre propre rapport)"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#. odoo-python
|
||||
#: code:addons/account_usability_akretion/models/account_move.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"This journal entry has been generated as the reverse of <a href=# data-oe-"
|
||||
"model=account.move data-oe-id=%d>%s</a>."
|
||||
msgstr ""
|
||||
"Cette pièce comptable a été générée comme extourne de <a href=# data-oe-"
|
||||
"model=account.move data-oe-id=%d>%s</a>."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.account_group_generate_form
|
||||
msgid ""
|
||||
"This wizard is designed to auto-generate account groups from the chart of "
|
||||
"account."
|
||||
msgstr ""
|
||||
"Cet assistant est conçu pour générer automatiquement les groupes de comptes "
|
||||
"à partir du plan comptable."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.account_invoice_mark_sent_form
|
||||
msgid "This wizard will mark as <i>sent</i> all the selected posted invoices."
|
||||
msgstr ""
|
||||
"Cet assistant marquera comme <i>envoyées</i> toutes les factures "
|
||||
"sélectionnées et comptabilisées."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_invoice_filter
|
||||
msgid "To Send"
|
||||
msgstr "À envoyer"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_bank_statement_line__amount_total
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_move__amount_total
|
||||
#: model:ir.model.fields,field_description:account_usability_akretion.field_account_payment__amount_total
|
||||
msgid "Total"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_journal_search
|
||||
msgid "Type"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_account_move_line_filter
|
||||
msgid "Unreconciled or Partially Reconciled"
|
||||
msgstr "Non lettré ou partiellement lettré"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_move_line_tree
|
||||
msgid "View Journal Entry Form"
|
||||
msgstr "Voir la pièce comptable en vue formulaire"
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model:ir.model.fields,help:account_usability_akretion.field_account_journal__hide_bank_statement_balance
|
||||
msgid ""
|
||||
"When this option is enabled, the start and end balance is not displayed on "
|
||||
"the bank statement form view, and the check of the end balance vs the real "
|
||||
"end balance is disabled. When you enable this option, you process the "
|
||||
"statement lines without considering the start/end balance and you regularly "
|
||||
"check the accounting balance of the bank account vs the amount of your bank "
|
||||
"account."
|
||||
msgstr ""
|
||||
"Lorsque cette option est activée, le solde de début et de fin ne s'affiche "
|
||||
"pas sur la vue du formulaire du relevé de compte, et la vérification du solde"
|
||||
" final vs le solde final réel est désactivée. Lorsque vous activez cette "
|
||||
"option, vous traitez les lignes de relevé de compte sans tenir compte du solde de "
|
||||
"début/fin et vous vérifiez régulièrement le solde du compte "
|
||||
"bancaire vs le montant sur votre compte en banque."
|
||||
|
||||
#. module: account_usability_akretion
|
||||
#: model_terms:ir.ui.view,arch_db:account_usability_akretion.view_move_form
|
||||
msgid "is marked as <b>disputed</b>."
|
||||
msgstr "est marquée <b>en litige</b>."
|
||||
@@ -0,0 +1,9 @@
|
||||
# Copyright 2020 ACSONE SA/NV
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import SUPERUSER_ID, api
|
||||
|
||||
|
||||
def migrate(cr, version):
|
||||
env = api.Environment(cr, SUPERUSER_ID, {})
|
||||
env["account.move.line"].update_matching_number()
|
||||
12
account_usability_akretion/models/__init__.py
Normal file
12
account_usability_akretion/models/__init__.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from . import account_account
|
||||
from . import account_analytic_account
|
||||
#from . import account_bank_statement
|
||||
from . import account_incoterms
|
||||
from . import account_journal
|
||||
from . import account_move
|
||||
from . import account_partial_reconcile
|
||||
from . import res_partner
|
||||
from . import res_company
|
||||
#from . import product
|
||||
from . import account_invoice_report
|
||||
from . import res_partner_bank
|
||||
19
account_usability_akretion/models/account_account.py
Normal file
19
account_usability_akretion/models/account_account.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# Copyright 2015-2022 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, models
|
||||
|
||||
|
||||
class AccountAccount(models.Model):
|
||||
_inherit = 'account.account'
|
||||
|
||||
@api.depends('name', 'code')
|
||||
def name_get(self):
|
||||
if self._context.get('account_account_show_code_only'):
|
||||
res = []
|
||||
for record in self:
|
||||
res.append((record.id, record.code))
|
||||
return res
|
||||
else:
|
||||
return super().name_get()
|
||||
@@ -0,0 +1,26 @@
|
||||
# Copyright 2015-2022 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import models
|
||||
|
||||
|
||||
class AccountAnalyticAccount(models.Model):
|
||||
_inherit = 'account.analytic.account'
|
||||
# native: _order = 'plan_id, name asc'
|
||||
_order = 'plan_id, code, name'
|
||||
|
||||
def name_get(self):
|
||||
if self._context.get('analytic_account_show_code_only'):
|
||||
res = []
|
||||
for record in self:
|
||||
res.append((record.id, record.code or record.name))
|
||||
return res
|
||||
else:
|
||||
return super().name_get()
|
||||
|
||||
_sql_constraints = [(
|
||||
'code_company_unique',
|
||||
'unique(code, company_id)',
|
||||
'An analytic account with the same code already '
|
||||
'exists in the same company!')]
|
||||
104
account_usability_akretion/models/account_bank_statement.py
Normal file
104
account_usability_akretion/models/account_bank_statement.py
Normal file
@@ -0,0 +1,104 @@
|
||||
# Copyright 2015-2020 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, fields, models
|
||||
from odoo.tools.misc import format_date
|
||||
|
||||
|
||||
class AccountBankStatement(models.Model):
|
||||
_inherit = 'account.bank.statement'
|
||||
|
||||
start_date = fields.Date(
|
||||
compute='_compute_dates', string='Start Date', store=True)
|
||||
end_date = fields.Date(
|
||||
compute='_compute_dates', string='End Date', store=True)
|
||||
line_count = fields.Integer(
|
||||
compute='_compute_dates', string='# of Lines', store=True)
|
||||
hide_bank_statement_balance = fields.Boolean(
|
||||
related='journal_id.hide_bank_statement_balance', readonly=True)
|
||||
|
||||
@api.depends('line_ids.date')
|
||||
def _compute_dates(self):
|
||||
for st in self:
|
||||
dates = [line.date for line in st.line_ids]
|
||||
st.start_date = dates and min(dates) or False
|
||||
st.end_date = dates and max(dates) or False
|
||||
st.line_count = len(dates)
|
||||
|
||||
def _check_balance_end_real_same_as_computed(self):
|
||||
for stmt in self:
|
||||
if not stmt.hide_bank_statement_balance:
|
||||
super(AccountBankStatement, stmt)._check_balance_end_real_same_as_computed()
|
||||
return True
|
||||
|
||||
@api.depends('name', 'start_date', 'end_date')
|
||||
def name_get(self):
|
||||
res = []
|
||||
for statement in self:
|
||||
name = "%s (%s => %s)" % (
|
||||
statement.name,
|
||||
statement.start_date and format_date(self.env, statement.start_date) or '',
|
||||
statement.end_date and format_date(self.env, statement.end_date) or '')
|
||||
res.append((statement.id, name))
|
||||
return res
|
||||
|
||||
def button_reopen(self):
|
||||
self = self.with_context(skip_undo_reconciliation=True)
|
||||
return super().button_reopen()
|
||||
|
||||
def button_undo_reconciliation(self):
|
||||
self.line_ids.button_undo_reconciliation()
|
||||
|
||||
|
||||
class AccountBankStatementLine(models.Model):
|
||||
_inherit = 'account.bank.statement.line'
|
||||
# Native order is:
|
||||
# _order = 'statement_id desc, sequence, id desc'
|
||||
_order = 'statement_id desc, date desc, sequence, id desc'
|
||||
|
||||
# Disable guessing for reconciliation
|
||||
# because my experience with several customers shows that it is a problem
|
||||
# in the following scenario : move line 'x' has been "guessed" by OpenERP
|
||||
# to be reconciled with a statement line 'Y' at the end of the bank
|
||||
# statement, but it is a mistake because it should be reconciled with
|
||||
# statement line 'B' at the beginning of the bank statement
|
||||
# When the user is on statement line 'B', he tries to select
|
||||
# move line 'x', but it can't find it... because it is already "reserved"
|
||||
# by the guess of OpenERP for statement line 'Y' ! To solve this problem,
|
||||
# the user must go to statement line 'Y' and unselect move line 'x'
|
||||
# and then come back on statement line 'B' and select move line 'A'...
|
||||
# but non super-expert users can't do that because it is impossible to
|
||||
# figure out that the fact that the user can't find move line 'x'
|
||||
# is caused by this.
|
||||
# Set search_reconciliation_proposition to False by default
|
||||
# TODO: re-write in v10
|
||||
# def get_data_for_reconciliations(
|
||||
# self, cr, uid, ids, excluded_ids=None,
|
||||
# search_reconciliation_proposition=False, context=None):
|
||||
# # Make variable name shorted for PEP8 !
|
||||
# search_rec_prop = search_reconciliation_proposition
|
||||
# return super().\
|
||||
# get_data_for_reconciliations(
|
||||
# cr, uid, ids, excluded_ids=excluded_ids,
|
||||
# search_reconciliation_proposition=search_rec_prop,
|
||||
# context=context)
|
||||
|
||||
def show_account_move(self):
|
||||
self.ensure_one()
|
||||
action = self.env["ir.actions.actions"]._for_xml_id(
|
||||
'account.action_move_line_form')
|
||||
# Note: this action is on account.move, not account.move.line !
|
||||
action.update({
|
||||
'views': False,
|
||||
'view_id': False,
|
||||
'view_mode': 'form,tree',
|
||||
'res_id': self.move_id.id,
|
||||
})
|
||||
return action
|
||||
|
||||
def button_undo_reconciliation(self):
|
||||
if self._context.get("skip_undo_reconciliation"):
|
||||
return
|
||||
else:
|
||||
return super().button_undo_reconciliation()
|
||||
31
account_usability_akretion/models/account_incoterms.py
Normal file
31
account_usability_akretion/models/account_incoterms.py
Normal file
@@ -0,0 +1,31 @@
|
||||
# Copyright 2015-2022 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, models
|
||||
|
||||
|
||||
class AccountIncoterms(models.Model):
|
||||
_inherit = 'account.incoterms'
|
||||
|
||||
_sql_constraints = [(
|
||||
'code_unique',
|
||||
'unique(code)',
|
||||
'This incoterm code already exists.')]
|
||||
|
||||
@api.depends('code', 'name')
|
||||
def name_get(self):
|
||||
res = []
|
||||
for rec in self:
|
||||
res.append((rec.id, '[%s] %s' % (rec.code, rec.name)))
|
||||
return res
|
||||
|
||||
@api.model
|
||||
def name_search(self, name='', args=None, operator='ilike', limit=100):
|
||||
if args is None:
|
||||
args = []
|
||||
if name and operator == 'ilike':
|
||||
recs = self.search([('code', '=ilike', name + '%')] + args, limit=limit)
|
||||
if recs:
|
||||
return recs.name_get()
|
||||
return super().name_search(name=name, args=args, operator=operator, limit=limit)
|
||||
17
account_usability_akretion/models/account_invoice_report.py
Normal file
17
account_usability_akretion/models/account_invoice_report.py
Normal file
@@ -0,0 +1,17 @@
|
||||
# Copyright 2022 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class AccountInvoiceReport(models.Model):
|
||||
_inherit = 'account.invoice.report'
|
||||
|
||||
industry_id = fields.Many2one('res.partner.industry', string='Partner Industry', readonly=True)
|
||||
|
||||
@api.model
|
||||
def _select(self):
|
||||
res = super()._select()
|
||||
res += ", COALESCE(partner.industry_id, commercial_partner.industry_id) AS industry_id"
|
||||
return res
|
||||
66
account_usability_akretion/models/account_journal.py
Normal file
66
account_usability_akretion/models/account_journal.py
Normal file
@@ -0,0 +1,66 @@
|
||||
# Copyright 2015-2022 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class AccountJournal(models.Model):
|
||||
_inherit = 'account.journal'
|
||||
|
||||
hide_bank_statement_balance = fields.Boolean(
|
||||
string='Hide and Disable Bank Statement Balance', default=True,
|
||||
help="When this option is enabled, the start and end balance is "
|
||||
"not displayed on the bank statement form view, and the check of "
|
||||
"the end balance vs the real end balance is disabled. When you enable "
|
||||
"this option, you process the statement lines without considering "
|
||||
"the start/end balance and you regularly check the accounting balance "
|
||||
"of the bank account vs the amount of your bank account."
|
||||
)
|
||||
# Used to set default user_type_id on account fields via context
|
||||
# account_type_current_assets_id = fields.Many2one(
|
||||
# 'account.account.type',
|
||||
# default=lambda self: self.env.ref('account.data_account_type_current_assets').id)
|
||||
|
||||
@api.depends(
|
||||
'name', 'currency_id', 'company_id', 'company_id.currency_id', 'code')
|
||||
def name_get(self):
|
||||
res = []
|
||||
if self._context.get('journal_show_code_only'):
|
||||
for journal in self:
|
||||
res.append((journal.id, journal.code))
|
||||
return res
|
||||
else:
|
||||
for journal in self:
|
||||
name = "[%s] %s" % (journal.code, journal.name)
|
||||
if (
|
||||
journal.currency_id and
|
||||
journal.currency_id != journal.company_id.currency_id):
|
||||
name = "%s (%s)" % (name, journal.currency_id.name)
|
||||
res.append((journal.id, name))
|
||||
return res
|
||||
|
||||
def open_outstanding_payments(self):
|
||||
self.ensure_one()
|
||||
action = self.env["ir.actions.actions"]._for_xml_id(
|
||||
"account.action_account_moves_all")
|
||||
action['domain'] = [
|
||||
('account_id', 'in', (self.payment_debit_account_id.id, self.payment_credit_account_id.id)),
|
||||
('journal_id', '=', self.id),
|
||||
('display_type', 'not in', ('line_section', 'line_note')),
|
||||
('parent_state', '!=', 'cancel'),
|
||||
]
|
||||
action['context'] = {
|
||||
'search_default_unreconciled': True,
|
||||
'search_default_posted': True,
|
||||
}
|
||||
return action
|
||||
|
||||
# field used in journal dashboard for bank journals
|
||||
# compute account_balance like in v14, using accounting and
|
||||
# NOT bank statement balance_start/balance_end
|
||||
def _compute_current_statement_balance(self):
|
||||
query_result = self._get_journal_dashboard_bank_running_balance()
|
||||
for journal in self:
|
||||
journal.has_statement_lines = query_result.get(journal.id)[0]
|
||||
journal.current_statement_balance = journal._get_journal_bank_account_balance()[0]
|
||||
297
account_usability_akretion/models/account_move.py
Normal file
297
account_usability_akretion/models/account_move.py
Normal file
@@ -0,0 +1,297 @@
|
||||
# Copyright 2015-2022 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from datetime import timedelta
|
||||
from collections import defaultdict
|
||||
import logging
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
from odoo.exceptions import UserError
|
||||
from odoo.osv import expression
|
||||
from odoo.tools import float_is_zero
|
||||
from odoo.tools.misc import format_date
|
||||
from odoo.tools.safe_eval import safe_eval, time
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class AccountMove(models.Model):
|
||||
_inherit = 'account.move'
|
||||
|
||||
# By default, we can still modify "ref" when account move is posted
|
||||
# which seems a bit lazy for me...
|
||||
ref = fields.Char(states={'posted': [('readonly', True)]})
|
||||
invoice_date_due = fields.Date(tracking=True)
|
||||
invoice_payment_term_id = fields.Many2one(tracking=True)
|
||||
journal_id = fields.Many2one(tracking=True)
|
||||
fiscal_position_id = fields.Many2one(tracking=True)
|
||||
amount_total = fields.Monetary(tracking=True)
|
||||
# for invoice report
|
||||
has_discount = fields.Boolean(compute='_compute_has_discount')
|
||||
# has_attachment is useful for those who use attachment to archive
|
||||
# supplier invoices. It allows them to find supplier invoices
|
||||
# that don't have any attachment
|
||||
has_attachment = fields.Boolean(
|
||||
compute='_compute_has_attachment', search='_search_has_attachment')
|
||||
sale_dates = fields.Char(
|
||||
compute="_compute_sales_dates",
|
||||
help="This information appear on invoice qweb report "
|
||||
"(you may use it for your own report)")
|
||||
# There is a native "blocked" field (bool) on account.move.line
|
||||
# We want to have that field on invoices to improve usability
|
||||
# while keeping compatibility with the standard Odoo datamodel
|
||||
blocked = fields.Boolean(
|
||||
compute="_compute_blocked",
|
||||
inverse="_inverse_blocked",
|
||||
store=True,
|
||||
string="Dispute",
|
||||
tracking=True,
|
||||
)
|
||||
# Field search_account_id is just for search view
|
||||
search_account_id = fields.Many2one(related='line_ids.account_id')
|
||||
|
||||
@api.depends("line_ids", "line_ids.blocked")
|
||||
def _compute_blocked(self):
|
||||
for move in self:
|
||||
move.blocked = any(
|
||||
[
|
||||
l.blocked
|
||||
for l in move.line_ids
|
||||
if l.account_id.account_type in ("liability_payable", "asset_receivable")
|
||||
]
|
||||
)
|
||||
|
||||
def _inverse_blocked(self):
|
||||
for move in self:
|
||||
for line in move.line_ids.filtered(
|
||||
lambda l: l.account_id.account_type in ("liability_payable", "asset_receivable")
|
||||
):
|
||||
line.blocked = move.blocked
|
||||
|
||||
def _compute_has_discount(self):
|
||||
prec = self.env['decimal.precision'].precision_get('Discount')
|
||||
for inv in self:
|
||||
has_discount = False
|
||||
for line in inv.invoice_line_ids:
|
||||
if line.display_type == 'product' and not float_is_zero(line.discount, precision_digits=prec):
|
||||
has_discount = True
|
||||
break
|
||||
inv.has_discount = has_discount
|
||||
|
||||
def _compute_has_attachment(self):
|
||||
iao = self.env['ir.attachment']
|
||||
for move in self:
|
||||
if iao.search_count([
|
||||
('res_model', '=', 'account.move'),
|
||||
('res_id', '=', move.id),
|
||||
('type', '=', 'binary'),
|
||||
('company_id', '=', move.company_id.id)]):
|
||||
move.has_attachment = True
|
||||
else:
|
||||
move.has_attachment = False
|
||||
|
||||
def _search_has_attachment(self, operator, value):
|
||||
att_inv_ids = {}
|
||||
if operator == '=':
|
||||
search_res = self.env['ir.attachment'].search_read([
|
||||
('res_model', '=', 'account.move'),
|
||||
('type', '=', 'binary'),
|
||||
('res_id', '!=', False)], ['res_id'])
|
||||
for att in search_res:
|
||||
att_inv_ids[att['res_id']] = True
|
||||
res = [('id', value and 'in' or 'not in', list(att_inv_ids))]
|
||||
return res
|
||||
|
||||
# when you have an invoice created from a lot of sale orders, the 'name'
|
||||
# field is very large, which makes the name_get() of that invoice very big
|
||||
# which screws-up the form view of that invoice because of the link at the
|
||||
# top of the screen
|
||||
# That's why we have to cut the name_get() when it's too long
|
||||
def name_get(self):
|
||||
old_res = super().name_get()
|
||||
res = []
|
||||
for old_re in old_res:
|
||||
name = old_re[1]
|
||||
if name and len(name) > 100:
|
||||
# nice cut
|
||||
name = '%s ...' % ', '.join(name.split(', ')[:3])
|
||||
# if not enough, hard cut
|
||||
if len(name) > 120:
|
||||
name = '%s ...' % old_re[1][:120]
|
||||
res.append((old_re[0], name))
|
||||
return res
|
||||
|
||||
def _reverse_moves(self, default_values_list=None, cancel=False):
|
||||
reverse_moves = super()._reverse_moves(
|
||||
default_values_list=default_values_list, cancel=cancel)
|
||||
# In the simple scenario 1 invoice -> 1 refund, we add a message in the chatter
|
||||
# of the invoice and in the chatter of the refund
|
||||
if len(self) == 1 and len(reverse_moves) == 1:
|
||||
self.message_post(body=_("A reverse journal entry <a href=# data-oe-model=account.move data-oe-id=%d>%s</a> has been generated.") % (reverse_moves.id, reverse_moves.display_name))
|
||||
reverse_moves.message_post(body=_("This journal entry has been generated as the reverse of <a href=# data-oe-model=account.move data-oe-id=%d>%s</a>.") % (self.id, self.display_name))
|
||||
return reverse_moves
|
||||
|
||||
def delete_lines_qty_zero(self):
|
||||
lines = self.env['account.move.line'].search([
|
||||
('display_type', '=', 'product'),
|
||||
('move_id', 'in', self.ids),
|
||||
('quantity', '=', 0)])
|
||||
lines.unlink()
|
||||
return True
|
||||
|
||||
# for report
|
||||
def py3o_lines_layout(self):
|
||||
self.ensure_one()
|
||||
res = []
|
||||
has_sections = False
|
||||
subtotal = 0.0
|
||||
sign = self.move_type == 'out_refund' and -1 or 1
|
||||
# Warning: the order of invoice line is forced in the view
|
||||
# <tree editable="bottom" default_order="sequence, date desc, move_name desc, id"
|
||||
# it's not the same as the _order in the class AccountMoveLine
|
||||
lines = self.env['account.move.line'].search([('display_type', 'in', ('product', 'line_section', 'line_note')), ('move_id', '=', self.id)], order="sequence, date desc, move_name desc, id")
|
||||
for line in lines:
|
||||
if line.display_type == 'line_section':
|
||||
# insert line
|
||||
if has_sections:
|
||||
res.append({'subtotal': subtotal})
|
||||
subtotal = 0.0 # reset counter
|
||||
has_sections = True
|
||||
else:
|
||||
if line.display_type == 'product':
|
||||
subtotal += line.price_subtotal * sign
|
||||
res.append({'line': line})
|
||||
if has_sections: # insert last subtotal line
|
||||
res.append({'subtotal': subtotal})
|
||||
# res:
|
||||
# [
|
||||
# {'line': account_invoice_line(1) with display_type=='line_section'},
|
||||
# {'line': account_invoice_line(2) with display_type=='product'},
|
||||
# {'line': account_invoice_line(3) with display_type=='product'},
|
||||
# {'line': account_invoice_line(4) with display_type=='line_note'},
|
||||
# {'subtotal': 8932.23},
|
||||
# ]
|
||||
return res
|
||||
|
||||
def _compute_sales_dates(self):
|
||||
""" French law requires to set sale order dates into invoice
|
||||
returned string: "sale1 (date1), sale2 (date2) ..."
|
||||
"""
|
||||
for move in self:
|
||||
sales = move.invoice_line_ids.mapped(
|
||||
'sale_line_ids').mapped('order_id')
|
||||
dates = ["%s (%s)" % (
|
||||
x.name, format_date(move.env, x.date_order))
|
||||
for x in sales]
|
||||
move.sale_dates = ", ".join(dates)
|
||||
|
||||
# allow to manually create moves not only in general journals,
|
||||
# but also in cash journal and check journals (= bank journals not linked to a bank account)
|
||||
@api.depends('company_id', 'invoice_filter_type_domain')
|
||||
def _compute_suitable_journal_ids(self):
|
||||
for move in self:
|
||||
if move.invoice_filter_type_domain:
|
||||
super(AccountMove, move)._compute_suitable_journal_ids()
|
||||
else:
|
||||
company_id = move.company_id.id or self.env.company.id
|
||||
domain = expression.AND([
|
||||
[('company_id', '=', company_id)],
|
||||
expression.OR([
|
||||
[('type', 'in', ('general', 'cash'))],
|
||||
[('type', '=', 'bank'), ('bank_account_id', '=', False)]
|
||||
])
|
||||
])
|
||||
move.suitable_journal_ids = self.env['account.journal'].search(domain)
|
||||
|
||||
def button_draft(self):
|
||||
# Delete attached pdf invoice
|
||||
for move in self.filtered(lambda x: x.move_type in ('out_invoice', 'out_refund')):
|
||||
for report_xmlid in ('account.account_invoices', 'account.account_invoices_without_payment'):
|
||||
report = self.env.ref(report_xmlid)
|
||||
attach = report.retrieve_attachment(move)
|
||||
if attach:
|
||||
attach.unlink()
|
||||
super().button_draft()
|
||||
|
||||
def _get_accounting_date(self, invoice_date, has_tax):
|
||||
# On vendor bills/refunds, we want date = invoice_date unless
|
||||
# we have a company tax_lock_date and the invoice has taxes
|
||||
# and invoice_date <= tax_lock_date
|
||||
date = super()._get_accounting_date(invoice_date, has_tax)
|
||||
if self.is_purchase_document(include_receipts=True):
|
||||
tax_lock_date = self.company_id.tax_lock_date
|
||||
if invoice_date and tax_lock_date and has_tax and invoice_date <= tax_lock_date:
|
||||
invoice_date = tax_lock_date + timedelta(days=1)
|
||||
date = invoice_date
|
||||
return date
|
||||
|
||||
|
||||
class AccountMoveLine(models.Model):
|
||||
_inherit = 'account.move.line'
|
||||
# Native order:
|
||||
# _order = "date desc, move_name desc, id"
|
||||
# Problem: when you manually create a journal entry, the
|
||||
# order of the lines is inverted when you save ! It is quite annoying for
|
||||
# the user...
|
||||
_order = "date desc, id asc"
|
||||
|
||||
# In the 'account' module, we have related stored field for:
|
||||
# name (move_name), date, ref, state (parent_state),
|
||||
# journal_id, company_id, payment_id, statement_line_id,
|
||||
account_reconcile = fields.Boolean(related='account_id.reconcile')
|
||||
full_reconcile_id = fields.Many2one(string='Full Reconcile')
|
||||
matched_debit_ids = fields.One2many(string='Partial Reconcile Debit')
|
||||
matched_credit_ids = fields.One2many(string='Partial Reconcile Credit')
|
||||
# for optional display in tree view
|
||||
product_barcode = fields.Char(related='product_id.barcode', string="Product Barcode")
|
||||
|
||||
def show_account_move_form(self):
|
||||
self.ensure_one()
|
||||
action = self.env["ir.actions.actions"]._for_xml_id(
|
||||
'account.action_move_line_form')
|
||||
action.update({
|
||||
'res_id': self.move_id.id,
|
||||
'view_id': False,
|
||||
'views': False,
|
||||
'view_mode': 'form,tree',
|
||||
})
|
||||
return action
|
||||
|
||||
def update_matching_number(self):
|
||||
records = self.search([("matching_number", "=", "P")])
|
||||
_logger.info(f"Update partial reconcile number for {len(records)} lines")
|
||||
records._compute_matching_number()
|
||||
|
||||
# def _compute_matching_number(self):
|
||||
# TODO maybe it will be better to have the same maching_number for
|
||||
# all partial so it will be easier to group by
|
||||
# super()._compute_matching_number()
|
||||
# for record in self:
|
||||
# if record.matching_number == "P":
|
||||
# record.matching_number = ", ".join([
|
||||
# "a%d" % pr.id
|
||||
# for pr in record.matched_debit_ids + record.matched_credit_ids
|
||||
# ])
|
||||
|
||||
def _compute_name(self):
|
||||
# This is useful when you want to have the product code in a dedicated
|
||||
# column in your customer invoice report
|
||||
# The same ir.config_parameter is used in sale_usability,
|
||||
# purchase_usability and account_usability
|
||||
no_product_code_param = self.env['ir.config_parameter'].sudo().get_param(
|
||||
'usability.line_name_no_product_code')
|
||||
if no_product_code_param and no_product_code_param == 'True':
|
||||
self = self.with_context(display_default_code=False)
|
||||
return super()._compute_name()
|
||||
|
||||
def reconcile(self):
|
||||
"""Explicit error message if unposted lines"""
|
||||
unposted_ids = self.filtered(lambda l: l.move_id.state != "posted")
|
||||
if unposted_ids:
|
||||
m = _("Please post the following entries before reconciliation :")
|
||||
sep = "\n - "
|
||||
unpost = sep.join([am.display_name for am in unposted_ids.move_id])
|
||||
raise UserError(m + sep + unpost)
|
||||
|
||||
return super().reconcile()
|
||||
@@ -0,0 +1,23 @@
|
||||
# Copyright 2015-2022 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import models
|
||||
from odoo.tools.misc import formatLang
|
||||
|
||||
|
||||
class AccountPartialReconcile(models.Model):
|
||||
_inherit = "account.partial.reconcile"
|
||||
_rec_name = "id"
|
||||
|
||||
def name_get(self):
|
||||
res = []
|
||||
for rec in self:
|
||||
# There is no seq for partial rec, so I simulate one with the ID
|
||||
# Prefix for full rec: 'A' (upper case)
|
||||
# Prefix for partial rec: 'a' (lower case)
|
||||
amount_fmt = formatLang(
|
||||
self.env, rec.amount, currency_obj=rec.company_currency_id)
|
||||
name = 'a%d (%s)' % (rec.id, amount_fmt)
|
||||
res.append((rec.id, name))
|
||||
return res
|
||||
45
account_usability_akretion/models/product.py
Normal file
45
account_usability_akretion/models/product.py
Normal file
@@ -0,0 +1,45 @@
|
||||
# Copyright 2015-2021 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
|
||||
|
||||
class ProductTemplate(models.Model):
|
||||
_inherit = 'product.template'
|
||||
|
||||
# DON'T put store=True on those fields, because they are company dependent
|
||||
sale_price_type = fields.Selection(
|
||||
'_sale_purchase_price_type_sel', compute='_compute_sale_price_type',
|
||||
string='Sale Price Type', compute_sudo=False, readonly=True)
|
||||
purchase_price_type = fields.Selection(
|
||||
'_sale_purchase_price_type_sel', compute='_compute_purchase_price_type',
|
||||
string='Purchase Price Type', compute_sudo=False, readonly=True)
|
||||
|
||||
@api.model
|
||||
def _sale_purchase_price_type_sel(self):
|
||||
return [('incl', _('Tax incl.')), ('excl', _('Tax excl.'))]
|
||||
|
||||
@api.depends('taxes_id')
|
||||
def _compute_sale_price_type(self):
|
||||
for pt in self:
|
||||
sale_price_type = 'incl'
|
||||
if pt.taxes_id and all([not t.price_include for t in pt.taxes_id if t.amount_type == 'percent']):
|
||||
sale_price_type = 'excl'
|
||||
pt.sale_price_type = sale_price_type
|
||||
|
||||
@api.depends('supplier_taxes_id')
|
||||
def _compute_purchase_price_type(self):
|
||||
for pt in self:
|
||||
purchase_price_type = 'incl'
|
||||
if pt.supplier_taxes_id and all([not t.price_include for t in pt.supplier_taxes_id if t.amount_type == 'percent']):
|
||||
purchase_price_type = 'excl'
|
||||
pt.purchase_price_type = purchase_price_type
|
||||
|
||||
|
||||
class ProductSupplierinfo(models.Model):
|
||||
_inherit = 'product.supplierinfo'
|
||||
|
||||
# DON'T put store=True on those fields, because they are company dependent
|
||||
purchase_price_type = fields.Selection(
|
||||
related='product_tmpl_id.purchase_price_type', related_sudo=False)
|
||||
21
account_usability_akretion/models/res_company.py
Normal file
21
account_usability_akretion/models/res_company.py
Normal file
@@ -0,0 +1,21 @@
|
||||
# Copyright 2021 Akretion France (https://akretion.com/)
|
||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ResCompany(models.Model):
|
||||
_inherit = 'res.company'
|
||||
|
||||
# There is a native field invoice_terms which is displayed on res.config.settings
|
||||
# when the ir.config_parameter account.use_invoice_terms is True
|
||||
# But there are several problems with this native field:
|
||||
# - it is copied on the 'narration' field of account.move => we don't want that
|
||||
# - the text block is very small on the form view of res.config.settings
|
||||
# So I decided to have our own field "fixed_invoice_terms"
|
||||
# The native field can still be used when you need to customise some
|
||||
# terms and conditions on each invoice (not very common, but...)
|
||||
# To underline this different with the native field, I prefix it with 'static_'
|
||||
static_invoice_terms = fields.Text(
|
||||
translate=True, string="Legal Terms on Invoice")
|
||||
12
account_usability_akretion/models/res_partner.py
Normal file
12
account_usability_akretion/models/res_partner.py
Normal file
@@ -0,0 +1,12 @@
|
||||
# Copyright 2017-2022 Akretion France (https://akretion.com/)
|
||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ResPartner(models.Model):
|
||||
_inherit = 'res.partner'
|
||||
|
||||
invoice_warn = fields.Selection(tracking=True)
|
||||
property_account_position_id = fields.Many2one(tracking=True)
|
||||
21
account_usability_akretion/models/res_partner_bank.py
Normal file
21
account_usability_akretion/models/res_partner_bank.py
Normal file
@@ -0,0 +1,21 @@
|
||||
# Copyright 2015-2022 Akretion France (http://www.akretion.com/)
|
||||
# @author: Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import models
|
||||
|
||||
|
||||
class ResPartnerBank(models.Model):
|
||||
_inherit = 'res.partner.bank'
|
||||
|
||||
def name_get(self):
|
||||
res = []
|
||||
for acc in self:
|
||||
name = acc.acc_number
|
||||
if acc.currency_id:
|
||||
name = "%s (%s)" % (name, acc.currency_id.name)
|
||||
if acc.bank_id.name:
|
||||
name = "%s - %s" % (name, acc.bank_id.name)
|
||||
res += [(acc.id, name)]
|
||||
return res
|
||||
|
||||
2
account_usability_akretion/readme/CONTRIBUTORS.rst
Normal file
2
account_usability_akretion/readme/CONTRIBUTORS.rst
Normal file
@@ -0,0 +1,2 @@
|
||||
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
* David Beal <david.beal@akretion.com>
|
||||
39
account_usability_akretion/readme/DESCRIPTION.rst
Normal file
39
account_usability_akretion/readme/DESCRIPTION.rst
Normal file
@@ -0,0 +1,39 @@
|
||||
This modules adds the following functions:
|
||||
|
||||
* Add an *Overdue* filter on invoice search view (this feature was previously
|
||||
located in te module *account_invoice_overdue_filter*)
|
||||
* Increase the default limit of 80 lines in account move and account move line view.
|
||||
* disable reconciliation "guessing"
|
||||
* fast search on *Reconcile Ref* for account move line.
|
||||
* add sale dates to invoice report to be compliant with
|
||||
https://www.service-public.fr/professionnels-entreprises/vosdroits/F31808
|
||||
* Sale date on qweb invoices
|
||||
* A wizard to mark several invoices as sent at once (forward from v8)
|
||||
* Default date for Account Move Reversal is now D+1 instead of today
|
||||
* Track more fields on invoice (see details in account.py)
|
||||
* Add boolean fields `has_discount` and `has_attachment` on invoice
|
||||
* Add button "Delete line qty = 0" on supplier invoice
|
||||
* Cut name_get() of invoice if too long
|
||||
* A script for if Odoo screws up invoice attachment filename
|
||||
* help functions for py3o reports
|
||||
* Show code on name_get of journal
|
||||
* add direct search of journal using code
|
||||
* add copy=False on some fields
|
||||
* Add unicity constraint on analytic codes per company
|
||||
* Better default values on account move
|
||||
* Add link from account move line to invoice
|
||||
* Add start_date and end_date on bank statements
|
||||
* Add transfer_account_id to invoicing config page
|
||||
* Improve domain reconciliation widget
|
||||
* account.reconcile.model don't copy name to label via onchange
|
||||
* Add method to get fiscal position without partner_id
|
||||
* Restore drill-through on sale and invoice reports
|
||||
* don't attach PDF upon invoice report generation on supplier invoices/refunds
|
||||
* Add filter on debit and credit amount for Move Lines
|
||||
* Add supplier invoice number in invoice tree view
|
||||
|
||||
Together with this module, I recommend the use of the following modules:
|
||||
|
||||
* account_invoice_supplier_ref_unique (OCA project account-invoicing)
|
||||
* account_move_line_no_default_search (OCA project account-financial-tools)
|
||||
* invoice_fiscal_position_update (OCA project account-invoicing)
|
||||
10
account_usability_akretion/report/invoice_report.xml
Normal file
10
account_usability_akretion/report/invoice_report.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<template id="report_invoice_document" inherit_id="account.report_invoice_document">
|
||||
<xpath expr="//div[@name='origin']/p" position="replace">
|
||||
<p class="m-0" t-field="o.sale_dates"/>
|
||||
</xpath>
|
||||
</template>
|
||||
|
||||
</odoo>
|
||||
3
account_usability_akretion/security/ir.model.access.csv
Normal file
3
account_usability_akretion/security/ir.model.access.csv
Normal file
@@ -0,0 +1,3 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_account_group_generate_full,Full access on account.group.generate,model_account_group_generate,account.group_account_manager,1,1,1,1
|
||||
access_account_invoice_mark_sent_full,Full access on account.invoice.mark.sent,model_account_invoice_mark_sent,account.group_account_invoice,1,1,1,1
|
||||
|
BIN
account_usability_akretion/static/description/icon.png
Normal file
BIN
account_usability_akretion/static/description/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.5 KiB |
454
account_usability_akretion/static/description/index.html
Normal file
454
account_usability_akretion/static/description/index.html
Normal file
@@ -0,0 +1,454 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
|
||||
<title>Account Usability</title>
|
||||
<style type="text/css">
|
||||
|
||||
/*
|
||||
:Author: David Goodger (goodger@python.org)
|
||||
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
|
||||
:Copyright: This stylesheet has been placed in the public domain.
|
||||
|
||||
Default cascading style sheet for the HTML output of Docutils.
|
||||
|
||||
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
|
||||
customize this style sheet.
|
||||
*/
|
||||
|
||||
/* used to remove borders from tables and images */
|
||||
.borderless, table.borderless td, table.borderless th {
|
||||
border: 0 }
|
||||
|
||||
table.borderless td, table.borderless th {
|
||||
/* Override padding for "table.docutils td" with "! important".
|
||||
The right padding separates the table cells. */
|
||||
padding: 0 0.5em 0 0 ! important }
|
||||
|
||||
.first {
|
||||
/* Override more specific margin styles with "! important". */
|
||||
margin-top: 0 ! important }
|
||||
|
||||
.last, .with-subtitle {
|
||||
margin-bottom: 0 ! important }
|
||||
|
||||
.hidden {
|
||||
display: none }
|
||||
|
||||
.subscript {
|
||||
vertical-align: sub;
|
||||
font-size: smaller }
|
||||
|
||||
.superscript {
|
||||
vertical-align: super;
|
||||
font-size: smaller }
|
||||
|
||||
a.toc-backref {
|
||||
text-decoration: none ;
|
||||
color: black }
|
||||
|
||||
blockquote.epigraph {
|
||||
margin: 2em 5em ; }
|
||||
|
||||
dl.docutils dd {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||||
dl.docutils dt {
|
||||
font-weight: bold }
|
||||
*/
|
||||
|
||||
div.abstract {
|
||||
margin: 2em 5em }
|
||||
|
||||
div.abstract p.topic-title {
|
||||
font-weight: bold ;
|
||||
text-align: center }
|
||||
|
||||
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||
div.hint, div.important, div.note, div.tip, div.warning {
|
||||
margin: 2em ;
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||
div.important p.admonition-title, div.note p.admonition-title,
|
||||
div.tip p.admonition-title {
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||
div.danger p.admonition-title, div.error p.admonition-title,
|
||||
div.warning p.admonition-title, .code .error {
|
||||
color: red ;
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||||
compound paragraphs.
|
||||
div.compound .compound-first, div.compound .compound-middle {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
div.compound .compound-last, div.compound .compound-middle {
|
||||
margin-top: 0.5em }
|
||||
*/
|
||||
|
||||
div.dedication {
|
||||
margin: 2em 5em ;
|
||||
text-align: center ;
|
||||
font-style: italic }
|
||||
|
||||
div.dedication p.topic-title {
|
||||
font-weight: bold ;
|
||||
font-style: normal }
|
||||
|
||||
div.figure {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
div.footer, div.header {
|
||||
clear: both;
|
||||
font-size: smaller }
|
||||
|
||||
div.line-block {
|
||||
display: block ;
|
||||
margin-top: 1em ;
|
||||
margin-bottom: 1em }
|
||||
|
||||
div.line-block div.line-block {
|
||||
margin-top: 0 ;
|
||||
margin-bottom: 0 ;
|
||||
margin-left: 1.5em }
|
||||
|
||||
div.sidebar {
|
||||
margin: 0 0 0.5em 1em ;
|
||||
border: medium outset ;
|
||||
padding: 1em ;
|
||||
background-color: #ffffee ;
|
||||
width: 40% ;
|
||||
float: right ;
|
||||
clear: right }
|
||||
|
||||
div.sidebar p.rubric {
|
||||
font-family: sans-serif ;
|
||||
font-size: medium }
|
||||
|
||||
div.system-messages {
|
||||
margin: 5em }
|
||||
|
||||
div.system-messages h1 {
|
||||
color: red }
|
||||
|
||||
div.system-message {
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.system-message p.system-message-title {
|
||||
color: red ;
|
||||
font-weight: bold }
|
||||
|
||||
div.topic {
|
||||
margin: 2em }
|
||||
|
||||
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||||
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||||
margin-top: 0.4em }
|
||||
|
||||
h1.title {
|
||||
text-align: center }
|
||||
|
||||
h2.subtitle {
|
||||
text-align: center }
|
||||
|
||||
hr.docutils {
|
||||
width: 75% }
|
||||
|
||||
img.align-left, .figure.align-left, object.align-left, table.align-left {
|
||||
clear: left ;
|
||||
float: left ;
|
||||
margin-right: 1em }
|
||||
|
||||
img.align-right, .figure.align-right, object.align-right, table.align-right {
|
||||
clear: right ;
|
||||
float: right ;
|
||||
margin-left: 1em }
|
||||
|
||||
img.align-center, .figure.align-center, object.align-center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
table.align-center {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.align-left {
|
||||
text-align: left }
|
||||
|
||||
.align-center {
|
||||
clear: both ;
|
||||
text-align: center }
|
||||
|
||||
.align-right {
|
||||
text-align: right }
|
||||
|
||||
/* reset inner alignment in figures */
|
||||
div.align-right {
|
||||
text-align: inherit }
|
||||
|
||||
/* div.align-center * { */
|
||||
/* text-align: left } */
|
||||
|
||||
.align-top {
|
||||
vertical-align: top }
|
||||
|
||||
.align-middle {
|
||||
vertical-align: middle }
|
||||
|
||||
.align-bottom {
|
||||
vertical-align: bottom }
|
||||
|
||||
ol.simple, ul.simple {
|
||||
margin-bottom: 1em }
|
||||
|
||||
ol.arabic {
|
||||
list-style: decimal }
|
||||
|
||||
ol.loweralpha {
|
||||
list-style: lower-alpha }
|
||||
|
||||
ol.upperalpha {
|
||||
list-style: upper-alpha }
|
||||
|
||||
ol.lowerroman {
|
||||
list-style: lower-roman }
|
||||
|
||||
ol.upperroman {
|
||||
list-style: upper-roman }
|
||||
|
||||
p.attribution {
|
||||
text-align: right ;
|
||||
margin-left: 50% }
|
||||
|
||||
p.caption {
|
||||
font-style: italic }
|
||||
|
||||
p.credits {
|
||||
font-style: italic ;
|
||||
font-size: smaller }
|
||||
|
||||
p.label {
|
||||
white-space: nowrap }
|
||||
|
||||
p.rubric {
|
||||
font-weight: bold ;
|
||||
font-size: larger ;
|
||||
color: maroon ;
|
||||
text-align: center }
|
||||
|
||||
p.sidebar-title {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold ;
|
||||
font-size: larger }
|
||||
|
||||
p.sidebar-subtitle {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
p.topic-title {
|
||||
font-weight: bold }
|
||||
|
||||
pre.address {
|
||||
margin-bottom: 0 ;
|
||||
margin-top: 0 ;
|
||||
font: inherit }
|
||||
|
||||
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
pre.code .ln { color: grey; } /* line numbers */
|
||||
pre.code, code { background-color: #eeeeee }
|
||||
pre.code .comment, code .comment { color: #5C6576 }
|
||||
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||||
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
||||
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
||||
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
||||
pre.code .inserted, code .inserted { background-color: #A3D289}
|
||||
|
||||
span.classifier {
|
||||
font-family: sans-serif ;
|
||||
font-style: oblique }
|
||||
|
||||
span.classifier-delimiter {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
span.interpreted {
|
||||
font-family: sans-serif }
|
||||
|
||||
span.option {
|
||||
white-space: nowrap }
|
||||
|
||||
span.pre {
|
||||
white-space: pre }
|
||||
|
||||
span.problematic {
|
||||
color: red }
|
||||
|
||||
span.section-subtitle {
|
||||
/* font-size relative to parent (h1..h6 element) */
|
||||
font-size: 80% }
|
||||
|
||||
table.citation {
|
||||
border-left: solid 1px gray;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docinfo {
|
||||
margin: 2em 4em }
|
||||
|
||||
table.docutils {
|
||||
margin-top: 0.5em ;
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
table.footnote {
|
||||
border-left: solid 1px black;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docutils td, table.docutils th,
|
||||
table.docinfo td, table.docinfo th {
|
||||
padding-left: 0.5em ;
|
||||
padding-right: 0.5em ;
|
||||
vertical-align: top }
|
||||
|
||||
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||
font-weight: bold ;
|
||||
text-align: left ;
|
||||
white-space: nowrap ;
|
||||
padding-left: 0 }
|
||||
|
||||
/* "booktabs" style (no vertical lines) */
|
||||
table.docutils.booktabs {
|
||||
border: 0px;
|
||||
border-top: 2px solid;
|
||||
border-bottom: 2px solid;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.docutils.booktabs * {
|
||||
border: 0px;
|
||||
}
|
||||
table.docutils.booktabs th {
|
||||
border-bottom: thin solid;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||
font-size: 100% }
|
||||
|
||||
ul.auto-toc {
|
||||
list-style-type: none }
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="document" id="account-usability">
|
||||
<h1 class="title">Account Usability</h1>
|
||||
|
||||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! This file is generated by oca-gen-addon-readme !!
|
||||
!! changes will be overwritten. !!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/akretion/odoo-usability/tree/12.0/account_usability"><img alt="akretion/odoo-usability" src="https://img.shields.io/badge/github-akretion%2Fodoo--usability-lightgray.png?logo=github" /></a></p>
|
||||
<p>This modules adds the following functions:</p>
|
||||
<ul class="simple">
|
||||
<li>Add an <em>Overdue</em> filter on invoice search view (this feature was previously
|
||||
located in te module <em>account_invoice_overdue_filter</em>)</li>
|
||||
<li>Increase the default limit of 80 lines in account move and account move line view.</li>
|
||||
<li>disable reconciliation “guessing”</li>
|
||||
<li>fast search on <em>Reconcile Ref</em> for account move line.</li>
|
||||
<li>add sale dates to invoice report to be compliant with
|
||||
<a class="reference external" href="https://www.service-public.fr/professionnels-entreprises/vosdroits/F31808">https://www.service-public.fr/professionnels-entreprises/vosdroits/F31808</a></li>
|
||||
<li>Sale date on qweb invoices</li>
|
||||
<li>A wizard to mark several invoices as sent at once (forward from v8)</li>
|
||||
<li>Default date for Account Move Reversal is now D+1 instead of today</li>
|
||||
<li>Track more fields on invoice (see details in account.py)</li>
|
||||
<li>Add boolean fields <cite>has_discount</cite> and <cite>has_attachment</cite> on invoice</li>
|
||||
<li>Add button “Delete line qty = 0” on supplier invoice</li>
|
||||
<li>Cut name_get() of invoice if too long</li>
|
||||
<li>A script for if Odoo screws up invoice attachment filename</li>
|
||||
<li>help functions for py3o reports</li>
|
||||
<li>Show code on name_get of journal</li>
|
||||
<li>add direct search of journal using code</li>
|
||||
<li>add copy=False on some fields</li>
|
||||
<li>Add unicity constraint on analytic codes per company</li>
|
||||
<li>Better default values on account move</li>
|
||||
<li>Add link from account move line to invoice</li>
|
||||
<li>Add start_date and end_date on bank statements</li>
|
||||
<li>Add transfer_account_id to invoicing config page</li>
|
||||
<li>Improve domain reconciliation widget</li>
|
||||
<li>account.reconcile.model don’t copy name to label via onchange</li>
|
||||
<li>Add method to get fiscal position without partner_id</li>
|
||||
<li>Restore drill-through on sale and invoice reports</li>
|
||||
<li>don’t attach PDF upon invoice report generation on supplier invoices/refunds</li>
|
||||
<li>Add filter on debit and credit amount for Move Lines</li>
|
||||
<li>Add supplier invoice number in invoice tree view</li>
|
||||
</ul>
|
||||
<p>Together with this module, I recommend the use of the following modules:</p>
|
||||
<ul class="simple">
|
||||
<li>account_invoice_supplier_ref_unique (OCA project account-invoicing)</li>
|
||||
<li>account_move_line_no_default_search (OCA project account-financial-tools)</li>
|
||||
<li>invoice_fiscal_position_update (OCA project account-invoicing)</li>
|
||||
</ul>
|
||||
<p><strong>Table of contents</strong></p>
|
||||
<div class="contents local topic" id="contents">
|
||||
<ul class="simple">
|
||||
<li><a class="reference internal" href="#bug-tracker" id="id1">Bug Tracker</a></li>
|
||||
<li><a class="reference internal" href="#credits" id="id2">Credits</a><ul>
|
||||
<li><a class="reference internal" href="#authors" id="id3">Authors</a></li>
|
||||
<li><a class="reference internal" href="#contributors" id="id4">Contributors</a></li>
|
||||
<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="bug-tracker">
|
||||
<h1><a class="toc-backref" href="#id1">Bug Tracker</a></h1>
|
||||
<p>Bugs are tracked on <a class="reference external" href="https://github.com/akretion/odoo-usability/issues">GitHub Issues</a>.
|
||||
In case of trouble, please check there if your issue has already been reported.
|
||||
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||
<a class="reference external" href="https://github.com/akretion/odoo-usability/issues/new?body=module:%20account_usability%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||||
</div>
|
||||
<div class="section" id="credits">
|
||||
<h1><a class="toc-backref" href="#id2">Credits</a></h1>
|
||||
<div class="section" id="authors">
|
||||
<h2><a class="toc-backref" href="#id3">Authors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Akretion</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="contributors">
|
||||
<h2><a class="toc-backref" href="#id4">Contributors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Alexis de Lattre <<a class="reference external" href="mailto:alexis.delattre@akretion.com">alexis.delattre@akretion.com</a>></li>
|
||||
<li>David Beal <<a class="reference external" href="mailto:david.beal@akretion.com">david.beal@akretion.com</a>></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="maintainers">
|
||||
<h2><a class="toc-backref" href="#id5">Maintainers</a></h2>
|
||||
<p>This module is part of the <a class="reference external" href="https://github.com/akretion/odoo-usability/tree/12.0/account_usability">akretion/odoo-usability</a> project on GitHub.</p>
|
||||
<p>You are welcome to contribute.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2022 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<templates id="template" xml:space="preserve">
|
||||
|
||||
<!-- Requires https://github.com/odoo/odoo/pull/84180 -->
|
||||
<t t-extend="ShowPaymentInfo" >
|
||||
<t t-jquery="td:first" t-operation="after">
|
||||
<td style="max-width: 25em;" id="outstanding-date">
|
||||
<div class="oe_form_field" style="margin-right: 5px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;"><t t-esc="line.date"></t></div>
|
||||
</td>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
38
account_usability_akretion/views/account_account.xml
Normal file
38
account_usability_akretion/views/account_account.xml
Normal file
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2015-2022 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
|
||||
<record id="view_account_form" model="ir.ui.view">
|
||||
<field name="name">account.account.form</field>
|
||||
<field name="model">account.account</field>
|
||||
<field name="inherit_id" ref="account.view_account_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="deprecated" position="before">
|
||||
<field name="reconcile" attrs="{'invisible': ['|', ('account_type', 'in', ('asset_cash', 'liability_credit_card')), ('internal_group', '=', 'off_balance')]}" widget="boolean_toggle"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="view_account_search" model="ir.ui.view">
|
||||
<field name="name">account.account.search</field>
|
||||
<field name="model">account.account</field>
|
||||
<field name="inherit_id" ref="account.view_account_search"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="name" position="after">
|
||||
<field name="code" filter_domain="[('code', '=like', self + '%')]" string="Code"/>
|
||||
</field>
|
||||
<filter name="accounttype" position="after">
|
||||
<filter name="group_groupby" string="Group" context="{'group_by': 'group_id'}"/>
|
||||
</filter>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
</odoo>
|
||||
22
account_usability_akretion/views/account_analytic_line.xml
Normal file
22
account_usability_akretion/views/account_analytic_line.xml
Normal file
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2024 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
|
||||
<record id="view_account_analytic_line_tree_inherit_account" model="ir.ui.view">
|
||||
<field name="model">account.analytic.line</field>
|
||||
<field name="inherit_id" ref="account.view_account_analytic_line_tree_inherit_account"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="general_account_id" position="attributes">
|
||||
<attribute name="optional">show</attribute>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
</odoo>
|
||||
123
account_usability_akretion/views/account_bank_statement.xml
Normal file
123
account_usability_akretion/views/account_bank_statement.xml
Normal file
@@ -0,0 +1,123 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2015-2020 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
|
||||
<record id="view_bank_statement_form" model="ir.ui.view">
|
||||
<field name="name">usability.account.bank.statement.form</field>
|
||||
<field name="model">account.bank.statement</field>
|
||||
<field name="inherit_id" ref="account.view_bank_statement_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<button name="button_reopen" position="after">
|
||||
<button
|
||||
name="button_undo_reconciliation"
|
||||
type="object"
|
||||
confirm="Are you sure to unreconcile all the entries of the bank statement?"
|
||||
states="open"
|
||||
string="Unreconcile All"/>
|
||||
</button>
|
||||
<xpath expr="//field[@name='line_ids']/tree/button[@name='button_undo_reconciliation']" position="after">
|
||||
<field name="move_id" invisible="1"/>
|
||||
<button name="show_account_move" type="object"
|
||||
title="View Journal Entry" icon="fa-arrow-right"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='balance_end_real']/.." position="after">
|
||||
<field name="start_date"/>
|
||||
<field name="end_date"/>
|
||||
<field name="hide_bank_statement_balance" invisible="1"/>
|
||||
<field name="line_count"/>
|
||||
</xpath>
|
||||
<field name="date" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</field>
|
||||
<field name="journal_id" position="attributes">
|
||||
<attribute name="widget"></attribute>
|
||||
</field>
|
||||
<label for="balance_start" position="attributes">
|
||||
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
|
||||
</label>
|
||||
<label for="balance_end_real" position="attributes">
|
||||
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
|
||||
</label>
|
||||
<xpath expr="//field[@name='balance_start']/.." position="attributes">
|
||||
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='balance_end_real']/.." position="attributes">
|
||||
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
|
||||
</xpath>
|
||||
<group name="sale_total" position="attributes">
|
||||
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
|
||||
</group>
|
||||
<div role="alert" position="attributes">
|
||||
<attribute name="attrs">{'invisible': ['|', '|', ('hide_bank_statement_balance', '=', True), ('previous_statement_id', '=', False), ('is_valid_balance_start', '=', True)]}</attribute>
|
||||
</div>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_bank_statement_tree" model="ir.ui.view">
|
||||
<field name="name">usability.account.bank.statement.tree</field>
|
||||
<field name="model">account.bank.statement</field>
|
||||
<field name="inherit_id" ref="account.view_bank_statement_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<tree position="attributes">
|
||||
<!-- Remove is_difference_zero condition for colors -->
|
||||
<attribute name="decoration-danger"></attribute>
|
||||
<attribute name="decoration-info">state == 'open'</attribute>
|
||||
</tree>
|
||||
<field name="date" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</field>
|
||||
<field name="journal_id" position="after">
|
||||
<field name="start_date"/>
|
||||
<field name="end_date"/>
|
||||
<field name="line_count" optional="show"/>
|
||||
</field>
|
||||
<field name="balance_start" position="attributes">
|
||||
<attribute name="optional">show</attribute>
|
||||
</field>
|
||||
<field name="balance_end_real" position="attributes">
|
||||
<attribute name="optional">show</attribute>
|
||||
</field>
|
||||
<field name="state" position="attributes">
|
||||
<attribute name="widget">badge</attribute>
|
||||
<attribute name="decoration-info">state == 'open'</attribute>
|
||||
<attribute name="decoration-warning">state == 'posted'</attribute>
|
||||
<attribute name="decoration-success">state == 'confirm'</attribute>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_bank_statement_search" model="ir.ui.view">
|
||||
<field name="name">usability.account.bank.statement.search</field>
|
||||
<field name="model">account.bank.statement</field>
|
||||
<field name="inherit_id" ref="account.view_bank_statement_search"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="date" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</field>
|
||||
<filter name="filter_date" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</filter>
|
||||
<filter name="date" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</filter>
|
||||
<field name="date" position="after">
|
||||
<field name="start_date"/>
|
||||
<field name="end_date"/>
|
||||
</field>
|
||||
<filter name="date" position="after">
|
||||
<filter name="start_date_groupby" string="Start Date"
|
||||
context="{'group_by': 'start_date'}"/>
|
||||
<filter name="end_date_groupby" string="End Date"
|
||||
context="{'group_by': 'end_date'}"/>
|
||||
</filter>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
</odoo>
|
||||
32
account_usability_akretion/views/account_group.xml
Normal file
32
account_usability_akretion/views/account_group.xml
Normal file
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2021-2022 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
|
||||
<record id="view_account_group_form" model="ir.ui.view">
|
||||
<field name="model">account.group</field>
|
||||
<field name="inherit_id" ref="account.view_account_group_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="name" position="after">
|
||||
<field name="parent_id"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_account_group_tree" model="ir.ui.view">
|
||||
<field name="model">account.group</field>
|
||||
<field name="inherit_id" ref="account.view_account_group_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="name" position="after">
|
||||
<field name="parent_id" optional="show"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
</odoo>
|
||||
59
account_usability_akretion/views/account_invoice_report.xml
Normal file
59
account_usability_akretion/views/account_invoice_report.xml
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2018-2024 Akretion (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
|
||||
<record id="account_invoice_report_view_tree" model="ir.ui.view">
|
||||
<field name="name">usability.account.invoice.report.tree</field>
|
||||
<field name="model">account.invoice.report</field>
|
||||
<field name="inherit_id" ref="account.account_invoice_report_view_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="partner_id" position="after">
|
||||
<field name="commercial_partner_id" optional="hide"/>
|
||||
<field name="country_id" optional="hide"/>
|
||||
<field name="industry_id" optional="hide"/>
|
||||
<field name="fiscal_position_id" optional="hide"/>
|
||||
</field>
|
||||
<field name="quantity" position="after">
|
||||
<field name="product_uom_id" groups="uom.group_uom" optional="hide"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_account_invoice_report_search" model="ir.ui.view">
|
||||
<field name="model">account.invoice.report</field>
|
||||
<field name="inherit_id" ref="account.view_account_invoice_report_search"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="partner_id" position="after">
|
||||
<field name="industry_id"/>
|
||||
</field>
|
||||
<filter name="category_product" position="after">
|
||||
<filter string="Product" name="product_groupby" context="{'group_by': 'product_id', 'residual_invisible':True}"/>
|
||||
<filter name="invoice_refund_groupby" string="Invoice/Refund" context="{'group_by': 'move_type'}"/>
|
||||
</filter>
|
||||
<!-- group by on commercial_partner_id by default -->
|
||||
<filter name="partner_id" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</filter>
|
||||
<filter name="partner_id" position="after">
|
||||
<filter name="commercial_partner_groupby" string="Commercial Partner" context="{'group_by': 'commercial_partner_id'}"/>
|
||||
<filter name="industry_groupby" string="Partner Industry" context="{'group_by': 'industry_id'}"/>
|
||||
</filter>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Switch order: pivot in 1st position -->
|
||||
<record id="account.action_account_invoice_report_all_supp" model="ir.actions.act_window">
|
||||
<field name="view_mode">pivot,graph</field>
|
||||
</record>
|
||||
|
||||
<record id="account.action_account_invoice_report_all" model="ir.actions.act_window">
|
||||
<field name="view_mode">pivot,graph</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
70
account_usability_akretion/views/account_journal.xml
Normal file
70
account_usability_akretion/views/account_journal.xml
Normal file
@@ -0,0 +1,70 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2015-2022 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="view_account_journal_form" model="ir.ui.view">
|
||||
<field name="name">usability.account.journal.form</field>
|
||||
<field name="model">account.journal</field>
|
||||
<field name="inherit_id" ref="account.view_account_journal_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='account_control_ids']/.." position="after">
|
||||
<group name="usability" string="Misc" attrs="{'invisible': [('type', '!=', 'bank')]}">
|
||||
<field name="hide_bank_statement_balance" groups="account.group_account_readonly"/>
|
||||
</group>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='inbound_payment_method_line_ids']/tree/field[@name='payment_account_id']" position="attributes">
|
||||
<attribute name="optional">show</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='outbound_payment_method_line_ids']/tree/field[@name='payment_account_id']" position="attributes">
|
||||
<attribute name="optional">show</attribute>
|
||||
</xpath>
|
||||
<!--
|
||||
<field name="suspense_account_id" position="attributes">
|
||||
<attribute name="context">{'default_user_type_id': account_type_current_assets_id, 'default_reconcile': False}</attribute>
|
||||
</field>
|
||||
<field name="payment_debit_account_id" position="attributes">
|
||||
<attribute name="context">{'default_user_type_id': account_type_current_assets_id, 'default_reconcile': True}</attribute>
|
||||
</field>
|
||||
<field name="payment_credit_account_id" position="attributes">
|
||||
<attribute name="context">{'default_user_type_id': account_type_current_assets_id, 'default_reconcile': True}</attribute>
|
||||
</field> -->
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="account_journal_dashboard_kanban_view" model="ir.ui.view">
|
||||
<field name="name">usability.account.journal.dashboard</field>
|
||||
<field name="model">account.journal</field>
|
||||
<field name="inherit_id" ref="account.account_journal_dashboard_kanban_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="kanban_dashboard" position="after">
|
||||
<field name="hide_bank_statement_balance"/>
|
||||
</field>
|
||||
<xpath expr="//div[@name='latest_statement']/.." position="attributes">
|
||||
<attribute name="t-if">dashboard.has_at_least_one_statement and dashboard.account_balance != dashboard.last_balance and !record.hide_bank_statement_balance.raw_value</attribute>
|
||||
</xpath>
|
||||
<!--
|
||||
<t t-esc="dashboard.outstanding_pay_account_balance" position="replace">
|
||||
<a name="open_outstanding_payments" type="object" title="Outstanding Payments/Receipts"><t t-esc="dashboard.outstanding_pay_account_balance"/></a>
|
||||
</t> -->
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_account_journal_search" model="ir.ui.view">
|
||||
<field name="name">usability.account.journal.search</field>
|
||||
<field name="model">account.journal</field>
|
||||
<field name="inherit_id" ref="account.view_account_journal_search"/>
|
||||
<field name="arch" type="xml">
|
||||
<filter name="inactive" position="after">
|
||||
<group name="groupby" string="Group By">
|
||||
<filter name="type_groupby" string="Type" context="{'group_by': 'type'}"/>
|
||||
</group>
|
||||
</filter>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
16
account_usability_akretion/views/account_menu.xml
Normal file
16
account_usability_akretion/views/account_menu.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2015-2022 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<!-- Duplicate the menu "Sales > Configuration > Contacts > Bank Accounts"
|
||||
under "Accounting > Configuration", because most users will try to find it there -->
|
||||
<menuitem id="res_bank_account_config_menu" action="base.action_res_bank_form" parent="account.account_banks_menu" sequence="10"/>
|
||||
|
||||
<menuitem id="res_partner_bank_account_config_menu" action="base.action_res_partner_bank_account_form" parent="account.account_banks_menu" sequence="20"/>
|
||||
|
||||
</odoo>
|
||||
183
account_usability_akretion/views/account_move.xml
Normal file
183
account_usability_akretion/views/account_move.xml
Normal file
@@ -0,0 +1,183 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2015-2022 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="view_move_form" model="ir.ui.view">
|
||||
<field name="name">account_usability.account.move.form</field>
|
||||
<field name="model">account.move</field>
|
||||
<field name="inherit_id" ref="account.view_move_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<!--
|
||||
<field name="fiscal_position_id" position="attributes">
|
||||
<attribute name="widget">selection</attribute>
|
||||
</field>
|
||||
<field name="invoice_incoterm_id" position="attributes">
|
||||
<attribute name="widget">selection</attribute>
|
||||
</field> -->
|
||||
<button id="account_invoice_payment_btn" position="attributes">
|
||||
<attribute name="class">btn-default</attribute>
|
||||
</button>
|
||||
<button name="action_register_payment" position="before">
|
||||
<button name="%(account.account_invoices)d" type="action" string="Print" attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
|
||||
</button>
|
||||
<button name="preview_invoice" position="attributes">
|
||||
<attribute name="attrs">{}</attribute>
|
||||
<attribute name="invisible">1</attribute>
|
||||
</button>
|
||||
<!-- move sent field and make it visible -->
|
||||
<field name="is_move_sent" position="replace"/>
|
||||
<field name="invoice_origin" position="attributes">
|
||||
<attribute name="invisible">0</attribute>
|
||||
</field>
|
||||
<field name="invoice_origin" position="after">
|
||||
<field name="is_move_sent" attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
|
||||
</field>
|
||||
<xpath expr="//field[@name='line_ids']/tree/field[@name='tax_tag_ids']" position="after">
|
||||
<field name="matching_number" optional="show"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='invoice_line_ids']/tree/field[@name='product_id']" position="after">
|
||||
<field name="product_barcode" optional="hide"/>
|
||||
</xpath>
|
||||
<field name="invoice_source_email" position="after">
|
||||
<field name="blocked"/>
|
||||
</field>
|
||||
<div role="alert" position="after">
|
||||
<div id="warn_blocked" groups="account.group_account_invoice,account.group_account_readonly"
|
||||
class="alert alert-warning" role="alert" style="margin-bottom:0px;"
|
||||
attrs="{'invisible': ['|', ('move_type', 'not in', ('in_invoice', 'in_refund', 'out_invoice', 'out_refund')), ('blocked', '=', False)]}">
|
||||
This <field name="move_type"/> is marked as <b>disputed</b>.
|
||||
</div>
|
||||
</div>
|
||||
<xpath expr="//button[@name='open_duplicated_ref_bill_view']/.." position="attributes">
|
||||
<!-- show duplicate warning not only in draft state, but also in posted state -->
|
||||
<attribute name="attrs">{'invisible': ['|', ('state', '=', 'cancel'), ('duplicated_ref_ids', '=', [])]}</attribute>
|
||||
</xpath>
|
||||
<button name="button_cancel" attrs="{'invisible' : ['|', '|', ('id', '=', False), ('state', '!=', 'draft'),('move_type', '!=', 'entry')]}" position="attributes">
|
||||
<attribute name="confirm">Are you sure you want to cancel this journal entry?</attribute>
|
||||
</button>
|
||||
<button name="button_cancel" attrs="{'invisible' : ['|', '|', ('id', '=', False), ('state', '!=', 'draft'),('move_type', '==', 'entry')]}" position="attributes">
|
||||
<attribute name="confirm">Are you sure you want to cancel this invoice?</attribute>
|
||||
</button>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_invoice_tree" model="ir.ui.view">
|
||||
<field name="model">account.move</field>
|
||||
<field name="inherit_id" ref="account.view_invoice_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="amount_residual_signed" position="attributes">
|
||||
<attribute name="optional">show</attribute>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_account_invoice_filter" model="ir.ui.view">
|
||||
<field name="name">account_usability.account.move.search</field>
|
||||
<field name="model">account.move</field>
|
||||
<field name="inherit_id" ref="account.view_account_invoice_filter"/>
|
||||
<field name="arch" type="xml">
|
||||
<filter name="invoice_date" position="before">
|
||||
<filter name="invoice" string="Invoices" domain="[('move_type', 'in', ('out_invoice', 'in_invoice'))]"/>
|
||||
<filter name="refund" string="Refunds" domain="[('move_type', 'in', ('out_refund', 'in_refund'))]"/>
|
||||
<separator/>
|
||||
</filter>
|
||||
<filter name="due_date" position="after">
|
||||
<separator/>
|
||||
<filter name="to_send" string="To Send" domain="[('is_move_sent', '=', False), ('state', '=', 'posted'), ('move_type', 'in', ('out_invoice', 'out_refund'))]"/>
|
||||
<filter name="sent" string="Sent" domain="[('is_move_sent', '=', True), ('move_type', 'in', ('out_invoice', 'out_refund'))]"/>
|
||||
<separator/>
|
||||
<filter name="no_attachment" string="Missing Attachment" domain="[('has_attachment', '=', False)]"/>
|
||||
<separator/>
|
||||
<filter name="dispute" string="Dispute" domain="[('blocked', '=', True)]"/>
|
||||
</filter>
|
||||
<filter name="salesperson" position="before">
|
||||
<filter name="commercial_partner_groupby" string="Commercial Partner" context="{'group_by': 'commercial_partner_id'}"/>
|
||||
</filter>
|
||||
<filter name="status" position="after">
|
||||
<filter name="payment_state_groupby" string="Payment Status" context="{'group_by': 'payment_state'}"/>
|
||||
</filter>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_account_move_filter" model="ir.ui.view">
|
||||
<field name="model">account.move</field>
|
||||
<field name="inherit_id" ref="account.view_account_move_filter"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="journal_id" position="after">
|
||||
<field name="search_account_id"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_move_line_form" model="ir.ui.view">
|
||||
<field name="model">account.move.line</field>
|
||||
<field name="inherit_id" ref="account.view_move_line_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<!-- The field 'blocked' is alone in it's block
|
||||
We don't want to display an empty block, so we put the attrs on the group
|
||||
The drawback of this is that, if someone added a field in that group,
|
||||
he won't see the field when internal_type is not payable/receivable -->
|
||||
<xpath expr="//field[@name='blocked']/.." position="attributes">
|
||||
<attribute name="attrs">{'invisible': [('account_type', 'not in', ('liability_payable', 'asset_receivable'))]}</attribute>
|
||||
</xpath>
|
||||
<field name="account_id" position="after">
|
||||
<field name="account_type" invisible="1"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_move_line_tree" model="ir.ui.view">
|
||||
<field name="model">account.move.line</field>
|
||||
<field name="inherit_id" ref="account.view_move_line_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="analytic_distribution" position="after">
|
||||
<button title="View Journal Entry Form" type="object" name="show_account_move_form" icon="fa-arrow-right"/>
|
||||
</field>
|
||||
<!-- balance is already present
|
||||
<field name="credit" position="after">
|
||||
<field name="balance" sum="Balance" optional="show"/>
|
||||
</field> -->
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_account_move_line_filter" model="ir.ui.view">
|
||||
<field name="name">account_usability.account_move_line_search</field>
|
||||
<field name="model">account.move.line</field>
|
||||
<field name="inherit_id" ref="account.view_account_move_line_filter"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="partner_id" position="after">
|
||||
<field name="matching_number" />
|
||||
<field name="debit" filter_domain="['|', ('debit', '=', self), ('credit', '=', self)]" string="Debit or Credit"/>
|
||||
</field>
|
||||
<filter name="unreconciled" position="before">
|
||||
<filter name="reconciled" string="Fully Reconciled" domain="[('account_id.reconcile', '=', True), ('full_reconcile_id', '!=', False)]"/>
|
||||
</filter>
|
||||
<filter name="unreconciled" position="attributes">
|
||||
<attribute name="string">Unreconciled or Partially Reconciled</attribute>
|
||||
</filter>
|
||||
<field name="name" position="attributes">
|
||||
<attribute name="string">Label, Reference, Account or Partner</attribute>
|
||||
</field>
|
||||
<field name="name" position="before">
|
||||
<field name="move_id" position="move"/>
|
||||
</field>
|
||||
<field name="partner_id" position="attributes">
|
||||
<attribute name="domain">['|', ('parent_id', '=', False), ('is_company', '=', True)]</attribute>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Inherit action called from button of account.account form view
|
||||
Make it similar to standard "Journal Items" menu account.action_account_moves_all_a -->
|
||||
<record id="account.action_move_line_select" model="ir.actions.act_window">
|
||||
<field name="domain">[('display_type', 'not in', ('line_section', 'line_note'))]</field>
|
||||
<field name="view_id" ref="account.view_move_line_tree"/>
|
||||
<field name="view_mode">tree,pivot,graph,kanban</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
21
account_usability_akretion/views/account_report.xml
Normal file
21
account_usability_akretion/views/account_report.xml
Normal file
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2018-2022 Akretion (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="account.account_invoices" model="ir.actions.report">
|
||||
<!-- Attach only on customer invoices/refunds -->
|
||||
<field name="attachment">(object.move_type in ('out_invoice', 'out_refund')) and (object.state == 'posted') and ((object.name or 'INV').replace('/','_')+'.pdf')</field>
|
||||
</record>
|
||||
|
||||
<record id="account.account_invoices_without_payment" model="ir.actions.report">
|
||||
<!-- Attach only on customer invoices/refunds -->
|
||||
<field name="attachment">(object.move_type in ('out_invoice', 'out_refund')) and (object.state == 'posted') and ((object.name or 'INV').replace('/','_')+'.pdf')</field>
|
||||
</record>
|
||||
|
||||
|
||||
</odoo>
|
||||
20
account_usability_akretion/views/account_tax.xml
Normal file
20
account_usability_akretion/views/account_tax.xml
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2015-2022 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="view_tax_tree" model="ir.ui.view">
|
||||
<field name="model">account.tax</field>
|
||||
<field name="inherit_id" ref="account.view_tax_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="type_tax_use" position="after">
|
||||
<field name="price_include" optional="show"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
72
account_usability_akretion/views/product.xml
Normal file
72
account_usability_akretion/views/product.xml
Normal file
@@ -0,0 +1,72 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2017-2022 Akretion (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<!-- In the official account module, on product category and product template,
|
||||
some fields/groups are on account.group_account_invoice, some on
|
||||
account.group_account_user and some on account.group_account_manager
|
||||
Here, we set all those fields on account.group_account_invoice
|
||||
-->
|
||||
|
||||
<record id="product_template_form_view" model="ir.ui.view">
|
||||
<field name="name">account_usability.product.template.form</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="priority">100</field> <!-- when you replace a field, it's always better to inherit at the end -->
|
||||
<field name="inherit_id" ref="account.product_template_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="property_account_income_id" position="attributes">
|
||||
<attribute name="groups">account.group_account_invoice</attribute>
|
||||
</field>
|
||||
<field name="property_account_expense_id" position="attributes">
|
||||
<attribute name="groups">account.group_account_invoice</attribute>
|
||||
</field>
|
||||
<field name="list_price" position="replace">
|
||||
<div name="list_price">
|
||||
<field name="list_price" widget='monetary' options="{'currency_field': 'currency_id', 'field_digits': True}" class="oe_inline"/>
|
||||
<label for="sale_price_type" string=" "/>
|
||||
<field name="sale_price_type"/>
|
||||
</div>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_category_property_form" model="ir.ui.view">
|
||||
<field name="name">account_usability.product.category.form</field>
|
||||
<field name="model">product.category</field>
|
||||
<field name="inherit_id" ref="account.view_category_property_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<group name="account_property" position="attributes">
|
||||
<attribute name="groups">account.group_account_invoice</attribute>
|
||||
</group>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="product_supplierinfo_form_view" model="ir.ui.view">
|
||||
<field name="name">account_usability.product.supplierinfo.form</field>
|
||||
<field name="model">product.supplierinfo</field>
|
||||
<field name="inherit_id" ref="product.product_supplierinfo_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="currency_id" position="after">
|
||||
<field name="purchase_price_type"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="product_supplierinfo_tree_view" model="ir.ui.view">
|
||||
<field name="name">account_usability.product.supplierinfo.tree</field>
|
||||
<field name="model">product.supplierinfo</field>
|
||||
<field name="inherit_id" ref="product.product_supplierinfo_tree_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="price" position="after">
|
||||
<field name="purchase_price_type" string="Tax"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
</odoo>
|
||||
27
account_usability_akretion/views/res_company.xml
Normal file
27
account_usability_akretion/views/res_company.xml
Normal file
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2021-2022 Akretion (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
|
||||
<record id="view_company_form" model="ir.ui.view">
|
||||
<field name="name">account_usability.res.company.form</field>
|
||||
<field name="model">res.company</field>
|
||||
<field name="inherit_id" ref="base.view_company_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<notebook position="inside">
|
||||
<page string="Legal Terms" name="legal_terms">
|
||||
<group string="Invoice Legal Terms" name="static_invoice_terms">
|
||||
<field name="static_invoice_terms" nolabel="1" colspan="2"/>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
</odoo>
|
||||
20
account_usability_akretion/views/res_partner.xml
Normal file
20
account_usability_akretion/views/res_partner.xml
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2014-2024 Akretion (http://www.akretion.com/)
|
||||
@author: Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="view_partner_simple_form" model="ir.ui.view">
|
||||
<field name="name">base_usability.title.on.partner.simplified.form</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="account.view_partner_property_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='bank_ids']//field[@name='acc_number']" position="after">
|
||||
<field name="currency_id" optional="hide"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
3
account_usability_akretion/wizard/__init__.py
Normal file
3
account_usability_akretion/wizard/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from . import account_invoice_mark_sent
|
||||
from . import account_move_reversal
|
||||
from . import account_group_generate
|
||||
62
account_usability_akretion/wizard/account_group_generate.py
Normal file
62
account_usability_akretion/wizard/account_group_generate.py
Normal file
@@ -0,0 +1,62 @@
|
||||
# Copyright 2015-2022 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models, _
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
|
||||
class AccountGroupGenerate(models.TransientModel):
|
||||
_name = 'account.group.generate'
|
||||
_description = 'Generate Account Groups'
|
||||
|
||||
company_id = fields.Many2one(
|
||||
'res.company', string='Company', required=True,
|
||||
default=lambda self: self.env.company)
|
||||
name_prefix = fields.Char(string='Prefix', required=True, default='Comptes')
|
||||
level = fields.Integer(default=2, required=True)
|
||||
|
||||
def run(self):
|
||||
if self.level < 1:
|
||||
raise UserError(_("The level must be >= 1."))
|
||||
ago = self.env['account.group']
|
||||
aao = self.env['account.account']
|
||||
company = self.company_id
|
||||
groups = ago.search([('company_id', '=', company.id)])
|
||||
if groups:
|
||||
raise UserError(_(
|
||||
"%d account groups already exists in company '%s'. This wizard is "
|
||||
"designed to generate account groups from scratch.")
|
||||
% (len(groups), company.display_name))
|
||||
accounts = aao.search([('company_id', '=', company.id)])
|
||||
struct = {'childs': {}}
|
||||
for account in accounts:
|
||||
if len(account.code) <= self.level:
|
||||
raise UserError(_(
|
||||
"The code of account '%s' is %d caracters. "
|
||||
"It cannot be inferior to level (%d).")
|
||||
% (account.display_name, len(account.code), self.level))
|
||||
n = 1
|
||||
parent = struct
|
||||
gparent = False
|
||||
while n <= self.level:
|
||||
group_code = account.code[:n]
|
||||
if group_code not in parent['childs']:
|
||||
new_group = ago.create({
|
||||
'name': '%s %s' % (self.name_prefix or '', group_code),
|
||||
'code_prefix_start': group_code,
|
||||
'parent_id': gparent and gparent.id or False,
|
||||
'company_id': company.id,
|
||||
})
|
||||
parent['childs'][group_code] = {'obj': new_group, 'childs': {}}
|
||||
parent = parent['childs'][group_code]
|
||||
gparent = parent['obj']
|
||||
n += 1
|
||||
account.write({'group_id': gparent.id})
|
||||
action = {
|
||||
'type': 'ir.actions.act_window',
|
||||
'name': _('Account Groups'),
|
||||
'view_mode': 'tree,form',
|
||||
'res_model': 'account.group',
|
||||
}
|
||||
return action
|
||||
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2020-2022 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="account_group_generate_form" model="ir.ui.view">
|
||||
<field name="name">account.group.generate.form</field>
|
||||
<field name="model">account.group.generate</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<p>
|
||||
This wizard is designed to auto-generate account groups from the chart of account.
|
||||
</p>
|
||||
<group name="main">
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<field name="name_prefix"/>
|
||||
<field name="level"/>
|
||||
</group>
|
||||
<footer>
|
||||
<button type="object" name="run" string="Generate" class="btn-primary"/>
|
||||
<button special="cancel" string="Cancel"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="account_group_generate_action" model="ir.actions.act_window">
|
||||
<field name="name">Generate Account Groups</field>
|
||||
<field name="res_model">account.group.generate</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="account_group_generate_menu"
|
||||
action="account_group_generate_action"
|
||||
parent="account.account_account_menu"
|
||||
sequence="51"/>
|
||||
|
||||
</odoo>
|
||||
@@ -0,0 +1,24 @@
|
||||
# Copyright 2017-2022 Akretion France (https://akretion.com/en)
|
||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import models
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class AccountInvoiceMarkSent(models.TransientModel):
|
||||
_name = 'account.invoice.mark.sent'
|
||||
_description = 'Mark invoices as sent'
|
||||
|
||||
def run(self):
|
||||
assert self.env.context.get('active_model') == 'account.move',\
|
||||
'Source model must be invoices'
|
||||
assert self.env.context.get('active_ids'), 'No invoices selected'
|
||||
invoices = self.env['account.move'].search([
|
||||
('id', 'in', self.env.context.get('active_ids')),
|
||||
('move_type', 'in', ('out_invoice', 'out_refund')),
|
||||
('state', '=', 'posted')])
|
||||
invoices.write({'is_move_sent': True})
|
||||
logger.info('Marking invoices with ID %s as sent', invoices.ids)
|
||||
return
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2017-2022 Akretion France
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="account_invoice_mark_sent_form" model="ir.ui.view">
|
||||
<field name="name">account.invoice.mark.sent.form</field>
|
||||
<field name="model">account.invoice.mark.sent</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Mark invoices as sent">
|
||||
<p>
|
||||
This wizard will mark as <i>sent</i> all the selected posted invoices.
|
||||
</p>
|
||||
<footer>
|
||||
<button type="object" name="run" string="Mark as Sent" class="btn-primary"/>
|
||||
<button special="cancel" string="Cancel"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="account_invoice_mark_sent_action" model="ir.actions.act_window">
|
||||
<field name="name">Mark as Sent</field>
|
||||
<field name="res_model">account.invoice.mark.sent</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
<field name="binding_model_id" ref="account.model_account_move" />
|
||||
<field name="binding_view_types">list</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
40
account_usability_akretion/wizard/account_move_reversal.py
Normal file
40
account_usability_akretion/wizard/account_move_reversal.py
Normal file
@@ -0,0 +1,40 @@
|
||||
# Copyright 2018-2022 Akretion France (https://akretion.com/)
|
||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
|
||||
class AccountMoveReversal(models.TransientModel):
|
||||
_inherit = 'account.move.reversal'
|
||||
|
||||
already_reversed_warning = fields.Text(compute="_compute_already_reversed_warning")
|
||||
|
||||
@api.depends("move_ids")
|
||||
def _compute_already_reversed_warning(self):
|
||||
for wizard in self:
|
||||
moves = wizard.move_ids or self.env["account.move"].browse(self._context['active_ids'])
|
||||
reversed_moves = self.env["account.move"].search([('reversed_entry_id', 'in', moves.ids)])
|
||||
warning = ""
|
||||
for already_reversed_move in reversed_moves.reversed_entry_id:
|
||||
if warning:
|
||||
warning += "\n"
|
||||
reversed_by = " ; ".join(already_reversed_move.reversal_move_id.mapped("display_name"))
|
||||
move_detail = _("%s reversed by %s") % (already_reversed_move.display_name, reversed_by)
|
||||
warning += move_detail
|
||||
wizard.already_reversed_warning = warning or False
|
||||
|
||||
|
||||
# Set default reversal date to original move + 1 day
|
||||
# and raise error if original move has already been reversed
|
||||
@api.model
|
||||
def default_get(self, fields_list):
|
||||
res = super().default_get(fields_list)
|
||||
assert self._context.get('active_model') == 'account.move'
|
||||
amo = self.env['account.move']
|
||||
moves = amo.browse(self._context['active_ids'])
|
||||
if len(moves) == 1:
|
||||
res['date'] = moves.date + relativedelta(days=1)
|
||||
return res
|
||||
24
account_usability_akretion/wizard/account_move_reversal.xml
Normal file
24
account_usability_akretion/wizard/account_move_reversal.xml
Normal file
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<record id="view_account_move_reversal" model="ir.ui.view">
|
||||
<field name="model">account.move.reversal</field>
|
||||
<field name="inherit_id" ref="account.view_account_move_reversal"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="residual" position="before">
|
||||
<div
|
||||
class="alert alert-warning"
|
||||
role="alert"
|
||||
attrs="{'invisible': [('already_reversed_warning', '=', False)]}"
|
||||
>
|
||||
You are about to reverse entries that have already been reversed or partially reversed (refund). Make sure it is intented.
|
||||
Already reversed entries are the following :
|
||||
<field
|
||||
name="already_reversed_warning"
|
||||
/>
|
||||
</div>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2021-2022 Akretion France (http://www.akretion.com/)
|
||||
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<!-- When you change the date, it resets the amount via the onchange
|
||||
So, in the view, the date should be BEFORE the amount -->
|
||||
<record id="view_account_payment_register_form" model="ir.ui.view">
|
||||
<field name="model">account.payment.register</field>
|
||||
<field name="inherit_id" ref="account.view_account_payment_register_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<label for="amount" position="before">
|
||||
<field name="payment_date" position="move"/>
|
||||
</label>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
57
base_company_extension/README.rst
Normal file
57
base_company_extension/README.rst
Normal file
@@ -0,0 +1,57 @@
|
||||
======================
|
||||
Base Company Extension
|
||||
======================
|
||||
|
||||
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! This file is generated by oca-gen-addon-readme !!
|
||||
!! changes will be overwritten. !!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
||||
:target: https://odoo-community.org/page/development-status
|
||||
:alt: Beta
|
||||
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
|
||||
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||
:alt: License: AGPL-3
|
||||
.. |badge3| image:: https://img.shields.io/badge/github-akretion%2Fodoo--usability-lightgray.png?logo=github
|
||||
:target: https://github.com/akretion/odoo-usability/tree/12.0/base_company_extension
|
||||
:alt: akretion/odoo-usability
|
||||
|
||||
|badge1| |badge2| |badge3|
|
||||
|
||||
This module adds the following fields on the company:
|
||||
|
||||
* Capital Amount
|
||||
* Legal Type
|
||||
|
||||
This is useful to display the legal name of the company in reports.
|
||||
|
||||
Bug Tracker
|
||||
===========
|
||||
|
||||
Bugs are tracked on `GitHub Issues <https://github.com/akretion/odoo-usability/issues>`_.
|
||||
In case of trouble, please check there if your issue has already been reported.
|
||||
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||
`feedback <https://github.com/akretion/odoo-usability/issues/new?body=module:%20base_company_extension%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||
|
||||
Do not contact contributors directly about support or help with technical issues.
|
||||
|
||||
Credits
|
||||
=======
|
||||
|
||||
Authors
|
||||
~~~~~~~
|
||||
|
||||
* Akretion
|
||||
|
||||
Contributors
|
||||
~~~~~~~~~~~~
|
||||
|
||||
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
|
||||
Maintainers
|
||||
~~~~~~~~~~~
|
||||
|
||||
This module is part of the `akretion/odoo-usability <https://github.com/akretion/odoo-usability/tree/12.0/base_company_extension>`_ project on GitHub.
|
||||
|
||||
You are welcome to contribute.
|
||||
1
base_company_extension/__init__.py
Normal file
1
base_company_extension/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import models
|
||||
17
base_company_extension/__manifest__.py
Normal file
17
base_company_extension/__manifest__.py
Normal file
@@ -0,0 +1,17 @@
|
||||
# Copyright 2014-2022 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
{
|
||||
'name': 'Base Company Extension',
|
||||
'version': '16.0.1.0.0',
|
||||
'category': 'Partner',
|
||||
'license': 'AGPL-3',
|
||||
'summary': 'Adds capital and title on company',
|
||||
'author': 'Akretion',
|
||||
'website': 'https://github.com/akretion/odoo-usability',
|
||||
# I depend on base_usability only for _report_company_legal_name()
|
||||
'depends': ['base_usability'],
|
||||
'data': ['views/res_company.xml'],
|
||||
'installable': True,
|
||||
}
|
||||
1
base_company_extension/models/__init__.py
Normal file
1
base_company_extension/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import res_company
|
||||
28
base_company_extension/models/res_company.py
Normal file
28
base_company_extension/models/res_company.py
Normal file
@@ -0,0 +1,28 @@
|
||||
# Copyright 2014-2022 Akretion (http://www.akretion.com)
|
||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import models, fields
|
||||
|
||||
|
||||
class ResCompany(models.Model):
|
||||
_inherit = "res.company"
|
||||
|
||||
capital_amount = fields.Monetary(string='Capital Amount')
|
||||
# in v9, title is only for contacts, not for companies
|
||||
legal_type = fields.Char(
|
||||
string="Legal Type", help="Type of Company, e.g. SARL, SAS, ...")
|
||||
|
||||
def _report_company_legal_name(self):
|
||||
self.ensure_one()
|
||||
if self.legal_type and not self.name.endswith(self.legal_type):
|
||||
name = '%s %s' % (self.name, self.legal_type)
|
||||
else:
|
||||
name = self.name
|
||||
return name
|
||||
|
||||
_sql_constraints = [(
|
||||
'capital_amount_positive',
|
||||
'CHECK (capital_amount >= 0)',
|
||||
"The value of the field 'Capital Amount' must be positive."
|
||||
)]
|
||||
1
base_company_extension/readme/CONTRIBUTORS.rst
Normal file
1
base_company_extension/readme/CONTRIBUTORS.rst
Normal file
@@ -0,0 +1 @@
|
||||
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
5
base_company_extension/readme/DESCRIPTION.rst
Normal file
5
base_company_extension/readme/DESCRIPTION.rst
Normal file
@@ -0,0 +1,5 @@
|
||||
This module adds the following fields to the ResCompany model:
|
||||
* Capital Amount
|
||||
* Legal Type
|
||||
|
||||
This is useful to display the legal name of the company in reports
|
||||
417
base_company_extension/static/description/index.html
Normal file
417
base_company_extension/static/description/index.html
Normal file
@@ -0,0 +1,417 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
|
||||
<title>Base Company Extension</title>
|
||||
<style type="text/css">
|
||||
|
||||
/*
|
||||
:Author: David Goodger (goodger@python.org)
|
||||
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
|
||||
:Copyright: This stylesheet has been placed in the public domain.
|
||||
|
||||
Default cascading style sheet for the HTML output of Docutils.
|
||||
|
||||
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
|
||||
customize this style sheet.
|
||||
*/
|
||||
|
||||
/* used to remove borders from tables and images */
|
||||
.borderless, table.borderless td, table.borderless th {
|
||||
border: 0 }
|
||||
|
||||
table.borderless td, table.borderless th {
|
||||
/* Override padding for "table.docutils td" with "! important".
|
||||
The right padding separates the table cells. */
|
||||
padding: 0 0.5em 0 0 ! important }
|
||||
|
||||
.first {
|
||||
/* Override more specific margin styles with "! important". */
|
||||
margin-top: 0 ! important }
|
||||
|
||||
.last, .with-subtitle {
|
||||
margin-bottom: 0 ! important }
|
||||
|
||||
.hidden {
|
||||
display: none }
|
||||
|
||||
.subscript {
|
||||
vertical-align: sub;
|
||||
font-size: smaller }
|
||||
|
||||
.superscript {
|
||||
vertical-align: super;
|
||||
font-size: smaller }
|
||||
|
||||
a.toc-backref {
|
||||
text-decoration: none ;
|
||||
color: black }
|
||||
|
||||
blockquote.epigraph {
|
||||
margin: 2em 5em ; }
|
||||
|
||||
dl.docutils dd {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||||
dl.docutils dt {
|
||||
font-weight: bold }
|
||||
*/
|
||||
|
||||
div.abstract {
|
||||
margin: 2em 5em }
|
||||
|
||||
div.abstract p.topic-title {
|
||||
font-weight: bold ;
|
||||
text-align: center }
|
||||
|
||||
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||
div.hint, div.important, div.note, div.tip, div.warning {
|
||||
margin: 2em ;
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||
div.important p.admonition-title, div.note p.admonition-title,
|
||||
div.tip p.admonition-title {
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||
div.danger p.admonition-title, div.error p.admonition-title,
|
||||
div.warning p.admonition-title, .code .error {
|
||||
color: red ;
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||||
compound paragraphs.
|
||||
div.compound .compound-first, div.compound .compound-middle {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
div.compound .compound-last, div.compound .compound-middle {
|
||||
margin-top: 0.5em }
|
||||
*/
|
||||
|
||||
div.dedication {
|
||||
margin: 2em 5em ;
|
||||
text-align: center ;
|
||||
font-style: italic }
|
||||
|
||||
div.dedication p.topic-title {
|
||||
font-weight: bold ;
|
||||
font-style: normal }
|
||||
|
||||
div.figure {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
div.footer, div.header {
|
||||
clear: both;
|
||||
font-size: smaller }
|
||||
|
||||
div.line-block {
|
||||
display: block ;
|
||||
margin-top: 1em ;
|
||||
margin-bottom: 1em }
|
||||
|
||||
div.line-block div.line-block {
|
||||
margin-top: 0 ;
|
||||
margin-bottom: 0 ;
|
||||
margin-left: 1.5em }
|
||||
|
||||
div.sidebar {
|
||||
margin: 0 0 0.5em 1em ;
|
||||
border: medium outset ;
|
||||
padding: 1em ;
|
||||
background-color: #ffffee ;
|
||||
width: 40% ;
|
||||
float: right ;
|
||||
clear: right }
|
||||
|
||||
div.sidebar p.rubric {
|
||||
font-family: sans-serif ;
|
||||
font-size: medium }
|
||||
|
||||
div.system-messages {
|
||||
margin: 5em }
|
||||
|
||||
div.system-messages h1 {
|
||||
color: red }
|
||||
|
||||
div.system-message {
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.system-message p.system-message-title {
|
||||
color: red ;
|
||||
font-weight: bold }
|
||||
|
||||
div.topic {
|
||||
margin: 2em }
|
||||
|
||||
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||||
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||||
margin-top: 0.4em }
|
||||
|
||||
h1.title {
|
||||
text-align: center }
|
||||
|
||||
h2.subtitle {
|
||||
text-align: center }
|
||||
|
||||
hr.docutils {
|
||||
width: 75% }
|
||||
|
||||
img.align-left, .figure.align-left, object.align-left, table.align-left {
|
||||
clear: left ;
|
||||
float: left ;
|
||||
margin-right: 1em }
|
||||
|
||||
img.align-right, .figure.align-right, object.align-right, table.align-right {
|
||||
clear: right ;
|
||||
float: right ;
|
||||
margin-left: 1em }
|
||||
|
||||
img.align-center, .figure.align-center, object.align-center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
table.align-center {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.align-left {
|
||||
text-align: left }
|
||||
|
||||
.align-center {
|
||||
clear: both ;
|
||||
text-align: center }
|
||||
|
||||
.align-right {
|
||||
text-align: right }
|
||||
|
||||
/* reset inner alignment in figures */
|
||||
div.align-right {
|
||||
text-align: inherit }
|
||||
|
||||
/* div.align-center * { */
|
||||
/* text-align: left } */
|
||||
|
||||
.align-top {
|
||||
vertical-align: top }
|
||||
|
||||
.align-middle {
|
||||
vertical-align: middle }
|
||||
|
||||
.align-bottom {
|
||||
vertical-align: bottom }
|
||||
|
||||
ol.simple, ul.simple {
|
||||
margin-bottom: 1em }
|
||||
|
||||
ol.arabic {
|
||||
list-style: decimal }
|
||||
|
||||
ol.loweralpha {
|
||||
list-style: lower-alpha }
|
||||
|
||||
ol.upperalpha {
|
||||
list-style: upper-alpha }
|
||||
|
||||
ol.lowerroman {
|
||||
list-style: lower-roman }
|
||||
|
||||
ol.upperroman {
|
||||
list-style: upper-roman }
|
||||
|
||||
p.attribution {
|
||||
text-align: right ;
|
||||
margin-left: 50% }
|
||||
|
||||
p.caption {
|
||||
font-style: italic }
|
||||
|
||||
p.credits {
|
||||
font-style: italic ;
|
||||
font-size: smaller }
|
||||
|
||||
p.label {
|
||||
white-space: nowrap }
|
||||
|
||||
p.rubric {
|
||||
font-weight: bold ;
|
||||
font-size: larger ;
|
||||
color: maroon ;
|
||||
text-align: center }
|
||||
|
||||
p.sidebar-title {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold ;
|
||||
font-size: larger }
|
||||
|
||||
p.sidebar-subtitle {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
p.topic-title {
|
||||
font-weight: bold }
|
||||
|
||||
pre.address {
|
||||
margin-bottom: 0 ;
|
||||
margin-top: 0 ;
|
||||
font: inherit }
|
||||
|
||||
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
pre.code .ln { color: grey; } /* line numbers */
|
||||
pre.code, code { background-color: #eeeeee }
|
||||
pre.code .comment, code .comment { color: #5C6576 }
|
||||
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||||
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
||||
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
||||
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
||||
pre.code .inserted, code .inserted { background-color: #A3D289}
|
||||
|
||||
span.classifier {
|
||||
font-family: sans-serif ;
|
||||
font-style: oblique }
|
||||
|
||||
span.classifier-delimiter {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
span.interpreted {
|
||||
font-family: sans-serif }
|
||||
|
||||
span.option {
|
||||
white-space: nowrap }
|
||||
|
||||
span.pre {
|
||||
white-space: pre }
|
||||
|
||||
span.problematic {
|
||||
color: red }
|
||||
|
||||
span.section-subtitle {
|
||||
/* font-size relative to parent (h1..h6 element) */
|
||||
font-size: 80% }
|
||||
|
||||
table.citation {
|
||||
border-left: solid 1px gray;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docinfo {
|
||||
margin: 2em 4em }
|
||||
|
||||
table.docutils {
|
||||
margin-top: 0.5em ;
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
table.footnote {
|
||||
border-left: solid 1px black;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docutils td, table.docutils th,
|
||||
table.docinfo td, table.docinfo th {
|
||||
padding-left: 0.5em ;
|
||||
padding-right: 0.5em ;
|
||||
vertical-align: top }
|
||||
|
||||
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||
font-weight: bold ;
|
||||
text-align: left ;
|
||||
white-space: nowrap ;
|
||||
padding-left: 0 }
|
||||
|
||||
/* "booktabs" style (no vertical lines) */
|
||||
table.docutils.booktabs {
|
||||
border: 0px;
|
||||
border-top: 2px solid;
|
||||
border-bottom: 2px solid;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.docutils.booktabs * {
|
||||
border: 0px;
|
||||
}
|
||||
table.docutils.booktabs th {
|
||||
border-bottom: thin solid;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||
font-size: 100% }
|
||||
|
||||
ul.auto-toc {
|
||||
list-style-type: none }
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="document" id="base-company-extension">
|
||||
<h1 class="title">Base Company Extension</h1>
|
||||
|
||||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! This file is generated by oca-gen-addon-readme !!
|
||||
!! changes will be overwritten. !!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/akretion/odoo-usability/tree/12.0/base_company_extension"><img alt="akretion/odoo-usability" src="https://img.shields.io/badge/github-akretion%2Fodoo--usability-lightgray.png?logo=github" /></a></p>
|
||||
<p>This module adds the following fields to the ResCompany model:
|
||||
* Capital Amount
|
||||
* Legal Type</p>
|
||||
<p>This is useful to display the legal name of the company in reports</p>
|
||||
<p><strong>Table of contents</strong></p>
|
||||
<div class="contents local topic" id="contents">
|
||||
<ul class="simple">
|
||||
<li><a class="reference internal" href="#bug-tracker" id="id1">Bug Tracker</a></li>
|
||||
<li><a class="reference internal" href="#credits" id="id2">Credits</a><ul>
|
||||
<li><a class="reference internal" href="#authors" id="id3">Authors</a></li>
|
||||
<li><a class="reference internal" href="#contributors" id="id4">Contributors</a></li>
|
||||
<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="bug-tracker">
|
||||
<h1><a class="toc-backref" href="#id1">Bug Tracker</a></h1>
|
||||
<p>Bugs are tracked on <a class="reference external" href="https://github.com/akretion/odoo-usability/issues">GitHub Issues</a>.
|
||||
In case of trouble, please check there if your issue has already been reported.
|
||||
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||
<a class="reference external" href="https://github.com/akretion/odoo-usability/issues/new?body=module:%20base_company_extension%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||||
</div>
|
||||
<div class="section" id="credits">
|
||||
<h1><a class="toc-backref" href="#id2">Credits</a></h1>
|
||||
<div class="section" id="authors">
|
||||
<h2><a class="toc-backref" href="#id3">Authors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Akretion</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="contributors">
|
||||
<h2><a class="toc-backref" href="#id4">Contributors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Alexis de Lattre <<a class="reference external" href="mailto:alexis.delattre@akretion.com">alexis.delattre@akretion.com</a>></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="maintainers">
|
||||
<h2><a class="toc-backref" href="#id5">Maintainers</a></h2>
|
||||
<p>This module is part of the <a class="reference external" href="https://github.com/akretion/odoo-usability/tree/12.0/base_company_extension">akretion/odoo-usability</a> project on GitHub.</p>
|
||||
<p>You are welcome to contribute.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
22
base_company_extension/views/res_company.xml
Normal file
22
base_company_extension/views/res_company.xml
Normal file
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2014-2022 Akretion (http://www.akretion.com/)
|
||||
@author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
-->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="view_company_form" model="ir.ui.view">
|
||||
<field name="name">company.extension.form</field>
|
||||
<field name="model">res.company</field>
|
||||
<field name="inherit_id" ref="base.view_company_form" />
|
||||
<field name="arch" type="xml">
|
||||
<field name="currency_id" position="after">
|
||||
<field name="capital_amount"/>
|
||||
<field name="legal_type"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user